@sachahjkl/backoffice 0.2.5 → 0.2.6

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 (280) hide show
  1. package/README.md +3 -1
  2. package/bin/backoffice.mjs +2 -2
  3. package/dist/demo-reset.cjs +65895 -0
  4. package/dist/main.cjs +71 -39
  5. package/dist/migrate.cjs +17 -3
  6. package/dist/web/{chunk-Bans5XmP2.js → chunk--RuvStn6.js} +1 -1
  7. package/dist/web/{chunk-BidSGJER.js → chunk-4ipZT9nT.js} +1 -1
  8. package/dist/web/chunk-6jIo5mZ42.js +1 -0
  9. package/dist/web/{chunk-D0WfOSVe.js → chunk-9X4vLcFh.js} +1 -1
  10. package/dist/web/chunk-9d_UD-MQ.js +1 -0
  11. package/dist/web/{chunk-CuukTiS1.js → chunk-AJOoJgZJ.js} +1 -1
  12. package/dist/web/{chunk-2sHWWuzv2.js → chunk-B0bNirg2.js} +1 -1
  13. package/dist/web/chunk-B3OxeBLO2.js +1 -0
  14. package/dist/web/chunk-B5xzAYYx2.js +1 -0
  15. package/dist/web/{chunk-BQRlJCOd.js → chunk-B6Rml85x2.js} +1 -1
  16. package/dist/web/chunk-B8_dFe5w.js +1 -0
  17. package/dist/web/chunk-B91VAo1J.js +1 -0
  18. package/dist/web/chunk-B9NV1rY62.js +1 -0
  19. package/dist/web/chunk-BAn0tBhX.js +1 -0
  20. package/dist/web/chunk-BGVaNZdj.js +1 -0
  21. package/dist/web/chunk-BHDXYrox.js +1 -0
  22. package/dist/web/chunk-BI9lIdFn.js +1 -0
  23. package/dist/web/{chunk-CYB9QO85.js → chunk-BKufCOYq.js} +1 -1
  24. package/dist/web/chunk-BNksdK_D2.js +1 -0
  25. package/dist/web/chunk-BQ7WWH4L.js +1 -0
  26. package/dist/web/chunk-BQrmVphu2.js +1 -0
  27. package/dist/web/chunk-BR0demlX.js +1 -0
  28. package/dist/web/chunk-BT8KtCYG.js +1 -0
  29. package/dist/web/{chunk-Bm0a1bep.js → chunk-BVszSMJC.js} +1 -1
  30. package/dist/web/{chunk-CJDa7FT62.js → chunk-BYjxXKZ4.js} +1 -1
  31. package/dist/web/chunk-BZZJ287h.js +1 -0
  32. package/dist/web/chunk-Bb31fHqC2.js +1 -0
  33. package/dist/web/chunk-BcUjdID-.js +1 -0
  34. package/dist/web/{chunk-BzOWqX4m2.js → chunk-Bck0-DJt2.js} +1 -1
  35. package/dist/web/chunk-Bf3eV_su2.js +1 -0
  36. package/dist/web/chunk-BfSewUhY.js +1 -0
  37. package/dist/web/{chunk-osh5v_OU2.js → chunk-Bfx7EEIR.js} +1 -1
  38. package/dist/web/chunk-Bi4Jixry2.js +1 -0
  39. package/dist/web/chunk-BiECfDS7.js +1 -0
  40. package/dist/web/{chunk-CGgGK0-O2.js → chunk-Bj7Oze2U2.js} +1 -1
  41. package/dist/web/{chunk-BYalGDdQ.js → chunk-Bjo6eVnk.js} +1 -1
  42. package/dist/web/{chunk-BbKL19W02.js → chunk-BkvskoFt2.js} +1 -1
  43. package/dist/web/chunk-Bn46cQyx.js +1 -0
  44. package/dist/web/chunk-Bn6RkvPA2.js +1 -0
  45. package/dist/web/{chunk-B08xNtqD2.js → chunk-BpZ7MSOP.js} +1 -1
  46. package/dist/web/{chunk-DCE1ImZZ2.js → chunk-Bq2zV2_3.js} +1 -1
  47. package/dist/web/chunk-By2EFyNM.js +1 -0
  48. package/dist/web/{chunk-DQwyRMR6.js → chunk-C-O6GrQC2.js} +1 -1
  49. package/dist/web/{chunk-CtR8WyO5.js → chunk-C0Ceu-vg.js} +1 -1
  50. package/dist/web/chunk-C0gTeWW62.js +1 -0
  51. package/dist/web/{chunk-ClevJX5T2.js → chunk-C19Alcnx2.js} +1 -1
  52. package/dist/web/{chunk-BKWyrwrz.js → chunk-CABvk97t2.js} +1 -1
  53. package/dist/web/chunk-CApvwK4D.js +1 -0
  54. package/dist/web/chunk-CCkaRRSy.js +1 -0
  55. package/dist/web/chunk-CCqlW8pS2.js +3 -0
  56. package/dist/web/chunk-CCr_R2Cg.js +1 -0
  57. package/dist/web/chunk-CDK48Khc.js +1 -0
  58. package/dist/web/chunk-CDS6LjBz2.js +1 -0
  59. package/dist/web/chunk-CE9WzUCM.js +1 -0
  60. package/dist/web/chunk-CEJjSd8-2.js +1 -0
  61. package/dist/web/{chunk-Ce_TeGo52.js → chunk-CG4Kbo1n2.js} +1 -1
  62. package/dist/web/chunk-CGfyD3XX2.js +1 -0
  63. package/dist/web/chunk-CK6Sjqig.js +1 -0
  64. package/dist/web/chunk-CKFB1V-p2.js +1 -0
  65. package/dist/web/chunk-CL02A9wI.js +1 -0
  66. package/dist/web/{chunk-CrhlmMPy2.js → chunk-CLHj5Ycx2.js} +1 -1
  67. package/dist/web/chunk-CLZ5xsSQ2.js +1 -0
  68. package/dist/web/{chunk-JUTCkl5C2.js → chunk-CMvRZBpn.js} +1 -1
  69. package/dist/web/chunk-CNfmNEak.js +1 -0
  70. package/dist/web/chunk-COTrF1xY2.js +1 -0
  71. package/dist/web/{chunk-CC05ZHq-.js → chunk-COXN76fu2.js} +1 -1
  72. package/dist/web/{chunk-BkKRFLuX2.js → chunk-CPHUl7N2.js} +1 -1
  73. package/dist/web/chunk-CUqj_Bxs2.js +1 -0
  74. package/dist/web/{chunk-C2gUrdSR2.js → chunk-CVHqiS63.js} +1 -1
  75. package/dist/web/chunk-CV_fLVFT.js +1 -0
  76. package/dist/web/{chunk-CJKvPHwX.js → chunk-CYGyIy7J.js} +1 -1
  77. package/dist/web/chunk-CYRUKYKv2.js +1 -0
  78. package/dist/web/{chunk-xlLlHW0G2.js → chunk-C_QyIKvy.js} +1 -1
  79. package/dist/web/chunk-Ca3lwqEF.js +1 -0
  80. package/dist/web/chunk-CaJrmM9V.js +1 -0
  81. package/dist/web/{chunk-Ok502fV82.js → chunk-CfcCxe_k.js} +1 -1
  82. package/dist/web/chunk-Ck6cItVE2.js +2 -0
  83. package/dist/web/{chunk-S5Gmkpdy2.js → chunk-CkWd-yMn.js} +1 -1
  84. package/dist/web/{chunk-C7DvmZKC.js → chunk-CmokTGIG.js} +1 -1
  85. package/dist/web/chunk-CpXqQPuw.js +1 -0
  86. package/dist/web/{chunk-Dyia17vy.js → chunk-CtmP6l7_2.js} +1 -1
  87. package/dist/web/chunk-CubfQf-X2.js +1 -0
  88. package/dist/web/chunk-CuepVIkm2.js +1 -0
  89. package/dist/web/chunk-CvMAjyvr2.js +1 -0
  90. package/dist/web/chunk-CvsVlcIU2.js +1 -0
  91. package/dist/web/chunk-CwzCbuXH.js +1 -0
  92. package/dist/web/{chunk-BxQ7up-t.js → chunk-Cx07K71K.js} +1 -1
  93. package/dist/web/chunk-D-VHaopx.js +1 -0
  94. package/dist/web/chunk-D1DvlGbP.js +1 -0
  95. package/dist/web/{chunk-CfAqWkFp.js → chunk-D1wrPwB5.js} +1 -1
  96. package/dist/web/{chunk-BbWEBemE.js → chunk-D3XjW5Cm.js} +1 -1
  97. package/dist/web/{chunk-DRgIjFR6.js → chunk-D5MFwK9L.js} +1 -1
  98. package/dist/web/{chunk-CjtJKrza.js → chunk-D5qmP2Wu.js} +2 -2
  99. package/dist/web/{chunk-BbbRo5jM2.js → chunk-D6k6pmdU.js} +1 -1
  100. package/dist/web/chunk-D8kEdb5y2.js +1 -0
  101. package/dist/web/chunk-D8t0s8LD.js +1 -0
  102. package/dist/web/{chunk-Z9CNux5n2.js → chunk-D8xHm8jb2.js} +1 -1
  103. package/dist/web/{chunk-BMYHfrEK.js → chunk-D97UUzIx.js} +1 -1
  104. package/dist/web/chunk-DB6sOjsn2.js +1 -0
  105. package/dist/web/{chunk-D4J7xo6v.js → chunk-DDCyjjcE.js} +1 -1
  106. package/dist/web/chunk-DEXzwHB0.js +1 -0
  107. package/dist/web/{chunk-DODMV1QO.js → chunk-DGbo0App2.js} +1 -1
  108. package/dist/web/chunk-DIBFSF2Z.js +1 -0
  109. package/dist/web/{chunk-bP01prsY.js → chunk-DIJSXeQC2.js} +1 -1
  110. package/dist/web/{chunk-CvjKWUFl.js → chunk-DKlxu0GP2.js} +1 -1
  111. package/dist/web/{chunk-BtRCqgfa.js → chunk-DM4Wc9U7.js} +1 -1
  112. package/dist/web/{chunk-DUJbqlfC.js → chunk-DM5aibnW.js} +1 -1
  113. package/dist/web/chunk-DMXgU6Nc2.js +1 -0
  114. package/dist/web/chunk-DMskLhpk2.js +1 -0
  115. package/dist/web/{chunk-HhmMH02E.js → chunk-DOCau85G2.js} +1 -1
  116. package/dist/web/{chunk-B86wqImw.js → chunk-DOinRyX_2.js} +1 -1
  117. package/dist/web/chunk-DQp-2GVv.js +1 -0
  118. package/dist/web/chunk-DQr_9Q6T.js +1 -0
  119. package/dist/web/chunk-DSpA-ZPx.js +1 -0
  120. package/dist/web/chunk-DTPC4JtI2.js +1 -0
  121. package/dist/web/chunk-DURq7J8U2.js +1 -0
  122. package/dist/web/chunk-DVJ4YZuU.js +1 -0
  123. package/dist/web/chunk-DVyDnsGh.js +1 -0
  124. package/dist/web/{chunk-oS95kAu6.js → chunk-DXvlXoVT2.js} +1 -1
  125. package/dist/web/{chunk-CHUMIo442.js → chunk-DZgMGE6C.js} +1 -1
  126. package/dist/web/{chunk-BK0Mi7Tk.js → chunk-DZgf7AIe.js} +1 -1
  127. package/dist/web/{chunk-CBXOl0VL.js → chunk-D_8jIApo.js} +1 -1
  128. package/dist/web/chunk-D_vyhgGx.js +1 -0
  129. package/dist/web/chunk-Db2zQ-8C.js +1 -0
  130. package/dist/web/{chunk-BEAkjhZc2.js → chunk-DboSVJMM.js} +1 -1
  131. package/dist/web/chunk-DdOc1fs-.js +1 -0
  132. package/dist/web/chunk-DddDKWSn2.js +1 -0
  133. package/dist/web/{chunk-DAdKllIN.js → chunk-DerJPaBw.js} +1 -1
  134. package/dist/web/chunk-Dh86w63y.js +1 -0
  135. package/dist/web/{chunk-DXsw8_Za2.js → chunk-DhLlQTD-2.js} +1 -1
  136. package/dist/web/{chunk-9qDelKdu.js → chunk-DhkjPUn4.js} +1 -1
  137. package/dist/web/{chunk-BAKoExNF.js → chunk-Di9FA_QV.js} +1 -1
  138. package/dist/web/chunk-DjwvqY3z2.js +1 -0
  139. package/dist/web/{chunk-CH-_LXUF.js → chunk-Dl4EbYnM2.js} +1 -1
  140. package/dist/web/chunk-Dl4V93zm2.js +1 -0
  141. package/dist/web/{chunk-CsiZwjWr2.js → chunk-Dns8uMf32.js} +1 -1
  142. package/dist/web/chunk-Dnzjseqf2.js +1 -0
  143. package/dist/web/chunk-DpI44v1z.js +1 -0
  144. package/dist/web/{chunk-BqIPzI6E2.js → chunk-DpLF2wJ62.js} +1 -1
  145. package/dist/web/chunk-Dqhs2Pyw2.js +1 -0
  146. package/dist/web/{chunk-BWNhkOOr.js → chunk-DsaNNeZe.js} +1 -1
  147. package/dist/web/{chunk-GjZTRlHL.js → chunk-DubWLqvO.js} +1 -1
  148. package/dist/web/{chunk-DibPYvNu.js → chunk-Fc120Hsi2.js} +1 -1
  149. package/dist/web/{chunk-B23x0ZHj2.js → chunk-HmRGBt692.js} +1 -1
  150. package/dist/web/chunk-IlM3eTPp2.js +1 -0
  151. package/dist/web/chunk-IzGdqlW82.js +1 -0
  152. package/dist/web/{chunk-u_CBgBep.js → chunk-MpUdRrak2.js} +1 -1
  153. package/dist/web/{chunk-BlE9HnAo.js → chunk-NDpjbcAr2.js} +1 -1
  154. package/dist/web/chunk-P1du2kWg2.js +1 -0
  155. package/dist/web/{chunk-BCemdpJW.js → chunk-POMKwNf_.js} +1 -1
  156. package/dist/web/chunk-PqGGk0JD.js +1 -0
  157. package/dist/web/{chunk-BG9HC5MH2.js → chunk-RIi7_iVg.js} +1 -1
  158. package/dist/web/chunk-SZJG1lFa2.js +1 -0
  159. package/dist/web/{chunk-jEvWOBug.js → chunk-WNYFaDlu2.js} +1 -1
  160. package/dist/web/{chunk-Cx_tkq5a.js → chunk-XtjMOmku2.js} +1 -1
  161. package/dist/web/chunk-XvyWOb2Q.js +1 -0
  162. package/dist/web/{chunk-BPI0E5qw.js → chunk-ZcJhJsoo.js} +1 -1
  163. package/dist/web/{chunk-Dk7Fe34Y.js → chunk-aW8Vltn22.js} +1 -1
  164. package/dist/web/chunk-a_Va_Nj7.js +1 -0
  165. package/dist/web/{chunk-D83vXRZS2.js → chunk-enci06qG.js} +1 -1
  166. package/dist/web/chunk-fYJ7OBkh.js +1 -0
  167. package/dist/web/{chunk-THRzZN4s.js → chunk-k6TIcaIA.js} +1 -1
  168. package/dist/web/{chunk-BsXdvb75.js → chunk-nC_XlFOG.js} +1 -1
  169. package/dist/web/{chunk-DzxhjLIR.js → chunk-niXXbm7H.js} +1 -1
  170. package/dist/web/chunk-owvOEsA9.js +1 -0
  171. package/dist/web/{chunk-D8ywkT0Z2.js → chunk-pV57uiBu2.js} +1 -1
  172. package/dist/web/{chunk-CdEOFR_J.js → chunk-qKosqkwC.js} +1 -1
  173. package/dist/web/{chunk-BMsK7VjB2.js → chunk-r6H-BfOd.js} +1 -1
  174. package/dist/web/chunk-tDREPM-0.js +1 -0
  175. package/dist/web/{chunk-78yNgJiB.js → chunk-xTX16tt2.js} +1 -1
  176. package/dist/web/chunk-y0Vyi0HZ.js +1 -0
  177. package/dist/web/chunk-yfBrkklv.js +1 -0
  178. package/dist/web/index.csr.html +1 -1
  179. package/dist/web/{main-AJD2LGCE.js → main-F7D3L737.js} +4 -4
  180. package/package.json +1 -1
  181. package/dist/web/chunk-0C-62od6.js +0 -1
  182. package/dist/web/chunk-B1Kpw1um2.js +0 -1
  183. package/dist/web/chunk-B43WHzJp.js +0 -1
  184. package/dist/web/chunk-B6BtInzP2.js +0 -1
  185. package/dist/web/chunk-BAjZiy9u2.js +0 -1
  186. package/dist/web/chunk-BE8oALxd.js +0 -1
  187. package/dist/web/chunk-BIydbtyu.js +0 -1
  188. package/dist/web/chunk-BMU6gPN0.js +0 -1
  189. package/dist/web/chunk-BRUZgvLR2.js +0 -1
  190. package/dist/web/chunk-BSxXPdhz2.js +0 -1
  191. package/dist/web/chunk-BTDByxsO2.js +0 -1
  192. package/dist/web/chunk-BUnVNwR0.js +0 -1
  193. package/dist/web/chunk-BV-2_l7u2.js +0 -1
  194. package/dist/web/chunk-B_pX979y.js +0 -1
  195. package/dist/web/chunk-Ba4cFLiE2.js +0 -1
  196. package/dist/web/chunk-BaLdnNAA.js +0 -1
  197. package/dist/web/chunk-BhCP8fQA.js +0 -1
  198. package/dist/web/chunk-BhwbhxlY2.js +0 -1
  199. package/dist/web/chunk-Bjio-Q3F.js +0 -1
  200. package/dist/web/chunk-BjiyoDeK2.js +0 -1
  201. package/dist/web/chunk-BnPSwNBN.js +0 -1
  202. package/dist/web/chunk-BqbhE2jJ.js +0 -1
  203. package/dist/web/chunk-BrRhr7VS.js +0 -1
  204. package/dist/web/chunk-Bt1ivJuj2.js +0 -1
  205. package/dist/web/chunk-BtH61zrc.js +0 -1
  206. package/dist/web/chunk-BuKqE_YG2.js +0 -1
  207. package/dist/web/chunk-ByBw4qTD.js +0 -1
  208. package/dist/web/chunk-ByfP_6io2.js +0 -1
  209. package/dist/web/chunk-Bylz8GTy2.js +0 -1
  210. package/dist/web/chunk-C1jIGjiG.js +0 -1
  211. package/dist/web/chunk-C2WwmFiS.js +0 -1
  212. package/dist/web/chunk-C3v6o8sk.js +0 -1
  213. package/dist/web/chunk-C7TzEeP_2.js +0 -1
  214. package/dist/web/chunk-C8AJBuJL2.js +0 -1
  215. package/dist/web/chunk-C9_g77K0.js +0 -1
  216. package/dist/web/chunk-CAr--Z8G2.js +0 -1
  217. package/dist/web/chunk-CIIIDIUz.js +0 -1
  218. package/dist/web/chunk-CUvLKCob2.js +0 -1
  219. package/dist/web/chunk-CV-g60E82.js +0 -1
  220. package/dist/web/chunk-CV1Zh4JH.js +0 -1
  221. package/dist/web/chunk-CVZQi-q62.js +0 -1
  222. package/dist/web/chunk-CY4lfBdp2.js +0 -1
  223. package/dist/web/chunk-Cc534gtY.js +0 -1
  224. package/dist/web/chunk-CcvGqiZH.js +0 -1
  225. package/dist/web/chunk-CdDlz5SQ2.js +0 -1
  226. package/dist/web/chunk-CdeX3SOP.js +0 -1
  227. package/dist/web/chunk-CgThkMbX2.js +0 -1
  228. package/dist/web/chunk-Chasvinb.js +0 -1
  229. package/dist/web/chunk-CihZnkoG2.js +0 -1
  230. package/dist/web/chunk-ClYiqUra.js +0 -1
  231. package/dist/web/chunk-CmhHSFX72.js +0 -1
  232. package/dist/web/chunk-CsdHWYnL.js +0 -1
  233. package/dist/web/chunk-CuQMh9Mm2.js +0 -1
  234. package/dist/web/chunk-D2Albj_1.js +0 -1
  235. package/dist/web/chunk-D2P8u0ih2.js +0 -1
  236. package/dist/web/chunk-D2reBpeg2.js +0 -1
  237. package/dist/web/chunk-D6HQPG4L.js +0 -1
  238. package/dist/web/chunk-DFQAtlu22.js +0 -1
  239. package/dist/web/chunk-DIyfCN-v.js +0 -1
  240. package/dist/web/chunk-DK0GFIMr.js +0 -1
  241. package/dist/web/chunk-DMlYYeVV2.js +0 -3
  242. package/dist/web/chunk-DS8Gi0yV2.js +0 -1
  243. package/dist/web/chunk-DSIpVKzQ.js +0 -1
  244. package/dist/web/chunk-DT9HaYIg.js +0 -1
  245. package/dist/web/chunk-DU2qw7-O.js +0 -1
  246. package/dist/web/chunk-DZX7bq5d.js +0 -1
  247. package/dist/web/chunk-DiSSXeWw2.js +0 -1
  248. package/dist/web/chunk-DjQuCwaE.js +0 -1
  249. package/dist/web/chunk-DmBRHpbi2.js +0 -1
  250. package/dist/web/chunk-DpbG_pUL.js +0 -1
  251. package/dist/web/chunk-DqoyE916.js +0 -1
  252. package/dist/web/chunk-DsZGgyjH2.js +0 -1
  253. package/dist/web/chunk-DsbC92Ad2.js +0 -1
  254. package/dist/web/chunk-DuQk8dor2.js +0 -1
  255. package/dist/web/chunk-DxjwnDdp.js +0 -1
  256. package/dist/web/chunk-DyaBJhQt2.js +0 -1
  257. package/dist/web/chunk-H2FHxG4A.js +0 -1
  258. package/dist/web/chunk-KV_4fJOq.js +0 -2
  259. package/dist/web/chunk-NyAoR3GT.js +0 -1
  260. package/dist/web/chunk-Qhc5gzMT.js +0 -1
  261. package/dist/web/chunk-RRqL4AoW2.js +0 -1
  262. package/dist/web/chunk-THDcl3GX2.js +0 -1
  263. package/dist/web/chunk-TRzqZ7nT.js +0 -1
  264. package/dist/web/chunk-VKqyG94L.js +0 -1
  265. package/dist/web/chunk-cxgj3JaU2.js +0 -1
  266. package/dist/web/chunk-dClaCeUx.js +0 -1
  267. package/dist/web/chunk-kb-UZrxn2.js +0 -1
  268. package/dist/web/chunk-mI1TUlml.js +0 -1
  269. package/dist/web/chunk-tiVwZKxb.js +0 -1
  270. package/dist/web/chunk-uYhVCHeh2.js +0 -1
  271. package/dist/web/chunk-ynjMwOUq.js +0 -1
  272. package/dist/web/chunk-z-mghjkB.js +0 -1
  273. /package/dist/web/{chunk-BUoX0svL2.js → chunk-BUoX0svL.js} +0 -0
  274. /package/dist/web/{chunk-Bsy3r41y.js → chunk-Bsy3r41y2.js} +0 -0
  275. /package/dist/web/{chunk-CARNiCDb.js → chunk-CARNiCDb2.js} +0 -0
  276. /package/dist/web/{chunk-CGo7Fepz2.js → chunk-CGo7Fepz.js} +0 -0
  277. /package/dist/web/{chunk-CXHCUTDs2.js → chunk-CXHCUTDs.js} +0 -0
  278. /package/dist/web/{chunk-CtcsJTAS.js → chunk-CtcsJTAS2.js} +0 -0
  279. /package/dist/web/{chunk-WJWN7A_V.js → chunk-WJWN7A_V2.js} +0 -0
  280. /package/dist/web/{chunk-cTGENC4T.js → chunk-cTGENC4T2.js} +0 -0
@@ -1,4 +1,4 @@
1
- import{n as m$4,t as l$1}from"./chunk-BwCtja5l.js";import{$n as nE,$t as ZC,A as Gy,Ar as uA,B as It$1,Br as xE,Bt as Ve$1,Cn as fE,Cr as s8,D as Fy,Dn as g$2,Dr as t_,E as Ft,En as fe$1,Et as Ra,F as IE,Fr as we$2,G as Ka,Gn as k_,Gt as Ww,H as JD,Hn as kE,Hr as xU,Ht as Vr,In as jH,Ir as wp,It as Us,Jn as lA,Jr as zS,Jt as Xy,K as Ke,Kn as kt$1,Kr as yo$1,Kt as XS,L as IN,Ln as jN,Lr as wy,Mn as i8,Nn as ie$3,Nr as vd,O as Gn$1,Or as tb,Ot as S$4,P as Hn$1,Pn as il,Qn as n8,R as Ia,Rr as x$3,Sn as fD,T as Fo,Tn as fd,Tr as se$2,Tt as RU,U as JS,Un as kH,Ur as y$2,V as Iy,Vn as jt,W as KS,Wn as kS,Wr as y_,Wt as We$1,Yn as ln$1,Yt as Ya,Z as Ly,Zt as Yt$1,_n as cn$1,a as $v,ar as oD,at as Ny,b as E$4,bn as dA,br as rl,cn as aa,cr as pE,d as Ar,dn as at$2,dr as pe$3,dt as Of,en as ZS,et as MS,f as At$1,fr as py,ft as Ol,g as Cr$1,gn as ce$3,gr as qa,h as CE,i as $r,in as Zy,ir as o8,it as Nt$2,j as H$3,jr as ue$1,k as Gr,kn as hd,l as A_,ln as ad,lr as pN,lt as OS,m as By,n as $E,nn as Za,nr as nt$1,nt as NH,o as A$2,on as _H,or as ou,ot as OD,p as Be$1,pr as qS,pt as Op,qn as ky,r as $_,rr as nv,rt as NS,s as AE,sn as _i$1,st as OE,u as Ao$1,un as ae$3,ur as pd,v as DI,vn as cr$1,vr as qy,vt as Py,w as Fb,wn as fa,wr as sd,xn as e_,xr as rn,xt as Qg,yr as r8,yt as Qa,z as Ip}from"./chunk-BAHiFuUo.js";var p$4=`primary`;var Fe=Symbol(`RouteTitle`);var Kt=class{params;constructor(n){this.params=n||{}}has(n){return Object.hasOwn(this.params,n)}get(n){if(this.has(n)){let e=this.params[n];return Array.isArray(e)?e[0]:e}return null}getAll(n){if(this.has(n)){let e=this.params[n];return Array.isArray(e)?e:[e]}return[]}get keys(){return Object.keys(this.params)}};function oe$2(t){return new Kt(t)}function Vt(t,n,e){for(let r=0;r<t.length;r++){let i=t[r],o=n[r];if(i[0]===`:`)e[i.substring(1)]=o;else if(i!==o.path)return!1}return!0}function ln(t,n,e){let r=e.path.split(`/`),i=r.indexOf(`**`);if(i===-1){if(r.length>t.length||e.pathMatch===`full`&&(n.hasChildren()||r.length<t.length))return null;let a={},u=t.slice(0,r.length);return Vt(r,u,a)?{consumed:u,posParams:a}:null}if(i!==r.lastIndexOf(`**`))return null;let o=r.slice(0,i),s=r.slice(i+1);if(o.length+s.length>t.length||e.pathMatch===`full`&&n.hasChildren()&&e.path!==`**`)return null;let c={};return!Vt(o,t.slice(0,o.length),c)||!Vt(s,t.slice(t.length-s.length),c)?null:{consumed:t,posParams:c}}function ut$1(t){return new Promise((n,e)=>{t.pipe(AE()).subscribe({next:r=>n(r),error:r=>e(r)})})}function ei(t,n){if(t.length!==n.length)return!1;for(let e=0;e<t.length;++e)if(!F$3(t[e],n[e]))return!1;return!0}function F$3(t,n){let e=t?Yt(t):void 0,r=n?Yt(n):void 0;if(!e||!r||e.length!=r.length)return!1;let i;for(let o=0;o<e.length;o++)if(i=e[o],!dn(t[i],n[i]))return!1;return!0}function Yt(t){return[...Object.keys(t),...Object.getOwnPropertySymbols(t)]}function dn(t,n){if(Array.isArray(t)&&Array.isArray(n)){if(t.length!==n.length)return!1;let e=[...t].sort(),r=[...n].sort();return e.every((i,o)=>r[o]===i)}else return t===n}function ti(t){return t.length>0?t[t.length-1]:null}function ae$2(t){return pE(t)?t:aa(t)?nt$1(Promise.resolve(t)):$r(t)}function hn(t){return pE(t)?ut$1(t):Promise.resolve(t)}var ri={exact:pn,subset:gn};var fn={exact:ni,subset:ii,ignored:()=>!0};var dr={paths:`exact`,fragment:`ignored`,matrixParams:`ignored`,queryParams:`exact`};var ve={paths:`subset`,fragment:`ignored`,matrixParams:`ignored`,queryParams:`subset`};function hr(t,n,e){let r=t instanceof E$3?t:n.parseUrl(t);return Ft(()=>Zt(n.lastSuccessfulNavigation()?.finalUrl??new E$3,r,l$1(l$1({},ve),e)))}function Zt(t,n,e){return ri[e.paths](t.root,n.root,e.matrixParams)&&fn[e.queryParams](t.queryParams,n.queryParams)&&!(e.fragment===`exact`&&t.fragment!==n.fragment)}function ni(t,n){return F$3(t,n)}function pn(t,n,e){if(!ie$2(t.segments,n.segments)||!st$1(t.segments,n.segments,e)||t.numberOfChildren!==n.numberOfChildren)return!1;for(let r in n.children)if(!t.children[r]||!pn(t.children[r],n.children[r],e))return!1;return!0}function ii(t,n){return Object.keys(n).length<=Object.keys(t).length&&Object.keys(n).every(e=>dn(t[e],n[e]))}function gn(t,n,e){return vn(t,n,n.segments,e)}function vn(t,n,e,r){if(t.segments.length>e.length){let i=t.segments.slice(0,e.length);return!(!ie$2(i,e)||n.hasChildren()||!st$1(i,e,r))}else if(t.segments.length===e.length){if(!ie$2(t.segments,e)||!st$1(t.segments,e,r))return!1;for(let i in n.children)if(!t.children[i]||!gn(t.children[i],n.children[i],r))return!1;return!0}else{let i=e.slice(0,t.segments.length),o=e.slice(t.segments.length);return!ie$2(t.segments,i)||!st$1(t.segments,i,r)||!t.children[`primary`]?!1:vn(t.children[p$4],n,o,r)}}function st$1(t,n,e){return n.every((r,i)=>fn[e](t[i].parameters,r.parameters))}var E$3=class{root;queryParams;fragment;_queryParamMap;constructor(n=new m$3([],{}),e={},r=null){this.root=n,this.queryParams=e,this.fragment=r}get queryParamMap(){return this._queryParamMap??=oe$2(this.queryParams),this._queryParamMap}toString(){return ai.serialize(this)}};var m$3=class{segments;children;parent=null;constructor(n,e){this.segments=n,this.children=e,Object.values(e).forEach(r=>r.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return at$1(this)}};var K$3=class{path;parameters;_parameterMap;constructor(n,e){this.path=n,this.parameters=e}get parameterMap(){return this._parameterMap??=oe$2(this.parameters),this._parameterMap}toString(){return yn(this)}};function oi(t,n){return ie$2(t,n)&&t.every((e,r)=>F$3(e.parameters,n[r].parameters))}function ie$2(t,n){return t.length!==n.length?!1:t.every((e,r)=>e.path===n[r].path)}function si(t,n){let e=[];return Object.entries(t.children).forEach(([r,i])=>{r===`primary`&&(e=e.concat(n(i,r)))}),Object.entries(t.children).forEach(([r,i])=>{r!==`primary`&&(e=e.concat(n(i,r)))}),e}var ce$2=(()=>{class t{static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:()=>new Y$3})}return t})();var Y$3=class{parse(n){let e=new Xt(n);return new E$3(e.parseRootSegment(),e.parseQueryParams(),e.parseFragment())}serialize(n){return`${`/${_e$1(n.root,!0)}`}${li(n.queryParams)}${typeof n.fragment==`string`?`#${ci(n.fragment)}`:``}`}};var ai=new Y$3;function at$1(t){return t.segments.map(n=>yn(n)).join(`/`)}function _e$1(t,n){if(!t.hasChildren())return at$1(t);if(n){let e=t.children[`primary`]?_e$1(t.children[p$4],!1):``,r=[];return Object.entries(t.children).forEach(([i,o])=>{i!==`primary`&&r.push(`${i}:${_e$1(o,!1)}`)}),r.length>0?`${e}(${r.join(`//`)})`:e}else{let e=si(t,(r,i)=>i===`primary`?[_e$1(t.children[p$4],!1)]:[`${i}:${_e$1(r,!1)}`]);return Object.keys(t.children).length===1&&t.children[`primary`]!=null?`${at$1(t)}/${e[0]}`:`${at$1(t)}/(${e.join(`//`)})`}}function mn(t){return encodeURIComponent(t).replace(/%40/g,`@`).replace(/%3A/gi,`:`).replace(/%24/g,`$`).replace(/%2C/gi,`,`)}function it$1(t){return mn(t).replace(/%3B/gi,`;`)}function ci(t){return encodeURI(t)}function Jt(t){return mn(t).replace(/\(/g,`%28`).replace(/\)/g,`%29`).replace(/%26/gi,`&`)}function ct$1(t){return decodeURIComponent(t)}function nn(t){return ct$1(t.replace(/\+/g,`%20`))}function yn(t){return`${Jt(t.path)}${ui(t.parameters)}`}function ui(t){return Object.entries(t).map(([n,e])=>`;${Jt(n)}=${Jt(e)}`).join(``)}function li(t){let n=Object.entries(t).map(([e,r])=>Array.isArray(r)?r.map(i=>`${it$1(e)}=${it$1(i)}`).join(`&`):`${it$1(e)}=${it$1(r)}`).filter(e=>e);return n.length?`?${n.join(`&`)}`:``}var di=/^[^\/()?;#]+/;function Gt(t){let n=t.match(di);return n?n[0]:``}var hi=/^[^\/()?;=#]+/;function fi(t){let n=t.match(hi);return n?n[0]:``}var pi=/^[^=?&#]+/;function gi(t){let n=t.match(pi);return n?n[0]:``}var vi=/^[^&#]+/;function mi(t){let n=t.match(vi);return n?n[0]:``}var Xt=class{url;remaining;constructor(n){this.url=n,this.remaining=n}parseRootSegment(){for(;this.consumeOptional(`/`););return this.remaining===``||this.peekStartsWith(`?`)||this.peekStartsWith(`#`)?new m$3([],{}):new m$3([],this.parseChildren())}parseQueryParams(){let n={};if(this.consumeOptional(`?`))do this.parseQueryParam(n);while(this.consumeOptional(`&`));return n}parseFragment(){return this.consumeOptional(`#`)?decodeURIComponent(this.remaining):null}parseChildren(n=0){if(n>50)throw new y$2(4010,!1);if(this.remaining===``)return{};this.consumeOptional(`/`);let e=[];for(this.peekStartsWith(`(`)||e.push(this.parseSegment());this.peekStartsWith(`/`)&&!this.peekStartsWith(`//`)&&!this.peekStartsWith(`/(`);)this.capture(`/`),e.push(this.parseSegment());let r={};this.peekStartsWith(`/(`)&&(this.capture(`/`),r=this.parseParens(!0,n));let i={};return this.peekStartsWith(`(`)&&(i=this.parseParens(!1,n)),(e.length>0||Object.keys(r).length>0)&&(i[`primary`]=new m$3(e,r)),i}parseSegment(){let n=Gt(this.remaining);if(n===``&&this.peekStartsWith(`;`))throw new y$2(4009,!1);return this.capture(n),new K$3(ct$1(n),this.parseMatrixParams())}parseMatrixParams(){let n={};for(;this.consumeOptional(`;`);)this.parseParam(n);return n}parseParam(n){let e=fi(this.remaining);if(!e)return;this.capture(e);let r=``;if(this.consumeOptional(`=`)){let i=Gt(this.remaining);i&&(r=i,this.capture(r))}n[ct$1(e)]=ct$1(r)}parseQueryParam(n){let e=gi(this.remaining);if(!e)return;this.capture(e);let r=``;if(this.consumeOptional(`=`)){let s=mi(this.remaining);s&&(r=s,this.capture(r))}let i=nn(e),o=nn(r);if(Object.hasOwn(n,i)){let s=n[i];Array.isArray(s)||(s=[s],n[i]=s),s.push(o)}else n[i]=o}parseParens(n,e){let r=Object.create(null);for(this.capture(`(`);!this.consumeOptional(`)`)&&this.remaining.length>0;){let i=Gt(this.remaining),o=this.remaining[i.length];if(o!==`/`&&o!==`)`&&o!==`;`)throw new y$2(4010,!1);let s;i.indexOf(`:`)>-1?(s=i.slice(0,i.indexOf(`:`)),this.capture(s),this.capture(`:`)):n&&(s=`primary`);let c=this.parseChildren(e+1);r[s??`primary`]=Object.keys(c).length===1&&c[`primary`]?c[p$4]:new m$3([],c),this.consumeOptional(`//`)}return r}peekStartsWith(n){return this.remaining.startsWith(n)}consumeOptional(n){return this.peekStartsWith(n)?(this.remaining=this.remaining.substring(n.length),!0):!1}capture(n){if(!this.consumeOptional(n))throw new y$2(4011,!1)}};function Rn(t){return t.segments.length>0?new m$3([],{[p$4]:t}):t}function Sn(t){let n=Object.create(null);for(let[r,i]of Object.entries(t.children)){let o=Sn(i);if(r===`primary`&&o.segments.length===0&&o.hasChildren())for(let[s,c]of Object.entries(o.children))n[s]=c;else(o.segments.length>0||o.hasChildren())&&(n[r]=o)}return yi(new m$3(t.segments,n))}function yi(t){if(t.numberOfChildren===1&&t.children[`primary`]){let n=t.children[p$4];return new m$3(t.segments.concat(n.segments),n.children)}return t}function Z$3(t){return t instanceof E$3}function Cn(t,n,e=null,r=null,i=new Y$3){return bn(wn(t),n,e,r,i)}function wn(t){let n;function e(o){let s={};for(let a of o.children){let u=e(a);s[a.outlet]=u}let c=new m$3(o.url,s);return o===t&&(n=c),c}let i=Rn(e(t.root));return n??i}function bn(t,n,e,r,i){let o=t;for(;o.parent;)o=o.parent;if(n.length===0)return Wt(o,o,o,e,r,i);let s=Ri(n);if(s.toRoot())return Wt(o,o,new m$3([],{}),e,r,i);let c=Si(s,o,t),a=c.processChildren?Oe$1(c.segmentGroup,c.index,s.commands):En(c.segmentGroup,c.index,s.commands);return Wt(o,c.segmentGroup,a,e,r,i)}function lt$1(t){return typeof t==`object`&&t!=null&&!t.outlets&&!t.segmentPath}function Le$1(t){return typeof t==`object`&&t!=null&&t.outlets}function on(t,n,e){t||=`ɵ`;let r=new E$3;return r.queryParams={[t]:n},e.parse(e.serialize(r)).queryParams[t]}function Wt(t,n,e,r,i,o){let s={};for(let[u,l]of Object.entries(r??{}))s[u]=Array.isArray(l)?l.map(v=>on(u,v,o)):on(u,l,o);let c;t===n?c=e:c=In(t,n,e);return new E$3(Rn(Sn(c)),s,i)}function In(t,n,e){let r=Object.create(null);return Object.entries(t.children).forEach(([i,o])=>{o===n?r[i]=e:r[i]=In(o,n,e)}),new m$3(t.segments,r)}var dt$1=class{isAbsolute;numberOfDoubleDots;commands;constructor(n,e,r){if(this.isAbsolute=n,this.numberOfDoubleDots=e,this.commands=r,n&&r.length>0&&lt$1(r[0]))throw new y$2(4003,!1);let i=r.find(Le$1);if(i&&i!==ti(r))throw new y$2(4004,!1)}toRoot(){return this.isAbsolute&&this.commands.length===1&&this.commands[0]==`/`}};function Ri(t){if(typeof t[0]==`string`&&t.length===1&&t[0]===`/`)return new dt$1(!0,0,t);let n=0,e=!1,r=t.reduce((i,o,s)=>{if(typeof o==`object`&&o!=null){if(o.outlets){let c={};return Object.entries(o.outlets).forEach(([a,u])=>{c[a]=typeof u==`string`?u.split(`/`):u}),[...i,{outlets:c}]}if(o.segmentPath)return[...i,o.segmentPath]}return typeof o!=`string`?[...i,o]:s===0?(o.split(`/`).forEach((c,a)=>{a==0&&c===`.`||(a==0&&c===``?e=!0:c===`..`?n++:c!=``&&i.push(c))}),i):[...i,o]},[]);return new dt$1(e,n,r)}var fe=class{segmentGroup;processChildren;index;constructor(n,e,r){this.segmentGroup=n,this.processChildren=e,this.index=r}};function Si(t,n,e){if(t.isAbsolute)return new fe(n,!0,0);if(!e)return new fe(n,!1,NaN);if(e.parent===null)return new fe(e,!0,0);let r=lt$1(t.commands[0])?0:1;return Ci(e,e.segments.length-1+r,t.numberOfDoubleDots)}function Ci(t,n,e){let r=t,i=n,o=e;for(;o>i;){if(o-=i,r=r.parent,!r)throw new y$2(4005,!1);i=r.segments.length}return new fe(r,!1,i-o)}function wi(t){return Le$1(t[0])?t[0].outlets:{[p$4]:t}}function En(t,n,e){if(t??=new m$3([],{}),t.segments.length===0&&t.hasChildren())return Oe$1(t,n,e);let r=bi(t,n,e),i=e.slice(r.commandIndex);if(r.match&&r.pathIndex<t.segments.length){let o=new m$3(t.segments.slice(0,r.pathIndex),{});return o.children[p$4]=new m$3(t.segments.slice(r.pathIndex),t.children),Oe$1(o,0,i)}else return r.match&&i.length===0?new m$3(t.segments,{}):r.match&&!t.hasChildren()?er(t,n,e):r.match?Oe$1(t,0,i):er(t,n,e)}function Oe$1(t,n,e){if(e.length===0)return new m$3(t.segments,{});{let r=wi(e),i=Object.create(null);if(Object.keys(r).some(o=>o!==`primary`)&&t.children[`primary`]&&t.numberOfChildren===1&&t.children[`primary`].segments.length===0){let o=Oe$1(t.children[p$4],n,e);return new m$3(t.segments,o.children)}return Object.entries(r).forEach(([o,s])=>{typeof s==`string`&&(s=[s]),s!==null&&(i[o]=En(t.children[o],n,s))}),Object.entries(t.children).forEach(([o,s])=>{r[o]===void 0&&(i[o]=s)}),new m$3(t.segments,i)}}function bi(t,n,e){let r=0,i=n,o={match:!1,pathIndex:0,commandIndex:0};for(;i<t.segments.length;){if(r>=e.length)return o;let s=t.segments[i],c=e[r];if(Le$1(c))break;let a=`${c}`,u=r<e.length-1?e[r+1]:null;if(i>0&&a===void 0)break;if(a&&u&&typeof u==`object`&&u.outlets===void 0){if(!an(a,u,s))return o;r+=2}else{if(!an(a,{},s))return o;r++}i++}return{match:!0,pathIndex:i,commandIndex:r}}function er(t,n,e){let r=t.segments.slice(0,n),i=0;for(;i<e.length;){let o=e[i];if(Le$1(o))return new m$3(r,Ii(o.outlets));if(i===0&&lt$1(e[0])){let a=t.segments[n];r.push(new K$3(a.path,sn(e[0]))),i++;continue}let s=Le$1(o)?o.outlets[p$4]:`${o}`,c=i<e.length-1?e[i+1]:null;s&&c&&lt$1(c)?(r.push(new K$3(s,sn(c))),i+=2):(r.push(new K$3(s,{})),i++)}return new m$3(r,{})}function Ii(t){let n={};return Object.entries(t).forEach(([e,r])=>{typeof r==`string`&&(r=[r]),r!==null&&(n[e]=er(new m$3([],{}),0,r))}),n}function sn(t){let n={};return Object.entries(t).forEach(([e,r])=>n[e]=`${r}`),n}function an(t,n,e){return t==e.path&&F$3(n,e.parameters)}var pe$2=`imperative`;var S$3=(function(t){return t[t.NavigationStart=0]=`NavigationStart`,t[t.NavigationEnd=1]=`NavigationEnd`,t[t.NavigationCancel=2]=`NavigationCancel`,t[t.NavigationError=3]=`NavigationError`,t[t.RoutesRecognized=4]=`RoutesRecognized`,t[t.ResolveStart=5]=`ResolveStart`,t[t.ResolveEnd=6]=`ResolveEnd`,t[t.GuardsCheckStart=7]=`GuardsCheckStart`,t[t.GuardsCheckEnd=8]=`GuardsCheckEnd`,t[t.RouteConfigLoadStart=9]=`RouteConfigLoadStart`,t[t.RouteConfigLoadEnd=10]=`RouteConfigLoadEnd`,t[t.ChildActivationStart=11]=`ChildActivationStart`,t[t.ChildActivationEnd=12]=`ChildActivationEnd`,t[t.ActivationStart=13]=`ActivationStart`,t[t.ActivationEnd=14]=`ActivationEnd`,t[t.Scroll=15]=`Scroll`,t[t.NavigationSkipped=16]=`NavigationSkipped`,t})(S$3||{});var U$3=class{id;url;constructor(n,e){this.id=n,this.url=e}};var J$3=class extends U$3{type=S$3.NavigationStart;navigationTrigger;restoredState;constructor(n,e,r=`imperative`,i=null){super(n,e),this.navigationTrigger=r,this.restoredState=i}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}};var x$2=class extends U$3{urlAfterRedirects;type=S$3.NavigationEnd;constructor(n,e,r){super(n,e),this.urlAfterRedirects=r}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}};var b$2=(function(t){return t[t.Redirect=0]=`Redirect`,t[t.SupersededByNewNavigation=1]=`SupersededByNewNavigation`,t[t.NoDataFromResolver=2]=`NoDataFromResolver`,t[t.GuardRejected=3]=`GuardRejected`,t[t.Aborted=4]=`Aborted`,t})(b$2||{});var me$1=(function(t){return t[t.IgnoredSameUrlNavigation=0]=`IgnoredSameUrlNavigation`,t[t.IgnoredByUrlHandlingStrategy=1]=`IgnoredByUrlHandlingStrategy`,t})(me$1||{});var j$3=class extends U$3{reason;code;type=S$3.NavigationCancel;constructor(n,e,r,i){super(n,e),this.reason=r,this.code=i}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}};function An(t){return t instanceof j$3&&(t.code===b$2.Redirect||t.code===b$2.SupersededByNewNavigation)}var H$2=class extends U$3{reason;code;type=S$3.NavigationSkipped;constructor(n,e,r,i){super(n,e),this.reason=r,this.code=i}};var se$1=class extends U$3{error;target;type=S$3.NavigationError;constructor(n,e,r,i){super(n,e),this.error=r,this.target=i}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}};var je=class extends U$3{urlAfterRedirects;state;type=S$3.RoutesRecognized;constructor(n,e,r,i){super(n,e),this.urlAfterRedirects=r,this.state=i}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}};var ht$1=class extends U$3{urlAfterRedirects;state;type=S$3.GuardsCheckStart;constructor(n,e,r,i){super(n,e),this.urlAfterRedirects=r,this.state=i}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}};var ft$1=class extends U$3{urlAfterRedirects;state;shouldActivate;type=S$3.GuardsCheckEnd;constructor(n,e,r,i,o){super(n,e),this.urlAfterRedirects=r,this.state=i,this.shouldActivate=o}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}};var pt=class extends U$3{urlAfterRedirects;state;type=S$3.ResolveStart;constructor(n,e,r,i){super(n,e),this.urlAfterRedirects=r,this.state=i}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}};var gt$1=class extends U$3{urlAfterRedirects;state;type=S$3.ResolveEnd;constructor(n,e,r,i){super(n,e),this.urlAfterRedirects=r,this.state=i}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}};var vt$1=class{route;type=S$3.RouteConfigLoadStart;constructor(n){this.route=n}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}};var mt$1=class{route;type=S$3.RouteConfigLoadEnd;constructor(n){this.route=n}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}};var yt$1=class{snapshot;type=S$3.ChildActivationStart;constructor(n){this.snapshot=n}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||``}')`}};var Rt=class{snapshot;type=S$3.ChildActivationEnd;constructor(n){this.snapshot=n}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||``}')`}};var St$1=class{snapshot;type=S$3.ActivationStart;constructor(n){this.snapshot=n}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||``}')`}};var Ct$1=class{snapshot;type=S$3.ActivationEnd;constructor(n){this.snapshot=n}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||``}')`}};var ye$1=class{routerEvent;position;anchor;scrollBehavior;type=S$3.Scroll;constructor(n,e,r,i){this.routerEvent=n,this.position=e,this.anchor=r,this.scrollBehavior=i}toString(){let n=this.position?`${this.position[0]}, ${this.position[1]}`:null;return`Scroll(anchor: '${this.anchor}', position: '${n}')`}};var Re$1=class{};var xe$1=class{};var Se$1=class{url;navigationBehaviorOptions;constructor(n,e){this.url=n,this.navigationBehaviorOptions=e}};function Ei(t){return!(t instanceof Re$1)&&!(t instanceof Se$1)&&!(t instanceof xe$1)}var wt=class{rootInjector;outlet=null;route=null;children;attachRef=null;get injector(){return this.route?.snapshot._environmentInjector??this.rootInjector}constructor(n){this.rootInjector=n,this.children=new Ie$1(this.rootInjector)}};var Ie$1=(()=>{class t{rootInjector;contexts=new Map;constructor(e){this.rootInjector=e}onChildOutletCreated(e,r){let i=this.getOrCreateContext(e);i.outlet=r,this.contexts.set(e,i)}onChildOutletDestroyed(e){let r=this.getContext(e);r&&(r.outlet=null,r.attachRef=null)}onOutletDeactivated(){let e=this.contexts;return this.contexts=new Map,e}onOutletReAttached(e){this.contexts=e}getOrCreateContext(e){let r=this.getContext(e);return r||(r=new wt(this.rootInjector),this.contexts.set(e,r)),r}getContext(e){return this.contexts.get(e)||null}static ɵfac=function(r){return new(r||t)(S$4(fe$1))};static ɵprov=A$2({token:t,factory:t.ɵfac,providedIn:`root`})}return t})();var bt$2=class{_root;constructor(n){this._root=n}get root(){return this._root.value}parent(n){let e=this.pathFromRoot(n);return e.length>1?e[e.length-2]:null}children(n){let e=tr(n,this._root);return e?e.children.map(r=>r.value):[]}firstChild(n){let e=tr(n,this._root);return e&&e.children.length>0?e.children[0].value:null}siblings(n){let e=rr(n,this._root);return e.length<2?[]:e[e.length-2].children.map(i=>i.value).filter(i=>i!==n)}pathFromRoot(n){return rr(n,this._root).map(e=>e.value)}};function tr(t,n){if(t===n.value)return n;for(let e of n.children){let r=tr(t,e);if(r)return r}return null}function rr(t,n){if(t===n.value)return[n];for(let e of n.children){let r=rr(t,e);if(r.length)return r.unshift(n),r}return[]}var _$2=class{value;children;constructor(n,e){this.value=n,this.children=e}toString(){return`TreeNode(${this.value})`}};function he(t){let n={};return t&&t.children.forEach(e=>n[e.value.outlet]=e),n}var ke$1=class extends bt$2{snapshot;constructor(n,e){super(n),this.snapshot=e,pr(this,n)}toString(){return this.snapshot.toString()}};function Mn(t,n){let e=Ai(t,n),r=new Vr([new K$3(``,{})]),i=new Vr({}),o=new Vr({}),a=new G$2(r,i,new Vr({}),new Vr(``),o,p$4,t,e.root);return a.snapshot=e.root,new ke$1(new _$2(a,[]),e)}function Ai(t,n){return new $e(``,new _$2(new Ce$1([],{},{},``,{},p$4,t,null,{},n),[]))}var G$2=class{urlSubject;paramsSubject;queryParamsSubject;fragmentSubject;dataSubject;outlet;component;snapshot;_futureSnapshot;_routerState;_paramMap;_queryParamMap;title;url;params;queryParams;fragment;data;resources;_localInjector;pending;paramsSignal;queryParamsSignal;paramMapSignal;queryParamMapSignal;fragmentSignal;dataSignal;constructor(n,e,r,i,o,s,c,a){this.urlSubject=n,this.paramsSubject=e,this.queryParamsSubject=r,this.fragmentSubject=i,this.dataSubject=o,this.outlet=s,this.component=c,this._futureSnapshot=a,this.title=this.dataSubject?.pipe(ae$3(u=>u[Fe]))??$r(void 0),this.url=n,this.params=e,this.queryParams=r,this.fragment=i,this.data=o}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=this.params.pipe(ae$3(n=>oe$2(n))),this._paramMap}get queryParamMap(){return this._queryParamMap??=this.queryParams.pipe(ae$3(n=>oe$2(n))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}_setPending(n){this._futureSnapshot=n,this.pending?.set(!0)}};var Mi=`always`;function fr(t,n,e){let r,{routeConfig:i}=t;return n!==null&&(e===`always`||i?.path===``||!n.component&&!n.routeConfig?.loadComponent)?r={params:l$1(l$1({},n.params),t.params),data:l$1(l$1({},n.data),t.data),resolve:l$1(l$1(l$1(l$1({},t.data),n.data),i?.data),t._resolvedData)}:r={params:l$1({},t.params),data:l$1({},t.data),resolve:l$1(l$1({},t.data),t._resolvedData??{})},i&&Nn(i)&&(r.resolve[Fe]=i.title),r}var Ce$1=class{url;params;queryParams;fragment;data;outlet;component;routeConfig;_resolve;_resolvedData;_routerState;_paramMap;_queryParamMap;_environmentInjector;resources;get title(){return this.data?.[Fe]}constructor(n,e,r,i,o,s,c,a,u,l){this.url=n,this.params=e,this.queryParams=r,this.fragment=i,this.data=o,this.outlet=s,this.component=c,this.routeConfig=a,this._resolve=u,this._environmentInjector=l}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=oe$2(this.params),this._paramMap}get queryParamMap(){return this._queryParamMap??=oe$2(this.queryParams),this._queryParamMap}toString(){return`Route(url:'${this.url.map(r=>r.toString()).join(`/`)}', path:'${this.routeConfig?this.routeConfig.path:``}')`}};var $e=class extends bt$2{url;constructor(n,e){super(e),this.url=n,pr(this,e)}toString(){return Tn(this._root)}};function pr(t,n){n.value._routerState=t,n.children.forEach(e=>pr(t,e))}function Tn(t){let n=t.children.length>0?` { ${t.children.map(Tn).join(`, `)} } `:``;return`${t.value}${n}`}function Qt(t){if(t.snapshot){let n=t.snapshot,e=t._futureSnapshot;t.snapshot=e,F$3(n.queryParams,e.queryParams)||t.queryParamsSubject.next(e.queryParams),n.fragment!==e.fragment&&t.fragmentSubject.next(e.fragment),F$3(n.params,e.params)||t.paramsSubject.next(e.params),ei(n.url,e.url)||t.urlSubject.next(e.url),F$3(n.data,e.data)||t.dataSubject.next(e.data)}else t.snapshot=t._futureSnapshot,t.dataSubject.next(t._futureSnapshot.data)}function nr(t,n){let e=F$3(t.params,n.params)&&oi(t.url,n.url),r=!t.parent!=!n.parent;return e&&!r&&(!t.parent||nr(t.parent,n.parent))}function Nn(t){return typeof t.title==`string`||t.title===null}var Dn=new E$4(``);var gr=(()=>{class t{activated=null;get activatedComponentRef(){return this.activated}_activatedRoute=null;name=p$4;activateEvents=new It$1;deactivateEvents=new It$1;attachEvents=new It$1;detachEvents=new It$1;routerOutletData=NH();parentContexts=g$2(Ie$1);location=g$2(Ar);changeDetector=g$2(oD);inputBinder=g$2(He,{optional:!0});supportsBindingToComponentInputs=!0;ngOnChanges(e){if(e.name){let{firstChange:r,previousValue:i}=e.name;if(r)return;this.isTrackedInParentContexts(i)&&(this.deactivate(),this.parentContexts.onChildOutletDestroyed(i)),this.initializeOutletWithName()}}ngOnDestroy(){this.isTrackedInParentContexts(this.name)&&this.parentContexts.onChildOutletDestroyed(this.name),this.inputBinder?.unsubscribeFromRouteData(this)}isTrackedInParentContexts(e){return this.parentContexts.getContext(e)?.outlet===this}ngOnInit(){this.initializeOutletWithName()}initializeOutletWithName(){if(this.parentContexts.onChildOutletCreated(this.name,this),this.activated)return;let e=this.parentContexts.getContext(this.name);e?.route&&(e.attachRef?this.attach(e.attachRef,e.route):this.activateWith(e.route,e.injector))}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new y$2(4012,!1);return this.activated.instance}get activatedRoute(){if(!this.activated)throw new y$2(4012,!1);return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new y$2(4012,!1);this.location.detach();let e=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(e.instance),e}attach(e,r){this.activated=e,this._activatedRoute=r,this.location.insert(e.hostView),this.inputBinder?.bindActivatedRouteToOutletComponent(this,this.location.injector),this.attachEvents.emit(e.instance)}deactivate(){if(this.activated){let e=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(e)}}activateWith(e,r){if(this.isActivated)throw new y$2(4013,!1);this._activatedRoute=e;let i=this.location,s=e.snapshot.component,c=this.parentContexts.getOrCreateContext(this.name).children,a=new ir(e,c,i.injector,this.routerOutletData);this.activated=i.createComponent(s,{index:i.length,injector:a,environmentInjector:r}),this.changeDetector.markForCheck(),this.inputBinder?.bindActivatedRouteToOutletComponent(this,this.location.injector),this.activateEvents.emit(this.activated.instance)}static ɵfac=function(r){return new(r||t)};static ɵdir=ad({type:t,selectors:[[`router-outlet`]],inputs:{name:`name`,routerOutletData:[1,`routerOutletData`]},outputs:{activateEvents:`activate`,deactivateEvents:`deactivate`,attachEvents:`attach`,detachEvents:`detach`},exportAs:[`outlet`],features:[rl]})}return t})();var ir=class{route;childContexts;parent;outletData;constructor(n,e,r,i){this.route=n,this.childContexts=e,this.parent=r,this.outletData=i}get(n,e){return n===G$2?this.route:n===Ie$1?this.childContexts:n===Dn?this.outletData:this.parent.get(n,e)}};var He=new E$4(``);var _n=(()=>{class t{options;feature;outletDataSubscriptions=new Map;outletSeenKeys=new Map;outletEffects=new Map;constructor(e,r=null){this.options=e,this.feature=r,this.options.queryParams??=!0}bindActivatedRouteToOutletComponent(e,r){this.unsubscribeFromRouteData(e),this.subscribeToRouteData(e,r)}unsubscribeFromRouteData(e){this.outletDataSubscriptions.get(e)?.unsubscribe(),this.outletDataSubscriptions.delete(e),this.outletSeenKeys.delete(e),this.outletEffects.get(e)?.forEach(r=>r.destroy()),this.outletEffects.delete(e)}subscribeToRouteData(e,r){let{activatedRoute:i}=e,o=[],s=[];if(this.feature?.createResourceOutletBindingEffects&&e.activatedComponentRef){let{handledKeys:a,createdEffects:u}=this.feature.createResourceOutletBindingEffects(e.activatedComponentRef,i,r);o.push(...u),s=a}o.length>0&&this.outletEffects.set(e,o);let c=IE([this.options.queryParams?i.queryParams:$r({}),i.params,i.data]).pipe(Qa(([a,u,l],v)=>(l=l$1(l$1(l$1(l$1({},a),u),l),i.resources||{}),v===0?$r(l):Promise.resolve(l)))).subscribe(a=>{if(!e.isActivated||!e.activatedComponentRef||e.activatedRoute!==i||i.component===null){this.unsubscribeFromRouteData(e);return}let u=jH(i.component);if(!u){this.unsubscribeFromRouteData(e);return}let l=this.outletSeenKeys.get(e);l||(l=new Set,this.outletSeenKeys.set(e,l));for(let f of Object.keys(a))l.add(f);let v=this.options.unmatchedInputBehavior??`alwaysUndefined`;for(let{templateName:f}of u.inputs){if(s.includes(f))continue;let R=a[f];(R!==void 0||v===`alwaysUndefined`||l.has(f))&&e.activatedComponentRef.setInput(f,R)}});this.outletDataSubscriptions.set(e,c)}static ɵfac=function(r){tb()};static ɵprov=A$2({token:t,factory:t.ɵfac})}return t})();var vr=(()=>{class t{static ɵfac=function(r){return new(r||t)};static ɵcmp=Fb({type:t,selectors:[[`ng-component`]],exportAs:[`emptyRouterOutlet`],decls:1,vars:0,template:function(r,i){r&1&&Py(0,`router-outlet`)},dependencies:[gr],encapsulation:2,changeDetection:1})}return t})();function mr(t){let n=t.children&&t.children.map(mr),e=n?m$4(l$1({},t),{children:n}):l$1({},t);return!e.component&&!e.loadComponent&&(n||e.loadChildren)&&e.outlet&&e.outlet!==`primary`&&(e.component=vr),e}function Ti(t,n,e){let r=new Set;return{newlyCreatedRoutes:r,state:new ke$1(ze$1(t,n._root,e?e._root:void 0,r),n)}}function ze$1(t,n,e,r){if(e&&t.shouldReuseRoute(n.value,e.value.snapshot)){let i=e.value;i._setPending(n.value);return new _$2(i,Ni(t,n,e,r))}else{if(t.shouldAttach(n.value)){let s=t.retrieve(n.value);if(s!==null){let c=s.route;return c.value._setPending(n.value),c.children=n.children.map(a=>ze$1(t,a,void 0,r)),c}}let i=Di(n.value);i._setPending(n.value),r.add(i);return new _$2(i,n.children.map(s=>ze$1(t,s,void 0,r)))}}function Ni(t,n,e,r){return n.children.map(i=>{for(let o of e.children)if(t.shouldReuseRoute(i.value,o.value.snapshot))return ze$1(t,i,o,r);return ze$1(t,i,void 0,r)})}function Di(t){return new G$2(new Vr(t.url),new Vr(t.params),new Vr(t.queryParams),new Vr(t.fragment),new Vr(t.data),t.outlet,t.component,t)}var we$1=class{redirectTo;navigationBehaviorOptions;constructor(n,e){this.redirectTo=n,this.navigationBehaviorOptions=e}};var Un=`ngNavigationCancelingError`;function It(t,n){let{redirectTo:e,navigationBehaviorOptions:r}=Z$3(n)?{redirectTo:n,navigationBehaviorOptions:void 0}:n,i=On(!1,b$2.Redirect);return i.url=e,i.navigationBehaviorOptions=r,i}function On(t,n){let e=new Error(`NavigationCancelingError: ${t||``}`);return e[Un]=!0,e.cancellationCode=n,e}function _i(t){return Pn(t)&&Z$3(t.url)}function Pn(t){return!!t&&t[Un]}var or=class{routeReuseStrategy;futureState;currState;forwardEvent;inputBindingEnabled;constructor(n,e,r,i,o){this.routeReuseStrategy=n,this.futureState=e,this.currState=r,this.forwardEvent=i,this.inputBindingEnabled=o}activate(n){let e=this.futureState._root,r=this.currState?this.currState._root:null;this.deactivateChildRoutes(e,r,n),Qt(this.futureState.root),this.activateChildRoutes(e,r,n)}deactivateChildRoutes(n,e,r){let i=he(e);n.children.forEach(o=>{let s=o.value.outlet;this.deactivateRoutes(o,i[s],r),delete i[s]}),Object.values(i).forEach(o=>{this.deactivateRouteAndItsChildren(o,r)})}deactivateRoutes(n,e,r){let i=n.value,o=e?e.value:null;if(i===o)if(i.component){let s=r.getContext(i.outlet);s&&this.deactivateChildRoutes(n,e,s.children)}else this.deactivateChildRoutes(n,e,r);else o&&this.deactivateRouteAndItsChildren(e,r)}deactivateRouteAndItsChildren(n,e){n.value.component&&this.routeReuseStrategy.shouldDetach(n.value.snapshot)?this.detachAndStoreRouteSubtree(n,e):this.deactivateRouteAndOutlet(n,e)}detachAndStoreRouteSubtree(n,e){let r=e.getContext(n.value.outlet),i=r&&n.value.component?r.children:e,o=he(n);for(let s of Object.values(o))this.deactivateRouteAndItsChildren(s,i);if(r&&r.outlet){let s=r.outlet.detach(),c=r.children.onOutletDeactivated();this.routeReuseStrategy.store(n.value.snapshot,{componentRef:s,route:n,contexts:c})}}deactivateRouteAndOutlet(n,e){let r=e.getContext(n.value.outlet),i=r&&n.value.component?r.children:e,o=he(n);for(let s of Object.values(o))this.deactivateRouteAndItsChildren(s,i);r&&(r.outlet&&(r.outlet.deactivate(),r.children.onOutletDeactivated()),r.attachRef=null,r.route=null),n.value._localInjector?.destroy()}activateChildRoutes(n,e,r){let i=he(e);n.children.forEach(o=>{this.activateRoutes(o,i[o.value.outlet],r),this.forwardEvent(new Ct$1(o.value.snapshot))}),n.children.length&&this.forwardEvent(new Rt(n.value.snapshot))}activateRoutes(n,e,r){let i=n.value,o=e?e.value:null;if(Qt(i),i===o)if(i.component){let s=r.getOrCreateContext(i.outlet);this.activateChildRoutes(n,e,s.children)}else this.activateChildRoutes(n,e,r);else if(i.component){let s=r.getOrCreateContext(i.outlet);if(this.routeReuseStrategy.shouldAttach(i.snapshot)){let c=this.routeReuseStrategy.retrieve(i.snapshot);this.routeReuseStrategy.store(i.snapshot,null),s.children.onOutletReAttached(c.contexts),s.attachRef=c.componentRef,s.route=c.route.value,s.outlet&&s.outlet.attach(c.componentRef,c.route.value),Qt(c.route.value),this.activateChildRoutes(n,null,s.children)}else s.attachRef=null,s.route=i,s.outlet&&s.outlet.activateWith(i,s.injector),this.activateChildRoutes(n,null,s.children)}else this.activateChildRoutes(n,null,r)}};var Et=class{path;route;constructor(n){this.path=n,this.route=this.path[this.path.length-1]}};var ge=class{component;route;constructor(n,e){this.component=n,this.route=e}};function Ui(t,n,e){let r=t._root;return Ue(r,n?n._root:null,e,[r.value])}function Oi(t){let n=t.routeConfig?t.routeConfig.canActivateChild:null;return!n||n.length===0?null:{node:t,guards:n}}function Ee$1(t,n){let e=Symbol(),r=n.get(t,e);return r===e?typeof t==`function`&&!$E(t)?t:n.get(t):r}function Ue(t,n,e,r,i={canDeactivateChecks:[],canActivateChecks:[]}){let o=he(n);return t.children.forEach(s=>{Pi(s,o[s.value.outlet],e,r.concat([s.value]),i),delete o[s.value.outlet]}),Object.entries(o).forEach(([s,c])=>Pe(c,e.getContext(s),e,i)),i}function Pi(t,n,e,r,i={canDeactivateChecks:[],canActivateChecks:[]}){let o=t.value,s=n?n.value:null,c=e?e.getContext(t.value.outlet):null;if(s&&o.routeConfig===s.routeConfig){let a=Li(s,o,o.routeConfig.runGuardsAndResolvers);a?i.canActivateChecks.push(new Et(r)):(o.data=s.data,o._resolvedData=s._resolvedData),o.component?Ue(t,n,c?c.children:null,r,i):Ue(t,n,e,r,i),a&&c&&c.outlet&&c.outlet.isActivated&&i.canDeactivateChecks.push(new ge(c.outlet.component,s))}else s&&Pe(n,c,e,i),i.canActivateChecks.push(new Et(r)),o.component?Ue(t,null,c?c.children:null,r,i):Ue(t,null,e,r,i);return i}function Li(t,n,e){if(typeof e==`function`)return cr$1(n._environmentInjector,()=>e(t,n));switch(e){case`pathParamsChange`:return!ie$2(t.url,n.url);case`pathParamsOrQueryParamsChange`:return!ie$2(t.url,n.url)||!F$3(t.queryParams,n.queryParams);case`always`:return!0;case`paramsOrQueryParamsChange`:return!nr(t,n)||!F$3(t.queryParams,n.queryParams);default:return!nr(t,n)}}function Pe(t,n,e,r){let i=he(t),o=t.value;Object.entries(i).forEach(([s,c])=>{o.component?n?Pe(c,n.children.getContext(s),n.children,r):Pe(c,null,null,r):Pe(c,e?e.getContext(s):null,e,r)}),o.component?n&&n.outlet&&n.outlet.isActivated?r.canDeactivateChecks.push(new ge(n.outlet.component,o)):r.canDeactivateChecks.push(new ge(null,o)):r.canDeactivateChecks.push(new ge(null,o))}function Be(t){return typeof t==`function`}function ji(t){return typeof t==`boolean`}function xi(t){return t&&Be(t.canLoad)}function ki(t){return t&&Be(t.canActivate)}function $i(t){return t&&Be(t.canActivateChild)}function zi(t){return t&&Be(t.canDeactivate)}function qi(t){return t&&Be(t.canMatch)}function Ln(t){return t instanceof rn||t?.name===`EmptyError`}var ot$1=Symbol(`INITIAL_VALUE`);function be(){return Qa(t=>IE(t.map(n=>n.pipe(Za(1),OE(ot$1)))).pipe(ae$3(n=>{for(let e of n)if(e!==!0){if(e===ot$1)return ot$1;if(e===!1||Fi(e))return e}return!0}),jt(n=>n!==ot$1),Za(1)))}function Fi(t){return Z$3(t)||t instanceof we$1}function jn(t){return t.aborted?$r(void 0).pipe(Za(1)):new x$3(n=>{let e=()=>{n.next(),n.complete()};return t.addEventListener(`abort`,e),()=>t.removeEventListener(`abort`,e)})}function xn(t){return kE(jn(t))}function Hi(t){return ln$1(n=>{let{targetSnapshot:e,currentSnapshot:r,guards:{canActivateChecks:i,canDeactivateChecks:o}}=n;return o.length===0&&i.length===0?$r(m$4(l$1({},n),{guardsResult:!0})):Bi(o,e,r).pipe(ln$1(s=>s&&ji(s)?Vi(e,i,t):$r(s)),ae$3(s=>m$4(l$1({},n),{guardsResult:s})))})}function Bi(t,n,e){return nt$1(t).pipe(ln$1(r=>Yi(r.component,r.route,e,n)),AE(r=>r!==!0,!0))}function Vi(t,n,e){return nt$1(n).pipe(Ya(r=>_i$1(Wi(r.route.parent,e),Gi(r.route,e),Ki(t,r.path),Qi(t,r.route))),AE(r=>r!==!0,!0))}function Gi(t,n){return t!==null&&n&&n(new St$1(t)),$r(!0)}function Wi(t,n){return t!==null&&n&&n(new yt$1(t)),$r(!0)}function Qi(t,n){let e=n.routeConfig?n.routeConfig.canActivate:null;if(!e||e.length===0)return $r(!0);return $r(e.map(i=>CE(()=>{let o=n._environmentInjector,s=Ee$1(i,o);return ae$2(ki(s)?s.canActivate(n,t):cr$1(o,()=>s(n,t))).pipe(AE())}))).pipe(be())}function Ki(t,n){let e=n[n.length-1];return $r(n.slice(0,n.length-1).reverse().map(o=>Oi(o)).filter(o=>o!==null).map(o=>CE(()=>{return $r(o.guards.map(c=>{let a=o.node._environmentInjector,u=Ee$1(c,a);return ae$2($i(u)?u.canActivateChild(e,t):cr$1(a,()=>u(e,t))).pipe(AE())})).pipe(be())}))).pipe(be())}function Yi(t,n,e,r){let i=n&&n.routeConfig?n.routeConfig.canDeactivate:null;if(!i||i.length===0)return $r(!0);return $r(i.map(s=>{let c=n._environmentInjector,a=Ee$1(s,c);return ae$2(zi(a)?a.canDeactivate(t,n,e,r):cr$1(c,()=>a(t,n,e,r))).pipe(AE())})).pipe(be())}function Zi(t,n,e,r,i){let o=n.canLoad;if(o===void 0||o.length===0)return $r(!0);return $r(o.map(c=>{let a=Ee$1(c,t),l=ae$2(xi(a)?a.canLoad(n,e):cr$1(t,()=>a(n,e)));return i?l.pipe(xn(i)):l})).pipe(be(),kn(r))}function kn(t){return nE(Of(n=>{if(typeof n!=`boolean`)throw It(t,n)}),ae$3(n=>n===!0))}function Ji(t,n,e,r,i,o){let s=n.canMatch;if(!s||s.length===0)return $r(!0);return $r(s.map(a=>{let u=Ee$1(a,t);return ae$2(qi(u)?u.canMatch(n,e,i):cr$1(t,()=>u(n,e,i))).pipe(xn(o))})).pipe(be(),kn(r))}var V$2=class t extends Error{segmentGroup;constructor(n){super(),this.segmentGroup=n||null,Object.setPrototypeOf(this,t.prototype)}};var qe$1=class t extends Error{urlTree;constructor(n){super(),this.urlTree=n,Object.setPrototypeOf(this,t.prototype)}};function Xi(t){throw new y$2(4e3,!1)}function eo(t){throw On(!1,b$2.GuardRejected)}var sr=class{urlSerializer;urlTree;constructor(n,e){this.urlSerializer=n,this.urlTree=e}async lineralizeSegments(n,e){let r=[],i=e.root;for(;;){if(r=r.concat(i.segments),i.numberOfChildren===0)return r;if(i.numberOfChildren>1||!i.children[`primary`])throw Xi(`${n.redirectTo}`);i=i.children[p$4]}}async applyRedirectCommands(n,e,r,i,o){let s=await to(e,i,o);if(s instanceof E$3)throw new qe$1(s);let c=this.applyRedirectCreateUrlTree(s,this.urlSerializer.parse(s),n,r);if(s[0]===`/`)throw new qe$1(c);return c}applyRedirectCreateUrlTree(n,e,r,i){return new E$3(this.createSegmentGroup(n,e.root,r,i),this.createQueryParams(e.queryParams,this.urlTree.queryParams),e.fragment)}createQueryParams(n,e){let r={};return Object.entries(n).forEach(([i,o])=>{if(typeof o==`string`&&o[0]===`:`){let c=o.substring(1);r[i]=e[c]}else r[i]=o}),r}createSegmentGroup(n,e,r,i){let o=this.createSegments(n,e.segments,r,i),s=Object.create(null);return Object.entries(e.children).forEach(([c,a])=>{s[c]=this.createSegmentGroup(n,a,r,i)}),new m$3(o,s)}createSegments(n,e,r,i){return e.map(o=>o.path[0]===`:`?this.findPosParam(n,o,i):this.findOrReturn(o,r))}findPosParam(n,e,r){let i=r[e.path.substring(1)];if(!i)throw new y$2(4001,!1);return i}findOrReturn(n,e){let r=0;for(let i of e){if(i.path===n.path)return e.splice(r),i;r++}return n}};function to(t,n,e){if(typeof t==`string`)return Promise.resolve(t);let r=t;return ut$1(ae$2(cr$1(e,()=>r(n))))}function ro(t,n){return t.providers&&!t._injector&&(t._injector=sd(t.providers,n,`Route: ${t.path}`)),t._injector??n}function z$3(t){return t.outlet||`primary`}function no(t,n){let e=t.filter(r=>z$3(r)===n);return e.push(...t.filter(r=>z$3(r)!==n)),e}var ar={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function $n(t){return{routeConfig:t.routeConfig,url:t.url,params:t.params,queryParams:t.queryParams,fragment:t.fragment,data:t.data,outlet:t.outlet,title:t.title,paramMap:t.paramMap,queryParamMap:t.queryParamMap}}function io(t,n,e,r,i,o,s){let c=zn(t,n,e);if(!c.matched)return $r(c);let a=$n(o(c));return r=ro(n,r),Ji(r,n,e,i,a,s).pipe(ae$3(u=>u===!0?c:l$1({},ar)))}function zn(t,n,e){if(n.path===``)return n.pathMatch===`full`&&(t.hasChildren()||e.length>0)?l$1({},ar):{matched:!0,consumedSegments:[],remainingSegments:e,parameters:{},positionalParamSegments:{}};let i=(n.matcher||ln)(e,t,n);if(!i)return l$1({},ar);let o={};Object.entries(i.posParams??{}).forEach(([c,a])=>{o[c]=a.path});let s=i.consumed.length>0?l$1(l$1({},o),i.consumed[i.consumed.length-1].parameters):o;return{matched:!0,consumedSegments:i.consumed,remainingSegments:e.slice(i.consumed.length),parameters:s,positionalParamSegments:i.posParams??{}}}function cn(t,n,e,r,i){return e.length>0&&ao(t,e,r,i)?{segmentGroup:new m$3(n,so(r,new m$3(e,t.children))),slicedSegments:[]}:e.length===0&&co(t,e,r)?{segmentGroup:new m$3(t.segments,oo(t,e,r,t.children)),slicedSegments:e}:{segmentGroup:new m$3(t.segments,t.children),slicedSegments:e}}function oo(t,n,e,r){let i={};for(let o of e)if(Mt$1(t,n,o)&&!r[z$3(o)]){let s=new m$3([],{});i[z$3(o)]=s}return l$1(l$1({},r),i)}function so(t,n){let e={};e[p$4]=n;for(let r of t)if(r.path===``&&z$3(r)!==`primary`){let i=new m$3([],{});e[z$3(r)]=i}return e}function ao(t,n,e,r){return e.some(i=>!Mt$1(t,n,i)||!(z$3(i)!==`primary`)?!1:!(r!==void 0&&z$3(i)===r))}function co(t,n,e){return e.some(r=>Mt$1(t,n,r))}function Mt$1(t,n,e){return(t.hasChildren()||n.length>0)&&e.pathMatch===`full`?!1:e.path===``}function uo(t,n,e){return n.length===0&&!t.children[e]}var cr=class{};async function lo(t,n,e,r,i,o,s,c){return new ur(t,n,e,r,i,s,o,c).recognize()}var ho=31;var ur=class{injector;configLoader;rootComponentType;config;urlTree;paramsInheritanceStrategy;urlSerializer;abortSignal;applyRedirects;absoluteRedirectCount=0;allowRedirects=!0;constructor(n,e,r,i,o,s,c,a){this.injector=n,this.configLoader=e,this.rootComponentType=r,this.config=i,this.urlTree=o,this.paramsInheritanceStrategy=s,this.urlSerializer=c,this.abortSignal=a,this.applyRedirects=new sr(this.urlSerializer,this.urlTree)}noMatchError(n){return new y$2(4002,`'${n.segmentGroup}'`)}async recognize(){let n=cn(this.urlTree.root,[],[],this.config).segmentGroup,{children:e,rootSnapshot:r}=await this.match(n),o=new $e(``,new _$2(r,e)),s=Cn(r,[],this.urlTree.queryParams,this.urlTree.fragment);return s.queryParams=this.urlTree.queryParams,o.url=this.urlSerializer.serialize(s),{state:o,tree:s}}async match(n){let e=new Ce$1([],Object.freeze({}),Object.freeze(l$1({},this.urlTree.queryParams)),this.urlTree.fragment,Object.freeze({}),p$4,this.rootComponentType,null,{},this.injector);try{return{children:await this.processSegmentGroup(this.injector,this.config,n,p$4,e),rootSnapshot:e}}catch(r){if(r instanceof qe$1)return this.urlTree=r.urlTree,this.match(r.urlTree.root);throw r instanceof V$2?this.noMatchError(r):r}}async processSegmentGroup(n,e,r,i,o){if(r.segments.length===0&&r.hasChildren())return this.processChildren(n,e,r,o);let s=await this.processSegment(n,e,r,r.segments,i,!0,o);return s instanceof _$2?[s]:[]}async processChildren(n,e,r,i){let o=[];for(let a of Object.keys(r.children))a===`primary`?o.unshift(a):o.push(a);let s=[];for(let a of o){let u=r.children[a],l=no(e,a),v=await this.processSegmentGroup(n,l,u,a,i);s.push(...v)}let c=qn(s);return fo(c),c}async processSegment(n,e,r,i,o,s,c){for(let a of e)try{return await this.processSegmentAgainstRoute(a._injector??n,e,a,r,i,o,s,c)}catch(u){if(u instanceof V$2||Ln(u))continue;throw u}if(uo(r,i,o))return new cr;throw new V$2(r)}async processSegmentAgainstRoute(n,e,r,i,o,s,c,a){if(z$3(r)!==s&&(s===`primary`||!Mt$1(i,o,r)))throw new V$2(i);if(r.redirectTo===void 0)return this.matchSegmentAgainstRoute(n,i,r,o,s,a);if(this.allowRedirects&&c)return this.expandSegmentAgainstRouteUsingRedirect(n,i,e,r,o,s,a);throw new V$2(i)}async expandSegmentAgainstRouteUsingRedirect(n,e,r,i,o,s,c){let{matched:a,parameters:u,consumedSegments:l,positionalParamSegments:v,remainingSegments:f}=zn(e,i,o);if(!a)throw new V$2(e);typeof i.redirectTo==`string`&&i.redirectTo[0]===`/`&&(this.absoluteRedirectCount++,this.absoluteRedirectCount>ho&&(this.allowRedirects=!1));let R=this.createSnapshot(n,i,o,u,c);if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let k=await this.applyRedirects.applyRedirectCommands(l,i.redirectTo,v,$n(R),n),X=await this.applyRedirects.lineralizeSegments(i,k);return this.processSegment(n,r,e,X.concat(f),s,!1,c)}createSnapshot(n,e,r,i,o){let s=new Ce$1(r,i,Object.freeze(l$1({},this.urlTree.queryParams)),this.urlTree.fragment,go(e),z$3(e),e.component??e._loadedComponent??null,e,vo(e),n),c=fr(s,o,this.paramsInheritanceStrategy);return s.params=Object.freeze(c.params),s.data=Object.freeze(c.data),s}async matchSegmentAgainstRoute(n,e,r,i,o,s){if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let c=ee=>this.createSnapshot(n,r,ee.consumedSegments,ee.parameters,s),a=await ut$1(io(e,r,i,n,this.urlSerializer,c,this.abortSignal));if(r.path===`**`&&(e.children={}),!a?.matched)throw new V$2(e);n=r._injector??n;let{routes:u}=await this.getChildConfig(n,r,i),l=r._loadedInjector??n,{parameters:v,consumedSegments:f,remainingSegments:R}=a,k=this.createSnapshot(n,r,f,v,s),{segmentGroup:X,slicedSegments:Me}=cn(e,f,R,u,o);if(Me.length===0&&X.hasChildren())return new _$2(k,await this.processChildren(l,u,X,k));if(u.length===0&&Me.length===0)return new _$2(k,[]);let _t=z$3(r)===o,Ge=await this.processSegment(l,u,X,Me,_t?p$4:o,!0,k);return new _$2(k,Ge instanceof _$2?[Ge]:[])}async getChildConfig(n,e,r){if(e.children)return{routes:e.children,injector:n};if(e.loadChildren){if(e._loadedRoutes!==void 0){let o=e._loadedNgModuleFactory;return o&&!e._loadedInjector&&(e._loadedInjector=o.create(n).injector),{routes:e._loadedRoutes,injector:e._loadedInjector}}if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);if(await ut$1(Zi(n,e,r,this.urlSerializer,this.abortSignal))){let o=await this.configLoader.loadChildren(n,e);return e._loadedRoutes=o.routes,e._loadedInjector=o.injector,e._loadedNgModuleFactory=o.factory,o}throw eo(e)}return{routes:[],injector:n}}};function fo(t){t.sort((n,e)=>n.value.outlet===`primary`?-1:e.value.outlet===`primary`?1:n.value.outlet.localeCompare(e.value.outlet))}function po(t){let n=t.value.routeConfig;return n&&n.path===``}function qn(t){let n=[],e=new Set;for(let r of t){if(!po(r)){n.push(r);continue}let i=n.find(o=>r.value.routeConfig===o.value.routeConfig);i!==void 0?(i.children.push(...r.children),e.add(i)):n.push(r)}for(let r of e){let i=qn(r.children);n.push(new _$2(r.value,i))}return n.filter(r=>!e.has(r))}function go(t){return t.data||{}}function vo(t){return t.resolve||{}}function mo(t,n,e,r,i,o,s){return ln$1(async c=>{let{state:a,tree:u}=await lo(t,n,e,r,c.extractedUrl,i,o,s);return m$4(l$1({},c),{targetSnapshot:a,urlAfterRedirects:u})})}function yo(t){return ln$1(n=>{let{targetSnapshot:e,guards:{canActivateChecks:r}}=n;if(!r.length)return $r(n);let i=new Set(r.map(c=>c.route)),o=new Set;for(let c of i)if(!o.has(c))for(let a of Fn(c))o.add(a);let s=0;return nt$1(o).pipe(Ya(c=>i.has(c)?Ro(c,e,t):(c.data=fr(c,c.parent,t).resolve,$r(void 0))),Of(()=>s++),xE(1),ln$1(c=>s===o.size?$r(n):cn$1))})}function Fn(t){return[t,...t.children.map(e=>Fn(e)).flat()]}function Ro(t,n,e){let r=t.routeConfig,i=t._resolve;return r?.title!==void 0&&!Nn(r)&&(i[Fe]=r.title),CE(()=>(t.data=fr(t,t.parent,e).resolve,So(i,t,n).pipe(ae$3(o=>(t._resolvedData=o,t.data=l$1(l$1({},t.data),o),null)))))}function So(t,n,e){let r=Yt(t);if(r.length===0)return $r({});let i={};return nt$1(r).pipe(ln$1(o=>Co(t[o],n,e).pipe(AE(),Of(s=>{if(s instanceof we$1)throw It(new Y$3,s);i[o]=s}))),xE(1),ae$3(()=>i),qa(o=>Ln(o)?cn$1:fE(o)))}function Co(t,n,e){let r=n._environmentInjector,i=Ee$1(t,r);return ae$2(i.resolve?i.resolve(n,e):cr$1(r,()=>i(n,e)))}var yr=new E$4(``);function lr(t){return Qa(n=>{let e=t(n);return e?nt$1(e).pipe(ae$3(()=>n)):$r(n)})}var Rr=(()=>{class t{buildTitle(e){let r,i=e.root;for(;i!==void 0;)r=this.getResolvedTitleForRoute(i)??r,i=i.children.find(o=>o.outlet===p$4);return r}getResolvedTitleForRoute(e){return e.data[Fe]}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:()=>g$2(Hn)})}return t})();var Hn=(()=>{class t extends Rr{title;constructor(e){super(),this.title=e}updateTitle(e){let r=this.buildTitle(e);r!==void 0&&this.title.setTitle(r)}static ɵfac=function(r){return new(r||t)(S$4(r8))};static ɵprov=A$2({token:t,factory:t.ɵfac,providedIn:`root`})}return t})();var Ae$1=new E$4(``,{factory:()=>({})});var Ve=new E$4(``);var Bn=(()=>{class t{componentLoaders=new WeakMap;childrenLoaders=new WeakMap;onLoadStartListener;onLoadEndListener;compiler=g$2($_);async loadComponent(e,r){if(this.componentLoaders.get(r))return this.componentLoaders.get(r);if(r._loadedComponent)return Promise.resolve(r._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(r);let i=(async()=>{try{let s=await Gn(_H(await hn(cr$1(e,()=>r.loadComponent()))));return this.onLoadEndListener&&this.onLoadEndListener(r),r._loadedComponent=s,s}finally{this.componentLoaders.delete(r)}})();return this.componentLoaders.set(r,i),i}loadChildren(e,r){if(this.childrenLoaders.get(r))return this.childrenLoaders.get(r);if(r._loadedRoutes)return Promise.resolve({routes:r._loadedRoutes,injector:r._loadedInjector});this.onLoadStartListener&&this.onLoadStartListener(r);let i=(async()=>{try{let o=await Vn(r,this.compiler,e,this.onLoadEndListener);return r._loadedRoutes=o.routes,r._loadedInjector=o.injector,r._loadedNgModuleFactory=o.factory,o}finally{this.childrenLoaders.delete(r)}})();return this.childrenLoaders.set(r,i),i}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();async function Vn(t,n,e,r){let o=await Gn(_H(await hn(cr$1(e,()=>t.loadChildren())))),s;o instanceof py||Array.isArray(o)?s=o:s=await n.compileModuleAsync(o),r&&r(t);let c,a,l;return Array.isArray(s)?a=s:(c=s.create(e).injector,l=s,a=c.get(Ve,[],{optional:!0,self:!0}).flat()),{routes:a.map(mr),injector:c,factory:l}}async function Gn(t){return t}var Tt=(()=>{class t{static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:()=>g$2(wo)})}return t})();var wo=(()=>{class t{shouldProcessUrl(e){return!0}extract(e){return e}merge(e,r){return e}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();var Wn=new E$4(``);var bo=()=>{};var Sr=new E$4(``);var Cr=(()=>{class t{currentNavigation=Ke(null,{equal:()=>!1});currentTransition=null;lastSuccessfulNavigation=Ke(null);events=new we$2;transitionAbortWithErrorSubject=new we$2;configLoader=g$2(Bn);environmentInjector=g$2(fe$1);destroyRef=g$2(pe$3);urlSerializer=g$2(ce$2);rootContexts=g$2(Ie$1);location=g$2(fD);inputBindingEnabled=g$2(He,{optional:!0})!==null;titleStrategy=g$2(Rr);options=g$2(Ae$1,{optional:!0})||{};paramsInheritanceStrategy=this.options.paramsInheritanceStrategy||Mi;urlHandlingStrategy=g$2(Tt);createViewTransition=g$2(Wn,{optional:!0});navigationErrorHandler=g$2(Sr,{optional:!0});routerResourcesFeature=g$2(yr,{optional:!0});navigationId=0;get hasRequestedNavigation(){return this.navigationId!==0}transitions;afterPreactivation=()=>$r(void 0);rootComponentType=null;destroyed=!1;constructor(){let e=i=>this.events.next(new vt$1(i)),r=i=>this.events.next(new mt$1(i));this.configLoader.onLoadEndListener=r,this.configLoader.onLoadStartListener=e,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}complete(){this.transitions?.complete()}handleNavigationRequest(e){let r=++this.navigationId;ie$3(()=>{this.transitions?.next(m$4(l$1({},e),{extractedUrl:this.urlHandlingStrategy.extract(e.rawUrl),targetSnapshot:null,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null,id:r,routesRecognizeHandler:{},beforeActivateHandler:{}}))})}setupNavigations(e){return this.transitions=new Vr(null),this.transitions.pipe(jt(r=>r!==null),Qa(r=>{let i=!0,o=!1,s=new AbortController,c=()=>!o&&this.currentTransition?.id===r.id;return $r(r).pipe(Qa(a=>{if(this.navigationId>r.id)return this.cancelNavigationTransition(r,``,b$2.SupersededByNewNavigation),cn$1;this.currentTransition=r;let u=this.lastSuccessfulNavigation();this.currentNavigation.set({id:a.id,initialUrl:a.rawUrl,extractedUrl:a.extractedUrl,targetBrowserUrl:typeof a.extras.browserUrl==`string`?this.urlSerializer.parse(a.extras.browserUrl):a.extras.browserUrl,trigger:a.source,extras:a.extras,previousNavigation:u?m$4(l$1({},u),{previousNavigation:null}):null,abort:()=>s.abort(),routesRecognizeHandler:a.routesRecognizeHandler,beforeActivateHandler:a.beforeActivateHandler});let l=!e.navigated||this.isUpdatingInternalState()||this.isUpdatedBrowserUrl(),v=a.extras.onSameUrlNavigation??e.onSameUrlNavigation;if(!l&&v!==`reload`)return this.events.next(new H$2(a.id,this.urlSerializer.serialize(a.rawUrl),``,me$1.IgnoredSameUrlNavigation)),a.resolve(!1),cn$1;if(this.urlHandlingStrategy.shouldProcessUrl(a.rawUrl))return $r(a).pipe(Qa(f=>(this.events.next(new J$3(f.id,this.urlSerializer.serialize(f.extractedUrl),f.source,f.restoredState)),f.id!==this.navigationId?cn$1:Promise.resolve(f))),mo(this.environmentInjector,this.configLoader,this.rootComponentType,e.config,this.urlSerializer,this.paramsInheritanceStrategy,s.signal),Of(f=>{r.targetSnapshot=f.targetSnapshot,r.urlAfterRedirects=f.urlAfterRedirects,this.currentNavigation.update(R=>(R.finalUrl=f.urlAfterRedirects,R)),this.events.next(new xe$1)}),Qa(f=>nt$1(r.routesRecognizeHandler.deferredHandle??$r(void 0)).pipe(ae$3(()=>f))),Of(()=>{let f=new je(a.id,this.urlSerializer.serialize(a.extractedUrl),this.urlSerializer.serialize(a.urlAfterRedirects),a.targetSnapshot);this.events.next(f)}));if(l&&this.urlHandlingStrategy.shouldProcessUrl(a.currentRawUrl)){let{id:f,extractedUrl:R,source:k,restoredState:X,extras:Me}=a,_t=new J$3(f,this.urlSerializer.serialize(R),k,X);this.events.next(_t);let Ge=Mn(this.rootComponentType,this.environmentInjector).snapshot;return this.currentTransition=r=m$4(l$1({},a),{targetSnapshot:Ge,urlAfterRedirects:R,extras:m$4(l$1({},Me),{skipLocationChange:!1,replaceUrl:!1})}),this.currentNavigation.update(ee=>(ee.finalUrl=R,ee)),$r(r)}else return this.events.next(new H$2(a.id,this.urlSerializer.serialize(a.extractedUrl),``,me$1.IgnoredByUrlHandlingStrategy)),a.resolve(!1),cn$1}),ae$3(a=>{let u=new ht$1(a.id,this.urlSerializer.serialize(a.extractedUrl),this.urlSerializer.serialize(a.urlAfterRedirects),a.targetSnapshot);return this.events.next(u),this.currentTransition=r=m$4(l$1({},a),{guards:Ui(a.targetSnapshot,a.currentSnapshot,this.rootContexts)}),r}),Hi(a=>this.events.next(a)),Qa(a=>{if(r.guardsResult=a.guardsResult,a.guardsResult&&typeof a.guardsResult!=`boolean`)throw It(this.urlSerializer,a.guardsResult);let u=new ft$1(a.id,this.urlSerializer.serialize(a.extractedUrl),this.urlSerializer.serialize(a.urlAfterRedirects),a.targetSnapshot,!!a.guardsResult);if(this.events.next(u),!c())return cn$1;if(!a.guardsResult)return this.cancelNavigationTransition(a,``,b$2.GuardRejected),cn$1;if(a.guards.canActivateChecks.length===0)return $r(a);let l=new pt(a.id,this.urlSerializer.serialize(a.extractedUrl),this.urlSerializer.serialize(a.urlAfterRedirects),a.targetSnapshot);if(this.events.next(l),!c())return cn$1;let v=!1;return $r(a).pipe(yo(this.paramsInheritanceStrategy),Of({next:()=>{v=!0;let f=new gt$1(a.id,this.urlSerializer.serialize(a.extractedUrl),this.urlSerializer.serialize(a.urlAfterRedirects),a.targetSnapshot);this.events.next(f)},complete:()=>{v||this.cancelNavigationTransition(a,``,b$2.NoDataFromResolver)}}))}),lr(a=>{let u=v=>{let f=[];if(v.routeConfig?._loadedComponent)v.component=v.routeConfig?._loadedComponent;else if(v.routeConfig?.loadComponent){let R=v._environmentInjector;f.push(this.configLoader.loadComponent(R,v.routeConfig).then(k=>{v.component=k}))}for(let R of v.children)f.push(...u(R));return f},l=u(a.targetSnapshot.root);return l.length===0?$r(a):nt$1(Promise.all(l).then(()=>a))}),Qa(a=>{let{newlyCreatedRoutes:u,state:l}=Ti(e.routeReuseStrategy,a.targetSnapshot,a.currentRouterState);return this.currentTransition=r=a=m$4(l$1({},a),{targetRouterState:l,newlyCreatedRoutes:u}),this.currentNavigation.update(v=>(v.targetRouterState=l,v)),$r(a)}),this.routerResourcesFeature?.setupAndRunResources(s.signal)??(a=>a),lr(()=>this.afterPreactivation()),Qa(()=>{let{currentSnapshot:a,targetSnapshot:u}=r,l=this.createViewTransition?.(this.environmentInjector,a.root,u.root,r.hasUAVisualTransition);return l?nt$1(l).pipe(ae$3(()=>r)):$r(r)}),Za(1),Qa(a=>{i=!1,this.events.next(new Re$1);let u=r.beforeActivateHandler.deferredHandle;return u?nt$1(u.then(()=>a)):$r(a)}),Of(a=>{new or(e.routeReuseStrategy,r.targetRouterState,r.currentRouterState,u=>this.events.next(u),this.inputBindingEnabled).activate(this.rootContexts),a.newlyCreatedRoutes?.clear(),c()&&(Qn(a.targetRouterState),o=!0,this.currentNavigation.update(u=>(u.abort=bo,u)),this.lastSuccessfulNavigation.set(ie$3(this.currentNavigation)),this.events.next(new x$2(a.id,this.urlSerializer.serialize(a.extractedUrl),this.urlSerializer.serialize(a.urlAfterRedirects))),this.titleStrategy?.updateTitle(a.targetRouterState.snapshot),a.resolve(!0))}),kE(jn(s.signal).pipe(jt(()=>!o&&i),Of(()=>{this.cancelNavigationTransition(r,s.signal.reason+``,b$2.Aborted)}))),Of({complete:()=>{o=!0}}),kE(this.transitionAbortWithErrorSubject.pipe(Of(a=>{throw a}))),Ka(()=>{s.abort(),o||this.cancelNavigationTransition(r,``,b$2.SupersededByNewNavigation),this.currentTransition?.id===r.id&&(this.currentNavigation.set(null),this.currentTransition=null)}),qa(a=>{if(o=!0,un(r),this.destroyed)return r.resolve(!1),cn$1;if(Pn(a))this.events.next(new j$3(r.id,this.urlSerializer.serialize(r.extractedUrl),a.message,a.cancellationCode)),_i(a)?this.events.next(new Se$1(a.url,a.navigationBehaviorOptions)):r.resolve(!1);else{let u=new se$1(r.id,this.urlSerializer.serialize(r.extractedUrl),a,r.targetSnapshot??void 0);try{let l=cr$1(this.environmentInjector,()=>this.navigationErrorHandler?.(u));if(l instanceof we$1){let{message:v,cancellationCode:f}=It(this.urlSerializer,l);this.events.next(new j$3(r.id,this.urlSerializer.serialize(r.extractedUrl),v,f)),this.events.next(new Se$1(l.redirectTo,l.navigationBehaviorOptions))}else throw this.events.next(u),a}catch(l){this.options.resolveNavigationPromiseOnError?r.resolve(!1):r.reject(l)}}return cn$1}))}))}cancelNavigationTransition(e,r,i){un(e);let o=new j$3(e.id,this.urlSerializer.serialize(e.extractedUrl),r,i);this.events.next(o),e.resolve(!1)}isUpdatingInternalState(){return this.currentTransition?.extractedUrl.toString()!==this.currentTransition?.currentUrlTree.toString()}isUpdatedBrowserUrl(){let e=this.urlHandlingStrategy.extract(this.urlSerializer.parse(this.location.path(!0))),r=ie$3(this.currentNavigation),i=r?.targetBrowserUrl??r?.extractedUrl;return e.toString()!==i?.toString()&&!r?.extras.skipLocationChange}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();function Io(t){return t!==pe$2}function un(t){for(let n of t.newlyCreatedRoutes??[])n._localInjector?.destroy(),n._localInjector=void 0;Qn(t.targetRouterState)}function Qn(t){if(!t)return;let n=e=>{e.value.pending?.set(!1),e.children.forEach(n)};n(t._root)}var Kn=new E$4(``);var Yn=(()=>{class t{static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:()=>g$2(Eo)})}return t})();var At=class{shouldDetach(n){return!1}store(n,e){}shouldAttach(n){return!1}retrieve(n){return null}shouldReuseRoute(n,e){return n.routeConfig===e.routeConfig}shouldDestroyInjector(n){return!0}};var Eo=(()=>{class t extends At{static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();var Nt$1=(()=>{class t{urlSerializer=g$2(ce$2);options=g$2(Ae$1,{optional:!0})||{};canceledNavigationResolution=this.options.canceledNavigationResolution||`replace`;location=g$2(fD);urlHandlingStrategy=g$2(Tt);urlUpdateStrategy=this.options.urlUpdateStrategy||`deferred`;currentUrlTree=new E$3;getCurrentUrlTree(){return this.currentUrlTree}rawUrlTree=this.currentUrlTree;getRawUrlTree(){return this.rawUrlTree}createBrowserPath({finalUrl:e,initialUrl:r,targetBrowserUrl:i}){let o=e!==void 0?this.urlHandlingStrategy.merge(e,r):r,s=i??o;return s instanceof E$3?this.urlSerializer.serialize(s):s}routerUrlState(e){return e?.targetBrowserUrl===void 0||e?.finalUrl===void 0?{}:{ɵrouterUrl:this.urlSerializer.serialize(e.finalUrl)}}commitTransition({targetRouterState:e,finalUrl:r,initialUrl:i}){r&&e?(this.currentUrlTree=r,this.rawUrlTree=this.urlHandlingStrategy.merge(r,i),this.routerState=e):this.rawUrlTree=i}routerState=Mn(null,g$2(fe$1));getRouterState(){return this.routerState}_stateMemento=this.createStateMemento();get stateMemento(){return this._stateMemento}updateStateMemento(){this._stateMemento=this.createStateMemento()}createStateMemento(){return{rawUrlTree:this.rawUrlTree,currentUrlTree:this.currentUrlTree,routerState:this.routerState}}restoredState(){return this.location.getState()}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:()=>g$2(Ao)})}return t})();var Ao=(()=>{class t extends Nt$1{currentPageId=0;lastSuccessfulId=-1;get browserPageId(){return this.canceledNavigationResolution!==`computed`?this.currentPageId:this.restoredState()?.ɵrouterPageId??this.currentPageId}registerNonRouterCurrentEntryChangeListener(e){return this.location.subscribe(r=>{r.type===`popstate`&&setTimeout(()=>{e(r.url,r.state,`popstate`,{replaceUrl:!0},r.hasUAVisualTransition)})})}handleRouterEvent(e,r){e instanceof J$3?this.updateStateMemento():e instanceof H$2?this.commitTransition(r):e instanceof je?this.urlUpdateStrategy===`eager`&&(r.extras.skipLocationChange||this.setBrowserUrl(this.createBrowserPath(r),r)):e instanceof Re$1?(this.commitTransition(r),this.urlUpdateStrategy===`deferred`&&!r.extras.skipLocationChange&&this.setBrowserUrl(this.createBrowserPath(r),r)):e instanceof j$3&&!An(e)?this.restoreHistory(r):e instanceof se$1?this.restoreHistory(r,!0):e instanceof x$2&&(this.lastSuccessfulId=e.id,this.currentPageId=this.browserPageId)}setBrowserUrl(e,r){let{extras:i,id:o}=r,{replaceUrl:s,state:c}=i;if(this.location.isCurrentPathEqualTo(e)||s){let a=this.browserPageId,u=l$1(l$1({},c),this.generateNgRouterState(o,a,r));this.location.replaceState(e,``,u)}else{let a=l$1(l$1({},c),this.generateNgRouterState(o,this.browserPageId+1,r));this.location.go(e,``,a)}}restoreHistory(e,r=!1){if(this.canceledNavigationResolution===`computed`){let i=this.browserPageId,o=this.currentPageId-i;o!==0?this.location.historyGo(o):this.getCurrentUrlTree()===e.finalUrl&&o===0&&(this.resetInternalState(e),this.resetUrlToCurrentUrlTree())}else this.canceledNavigationResolution===`replace`&&(r&&this.resetInternalState(e),this.resetUrlToCurrentUrlTree())}resetInternalState({finalUrl:e}){this.routerState=this.stateMemento.routerState,this.currentUrlTree=this.stateMemento.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,e??this.rawUrlTree)}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.getRawUrlTree()),``,this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}generateNgRouterState(e,r,i){return this.canceledNavigationResolution===`computed`?l$1({navigationId:e,ɵrouterPageId:r},this.routerUrlState(i)):l$1({navigationId:e},this.routerUrlState(i))}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();function wr(t,n){t.events.pipe(jt(e=>e instanceof x$2||e instanceof j$3||e instanceof se$1||e instanceof H$2),ae$3(e=>e instanceof x$2||e instanceof H$2?0:(e instanceof j$3?e.code===b$2.Redirect||e.code===b$2.SupersededByNewNavigation:!1)?2:1),jt(e=>e!==2),Za(1)).subscribe(()=>{n()})}var ue=(()=>{class t{get currentUrlTree(){return this.stateManager.getCurrentUrlTree()}get rawUrlTree(){return this.stateManager.getRawUrlTree()}disposed=!1;nonRouterCurrentEntryChangeSubscription;console=g$2(Ny);stateManager=g$2(Nt$1);options=g$2(Ae$1,{optional:!0})||{};pendingTasks=g$2(Yt$1);urlUpdateStrategy=this.options.urlUpdateStrategy||`deferred`;navigationTransitions=g$2(Cr);urlSerializer=g$2(ce$2);location=g$2(fD);urlHandlingStrategy=g$2(Tt);injector=g$2(fe$1);_events=new we$2;get events(){return this._events}get routerState(){return this.stateManager.getRouterState()}navigated=!1;routeReuseStrategy=g$2(Yn);injectorCleanup=g$2(Kn,{optional:!0});onSameUrlNavigation=this.options.onSameUrlNavigation||`ignore`;config=g$2(Ve,{optional:!0})?.flat()??[];componentInputBindingEnabled=!!g$2(He,{optional:!0});currentNavigation=this.navigationTransitions.currentNavigation.asReadonly();constructor(){this.resetConfig(this.config),this.navigationTransitions.setupNavigations(this).subscribe({error:e=>{}}),this.subscribeToNavigationEvents()}eventsSubscription=new se$2;subscribeToNavigationEvents(){let e=this.navigationTransitions.events.subscribe(r=>{try{let i=this.navigationTransitions.currentTransition,o=ie$3(this.navigationTransitions.currentNavigation);if(i!==null&&o!==null){if(this.stateManager.handleRouterEvent(r,o),r instanceof j$3&&r.code!==b$2.Redirect&&r.code!==b$2.SupersededByNewNavigation)this.navigated=!0;else if(r instanceof x$2)this.navigated=!0,this.injectorCleanup?.(this.routeReuseStrategy,this.routerState,this.config);else if(r instanceof Se$1){let s=r.navigationBehaviorOptions,c=this.urlHandlingStrategy.merge(r.url,i.currentRawUrl),a=l$1({scroll:i.extras.scroll,browserUrl:i.extras.browserUrl,info:i.extras.info,skipLocationChange:i.extras.skipLocationChange,replaceUrl:i.extras.replaceUrl||this.urlUpdateStrategy===`eager`||Io(i.source)},s);this.scheduleNavigation(c,pe$2,null,a,i.hasUAVisualTransition,{resolve:i.resolve,reject:i.reject,promise:i.promise})}}Ei(r)&&this._events.next(r)}catch(i){this.navigationTransitions.transitionAbortWithErrorSubject.next(i)}});this.eventsSubscription.add(e)}resetRootComponentType(e){this.routerState.root.component=e,this.navigationTransitions.rootComponentType=e}initialNavigation(){this.setUpLocationChangeListener(),this.navigationTransitions.hasRequestedNavigation||this.navigateToSyncWithBrowser(this.location.path(!0),pe$2,this.stateManager.restoredState(),{replaceUrl:!0})}setUpLocationChangeListener(){this.nonRouterCurrentEntryChangeSubscription??=this.stateManager.registerNonRouterCurrentEntryChangeListener((e,r,i,o,s)=>{this.navigateToSyncWithBrowser(e,i,r,o,s)})}navigateToSyncWithBrowser(e,r,i,o,s){let c=i?.navigationId?i:null,a=i?.ɵrouterUrl??e;if(i?.ɵrouterUrl&&(o=m$4(l$1({},o),{browserUrl:e})),i){let l=l$1({},i);delete l.navigationId,delete l.ɵrouterPageId,delete l.ɵrouterUrl,Object.keys(l).length!==0&&(o.state=l)}let u=this.parseUrl(a);this.scheduleNavigation(u,r,c,o,s).catch(l=>{this.disposed||this.injector.get(Nt$2)(l)})}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return ie$3(this.navigationTransitions.currentNavigation)}get lastSuccessfulNavigation(){return this.navigationTransitions.lastSuccessfulNavigation}resetConfig(e){this.config=e.map(mr),this.navigated=!1}ngOnDestroy(){this.dispose()}dispose(){this._events.unsubscribe(),this.navigationTransitions.complete(),this.nonRouterCurrentEntryChangeSubscription?.unsubscribe(),this.nonRouterCurrentEntryChangeSubscription=void 0,this.disposed=!0,this.eventsSubscription.unsubscribe()}createUrlTree(e,r={}){let{relativeTo:i,queryParams:o,fragment:s,queryParamsHandling:c,preserveFragment:a}=r,u=a?this.currentUrlTree.fragment:s,l=null;switch(c??this.options.defaultQueryParamsHandling){case`merge`:l=l$1(l$1({},this.currentUrlTree.queryParams),o);break;case`preserve`:l=this.currentUrlTree.queryParams;break;default:l=o||null}l!==null&&(l=this.removeEmptyProps(l));let v;try{v=wn(i?i.snapshot:this.routerState.snapshot.root)}catch{(typeof e[0]!=`string`||e[0][0]!==`/`)&&(e=[]),v=this.currentUrlTree.root}return bn(v,e,l,u??null,this.urlSerializer)}navigateByUrl(e,r={skipLocationChange:!1}){let i=Z$3(e)?e:this.parseUrl(e),o=this.urlHandlingStrategy.merge(i,this.rawUrlTree);return this.scheduleNavigation(o,pe$2,null,r)}navigate(e,r={skipLocationChange:!1}){return Mo(e),this.navigateByUrl(this.createUrlTree(e,r),r)}serializeUrl(e){return this.urlSerializer.serialize(e)}parseUrl(e){try{return this.urlSerializer.parse(e)}catch{return this.console.warn(We$1(4018,!1)),this.urlSerializer.parse(`/`)}}isActive(e,r){let i;if(r===!0?i=l$1({},dr):r===!1?i=l$1({},ve):i=l$1(l$1({},ve),r),Z$3(e))return Zt(this.currentUrlTree,e,i);let o=this.parseUrl(e);return Zt(this.currentUrlTree,o,i)}removeEmptyProps(e){return Object.entries(e).reduce((r,[i,o])=>(o!=null&&(r[i]=o),r),{})}scheduleNavigation(e,r,i,o,s,c){if(this.disposed)return Promise.resolve(!1);let a,u,l;c?(a=c.resolve,u=c.reject,l=c.promise):l=new Promise((f,R)=>{a=f,u=R});let v=this.pendingTasks.add();return wr(this,()=>{queueMicrotask(()=>this.pendingTasks.remove(v))}),this.navigationTransitions.handleNavigationRequest({source:r,restoredState:i,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,rawUrl:e,extras:o,hasUAVisualTransition:s,resolve:a,reject:u,promise:l,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),l.catch(Promise.reject.bind(Promise))}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();function Mo(t){for(let n=0;n<t.length;n++)if(t[n]==null)throw new y$2(4008,!1)}var To=(()=>{class t{router=g$2(ue);stateManager=g$2(Nt$1);fragment=Ke(``);queryParams=Ke({});path=Ke(``);serializer=g$2(ce$2);constructor(){this.updateState(),this.router.events?.subscribe(e=>{e instanceof x$2&&this.updateState()})}updateState(){let{fragment:e,root:r,queryParams:i}=this.stateManager.getCurrentUrlTree();this.fragment.set(e),this.queryParams.set(i),this.path.set(this.serializer.serialize(new E$3(r)))}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();var Dt=(()=>{class t{router;route;tabIndexAttribute;renderer;el;locationStrategy;hrefAttributeValue=g$2(new $v(`href`),{optional:!0});reactiveHref=fa(()=>this.isAnchorElement?this.computeHref(this._urlTree()):this.hrefAttributeValue);get href(){return ie$3(this.reactiveHref)}set href(e){this.reactiveHref.set(e)}set target(e){this._target.set(e)}get target(){return ie$3(this._target)}_target=Ke(void 0);set queryParams(e){this._queryParams.set(e)}get queryParams(){return ie$3(this._queryParams)}_queryParams=Ke(void 0,{equal:()=>!1});set fragment(e){this._fragment.set(e)}get fragment(){return ie$3(this._fragment)}_fragment=Ke(void 0);set queryParamsHandling(e){this._queryParamsHandling.set(e)}get queryParamsHandling(){return ie$3(this._queryParamsHandling)}_queryParamsHandling=Ke(void 0);set state(e){this._state.set(e)}get state(){return ie$3(this._state)}_state=Ke(void 0,{equal:()=>!1});set info(e){this._info.set(e)}get info(){return ie$3(this._info)}_info=Ke(void 0,{equal:()=>!1});set relativeTo(e){this._relativeTo.set(e)}get relativeTo(){return ie$3(this._relativeTo)}_relativeTo=Ke(void 0);set preserveFragment(e){this._preserveFragment.set(e)}get preserveFragment(){return ie$3(this._preserveFragment)}_preserveFragment=Ke(!1);set skipLocationChange(e){this._skipLocationChange.set(e)}get skipLocationChange(){return ie$3(this._skipLocationChange)}_skipLocationChange=Ke(!1);set replaceUrl(e){this._replaceUrl.set(e)}get replaceUrl(){return ie$3(this._replaceUrl)}_replaceUrl=Ke(!1);browserUrl=NH(void 0);isAnchorElement;onChanges=new we$2;applicationErrorHandler=g$2(Nt$2);options=g$2(Ae$1,{optional:!0});reactiveRouterState=g$2(To);constructor(e,r,i,o,s,c){this.router=e,this.route=r,this.tabIndexAttribute=i,this.renderer=o,this.el=s,this.locationStrategy=c;let a=s.nativeElement.tagName?.toLowerCase();this.isAnchorElement=a===`a`||a===`area`||!!(typeof customElements==`object`&&customElements.get(a)?.observedAttributes?.includes?.(`href`))}setTabIndexIfNotOnNativeEl(e){this.tabIndexAttribute!=null||this.isAnchorElement||this.applyAttributeValue(`tabindex`,e)}ngOnChanges(e){this.onChanges.next(this)}routerLinkInput=Ke(null);set routerLink(e){e==null?(this.routerLinkInput.set(null),this.setTabIndexIfNotOnNativeEl(null)):(Z$3(e)?this.routerLinkInput.set(e):this.routerLinkInput.set(Array.isArray(e)?e:[e]),this.setTabIndexIfNotOnNativeEl(`0`))}onClick(e,r,i,o,s){let c=this._urlTree();if(c===null||this.isAnchorElement&&(e!==0||r||i||o||s||typeof this.target==`string`&&this.target!=`_self`))return!0;let a=this.browserUrl(),u=l$1({skipLocationChange:this.skipLocationChange,replaceUrl:this.replaceUrl,state:this.state,info:this.info},a!==void 0&&{browserUrl:a});return this.router.navigateByUrl(c,u)?.catch(l=>{this.applicationErrorHandler(l)}),!this.isAnchorElement}ngOnDestroy(){}applyAttributeValue(e,r){let i=this.renderer,o=this.el.nativeElement;r!==null?i.setAttribute(o,e,r):i.removeAttribute(o,e)}_urlTree=Ft(()=>{this.reactiveRouterState.path(),this._preserveFragment()&&this.reactiveRouterState.fragment();let e=i=>i===`preserve`||i===`merge`;(e(this._queryParamsHandling())||e(this.options?.defaultQueryParamsHandling))&&this.reactiveRouterState.queryParams();let r=this.routerLinkInput();return r===null||!this.router.createUrlTree?null:Z$3(r)?r:this.router.createUrlTree(r,{relativeTo:this._relativeTo()!==void 0?this._relativeTo():this.route,queryParams:this._queryParams(),fragment:this._fragment(),queryParamsHandling:this._queryParamsHandling(),preserveFragment:this._preserveFragment()})},{equal:(e,r)=>this.computeHref(e)===this.computeHref(r)});get urlTree(){return ie$3(this._urlTree)}computeHref(e){return e!==null&&this.locationStrategy?this.locationStrategy?.prepareExternalUrl(this.router.serializeUrl(e))??``:null}static ɵfac=function(r){return new(r||t)(Gn$1(ue),Gn$1(G$2),il(`tabindex`),Gn$1(Ao$1),Gn$1(Hn$1),Gn$1(Ia))};static ɵdir=ad({type:t,selectors:[[``,`routerLink`,``]],hostVars:2,hostBindings:function(r,i){r&1&&Gy(`click`,function(s){return i.onClick(s.button,s.ctrlKey,s.shiftKey,s.altKey,s.metaKey)}),r&2&&ky(`href`,i.reactiveHref(),Ww)(`target`,i._target())},inputs:{target:`target`,queryParams:`queryParams`,fragment:`fragment`,queryParamsHandling:`queryParamsHandling`,state:`state`,info:`info`,relativeTo:`relativeTo`,preserveFragment:[2,`preserveFragment`,`preserveFragment`,pN],skipLocationChange:[2,`skipLocationChange`,`skipLocationChange`,pN],replaceUrl:[2,`replaceUrl`,`replaceUrl`,pN],browserUrl:[1,`browserUrl`],routerLink:`routerLink`},features:[rl]})}return t})();var No=(()=>{class t{router;element;renderer;cdr;links;classes=[];routerEventsSubscription;linkInputChangesSubscription;_isActive=!1;get isActive(){return this._isActive}routerLinkActiveOptions={exact:!1};ariaCurrentWhenActive;isActiveChange=new It$1;link=g$2(Dt,{optional:!0});constructor(e,r,i,o){this.router=e,this.element=r,this.renderer=i,this.cdr=o,this.routerEventsSubscription=e.events.subscribe(s=>{s instanceof x$2&&this.update()})}ngAfterContentInit(){$r(this.links.changes,$r(null)).pipe(Gr()).subscribe(e=>{this.update(),this.subscribeToEachLinkOnChanges()})}subscribeToEachLinkOnChanges(){this.linkInputChangesSubscription?.unsubscribe();let e=[...this.links.toArray(),this.link].filter(r=>!!r).map(r=>r.onChanges);this.linkInputChangesSubscription=nt$1(e).pipe(Gr()).subscribe(r=>{this._isActive!==this.isLinkActive(this.router)(r)&&this.update()})}set routerLinkActive(e){if(e==null){this.classes=[];return}let r=Array.isArray(e)?e:e.split(` `);this.classes=r.filter(i=>!!i)}ngOnChanges(e){this.update()}ngOnDestroy(){this.routerEventsSubscription.unsubscribe(),this.linkInputChangesSubscription?.unsubscribe()}update(){!this.links||!this.router.navigated||this.routerLinkActiveOptions===null&&!this._isActive||queueMicrotask(()=>{let e=this.hasActiveLinks();this.classes.forEach(r=>{e?this.renderer.addClass(this.element.nativeElement,r):this.renderer.removeClass(this.element.nativeElement,r)}),e&&this.ariaCurrentWhenActive!==void 0?this.renderer.setAttribute(this.element.nativeElement,`aria-current`,this.ariaCurrentWhenActive.toString()):this.renderer.removeAttribute(this.element.nativeElement,`aria-current`),this._isActive!==e&&(this._isActive=e,this.cdr.markForCheck(),this.isActiveChange.emit(e))})}isLinkActive(e){let r=this.routerLinkActiveOptions;if(r===null)return()=>!1;let i;return r===void 0?i=l$1({},ve):Do(r)?i=r:r.exact??!1?i=l$1({},dr):i=l$1({},ve),o=>{let s=o.urlTree;return s?ie$3(hr(s,e,i)):!1}}hasActiveLinks(){let e=this.isLinkActive(this.router);return this.link&&e(this.link)||this.links.some(e)}static ɵfac=function(r){return new(r||t)(Gn$1(ue),Gn$1(Hn$1),Gn$1(Ao$1),Gn$1(oD))};static ɵdir=ad({type:t,selectors:[[``,`routerLinkActive`,``]],contentQueries:function(r,i,o){if(r&1&&qy(o,Dt,5),r&2){let s;XS(s=JS())&&(i.links=s)}},inputs:{routerLinkActiveOptions:`routerLinkActiveOptions`,ariaCurrentWhenActive:`ariaCurrentWhenActive`,routerLinkActive:`routerLinkActive`},outputs:{isActiveChange:`isActiveChange`},exportAs:[`routerLinkActive`],features:[rl]})}return t})();function Do(t){let n=t;return!!(n.paths||n.matrixParams||n.queryParams||n.fragment)}var Zn=new E$4(``);var _o=(()=>{class t{options;routerEventsSubscription;scrollEventsSubscription;lastId=0;lastSource=pe$2;restoredId=0;store={};isHydrating=g$2(Fo,{optional:!0})??!1;urlSerializer=g$2(ce$2);zone=g$2(ue$1);viewportScroller=g$2(RU);transitions=g$2(Cr);constructor(e){this.options=e,this.options.scrollPositionRestoration||=`disabled`,this.options.anchorScrolling||=`disabled`,this.isHydrating&&g$2(Ve$1).whenStable().then(()=>{this.isHydrating=!1})}init(){this.options.scrollPositionRestoration!==`disabled`&&this.viewportScroller.setHistoryScrollRestoration(`manual`),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.transitions.events.subscribe(e=>{e instanceof J$3?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=e.navigationTrigger,this.restoredId=e.restoredState?e.restoredState.navigationId:0):e instanceof x$2?(this.lastId=e.id,this.scheduleScrollEvent(e,this.urlSerializer.parse(e.urlAfterRedirects).fragment)):e instanceof H$2&&e.code===me$1.IgnoredSameUrlNavigation&&(this.lastSource=void 0,this.restoredId=0,this.scheduleScrollEvent(e,this.urlSerializer.parse(e.url).fragment))})}consumeScrollEvents(){return this.transitions.events.subscribe(e=>{if(!(e instanceof ye$1)||e.scrollBehavior===`manual`)return;let r={behavior:`instant`};e.position?this.options.scrollPositionRestoration===`top`?this.viewportScroller.scrollToPosition([0,0],r):this.options.scrollPositionRestoration===`enabled`&&this.viewportScroller.scrollToPosition(e.position,r):e.anchor&&this.options.anchorScrolling===`enabled`?this.viewportScroller.scrollToAnchor(e.anchor):this.options.scrollPositionRestoration!==`disabled`&&this.viewportScroller.scrollToPosition([0,0])})}scheduleScrollEvent(e,r){if(this.isHydrating)return;let i=ie$3(this.transitions.currentNavigation)?.extras.scroll;this.zone.runOutsideAngular(async()=>{await new Promise(o=>{setTimeout(o),typeof requestAnimationFrame<`u`&&requestAnimationFrame(o)}),this.zone.run(()=>{this.transitions.events.next(new ye$1(e,this.lastSource===`popstate`?this.store[this.restoredId]:null,r,i))})})}ngOnDestroy(){this.routerEventsSubscription?.unsubscribe(),this.scrollEventsSubscription?.unsubscribe()}static ɵfac=function(r){tb()};static ɵprov=A$2({token:t,factory:t.ɵfac})}return t})();function Uo(t,...n){return at$2([{provide:Ve,multi:!0,useValue:t},{provide:G$2,useFactory:Oo},{provide:kt$1,multi:!0,useFactory:Lo},n.map(e=>e.ɵproviders)])}function Oo(){return g$2(ue).routerState.root}function br(t,n){return{ɵkind:t,ɵproviders:n}}function Po(t={}){return br(4,[{provide:Zn,useFactory:()=>new _o(t)}])}function Lo(){let t=g$2(ce$3);return n=>{let e=t.get(Ve$1);if(n!==e.components[0])return;let r=t.get(ue),i=t.get(jo);t.get(xo)===1&&r.initialNavigation(),t.get(ko,null,{optional:!0})?.setUpPreloading(),t.get(Zn,null,{optional:!0})?.init(),r.resetRootComponentType(e.componentTypes[0]),i.closed||(i.next(),i.complete(),i.unsubscribe())}}var jo=new E$4(``,{factory:()=>new we$2});var xo=new E$4(``,{factory:()=>1});var ko=new E$4(``);function $o(t){return br(7,[{provide:Sr,useValue:t}])}function zo(t={}){return br(8,[{provide:He,useFactory:()=>new _n(t,g$2(yr,{optional:!0}))}])}var Ne=(t,i,n)=>{if(!Number.isSafeInteger(t))throw new RangeError(`money.invalid_minor_units`);let a=new Intl.NumberFormat(i,{style:`currency`,currency:n}),s=a.resolvedOptions().maximumFractionDigits;if(s===void 0)throw new RangeError(`money.currency_precision_missing`);let de=BigInt(Math.abs(t)),ue=10n**BigInt(s),pe=`${t<0?`-`:``}${de/ue}`,Pe=s===0?pe:`${pe}.${String(de%ue).padStart(s,`0`)}`;return a.format(Pe)};var y$1={fr:{"notice.dismiss":`Fermer le message`,"shell.contact":`Contact`,"shell.contactEmail":`contact@froment.software`,"shell.nowLive":`NOW LIVE!`,"shell.underConstruction":`UNDER CONSTRUCTION`,"shell.environment.development":`DEVELOPMENT`,"shell.environment.developmentName":`Environnement de développement`,"shell.environment.staging":`STAGING`,"shell.environment.stagingName":`Environnement de préproduction`,"shell.construction.kicker":`EN CONSTRUCTION`,"shell.construction.title":`Ouverture prochaine`,"shell.construction.description":`Froment Software prend forme. Le site complet sera bientôt disponible.`,"about.faq.label":`FAQ`,"backOffice.billing.summary":`Résumé`,"businessCard.defaultName":`Sacha Froment`,"businessCard.defaultRole":`Ingénieur logiciel`,"businessCard.title":`Carte de visite`,"businessCard.print":`Imprimer ou exporter en PDF`,"businessCard.preview":`Aperçu recto-verso de la carte de visite`,"businessCard.front":`Recto`,"businessCard.backSide":`Verso`,"businessCard.edit":`Personnaliser la carte`,"businessCard.editIntro":`Les modifications apparaissent directement dans l’aperçu.`,"businessCard.name":`Nom`,"businessCard.role":`Poste`,"businessCard.email":`Adresse e-mail`,"businessCard.website":`Site web`,"businessCard.brand":`Nom de marque au verso`,"businessCard.versionName":`Nom de la version`,"businessCard.save":`Enregistrer cette version`,"businessCard.contentInvalid":`Renseignez tous les champs avec une adresse e-mail valide.`,"businessCard.versionInvalid":`Renseignez le nom de la version.`,"businessCard.versions":`Versions locales`,"businessCard.versionsIntro":`Ces versions restent uniquement dans ce navigateur.`,"businessCard.delete":`Supprimer`,"businessCard.deleteLabel":`Supprimer {name}`,"businessCard.empty":`Aucune version enregistrée.`,"businessCard.nameRequired":`Le nom est requis.`,"businessCard.roleRequired":`Le poste est requis.`,"businessCard.emailRequired":`L’adresse e-mail est requise.`,"businessCard.emailInvalid":`L’adresse e-mail est invalide.`,"businessCard.websiteRequired":`Le site web est requis.`,"businessCard.brandRequired":`Le nom de marque est requis.`,"businessCard.versionRequired":`Le nom de la version est requis.`,"businessCard.saved":`Version « {name} » enregistrée dans ce navigateur.`,"businessCard.restored":`Version « {name} » restaurée.`,"businessCard.deleted":`Version « {name} » supprimée.`,"businessCard.storageError":`L’enregistrement local a échoué.`,"design.demo.variant":`Variante`,"design.demo.normal":`Normale`,"design.demo.hover":`Survol`,"design.demo.active":`Active`,"design.demo.readonly":`Lecture seule`,"design.demo.readonlyValue":`Readonly`,"design.demo.disabled":`Désactivée`,"design.demo.loading":`Chargement`,"design.demo.action":`Action`,"design.demo.iconButtons":`Boutons icône seule`,"design.demo.button":`Bouton`,"design.demo.link":`Lien`,"design.demo.icons":`Icônes`,"design.demo.render":`Rendu`,"design.demo.readonlyHint":`Cette valeur est immuable.`,"design.demo.invalid":`Invalide`,"design.demo.invalidEmail":`Saisissez une adresse électronique valide.`,"design.demo.disabledSelect":`Sélection désactivée`,"design.demo.unavailable":`Indisponible`,"design.demo.businessStatuses":`Statuts métier`,"design.demo.loadError":`Le chargement a échoué.`,"design.demo.retry":`Réessayer`,"design.demo.documentUnavailable":`Document indisponible`,"design.demo.copied":`Copié`,"design.demo.desktop":`Desktop`,"design.demo.lists":`Listes et définitions`,"design.demo.audit":`Audit logiciel`,"design.demo.tabs":`Exemple d’onglets`,"design.demo.panel":`Panneau`,"design.demo.documents":`DOCUMENTS`,"design.demo.revisions":`Révisions`,"design.demo.newRevision":`Nouvelle révision`,"design.demo.backQuotes":`← Retour aux devis`,"design.demo.editQuote":`Modifier le devis`,"design.demo.quotes":`Devis`,"design.demo.newQuote":`Nouveau devis`,"design.demo.backOfficeAccess":`Accès au back-office`,"design.demo.client":`Client Exemple`,"design.demo.save":`Enregistrer`,"design.demo.cancel":`Annuler`,"design.demo.delete":`Supprimer`,"design.demo.tabProposal":`Proposition détaillée`,"design.demo.tabDocument":`Document PDF téléchargeable`,"design.demo.tabAcceptance":`Acceptation et signature`,"design.demo.secureQuote":`DEVIS SÉCURISÉ`,"design.demo.auditTitle":`Audit et plan de rénovation`,"design.demo.parties":`Froment Software → Client Exemple`,"design.demo.reference":`Référence`,"design.demo.expiration":`Expiration`,"design.demo.orderConfirmed":`Commande confirmée`,"design.demo.orderConfirmedEyebrow":`COMMANDE CONFIRMÉE`,"design.demo.order":`Commande`,"design.demo.state":`État`,"design.demo.confirmed":`Confirmée`,"design.demo.line":`Ligne 1`,"design.demo.unitPrice":`Prix unitaire`,"design.demo.acceptance":`ACCEPTATION`,"design.demo.signQuote":`Signer le devis`,"design.demo.signIntro":`Confirmez votre identité et votre accord.`,"design.demo.fullName":`Nom complet`,"design.demo.exampleName":`Camille Exemple`,"design.demo.consent":`J’accepte ce devis.`,"design.demo.sign":`Signer et commander`,"design.demo.accepted":`Le devis est accepté`,"design.demo.acceptedDetail":`La signature et la commande sont enregistrées.`,"design.demo.version2":`Version 2`,"design.demo.version1":`Version 1`,"design.demo.date2":`21 août 2026`,"design.demo.date1":`20 août 2026`,"design.demo.documentLoading":`Chargement du document PDF…`,"design.demo.secureLink":`Lien sécurisé`,"design.demo.accessId":`Identifiant d’accès`,"blog.launch.title":`Froment Software arrive sur le marché`,"blog.launch.description":`Présentation de Froment Software, de ses missions et de sa méthode fondée sur des changements mesurables.`,"blog.launch.topic.development":`développement logiciel`,"blog.launch.topic.takeover":`reprise d’applications`,"blog.launch.topic.ci":`CI/CD`,"blog.launch.topic.nixos":`NixOS`,"blog.launch.topic.infrastructure":`infrastructure as code`,"blog.architecture.title":`De l’API au PDF : l’architecture de Froment Software`,"blog.architecture.description":`Une visite du monorepo, des contrats Effect, du modèle SQLite et de la chaîne documentaire vérifiable.`,"blog.security.title":`Sessions, jetons et audit : la sécurité de Froment Software`,"blog.security.description":`Le parcours complet d’une identité, de la connexion PASETO à la corrélation des événements d’audit.`,"blog.operations.title":`De Nix à Grafana : exploiter Froment Software en production`,"blog.operations.description":`La construction reproductible, la résolution des secrets et le trajet des journaux et traces en production.`,"blog.deployment.title":`Du commit à Nomad : une promotion vérifiable vers la production`,"blog.deployment.description":`Une chaîne de déploiement fondée sur Nix, les digests OCI, Tailscale, Nomad et des preuves de provenance.`,"blog.topic.effect":`Effect`,"blog.topic.sqlite":`SQLite`,"blog.topic.documents":`documents`,"blog.topic.security":`sécurité`,"blog.topic.authentication":`authentification`,"blog.topic.audit":`audit`,"blog.topic.nix":`Nix`,"blog.topic.secrets":`secrets`,"blog.topic.observability":`observabilité`,"blog.topic.nomad":`Nomad`,"blog.topic.supplyChain":`chaîne logicielle`,"blog.feed":`Flux Atom`,"metadata.author":`Sacha Froment`,"metadata.publisher":`Froment Software`},en:{"notice.dismiss":`Dismiss message`,"shell.contact":`Contact`,"shell.contactEmail":`contact@froment.software`,"shell.nowLive":`NOW LIVE!`,"shell.underConstruction":`UNDER CONSTRUCTION`,"shell.environment.development":`DEVELOPMENT`,"shell.environment.developmentName":`Development environment`,"shell.environment.staging":`STAGING`,"shell.environment.stagingName":`Staging environment`,"shell.construction.kicker":`UNDER CONSTRUCTION`,"shell.construction.title":`Opening soon`,"shell.construction.description":`Froment Software is taking shape. The complete site will be available soon.`,"about.faq.label":`FAQ`,"backOffice.billing.summary":`Summary`,"businessCard.defaultName":`Sacha Froment`,"businessCard.defaultRole":`Software engineer`,"businessCard.title":`Business card`,"businessCard.print":`Print or export as PDF`,"businessCard.preview":`Business card front and back preview`,"businessCard.front":`Front`,"businessCard.backSide":`Back`,"businessCard.edit":`Customize the card`,"businessCard.editIntro":`Changes appear directly in the preview.`,"businessCard.name":`Name`,"businessCard.role":`Role`,"businessCard.email":`Email address`,"businessCard.website":`Website`,"businessCard.brand":`Brand name on the back`,"businessCard.versionName":`Version name`,"businessCard.save":`Save this version`,"businessCard.contentInvalid":`Complete all fields with a valid email address.`,"businessCard.versionInvalid":`Enter the version name.`,"businessCard.versions":`Local versions`,"businessCard.versionsIntro":`These versions remain only in this browser.`,"businessCard.delete":`Delete`,"businessCard.deleteLabel":`Delete {name}`,"businessCard.empty":`No saved versions.`,"businessCard.nameRequired":`Name is required.`,"businessCard.roleRequired":`Role is required.`,"businessCard.emailRequired":`Email is required.`,"businessCard.emailInvalid":`Email is invalid.`,"businessCard.websiteRequired":`Website is required.`,"businessCard.brandRequired":`Brand name is required.`,"businessCard.versionRequired":`Version name is required.`,"businessCard.saved":`Version “{name}” saved in this browser.`,"businessCard.restored":`Version “{name}” restored.`,"businessCard.deleted":`Version “{name}” deleted.`,"businessCard.storageError":`Local storage failed.`,"design.demo.variant":`Variant`,"design.demo.normal":`Normal`,"design.demo.hover":`Hover`,"design.demo.active":`Active`,"design.demo.readonly":`Read only`,"design.demo.readonlyValue":`Readonly`,"design.demo.disabled":`Disabled`,"design.demo.loading":`Loading`,"design.demo.action":`Action`,"design.demo.iconButtons":`Icon-only buttons`,"design.demo.button":`Button`,"design.demo.link":`Link`,"design.demo.icons":`Icons`,"design.demo.render":`Rendering`,"design.demo.readonlyHint":`This value is immutable.`,"design.demo.invalid":`Invalid`,"design.demo.invalidEmail":`Enter a valid email address.`,"design.demo.disabledSelect":`Disabled selection`,"design.demo.unavailable":`Unavailable`,"design.demo.businessStatuses":`Business statuses`,"design.demo.loadError":`Loading failed.`,"design.demo.retry":`Retry`,"design.demo.documentUnavailable":`Document unavailable`,"design.demo.copied":`Copied`,"design.demo.desktop":`Desktop`,"design.demo.lists":`Lists and definitions`,"design.demo.audit":`Software audit`,"design.demo.tabs":`Tab example`,"design.demo.panel":`Panel`,"design.demo.documents":`DOCUMENTS`,"design.demo.revisions":`Revisions`,"design.demo.newRevision":`New revision`,"design.demo.backQuotes":`← Back to quotes`,"design.demo.editQuote":`Edit quote`,"design.demo.quotes":`Quotes`,"design.demo.newQuote":`New quote`,"design.demo.backOfficeAccess":`Back-office access`,"design.demo.client":`Example Client`,"design.demo.save":`Save`,"design.demo.cancel":`Cancel`,"design.demo.delete":`Delete`,"design.demo.tabProposal":`Detailed proposal`,"design.demo.tabDocument":`Downloadable PDF document`,"design.demo.tabAcceptance":`Acceptance and signature`,"design.demo.secureQuote":`SECURE QUOTE`,"design.demo.auditTitle":`Audit and renovation plan`,"design.demo.parties":`Froment Software → Example Client`,"design.demo.reference":`Reference`,"design.demo.expiration":`Expiration`,"design.demo.orderConfirmed":`Order confirmed`,"design.demo.orderConfirmedEyebrow":`ORDER CONFIRMED`,"design.demo.order":`Order`,"design.demo.state":`Status`,"design.demo.confirmed":`Confirmed`,"design.demo.line":`Line 1`,"design.demo.unitPrice":`Unit price`,"design.demo.acceptance":`ACCEPTANCE`,"design.demo.signQuote":`Sign the quote`,"design.demo.signIntro":`Confirm your identity and consent.`,"design.demo.fullName":`Full name`,"design.demo.exampleName":`Example Client`,"design.demo.consent":`I accept this quote.`,"design.demo.sign":`Sign and order`,"design.demo.accepted":`The quote is accepted`,"design.demo.acceptedDetail":`The signature and order are recorded.`,"design.demo.version2":`Version 2`,"design.demo.version1":`Version 1`,"design.demo.date2":`August 21, 2026`,"design.demo.date1":`August 20, 2026`,"design.demo.documentLoading":`Loading the PDF document…`,"design.demo.secureLink":`Secure link`,"design.demo.accessId":`Access identifier`,"blog.launch.title":`Froment Software enters the market`,"blog.launch.description":`Introducing Froment Software, its services and its method based on measurable changes.`,"blog.launch.topic.development":`software development`,"blog.launch.topic.takeover":`application takeover`,"blog.launch.topic.ci":`CI/CD`,"blog.launch.topic.nixos":`NixOS`,"blog.launch.topic.infrastructure":`infrastructure as code`,"blog.architecture.title":`From API to PDF: the Froment Software architecture`,"blog.architecture.description":`A tour of the monorepo, Effect contracts, SQLite model, and verifiable document pipeline.`,"blog.security.title":`Sessions, tokens, and audit: Froment Software security`,"blog.security.description":`The complete identity path, from PASETO login to correlated audit events.`,"blog.operations.title":`From Nix to Grafana: operating Froment Software in production`,"blog.operations.description":`Reproducible builds, secret resolution, and the path of production logs and traces.`,"blog.deployment.title":`From commit to Nomad: verifiable promotion to production`,"blog.deployment.description":`A deployment pipeline based on Nix, OCI digests, Tailscale, Nomad, and provenance records.`,"blog.topic.effect":`Effect`,"blog.topic.sqlite":`SQLite`,"blog.topic.documents":`documents`,"blog.topic.security":`security`,"blog.topic.authentication":`authentication`,"blog.topic.audit":`audit`,"blog.topic.nix":`Nix`,"blog.topic.secrets":`secrets`,"blog.topic.observability":`observability`,"blog.topic.nomad":`Nomad`,"blog.topic.supplyChain":`software supply chain`,"blog.feed":`Atom feed`,"metadata.author":`Sacha Froment`,"metadata.publisher":`Froment Software`}};var C$1={fr:{"connections.title":`Connexions aux services`,"connections.intro":`Raccordez les prestataires, vérifiez leurs accès et suivez les opérations sans modifier vos documents existants.`,"connections.safety":`Les opérations commerciales et les relances restent simulées. Seul le test Resend ci-dessous peut envoyer un vrai courriel.`,"connections.credentialsHint":`Une clé présente ne confirme pas sa validité. Les clés restent sur le serveur, dans le profil SOPS utilisé au démarrage.`,"connections.provider":`Prestataire`,"connections.usage":`Utilisation`,"connections.credentials":`Identifiants`,"connections.mode":`Mode actuel`,"connections.action":`Parcours`,"connections.present":`Présents sur le serveur`,"connections.missing":`À renseigner dans SOPS`,"connections.restricted":`Test à destinataire limité`,"connections.notConnected":`Pas encore raccordé`,"connections.resend":`Resend`,"connections.stripe":`Stripe`,"connections.signwell":`SignWell`,"connections.superpdp":`SUPER PDP`,"connections.email":`Courriels transactionnels`,"connections.payment":`Paiements par carte — mode test`,"connections.signature":`Signatures électroniques — mode test`,"connections.electronicInvoice":`Factures électroniques — bac à sable`,"connections.openResend":`Vérifier Resend`,"connections.pending":`Connecteur en préparation`,"connections.reload":`Actualiser les accès`,"connections.loading":`Chargement des connexions…`,"connections.error":`Impossible de charger la configuration des connexions. Réessayez le chargement.`,"connections.simulations":`Ouvrir les simulations et leur historique`,"connections.back":`Retour aux connexions`,"connections.breadcrumb":`Navigation des services`,"connections.bank":`La banque reste indépendante : les imports CSV et les rapprochements restent disponibles.`,"emailTest.title":`Resend — vérifier l’envoi`,"emailTest.intro":`Préparez un message de test, vérifiez son aperçu, puis suivez sa prise en charge et sa remise.`,"emailTest.safety":`Ce test envoie un vrai courriel, uniquement à sacha@sacha.house. Il n’active ni les envois clients ni les relances.`,"emailTest.routing":`1. Vérifier les adresses`,"emailTest.from":`Expéditeur`,"emailTest.replyTo":`Réponses vers`,"emailTest.recipient":`Destinataire autorisé`,"emailTest.routingHint":`Ces adresses sont imposées par le serveur. Aucun destinataire en copie ni aucune pièce jointe ne sont ajoutés.`,"emailTest.compose":`2. Préparer le message`,"emailTest.subject":`Objet`,"emailTest.subjectHint":`160 caractères maximum. Le serveur ajoute « [Test] » au début de l’objet.`,"emailTest.body":`Message`,"emailTest.bodyHint":`Texte brut, 20 000 caractères maximum. Les sauts de ligne sont conservés.`,"emailTest.subjectInvalid":`Saisissez un objet de 1 à 160 caractères, sans saut de ligne.`,"emailTest.bodyInvalid":`Saisissez un message de 1 à 20 000 caractères.`,"emailTest.preview":`Aperçu du courriel`,"emailTest.send":`Envoyer le test`,"emailTest.saving":`Enregistrer le test…`,"emailTest.confirm":`Envoyer ce vrai courriel de test à sacha@sacha.house ? Les autres envois resteront simulés.`,"emailTest.unsaved":`Quitter ce message de test sans enregistrer vos modifications ?`,"emailTest.defaultSubject":`Vérification de la connexion Resend`,"emailTest.defaultBody":`Bonjour Sacha,
1
+ import{n as m$4,t as l$1}from"./chunk-BwCtja5l.js";import{$n as nE,$t as ZC,A as Gy,Ar as uA,B as It$1,Br as xE,Bt as Ve$1,Cn as fE,Cr as s8,D as Fy,Dn as g$2,Dr as t_,E as Ft,En as fe$1,Et as Ra,F as IE,Fr as we$2,G as Ka,Gn as k_,Gt as Ww,H as JD,Hn as kE,Hr as xU,Ht as Vr,In as jH,Ir as wp,It as Us,Jn as lA,Jr as zS,Jt as Xy,K as Ke,Kn as kt$1,Kr as yo$1,Kt as XS,L as IN,Ln as jN,Lr as wy,Mn as i8,Nn as ie$3,Nr as vd,O as Gn$1,Or as tb,Ot as S$4,P as Hn$1,Pn as il,Qn as n8,R as Ia,Rr as x$3,Sn as fD,T as Fo,Tn as fd,Tr as se$2,Tt as RU,U as JS,Un as kH,Ur as y$2,V as Iy,Vn as jt,W as KS,Wn as kS,Wr as y_,Wt as We$1,Yn as ln$1,Yt as Ya,Z as Ly,Zt as Yt$1,_n as cn$1,a as $v,ar as oD,at as Ny,b as E$4,bn as dA,br as rl,cn as aa,cr as pE,d as Ar,dn as at$2,dr as pe$3,dt as Of,en as ZS,et as MS,f as At$1,fr as py,ft as Ol,g as Cr$1,gn as ce$3,gr as qa,h as CE,i as $r,in as Zy,ir as o8,it as Nt$2,j as H$3,jr as ue$1,k as Gr,kn as hd,l as A_,ln as ad,lr as pN,lt as OS,m as By,n as $E,nn as Za,nr as nt$1,nt as NH,o as A$2,on as _H,or as ou,ot as OD,p as Be$1,pr as qS,pt as Op,qn as ky,r as $_,rr as nv,rt as NS,s as AE,sn as _i$1,st as OE,u as Ao$1,un as ae$3,ur as pd,v as DI,vn as cr$1,vr as qy,vt as Py,w as Fb,wn as fa,wr as sd,xn as e_,xr as rn,xt as Qg,yr as r8,yt as Qa,z as Ip}from"./chunk-BAHiFuUo.js";var p$4=`primary`;var Fe=Symbol(`RouteTitle`);var Kt=class{params;constructor(n){this.params=n||{}}has(n){return Object.hasOwn(this.params,n)}get(n){if(this.has(n)){let e=this.params[n];return Array.isArray(e)?e[0]:e}return null}getAll(n){if(this.has(n)){let e=this.params[n];return Array.isArray(e)?e:[e]}return[]}get keys(){return Object.keys(this.params)}};function oe$2(t){return new Kt(t)}function Vt(t,n,e){for(let r=0;r<t.length;r++){let i=t[r],o=n[r];if(i[0]===`:`)e[i.substring(1)]=o;else if(i!==o.path)return!1}return!0}function ln(t,n,e){let r=e.path.split(`/`),i=r.indexOf(`**`);if(i===-1){if(r.length>t.length||e.pathMatch===`full`&&(n.hasChildren()||r.length<t.length))return null;let a={},u=t.slice(0,r.length);return Vt(r,u,a)?{consumed:u,posParams:a}:null}if(i!==r.lastIndexOf(`**`))return null;let o=r.slice(0,i),s=r.slice(i+1);if(o.length+s.length>t.length||e.pathMatch===`full`&&n.hasChildren()&&e.path!==`**`)return null;let c={};return!Vt(o,t.slice(0,o.length),c)||!Vt(s,t.slice(t.length-s.length),c)?null:{consumed:t,posParams:c}}function ut$1(t){return new Promise((n,e)=>{t.pipe(AE()).subscribe({next:r=>n(r),error:r=>e(r)})})}function ei(t,n){if(t.length!==n.length)return!1;for(let e=0;e<t.length;++e)if(!F$3(t[e],n[e]))return!1;return!0}function F$3(t,n){let e=t?Yt(t):void 0,r=n?Yt(n):void 0;if(!e||!r||e.length!=r.length)return!1;let i;for(let o=0;o<e.length;o++)if(i=e[o],!dn(t[i],n[i]))return!1;return!0}function Yt(t){return[...Object.keys(t),...Object.getOwnPropertySymbols(t)]}function dn(t,n){if(Array.isArray(t)&&Array.isArray(n)){if(t.length!==n.length)return!1;let e=[...t].sort(),r=[...n].sort();return e.every((i,o)=>r[o]===i)}else return t===n}function ti(t){return t.length>0?t[t.length-1]:null}function ae$2(t){return pE(t)?t:aa(t)?nt$1(Promise.resolve(t)):$r(t)}function hn(t){return pE(t)?ut$1(t):Promise.resolve(t)}var ri={exact:pn,subset:gn};var fn={exact:ni,subset:ii,ignored:()=>!0};var dr={paths:`exact`,fragment:`ignored`,matrixParams:`ignored`,queryParams:`exact`};var ve={paths:`subset`,fragment:`ignored`,matrixParams:`ignored`,queryParams:`subset`};function hr(t,n,e){let r=t instanceof E$3?t:n.parseUrl(t);return Ft(()=>Zt(n.lastSuccessfulNavigation()?.finalUrl??new E$3,r,l$1(l$1({},ve),e)))}function Zt(t,n,e){return ri[e.paths](t.root,n.root,e.matrixParams)&&fn[e.queryParams](t.queryParams,n.queryParams)&&!(e.fragment===`exact`&&t.fragment!==n.fragment)}function ni(t,n){return F$3(t,n)}function pn(t,n,e){if(!ie$2(t.segments,n.segments)||!st$1(t.segments,n.segments,e)||t.numberOfChildren!==n.numberOfChildren)return!1;for(let r in n.children)if(!t.children[r]||!pn(t.children[r],n.children[r],e))return!1;return!0}function ii(t,n){return Object.keys(n).length<=Object.keys(t).length&&Object.keys(n).every(e=>dn(t[e],n[e]))}function gn(t,n,e){return vn(t,n,n.segments,e)}function vn(t,n,e,r){if(t.segments.length>e.length){let i=t.segments.slice(0,e.length);return!(!ie$2(i,e)||n.hasChildren()||!st$1(i,e,r))}else if(t.segments.length===e.length){if(!ie$2(t.segments,e)||!st$1(t.segments,e,r))return!1;for(let i in n.children)if(!t.children[i]||!gn(t.children[i],n.children[i],r))return!1;return!0}else{let i=e.slice(0,t.segments.length),o=e.slice(t.segments.length);return!ie$2(t.segments,i)||!st$1(t.segments,i,r)||!t.children[`primary`]?!1:vn(t.children[p$4],n,o,r)}}function st$1(t,n,e){return n.every((r,i)=>fn[e](t[i].parameters,r.parameters))}var E$3=class{root;queryParams;fragment;_queryParamMap;constructor(n=new m$3([],{}),e={},r=null){this.root=n,this.queryParams=e,this.fragment=r}get queryParamMap(){return this._queryParamMap??=oe$2(this.queryParams),this._queryParamMap}toString(){return ai.serialize(this)}};var m$3=class{segments;children;parent=null;constructor(n,e){this.segments=n,this.children=e,Object.values(e).forEach(r=>r.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return at$1(this)}};var K$3=class{path;parameters;_parameterMap;constructor(n,e){this.path=n,this.parameters=e}get parameterMap(){return this._parameterMap??=oe$2(this.parameters),this._parameterMap}toString(){return yn(this)}};function oi(t,n){return ie$2(t,n)&&t.every((e,r)=>F$3(e.parameters,n[r].parameters))}function ie$2(t,n){return t.length!==n.length?!1:t.every((e,r)=>e.path===n[r].path)}function si(t,n){let e=[];return Object.entries(t.children).forEach(([r,i])=>{r===`primary`&&(e=e.concat(n(i,r)))}),Object.entries(t.children).forEach(([r,i])=>{r!==`primary`&&(e=e.concat(n(i,r)))}),e}var ce$2=(()=>{class t{static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:()=>new Y$3})}return t})();var Y$3=class{parse(n){let e=new Xt(n);return new E$3(e.parseRootSegment(),e.parseQueryParams(),e.parseFragment())}serialize(n){return`${`/${_e$1(n.root,!0)}`}${li(n.queryParams)}${typeof n.fragment==`string`?`#${ci(n.fragment)}`:``}`}};var ai=new Y$3;function at$1(t){return t.segments.map(n=>yn(n)).join(`/`)}function _e$1(t,n){if(!t.hasChildren())return at$1(t);if(n){let e=t.children[`primary`]?_e$1(t.children[p$4],!1):``,r=[];return Object.entries(t.children).forEach(([i,o])=>{i!==`primary`&&r.push(`${i}:${_e$1(o,!1)}`)}),r.length>0?`${e}(${r.join(`//`)})`:e}else{let e=si(t,(r,i)=>i===`primary`?[_e$1(t.children[p$4],!1)]:[`${i}:${_e$1(r,!1)}`]);return Object.keys(t.children).length===1&&t.children[`primary`]!=null?`${at$1(t)}/${e[0]}`:`${at$1(t)}/(${e.join(`//`)})`}}function mn(t){return encodeURIComponent(t).replace(/%40/g,`@`).replace(/%3A/gi,`:`).replace(/%24/g,`$`).replace(/%2C/gi,`,`)}function it$1(t){return mn(t).replace(/%3B/gi,`;`)}function ci(t){return encodeURI(t)}function Jt(t){return mn(t).replace(/\(/g,`%28`).replace(/\)/g,`%29`).replace(/%26/gi,`&`)}function ct$1(t){return decodeURIComponent(t)}function nn(t){return ct$1(t.replace(/\+/g,`%20`))}function yn(t){return`${Jt(t.path)}${ui(t.parameters)}`}function ui(t){return Object.entries(t).map(([n,e])=>`;${Jt(n)}=${Jt(e)}`).join(``)}function li(t){let n=Object.entries(t).map(([e,r])=>Array.isArray(r)?r.map(i=>`${it$1(e)}=${it$1(i)}`).join(`&`):`${it$1(e)}=${it$1(r)}`).filter(e=>e);return n.length?`?${n.join(`&`)}`:``}var di=/^[^\/()?;#]+/;function Gt(t){let n=t.match(di);return n?n[0]:``}var hi=/^[^\/()?;=#]+/;function fi(t){let n=t.match(hi);return n?n[0]:``}var pi=/^[^=?&#]+/;function gi(t){let n=t.match(pi);return n?n[0]:``}var vi=/^[^&#]+/;function mi(t){let n=t.match(vi);return n?n[0]:``}var Xt=class{url;remaining;constructor(n){this.url=n,this.remaining=n}parseRootSegment(){for(;this.consumeOptional(`/`););return this.remaining===``||this.peekStartsWith(`?`)||this.peekStartsWith(`#`)?new m$3([],{}):new m$3([],this.parseChildren())}parseQueryParams(){let n={};if(this.consumeOptional(`?`))do this.parseQueryParam(n);while(this.consumeOptional(`&`));return n}parseFragment(){return this.consumeOptional(`#`)?decodeURIComponent(this.remaining):null}parseChildren(n=0){if(n>50)throw new y$2(4010,!1);if(this.remaining===``)return{};this.consumeOptional(`/`);let e=[];for(this.peekStartsWith(`(`)||e.push(this.parseSegment());this.peekStartsWith(`/`)&&!this.peekStartsWith(`//`)&&!this.peekStartsWith(`/(`);)this.capture(`/`),e.push(this.parseSegment());let r={};this.peekStartsWith(`/(`)&&(this.capture(`/`),r=this.parseParens(!0,n));let i={};return this.peekStartsWith(`(`)&&(i=this.parseParens(!1,n)),(e.length>0||Object.keys(r).length>0)&&(i[`primary`]=new m$3(e,r)),i}parseSegment(){let n=Gt(this.remaining);if(n===``&&this.peekStartsWith(`;`))throw new y$2(4009,!1);return this.capture(n),new K$3(ct$1(n),this.parseMatrixParams())}parseMatrixParams(){let n={};for(;this.consumeOptional(`;`);)this.parseParam(n);return n}parseParam(n){let e=fi(this.remaining);if(!e)return;this.capture(e);let r=``;if(this.consumeOptional(`=`)){let i=Gt(this.remaining);i&&(r=i,this.capture(r))}n[ct$1(e)]=ct$1(r)}parseQueryParam(n){let e=gi(this.remaining);if(!e)return;this.capture(e);let r=``;if(this.consumeOptional(`=`)){let s=mi(this.remaining);s&&(r=s,this.capture(r))}let i=nn(e),o=nn(r);if(Object.hasOwn(n,i)){let s=n[i];Array.isArray(s)||(s=[s],n[i]=s),s.push(o)}else n[i]=o}parseParens(n,e){let r=Object.create(null);for(this.capture(`(`);!this.consumeOptional(`)`)&&this.remaining.length>0;){let i=Gt(this.remaining),o=this.remaining[i.length];if(o!==`/`&&o!==`)`&&o!==`;`)throw new y$2(4010,!1);let s;i.indexOf(`:`)>-1?(s=i.slice(0,i.indexOf(`:`)),this.capture(s),this.capture(`:`)):n&&(s=`primary`);let c=this.parseChildren(e+1);r[s??`primary`]=Object.keys(c).length===1&&c[`primary`]?c[p$4]:new m$3([],c),this.consumeOptional(`//`)}return r}peekStartsWith(n){return this.remaining.startsWith(n)}consumeOptional(n){return this.peekStartsWith(n)?(this.remaining=this.remaining.substring(n.length),!0):!1}capture(n){if(!this.consumeOptional(n))throw new y$2(4011,!1)}};function Rn(t){return t.segments.length>0?new m$3([],{[p$4]:t}):t}function Sn(t){let n=Object.create(null);for(let[r,i]of Object.entries(t.children)){let o=Sn(i);if(r===`primary`&&o.segments.length===0&&o.hasChildren())for(let[s,c]of Object.entries(o.children))n[s]=c;else(o.segments.length>0||o.hasChildren())&&(n[r]=o)}return yi(new m$3(t.segments,n))}function yi(t){if(t.numberOfChildren===1&&t.children[`primary`]){let n=t.children[p$4];return new m$3(t.segments.concat(n.segments),n.children)}return t}function Z$3(t){return t instanceof E$3}function Cn(t,n,e=null,r=null,i=new Y$3){return bn(wn(t),n,e,r,i)}function wn(t){let n;function e(o){let s={};for(let a of o.children){let u=e(a);s[a.outlet]=u}let c=new m$3(o.url,s);return o===t&&(n=c),c}let i=Rn(e(t.root));return n??i}function bn(t,n,e,r,i){let o=t;for(;o.parent;)o=o.parent;if(n.length===0)return Wt(o,o,o,e,r,i);let s=Ri(n);if(s.toRoot())return Wt(o,o,new m$3([],{}),e,r,i);let c=Si(s,o,t),a=c.processChildren?Oe$1(c.segmentGroup,c.index,s.commands):En(c.segmentGroup,c.index,s.commands);return Wt(o,c.segmentGroup,a,e,r,i)}function lt$1(t){return typeof t==`object`&&t!=null&&!t.outlets&&!t.segmentPath}function Le$1(t){return typeof t==`object`&&t!=null&&t.outlets}function on(t,n,e){t||=`ɵ`;let r=new E$3;return r.queryParams={[t]:n},e.parse(e.serialize(r)).queryParams[t]}function Wt(t,n,e,r,i,o){let s={};for(let[u,l]of Object.entries(r??{}))s[u]=Array.isArray(l)?l.map(v=>on(u,v,o)):on(u,l,o);let c;t===n?c=e:c=In(t,n,e);return new E$3(Rn(Sn(c)),s,i)}function In(t,n,e){let r=Object.create(null);return Object.entries(t.children).forEach(([i,o])=>{o===n?r[i]=e:r[i]=In(o,n,e)}),new m$3(t.segments,r)}var dt$1=class{isAbsolute;numberOfDoubleDots;commands;constructor(n,e,r){if(this.isAbsolute=n,this.numberOfDoubleDots=e,this.commands=r,n&&r.length>0&&lt$1(r[0]))throw new y$2(4003,!1);let i=r.find(Le$1);if(i&&i!==ti(r))throw new y$2(4004,!1)}toRoot(){return this.isAbsolute&&this.commands.length===1&&this.commands[0]==`/`}};function Ri(t){if(typeof t[0]==`string`&&t.length===1&&t[0]===`/`)return new dt$1(!0,0,t);let n=0,e=!1,r=t.reduce((i,o,s)=>{if(typeof o==`object`&&o!=null){if(o.outlets){let c={};return Object.entries(o.outlets).forEach(([a,u])=>{c[a]=typeof u==`string`?u.split(`/`):u}),[...i,{outlets:c}]}if(o.segmentPath)return[...i,o.segmentPath]}return typeof o!=`string`?[...i,o]:s===0?(o.split(`/`).forEach((c,a)=>{a==0&&c===`.`||(a==0&&c===``?e=!0:c===`..`?n++:c!=``&&i.push(c))}),i):[...i,o]},[]);return new dt$1(e,n,r)}var fe=class{segmentGroup;processChildren;index;constructor(n,e,r){this.segmentGroup=n,this.processChildren=e,this.index=r}};function Si(t,n,e){if(t.isAbsolute)return new fe(n,!0,0);if(!e)return new fe(n,!1,NaN);if(e.parent===null)return new fe(e,!0,0);let r=lt$1(t.commands[0])?0:1;return Ci(e,e.segments.length-1+r,t.numberOfDoubleDots)}function Ci(t,n,e){let r=t,i=n,o=e;for(;o>i;){if(o-=i,r=r.parent,!r)throw new y$2(4005,!1);i=r.segments.length}return new fe(r,!1,i-o)}function wi(t){return Le$1(t[0])?t[0].outlets:{[p$4]:t}}function En(t,n,e){if(t??=new m$3([],{}),t.segments.length===0&&t.hasChildren())return Oe$1(t,n,e);let r=bi(t,n,e),i=e.slice(r.commandIndex);if(r.match&&r.pathIndex<t.segments.length){let o=new m$3(t.segments.slice(0,r.pathIndex),{});return o.children[p$4]=new m$3(t.segments.slice(r.pathIndex),t.children),Oe$1(o,0,i)}else return r.match&&i.length===0?new m$3(t.segments,{}):r.match&&!t.hasChildren()?er(t,n,e):r.match?Oe$1(t,0,i):er(t,n,e)}function Oe$1(t,n,e){if(e.length===0)return new m$3(t.segments,{});{let r=wi(e),i=Object.create(null);if(Object.keys(r).some(o=>o!==`primary`)&&t.children[`primary`]&&t.numberOfChildren===1&&t.children[`primary`].segments.length===0){let o=Oe$1(t.children[p$4],n,e);return new m$3(t.segments,o.children)}return Object.entries(r).forEach(([o,s])=>{typeof s==`string`&&(s=[s]),s!==null&&(i[o]=En(t.children[o],n,s))}),Object.entries(t.children).forEach(([o,s])=>{r[o]===void 0&&(i[o]=s)}),new m$3(t.segments,i)}}function bi(t,n,e){let r=0,i=n,o={match:!1,pathIndex:0,commandIndex:0};for(;i<t.segments.length;){if(r>=e.length)return o;let s=t.segments[i],c=e[r];if(Le$1(c))break;let a=`${c}`,u=r<e.length-1?e[r+1]:null;if(i>0&&a===void 0)break;if(a&&u&&typeof u==`object`&&u.outlets===void 0){if(!an(a,u,s))return o;r+=2}else{if(!an(a,{},s))return o;r++}i++}return{match:!0,pathIndex:i,commandIndex:r}}function er(t,n,e){let r=t.segments.slice(0,n),i=0;for(;i<e.length;){let o=e[i];if(Le$1(o))return new m$3(r,Ii(o.outlets));if(i===0&&lt$1(e[0])){let a=t.segments[n];r.push(new K$3(a.path,sn(e[0]))),i++;continue}let s=Le$1(o)?o.outlets[p$4]:`${o}`,c=i<e.length-1?e[i+1]:null;s&&c&&lt$1(c)?(r.push(new K$3(s,sn(c))),i+=2):(r.push(new K$3(s,{})),i++)}return new m$3(r,{})}function Ii(t){let n={};return Object.entries(t).forEach(([e,r])=>{typeof r==`string`&&(r=[r]),r!==null&&(n[e]=er(new m$3([],{}),0,r))}),n}function sn(t){let n={};return Object.entries(t).forEach(([e,r])=>n[e]=`${r}`),n}function an(t,n,e){return t==e.path&&F$3(n,e.parameters)}var pe$2=`imperative`;var S$3=(function(t){return t[t.NavigationStart=0]=`NavigationStart`,t[t.NavigationEnd=1]=`NavigationEnd`,t[t.NavigationCancel=2]=`NavigationCancel`,t[t.NavigationError=3]=`NavigationError`,t[t.RoutesRecognized=4]=`RoutesRecognized`,t[t.ResolveStart=5]=`ResolveStart`,t[t.ResolveEnd=6]=`ResolveEnd`,t[t.GuardsCheckStart=7]=`GuardsCheckStart`,t[t.GuardsCheckEnd=8]=`GuardsCheckEnd`,t[t.RouteConfigLoadStart=9]=`RouteConfigLoadStart`,t[t.RouteConfigLoadEnd=10]=`RouteConfigLoadEnd`,t[t.ChildActivationStart=11]=`ChildActivationStart`,t[t.ChildActivationEnd=12]=`ChildActivationEnd`,t[t.ActivationStart=13]=`ActivationStart`,t[t.ActivationEnd=14]=`ActivationEnd`,t[t.Scroll=15]=`Scroll`,t[t.NavigationSkipped=16]=`NavigationSkipped`,t})(S$3||{});var U$3=class{id;url;constructor(n,e){this.id=n,this.url=e}};var J$3=class extends U$3{type=S$3.NavigationStart;navigationTrigger;restoredState;constructor(n,e,r=`imperative`,i=null){super(n,e),this.navigationTrigger=r,this.restoredState=i}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}};var x$2=class extends U$3{urlAfterRedirects;type=S$3.NavigationEnd;constructor(n,e,r){super(n,e),this.urlAfterRedirects=r}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}};var b$2=(function(t){return t[t.Redirect=0]=`Redirect`,t[t.SupersededByNewNavigation=1]=`SupersededByNewNavigation`,t[t.NoDataFromResolver=2]=`NoDataFromResolver`,t[t.GuardRejected=3]=`GuardRejected`,t[t.Aborted=4]=`Aborted`,t})(b$2||{});var me$1=(function(t){return t[t.IgnoredSameUrlNavigation=0]=`IgnoredSameUrlNavigation`,t[t.IgnoredByUrlHandlingStrategy=1]=`IgnoredByUrlHandlingStrategy`,t})(me$1||{});var j$3=class extends U$3{reason;code;type=S$3.NavigationCancel;constructor(n,e,r,i){super(n,e),this.reason=r,this.code=i}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}};function An(t){return t instanceof j$3&&(t.code===b$2.Redirect||t.code===b$2.SupersededByNewNavigation)}var H$2=class extends U$3{reason;code;type=S$3.NavigationSkipped;constructor(n,e,r,i){super(n,e),this.reason=r,this.code=i}};var se$1=class extends U$3{error;target;type=S$3.NavigationError;constructor(n,e,r,i){super(n,e),this.error=r,this.target=i}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}};var je=class extends U$3{urlAfterRedirects;state;type=S$3.RoutesRecognized;constructor(n,e,r,i){super(n,e),this.urlAfterRedirects=r,this.state=i}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}};var ht$1=class extends U$3{urlAfterRedirects;state;type=S$3.GuardsCheckStart;constructor(n,e,r,i){super(n,e),this.urlAfterRedirects=r,this.state=i}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}};var ft$1=class extends U$3{urlAfterRedirects;state;shouldActivate;type=S$3.GuardsCheckEnd;constructor(n,e,r,i,o){super(n,e),this.urlAfterRedirects=r,this.state=i,this.shouldActivate=o}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}};var pt=class extends U$3{urlAfterRedirects;state;type=S$3.ResolveStart;constructor(n,e,r,i){super(n,e),this.urlAfterRedirects=r,this.state=i}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}};var gt$1=class extends U$3{urlAfterRedirects;state;type=S$3.ResolveEnd;constructor(n,e,r,i){super(n,e),this.urlAfterRedirects=r,this.state=i}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}};var vt$1=class{route;type=S$3.RouteConfigLoadStart;constructor(n){this.route=n}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}};var mt$1=class{route;type=S$3.RouteConfigLoadEnd;constructor(n){this.route=n}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}};var yt$1=class{snapshot;type=S$3.ChildActivationStart;constructor(n){this.snapshot=n}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||``}')`}};var Rt=class{snapshot;type=S$3.ChildActivationEnd;constructor(n){this.snapshot=n}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||``}')`}};var St$1=class{snapshot;type=S$3.ActivationStart;constructor(n){this.snapshot=n}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||``}')`}};var Ct$1=class{snapshot;type=S$3.ActivationEnd;constructor(n){this.snapshot=n}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||``}')`}};var ye$1=class{routerEvent;position;anchor;scrollBehavior;type=S$3.Scroll;constructor(n,e,r,i){this.routerEvent=n,this.position=e,this.anchor=r,this.scrollBehavior=i}toString(){let n=this.position?`${this.position[0]}, ${this.position[1]}`:null;return`Scroll(anchor: '${this.anchor}', position: '${n}')`}};var Re$1=class{};var xe$1=class{};var Se$1=class{url;navigationBehaviorOptions;constructor(n,e){this.url=n,this.navigationBehaviorOptions=e}};function Ei(t){return!(t instanceof Re$1)&&!(t instanceof Se$1)&&!(t instanceof xe$1)}var wt=class{rootInjector;outlet=null;route=null;children;attachRef=null;get injector(){return this.route?.snapshot._environmentInjector??this.rootInjector}constructor(n){this.rootInjector=n,this.children=new Ie$1(this.rootInjector)}};var Ie$1=(()=>{class t{rootInjector;contexts=new Map;constructor(e){this.rootInjector=e}onChildOutletCreated(e,r){let i=this.getOrCreateContext(e);i.outlet=r,this.contexts.set(e,i)}onChildOutletDestroyed(e){let r=this.getContext(e);r&&(r.outlet=null,r.attachRef=null)}onOutletDeactivated(){let e=this.contexts;return this.contexts=new Map,e}onOutletReAttached(e){this.contexts=e}getOrCreateContext(e){let r=this.getContext(e);return r||(r=new wt(this.rootInjector),this.contexts.set(e,r)),r}getContext(e){return this.contexts.get(e)||null}static ɵfac=function(r){return new(r||t)(S$4(fe$1))};static ɵprov=A$2({token:t,factory:t.ɵfac,providedIn:`root`})}return t})();var bt$2=class{_root;constructor(n){this._root=n}get root(){return this._root.value}parent(n){let e=this.pathFromRoot(n);return e.length>1?e[e.length-2]:null}children(n){let e=tr(n,this._root);return e?e.children.map(r=>r.value):[]}firstChild(n){let e=tr(n,this._root);return e&&e.children.length>0?e.children[0].value:null}siblings(n){let e=rr(n,this._root);return e.length<2?[]:e[e.length-2].children.map(i=>i.value).filter(i=>i!==n)}pathFromRoot(n){return rr(n,this._root).map(e=>e.value)}};function tr(t,n){if(t===n.value)return n;for(let e of n.children){let r=tr(t,e);if(r)return r}return null}function rr(t,n){if(t===n.value)return[n];for(let e of n.children){let r=rr(t,e);if(r.length)return r.unshift(n),r}return[]}var _$2=class{value;children;constructor(n,e){this.value=n,this.children=e}toString(){return`TreeNode(${this.value})`}};function he(t){let n={};return t&&t.children.forEach(e=>n[e.value.outlet]=e),n}var ke$1=class extends bt$2{snapshot;constructor(n,e){super(n),this.snapshot=e,pr(this,n)}toString(){return this.snapshot.toString()}};function Mn(t,n){let e=Ai(t,n),r=new Vr([new K$3(``,{})]),i=new Vr({}),o=new Vr({}),a=new G$2(r,i,new Vr({}),new Vr(``),o,p$4,t,e.root);return a.snapshot=e.root,new ke$1(new _$2(a,[]),e)}function Ai(t,n){return new $e(``,new _$2(new Ce$1([],{},{},``,{},p$4,t,null,{},n),[]))}var G$2=class{urlSubject;paramsSubject;queryParamsSubject;fragmentSubject;dataSubject;outlet;component;snapshot;_futureSnapshot;_routerState;_paramMap;_queryParamMap;title;url;params;queryParams;fragment;data;resources;_localInjector;pending;paramsSignal;queryParamsSignal;paramMapSignal;queryParamMapSignal;fragmentSignal;dataSignal;constructor(n,e,r,i,o,s,c,a){this.urlSubject=n,this.paramsSubject=e,this.queryParamsSubject=r,this.fragmentSubject=i,this.dataSubject=o,this.outlet=s,this.component=c,this._futureSnapshot=a,this.title=this.dataSubject?.pipe(ae$3(u=>u[Fe]))??$r(void 0),this.url=n,this.params=e,this.queryParams=r,this.fragment=i,this.data=o}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=this.params.pipe(ae$3(n=>oe$2(n))),this._paramMap}get queryParamMap(){return this._queryParamMap??=this.queryParams.pipe(ae$3(n=>oe$2(n))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}_setPending(n){this._futureSnapshot=n,this.pending?.set(!0)}};var Mi=`always`;function fr(t,n,e){let r,{routeConfig:i}=t;return n!==null&&(e===`always`||i?.path===``||!n.component&&!n.routeConfig?.loadComponent)?r={params:l$1(l$1({},n.params),t.params),data:l$1(l$1({},n.data),t.data),resolve:l$1(l$1(l$1(l$1({},t.data),n.data),i?.data),t._resolvedData)}:r={params:l$1({},t.params),data:l$1({},t.data),resolve:l$1(l$1({},t.data),t._resolvedData??{})},i&&Nn(i)&&(r.resolve[Fe]=i.title),r}var Ce$1=class{url;params;queryParams;fragment;data;outlet;component;routeConfig;_resolve;_resolvedData;_routerState;_paramMap;_queryParamMap;_environmentInjector;resources;get title(){return this.data?.[Fe]}constructor(n,e,r,i,o,s,c,a,u,l){this.url=n,this.params=e,this.queryParams=r,this.fragment=i,this.data=o,this.outlet=s,this.component=c,this.routeConfig=a,this._resolve=u,this._environmentInjector=l}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=oe$2(this.params),this._paramMap}get queryParamMap(){return this._queryParamMap??=oe$2(this.queryParams),this._queryParamMap}toString(){return`Route(url:'${this.url.map(r=>r.toString()).join(`/`)}', path:'${this.routeConfig?this.routeConfig.path:``}')`}};var $e=class extends bt$2{url;constructor(n,e){super(e),this.url=n,pr(this,e)}toString(){return Tn(this._root)}};function pr(t,n){n.value._routerState=t,n.children.forEach(e=>pr(t,e))}function Tn(t){let n=t.children.length>0?` { ${t.children.map(Tn).join(`, `)} } `:``;return`${t.value}${n}`}function Qt(t){if(t.snapshot){let n=t.snapshot,e=t._futureSnapshot;t.snapshot=e,F$3(n.queryParams,e.queryParams)||t.queryParamsSubject.next(e.queryParams),n.fragment!==e.fragment&&t.fragmentSubject.next(e.fragment),F$3(n.params,e.params)||t.paramsSubject.next(e.params),ei(n.url,e.url)||t.urlSubject.next(e.url),F$3(n.data,e.data)||t.dataSubject.next(e.data)}else t.snapshot=t._futureSnapshot,t.dataSubject.next(t._futureSnapshot.data)}function nr(t,n){let e=F$3(t.params,n.params)&&oi(t.url,n.url),r=!t.parent!=!n.parent;return e&&!r&&(!t.parent||nr(t.parent,n.parent))}function Nn(t){return typeof t.title==`string`||t.title===null}var Dn=new E$4(``);var gr=(()=>{class t{activated=null;get activatedComponentRef(){return this.activated}_activatedRoute=null;name=p$4;activateEvents=new It$1;deactivateEvents=new It$1;attachEvents=new It$1;detachEvents=new It$1;routerOutletData=NH();parentContexts=g$2(Ie$1);location=g$2(Ar);changeDetector=g$2(oD);inputBinder=g$2(He,{optional:!0});supportsBindingToComponentInputs=!0;ngOnChanges(e){if(e.name){let{firstChange:r,previousValue:i}=e.name;if(r)return;this.isTrackedInParentContexts(i)&&(this.deactivate(),this.parentContexts.onChildOutletDestroyed(i)),this.initializeOutletWithName()}}ngOnDestroy(){this.isTrackedInParentContexts(this.name)&&this.parentContexts.onChildOutletDestroyed(this.name),this.inputBinder?.unsubscribeFromRouteData(this)}isTrackedInParentContexts(e){return this.parentContexts.getContext(e)?.outlet===this}ngOnInit(){this.initializeOutletWithName()}initializeOutletWithName(){if(this.parentContexts.onChildOutletCreated(this.name,this),this.activated)return;let e=this.parentContexts.getContext(this.name);e?.route&&(e.attachRef?this.attach(e.attachRef,e.route):this.activateWith(e.route,e.injector))}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new y$2(4012,!1);return this.activated.instance}get activatedRoute(){if(!this.activated)throw new y$2(4012,!1);return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new y$2(4012,!1);this.location.detach();let e=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(e.instance),e}attach(e,r){this.activated=e,this._activatedRoute=r,this.location.insert(e.hostView),this.inputBinder?.bindActivatedRouteToOutletComponent(this,this.location.injector),this.attachEvents.emit(e.instance)}deactivate(){if(this.activated){let e=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(e)}}activateWith(e,r){if(this.isActivated)throw new y$2(4013,!1);this._activatedRoute=e;let i=this.location,s=e.snapshot.component,c=this.parentContexts.getOrCreateContext(this.name).children,a=new ir(e,c,i.injector,this.routerOutletData);this.activated=i.createComponent(s,{index:i.length,injector:a,environmentInjector:r}),this.changeDetector.markForCheck(),this.inputBinder?.bindActivatedRouteToOutletComponent(this,this.location.injector),this.activateEvents.emit(this.activated.instance)}static ɵfac=function(r){return new(r||t)};static ɵdir=ad({type:t,selectors:[[`router-outlet`]],inputs:{name:`name`,routerOutletData:[1,`routerOutletData`]},outputs:{activateEvents:`activate`,deactivateEvents:`deactivate`,attachEvents:`attach`,detachEvents:`detach`},exportAs:[`outlet`],features:[rl]})}return t})();var ir=class{route;childContexts;parent;outletData;constructor(n,e,r,i){this.route=n,this.childContexts=e,this.parent=r,this.outletData=i}get(n,e){return n===G$2?this.route:n===Ie$1?this.childContexts:n===Dn?this.outletData:this.parent.get(n,e)}};var He=new E$4(``);var _n=(()=>{class t{options;feature;outletDataSubscriptions=new Map;outletSeenKeys=new Map;outletEffects=new Map;constructor(e,r=null){this.options=e,this.feature=r,this.options.queryParams??=!0}bindActivatedRouteToOutletComponent(e,r){this.unsubscribeFromRouteData(e),this.subscribeToRouteData(e,r)}unsubscribeFromRouteData(e){this.outletDataSubscriptions.get(e)?.unsubscribe(),this.outletDataSubscriptions.delete(e),this.outletSeenKeys.delete(e),this.outletEffects.get(e)?.forEach(r=>r.destroy()),this.outletEffects.delete(e)}subscribeToRouteData(e,r){let{activatedRoute:i}=e,o=[],s=[];if(this.feature?.createResourceOutletBindingEffects&&e.activatedComponentRef){let{handledKeys:a,createdEffects:u}=this.feature.createResourceOutletBindingEffects(e.activatedComponentRef,i,r);o.push(...u),s=a}o.length>0&&this.outletEffects.set(e,o);let c=IE([this.options.queryParams?i.queryParams:$r({}),i.params,i.data]).pipe(Qa(([a,u,l],v)=>(l=l$1(l$1(l$1(l$1({},a),u),l),i.resources||{}),v===0?$r(l):Promise.resolve(l)))).subscribe(a=>{if(!e.isActivated||!e.activatedComponentRef||e.activatedRoute!==i||i.component===null){this.unsubscribeFromRouteData(e);return}let u=jH(i.component);if(!u){this.unsubscribeFromRouteData(e);return}let l=this.outletSeenKeys.get(e);l||(l=new Set,this.outletSeenKeys.set(e,l));for(let f of Object.keys(a))l.add(f);let v=this.options.unmatchedInputBehavior??`alwaysUndefined`;for(let{templateName:f}of u.inputs){if(s.includes(f))continue;let R=a[f];(R!==void 0||v===`alwaysUndefined`||l.has(f))&&e.activatedComponentRef.setInput(f,R)}});this.outletDataSubscriptions.set(e,c)}static ɵfac=function(r){tb()};static ɵprov=A$2({token:t,factory:t.ɵfac})}return t})();var vr=(()=>{class t{static ɵfac=function(r){return new(r||t)};static ɵcmp=Fb({type:t,selectors:[[`ng-component`]],exportAs:[`emptyRouterOutlet`],decls:1,vars:0,template:function(r,i){r&1&&Py(0,`router-outlet`)},dependencies:[gr],encapsulation:2,changeDetection:1})}return t})();function mr(t){let n=t.children&&t.children.map(mr),e=n?m$4(l$1({},t),{children:n}):l$1({},t);return!e.component&&!e.loadComponent&&(n||e.loadChildren)&&e.outlet&&e.outlet!==`primary`&&(e.component=vr),e}function Ti(t,n,e){let r=new Set;return{newlyCreatedRoutes:r,state:new ke$1(ze$1(t,n._root,e?e._root:void 0,r),n)}}function ze$1(t,n,e,r){if(e&&t.shouldReuseRoute(n.value,e.value.snapshot)){let i=e.value;i._setPending(n.value);return new _$2(i,Ni(t,n,e,r))}else{if(t.shouldAttach(n.value)){let s=t.retrieve(n.value);if(s!==null){let c=s.route;return c.value._setPending(n.value),c.children=n.children.map(a=>ze$1(t,a,void 0,r)),c}}let i=Di(n.value);i._setPending(n.value),r.add(i);return new _$2(i,n.children.map(s=>ze$1(t,s,void 0,r)))}}function Ni(t,n,e,r){return n.children.map(i=>{for(let o of e.children)if(t.shouldReuseRoute(i.value,o.value.snapshot))return ze$1(t,i,o,r);return ze$1(t,i,void 0,r)})}function Di(t){return new G$2(new Vr(t.url),new Vr(t.params),new Vr(t.queryParams),new Vr(t.fragment),new Vr(t.data),t.outlet,t.component,t)}var we$1=class{redirectTo;navigationBehaviorOptions;constructor(n,e){this.redirectTo=n,this.navigationBehaviorOptions=e}};var Un=`ngNavigationCancelingError`;function It(t,n){let{redirectTo:e,navigationBehaviorOptions:r}=Z$3(n)?{redirectTo:n,navigationBehaviorOptions:void 0}:n,i=On(!1,b$2.Redirect);return i.url=e,i.navigationBehaviorOptions=r,i}function On(t,n){let e=new Error(`NavigationCancelingError: ${t||``}`);return e[Un]=!0,e.cancellationCode=n,e}function _i(t){return Pn(t)&&Z$3(t.url)}function Pn(t){return!!t&&t[Un]}var or=class{routeReuseStrategy;futureState;currState;forwardEvent;inputBindingEnabled;constructor(n,e,r,i,o){this.routeReuseStrategy=n,this.futureState=e,this.currState=r,this.forwardEvent=i,this.inputBindingEnabled=o}activate(n){let e=this.futureState._root,r=this.currState?this.currState._root:null;this.deactivateChildRoutes(e,r,n),Qt(this.futureState.root),this.activateChildRoutes(e,r,n)}deactivateChildRoutes(n,e,r){let i=he(e);n.children.forEach(o=>{let s=o.value.outlet;this.deactivateRoutes(o,i[s],r),delete i[s]}),Object.values(i).forEach(o=>{this.deactivateRouteAndItsChildren(o,r)})}deactivateRoutes(n,e,r){let i=n.value,o=e?e.value:null;if(i===o)if(i.component){let s=r.getContext(i.outlet);s&&this.deactivateChildRoutes(n,e,s.children)}else this.deactivateChildRoutes(n,e,r);else o&&this.deactivateRouteAndItsChildren(e,r)}deactivateRouteAndItsChildren(n,e){n.value.component&&this.routeReuseStrategy.shouldDetach(n.value.snapshot)?this.detachAndStoreRouteSubtree(n,e):this.deactivateRouteAndOutlet(n,e)}detachAndStoreRouteSubtree(n,e){let r=e.getContext(n.value.outlet),i=r&&n.value.component?r.children:e,o=he(n);for(let s of Object.values(o))this.deactivateRouteAndItsChildren(s,i);if(r&&r.outlet){let s=r.outlet.detach(),c=r.children.onOutletDeactivated();this.routeReuseStrategy.store(n.value.snapshot,{componentRef:s,route:n,contexts:c})}}deactivateRouteAndOutlet(n,e){let r=e.getContext(n.value.outlet),i=r&&n.value.component?r.children:e,o=he(n);for(let s of Object.values(o))this.deactivateRouteAndItsChildren(s,i);r&&(r.outlet&&(r.outlet.deactivate(),r.children.onOutletDeactivated()),r.attachRef=null,r.route=null),n.value._localInjector?.destroy()}activateChildRoutes(n,e,r){let i=he(e);n.children.forEach(o=>{this.activateRoutes(o,i[o.value.outlet],r),this.forwardEvent(new Ct$1(o.value.snapshot))}),n.children.length&&this.forwardEvent(new Rt(n.value.snapshot))}activateRoutes(n,e,r){let i=n.value,o=e?e.value:null;if(Qt(i),i===o)if(i.component){let s=r.getOrCreateContext(i.outlet);this.activateChildRoutes(n,e,s.children)}else this.activateChildRoutes(n,e,r);else if(i.component){let s=r.getOrCreateContext(i.outlet);if(this.routeReuseStrategy.shouldAttach(i.snapshot)){let c=this.routeReuseStrategy.retrieve(i.snapshot);this.routeReuseStrategy.store(i.snapshot,null),s.children.onOutletReAttached(c.contexts),s.attachRef=c.componentRef,s.route=c.route.value,s.outlet&&s.outlet.attach(c.componentRef,c.route.value),Qt(c.route.value),this.activateChildRoutes(n,null,s.children)}else s.attachRef=null,s.route=i,s.outlet&&s.outlet.activateWith(i,s.injector),this.activateChildRoutes(n,null,s.children)}else this.activateChildRoutes(n,null,r)}};var Et=class{path;route;constructor(n){this.path=n,this.route=this.path[this.path.length-1]}};var ge=class{component;route;constructor(n,e){this.component=n,this.route=e}};function Ui(t,n,e){let r=t._root;return Ue(r,n?n._root:null,e,[r.value])}function Oi(t){let n=t.routeConfig?t.routeConfig.canActivateChild:null;return!n||n.length===0?null:{node:t,guards:n}}function Ee$1(t,n){let e=Symbol(),r=n.get(t,e);return r===e?typeof t==`function`&&!$E(t)?t:n.get(t):r}function Ue(t,n,e,r,i={canDeactivateChecks:[],canActivateChecks:[]}){let o=he(n);return t.children.forEach(s=>{Pi(s,o[s.value.outlet],e,r.concat([s.value]),i),delete o[s.value.outlet]}),Object.entries(o).forEach(([s,c])=>Pe$1(c,e.getContext(s),e,i)),i}function Pi(t,n,e,r,i={canDeactivateChecks:[],canActivateChecks:[]}){let o=t.value,s=n?n.value:null,c=e?e.getContext(t.value.outlet):null;if(s&&o.routeConfig===s.routeConfig){let a=Li(s,o,o.routeConfig.runGuardsAndResolvers);a?i.canActivateChecks.push(new Et(r)):(o.data=s.data,o._resolvedData=s._resolvedData),o.component?Ue(t,n,c?c.children:null,r,i):Ue(t,n,e,r,i),a&&c&&c.outlet&&c.outlet.isActivated&&i.canDeactivateChecks.push(new ge(c.outlet.component,s))}else s&&Pe$1(n,c,e,i),i.canActivateChecks.push(new Et(r)),o.component?Ue(t,null,c?c.children:null,r,i):Ue(t,null,e,r,i);return i}function Li(t,n,e){if(typeof e==`function`)return cr$1(n._environmentInjector,()=>e(t,n));switch(e){case`pathParamsChange`:return!ie$2(t.url,n.url);case`pathParamsOrQueryParamsChange`:return!ie$2(t.url,n.url)||!F$3(t.queryParams,n.queryParams);case`always`:return!0;case`paramsOrQueryParamsChange`:return!nr(t,n)||!F$3(t.queryParams,n.queryParams);default:return!nr(t,n)}}function Pe$1(t,n,e,r){let i=he(t),o=t.value;Object.entries(i).forEach(([s,c])=>{o.component?n?Pe$1(c,n.children.getContext(s),n.children,r):Pe$1(c,null,null,r):Pe$1(c,e?e.getContext(s):null,e,r)}),o.component?n&&n.outlet&&n.outlet.isActivated?r.canDeactivateChecks.push(new ge(n.outlet.component,o)):r.canDeactivateChecks.push(new ge(null,o)):r.canDeactivateChecks.push(new ge(null,o))}function Be(t){return typeof t==`function`}function ji(t){return typeof t==`boolean`}function xi(t){return t&&Be(t.canLoad)}function ki(t){return t&&Be(t.canActivate)}function $i(t){return t&&Be(t.canActivateChild)}function zi(t){return t&&Be(t.canDeactivate)}function qi(t){return t&&Be(t.canMatch)}function Ln(t){return t instanceof rn||t?.name===`EmptyError`}var ot$1=Symbol(`INITIAL_VALUE`);function be(){return Qa(t=>IE(t.map(n=>n.pipe(Za(1),OE(ot$1)))).pipe(ae$3(n=>{for(let e of n)if(e!==!0){if(e===ot$1)return ot$1;if(e===!1||Fi(e))return e}return!0}),jt(n=>n!==ot$1),Za(1)))}function Fi(t){return Z$3(t)||t instanceof we$1}function jn(t){return t.aborted?$r(void 0).pipe(Za(1)):new x$3(n=>{let e=()=>{n.next(),n.complete()};return t.addEventListener(`abort`,e),()=>t.removeEventListener(`abort`,e)})}function xn(t){return kE(jn(t))}function Hi(t){return ln$1(n=>{let{targetSnapshot:e,currentSnapshot:r,guards:{canActivateChecks:i,canDeactivateChecks:o}}=n;return o.length===0&&i.length===0?$r(m$4(l$1({},n),{guardsResult:!0})):Bi(o,e,r).pipe(ln$1(s=>s&&ji(s)?Vi(e,i,t):$r(s)),ae$3(s=>m$4(l$1({},n),{guardsResult:s})))})}function Bi(t,n,e){return nt$1(t).pipe(ln$1(r=>Yi(r.component,r.route,e,n)),AE(r=>r!==!0,!0))}function Vi(t,n,e){return nt$1(n).pipe(Ya(r=>_i$1(Wi(r.route.parent,e),Gi(r.route,e),Ki(t,r.path),Qi(t,r.route))),AE(r=>r!==!0,!0))}function Gi(t,n){return t!==null&&n&&n(new St$1(t)),$r(!0)}function Wi(t,n){return t!==null&&n&&n(new yt$1(t)),$r(!0)}function Qi(t,n){let e=n.routeConfig?n.routeConfig.canActivate:null;if(!e||e.length===0)return $r(!0);return $r(e.map(i=>CE(()=>{let o=n._environmentInjector,s=Ee$1(i,o);return ae$2(ki(s)?s.canActivate(n,t):cr$1(o,()=>s(n,t))).pipe(AE())}))).pipe(be())}function Ki(t,n){let e=n[n.length-1];return $r(n.slice(0,n.length-1).reverse().map(o=>Oi(o)).filter(o=>o!==null).map(o=>CE(()=>{return $r(o.guards.map(c=>{let a=o.node._environmentInjector,u=Ee$1(c,a);return ae$2($i(u)?u.canActivateChild(e,t):cr$1(a,()=>u(e,t))).pipe(AE())})).pipe(be())}))).pipe(be())}function Yi(t,n,e,r){let i=n&&n.routeConfig?n.routeConfig.canDeactivate:null;if(!i||i.length===0)return $r(!0);return $r(i.map(s=>{let c=n._environmentInjector,a=Ee$1(s,c);return ae$2(zi(a)?a.canDeactivate(t,n,e,r):cr$1(c,()=>a(t,n,e,r))).pipe(AE())})).pipe(be())}function Zi(t,n,e,r,i){let o=n.canLoad;if(o===void 0||o.length===0)return $r(!0);return $r(o.map(c=>{let a=Ee$1(c,t),l=ae$2(xi(a)?a.canLoad(n,e):cr$1(t,()=>a(n,e)));return i?l.pipe(xn(i)):l})).pipe(be(),kn(r))}function kn(t){return nE(Of(n=>{if(typeof n!=`boolean`)throw It(t,n)}),ae$3(n=>n===!0))}function Ji(t,n,e,r,i,o){let s=n.canMatch;if(!s||s.length===0)return $r(!0);return $r(s.map(a=>{let u=Ee$1(a,t);return ae$2(qi(u)?u.canMatch(n,e,i):cr$1(t,()=>u(n,e,i))).pipe(xn(o))})).pipe(be(),kn(r))}var V$2=class t extends Error{segmentGroup;constructor(n){super(),this.segmentGroup=n||null,Object.setPrototypeOf(this,t.prototype)}};var qe$1=class t extends Error{urlTree;constructor(n){super(),this.urlTree=n,Object.setPrototypeOf(this,t.prototype)}};function Xi(t){throw new y$2(4e3,!1)}function eo(t){throw On(!1,b$2.GuardRejected)}var sr=class{urlSerializer;urlTree;constructor(n,e){this.urlSerializer=n,this.urlTree=e}async lineralizeSegments(n,e){let r=[],i=e.root;for(;;){if(r=r.concat(i.segments),i.numberOfChildren===0)return r;if(i.numberOfChildren>1||!i.children[`primary`])throw Xi(`${n.redirectTo}`);i=i.children[p$4]}}async applyRedirectCommands(n,e,r,i,o){let s=await to(e,i,o);if(s instanceof E$3)throw new qe$1(s);let c=this.applyRedirectCreateUrlTree(s,this.urlSerializer.parse(s),n,r);if(s[0]===`/`)throw new qe$1(c);return c}applyRedirectCreateUrlTree(n,e,r,i){return new E$3(this.createSegmentGroup(n,e.root,r,i),this.createQueryParams(e.queryParams,this.urlTree.queryParams),e.fragment)}createQueryParams(n,e){let r={};return Object.entries(n).forEach(([i,o])=>{if(typeof o==`string`&&o[0]===`:`){let c=o.substring(1);r[i]=e[c]}else r[i]=o}),r}createSegmentGroup(n,e,r,i){let o=this.createSegments(n,e.segments,r,i),s=Object.create(null);return Object.entries(e.children).forEach(([c,a])=>{s[c]=this.createSegmentGroup(n,a,r,i)}),new m$3(o,s)}createSegments(n,e,r,i){return e.map(o=>o.path[0]===`:`?this.findPosParam(n,o,i):this.findOrReturn(o,r))}findPosParam(n,e,r){let i=r[e.path.substring(1)];if(!i)throw new y$2(4001,!1);return i}findOrReturn(n,e){let r=0;for(let i of e){if(i.path===n.path)return e.splice(r),i;r++}return n}};function to(t,n,e){if(typeof t==`string`)return Promise.resolve(t);let r=t;return ut$1(ae$2(cr$1(e,()=>r(n))))}function ro(t,n){return t.providers&&!t._injector&&(t._injector=sd(t.providers,n,`Route: ${t.path}`)),t._injector??n}function z$3(t){return t.outlet||`primary`}function no(t,n){let e=t.filter(r=>z$3(r)===n);return e.push(...t.filter(r=>z$3(r)!==n)),e}var ar={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function $n(t){return{routeConfig:t.routeConfig,url:t.url,params:t.params,queryParams:t.queryParams,fragment:t.fragment,data:t.data,outlet:t.outlet,title:t.title,paramMap:t.paramMap,queryParamMap:t.queryParamMap}}function io(t,n,e,r,i,o,s){let c=zn(t,n,e);if(!c.matched)return $r(c);let a=$n(o(c));return r=ro(n,r),Ji(r,n,e,i,a,s).pipe(ae$3(u=>u===!0?c:l$1({},ar)))}function zn(t,n,e){if(n.path===``)return n.pathMatch===`full`&&(t.hasChildren()||e.length>0)?l$1({},ar):{matched:!0,consumedSegments:[],remainingSegments:e,parameters:{},positionalParamSegments:{}};let i=(n.matcher||ln)(e,t,n);if(!i)return l$1({},ar);let o={};Object.entries(i.posParams??{}).forEach(([c,a])=>{o[c]=a.path});let s=i.consumed.length>0?l$1(l$1({},o),i.consumed[i.consumed.length-1].parameters):o;return{matched:!0,consumedSegments:i.consumed,remainingSegments:e.slice(i.consumed.length),parameters:s,positionalParamSegments:i.posParams??{}}}function cn(t,n,e,r,i){return e.length>0&&ao(t,e,r,i)?{segmentGroup:new m$3(n,so(r,new m$3(e,t.children))),slicedSegments:[]}:e.length===0&&co(t,e,r)?{segmentGroup:new m$3(t.segments,oo(t,e,r,t.children)),slicedSegments:e}:{segmentGroup:new m$3(t.segments,t.children),slicedSegments:e}}function oo(t,n,e,r){let i={};for(let o of e)if(Mt$1(t,n,o)&&!r[z$3(o)]){let s=new m$3([],{});i[z$3(o)]=s}return l$1(l$1({},r),i)}function so(t,n){let e={};e[p$4]=n;for(let r of t)if(r.path===``&&z$3(r)!==`primary`){let i=new m$3([],{});e[z$3(r)]=i}return e}function ao(t,n,e,r){return e.some(i=>!Mt$1(t,n,i)||!(z$3(i)!==`primary`)?!1:!(r!==void 0&&z$3(i)===r))}function co(t,n,e){return e.some(r=>Mt$1(t,n,r))}function Mt$1(t,n,e){return(t.hasChildren()||n.length>0)&&e.pathMatch===`full`?!1:e.path===``}function uo(t,n,e){return n.length===0&&!t.children[e]}var cr=class{};async function lo(t,n,e,r,i,o,s,c){return new ur(t,n,e,r,i,s,o,c).recognize()}var ho=31;var ur=class{injector;configLoader;rootComponentType;config;urlTree;paramsInheritanceStrategy;urlSerializer;abortSignal;applyRedirects;absoluteRedirectCount=0;allowRedirects=!0;constructor(n,e,r,i,o,s,c,a){this.injector=n,this.configLoader=e,this.rootComponentType=r,this.config=i,this.urlTree=o,this.paramsInheritanceStrategy=s,this.urlSerializer=c,this.abortSignal=a,this.applyRedirects=new sr(this.urlSerializer,this.urlTree)}noMatchError(n){return new y$2(4002,`'${n.segmentGroup}'`)}async recognize(){let n=cn(this.urlTree.root,[],[],this.config).segmentGroup,{children:e,rootSnapshot:r}=await this.match(n),o=new $e(``,new _$2(r,e)),s=Cn(r,[],this.urlTree.queryParams,this.urlTree.fragment);return s.queryParams=this.urlTree.queryParams,o.url=this.urlSerializer.serialize(s),{state:o,tree:s}}async match(n){let e=new Ce$1([],Object.freeze({}),Object.freeze(l$1({},this.urlTree.queryParams)),this.urlTree.fragment,Object.freeze({}),p$4,this.rootComponentType,null,{},this.injector);try{return{children:await this.processSegmentGroup(this.injector,this.config,n,p$4,e),rootSnapshot:e}}catch(r){if(r instanceof qe$1)return this.urlTree=r.urlTree,this.match(r.urlTree.root);throw r instanceof V$2?this.noMatchError(r):r}}async processSegmentGroup(n,e,r,i,o){if(r.segments.length===0&&r.hasChildren())return this.processChildren(n,e,r,o);let s=await this.processSegment(n,e,r,r.segments,i,!0,o);return s instanceof _$2?[s]:[]}async processChildren(n,e,r,i){let o=[];for(let a of Object.keys(r.children))a===`primary`?o.unshift(a):o.push(a);let s=[];for(let a of o){let u=r.children[a],l=no(e,a),v=await this.processSegmentGroup(n,l,u,a,i);s.push(...v)}let c=qn(s);return fo(c),c}async processSegment(n,e,r,i,o,s,c){for(let a of e)try{return await this.processSegmentAgainstRoute(a._injector??n,e,a,r,i,o,s,c)}catch(u){if(u instanceof V$2||Ln(u))continue;throw u}if(uo(r,i,o))return new cr;throw new V$2(r)}async processSegmentAgainstRoute(n,e,r,i,o,s,c,a){if(z$3(r)!==s&&(s===`primary`||!Mt$1(i,o,r)))throw new V$2(i);if(r.redirectTo===void 0)return this.matchSegmentAgainstRoute(n,i,r,o,s,a);if(this.allowRedirects&&c)return this.expandSegmentAgainstRouteUsingRedirect(n,i,e,r,o,s,a);throw new V$2(i)}async expandSegmentAgainstRouteUsingRedirect(n,e,r,i,o,s,c){let{matched:a,parameters:u,consumedSegments:l,positionalParamSegments:v,remainingSegments:f}=zn(e,i,o);if(!a)throw new V$2(e);typeof i.redirectTo==`string`&&i.redirectTo[0]===`/`&&(this.absoluteRedirectCount++,this.absoluteRedirectCount>ho&&(this.allowRedirects=!1));let R=this.createSnapshot(n,i,o,u,c);if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let k=await this.applyRedirects.applyRedirectCommands(l,i.redirectTo,v,$n(R),n),X=await this.applyRedirects.lineralizeSegments(i,k);return this.processSegment(n,r,e,X.concat(f),s,!1,c)}createSnapshot(n,e,r,i,o){let s=new Ce$1(r,i,Object.freeze(l$1({},this.urlTree.queryParams)),this.urlTree.fragment,go(e),z$3(e),e.component??e._loadedComponent??null,e,vo(e),n),c=fr(s,o,this.paramsInheritanceStrategy);return s.params=Object.freeze(c.params),s.data=Object.freeze(c.data),s}async matchSegmentAgainstRoute(n,e,r,i,o,s){if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let c=ee=>this.createSnapshot(n,r,ee.consumedSegments,ee.parameters,s),a=await ut$1(io(e,r,i,n,this.urlSerializer,c,this.abortSignal));if(r.path===`**`&&(e.children={}),!a?.matched)throw new V$2(e);n=r._injector??n;let{routes:u}=await this.getChildConfig(n,r,i),l=r._loadedInjector??n,{parameters:v,consumedSegments:f,remainingSegments:R}=a,k=this.createSnapshot(n,r,f,v,s),{segmentGroup:X,slicedSegments:Me}=cn(e,f,R,u,o);if(Me.length===0&&X.hasChildren())return new _$2(k,await this.processChildren(l,u,X,k));if(u.length===0&&Me.length===0)return new _$2(k,[]);let _t=z$3(r)===o,Ge=await this.processSegment(l,u,X,Me,_t?p$4:o,!0,k);return new _$2(k,Ge instanceof _$2?[Ge]:[])}async getChildConfig(n,e,r){if(e.children)return{routes:e.children,injector:n};if(e.loadChildren){if(e._loadedRoutes!==void 0){let o=e._loadedNgModuleFactory;return o&&!e._loadedInjector&&(e._loadedInjector=o.create(n).injector),{routes:e._loadedRoutes,injector:e._loadedInjector}}if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);if(await ut$1(Zi(n,e,r,this.urlSerializer,this.abortSignal))){let o=await this.configLoader.loadChildren(n,e);return e._loadedRoutes=o.routes,e._loadedInjector=o.injector,e._loadedNgModuleFactory=o.factory,o}throw eo(e)}return{routes:[],injector:n}}};function fo(t){t.sort((n,e)=>n.value.outlet===`primary`?-1:e.value.outlet===`primary`?1:n.value.outlet.localeCompare(e.value.outlet))}function po(t){let n=t.value.routeConfig;return n&&n.path===``}function qn(t){let n=[],e=new Set;for(let r of t){if(!po(r)){n.push(r);continue}let i=n.find(o=>r.value.routeConfig===o.value.routeConfig);i!==void 0?(i.children.push(...r.children),e.add(i)):n.push(r)}for(let r of e){let i=qn(r.children);n.push(new _$2(r.value,i))}return n.filter(r=>!e.has(r))}function go(t){return t.data||{}}function vo(t){return t.resolve||{}}function mo(t,n,e,r,i,o,s){return ln$1(async c=>{let{state:a,tree:u}=await lo(t,n,e,r,c.extractedUrl,i,o,s);return m$4(l$1({},c),{targetSnapshot:a,urlAfterRedirects:u})})}function yo(t){return ln$1(n=>{let{targetSnapshot:e,guards:{canActivateChecks:r}}=n;if(!r.length)return $r(n);let i=new Set(r.map(c=>c.route)),o=new Set;for(let c of i)if(!o.has(c))for(let a of Fn(c))o.add(a);let s=0;return nt$1(o).pipe(Ya(c=>i.has(c)?Ro(c,e,t):(c.data=fr(c,c.parent,t).resolve,$r(void 0))),Of(()=>s++),xE(1),ln$1(c=>s===o.size?$r(n):cn$1))})}function Fn(t){return[t,...t.children.map(e=>Fn(e)).flat()]}function Ro(t,n,e){let r=t.routeConfig,i=t._resolve;return r?.title!==void 0&&!Nn(r)&&(i[Fe]=r.title),CE(()=>(t.data=fr(t,t.parent,e).resolve,So(i,t,n).pipe(ae$3(o=>(t._resolvedData=o,t.data=l$1(l$1({},t.data),o),null)))))}function So(t,n,e){let r=Yt(t);if(r.length===0)return $r({});let i={};return nt$1(r).pipe(ln$1(o=>Co(t[o],n,e).pipe(AE(),Of(s=>{if(s instanceof we$1)throw It(new Y$3,s);i[o]=s}))),xE(1),ae$3(()=>i),qa(o=>Ln(o)?cn$1:fE(o)))}function Co(t,n,e){let r=n._environmentInjector,i=Ee$1(t,r);return ae$2(i.resolve?i.resolve(n,e):cr$1(r,()=>i(n,e)))}var yr=new E$4(``);function lr(t){return Qa(n=>{let e=t(n);return e?nt$1(e).pipe(ae$3(()=>n)):$r(n)})}var Rr=(()=>{class t{buildTitle(e){let r,i=e.root;for(;i!==void 0;)r=this.getResolvedTitleForRoute(i)??r,i=i.children.find(o=>o.outlet===p$4);return r}getResolvedTitleForRoute(e){return e.data[Fe]}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:()=>g$2(Hn)})}return t})();var Hn=(()=>{class t extends Rr{title;constructor(e){super(),this.title=e}updateTitle(e){let r=this.buildTitle(e);r!==void 0&&this.title.setTitle(r)}static ɵfac=function(r){return new(r||t)(S$4(r8))};static ɵprov=A$2({token:t,factory:t.ɵfac,providedIn:`root`})}return t})();var Ae$1=new E$4(``,{factory:()=>({})});var Ve=new E$4(``);var Bn=(()=>{class t{componentLoaders=new WeakMap;childrenLoaders=new WeakMap;onLoadStartListener;onLoadEndListener;compiler=g$2($_);async loadComponent(e,r){if(this.componentLoaders.get(r))return this.componentLoaders.get(r);if(r._loadedComponent)return Promise.resolve(r._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(r);let i=(async()=>{try{let s=await Gn(_H(await hn(cr$1(e,()=>r.loadComponent()))));return this.onLoadEndListener&&this.onLoadEndListener(r),r._loadedComponent=s,s}finally{this.componentLoaders.delete(r)}})();return this.componentLoaders.set(r,i),i}loadChildren(e,r){if(this.childrenLoaders.get(r))return this.childrenLoaders.get(r);if(r._loadedRoutes)return Promise.resolve({routes:r._loadedRoutes,injector:r._loadedInjector});this.onLoadStartListener&&this.onLoadStartListener(r);let i=(async()=>{try{let o=await Vn(r,this.compiler,e,this.onLoadEndListener);return r._loadedRoutes=o.routes,r._loadedInjector=o.injector,r._loadedNgModuleFactory=o.factory,o}finally{this.childrenLoaders.delete(r)}})();return this.childrenLoaders.set(r,i),i}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();async function Vn(t,n,e,r){let o=await Gn(_H(await hn(cr$1(e,()=>t.loadChildren())))),s;o instanceof py||Array.isArray(o)?s=o:s=await n.compileModuleAsync(o),r&&r(t);let c,a,l;return Array.isArray(s)?a=s:(c=s.create(e).injector,l=s,a=c.get(Ve,[],{optional:!0,self:!0}).flat()),{routes:a.map(mr),injector:c,factory:l}}async function Gn(t){return t}var Tt=(()=>{class t{static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:()=>g$2(wo)})}return t})();var wo=(()=>{class t{shouldProcessUrl(e){return!0}extract(e){return e}merge(e,r){return e}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();var Wn=new E$4(``);var bo=()=>{};var Sr=new E$4(``);var Cr=(()=>{class t{currentNavigation=Ke(null,{equal:()=>!1});currentTransition=null;lastSuccessfulNavigation=Ke(null);events=new we$2;transitionAbortWithErrorSubject=new we$2;configLoader=g$2(Bn);environmentInjector=g$2(fe$1);destroyRef=g$2(pe$3);urlSerializer=g$2(ce$2);rootContexts=g$2(Ie$1);location=g$2(fD);inputBindingEnabled=g$2(He,{optional:!0})!==null;titleStrategy=g$2(Rr);options=g$2(Ae$1,{optional:!0})||{};paramsInheritanceStrategy=this.options.paramsInheritanceStrategy||Mi;urlHandlingStrategy=g$2(Tt);createViewTransition=g$2(Wn,{optional:!0});navigationErrorHandler=g$2(Sr,{optional:!0});routerResourcesFeature=g$2(yr,{optional:!0});navigationId=0;get hasRequestedNavigation(){return this.navigationId!==0}transitions;afterPreactivation=()=>$r(void 0);rootComponentType=null;destroyed=!1;constructor(){let e=i=>this.events.next(new vt$1(i)),r=i=>this.events.next(new mt$1(i));this.configLoader.onLoadEndListener=r,this.configLoader.onLoadStartListener=e,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}complete(){this.transitions?.complete()}handleNavigationRequest(e){let r=++this.navigationId;ie$3(()=>{this.transitions?.next(m$4(l$1({},e),{extractedUrl:this.urlHandlingStrategy.extract(e.rawUrl),targetSnapshot:null,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null,id:r,routesRecognizeHandler:{},beforeActivateHandler:{}}))})}setupNavigations(e){return this.transitions=new Vr(null),this.transitions.pipe(jt(r=>r!==null),Qa(r=>{let i=!0,o=!1,s=new AbortController,c=()=>!o&&this.currentTransition?.id===r.id;return $r(r).pipe(Qa(a=>{if(this.navigationId>r.id)return this.cancelNavigationTransition(r,``,b$2.SupersededByNewNavigation),cn$1;this.currentTransition=r;let u=this.lastSuccessfulNavigation();this.currentNavigation.set({id:a.id,initialUrl:a.rawUrl,extractedUrl:a.extractedUrl,targetBrowserUrl:typeof a.extras.browserUrl==`string`?this.urlSerializer.parse(a.extras.browserUrl):a.extras.browserUrl,trigger:a.source,extras:a.extras,previousNavigation:u?m$4(l$1({},u),{previousNavigation:null}):null,abort:()=>s.abort(),routesRecognizeHandler:a.routesRecognizeHandler,beforeActivateHandler:a.beforeActivateHandler});let l=!e.navigated||this.isUpdatingInternalState()||this.isUpdatedBrowserUrl(),v=a.extras.onSameUrlNavigation??e.onSameUrlNavigation;if(!l&&v!==`reload`)return this.events.next(new H$2(a.id,this.urlSerializer.serialize(a.rawUrl),``,me$1.IgnoredSameUrlNavigation)),a.resolve(!1),cn$1;if(this.urlHandlingStrategy.shouldProcessUrl(a.rawUrl))return $r(a).pipe(Qa(f=>(this.events.next(new J$3(f.id,this.urlSerializer.serialize(f.extractedUrl),f.source,f.restoredState)),f.id!==this.navigationId?cn$1:Promise.resolve(f))),mo(this.environmentInjector,this.configLoader,this.rootComponentType,e.config,this.urlSerializer,this.paramsInheritanceStrategy,s.signal),Of(f=>{r.targetSnapshot=f.targetSnapshot,r.urlAfterRedirects=f.urlAfterRedirects,this.currentNavigation.update(R=>(R.finalUrl=f.urlAfterRedirects,R)),this.events.next(new xe$1)}),Qa(f=>nt$1(r.routesRecognizeHandler.deferredHandle??$r(void 0)).pipe(ae$3(()=>f))),Of(()=>{let f=new je(a.id,this.urlSerializer.serialize(a.extractedUrl),this.urlSerializer.serialize(a.urlAfterRedirects),a.targetSnapshot);this.events.next(f)}));if(l&&this.urlHandlingStrategy.shouldProcessUrl(a.currentRawUrl)){let{id:f,extractedUrl:R,source:k,restoredState:X,extras:Me}=a,_t=new J$3(f,this.urlSerializer.serialize(R),k,X);this.events.next(_t);let Ge=Mn(this.rootComponentType,this.environmentInjector).snapshot;return this.currentTransition=r=m$4(l$1({},a),{targetSnapshot:Ge,urlAfterRedirects:R,extras:m$4(l$1({},Me),{skipLocationChange:!1,replaceUrl:!1})}),this.currentNavigation.update(ee=>(ee.finalUrl=R,ee)),$r(r)}else return this.events.next(new H$2(a.id,this.urlSerializer.serialize(a.extractedUrl),``,me$1.IgnoredByUrlHandlingStrategy)),a.resolve(!1),cn$1}),ae$3(a=>{let u=new ht$1(a.id,this.urlSerializer.serialize(a.extractedUrl),this.urlSerializer.serialize(a.urlAfterRedirects),a.targetSnapshot);return this.events.next(u),this.currentTransition=r=m$4(l$1({},a),{guards:Ui(a.targetSnapshot,a.currentSnapshot,this.rootContexts)}),r}),Hi(a=>this.events.next(a)),Qa(a=>{if(r.guardsResult=a.guardsResult,a.guardsResult&&typeof a.guardsResult!=`boolean`)throw It(this.urlSerializer,a.guardsResult);let u=new ft$1(a.id,this.urlSerializer.serialize(a.extractedUrl),this.urlSerializer.serialize(a.urlAfterRedirects),a.targetSnapshot,!!a.guardsResult);if(this.events.next(u),!c())return cn$1;if(!a.guardsResult)return this.cancelNavigationTransition(a,``,b$2.GuardRejected),cn$1;if(a.guards.canActivateChecks.length===0)return $r(a);let l=new pt(a.id,this.urlSerializer.serialize(a.extractedUrl),this.urlSerializer.serialize(a.urlAfterRedirects),a.targetSnapshot);if(this.events.next(l),!c())return cn$1;let v=!1;return $r(a).pipe(yo(this.paramsInheritanceStrategy),Of({next:()=>{v=!0;let f=new gt$1(a.id,this.urlSerializer.serialize(a.extractedUrl),this.urlSerializer.serialize(a.urlAfterRedirects),a.targetSnapshot);this.events.next(f)},complete:()=>{v||this.cancelNavigationTransition(a,``,b$2.NoDataFromResolver)}}))}),lr(a=>{let u=v=>{let f=[];if(v.routeConfig?._loadedComponent)v.component=v.routeConfig?._loadedComponent;else if(v.routeConfig?.loadComponent){let R=v._environmentInjector;f.push(this.configLoader.loadComponent(R,v.routeConfig).then(k=>{v.component=k}))}for(let R of v.children)f.push(...u(R));return f},l=u(a.targetSnapshot.root);return l.length===0?$r(a):nt$1(Promise.all(l).then(()=>a))}),Qa(a=>{let{newlyCreatedRoutes:u,state:l}=Ti(e.routeReuseStrategy,a.targetSnapshot,a.currentRouterState);return this.currentTransition=r=a=m$4(l$1({},a),{targetRouterState:l,newlyCreatedRoutes:u}),this.currentNavigation.update(v=>(v.targetRouterState=l,v)),$r(a)}),this.routerResourcesFeature?.setupAndRunResources(s.signal)??(a=>a),lr(()=>this.afterPreactivation()),Qa(()=>{let{currentSnapshot:a,targetSnapshot:u}=r,l=this.createViewTransition?.(this.environmentInjector,a.root,u.root,r.hasUAVisualTransition);return l?nt$1(l).pipe(ae$3(()=>r)):$r(r)}),Za(1),Qa(a=>{i=!1,this.events.next(new Re$1);let u=r.beforeActivateHandler.deferredHandle;return u?nt$1(u.then(()=>a)):$r(a)}),Of(a=>{new or(e.routeReuseStrategy,r.targetRouterState,r.currentRouterState,u=>this.events.next(u),this.inputBindingEnabled).activate(this.rootContexts),a.newlyCreatedRoutes?.clear(),c()&&(Qn(a.targetRouterState),o=!0,this.currentNavigation.update(u=>(u.abort=bo,u)),this.lastSuccessfulNavigation.set(ie$3(this.currentNavigation)),this.events.next(new x$2(a.id,this.urlSerializer.serialize(a.extractedUrl),this.urlSerializer.serialize(a.urlAfterRedirects))),this.titleStrategy?.updateTitle(a.targetRouterState.snapshot),a.resolve(!0))}),kE(jn(s.signal).pipe(jt(()=>!o&&i),Of(()=>{this.cancelNavigationTransition(r,s.signal.reason+``,b$2.Aborted)}))),Of({complete:()=>{o=!0}}),kE(this.transitionAbortWithErrorSubject.pipe(Of(a=>{throw a}))),Ka(()=>{s.abort(),o||this.cancelNavigationTransition(r,``,b$2.SupersededByNewNavigation),this.currentTransition?.id===r.id&&(this.currentNavigation.set(null),this.currentTransition=null)}),qa(a=>{if(o=!0,un(r),this.destroyed)return r.resolve(!1),cn$1;if(Pn(a))this.events.next(new j$3(r.id,this.urlSerializer.serialize(r.extractedUrl),a.message,a.cancellationCode)),_i(a)?this.events.next(new Se$1(a.url,a.navigationBehaviorOptions)):r.resolve(!1);else{let u=new se$1(r.id,this.urlSerializer.serialize(r.extractedUrl),a,r.targetSnapshot??void 0);try{let l=cr$1(this.environmentInjector,()=>this.navigationErrorHandler?.(u));if(l instanceof we$1){let{message:v,cancellationCode:f}=It(this.urlSerializer,l);this.events.next(new j$3(r.id,this.urlSerializer.serialize(r.extractedUrl),v,f)),this.events.next(new Se$1(l.redirectTo,l.navigationBehaviorOptions))}else throw this.events.next(u),a}catch(l){this.options.resolveNavigationPromiseOnError?r.resolve(!1):r.reject(l)}}return cn$1}))}))}cancelNavigationTransition(e,r,i){un(e);let o=new j$3(e.id,this.urlSerializer.serialize(e.extractedUrl),r,i);this.events.next(o),e.resolve(!1)}isUpdatingInternalState(){return this.currentTransition?.extractedUrl.toString()!==this.currentTransition?.currentUrlTree.toString()}isUpdatedBrowserUrl(){let e=this.urlHandlingStrategy.extract(this.urlSerializer.parse(this.location.path(!0))),r=ie$3(this.currentNavigation),i=r?.targetBrowserUrl??r?.extractedUrl;return e.toString()!==i?.toString()&&!r?.extras.skipLocationChange}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();function Io(t){return t!==pe$2}function un(t){for(let n of t.newlyCreatedRoutes??[])n._localInjector?.destroy(),n._localInjector=void 0;Qn(t.targetRouterState)}function Qn(t){if(!t)return;let n=e=>{e.value.pending?.set(!1),e.children.forEach(n)};n(t._root)}var Kn=new E$4(``);var Yn=(()=>{class t{static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:()=>g$2(Eo)})}return t})();var At=class{shouldDetach(n){return!1}store(n,e){}shouldAttach(n){return!1}retrieve(n){return null}shouldReuseRoute(n,e){return n.routeConfig===e.routeConfig}shouldDestroyInjector(n){return!0}};var Eo=(()=>{class t extends At{static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();var Nt$1=(()=>{class t{urlSerializer=g$2(ce$2);options=g$2(Ae$1,{optional:!0})||{};canceledNavigationResolution=this.options.canceledNavigationResolution||`replace`;location=g$2(fD);urlHandlingStrategy=g$2(Tt);urlUpdateStrategy=this.options.urlUpdateStrategy||`deferred`;currentUrlTree=new E$3;getCurrentUrlTree(){return this.currentUrlTree}rawUrlTree=this.currentUrlTree;getRawUrlTree(){return this.rawUrlTree}createBrowserPath({finalUrl:e,initialUrl:r,targetBrowserUrl:i}){let o=e!==void 0?this.urlHandlingStrategy.merge(e,r):r,s=i??o;return s instanceof E$3?this.urlSerializer.serialize(s):s}routerUrlState(e){return e?.targetBrowserUrl===void 0||e?.finalUrl===void 0?{}:{ɵrouterUrl:this.urlSerializer.serialize(e.finalUrl)}}commitTransition({targetRouterState:e,finalUrl:r,initialUrl:i}){r&&e?(this.currentUrlTree=r,this.rawUrlTree=this.urlHandlingStrategy.merge(r,i),this.routerState=e):this.rawUrlTree=i}routerState=Mn(null,g$2(fe$1));getRouterState(){return this.routerState}_stateMemento=this.createStateMemento();get stateMemento(){return this._stateMemento}updateStateMemento(){this._stateMemento=this.createStateMemento()}createStateMemento(){return{rawUrlTree:this.rawUrlTree,currentUrlTree:this.currentUrlTree,routerState:this.routerState}}restoredState(){return this.location.getState()}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:()=>g$2(Ao)})}return t})();var Ao=(()=>{class t extends Nt$1{currentPageId=0;lastSuccessfulId=-1;get browserPageId(){return this.canceledNavigationResolution!==`computed`?this.currentPageId:this.restoredState()?.ɵrouterPageId??this.currentPageId}registerNonRouterCurrentEntryChangeListener(e){return this.location.subscribe(r=>{r.type===`popstate`&&setTimeout(()=>{e(r.url,r.state,`popstate`,{replaceUrl:!0},r.hasUAVisualTransition)})})}handleRouterEvent(e,r){e instanceof J$3?this.updateStateMemento():e instanceof H$2?this.commitTransition(r):e instanceof je?this.urlUpdateStrategy===`eager`&&(r.extras.skipLocationChange||this.setBrowserUrl(this.createBrowserPath(r),r)):e instanceof Re$1?(this.commitTransition(r),this.urlUpdateStrategy===`deferred`&&!r.extras.skipLocationChange&&this.setBrowserUrl(this.createBrowserPath(r),r)):e instanceof j$3&&!An(e)?this.restoreHistory(r):e instanceof se$1?this.restoreHistory(r,!0):e instanceof x$2&&(this.lastSuccessfulId=e.id,this.currentPageId=this.browserPageId)}setBrowserUrl(e,r){let{extras:i,id:o}=r,{replaceUrl:s,state:c}=i;if(this.location.isCurrentPathEqualTo(e)||s){let a=this.browserPageId,u=l$1(l$1({},c),this.generateNgRouterState(o,a,r));this.location.replaceState(e,``,u)}else{let a=l$1(l$1({},c),this.generateNgRouterState(o,this.browserPageId+1,r));this.location.go(e,``,a)}}restoreHistory(e,r=!1){if(this.canceledNavigationResolution===`computed`){let i=this.browserPageId,o=this.currentPageId-i;o!==0?this.location.historyGo(o):this.getCurrentUrlTree()===e.finalUrl&&o===0&&(this.resetInternalState(e),this.resetUrlToCurrentUrlTree())}else this.canceledNavigationResolution===`replace`&&(r&&this.resetInternalState(e),this.resetUrlToCurrentUrlTree())}resetInternalState({finalUrl:e}){this.routerState=this.stateMemento.routerState,this.currentUrlTree=this.stateMemento.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,e??this.rawUrlTree)}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.getRawUrlTree()),``,this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}generateNgRouterState(e,r,i){return this.canceledNavigationResolution===`computed`?l$1({navigationId:e,ɵrouterPageId:r},this.routerUrlState(i)):l$1({navigationId:e},this.routerUrlState(i))}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();function wr(t,n){t.events.pipe(jt(e=>e instanceof x$2||e instanceof j$3||e instanceof se$1||e instanceof H$2),ae$3(e=>e instanceof x$2||e instanceof H$2?0:(e instanceof j$3?e.code===b$2.Redirect||e.code===b$2.SupersededByNewNavigation:!1)?2:1),jt(e=>e!==2),Za(1)).subscribe(()=>{n()})}var ue=(()=>{class t{get currentUrlTree(){return this.stateManager.getCurrentUrlTree()}get rawUrlTree(){return this.stateManager.getRawUrlTree()}disposed=!1;nonRouterCurrentEntryChangeSubscription;console=g$2(Ny);stateManager=g$2(Nt$1);options=g$2(Ae$1,{optional:!0})||{};pendingTasks=g$2(Yt$1);urlUpdateStrategy=this.options.urlUpdateStrategy||`deferred`;navigationTransitions=g$2(Cr);urlSerializer=g$2(ce$2);location=g$2(fD);urlHandlingStrategy=g$2(Tt);injector=g$2(fe$1);_events=new we$2;get events(){return this._events}get routerState(){return this.stateManager.getRouterState()}navigated=!1;routeReuseStrategy=g$2(Yn);injectorCleanup=g$2(Kn,{optional:!0});onSameUrlNavigation=this.options.onSameUrlNavigation||`ignore`;config=g$2(Ve,{optional:!0})?.flat()??[];componentInputBindingEnabled=!!g$2(He,{optional:!0});currentNavigation=this.navigationTransitions.currentNavigation.asReadonly();constructor(){this.resetConfig(this.config),this.navigationTransitions.setupNavigations(this).subscribe({error:e=>{}}),this.subscribeToNavigationEvents()}eventsSubscription=new se$2;subscribeToNavigationEvents(){let e=this.navigationTransitions.events.subscribe(r=>{try{let i=this.navigationTransitions.currentTransition,o=ie$3(this.navigationTransitions.currentNavigation);if(i!==null&&o!==null){if(this.stateManager.handleRouterEvent(r,o),r instanceof j$3&&r.code!==b$2.Redirect&&r.code!==b$2.SupersededByNewNavigation)this.navigated=!0;else if(r instanceof x$2)this.navigated=!0,this.injectorCleanup?.(this.routeReuseStrategy,this.routerState,this.config);else if(r instanceof Se$1){let s=r.navigationBehaviorOptions,c=this.urlHandlingStrategy.merge(r.url,i.currentRawUrl),a=l$1({scroll:i.extras.scroll,browserUrl:i.extras.browserUrl,info:i.extras.info,skipLocationChange:i.extras.skipLocationChange,replaceUrl:i.extras.replaceUrl||this.urlUpdateStrategy===`eager`||Io(i.source)},s);this.scheduleNavigation(c,pe$2,null,a,i.hasUAVisualTransition,{resolve:i.resolve,reject:i.reject,promise:i.promise})}}Ei(r)&&this._events.next(r)}catch(i){this.navigationTransitions.transitionAbortWithErrorSubject.next(i)}});this.eventsSubscription.add(e)}resetRootComponentType(e){this.routerState.root.component=e,this.navigationTransitions.rootComponentType=e}initialNavigation(){this.setUpLocationChangeListener(),this.navigationTransitions.hasRequestedNavigation||this.navigateToSyncWithBrowser(this.location.path(!0),pe$2,this.stateManager.restoredState(),{replaceUrl:!0})}setUpLocationChangeListener(){this.nonRouterCurrentEntryChangeSubscription??=this.stateManager.registerNonRouterCurrentEntryChangeListener((e,r,i,o,s)=>{this.navigateToSyncWithBrowser(e,i,r,o,s)})}navigateToSyncWithBrowser(e,r,i,o,s){let c=i?.navigationId?i:null,a=i?.ɵrouterUrl??e;if(i?.ɵrouterUrl&&(o=m$4(l$1({},o),{browserUrl:e})),i){let l=l$1({},i);delete l.navigationId,delete l.ɵrouterPageId,delete l.ɵrouterUrl,Object.keys(l).length!==0&&(o.state=l)}let u=this.parseUrl(a);this.scheduleNavigation(u,r,c,o,s).catch(l=>{this.disposed||this.injector.get(Nt$2)(l)})}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return ie$3(this.navigationTransitions.currentNavigation)}get lastSuccessfulNavigation(){return this.navigationTransitions.lastSuccessfulNavigation}resetConfig(e){this.config=e.map(mr),this.navigated=!1}ngOnDestroy(){this.dispose()}dispose(){this._events.unsubscribe(),this.navigationTransitions.complete(),this.nonRouterCurrentEntryChangeSubscription?.unsubscribe(),this.nonRouterCurrentEntryChangeSubscription=void 0,this.disposed=!0,this.eventsSubscription.unsubscribe()}createUrlTree(e,r={}){let{relativeTo:i,queryParams:o,fragment:s,queryParamsHandling:c,preserveFragment:a}=r,u=a?this.currentUrlTree.fragment:s,l=null;switch(c??this.options.defaultQueryParamsHandling){case`merge`:l=l$1(l$1({},this.currentUrlTree.queryParams),o);break;case`preserve`:l=this.currentUrlTree.queryParams;break;default:l=o||null}l!==null&&(l=this.removeEmptyProps(l));let v;try{v=wn(i?i.snapshot:this.routerState.snapshot.root)}catch{(typeof e[0]!=`string`||e[0][0]!==`/`)&&(e=[]),v=this.currentUrlTree.root}return bn(v,e,l,u??null,this.urlSerializer)}navigateByUrl(e,r={skipLocationChange:!1}){let i=Z$3(e)?e:this.parseUrl(e),o=this.urlHandlingStrategy.merge(i,this.rawUrlTree);return this.scheduleNavigation(o,pe$2,null,r)}navigate(e,r={skipLocationChange:!1}){return Mo(e),this.navigateByUrl(this.createUrlTree(e,r),r)}serializeUrl(e){return this.urlSerializer.serialize(e)}parseUrl(e){try{return this.urlSerializer.parse(e)}catch{return this.console.warn(We$1(4018,!1)),this.urlSerializer.parse(`/`)}}isActive(e,r){let i;if(r===!0?i=l$1({},dr):r===!1?i=l$1({},ve):i=l$1(l$1({},ve),r),Z$3(e))return Zt(this.currentUrlTree,e,i);let o=this.parseUrl(e);return Zt(this.currentUrlTree,o,i)}removeEmptyProps(e){return Object.entries(e).reduce((r,[i,o])=>(o!=null&&(r[i]=o),r),{})}scheduleNavigation(e,r,i,o,s,c){if(this.disposed)return Promise.resolve(!1);let a,u,l;c?(a=c.resolve,u=c.reject,l=c.promise):l=new Promise((f,R)=>{a=f,u=R});let v=this.pendingTasks.add();return wr(this,()=>{queueMicrotask(()=>this.pendingTasks.remove(v))}),this.navigationTransitions.handleNavigationRequest({source:r,restoredState:i,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,rawUrl:e,extras:o,hasUAVisualTransition:s,resolve:a,reject:u,promise:l,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),l.catch(Promise.reject.bind(Promise))}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();function Mo(t){for(let n=0;n<t.length;n++)if(t[n]==null)throw new y$2(4008,!1)}var To=(()=>{class t{router=g$2(ue);stateManager=g$2(Nt$1);fragment=Ke(``);queryParams=Ke({});path=Ke(``);serializer=g$2(ce$2);constructor(){this.updateState(),this.router.events?.subscribe(e=>{e instanceof x$2&&this.updateState()})}updateState(){let{fragment:e,root:r,queryParams:i}=this.stateManager.getCurrentUrlTree();this.fragment.set(e),this.queryParams.set(i),this.path.set(this.serializer.serialize(new E$3(r)))}static ɵfac=function(r){return new(r||t)};static ɵprov=Be$1({token:t,factory:t.ɵfac})}return t})();var Dt=(()=>{class t{router;route;tabIndexAttribute;renderer;el;locationStrategy;hrefAttributeValue=g$2(new $v(`href`),{optional:!0});reactiveHref=fa(()=>this.isAnchorElement?this.computeHref(this._urlTree()):this.hrefAttributeValue);get href(){return ie$3(this.reactiveHref)}set href(e){this.reactiveHref.set(e)}set target(e){this._target.set(e)}get target(){return ie$3(this._target)}_target=Ke(void 0);set queryParams(e){this._queryParams.set(e)}get queryParams(){return ie$3(this._queryParams)}_queryParams=Ke(void 0,{equal:()=>!1});set fragment(e){this._fragment.set(e)}get fragment(){return ie$3(this._fragment)}_fragment=Ke(void 0);set queryParamsHandling(e){this._queryParamsHandling.set(e)}get queryParamsHandling(){return ie$3(this._queryParamsHandling)}_queryParamsHandling=Ke(void 0);set state(e){this._state.set(e)}get state(){return ie$3(this._state)}_state=Ke(void 0,{equal:()=>!1});set info(e){this._info.set(e)}get info(){return ie$3(this._info)}_info=Ke(void 0,{equal:()=>!1});set relativeTo(e){this._relativeTo.set(e)}get relativeTo(){return ie$3(this._relativeTo)}_relativeTo=Ke(void 0);set preserveFragment(e){this._preserveFragment.set(e)}get preserveFragment(){return ie$3(this._preserveFragment)}_preserveFragment=Ke(!1);set skipLocationChange(e){this._skipLocationChange.set(e)}get skipLocationChange(){return ie$3(this._skipLocationChange)}_skipLocationChange=Ke(!1);set replaceUrl(e){this._replaceUrl.set(e)}get replaceUrl(){return ie$3(this._replaceUrl)}_replaceUrl=Ke(!1);browserUrl=NH(void 0);isAnchorElement;onChanges=new we$2;applicationErrorHandler=g$2(Nt$2);options=g$2(Ae$1,{optional:!0});reactiveRouterState=g$2(To);constructor(e,r,i,o,s,c){this.router=e,this.route=r,this.tabIndexAttribute=i,this.renderer=o,this.el=s,this.locationStrategy=c;let a=s.nativeElement.tagName?.toLowerCase();this.isAnchorElement=a===`a`||a===`area`||!!(typeof customElements==`object`&&customElements.get(a)?.observedAttributes?.includes?.(`href`))}setTabIndexIfNotOnNativeEl(e){this.tabIndexAttribute!=null||this.isAnchorElement||this.applyAttributeValue(`tabindex`,e)}ngOnChanges(e){this.onChanges.next(this)}routerLinkInput=Ke(null);set routerLink(e){e==null?(this.routerLinkInput.set(null),this.setTabIndexIfNotOnNativeEl(null)):(Z$3(e)?this.routerLinkInput.set(e):this.routerLinkInput.set(Array.isArray(e)?e:[e]),this.setTabIndexIfNotOnNativeEl(`0`))}onClick(e,r,i,o,s){let c=this._urlTree();if(c===null||this.isAnchorElement&&(e!==0||r||i||o||s||typeof this.target==`string`&&this.target!=`_self`))return!0;let a=this.browserUrl(),u=l$1({skipLocationChange:this.skipLocationChange,replaceUrl:this.replaceUrl,state:this.state,info:this.info},a!==void 0&&{browserUrl:a});return this.router.navigateByUrl(c,u)?.catch(l=>{this.applicationErrorHandler(l)}),!this.isAnchorElement}ngOnDestroy(){}applyAttributeValue(e,r){let i=this.renderer,o=this.el.nativeElement;r!==null?i.setAttribute(o,e,r):i.removeAttribute(o,e)}_urlTree=Ft(()=>{this.reactiveRouterState.path(),this._preserveFragment()&&this.reactiveRouterState.fragment();let e=i=>i===`preserve`||i===`merge`;(e(this._queryParamsHandling())||e(this.options?.defaultQueryParamsHandling))&&this.reactiveRouterState.queryParams();let r=this.routerLinkInput();return r===null||!this.router.createUrlTree?null:Z$3(r)?r:this.router.createUrlTree(r,{relativeTo:this._relativeTo()!==void 0?this._relativeTo():this.route,queryParams:this._queryParams(),fragment:this._fragment(),queryParamsHandling:this._queryParamsHandling(),preserveFragment:this._preserveFragment()})},{equal:(e,r)=>this.computeHref(e)===this.computeHref(r)});get urlTree(){return ie$3(this._urlTree)}computeHref(e){return e!==null&&this.locationStrategy?this.locationStrategy?.prepareExternalUrl(this.router.serializeUrl(e))??``:null}static ɵfac=function(r){return new(r||t)(Gn$1(ue),Gn$1(G$2),il(`tabindex`),Gn$1(Ao$1),Gn$1(Hn$1),Gn$1(Ia))};static ɵdir=ad({type:t,selectors:[[``,`routerLink`,``]],hostVars:2,hostBindings:function(r,i){r&1&&Gy(`click`,function(s){return i.onClick(s.button,s.ctrlKey,s.shiftKey,s.altKey,s.metaKey)}),r&2&&ky(`href`,i.reactiveHref(),Ww)(`target`,i._target())},inputs:{target:`target`,queryParams:`queryParams`,fragment:`fragment`,queryParamsHandling:`queryParamsHandling`,state:`state`,info:`info`,relativeTo:`relativeTo`,preserveFragment:[2,`preserveFragment`,`preserveFragment`,pN],skipLocationChange:[2,`skipLocationChange`,`skipLocationChange`,pN],replaceUrl:[2,`replaceUrl`,`replaceUrl`,pN],browserUrl:[1,`browserUrl`],routerLink:`routerLink`},features:[rl]})}return t})();var No=(()=>{class t{router;element;renderer;cdr;links;classes=[];routerEventsSubscription;linkInputChangesSubscription;_isActive=!1;get isActive(){return this._isActive}routerLinkActiveOptions={exact:!1};ariaCurrentWhenActive;isActiveChange=new It$1;link=g$2(Dt,{optional:!0});constructor(e,r,i,o){this.router=e,this.element=r,this.renderer=i,this.cdr=o,this.routerEventsSubscription=e.events.subscribe(s=>{s instanceof x$2&&this.update()})}ngAfterContentInit(){$r(this.links.changes,$r(null)).pipe(Gr()).subscribe(e=>{this.update(),this.subscribeToEachLinkOnChanges()})}subscribeToEachLinkOnChanges(){this.linkInputChangesSubscription?.unsubscribe();let e=[...this.links.toArray(),this.link].filter(r=>!!r).map(r=>r.onChanges);this.linkInputChangesSubscription=nt$1(e).pipe(Gr()).subscribe(r=>{this._isActive!==this.isLinkActive(this.router)(r)&&this.update()})}set routerLinkActive(e){if(e==null){this.classes=[];return}let r=Array.isArray(e)?e:e.split(` `);this.classes=r.filter(i=>!!i)}ngOnChanges(e){this.update()}ngOnDestroy(){this.routerEventsSubscription.unsubscribe(),this.linkInputChangesSubscription?.unsubscribe()}update(){!this.links||!this.router.navigated||this.routerLinkActiveOptions===null&&!this._isActive||queueMicrotask(()=>{let e=this.hasActiveLinks();this.classes.forEach(r=>{e?this.renderer.addClass(this.element.nativeElement,r):this.renderer.removeClass(this.element.nativeElement,r)}),e&&this.ariaCurrentWhenActive!==void 0?this.renderer.setAttribute(this.element.nativeElement,`aria-current`,this.ariaCurrentWhenActive.toString()):this.renderer.removeAttribute(this.element.nativeElement,`aria-current`),this._isActive!==e&&(this._isActive=e,this.cdr.markForCheck(),this.isActiveChange.emit(e))})}isLinkActive(e){let r=this.routerLinkActiveOptions;if(r===null)return()=>!1;let i;return r===void 0?i=l$1({},ve):Do(r)?i=r:r.exact??!1?i=l$1({},dr):i=l$1({},ve),o=>{let s=o.urlTree;return s?ie$3(hr(s,e,i)):!1}}hasActiveLinks(){let e=this.isLinkActive(this.router);return this.link&&e(this.link)||this.links.some(e)}static ɵfac=function(r){return new(r||t)(Gn$1(ue),Gn$1(Hn$1),Gn$1(Ao$1),Gn$1(oD))};static ɵdir=ad({type:t,selectors:[[``,`routerLinkActive`,``]],contentQueries:function(r,i,o){if(r&1&&qy(o,Dt,5),r&2){let s;XS(s=JS())&&(i.links=s)}},inputs:{routerLinkActiveOptions:`routerLinkActiveOptions`,ariaCurrentWhenActive:`ariaCurrentWhenActive`,routerLinkActive:`routerLinkActive`},outputs:{isActiveChange:`isActiveChange`},exportAs:[`routerLinkActive`],features:[rl]})}return t})();function Do(t){let n=t;return!!(n.paths||n.matrixParams||n.queryParams||n.fragment)}var Zn=new E$4(``);var _o=(()=>{class t{options;routerEventsSubscription;scrollEventsSubscription;lastId=0;lastSource=pe$2;restoredId=0;store={};isHydrating=g$2(Fo,{optional:!0})??!1;urlSerializer=g$2(ce$2);zone=g$2(ue$1);viewportScroller=g$2(RU);transitions=g$2(Cr);constructor(e){this.options=e,this.options.scrollPositionRestoration||=`disabled`,this.options.anchorScrolling||=`disabled`,this.isHydrating&&g$2(Ve$1).whenStable().then(()=>{this.isHydrating=!1})}init(){this.options.scrollPositionRestoration!==`disabled`&&this.viewportScroller.setHistoryScrollRestoration(`manual`),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.transitions.events.subscribe(e=>{e instanceof J$3?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=e.navigationTrigger,this.restoredId=e.restoredState?e.restoredState.navigationId:0):e instanceof x$2?(this.lastId=e.id,this.scheduleScrollEvent(e,this.urlSerializer.parse(e.urlAfterRedirects).fragment)):e instanceof H$2&&e.code===me$1.IgnoredSameUrlNavigation&&(this.lastSource=void 0,this.restoredId=0,this.scheduleScrollEvent(e,this.urlSerializer.parse(e.url).fragment))})}consumeScrollEvents(){return this.transitions.events.subscribe(e=>{if(!(e instanceof ye$1)||e.scrollBehavior===`manual`)return;let r={behavior:`instant`};e.position?this.options.scrollPositionRestoration===`top`?this.viewportScroller.scrollToPosition([0,0],r):this.options.scrollPositionRestoration===`enabled`&&this.viewportScroller.scrollToPosition(e.position,r):e.anchor&&this.options.anchorScrolling===`enabled`?this.viewportScroller.scrollToAnchor(e.anchor):this.options.scrollPositionRestoration!==`disabled`&&this.viewportScroller.scrollToPosition([0,0])})}scheduleScrollEvent(e,r){if(this.isHydrating)return;let i=ie$3(this.transitions.currentNavigation)?.extras.scroll;this.zone.runOutsideAngular(async()=>{await new Promise(o=>{setTimeout(o),typeof requestAnimationFrame<`u`&&requestAnimationFrame(o)}),this.zone.run(()=>{this.transitions.events.next(new ye$1(e,this.lastSource===`popstate`?this.store[this.restoredId]:null,r,i))})})}ngOnDestroy(){this.routerEventsSubscription?.unsubscribe(),this.scrollEventsSubscription?.unsubscribe()}static ɵfac=function(r){tb()};static ɵprov=A$2({token:t,factory:t.ɵfac})}return t})();function Uo(t,...n){return at$2([{provide:Ve,multi:!0,useValue:t},{provide:G$2,useFactory:Oo},{provide:kt$1,multi:!0,useFactory:Lo},n.map(e=>e.ɵproviders)])}function Oo(){return g$2(ue).routerState.root}function br(t,n){return{ɵkind:t,ɵproviders:n}}function Po(t={}){return br(4,[{provide:Zn,useFactory:()=>new _o(t)}])}function Lo(){let t=g$2(ce$3);return n=>{let e=t.get(Ve$1);if(n!==e.components[0])return;let r=t.get(ue),i=t.get(jo);t.get(xo)===1&&r.initialNavigation(),t.get(ko,null,{optional:!0})?.setUpPreloading(),t.get(Zn,null,{optional:!0})?.init(),r.resetRootComponentType(e.componentTypes[0]),i.closed||(i.next(),i.complete(),i.unsubscribe())}}var jo=new E$4(``,{factory:()=>new we$2});var xo=new E$4(``,{factory:()=>1});var ko=new E$4(``);function $o(t){return br(7,[{provide:Sr,useValue:t}])}function zo(t={}){return br(8,[{provide:He,useFactory:()=>new _n(t,g$2(yr,{optional:!0}))}])}var Ne=(t,i,n)=>{if(!Number.isSafeInteger(t))throw new RangeError(`money.invalid_minor_units`);let a=new Intl.NumberFormat(i,{style:`currency`,currency:n}),s=a.resolvedOptions().maximumFractionDigits;if(s===void 0)throw new RangeError(`money.currency_precision_missing`);let de=BigInt(Math.abs(t)),ue=10n**BigInt(s),pe=`${t<0?`-`:``}${de/ue}`,De=s===0?pe:`${pe}.${String(de%ue).padStart(s,`0`)}`;return a.format(De)};var y$1={fr:{"notice.dismiss":`Fermer le message`,"shell.contact":`Contact`,"shell.contactEmail":`contact@froment.software`,"shell.nowLive":`NOW LIVE!`,"shell.underConstruction":`UNDER CONSTRUCTION`,"shell.environment.development":`DEVELOPMENT`,"shell.environment.developmentName":`Environnement de développement`,"shell.environment.staging":`STAGING`,"shell.environment.stagingName":`Environnement de préproduction`,"shell.construction.kicker":`EN CONSTRUCTION`,"shell.construction.title":`Ouverture prochaine`,"shell.construction.description":`Froment Software prend forme. Le site complet sera bientôt disponible.`,"about.faq.label":`FAQ`,"backOffice.billing.summary":`Résumé`,"businessCard.defaultName":`Sacha Froment`,"businessCard.defaultRole":`Ingénieur logiciel`,"businessCard.title":`Carte de visite`,"businessCard.print":`Imprimer ou exporter en PDF`,"businessCard.preview":`Aperçu recto-verso de la carte de visite`,"businessCard.front":`Recto`,"businessCard.backSide":`Verso`,"businessCard.edit":`Personnaliser la carte`,"businessCard.editIntro":`Les modifications apparaissent directement dans l’aperçu.`,"businessCard.name":`Nom`,"businessCard.role":`Poste`,"businessCard.email":`Adresse e-mail`,"businessCard.website":`Site web`,"businessCard.brand":`Nom de marque au verso`,"businessCard.versionName":`Nom de la version`,"businessCard.save":`Enregistrer cette version`,"businessCard.contentInvalid":`Renseignez tous les champs avec une adresse e-mail valide.`,"businessCard.versionInvalid":`Renseignez le nom de la version.`,"businessCard.versions":`Versions locales`,"businessCard.versionsIntro":`Ces versions restent uniquement dans ce navigateur.`,"businessCard.delete":`Supprimer`,"businessCard.deleteLabel":`Supprimer {name}`,"businessCard.empty":`Aucune version enregistrée.`,"businessCard.nameRequired":`Le nom est requis.`,"businessCard.roleRequired":`Le poste est requis.`,"businessCard.emailRequired":`L’adresse e-mail est requise.`,"businessCard.emailInvalid":`L’adresse e-mail est invalide.`,"businessCard.websiteRequired":`Le site web est requis.`,"businessCard.brandRequired":`Le nom de marque est requis.`,"businessCard.versionRequired":`Le nom de la version est requis.`,"businessCard.saved":`Version « {name} » enregistrée dans ce navigateur.`,"businessCard.restored":`Version « {name} » restaurée.`,"businessCard.deleted":`Version « {name} » supprimée.`,"businessCard.storageError":`L’enregistrement local a échoué.`,"design.demo.variant":`Variante`,"design.demo.normal":`Normale`,"design.demo.hover":`Survol`,"design.demo.active":`Active`,"design.demo.readonly":`Lecture seule`,"design.demo.readonlyValue":`Readonly`,"design.demo.disabled":`Désactivée`,"design.demo.loading":`Chargement`,"design.demo.action":`Action`,"design.demo.iconButtons":`Boutons icône seule`,"design.demo.button":`Bouton`,"design.demo.link":`Lien`,"design.demo.icons":`Icônes`,"design.demo.render":`Rendu`,"design.demo.readonlyHint":`Cette valeur est immuable.`,"design.demo.invalid":`Invalide`,"design.demo.invalidEmail":`Saisissez une adresse électronique valide.`,"design.demo.disabledSelect":`Sélection désactivée`,"design.demo.unavailable":`Indisponible`,"design.demo.businessStatuses":`Statuts métier`,"design.demo.loadError":`Le chargement a échoué.`,"design.demo.retry":`Réessayer`,"design.demo.documentUnavailable":`Document indisponible`,"design.demo.copied":`Copié`,"design.demo.desktop":`Desktop`,"design.demo.lists":`Listes et définitions`,"design.demo.audit":`Audit logiciel`,"design.demo.tabs":`Exemple d’onglets`,"design.demo.panel":`Panneau`,"design.demo.documents":`DOCUMENTS`,"design.demo.revisions":`Révisions`,"design.demo.newRevision":`Nouvelle révision`,"design.demo.backQuotes":`← Retour aux devis`,"design.demo.editQuote":`Modifier le devis`,"design.demo.quotes":`Devis`,"design.demo.newQuote":`Nouveau devis`,"design.demo.backOfficeAccess":`Accès au back-office`,"design.demo.client":`Client Exemple`,"design.demo.save":`Enregistrer`,"design.demo.cancel":`Annuler`,"design.demo.delete":`Supprimer`,"design.demo.tabProposal":`Proposition détaillée`,"design.demo.tabDocument":`Document PDF téléchargeable`,"design.demo.tabAcceptance":`Acceptation et signature`,"design.demo.secureQuote":`DEVIS SÉCURISÉ`,"design.demo.auditTitle":`Audit et plan de rénovation`,"design.demo.parties":`Froment Software → Client Exemple`,"design.demo.reference":`Référence`,"design.demo.expiration":`Expiration`,"design.demo.orderConfirmed":`Commande confirmée`,"design.demo.orderConfirmedEyebrow":`COMMANDE CONFIRMÉE`,"design.demo.order":`Commande`,"design.demo.state":`État`,"design.demo.confirmed":`Confirmée`,"design.demo.line":`Ligne 1`,"design.demo.unitPrice":`Prix unitaire`,"design.demo.acceptance":`ACCEPTATION`,"design.demo.signQuote":`Signer le devis`,"design.demo.signIntro":`Confirmez votre identité et votre accord.`,"design.demo.fullName":`Nom complet`,"design.demo.exampleName":`Camille Exemple`,"design.demo.consent":`J’accepte ce devis.`,"design.demo.sign":`Signer et commander`,"design.demo.accepted":`Le devis est accepté`,"design.demo.acceptedDetail":`La signature et la commande sont enregistrées.`,"design.demo.version2":`Version 2`,"design.demo.version1":`Version 1`,"design.demo.date2":`21 août 2026`,"design.demo.date1":`20 août 2026`,"design.demo.documentLoading":`Chargement du document PDF…`,"design.demo.secureLink":`Lien sécurisé`,"design.demo.accessId":`Identifiant d’accès`,"blog.launch.title":`Froment Software arrive sur le marché`,"blog.launch.description":`Présentation de Froment Software, de ses missions et de sa méthode fondée sur des changements mesurables.`,"blog.launch.topic.development":`développement logiciel`,"blog.launch.topic.takeover":`reprise d’applications`,"blog.launch.topic.ci":`CI/CD`,"blog.launch.topic.nixos":`NixOS`,"blog.launch.topic.infrastructure":`infrastructure as code`,"blog.architecture.title":`De l’API au PDF : l’architecture de Froment Software`,"blog.architecture.description":`Une visite du monorepo, des contrats Effect, du modèle SQLite et de la chaîne documentaire vérifiable.`,"blog.security.title":`Sessions, jetons et audit : la sécurité de Froment Software`,"blog.security.description":`Le parcours complet d’une identité, de la connexion PASETO à la corrélation des événements d’audit.`,"blog.operations.title":`De Nix à Grafana : exploiter Froment Software en production`,"blog.operations.description":`La construction reproductible, la résolution des secrets et le trajet des journaux et traces en production.`,"blog.deployment.title":`Du commit à Nomad : une promotion vérifiable vers la production`,"blog.deployment.description":`Une chaîne de déploiement fondée sur Nix, les digests OCI, Tailscale, Nomad et des preuves de provenance.`,"blog.topic.effect":`Effect`,"blog.topic.sqlite":`SQLite`,"blog.topic.documents":`documents`,"blog.topic.security":`sécurité`,"blog.topic.authentication":`authentification`,"blog.topic.audit":`audit`,"blog.topic.nix":`Nix`,"blog.topic.secrets":`secrets`,"blog.topic.observability":`observabilité`,"blog.topic.nomad":`Nomad`,"blog.topic.supplyChain":`chaîne logicielle`,"blog.feed":`Flux Atom`,"metadata.author":`Sacha Froment`,"metadata.publisher":`Froment Software`},en:{"notice.dismiss":`Dismiss message`,"shell.contact":`Contact`,"shell.contactEmail":`contact@froment.software`,"shell.nowLive":`NOW LIVE!`,"shell.underConstruction":`UNDER CONSTRUCTION`,"shell.environment.development":`DEVELOPMENT`,"shell.environment.developmentName":`Development environment`,"shell.environment.staging":`STAGING`,"shell.environment.stagingName":`Staging environment`,"shell.construction.kicker":`UNDER CONSTRUCTION`,"shell.construction.title":`Opening soon`,"shell.construction.description":`Froment Software is taking shape. The complete site will be available soon.`,"about.faq.label":`FAQ`,"backOffice.billing.summary":`Summary`,"businessCard.defaultName":`Sacha Froment`,"businessCard.defaultRole":`Software engineer`,"businessCard.title":`Business card`,"businessCard.print":`Print or export as PDF`,"businessCard.preview":`Business card front and back preview`,"businessCard.front":`Front`,"businessCard.backSide":`Back`,"businessCard.edit":`Customize the card`,"businessCard.editIntro":`Changes appear directly in the preview.`,"businessCard.name":`Name`,"businessCard.role":`Role`,"businessCard.email":`Email address`,"businessCard.website":`Website`,"businessCard.brand":`Brand name on the back`,"businessCard.versionName":`Version name`,"businessCard.save":`Save this version`,"businessCard.contentInvalid":`Complete all fields with a valid email address.`,"businessCard.versionInvalid":`Enter the version name.`,"businessCard.versions":`Local versions`,"businessCard.versionsIntro":`These versions remain only in this browser.`,"businessCard.delete":`Delete`,"businessCard.deleteLabel":`Delete {name}`,"businessCard.empty":`No saved versions.`,"businessCard.nameRequired":`Name is required.`,"businessCard.roleRequired":`Role is required.`,"businessCard.emailRequired":`Email is required.`,"businessCard.emailInvalid":`Email is invalid.`,"businessCard.websiteRequired":`Website is required.`,"businessCard.brandRequired":`Brand name is required.`,"businessCard.versionRequired":`Version name is required.`,"businessCard.saved":`Version “{name}” saved in this browser.`,"businessCard.restored":`Version “{name}” restored.`,"businessCard.deleted":`Version “{name}” deleted.`,"businessCard.storageError":`Local storage failed.`,"design.demo.variant":`Variant`,"design.demo.normal":`Normal`,"design.demo.hover":`Hover`,"design.demo.active":`Active`,"design.demo.readonly":`Read only`,"design.demo.readonlyValue":`Readonly`,"design.demo.disabled":`Disabled`,"design.demo.loading":`Loading`,"design.demo.action":`Action`,"design.demo.iconButtons":`Icon-only buttons`,"design.demo.button":`Button`,"design.demo.link":`Link`,"design.demo.icons":`Icons`,"design.demo.render":`Rendering`,"design.demo.readonlyHint":`This value is immutable.`,"design.demo.invalid":`Invalid`,"design.demo.invalidEmail":`Enter a valid email address.`,"design.demo.disabledSelect":`Disabled selection`,"design.demo.unavailable":`Unavailable`,"design.demo.businessStatuses":`Business statuses`,"design.demo.loadError":`Loading failed.`,"design.demo.retry":`Retry`,"design.demo.documentUnavailable":`Document unavailable`,"design.demo.copied":`Copied`,"design.demo.desktop":`Desktop`,"design.demo.lists":`Lists and definitions`,"design.demo.audit":`Software audit`,"design.demo.tabs":`Tab example`,"design.demo.panel":`Panel`,"design.demo.documents":`DOCUMENTS`,"design.demo.revisions":`Revisions`,"design.demo.newRevision":`New revision`,"design.demo.backQuotes":`← Back to quotes`,"design.demo.editQuote":`Edit quote`,"design.demo.quotes":`Quotes`,"design.demo.newQuote":`New quote`,"design.demo.backOfficeAccess":`Back-office access`,"design.demo.client":`Example Client`,"design.demo.save":`Save`,"design.demo.cancel":`Cancel`,"design.demo.delete":`Delete`,"design.demo.tabProposal":`Detailed proposal`,"design.demo.tabDocument":`Downloadable PDF document`,"design.demo.tabAcceptance":`Acceptance and signature`,"design.demo.secureQuote":`SECURE QUOTE`,"design.demo.auditTitle":`Audit and renovation plan`,"design.demo.parties":`Froment Software → Example Client`,"design.demo.reference":`Reference`,"design.demo.expiration":`Expiration`,"design.demo.orderConfirmed":`Order confirmed`,"design.demo.orderConfirmedEyebrow":`ORDER CONFIRMED`,"design.demo.order":`Order`,"design.demo.state":`Status`,"design.demo.confirmed":`Confirmed`,"design.demo.line":`Line 1`,"design.demo.unitPrice":`Unit price`,"design.demo.acceptance":`ACCEPTANCE`,"design.demo.signQuote":`Sign the quote`,"design.demo.signIntro":`Confirm your identity and consent.`,"design.demo.fullName":`Full name`,"design.demo.exampleName":`Example Client`,"design.demo.consent":`I accept this quote.`,"design.demo.sign":`Sign and order`,"design.demo.accepted":`The quote is accepted`,"design.demo.acceptedDetail":`The signature and order are recorded.`,"design.demo.version2":`Version 2`,"design.demo.version1":`Version 1`,"design.demo.date2":`August 21, 2026`,"design.demo.date1":`August 20, 2026`,"design.demo.documentLoading":`Loading the PDF document…`,"design.demo.secureLink":`Secure link`,"design.demo.accessId":`Access identifier`,"blog.launch.title":`Froment Software enters the market`,"blog.launch.description":`Introducing Froment Software, its services and its method based on measurable changes.`,"blog.launch.topic.development":`software development`,"blog.launch.topic.takeover":`application takeover`,"blog.launch.topic.ci":`CI/CD`,"blog.launch.topic.nixos":`NixOS`,"blog.launch.topic.infrastructure":`infrastructure as code`,"blog.architecture.title":`From API to PDF: the Froment Software architecture`,"blog.architecture.description":`A tour of the monorepo, Effect contracts, SQLite model, and verifiable document pipeline.`,"blog.security.title":`Sessions, tokens, and audit: Froment Software security`,"blog.security.description":`The complete identity path, from PASETO login to correlated audit events.`,"blog.operations.title":`From Nix to Grafana: operating Froment Software in production`,"blog.operations.description":`Reproducible builds, secret resolution, and the path of production logs and traces.`,"blog.deployment.title":`From commit to Nomad: verifiable promotion to production`,"blog.deployment.description":`A deployment pipeline based on Nix, OCI digests, Tailscale, Nomad, and provenance records.`,"blog.topic.effect":`Effect`,"blog.topic.sqlite":`SQLite`,"blog.topic.documents":`documents`,"blog.topic.security":`security`,"blog.topic.authentication":`authentication`,"blog.topic.audit":`audit`,"blog.topic.nix":`Nix`,"blog.topic.secrets":`secrets`,"blog.topic.observability":`observability`,"blog.topic.nomad":`Nomad`,"blog.topic.supplyChain":`software supply chain`,"blog.feed":`Atom feed`,"metadata.author":`Sacha Froment`,"metadata.publisher":`Froment Software`}};var C$1={fr:{"connections.title":`Connexions aux services`,"connections.intro":`Raccordez les prestataires, vérifiez leurs accès et suivez les opérations sans modifier vos documents existants.`,"connections.safety":`Les opérations commerciales et les relances restent simulées. Seul le test Resend ci-dessous peut envoyer un vrai courriel.`,"connections.credentialsHint":`Une clé présente ne confirme pas sa validité. Les clés restent sur le serveur, dans le profil SOPS utilisé au démarrage.`,"connections.provider":`Prestataire`,"connections.usage":`Utilisation`,"connections.credentials":`Identifiants`,"connections.mode":`Mode actuel`,"connections.action":`Parcours`,"connections.present":`Présents sur le serveur`,"connections.missing":`À renseigner dans SOPS`,"connections.restricted":`Test à destinataire limité`,"connections.notConnected":`Pas encore raccordé`,"connections.resend":`Resend`,"connections.stripe":`Stripe`,"connections.signwell":`SignWell`,"connections.superpdp":`SUPER PDP`,"connections.email":`Courriels transactionnels`,"connections.payment":`Paiements par carte — mode test`,"connections.signature":`Signatures électroniques — mode test`,"connections.electronicInvoice":`Factures électroniques — bac à sable`,"connections.openResend":`Vérifier Resend`,"connections.pending":`Connecteur en préparation`,"connections.reload":`Actualiser les accès`,"connections.loading":`Chargement des connexions…`,"connections.error":`Impossible de charger la configuration des connexions. Réessayez le chargement.`,"connections.simulations":`Ouvrir les simulations et leur historique`,"connections.back":`Retour aux connexions`,"connections.breadcrumb":`Navigation des services`,"connections.bank":`La banque reste indépendante : les imports CSV et les rapprochements restent disponibles.`,"emailTest.title":`Resend — vérifier l’envoi`,"emailTest.intro":`Préparez un message de test, vérifiez son aperçu, puis suivez sa prise en charge et sa remise.`,"emailTest.safety":`Ce test envoie un vrai courriel, uniquement à sacha@sacha.house. Il n’active ni les envois clients ni les relances.`,"emailTest.routing":`1. Vérifier les adresses`,"emailTest.from":`Expéditeur`,"emailTest.replyTo":`Réponses vers`,"emailTest.recipient":`Destinataire autorisé`,"emailTest.routingHint":`Ces adresses sont imposées par le serveur. Aucun destinataire en copie ni aucune pièce jointe ne sont ajoutés.`,"emailTest.compose":`2. Préparer le message`,"emailTest.subject":`Objet`,"emailTest.subjectHint":`160 caractères maximum. Le serveur ajoute « [Test] » au début de l’objet.`,"emailTest.body":`Message`,"emailTest.bodyHint":`Texte brut, 20 000 caractères maximum. Les sauts de ligne sont conservés.`,"emailTest.subjectInvalid":`Saisissez un objet de 1 à 160 caractères, sans saut de ligne.`,"emailTest.bodyInvalid":`Saisissez un message de 1 à 20 000 caractères.`,"emailTest.preview":`Aperçu du courriel`,"emailTest.send":`Envoyer le test`,"emailTest.saving":`Enregistrer le test…`,"emailTest.confirm":`Envoyer ce vrai courriel de test à sacha@sacha.house ? Les autres envois resteront simulés.`,"emailTest.unsaved":`Quitter ce message de test sans enregistrer vos modifications ?`,"emailTest.defaultSubject":`Vérification de la connexion Resend`,"emailTest.defaultBody":`Bonjour Sacha,
2
2
 
3
3
  Ce message v\xE9rifie l\u2019envoi depuis froment.software avec Resend.
4
4
  Les envois clients et les relances restent simul\xE9s.
@@ -8,7 +8,7 @@ Vous pouvez r\xE9pondre \xE0 ce message pour v\xE9rifier le retour vers la bo\xE
8
8
  This message checks email sending from froment.software through Resend.
9
9
  Customer emails and reminders remain simulated.
10
10
 
11
- Reply to this message to check routing to the Tuta mailbox.`,"emailTest.progress":`3. Track the test`,"emailTest.status":`Test status`,"emailTest.pendingRequest":`Recording is not yet confirmed. The content is locked. Refresh the status or resume the same request.`,"emailTest.resume":`Resume the same request`,"emailTest.recoveryUnavailable":`Local recovery is unavailable. Check account access and browser session storage, then refresh the status. No new send starts without this record.`,"emailTest.recoveryHint":`An unanswered request stays in this tab after a reload, including its content. Server confirmation removes it. Unsubmitted drafts are not retained.`,"emailTest.historyUnavailable":`History unavailable. Refresh the status before concluding that no test exists.`,"emailTest.live":`Status refreshes every 3 seconds. The server continues the test when you leave this page.`,"emailTest.paused":`Status refresh paused. The last data remains visible; the server continues the test. Refresh to resume.`,"emailTest.refresh":`Refresh test status`,"emailTest.empty":`No test recorded.`,"emailTest.queued":`Recorded — waiting to send`,"emailTest.sending":`Sending`,"emailTest.retrying":`Retry scheduled`,"emailTest.accepted":`Accepted by Resend — delivery unconfirmed`,"emailTest.delivered":`Delivery confirmed by Resend`,"emailTest.bounced":`Rejected by the recipient server`,"emailTest.complained":`Reported as spam`,"emailTest.failed":`Test stopped after an error`,"emailTest.blocked":`Test blocked before sending`,"emailTest.acceptedHint":`API acceptance does not prove receipt. “Delivery confirmed” means the recipient server accepted the email.`,"emailTest.failureHint":`Check the test details and Resend log before sending another email. A lost network response can hide an accepted send.`,"emailTest.attempts":`Send attempts`,"emailTest.nextAttempt":`Next check or attempt`,"emailTest.providerId":`Resend identifier`,"emailTest.requestId":`Request identifier`,"emailTest.updatedAt":`Last checked`,"emailTest.createdAt":`Recorded at`,"emailTest.history":`Test history`,"emailTest.historyHint":`Requests and their content are retained. A retry uses the same request; it does not create a new message.`,"emailTest.details":`View test`,"emailTest.error":`Recording the test is unconfirmed. Refresh the status or resume the same request.`,"emailTest.credentialsMissing":`Resend key missing. Set RESEND_API_KEY in the active SOPS profile, then restart the application.`,"emailTest.credentialsChanged":`The key used for this test has changed. Check the Resend account log associated with the previous key before sending another email.`,"emailTest.permissionRevoked":`The account that started the test is no longer authorized to continue automatic processing. Check the test status before sending another email.`,"emailTest.rejected":`Resend rejected the request. Check the key, its permissions and verification of mail.froment.software in Resend.`,"emailTest.rateLimited":`Resend is limiting requests. The server waits before trying again, up to five attempts.`,"emailTest.unavailable":`Resend did not confirm the request. Check the status and Resend log before sending another email.`,"emailTest.expired":`The safe retry window has expired. Check the Resend log; this message will not be sent again automatically.`,"emailTest.statusUnavailable":`Email delivery is unconfirmed. Check the Resend log.`,"emailTest.conflict":`This request exists with different content or a different author. Refresh test status before continuing.`,"emailTest.active":`A test is already waiting to send. Wait for it to finish and check its status.`,"emailTest.limit":`The limit of 100 retained tests has been reached. Check the history; no new message was created.`}};var T$3={fr:{providerConnections:{summary:`Lire les accès des prestataires`,description:`Indique la présence des identifiants dans le profil actif, sans exposer leurs valeurs ni appeler les prestataires.`},emailTestList:{summary:`Consulter les tests Resend`,description:`Liste les demandes conservées et leur état durable. Une acceptation par Resend ne prouve pas la remise du courriel.`},emailTestCreate:{summary:`Programmer un vrai courriel de test`,description:`Enregistre la demande avant tout appel externe. Le serveur impose le destinataire sacha@sacha.house. Les courriels clients restent simulés. Réutilisez le même UUID et le même contenu après une réponse incertaine.`}},en:{providerConnections:{summary:`Read provider access status`,description:`Reports credential presence in the active profile without exposing values or calling providers.`},emailTestList:{summary:`List Resend tests`,description:`Lists retained requests and their durable state. Resend acceptance does not prove email delivery.`},emailTestCreate:{summary:`Queue a real test email`,description:`Records the request before any external call. The server enforces sacha@sacha.house as the recipient. Customer emails remain simulated. Reuse the same UUID and content after an uncertain response.`}}};var x$1={fr:{"checkout.openSettings":`Tester Stripe Checkout`,"checkout.title":`Stripe Checkout — mode test`,"checkout.intro":`Créez une page de paiement hébergée à partir du solde d’une facture émise. Suivez ensuite le résultat du test.`,"checkout.safety":`Aucun argent réel ne circule. Un paiement de test ne solde pas la facture et ne crée aucun encaissement local.`,"checkout.connection":`1. Vérifier les accès`,"checkout.loading":`Chargement des accès et des factures…`,"checkout.key":`Clé Stripe`,"checkout.testKey":`Clé de test présente. Sa présence ne prouve pas sa validité.`,"checkout.webhook":`Notifications Stripe`,"checkout.webhookPresent":`Secret de signature présent. La réception des notifications reste à vérifier.`,"checkout.webhookAbsent":`Secret de signature absent. Le suivi fonctionne par interrogation de Stripe.`,"checkout.polling":`Le serveur consulte Stripe toutes les 30 secondes. Une notification signée déclenche une vérification anticipée.`,"checkout.refresh":`Actualiser les accès et le suivi`,"checkout.reconcile":`Vérifier la session auprès de Stripe`,"checkout.reconcileUnconfirmed":`Le résultat de cette vérification reste à confirmer. Actualisez le suivi de cette session Stripe.`,"checkout.reconcileHint":`Le suivi automatique est arrêté. Cette action consulte uniquement la session existante avec la clé de test actuelle. Elle ne crée aucun paiement.`,"checkout.reconcileDenied":`Votre compte ne permet pas de vérifier cette session Stripe. Les permissions de configuration des connexions et de lecture des factures sont requises.`,"checkout.notFound":`Cette demande Stripe n’existe pas.`,"checkout.statusWindowExceeded":`La période de suivi automatique est terminée. Le résultat reste inconnu. Vous pouvez demander une vérification de la session existante.`,"checkout.prepare":`2. Préparer la page de paiement`,"checkout.invoice":`Facture`,"checkout.chooseInvoice":`Choisir une facture émise`,"checkout.invoiceHint":`Les factures éligibles sont émises, sans avoir, avec un solde compris entre 0,50 € et 999 999,99 €. Le serveur vérifie à nouveau le solde.`,"checkout.noInvoices":`Aucune facture éligible. Émettez une facture avec un solde restant, puis actualisez cette page.`,"checkout.invoiceRequired":`Choisissez une facture éligible avant de créer la page de paiement.`,"checkout.amount":`Montant du test`,"checkout.client":`Client de la facture`,"checkout.total":`Total de la facture`,"checkout.recordedPaid":`Encaissements locaux actifs`,"checkout.version":`Version de la facture`,"checkout.viewInvoice":`Consulter la facture`,"checkout.transmitted":`Stripe reçoit le numéro de facture, le montant, les identifiants de suivi et l’adresse de test sacha@sacha.house. Les coordonnées du client restent locales.`,"checkout.create":`Créer la page de test`,"checkout.saving":`Enregistrement…`,"checkout.retryRequest":`Reprendre la même demande`,"checkout.confirm":`Créer une page Stripe en mode test avec le solde affiché ? Aucun encaissement réel ne sera enregistré.`,"checkout.pending":`L’enregistrement reste à confirmer. Le choix de facture est verrouillé et conservé dans cet onglet après rechargement. Actualisez le suivi ou reprenez la même demande.`,"checkout.recoveryUnavailable":`La reprise locale est indisponible. Vérifiez la connexion au compte et le stockage de session du navigateur, puis actualisez le suivi. Aucune nouvelle création ne démarre sans cet enregistrement.`,"checkout.progress":`3. Suivre le test`,"checkout.paused":`L’actualisation du suivi est suspendue. Les dernières données restent affichées. Actualisez le suivi pour réessayer.`,"checkout.noTests":`Aucune page de paiement de test enregistrée.`,"checkout.historyLoading":`Chargement des tests enregistrés…`,"checkout.historyUnknown":`Historique indisponible. Actualisez le suivi.`,"checkout.requestNotFound":`Cette demande ne figure pas dans l’historique chargé. Vérifiez son identifiant et actualisez le suivi.`,"checkout.queued":`Demande enregistrée`,"checkout.creating":`Création chez Stripe en cours`,"checkout.retrying":`Nouvelle tentative programmée`,"checkout.open":`Page créée — paiement non confirmé`,"checkout.paid":`Paiement de test confirmé par Stripe`,"checkout.expired":`Expiration confirmée par Stripe`,"checkout.failed":`Création échouée`,"checkout.blocked":`Création bloquée`,"checkout.attempts":`Tentatives de création`,"checkout.expiresAt":`Expiration prévue`,"checkout.updatedAt":`Dernière mise à jour du suivi`,"checkout.nextAttempt":`Prochaine vérification ou tentative`,"checkout.openStripe":`Ouvrir Stripe — nouvel onglet`,"checkout.testCard":`Dans Stripe, utilisez la carte de test 4242 4242 4242 4242, une date future et trois chiffres quelconques. N’utilisez aucune vraie carte.`,"checkout.returnHint":`Fermer Stripe ou revenir ici ne confirme ni le paiement ni l’annulation. Le serveur vérifie le résultat auprès de Stripe.`,"checkout.identifiers":`Identifiants de suivi`,"checkout.requestId":`Demande locale`,"checkout.sessionId":`Session Stripe`,"checkout.history":`Historique des tests`,"checkout.createdAt":`Créé le`,"checkout.historyHint":`L’installation conserve jusqu’à 100 demandes. Chaque nouvelle demande crée un nouveau test. Les tests restent séparés de l’historique financier.`,"checkout.status":`État du test`,"checkout.details":`Détails`,"checkout.detailsFor":`Afficher le test de la facture {invoice}`,"checkout.unsaved":`Quitter ce formulaire ? Le choix non soumis sera perdu. Une demande déjà enregistrée continuera sur le serveur.`,"checkout.credentialsMissing":`La clé Stripe manque. Renseignez STRIPE_SECRET_KEY dans le profil SOPS actif, puis redémarrez le serveur.`,"checkout.testKeyRequired":`Cette clé n’est pas une clé de test. Le serveur interdit les appels Stripe réels. Utilisez une clé sk_test_ ou rk_test_.`,"checkout.credentialsChanged":`La clé utilisée pour ce test a changé. Vérifiez le test dans le compte Stripe associé à la clé précédente.`,"checkout.permissionRevoked":`Le compte à l’origine du test n’est plus autorisé à poursuivre le traitement automatique. Consultez le résultat dans Stripe.`,"checkout.invoiceChanged":`Le solde ou l’état de la facture a changé. Consultez la facture avant de préparer un nouveau test.`,"checkout.deadline":`La reprise n’est plus autorisée. Vérifiez les sessions Stripe avant de créer un nouveau test.`,"checkout.unavailable":`Stripe n’a pas confirmé la création. Le serveur conserve la demande. Consultez les tentatives avant de créer un nouveau test.`,"checkout.rejected":`Stripe a refusé la demande. Vérifiez les droits de la clé et les journaux Stripe.`,"checkout.rateLimited":`Stripe limite les appels. Le serveur conserve la même demande pour la prochaine tentative.`,"checkout.statusUnavailable":`Le résultat Stripe reste à confirmer. Consultez Stripe et vérifiez les accès. Aucun paiement local n’a été enregistré.`,"checkout.responseMismatch":`La réponse Stripe ne correspond pas à la demande de test. Le serveur arrête la création. Consultez les journaux Stripe.`,"checkout.conflict":`Cette demande existe avec un autre contenu ou un autre auteur. Actualisez l’historique avant de poursuivre.`,"checkout.active":`Un test reste actif pour cette facture. Consultez son suivi avant de créer une autre page.`,"checkout.limit":`La limite de 100 tests est atteinte. Consultez l’historique existant.`,"checkout.invoiceIneligible":`La facture n’est plus éligible ou sa version a changé. Actualisez la liste et vérifiez son solde.`,"checkout.error":`Le résultat de la demande reste à confirmer. Actualisez le suivi ou reprenez la même demande pour éviter les doublons.`,"checkout.loadError":`Impossible de charger les accès ou les factures. Actualisez cette page avant de créer un test.`},en:{"checkout.openSettings":`Test Stripe Checkout`,"checkout.title":`Stripe Checkout — test mode`,"checkout.intro":`Create a hosted payment page from an issued invoice’s balance. Then track the test result.`,"checkout.safety":`No real money moves. A test payment does not settle the invoice or create a local receipt.`,"checkout.connection":`1. Check access`,"checkout.loading":`Loading access status and invoices…`,"checkout.key":`Stripe key`,"checkout.testKey":`Test key present. Its presence does not prove its validity.`,"checkout.webhook":`Stripe notifications`,"checkout.webhookPresent":`Signing secret present. Notification delivery still needs verification.`,"checkout.webhookAbsent":`Signing secret absent. The server tracks the session by polling Stripe.`,"checkout.polling":`The server checks Stripe every 30 seconds. A signed notification triggers an earlier check.`,"checkout.refresh":`Refresh access and status`,"checkout.reconcile":`Check the session with Stripe`,"checkout.reconcileUnconfirmed":`The result of this check is unconfirmed. Refresh the status of this Stripe session.`,"checkout.reconcileHint":`Automatic tracking has stopped. This action only reads the existing session with the current test key. It creates no payment.`,"checkout.reconcileDenied":`Your account cannot check this Stripe session. Connection configuration and invoice read permissions are required.`,"checkout.notFound":`This Stripe request does not exist.`,"checkout.statusWindowExceeded":`The automatic tracking period has ended. The result remains unknown. You can request a check of the existing session.`,"checkout.prepare":`2. Prepare the payment page`,"checkout.invoice":`Invoice`,"checkout.chooseInvoice":`Choose an issued invoice`,"checkout.invoiceHint":`Eligible invoices are issued, have no credit note, and have a balance from €0.50 to €999,999.99. The server checks the balance again.`,"checkout.noInvoices":`No eligible invoice. Issue an invoice with an outstanding balance, then refresh this page.`,"checkout.invoiceRequired":`Choose an eligible invoice before creating the payment page.`,"checkout.amount":`Test amount`,"checkout.client":`Invoice client`,"checkout.total":`Invoice total`,"checkout.recordedPaid":`Active local receipts`,"checkout.version":`Invoice version`,"checkout.viewInvoice":`View invoice`,"checkout.transmitted":`Stripe receives the invoice number, amount, tracking identifiers and test address sacha@sacha.house. Client contact details stay local.`,"checkout.create":`Create test page`,"checkout.saving":`Recording…`,"checkout.retryRequest":`Resume the same request`,"checkout.confirm":`Create a Stripe test page with the displayed balance? No real receipt will be recorded.`,"checkout.pending":`Recording is not yet confirmed. The invoice choice is locked and retained in this tab after a reload. Refresh the status or resume the same request.`,"checkout.recoveryUnavailable":`Local recovery is unavailable. Check account access and browser session storage, then refresh the status. No new creation starts without this record.`,"checkout.progress":`3. Track the test`,"checkout.paused":`Status updates are paused. The last data remains visible. Refresh the status to try again.`,"checkout.noTests":`No test payment page recorded.`,"checkout.historyLoading":`Loading recorded tests…`,"checkout.historyUnknown":`History unavailable. Refresh the status.`,"checkout.requestNotFound":`This request is not in the loaded history. Check its identifier and refresh the status.`,"checkout.queued":`Request recorded`,"checkout.creating":`Creating page in Stripe`,"checkout.retrying":`Retry scheduled`,"checkout.open":`Page created — payment unconfirmed`,"checkout.paid":`Test payment confirmed by Stripe`,"checkout.expired":`Expiration confirmed by Stripe`,"checkout.failed":`Creation failed`,"checkout.blocked":`Creation blocked`,"checkout.attempts":`Creation attempts`,"checkout.expiresAt":`Scheduled expiration`,"checkout.updatedAt":`Last status update`,"checkout.nextAttempt":`Next check or attempt`,"checkout.openStripe":`Open Stripe — new tab`,"checkout.testCard":`In Stripe, use test card 4242 4242 4242 4242, a future date and any three digits. Do not use a real card.`,"checkout.returnHint":`Closing Stripe or returning here does not confirm payment or cancellation. The server checks the result with Stripe.`,"checkout.identifiers":`Tracking identifiers`,"checkout.requestId":`Local request`,"checkout.sessionId":`Stripe session`,"checkout.history":`Test history`,"checkout.createdAt":`Created`,"checkout.historyHint":`The installation retains up to 100 requests. Each new request creates a new test. Tests stay separate from financial history.`,"checkout.status":`Test status`,"checkout.details":`Details`,"checkout.detailsFor":`Show test for invoice {invoice}`,"checkout.unsaved":`Leave this form? The unsubmitted choice will be lost. Any recorded request will continue on the server.`,"checkout.credentialsMissing":`The Stripe key is missing. Set STRIPE_SECRET_KEY in the active SOPS profile, then restart the server.`,"checkout.testKeyRequired":`This is not a test key. The server blocks live Stripe calls. Use an sk_test_ or rk_test_ key.`,"checkout.credentialsChanged":`The key used for this test has changed. Check the test in the Stripe account associated with the previous key.`,"checkout.permissionRevoked":`The account that started the test is no longer authorized to continue automatic processing. Check the result in Stripe.`,"checkout.invoiceChanged":`The invoice balance or status changed. Check the invoice before preparing another test.`,"checkout.deadline":`This request cannot be retried. Check Stripe sessions before creating a new test.`,"checkout.unavailable":`Stripe did not confirm creation. The server retains the request. Check its attempts before creating a new test.`,"checkout.rejected":`Stripe rejected the request. Check key permissions and Stripe logs.`,"checkout.rateLimited":`Stripe is limiting calls. The server retains the same request for the next attempt.`,"checkout.statusUnavailable":`The Stripe result is unconfirmed. Check Stripe and access permissions. No local payment was recorded.`,"checkout.responseMismatch":`The Stripe response does not match the test request. The server stops creation. Check Stripe logs.`,"checkout.conflict":`This request exists with different content or a different author. Refresh history before continuing.`,"checkout.active":`A test remains active for this invoice. Check its status before creating another page.`,"checkout.limit":`The limit of 100 tests is reached. Check the existing history.`,"checkout.invoiceIneligible":`The invoice is no longer eligible or its version changed. Refresh the list and check its balance.`,"checkout.error":`The request result is unconfirmed. Refresh the status or resume the same request to prevent duplicates.`,"checkout.loadError":`Cannot load access status or invoices. Refresh this page before creating a test.`}};var w$4={fr:{checkoutConnection:{summary:`Lire les accès Stripe`,description:`Indique la présence de la clé de test et du secret de webhook. Aucun appel Stripe n’est effectué.`},checkoutList:{summary:`Consulter les pages de paiement de test`,description:`Liste les demandes et leurs états durables. Un paiement de test ne crée aucun encaissement local.`},checkoutCreate:{summary:`Préparer un Checkout Stripe de test`,description:`Fige le solde de la version émise, puis programme la création. Réutilisez le même UUID après une réponse incertaine. Le serveur refuse les clés réelles.`},checkoutReconcile:{summary:`Vérifier une session de test après arrêt du suivi`,description:`Consulte uniquement la session existante avec la clé de test actuelle. Vérifie les droits du demandeur et les données de session. Ne crée aucun paiement.`}},en:{checkoutConnection:{summary:`Read Stripe access status`,description:`Reports the test key and webhook secret presence. Does not call Stripe.`},checkoutList:{summary:`List test payment pages`,description:`Lists requests and their durable states. A test payment creates no local receipt.`},checkoutCreate:{summary:`Prepare a test Stripe Checkout`,description:`Freezes the issued version’s balance, then queues creation. Reuse the same UUID after an uncertain response. The server rejects live keys.`},checkoutReconcile:{summary:`Check a test session after tracking stops`,description:`Only reads the existing session with the current test key. Checks caller permissions and session data. Creates no payment.`}}};var A$1={fr:{"shell.loading":`Chargement de la page…`,"shell.loadError":`Le chargement de la page n’a pas abouti. Rechargez la page pour réessayer.`,"shell.navigationUnavailable":`La navigation est indisponible. Rechargez la page pour réessayer.`,"shell.reload":`Recharger la page`,"backOfficeShell.activity":`Activité`,"backOfficeShell.administration":`Administration`,"backOfficeShell.apiAccess":`API`,"backOfficeShell.externalServices":`Services externes`,"backOfficeShell.audit":`Journal d’audit`,"backOfficeShell.navigation":`Navigation`,"backOfficeShell.breadcrumb":`Fil d’Ariane`,"backOfficeShell.accountLoading":`Chargement du compte…`,"backOfficeShell.signingOut":`Déconnexion en cours…`,"backOfficeShell.signOutError":`Le serveur n’a pas confirmé la déconnexion. Réessayez.`,"backOfficeShell.openLogin":`Ouvrir la page de connexion`,"backOfficeShell.accountUnavailable":`Les informations du compte sont indisponibles.`,"backOfficeShell.closeNavigation":`Fermer la navigation`,"backOfficeShell.resources":`Ressources`,"backOfficeShell.api":`Documentation API`,"backOfficeShell.apiNewTab":`Documentation API — nouvel onglet`,"backOfficeShell.website":`Site public`,"backOfficeShell.drawerDemo":`Ouvrir le tiroir de navigation`,"backOfficeShell.drawerDescription":`Le tiroir conserve le focus et se ferme avec Échap. La navigation reste disponible sur les écrans étroits.`},en:{"shell.loading":`Loading page…`,"shell.loadError":`The page did not load. Reload the page to try again.`,"shell.navigationUnavailable":`Navigation is unavailable. Reload the page to try again.`,"shell.reload":`Reload page`,"backOfficeShell.activity":`Business`,"backOfficeShell.administration":`Administration`,"backOfficeShell.apiAccess":`API`,"backOfficeShell.externalServices":`External services`,"backOfficeShell.audit":`Audit log`,"backOfficeShell.navigation":`Navigation`,"backOfficeShell.breadcrumb":`Breadcrumb`,"backOfficeShell.accountLoading":`Loading account…`,"backOfficeShell.signingOut":`Signing out…`,"backOfficeShell.signOutError":`The server did not confirm sign-out. Try again.`,"backOfficeShell.openLogin":`Open the sign-in page`,"backOfficeShell.accountUnavailable":`Account information is unavailable.`,"backOfficeShell.closeNavigation":`Close navigation`,"backOfficeShell.resources":`Resources`,"backOfficeShell.api":`API documentation`,"backOfficeShell.apiNewTab":`API documentation — new tab`,"backOfficeShell.website":`Public website`,"backOfficeShell.drawerDemo":`Open navigation drawer`,"backOfficeShell.drawerDescription":`The drawer contains keyboard focus and closes with Escape. Navigation remains available on narrow screens.`}};var O$3={fr:{"clientsWorkspace.listIntro":`Retrouvez les coordonnées, les documents et les accès de chaque client.`,"clientsWorkspace.search":`Rechercher un client`,"clientsWorkspace.count.one":`{count} client`,"clientsWorkspace.count.other":`{count} clients`,"clientsWorkspace.cancel":`Annuler`,"clientsWorkspace.noMatches":`Aucun client ne correspond à la recherche`,"clientsWorkspace.changeSearch":`Modifiez la recherche ou consultez un autre onglet.`,"clientsWorkspace.clearSearch":`Effacer la recherche`,"clientsWorkspace.emptyIntro":`Créez un client pour préparer ses documents commerciaux.`,"clientsWorkspace.notProvided":`Non renseigné`,"clientsWorkspace.edit":`Modifier les coordonnées`,"clientsWorkspace.identity":`Identité et contact`,"clientsWorkspace.address":`Adresse de facturation`,"clientsWorkspace.formIntro":`Le nom suffit pour créer un client. Complétez les coordonnées avant de publier un document.`,"clientsWorkspace.editIntro":`Les modifications ne changent pas les documents déjà publiés.`,"clientsWorkspace.backToClient":`Retour à la fiche client`,"clientsWorkspace.documentsIntro":`Consultez les devis, les commandes et les factures associés à ce client.`},en:{"clientsWorkspace.listIntro":`Find each client’s contact details, documents, and access accounts.`,"clientsWorkspace.search":`Search clients`,"clientsWorkspace.count.one":`{count} client`,"clientsWorkspace.count.other":`{count} clients`,"clientsWorkspace.cancel":`Cancel`,"clientsWorkspace.noMatches":`No clients match the search`,"clientsWorkspace.changeSearch":`Change the search or select another tab.`,"clientsWorkspace.clearSearch":`Clear search`,"clientsWorkspace.emptyIntro":`Create a client to prepare their commercial documents.`,"clientsWorkspace.notProvided":`Not provided`,"clientsWorkspace.edit":`Edit contact details`,"clientsWorkspace.identity":`Identity and contact`,"clientsWorkspace.address":`Billing address`,"clientsWorkspace.formIntro":`A name is enough to create a client. Complete the contact details before publishing a document.`,"clientsWorkspace.editIntro":`Changes do not alter documents that are already published.`,"clientsWorkspace.backToClient":`Back to client details`,"clientsWorkspace.documentsIntro":`View the quotes, orders, and invoices linked to this client.`}};var R$1={fr:{"catalogWorkspace.intro":`Préparez les prestations réutilisables dans vos devis.`,"catalogWorkspace.views":`Vues du catalogue`,"catalogWorkspace.active":`Actives`,"catalogWorkspace.archived":`Archivées`,"catalogWorkspace.all":`Toutes`,"catalogWorkspace.count.one":`{count} prestation`,"catalogWorkspace.count.other":`{count} prestations`,"catalogWorkspace.price":`Prix unitaire HT`,"catalogWorkspace.exportPrice":`Prix unitaire HT (EUR)`,"catalogWorkspace.status":`État`,"catalogWorkspace.available":`Active`,"catalogWorkspace.searchFilter":`Recherche : {query}`,"catalogWorkspace.clearSearch":`Effacer la recherche`,"catalogWorkspace.taxFilter":`TVA : {rate} %`,"catalogWorkspace.allTaxRates":`Tous les taux de TVA`,"catalogWorkspace.resetFilters":`Effacer les filtres`,"catalogWorkspace.noMatches":`Aucune prestation ne correspond aux filtres`,"catalogWorkspace.changeSearch":`Modifiez les filtres ou consultez une autre vue.`,"catalogWorkspace.empty":`Aucune prestation dans cette vue`,"catalogWorkspace.emptyIntro":`Créez une prestation pour réutiliser sa description et ses valeurs dans vos devis.`,"catalogWorkspace.noArchived":`Aucune prestation archivée`,"catalogWorkspace.archiveIntro":`Les prestations archivées restent consultables ici.`,"catalogWorkspace.loadError":`Le catalogue est indisponible. Réessayez le chargement.`,"catalogWorkspace.retry":`Réessayer`,"catalogWorkspace.editTitle":`Modifier la prestation`,"catalogWorkspace.back":`Retour au catalogue`,"catalogWorkspace.formIntro":`Les modifications ne changent pas les lignes déjà ajoutées à vos devis.`,"catalogWorkspace.service":`Prestation`,"catalogWorkspace.defaultValues":`Valeurs par défaut`,"catalogWorkspace.quantityInvalid":`Saisissez une quantité de 0,001 à 9 007 199 254 740,991, avec 3 décimales maximum.`,"catalogWorkspace.priceInvalid":`Saisissez un prix de 0 à 90 071 992 547 409,91 EUR, avec 2 décimales maximum.`,"catalogWorkspace.taxInvalid":`Saisissez une TVA entre 0 et 100 %, avec 2 décimales maximum.`,"catalogWorkspace.taxHint":`Les prix sont en euros, hors taxes. Vérifiez le taux de TVA pour chaque devis.`,"catalogWorkspace.availability":`Disponibilité dans les devis`,"catalogWorkspace.archive":`Archiver cette prestation`,"catalogWorkspace.archiveConfirmation":`Archiver cette prestation et enregistrer les modifications ? Les lignes déjà ajoutées aux devis restent inchangées.`,"catalogWorkspace.restoreConfirmation":`Réactiver cette prestation et enregistrer les modifications ? Elle sera disponible dans les nouveaux devis.`,"catalogWorkspace.saving":`Enregistrement…`,"catalogWorkspace.cancel":`Annuler`},en:{"catalogWorkspace.intro":`Prepare reusable services for your quotes.`,"catalogWorkspace.views":`Catalog views`,"catalogWorkspace.active":`Active`,"catalogWorkspace.archived":`Archived`,"catalogWorkspace.all":`All`,"catalogWorkspace.count.one":`{count} service`,"catalogWorkspace.count.other":`{count} services`,"catalogWorkspace.price":`Unit price excluding tax`,"catalogWorkspace.exportPrice":`Unit price excluding tax (EUR)`,"catalogWorkspace.status":`Status`,"catalogWorkspace.available":`Active`,"catalogWorkspace.searchFilter":`Search: {query}`,"catalogWorkspace.clearSearch":`Clear search`,"catalogWorkspace.taxFilter":`VAT: {rate}%`,"catalogWorkspace.allTaxRates":`All VAT rates`,"catalogWorkspace.resetFilters":`Clear filters`,"catalogWorkspace.noMatches":`No services match the filters`,"catalogWorkspace.changeSearch":`Change the filters or select another view.`,"catalogWorkspace.empty":`No services in this view`,"catalogWorkspace.emptyIntro":`Create a service to reuse its description and values in your quotes.`,"catalogWorkspace.noArchived":`No archived services`,"catalogWorkspace.archiveIntro":`Archived services remain available for review here.`,"catalogWorkspace.loadError":`The catalog is unavailable. Try loading it again.`,"catalogWorkspace.retry":`Retry`,"catalogWorkspace.editTitle":`Edit service`,"catalogWorkspace.back":`Back to catalog`,"catalogWorkspace.formIntro":`Changes do not alter lines already added to your quotes.`,"catalogWorkspace.service":`Service`,"catalogWorkspace.defaultValues":`Default values`,"catalogWorkspace.quantityInvalid":`Enter a quantity from 0.001 to 9,007,199,254,740.991, with at most 3 decimal places.`,"catalogWorkspace.priceInvalid":`Enter a price from 0 to EUR 90,071,992,547,409.91, with at most 2 decimal places.`,"catalogWorkspace.taxInvalid":`Enter VAT from 0 to 100%, with at most 2 decimal places.`,"catalogWorkspace.taxHint":`Prices are in euros, excluding tax. Check the VAT rate for each quote.`,"catalogWorkspace.availability":`Availability in quotes`,"catalogWorkspace.archive":`Archive this service`,"catalogWorkspace.archiveConfirmation":`Archive this service and save changes? Lines already added to quotes remain unchanged.`,"catalogWorkspace.restoreConfirmation":`Reactivate this service and save changes? It will be available in new quotes.`,"catalogWorkspace.saving":`Saving…`,"catalogWorkspace.cancel":`Cancel`}};var q$1={fr:{"listControls.reload":`Recharger`,"listControls.moreActions":`Autres actions`,"listControls.pickerDemo":`Sélection avec recherche`,"listControls.pickerDemoHint":`Recherchez une option. Sélectionnez un résultat ou fermez la fenêtre avec Échap. Le focus revient au bouton.`,"listControls.chooseOption":`Choisir une option`,"listControls.selectedOption":`Sélection : {value}`,"listControls.closePicker":`Fermer le sélecteur`,"listControls.searchOptions":`Rechercher`,"listControls.optionCount.one":`{count} résultat`,"listControls.optionCount.other":`{count} résultats`,"listControls.noOptions":`Aucun résultat. Modifiez la recherche.`,"listControls.none":`Aucun`,"listControls.sortAscending":`{column} : trier par ordre croissant`,"listControls.sortDescending":`{column} : trier par ordre décroissant`,"listControls.resetSort":`{column} : rétablir l’ordre initial`,"listControls.removeFilter":`Retirer le filtre {filter}`},en:{"listControls.reload":`Reload`,"listControls.moreActions":`More actions`,"listControls.pickerDemo":`Searchable selection`,"listControls.pickerDemoHint":`Search for an option. Select a result or close the window with Escape. Focus returns to the button.`,"listControls.chooseOption":`Choose an option`,"listControls.selectedOption":`Selection: {value}`,"listControls.closePicker":`Close selector`,"listControls.searchOptions":`Search`,"listControls.optionCount.one":`{count} result`,"listControls.optionCount.other":`{count} results`,"listControls.noOptions":`No results. Change the search.`,"listControls.none":`None`,"listControls.sortAscending":`{column}: sort ascending`,"listControls.sortDescending":`{column}: sort descending`,"listControls.resetSort":`{column}: restore initial order`,"listControls.removeFilter":`Remove filter {filter}`}};var S$2={fr:{"emailsWorkspace.anyPeriod":`Toutes les dates`,"emailsWorkspace.messageCount.one":`{count} résultat · 100 derniers messages au plus`,"emailsWorkspace.messageCount.other":`{count} résultats · 100 derniers messages au plus`,"emailsWorkspace.reminderCount.one":`{count} relance · 100 chargées au plus`,"emailsWorkspace.reminderCount.other":`{count} relances · 100 chargées au plus`,"emailsWorkspace.export":`Exporter les métadonnées des résultats chargés et filtrés (CSV). Le texte des messages et des modèles est exclu.`,"emailsWorkspace.from":`À partir du`,"emailsWorkspace.to":`Jusqu’au`,"emailsWorkspace.dateRange":`La date de fin précède la date de début.`,"emailsWorkspace.dateFilterHint":`Les dates utilisent le fuseau horaire de votre navigateur et la colonne de date affichée.`,"emailsWorkspace.fromFilter":`À partir du : {date}`,"emailsWorkspace.toFilter":`Jusqu’au : {date}`,"emailsWorkspace.intro":`Consultez les messages enregistrés et préparez les prochains courriels.`,"emailsWorkspace.messages":`Messages`,"emailsWorkspace.drafts":`Brouillons`,"emailsWorkspace.reminders":`Relances`,"emailsWorkspace.templates":`Modèles`,"emailsWorkspace.newMessage":`Nouveau message`,"emailsWorkspace.editDraft":`Modifier le brouillon`,"emailsWorkspace.newTemplate":`Nouveau modèle`,"emailsWorkspace.templateSaved":`Modèle enregistré.`,"emailsWorkspace.templateArchived":`Modèle archivé. Les brouillons existants restent inchangés.`,"emailsWorkspace.draftArchived":`Brouillon archivé. Aucun courriel n’a été envoyé.`,"emailsWorkspace.editTemplate":`Modifier le modèle`,"emailsWorkspace.newReminder":`Nouvelle relance`,"emailsWorkspace.search":`Rechercher dans cette vue`,"emailsWorkspace.searchFilter":`Recherche : {query}`,"emailsWorkspace.count.one":`{count} résultat`,"emailsWorkspace.count.other":`{count} résultats`,"emailsWorkspace.loadError":`Cette liste est indisponible. Réessayez le chargement.`,"emailsWorkspace.noMatches":`Aucun résultat pour cette recherche`,"emailsWorkspace.empty":`Aucun élément dans cette vue`,"emailsWorkspace.emptyHint":`Utilisez le bouton de création pour préparer un nouvel élément.`,"emailsWorkspace.changeSearch":`Modifiez ou effacez la recherche.`,"emailsWorkspace.status":`État`,"emailsWorkspace.allStates":`Tous les états`,"emailsWorkspace.filters":`Filtres ({count})`,"emailsWorkspace.reminderHistory":`Cette vue contient au maximum 100 relances. Les relances programmées sont chargées en priorité. Elle ne représente pas tout l’historique.`,"emailsWorkspace.date":`Date`,"emailsWorkspace.scheduledDate":`Date prévue`,"emailsWorkspace.action":`Action`,"emailsWorkspace.invoice":`Facture`,"emailsWorkspace.simulated":`Simulé · non envoyé`,"emailsWorkspace.submitted":`Soumis au prestataire`,"emailsWorkspace.simulation":`Simulation`,"emailsWorkspace.draft":`Brouillon`,"emailsWorkspace.reminderDraft":`Brouillon de rappel`,"emailsWorkspace.viewMessage":`Consulter le message`,"emailsWorkspace.back":`Retour aux courriels`,"emailsWorkspace.backTemplates":`Retour aux modèles`,"emailsWorkspace.backReminders":`Retour aux relances`,"emailsWorkspace.message":`Message`,"emailsWorkspace.unsaved":`Quitter ce message ? Les modifications non enregistrées seront perdues. Une demande incertaine reste disponible à la prochaine ouverture.`,"emailsWorkspace.unsavedTemplate":`Abandonner les modifications non enregistrées de ce modèle ?`,"emailsWorkspace.unsavedReminder":`Quitter cette relance sans enregistrer les modifications ?`,"emailsWorkspace.chooseTemplate":`Choisir un modèle`,"emailsWorkspace.manageTemplates":`Gérer les modèles`,"emailsWorkspace.replaceTemplate":`Remplacer l’objet et le texte par ce modèle ? Le destinataire et la référence restent inchangés.`,"emailsWorkspace.addressing":`Destinataire et référence`,"emailsWorkspace.recipientInvalid":`Saisissez une adresse courriel valide de 254 caractères maximum.`,"emailsWorkspace.shortTextInvalid":`Saisissez un texte de 1 à 160 caractères.`,"emailsWorkspace.bodyInvalid":`Saisissez un texte de 1 à 20 000 caractères.`,"emailsWorkspace.bodyFormat":`Format du message`,"emailsWorkspace.plainText":`Texte brut`,"emailsWorkspace.formattedText":`Texte formaté`,"emailsWorkspace.preview":`Aperçu du texte`,"emailsWorkspace.saving":`Enregistrement…`,"emailsWorkspace.simulationOnly":`Les courriels clients et les relances restent simulés. Aucun courriel réel ne sera envoyé.`,"emailsWorkspace.pending":`Une demande reste sans réponse définitive. Son identifiant et son contenu sont conservés dans cet onglet, même après rechargement.`,"emailsWorkspace.recoveryError":`Le message ou sa récupération est indisponible. Réessayez le chargement avant toute nouvelle demande.`,"emailsWorkspace.messageUnavailable":`Ce message ne figure pas parmi les 100 derniers messages accessibles. Il n’est pas présenté comme supprimé.`,"emailsWorkspace.receiptHint":`La réception d’une demande par le prestataire ne prouve ni la livraison du courriel ni sa lecture.`,"emailsWorkspace.requestId":`Identifiant de la demande`,"emailsWorkspace.templateHint":`Ce modèle contient un objet et un texte brut ou formaté. Sa modification ne change pas les brouillons et messages existants.`,"emailsWorkspace.chooseInvoice":`Choisir une facture`,"emailsWorkspace.chooseInvoiceError":`Choisissez une facture émise avec un solde positif, sans avoir.`,"emailsWorkspace.client":`Client`,"emailsWorkspace.remaining":`Reste à payer`,"emailsWorkspace.dueDate":`Échéance`,"emailsWorkspace.timeZone":`Fuseau horaire de la saisie : {zone}.`,"emailsWorkspace.dateInvalid":`Choisissez une date et une heure valides dans les 366 prochains jours.`,"emailsWorkspace.pendingSchedule":`La demande reste incertaine. Cet onglet conserve son identifiant et ses valeurs, même après rechargement. Réessayez sans créer une nouvelle relance.`},en:{"emailsWorkspace.anyPeriod":`All dates`,"emailsWorkspace.messageCount.one":`{count} result · up to 100 latest emails`,"emailsWorkspace.messageCount.other":`{count} results · up to 100 latest emails`,"emailsWorkspace.reminderCount.one":`{count} reminder · up to 100 loaded`,"emailsWorkspace.reminderCount.other":`{count} reminders · up to 100 loaded`,"emailsWorkspace.export":`Export metadata for loaded and filtered results (CSV). Email and template text is excluded.`,"emailsWorkspace.from":`From`,"emailsWorkspace.to":`Through`,"emailsWorkspace.dateRange":`The end date is before the start date.`,"emailsWorkspace.dateFilterHint":`Dates use your browser time zone and the displayed date column.`,"emailsWorkspace.fromFilter":`From: {date}`,"emailsWorkspace.toFilter":`Through: {date}`,"emailsWorkspace.intro":`Review recorded messages and prepare upcoming emails.`,"emailsWorkspace.messages":`Messages`,"emailsWorkspace.drafts":`Drafts`,"emailsWorkspace.reminders":`Reminders`,"emailsWorkspace.templates":`Templates`,"emailsWorkspace.newMessage":`New message`,"emailsWorkspace.editDraft":`Edit draft`,"emailsWorkspace.newTemplate":`New template`,"emailsWorkspace.templateSaved":`Template saved.`,"emailsWorkspace.templateArchived":`Template archived. Existing drafts remain unchanged.`,"emailsWorkspace.draftArchived":`Draft archived. No email was sent.`,"emailsWorkspace.editTemplate":`Edit template`,"emailsWorkspace.newReminder":`New reminder`,"emailsWorkspace.search":`Search this view`,"emailsWorkspace.searchFilter":`Search: {query}`,"emailsWorkspace.count.one":`{count} result`,"emailsWorkspace.count.other":`{count} results`,"emailsWorkspace.loadError":`This list is unavailable. Try loading it again.`,"emailsWorkspace.noMatches":`No results for this search`,"emailsWorkspace.empty":`No items in this view`,"emailsWorkspace.emptyHint":`Use the create button to prepare a new item.`,"emailsWorkspace.changeSearch":`Change or clear the search.`,"emailsWorkspace.status":`Status`,"emailsWorkspace.allStates":`All statuses`,"emailsWorkspace.filters":`Filters ({count})`,"emailsWorkspace.reminderHistory":`This view contains at most 100 reminders. Scheduled reminders load first. This is not the complete history.`,"emailsWorkspace.date":`Date`,"emailsWorkspace.scheduledDate":`Scheduled date`,"emailsWorkspace.action":`Action`,"emailsWorkspace.invoice":`Invoice`,"emailsWorkspace.simulated":`Simulated · not sent`,"emailsWorkspace.submitted":`Submitted to provider`,"emailsWorkspace.simulation":`Simulation`,"emailsWorkspace.draft":`Draft`,"emailsWorkspace.reminderDraft":`Payment reminder draft`,"emailsWorkspace.viewMessage":`View message`,"emailsWorkspace.back":`Back to email`,"emailsWorkspace.backTemplates":`Back to templates`,"emailsWorkspace.backReminders":`Back to reminders`,"emailsWorkspace.message":`Message`,"emailsWorkspace.unsaved":`Leave this message? Unsaved changes will be lost. An uncertain request remains available when you return.`,"emailsWorkspace.unsavedTemplate":`Discard unsaved changes to this template?`,"emailsWorkspace.unsavedReminder":`Leave this reminder without saving changes?`,"emailsWorkspace.chooseTemplate":`Choose a template`,"emailsWorkspace.manageTemplates":`Manage templates`,"emailsWorkspace.replaceTemplate":`Replace the subject and text with this template? The recipient and reference remain unchanged.`,"emailsWorkspace.addressing":`Recipient and reference`,"emailsWorkspace.recipientInvalid":`Enter a valid email address with at most 254 characters.`,"emailsWorkspace.shortTextInvalid":`Enter text with 1 to 160 characters.`,"emailsWorkspace.bodyInvalid":`Enter text with 1 to 20,000 characters.`,"emailsWorkspace.bodyFormat":`Message format`,"emailsWorkspace.plainText":`Plain text`,"emailsWorkspace.formattedText":`Formatted text`,"emailsWorkspace.preview":`Text preview`,"emailsWorkspace.saving":`Saving…`,"emailsWorkspace.simulationOnly":`Customer emails and reminders remain simulated. No real email will be sent.`,"emailsWorkspace.pending":`A request has no definitive response. This tab retains its identifier and content, including after a reload.`,"emailsWorkspace.recoveryError":`The message or its recovery is unavailable. Try loading it again before starting another request.`,"emailsWorkspace.messageUnavailable":`This message is not among the last 100 accessible messages. This does not mean it was deleted.`,"emailsWorkspace.receiptHint":`Provider acceptance proves neither email delivery nor reading.`,"emailsWorkspace.requestId":`Request identifier`,"emailsWorkspace.templateHint":`This template contains a subject and plain or formatted text. Changes do not alter existing drafts or messages.`,"emailsWorkspace.chooseInvoice":`Choose an invoice`,"emailsWorkspace.chooseInvoiceError":`Choose an issued invoice with a positive balance and no credit note.`,"emailsWorkspace.client":`Client`,"emailsWorkspace.remaining":`Remaining balance`,"emailsWorkspace.dueDate":`Due date`,"emailsWorkspace.timeZone":`Input time zone: {zone}.`,"emailsWorkspace.dateInvalid":`Choose a valid date and time within the next 366 days.`,"emailsWorkspace.pendingSchedule":`The request remains uncertain. This tab retains its identifier and values, including after a reload. Retry without creating another reminder.`}};var L$1={fr:{"commercial.moreActions":`Autres actions`,"commercial.updated":`Modification du devis`,"commercial.versionOrder":`Révisions, de la première à la dernière.`,"commercial.historyOrder":`Événements, du plus ancien au plus récent.`,"commercial.documentOrder":`Documents dans l’ordre devis, commande, facture.`,"commercial.lineOrder":`Lignes dans l’ordre du document enregistré.`,"commercial.discardCancellation":`Abandonner la raison et la note d’annulation non soumises ? Le devis ne sera pas annulé.`,"commercial.leavePublicationUncertain":`Quitter cette publication incertaine ? Vérifiez l’état du devis avant de créer ou remplacer son lien.`,"commercial.leaveReview":`Quitter la préparation du lien ? La vérification du document sera à refaire.`,"commercial.search":`Rechercher une référence, un titre ou un client`,"commercial.count.one":`{count} affaire`,"commercial.count.other":`{count} affaires`,"commercial.allStages":`Toutes les étapes`,"commercial.allClients":`Tous les clients`,"commercial.quoteAmount":`Montant du devis TTC`,"commercial.searchFilter":`Recherche : {query}`,"commercial.noMatches":`Aucune affaire ne correspond aux filtres.`,"commercial.clearFilters":`Effacer les filtres`,"commercial.overview":`Vue d’ensemble`,"commercial.documents":`Documents`,"commercial.history":`Historique`,"commercial.summary":`Résumé`,"commercial.document":`Document`,"commercial.versions":`Versions`,"commercial.quote":`Devis`,"commercial.edit":`Modifier le devis`,"commercial.revise":`Créer une révision`,"commercial.publish":`Préparer le lien de signature`,"commercial.openOrder":`Ouvrir la commande`,"commercial.backQuote":`Retour au devis`,"commercial.backAffair":`Retour à l’affaire`,"commercial.saved":`Le devis est enregistré.`,"commercial.replaceConditions":`Remplacer les conditions actuelles par celles du modèle sélectionné ?`,"commercial.savedHint":`Consultez le devis pour préparer sa publication.`,"commercial.readOnly":`Ce devis ne peut pas être modifié dans cet état.`,"commercial.loadLatest":`Recharger le devis enregistré`,"commercial.reloadConfirm":`Recharger le devis ? Les modifications non enregistrées seront perdues.`,"commercial.pending":`Une demande est en cours. Attendez sa réponse avant de quitter cette page.`,"commercial.saveUncertain":`La réponse manque. Vérifiez les affaires avant de créer un autre devis.`,"commercial.leaveUncertain":`Quitter cet éditeur ? La création reste incertaine. Vérifiez les affaires avant une nouvelle création.`,"commercial.savedTotals":`Totaux enregistrés`,"commercial.newTotals":`Les totaux seront calculés lors de l’enregistrement.`,"commercial.revision":`Révision {version}`,"commercial.publicationTitle":`Publier le devis pour signature`,"commercial.publicationEffect":`Cette action fige la révision affichée pour signature. La signature du client créera une commande.`,"commercial.noEmail":`La création du lien de signature n’envoie aucun courriel.`,"commercial.parties":`Parties du document`,"commercial.partiesHint":`Vérifiez les coordonnées de l’émetteur et du client dans le PDF. Elles proviennent de cette révision enregistrée.`,"commercial.preparePdf":`Préparer le PDF de cette révision`,"commercial.pdfReady":`Le PDF de cette révision est prêt.`,"commercial.pdfRequired":`Préparez le PDF avant de créer le lien.`,"commercial.previewUnavailable":`Cette révision ne possède pas de document consultable. Créez une révision après correction des coordonnées.`,"commercial.confirmDocument":`J’ai vérifié la révision, le PDF et les coordonnées des parties.`,"commercial.confirmRequired":`Confirmez la vérification du document.`,"commercial.createLink":`Créer le lien de signature`,"commercial.manageLink":`Gérer le lien de signature`,"commercial.replaceLink":`Remplacer le lien de signature`,"commercial.replaceLinkHint":`Si le lien est perdu, remplacez-le. Le remplacement révoque l’ancien lien sans modifier le devis ni son PDF.`,"commercial.confirmReplaceLink":`Remplacer le lien de signature ? L’ancien lien cessera immédiatement de fonctionner.`,"commercial.replacementUncertain":`La réponse manque. Rechargez le devis avant tout nouveau remplacement.`,"commercial.linkCreated":`Le lien de signature est créé.`,"commercial.leaveLink":`Quitter sans copier le lien de signature ? Vous devrez le remplacer pour obtenir un nouveau lien.`,"commercial.linkUnavailable":`Le lien de signature est remis uniquement lors de sa création. Si le lien est perdu, remplacez-le depuis cette page.`,"commercial.portalHint":`Le lien du portail demande une connexion client. Ce lien ne remplace pas le lien de signature.`,"commercial.publicationUnavailable":`Ce devis ne peut pas être publié dans cet état.`,"commercial.publicationUncertain":`La publication reste incertaine. Rechargez le devis pour vérifier son état avant de créer ou remplacer son lien.`,"commercial.order":`Commande`,"commercial.orderImmutable":`Cette commande reprend la révision acceptée du devis. Son contenu est immuable.`,"commercial.acceptedQuote":`Devis accepté`,"commercial.confirmedAt":`Date de confirmation`,"commercial.orderUnavailable":`La commande ou sa révision acceptée est indisponible.`,"commercial.orderPdf":`Document de commande`},en:{"commercial.moreActions":`More actions`,"commercial.updated":`Quote updated`,"commercial.versionOrder":`Revisions, from first to last.`,"commercial.historyOrder":`Events, from oldest to newest.`,"commercial.documentOrder":`Documents in quote, order, invoice order.`,"commercial.lineOrder":`Lines in saved document order.`,"commercial.discardCancellation":`Discard the unsubmitted cancellation reason and note? The quote will not be cancelled.`,"commercial.leavePublicationUncertain":`Leave this uncertain publication? Check the quote status before creating or replacing its link.`,"commercial.leaveReview":`Leave signature link preparation? You will need to check the document again.`,"commercial.search":`Search by reference, title or client`,"commercial.count.one":`{count} engagement`,"commercial.count.other":`{count} engagements`,"commercial.allStages":`All stages`,"commercial.allClients":`All clients`,"commercial.quoteAmount":`Quote amount including VAT`,"commercial.searchFilter":`Search: {query}`,"commercial.noMatches":`No engagements match the filters.`,"commercial.clearFilters":`Clear filters`,"commercial.overview":`Overview`,"commercial.documents":`Documents`,"commercial.history":`History`,"commercial.summary":`Summary`,"commercial.document":`Document`,"commercial.versions":`Versions`,"commercial.quote":`Quote`,"commercial.edit":`Edit quote`,"commercial.revise":`Create revision`,"commercial.publish":`Prepare signature link`,"commercial.openOrder":`Open order`,"commercial.backQuote":`Back to quote`,"commercial.backAffair":`Back to engagement`,"commercial.saved":`The quote is saved.`,"commercial.replaceConditions":`Replace the current conditions with the selected preset?`,"commercial.savedHint":`Open the quote to prepare publication.`,"commercial.readOnly":`This quote cannot be edited in its current state.`,"commercial.loadLatest":`Reload saved quote`,"commercial.reloadConfirm":`Reload this quote? Unsaved changes will be lost.`,"commercial.pending":`A request is in progress. Wait for its response before leaving this page.`,"commercial.saveUncertain":`The response is missing. Check engagements before creating another quote.`,"commercial.leaveUncertain":`Leave this editor? Creation remains uncertain. Check engagements before creating another quote.`,"commercial.savedTotals":`Saved totals`,"commercial.newTotals":`Totals will be calculated when the quote is saved.`,"commercial.revision":`Revision {version}`,"commercial.publicationTitle":`Publish quote for signature`,"commercial.publicationEffect":`This action freezes the displayed revision for signature. The client signature will create an order.`,"commercial.noEmail":`Creating the signature link does not send an email.`,"commercial.parties":`Document parties`,"commercial.partiesHint":`Check issuer and client details in the PDF. They come from this saved revision.`,"commercial.preparePdf":`Prepare the PDF for this revision`,"commercial.pdfReady":`The PDF for this revision is ready.`,"commercial.pdfRequired":`Prepare the PDF before creating the link.`,"commercial.previewUnavailable":`This revision has no viewable document. Create a revision after correcting the party details.`,"commercial.confirmDocument":`I checked the revision, PDF and party details.`,"commercial.confirmRequired":`Confirm that you checked the document.`,"commercial.createLink":`Create signature link`,"commercial.manageLink":`Manage signature link`,"commercial.replaceLink":`Replace signature link`,"commercial.replaceLinkHint":`If the link is lost, replace it. Replacement revokes the old link without changing the quote or its PDF.`,"commercial.confirmReplaceLink":`Replace the signature link? The old link will stop working immediately.`,"commercial.replacementUncertain":`The response is missing. Reload the quote before replacing the link again.`,"commercial.linkCreated":`The signature link is created.`,"commercial.leaveLink":`Leave without copying the signature link? You will need to replace it to get a new link.`,"commercial.linkUnavailable":`The signature link is returned only when created. If the link is lost, replace it from this page.`,"commercial.portalHint":`The portal link requires client sign-in. It does not replace the signature link.`,"commercial.publicationUnavailable":`This quote cannot be published in its current state.`,"commercial.publicationUncertain":`Publication remains uncertain. Reload the quote to check its state before creating or replacing its link.`,"commercial.order":`Order`,"commercial.orderImmutable":`This order contains the accepted quote revision. Its content cannot change.`,"commercial.acceptedQuote":`Accepted quote`,"commercial.confirmedAt":`Confirmation date`,"commercial.orderUnavailable":`The order or its accepted revision is unavailable.`,"commercial.orderPdf":`Order document`}};var W$1={fr:{"billingWorkspace.clearSelection":`Effacer la sélection`,"billingWorkspace.quote":`Devis d’origine`,"billingWorkspace.pdfRecorded":`PDF enregistré`,"billingWorkspace.created":`Brouillon créé`,"billingWorkspace.revised":`Nouvelle version enregistrée`,"billingWorkspace.issued":`Facture émise`,"billingWorkspace.voided":`Facture annulée`,"billingWorkspace.paymentRecorded":`Encaissement enregistré`,"billingWorkspace.paymentCancelled":`Saisie d’encaissement annulée`,"billingWorkspace.creditIssued":`Avoir émis`,"billingWorkspace.refundRecorded":`Remboursement enregistré`,"billingWorkspace.refundCancelled":`Saisie de remboursement annulée`,"billingWorkspace.invoices":`Factures`,"billingWorkspace.receipts":`Encaissements`,"billingWorkspace.credits":`Avoirs`,"billingWorkspace.refunds":`Remboursements`,"billingWorkspace.search":`Rechercher par numéro, titre, client ou commande`,"billingWorkspace.all":`Tous`,"billingWorkspace.documentStatus":`Statut du document`,"billingWorkspace.financialStatus":`État financier`,"billingWorkspace.unpaid":`Non réglée`,"billingWorkspace.partial":`Partiellement réglée`,"billingWorkspace.paid":`Réglée`,"billingWorkspace.credited":`Créditée`,"billingWorkspace.notApplicable":`Sans objet`,"billingWorkspace.hasCredit":`Avec avoir`,"billingWorkspace.noCredit":`Sans avoir`,"billingWorkspace.due":`Échéance`,"billingWorkspace.duePeriod":`Période d’échéance`,"billingWorkspace.receiptPeriod":`Période d’encaissement`,"billingWorkspace.creditPeriod":`Période d’émission de l’avoir`,"billingWorkspace.refundPeriod":`Période de remboursement`,"billingWorkspace.overdue":`En retard`,"billingWorkspace.upcoming":`À venir`,"billingWorkspace.clear":`Effacer les filtres`,"billingWorkspace.removeFilter":`Retirer ce filtre`,"billingWorkspace.count.one":`{count} résultat`,"billingWorkspace.count.other":`{count} résultats`,"billingWorkspace.selection.one":`{count} facture sélectionnée`,"billingWorkspace.selection.other":`{count} factures sélectionnées`,"billingWorkspace.empty":`Aucun élément enregistré`,"billingWorkspace.noMatches":`Aucun résultat pour ces filtres. Modifiez ou effacez les filtres.`,"billingWorkspace.loadError":`Cette liste est indisponible. Réessayez le chargement.`,"billingWorkspace.limitExceeded":`Trop de résultats : plus de 10 000 éléments. Les données ne sont pas chargées. Aucun résultat partiel n’est affiché.`,"billingWorkspace.summary":`Résumé`,"billingWorkspace.document":`Document`,"billingWorkspace.history":`Historique`,"billingWorkspace.version":`Version enregistrée : {version}`,"billingWorkspace.edit":`Modifier le brouillon`,"billingWorkspace.backDetail":`Retour à la facture`,"billingWorkspace.readonly":`Le document émis reste inchangé. Les encaissements et avoirs sont enregistrés séparément.`,"billingWorkspace.recordReceipt":`Enregistrer un encaissement`,"billingWorkspace.receipt":`Encaissement`,"billingWorkspace.receiptOptions":`Choisir le type d’encaissement`,"billingWorkspace.receiptPartial":`Encaissement partiel`,"billingWorkspace.receiptFull":`Encaissement intégral`,"billingWorkspace.issueTitle":`Émettre la facture`,"billingWorkspace.issueHint":`Vérifiez le document. L’émission attribue un numéro définitif et fige cette version.`,"billingWorkspace.confirmDocument":`J’ai vérifié cette version du document.`,"billingWorkspace.receiptHint":`Enregistrez uniquement un paiement reçu. Un test Stripe ne constitue jamais un encaissement.`,"billingWorkspace.creditHint":`Un seul avoir intégral est autorisé. Il reprend les lignes, la TVA et les montants du document émis.`,"billingWorkspace.refundHint":`Cette saisie enregistre un remboursement déjà effectué. Elle ne déclenche aucun virement bancaire.`,"billingWorkspace.cancelReceiptHint":`Corrigez une saisie erronée. Cette annulation ne rembourse pas le client.`,"billingWorkspace.cancelRefundHint":`Corrigez uniquement une saisie erronée. Cette annulation ne déplace aucun fonds.`,"billingWorkspace.voidHint":`L’annulation est réservée aux factures émises sans encaissement, même annulé, et sans avoir.`,"billingWorkspace.pending":`Enregistrement en cours. Ne fermez pas cette page.`,"billingWorkspace.completed":`L’opération est enregistrée.`,"billingWorkspace.stale":`La facture a changé. Rechargez son état avant une nouvelle opération.`,"billingWorkspace.uncertain":`La réponse est incertaine. Réessayez la même demande sans changer les valeurs.`,"billingWorkspace.retrySame":`Réessayer la même demande`,"billingWorkspace.unavailable":`Cette opération n’est pas disponible pour l’état actuel de la facture.`,"billingWorkspace.reloadConfirm":`Recharger la facture et abandonner les modifications non enregistrées ?`,"billingWorkspace.dateInvalid":`Saisissez une date valide dans la période autorisée.`,"billingWorkspace.amountInvalid":`Saisissez un montant positif inférieur ou égal au solde disponible.`,"billingWorkspace.reasonInvalid":`Saisissez un motif non vide dans la limite indiquée.`,"billingWorkspace.referenceInvalid":`Saisissez une référence de 1 à 160 caractères.`,"billingWorkspace.limit":`Maximum : {count} caractères.`,"billingWorkspace.active":`Enregistré`,"billingWorkspace.cancelled":`Saisie annulée`,"billingWorkspace.recordedAt":`Enregistré le`,"billingWorkspace.actor":`Identifiant de l’auteur`,"billingWorkspace.noHistory":`Aucun événement enregistré pour cette facture.`,"billingWorkspace.historyHint":`Cet historique présente les événements du journal. Les versions enregistrées figurent dans Document.`,"billingWorkspace.prepareReminders":`Préparer les rappels éligibles`,"billingWorkspace.pdfDownloadFailed":`Le téléchargement des PDF a échoué. Vérifiez les fichiers déjà téléchargés avant de réessayer.`,"billingWorkspace.remindersHint":`Préparez chaque rappel séparément. Aucun courriel réel n’est envoyé.`,"billingWorkspace.reminder":`Préparer un rappel`,"billingWorkspace.email":`Préparer un courriel`,"billingWorkspace.pdfPending":`Le PDF est en préparation.`,"billingWorkspace.pdfFailed":`La préparation du PDF a échoué. Relancez la génération.`,"billingWorkspace.noCreditNote":`Aucun avoir pour cette facture.`,"billingWorkspace.chooseInvoice":`Choisir une facture`,"billingWorkspace.chooseInvoiceHint":`Ouvrez une facture pour enregistrer une opération dans son contexte.`,"billingWorkspace.issuedAt":`Émise le`,"billingWorkspace.noAutosave":`Les modifications restent dans cette page jusqu’à leur enregistrement.`},en:{"billingWorkspace.clearSelection":`Clear selection`,"billingWorkspace.quote":`Source quote`,"billingWorkspace.pdfRecorded":`PDF recorded`,"billingWorkspace.created":`Draft created`,"billingWorkspace.revised":`New version recorded`,"billingWorkspace.issued":`Invoice issued`,"billingWorkspace.voided":`Invoice voided`,"billingWorkspace.paymentRecorded":`Receipt recorded`,"billingWorkspace.paymentCancelled":`Receipt entry cancelled`,"billingWorkspace.creditIssued":`Credit note issued`,"billingWorkspace.refundRecorded":`Refund recorded`,"billingWorkspace.refundCancelled":`Refund entry cancelled`,"billingWorkspace.invoices":`Invoices`,"billingWorkspace.receipts":`Receipts`,"billingWorkspace.credits":`Credit notes`,"billingWorkspace.refunds":`Refunds`,"billingWorkspace.search":`Search by number, title, client or order`,"billingWorkspace.all":`All`,"billingWorkspace.documentStatus":`Document status`,"billingWorkspace.financialStatus":`Financial status`,"billingWorkspace.unpaid":`Unpaid`,"billingWorkspace.partial":`Partly paid`,"billingWorkspace.paid":`Paid`,"billingWorkspace.credited":`Credited`,"billingWorkspace.notApplicable":`Not applicable`,"billingWorkspace.hasCredit":`With credit note`,"billingWorkspace.noCredit":`Without credit note`,"billingWorkspace.due":`Due date`,"billingWorkspace.duePeriod":`Due date range`,"billingWorkspace.receiptPeriod":`Receipt date range`,"billingWorkspace.creditPeriod":`Credit note issue date range`,"billingWorkspace.refundPeriod":`Refund date range`,"billingWorkspace.overdue":`Overdue`,"billingWorkspace.upcoming":`Upcoming`,"billingWorkspace.clear":`Clear filters`,"billingWorkspace.removeFilter":`Remove this filter`,"billingWorkspace.count.one":`{count} result`,"billingWorkspace.count.other":`{count} results`,"billingWorkspace.selection.one":`{count} invoice selected`,"billingWorkspace.selection.other":`{count} invoices selected`,"billingWorkspace.empty":`No recorded entries`,"billingWorkspace.noMatches":`No results match these filters. Change or clear the filters.`,"billingWorkspace.loadError":`This list is unavailable. Try loading it again.`,"billingWorkspace.limitExceeded":`Too many results: more than 10,000 entries. The data is not loaded. No partial results are shown.`,"billingWorkspace.summary":`Summary`,"billingWorkspace.document":`Document`,"billingWorkspace.history":`History`,"billingWorkspace.version":`Recorded version: {version}`,"billingWorkspace.edit":`Edit draft`,"billingWorkspace.backDetail":`Back to invoice`,"billingWorkspace.readonly":`The issued document remains unchanged. Receipts and credit notes are recorded separately.`,"billingWorkspace.recordReceipt":`Record a receipt`,"billingWorkspace.receipt":`Receipt`,"billingWorkspace.receiptOptions":`Select the receipt type`,"billingWorkspace.receiptPartial":`Partial receipt`,"billingWorkspace.receiptFull":`Full receipt`,"billingWorkspace.issueTitle":`Issue invoice`,"billingWorkspace.issueHint":`Check the document. Issuance assigns a final number and locks this version.`,"billingWorkspace.confirmDocument":`I have checked this version of the document.`,"billingWorkspace.receiptHint":`Record only a received payment. A Stripe test is never a receipt.`,"billingWorkspace.creditHint":`Only one full credit note is allowed. It copies the lines, VAT and amounts from the issued document.`,"billingWorkspace.refundHint":`This entry records a refund already made. It does not initiate a bank transfer.`,"billingWorkspace.cancelReceiptHint":`Correct an incorrect entry. This cancellation does not refund the client.`,"billingWorkspace.cancelRefundHint":`Correct only an incorrect entry. This cancellation does not move funds.`,"billingWorkspace.voidHint":`Only issued invoices without receipts, including cancelled receipts, and without a credit note can be voided.`,"billingWorkspace.pending":`Saving. Do not close this page.`,"billingWorkspace.completed":`The operation is recorded.`,"billingWorkspace.stale":`The invoice has changed. Reload its state before another operation.`,"billingWorkspace.uncertain":`The response is uncertain. Retry the same request without changing its values.`,"billingWorkspace.retrySame":`Retry the same request`,"billingWorkspace.unavailable":`This operation is unavailable for the current invoice state.`,"billingWorkspace.reloadConfirm":`Reload the invoice and discard unsaved changes?`,"billingWorkspace.dateInvalid":`Enter a valid date within the allowed period.`,"billingWorkspace.amountInvalid":`Enter a positive amount that does not exceed the available balance.`,"billingWorkspace.reasonInvalid":`Enter a non-empty reason within the specified limit.`,"billingWorkspace.referenceInvalid":`Enter a reference with 1 to 160 characters.`,"billingWorkspace.limit":`Maximum: {count} characters.`,"billingWorkspace.active":`Recorded`,"billingWorkspace.cancelled":`Entry cancelled`,"billingWorkspace.recordedAt":`Recorded on`,"billingWorkspace.actor":`Actor identifier`,"billingWorkspace.noHistory":`No recorded events for this invoice.`,"billingWorkspace.historyHint":`This history shows journal events. Recorded versions are available in Document.`,"billingWorkspace.prepareReminders":`Prepare eligible reminders`,"billingWorkspace.pdfDownloadFailed":`The PDF download failed. Check the files already downloaded before trying again.`,"billingWorkspace.remindersHint":`Prepare each reminder separately. No real email is sent.`,"billingWorkspace.reminder":`Prepare a reminder`,"billingWorkspace.email":`Prepare an email`,"billingWorkspace.pdfPending":`The PDF is being prepared.`,"billingWorkspace.pdfFailed":`PDF preparation failed. Start generation again.`,"billingWorkspace.noCreditNote":`No credit note for this invoice.`,"billingWorkspace.chooseInvoice":`Choose an invoice`,"billingWorkspace.chooseInvoiceHint":`Open an invoice to record an operation in its context.`,"billingWorkspace.issuedAt":`Issued on`,"billingWorkspace.noAutosave":`Changes remain on this page until you save them.`}};var I$2={fr:{"bankWorkspace.supplierPayments":`Paiements fournisseur à rapprocher`,"bankWorkspace.supplierPaymentsHint":`Confirmez le virement fournisseur correspondant. Une suggestion ne déclenche jamais un rapprochement automatique.`,"bankWorkspace.noSupplierPayments":`Aucun paiement fournisseur disponible.`,"bankWorkspace.supplierMatchHistory":`Historique des rapprochements fournisseur`,"bankWorkspace.supplierConfirm":`Rapprocher ce paiement fournisseur avec le débit bancaire ?`,"bankWorkspace.supplierUnmatchConfirm":`Annuler ce rapprochement fournisseur ?`,"bankWorkspace.supplierUnmatchReason":`Annulation confirmée par un utilisateur.`,"bankWorkspace.unmatch":`Dissocier`,"bankWorkspace.actions":`Actions`,"bankWorkspace.suggestions":`Suggestions de rapprochement`,"bankWorkspace.suggestionsHint":`Vérifiez la facture, le règlement et le montant avant de confirmer une suggestion.`,"bankWorkspace.suggestionsLoading":`Recherche des rapprochements probables…`,"bankWorkspace.transactions":`Transactions`,"bankWorkspace.entries":`Écritures`,"bankWorkspace.intro":`Consultez les transactions importées. Rapprochez les crédits avec les encaissements déjà enregistrés.`,"bankWorkspace.accountHint":`Le compte est un libellé local. Il ne représente pas une connexion bancaire active.`,"bankWorkspace.search":`Rechercher un libellé ou une référence`,"bankWorkspace.allAccounts":`Tous les comptes`,"bankWorkspace.allDates":`Toutes les dates`,"bankWorkspace.ledgerPeriodRequired":`Saisissez les deux dates pour charger les écritures et exporter le journal de la période.`,"bankWorkspace.account":`Libellé du compte`,"bankWorkspace.payment":`Encaissement — montant disponible`,"bankWorkspace.choosePayment":`Choisir un encaissement`,"bankWorkspace.confirmMatch":`Rapprocher cette transaction avec l’encaissement choisi ? Aucun nouvel encaissement ne sera créé.`,"bankWorkspace.confirmUnmatch":`Annuler cette allocation ? La transaction et l’encaissement seront conservés. Le motif restera dans l’historique.`,"bankWorkspace.all":`Tous`,"bankWorkspace.flow":`Sens`,"bankWorkspace.credit":`Crédit`,"bankWorkspace.debit":`Débit`,"bankWorkspace.status":`Rapprochement`,"bankWorkspace.unmatched":`À rapprocher`,"bankWorkspace.partial":`Partiellement rapproché`,"bankWorkspace.matched":`Rapproché`,"bankWorkspace.cancelledPayment":`Encaissement annulé`,"bankWorkspace.notApplicable":`Sans rapprochement`,"bankWorkspace.reference":`Référence`,"bankWorkspace.description":`Libellé`,"bankWorkspace.date":`Date`,"bankWorkspace.amount":`Montant`,"bankWorkspace.count.one":`{count} transaction affichée`,"bankWorkspace.count.other":`{count} transactions affichées`,"bankWorkspace.clear":`Effacer les filtres`,"bankWorkspace.noMatches":`Aucune transaction ne correspond aux filtres.`,"bankWorkspace.empty":`Aucune transaction importée.`,"bankWorkspace.limit":`La liste contient au maximum les 1 000 transactions les plus récentes.`,"bankWorkspace.ledgerSortLoaded":`Le tri porte sur les résultats chargés : au maximum 10 000 sources et 10 000 écritures pour la période. Il ne modifie pas l’export CSV.`,"bankWorkspace.historySortLoaded":`Le tri porte sur les 100 événements d’historique les plus récents.`,"bankWorkspace.periodExport":`Journal de la période (CSV)`,"bankWorkspace.periodExportHint":`Export serveur du journal pour la période sélectionnée. La recherche et le tri affichés ne modifient pas cet export.`,"bankWorkspace.periodInvalid":`Saisissez une période valide. La date de fin doit suivre la date de début.`,"bankWorkspace.back":`Retour aux transactions`,"bankWorkspace.backLedger":`Retour aux écritures`,"bankWorkspace.unsaved":`Quitter cette page et abandonner les modifications non enregistrées ?`,"bankWorkspace.validate":`Valider le fichier`,"bankWorkspace.confirmImport":`Confirmer l’import`,"bankWorkspace.changeFile":`Modifier le fichier ou le compte`,"bankWorkspace.fileStep":`1. Fichier et compte`,"bankWorkspace.reviewStep":`2. Validation et confirmation`,"bankWorkspace.doneStep":`3. Résultat`,"bankWorkspace.validationHint":`Le serveur vérifie toutes les lignes et les références existantes. La confirmation vérifie à nouveau les données avant l’ajout.`,"bankWorkspace.statementHint":`Choisissez un fichier CAMT.053, OFX ou CSV UTF-8 de 500 Ko maximum.`,"bankWorkspace.format":`Format du relevé`,"bankWorkspace.csvConfiguration":`Correspondance des colonnes CSV`,"bankWorkspace.delimiter":`Séparateur de colonnes`,"bankWorkspace.comma":`Virgule`,"bankWorkspace.semicolon":`Point-virgule`,"bankWorkspace.tab":`Tabulation`,"bankWorkspace.referenceColumn":`Colonne de référence`,"bankWorkspace.dateColumn":`Colonne de date`,"bankWorkspace.amountColumn":`Colonne de montant`,"bankWorkspace.currencyColumn":`Colonne de devise, facultative pour EUR`,"bankWorkspace.descriptionColumn":`Colonne de libellé`,"bankWorkspace.dateFormat":`Format de date`,"bankWorkspace.decimalSeparator":`Séparateur décimal`,"bankWorkspace.accountInvalid":`Saisissez un libellé de compte de 1 à 100 caractères.`,"bankWorkspace.fileInvalid":`Choisissez un relevé UTF-8 non vide, de 500 Ko maximum.`,"bankWorkspace.preview":`Transactions validées`,"bankWorkspace.new":`À ajouter`,"bankWorkspace.existing":`Déjà présente`,"bankWorkspace.importCounts":`{added} à ajouter · {existing} déjà présente(s)`,"bankWorkspace.importDone":`{added} ajoutée(s) · {existing} déjà présente(s)`,"bankWorkspace.importAgain":`Importer un autre fichier`,"bankWorkspace.context":`Transaction importée`,"bankWorkspace.reconciliation":`Rapprocher une transaction`,"bankWorkspace.allocations":`Allocations actives`,"bankWorkspace.allocate":`Ajouter une allocation`,"bankWorkspace.groupHint":`Ajoutez une allocation par encaissement. Plusieurs allocations peuvent rapprocher un crédit groupé.`,"bankWorkspace.paymentHint":`Seuls les encaissements actifs avec un montant disponible sont proposés. Cette opération ne crée pas d’encaissement.`,"bankWorkspace.invoiceInvalid":`Choisissez une facture émise ou payée.`,"bankWorkspace.paymentInvalid":`Choisissez un encaissement disponible pour cette facture.`,"bankWorkspace.amountInvalid":`Saisissez un montant positif à deux décimales maximum, dans la limite disponible de l’encaissement.`,"bankWorkspace.feeInvalid":`Les frais doivent être positifs ou nuls et inférieurs au montant alloué.`,"bankWorkspace.netInvalid":`Le montant alloué moins les frais dépasse le crédit restant.`,"bankWorkspace.net":`Montant net rapproché`,"bankWorkspace.noPayments":`Cette facture ne possède aucun encaissement disponible.`,"bankWorkspace.noInvoices":`Aucune facture émise ou payée disponible.`,"bankWorkspace.noAllocations":`Aucune allocation active.`,"bankWorkspace.cancelAllocation":`Annuler cette allocation`,"bankWorkspace.cancelContext":`Allocation à annuler`,"bankWorkspace.cancelClose":`Conserver cette allocation`,"bankWorkspace.reasonInvalid":`Saisissez un motif de 1 à 500 caractères.`,"bankWorkspace.immutable":`Les allocations et les frais ne se modifient pas. Annulez l’allocation puis créez une nouvelle allocation.`,"bankWorkspace.feePosted":`Si les frais sont comptabilisés, contrepassez leur écriture avant d’annuler l’allocation.`,"bankWorkspace.viewInvoice":`Consulter la facture et ses encaissements`,"bankWorkspace.viewFees":`Consulter les écritures des frais`,"bankWorkspace.ledgerScope":`Ces écritures locales ne constituent ni une comptabilité générale ni un FEC. Aucun transfert bancaire ni calcul de TVA n’est exécuté.`,"bankWorkspace.sources":`Sources à comptabiliser`,"bankWorkspace.journal":`Journal`,"bankWorkspace.sourceType":`Type de source`,"bankWorkspace.entryCount.one":`{count} élément affiché`,"bankWorkspace.entryCount.other":`{count} éléments affichés`,"bankWorkspace.ledgerSearch":`Rechercher une référence ou un libellé`,"bankWorkspace.sourceEmpty":`Aucune source à comptabiliser dans cette période.`,"bankWorkspace.journalEmpty":`Aucune écriture dans cette période.`,"bankWorkspace.ledgerNoMatches":`Aucun élément ne correspond à la recherche.`,"bankWorkspace.postTitle":`Comptabiliser une source`,"bankWorkspace.reverseTitle":`Consulter ou contrepasser une écriture`,"bankWorkspace.sourceMissing":`Cette source est absente de la période ou ne peut plus être comptabilisée.`,"bankWorkspace.entryMissing":`Cette écriture est absente de la période.`,"bankWorkspace.accountCodeInvalid":`Utilisez 1 à 32 lettres, chiffres, points, tirets ou traits de soulignement. Commencez par une lettre ou un chiffre.`,"bankWorkspace.accountsDistinct":`Le compte à créditer doit être différent du compte à débiter.`,"bankWorkspace.labelInvalid":`Saisissez un libellé de 1 à 160 caractères.`,"bankWorkspace.reversalReasonInvalid":`Saisissez un motif de 1 à 160 caractères.`,"bankWorkspace.reversalDateInvalid":`Saisissez une date comprise entre la date de l’écriture et aujourd’hui.`,"bankWorkspace.sourceSnapshot":`Le serveur reprend le montant bancaire. La date comptable tient compte des contrepassations précédentes. La correction exige une contrepassation.`,"bankWorkspace.viewTransaction":`Consulter la transaction`,"bankWorkspace.activeEntry":`Active`,"bankWorkspace.reversedEntry":`Contrepassée`,"bankWorkspace.reversalEntry":`Contrepassation`,"bankWorkspace.entryStatus":`État de l’écriture`,"bankWorkspace.retry":`Réessayer la même opération`,"bankWorkspace.retryHint":`Une reprise conserve la même clé tant que les données ne changent pas.`},en:{"bankWorkspace.supplierPayments":`Supplier payments to reconcile`,"bankWorkspace.supplierPaymentsHint":`Confirm the matching supplier transfer. A suggestion never triggers automatic reconciliation.`,"bankWorkspace.noSupplierPayments":`No supplier payment is available.`,"bankWorkspace.supplierMatchHistory":`Supplier reconciliation history`,"bankWorkspace.supplierConfirm":`Reconcile this supplier payment with the bank debit?`,"bankWorkspace.supplierUnmatchConfirm":`Cancel this supplier reconciliation?`,"bankWorkspace.supplierUnmatchReason":`Cancellation confirmed by a user.`,"bankWorkspace.unmatch":`Unmatch`,"bankWorkspace.actions":`Actions`,"bankWorkspace.suggestions":`Reconciliation suggestions`,"bankWorkspace.suggestionsHint":`Check the invoice, receipt, and amount before you confirm a suggestion.`,"bankWorkspace.suggestionsLoading":`Finding probable matches…`,"bankWorkspace.transactions":`Transactions`,"bankWorkspace.entries":`Entries`,"bankWorkspace.intro":`Review imported transactions. Match credits to receipts already recorded.`,"bankWorkspace.accountHint":`The account is a local label. It does not represent an active bank connection.`,"bankWorkspace.search":`Search descriptions or references`,"bankWorkspace.allAccounts":`All accounts`,"bankWorkspace.allDates":`All dates`,"bankWorkspace.ledgerPeriodRequired":`Enter both dates to load entries and export the period journal.`,"bankWorkspace.account":`Account label`,"bankWorkspace.payment":`Receipt — available amount`,"bankWorkspace.choosePayment":`Choose a receipt`,"bankWorkspace.confirmMatch":`Match this transaction to the selected receipt? No new receipt will be created.`,"bankWorkspace.confirmUnmatch":`Cancel this allocation? The transaction and receipt will be preserved. The reason will remain in the history.`,"bankWorkspace.all":`All`,"bankWorkspace.flow":`Direction`,"bankWorkspace.credit":`Credit`,"bankWorkspace.debit":`Debit`,"bankWorkspace.status":`Reconciliation`,"bankWorkspace.unmatched":`Unmatched`,"bankWorkspace.partial":`Partially matched`,"bankWorkspace.matched":`Matched`,"bankWorkspace.cancelledPayment":`Cancelled receipt`,"bankWorkspace.notApplicable":`Not applicable`,"bankWorkspace.reference":`Reference`,"bankWorkspace.description":`Description`,"bankWorkspace.date":`Date`,"bankWorkspace.amount":`Amount`,"bankWorkspace.count.one":`{count} transaction shown`,"bankWorkspace.count.other":`{count} transactions shown`,"bankWorkspace.clear":`Clear filters`,"bankWorkspace.noMatches":`No transactions match these filters.`,"bankWorkspace.empty":`No imported transactions.`,"bankWorkspace.limit":`The list contains up to the 1,000 most recent transactions.`,"bankWorkspace.ledgerSortLoaded":`Sorting applies to loaded results: up to 10,000 sources and 10,000 entries for the period. It does not change the CSV export.`,"bankWorkspace.historySortLoaded":`Sorting applies to the 100 most recent history events.`,"bankWorkspace.periodExport":`Period journal (CSV)`,"bankWorkspace.periodExportHint":`Server export of the journal for the selected period. The displayed search and sorting do not change this export.`,"bankWorkspace.periodInvalid":`Enter a valid period. The end date must follow the start date.`,"bankWorkspace.back":`Back to transactions`,"bankWorkspace.backLedger":`Back to entries`,"bankWorkspace.unsaved":`Leave this page and discard unsaved changes?`,"bankWorkspace.validate":`Validate file`,"bankWorkspace.confirmImport":`Confirm import`,"bankWorkspace.changeFile":`Change file or account`,"bankWorkspace.fileStep":`1. File and account`,"bankWorkspace.reviewStep":`2. Validation and confirmation`,"bankWorkspace.doneStep":`3. Result`,"bankWorkspace.validationHint":`The server checks every row and existing reference. Confirmation checks the data again before adding transactions.`,"bankWorkspace.statementHint":`Select a CAMT.053, OFX, or UTF-8 CSV file with a maximum size of 500 KB.`,"bankWorkspace.format":`Statement format`,"bankWorkspace.csvConfiguration":`CSV column mapping`,"bankWorkspace.delimiter":`Column delimiter`,"bankWorkspace.comma":`Comma`,"bankWorkspace.semicolon":`Semicolon`,"bankWorkspace.tab":`Tab`,"bankWorkspace.referenceColumn":`Reference column`,"bankWorkspace.dateColumn":`Date column`,"bankWorkspace.amountColumn":`Amount column`,"bankWorkspace.currencyColumn":`Currency column, optional for EUR`,"bankWorkspace.descriptionColumn":`Description column`,"bankWorkspace.dateFormat":`Date format`,"bankWorkspace.decimalSeparator":`Decimal separator`,"bankWorkspace.accountInvalid":`Enter an account label with 1 to 100 characters.`,"bankWorkspace.fileInvalid":`Choose a non-empty UTF-8 statement with a maximum size of 500 KB.`,"bankWorkspace.preview":`Validated transactions`,"bankWorkspace.new":`To add`,"bankWorkspace.existing":`Already present`,"bankWorkspace.importCounts":`{added} to add · {existing} already present`,"bankWorkspace.importDone":`{added} added · {existing} already present`,"bankWorkspace.importAgain":`Import another file`,"bankWorkspace.context":`Imported transaction`,"bankWorkspace.reconciliation":`Reconcile a transaction`,"bankWorkspace.allocations":`Active allocations`,"bankWorkspace.allocate":`Add an allocation`,"bankWorkspace.groupHint":`Add one allocation per receipt. Multiple allocations can match a grouped credit.`,"bankWorkspace.paymentHint":`Only active receipts with an available amount are listed. This operation does not create a receipt.`,"bankWorkspace.invoiceInvalid":`Choose an issued or paid invoice.`,"bankWorkspace.paymentInvalid":`Choose an available receipt for this invoice.`,"bankWorkspace.amountInvalid":`Enter a positive amount with up to two decimals, within the available receipt amount.`,"bankWorkspace.feeInvalid":`Fees must be zero or positive and less than the allocated amount.`,"bankWorkspace.netInvalid":`The allocated amount minus fees exceeds the remaining credit.`,"bankWorkspace.net":`Net matched amount`,"bankWorkspace.noPayments":`This invoice has no available receipts.`,"bankWorkspace.noInvoices":`No issued or paid invoices are available.`,"bankWorkspace.noAllocations":`No active allocations.`,"bankWorkspace.cancelAllocation":`Cancel this allocation`,"bankWorkspace.cancelContext":`Allocation to cancel`,"bankWorkspace.cancelClose":`Keep this allocation`,"bankWorkspace.reasonInvalid":`Enter a reason with 1 to 500 characters.`,"bankWorkspace.immutable":`Allocations and fees cannot be edited. Cancel the allocation, then create a new allocation.`,"bankWorkspace.feePosted":`If fees are posted, reverse their entry before cancelling the allocation.`,"bankWorkspace.viewInvoice":`View invoice and receipts`,"bankWorkspace.viewFees":`View fee entries`,"bankWorkspace.ledgerScope":`These local entries are neither a general ledger nor a French FEC. No bank transfer or VAT calculation is executed.`,"bankWorkspace.sources":`Sources to post`,"bankWorkspace.journal":`Journal`,"bankWorkspace.sourceType":`Source type`,"bankWorkspace.entryCount.one":`{count} item shown`,"bankWorkspace.entryCount.other":`{count} items shown`,"bankWorkspace.ledgerSearch":`Search references or labels`,"bankWorkspace.sourceEmpty":`No sources to post in this period.`,"bankWorkspace.journalEmpty":`No entries in this period.`,"bankWorkspace.ledgerNoMatches":`No items match this search.`,"bankWorkspace.postTitle":`Post a source`,"bankWorkspace.reverseTitle":`View or reverse an entry`,"bankWorkspace.sourceMissing":`This source is absent from the period or is no longer available to post.`,"bankWorkspace.entryMissing":`This entry is absent from the period.`,"bankWorkspace.accountCodeInvalid":`Use 1 to 32 letters, digits, dots, hyphens or underscores. Start with a letter or digit.`,"bankWorkspace.accountsDistinct":`The credit account must differ from the debit account.`,"bankWorkspace.labelInvalid":`Enter a label with 1 to 160 characters.`,"bankWorkspace.reversalReasonInvalid":`Enter a reason with 1 to 160 characters.`,"bankWorkspace.reversalDateInvalid":`Enter a date between the entry date and today.`,"bankWorkspace.sourceSnapshot":`The server copies the bank amount. The posting date accounts for previous reversals. Corrections require a reversal.`,"bankWorkspace.viewTransaction":`View transaction`,"bankWorkspace.activeEntry":`Active`,"bankWorkspace.reversedEntry":`Reversed`,"bankWorkspace.reversalEntry":`Reversal`,"bankWorkspace.entryStatus":`Entry status`,"bankWorkspace.retry":`Retry the same operation`,"bankWorkspace.retryHint":`Retries keep the same key while the data stays unchanged.`}};var P$1={fr:{"dashboardWorkspace.recent":`Documents récemment modifiés`,"dashboardWorkspace.recentHint":`Dates de modification des documents, sans journal d’audit.`,"dashboardWorkspace.noRecent":`Aucun document disponible.`,"dashboardWorkspace.task":`Action`,"dashboardWorkspace.waiting":`Attente normale`,"dashboardWorkspace.blocked":`Blocage : client archivé`,"dashboardWorkspace.contactBlocked":`Blocage : coordonnées incomplètes`,"dashboardWorkspace.completeClient":`Compléter le client`,"dashboardWorkspace.reviewClient":`Consulter le client`,"dashboardWorkspace.editQuote":`Préparer le devis`,"dashboardWorkspace.followQuote":`Consulter le devis envoyé`,"dashboardWorkspace.issueInvoice":`Finaliser la facture`,"dashboardWorkspace.followInvoice":`Consulter la facture`,"dashboardWorkspace.remindInvoice":`Préparer une relance`,"dashboardWorkspace.pdfBlocked":`Blocage : PDF en échec`,"dashboardWorkspace.loadedAt":`Données chargées le`,"globalSearch.count.one":`{count} résultat affiché · Maximum : 5 par catégorie.`,"globalSearch.count.other":`{count} résultats affichés · Maximum : 5 par catégorie.`,"globalSearch.close":`Fermer la recherche`,"globalSearch.hint":`Recherchez une action, un nom, une référence ou un titre.`,"globalSearch.action.createQuote":`Créer un devis`,"globalSearch.action.createQuoteDetail":`Ouvrir le formulaire de création d’un devis.`,"globalSearch.action.createQuoteAliases":`nouveau devis proposition commerciale`,"globalSearch.action.createClient":`Créer un client`,"globalSearch.action.createClientDetail":`Ouvrir le formulaire de création d’un client.`,"globalSearch.action.createClientAliases":`nouveau client prospect entreprise`,"globalSearch.action.createAffair":`Créer une affaire`,"globalSearch.action.createAffairDetail":`Ouvrir la liste et le formulaire des affaires.`,"globalSearch.action.createAffairAliases":`nouvelle affaire dossier projet`,"globalSearch.action.createPurchase":`Saisir un achat`,"globalSearch.action.createPurchaseDetail":`Créer une facture fournisseur.`,"globalSearch.action.createPurchaseAliases":`nouvel achat dépense facture fournisseur`,"globalSearch.action.createSupplier":`Créer un fournisseur`,"globalSearch.action.createSupplierDetail":`Ouvrir le formulaire de création d’un fournisseur.`,"globalSearch.action.createSupplierAliases":`nouveau fournisseur prestataire`,"globalSearch.action.createCatalogItem":`Ajouter un article au catalogue`,"globalSearch.action.createCatalogItemDetail":`Créer une prestation ou un produit réutilisable.`,"globalSearch.action.createCatalogItemAliases":`nouvel article prestation produit catalogue`,"globalSearch.action.composeEmail":`Rédiger un e-mail`,"globalSearch.action.composeEmailDetail":`Créer un brouillon de message.`,"globalSearch.action.composeEmailAliases":`nouveau message courriel email brouillon`,"clientsWorkspace.countryFilter":`Tous les pays`,"clientsWorkspace.updatedAt":`Dernière modification`,"clientsWorkspace.contactFilter":`Coordonnées`,"clientsWorkspace.contactAll":`Toutes les coordonnées`,"clientsWorkspace.contactIncomplete":`Coordonnées incomplètes`,"clientsWorkspace.contactHint":`Nom, courriel et adresse de facturation requis pour publier.`,"clientsWorkspace.resetFilters":`Effacer les filtres`,"clientsWorkspace.affairs":`Affaires`,"clientsWorkspace.affairsEmpty":`Aucune affaire pour ce client`,"clientsWorkspace.accessCreateTitle":`Créer un accès client`,"clientsWorkspace.accessCreateIntro":`Créez un compte pour consulter les documents de ce client.`,"clientsWorkspace.accessBack":`Retour aux accès`,"portalWorkspace.search":`Rechercher un document`,"portalWorkspace.kind":`Type de document`,"portalWorkspace.all":`Tous les documents`,"portalWorkspace.status":`État`,"portalWorkspace.allStatuses":`Tous les états`,"portalWorkspace.open":`En cours`,"portalWorkspace.completed":`Terminés`,"portalWorkspace.count.one":`{count} document`,"portalWorkspace.count.other":`{count} documents`,"portalWorkspace.empty":`Aucun document ne correspond aux filtres`,"portalWorkspace.back":`Retour aux documents`,"portalWorkspace.detail":`Détail du document`,"portalWorkspace.notFound":`Ce document est introuvable ou inaccessible avec votre compte.`,"portalWorkspace.snapshot":`Le PDF contient les parties et les lignes du document publié.`,"portalWorkspace.signatureLink":`Pour signer ce devis, utilisez le lien personnel reçu par courriel.`,"portalWorkspace.updated":`Dernière modification`,"portalWorkspace.created":`Création`,"publicQuoteWorkspace.confirmation":`Confirmation`,"publicQuoteWorkspace.confirmationPending":`Aucune signature enregistrée pendant cette consultation.`,"publicQuoteWorkspace.documentNext":`Consulter le document`,"publicQuoteWorkspace.signatureNext":`Passer à la signature`,"publicQuoteWorkspace.acceptedAt":`Accepté le`,"publicQuoteWorkspace.order":`Commande créée`,"publicQuoteWorkspace.notSignable":`Ce devis ne peut pas être signé.`},en:{"dashboardWorkspace.recent":`Recently modified documents`,"dashboardWorkspace.recentHint":`Document modification dates, not an audit log.`,"dashboardWorkspace.noRecent":`No documents available.`,"dashboardWorkspace.task":`Action`,"dashboardWorkspace.waiting":`Normal waiting state`,"dashboardWorkspace.blocked":`Blocked: archived client`,"dashboardWorkspace.contactBlocked":`Blocked: incomplete contact details`,"dashboardWorkspace.completeClient":`Complete client details`,"dashboardWorkspace.reviewClient":`View client`,"dashboardWorkspace.editQuote":`Prepare quote`,"dashboardWorkspace.followQuote":`View sent quote`,"dashboardWorkspace.issueInvoice":`Finalize invoice`,"dashboardWorkspace.followInvoice":`View invoice`,"dashboardWorkspace.remindInvoice":`Prepare reminder`,"dashboardWorkspace.pdfBlocked":`Blocked: PDF failed`,"dashboardWorkspace.loadedAt":`Data loaded on`,"globalSearch.count.one":`{count} displayed result · Maximum: 5 per category.`,"globalSearch.count.other":`{count} displayed results · Maximum: 5 per category.`,"globalSearch.close":`Close search`,"globalSearch.hint":`Search for an action, name, reference, or title.`,"globalSearch.action.createQuote":`Create a quote`,"globalSearch.action.createQuoteDetail":`Open the quote creation form.`,"globalSearch.action.createQuoteAliases":`new quote proposal estimate`,"globalSearch.action.createClient":`Create a client`,"globalSearch.action.createClientDetail":`Open the client creation form.`,"globalSearch.action.createClientAliases":`new client prospect company`,"globalSearch.action.createAffair":`Create an affair`,"globalSearch.action.createAffairDetail":`Open the affair list and creation form.`,"globalSearch.action.createAffairAliases":`new affair case project`,"globalSearch.action.createPurchase":`Enter a purchase`,"globalSearch.action.createPurchaseDetail":`Create a supplier invoice.`,"globalSearch.action.createPurchaseAliases":`new purchase expense supplier invoice`,"globalSearch.action.createSupplier":`Create a supplier`,"globalSearch.action.createSupplierDetail":`Open the supplier creation form.`,"globalSearch.action.createSupplierAliases":`new supplier vendor`,"globalSearch.action.createCatalogItem":`Add a catalog item`,"globalSearch.action.createCatalogItemDetail":`Create a reusable service or product.`,"globalSearch.action.createCatalogItemAliases":`new catalog item service product`,"globalSearch.action.composeEmail":`Compose an email`,"globalSearch.action.composeEmailDetail":`Create a message draft.`,"globalSearch.action.composeEmailAliases":`new message email draft`,"clientsWorkspace.countryFilter":`All countries`,"clientsWorkspace.updatedAt":`Last modified`,"clientsWorkspace.contactFilter":`Contact details`,"clientsWorkspace.contactAll":`All contact details`,"clientsWorkspace.contactIncomplete":`Incomplete contact details`,"clientsWorkspace.contactHint":`Name, email, and billing address are required for publication.`,"clientsWorkspace.resetFilters":`Clear filters`,"clientsWorkspace.affairs":`Business cases`,"clientsWorkspace.affairsEmpty":`No business cases for this client`,"clientsWorkspace.accessCreateTitle":`Create client access`,"clientsWorkspace.accessCreateIntro":`Create an account to view this client’s documents.`,"clientsWorkspace.accessBack":`Back to access accounts`,"portalWorkspace.search":`Search documents`,"portalWorkspace.kind":`Document type`,"portalWorkspace.all":`All documents`,"portalWorkspace.status":`Status`,"portalWorkspace.allStatuses":`All statuses`,"portalWorkspace.open":`In progress`,"portalWorkspace.completed":`Completed`,"portalWorkspace.count.one":`{count} document`,"portalWorkspace.count.other":`{count} documents`,"portalWorkspace.empty":`No documents match the filters`,"portalWorkspace.back":`Back to documents`,"portalWorkspace.detail":`Document details`,"portalWorkspace.notFound":`This document is missing or unavailable for your account.`,"portalWorkspace.snapshot":`The PDF contains the parties and lines of the published document.`,"portalWorkspace.signatureLink":`To sign this quote, use the personal link sent by email.`,"portalWorkspace.updated":`Last modified`,"portalWorkspace.created":`Created`,"publicQuoteWorkspace.confirmation":`Confirmation`,"publicQuoteWorkspace.confirmationPending":`No signature was recorded during this consultation.`,"publicQuoteWorkspace.documentNext":`View document`,"publicQuoteWorkspace.signatureNext":`Continue to signature`,"publicQuoteWorkspace.acceptedAt":`Accepted on`,"publicQuoteWorkspace.order":`Order created`,"publicQuoteWorkspace.notSignable":`This quote cannot be signed.`}};var D$1={fr:{"configurationWorkspace.allRows":`Toutes les lignes`,"configurationWorkspace.searchMembers":`Rechercher des membres`,"configurationWorkspace.searchInvitations":`Rechercher des invitations`,"configurationWorkspace.searchTokens":`Rechercher un nom ou une permission`,"configurationWorkspace.searchConditions":`Rechercher dans les noms et les conditions`,"configurationWorkspace.searchTests":`Rechercher dans les tests chargés`,"configurationWorkspace.createdAt":`Création`,"configurationWorkspace.teamExportScope":`L’export exclut les noms, courriels, identifiants de compte et liens d’invitation.`,"configurationWorkspace.revokedTokens":`Jetons révoqués`,"configurationWorkspace.notRevokedTokens":`Jetons non révoqués, y compris expirés`,"configurationWorkspace.backConfiguration":`Retour à la configuration`,"configurationWorkspace.reload":`Recharger les données`,"configurationWorkspace.company":`Entreprise`,"configurationWorkspace.companyHint":`Coordonnées et identifiants utilisés dans vos documents.`,"configurationWorkspace.documents":`Documents et supports`,"configurationWorkspace.documentsHint":`Conditions réutilisables et carte de visite.`,"configurationWorkspace.access":`Accès`,"configurationWorkspace.accessHint":`Membres de l’équipe, invitations et jetons API.`,"configurationWorkspace.services":`Services`,"configurationWorkspace.servicesHint":`Configuration des fournisseurs, tests et simulations techniques.`,"configurationWorkspace.audit":`Audit`,"configurationWorkspace.identity":`Identité`,"configurationWorkspace.address":`Adresse et contact`,"configurationWorkspace.identifiers":`Identifiants administratifs et fiscaux`,"configurationWorkspace.businessCard":`Carte de visite`,"configurationWorkspace.newCondition":`Créer des conditions`,"configurationWorkspace.editCondition":`Modifier les conditions`,"configurationWorkspace.backConditions":`Retour aux conditions`,"configurationWorkspace.preview":`Aperçu`,"configurationWorkspace.notFound":`Cet élément ne figure pas dans les données disponibles.`,"configurationWorkspace.newInvitation":`Inviter un membre`,"configurationWorkspace.backTeam":`Retour à l’équipe`,"configurationWorkspace.chooseProfile":`Choisir un profil`,"configurationWorkspace.profileRequired":`Choisissez un profil pour cette invitation.`,"configurationWorkspace.invitationInvalid":`Renseignez un nom et une adresse de courriel valides.`,"configurationWorkspace.inviteConfirm":`Créer une invitation pour {name} ({email}) avec le profil {profile} ? Aucun courriel ne sera envoyé.`,"configurationWorkspace.memberProfile":`Profil du membre`,"configurationWorkspace.applyProfile":`Appliquer le profil`,"configurationWorkspace.status":`État`,"configurationWorkspace.actions":`Actions`,"configurationWorkspace.backTokens":`Retour aux jetons API`,"configurationWorkspace.permissionCount.one":`{count} permission`,"configurationWorkspace.permissionCount.other":`{count} permissions`,"configurationWorkspace.permissionSelection.one":`{count} sélectionnée sur {total}`,"configurationWorkspace.permissionSelection.other":`{count} sélectionnées sur {total}`,"configurationWorkspace.tokenInvalid":`Renseignez un nom, une expiration future et au moins une permission.`,"configurationWorkspace.tokenConfirm.one":`Créer le jeton « {name} » avec {count} permission ?`,"configurationWorkspace.tokenConfirm.other":`Créer le jeton « {name} » avec {count} permissions ?`,"configurationWorkspace.unsaved":`Quitter cette page et abandonner les modifications non enregistrées ?`,"configurationWorkspace.connection":`Configuration de la connexion`,"configurationWorkspace.tests":`Tests`,"configurationWorkspace.newTest":`Nouveau test`,"configurationWorkspace.testDetail":`Détail du test`,"configurationWorkspace.backTests":`Retour aux tests`,"configurationWorkspace.notVerified":`La présence des secrets ne prouve pas que la connexion fonctionne. Aucun test externe n’est lancé à l’ouverture.`,"configurationWorkspace.providerSetup":`Les secrets sont gérés dans la configuration du déploiement. Cette page ne les affiche pas et ne les modifie pas.`,"configurationWorkspace.testComplete":`La demande est enregistrée. Consultez son détail pour suivre son état. Cette page ne soumettra pas une deuxième demande.`,"configurationWorkspace.resumeTest":`Reprendre une demande incertaine`,"configurationWorkspace.simulations":`Simulations techniques`,"configurationWorkspace.simulationDomain":`Domaine à simuler`,"configurationWorkspace.chooseDomain":`Choisir un domaine`,"configurationWorkspace.domainRequired":`Choisissez un domaine.`,"configurationWorkspace.account":`Compte`,"configurationWorkspace.accountHint":`Thème, langue et présentation des messages de votre compte.`,"configurationWorkspace.security":`Sécurité`,"configurationWorkspace.passkeys":`Passkeys`,"configurationWorkspace.sessions":`Sessions`,"configurationWorkspace.preferences":`Préférences`,"configurationWorkspace.language":`Langue`,"configurationWorkspace.passwordInvalid":`Vérifiez les champs du mot de passe.`},en:{"configurationWorkspace.allRows":`All rows`,"configurationWorkspace.searchMembers":`Search members`,"configurationWorkspace.searchInvitations":`Search invitations`,"configurationWorkspace.searchTokens":`Search names or permissions`,"configurationWorkspace.searchConditions":`Search names and conditions`,"configurationWorkspace.searchTests":`Search loaded tests`,"configurationWorkspace.createdAt":`Created`,"configurationWorkspace.teamExportScope":`Export excludes names, email addresses, account identifiers and invitation links.`,"configurationWorkspace.revokedTokens":`Revoked tokens`,"configurationWorkspace.notRevokedTokens":`Tokens not revoked, including expired tokens`,"configurationWorkspace.backConfiguration":`Back to settings`,"configurationWorkspace.reload":`Reload data`,"configurationWorkspace.company":`Company`,"configurationWorkspace.companyHint":`Contact details and identifiers used in your documents.`,"configurationWorkspace.documents":`Documents and materials`,"configurationWorkspace.documentsHint":`Reusable conditions and business card.`,"configurationWorkspace.access":`Access`,"configurationWorkspace.accessHint":`Team members, invitations and API tokens.`,"configurationWorkspace.services":`Services`,"configurationWorkspace.servicesHint":`Provider configuration, tests and technical simulations.`,"configurationWorkspace.audit":`Audit`,"configurationWorkspace.identity":`Identity`,"configurationWorkspace.address":`Address and contact`,"configurationWorkspace.identifiers":`Administrative and tax identifiers`,"configurationWorkspace.businessCard":`Business card`,"configurationWorkspace.newCondition":`Create conditions`,"configurationWorkspace.editCondition":`Edit conditions`,"configurationWorkspace.backConditions":`Back to conditions`,"configurationWorkspace.preview":`Preview`,"configurationWorkspace.notFound":`This item is not in the available data.`,"configurationWorkspace.newInvitation":`Invite a member`,"configurationWorkspace.backTeam":`Back to team`,"configurationWorkspace.chooseProfile":`Choose a profile`,"configurationWorkspace.profileRequired":`Choose a profile for this invitation.`,"configurationWorkspace.invitationInvalid":`Enter a valid name and email address.`,"configurationWorkspace.inviteConfirm":`Create an invitation for {name} ({email}) with the {profile} profile? No email will be sent.`,"configurationWorkspace.memberProfile":`Member profile`,"configurationWorkspace.applyProfile":`Apply profile`,"configurationWorkspace.status":`Status`,"configurationWorkspace.actions":`Actions`,"configurationWorkspace.backTokens":`Back to API tokens`,"configurationWorkspace.permissionCount.one":`{count} permission`,"configurationWorkspace.permissionCount.other":`{count} permissions`,"configurationWorkspace.permissionSelection.one":`{count} selected of {total}`,"configurationWorkspace.permissionSelection.other":`{count} selected of {total}`,"configurationWorkspace.tokenInvalid":`Enter a name, a future expiration and at least one permission.`,"configurationWorkspace.tokenConfirm.one":`Create the token “{name}” with {count} permission?`,"configurationWorkspace.tokenConfirm.other":`Create the token “{name}” with {count} permissions?`,"configurationWorkspace.unsaved":`Leave this page and discard unsaved changes?`,"configurationWorkspace.connection":`Connection configuration`,"configurationWorkspace.tests":`Tests`,"configurationWorkspace.newTest":`New test`,"configurationWorkspace.testDetail":`Test details`,"configurationWorkspace.backTests":`Back to tests`,"configurationWorkspace.notVerified":`The presence of secrets does not prove that the connection works. Opening this page does not start an external test.`,"configurationWorkspace.providerSetup":`Secrets are managed in deployment configuration. This page does not display or change them.`,"configurationWorkspace.testComplete":`The request is recorded. Open its details to follow its status. This page will not submit a second request.`,"configurationWorkspace.resumeTest":`Resume an uncertain request`,"configurationWorkspace.simulations":`Technical simulations`,"configurationWorkspace.simulationDomain":`Simulation domain`,"configurationWorkspace.chooseDomain":`Choose a domain`,"configurationWorkspace.domainRequired":`Choose a domain.`,"configurationWorkspace.account":`Account`,"configurationWorkspace.accountHint":`Theme, language, and message presentation for your account.`,"configurationWorkspace.security":`Security`,"configurationWorkspace.passkeys":`Passkeys`,"configurationWorkspace.sessions":`Sessions`,"configurationWorkspace.preferences":`Preferences`,"configurationWorkspace.language":`Language`,"configurationWorkspace.passwordInvalid":`Check the password fields.`}};var E$2={fr:{"audit.searchPage":`Rechercher sur cette page`,"audit.serverFilters":`Filtres du journal entier`,"audit.exportPage":`Exporter cette page filtrée en CSV, sans identifiants d’acteur`,"audit.visibleCount.one":`{count} événement affiché`,"audit.visibleCount.other":`{count} événements affichés`,"audit.loadedCount.one":`sur {count} événement chargé.`,"audit.loadedCount.other":`sur {count} événements chargés.`,"audit.title":`Journal d’audit`,"audit.readDenied":`Votre compte ne permet pas de consulter le journal d’audit.`,"audit.intro":`Événements enregistrés dans la base locale. Ce journal ne contient pas les journaux externes des fournisseurs.`,"audit.open":`Ouvrir le journal d’audit`,"audit.action":`Action`,"audit.resourceType":`Type de ressource`,"audit.resource":`Ressource`,"audit.actor":`Identifiant de l’acteur`,"audit.actorUnknown":`Non renseigné`,"audit.date":`Date`,"audit.allActions":`Toutes les actions`,"audit.allResources":`Tous les types de ressource`,"audit.resourceHint":`Filtre exact, par exemple quote, invoice ou client. Laissez ce champ vide pour tous les types.`,"audit.filterInvalid":`Saisissez un type de ressource composé de lettres minuscules et de tirets.`,"audit.apply":`Appliquer les filtres`,"audit.reset":`Effacer les filtres`,"audit.reload":`Recharger cette page`,"audit.loading":`Chargement du journal…`,"audit.empty":`Aucun événement pour cette page et ces filtres.`,"audit.invalid_query":`Les paramètres de cette adresse sont invalides. Effacez les filtres pour revenir au début du journal.`,"audit.unavailable":`Le journal est indisponible. Aucune donnée d’audit n’a été chargée.`,"audit.navigation":`Pages du journal d’audit`,"audit.previous":`Précédent — plus récents`,"audit.next":`Suivant — plus anciens`,"audit.count.one":`{count} événement sur cette page`,"audit.count.other":`{count} événements sur cette page`},en:{"audit.searchPage":`Search this page`,"audit.serverFilters":`Filters for the entire log`,"audit.exportPage":`Export this filtered page as CSV, without actor identifiers`,"audit.visibleCount.one":`{count} event displayed`,"audit.visibleCount.other":`{count} events displayed`,"audit.loadedCount.one":`from {count} loaded event.`,"audit.loadedCount.other":`from {count} loaded events.`,"audit.title":`Audit log`,"audit.readDenied":`Your account cannot view the audit log.`,"audit.intro":`Events recorded in the local database. This log does not include external provider logs.`,"audit.open":`Open the audit log`,"audit.action":`Action`,"audit.resourceType":`Resource type`,"audit.resource":`Resource`,"audit.actor":`Actor identifier`,"audit.actorUnknown":`Not recorded`,"audit.date":`Date`,"audit.allActions":`All actions`,"audit.allResources":`All resource types`,"audit.resourceHint":`Exact filter, for example quote, invoice or client. Leave empty for all types.`,"audit.filterInvalid":`Enter a resource type that contains lowercase letters and hyphens.`,"audit.apply":`Apply filters`,"audit.reset":`Clear filters`,"audit.reload":`Reload this page`,"audit.loading":`Loading the audit log…`,"audit.empty":`No events for this page and these filters.`,"audit.invalid_query":`This address contains invalid parameters. Clear the filters to return to the start of the log.`,"audit.unavailable":`The log is unavailable. No audit data was loaded.`,"audit.navigation":`Audit log pages`,"audit.previous":`Previous — newer`,"audit.next":`Next — older`,"audit.count.one":`{count} event on this page`,"audit.count.other":`{count} events on this page`}};var c$2={fr:{group:{title:`Audit`,description:`Lecture protégée des événements enregistrés dans la base locale.`},operations:{auditEventList:{summary:`Lire une page du journal d’audit local`,description:"Exige une session autorisée avec la permission `audit.read`. Cette permission n’est pas accordable aux jetons API. Retourne uniquement `id`, `action`, `actorUserId`, `resourceType`, `resourceId` et `occurredAt`. Ne retourne ni métadonnées, ni secrets, ni corrélation de trace ou de requête. Le serveur définit la taille des pages avec `AUDIT_PAGE_SIZE`, chargé par Effect Config. Sans `limit`, la requête utilise cette taille. Une limite explicite doit être un entier positif inférieur ou égal à cette taille. Un dépassement retourne HTTP 400 avec `audit.invalid_query`, sans lecture du journal. Les filtres `action` et `resourceType` sont exacts et se combinent. Sans curseur, la réponse contient les événements les plus récents. Avec `direction=older` ou sans direction, `cursor` exclut cet identifiant et sélectionne les identifiants inférieurs. Avec `direction=newer`, un curseur est obligatoire et la réponse contient les événements immédiatement supérieurs. Toutes les pages sont ordonnées par identifiant ULID décroissant. Les ULID sont créés à la date de l’événement. `previousCursor` s’utilise avec `direction=newer`, et `nextCursor` avec `direction=older`. Une valeur null indique l’absence de page dans cette direction pour les filtres actifs. La pagination ne fournit aucun total ni instantané entre requêtes. La réponse est privée et non mise en cache. Ce journal ne remplace pas les journaux externes des fournisseurs."}}},en:{group:{title:`Audit`,description:`Protected access to events recorded in the local database.`},operations:{auditEventList:{summary:`Read a page of the local audit log`,description:"Requires an authorized session with the `audit.read` permission. API tokens cannot receive this permission. Returns only `id`, `action`, `actorUserId`, `resourceType`, `resourceId` and `occurredAt`. Excludes metadata, secrets, trace identifiers and request identifiers. The server sets the page size through `AUDIT_PAGE_SIZE`, loaded by Effect Config. Without `limit`, the request uses that size. An explicit limit must be a positive integer no greater than that size. A larger limit returns HTTP 400 with `audit.invalid_query`, without reading the log. The exact `action` and `resourceType` filters apply together. Without a cursor, the response contains the newest events. With `direction=older` or no direction, `cursor` excludes that identifier and selects lower identifiers. With `direction=newer`, a cursor is required and the response contains the immediately higher events. Every page uses descending ULID order. ULIDs are created at the event time. Use `previousCursor` with `direction=newer` and `nextCursor` with `direction=older`. A null value means that no page exists in that direction for the active filters. Pagination provides neither a total nor a snapshot across requests. Responses are private and are not cached. This log does not replace external provider logs."}}}};var _$1={fr:{"listWorkspace.search":`Rechercher dans la liste`,"listWorkspace.filters":`Filtres`,"listWorkspace.closeFilters":`Fermer les filtres`,"listWorkspace.backFilters":`Revenir aux catégories de filtres`,"listWorkspace.searchChoices":`Rechercher une option`,"listWorkspace.noChoices":`Aucune option ne correspond.`,"listWorkspace.exportCsv":`Exporter les résultats affichés (CSV)`,"listWorkspace.exportEmpty":`Aucun résultat affiché à exporter.`,"listWorkspace.exportPending":`Attendez la fin du chargement pour exporter les résultats affichés.`},en:{"listWorkspace.search":`Search this list`,"listWorkspace.filters":`Filters`,"listWorkspace.closeFilters":`Close filters`,"listWorkspace.backFilters":`Back to filter categories`,"listWorkspace.searchChoices":`Search options`,"listWorkspace.noChoices":`No matching options.`,"listWorkspace.exportCsv":`Export displayed results (CSV)`,"listWorkspace.exportEmpty":`There are no displayed results to export.`,"listWorkspace.exportPending":`Wait for loading to finish before exporting the displayed results.`}};var z$2={fr:{"dateRangeFilter.label":`Période`,"dateRangeFilter.from":`Début`,"dateRangeFilter.to":`Fin`,"dateRangeFilter.apply":`Appliquer`,"dateRangeFilter.clear":`Effacer`,"dateRangeFilter.invalidDate":`Saisissez une date valide.`,"dateRangeFilter.invalidOrder":`La fin doit être égale ou postérieure au début.`},en:{"dateRangeFilter.label":`Date range`,"dateRangeFilter.from":`From`,"dateRangeFilter.to":`To`,"dateRangeFilter.apply":`Apply`,"dateRangeFilter.clear":`Clear`,"dateRangeFilter.invalidDate":`Enter a valid date.`,"dateRangeFilter.invalidOrder":`The end date must be on or after the start date.`}};var F$2={fr:{"team.reload":`Recharger les comptes et invitations`,"team.reloadConfirm":`Recharger les comptes et invitations ? Les profils non enregistrés seront perdus.`,"team.title":`Équipe`,"team.loadError":`Impossible de charger les comptes et invitations. Rechargez la liste.`,"team.inviteUnconfirmed":`La création de l’invitation reste à confirmer. Conservez la demande en cours. Reprenez cette même demande.`,"team.cancelUnconfirmed":`L’annulation de l’invitation reste à confirmer. Rechargez la liste pour vérifier son état.`,"team.updateUnconfirmed":`La modification de l’accès reste à confirmer. Rechargez la liste pour vérifier le profil et l’état du compte.`,"team.joinUnconfirmed":`La création de votre compte reste à confirmer. Essayez de vous connecter avec l’adresse invitée et le mot de passe choisi.`,"team.cancelRejected":`L’annulation de cette invitation a été refusée. Vérifiez son état et les permissions de votre compte.`,"team.cancelDenied":`Votre compte ne permet pas d’annuler cette invitation.`,"team.updateDenied":`Votre compte ne permet pas de modifier les accès de ce membre.`,"team.updateRejected":`La modification de cet accès a été refusée. Vérifiez les données actuelles du compte et vos permissions.`,"team.inviteInvalid":`Vérifiez le nom, l’adresse de connexion et le profil de la personne invitée.`,"team.intro":`Invitez un collaborateur ou un comptable. Les comptes administrateurs existants ne sont pas modifiés ici.`,"team.profiles":`Le comptable consulte les documents, règlements et relevés, sans modification. Le collaborateur gère les clients, documents commerciaux, règlements et rapprochements. Aucun profil ne gère les comptes ni les jetons API.`,"team.saved":`Modification enregistrée.`,"team.name":`Nom`,"team.email":`Adresse de connexion`,"team.profile":`Profil`,"team.accountant":`Comptable — lecture seule`,"team.accountingValidator":`Valideur comptable`,"team.accountingReader":`Lecteur comptable`,"team.collaborator":`Collaborateur`,"team.invite":`Créer une invitation`,"team.link":`Lien d’invitation`,"team.linkHint":`Aucun courriel n’a été envoyé. Transmettez ce lien confidentiel au destinataire par un canal sûr. Il expire après sept jours.`,"team.linkSaved":`J’ai conservé le lien`,"team.members":`Comptes de l’équipe`,"team.active":`Actif`,"team.disabled":`Désactivé`,"team.disable":`Désactiver l’accès`,"team.enable":`Réactiver l’accès`,"team.changeProfile":`Changer de profil`,"team.empty":`Aucun élément.`,"team.invitations":`Les 100 dernières invitations`,"team.expires":`Expiration :`,"team.accepted":`Acceptée`,"team.cancelled":`Annulée`,"team.expired":`Expirée`,"team.cancel":`Annuler l’invitation`,"team.confirmCancel":`Annuler cette invitation ? Son lien ne permettra plus de créer un compte.`,"team.confirmUpdate":`Modifier cet accès ? Toutes les sessions et tous les jetons API de ce compte seront révoqués.`,"team.leave":`Quitter cette page ? Les données non enregistrées et le lien affiché ne seront pas conservés.`,"team.error":`Le résultat de cette demande reste à confirmer. Vérifiez les comptes et invitations avant de recommencer.`,"team.email_exists":`Cette adresse appartient déjà à un compte. Utilisez une autre adresse ou gérez le compte existant.`,"team.invitation_exists":`Une invitation active existe pour cette adresse. Retrouvez-la dans la liste ou annulez-la avant de recommencer.`,"team.invitation_limit":`La limite de 100 invitations actives est atteinte. Annulez une invitation inutilisée avant de recommencer.`,"team.invitation_changed":`Les données diffèrent de la demande déjà enregistrée. Rechargez la liste avant de créer une autre invitation.`,"team.invitation_inactive":`Cette invitation a expiré, a été annulée ou a déjà été acceptée. Rechargez la liste.`,"team.invitation_permission":`Votre compte ne permet pas de créer cette invitation. Demandez à un administrateur de vérifier les permissions de votre compte.`,"team.conflict":`Cette demande a été refusée. Vérifiez les données actuelles et les permissions de votre compte.`,"team.invitation_rejected":`Invitation indisponible, expirée ou déjà utilisée. Demandez une nouvelle invitation à l’administrateur.`,"team.role_unavailable":`Ce rôle personnalisé n’est plus disponible. Choisissez un autre rôle.`,"team.last_administrator":`Conservez au moins un administrateur actif.`,"team.join":`Rejoindre l’équipe`,"team.joinHint":`Le lien crée un compte pour l’adresse et le profil choisis par l’administrateur. Choisissez votre mot de passe.`,"team.password":`Mot de passe`,"team.confirmPassword":`Confirmer le mot de passe`,"team.passwordHint":`Utilisez entre 12 et 256 caractères.`,"team.passwordInvalid":`Utilisez entre 12 et 256 caractères et deux mots de passe identiques.`,"team.accept":`Créer mon compte`,"team.joined":`Compte créé. Connectez-vous avec l’adresse invitée et votre mot de passe.`,"team.login":`Se connecter`},en:{"team.reload":`Reload accounts and invitations`,"team.reloadConfirm":`Reload accounts and invitations? Unsaved profiles will be lost.`,"team.title":`Team`,"team.loadError":`Unable to load accounts and invitations. Reload the list.`,"team.inviteUnconfirmed":`Invitation creation is unconfirmed. Keep the current request. Resume that same request.`,"team.cancelUnconfirmed":`Invitation cancellation is unconfirmed. Reload the list to check its status.`,"team.updateUnconfirmed":`The access change is unconfirmed. Reload the list to check the account profile and status.`,"team.joinUnconfirmed":`Account creation is unconfirmed. Try signing in with the invited email address and the password you chose.`,"team.cancelRejected":`Cancellation of this invitation was rejected. Check its status and your account permissions.`,"team.cancelDenied":`Your account cannot cancel this invitation.`,"team.updateDenied":`Your account cannot change this member’s access.`,"team.updateRejected":`The change to this account’s access was rejected. Check its current details and your permissions.`,"team.inviteInvalid":`Check the invited person’s name, sign-in email address and profile.`,"team.intro":`Invite a collaborator or an accountant. Existing administrator accounts are not changed here.`,"team.profiles":`The accountant reads documents, payments and statements without changes. The collaborator manages clients, commercial documents, payments and reconciliation. Neither profile manages accounts or API tokens.`,"team.saved":`Change saved.`,"team.name":`Name`,"team.email":`Login email`,"team.profile":`Profile`,"team.accountant":`Accountant — read only`,"team.accountingValidator":`Accounting validator`,"team.accountingReader":`Accounting reader`,"team.collaborator":`Collaborator`,"team.invite":`Create invitation`,"team.link":`Invitation link`,"team.linkHint":`No email was sent. Share this confidential link with the recipient through a secure channel. It expires after seven days.`,"team.linkSaved":`I have saved the link`,"team.members":`Team accounts`,"team.active":`Active`,"team.disabled":`Disabled`,"team.disable":`Disable access`,"team.enable":`Enable access`,"team.changeProfile":`Change profile`,"team.empty":`No items.`,"team.invitations":`Latest 100 invitations`,"team.expires":`Expires:`,"team.accepted":`Accepted`,"team.cancelled":`Cancelled`,"team.expired":`Expired`,"team.cancel":`Cancel invitation`,"team.confirmCancel":`Cancel this invitation? Its link will no longer create an account.`,"team.confirmUpdate":`Change this access? All sessions and API tokens for this account will be revoked.`,"team.leave":`Leave this page? Unsaved data and the displayed link will not be kept.`,"team.error":`The result of this request is unconfirmed. Check accounts and invitations before trying again.`,"team.email_exists":`This address already belongs to an account. Use another address or manage the existing account.`,"team.invitation_exists":`An active invitation exists for this address. Find it in the list or cancel it before trying again.`,"team.invitation_limit":`The limit of 100 active invitations has been reached. Cancel an unused invitation before trying again.`,"team.invitation_changed":`The data differs from the saved request. Reload the list before creating another invitation.`,"team.invitation_inactive":`This invitation has expired, was cancelled or was already accepted. Reload the list.`,"team.invitation_permission":`Your account cannot create this invitation. Ask an administrator to check your account permissions.`,"team.conflict":`This request was rejected. Check the current data and your account permissions.`,"team.invitation_rejected":`Invitation unavailable, expired or already used. Ask the administrator for a new invitation.`,"team.role_unavailable":`This custom role is no longer available. Select another role.`,"team.last_administrator":`Keep at least one active administrator.`,"team.join":`Join the team`,"team.joinHint":`This link creates an account with the email and profile selected by the administrator. Choose your password.`,"team.password":`Password`,"team.confirmPassword":`Confirm password`,"team.passwordHint":`Use between 12 and 256 characters.`,"team.passwordInvalid":`Use between 12 and 256 characters and two identical passwords.`,"team.accept":`Create my account`,"team.joined":`Account created. Sign in with the invited email and your password.`,"team.login":`Sign in`}};var l={fr:{group:{title:`Équipe`,description:`Invitations à usage unique et profils limités. Aucun courriel réel n’est envoyé.`},operations:{teamList:{summary:`Lister les comptes et invitations`,description:`Retourne les comptes collaborateurs et comptables et les 100 dernières invitations, sans jeton secret.`},teamInvite:{summary:`Créer une invitation`,description:`Retourne un lien confidentiel valable sept jours. Une nouvelle tentative identique conserve le même lien et la même expiration. Aucun courriel n’est envoyé.`},teamInvitationCancel:{summary:`Annuler une invitation`,description:`Invalide une invitation non acceptée. Une nouvelle annulation reste sans effet.`},teamMemberUpdate:{summary:`Modifier un accès d’équipe`,description:`Change le profil ou désactive le compte avec contrôle de version. Révoque toutes ses sessions et tous ses jetons API. Ne modifie aucun administrateur existant.`},teamInvitationAccept:{summary:`Accepter une invitation`,description:`Crée le compte et consomme le jeton en une transaction. Exige une origine autorisée et un mot de passe valide. Limite : dix demandes par minute et adresse cliente.`}}},en:{group:{title:`Team`,description:`Single-use invitations and limited profiles. No real email is sent.`},operations:{teamList:{summary:`List accounts and invitations`,description:`Returns collaborator and accountant accounts and the latest 100 invitations without secret tokens.`},teamInvite:{summary:`Create an invitation`,description:`Returns a confidential link valid for seven days. An identical retry keeps the same link and expiry. Sends no email.`},teamInvitationCancel:{summary:`Cancel an invitation`,description:`Invalidates an invitation that has not been accepted. Repeated cancellation has no additional effect.`},teamMemberUpdate:{summary:`Change team access`,description:`Changes the profile or disables the account with a version check. Revokes all its sessions and API tokens. Does not change existing administrators.`},teamInvitationAccept:{summary:`Accept an invitation`,description:`Creates the account and consumes the token in one transaction. Requires an allowed origin and valid password. Limit: ten requests per minute per client address.`}}}};var N$3={fr:{"role.title":`Rôles personnalisés`,"role.intro":`Créez des modèles de permissions pour les membres de l’équipe.`,"role.backTeam":`Retour à l’équipe`,"role.backList":`Retour aux rôles`,"role.create":`Créer un rôle`,"role.createTitle":`Créer un rôle personnalisé`,"role.editTitle":`Modifier le rôle personnalisé`,"role.editorIntro":`Sélectionnez uniquement les permissions nécessaires à ce rôle.`,"role.name":`Nom`,"role.permissions":`Permissions`,"role.edit":`Modifier`,"role.delete":`Supprimer`,"role.save":`Enregistrer`,"role.created":`Le rôle est créé.`,"role.updated":`Le rôle est enregistré.`,"role.cancel":`Annuler`,"role.loading":`Chargement des rôles…`,"role.empty":`Aucun rôle personnalisé.`,"role.count.one":`{count} rôle personnalisé`,"role.count.other":`{count} rôles personnalisés`,"role.deleteConfirm":`Supprimer le rôle «\xA0{name}\xA0»\xA0?`,"role.unsavedChanges":`Abandonner les modifications de ce rôle\xA0?`,"role.error":`Impossible de charger ou d’enregistrer les rôles.`,"role.not_found":`Ce rôle est introuvable.`,"role.name_exists":`Ce nom de rôle existe déjà.`,"role.creation_conflict":`Cette demande de création contient maintenant d’autres données.`,"role.version_conflict":`Ce rôle a changé. Actualisez la page avant de recommencer.`,"role.in_use":`Ce rôle est utilisé par un membre ou une invitation active.`,"role.last_administrator":`Conservez au moins un administrateur actif.`},en:{"role.title":`Custom roles`,"role.intro":`Create permission templates for team members.`,"role.backTeam":`Back to team`,"role.backList":`Back to roles`,"role.create":`Create role`,"role.createTitle":`Create custom role`,"role.editTitle":`Edit custom role`,"role.editorIntro":`Select only the permissions that this role needs.`,"role.name":`Name`,"role.permissions":`Permissions`,"role.edit":`Edit`,"role.delete":`Delete`,"role.save":`Save`,"role.created":`The role was created.`,"role.updated":`The role was saved.`,"role.cancel":`Cancel`,"role.loading":`Loading roles…`,"role.empty":`No custom roles.`,"role.count.one":`{count} custom role`,"role.count.other":`{count} custom roles`,"role.deleteConfirm":`Delete the “{name}” role?`,"role.unsavedChanges":`Discard this role’s changes?`,"role.error":`The roles cannot be loaded or saved.`,"role.not_found":`This role cannot be found.`,"role.name_exists":`This role name already exists.`,"role.creation_conflict":`This creation request now contains different data.`,"role.version_conflict":`This role changed. Refresh the page before you try again.`,"role.in_use":`A member or active invitation uses this role.`,"role.last_administrator":`Keep at least one active administrator.`}};var d={fr:{group:{title:`Rôles personnalisés`,description:`Modèles de permissions attribuables aux membres de l’équipe.`},operations:{customRoleList:{summary:`Lister les rôles personnalisés`,description:`Retourne les rôles personnalisés et leurs permissions.`},customRoleGet:{summary:`Lire un rôle personnalisé`,description:`Retourne un rôle personnalisé et sa version actuelle.`},customRoleCreate:{summary:`Créer un rôle personnalisé`,description:`Crée un modèle de permissions avec une demande idempotente.`},customRoleUpdate:{summary:`Modifier un rôle personnalisé`,description:`Modifie le nom et les permissions avec contrôle de version.`},customRoleDelete:{summary:`Supprimer un rôle personnalisé`,description:`Supprime un rôle qui n’est utilisé par aucun membre ni invitation active.`}}},en:{group:{title:`Custom roles`,description:`Permission templates that can be assigned to team members.`},operations:{customRoleList:{summary:`List custom roles`,description:`Returns custom roles and their permissions.`},customRoleGet:{summary:`Get a custom role`,description:`Returns a custom role and its current version.`},customRoleCreate:{summary:`Create a custom role`,description:`Creates a permission template with an idempotent request.`},customRoleUpdate:{summary:`Update a custom role`,description:`Updates the name and permissions with a version check.`},customRoleDelete:{summary:`Delete a custom role`,description:`Deletes a role that no member or active invitation uses.`}}}};var U$2={fr:{"permission.group.affair":`Affaires et projets clients`,"permission.group.integration":`Connexions et services externes`,"permission.group.ledger":`Grand livre comptable`,"permission.group.invoice":`Factures, avoirs et remboursements`,"permission.group.email":`Courriels, modèles et relances`,"permission.group.bank":`Comptes et opérations bancaires`,"permission.group.catalog":`Produits et services`,"permission.group.issuer":`Identité de l’émetteur`,"permission.group.company":`Paramètres de la société`,"permission.group.condition":`Conditions commerciales`,"permission.group.payment":`Règlements clients`,"permission.group.client":`Clients et accès au portail`,"permission.group.supplier":`Fournisseurs`,"permission.group.supplier-invoice":`Factures et paiements fournisseurs`,"permission.group.quote":`Devis et signatures`,"permission.group.order":`Commandes clients`,"permission.group.template":`Modèles de documents`,"permission.group.document":`Production et téléchargement des documents`,"permission.group.user":`Membres et invitations`,"permission.group.role":`Rôles personnalisés`,"permission.group.session":`Sessions actives`,"permission.group.api-token":`Jetons d’API`,"permission.group.audit":`Journal d’audit`,"permission.group.accounting":`Comptabilité générale`,"permission.group.demo":`Données de démonstration`,"permission.affair.read":`Consulter les affaires.`,"permission.affair.create":`Créer des affaires.`,"permission.affair.update":`Modifier les affaires.`,"permission.integration.configure":`Configurer les connexions aux services externes.`,"permission.ledger.read":`Consulter le grand livre comptable.`,"permission.ledger.post":`Comptabiliser et contrepasser les écritures.`,"permission.invoice.credit":`Créer des avoirs pour les factures.`,"permission.invoice.refund":`Enregistrer les remboursements de factures.`,"permission.email.draft.manage":`Créer et gérer les brouillons de courriel.`,"permission.email.template.manage":`Créer et gérer les modèles de courriel.`,"permission.email.reminder.manage":`Créer et gérer les relances de paiement.`,"permission.bank.read":`Consulter les comptes et opérations bancaires.`,"permission.bank.import":`Importer des relevés bancaires.`,"permission.bank.reconcile":`Rapprocher les opérations bancaires.`,"permission.catalog.read":`Consulter le catalogue de produits et services.`,"permission.catalog.manage":`Créer et gérer les produits et services.`,"permission.issuer.read":`Consulter l’identité de l’émetteur.`,"permission.issuer.update":`Modifier l’identité de l’émetteur.`,"permission.company.read":`Consulter les paramètres de la société.`,"permission.company.update":`Modifier les paramètres de la société.`,"permission.condition.read":`Consulter les conditions commerciales enregistrées.`,"permission.condition.manage":`Créer et gérer les conditions commerciales.`,"permission.payment.read":`Consulter et exporter les règlements et leurs corrections.`,"permission.integration.manage":`Gérer les intégrations et leurs traitements.`,"permission.client.read":`Consulter les clients.`,"permission.client.create":`Créer des clients.`,"permission.client.update":`Modifier les clients.`,"permission.client.archive":`Archiver les clients.`,"permission.client.access.manage":`Gérer les accès des clients au portail.`,"permission.supplier.read":`Consulter les fournisseurs.`,"permission.supplier.create":`Créer des fournisseurs.`,"permission.supplier.update":`Modifier les fournisseurs.`,"permission.supplier.archive":`Archiver les fournisseurs.`,"permission.supplier-invoice.read":`Consulter les factures fournisseurs.`,"permission.supplier-invoice.create":`Créer des factures fournisseurs.`,"permission.supplier-invoice.update":`Modifier les factures fournisseurs.`,"permission.supplier-invoice.approve":`Approuver ou refuser les factures fournisseurs.`,"permission.supplier-invoice.analyze":`Lancer l’analyse des factures fournisseurs.`,"permission.supplier-invoice.pay":`Enregistrer et gérer les paiements fournisseurs.`,"permission.quote.read":`Consulter les devis.`,"permission.quote.create":`Créer des devis.`,"permission.quote.update":`Modifier les devis.`,"permission.quote.delete":`Supprimer les devis.`,"permission.quote.send":`Créer les liens de signature des devis.`,"permission.quote.sign":`Signer les devis pour le compte d’un client.`,"permission.order.read":`Consulter les commandes.`,"permission.order.create":`Créer des commandes.`,"permission.order.update":`Modifier les commandes.`,"permission.invoice.read":`Consulter les factures.`,"permission.invoice.create":`Créer des factures.`,"permission.invoice.update":`Modifier les factures.`,"permission.invoice.issue":`Émettre les factures.`,"permission.invoice.send":`Envoyer les factures aux clients.`,"permission.invoice.mark-paid":`Marquer les factures comme payées.`,"permission.invoice.void":`Annuler les factures.`,"permission.template.read":`Consulter les modèles de documents.`,"permission.template.select":`Sélectionner les modèles utilisés pour les documents.`,"permission.document.render":`Produire les documents PDF.`,"permission.document.download":`Télécharger les documents produits.`,"permission.user.read":`Consulter les membres et invitations de l’équipe.`,"permission.user.create":`Inviter de nouveaux membres.`,"permission.user.update":`Modifier les accès des membres.`,"permission.role.read":`Consulter les rôles personnalisés.`,"permission.role.manage":`Créer, modifier et supprimer les rôles personnalisés.`,"permission.session.manage":`Consulter et révoquer les sessions actives.`,"permission.api-token.manage":`Créer, consulter et révoquer les jetons d’API.`,"permission.audit.read":`Consulter le journal d’audit.`,"permission.accounting.read":`Consulter les données comptables.`,"permission.accounting.write":`Créer et modifier les données comptables.`,"permission.accounting.validate":`Valider les écritures comptables.`,"permission.accounting.close":`Clôturer et rouvrir les périodes comptables.`,"permission.accounting.export":`Exporter les données comptables.`,"permission.accounting.evidence":`Ajouter des pièces comptables.`,"permission.demo.reset":`Réinitialiser les données de démonstration hors production.`},en:{"permission.group.affair":`Client affairs and projects`,"permission.group.integration":`Connections and external services`,"permission.group.ledger":`Accounting ledger`,"permission.group.invoice":`Invoices, credit notes, and refunds`,"permission.group.email":`Emails, templates, and reminders`,"permission.group.bank":`Bank accounts and transactions`,"permission.group.catalog":`Products and services`,"permission.group.issuer":`Issuer identity`,"permission.group.company":`Company settings`,"permission.group.condition":`Commercial conditions`,"permission.group.payment":`Client payments`,"permission.group.client":`Clients and portal access`,"permission.group.supplier":`Suppliers`,"permission.group.supplier-invoice":`Supplier invoices and payments`,"permission.group.quote":`Quotes and signatures`,"permission.group.order":`Client orders`,"permission.group.template":`Document templates`,"permission.group.document":`Document generation and download`,"permission.group.user":`Members and invitations`,"permission.group.role":`Custom roles`,"permission.group.session":`Active sessions`,"permission.group.api-token":`API tokens`,"permission.group.audit":`Audit log`,"permission.group.accounting":`General accounting`,"permission.group.demo":`Demonstration data`,"permission.affair.read":`View affairs.`,"permission.affair.create":`Create affairs.`,"permission.affair.update":`Update affairs.`,"permission.integration.configure":`Configure connections to external services.`,"permission.ledger.read":`View the accounting ledger.`,"permission.ledger.post":`Post and reverse accounting entries.`,"permission.invoice.credit":`Create credit notes for invoices.`,"permission.invoice.refund":`Record invoice refunds.`,"permission.email.draft.manage":`Create and manage email drafts.`,"permission.email.template.manage":`Create and manage email templates.`,"permission.email.reminder.manage":`Create and manage payment reminders.`,"permission.bank.read":`View bank accounts and transactions.`,"permission.bank.import":`Import bank statements.`,"permission.bank.reconcile":`Reconcile bank transactions.`,"permission.catalog.read":`View the product and service catalog.`,"permission.catalog.manage":`Create and manage products and services.`,"permission.issuer.read":`View the issuer identity.`,"permission.issuer.update":`Update the issuer identity.`,"permission.company.read":`View company settings.`,"permission.company.update":`Update company settings.`,"permission.condition.read":`View saved commercial conditions.`,"permission.condition.manage":`Create and manage commercial conditions.`,"permission.payment.read":`View and export payments and their corrections.`,"permission.integration.manage":`Manage integrations and their processing jobs.`,"permission.client.read":`View clients.`,"permission.client.create":`Create clients.`,"permission.client.update":`Update clients.`,"permission.client.archive":`Archive clients.`,"permission.client.access.manage":`Manage client portal access.`,"permission.supplier.read":`View suppliers.`,"permission.supplier.create":`Create suppliers.`,"permission.supplier.update":`Update suppliers.`,"permission.supplier.archive":`Archive suppliers.`,"permission.supplier-invoice.read":`View supplier invoices.`,"permission.supplier-invoice.create":`Create supplier invoices.`,"permission.supplier-invoice.update":`Update supplier invoices.`,"permission.supplier-invoice.approve":`Approve or reject supplier invoices.`,"permission.supplier-invoice.analyze":`Start supplier invoice analysis.`,"permission.supplier-invoice.pay":`Record and manage supplier payments.`,"permission.quote.read":`View quotes.`,"permission.quote.create":`Create quotes.`,"permission.quote.update":`Update quotes.`,"permission.quote.delete":`Delete quotes.`,"permission.quote.send":`Create signing links for quotes.`,"permission.quote.sign":`Sign quotes on behalf of a client.`,"permission.order.read":`View orders.`,"permission.order.create":`Create orders.`,"permission.order.update":`Update orders.`,"permission.invoice.read":`View invoices.`,"permission.invoice.create":`Create invoices.`,"permission.invoice.update":`Update invoices.`,"permission.invoice.issue":`Issue invoices.`,"permission.invoice.send":`Send invoices to clients.`,"permission.invoice.mark-paid":`Mark invoices as paid.`,"permission.invoice.void":`Void invoices.`,"permission.template.read":`View document templates.`,"permission.template.select":`Select templates used for documents.`,"permission.document.render":`Generate PDF documents.`,"permission.document.download":`Download generated documents.`,"permission.user.read":`View team members and invitations.`,"permission.user.create":`Invite new members.`,"permission.user.update":`Update member access.`,"permission.role.read":`View custom roles.`,"permission.role.manage":`Create, update, and delete custom roles.`,"permission.session.manage":`View and revoke active sessions.`,"permission.api-token.manage":`Create, view, and revoke API tokens.`,"permission.audit.read":`View the audit log.`,"permission.accounting.read":`View accounting data.`,"permission.accounting.write":`Create and update accounting data.`,"permission.accounting.validate":`Validate accounting entries.`,"permission.accounting.close":`Close and reopen accounting periods.`,"permission.accounting.export":`Export accounting data.`,"permission.accounting.evidence":`Add accounting evidence.`,"permission.demo.reset":`Reset demonstration data outside production.`}};var V$1={fr:{"credit.title":`Avoir et remboursements`,"credit.loadError":`Impossible de charger l’avoir et les remboursements. Rechargez ces données avant de continuer.`,"credit.noTransfer":`Ces opérations enregistrent des faits locaux. Aucun virement ni remboursement bancaire n’est exécuté.`,"credit.saved":`Opération enregistrée.`,"credit.reload":`Recharger l’avoir et les remboursements`,"credit.pdf":`Télécharger le PDF de l’avoir`,"credit.refunds":`Remboursements enregistrés`,"credit.refundable":`Encaissements restant à rembourser :`,"credit.amount":`Montant remboursé (EUR)`,"credit.refundedOn":`Date du remboursement effectué`,"credit.reference":`Référence du remboursement`,"credit.recordRefund":`Enregistrer le remboursement effectué`,"credit.allocate":`Imputer sur une facture`,"credit.allocations":`Imputations`,"credit.targetInvoice":`Facture cible`,"credit.allocatedOn":`Date d’imputation`,"credit.cancelReason":`Motif de correction du remboursement`,"credit.cancelled":`Enregistrement annulé :`,"credit.cancelRefund":`Corriger cet enregistrement`,"credit.cancelAllocation":`Annuler l’imputation`,"credit.cancelAllocationHint":`L’annulation restaure la dette client et le solde de la facture cible.`,"credit.fullHint":`L’avoir intégral reprend les lignes et la TVA de la facture émise. Il annule toute sa créance sans modifier la facture ni son PDF.`,"credit.reason":`Motif de l’avoir`,"credit.issue":`Émettre l’avoir intégral`,"credit.create":`Émettre un avoir`,"credit.options":`Choisir le type d’avoir`,"credit.partial":`Avoir partiel`,"credit.full":`Avoir intégral`,"credit.draftHint":`Sélectionnez les quantités à créditer. Enregistrez le brouillon ou émettez ensuite l’avoir définitif.`,"credit.details":`Détails de l’avoir`,"credit.lines":`Lignes créditées`,"credit.linesHint":`Une quantité nulle exclut la ligne. Les quantités déjà créditées ne sont plus disponibles.`,"credit.quantityFor":`Quantité créditée pour {description}`,"credit.availableQuantity":`Disponible : {quantity}`,"credit.noAvailableLines":`Aucune ligne ne reste disponible pour un avoir.`,"credit.addInvoice":`Ajouter une facture du même client`,"credit.selectInvoice":`Sélectionnez une facture`,"credit.add":`Ajouter`,"credit.removeInvoice":`Retirer la facture`,"credit.saveDraft":`Enregistrer le brouillon`,"credit.issueDraft":`Émettre l’avoir`,"credit.editDraft":`Modifier le brouillon d’avoir`,"credit.draft":`Brouillon`,"credit.issued":`Émis`,"credit.readonlyVersion":`Cette version est figée et disponible uniquement en lecture.`,"credit.credited":`Montant couvert par un avoir :`,"credit.confirmIssue":`Émettre cet avoir définitif ? Les factures et leurs règlements seront conservés. Aucun remboursement ne sera exécuté.`,"credit.confirmRefund":`Enregistrer un remboursement déjà effectué ? Cette action ne transfère aucun fonds.`,"credit.confirmCancel":`Annuler cet enregistrement erroné ? Le motif sera conservé. Cette action ne récupère aucun fonds.`,"credit.error":`Le résultat de cette demande reste à confirmer. Consultez l’avoir et les remboursements avant de recommencer.`,"invoice.credit_conflict":`Opération refusée. Vérifiez la facture, l’avoir existant, les encaissements disponibles, la date et la clé de la demande.`,"invoice.credit_request_conflict":`Cette demande correspond à une opération déjà enregistrée avec d’autres données. Vérifiez l’avoir et les remboursements existants.`},en:{"credit.title":`Credit note and refunds`,"credit.loadError":`Unable to load the credit note and refunds. Reload this data before continuing.`,"credit.noTransfer":`These operations record local facts. No bank transfer or refund is executed.`,"credit.saved":`Operation recorded.`,"credit.reload":`Reload the credit note and refunds`,"credit.pdf":`Download credit note PDF`,"credit.refunds":`Recorded refunds`,"credit.refundable":`Receipts still available for refund:`,"credit.amount":`Refunded amount (EUR)`,"credit.refundedOn":`Date of the completed refund`,"credit.reference":`Refund reference`,"credit.recordRefund":`Record completed refund`,"credit.allocate":`Allocate to an invoice`,"credit.allocations":`Allocations`,"credit.targetInvoice":`Target invoice`,"credit.allocatedOn":`Allocation date`,"credit.cancelReason":`Reason for correcting the refund`,"credit.cancelled":`Record cancelled:`,"credit.cancelRefund":`Correct this record`,"credit.cancelAllocation":`Cancel allocation`,"credit.cancelAllocationHint":`Cancellation restores the customer debt and the target invoice balance.`,"credit.fullHint":`The full credit note copies the issued invoice lines and VAT. It cancels the entire debt without changing the invoice or its PDF.`,"credit.reason":`Credit note reason`,"credit.issue":`Issue full credit note`,"credit.create":`Issue a credit note`,"credit.options":`Select the credit note type`,"credit.partial":`Partial credit note`,"credit.full":`Full credit note`,"credit.draftHint":`Select the quantities to credit. Save the draft or issue the final credit note.`,"credit.details":`Credit note details`,"credit.lines":`Credited lines`,"credit.linesHint":`A zero quantity excludes the line. Quantities already credited are unavailable.`,"credit.quantityFor":`Credited quantity for {description}`,"credit.availableQuantity":`Available: {quantity}`,"credit.noAvailableLines":`No line remains available for a credit note.`,"credit.addInvoice":`Add an invoice for this client`,"credit.selectInvoice":`Select an invoice`,"credit.add":`Add`,"credit.removeInvoice":`Remove invoice`,"credit.saveDraft":`Save draft`,"credit.issueDraft":`Issue credit note`,"credit.editDraft":`Edit credit note draft`,"credit.draft":`Draft`,"credit.issued":`Issued`,"credit.readonlyVersion":`This version is frozen and available as read-only.`,"credit.credited":`Amount covered by a credit note:`,"credit.confirmIssue":`Issue this final credit note? The invoices and payments will be kept. No refund will be executed.`,"credit.confirmRefund":`Record a refund that has already occurred? This action transfers no funds.`,"credit.confirmCancel":`Cancel this incorrect record? The reason will be kept. This action recovers no funds.`,"credit.error":`The result of this request is unconfirmed. Check the credit note and refunds before trying again.`,"invoice.credit_conflict":`Operation rejected. Check the invoice, existing credit note, available receipts, date and request key.`,"invoice.credit_request_conflict":`This request refers to an operation already recorded with different data. Check the existing credit note and refunds.`}};var u$2={fr:{group:{title:`Avoirs et remboursements`,description:`Brouillons d’avoirs partiels ou consolidés, émission immuable et enregistrement local des remboursements.`},operations:{invoiceCreditsGet:{summary:`Consulter l’avoir et les remboursements`,description:`Retourne l’avoir intégral, les remboursements conservés et le montant encore remboursable sur les encaissements actifs.`},creditNoteGet:{summary:`Consulter un avoir`,description:`Retourne un brouillon modifiable ou un avoir émis immuable avec ses lignes.`},creditNoteCreate:{summary:`Créer un brouillon d’avoir`,description:`Crée un avoir partiel ou consolidé pour les factures compatibles sélectionnées.`},creditNoteUpdate:{summary:`Modifier un brouillon d’avoir`,description:`Remplace le motif et les lignes d’un brouillon avec contrôle de version.`},creditNoteIssue:{summary:`Émettre un avoir`,description:`Fige les lignes du brouillon et attribue une référence AV-AAAA-NNNNNN.`},invoiceRefundRecord:{summary:`Enregistrer un remboursement effectué`,description:`Enregistre un fait local sans opération bancaire. Exige un avoir et des encaissements disponibles. Refuse les dates futures et antérieures à l’avoir.`},invoiceRefundCancel:{summary:`Corriger un remboursement enregistré`,description:`Annule l’enregistrement avec un motif conservé. Ne récupère aucun fonds et ne modifie pas l’avoir.`},invoiceCreditPdf:{summary:`Télécharger l’avoir`,description:`Génère le PDF au premier accès depuis les données immuables. Conserve ensuite le PDF et contrôle son empreinte SHA-256.`},clientCreditPdf:{summary:`Télécharger son avoir`,description:`Exige une session cliente autorisée et une facture appartenant au client associé au compte.`}}},en:{group:{title:`Credit notes and refunds`,description:`Partial or consolidated credit note drafts, immutable issue, and local refund records.`},operations:{invoiceCreditsGet:{summary:`Read the credit note and refunds`,description:`Returns the full credit note, preserved refunds and the amount still available for refund from active receipts.`},creditNoteGet:{summary:`Read a credit note`,description:`Returns an editable draft or an immutable issued credit note with its lines.`},creditNoteCreate:{summary:`Create a credit note draft`,description:`Creates a partial or consolidated credit note for selected compatible invoices.`},creditNoteUpdate:{summary:`Update a credit note draft`,description:`Replaces the reason and lines of a draft with version control.`},creditNoteIssue:{summary:`Issue a credit note`,description:`Freezes the draft lines and assigns an AV-YYYY-NNNNNN reference.`},invoiceRefundRecord:{summary:`Record a completed refund`,description:`Records a local fact without a bank operation. Requires a credit note and available receipts. Rejects future dates and dates before the credit note.`},invoiceRefundCancel:{summary:`Correct a recorded refund`,description:`Cancels the record with a preserved reason. Recovers no funds and does not change the credit note.`},invoiceCreditPdf:{summary:`Download the credit note`,description:`Generates the PDF on first access from immutable data. Then preserves the PDF and checks its SHA-256 digest.`},clientCreditPdf:{summary:`Download your credit note`,description:`Requires an authorized client session and an invoice owned by the client linked to the account.`}}}};var j$2={fr:{"ledger.bankDate":`Date bancaire`,"ledger.postingDate":`Date comptable`,"ledger.title":`Écritures des débits et commissions`,"ledger.loadError":`Impossible de charger les écritures ou leurs sources. Rechargez ces données avant de continuer.`,"ledger.postUnconfirmed":`La comptabilisation reste à confirmer. Reprenez la même demande sans modifier ses valeurs.`,"ledger.reverseUnconfirmed":`La contrepassation reste à confirmer. Reprenez la même demande sans modifier ses valeurs.`,"ledger.hint":`Choisissez les comptes comptables avec votre comptable. Chaque écriture porte le même montant au débit et au crédit. Aucune TVA n’est déduite et aucun transfert n’est exécuté.`,"ledger.from":`Date de début`,"ledger.to":`Date de fin`,"ledger.load":`Charger la période`,"ledger.export":`Exporter les écritures en CSV`,"ledger.loading":`Chargement des écritures…`,"ledger.post":`Comptabiliser`,"ledger.debitAccount":`Compte à débiter`,"ledger.creditAccount":`Compte à créditer`,"ledger.label":`Libellé`,"ledger.close":`Fermer le formulaire`,"ledger.reverse":`Contrepasser`,"ledger.reason":`Motif de contrepassation`,"ledger.date":`Date de contrepassation`,"ledger.sources":`Débits et commissions de la période`,"ledger.entries":`Écritures de la période`,"ledger.fee":`Commission déduite`,"ledger.debit":`Débit bancaire`,"ledger.posted":`Écriture active :`,"ledger.select":`Préparer une écriture`,"ledger.empty":`Aucun élément dans cette période.`,"ledger.entryId":`Écriture :`,"ledger.actor":`Enregistrée par :`,"ledger.reverses":`Contrepasse :`,"ledger.reversed":`Contrepassée par :`,"ledger.saved":`Écriture enregistrée.`,"ledger.error":`Le résultat de cette demande reste à confirmer. Consultez les écritures avant de recommencer.`,"ledger.conflict":`Opération refusée. Vérifiez les comptes, les dates et l’état de la source. Si la période contient plus de 10 000 éléments, réduisez-la.`,"ledger.confirmPost":`Comptabiliser {amount} au débit du compte {debit} et au crédit du compte {credit} ? La correction exigera une contrepassation.`,"ledger.confirmReverse":`Créer une écriture inverse définitive ? L’écriture initiale sera conservée. Aucun fonds ne sera transféré.`},en:{"ledger.bankDate":`Bank date`,"ledger.postingDate":`Posting date`,"ledger.title":`Debit and fee entries`,"ledger.loadError":`Unable to load entries or their sources. Reload this data before continuing.`,"ledger.postUnconfirmed":`Posting the entry is unconfirmed. Resume the same request without changing its values.`,"ledger.reverseUnconfirmed":`Reversing the entry is unconfirmed. Resume the same request without changing its values.`,"ledger.hint":`Choose ledger accounts with your accountant. Each entry debits and credits the same amount. No VAT is deducted and no transfer is executed.`,"ledger.from":`Start date`,"ledger.to":`End date`,"ledger.load":`Load period`,"ledger.export":`Export entries as CSV`,"ledger.loading":`Loading entries…`,"ledger.post":`Post entry`,"ledger.debitAccount":`Account to debit`,"ledger.creditAccount":`Account to credit`,"ledger.label":`Label`,"ledger.close":`Close form`,"ledger.reverse":`Reverse entry`,"ledger.reason":`Reversal reason`,"ledger.date":`Reversal date`,"ledger.sources":`Debits and fees in the period`,"ledger.entries":`Entries in the period`,"ledger.fee":`Deducted fee`,"ledger.debit":`Bank debit`,"ledger.posted":`Active entry:`,"ledger.select":`Prepare an entry`,"ledger.empty":`No items in this period.`,"ledger.entryId":`Entry:`,"ledger.actor":`Recorded by:`,"ledger.reverses":`Reverses:`,"ledger.reversed":`Reversed by:`,"ledger.saved":`Entry recorded.`,"ledger.error":`The result of this request is unconfirmed. Check the entries before trying again.`,"ledger.conflict":`Operation rejected. Check accounts, dates and source status. If the period contains more than 10,000 items, reduce it.`,"ledger.confirmPost":`Post {amount} to debit account {debit} and credit account {credit}? Corrections will require a reversal.`,"ledger.confirmReverse":`Create a final reverse entry? The original entry will be kept. No funds will be transferred.`}};var p$3={fr:{group:{title:`Écritures bancaires`,description:`Écritures équilibrées des débits importés et commissions déduites. Correction par contrepassation, sans transfert ni calcul de TVA.`},operations:{bankLedgerList:{summary:`Consulter les écritures et leurs sources`,description:`Filtre les dates comptables inclusivement. Refuse une période dépassant 10 000 écritures ou sources. Les commissions exigent une affectation et un encaissement actifs.`},bankLedgerPost:{summary:`Comptabiliser un débit ou une commission`,description:`Reprend le montant et la date de la source. Exige deux comptes distincts. Une source possède au plus une écriture non contrepassée. La clé UUID protège les reprises.`},bankLedgerReverse:{summary:`Contrepasser une écriture`,description:`Crée une écriture immuable avec les comptes inversés. Conserve le motif, l’auteur et la date. Refuse une date future ou antérieure à l’écriture initiale.`},bankLedgerExport:{summary:`Exporter le journal bancaire en CSV`,description:`Produit deux lignes équilibrées par écriture, contrepassations comprises. Le CSV utilise EUR et des montants décimaux exacts. Ce fichier ne constitue pas un FEC.`}}},en:{group:{title:`Bank ledger entries`,description:`Balanced entries for imported debits and deducted fees. Corrections use reversals, without transfers or VAT calculations.`},operations:{bankLedgerList:{summary:`List entries and sources`,description:`Filters inclusive accounting dates. Rejects periods with more than 10,000 entries or sources. Fees require active allocations and receipts.`},bankLedgerPost:{summary:`Post a debit or fee`,description:`Copies the source amount and date. Requires two different accounts. Each source has at most one unreversed entry. A UUID key protects retries.`},bankLedgerReverse:{summary:`Reverse an entry`,description:`Creates an immutable entry with inverted accounts. Preserves the reason, actor and date. Rejects future dates and dates before the original entry.`},bankLedgerExport:{summary:`Export the bank journal as CSV`,description:`Produces two balanced rows per entry, including reversals. Uses EUR and exact decimal amounts. This file is not a French FEC.`}}}};var M$2={fr:{"passkey.title":`Clés d’accès (passkeys)`,"passkey.description":`Connectez-vous avec une clé d’accès et la vérification locale de votre appareil. Le serveur ne reçoit aucune donnée biométrique.`,"passkey.password_notice":`Confirmez votre mot de passe pour ajouter ou retirer une clé. Conservez un moyen de connexion de secours.`,"passkey.name":`Nom de la clé`,"passkey.password":`Mot de passe actuel`,"passkey.add":`Ajouter une clé d’accès`,"passkey.remove":`Retirer`,"passkey.remove_confirm":`Retirer cette clé et révoquer les autres sessions du compte ? La clé restera sur votre appareil.`,"passkey.empty":`Aucune clé d’accès enregistrée.`,"passkey.loading":`Chargement des clés d’accès…`,"passkey.login":`Se connecter avec une clé d’accès`,"passkey.unavailable":`Les clés d’accès nécessitent un navigateur compatible et une connexion HTTPS.`,"passkey.rejected":`La clé d’accès ou la confirmation a été refusée. Recommencez la demande.`,"passkey.error":`La connexion par clé d’accès n’a pas été confirmée. Réessayez ou utilisez votre mot de passe.`,"passkey.loadError":`Impossible de charger les clés d’accès. Rechargez la page pour réessayer.`,"passkey.addUnconfirmed":`L’ajout de la clé d’accès n’a pas été confirmé. Rechargez la page pour vérifier les clés enregistrées.`,"passkey.removeUnconfirmed":`Le retrait de la clé d’accès reste à confirmer. Rechargez la page pour vérifier les clés enregistrées.`,"passkey.added":`Clé d’accès enregistrée.`,"passkey.removed":`Clé retirée. Les autres sessions ont été révoquées.`},en:{"passkey.title":`Passkeys`,"passkey.description":`Sign in with a passkey and local device verification. The server receives no biometric data.`,"passkey.password_notice":`Confirm your password to add or remove a passkey. Keep a backup sign-in method.`,"passkey.name":`Passkey name`,"passkey.password":`Current password`,"passkey.add":`Add a passkey`,"passkey.remove":`Remove`,"passkey.remove_confirm":`Remove this passkey and revoke the account’s other sessions? The passkey will remain on your device.`,"passkey.empty":`No registered passkeys.`,"passkey.loading":`Loading passkeys…`,"passkey.login":`Sign in with a passkey`,"passkey.unavailable":`Passkeys require a compatible browser and HTTPS.`,"passkey.rejected":`The passkey or confirmation was rejected. Start a new request.`,"passkey.error":`Passkey sign-in was not confirmed. Try again or use your password.`,"passkey.loadError":`Unable to load passkeys. Reload the page to try again.`,"passkey.addUnconfirmed":`Adding the passkey was not confirmed. Reload the page to check registered passkeys.`,"passkey.removeUnconfirmed":`Passkey removal is unconfirmed. Reload the page to check registered passkeys.`,"passkey.added":`Passkey registered.`,"passkey.removed":`Passkey removed. Other sessions were revoked.`}};var m$2={fr:{group:{title:`Clés d’accès`,description:`Connexion WebAuthn et gestion des clés du compte connecté.`},operations:{passkeyList:{summary:`Lister ses clés d’accès`,description:`Session navigateur requise. Retourne uniquement les clés du compte connecté, sans leur clé publique.`},passkeyRegisterOptions:{summary:`Préparer une clé d’accès`,description:`Session et mot de passe actuel requis. Le défi expire après cinq minutes et reste lié à cette session. Limite : dix clés par compte.`},passkeyRegisterVerify:{summary:`Enregistrer une clé d’accès`,description:`Vérifie le défi à usage unique, l’origine, le domaine et la vérification locale de l’utilisateur. Le cookie de défi est obligatoire.`},passkeyRemove:{summary:`Retirer une clé d’accès`,description:`Session et mot de passe actuel requis. Retire uniquement une clé du compte connecté et révoque ses autres sessions. Ne supprime pas la clé sur l’appareil.`},passkeyLoginOptions:{summary:`Préparer une connexion par clé`,description:`Crée un défi anonyme à usage unique, valable cinq minutes, lié au navigateur par un cookie HttpOnly. Ne recherche pas de compte par courriel.`},passkeyLoginVerify:{summary:`Se connecter par clé d’accès`,description:`Vérifie la signature, le défi, l’origine, le domaine, le compte et la vérification locale de l’utilisateur. Crée les cookies de session habituels.`}}},en:{group:{title:`Passkeys`,description:`WebAuthn sign-in and passkey management for the current account.`},operations:{passkeyList:{summary:`List your passkeys`,description:`Requires a browser session. Returns only the current account’s passkeys, without their public keys.`},passkeyRegisterOptions:{summary:`Prepare a passkey`,description:`Requires a session and current password. The challenge expires after five minutes and is bound to this session. Limit: ten passkeys per account.`},passkeyRegisterVerify:{summary:`Register a passkey`,description:`Verifies the single-use challenge, origin, domain, and local user verification. Requires the challenge cookie.`},passkeyRemove:{summary:`Remove a passkey`,description:`Requires a session and current password. Removes only a passkey owned by the current account and revokes its other sessions. Does not delete the passkey from the device.`},passkeyLoginOptions:{summary:`Prepare passkey sign-in`,description:`Creates an anonymous single-use challenge, valid for five minutes, bound to the browser through an HttpOnly cookie. Does not look up accounts by email.`},passkeyLoginVerify:{summary:`Sign in with a passkey`,description:`Verifies the signature, challenge, origin, domain, account, and local user verification. Creates the standard session cookies.`}}}};var B$1={fr:{"emailDraft.title":`Brouillons enregistrés`,"emailDraft.save":`Enregistrer le brouillon`,"emailDraft.new":`Nouveau courriel`,"emailDraft.open":`Ouvrir`,"emailDraft.archive":`Archiver`,"emailDraft.saved":`Brouillon enregistré sur le serveur.`,"emailDraft.hint":`Les brouillons peuvent être incomplets. Leur enregistrement ne soumet aucun courriel. Ils restent privés jusqu’à leur soumission.`,"emailDraft.empty":`Aucun brouillon enregistré.`,"emailDraft.unnamed":`Sans objet`,"emailDraft.archiveConfirm":`Archiver ce brouillon et abandonner ses modifications locales éventuelles ? Aucun courriel ne sera soumis.`,"emailDraft.error":`L’opération sur le brouillon a échoué. Votre texte reste dans le formulaire.`,"email_draft.conflict":`Ce brouillon a changé, a été soumis ou la limite de 100 brouillons est atteinte. Rechargez la liste avant de continuer.`,"email_draft.not_found":`Ce brouillon n’est pas accessible à votre compte.`},en:{"emailDraft.title":`Saved drafts`,"emailDraft.save":`Save draft`,"emailDraft.new":`New email`,"emailDraft.open":`Open`,"emailDraft.archive":`Archive`,"emailDraft.saved":`Draft saved on the server.`,"emailDraft.hint":`Drafts can be incomplete. Saving a draft submits no email. Drafts remain private until submission.`,"emailDraft.empty":`No saved drafts.`,"emailDraft.unnamed":`No subject`,"emailDraft.archiveConfirm":`Archive this draft and discard any local changes? No email will be submitted.`,"emailDraft.error":`The draft operation failed. Your text remains in the form.`,"email_draft.conflict":`This draft changed, was submitted, or the limit of 100 drafts was reached. Reload the list before continuing.`,"email_draft.not_found":`This draft is not available to your account.`}};var f$3={fr:{group:{title:`Brouillons de courriels`,description:`Brouillons privés, persistants et versionnés.`},operations:{emailDraftList:{summary:`Lister ses brouillons`,description:`Retourne les brouillons non archivés et non soumis du compte connecté. Les demandes soumises restent dans l’historique des opérations.`},emailDraftSave:{summary:`Enregistrer un brouillon`,description:`Accepte un contenu incomplet. Utilisez un UUID v4 stable comme identifiant. La version attendue vaut zéro à la création. Une soumission commencée bloque toute modification.`},emailDraftArchive:{summary:`Archiver un brouillon`,description:`Vérifie le propriétaire et la version. Conserve le texte et l’historique. N’annule pas une opération déjà soumise.`}}},en:{group:{title:`Email drafts`,description:`Private, persistent and versioned drafts.`},operations:{emailDraftList:{summary:`List your drafts`,description:`Returns the current account’s unarchived and unsubmitted drafts. Submitted requests remain in operation history.`},emailDraftSave:{summary:`Save a draft`,description:`Accepts incomplete content. Use a stable UUID v4 identifier. Expected version is zero on creation. A started submission blocks all further edits.`},emailDraftArchive:{summary:`Archive a draft`,description:`Checks ownership and version. Retains content and history. Does not cancel an operation that was already submitted.`}}}};var H$1={fr:{"integration.unavailable":`Le fournisseur est indisponible.`,"integration.request_conflict":`Le contenu de la demande ou le mode du fournisseur a changé.`,"integration.invalid_request":`La demande ne respecte pas le contrat du fournisseur.`,"integrationRetry.title":`Reprises automatiques`,"integrationRetry.info":`Une demande sans reçu est reprise après une minute, avec le même contenu et le même mode. Cinq tentatives au maximum. Une simulation reste une simulation.`,"integrationRetry.attempts":`Tentatives automatiques`,"integrationRetry.waiting":`Reprise programmée`,"integrationRetry.processing":`Reprise en cours`,"integrationRetry.completed":`Reprise terminée`,"integrationRetry.exhausted":`Tentatives épuisées : intervention nécessaire`,"integrationRetry.blocked":`Reprise bloquée : intervention nécessaire`,"integrationRetry.empty":`Aucune reprise automatique enregistrée.`,"integration.retry_permission":`Le compte initiateur est désactivé ou ne possède plus la permission requise.`,"integration.retry_interrupted":`La tentative a été interrompue ou a dépassé son délai.`,"integration.retry_database":`L’enregistrement de la tentative a échoué.`},en:{"integration.unavailable":`The provider is unavailable.`,"integration.request_conflict":`The request content or provider mode changed.`,"integration.invalid_request":`The request does not meet the provider contract.`,"integrationRetry.title":`Automatic retries`,"integrationRetry.info":`A request without a receipt is retried after one minute with the same content and mode. At most five attempts. Simulation remains simulation.`,"integrationRetry.attempts":`Automatic attempts`,"integrationRetry.waiting":`Retry scheduled`,"integrationRetry.processing":`Retry in progress`,"integrationRetry.completed":`Retry completed`,"integrationRetry.exhausted":`Attempts exhausted: action required`,"integrationRetry.blocked":`Retry blocked: action required`,"integrationRetry.empty":`No automatic retries recorded.`,"integration.retry_permission":`The initiating account is disabled or no longer has the required permission.`,"integration.retry_interrupted":`The attempt was interrupted or exceeded its time limit.`,"integration.retry_database":`Saving the attempt failed.`}};var Q$2={fr:{"reminder.title":`Relances programmées`,"reminder.loadError":`Impossible de charger les relances. Rechargez la liste pour vérifier les demandes enregistrées.`,"reminder.scheduleUnconfirmed":`L’enregistrement de la relance reste à confirmer. Conservez la demande en cours. Reprenez cette même demande.`,"reminder.cancelUnconfirmed":`L’annulation de la relance reste à confirmer. Actualisez les relances pour vérifier son état.`,"reminder.info":`La relance utilise le solde et l’adresse client au moment de sa préparation automatique. Une facture soldée ou annulée ne produit aucun courriel.`,"reminder.content":`La programmation utilise le rappel standard dans la langue actuelle, pas le texte du formulaire. Elle reste indépendante de ce brouillon.`,"reminder.date":`Date et heure locales`,"reminder.schedule":`Programmer la relance`,"reminder.confirm":`Programmer ce rappel standard ? Le mode affiché restera fixé et le serveur vérifiera la facture au moment prévu.`,"reminder.saved":`Relance enregistrée sur le serveur.`,"reminder.cancel":`Annuler la programmation`,"reminder.cancelConfirm":`Annuler cette relance programmée ?`,"reminder.empty":`Aucune relance programmée.`,"reminder.scheduled":`Programmée`,"reminder.cancelled":`Annulée`,"reminder.skipped":`Non soumise`,"reminder.queued":`Préparée : consultez le résultat dans l’historique des courriels et des reprises.`,"reminder.invoice-ineligible":`La facture est soldée, annulée ou son client est désactivé.`,"reminder.recipient-invalid":`L’adresse actuelle du client est invalide.`,"reminder.permission-revoked":`Le compte initiateur est désactivé ou ses permissions ont changé.`,"reminder.mode-changed":`Le mode du fournisseur a changé. Aucun envoi automatique.`,"reminder.error":`Le résultat de la demande concernant cette relance reste à confirmer. Vérifiez son suivi avant de recommencer.`,"reminder.conflict":`Cet identifiant correspond à une autre demande. Le résultat de votre demande reste inconnu. Conservez la demande d’origine.`,"reminder.rejected":`Le serveur a refusé cette programmation avant sa création.`,"reminder.rejected.invoice-ineligible":`Aucune relance créée : la facture n’est plus éligible. Actualisez les factures et choisissez une facture non soldée.`,"reminder.rejected.invoice-changed":`Aucune relance créée : la version de la facture a changé. Actualisez les factures avant de recommencer.`,"reminder.rejected.recipient-invalid":`Aucune relance créée : l’adresse du client est invalide. Corrigez cette adresse avant de recommencer.`,"reminder.rejected.mode-changed":`Aucune relance créée : le mode du fournisseur a changé. Actualisez les accès avant de recommencer.`,"reminder.rejected.date-invalid":`Aucune relance créée : choisissez une date future dans les 366 jours.`,"reminder.rejected.already-scheduled":`Aucune relance créée : cette facture possède déjà une relance programmée. Consultez les relances existantes.`,"reminder.rejected.limit":`Aucune relance créée : la limite de 100 programmations actives est atteinte.`,"reminder.not_found":`Cette relance n’existe pas.`},en:{"reminder.title":`Scheduled reminders`,"reminder.loadError":`Unable to load reminders. Reload the list to check recorded requests.`,"reminder.scheduleUnconfirmed":`Reminder scheduling is unconfirmed. Keep the current request. Resume that same request.`,"reminder.cancelUnconfirmed":`Reminder cancellation is unconfirmed. Refresh reminders to check its status.`,"reminder.info":`The reminder uses the balance and client address at automatic preparation time. A settled or void invoice produces no email.`,"reminder.content":`Scheduling uses the standard reminder in the current language, not the form text. It remains independent of this draft.`,"reminder.date":`Local date and time`,"reminder.schedule":`Schedule reminder`,"reminder.confirm":`Schedule this standard reminder? The displayed mode remains fixed and the server checks the invoice at the scheduled time.`,"reminder.saved":`Reminder saved on the server.`,"reminder.cancel":`Cancel schedule`,"reminder.cancelConfirm":`Cancel this scheduled reminder?`,"reminder.empty":`No scheduled reminders.`,"reminder.scheduled":`Scheduled`,"reminder.cancelled":`Cancelled`,"reminder.skipped":`Not submitted`,"reminder.queued":`Prepared: check the email and retry history for the result.`,"reminder.invoice-ineligible":`The invoice is settled or void, or its client is disabled.`,"reminder.recipient-invalid":`The current client email address is invalid.`,"reminder.permission-revoked":`The initiating account is disabled or its permissions changed.`,"reminder.mode-changed":`The provider mode changed. No automatic submission.`,"reminder.error":`The result of this reminder request is unconfirmed. Check its status before trying again.`,"reminder.conflict":`This identifier belongs to another request. Your request result remains unknown. Keep the original request.`,"reminder.rejected":`The server rejected this schedule before creating it.`,"reminder.rejected.invoice-ineligible":`No reminder created: the invoice is no longer eligible. Refresh the invoices and select an unpaid invoice.`,"reminder.rejected.invoice-changed":`No reminder created: the invoice version changed. Refresh the invoices before trying again.`,"reminder.rejected.recipient-invalid":`No reminder created: the client address is invalid. Correct the address before trying again.`,"reminder.rejected.mode-changed":`No reminder created: the provider mode changed. Refresh access before trying again.`,"reminder.rejected.date-invalid":`No reminder created: select a future time within 366 days.`,"reminder.rejected.already-scheduled":`No reminder created: this invoice already has a scheduled reminder. Check the existing reminders.`,"reminder.rejected.limit":`No reminder created: the limit of 100 active schedules has been reached.`,"reminder.not_found":`This reminder does not exist.`}};var g$1={fr:{group:{title:`Relances programmées`,description:`Rappels de paiement ponctuels, persistants et annulables avant leur préparation.`},operations:{reminderList:{summary:`Lister les relances programmées`,description:`Retourne 100 relances, avec priorité aux programmations actives. Le résultat externe reste dans l’opération associée.`},reminderCreate:{summary:`Programmer une relance de facture`,description:`Utilisez un UUID v4 stable. Exige une facture émise avec un solde positif et une date future dans les 366 jours. Le serveur relit le solde et le destinataire à la date prévue.`},reminderCancel:{summary:`Annuler une relance programmée`,description:`Annule uniquement une relance encore programmée. Une relance déjà préparée possède une opération indépendante qui ne peut pas être annulée par cette route.`}}},en:{group:{title:`Scheduled reminders`,description:`Persistent, one-time payment reminders, cancellable before preparation.`},operations:{reminderList:{summary:`List scheduled reminders`,description:`Returns 100 reminders, with active schedules first. The linked operation contains the external result.`},reminderCreate:{summary:`Schedule an invoice reminder`,description:`Use a stable UUID v4. Requires an issued invoice with a positive balance and a future time within 366 days. The server reads the balance and recipient again at the scheduled time.`},reminderCancel:{summary:`Cancel a scheduled reminder`,description:`Cancels only a reminder that is still scheduled. A prepared reminder has an independent operation that this route cannot cancel.`}}}};var G$1={fr:{"emailTemplate.title":`Modèles de courriels`,"emailTemplate.hint":`Les modèles partagent uniquement l’objet et le texte entre les comptes autorisés. Leur utilisation conserve le destinataire et la référence du formulaire.`,"emailTemplate.save":`Créer un modèle avec ce texte`,"emailTemplate.update":`Mettre à jour le modèle ouvert`,"emailTemplate.use":`Utiliser ce modèle`,"emailTemplate.empty":`Aucun modèle enregistré.`,"emailTemplate.saved":`Modèle enregistré. Le courriel du formulaire n’a pas été soumis.`,"emailTemplate.applied":`Texte du modèle copié. Vérifiez le destinataire, la référence et le contenu avant de soumettre le courriel.`,"emailTemplate.archiveConfirm":`Archiver ce modèle partagé ? Les courriels et brouillons existants restent inchangés.`,"emailTemplate.updateConfirm":`Remplacer le texte du modèle partagé par celui du formulaire ?`,"emailTemplate.error":`L’opération sur le modèle a échoué. Le texte du formulaire est conservé.`,"email_template.conflict":`Ce modèle a changé, a été archivé ou la limite de 100 modèles est atteinte. Rechargez la liste.`,"email_template.not_found":`Ce modèle n’existe pas.`},en:{"emailTemplate.title":`Email templates`,"emailTemplate.hint":`Templates share only the subject and body between authorized accounts. Using a template preserves the form’s recipient and reference.`,"emailTemplate.save":`Create a template from this text`,"emailTemplate.update":`Update the open template`,"emailTemplate.use":`Use this template`,"emailTemplate.empty":`No saved templates.`,"emailTemplate.saved":`Template saved. The email in the form was not submitted.`,"emailTemplate.applied":`Template text copied. Check the recipient, reference, and content before submitting the email.`,"emailTemplate.archiveConfirm":`Archive this shared template? Existing emails and drafts remain unchanged.`,"emailTemplate.updateConfirm":`Replace the shared template text with the form text?`,"emailTemplate.error":`The template operation failed. The form text is preserved.`,"email_template.conflict":`This template changed, was archived, or the limit of 100 templates was reached. Reload the list.`,"email_template.not_found":`This template does not exist.`}};var v$3={fr:{group:{title:`Modèles de courriels`,description:`Modèles partagés, versionnés et archivables. Texte brut ou formaté sans exécution de variables.`},operations:{emailTemplateList:{summary:`Lister les modèles de courriels`,description:`Retourne les modèles actifs partagés entre les comptes autorisés. Aucun destinataire n’est conservé dans un modèle.`},emailTemplateSave:{summary:`Enregistrer un modèle de courriel`,description:`Utilisez un UUID v4 stable et la version zéro à la création. Les mises à jour vérifient la version attendue. Limite de 100 modèles actifs. Aucun envoi.`},emailTemplateArchive:{summary:`Archiver un modèle de courriel`,description:`Vérifie la version attendue. Conserve le contenu et l’audit. Ne modifie aucun brouillon ou courriel existant.`}}},en:{group:{title:`Email templates`,description:`Shared, versioned templates with archival. Plain or formatted text without variable execution.`},operations:{emailTemplateList:{summary:`List email templates`,description:`Returns active templates shared between authorized accounts. Templates store no recipient.`},emailTemplateSave:{summary:`Save an email template`,description:`Use a stable UUID v4 and version zero on creation. Updates check the expected version. Limit of 100 active templates. Sends nothing.`},emailTemplateArchive:{summary:`Archive an email template`,description:`Checks the expected version. Preserves content and audit history. Changes no existing draft or email.`}}}};var K$2={fr:{"adminPages.preferencesHint":`Choisissez le thème, la langue et la présentation des messages. Ces préférences suivent votre compte.`,"adminPages.theme":`Thème`,"adminPages.lightTheme":`Clair`,"adminPages.darkTheme":`Sombre`,"adminPages.applyPreferences":`Appliquer les préférences`,"adminPages.preferencesApplied":`Préférences enregistrées.`,"adminPages.preferencesError":`Impossible d’enregistrer les préférences.`,"adminPages.preferencesInvalid":`Choisissez une valeur dans chaque liste.`,"adminPages.flashMode":`Présentation des messages`,"adminPages.flashInline":`Dans la page`,"adminPages.flashToast":`Notifications en haut`,"adminPages.flashSnack":`Notifications en bas`,"adminPages.closePermissions":`Fermer les permissions`,"adminPages.conditionsCount.one":`{count} modèle de conditions`,"adminPages.conditionsCount.other":`{count} modèles de conditions`,"adminPages.tokensCount.one":`{count} jeton affiché sur {total}.`,"adminPages.tokensCount.other":`{count} jetons affichés sur {total}.`,"adminPages.membersCount.one":`{count} compte affiché sur {total}.`,"adminPages.membersCount.other":`{count} comptes affichés sur {total}.`,"adminPages.invitationsCount.one":`{count} invitation affichée sur {total}.`,"adminPages.invitationsCount.other":`{count} invitations affichées sur {total}.`},en:{"adminPages.preferencesHint":`Choose the theme, language, and message presentation. These preferences follow your account.`,"adminPages.theme":`Theme`,"adminPages.lightTheme":`Light`,"adminPages.darkTheme":`Dark`,"adminPages.applyPreferences":`Apply preferences`,"adminPages.preferencesApplied":`Preferences saved.`,"adminPages.preferencesError":`Unable to save preferences.`,"adminPages.preferencesInvalid":`Choose a value from each list.`,"adminPages.flashMode":`Message presentation`,"adminPages.flashInline":`In the page`,"adminPages.flashToast":`Notifications at the top`,"adminPages.flashSnack":`Notifications at the bottom`,"adminPages.closePermissions":`Close permissions`,"adminPages.conditionsCount.one":`{count} terms template`,"adminPages.conditionsCount.other":`{count} terms templates`,"adminPages.tokensCount.one":`{count} token displayed out of {total} loaded.`,"adminPages.tokensCount.other":`{count} tokens displayed out of {total} loaded.`,"adminPages.membersCount.one":`{count} account displayed out of {total} loaded.`,"adminPages.membersCount.other":`{count} accounts displayed out of {total} loaded.`,"adminPages.invitationsCount.one":`{count} invitation displayed out of {total} loaded.`,"adminPages.invitationsCount.other":`{count} invitations displayed out of {total} loaded.`}};var Y$2={fr:{"referenceEditor.catalogIntro":`La prestation sera enregistrée dans le catalogue, puis ajoutée au devis. Le devis reste ouvert.`,"referenceEditor.conditionsIntro":`Le modèle sera enregistré, puis appliqué au devis. Le remplacement de conditions existantes demande une confirmation.`,"referenceEditor.saveCatalog":`Créer et ajouter au devis`,"referenceEditor.saveConditions":`Créer et appliquer au devis`,"referenceEditor.conditionsSaved":`Le modèle de conditions est enregistré.`,"referenceEditor.catalogUncertain":`La réponse manque. Fermez cet éditeur, puis vérifiez le catalogue avant de créer une autre prestation.`,"referenceEditor.conditionsUncertain":`La réponse manque. Fermez cet éditeur, puis vérifiez les modèles disponibles avant de créer un autre modèle.`,"referenceEditor.leaveUncertain":`Fermer cet éditeur ? La création reste incertaine. Vérifiez les éléments disponibles avant une nouvelle création.`,"referenceEditor.unsavedConditions":`Abandonner les modifications non enregistrées de ce modèle de conditions ?`},en:{"referenceEditor.catalogIntro":`The service will be saved in the catalog, then added to the quote. The quote stays open.`,"referenceEditor.conditionsIntro":`The template will be saved, then applied to the quote. Replacing existing terms requires confirmation.`,"referenceEditor.saveCatalog":`Create and add to quote`,"referenceEditor.saveConditions":`Create and apply to quote`,"referenceEditor.conditionsSaved":`The terms template is saved.`,"referenceEditor.catalogUncertain":`The response is missing. Close this editor, then check the catalog before creating another service.`,"referenceEditor.conditionsUncertain":`The response is missing. Close this editor, then check the available templates before creating another template.`,"referenceEditor.leaveUncertain":`Close this editor? The creation is still uncertain. Check the available items before creating another one.`,"referenceEditor.unsavedConditions":`Discard the unsaved changes to this terms template?`}};var J$2={fr:{"entityList.invoices.one":`{count} facture`,"entityList.invoices.other":`{count} factures`,"entityList.credits.one":`{count} avoir`,"entityList.credits.other":`{count} avoirs`,"entityList.receipts.one":`{count} encaissement`,"entityList.receipts.other":`{count} encaissements`,"entityList.refunds.one":`{count} remboursement`,"entityList.refunds.other":`{count} remboursements`,"entityList.affairs.one":`{count} affaire`,"entityList.affairs.other":`{count} affaires`,"entityList.tests.one":`{count} test`,"entityList.tests.other":`{count} tests`},en:{"entityList.invoices.one":`{count} invoice`,"entityList.invoices.other":`{count} invoices`,"entityList.credits.one":`{count} credit note`,"entityList.credits.other":`{count} credit notes`,"entityList.receipts.one":`{count} receipt`,"entityList.receipts.other":`{count} receipts`,"entityList.refunds.one":`{count} refund`,"entityList.refunds.other":`{count} refunds`,"entityList.affairs.one":`{count} affair`,"entityList.affairs.other":`{count} affairs`,"entityList.tests.one":`{count} test`,"entityList.tests.other":`{count} tests`}};var $$2={fr:{"clientTables.affairSearch":`Rechercher une affaire`,"clientTables.documentSearch":`Rechercher un document`,"clientTables.accessSearch":`Rechercher un accès par e-mail`,"clientTables.affairStatus":`Statut du devis`,"clientTables.documentType":`Type de document`,"clientTables.date":`Date`,"clientTables.updatedAt":`Modifié le`,"clientTables.reference":`Référence`,"clientTables.title":`Titre`,"clientTables.affairNoMatches":`Aucune affaire ne correspond aux critères`,"clientTables.documentNoMatches":`Aucun document ne correspond aux critères`,"clientTables.accessNoMatches":`Aucun accès ne correspond aux critères`,"clientTables.affairCount.one":`{count} affaire`,"clientTables.affairCount.other":`{count} affaires`,"clientTables.documentCount.one":`{count} document`,"clientTables.documentCount.other":`{count} documents`,"clientTables.accessCount.one":`{count} accès`,"clientTables.accessCount.other":`{count} accès`},en:{"clientTables.affairSearch":`Search affairs`,"clientTables.documentSearch":`Search documents`,"clientTables.accessSearch":`Search access accounts by email`,"clientTables.affairStatus":`Quote status`,"clientTables.documentType":`Document type`,"clientTables.date":`Date`,"clientTables.updatedAt":`Updated on`,"clientTables.reference":`Reference`,"clientTables.title":`Title`,"clientTables.affairNoMatches":`No affairs match the criteria`,"clientTables.documentNoMatches":`No documents match the criteria`,"clientTables.accessNoMatches":`No access accounts match the criteria`,"clientTables.affairCount.one":`{count} affair`,"clientTables.affairCount.other":`{count} affairs`,"clientTables.documentCount.one":`{count} document`,"clientTables.documentCount.other":`{count} documents`,"clientTables.accessCount.one":`{count} access account`,"clientTables.accessCount.other":`{count} access accounts`}};var X$2={fr:{"commercialHeader.quoteDescription":`Devis pour {client}.`,"commercialHeader.orderDescription":`Commande pour {client}.`,"commercialHeader.invoiceDescription":`Facture pour {client}.`,"commercialHeader.affairDescription":`Affaire pour {client}.`,"commercialHeader.relatedDocuments":`Documents liés`,"commercialHeader.draftInvoice":`Facture brouillon`,"commercialHeader.savedVersion":`Version enregistrée : {version}`,"commercialHeader.acceptedVersion":`Devis accepté : version {version}`},en:{"commercialHeader.quoteDescription":`Quote for {client}.`,"commercialHeader.orderDescription":`Order for {client}.`,"commercialHeader.invoiceDescription":`Invoice for {client}.`,"commercialHeader.affairDescription":`Business case for {client}.`,"commercialHeader.relatedDocuments":`Related documents`,"commercialHeader.draftInvoice":`Draft invoice`,"commercialHeader.savedVersion":`Saved version: {version}`,"commercialHeader.acceptedVersion":`Accepted quote: version {version}`}};var Z$2={fr:{"teamInvitation.uncertain":`Le résultat de l’invitation reste inconnu. Réessayez avec la même demande pour récupérer le lien sans créer une autre invitation.`,"teamInvitation.retry":`Réessayer la même invitation`},en:{"teamInvitation.uncertain":`The invitation result is unknown. Retry the same request to retrieve the link without creating another invitation.`,"teamInvitation.retry":`Retry the same invitation`}};var ee$2={fr:{"settingsHeader.conditionDescription":`Préparez des conditions réutilisables dans vos devis.`,"settingsHeader.invitationDescription":`Créez un lien d’invitation avec le profil d’accès du membre.`,"settingsHeader.tokenDescription":`Définissez le nom, l’expiration et les permissions du jeton API.`,"settingsHeader.simulationsDescription":`Vérifiez les intégrations en mode simulation.`,"settingsHeader.businessCardDescription":`Préparez votre carte de visite et ses versions pour l’impression.`},en:{"settingsHeader.conditionDescription":`Prepare reusable conditions for your quotes.`,"settingsHeader.invitationDescription":`Create an invitation link with the member’s access profile.`,"settingsHeader.tokenDescription":`Set the API token name, expiration and permissions.`,"settingsHeader.simulationsDescription":`Check integrations in simulation mode.`,"settingsHeader.businessCardDescription":`Prepare your business card and its versions for printing.`}};var ie$1={fr:{"documentText.formatting":`Mise en forme des conditions`,"documentText.structure":`Paragraphes et titres`,"documentText.emphasis":`Style du texte`,"documentText.lists":`Listes`,"documentText.history":`Historique des modifications`,"documentText.paragraph":`Paragraphe`,"documentText.heading":`Titre`,"documentText.subheading":`Sous-titre`,"documentText.bold":`Gras`,"documentText.italic":`Italique`,"documentText.bulletList":`Liste à puces`,"documentText.orderedList":`Liste numérotée`,"documentText.undo":`Annuler la modification`,"documentText.redo":`Rétablir la modification`,"documentText.placement":`Emplacement dans le PDF`,"documentText.inline":`À la suite du tableau et des totaux`,"documentText.newPage":`Commencer sur une nouvelle page`},en:{"documentText.formatting":`Terms formatting`,"documentText.structure":`Paragraphs and headings`,"documentText.emphasis":`Text style`,"documentText.lists":`Lists`,"documentText.history":`Change history`,"documentText.paragraph":`Paragraph`,"documentText.heading":`Heading`,"documentText.subheading":`Subheading`,"documentText.bold":`Bold`,"documentText.italic":`Italic`,"documentText.bulletList":`Bullet list`,"documentText.orderedList":`Numbered list`,"documentText.undo":`Undo change`,"documentText.redo":`Redo change`,"documentText.placement":`Placement in the PDF`,"documentText.inline":`After the table and totals`,"documentText.newPage":`Start on a new page`}};var te$1={fr:{"supplier.title":`Fournisseurs`,"supplier.listIntro":`Gérez les coordonnées et les paramètres de paiement de vos fournisseurs.`,"supplier.create":`Créer un fournisseur`,"supplier.tabs":`États des fournisseurs`,"supplier.tab.active":`Actifs`,"supplier.tab.archived":`Archivés`,"supplier.tab.all":`Tous`,"supplier.search":`Rechercher un fournisseur`,"supplier.clearSearch":`Effacer la recherche`,"supplier.loading":`Chargement des fournisseurs…`,"supplier.loadingDetail":`Chargement du fournisseur…`,"supplier.error":`Impossible de charger ou d’enregistrer le fournisseur.`,"supplier.empty":`Aucun fournisseur`,"supplier.emptyIntro":`Créez un fournisseur pour enregistrer ses coordonnées de paiement.`,"supplier.noMatches":`Aucun fournisseur trouvé`,"supplier.changeSearch":`Modifiez ou effacez votre recherche.`,"supplier.count.one":`{count} fournisseur`,"supplier.count.other":`{count} fournisseurs`,"supplier.name":`Nom`,"supplier.contact":`Contact`,"supplier.country":`Pays`,"supplier.currency":`Devise par défaut`,"supplier.paymentTerms":`Délai de paiement`,"supplier.paymentTermsDays":`{count} jours`,"supplier.status":`État`,"supplier.active":`Actif`,"supplier.archived":`Archivé`,"supplier.notProvided":`Non renseigné`,"supplier.backToList":`Retour aux fournisseurs`,"supplier.detailIntro":`Coordonnées, identité légale et paramètres de paiement.`,"supplier.edit":`Modifier`,"supplier.archive":`Archiver`,"supplier.reactivate":`Réactiver`,"supplier.confirmArchive":`Archiver ce fournisseur\xA0?`,"supplier.confirmReactivate":`Réactiver ce fournisseur\xA0?`,"supplier.identity":`Identité et contact`,"supplier.registrationNumber":`Numéro d’immatriculation`,"supplier.vatNumber":`Numéro de TVA`,"supplier.taxTreatment":`Régime fiscal`,"supplier.taxTreatment.france":`France`,"supplier.taxTreatment.eu":`Union européenne — autoliquidation`,"supplier.taxTreatment.import":`Hors Union européenne — importation`,"supplier.taxTreatment.local":`Taxe locale étrangère`,"supplier.viesValidatedAt":`Validation VIES`,"supplier.tax_invalid":`Vérifiez le régime fiscal et les identifiants fiscaux.`,"supplier.vies_unavailable":`Le service VIES ne peut pas valider ce numéro de TVA.`,"supplier.email":`Courriel`,"supplier.phone":`Téléphone`,"supplier.address":`Adresse`,"supplier.payment":`Paiement`,"supplier.iban":`IBAN`,"supplier.bic":`BIC`,"supplier.createTitle":`Créer un fournisseur`,"supplier.createIntro":`Saisissez les informations utilisées pour les achats et les paiements.`,"supplier.editTitle":`Modifier le fournisseur`,"supplier.editIntro":`Actualisez les coordonnées et les paramètres de paiement.`,"supplier.cancel":`Annuler`,"supplier.save":`Enregistrer`,"supplier.saving":`Enregistrement…`,"supplier.unsavedChanges":`Abandonner les modifications du fournisseur\xA0?`,"supplier.archivedEdit":`Réactivez ce fournisseur avant de le modifier.`,"supplier.nameInvalid":`Saisissez un nom de 160 caractères maximum.`,"supplier.emailInvalid":`Saisissez un courriel valide.`,"supplier.phoneInvalid":`Saisissez un numéro de téléphone valide.`,"supplier.currencyInvalid":`Saisissez un code de devise ISO à trois lettres majuscules.`,"supplier.paymentTermsInvalid":`Saisissez un délai compris entre 0 et 365 jours.`,"supplier.ibanInvalid":`Saisissez un IBAN valide.`,"supplier.bicInvalid":`Saisissez un BIC valide.`,"supplier.fieldInvalid":`Vérifiez cette valeur.`,"supplier.addressLine1":`Adresse`,"supplier.addressLine2":`Complément d’adresse`,"supplier.postalCode":`Code postal`,"supplier.city":`Ville`,"supplier.not_found":`Ce fournisseur est introuvable.`,"supplier.version_conflict":`Le fournisseur a changé. Actualisez la page avant de recommencer.`,"supplier.creation_conflict":`Cette demande de création a déjà été utilisée avec d’autres données.`,"backOffice.navigation.suppliers":`Fournisseurs`,"page.back_office_suppliers":`Fournisseurs | Back office`,"page.back_office_supplier_detail":`Fournisseur | Back office`,"page.description.back_office_suppliers":`Liste et gestion des fournisseurs.`,"page.description.back_office_supplier_detail":`Coordonnées et paramètres du fournisseur.`},en:{"supplier.title":`Suppliers`,"supplier.listIntro":`Manage supplier contact details and payment settings.`,"supplier.create":`Create supplier`,"supplier.tabs":`Supplier states`,"supplier.tab.active":`Active`,"supplier.tab.archived":`Archived`,"supplier.tab.all":`All`,"supplier.search":`Search suppliers`,"supplier.clearSearch":`Clear search`,"supplier.loading":`Loading suppliers…`,"supplier.loadingDetail":`Loading supplier…`,"supplier.error":`The supplier cannot be loaded or saved.`,"supplier.empty":`No suppliers`,"supplier.emptyIntro":`Create a supplier to store its payment details.`,"supplier.noMatches":`No suppliers found`,"supplier.changeSearch":`Change or clear your search.`,"supplier.count.one":`{count} supplier`,"supplier.count.other":`{count} suppliers`,"supplier.name":`Name`,"supplier.contact":`Contact`,"supplier.country":`Country`,"supplier.currency":`Default currency`,"supplier.paymentTerms":`Payment terms`,"supplier.paymentTermsDays":`{count} days`,"supplier.status":`Status`,"supplier.active":`Active`,"supplier.archived":`Archived`,"supplier.notProvided":`Not provided`,"supplier.backToList":`Back to suppliers`,"supplier.detailIntro":`Contact details, legal identity, and payment settings.`,"supplier.edit":`Edit`,"supplier.archive":`Archive`,"supplier.reactivate":`Reactivate`,"supplier.confirmArchive":`Archive this supplier?`,"supplier.confirmReactivate":`Reactivate this supplier?`,"supplier.identity":`Identity and contact`,"supplier.registrationNumber":`Registration number`,"supplier.vatNumber":`VAT number`,"supplier.taxTreatment":`Tax treatment`,"supplier.taxTreatment.france":`France`,"supplier.taxTreatment.eu":`European Union — reverse charge`,"supplier.taxTreatment.import":`Outside European Union — import`,"supplier.taxTreatment.local":`Foreign local tax`,"supplier.viesValidatedAt":`VIES validation`,"supplier.tax_invalid":`Check the tax treatment and tax identifiers.`,"supplier.vies_unavailable":`The VIES service cannot validate this VAT number.`,"supplier.email":`Email`,"supplier.phone":`Phone`,"supplier.address":`Address`,"supplier.payment":`Payment`,"supplier.iban":`IBAN`,"supplier.bic":`BIC`,"supplier.createTitle":`Create supplier`,"supplier.createIntro":`Enter the information used for purchases and payments.`,"supplier.editTitle":`Edit supplier`,"supplier.editIntro":`Update contact details and payment settings.`,"supplier.cancel":`Cancel`,"supplier.save":`Save`,"supplier.saving":`Saving…`,"supplier.unsavedChanges":`Discard the supplier changes?`,"supplier.archivedEdit":`Reactivate this supplier before you edit it.`,"supplier.nameInvalid":`Enter a name with at most 160 characters.`,"supplier.emailInvalid":`Enter a valid email address.`,"supplier.phoneInvalid":`Enter a valid phone number.`,"supplier.currencyInvalid":`Enter a three-letter uppercase ISO currency code.`,"supplier.paymentTermsInvalid":`Enter a term from 0 through 365 days.`,"supplier.ibanInvalid":`Enter a valid IBAN.`,"supplier.bicInvalid":`Enter a valid BIC.`,"supplier.fieldInvalid":`Check this value.`,"supplier.addressLine1":`Address`,"supplier.addressLine2":`Address complement`,"supplier.postalCode":`Postal code`,"supplier.city":`City`,"supplier.not_found":`This supplier cannot be found.`,"supplier.version_conflict":`The supplier changed. Refresh the page before you try again.`,"supplier.creation_conflict":`This creation request was already used with different data.`,"backOffice.navigation.suppliers":`Suppliers`,"page.back_office_suppliers":`Suppliers | Back office`,"page.back_office_supplier_detail":`Supplier | Back office`,"page.description.back_office_suppliers":`Supplier list and management.`,"page.description.back_office_supplier_detail":`Supplier contact details and settings.`}};var ne$1={fr:{"company.title":`Paramètres de la société`,"company.intro":`Configurez la juridiction, la comptabilité, les modules et la conservation.`,"company.loading":`Chargement des paramètres de la société…`,"company.error":`Impossible de charger ou d’enregistrer les paramètres de la société.`,"company.saved":`Les paramètres de la société sont enregistrés.`,"company.legal":`Juridiction et devise`,"company.jurisdiction":`Juridiction`,"company.functionalCurrency":`Devise fonctionnelle`,"company.accountingInitialized":`La comptabilité est initialisée. La devise fonctionnelle est définitive.`,"company.accountingNotInitialized":`Vous pouvez modifier la devise avant l’initialisation comptable.`,"company.fiscalYear":`Exercice comptable`,"company.fiscalMonth":`Mois de début`,"company.fiscalDay":`Jour de début`,"company.fiscalDuration":`Un nouvel exercice dure douze mois par défaut.`,"company.modules":`Modules activés`,"company.module.sales":`Ventes`,"company.module.purchasing":`Achats`,"company.module.banking":`Banque`,"company.module.accounting":`Comptabilité`,"company.module.tax":`Fiscalité France`,"company.module.ai":`Analyse assistée`,"company.module.demonstration":`Démonstration`,"company.module.sales.hint":`Gère les clients, devis, commandes, factures et avoirs.`,"company.module.purchasing.hint":`Gère les fournisseurs, factures d’achat et paiements.`,"company.module.banking.hint":`Gère les relevés bancaires, transactions et rapprochements.`,"company.module.accounting.hint":`Gère les écritures, journaux, exercices et contrôles comptables.`,"company.module.tax.hint":`Gère les règles fiscales françaises et les déclarations de TVA.`,"company.module.ai.hint":`Active les analyses assistées pour les documents compatibles.`,"company.module.demonstration.hint":`Autorise la réinitialisation protégée des données hors production.`,"company.retention":`Conservation`,"company.retentionYears":`Durée de conservation en années`,"company.retentionExplanation":`La durée minimale de dix ans couvre les obligations françaises pour les pièces comptables.`,"company.save":`Enregistrer`,"company.initializeAccounting":`Initialiser la comptabilité`,"company.initializeConfirm":`Initialiser la comptabilité\xA0? La devise fonctionnelle deviendra définitive.`,"company.unsavedChanges":`Abandonner les modifications des paramètres de la société\xA0?`,"company.settings_conflict":`Les paramètres ont changé. Actualisez la page avant de recommencer.`,"company.functional_currency_locked":`La devise fonctionnelle est définitive après l’initialisation comptable.`,"company.accounting_already_initialized":`La comptabilité est déjà initialisée.`,"company.exchangeRates":`Taux de change`,"company.exchangeRatesHint":`Un taux indique les unités de devise étrangère pour une unité de devise fonctionnelle.`,"company.exchangeRateImport":`Importer les taux BCE`,"company.exchangeRateOverride":`Enregistrer la surcharge`,"company.exchangeRateDate":`Date du taux`,"company.exchangeRateCurrency":`Devise étrangère`,"company.exchangeRateValue":`Taux`,"company.exchangeRatePair":`Paire`,"company.exchangeRateSource":`Source`,"company.exchangeRateEcb":`BCE`,"company.exchangeRateManual":`Surcharge manuelle`,"company.exchangeRateEmpty":`Aucun taux de change.`,"company.exchangeRateInvalid":`Saisissez une date, une devise et un taux positif valides.`,"company.exchange_rate_conflict":`La devise étrangère doit différer de la devise fonctionnelle.`,"company.exchange_rate_import_failed":`L’import des taux de la BCE a échoué.`},en:{"company.title":`Company settings`,"company.intro":`Configure jurisdiction, accounting, modules, and retention.`,"company.loading":`Loading company settings…`,"company.error":`The company settings cannot be loaded or saved.`,"company.saved":`The company settings are saved.`,"company.legal":`Jurisdiction and currency`,"company.jurisdiction":`Jurisdiction`,"company.functionalCurrency":`Functional currency`,"company.accountingInitialized":`Accounting is initialized. The functional currency is permanent.`,"company.accountingNotInitialized":`You can change the currency before accounting initialization.`,"company.fiscalYear":`Fiscal year`,"company.fiscalMonth":`Start month`,"company.fiscalDay":`Start day`,"company.fiscalDuration":`A new fiscal year lasts twelve months by default.`,"company.modules":`Enabled modules`,"company.module.sales":`Sales`,"company.module.purchasing":`Purchasing`,"company.module.banking":`Banking`,"company.module.accounting":`Accounting`,"company.module.tax":`France tax`,"company.module.ai":`Assisted analysis`,"company.module.demonstration":`Demonstration`,"company.module.sales.hint":`Manages clients, quotes, orders, invoices, and credit notes.`,"company.module.purchasing.hint":`Manages suppliers, purchase invoices, and payments.`,"company.module.banking.hint":`Manages bank statements, transactions, and reconciliations.`,"company.module.accounting.hint":`Manages entries, journals, fiscal years, and accounting controls.`,"company.module.tax.hint":`Manages French tax rules and VAT returns.`,"company.module.ai.hint":`Enables assisted analysis for compatible documents.`,"company.module.demonstration.hint":`Allows protected data resets outside production.`,"company.retention":`Retention`,"company.retentionYears":`Retention period in years`,"company.retentionExplanation":`The ten-year minimum covers French retention rules for accounting records.`,"company.save":`Save`,"company.initializeAccounting":`Initialize accounting`,"company.initializeConfirm":`Initialize accounting? The functional currency will become permanent.`,"company.unsavedChanges":`Discard the company settings changes?`,"company.settings_conflict":`The settings changed. Refresh the page before you try again.`,"company.functional_currency_locked":`The functional currency is permanent after accounting initialization.`,"company.accounting_already_initialized":`Accounting is already initialized.`,"company.exchangeRates":`Exchange rates`,"company.exchangeRatesHint":`A rate gives foreign currency units for one functional currency unit.`,"company.exchangeRateImport":`Import ECB rates`,"company.exchangeRateOverride":`Save override`,"company.exchangeRateDate":`Rate date`,"company.exchangeRateCurrency":`Foreign currency`,"company.exchangeRateValue":`Rate`,"company.exchangeRatePair":`Pair`,"company.exchangeRateSource":`Source`,"company.exchangeRateEcb":`ECB`,"company.exchangeRateManual":`Manual override`,"company.exchangeRateEmpty":`No exchange rates.`,"company.exchangeRateInvalid":`Enter a valid date, currency, and positive rate.`,"company.exchange_rate_conflict":`The foreign currency must differ from the functional currency.`,"company.exchange_rate_import_failed":`The ECB exchange-rate import failed.`}};var ae$1={fr:{"supplierInvoice.title":`Factures fournisseurs`,"supplierInvoice.intro":`Contrôlez et approuvez les factures reçues avant leur paiement.`,"supplierInvoice.create":`Saisir une facture`,"supplierInvoice.creditAction":`Créer un avoir fournisseur`,"supplierInvoice.kind":`Type de document`,"supplierInvoice.kind.invoice":`Facture fournisseur`,"supplierInvoice.kind.credit":`Avoir fournisseur`,"supplierInvoice.sourceInvoice":`Facture d’origine`,"supplierInvoice.openSourceInvoice":`Ouvrir la facture d’origine`,"supplierInvoice.evidence":`Pièces justificatives`,"supplierInvoice.evidenceAdd":`Ajouter une pièce`,"supplierInvoice.evidenceEmpty":`Aucune pièce justificative.`,"supplierInvoice.evidenceDownload":`Télécharger`,"supplier_invoice.evidence_invalid":`Sélectionnez un fichier non vide.`,"supplierInvoice.analysis.action":`Analyser un document`,"supplierInvoice.analysis.title":`Analyser une facture fournisseur`,"supplierInvoice.analysis.intro":`Sélectionnez le fournisseur et le document. Contrôlez ensuite le brouillon créé.`,"supplierInvoice.analysis.loading":`Chargement du service d’analyse…`,"supplierInvoice.analysis.file":`Document à analyser`,"supplierInvoice.analysis.fileRequired":`Sélectionnez un document à analyser.`,"supplierInvoice.analysis.invalidFile":`Sélectionnez un fichier PDF, JPEG, PNG ou WebP.`,"supplierInvoice.analysis.externalNotice":`Ce document sera envoyé au service externe configuré.`,"supplierInvoice.analysis.localNotice":`Le document reste sur ce serveur pendant l’analyse.`,"supplierInvoice.analysis.consent":`J’autorise cet envoi externe pour ce document.`,"supplierInvoice.analysis.submit":`Créer le brouillon`,"supplierInvoice.analysis.failed":`Impossible d’analyser ce document.`,"supplierInvoice.analysisSettings.title":`Analyse des factures fournisseurs`,"supplierInvoice.analysisSettings.intro":`Configurez le service qui extrait les données des documents reçus.`,"supplierInvoice.analysisSettings.open":`Configurer l’analyse`,"supplierInvoice.analysisSettings.loading":`Chargement de la configuration d’analyse…`,"supplierInvoice.analysisSettings.adapter":`Adaptateur`,"supplierInvoice.analysisSettings.local":`Analyse locale simulée`,"supplierInvoice.analysisSettings.openai":`OpenAI`,"supplierInvoice.analysisSettings.endpoint":`Adresse HTTPS du service`,"supplierInvoice.analysisSettings.apiKey":`Nouvelle clé API`,"supplierInvoice.analysisSettings.credentialPresent":`Une clé API est enregistrée. Laissez ce champ vide pour la conserver.`,"supplierInvoice.analysisSettings.credentialMissing":`Aucune clé API n’est enregistrée.`,"supplierInvoice.analysisSettings.save":`Enregistrer la configuration`,"supplierInvoice.analysisSettings.saved":`La configuration d’analyse est enregistrée.`,"supplierInvoice.analysisSettings.error":`Impossible de charger ou d’enregistrer la configuration.`,"supplierInvoice.analysisSettings.unsavedChanges":`Abandonner les modifications de la configuration d’analyse\xA0?`,"supplierPaymentBatch.open":`Préparer les virements`,"supplierPaymentBatch.title":`Virements fournisseurs`,"supplierPaymentBatch.intro":`Regroupez les factures approuvées dans un fichier bancaire SEPA pain.001.`,"supplierPaymentBatch.loading":`Chargement des virements fournisseurs…`,"supplierPaymentBatch.createTitle":`Nouveau lot de virements`,"supplierPaymentBatch.executionDate":`Date d’exécution`,"supplierPaymentBatch.select":`Sélection`,"supplierPaymentBatch.selectInvoice":`Sélectionner la facture {reference}`,"supplierPaymentBatch.emptyEligible":`Aucune facture approuvée en EUR.`,"supplierPaymentBatch.create":`Générer le fichier pain.001`,"supplierPaymentBatch.created":`Le lot de virements est créé.`,"supplierPaymentBatch.download":`Télécharger le fichier XML`,"supplierPaymentBatch.history":`Fichiers générés`,"supplierPaymentBatch.messageId":`Identifiant du message`,"supplierPaymentBatch.transactionCount":`Virements`,"supplierPaymentBatch.controlSum":`Somme de contrôle`,"supplierPaymentBatch.file":`Fichier`,"supplierPaymentBatch.emptyHistory":`Aucun fichier de virements généré.`,"supplierInvoice.createTitle":`Saisir une facture fournisseur`,"supplierInvoice.editTitle":`Modifier la facture fournisseur`,"supplierInvoice.editorIntro":`Saisissez les données du document reçu. Confirmez-les après votre contrôle.`,"supplierInvoice.back":`Retour aux factures fournisseurs`,"supplierInvoice.loading":`Chargement des factures fournisseurs…`,"supplierInvoice.loadingDetail":`Chargement de la facture fournisseur…`,"supplierInvoice.empty":`Aucune facture fournisseur.`,"supplierInvoice.count.one":`{count} facture fournisseur`,"supplierInvoice.count.other":`{count} factures fournisseurs`,"supplierInvoice.loadedTotal":`Total chargé :`,"supplierInvoice.reference":`Référence fournisseur`,"supplierInvoice.supplier":`Fournisseur`,"supplierInvoice.chooseSupplier":`Sélectionnez un fournisseur`,"supplierInvoice.invoiceDate":`Date de facture`,"supplierInvoice.dueDate":`Date d’échéance`,"supplierInvoice.currency":`Devise`,"supplierInvoice.status":`État`,"supplierInvoice.total":`Total TTC`,"supplierInvoice.net":`Total HT`,"supplierInvoice.vat":`TVA`,"supplierInvoice.totals":`Totaux`,"supplierInvoice.details":`Informations`,"supplierInvoice.source":`Origine`,"supplierInvoice.source.manual":`Saisie manuelle`,"supplierInvoice.source.ocr":`Analyse OCR`,"supplierInvoice.lines":`Lignes de facture`,"supplierInvoice.description":`Description`,"supplierInvoice.netAmount":`Montant HT`,"supplierInvoice.vatRate":`Taux de TVA`,"supplierInvoice.addLine":`Ajouter une ligne`,"supplierInvoice.removeLine":`Supprimer la ligne`,"supplierInvoice.notes":`Notes internes`,"supplierInvoice.save":`Enregistrer le brouillon`,"supplierInvoice.cancel":`Annuler`,"supplierInvoice.edit":`Modifier`,"supplierInvoice.confirmAction":`Confirmer`,"supplierInvoice.approveAction":`Approuver`,"supplierInvoice.cancelAction":`Annuler la facture`,"supplierInvoice.confirm.confirm":`Confirmer cette facture et figer ses données ?`,"supplierInvoice.confirm.approve":`Approuver cette facture pour son paiement ?`,"supplierInvoice.confirm.cancel":`Annuler cette facture fournisseur ?`,"supplierInvoice.unsavedChanges":`Abandonner les modifications de cette facture fournisseur ?`,"supplierInvoice.status.draft":`Brouillon`,"supplierInvoice.status.confirmed":`Confirmée`,"supplierInvoice.status.approved":`Approuvée`,"supplierInvoice.status.paid":`Payée`,"supplierInvoice.status.cancelled":`Annulée`,"supplierInvoice.error":`Impossible de charger ou d’enregistrer les factures fournisseurs.`,"supplier_invoice.not_found":`Cette facture fournisseur est introuvable.`,"supplier_invoice.version_conflict":`Cette facture a changé. Actualisez la page avant de recommencer.`,"supplier_invoice.creation_conflict":`Cette demande de création contient maintenant d’autres données.`,"supplier_invoice.reference_exists":`Cette référence existe déjà pour ce fournisseur.`,"supplier_invoice.not_editable":`Seul un brouillon peut être modifié.`,"supplier_invoice.invalid_transition":`Cette action ne correspond pas à l’état actuel de la facture.`,"supplier_invoice.exchange_rate_missing":`Ajoutez un taux de change daté avant de confirmer cette facture fournisseur.`,"supplier_invoice.accounting_unavailable":`Ouvrez une période comptable et vérifiez le journal des achats ainsi que les comptes PCG requis.`,"supplier_invoice.supplier_unavailable":`Le fournisseur sélectionné est indisponible.`,"supplier_invoice.analysis_not_configured":`Le service d’analyse des factures fournisseurs n’est pas configuré.`,"supplier_invoice.analysis_consent_required":`Donnez votre accord avant l’envoi du document au service externe.`,"supplier_invoice.analysis_failed":`Le service n’a pas pu analyser ce document.`,"supplier_invoice.encryption_unavailable":`La clé de chiffrement des secrets est indisponible.`,"supplier_invoice.date_order_invalid":`La date d’échéance doit suivre la date de facture.`,"supplier_payment_batch.not_found":`Ce lot de virements est introuvable.`,"supplier_payment_batch.creation_conflict":`Cette demande de création contient maintenant d’autres données.`,"supplier_payment_batch.invoice_not_payable":`Sélectionnez uniquement des factures approuvées avec un montant positif.`,"supplier_payment_batch.currency_not_supported":`Le format SEPA pain.001 accepte uniquement les factures en EUR.`,"supplier_payment_batch.debtor_account_incomplete":`Renseignez le compte de paiement dans les coordonnées émetteur.`,"supplier_payment_batch.creditor_account_incomplete":`Renseignez l’IBAN de chaque fournisseur sélectionné.`,"supplier_payment_batch.party_name_too_long":`Le nom de l’émetteur ou d’un fournisseur dépasse 70 caractères.`,"page.back_office_supplier_invoices":`Factures fournisseurs | Froment Software`,"page.description.back_office_supplier_invoices":`Gestion des factures fournisseurs.`,"backOffice.navigation.purchases":`Achats`},en:{"supplierInvoice.title":`Supplier invoices`,"supplierInvoice.intro":`Review and approve received invoices before payment.`,"supplierInvoice.create":`Enter an invoice`,"supplierInvoice.creditAction":`Create supplier credit`,"supplierInvoice.kind":`Document type`,"supplierInvoice.kind.invoice":`Supplier invoice`,"supplierInvoice.kind.credit":`Supplier credit`,"supplierInvoice.sourceInvoice":`Source invoice`,"supplierInvoice.openSourceInvoice":`Open source invoice`,"supplierInvoice.evidence":`Evidence`,"supplierInvoice.evidenceAdd":`Add evidence`,"supplierInvoice.evidenceEmpty":`No evidence file.`,"supplierInvoice.evidenceDownload":`Download`,"supplier_invoice.evidence_invalid":`Select a non-empty file.`,"supplierInvoice.analysis.action":`Analyze a document`,"supplierInvoice.analysis.title":`Analyze a supplier invoice`,"supplierInvoice.analysis.intro":`Select the supplier and document. Then review the created draft.`,"supplierInvoice.analysis.loading":`Loading the analysis service…`,"supplierInvoice.analysis.file":`Document to analyze`,"supplierInvoice.analysis.fileRequired":`Select a document to analyze.`,"supplierInvoice.analysis.invalidFile":`Select a PDF, JPEG, PNG, or WebP file.`,"supplierInvoice.analysis.externalNotice":`This document will be sent to the configured external service.`,"supplierInvoice.analysis.localNotice":`The document stays on this server during analysis.`,"supplierInvoice.analysis.consent":`I authorize this external submission for this document.`,"supplierInvoice.analysis.submit":`Create draft`,"supplierInvoice.analysis.failed":`This document cannot be analyzed.`,"supplierInvoice.analysisSettings.title":`Supplier invoice analysis`,"supplierInvoice.analysisSettings.intro":`Configure the service that extracts data from received documents.`,"supplierInvoice.analysisSettings.open":`Configure analysis`,"supplierInvoice.analysisSettings.loading":`Loading analysis settings…`,"supplierInvoice.analysisSettings.adapter":`Adapter`,"supplierInvoice.analysisSettings.local":`Simulated local analysis`,"supplierInvoice.analysisSettings.openai":`OpenAI`,"supplierInvoice.analysisSettings.endpoint":`Service HTTPS address`,"supplierInvoice.analysisSettings.apiKey":`New API key`,"supplierInvoice.analysisSettings.credentialPresent":`An API key is stored. Leave this field empty to keep it.`,"supplierInvoice.analysisSettings.credentialMissing":`No API key is stored.`,"supplierInvoice.analysisSettings.save":`Save settings`,"supplierInvoice.analysisSettings.saved":`The analysis settings are saved.`,"supplierInvoice.analysisSettings.error":`The settings cannot be loaded or saved.`,"supplierInvoice.analysisSettings.unsavedChanges":`Discard the analysis settings changes?`,"supplierPaymentBatch.open":`Prepare transfers`,"supplierPaymentBatch.title":`Supplier payments`,"supplierPaymentBatch.intro":`Group approved invoices in a SEPA pain.001 bank file.`,"supplierPaymentBatch.loading":`Loading supplier payments…`,"supplierPaymentBatch.createTitle":`New payment batch`,"supplierPaymentBatch.executionDate":`Execution date`,"supplierPaymentBatch.select":`Select`,"supplierPaymentBatch.selectInvoice":`Select invoice {reference}`,"supplierPaymentBatch.emptyEligible":`No approved EUR invoice.`,"supplierPaymentBatch.create":`Generate pain.001 file`,"supplierPaymentBatch.created":`The payment batch is created.`,"supplierPaymentBatch.download":`Download XML file`,"supplierPaymentBatch.history":`Generated files`,"supplierPaymentBatch.messageId":`Message ID`,"supplierPaymentBatch.transactionCount":`Transfers`,"supplierPaymentBatch.controlSum":`Control sum`,"supplierPaymentBatch.file":`File`,"supplierPaymentBatch.emptyHistory":`No payment file generated.`,"supplierInvoice.createTitle":`Enter a supplier invoice`,"supplierInvoice.editTitle":`Edit supplier invoice`,"supplierInvoice.editorIntro":`Enter the received document data. Confirm it after review.`,"supplierInvoice.back":`Back to supplier invoices`,"supplierInvoice.loading":`Loading supplier invoices…`,"supplierInvoice.loadingDetail":`Loading supplier invoice…`,"supplierInvoice.empty":`No supplier invoices.`,"supplierInvoice.count.one":`{count} supplier invoice`,"supplierInvoice.count.other":`{count} supplier invoices`,"supplierInvoice.loadedTotal":`Loaded total:`,"supplierInvoice.reference":`Supplier reference`,"supplierInvoice.supplier":`Supplier`,"supplierInvoice.chooseSupplier":`Select a supplier`,"supplierInvoice.invoiceDate":`Invoice date`,"supplierInvoice.dueDate":`Due date`,"supplierInvoice.currency":`Currency`,"supplierInvoice.status":`Status`,"supplierInvoice.total":`Gross total`,"supplierInvoice.net":`Net total`,"supplierInvoice.vat":`VAT`,"supplierInvoice.totals":`Totals`,"supplierInvoice.details":`Details`,"supplierInvoice.source":`Source`,"supplierInvoice.source.manual":`Manual entry`,"supplierInvoice.source.ocr":`OCR analysis`,"supplierInvoice.lines":`Invoice lines`,"supplierInvoice.description":`Description`,"supplierInvoice.netAmount":`Net amount`,"supplierInvoice.vatRate":`VAT rate`,"supplierInvoice.addLine":`Add line`,"supplierInvoice.removeLine":`Remove line`,"supplierInvoice.notes":`Internal notes`,"supplierInvoice.save":`Save draft`,"supplierInvoice.cancel":`Cancel`,"supplierInvoice.edit":`Edit`,"supplierInvoice.confirmAction":`Confirm`,"supplierInvoice.approveAction":`Approve`,"supplierInvoice.cancelAction":`Cancel invoice`,"supplierInvoice.confirm.confirm":`Confirm this invoice and freeze its data?`,"supplierInvoice.confirm.approve":`Approve this invoice for payment?`,"supplierInvoice.confirm.cancel":`Cancel this supplier invoice?`,"supplierInvoice.unsavedChanges":`Discard this supplier invoice’s changes?`,"supplierInvoice.status.draft":`Draft`,"supplierInvoice.status.confirmed":`Confirmed`,"supplierInvoice.status.approved":`Approved`,"supplierInvoice.status.paid":`Paid`,"supplierInvoice.status.cancelled":`Cancelled`,"supplierInvoice.error":`The supplier invoices cannot be loaded or saved.`,"supplier_invoice.not_found":`This supplier invoice cannot be found.`,"supplier_invoice.version_conflict":`This invoice changed. Refresh the page before you try again.`,"supplier_invoice.creation_conflict":`This creation request now contains different data.`,"supplier_invoice.reference_exists":`This reference already exists for this supplier.`,"supplier_invoice.not_editable":`Only a draft can be edited.`,"supplier_invoice.invalid_transition":`This action does not match the current invoice status.`,"supplier_invoice.exchange_rate_missing":`Add a dated exchange rate before you confirm this supplier invoice.`,"supplier_invoice.accounting_unavailable":`Open an accounting period and check the purchase journal and required PCG accounts.`,"supplier_invoice.supplier_unavailable":`The selected supplier is unavailable.`,"supplier_invoice.analysis_not_configured":`The supplier invoice analysis service is not configured.`,"supplier_invoice.analysis_consent_required":`Give consent before sending the document to the external service.`,"supplier_invoice.analysis_failed":`The service could not analyze this document.`,"supplier_invoice.encryption_unavailable":`The secret encryption key is unavailable.`,"supplier_invoice.date_order_invalid":`The due date must follow the invoice date.`,"supplier_payment_batch.not_found":`This payment batch cannot be found.`,"supplier_payment_batch.creation_conflict":`This creation request now contains different data.`,"supplier_payment_batch.invoice_not_payable":`Select only approved invoices with a positive amount.`,"supplier_payment_batch.currency_not_supported":`The SEPA pain.001 format accepts only EUR invoices.`,"supplier_payment_batch.debtor_account_incomplete":`Enter the payment account in the issuer details.`,"supplier_payment_batch.creditor_account_incomplete":`Enter an IBAN for each selected supplier.`,"supplier_payment_batch.party_name_too_long":`The issuer name or a supplier name exceeds 70 characters.`,"page.back_office_supplier_invoices":`Supplier invoices | Froment Software`,"page.description.back_office_supplier_invoices":`Supplier invoice management.`,"backOffice.navigation.purchases":`Purchases`}};var h$1={fr:{group:{title:`Factures fournisseurs`,description:`Saisie, confirmation et approbation des factures fournisseurs.`},operations:{supplierInvoiceList:{summary:`Lister les factures fournisseurs`,description:`Retourne toutes les factures fournisseurs et leurs lignes.`},supplierInvoiceGet:{summary:`Lire une facture fournisseur`,description:`Retourne une facture fournisseur et ses lignes.`},supplierInvoiceCreate:{summary:`Créer une facture fournisseur`,description:`Crée un brouillon manuel ou issu d’une analyse OCR.`},supplierInvoiceUpdate:{summary:`Modifier une facture fournisseur`,description:`Modifie un brouillon avec contrôle de version.`},supplierInvoiceConfirm:{summary:`Confirmer une facture fournisseur`,description:`Fige les données contrôlées du brouillon.`},supplierInvoiceApprove:{summary:`Approuver une facture fournisseur`,description:`Approuve une facture confirmée pour son paiement.`},supplierInvoiceCancel:{summary:`Annuler une facture fournisseur`,description:`Annule un brouillon ou une facture confirmée.`},supplierInvoiceAnalysisSettings:{summary:`Lire la configuration d’analyse`,description:`Retourne l’adaptateur actif sans exposer ses secrets.`},supplierInvoiceAnalysisStatus:{summary:`Lire le mode d’analyse`,description:`Indique si l’analyse envoie le document à un service externe.`},supplierInvoiceAnalysisSettingsUpdate:{summary:`Configurer l’analyse des factures fournisseurs`,description:`Configure un adaptateur local ou HTTP et chiffre ses identifiants.`},supplierInvoiceAnalyze:{summary:`Analyser une facture fournisseur`,description:`Crée un brouillon OCR après le consentement requis.`},supplierPaymentBatchList:{summary:`Lister les lots de virements`,description:`Retourne les derniers fichiers pain.001 générés.`},supplierPaymentBatchCreate:{summary:`Créer un lot de virements`,description:`Génère un fichier pain.001 immuable pour les factures approuvées en EUR.`},supplierPaymentBatchDownload:{summary:`Télécharger un lot de virements`,description:`Retourne le fichier XML pain.001 généré.`}}},en:{group:{title:`Supplier invoices`,description:`Entry, confirmation, and approval of supplier invoices.`},operations:{supplierInvoiceList:{summary:`List supplier invoices`,description:`Returns all supplier invoices and their lines.`},supplierInvoiceGet:{summary:`Get a supplier invoice`,description:`Returns one supplier invoice and its lines.`},supplierInvoiceCreate:{summary:`Create a supplier invoice`,description:`Creates a manual or OCR analysis draft.`},supplierInvoiceUpdate:{summary:`Update a supplier invoice`,description:`Updates a draft with a version check.`},supplierInvoiceConfirm:{summary:`Confirm a supplier invoice`,description:`Freezes the reviewed draft data.`},supplierInvoiceApprove:{summary:`Approve a supplier invoice`,description:`Approves a confirmed invoice for payment.`},supplierInvoiceCancel:{summary:`Cancel a supplier invoice`,description:`Cancels a draft or confirmed invoice.`},supplierInvoiceAnalysisSettings:{summary:`Get analysis settings`,description:`Returns the active adapter without exposing its secrets.`},supplierInvoiceAnalysisStatus:{summary:`Get the analysis mode`,description:`Indicates if analysis sends the document to an external service.`},supplierInvoiceAnalysisSettingsUpdate:{summary:`Configure supplier invoice analysis`,description:`Configures a local or HTTP adapter and encrypts its credentials.`},supplierInvoiceAnalyze:{summary:`Analyze a supplier invoice`,description:`Creates an OCR draft after the required consent.`},supplierPaymentBatchList:{summary:`List payment batches`,description:`Returns the latest generated pain.001 files.`},supplierPaymentBatchCreate:{summary:`Create a payment batch`,description:`Generates an immutable pain.001 file for approved EUR invoices.`},supplierPaymentBatchDownload:{summary:`Download a payment batch`,description:`Returns the generated pain.001 XML file.`}}}};var se={fr:{"affair.noHistory":`Aucun événement enregistré pour cette affaire.`,"affair.intro":`Regroupez plusieurs devis, commandes et factures pour un même client.`,"affair.create":`Créer une affaire`,"affair.createQuote":`Créer un devis`,"affair.archive":`Archiver l’affaire`,"affair.archiveConfirm":`Archiver cette affaire ? Les documents seront conservés et l’affaire restera consultable.`,"affair.reopen":`Rouvrir l’affaire`,"affair.selectClient":`Sélectionnez un client`,"affair.reference":`Numéro d’affaire`,"affair.details":`Informations`,"affair.documents":`Documents liés`,"affair.noDocuments":`Aucun document lié.`,"affair.open":`Ouverte`,"affair.closed":`Clôturée`,"affair.error":`Impossible de charger ou d’enregistrer les affaires.`,"affair.edit":`Modifier l’affaire`,"affair.save":`Enregistrer l’affaire`,"affair.not_found":`Cette affaire est introuvable.`,"affair.conflict":`L’affaire a changé ou le document sélectionné est incompatible.`,"inlineEdit.editField":`Modifier : {field}`,"inlineEdit.save":`Enregistrer`,"inlineEdit.cancel":`Annuler`},en:{"affair.noHistory":`No recorded events for this affair.`,"affair.intro":`Group multiple quotes, orders, and invoices for one client.`,"affair.create":`Create an affair`,"affair.createQuote":`Create a quote`,"affair.archive":`Archive affair`,"affair.archiveConfirm":`Archive this affair? Its documents will remain available and the affair will remain accessible.`,"affair.reopen":`Reopen affair`,"affair.selectClient":`Select a client`,"affair.reference":`Affair number`,"affair.details":`Details`,"affair.documents":`Linked documents`,"affair.noDocuments":`No linked documents.`,"affair.open":`Open`,"affair.closed":`Closed`,"affair.error":`Unable to load or save affairs.`,"affair.edit":`Edit affair`,"affair.save":`Save affair`,"affair.not_found":`This affair was not found.`,"affair.conflict":`The affair changed or the selected document is incompatible.`,"inlineEdit.editField":`Edit: {field}`,"inlineEdit.save":`Save`,"inlineEdit.cancel":`Cancel`}};var re={fr:{"documentLine.actions":`Actions`,"documentLine.add":`Ajouter une ligne`,"documentLine.cancel":`Annuler`,"documentLine.description":`Description`,"documentLine.descriptionPlaceholder":`Ex. Atelier de cadrage fonctionnel`,"documentLine.descriptionInvalid":`Saisissez une description de 160 caractères au maximum.`,"documentLine.descriptionNumber":`Description de la ligne {number}`,"documentLine.edit":`Modifier`,"documentLine.editNumber":`Modifier la ligne {number}`,"documentLine.invalid":`Corrigez les valeurs de cette ligne.`,"documentLine.number":`Ligne {number}`,"documentLine.quantity":`Quantité`,"documentLine.quantityInvalid":`Saisissez une quantité positive avec trois décimales au maximum.`,"documentLine.quantityNumber":`Quantité de la ligne {number}`,"documentLine.remove":`Supprimer`,"documentLine.save":`Enregistrer`,"documentLine.subtotal":`Total HT`,"documentLine.total":`Total`,"documentLine.totalWithTax":`Total TTC`,"documentLine.unitPrice":`Prix unitaire`,"documentLine.unitPriceInvalid":`Saisissez un prix positif ou nul avec deux décimales au maximum.`,"documentLine.unitPriceNumber":`Prix unitaire de la ligne {number}`,"documentLine.vatRate":`TVA`,"documentLine.vatRateInvalid":`Saisissez un taux compris entre 0 et 100.`,"documentLine.vatRateNumber":`Taux de TVA de la ligne {number}`,"documentLine.vatTotal":`TVA`},en:{"documentLine.actions":`Actions`,"documentLine.add":`Add line`,"documentLine.cancel":`Cancel`,"documentLine.description":`Description`,"documentLine.descriptionPlaceholder":`e.g. Functional scoping workshop`,"documentLine.descriptionInvalid":`Enter a description with no more than 160 characters.`,"documentLine.descriptionNumber":`Line {number} description`,"documentLine.edit":`Edit`,"documentLine.editNumber":`Edit line {number}`,"documentLine.invalid":`Correct the values in this line.`,"documentLine.number":`Line {number}`,"documentLine.quantity":`Quantity`,"documentLine.quantityInvalid":`Enter a positive quantity with no more than three decimal places.`,"documentLine.quantityNumber":`Line {number} quantity`,"documentLine.remove":`Remove`,"documentLine.save":`Save`,"documentLine.subtotal":`Subtotal`,"documentLine.total":`Total`,"documentLine.totalWithTax":`Total including VAT`,"documentLine.unitPrice":`Unit price`,"documentLine.unitPriceInvalid":`Enter a non-negative price with no more than two decimal places.`,"documentLine.unitPriceNumber":`Line {number} unit price`,"documentLine.vatRate":`VAT`,"documentLine.vatRateInvalid":`Enter a rate from 0 to 100.`,"documentLine.vatRateNumber":`Line {number} VAT rate`,"documentLine.vatTotal":`VAT`}};var oe$1={fr:{"accounting.title":`Comptabilité`,"accounting.intro":`Gérez le plan comptable, les journaux, les périodes, les écritures et les exports réglementaires.`,"accounting.sections":`Sections de la comptabilité`,"accounting.accounts":`Plan comptable`,"accounting.journals":`Journaux`,"accounting.periods":`Périodes`,"accounting.entries":`Écritures`,"accounting.reports":`États`,"accounting.opening":`Balance d’ouverture`,"accounting.evidence":`Pièces`,"accounting.lettering":`Lettrage`,"accounting.loading":`Chargement de la comptabilité…`,"accounting.loadError":`Impossible de charger les données comptables.`,"accounting.error":`Impossible de terminer l’opération comptable.`,"accounting.period_transition_invalid":`Cette transition de période n’est pas autorisée.`,"accounting.period_has_drafts":`Validez ou supprimez les brouillons avant de verrouiller la période.`,"accounting.period_reopen_acknowledgement_invalid":`Saisissez le libellé exact de l’exercice pour autoriser sa réouverture.`,"accounting.tax_filing_configuration_invalid":`Configurez le prestataire de télédéclaration.`,"accounting.tax_filing_failed":`La télédéclaration a échoué.`,"accounting.encryption_unavailable":`Le chiffrement des secrets n’est pas configuré.`,"accounting.saved":`Données comptables enregistrées.`,"accounting.code":`Code`,"accounting.label":`Libellé`,"accounting.kind":`Type`,"accounting.status":`État`,"accounting.actions":`Actions`,"accounting.active":`Actif`,"accounting.archived":`Archivé`,"accounting.edit":`Modifier`,"accounting.archive":`Archiver`,"accounting.reactivate":`Réactiver`,"accounting.save":`Enregistrer`,"accounting.cancel":`Annuler`,"accounting.create":`Créer`,"accounting.add":`Ajouter`,"accounting.remove":`Retirer`,"accounting.account.add":`Ajouter un compte`,"accounting.account.edit":`Modifier le compte`,"accounting.journal.add":`Ajouter un journal`,"accounting.journal.edit":`Modifier le journal`,"accounting.period.add":`Ajouter un exercice`,"accounting.entry.add":`Ajouter une écriture`,"accounting.accountKind.asset":`Actif`,"accounting.accountKind.liability":`Passif`,"accounting.accountKind.equity":`Capitaux propres`,"accounting.accountKind.income":`Produit`,"accounting.accountKind.expense":`Charge`,"accounting.journalKind.sales":`Ventes`,"accounting.journalKind.purchases":`Achats`,"accounting.journalKind.bank":`Banque`,"accounting.journalKind.general":`Opérations diverses`,"accounting.journalKind.opening":`À nouveaux`,"accounting.startsOn":`Date de début`,"accounting.endsOn":`Date de fin`,"accounting.period":`Période`,"accounting.period.open":`Ouverte`,"accounting.period.locked":`Verrouillée`,"accounting.period.closed":`Clôturée`,"accounting.period.final":`Clôture définitive`,"accounting.lock":`Verrouiller`,"accounting.close":`Clôturer`,"accounting.reopen":`Réouvrir`,"accounting.reopenWarning":`Réouvrir l’exercice « {label} » autorise de nouvelles écritures. Cette action peut rendre incohérents les états, déclarations et exports déjà produits.`,"accounting.reopenAcknowledgement":`Saisissez « {label} » pour confirmer la réouverture.`,"accounting.finalClose":`Clôturer définitivement`,"accounting.journal":`Journal`,"accounting.date":`Date`,"accounting.reference":`Référence`,"accounting.description":`Description`,"accounting.account":`Compte`,"accounting.debit":`Débit`,"accounting.credit":`Crédit`,"accounting.line.add":`Ajouter une ligne`,"accounting.createDraft":`Créer le brouillon`,"accounting.entry.draft":`Brouillon`,"accounting.entry.posted":`Validée`,"accounting.entry.reversed":`Extournée`,"accounting.post":`Valider`,"accounting.reverse":`Extourner`,"accounting.generate":`Générer`,"accounting.fec":`Exporter le FEC`,"accounting.balance":`Solde`,"accounting.total":`Total`,"accounting.ca3":`Exporter la CA3`,"accounting.taxFiling":`Télédéclaration de TVA`,"accounting.taxFiling.load":`Charger la configuration`,"accounting.taxFiling.adapter":`Adaptateur`,"accounting.taxFiling.local":`Simulateur local`,"accounting.taxFiling.http":`Prestataire HTTP`,"accounting.taxFiling.endpoint":`Adresse du prestataire`,"accounting.taxFiling.apiKey":`Clé API`,"accounting.taxFiling.credentialStored":`Une clé est enregistrée.`,"accounting.taxFiling.submit":`Télédéclarer`,"accounting.taxFiling.confirm":`Confirmez-vous la télédéclaration de cette période ?`,"accounting.taxFiling.submitted":`La télédéclaration est enregistrée.`,"accounting.financialStatements":`Bilan et compte de résultat`,"accounting.assets":`Actif`,"accounting.liabilities":`Passif`,"accounting.equity":`Capitaux propres`,"accounting.income":`Produits`,"accounting.expenses":`Charges`,"accounting.netIncome":`Résultat net`,"accounting.vat":`État de TVA et cases CA3`,"accounting.ledger":`Grand livre et journaux`,"accounting.ca3.box16":`TVA brute`,"accounting.ca3.box20":`TVA déductible`,"accounting.ca3.box28":`TVA nette à payer`,"accounting.opening.title":`Importer une balance d’ouverture`,"accounting.opening.hint":`Sélectionnez le CSV et indiquez les noms exacts des quatre colonnes.`,"accounting.file":`Fichier`,"accounting.opening.accountColumn":`Colonne du compte`,"accounting.opening.labelColumn":`Colonne du libellé`,"accounting.opening.debitColumn":`Colonne du débit`,"accounting.opening.creditColumn":`Colonne du crédit`,"accounting.preview":`Prévisualiser`,"accounting.opening.balanced":`La balance est équilibrée.`,"accounting.opening.unbalanced":`La balance n’est pas équilibrée.`,"accounting.commit":`Valider l’import`,"accounting.evidence.add":`Ajouter une pièce justificative`,"accounting.entry":`Écriture`,"accounting.evidence.retention":`Les pièces et leurs traces sont conservées pendant au moins dix ans.`,"accounting.mediaType":`Type de fichier`,"accounting.fingerprint":`Empreinte SHA-256`,"accounting.select":`Sélectionner`,"accounting.download":`Télécharger`,"accounting.lettering.title":`Lettrer des écritures`,"accounting.lettering.hint":`Sélectionnez au moins deux lignes équilibrées du même compte.`,"accounting.lettering.apply":`Appliquer le lettrage`,"accounting.lettering.code":`Code de lettrage`,"accounting.lettering.pending":`À lettrer`,"accounting.lettering.completed":`Lettrée`,"accounting.evidence.pdf":`PDF`,"accounting.evidence.image":`Image`,"accounting.evidence.other":`Autre format`,"accounting.balance.zero":`Solde nul`,"accounting.rows.one":`{count} résultat`,"accounting.rows.other":`{count} résultats`,"demo.reset":`Réinitialiser la démonstration`,"demo.title":`Données de démonstration`,"demo.hint":`Restaurez toutes les données de démonstration de cet environnement hors production.`,"demo.password":`Mot de passe de réinitialisation`,"demo.confirm":`Remplacer toutes les données par le jeu de démonstration ? Toutes les sessions seront fermées.`,"demo.error":`La réinitialisation est indisponible. Vérifiez l’environnement et le secret serveur.`},en:{"accounting.title":`Accounting`,"accounting.intro":`Manage the chart of accounts, journals, periods, entries, and regulatory exports.`,"accounting.sections":`Accounting sections`,"accounting.accounts":`Chart of accounts`,"accounting.journals":`Journals`,"accounting.periods":`Periods`,"accounting.entries":`Entries`,"accounting.reports":`Reports`,"accounting.opening":`Opening balance`,"accounting.evidence":`Evidence`,"accounting.lettering":`Lettering`,"accounting.loading":`Loading accounting data…`,"accounting.loadError":`Accounting data cannot be loaded.`,"accounting.error":`The accounting operation failed.`,"accounting.period_transition_invalid":`This period transition is not allowed.`,"accounting.period_has_drafts":`Post or remove drafts before you lock the period.`,"accounting.period_reopen_acknowledgement_invalid":`Enter the exact period label to authorize reopening.`,"accounting.tax_filing_configuration_invalid":`Configure the tax filing provider.`,"accounting.tax_filing_failed":`The tax filing failed.`,"accounting.encryption_unavailable":`Secret encryption is not configured.`,"accounting.saved":`Accounting data saved.`,"accounting.code":`Code`,"accounting.label":`Label`,"accounting.kind":`Type`,"accounting.status":`Status`,"accounting.actions":`Actions`,"accounting.active":`Active`,"accounting.archived":`Archived`,"accounting.edit":`Edit`,"accounting.archive":`Archive`,"accounting.reactivate":`Reactivate`,"accounting.save":`Save`,"accounting.cancel":`Cancel`,"accounting.create":`Create`,"accounting.add":`Add`,"accounting.remove":`Remove`,"accounting.account.add":`Add account`,"accounting.account.edit":`Edit account`,"accounting.journal.add":`Add journal`,"accounting.journal.edit":`Edit journal`,"accounting.period.add":`Add fiscal year`,"accounting.entry.add":`Add entry`,"accounting.accountKind.asset":`Asset`,"accounting.accountKind.liability":`Liability`,"accounting.accountKind.equity":`Equity`,"accounting.accountKind.income":`Income`,"accounting.accountKind.expense":`Expense`,"accounting.journalKind.sales":`Sales`,"accounting.journalKind.purchases":`Purchases`,"accounting.journalKind.bank":`Bank`,"accounting.journalKind.general":`General`,"accounting.journalKind.opening":`Opening`,"accounting.startsOn":`Start date`,"accounting.endsOn":`End date`,"accounting.period":`Period`,"accounting.period.open":`Open`,"accounting.period.locked":`Locked`,"accounting.period.closed":`Closed`,"accounting.period.final":`Finally closed`,"accounting.lock":`Lock`,"accounting.close":`Close`,"accounting.reopen":`Reopen`,"accounting.reopenWarning":`Reopening “{label}” allows new entries. This action can make existing reports, filings, and exports inconsistent.`,"accounting.reopenAcknowledgement":`Enter “{label}” to confirm reopening.`,"accounting.finalClose":`Close finally`,"accounting.journal":`Journal`,"accounting.date":`Date`,"accounting.reference":`Reference`,"accounting.description":`Description`,"accounting.account":`Account`,"accounting.debit":`Debit`,"accounting.credit":`Credit`,"accounting.line.add":`Add line`,"accounting.createDraft":`Create draft`,"accounting.entry.draft":`Draft`,"accounting.entry.posted":`Posted`,"accounting.entry.reversed":`Reversed`,"accounting.post":`Post`,"accounting.reverse":`Reverse`,"accounting.generate":`Generate`,"accounting.fec":`Export FEC`,"accounting.balance":`Balance`,"accounting.total":`Total`,"accounting.ca3":`Export CA3`,"accounting.taxFiling":`VAT filing`,"accounting.taxFiling.load":`Load configuration`,"accounting.taxFiling.adapter":`Adapter`,"accounting.taxFiling.local":`Local simulator`,"accounting.taxFiling.http":`HTTP provider`,"accounting.taxFiling.endpoint":`Provider endpoint`,"accounting.taxFiling.apiKey":`API key`,"accounting.taxFiling.credentialStored":`A key is stored.`,"accounting.taxFiling.submit":`Submit VAT filing`,"accounting.taxFiling.confirm":`Do you confirm this period VAT filing?`,"accounting.taxFiling.submitted":`The VAT filing is recorded.`,"accounting.financialStatements":`Balance sheet and income statement`,"accounting.assets":`Assets`,"accounting.liabilities":`Liabilities`,"accounting.equity":`Equity`,"accounting.income":`Income`,"accounting.expenses":`Expenses`,"accounting.netIncome":`Net income`,"accounting.vat":`VAT report and CA3 boxes`,"accounting.ledger":`General ledger and journals`,"accounting.ca3.box16":`Gross VAT`,"accounting.ca3.box20":`Deductible VAT`,"accounting.ca3.box28":`Net VAT payable`,"accounting.opening.title":`Import an opening balance`,"accounting.opening.hint":`Select the CSV file and enter the exact names of its four columns.`,"accounting.file":`File`,"accounting.opening.accountColumn":`Account column`,"accounting.opening.labelColumn":`Label column`,"accounting.opening.debitColumn":`Debit column`,"accounting.opening.creditColumn":`Credit column`,"accounting.preview":`Preview`,"accounting.opening.balanced":`The balance is balanced.`,"accounting.opening.unbalanced":`The balance is not balanced.`,"accounting.commit":`Commit import`,"accounting.evidence.add":`Add evidence`,"accounting.entry":`Entry`,"accounting.evidence.retention":`Evidence and access records are retained for at least ten years.`,"accounting.mediaType":`File type`,"accounting.fingerprint":`SHA-256 fingerprint`,"accounting.select":`Select`,"accounting.download":`Download`,"accounting.lettering.title":`Letter entries`,"accounting.lettering.hint":`Select at least two balanced lines from the same account.`,"accounting.lettering.apply":`Apply lettering`,"accounting.lettering.code":`Lettering code`,"accounting.lettering.pending":`Pending`,"accounting.lettering.completed":`Lettered`,"accounting.evidence.pdf":`PDF`,"accounting.evidence.image":`Image`,"accounting.evidence.other":`Other format`,"accounting.balance.zero":`Zero balance`,"accounting.rows.one":`{count} result`,"accounting.rows.other":`{count} results`,"demo.reset":`Reset demonstration data`,"demo.title":`Demonstration data`,"demo.hint":`Restore all demonstration data for this non-production environment.`,"demo.password":`Reset password`,"demo.confirm":`Replace all data with the demonstration dataset? All sessions will close.`,"demo.error":`The reset is unavailable. Check the environment and the server secret.`}};var ke={fr:m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1({},re.fr),oe$1.fr),se.fr),C$1.fr),x$1.fr),A$1.fr),O$3.fr),R$1.fr),{"design.components.searchFilter":`Recherche : {query}`}),q$1.fr),S$2.fr),L$1.fr),W$1.fr),I$2.fr),P$1.fr),D$1.fr),E$2.fr),_$1.fr),z$2.fr),{"design.components.workflows":`Parcours complets`}),y$1.fr),F$2.fr),N$3.fr),U$2.fr),V$1.fr),j$2.fr),M$2.fr),B$1.fr),H$1.fr),Q$2.fr),G$1.fr),K$2.fr),Y$2.fr),J$2.fr),$$2.fr),X$2.fr),Z$2.fr),ee$2.fr),ie$1.fr),te$1.fr),ne$1.fr),ae$1.fr),{"design.confirmation.title":`Modales de confirmation`,"design.confirmation.hint":`Le focus commence sur Annuler. Tab reste dans la modale. Échap et le fond annulent la demande.`,"design.confirmation.open":`Ouvrir une confirmation`,"design.confirmation.discard":`Tester un abandon de modifications`,"design.confirmation.discardLabel":`Abandonner les modifications`,"design.confirmation.message":`Confirmer cette action de démonstration ?`,"design.confirmation.discardMessage":`Abandonner les modifications de démonstration ? Cette modale utilise le même service que les formulaires du backoffice.`,"design.confirmation.accepted":`Action de démonstration confirmée.`,"design.confirmation.cancelled":`Action de démonstration annulée.`,"design.confirmation.noEffect":`Ces exemples ne modifient aucune donnée et n’appellent aucun service externe.`,"login.heading":`Connexion`,"login.description":`Vos documents et le suivi de vos règlements, au même endroit.`,"login.access":`Votre compte donne accès aux documents et aux actions qui vous concernent.`,"bank.history":`Historique des rapprochements`,"bank.historyHint":`Les 100 derniers rapprochements, avec dates, identifiants des auteurs et motifs de dissociation.`,"bank.historyEmpty":`Aucun rapprochement enregistré pour cette opération.`,"emails.prepareReminder":`Préparer un rappel de paiement`,"emails.preparingReminder":`Préparation du rappel…`,"emails.reminderFailed":`Impossible de préparer le rappel. Vérifiez que la facture est émise et présente un solde restant.`,"emails.reminderReview":`Vérifiez le destinataire et le solde avant de soumettre le message. Le destinataire vient de la fiche client actuelle. Aucune pièce jointe n’est ajoutée. Aucun envoi automatique n’est programmé.`,"emails.reminderSubject":`Rappel de paiement — {reference}`,"emails.reminderBody":`Bonjour,
11
+ Reply to this message to check routing to the Tuta mailbox.`,"emailTest.progress":`3. Track the test`,"emailTest.status":`Test status`,"emailTest.pendingRequest":`Recording is not yet confirmed. The content is locked. Refresh the status or resume the same request.`,"emailTest.resume":`Resume the same request`,"emailTest.recoveryUnavailable":`Local recovery is unavailable. Check account access and browser session storage, then refresh the status. No new send starts without this record.`,"emailTest.recoveryHint":`An unanswered request stays in this tab after a reload, including its content. Server confirmation removes it. Unsubmitted drafts are not retained.`,"emailTest.historyUnavailable":`History unavailable. Refresh the status before concluding that no test exists.`,"emailTest.live":`Status refreshes every 3 seconds. The server continues the test when you leave this page.`,"emailTest.paused":`Status refresh paused. The last data remains visible; the server continues the test. Refresh to resume.`,"emailTest.refresh":`Refresh test status`,"emailTest.empty":`No test recorded.`,"emailTest.queued":`Recorded — waiting to send`,"emailTest.sending":`Sending`,"emailTest.retrying":`Retry scheduled`,"emailTest.accepted":`Accepted by Resend — delivery unconfirmed`,"emailTest.delivered":`Delivery confirmed by Resend`,"emailTest.bounced":`Rejected by the recipient server`,"emailTest.complained":`Reported as spam`,"emailTest.failed":`Test stopped after an error`,"emailTest.blocked":`Test blocked before sending`,"emailTest.acceptedHint":`API acceptance does not prove receipt. “Delivery confirmed” means the recipient server accepted the email.`,"emailTest.failureHint":`Check the test details and Resend log before sending another email. A lost network response can hide an accepted send.`,"emailTest.attempts":`Send attempts`,"emailTest.nextAttempt":`Next check or attempt`,"emailTest.providerId":`Resend identifier`,"emailTest.requestId":`Request identifier`,"emailTest.updatedAt":`Last checked`,"emailTest.createdAt":`Recorded at`,"emailTest.history":`Test history`,"emailTest.historyHint":`Requests and their content are retained. A retry uses the same request; it does not create a new message.`,"emailTest.details":`View test`,"emailTest.error":`Recording the test is unconfirmed. Refresh the status or resume the same request.`,"emailTest.credentialsMissing":`Resend key missing. Set RESEND_API_KEY in the active SOPS profile, then restart the application.`,"emailTest.credentialsChanged":`The key used for this test has changed. Check the Resend account log associated with the previous key before sending another email.`,"emailTest.permissionRevoked":`The account that started the test is no longer authorized to continue automatic processing. Check the test status before sending another email.`,"emailTest.rejected":`Resend rejected the request. Check the key, its permissions and verification of mail.froment.software in Resend.`,"emailTest.rateLimited":`Resend is limiting requests. The server waits before trying again, up to five attempts.`,"emailTest.unavailable":`Resend did not confirm the request. Check the status and Resend log before sending another email.`,"emailTest.expired":`The safe retry window has expired. Check the Resend log; this message will not be sent again automatically.`,"emailTest.statusUnavailable":`Email delivery is unconfirmed. Check the Resend log.`,"emailTest.conflict":`This request exists with different content or a different author. Refresh test status before continuing.`,"emailTest.active":`A test is already waiting to send. Wait for it to finish and check its status.`,"emailTest.limit":`The limit of 100 retained tests has been reached. Check the history; no new message was created.`}};var T$3={fr:{providerConnections:{summary:`Lire les accès des prestataires`,description:`Indique la présence des identifiants dans le profil actif, sans exposer leurs valeurs ni appeler les prestataires.`},emailTestList:{summary:`Consulter les tests Resend`,description:`Liste les demandes conservées et leur état durable. Une acceptation par Resend ne prouve pas la remise du courriel.`},emailTestCreate:{summary:`Programmer un vrai courriel de test`,description:`Enregistre la demande avant tout appel externe. Le serveur impose le destinataire sacha@sacha.house. Les courriels clients restent simulés. Réutilisez le même UUID et le même contenu après une réponse incertaine.`}},en:{providerConnections:{summary:`Read provider access status`,description:`Reports credential presence in the active profile without exposing values or calling providers.`},emailTestList:{summary:`List Resend tests`,description:`Lists retained requests and their durable state. Resend acceptance does not prove email delivery.`},emailTestCreate:{summary:`Queue a real test email`,description:`Records the request before any external call. The server enforces sacha@sacha.house as the recipient. Customer emails remain simulated. Reuse the same UUID and content after an uncertain response.`}}};var x$1={fr:{"checkout.openSettings":`Tester Stripe Checkout`,"checkout.title":`Stripe Checkout — mode test`,"checkout.intro":`Créez une page de paiement hébergée à partir du solde d’une facture émise. Suivez ensuite le résultat du test.`,"checkout.safety":`Aucun argent réel ne circule. Un paiement de test ne solde pas la facture et ne crée aucun encaissement local.`,"checkout.connection":`1. Vérifier les accès`,"checkout.loading":`Chargement des accès et des factures…`,"checkout.key":`Clé Stripe`,"checkout.testKey":`Clé de test présente. Sa présence ne prouve pas sa validité.`,"checkout.webhook":`Notifications Stripe`,"checkout.webhookPresent":`Secret de signature présent. La réception des notifications reste à vérifier.`,"checkout.webhookAbsent":`Secret de signature absent. Le suivi fonctionne par interrogation de Stripe.`,"checkout.polling":`Le serveur consulte Stripe toutes les 30 secondes. Une notification signée déclenche une vérification anticipée.`,"checkout.refresh":`Actualiser les accès et le suivi`,"checkout.reconcile":`Vérifier la session auprès de Stripe`,"checkout.reconcileUnconfirmed":`Le résultat de cette vérification reste à confirmer. Actualisez le suivi de cette session Stripe.`,"checkout.reconcileHint":`Le suivi automatique est arrêté. Cette action consulte uniquement la session existante avec la clé de test actuelle. Elle ne crée aucun paiement.`,"checkout.reconcileDenied":`Votre compte ne permet pas de vérifier cette session Stripe. Les permissions de configuration des connexions et de lecture des factures sont requises.`,"checkout.notFound":`Cette demande Stripe n’existe pas.`,"checkout.statusWindowExceeded":`La période de suivi automatique est terminée. Le résultat reste inconnu. Vous pouvez demander une vérification de la session existante.`,"checkout.prepare":`2. Préparer la page de paiement`,"checkout.invoice":`Facture`,"checkout.chooseInvoice":`Choisir une facture émise`,"checkout.invoiceHint":`Les factures éligibles sont émises, sans avoir, avec un solde compris entre 0,50 € et 999 999,99 €. Le serveur vérifie à nouveau le solde.`,"checkout.noInvoices":`Aucune facture éligible. Émettez une facture avec un solde restant, puis actualisez cette page.`,"checkout.invoiceRequired":`Choisissez une facture éligible avant de créer la page de paiement.`,"checkout.amount":`Montant du test`,"checkout.client":`Client de la facture`,"checkout.total":`Total de la facture`,"checkout.recordedPaid":`Encaissements locaux actifs`,"checkout.version":`Version de la facture`,"checkout.viewInvoice":`Consulter la facture`,"checkout.transmitted":`Stripe reçoit le numéro de facture, le montant, les identifiants de suivi et l’adresse de test sacha@sacha.house. Les coordonnées du client restent locales.`,"checkout.create":`Créer la page de test`,"checkout.saving":`Enregistrement…`,"checkout.retryRequest":`Reprendre la même demande`,"checkout.confirm":`Créer une page Stripe en mode test avec le solde affiché ? Aucun encaissement réel ne sera enregistré.`,"checkout.pending":`L’enregistrement reste à confirmer. Le choix de facture est verrouillé et conservé dans cet onglet après rechargement. Actualisez le suivi ou reprenez la même demande.`,"checkout.recoveryUnavailable":`La reprise locale est indisponible. Vérifiez la connexion au compte et le stockage de session du navigateur, puis actualisez le suivi. Aucune nouvelle création ne démarre sans cet enregistrement.`,"checkout.progress":`3. Suivre le test`,"checkout.paused":`L’actualisation du suivi est suspendue. Les dernières données restent affichées. Actualisez le suivi pour réessayer.`,"checkout.noTests":`Aucune page de paiement de test enregistrée.`,"checkout.historyLoading":`Chargement des tests enregistrés…`,"checkout.historyUnknown":`Historique indisponible. Actualisez le suivi.`,"checkout.requestNotFound":`Cette demande ne figure pas dans l’historique chargé. Vérifiez son identifiant et actualisez le suivi.`,"checkout.queued":`Demande enregistrée`,"checkout.creating":`Création chez Stripe en cours`,"checkout.retrying":`Nouvelle tentative programmée`,"checkout.open":`Page créée — paiement non confirmé`,"checkout.paid":`Paiement de test confirmé par Stripe`,"checkout.expired":`Expiration confirmée par Stripe`,"checkout.failed":`Création échouée`,"checkout.blocked":`Création bloquée`,"checkout.attempts":`Tentatives de création`,"checkout.expiresAt":`Expiration prévue`,"checkout.updatedAt":`Dernière mise à jour du suivi`,"checkout.nextAttempt":`Prochaine vérification ou tentative`,"checkout.openStripe":`Ouvrir Stripe — nouvel onglet`,"checkout.testCard":`Dans Stripe, utilisez la carte de test 4242 4242 4242 4242, une date future et trois chiffres quelconques. N’utilisez aucune vraie carte.`,"checkout.returnHint":`Fermer Stripe ou revenir ici ne confirme ni le paiement ni l’annulation. Le serveur vérifie le résultat auprès de Stripe.`,"checkout.identifiers":`Identifiants de suivi`,"checkout.requestId":`Demande locale`,"checkout.sessionId":`Session Stripe`,"checkout.history":`Historique des tests`,"checkout.createdAt":`Créé le`,"checkout.historyHint":`L’installation conserve jusqu’à 100 demandes. Chaque nouvelle demande crée un nouveau test. Les tests restent séparés de l’historique financier.`,"checkout.status":`État du test`,"checkout.details":`Détails`,"checkout.detailsFor":`Afficher le test de la facture {invoice}`,"checkout.unsaved":`Quitter ce formulaire ? Le choix non soumis sera perdu. Une demande déjà enregistrée continuera sur le serveur.`,"checkout.credentialsMissing":`La clé Stripe manque. Renseignez STRIPE_SECRET_KEY dans le profil SOPS actif, puis redémarrez le serveur.`,"checkout.testKeyRequired":`Cette clé n’est pas une clé de test. Le serveur interdit les appels Stripe réels. Utilisez une clé sk_test_ ou rk_test_.`,"checkout.credentialsChanged":`La clé utilisée pour ce test a changé. Vérifiez le test dans le compte Stripe associé à la clé précédente.`,"checkout.permissionRevoked":`Le compte à l’origine du test n’est plus autorisé à poursuivre le traitement automatique. Consultez le résultat dans Stripe.`,"checkout.invoiceChanged":`Le solde ou l’état de la facture a changé. Consultez la facture avant de préparer un nouveau test.`,"checkout.deadline":`La reprise n’est plus autorisée. Vérifiez les sessions Stripe avant de créer un nouveau test.`,"checkout.unavailable":`Stripe n’a pas confirmé la création. Le serveur conserve la demande. Consultez les tentatives avant de créer un nouveau test.`,"checkout.rejected":`Stripe a refusé la demande. Vérifiez les droits de la clé et les journaux Stripe.`,"checkout.rateLimited":`Stripe limite les appels. Le serveur conserve la même demande pour la prochaine tentative.`,"checkout.statusUnavailable":`Le résultat Stripe reste à confirmer. Consultez Stripe et vérifiez les accès. Aucun paiement local n’a été enregistré.`,"checkout.responseMismatch":`La réponse Stripe ne correspond pas à la demande de test. Le serveur arrête la création. Consultez les journaux Stripe.`,"checkout.conflict":`Cette demande existe avec un autre contenu ou un autre auteur. Actualisez l’historique avant de poursuivre.`,"checkout.active":`Un test reste actif pour cette facture. Consultez son suivi avant de créer une autre page.`,"checkout.limit":`La limite de 100 tests est atteinte. Consultez l’historique existant.`,"checkout.invoiceIneligible":`La facture n’est plus éligible ou sa version a changé. Actualisez la liste et vérifiez son solde.`,"checkout.error":`Le résultat de la demande reste à confirmer. Actualisez le suivi ou reprenez la même demande pour éviter les doublons.`,"checkout.loadError":`Impossible de charger les accès ou les factures. Actualisez cette page avant de créer un test.`},en:{"checkout.openSettings":`Test Stripe Checkout`,"checkout.title":`Stripe Checkout — test mode`,"checkout.intro":`Create a hosted payment page from an issued invoice’s balance. Then track the test result.`,"checkout.safety":`No real money moves. A test payment does not settle the invoice or create a local receipt.`,"checkout.connection":`1. Check access`,"checkout.loading":`Loading access status and invoices…`,"checkout.key":`Stripe key`,"checkout.testKey":`Test key present. Its presence does not prove its validity.`,"checkout.webhook":`Stripe notifications`,"checkout.webhookPresent":`Signing secret present. Notification delivery still needs verification.`,"checkout.webhookAbsent":`Signing secret absent. The server tracks the session by polling Stripe.`,"checkout.polling":`The server checks Stripe every 30 seconds. A signed notification triggers an earlier check.`,"checkout.refresh":`Refresh access and status`,"checkout.reconcile":`Check the session with Stripe`,"checkout.reconcileUnconfirmed":`The result of this check is unconfirmed. Refresh the status of this Stripe session.`,"checkout.reconcileHint":`Automatic tracking has stopped. This action only reads the existing session with the current test key. It creates no payment.`,"checkout.reconcileDenied":`Your account cannot check this Stripe session. Connection configuration and invoice read permissions are required.`,"checkout.notFound":`This Stripe request does not exist.`,"checkout.statusWindowExceeded":`The automatic tracking period has ended. The result remains unknown. You can request a check of the existing session.`,"checkout.prepare":`2. Prepare the payment page`,"checkout.invoice":`Invoice`,"checkout.chooseInvoice":`Choose an issued invoice`,"checkout.invoiceHint":`Eligible invoices are issued, have no credit note, and have a balance from €0.50 to €999,999.99. The server checks the balance again.`,"checkout.noInvoices":`No eligible invoice. Issue an invoice with an outstanding balance, then refresh this page.`,"checkout.invoiceRequired":`Choose an eligible invoice before creating the payment page.`,"checkout.amount":`Test amount`,"checkout.client":`Invoice client`,"checkout.total":`Invoice total`,"checkout.recordedPaid":`Active local receipts`,"checkout.version":`Invoice version`,"checkout.viewInvoice":`View invoice`,"checkout.transmitted":`Stripe receives the invoice number, amount, tracking identifiers and test address sacha@sacha.house. Client contact details stay local.`,"checkout.create":`Create test page`,"checkout.saving":`Recording…`,"checkout.retryRequest":`Resume the same request`,"checkout.confirm":`Create a Stripe test page with the displayed balance? No real receipt will be recorded.`,"checkout.pending":`Recording is not yet confirmed. The invoice choice is locked and retained in this tab after a reload. Refresh the status or resume the same request.`,"checkout.recoveryUnavailable":`Local recovery is unavailable. Check account access and browser session storage, then refresh the status. No new creation starts without this record.`,"checkout.progress":`3. Track the test`,"checkout.paused":`Status updates are paused. The last data remains visible. Refresh the status to try again.`,"checkout.noTests":`No test payment page recorded.`,"checkout.historyLoading":`Loading recorded tests…`,"checkout.historyUnknown":`History unavailable. Refresh the status.`,"checkout.requestNotFound":`This request is not in the loaded history. Check its identifier and refresh the status.`,"checkout.queued":`Request recorded`,"checkout.creating":`Creating page in Stripe`,"checkout.retrying":`Retry scheduled`,"checkout.open":`Page created — payment unconfirmed`,"checkout.paid":`Test payment confirmed by Stripe`,"checkout.expired":`Expiration confirmed by Stripe`,"checkout.failed":`Creation failed`,"checkout.blocked":`Creation blocked`,"checkout.attempts":`Creation attempts`,"checkout.expiresAt":`Scheduled expiration`,"checkout.updatedAt":`Last status update`,"checkout.nextAttempt":`Next check or attempt`,"checkout.openStripe":`Open Stripe — new tab`,"checkout.testCard":`In Stripe, use test card 4242 4242 4242 4242, a future date and any three digits. Do not use a real card.`,"checkout.returnHint":`Closing Stripe or returning here does not confirm payment or cancellation. The server checks the result with Stripe.`,"checkout.identifiers":`Tracking identifiers`,"checkout.requestId":`Local request`,"checkout.sessionId":`Stripe session`,"checkout.history":`Test history`,"checkout.createdAt":`Created`,"checkout.historyHint":`The installation retains up to 100 requests. Each new request creates a new test. Tests stay separate from financial history.`,"checkout.status":`Test status`,"checkout.details":`Details`,"checkout.detailsFor":`Show test for invoice {invoice}`,"checkout.unsaved":`Leave this form? The unsubmitted choice will be lost. Any recorded request will continue on the server.`,"checkout.credentialsMissing":`The Stripe key is missing. Set STRIPE_SECRET_KEY in the active SOPS profile, then restart the server.`,"checkout.testKeyRequired":`This is not a test key. The server blocks live Stripe calls. Use an sk_test_ or rk_test_ key.`,"checkout.credentialsChanged":`The key used for this test has changed. Check the test in the Stripe account associated with the previous key.`,"checkout.permissionRevoked":`The account that started the test is no longer authorized to continue automatic processing. Check the result in Stripe.`,"checkout.invoiceChanged":`The invoice balance or status changed. Check the invoice before preparing another test.`,"checkout.deadline":`This request cannot be retried. Check Stripe sessions before creating a new test.`,"checkout.unavailable":`Stripe did not confirm creation. The server retains the request. Check its attempts before creating a new test.`,"checkout.rejected":`Stripe rejected the request. Check key permissions and Stripe logs.`,"checkout.rateLimited":`Stripe is limiting calls. The server retains the same request for the next attempt.`,"checkout.statusUnavailable":`The Stripe result is unconfirmed. Check Stripe and access permissions. No local payment was recorded.`,"checkout.responseMismatch":`The Stripe response does not match the test request. The server stops creation. Check Stripe logs.`,"checkout.conflict":`This request exists with different content or a different author. Refresh history before continuing.`,"checkout.active":`A test remains active for this invoice. Check its status before creating another page.`,"checkout.limit":`The limit of 100 tests is reached. Check the existing history.`,"checkout.invoiceIneligible":`The invoice is no longer eligible or its version changed. Refresh the list and check its balance.`,"checkout.error":`The request result is unconfirmed. Refresh the status or resume the same request to prevent duplicates.`,"checkout.loadError":`Cannot load access status or invoices. Refresh this page before creating a test.`}};var w$4={fr:{checkoutConnection:{summary:`Lire les accès Stripe`,description:`Indique la présence de la clé de test et du secret de webhook. Aucun appel Stripe n’est effectué.`},checkoutList:{summary:`Consulter les pages de paiement de test`,description:`Liste les demandes et leurs états durables. Un paiement de test ne crée aucun encaissement local.`},checkoutCreate:{summary:`Préparer un Checkout Stripe de test`,description:`Fige le solde de la version émise, puis programme la création. Réutilisez le même UUID après une réponse incertaine. Le serveur refuse les clés réelles.`},checkoutReconcile:{summary:`Vérifier une session de test après arrêt du suivi`,description:`Consulte uniquement la session existante avec la clé de test actuelle. Vérifie les droits du demandeur et les données de session. Ne crée aucun paiement.`}},en:{checkoutConnection:{summary:`Read Stripe access status`,description:`Reports the test key and webhook secret presence. Does not call Stripe.`},checkoutList:{summary:`List test payment pages`,description:`Lists requests and their durable states. A test payment creates no local receipt.`},checkoutCreate:{summary:`Prepare a test Stripe Checkout`,description:`Freezes the issued version’s balance, then queues creation. Reuse the same UUID after an uncertain response. The server rejects live keys.`},checkoutReconcile:{summary:`Check a test session after tracking stops`,description:`Only reads the existing session with the current test key. Checks caller permissions and session data. Creates no payment.`}}};var A$1={fr:{"shell.loading":`Chargement de la page…`,"shell.loadError":`Le chargement de la page n’a pas abouti. Rechargez la page pour réessayer.`,"shell.navigationUnavailable":`La navigation est indisponible. Rechargez la page pour réessayer.`,"shell.reload":`Recharger la page`,"backOfficeShell.activity":`Activité`,"backOfficeShell.administration":`Administration`,"backOfficeShell.apiAccess":`API`,"backOfficeShell.externalServices":`Services externes`,"backOfficeShell.audit":`Journal d’audit`,"backOfficeShell.navigation":`Navigation`,"backOfficeShell.breadcrumb":`Fil d’Ariane`,"backOfficeShell.accountLoading":`Chargement du compte…`,"backOfficeShell.signingOut":`Déconnexion en cours…`,"backOfficeShell.signOutError":`Le serveur n’a pas confirmé la déconnexion. Réessayez.`,"backOfficeShell.openLogin":`Ouvrir la page de connexion`,"backOfficeShell.accountUnavailable":`Les informations du compte sont indisponibles.`,"backOfficeShell.closeNavigation":`Fermer la navigation`,"backOfficeShell.resources":`Ressources`,"backOfficeShell.api":`Documentation API`,"backOfficeShell.apiNewTab":`Documentation API — nouvel onglet`,"backOfficeShell.website":`Site public`,"backOfficeShell.drawerDemo":`Ouvrir le tiroir de navigation`,"backOfficeShell.drawerDescription":`Le tiroir conserve le focus et se ferme avec Échap. La navigation reste disponible sur les écrans étroits.`},en:{"shell.loading":`Loading page…`,"shell.loadError":`The page did not load. Reload the page to try again.`,"shell.navigationUnavailable":`Navigation is unavailable. Reload the page to try again.`,"shell.reload":`Reload page`,"backOfficeShell.activity":`Business`,"backOfficeShell.administration":`Administration`,"backOfficeShell.apiAccess":`API`,"backOfficeShell.externalServices":`External services`,"backOfficeShell.audit":`Audit log`,"backOfficeShell.navigation":`Navigation`,"backOfficeShell.breadcrumb":`Breadcrumb`,"backOfficeShell.accountLoading":`Loading account…`,"backOfficeShell.signingOut":`Signing out…`,"backOfficeShell.signOutError":`The server did not confirm sign-out. Try again.`,"backOfficeShell.openLogin":`Open the sign-in page`,"backOfficeShell.accountUnavailable":`Account information is unavailable.`,"backOfficeShell.closeNavigation":`Close navigation`,"backOfficeShell.resources":`Resources`,"backOfficeShell.api":`API documentation`,"backOfficeShell.apiNewTab":`API documentation — new tab`,"backOfficeShell.website":`Public website`,"backOfficeShell.drawerDemo":`Open navigation drawer`,"backOfficeShell.drawerDescription":`The drawer contains keyboard focus and closes with Escape. Navigation remains available on narrow screens.`}};var O$3={fr:{"clientsWorkspace.listIntro":`Retrouvez les coordonnées, les documents et les accès de chaque client.`,"clientsWorkspace.search":`Rechercher un client`,"clientsWorkspace.count.one":`{count} client`,"clientsWorkspace.count.other":`{count} clients`,"clientsWorkspace.cancel":`Annuler`,"clientsWorkspace.noMatches":`Aucun client ne correspond à la recherche`,"clientsWorkspace.changeSearch":`Modifiez la recherche ou consultez un autre onglet.`,"clientsWorkspace.clearSearch":`Effacer la recherche`,"clientsWorkspace.emptyIntro":`Créez un client pour préparer ses documents commerciaux.`,"clientsWorkspace.notProvided":`Non renseigné`,"clientsWorkspace.edit":`Modifier les coordonnées`,"clientsWorkspace.identity":`Identité et contact`,"clientsWorkspace.address":`Adresse de facturation`,"clientsWorkspace.formIntro":`Le nom suffit pour créer un client. Complétez les coordonnées avant de publier un document.`,"clientsWorkspace.editIntro":`Les modifications ne changent pas les documents déjà publiés.`,"clientsWorkspace.backToClient":`Retour à la fiche client`,"clientsWorkspace.documentsIntro":`Consultez les devis, les commandes et les factures associés à ce client.`},en:{"clientsWorkspace.listIntro":`Find each client’s contact details, documents, and access accounts.`,"clientsWorkspace.search":`Search clients`,"clientsWorkspace.count.one":`{count} client`,"clientsWorkspace.count.other":`{count} clients`,"clientsWorkspace.cancel":`Cancel`,"clientsWorkspace.noMatches":`No clients match the search`,"clientsWorkspace.changeSearch":`Change the search or select another tab.`,"clientsWorkspace.clearSearch":`Clear search`,"clientsWorkspace.emptyIntro":`Create a client to prepare their commercial documents.`,"clientsWorkspace.notProvided":`Not provided`,"clientsWorkspace.edit":`Edit contact details`,"clientsWorkspace.identity":`Identity and contact`,"clientsWorkspace.address":`Billing address`,"clientsWorkspace.formIntro":`A name is enough to create a client. Complete the contact details before publishing a document.`,"clientsWorkspace.editIntro":`Changes do not alter documents that are already published.`,"clientsWorkspace.backToClient":`Back to client details`,"clientsWorkspace.documentsIntro":`View the quotes, orders, and invoices linked to this client.`}};var R$1={fr:{"catalogWorkspace.intro":`Préparez les prestations réutilisables dans vos devis.`,"catalogWorkspace.views":`Vues du catalogue`,"catalogWorkspace.active":`Actives`,"catalogWorkspace.archived":`Archivées`,"catalogWorkspace.all":`Toutes`,"catalogWorkspace.count.one":`{count} prestation`,"catalogWorkspace.count.other":`{count} prestations`,"catalogWorkspace.price":`Prix unitaire HT`,"catalogWorkspace.exportPrice":`Prix unitaire HT (EUR)`,"catalogWorkspace.status":`État`,"catalogWorkspace.available":`Active`,"catalogWorkspace.searchFilter":`Recherche : {query}`,"catalogWorkspace.clearSearch":`Effacer la recherche`,"catalogWorkspace.taxFilter":`TVA : {rate} %`,"catalogWorkspace.allTaxRates":`Tous les taux de TVA`,"catalogWorkspace.resetFilters":`Effacer les filtres`,"catalogWorkspace.noMatches":`Aucune prestation ne correspond aux filtres`,"catalogWorkspace.changeSearch":`Modifiez les filtres ou consultez une autre vue.`,"catalogWorkspace.empty":`Aucune prestation dans cette vue`,"catalogWorkspace.emptyIntro":`Créez une prestation pour réutiliser sa description et ses valeurs dans vos devis.`,"catalogWorkspace.noArchived":`Aucune prestation archivée`,"catalogWorkspace.archiveIntro":`Les prestations archivées restent consultables ici.`,"catalogWorkspace.loadError":`Le catalogue est indisponible. Réessayez le chargement.`,"catalogWorkspace.retry":`Réessayer`,"catalogWorkspace.editTitle":`Modifier la prestation`,"catalogWorkspace.back":`Retour au catalogue`,"catalogWorkspace.formIntro":`Les modifications ne changent pas les lignes déjà ajoutées à vos devis.`,"catalogWorkspace.service":`Prestation`,"catalogWorkspace.defaultValues":`Valeurs par défaut`,"catalogWorkspace.quantityInvalid":`Saisissez une quantité de 0,001 à 9 007 199 254 740,991, avec 3 décimales maximum.`,"catalogWorkspace.priceInvalid":`Saisissez un prix de 0 à 90 071 992 547 409,91 EUR, avec 2 décimales maximum.`,"catalogWorkspace.taxInvalid":`Saisissez une TVA entre 0 et 100 %, avec 2 décimales maximum.`,"catalogWorkspace.taxHint":`Les prix sont en euros, hors taxes. Vérifiez le taux de TVA pour chaque devis.`,"catalogWorkspace.availability":`Disponibilité dans les devis`,"catalogWorkspace.archive":`Archiver cette prestation`,"catalogWorkspace.archiveConfirmation":`Archiver cette prestation et enregistrer les modifications ? Les lignes déjà ajoutées aux devis restent inchangées.`,"catalogWorkspace.restoreConfirmation":`Réactiver cette prestation et enregistrer les modifications ? Elle sera disponible dans les nouveaux devis.`,"catalogWorkspace.saving":`Enregistrement…`,"catalogWorkspace.cancel":`Annuler`},en:{"catalogWorkspace.intro":`Prepare reusable services for your quotes.`,"catalogWorkspace.views":`Catalog views`,"catalogWorkspace.active":`Active`,"catalogWorkspace.archived":`Archived`,"catalogWorkspace.all":`All`,"catalogWorkspace.count.one":`{count} service`,"catalogWorkspace.count.other":`{count} services`,"catalogWorkspace.price":`Unit price excluding tax`,"catalogWorkspace.exportPrice":`Unit price excluding tax (EUR)`,"catalogWorkspace.status":`Status`,"catalogWorkspace.available":`Active`,"catalogWorkspace.searchFilter":`Search: {query}`,"catalogWorkspace.clearSearch":`Clear search`,"catalogWorkspace.taxFilter":`VAT: {rate}%`,"catalogWorkspace.allTaxRates":`All VAT rates`,"catalogWorkspace.resetFilters":`Clear filters`,"catalogWorkspace.noMatches":`No services match the filters`,"catalogWorkspace.changeSearch":`Change the filters or select another view.`,"catalogWorkspace.empty":`No services in this view`,"catalogWorkspace.emptyIntro":`Create a service to reuse its description and values in your quotes.`,"catalogWorkspace.noArchived":`No archived services`,"catalogWorkspace.archiveIntro":`Archived services remain available for review here.`,"catalogWorkspace.loadError":`The catalog is unavailable. Try loading it again.`,"catalogWorkspace.retry":`Retry`,"catalogWorkspace.editTitle":`Edit service`,"catalogWorkspace.back":`Back to catalog`,"catalogWorkspace.formIntro":`Changes do not alter lines already added to your quotes.`,"catalogWorkspace.service":`Service`,"catalogWorkspace.defaultValues":`Default values`,"catalogWorkspace.quantityInvalid":`Enter a quantity from 0.001 to 9,007,199,254,740.991, with at most 3 decimal places.`,"catalogWorkspace.priceInvalid":`Enter a price from 0 to EUR 90,071,992,547,409.91, with at most 2 decimal places.`,"catalogWorkspace.taxInvalid":`Enter VAT from 0 to 100%, with at most 2 decimal places.`,"catalogWorkspace.taxHint":`Prices are in euros, excluding tax. Check the VAT rate for each quote.`,"catalogWorkspace.availability":`Availability in quotes`,"catalogWorkspace.archive":`Archive this service`,"catalogWorkspace.archiveConfirmation":`Archive this service and save changes? Lines already added to quotes remain unchanged.`,"catalogWorkspace.restoreConfirmation":`Reactivate this service and save changes? It will be available in new quotes.`,"catalogWorkspace.saving":`Saving…`,"catalogWorkspace.cancel":`Cancel`}};var q$1={fr:{"listControls.reload":`Recharger`,"listControls.moreActions":`Autres actions`,"listControls.pickerDemo":`Sélection avec recherche`,"listControls.pickerDemoHint":`Recherchez une option. Sélectionnez un résultat ou fermez la fenêtre avec Échap. Le focus revient au bouton.`,"listControls.chooseOption":`Choisir une option`,"listControls.selectedOption":`Sélection : {value}`,"listControls.closePicker":`Fermer le sélecteur`,"listControls.searchOptions":`Rechercher`,"listControls.optionCount.one":`{count} résultat`,"listControls.optionCount.other":`{count} résultats`,"listControls.noOptions":`Aucun résultat. Modifiez la recherche.`,"listControls.none":`Aucun`,"listControls.sortAscending":`{column} : trier par ordre croissant`,"listControls.sortDescending":`{column} : trier par ordre décroissant`,"listControls.resetSort":`{column} : rétablir l’ordre initial`,"listControls.removeFilter":`Retirer le filtre {filter}`},en:{"listControls.reload":`Reload`,"listControls.moreActions":`More actions`,"listControls.pickerDemo":`Searchable selection`,"listControls.pickerDemoHint":`Search for an option. Select a result or close the window with Escape. Focus returns to the button.`,"listControls.chooseOption":`Choose an option`,"listControls.selectedOption":`Selection: {value}`,"listControls.closePicker":`Close selector`,"listControls.searchOptions":`Search`,"listControls.optionCount.one":`{count} result`,"listControls.optionCount.other":`{count} results`,"listControls.noOptions":`No results. Change the search.`,"listControls.none":`None`,"listControls.sortAscending":`{column}: sort ascending`,"listControls.sortDescending":`{column}: sort descending`,"listControls.resetSort":`{column}: restore initial order`,"listControls.removeFilter":`Remove filter {filter}`}};var S$2={fr:{"emailsWorkspace.anyPeriod":`Toutes les dates`,"emailsWorkspace.messageCount.one":`{count} résultat · 100 derniers messages au plus`,"emailsWorkspace.messageCount.other":`{count} résultats · 100 derniers messages au plus`,"emailsWorkspace.reminderCount.one":`{count} relance · 100 chargées au plus`,"emailsWorkspace.reminderCount.other":`{count} relances · 100 chargées au plus`,"emailsWorkspace.export":`Exporter les métadonnées des résultats chargés et filtrés (CSV). Le texte des messages et des modèles est exclu.`,"emailsWorkspace.from":`À partir du`,"emailsWorkspace.to":`Jusqu’au`,"emailsWorkspace.dateRange":`La date de fin précède la date de début.`,"emailsWorkspace.dateFilterHint":`Les dates utilisent le fuseau horaire de votre navigateur et la colonne de date affichée.`,"emailsWorkspace.fromFilter":`À partir du : {date}`,"emailsWorkspace.toFilter":`Jusqu’au : {date}`,"emailsWorkspace.intro":`Consultez les messages enregistrés et préparez les prochains courriels.`,"emailsWorkspace.messages":`Messages`,"emailsWorkspace.drafts":`Brouillons`,"emailsWorkspace.reminders":`Relances`,"emailsWorkspace.templates":`Modèles`,"emailsWorkspace.newMessage":`Nouveau message`,"emailsWorkspace.editDraft":`Modifier le brouillon`,"emailsWorkspace.newTemplate":`Nouveau modèle`,"emailsWorkspace.templateSaved":`Modèle enregistré.`,"emailsWorkspace.templateArchived":`Modèle archivé. Les brouillons existants restent inchangés.`,"emailsWorkspace.draftArchived":`Brouillon archivé. Aucun courriel n’a été envoyé.`,"emailsWorkspace.editTemplate":`Modifier le modèle`,"emailsWorkspace.newReminder":`Nouvelle relance`,"emailsWorkspace.search":`Rechercher dans cette vue`,"emailsWorkspace.searchFilter":`Recherche : {query}`,"emailsWorkspace.count.one":`{count} résultat`,"emailsWorkspace.count.other":`{count} résultats`,"emailsWorkspace.loadError":`Cette liste est indisponible. Réessayez le chargement.`,"emailsWorkspace.noMatches":`Aucun résultat pour cette recherche`,"emailsWorkspace.empty":`Aucun élément dans cette vue`,"emailsWorkspace.emptyHint":`Utilisez le bouton de création pour préparer un nouvel élément.`,"emailsWorkspace.changeSearch":`Modifiez ou effacez la recherche.`,"emailsWorkspace.status":`État`,"emailsWorkspace.allStates":`Tous les états`,"emailsWorkspace.filters":`Filtres ({count})`,"emailsWorkspace.reminderHistory":`Cette vue contient au maximum 100 relances. Les relances programmées sont chargées en priorité. Elle ne représente pas tout l’historique.`,"emailsWorkspace.date":`Date`,"emailsWorkspace.scheduledDate":`Date prévue`,"emailsWorkspace.action":`Action`,"emailsWorkspace.invoice":`Facture`,"emailsWorkspace.simulated":`Simulé · non envoyé`,"emailsWorkspace.submitted":`Soumis au prestataire`,"emailsWorkspace.simulation":`Simulation`,"emailsWorkspace.draft":`Brouillon`,"emailsWorkspace.reminderDraft":`Brouillon de rappel`,"emailsWorkspace.viewMessage":`Consulter le message`,"emailsWorkspace.back":`Retour aux courriels`,"emailsWorkspace.backTemplates":`Retour aux modèles`,"emailsWorkspace.backReminders":`Retour aux relances`,"emailsWorkspace.message":`Message`,"emailsWorkspace.unsaved":`Quitter ce message ? Les modifications non enregistrées seront perdues. Une demande incertaine reste disponible à la prochaine ouverture.`,"emailsWorkspace.unsavedTemplate":`Abandonner les modifications non enregistrées de ce modèle ?`,"emailsWorkspace.unsavedReminder":`Quitter cette relance sans enregistrer les modifications ?`,"emailsWorkspace.chooseTemplate":`Choisir un modèle`,"emailsWorkspace.manageTemplates":`Gérer les modèles`,"emailsWorkspace.replaceTemplate":`Remplacer l’objet et le texte par ce modèle ? Le destinataire et la référence restent inchangés.`,"emailsWorkspace.addressing":`Destinataire et référence`,"emailsWorkspace.recipientInvalid":`Saisissez une adresse courriel valide de 254 caractères maximum.`,"emailsWorkspace.shortTextInvalid":`Saisissez un texte de 1 à 160 caractères.`,"emailsWorkspace.bodyInvalid":`Saisissez un texte de 1 à 20 000 caractères.`,"emailsWorkspace.bodyFormat":`Format du message`,"emailsWorkspace.plainText":`Texte brut`,"emailsWorkspace.formattedText":`Texte formaté`,"emailsWorkspace.preview":`Aperçu du texte`,"emailsWorkspace.saving":`Enregistrement…`,"emailsWorkspace.simulationOnly":`Les courriels clients et les relances restent simulés. Aucun courriel réel ne sera envoyé.`,"emailsWorkspace.pending":`Une demande reste sans réponse définitive. Son identifiant et son contenu sont conservés dans cet onglet, même après rechargement.`,"emailsWorkspace.recoveryError":`Le message ou sa récupération est indisponible. Réessayez le chargement avant toute nouvelle demande.`,"emailsWorkspace.messageUnavailable":`Ce message ne figure pas parmi les 100 derniers messages accessibles. Il n’est pas présenté comme supprimé.`,"emailsWorkspace.receiptHint":`La réception d’une demande par le prestataire ne prouve ni la livraison du courriel ni sa lecture.`,"emailsWorkspace.requestId":`Identifiant de la demande`,"emailsWorkspace.templateHint":`Ce modèle contient un objet et un texte brut ou formaté. Sa modification ne change pas les brouillons et messages existants.`,"emailsWorkspace.chooseInvoice":`Choisir une facture`,"emailsWorkspace.chooseInvoiceError":`Choisissez une facture émise avec un solde positif, sans avoir.`,"emailsWorkspace.client":`Client`,"emailsWorkspace.remaining":`Reste à payer`,"emailsWorkspace.dueDate":`Échéance`,"emailsWorkspace.timeZone":`Fuseau horaire de la saisie : {zone}.`,"emailsWorkspace.dateInvalid":`Choisissez une date et une heure valides dans les 366 prochains jours.`,"emailsWorkspace.pendingSchedule":`La demande reste incertaine. Cet onglet conserve son identifiant et ses valeurs, même après rechargement. Réessayez sans créer une nouvelle relance.`},en:{"emailsWorkspace.anyPeriod":`All dates`,"emailsWorkspace.messageCount.one":`{count} result · up to 100 latest emails`,"emailsWorkspace.messageCount.other":`{count} results · up to 100 latest emails`,"emailsWorkspace.reminderCount.one":`{count} reminder · up to 100 loaded`,"emailsWorkspace.reminderCount.other":`{count} reminders · up to 100 loaded`,"emailsWorkspace.export":`Export metadata for loaded and filtered results (CSV). Email and template text is excluded.`,"emailsWorkspace.from":`From`,"emailsWorkspace.to":`Through`,"emailsWorkspace.dateRange":`The end date is before the start date.`,"emailsWorkspace.dateFilterHint":`Dates use your browser time zone and the displayed date column.`,"emailsWorkspace.fromFilter":`From: {date}`,"emailsWorkspace.toFilter":`Through: {date}`,"emailsWorkspace.intro":`Review recorded messages and prepare upcoming emails.`,"emailsWorkspace.messages":`Messages`,"emailsWorkspace.drafts":`Drafts`,"emailsWorkspace.reminders":`Reminders`,"emailsWorkspace.templates":`Templates`,"emailsWorkspace.newMessage":`New message`,"emailsWorkspace.editDraft":`Edit draft`,"emailsWorkspace.newTemplate":`New template`,"emailsWorkspace.templateSaved":`Template saved.`,"emailsWorkspace.templateArchived":`Template archived. Existing drafts remain unchanged.`,"emailsWorkspace.draftArchived":`Draft archived. No email was sent.`,"emailsWorkspace.editTemplate":`Edit template`,"emailsWorkspace.newReminder":`New reminder`,"emailsWorkspace.search":`Search this view`,"emailsWorkspace.searchFilter":`Search: {query}`,"emailsWorkspace.count.one":`{count} result`,"emailsWorkspace.count.other":`{count} results`,"emailsWorkspace.loadError":`This list is unavailable. Try loading it again.`,"emailsWorkspace.noMatches":`No results for this search`,"emailsWorkspace.empty":`No items in this view`,"emailsWorkspace.emptyHint":`Use the create button to prepare a new item.`,"emailsWorkspace.changeSearch":`Change or clear the search.`,"emailsWorkspace.status":`Status`,"emailsWorkspace.allStates":`All statuses`,"emailsWorkspace.filters":`Filters ({count})`,"emailsWorkspace.reminderHistory":`This view contains at most 100 reminders. Scheduled reminders load first. This is not the complete history.`,"emailsWorkspace.date":`Date`,"emailsWorkspace.scheduledDate":`Scheduled date`,"emailsWorkspace.action":`Action`,"emailsWorkspace.invoice":`Invoice`,"emailsWorkspace.simulated":`Simulated · not sent`,"emailsWorkspace.submitted":`Submitted to provider`,"emailsWorkspace.simulation":`Simulation`,"emailsWorkspace.draft":`Draft`,"emailsWorkspace.reminderDraft":`Payment reminder draft`,"emailsWorkspace.viewMessage":`View message`,"emailsWorkspace.back":`Back to email`,"emailsWorkspace.backTemplates":`Back to templates`,"emailsWorkspace.backReminders":`Back to reminders`,"emailsWorkspace.message":`Message`,"emailsWorkspace.unsaved":`Leave this message? Unsaved changes will be lost. An uncertain request remains available when you return.`,"emailsWorkspace.unsavedTemplate":`Discard unsaved changes to this template?`,"emailsWorkspace.unsavedReminder":`Leave this reminder without saving changes?`,"emailsWorkspace.chooseTemplate":`Choose a template`,"emailsWorkspace.manageTemplates":`Manage templates`,"emailsWorkspace.replaceTemplate":`Replace the subject and text with this template? The recipient and reference remain unchanged.`,"emailsWorkspace.addressing":`Recipient and reference`,"emailsWorkspace.recipientInvalid":`Enter a valid email address with at most 254 characters.`,"emailsWorkspace.shortTextInvalid":`Enter text with 1 to 160 characters.`,"emailsWorkspace.bodyInvalid":`Enter text with 1 to 20,000 characters.`,"emailsWorkspace.bodyFormat":`Message format`,"emailsWorkspace.plainText":`Plain text`,"emailsWorkspace.formattedText":`Formatted text`,"emailsWorkspace.preview":`Text preview`,"emailsWorkspace.saving":`Saving…`,"emailsWorkspace.simulationOnly":`Customer emails and reminders remain simulated. No real email will be sent.`,"emailsWorkspace.pending":`A request has no definitive response. This tab retains its identifier and content, including after a reload.`,"emailsWorkspace.recoveryError":`The message or its recovery is unavailable. Try loading it again before starting another request.`,"emailsWorkspace.messageUnavailable":`This message is not among the last 100 accessible messages. This does not mean it was deleted.`,"emailsWorkspace.receiptHint":`Provider acceptance proves neither email delivery nor reading.`,"emailsWorkspace.requestId":`Request identifier`,"emailsWorkspace.templateHint":`This template contains a subject and plain or formatted text. Changes do not alter existing drafts or messages.`,"emailsWorkspace.chooseInvoice":`Choose an invoice`,"emailsWorkspace.chooseInvoiceError":`Choose an issued invoice with a positive balance and no credit note.`,"emailsWorkspace.client":`Client`,"emailsWorkspace.remaining":`Remaining balance`,"emailsWorkspace.dueDate":`Due date`,"emailsWorkspace.timeZone":`Input time zone: {zone}.`,"emailsWorkspace.dateInvalid":`Choose a valid date and time within the next 366 days.`,"emailsWorkspace.pendingSchedule":`The request remains uncertain. This tab retains its identifier and values, including after a reload. Retry without creating another reminder.`}};var L$1={fr:{"commercial.moreActions":`Autres actions`,"commercial.updated":`Modification du devis`,"commercial.versionOrder":`Révisions, de la première à la dernière.`,"commercial.historyOrder":`Événements, du plus ancien au plus récent.`,"commercial.documentOrder":`Documents dans l’ordre devis, commande, facture.`,"commercial.lineOrder":`Lignes dans l’ordre du document enregistré.`,"commercial.discardCancellation":`Abandonner la raison et la note d’annulation non soumises ? Le devis ne sera pas annulé.`,"commercial.leavePublicationUncertain":`Quitter cette publication incertaine ? Vérifiez l’état du devis avant de créer ou remplacer son lien.`,"commercial.leaveReview":`Quitter la préparation du lien ? La vérification du document sera à refaire.`,"commercial.search":`Rechercher une référence, un titre ou un client`,"commercial.count.one":`{count} affaire`,"commercial.count.other":`{count} affaires`,"commercial.allStages":`Toutes les étapes`,"commercial.allClients":`Tous les clients`,"commercial.quoteAmount":`Montant du devis TTC`,"commercial.searchFilter":`Recherche : {query}`,"commercial.noMatches":`Aucune affaire ne correspond aux filtres.`,"commercial.clearFilters":`Effacer les filtres`,"commercial.overview":`Vue d’ensemble`,"commercial.documents":`Documents`,"commercial.history":`Historique`,"commercial.summary":`Résumé`,"commercial.document":`Document`,"commercial.versions":`Versions`,"commercial.quote":`Devis`,"commercial.edit":`Modifier le devis`,"commercial.revise":`Créer une révision`,"commercial.publish":`Préparer le lien de signature`,"commercial.openOrder":`Ouvrir la commande`,"commercial.backQuote":`Retour au devis`,"commercial.backAffair":`Retour à l’affaire`,"commercial.saved":`Le devis est enregistré.`,"commercial.replaceConditions":`Remplacer les conditions actuelles par celles du modèle sélectionné ?`,"commercial.savedHint":`Consultez le devis pour préparer sa publication.`,"commercial.readOnly":`Ce devis ne peut pas être modifié dans cet état.`,"commercial.loadLatest":`Recharger le devis enregistré`,"commercial.reloadConfirm":`Recharger le devis ? Les modifications non enregistrées seront perdues.`,"commercial.pending":`Une demande est en cours. Attendez sa réponse avant de quitter cette page.`,"commercial.saveUncertain":`La réponse manque. Vérifiez les affaires avant de créer un autre devis.`,"commercial.leaveUncertain":`Quitter cet éditeur ? La création reste incertaine. Vérifiez les affaires avant une nouvelle création.`,"commercial.savedTotals":`Totaux enregistrés`,"commercial.newTotals":`Les totaux seront calculés lors de l’enregistrement.`,"commercial.revision":`Révision {version}`,"commercial.publicationTitle":`Publier le devis pour signature`,"commercial.publicationEffect":`Cette action fige la révision affichée pour signature. La signature du client créera une commande.`,"commercial.noEmail":`La création du lien de signature n’envoie aucun courriel.`,"commercial.parties":`Parties du document`,"commercial.partiesHint":`Vérifiez les coordonnées de l’émetteur et du client dans le PDF. Elles proviennent de cette révision enregistrée.`,"commercial.preparePdf":`Préparer le PDF de cette révision`,"commercial.pdfReady":`Le PDF de cette révision est prêt.`,"commercial.pdfRequired":`Préparez le PDF avant de créer le lien.`,"commercial.previewUnavailable":`Cette révision ne possède pas de document consultable. Créez une révision après correction des coordonnées.`,"commercial.confirmDocument":`J’ai vérifié la révision, le PDF et les coordonnées des parties.`,"commercial.confirmRequired":`Confirmez la vérification du document.`,"commercial.createLink":`Créer le lien de signature`,"commercial.manageLink":`Gérer le lien de signature`,"commercial.replaceLink":`Remplacer le lien de signature`,"commercial.replaceLinkHint":`Si le lien est perdu, remplacez-le. Le remplacement révoque l’ancien lien sans modifier le devis ni son PDF.`,"commercial.confirmReplaceLink":`Remplacer le lien de signature ? L’ancien lien cessera immédiatement de fonctionner.`,"commercial.replacementUncertain":`La réponse manque. Rechargez le devis avant tout nouveau remplacement.`,"commercial.linkCreated":`Le lien de signature est créé.`,"commercial.leaveLink":`Quitter sans copier le lien de signature ? Vous devrez le remplacer pour obtenir un nouveau lien.`,"commercial.linkUnavailable":`Le lien de signature est remis uniquement lors de sa création. Si le lien est perdu, remplacez-le depuis cette page.`,"commercial.portalHint":`Le lien du portail demande une connexion client. Ce lien ne remplace pas le lien de signature.`,"commercial.publicationUnavailable":`Ce devis ne peut pas être publié dans cet état.`,"commercial.publicationUncertain":`La publication reste incertaine. Rechargez le devis pour vérifier son état avant de créer ou remplacer son lien.`,"commercial.order":`Commande`,"commercial.orderImmutable":`Cette commande reprend la révision acceptée du devis. Son contenu est immuable.`,"commercial.acceptedQuote":`Devis accepté`,"commercial.confirmedAt":`Date de confirmation`,"commercial.orderUnavailable":`La commande ou sa révision acceptée est indisponible.`,"commercial.orderPdf":`Document de commande`},en:{"commercial.moreActions":`More actions`,"commercial.updated":`Quote updated`,"commercial.versionOrder":`Revisions, from first to last.`,"commercial.historyOrder":`Events, from oldest to newest.`,"commercial.documentOrder":`Documents in quote, order, invoice order.`,"commercial.lineOrder":`Lines in saved document order.`,"commercial.discardCancellation":`Discard the unsubmitted cancellation reason and note? The quote will not be cancelled.`,"commercial.leavePublicationUncertain":`Leave this uncertain publication? Check the quote status before creating or replacing its link.`,"commercial.leaveReview":`Leave signature link preparation? You will need to check the document again.`,"commercial.search":`Search by reference, title or client`,"commercial.count.one":`{count} engagement`,"commercial.count.other":`{count} engagements`,"commercial.allStages":`All stages`,"commercial.allClients":`All clients`,"commercial.quoteAmount":`Quote amount including VAT`,"commercial.searchFilter":`Search: {query}`,"commercial.noMatches":`No engagements match the filters.`,"commercial.clearFilters":`Clear filters`,"commercial.overview":`Overview`,"commercial.documents":`Documents`,"commercial.history":`History`,"commercial.summary":`Summary`,"commercial.document":`Document`,"commercial.versions":`Versions`,"commercial.quote":`Quote`,"commercial.edit":`Edit quote`,"commercial.revise":`Create revision`,"commercial.publish":`Prepare signature link`,"commercial.openOrder":`Open order`,"commercial.backQuote":`Back to quote`,"commercial.backAffair":`Back to engagement`,"commercial.saved":`The quote is saved.`,"commercial.replaceConditions":`Replace the current conditions with the selected preset?`,"commercial.savedHint":`Open the quote to prepare publication.`,"commercial.readOnly":`This quote cannot be edited in its current state.`,"commercial.loadLatest":`Reload saved quote`,"commercial.reloadConfirm":`Reload this quote? Unsaved changes will be lost.`,"commercial.pending":`A request is in progress. Wait for its response before leaving this page.`,"commercial.saveUncertain":`The response is missing. Check engagements before creating another quote.`,"commercial.leaveUncertain":`Leave this editor? Creation remains uncertain. Check engagements before creating another quote.`,"commercial.savedTotals":`Saved totals`,"commercial.newTotals":`Totals will be calculated when the quote is saved.`,"commercial.revision":`Revision {version}`,"commercial.publicationTitle":`Publish quote for signature`,"commercial.publicationEffect":`This action freezes the displayed revision for signature. The client signature will create an order.`,"commercial.noEmail":`Creating the signature link does not send an email.`,"commercial.parties":`Document parties`,"commercial.partiesHint":`Check issuer and client details in the PDF. They come from this saved revision.`,"commercial.preparePdf":`Prepare the PDF for this revision`,"commercial.pdfReady":`The PDF for this revision is ready.`,"commercial.pdfRequired":`Prepare the PDF before creating the link.`,"commercial.previewUnavailable":`This revision has no viewable document. Create a revision after correcting the party details.`,"commercial.confirmDocument":`I checked the revision, PDF and party details.`,"commercial.confirmRequired":`Confirm that you checked the document.`,"commercial.createLink":`Create signature link`,"commercial.manageLink":`Manage signature link`,"commercial.replaceLink":`Replace signature link`,"commercial.replaceLinkHint":`If the link is lost, replace it. Replacement revokes the old link without changing the quote or its PDF.`,"commercial.confirmReplaceLink":`Replace the signature link? The old link will stop working immediately.`,"commercial.replacementUncertain":`The response is missing. Reload the quote before replacing the link again.`,"commercial.linkCreated":`The signature link is created.`,"commercial.leaveLink":`Leave without copying the signature link? You will need to replace it to get a new link.`,"commercial.linkUnavailable":`The signature link is returned only when created. If the link is lost, replace it from this page.`,"commercial.portalHint":`The portal link requires client sign-in. It does not replace the signature link.`,"commercial.publicationUnavailable":`This quote cannot be published in its current state.`,"commercial.publicationUncertain":`Publication remains uncertain. Reload the quote to check its state before creating or replacing its link.`,"commercial.order":`Order`,"commercial.orderImmutable":`This order contains the accepted quote revision. Its content cannot change.`,"commercial.acceptedQuote":`Accepted quote`,"commercial.confirmedAt":`Confirmation date`,"commercial.orderUnavailable":`The order or its accepted revision is unavailable.`,"commercial.orderPdf":`Order document`}};var W$1={fr:{"billingWorkspace.clearSelection":`Effacer la sélection`,"billingWorkspace.quote":`Devis d’origine`,"billingWorkspace.pdfRecorded":`PDF enregistré`,"billingWorkspace.created":`Brouillon créé`,"billingWorkspace.revised":`Nouvelle version enregistrée`,"billingWorkspace.issued":`Facture émise`,"billingWorkspace.voided":`Facture annulée`,"billingWorkspace.paymentRecorded":`Encaissement enregistré`,"billingWorkspace.paymentCancelled":`Saisie d’encaissement annulée`,"billingWorkspace.creditIssued":`Avoir émis`,"billingWorkspace.refundRecorded":`Remboursement enregistré`,"billingWorkspace.refundCancelled":`Saisie de remboursement annulée`,"billingWorkspace.invoices":`Factures`,"billingWorkspace.receipts":`Encaissements`,"billingWorkspace.credits":`Avoirs`,"billingWorkspace.refunds":`Remboursements`,"billingWorkspace.search":`Rechercher par numéro, titre, client ou commande`,"billingWorkspace.all":`Tous`,"billingWorkspace.documentStatus":`Statut du document`,"billingWorkspace.financialStatus":`État financier`,"billingWorkspace.unpaid":`Non réglée`,"billingWorkspace.partial":`Partiellement réglée`,"billingWorkspace.paid":`Réglée`,"billingWorkspace.credited":`Créditée`,"billingWorkspace.notApplicable":`Sans objet`,"billingWorkspace.hasCredit":`Avec avoir`,"billingWorkspace.noCredit":`Sans avoir`,"billingWorkspace.due":`Échéance`,"billingWorkspace.duePeriod":`Période d’échéance`,"billingWorkspace.receiptPeriod":`Période d’encaissement`,"billingWorkspace.creditPeriod":`Période d’émission de l’avoir`,"billingWorkspace.refundPeriod":`Période de remboursement`,"billingWorkspace.overdue":`En retard`,"billingWorkspace.upcoming":`À venir`,"billingWorkspace.clear":`Effacer les filtres`,"billingWorkspace.removeFilter":`Retirer ce filtre`,"billingWorkspace.count.one":`{count} résultat`,"billingWorkspace.count.other":`{count} résultats`,"billingWorkspace.selection.one":`{count} facture sélectionnée`,"billingWorkspace.selection.other":`{count} factures sélectionnées`,"billingWorkspace.empty":`Aucun élément enregistré`,"billingWorkspace.noMatches":`Aucun résultat pour ces filtres. Modifiez ou effacez les filtres.`,"billingWorkspace.loadError":`Cette liste est indisponible. Réessayez le chargement.`,"billingWorkspace.limitExceeded":`Trop de résultats : plus de 10 000 éléments. Les données ne sont pas chargées. Aucun résultat partiel n’est affiché.`,"billingWorkspace.summary":`Résumé`,"billingWorkspace.document":`Document`,"billingWorkspace.history":`Historique`,"billingWorkspace.version":`Version enregistrée : {version}`,"billingWorkspace.edit":`Modifier le brouillon`,"billingWorkspace.backDetail":`Retour à la facture`,"billingWorkspace.readonly":`Le document émis reste inchangé. Les encaissements et avoirs sont enregistrés séparément.`,"billingWorkspace.recordReceipt":`Enregistrer un encaissement`,"billingWorkspace.receipt":`Encaissement`,"billingWorkspace.receiptOptions":`Choisir le type d’encaissement`,"billingWorkspace.receiptPartial":`Encaissement partiel`,"billingWorkspace.receiptFull":`Encaissement intégral`,"billingWorkspace.issueTitle":`Émettre la facture`,"billingWorkspace.issueHint":`Vérifiez le document. L’émission attribue un numéro définitif et fige cette version.`,"billingWorkspace.confirmDocument":`J’ai vérifié cette version du document.`,"billingWorkspace.receiptHint":`Enregistrez uniquement un paiement reçu. Un test Stripe ne constitue jamais un encaissement.`,"billingWorkspace.creditHint":`Un seul avoir intégral est autorisé. Il reprend les lignes, la TVA et les montants du document émis.`,"billingWorkspace.refundHint":`Cette saisie enregistre un remboursement déjà effectué. Elle ne déclenche aucun virement bancaire.`,"billingWorkspace.cancelReceiptHint":`Corrigez une saisie erronée. Cette annulation ne rembourse pas le client.`,"billingWorkspace.cancelRefundHint":`Corrigez uniquement une saisie erronée. Cette annulation ne déplace aucun fonds.`,"billingWorkspace.voidHint":`L’annulation est réservée aux factures émises sans encaissement, même annulé, et sans avoir.`,"billingWorkspace.pending":`Enregistrement en cours. Ne fermez pas cette page.`,"billingWorkspace.completed":`L’opération est enregistrée.`,"billingWorkspace.stale":`La facture a changé. Rechargez son état avant une nouvelle opération.`,"billingWorkspace.uncertain":`La réponse est incertaine. Réessayez la même demande sans changer les valeurs.`,"billingWorkspace.retrySame":`Réessayer la même demande`,"billingWorkspace.unavailable":`Cette opération n’est pas disponible pour l’état actuel de la facture.`,"billingWorkspace.reloadConfirm":`Recharger la facture et abandonner les modifications non enregistrées ?`,"billingWorkspace.dateInvalid":`Saisissez une date valide dans la période autorisée.`,"billingWorkspace.amountInvalid":`Saisissez un montant positif inférieur ou égal au solde disponible.`,"billingWorkspace.reasonInvalid":`Saisissez un motif non vide dans la limite indiquée.`,"billingWorkspace.referenceInvalid":`Saisissez une référence de 1 à 160 caractères.`,"billingWorkspace.limit":`Maximum : {count} caractères.`,"billingWorkspace.active":`Enregistré`,"billingWorkspace.cancelled":`Saisie annulée`,"billingWorkspace.recordedAt":`Enregistré le`,"billingWorkspace.actor":`Identifiant de l’auteur`,"billingWorkspace.noHistory":`Aucun événement enregistré pour cette facture.`,"billingWorkspace.historyHint":`Cet historique présente les événements du journal. Les versions enregistrées figurent dans Document.`,"billingWorkspace.prepareReminders":`Préparer les rappels éligibles`,"billingWorkspace.pdfDownloadFailed":`Le téléchargement des PDF a échoué. Vérifiez les fichiers déjà téléchargés avant de réessayer.`,"billingWorkspace.remindersHint":`Préparez chaque rappel séparément. Aucun courriel réel n’est envoyé.`,"billingWorkspace.reminder":`Préparer un rappel`,"billingWorkspace.email":`Préparer un courriel`,"billingWorkspace.pdfPending":`Le PDF est en préparation.`,"billingWorkspace.pdfFailed":`La préparation du PDF a échoué. Relancez la génération.`,"billingWorkspace.noCreditNote":`Aucun avoir pour cette facture.`,"billingWorkspace.chooseInvoice":`Choisir une facture`,"billingWorkspace.chooseInvoiceHint":`Ouvrez une facture pour enregistrer une opération dans son contexte.`,"billingWorkspace.issuedAt":`Émise le`,"billingWorkspace.noAutosave":`Les modifications restent dans cette page jusqu’à leur enregistrement.`},en:{"billingWorkspace.clearSelection":`Clear selection`,"billingWorkspace.quote":`Source quote`,"billingWorkspace.pdfRecorded":`PDF recorded`,"billingWorkspace.created":`Draft created`,"billingWorkspace.revised":`New version recorded`,"billingWorkspace.issued":`Invoice issued`,"billingWorkspace.voided":`Invoice voided`,"billingWorkspace.paymentRecorded":`Receipt recorded`,"billingWorkspace.paymentCancelled":`Receipt entry cancelled`,"billingWorkspace.creditIssued":`Credit note issued`,"billingWorkspace.refundRecorded":`Refund recorded`,"billingWorkspace.refundCancelled":`Refund entry cancelled`,"billingWorkspace.invoices":`Invoices`,"billingWorkspace.receipts":`Receipts`,"billingWorkspace.credits":`Credit notes`,"billingWorkspace.refunds":`Refunds`,"billingWorkspace.search":`Search by number, title, client or order`,"billingWorkspace.all":`All`,"billingWorkspace.documentStatus":`Document status`,"billingWorkspace.financialStatus":`Financial status`,"billingWorkspace.unpaid":`Unpaid`,"billingWorkspace.partial":`Partly paid`,"billingWorkspace.paid":`Paid`,"billingWorkspace.credited":`Credited`,"billingWorkspace.notApplicable":`Not applicable`,"billingWorkspace.hasCredit":`With credit note`,"billingWorkspace.noCredit":`Without credit note`,"billingWorkspace.due":`Due date`,"billingWorkspace.duePeriod":`Due date range`,"billingWorkspace.receiptPeriod":`Receipt date range`,"billingWorkspace.creditPeriod":`Credit note issue date range`,"billingWorkspace.refundPeriod":`Refund date range`,"billingWorkspace.overdue":`Overdue`,"billingWorkspace.upcoming":`Upcoming`,"billingWorkspace.clear":`Clear filters`,"billingWorkspace.removeFilter":`Remove this filter`,"billingWorkspace.count.one":`{count} result`,"billingWorkspace.count.other":`{count} results`,"billingWorkspace.selection.one":`{count} invoice selected`,"billingWorkspace.selection.other":`{count} invoices selected`,"billingWorkspace.empty":`No recorded entries`,"billingWorkspace.noMatches":`No results match these filters. Change or clear the filters.`,"billingWorkspace.loadError":`This list is unavailable. Try loading it again.`,"billingWorkspace.limitExceeded":`Too many results: more than 10,000 entries. The data is not loaded. No partial results are shown.`,"billingWorkspace.summary":`Summary`,"billingWorkspace.document":`Document`,"billingWorkspace.history":`History`,"billingWorkspace.version":`Recorded version: {version}`,"billingWorkspace.edit":`Edit draft`,"billingWorkspace.backDetail":`Back to invoice`,"billingWorkspace.readonly":`The issued document remains unchanged. Receipts and credit notes are recorded separately.`,"billingWorkspace.recordReceipt":`Record a receipt`,"billingWorkspace.receipt":`Receipt`,"billingWorkspace.receiptOptions":`Select the receipt type`,"billingWorkspace.receiptPartial":`Partial receipt`,"billingWorkspace.receiptFull":`Full receipt`,"billingWorkspace.issueTitle":`Issue invoice`,"billingWorkspace.issueHint":`Check the document. Issuance assigns a final number and locks this version.`,"billingWorkspace.confirmDocument":`I have checked this version of the document.`,"billingWorkspace.receiptHint":`Record only a received payment. A Stripe test is never a receipt.`,"billingWorkspace.creditHint":`Only one full credit note is allowed. It copies the lines, VAT and amounts from the issued document.`,"billingWorkspace.refundHint":`This entry records a refund already made. It does not initiate a bank transfer.`,"billingWorkspace.cancelReceiptHint":`Correct an incorrect entry. This cancellation does not refund the client.`,"billingWorkspace.cancelRefundHint":`Correct only an incorrect entry. This cancellation does not move funds.`,"billingWorkspace.voidHint":`Only issued invoices without receipts, including cancelled receipts, and without a credit note can be voided.`,"billingWorkspace.pending":`Saving. Do not close this page.`,"billingWorkspace.completed":`The operation is recorded.`,"billingWorkspace.stale":`The invoice has changed. Reload its state before another operation.`,"billingWorkspace.uncertain":`The response is uncertain. Retry the same request without changing its values.`,"billingWorkspace.retrySame":`Retry the same request`,"billingWorkspace.unavailable":`This operation is unavailable for the current invoice state.`,"billingWorkspace.reloadConfirm":`Reload the invoice and discard unsaved changes?`,"billingWorkspace.dateInvalid":`Enter a valid date within the allowed period.`,"billingWorkspace.amountInvalid":`Enter a positive amount that does not exceed the available balance.`,"billingWorkspace.reasonInvalid":`Enter a non-empty reason within the specified limit.`,"billingWorkspace.referenceInvalid":`Enter a reference with 1 to 160 characters.`,"billingWorkspace.limit":`Maximum: {count} characters.`,"billingWorkspace.active":`Recorded`,"billingWorkspace.cancelled":`Entry cancelled`,"billingWorkspace.recordedAt":`Recorded on`,"billingWorkspace.actor":`Actor identifier`,"billingWorkspace.noHistory":`No recorded events for this invoice.`,"billingWorkspace.historyHint":`This history shows journal events. Recorded versions are available in Document.`,"billingWorkspace.prepareReminders":`Prepare eligible reminders`,"billingWorkspace.pdfDownloadFailed":`The PDF download failed. Check the files already downloaded before trying again.`,"billingWorkspace.remindersHint":`Prepare each reminder separately. No real email is sent.`,"billingWorkspace.reminder":`Prepare a reminder`,"billingWorkspace.email":`Prepare an email`,"billingWorkspace.pdfPending":`The PDF is being prepared.`,"billingWorkspace.pdfFailed":`PDF preparation failed. Start generation again.`,"billingWorkspace.noCreditNote":`No credit note for this invoice.`,"billingWorkspace.chooseInvoice":`Choose an invoice`,"billingWorkspace.chooseInvoiceHint":`Open an invoice to record an operation in its context.`,"billingWorkspace.issuedAt":`Issued on`,"billingWorkspace.noAutosave":`Changes remain on this page until you save them.`}};var I$2={fr:{"bankWorkspace.supplierPayments":`Paiements fournisseur à rapprocher`,"bankWorkspace.supplierPaymentsHint":`Confirmez le virement fournisseur correspondant. Une suggestion ne déclenche jamais un rapprochement automatique.`,"bankWorkspace.noSupplierPayments":`Aucun paiement fournisseur disponible.`,"bankWorkspace.supplierMatchHistory":`Historique des rapprochements fournisseur`,"bankWorkspace.supplierConfirm":`Rapprocher ce paiement fournisseur avec le débit bancaire ?`,"bankWorkspace.supplierUnmatchConfirm":`Annuler ce rapprochement fournisseur ?`,"bankWorkspace.supplierUnmatchReason":`Annulation confirmée par un utilisateur.`,"bankWorkspace.unmatch":`Dissocier`,"bankWorkspace.actions":`Actions`,"bankWorkspace.suggestions":`Suggestions de rapprochement`,"bankWorkspace.suggestionsHint":`Vérifiez la facture, le règlement et le montant avant de confirmer une suggestion.`,"bankWorkspace.suggestionsLoading":`Recherche des rapprochements probables…`,"bankWorkspace.transactions":`Transactions`,"bankWorkspace.entries":`Écritures`,"bankWorkspace.intro":`Consultez les transactions importées. Rapprochez les crédits avec les encaissements déjà enregistrés.`,"bankWorkspace.accountHint":`Le compte est un libellé local. Il ne représente pas une connexion bancaire active.`,"bankWorkspace.search":`Rechercher un libellé ou une référence`,"bankWorkspace.allAccounts":`Tous les comptes`,"bankWorkspace.allDates":`Toutes les dates`,"bankWorkspace.ledgerPeriodRequired":`Saisissez les deux dates pour charger les écritures et exporter le journal de la période.`,"bankWorkspace.account":`Libellé du compte`,"bankWorkspace.payment":`Encaissement — montant disponible`,"bankWorkspace.choosePayment":`Choisir un encaissement`,"bankWorkspace.confirmMatch":`Rapprocher cette transaction avec l’encaissement choisi ? Aucun nouvel encaissement ne sera créé.`,"bankWorkspace.confirmUnmatch":`Annuler cette allocation ? La transaction et l’encaissement seront conservés. Le motif restera dans l’historique.`,"bankWorkspace.all":`Tous`,"bankWorkspace.flow":`Sens`,"bankWorkspace.credit":`Crédit`,"bankWorkspace.debit":`Débit`,"bankWorkspace.status":`Rapprochement`,"bankWorkspace.unmatched":`À rapprocher`,"bankWorkspace.partial":`Partiellement rapproché`,"bankWorkspace.matched":`Rapproché`,"bankWorkspace.cancelledPayment":`Encaissement annulé`,"bankWorkspace.notApplicable":`Sans rapprochement`,"bankWorkspace.reference":`Référence`,"bankWorkspace.description":`Libellé`,"bankWorkspace.date":`Date`,"bankWorkspace.amount":`Montant`,"bankWorkspace.count.one":`{count} transaction affichée`,"bankWorkspace.count.other":`{count} transactions affichées`,"bankWorkspace.clear":`Effacer les filtres`,"bankWorkspace.noMatches":`Aucune transaction ne correspond aux filtres.`,"bankWorkspace.empty":`Aucune transaction importée.`,"bankWorkspace.limit":`La liste contient au maximum les 1 000 transactions les plus récentes.`,"bankWorkspace.ledgerSortLoaded":`Le tri porte sur les résultats chargés : au maximum 10 000 sources et 10 000 écritures pour la période. Il ne modifie pas l’export CSV.`,"bankWorkspace.historySortLoaded":`Le tri porte sur les 100 événements d’historique les plus récents.`,"bankWorkspace.periodExport":`Journal de la période (CSV)`,"bankWorkspace.periodExportHint":`Export serveur du journal pour la période sélectionnée. La recherche et le tri affichés ne modifient pas cet export.`,"bankWorkspace.periodInvalid":`Saisissez une période valide. La date de fin doit suivre la date de début.`,"bankWorkspace.back":`Retour aux transactions`,"bankWorkspace.backLedger":`Retour aux écritures`,"bankWorkspace.unsaved":`Quitter cette page et abandonner les modifications non enregistrées ?`,"bankWorkspace.validate":`Valider le fichier`,"bankWorkspace.confirmImport":`Confirmer l’import`,"bankWorkspace.changeFile":`Modifier le fichier ou le compte`,"bankWorkspace.fileStep":`1. Fichier et compte`,"bankWorkspace.reviewStep":`2. Validation et confirmation`,"bankWorkspace.doneStep":`3. Résultat`,"bankWorkspace.validationHint":`Le serveur vérifie toutes les lignes et les références existantes. La confirmation vérifie à nouveau les données avant l’ajout.`,"bankWorkspace.statementHint":`Choisissez un fichier CAMT.053, OFX ou CSV UTF-8 de 500 Ko maximum.`,"bankWorkspace.format":`Format du relevé`,"bankWorkspace.csvConfiguration":`Correspondance des colonnes CSV`,"bankWorkspace.delimiter":`Séparateur de colonnes`,"bankWorkspace.comma":`Virgule`,"bankWorkspace.semicolon":`Point-virgule`,"bankWorkspace.tab":`Tabulation`,"bankWorkspace.referenceColumn":`Colonne de référence`,"bankWorkspace.dateColumn":`Colonne de date`,"bankWorkspace.amountColumn":`Colonne de montant`,"bankWorkspace.currencyColumn":`Colonne de devise, facultative pour EUR`,"bankWorkspace.descriptionColumn":`Colonne de libellé`,"bankWorkspace.dateFormat":`Format de date`,"bankWorkspace.decimalSeparator":`Séparateur décimal`,"bankWorkspace.accountInvalid":`Saisissez un libellé de compte de 1 à 100 caractères.`,"bankWorkspace.fileInvalid":`Choisissez un relevé UTF-8 non vide, de 500 Ko maximum.`,"bankWorkspace.preview":`Transactions validées`,"bankWorkspace.new":`À ajouter`,"bankWorkspace.existing":`Déjà présente`,"bankWorkspace.importCounts":`{added} à ajouter · {existing} déjà présente(s)`,"bankWorkspace.importDone":`{added} ajoutée(s) · {existing} déjà présente(s)`,"bankWorkspace.importAgain":`Importer un autre fichier`,"bankWorkspace.context":`Transaction importée`,"bankWorkspace.reconciliation":`Rapprocher une transaction`,"bankWorkspace.allocations":`Allocations actives`,"bankWorkspace.allocate":`Ajouter une allocation`,"bankWorkspace.groupHint":`Ajoutez une allocation par encaissement. Plusieurs allocations peuvent rapprocher un crédit groupé.`,"bankWorkspace.paymentHint":`Seuls les encaissements actifs avec un montant disponible sont proposés. Cette opération ne crée pas d’encaissement.`,"bankWorkspace.invoiceInvalid":`Choisissez une facture émise ou payée.`,"bankWorkspace.paymentInvalid":`Choisissez un encaissement disponible pour cette facture.`,"bankWorkspace.amountInvalid":`Saisissez un montant positif à deux décimales maximum, dans la limite disponible de l’encaissement.`,"bankWorkspace.feeInvalid":`Les frais doivent être positifs ou nuls et inférieurs au montant alloué.`,"bankWorkspace.netInvalid":`Le montant alloué moins les frais dépasse le crédit restant.`,"bankWorkspace.net":`Montant net rapproché`,"bankWorkspace.noPayments":`Cette facture ne possède aucun encaissement disponible.`,"bankWorkspace.noInvoices":`Aucune facture émise ou payée disponible.`,"bankWorkspace.noAllocations":`Aucune allocation active.`,"bankWorkspace.cancelAllocation":`Annuler cette allocation`,"bankWorkspace.cancelContext":`Allocation à annuler`,"bankWorkspace.cancelClose":`Conserver cette allocation`,"bankWorkspace.reasonInvalid":`Saisissez un motif de 1 à 500 caractères.`,"bankWorkspace.immutable":`Les allocations et les frais ne se modifient pas. Annulez l’allocation puis créez une nouvelle allocation.`,"bankWorkspace.feePosted":`Si les frais sont comptabilisés, contrepassez leur écriture avant d’annuler l’allocation.`,"bankWorkspace.viewInvoice":`Consulter la facture et ses encaissements`,"bankWorkspace.viewFees":`Consulter les écritures des frais`,"bankWorkspace.ledgerScope":`Ces écritures locales ne constituent ni une comptabilité générale ni un FEC. Aucun transfert bancaire ni calcul de TVA n’est exécuté.`,"bankWorkspace.sources":`Sources à comptabiliser`,"bankWorkspace.journal":`Journal`,"bankWorkspace.sourceType":`Type de source`,"bankWorkspace.entryCount.one":`{count} élément affiché`,"bankWorkspace.entryCount.other":`{count} éléments affichés`,"bankWorkspace.ledgerSearch":`Rechercher une référence ou un libellé`,"bankWorkspace.sourceEmpty":`Aucune source à comptabiliser dans cette période.`,"bankWorkspace.journalEmpty":`Aucune écriture dans cette période.`,"bankWorkspace.ledgerNoMatches":`Aucun élément ne correspond à la recherche.`,"bankWorkspace.postTitle":`Comptabiliser une source`,"bankWorkspace.reverseTitle":`Consulter ou contrepasser une écriture`,"bankWorkspace.sourceMissing":`Cette source est absente de la période ou ne peut plus être comptabilisée.`,"bankWorkspace.entryMissing":`Cette écriture est absente de la période.`,"bankWorkspace.accountCodeInvalid":`Utilisez 1 à 32 lettres, chiffres, points, tirets ou traits de soulignement. Commencez par une lettre ou un chiffre.`,"bankWorkspace.accountsDistinct":`Le compte à créditer doit être différent du compte à débiter.`,"bankWorkspace.labelInvalid":`Saisissez un libellé de 1 à 160 caractères.`,"bankWorkspace.reversalReasonInvalid":`Saisissez un motif de 1 à 160 caractères.`,"bankWorkspace.reversalDateInvalid":`Saisissez une date comprise entre la date de l’écriture et aujourd’hui.`,"bankWorkspace.sourceSnapshot":`Le serveur reprend le montant bancaire. La date comptable tient compte des contrepassations précédentes. La correction exige une contrepassation.`,"bankWorkspace.viewTransaction":`Consulter la transaction`,"bankWorkspace.activeEntry":`Active`,"bankWorkspace.reversedEntry":`Contrepassée`,"bankWorkspace.reversalEntry":`Contrepassation`,"bankWorkspace.entryStatus":`État de l’écriture`,"bankWorkspace.retry":`Réessayer la même opération`,"bankWorkspace.retryHint":`Une reprise conserve la même clé tant que les données ne changent pas.`},en:{"bankWorkspace.supplierPayments":`Supplier payments to reconcile`,"bankWorkspace.supplierPaymentsHint":`Confirm the matching supplier transfer. A suggestion never triggers automatic reconciliation.`,"bankWorkspace.noSupplierPayments":`No supplier payment is available.`,"bankWorkspace.supplierMatchHistory":`Supplier reconciliation history`,"bankWorkspace.supplierConfirm":`Reconcile this supplier payment with the bank debit?`,"bankWorkspace.supplierUnmatchConfirm":`Cancel this supplier reconciliation?`,"bankWorkspace.supplierUnmatchReason":`Cancellation confirmed by a user.`,"bankWorkspace.unmatch":`Unmatch`,"bankWorkspace.actions":`Actions`,"bankWorkspace.suggestions":`Reconciliation suggestions`,"bankWorkspace.suggestionsHint":`Check the invoice, receipt, and amount before you confirm a suggestion.`,"bankWorkspace.suggestionsLoading":`Finding probable matches…`,"bankWorkspace.transactions":`Transactions`,"bankWorkspace.entries":`Entries`,"bankWorkspace.intro":`Review imported transactions. Match credits to receipts already recorded.`,"bankWorkspace.accountHint":`The account is a local label. It does not represent an active bank connection.`,"bankWorkspace.search":`Search descriptions or references`,"bankWorkspace.allAccounts":`All accounts`,"bankWorkspace.allDates":`All dates`,"bankWorkspace.ledgerPeriodRequired":`Enter both dates to load entries and export the period journal.`,"bankWorkspace.account":`Account label`,"bankWorkspace.payment":`Receipt — available amount`,"bankWorkspace.choosePayment":`Choose a receipt`,"bankWorkspace.confirmMatch":`Match this transaction to the selected receipt? No new receipt will be created.`,"bankWorkspace.confirmUnmatch":`Cancel this allocation? The transaction and receipt will be preserved. The reason will remain in the history.`,"bankWorkspace.all":`All`,"bankWorkspace.flow":`Direction`,"bankWorkspace.credit":`Credit`,"bankWorkspace.debit":`Debit`,"bankWorkspace.status":`Reconciliation`,"bankWorkspace.unmatched":`Unmatched`,"bankWorkspace.partial":`Partially matched`,"bankWorkspace.matched":`Matched`,"bankWorkspace.cancelledPayment":`Cancelled receipt`,"bankWorkspace.notApplicable":`Not applicable`,"bankWorkspace.reference":`Reference`,"bankWorkspace.description":`Description`,"bankWorkspace.date":`Date`,"bankWorkspace.amount":`Amount`,"bankWorkspace.count.one":`{count} transaction shown`,"bankWorkspace.count.other":`{count} transactions shown`,"bankWorkspace.clear":`Clear filters`,"bankWorkspace.noMatches":`No transactions match these filters.`,"bankWorkspace.empty":`No imported transactions.`,"bankWorkspace.limit":`The list contains up to the 1,000 most recent transactions.`,"bankWorkspace.ledgerSortLoaded":`Sorting applies to loaded results: up to 10,000 sources and 10,000 entries for the period. It does not change the CSV export.`,"bankWorkspace.historySortLoaded":`Sorting applies to the 100 most recent history events.`,"bankWorkspace.periodExport":`Period journal (CSV)`,"bankWorkspace.periodExportHint":`Server export of the journal for the selected period. The displayed search and sorting do not change this export.`,"bankWorkspace.periodInvalid":`Enter a valid period. The end date must follow the start date.`,"bankWorkspace.back":`Back to transactions`,"bankWorkspace.backLedger":`Back to entries`,"bankWorkspace.unsaved":`Leave this page and discard unsaved changes?`,"bankWorkspace.validate":`Validate file`,"bankWorkspace.confirmImport":`Confirm import`,"bankWorkspace.changeFile":`Change file or account`,"bankWorkspace.fileStep":`1. File and account`,"bankWorkspace.reviewStep":`2. Validation and confirmation`,"bankWorkspace.doneStep":`3. Result`,"bankWorkspace.validationHint":`The server checks every row and existing reference. Confirmation checks the data again before adding transactions.`,"bankWorkspace.statementHint":`Select a CAMT.053, OFX, or UTF-8 CSV file with a maximum size of 500 KB.`,"bankWorkspace.format":`Statement format`,"bankWorkspace.csvConfiguration":`CSV column mapping`,"bankWorkspace.delimiter":`Column delimiter`,"bankWorkspace.comma":`Comma`,"bankWorkspace.semicolon":`Semicolon`,"bankWorkspace.tab":`Tab`,"bankWorkspace.referenceColumn":`Reference column`,"bankWorkspace.dateColumn":`Date column`,"bankWorkspace.amountColumn":`Amount column`,"bankWorkspace.currencyColumn":`Currency column, optional for EUR`,"bankWorkspace.descriptionColumn":`Description column`,"bankWorkspace.dateFormat":`Date format`,"bankWorkspace.decimalSeparator":`Decimal separator`,"bankWorkspace.accountInvalid":`Enter an account label with 1 to 100 characters.`,"bankWorkspace.fileInvalid":`Choose a non-empty UTF-8 statement with a maximum size of 500 KB.`,"bankWorkspace.preview":`Validated transactions`,"bankWorkspace.new":`To add`,"bankWorkspace.existing":`Already present`,"bankWorkspace.importCounts":`{added} to add · {existing} already present`,"bankWorkspace.importDone":`{added} added · {existing} already present`,"bankWorkspace.importAgain":`Import another file`,"bankWorkspace.context":`Imported transaction`,"bankWorkspace.reconciliation":`Reconcile a transaction`,"bankWorkspace.allocations":`Active allocations`,"bankWorkspace.allocate":`Add an allocation`,"bankWorkspace.groupHint":`Add one allocation per receipt. Multiple allocations can match a grouped credit.`,"bankWorkspace.paymentHint":`Only active receipts with an available amount are listed. This operation does not create a receipt.`,"bankWorkspace.invoiceInvalid":`Choose an issued or paid invoice.`,"bankWorkspace.paymentInvalid":`Choose an available receipt for this invoice.`,"bankWorkspace.amountInvalid":`Enter a positive amount with up to two decimals, within the available receipt amount.`,"bankWorkspace.feeInvalid":`Fees must be zero or positive and less than the allocated amount.`,"bankWorkspace.netInvalid":`The allocated amount minus fees exceeds the remaining credit.`,"bankWorkspace.net":`Net matched amount`,"bankWorkspace.noPayments":`This invoice has no available receipts.`,"bankWorkspace.noInvoices":`No issued or paid invoices are available.`,"bankWorkspace.noAllocations":`No active allocations.`,"bankWorkspace.cancelAllocation":`Cancel this allocation`,"bankWorkspace.cancelContext":`Allocation to cancel`,"bankWorkspace.cancelClose":`Keep this allocation`,"bankWorkspace.reasonInvalid":`Enter a reason with 1 to 500 characters.`,"bankWorkspace.immutable":`Allocations and fees cannot be edited. Cancel the allocation, then create a new allocation.`,"bankWorkspace.feePosted":`If fees are posted, reverse their entry before cancelling the allocation.`,"bankWorkspace.viewInvoice":`View invoice and receipts`,"bankWorkspace.viewFees":`View fee entries`,"bankWorkspace.ledgerScope":`These local entries are neither a general ledger nor a French FEC. No bank transfer or VAT calculation is executed.`,"bankWorkspace.sources":`Sources to post`,"bankWorkspace.journal":`Journal`,"bankWorkspace.sourceType":`Source type`,"bankWorkspace.entryCount.one":`{count} item shown`,"bankWorkspace.entryCount.other":`{count} items shown`,"bankWorkspace.ledgerSearch":`Search references or labels`,"bankWorkspace.sourceEmpty":`No sources to post in this period.`,"bankWorkspace.journalEmpty":`No entries in this period.`,"bankWorkspace.ledgerNoMatches":`No items match this search.`,"bankWorkspace.postTitle":`Post a source`,"bankWorkspace.reverseTitle":`View or reverse an entry`,"bankWorkspace.sourceMissing":`This source is absent from the period or is no longer available to post.`,"bankWorkspace.entryMissing":`This entry is absent from the period.`,"bankWorkspace.accountCodeInvalid":`Use 1 to 32 letters, digits, dots, hyphens or underscores. Start with a letter or digit.`,"bankWorkspace.accountsDistinct":`The credit account must differ from the debit account.`,"bankWorkspace.labelInvalid":`Enter a label with 1 to 160 characters.`,"bankWorkspace.reversalReasonInvalid":`Enter a reason with 1 to 160 characters.`,"bankWorkspace.reversalDateInvalid":`Enter a date between the entry date and today.`,"bankWorkspace.sourceSnapshot":`The server copies the bank amount. The posting date accounts for previous reversals. Corrections require a reversal.`,"bankWorkspace.viewTransaction":`View transaction`,"bankWorkspace.activeEntry":`Active`,"bankWorkspace.reversedEntry":`Reversed`,"bankWorkspace.reversalEntry":`Reversal`,"bankWorkspace.entryStatus":`Entry status`,"bankWorkspace.retry":`Retry the same operation`,"bankWorkspace.retryHint":`Retries keep the same key while the data stays unchanged.`}};var D$1={fr:{"dashboardWorkspace.recent":`Documents récemment modifiés`,"dashboardWorkspace.recentHint":`Dates de modification des documents, sans journal d’audit.`,"dashboardWorkspace.noRecent":`Aucun document disponible.`,"dashboardWorkspace.task":`Action`,"dashboardWorkspace.waiting":`Attente normale`,"dashboardWorkspace.blocked":`Blocage : client archivé`,"dashboardWorkspace.contactBlocked":`Blocage : coordonnées incomplètes`,"dashboardWorkspace.completeClient":`Compléter le client`,"dashboardWorkspace.reviewClient":`Consulter le client`,"dashboardWorkspace.editQuote":`Préparer le devis`,"dashboardWorkspace.followQuote":`Consulter le devis envoyé`,"dashboardWorkspace.issueInvoice":`Finaliser la facture`,"dashboardWorkspace.followInvoice":`Consulter la facture`,"dashboardWorkspace.remindInvoice":`Préparer une relance`,"dashboardWorkspace.pdfBlocked":`Blocage : PDF en échec`,"dashboardWorkspace.loadedAt":`Données chargées le`,"globalSearch.count.one":`{count} résultat affiché · Maximum : 5 par catégorie.`,"globalSearch.count.other":`{count} résultats affichés · Maximum : 5 par catégorie.`,"globalSearch.close":`Fermer la recherche`,"globalSearch.hint":`Recherchez une action, un nom, une référence ou un titre.`,"globalSearch.action.createQuote":`Créer un devis`,"globalSearch.action.createQuoteDetail":`Ouvrir le formulaire de création d’un devis.`,"globalSearch.action.createQuoteAliases":`nouveau devis proposition commerciale`,"globalSearch.action.createClient":`Créer un client`,"globalSearch.action.createClientDetail":`Ouvrir le formulaire de création d’un client.`,"globalSearch.action.createClientAliases":`nouveau client prospect entreprise`,"globalSearch.action.createAffair":`Créer une affaire`,"globalSearch.action.createAffairDetail":`Ouvrir la liste et le formulaire des affaires.`,"globalSearch.action.createAffairAliases":`nouvelle affaire dossier projet`,"globalSearch.action.createPurchase":`Saisir un achat`,"globalSearch.action.createPurchaseDetail":`Créer une facture fournisseur.`,"globalSearch.action.createPurchaseAliases":`nouvel achat dépense facture fournisseur`,"globalSearch.action.createSupplier":`Créer un fournisseur`,"globalSearch.action.createSupplierDetail":`Ouvrir le formulaire de création d’un fournisseur.`,"globalSearch.action.createSupplierAliases":`nouveau fournisseur prestataire`,"globalSearch.action.createCatalogItem":`Ajouter un article au catalogue`,"globalSearch.action.createCatalogItemDetail":`Créer une prestation ou un produit réutilisable.`,"globalSearch.action.createCatalogItemAliases":`nouvel article prestation produit catalogue`,"globalSearch.action.composeEmail":`Rédiger un e-mail`,"globalSearch.action.composeEmailDetail":`Créer un brouillon de message.`,"globalSearch.action.composeEmailAliases":`nouveau message courriel email brouillon`,"clientsWorkspace.countryFilter":`Tous les pays`,"clientsWorkspace.updatedAt":`Dernière modification`,"clientsWorkspace.contactFilter":`Coordonnées`,"clientsWorkspace.contactAll":`Toutes les coordonnées`,"clientsWorkspace.contactIncomplete":`Coordonnées incomplètes`,"clientsWorkspace.contactHint":`Nom, courriel et adresse de facturation requis pour publier.`,"clientsWorkspace.resetFilters":`Effacer les filtres`,"clientsWorkspace.affairs":`Affaires`,"clientsWorkspace.affairsEmpty":`Aucune affaire pour ce client`,"clientsWorkspace.accessCreateTitle":`Créer un accès client`,"clientsWorkspace.accessCreateIntro":`Créez un compte pour consulter les documents de ce client.`,"clientsWorkspace.accessBack":`Retour aux accès`,"portalWorkspace.search":`Rechercher un document`,"portalWorkspace.kind":`Type de document`,"portalWorkspace.all":`Tous les documents`,"portalWorkspace.status":`État`,"portalWorkspace.allStatuses":`Tous les états`,"portalWorkspace.open":`En cours`,"portalWorkspace.completed":`Terminés`,"portalWorkspace.count.one":`{count} document`,"portalWorkspace.count.other":`{count} documents`,"portalWorkspace.empty":`Aucun document ne correspond aux filtres`,"portalWorkspace.back":`Retour aux documents`,"portalWorkspace.detail":`Détail du document`,"portalWorkspace.notFound":`Ce document est introuvable ou inaccessible avec votre compte.`,"portalWorkspace.snapshot":`Le PDF contient les parties et les lignes du document publié.`,"portalWorkspace.signatureLink":`Pour signer ce devis, utilisez le lien personnel reçu par courriel.`,"portalWorkspace.updated":`Dernière modification`,"portalWorkspace.created":`Création`,"publicQuoteWorkspace.confirmation":`Confirmation`,"publicQuoteWorkspace.confirmationPending":`Aucune signature enregistrée pendant cette consultation.`,"publicQuoteWorkspace.documentNext":`Consulter le document`,"publicQuoteWorkspace.signatureNext":`Passer à la signature`,"publicQuoteWorkspace.acceptedAt":`Accepté le`,"publicQuoteWorkspace.order":`Commande créée`,"publicQuoteWorkspace.notSignable":`Ce devis ne peut pas être signé.`},en:{"dashboardWorkspace.recent":`Recently modified documents`,"dashboardWorkspace.recentHint":`Document modification dates, not an audit log.`,"dashboardWorkspace.noRecent":`No documents available.`,"dashboardWorkspace.task":`Action`,"dashboardWorkspace.waiting":`Normal waiting state`,"dashboardWorkspace.blocked":`Blocked: archived client`,"dashboardWorkspace.contactBlocked":`Blocked: incomplete contact details`,"dashboardWorkspace.completeClient":`Complete client details`,"dashboardWorkspace.reviewClient":`View client`,"dashboardWorkspace.editQuote":`Prepare quote`,"dashboardWorkspace.followQuote":`View sent quote`,"dashboardWorkspace.issueInvoice":`Finalize invoice`,"dashboardWorkspace.followInvoice":`View invoice`,"dashboardWorkspace.remindInvoice":`Prepare reminder`,"dashboardWorkspace.pdfBlocked":`Blocked: PDF failed`,"dashboardWorkspace.loadedAt":`Data loaded on`,"globalSearch.count.one":`{count} displayed result · Maximum: 5 per category.`,"globalSearch.count.other":`{count} displayed results · Maximum: 5 per category.`,"globalSearch.close":`Close search`,"globalSearch.hint":`Search for an action, name, reference, or title.`,"globalSearch.action.createQuote":`Create a quote`,"globalSearch.action.createQuoteDetail":`Open the quote creation form.`,"globalSearch.action.createQuoteAliases":`new quote proposal estimate`,"globalSearch.action.createClient":`Create a client`,"globalSearch.action.createClientDetail":`Open the client creation form.`,"globalSearch.action.createClientAliases":`new client prospect company`,"globalSearch.action.createAffair":`Create an affair`,"globalSearch.action.createAffairDetail":`Open the affair list and creation form.`,"globalSearch.action.createAffairAliases":`new affair case project`,"globalSearch.action.createPurchase":`Enter a purchase`,"globalSearch.action.createPurchaseDetail":`Create a supplier invoice.`,"globalSearch.action.createPurchaseAliases":`new purchase expense supplier invoice`,"globalSearch.action.createSupplier":`Create a supplier`,"globalSearch.action.createSupplierDetail":`Open the supplier creation form.`,"globalSearch.action.createSupplierAliases":`new supplier vendor`,"globalSearch.action.createCatalogItem":`Add a catalog item`,"globalSearch.action.createCatalogItemDetail":`Create a reusable service or product.`,"globalSearch.action.createCatalogItemAliases":`new catalog item service product`,"globalSearch.action.composeEmail":`Compose an email`,"globalSearch.action.composeEmailDetail":`Create a message draft.`,"globalSearch.action.composeEmailAliases":`new message email draft`,"clientsWorkspace.countryFilter":`All countries`,"clientsWorkspace.updatedAt":`Last modified`,"clientsWorkspace.contactFilter":`Contact details`,"clientsWorkspace.contactAll":`All contact details`,"clientsWorkspace.contactIncomplete":`Incomplete contact details`,"clientsWorkspace.contactHint":`Name, email, and billing address are required for publication.`,"clientsWorkspace.resetFilters":`Clear filters`,"clientsWorkspace.affairs":`Business cases`,"clientsWorkspace.affairsEmpty":`No business cases for this client`,"clientsWorkspace.accessCreateTitle":`Create client access`,"clientsWorkspace.accessCreateIntro":`Create an account to view this client’s documents.`,"clientsWorkspace.accessBack":`Back to access accounts`,"portalWorkspace.search":`Search documents`,"portalWorkspace.kind":`Document type`,"portalWorkspace.all":`All documents`,"portalWorkspace.status":`Status`,"portalWorkspace.allStatuses":`All statuses`,"portalWorkspace.open":`In progress`,"portalWorkspace.completed":`Completed`,"portalWorkspace.count.one":`{count} document`,"portalWorkspace.count.other":`{count} documents`,"portalWorkspace.empty":`No documents match the filters`,"portalWorkspace.back":`Back to documents`,"portalWorkspace.detail":`Document details`,"portalWorkspace.notFound":`This document is missing or unavailable for your account.`,"portalWorkspace.snapshot":`The PDF contains the parties and lines of the published document.`,"portalWorkspace.signatureLink":`To sign this quote, use the personal link sent by email.`,"portalWorkspace.updated":`Last modified`,"portalWorkspace.created":`Created`,"publicQuoteWorkspace.confirmation":`Confirmation`,"publicQuoteWorkspace.confirmationPending":`No signature was recorded during this consultation.`,"publicQuoteWorkspace.documentNext":`View document`,"publicQuoteWorkspace.signatureNext":`Continue to signature`,"publicQuoteWorkspace.acceptedAt":`Accepted on`,"publicQuoteWorkspace.order":`Order created`,"publicQuoteWorkspace.notSignable":`This quote cannot be signed.`}};var P$1={fr:{"configurationWorkspace.allRows":`Toutes les lignes`,"configurationWorkspace.searchMembers":`Rechercher des membres`,"configurationWorkspace.searchInvitations":`Rechercher des invitations`,"configurationWorkspace.searchTokens":`Rechercher un nom ou une permission`,"configurationWorkspace.searchConditions":`Rechercher dans les noms et les conditions`,"configurationWorkspace.searchTests":`Rechercher dans les tests chargés`,"configurationWorkspace.createdAt":`Création`,"configurationWorkspace.teamExportScope":`L’export exclut les noms, courriels, identifiants de compte et liens d’invitation.`,"configurationWorkspace.revokedTokens":`Jetons révoqués`,"configurationWorkspace.notRevokedTokens":`Jetons non révoqués, y compris expirés`,"configurationWorkspace.backConfiguration":`Retour à la configuration`,"configurationWorkspace.reload":`Recharger les données`,"configurationWorkspace.company":`Entreprise`,"configurationWorkspace.companyHint":`Coordonnées et identifiants utilisés dans vos documents.`,"configurationWorkspace.documents":`Documents et supports`,"configurationWorkspace.documentsHint":`Conditions réutilisables et carte de visite.`,"configurationWorkspace.access":`Accès`,"configurationWorkspace.accessHint":`Membres de l’équipe, invitations et jetons API.`,"configurationWorkspace.services":`Services`,"configurationWorkspace.servicesHint":`Configuration des fournisseurs, tests et simulations techniques.`,"configurationWorkspace.audit":`Audit`,"configurationWorkspace.identity":`Identité`,"configurationWorkspace.address":`Adresse et contact`,"configurationWorkspace.identifiers":`Identifiants administratifs et fiscaux`,"configurationWorkspace.businessCard":`Carte de visite`,"configurationWorkspace.newCondition":`Créer des conditions`,"configurationWorkspace.editCondition":`Modifier les conditions`,"configurationWorkspace.backConditions":`Retour aux conditions`,"configurationWorkspace.preview":`Aperçu`,"configurationWorkspace.notFound":`Cet élément ne figure pas dans les données disponibles.`,"configurationWorkspace.newInvitation":`Inviter un membre`,"configurationWorkspace.backTeam":`Retour à l’équipe`,"configurationWorkspace.chooseProfile":`Choisir un profil`,"configurationWorkspace.profileRequired":`Choisissez un profil pour cette invitation.`,"configurationWorkspace.invitationInvalid":`Renseignez un nom et une adresse de courriel valides.`,"configurationWorkspace.inviteConfirm":`Créer une invitation pour {name} ({email}) avec le profil {profile} ? Aucun courriel ne sera envoyé.`,"configurationWorkspace.memberProfile":`Profil du membre`,"configurationWorkspace.applyProfile":`Appliquer le profil`,"configurationWorkspace.status":`État`,"configurationWorkspace.actions":`Actions`,"configurationWorkspace.backTokens":`Retour aux jetons API`,"configurationWorkspace.permissionCount.one":`{count} permission`,"configurationWorkspace.permissionCount.other":`{count} permissions`,"configurationWorkspace.permissionSelection.one":`{count} sélectionnée sur {total}`,"configurationWorkspace.permissionSelection.other":`{count} sélectionnées sur {total}`,"configurationWorkspace.tokenInvalid":`Renseignez un nom, une expiration future et au moins une permission.`,"configurationWorkspace.tokenConfirm.one":`Créer le jeton « {name} » avec {count} permission ?`,"configurationWorkspace.tokenConfirm.other":`Créer le jeton « {name} » avec {count} permissions ?`,"configurationWorkspace.unsaved":`Quitter cette page et abandonner les modifications non enregistrées ?`,"configurationWorkspace.connection":`Configuration de la connexion`,"configurationWorkspace.tests":`Tests`,"configurationWorkspace.newTest":`Nouveau test`,"configurationWorkspace.testDetail":`Détail du test`,"configurationWorkspace.backTests":`Retour aux tests`,"configurationWorkspace.notVerified":`La présence des secrets ne prouve pas que la connexion fonctionne. Aucun test externe n’est lancé à l’ouverture.`,"configurationWorkspace.providerSetup":`Les secrets sont gérés dans la configuration du déploiement. Cette page ne les affiche pas et ne les modifie pas.`,"configurationWorkspace.testComplete":`La demande est enregistrée. Consultez son détail pour suivre son état. Cette page ne soumettra pas une deuxième demande.`,"configurationWorkspace.resumeTest":`Reprendre une demande incertaine`,"configurationWorkspace.simulations":`Simulations techniques`,"configurationWorkspace.simulationDomain":`Domaine à simuler`,"configurationWorkspace.chooseDomain":`Choisir un domaine`,"configurationWorkspace.domainRequired":`Choisissez un domaine.`,"configurationWorkspace.account":`Compte`,"configurationWorkspace.accountHint":`Thème, langue et présentation des messages de votre compte.`,"configurationWorkspace.security":`Sécurité`,"configurationWorkspace.passkeys":`Passkeys`,"configurationWorkspace.sessions":`Sessions`,"configurationWorkspace.preferences":`Préférences`,"configurationWorkspace.language":`Langue`,"configurationWorkspace.passwordInvalid":`Vérifiez les champs du mot de passe.`},en:{"configurationWorkspace.allRows":`All rows`,"configurationWorkspace.searchMembers":`Search members`,"configurationWorkspace.searchInvitations":`Search invitations`,"configurationWorkspace.searchTokens":`Search names or permissions`,"configurationWorkspace.searchConditions":`Search names and conditions`,"configurationWorkspace.searchTests":`Search loaded tests`,"configurationWorkspace.createdAt":`Created`,"configurationWorkspace.teamExportScope":`Export excludes names, email addresses, account identifiers and invitation links.`,"configurationWorkspace.revokedTokens":`Revoked tokens`,"configurationWorkspace.notRevokedTokens":`Tokens not revoked, including expired tokens`,"configurationWorkspace.backConfiguration":`Back to settings`,"configurationWorkspace.reload":`Reload data`,"configurationWorkspace.company":`Company`,"configurationWorkspace.companyHint":`Contact details and identifiers used in your documents.`,"configurationWorkspace.documents":`Documents and materials`,"configurationWorkspace.documentsHint":`Reusable conditions and business card.`,"configurationWorkspace.access":`Access`,"configurationWorkspace.accessHint":`Team members, invitations and API tokens.`,"configurationWorkspace.services":`Services`,"configurationWorkspace.servicesHint":`Provider configuration, tests and technical simulations.`,"configurationWorkspace.audit":`Audit`,"configurationWorkspace.identity":`Identity`,"configurationWorkspace.address":`Address and contact`,"configurationWorkspace.identifiers":`Administrative and tax identifiers`,"configurationWorkspace.businessCard":`Business card`,"configurationWorkspace.newCondition":`Create conditions`,"configurationWorkspace.editCondition":`Edit conditions`,"configurationWorkspace.backConditions":`Back to conditions`,"configurationWorkspace.preview":`Preview`,"configurationWorkspace.notFound":`This item is not in the available data.`,"configurationWorkspace.newInvitation":`Invite a member`,"configurationWorkspace.backTeam":`Back to team`,"configurationWorkspace.chooseProfile":`Choose a profile`,"configurationWorkspace.profileRequired":`Choose a profile for this invitation.`,"configurationWorkspace.invitationInvalid":`Enter a valid name and email address.`,"configurationWorkspace.inviteConfirm":`Create an invitation for {name} ({email}) with the {profile} profile? No email will be sent.`,"configurationWorkspace.memberProfile":`Member profile`,"configurationWorkspace.applyProfile":`Apply profile`,"configurationWorkspace.status":`Status`,"configurationWorkspace.actions":`Actions`,"configurationWorkspace.backTokens":`Back to API tokens`,"configurationWorkspace.permissionCount.one":`{count} permission`,"configurationWorkspace.permissionCount.other":`{count} permissions`,"configurationWorkspace.permissionSelection.one":`{count} selected of {total}`,"configurationWorkspace.permissionSelection.other":`{count} selected of {total}`,"configurationWorkspace.tokenInvalid":`Enter a name, a future expiration and at least one permission.`,"configurationWorkspace.tokenConfirm.one":`Create the token “{name}” with {count} permission?`,"configurationWorkspace.tokenConfirm.other":`Create the token “{name}” with {count} permissions?`,"configurationWorkspace.unsaved":`Leave this page and discard unsaved changes?`,"configurationWorkspace.connection":`Connection configuration`,"configurationWorkspace.tests":`Tests`,"configurationWorkspace.newTest":`New test`,"configurationWorkspace.testDetail":`Test details`,"configurationWorkspace.backTests":`Back to tests`,"configurationWorkspace.notVerified":`The presence of secrets does not prove that the connection works. Opening this page does not start an external test.`,"configurationWorkspace.providerSetup":`Secrets are managed in deployment configuration. This page does not display or change them.`,"configurationWorkspace.testComplete":`The request is recorded. Open its details to follow its status. This page will not submit a second request.`,"configurationWorkspace.resumeTest":`Resume an uncertain request`,"configurationWorkspace.simulations":`Technical simulations`,"configurationWorkspace.simulationDomain":`Simulation domain`,"configurationWorkspace.chooseDomain":`Choose a domain`,"configurationWorkspace.domainRequired":`Choose a domain.`,"configurationWorkspace.account":`Account`,"configurationWorkspace.accountHint":`Theme, language, and message presentation for your account.`,"configurationWorkspace.security":`Security`,"configurationWorkspace.passkeys":`Passkeys`,"configurationWorkspace.sessions":`Sessions`,"configurationWorkspace.preferences":`Preferences`,"configurationWorkspace.language":`Language`,"configurationWorkspace.passwordInvalid":`Check the password fields.`}};var E$2={fr:{"audit.searchPage":`Rechercher sur cette page`,"audit.serverFilters":`Filtres du journal entier`,"audit.exportPage":`Exporter cette page filtrée en CSV, sans identifiants d’acteur`,"audit.visibleCount.one":`{count} événement affiché`,"audit.visibleCount.other":`{count} événements affichés`,"audit.loadedCount.one":`sur {count} événement chargé.`,"audit.loadedCount.other":`sur {count} événements chargés.`,"audit.title":`Journal d’audit`,"audit.readDenied":`Votre compte ne permet pas de consulter le journal d’audit.`,"audit.intro":`Événements enregistrés dans la base locale. Ce journal ne contient pas les journaux externes des fournisseurs.`,"audit.open":`Ouvrir le journal d’audit`,"audit.action":`Action`,"audit.resourceType":`Type de ressource`,"audit.resource":`Ressource`,"audit.actor":`Identifiant de l’acteur`,"audit.actorUnknown":`Non renseigné`,"audit.date":`Date`,"audit.allActions":`Toutes les actions`,"audit.allResources":`Tous les types de ressource`,"audit.resourceHint":`Filtre exact, par exemple quote, invoice ou client. Laissez ce champ vide pour tous les types.`,"audit.filterInvalid":`Saisissez un type de ressource composé de lettres minuscules et de tirets.`,"audit.apply":`Appliquer les filtres`,"audit.reset":`Effacer les filtres`,"audit.reload":`Recharger cette page`,"audit.loading":`Chargement du journal…`,"audit.empty":`Aucun événement pour cette page et ces filtres.`,"audit.invalid_query":`Les paramètres de cette adresse sont invalides. Effacez les filtres pour revenir au début du journal.`,"audit.unavailable":`Le journal est indisponible. Aucune donnée d’audit n’a été chargée.`,"audit.navigation":`Pages du journal d’audit`,"audit.previous":`Précédent — plus récents`,"audit.next":`Suivant — plus anciens`,"audit.count.one":`{count} événement sur cette page`,"audit.count.other":`{count} événements sur cette page`},en:{"audit.searchPage":`Search this page`,"audit.serverFilters":`Filters for the entire log`,"audit.exportPage":`Export this filtered page as CSV, without actor identifiers`,"audit.visibleCount.one":`{count} event displayed`,"audit.visibleCount.other":`{count} events displayed`,"audit.loadedCount.one":`from {count} loaded event.`,"audit.loadedCount.other":`from {count} loaded events.`,"audit.title":`Audit log`,"audit.readDenied":`Your account cannot view the audit log.`,"audit.intro":`Events recorded in the local database. This log does not include external provider logs.`,"audit.open":`Open the audit log`,"audit.action":`Action`,"audit.resourceType":`Resource type`,"audit.resource":`Resource`,"audit.actor":`Actor identifier`,"audit.actorUnknown":`Not recorded`,"audit.date":`Date`,"audit.allActions":`All actions`,"audit.allResources":`All resource types`,"audit.resourceHint":`Exact filter, for example quote, invoice or client. Leave empty for all types.`,"audit.filterInvalid":`Enter a resource type that contains lowercase letters and hyphens.`,"audit.apply":`Apply filters`,"audit.reset":`Clear filters`,"audit.reload":`Reload this page`,"audit.loading":`Loading the audit log…`,"audit.empty":`No events for this page and these filters.`,"audit.invalid_query":`This address contains invalid parameters. Clear the filters to return to the start of the log.`,"audit.unavailable":`The log is unavailable. No audit data was loaded.`,"audit.navigation":`Audit log pages`,"audit.previous":`Previous — newer`,"audit.next":`Next — older`,"audit.count.one":`{count} event on this page`,"audit.count.other":`{count} events on this page`}};var c$2={fr:{group:{title:`Audit`,description:`Lecture protégée des événements enregistrés dans la base locale.`},operations:{auditEventList:{summary:`Lire une page du journal d’audit local`,description:"Exige une session autorisée avec la permission `audit.read`. Cette permission n’est pas accordable aux jetons API. Retourne uniquement `id`, `action`, `actorUserId`, `resourceType`, `resourceId` et `occurredAt`. Ne retourne ni métadonnées, ni secrets, ni corrélation de trace ou de requête. Le serveur définit la taille des pages avec `AUDIT_PAGE_SIZE`, chargé par Effect Config. Sans `limit`, la requête utilise cette taille. Une limite explicite doit être un entier positif inférieur ou égal à cette taille. Un dépassement retourne HTTP 400 avec `audit.invalid_query`, sans lecture du journal. Les filtres `action` et `resourceType` sont exacts et se combinent. Sans curseur, la réponse contient les événements les plus récents. Avec `direction=older` ou sans direction, `cursor` exclut cet identifiant et sélectionne les identifiants inférieurs. Avec `direction=newer`, un curseur est obligatoire et la réponse contient les événements immédiatement supérieurs. Toutes les pages sont ordonnées par identifiant ULID décroissant. Les ULID sont créés à la date de l’événement. `previousCursor` s’utilise avec `direction=newer`, et `nextCursor` avec `direction=older`. Une valeur null indique l’absence de page dans cette direction pour les filtres actifs. La pagination ne fournit aucun total ni instantané entre requêtes. La réponse est privée et non mise en cache. Ce journal ne remplace pas les journaux externes des fournisseurs."}}},en:{group:{title:`Audit`,description:`Protected access to events recorded in the local database.`},operations:{auditEventList:{summary:`Read a page of the local audit log`,description:"Requires an authorized session with the `audit.read` permission. API tokens cannot receive this permission. Returns only `id`, `action`, `actorUserId`, `resourceType`, `resourceId` and `occurredAt`. Excludes metadata, secrets, trace identifiers and request identifiers. The server sets the page size through `AUDIT_PAGE_SIZE`, loaded by Effect Config. Without `limit`, the request uses that size. An explicit limit must be a positive integer no greater than that size. A larger limit returns HTTP 400 with `audit.invalid_query`, without reading the log. The exact `action` and `resourceType` filters apply together. Without a cursor, the response contains the newest events. With `direction=older` or no direction, `cursor` excludes that identifier and selects lower identifiers. With `direction=newer`, a cursor is required and the response contains the immediately higher events. Every page uses descending ULID order. ULIDs are created at the event time. Use `previousCursor` with `direction=newer` and `nextCursor` with `direction=older`. A null value means that no page exists in that direction for the active filters. Pagination provides neither a total nor a snapshot across requests. Responses are private and are not cached. This log does not replace external provider logs."}}}};var _$1={fr:{"listWorkspace.search":`Rechercher dans la liste`,"listWorkspace.filters":`Filtres`,"listWorkspace.closeFilters":`Fermer les filtres`,"listWorkspace.backFilters":`Revenir aux catégories de filtres`,"listWorkspace.searchChoices":`Rechercher une option`,"listWorkspace.noChoices":`Aucune option ne correspond.`,"listWorkspace.exportCsv":`Exporter les résultats affichés (CSV)`,"listWorkspace.exportEmpty":`Aucun résultat affiché à exporter.`,"listWorkspace.exportPending":`Attendez la fin du chargement pour exporter les résultats affichés.`},en:{"listWorkspace.search":`Search this list`,"listWorkspace.filters":`Filters`,"listWorkspace.closeFilters":`Close filters`,"listWorkspace.backFilters":`Back to filter categories`,"listWorkspace.searchChoices":`Search options`,"listWorkspace.noChoices":`No matching options.`,"listWorkspace.exportCsv":`Export displayed results (CSV)`,"listWorkspace.exportEmpty":`There are no displayed results to export.`,"listWorkspace.exportPending":`Wait for loading to finish before exporting the displayed results.`}};var z$2={fr:{"dateRangeFilter.label":`Période`,"dateRangeFilter.from":`Début`,"dateRangeFilter.to":`Fin`,"dateRangeFilter.apply":`Appliquer`,"dateRangeFilter.clear":`Effacer`,"dateRangeFilter.invalidDate":`Saisissez une date valide.`,"dateRangeFilter.invalidOrder":`La fin doit être égale ou postérieure au début.`},en:{"dateRangeFilter.label":`Date range`,"dateRangeFilter.from":`From`,"dateRangeFilter.to":`To`,"dateRangeFilter.apply":`Apply`,"dateRangeFilter.clear":`Clear`,"dateRangeFilter.invalidDate":`Enter a valid date.`,"dateRangeFilter.invalidOrder":`The end date must be on or after the start date.`}};var F$2={fr:{"team.reload":`Recharger les comptes et invitations`,"team.reloadConfirm":`Recharger les comptes et invitations ? Les profils non enregistrés seront perdus.`,"team.title":`Équipe`,"team.loadError":`Impossible de charger les comptes et invitations. Rechargez la liste.`,"team.inviteUnconfirmed":`La création de l’invitation reste à confirmer. Conservez la demande en cours. Reprenez cette même demande.`,"team.cancelUnconfirmed":`L’annulation de l’invitation reste à confirmer. Rechargez la liste pour vérifier son état.`,"team.updateUnconfirmed":`La modification de l’accès reste à confirmer. Rechargez la liste pour vérifier le profil et l’état du compte.`,"team.joinUnconfirmed":`La création de votre compte reste à confirmer. Essayez de vous connecter avec l’adresse invitée et le mot de passe choisi.`,"team.cancelRejected":`L’annulation de cette invitation a été refusée. Vérifiez son état et les permissions de votre compte.`,"team.cancelDenied":`Votre compte ne permet pas d’annuler cette invitation.`,"team.updateDenied":`Votre compte ne permet pas de modifier les accès de ce membre.`,"team.updateRejected":`La modification de cet accès a été refusée. Vérifiez les données actuelles du compte et vos permissions.`,"team.inviteInvalid":`Vérifiez le nom, l’adresse de connexion et le profil de la personne invitée.`,"team.intro":`Invitez un collaborateur ou un comptable. Les comptes administrateurs existants ne sont pas modifiés ici.`,"team.profiles":`Le comptable consulte les documents, règlements et relevés, sans modification. Le collaborateur gère les clients, documents commerciaux, règlements et rapprochements. Aucun profil ne gère les comptes ni les jetons API.`,"team.saved":`Modification enregistrée.`,"team.name":`Nom`,"team.email":`Adresse de connexion`,"team.profile":`Profil`,"team.accountant":`Comptable — lecture seule`,"team.accountingValidator":`Valideur comptable`,"team.accountingReader":`Lecteur comptable`,"team.collaborator":`Collaborateur`,"team.invite":`Créer une invitation`,"team.link":`Lien d’invitation`,"team.linkHint":`Aucun courriel n’a été envoyé. Transmettez ce lien confidentiel au destinataire par un canal sûr. Il expire après sept jours.`,"team.linkSaved":`J’ai conservé le lien`,"team.members":`Comptes de l’équipe`,"team.active":`Actif`,"team.disabled":`Désactivé`,"team.disable":`Désactiver l’accès`,"team.enable":`Réactiver l’accès`,"team.changeProfile":`Changer de profil`,"team.empty":`Aucun élément.`,"team.invitations":`Les 100 dernières invitations`,"team.expires":`Expiration :`,"team.accepted":`Acceptée`,"team.cancelled":`Annulée`,"team.expired":`Expirée`,"team.cancel":`Annuler l’invitation`,"team.confirmCancel":`Annuler cette invitation ? Son lien ne permettra plus de créer un compte.`,"team.confirmUpdate":`Modifier cet accès ? Toutes les sessions et tous les jetons API de ce compte seront révoqués.`,"team.leave":`Quitter cette page ? Les données non enregistrées et le lien affiché ne seront pas conservés.`,"team.error":`Le résultat de cette demande reste à confirmer. Vérifiez les comptes et invitations avant de recommencer.`,"team.email_exists":`Cette adresse appartient déjà à un compte. Utilisez une autre adresse ou gérez le compte existant.`,"team.invitation_exists":`Une invitation active existe pour cette adresse. Retrouvez-la dans la liste ou annulez-la avant de recommencer.`,"team.invitation_limit":`La limite de 100 invitations actives est atteinte. Annulez une invitation inutilisée avant de recommencer.`,"team.invitation_changed":`Les données diffèrent de la demande déjà enregistrée. Rechargez la liste avant de créer une autre invitation.`,"team.invitation_inactive":`Cette invitation a expiré, a été annulée ou a déjà été acceptée. Rechargez la liste.`,"team.invitation_permission":`Votre compte ne permet pas de créer cette invitation. Demandez à un administrateur de vérifier les permissions de votre compte.`,"team.conflict":`Cette demande a été refusée. Vérifiez les données actuelles et les permissions de votre compte.`,"team.invitation_rejected":`Invitation indisponible, expirée ou déjà utilisée. Demandez une nouvelle invitation à l’administrateur.`,"team.role_unavailable":`Ce rôle personnalisé n’est plus disponible. Choisissez un autre rôle.`,"team.last_administrator":`Conservez au moins un administrateur actif.`,"team.join":`Rejoindre l’équipe`,"team.joinHint":`Le lien crée un compte pour l’adresse et le profil choisis par l’administrateur. Choisissez votre mot de passe.`,"team.password":`Mot de passe`,"team.confirmPassword":`Confirmer le mot de passe`,"team.passwordHint":`Utilisez entre 12 et 256 caractères.`,"team.passwordInvalid":`Utilisez entre 12 et 256 caractères et deux mots de passe identiques.`,"team.accept":`Créer mon compte`,"team.joined":`Compte créé. Connectez-vous avec l’adresse invitée et votre mot de passe.`,"team.login":`Se connecter`},en:{"team.reload":`Reload accounts and invitations`,"team.reloadConfirm":`Reload accounts and invitations? Unsaved profiles will be lost.`,"team.title":`Team`,"team.loadError":`Unable to load accounts and invitations. Reload the list.`,"team.inviteUnconfirmed":`Invitation creation is unconfirmed. Keep the current request. Resume that same request.`,"team.cancelUnconfirmed":`Invitation cancellation is unconfirmed. Reload the list to check its status.`,"team.updateUnconfirmed":`The access change is unconfirmed. Reload the list to check the account profile and status.`,"team.joinUnconfirmed":`Account creation is unconfirmed. Try signing in with the invited email address and the password you chose.`,"team.cancelRejected":`Cancellation of this invitation was rejected. Check its status and your account permissions.`,"team.cancelDenied":`Your account cannot cancel this invitation.`,"team.updateDenied":`Your account cannot change this member’s access.`,"team.updateRejected":`The change to this account’s access was rejected. Check its current details and your permissions.`,"team.inviteInvalid":`Check the invited person’s name, sign-in email address and profile.`,"team.intro":`Invite a collaborator or an accountant. Existing administrator accounts are not changed here.`,"team.profiles":`The accountant reads documents, payments and statements without changes. The collaborator manages clients, commercial documents, payments and reconciliation. Neither profile manages accounts or API tokens.`,"team.saved":`Change saved.`,"team.name":`Name`,"team.email":`Login email`,"team.profile":`Profile`,"team.accountant":`Accountant — read only`,"team.accountingValidator":`Accounting validator`,"team.accountingReader":`Accounting reader`,"team.collaborator":`Collaborator`,"team.invite":`Create invitation`,"team.link":`Invitation link`,"team.linkHint":`No email was sent. Share this confidential link with the recipient through a secure channel. It expires after seven days.`,"team.linkSaved":`I have saved the link`,"team.members":`Team accounts`,"team.active":`Active`,"team.disabled":`Disabled`,"team.disable":`Disable access`,"team.enable":`Enable access`,"team.changeProfile":`Change profile`,"team.empty":`No items.`,"team.invitations":`Latest 100 invitations`,"team.expires":`Expires:`,"team.accepted":`Accepted`,"team.cancelled":`Cancelled`,"team.expired":`Expired`,"team.cancel":`Cancel invitation`,"team.confirmCancel":`Cancel this invitation? Its link will no longer create an account.`,"team.confirmUpdate":`Change this access? All sessions and API tokens for this account will be revoked.`,"team.leave":`Leave this page? Unsaved data and the displayed link will not be kept.`,"team.error":`The result of this request is unconfirmed. Check accounts and invitations before trying again.`,"team.email_exists":`This address already belongs to an account. Use another address or manage the existing account.`,"team.invitation_exists":`An active invitation exists for this address. Find it in the list or cancel it before trying again.`,"team.invitation_limit":`The limit of 100 active invitations has been reached. Cancel an unused invitation before trying again.`,"team.invitation_changed":`The data differs from the saved request. Reload the list before creating another invitation.`,"team.invitation_inactive":`This invitation has expired, was cancelled or was already accepted. Reload the list.`,"team.invitation_permission":`Your account cannot create this invitation. Ask an administrator to check your account permissions.`,"team.conflict":`This request was rejected. Check the current data and your account permissions.`,"team.invitation_rejected":`Invitation unavailable, expired or already used. Ask the administrator for a new invitation.`,"team.role_unavailable":`This custom role is no longer available. Select another role.`,"team.last_administrator":`Keep at least one active administrator.`,"team.join":`Join the team`,"team.joinHint":`This link creates an account with the email and profile selected by the administrator. Choose your password.`,"team.password":`Password`,"team.confirmPassword":`Confirm password`,"team.passwordHint":`Use between 12 and 256 characters.`,"team.passwordInvalid":`Use between 12 and 256 characters and two identical passwords.`,"team.accept":`Create my account`,"team.joined":`Account created. Sign in with the invited email and your password.`,"team.login":`Sign in`}};var l={fr:{group:{title:`Équipe`,description:`Invitations à usage unique et profils limités. Aucun courriel réel n’est envoyé.`},operations:{teamList:{summary:`Lister les comptes et invitations`,description:`Retourne les comptes collaborateurs et comptables et les 100 dernières invitations, sans jeton secret.`},teamInvite:{summary:`Créer une invitation`,description:`Retourne un lien confidentiel valable sept jours. Une nouvelle tentative identique conserve le même lien et la même expiration. Aucun courriel n’est envoyé.`},teamInvitationCancel:{summary:`Annuler une invitation`,description:`Invalide une invitation non acceptée. Une nouvelle annulation reste sans effet.`},teamMemberUpdate:{summary:`Modifier un accès d’équipe`,description:`Change le profil ou désactive le compte avec contrôle de version. Révoque toutes ses sessions et tous ses jetons API. Ne modifie aucun administrateur existant.`},teamInvitationAccept:{summary:`Accepter une invitation`,description:`Crée le compte et consomme le jeton en une transaction. Exige une origine autorisée et un mot de passe valide. Limite : dix demandes par minute et adresse cliente.`}}},en:{group:{title:`Team`,description:`Single-use invitations and limited profiles. No real email is sent.`},operations:{teamList:{summary:`List accounts and invitations`,description:`Returns collaborator and accountant accounts and the latest 100 invitations without secret tokens.`},teamInvite:{summary:`Create an invitation`,description:`Returns a confidential link valid for seven days. An identical retry keeps the same link and expiry. Sends no email.`},teamInvitationCancel:{summary:`Cancel an invitation`,description:`Invalidates an invitation that has not been accepted. Repeated cancellation has no additional effect.`},teamMemberUpdate:{summary:`Change team access`,description:`Changes the profile or disables the account with a version check. Revokes all its sessions and API tokens. Does not change existing administrators.`},teamInvitationAccept:{summary:`Accept an invitation`,description:`Creates the account and consumes the token in one transaction. Requires an allowed origin and valid password. Limit: ten requests per minute per client address.`}}}};var N$3={fr:{"role.title":`Rôles personnalisés`,"role.intro":`Créez des modèles de permissions pour les membres de l’équipe.`,"role.backTeam":`Retour à l’équipe`,"role.backList":`Retour aux rôles`,"role.create":`Créer un rôle`,"role.createTitle":`Créer un rôle personnalisé`,"role.editTitle":`Modifier le rôle personnalisé`,"role.editorIntro":`Sélectionnez uniquement les permissions nécessaires à ce rôle.`,"role.name":`Nom`,"role.permissions":`Permissions`,"role.edit":`Modifier`,"role.delete":`Supprimer`,"role.save":`Enregistrer`,"role.created":`Le rôle est créé.`,"role.updated":`Le rôle est enregistré.`,"role.cancel":`Annuler`,"role.loading":`Chargement des rôles…`,"role.empty":`Aucun rôle personnalisé.`,"role.count.one":`{count} rôle personnalisé`,"role.count.other":`{count} rôles personnalisés`,"role.deleteConfirm":`Supprimer le rôle «\xA0{name}\xA0»\xA0?`,"role.unsavedChanges":`Abandonner les modifications de ce rôle\xA0?`,"role.error":`Impossible de charger ou d’enregistrer les rôles.`,"role.not_found":`Ce rôle est introuvable.`,"role.name_exists":`Ce nom de rôle existe déjà.`,"role.creation_conflict":`Cette demande de création contient maintenant d’autres données.`,"role.version_conflict":`Ce rôle a changé. Actualisez la page avant de recommencer.`,"role.in_use":`Ce rôle est utilisé par un membre ou une invitation active.`,"role.last_administrator":`Conservez au moins un administrateur actif.`},en:{"role.title":`Custom roles`,"role.intro":`Create permission templates for team members.`,"role.backTeam":`Back to team`,"role.backList":`Back to roles`,"role.create":`Create role`,"role.createTitle":`Create custom role`,"role.editTitle":`Edit custom role`,"role.editorIntro":`Select only the permissions that this role needs.`,"role.name":`Name`,"role.permissions":`Permissions`,"role.edit":`Edit`,"role.delete":`Delete`,"role.save":`Save`,"role.created":`The role was created.`,"role.updated":`The role was saved.`,"role.cancel":`Cancel`,"role.loading":`Loading roles…`,"role.empty":`No custom roles.`,"role.count.one":`{count} custom role`,"role.count.other":`{count} custom roles`,"role.deleteConfirm":`Delete the “{name}” role?`,"role.unsavedChanges":`Discard this role’s changes?`,"role.error":`The roles cannot be loaded or saved.`,"role.not_found":`This role cannot be found.`,"role.name_exists":`This role name already exists.`,"role.creation_conflict":`This creation request now contains different data.`,"role.version_conflict":`This role changed. Refresh the page before you try again.`,"role.in_use":`A member or active invitation uses this role.`,"role.last_administrator":`Keep at least one active administrator.`}};var d={fr:{group:{title:`Rôles personnalisés`,description:`Modèles de permissions attribuables aux membres de l’équipe.`},operations:{customRoleList:{summary:`Lister les rôles personnalisés`,description:`Retourne les rôles personnalisés et leurs permissions.`},customRoleGet:{summary:`Lire un rôle personnalisé`,description:`Retourne un rôle personnalisé et sa version actuelle.`},customRoleCreate:{summary:`Créer un rôle personnalisé`,description:`Crée un modèle de permissions avec une demande idempotente.`},customRoleUpdate:{summary:`Modifier un rôle personnalisé`,description:`Modifie le nom et les permissions avec contrôle de version.`},customRoleDelete:{summary:`Supprimer un rôle personnalisé`,description:`Supprime un rôle qui n’est utilisé par aucun membre ni invitation active.`}}},en:{group:{title:`Custom roles`,description:`Permission templates that can be assigned to team members.`},operations:{customRoleList:{summary:`List custom roles`,description:`Returns custom roles and their permissions.`},customRoleGet:{summary:`Get a custom role`,description:`Returns a custom role and its current version.`},customRoleCreate:{summary:`Create a custom role`,description:`Creates a permission template with an idempotent request.`},customRoleUpdate:{summary:`Update a custom role`,description:`Updates the name and permissions with a version check.`},customRoleDelete:{summary:`Delete a custom role`,description:`Deletes a role that no member or active invitation uses.`}}}};var U$2={fr:{"permission.group.affair":`Affaires et projets clients`,"permission.group.integration":`Connexions et services externes`,"permission.group.ledger":`Grand livre comptable`,"permission.group.invoice":`Factures, avoirs et remboursements`,"permission.group.email":`Courriels, modèles et relances`,"permission.group.bank":`Comptes et opérations bancaires`,"permission.group.catalog":`Produits et services`,"permission.group.issuer":`Identité de l’émetteur`,"permission.group.company":`Paramètres de la société`,"permission.group.condition":`Conditions commerciales`,"permission.group.payment":`Règlements clients`,"permission.group.client":`Clients et accès au portail`,"permission.group.supplier":`Fournisseurs`,"permission.group.supplier-invoice":`Factures et paiements fournisseurs`,"permission.group.quote":`Devis et signatures`,"permission.group.order":`Commandes clients`,"permission.group.template":`Modèles de documents`,"permission.group.document":`Production et téléchargement des documents`,"permission.group.user":`Membres et invitations`,"permission.group.role":`Rôles personnalisés`,"permission.group.session":`Sessions actives`,"permission.group.api-token":`Jetons d’API`,"permission.group.audit":`Journal d’audit`,"permission.group.accounting":`Comptabilité générale`,"permission.group.demo":`Données de démonstration`,"permission.affair.read":`Consulter les affaires.`,"permission.affair.create":`Créer des affaires.`,"permission.affair.update":`Modifier les affaires.`,"permission.integration.configure":`Configurer les connexions aux services externes.`,"permission.ledger.read":`Consulter le grand livre comptable.`,"permission.ledger.post":`Comptabiliser et contrepasser les écritures.`,"permission.invoice.credit":`Créer des avoirs pour les factures.`,"permission.invoice.refund":`Enregistrer les remboursements de factures.`,"permission.email.draft.manage":`Créer et gérer les brouillons de courriel.`,"permission.email.template.manage":`Créer et gérer les modèles de courriel.`,"permission.email.reminder.manage":`Créer et gérer les relances de paiement.`,"permission.bank.read":`Consulter les comptes et opérations bancaires.`,"permission.bank.import":`Importer des relevés bancaires.`,"permission.bank.reconcile":`Rapprocher les opérations bancaires.`,"permission.catalog.read":`Consulter le catalogue de produits et services.`,"permission.catalog.manage":`Créer et gérer les produits et services.`,"permission.issuer.read":`Consulter l’identité de l’émetteur.`,"permission.issuer.update":`Modifier l’identité de l’émetteur.`,"permission.company.read":`Consulter les paramètres de la société.`,"permission.company.update":`Modifier les paramètres de la société.`,"permission.condition.read":`Consulter les conditions commerciales enregistrées.`,"permission.condition.manage":`Créer et gérer les conditions commerciales.`,"permission.payment.read":`Consulter et exporter les règlements et leurs corrections.`,"permission.integration.manage":`Gérer les intégrations et leurs traitements.`,"permission.client.read":`Consulter les clients.`,"permission.client.create":`Créer des clients.`,"permission.client.update":`Modifier les clients.`,"permission.client.archive":`Archiver les clients.`,"permission.client.access.manage":`Gérer les accès des clients au portail.`,"permission.supplier.read":`Consulter les fournisseurs.`,"permission.supplier.create":`Créer des fournisseurs.`,"permission.supplier.update":`Modifier les fournisseurs.`,"permission.supplier.archive":`Archiver les fournisseurs.`,"permission.supplier-invoice.read":`Consulter les factures fournisseurs.`,"permission.supplier-invoice.create":`Créer des factures fournisseurs.`,"permission.supplier-invoice.update":`Modifier les factures fournisseurs.`,"permission.supplier-invoice.approve":`Approuver ou refuser les factures fournisseurs.`,"permission.supplier-invoice.analyze":`Lancer l’analyse des factures fournisseurs.`,"permission.supplier-invoice.pay":`Enregistrer et gérer les paiements fournisseurs.`,"permission.quote.read":`Consulter les devis.`,"permission.quote.create":`Créer des devis.`,"permission.quote.update":`Modifier les devis.`,"permission.quote.delete":`Supprimer les devis.`,"permission.quote.send":`Créer les liens de signature des devis.`,"permission.quote.sign":`Signer les devis pour le compte d’un client.`,"permission.order.read":`Consulter les commandes.`,"permission.order.create":`Créer des commandes.`,"permission.order.update":`Modifier les commandes.`,"permission.invoice.read":`Consulter les factures.`,"permission.invoice.create":`Créer des factures.`,"permission.invoice.update":`Modifier les factures.`,"permission.invoice.issue":`Émettre les factures.`,"permission.invoice.send":`Envoyer les factures aux clients.`,"permission.invoice.mark-paid":`Marquer les factures comme payées.`,"permission.invoice.void":`Annuler les factures.`,"permission.template.read":`Consulter les modèles de documents.`,"permission.template.select":`Sélectionner les modèles utilisés pour les documents.`,"permission.document.render":`Produire les documents PDF.`,"permission.document.download":`Télécharger les documents produits.`,"permission.user.read":`Consulter les membres et invitations de l’équipe.`,"permission.user.create":`Inviter de nouveaux membres.`,"permission.user.update":`Modifier les accès des membres.`,"permission.role.read":`Consulter les rôles personnalisés.`,"permission.role.manage":`Créer, modifier et supprimer les rôles personnalisés.`,"permission.session.manage":`Consulter et révoquer les sessions actives.`,"permission.api-token.manage":`Créer, consulter et révoquer les jetons d’API.`,"permission.audit.read":`Consulter le journal d’audit.`,"permission.accounting.read":`Consulter les données comptables.`,"permission.accounting.write":`Créer et modifier les données comptables.`,"permission.accounting.validate":`Valider les écritures comptables.`,"permission.accounting.close":`Clôturer et rouvrir les périodes comptables.`,"permission.accounting.export":`Exporter les données comptables.`,"permission.accounting.evidence":`Ajouter des pièces comptables.`,"permission.demo.reset":`Réinitialiser les données de démonstration hors production.`},en:{"permission.group.affair":`Client affairs and projects`,"permission.group.integration":`Connections and external services`,"permission.group.ledger":`Accounting ledger`,"permission.group.invoice":`Invoices, credit notes, and refunds`,"permission.group.email":`Emails, templates, and reminders`,"permission.group.bank":`Bank accounts and transactions`,"permission.group.catalog":`Products and services`,"permission.group.issuer":`Issuer identity`,"permission.group.company":`Company settings`,"permission.group.condition":`Commercial conditions`,"permission.group.payment":`Client payments`,"permission.group.client":`Clients and portal access`,"permission.group.supplier":`Suppliers`,"permission.group.supplier-invoice":`Supplier invoices and payments`,"permission.group.quote":`Quotes and signatures`,"permission.group.order":`Client orders`,"permission.group.template":`Document templates`,"permission.group.document":`Document generation and download`,"permission.group.user":`Members and invitations`,"permission.group.role":`Custom roles`,"permission.group.session":`Active sessions`,"permission.group.api-token":`API tokens`,"permission.group.audit":`Audit log`,"permission.group.accounting":`General accounting`,"permission.group.demo":`Demonstration data`,"permission.affair.read":`View affairs.`,"permission.affair.create":`Create affairs.`,"permission.affair.update":`Update affairs.`,"permission.integration.configure":`Configure connections to external services.`,"permission.ledger.read":`View the accounting ledger.`,"permission.ledger.post":`Post and reverse accounting entries.`,"permission.invoice.credit":`Create credit notes for invoices.`,"permission.invoice.refund":`Record invoice refunds.`,"permission.email.draft.manage":`Create and manage email drafts.`,"permission.email.template.manage":`Create and manage email templates.`,"permission.email.reminder.manage":`Create and manage payment reminders.`,"permission.bank.read":`View bank accounts and transactions.`,"permission.bank.import":`Import bank statements.`,"permission.bank.reconcile":`Reconcile bank transactions.`,"permission.catalog.read":`View the product and service catalog.`,"permission.catalog.manage":`Create and manage products and services.`,"permission.issuer.read":`View the issuer identity.`,"permission.issuer.update":`Update the issuer identity.`,"permission.company.read":`View company settings.`,"permission.company.update":`Update company settings.`,"permission.condition.read":`View saved commercial conditions.`,"permission.condition.manage":`Create and manage commercial conditions.`,"permission.payment.read":`View and export payments and their corrections.`,"permission.integration.manage":`Manage integrations and their processing jobs.`,"permission.client.read":`View clients.`,"permission.client.create":`Create clients.`,"permission.client.update":`Update clients.`,"permission.client.archive":`Archive clients.`,"permission.client.access.manage":`Manage client portal access.`,"permission.supplier.read":`View suppliers.`,"permission.supplier.create":`Create suppliers.`,"permission.supplier.update":`Update suppliers.`,"permission.supplier.archive":`Archive suppliers.`,"permission.supplier-invoice.read":`View supplier invoices.`,"permission.supplier-invoice.create":`Create supplier invoices.`,"permission.supplier-invoice.update":`Update supplier invoices.`,"permission.supplier-invoice.approve":`Approve or reject supplier invoices.`,"permission.supplier-invoice.analyze":`Start supplier invoice analysis.`,"permission.supplier-invoice.pay":`Record and manage supplier payments.`,"permission.quote.read":`View quotes.`,"permission.quote.create":`Create quotes.`,"permission.quote.update":`Update quotes.`,"permission.quote.delete":`Delete quotes.`,"permission.quote.send":`Create signing links for quotes.`,"permission.quote.sign":`Sign quotes on behalf of a client.`,"permission.order.read":`View orders.`,"permission.order.create":`Create orders.`,"permission.order.update":`Update orders.`,"permission.invoice.read":`View invoices.`,"permission.invoice.create":`Create invoices.`,"permission.invoice.update":`Update invoices.`,"permission.invoice.issue":`Issue invoices.`,"permission.invoice.send":`Send invoices to clients.`,"permission.invoice.mark-paid":`Mark invoices as paid.`,"permission.invoice.void":`Void invoices.`,"permission.template.read":`View document templates.`,"permission.template.select":`Select templates used for documents.`,"permission.document.render":`Generate PDF documents.`,"permission.document.download":`Download generated documents.`,"permission.user.read":`View team members and invitations.`,"permission.user.create":`Invite new members.`,"permission.user.update":`Update member access.`,"permission.role.read":`View custom roles.`,"permission.role.manage":`Create, update, and delete custom roles.`,"permission.session.manage":`View and revoke active sessions.`,"permission.api-token.manage":`Create, view, and revoke API tokens.`,"permission.audit.read":`View the audit log.`,"permission.accounting.read":`View accounting data.`,"permission.accounting.write":`Create and update accounting data.`,"permission.accounting.validate":`Validate accounting entries.`,"permission.accounting.close":`Close and reopen accounting periods.`,"permission.accounting.export":`Export accounting data.`,"permission.accounting.evidence":`Add accounting evidence.`,"permission.demo.reset":`Reset demonstration data outside production.`}};var V$1={fr:{"credit.title":`Avoir et remboursements`,"credit.loadError":`Impossible de charger l’avoir et les remboursements. Rechargez ces données avant de continuer.`,"credit.noTransfer":`Ces opérations enregistrent des faits locaux. Aucun virement ni remboursement bancaire n’est exécuté.`,"credit.saved":`Opération enregistrée.`,"credit.reload":`Recharger l’avoir et les remboursements`,"credit.pdf":`Télécharger le PDF de l’avoir`,"credit.refunds":`Remboursements enregistrés`,"credit.refundable":`Encaissements restant à rembourser :`,"credit.amount":`Montant remboursé (EUR)`,"credit.refundedOn":`Date du remboursement effectué`,"credit.reference":`Référence du remboursement`,"credit.recordRefund":`Enregistrer le remboursement effectué`,"credit.allocate":`Imputer sur une facture`,"credit.allocations":`Imputations`,"credit.targetInvoice":`Facture cible`,"credit.allocatedOn":`Date d’imputation`,"credit.cancelReason":`Motif de correction du remboursement`,"credit.cancelled":`Enregistrement annulé :`,"credit.cancelRefund":`Corriger cet enregistrement`,"credit.cancelAllocation":`Annuler l’imputation`,"credit.cancelAllocationHint":`L’annulation restaure la dette client et le solde de la facture cible.`,"credit.fullHint":`L’avoir intégral reprend les lignes et la TVA de la facture émise. Il annule toute sa créance sans modifier la facture ni son PDF.`,"credit.reason":`Motif de l’avoir`,"credit.issue":`Émettre l’avoir intégral`,"credit.create":`Émettre un avoir`,"credit.options":`Choisir le type d’avoir`,"credit.partial":`Avoir partiel`,"credit.full":`Avoir intégral`,"credit.draftHint":`Sélectionnez les quantités à créditer. Enregistrez le brouillon ou émettez ensuite l’avoir définitif.`,"credit.details":`Détails de l’avoir`,"credit.lines":`Lignes créditées`,"credit.linesHint":`Une quantité nulle exclut la ligne. Les quantités déjà créditées ne sont plus disponibles.`,"credit.quantityFor":`Quantité créditée pour {description}`,"credit.availableQuantity":`Disponible : {quantity}`,"credit.noAvailableLines":`Aucune ligne ne reste disponible pour un avoir.`,"credit.addInvoice":`Ajouter une facture du même client`,"credit.selectInvoice":`Sélectionnez une facture`,"credit.add":`Ajouter`,"credit.removeInvoice":`Retirer la facture`,"credit.saveDraft":`Enregistrer le brouillon`,"credit.issueDraft":`Émettre l’avoir`,"credit.editDraft":`Modifier le brouillon d’avoir`,"credit.draft":`Brouillon`,"credit.issued":`Émis`,"credit.readonlyVersion":`Cette version est figée et disponible uniquement en lecture.`,"credit.credited":`Montant couvert par un avoir :`,"credit.confirmIssue":`Émettre cet avoir définitif ? Les factures et leurs règlements seront conservés. Aucun remboursement ne sera exécuté.`,"credit.confirmRefund":`Enregistrer un remboursement déjà effectué ? Cette action ne transfère aucun fonds.`,"credit.confirmCancel":`Annuler cet enregistrement erroné ? Le motif sera conservé. Cette action ne récupère aucun fonds.`,"credit.error":`Le résultat de cette demande reste à confirmer. Consultez l’avoir et les remboursements avant de recommencer.`,"invoice.credit_conflict":`Opération refusée. Vérifiez la facture, l’avoir existant, les encaissements disponibles, la date et la clé de la demande.`,"invoice.credit_request_conflict":`Cette demande correspond à une opération déjà enregistrée avec d’autres données. Vérifiez l’avoir et les remboursements existants.`},en:{"credit.title":`Credit note and refunds`,"credit.loadError":`Unable to load the credit note and refunds. Reload this data before continuing.`,"credit.noTransfer":`These operations record local facts. No bank transfer or refund is executed.`,"credit.saved":`Operation recorded.`,"credit.reload":`Reload the credit note and refunds`,"credit.pdf":`Download credit note PDF`,"credit.refunds":`Recorded refunds`,"credit.refundable":`Receipts still available for refund:`,"credit.amount":`Refunded amount (EUR)`,"credit.refundedOn":`Date of the completed refund`,"credit.reference":`Refund reference`,"credit.recordRefund":`Record completed refund`,"credit.allocate":`Allocate to an invoice`,"credit.allocations":`Allocations`,"credit.targetInvoice":`Target invoice`,"credit.allocatedOn":`Allocation date`,"credit.cancelReason":`Reason for correcting the refund`,"credit.cancelled":`Record cancelled:`,"credit.cancelRefund":`Correct this record`,"credit.cancelAllocation":`Cancel allocation`,"credit.cancelAllocationHint":`Cancellation restores the customer debt and the target invoice balance.`,"credit.fullHint":`The full credit note copies the issued invoice lines and VAT. It cancels the entire debt without changing the invoice or its PDF.`,"credit.reason":`Credit note reason`,"credit.issue":`Issue full credit note`,"credit.create":`Issue a credit note`,"credit.options":`Select the credit note type`,"credit.partial":`Partial credit note`,"credit.full":`Full credit note`,"credit.draftHint":`Select the quantities to credit. Save the draft or issue the final credit note.`,"credit.details":`Credit note details`,"credit.lines":`Credited lines`,"credit.linesHint":`A zero quantity excludes the line. Quantities already credited are unavailable.`,"credit.quantityFor":`Credited quantity for {description}`,"credit.availableQuantity":`Available: {quantity}`,"credit.noAvailableLines":`No line remains available for a credit note.`,"credit.addInvoice":`Add an invoice for this client`,"credit.selectInvoice":`Select an invoice`,"credit.add":`Add`,"credit.removeInvoice":`Remove invoice`,"credit.saveDraft":`Save draft`,"credit.issueDraft":`Issue credit note`,"credit.editDraft":`Edit credit note draft`,"credit.draft":`Draft`,"credit.issued":`Issued`,"credit.readonlyVersion":`This version is frozen and available as read-only.`,"credit.credited":`Amount covered by a credit note:`,"credit.confirmIssue":`Issue this final credit note? The invoices and payments will be kept. No refund will be executed.`,"credit.confirmRefund":`Record a refund that has already occurred? This action transfers no funds.`,"credit.confirmCancel":`Cancel this incorrect record? The reason will be kept. This action recovers no funds.`,"credit.error":`The result of this request is unconfirmed. Check the credit note and refunds before trying again.`,"invoice.credit_conflict":`Operation rejected. Check the invoice, existing credit note, available receipts, date and request key.`,"invoice.credit_request_conflict":`This request refers to an operation already recorded with different data. Check the existing credit note and refunds.`}};var u$2={fr:{group:{title:`Avoirs et remboursements`,description:`Brouillons d’avoirs partiels ou consolidés, émission immuable et enregistrement local des remboursements.`},operations:{invoiceCreditsGet:{summary:`Consulter l’avoir et les remboursements`,description:`Retourne l’avoir intégral, les remboursements conservés et le montant encore remboursable sur les encaissements actifs.`},creditNoteGet:{summary:`Consulter un avoir`,description:`Retourne un brouillon modifiable ou un avoir émis immuable avec ses lignes.`},creditNoteCreate:{summary:`Créer un brouillon d’avoir`,description:`Crée un avoir partiel ou consolidé pour les factures compatibles sélectionnées.`},creditNoteUpdate:{summary:`Modifier un brouillon d’avoir`,description:`Remplace le motif et les lignes d’un brouillon avec contrôle de version.`},creditNoteIssue:{summary:`Émettre un avoir`,description:`Fige les lignes du brouillon et attribue une référence AV-AAAA-NNNNNN.`},invoiceRefundRecord:{summary:`Enregistrer un remboursement effectué`,description:`Enregistre un fait local sans opération bancaire. Exige un avoir et des encaissements disponibles. Refuse les dates futures et antérieures à l’avoir.`},invoiceRefundCancel:{summary:`Corriger un remboursement enregistré`,description:`Annule l’enregistrement avec un motif conservé. Ne récupère aucun fonds et ne modifie pas l’avoir.`},invoiceCreditPdf:{summary:`Télécharger l’avoir`,description:`Génère le PDF au premier accès depuis les données immuables. Conserve ensuite le PDF et contrôle son empreinte SHA-256.`},clientCreditPdf:{summary:`Télécharger son avoir`,description:`Exige une session cliente autorisée et une facture appartenant au client associé au compte.`}}},en:{group:{title:`Credit notes and refunds`,description:`Partial or consolidated credit note drafts, immutable issue, and local refund records.`},operations:{invoiceCreditsGet:{summary:`Read the credit note and refunds`,description:`Returns the full credit note, preserved refunds and the amount still available for refund from active receipts.`},creditNoteGet:{summary:`Read a credit note`,description:`Returns an editable draft or an immutable issued credit note with its lines.`},creditNoteCreate:{summary:`Create a credit note draft`,description:`Creates a partial or consolidated credit note for selected compatible invoices.`},creditNoteUpdate:{summary:`Update a credit note draft`,description:`Replaces the reason and lines of a draft with version control.`},creditNoteIssue:{summary:`Issue a credit note`,description:`Freezes the draft lines and assigns an AV-YYYY-NNNNNN reference.`},invoiceRefundRecord:{summary:`Record a completed refund`,description:`Records a local fact without a bank operation. Requires a credit note and available receipts. Rejects future dates and dates before the credit note.`},invoiceRefundCancel:{summary:`Correct a recorded refund`,description:`Cancels the record with a preserved reason. Recovers no funds and does not change the credit note.`},invoiceCreditPdf:{summary:`Download the credit note`,description:`Generates the PDF on first access from immutable data. Then preserves the PDF and checks its SHA-256 digest.`},clientCreditPdf:{summary:`Download your credit note`,description:`Requires an authorized client session and an invoice owned by the client linked to the account.`}}}};var j$2={fr:{"ledger.bankDate":`Date bancaire`,"ledger.postingDate":`Date comptable`,"ledger.title":`Écritures des débits et commissions`,"ledger.loadError":`Impossible de charger les écritures ou leurs sources. Rechargez ces données avant de continuer.`,"ledger.postUnconfirmed":`La comptabilisation reste à confirmer. Reprenez la même demande sans modifier ses valeurs.`,"ledger.reverseUnconfirmed":`La contrepassation reste à confirmer. Reprenez la même demande sans modifier ses valeurs.`,"ledger.hint":`Choisissez les comptes comptables avec votre comptable. Chaque écriture porte le même montant au débit et au crédit. Aucune TVA n’est déduite et aucun transfert n’est exécuté.`,"ledger.from":`Date de début`,"ledger.to":`Date de fin`,"ledger.load":`Charger la période`,"ledger.export":`Exporter les écritures en CSV`,"ledger.loading":`Chargement des écritures…`,"ledger.post":`Comptabiliser`,"ledger.debitAccount":`Compte à débiter`,"ledger.creditAccount":`Compte à créditer`,"ledger.label":`Libellé`,"ledger.close":`Fermer le formulaire`,"ledger.reverse":`Contrepasser`,"ledger.reason":`Motif de contrepassation`,"ledger.date":`Date de contrepassation`,"ledger.sources":`Débits et commissions de la période`,"ledger.entries":`Écritures de la période`,"ledger.fee":`Commission déduite`,"ledger.debit":`Débit bancaire`,"ledger.posted":`Écriture active :`,"ledger.select":`Préparer une écriture`,"ledger.empty":`Aucun élément dans cette période.`,"ledger.entryId":`Écriture :`,"ledger.actor":`Enregistrée par :`,"ledger.reverses":`Contrepasse :`,"ledger.reversed":`Contrepassée par :`,"ledger.saved":`Écriture enregistrée.`,"ledger.error":`Le résultat de cette demande reste à confirmer. Consultez les écritures avant de recommencer.`,"ledger.conflict":`Opération refusée. Vérifiez les comptes, les dates et l’état de la source. Si la période contient plus de 10 000 éléments, réduisez-la.`,"ledger.confirmPost":`Comptabiliser {amount} au débit du compte {debit} et au crédit du compte {credit} ? La correction exigera une contrepassation.`,"ledger.confirmReverse":`Créer une écriture inverse définitive ? L’écriture initiale sera conservée. Aucun fonds ne sera transféré.`},en:{"ledger.bankDate":`Bank date`,"ledger.postingDate":`Posting date`,"ledger.title":`Debit and fee entries`,"ledger.loadError":`Unable to load entries or their sources. Reload this data before continuing.`,"ledger.postUnconfirmed":`Posting the entry is unconfirmed. Resume the same request without changing its values.`,"ledger.reverseUnconfirmed":`Reversing the entry is unconfirmed. Resume the same request without changing its values.`,"ledger.hint":`Choose ledger accounts with your accountant. Each entry debits and credits the same amount. No VAT is deducted and no transfer is executed.`,"ledger.from":`Start date`,"ledger.to":`End date`,"ledger.load":`Load period`,"ledger.export":`Export entries as CSV`,"ledger.loading":`Loading entries…`,"ledger.post":`Post entry`,"ledger.debitAccount":`Account to debit`,"ledger.creditAccount":`Account to credit`,"ledger.label":`Label`,"ledger.close":`Close form`,"ledger.reverse":`Reverse entry`,"ledger.reason":`Reversal reason`,"ledger.date":`Reversal date`,"ledger.sources":`Debits and fees in the period`,"ledger.entries":`Entries in the period`,"ledger.fee":`Deducted fee`,"ledger.debit":`Bank debit`,"ledger.posted":`Active entry:`,"ledger.select":`Prepare an entry`,"ledger.empty":`No items in this period.`,"ledger.entryId":`Entry:`,"ledger.actor":`Recorded by:`,"ledger.reverses":`Reverses:`,"ledger.reversed":`Reversed by:`,"ledger.saved":`Entry recorded.`,"ledger.error":`The result of this request is unconfirmed. Check the entries before trying again.`,"ledger.conflict":`Operation rejected. Check accounts, dates and source status. If the period contains more than 10,000 items, reduce it.`,"ledger.confirmPost":`Post {amount} to debit account {debit} and credit account {credit}? Corrections will require a reversal.`,"ledger.confirmReverse":`Create a final reverse entry? The original entry will be kept. No funds will be transferred.`}};var p$3={fr:{group:{title:`Écritures bancaires`,description:`Écritures équilibrées des débits importés et commissions déduites. Correction par contrepassation, sans transfert ni calcul de TVA.`},operations:{bankLedgerList:{summary:`Consulter les écritures et leurs sources`,description:`Filtre les dates comptables inclusivement. Refuse une période dépassant 10 000 écritures ou sources. Les commissions exigent une affectation et un encaissement actifs.`},bankLedgerPost:{summary:`Comptabiliser un débit ou une commission`,description:`Reprend le montant et la date de la source. Exige deux comptes distincts. Une source possède au plus une écriture non contrepassée. La clé UUID protège les reprises.`},bankLedgerReverse:{summary:`Contrepasser une écriture`,description:`Crée une écriture immuable avec les comptes inversés. Conserve le motif, l’auteur et la date. Refuse une date future ou antérieure à l’écriture initiale.`},bankLedgerExport:{summary:`Exporter le journal bancaire en CSV`,description:`Produit deux lignes équilibrées par écriture, contrepassations comprises. Le CSV utilise EUR et des montants décimaux exacts. Ce fichier ne constitue pas un FEC.`}}},en:{group:{title:`Bank ledger entries`,description:`Balanced entries for imported debits and deducted fees. Corrections use reversals, without transfers or VAT calculations.`},operations:{bankLedgerList:{summary:`List entries and sources`,description:`Filters inclusive accounting dates. Rejects periods with more than 10,000 entries or sources. Fees require active allocations and receipts.`},bankLedgerPost:{summary:`Post a debit or fee`,description:`Copies the source amount and date. Requires two different accounts. Each source has at most one unreversed entry. A UUID key protects retries.`},bankLedgerReverse:{summary:`Reverse an entry`,description:`Creates an immutable entry with inverted accounts. Preserves the reason, actor and date. Rejects future dates and dates before the original entry.`},bankLedgerExport:{summary:`Export the bank journal as CSV`,description:`Produces two balanced rows per entry, including reversals. Uses EUR and exact decimal amounts. This file is not a French FEC.`}}}};var M$2={fr:{"passkey.title":`Clés d’accès (passkeys)`,"passkey.description":`Connectez-vous avec une clé d’accès et la vérification locale de votre appareil. Le serveur ne reçoit aucune donnée biométrique.`,"passkey.password_notice":`Confirmez votre mot de passe pour ajouter ou retirer une clé. Conservez un moyen de connexion de secours.`,"passkey.name":`Nom de la clé`,"passkey.password":`Mot de passe actuel`,"passkey.add":`Ajouter une clé d’accès`,"passkey.remove":`Retirer`,"passkey.remove_confirm":`Retirer cette clé et révoquer les autres sessions du compte ? La clé restera sur votre appareil.`,"passkey.empty":`Aucune clé d’accès enregistrée.`,"passkey.loading":`Chargement des clés d’accès…`,"passkey.login":`Se connecter avec une clé d’accès`,"passkey.unavailable":`Les clés d’accès nécessitent un navigateur compatible et une connexion HTTPS.`,"passkey.rejected":`La clé d’accès ou la confirmation a été refusée. Recommencez la demande.`,"passkey.error":`La connexion par clé d’accès n’a pas été confirmée. Réessayez ou utilisez votre mot de passe.`,"passkey.loadError":`Impossible de charger les clés d’accès. Rechargez la page pour réessayer.`,"passkey.addUnconfirmed":`L’ajout de la clé d’accès n’a pas été confirmé. Rechargez la page pour vérifier les clés enregistrées.`,"passkey.removeUnconfirmed":`Le retrait de la clé d’accès reste à confirmer. Rechargez la page pour vérifier les clés enregistrées.`,"passkey.added":`Clé d’accès enregistrée.`,"passkey.removed":`Clé retirée. Les autres sessions ont été révoquées.`},en:{"passkey.title":`Passkeys`,"passkey.description":`Sign in with a passkey and local device verification. The server receives no biometric data.`,"passkey.password_notice":`Confirm your password to add or remove a passkey. Keep a backup sign-in method.`,"passkey.name":`Passkey name`,"passkey.password":`Current password`,"passkey.add":`Add a passkey`,"passkey.remove":`Remove`,"passkey.remove_confirm":`Remove this passkey and revoke the account’s other sessions? The passkey will remain on your device.`,"passkey.empty":`No registered passkeys.`,"passkey.loading":`Loading passkeys…`,"passkey.login":`Sign in with a passkey`,"passkey.unavailable":`Passkeys require a compatible browser and HTTPS.`,"passkey.rejected":`The passkey or confirmation was rejected. Start a new request.`,"passkey.error":`Passkey sign-in was not confirmed. Try again or use your password.`,"passkey.loadError":`Unable to load passkeys. Reload the page to try again.`,"passkey.addUnconfirmed":`Adding the passkey was not confirmed. Reload the page to check registered passkeys.`,"passkey.removeUnconfirmed":`Passkey removal is unconfirmed. Reload the page to check registered passkeys.`,"passkey.added":`Passkey registered.`,"passkey.removed":`Passkey removed. Other sessions were revoked.`}};var m$2={fr:{group:{title:`Clés d’accès`,description:`Connexion WebAuthn et gestion des clés du compte connecté.`},operations:{passkeyList:{summary:`Lister ses clés d’accès`,description:`Session navigateur requise. Retourne uniquement les clés du compte connecté, sans leur clé publique.`},passkeyRegisterOptions:{summary:`Préparer une clé d’accès`,description:`Session et mot de passe actuel requis. Le défi expire après cinq minutes et reste lié à cette session. Limite : dix clés par compte.`},passkeyRegisterVerify:{summary:`Enregistrer une clé d’accès`,description:`Vérifie le défi à usage unique, l’origine, le domaine et la vérification locale de l’utilisateur. Le cookie de défi est obligatoire.`},passkeyRemove:{summary:`Retirer une clé d’accès`,description:`Session et mot de passe actuel requis. Retire uniquement une clé du compte connecté et révoque ses autres sessions. Ne supprime pas la clé sur l’appareil.`},passkeyLoginOptions:{summary:`Préparer une connexion par clé`,description:`Crée un défi anonyme à usage unique, valable cinq minutes, lié au navigateur par un cookie HttpOnly. Ne recherche pas de compte par courriel.`},passkeyLoginVerify:{summary:`Se connecter par clé d’accès`,description:`Vérifie la signature, le défi, l’origine, le domaine, le compte et la vérification locale de l’utilisateur. Crée les cookies de session habituels.`}}},en:{group:{title:`Passkeys`,description:`WebAuthn sign-in and passkey management for the current account.`},operations:{passkeyList:{summary:`List your passkeys`,description:`Requires a browser session. Returns only the current account’s passkeys, without their public keys.`},passkeyRegisterOptions:{summary:`Prepare a passkey`,description:`Requires a session and current password. The challenge expires after five minutes and is bound to this session. Limit: ten passkeys per account.`},passkeyRegisterVerify:{summary:`Register a passkey`,description:`Verifies the single-use challenge, origin, domain, and local user verification. Requires the challenge cookie.`},passkeyRemove:{summary:`Remove a passkey`,description:`Requires a session and current password. Removes only a passkey owned by the current account and revokes its other sessions. Does not delete the passkey from the device.`},passkeyLoginOptions:{summary:`Prepare passkey sign-in`,description:`Creates an anonymous single-use challenge, valid for five minutes, bound to the browser through an HttpOnly cookie. Does not look up accounts by email.`},passkeyLoginVerify:{summary:`Sign in with a passkey`,description:`Verifies the signature, challenge, origin, domain, account, and local user verification. Creates the standard session cookies.`}}}};var B$1={fr:{"emailDraft.title":`Brouillons enregistrés`,"emailDraft.save":`Enregistrer le brouillon`,"emailDraft.new":`Nouveau courriel`,"emailDraft.open":`Ouvrir`,"emailDraft.archive":`Archiver`,"emailDraft.saved":`Brouillon enregistré sur le serveur.`,"emailDraft.hint":`Les brouillons peuvent être incomplets. Leur enregistrement ne soumet aucun courriel. Ils restent privés jusqu’à leur soumission.`,"emailDraft.empty":`Aucun brouillon enregistré.`,"emailDraft.unnamed":`Sans objet`,"emailDraft.archiveConfirm":`Archiver ce brouillon et abandonner ses modifications locales éventuelles ? Aucun courriel ne sera soumis.`,"emailDraft.error":`L’opération sur le brouillon a échoué. Votre texte reste dans le formulaire.`,"email_draft.conflict":`Ce brouillon a changé, a été soumis ou la limite de 100 brouillons est atteinte. Rechargez la liste avant de continuer.`,"email_draft.not_found":`Ce brouillon n’est pas accessible à votre compte.`},en:{"emailDraft.title":`Saved drafts`,"emailDraft.save":`Save draft`,"emailDraft.new":`New email`,"emailDraft.open":`Open`,"emailDraft.archive":`Archive`,"emailDraft.saved":`Draft saved on the server.`,"emailDraft.hint":`Drafts can be incomplete. Saving a draft submits no email. Drafts remain private until submission.`,"emailDraft.empty":`No saved drafts.`,"emailDraft.unnamed":`No subject`,"emailDraft.archiveConfirm":`Archive this draft and discard any local changes? No email will be submitted.`,"emailDraft.error":`The draft operation failed. Your text remains in the form.`,"email_draft.conflict":`This draft changed, was submitted, or the limit of 100 drafts was reached. Reload the list before continuing.`,"email_draft.not_found":`This draft is not available to your account.`}};var f$3={fr:{group:{title:`Brouillons de courriels`,description:`Brouillons privés, persistants et versionnés.`},operations:{emailDraftList:{summary:`Lister ses brouillons`,description:`Retourne les brouillons non archivés et non soumis du compte connecté. Les demandes soumises restent dans l’historique des opérations.`},emailDraftSave:{summary:`Enregistrer un brouillon`,description:`Accepte un contenu incomplet. Utilisez un UUID v4 stable comme identifiant. La version attendue vaut zéro à la création. Une soumission commencée bloque toute modification.`},emailDraftArchive:{summary:`Archiver un brouillon`,description:`Vérifie le propriétaire et la version. Conserve le texte et l’historique. N’annule pas une opération déjà soumise.`}}},en:{group:{title:`Email drafts`,description:`Private, persistent and versioned drafts.`},operations:{emailDraftList:{summary:`List your drafts`,description:`Returns the current account’s unarchived and unsubmitted drafts. Submitted requests remain in operation history.`},emailDraftSave:{summary:`Save a draft`,description:`Accepts incomplete content. Use a stable UUID v4 identifier. Expected version is zero on creation. A started submission blocks all further edits.`},emailDraftArchive:{summary:`Archive a draft`,description:`Checks ownership and version. Retains content and history. Does not cancel an operation that was already submitted.`}}}};var H$1={fr:{"integration.unavailable":`Le fournisseur est indisponible.`,"integration.request_conflict":`Le contenu de la demande ou le mode du fournisseur a changé.`,"integration.invalid_request":`La demande ne respecte pas le contrat du fournisseur.`,"integrationRetry.title":`Reprises automatiques`,"integrationRetry.info":`Une demande sans reçu est reprise après une minute, avec le même contenu et le même mode. Cinq tentatives au maximum. Une simulation reste une simulation.`,"integrationRetry.attempts":`Tentatives automatiques`,"integrationRetry.waiting":`Reprise programmée`,"integrationRetry.processing":`Reprise en cours`,"integrationRetry.completed":`Reprise terminée`,"integrationRetry.exhausted":`Tentatives épuisées : intervention nécessaire`,"integrationRetry.blocked":`Reprise bloquée : intervention nécessaire`,"integrationRetry.empty":`Aucune reprise automatique enregistrée.`,"integration.retry_permission":`Le compte initiateur est désactivé ou ne possède plus la permission requise.`,"integration.retry_interrupted":`La tentative a été interrompue ou a dépassé son délai.`,"integration.retry_database":`L’enregistrement de la tentative a échoué.`},en:{"integration.unavailable":`The provider is unavailable.`,"integration.request_conflict":`The request content or provider mode changed.`,"integration.invalid_request":`The request does not meet the provider contract.`,"integrationRetry.title":`Automatic retries`,"integrationRetry.info":`A request without a receipt is retried after one minute with the same content and mode. At most five attempts. Simulation remains simulation.`,"integrationRetry.attempts":`Automatic attempts`,"integrationRetry.waiting":`Retry scheduled`,"integrationRetry.processing":`Retry in progress`,"integrationRetry.completed":`Retry completed`,"integrationRetry.exhausted":`Attempts exhausted: action required`,"integrationRetry.blocked":`Retry blocked: action required`,"integrationRetry.empty":`No automatic retries recorded.`,"integration.retry_permission":`The initiating account is disabled or no longer has the required permission.`,"integration.retry_interrupted":`The attempt was interrupted or exceeded its time limit.`,"integration.retry_database":`Saving the attempt failed.`}};var Q$2={fr:{"reminder.title":`Relances programmées`,"reminder.loadError":`Impossible de charger les relances. Rechargez la liste pour vérifier les demandes enregistrées.`,"reminder.scheduleUnconfirmed":`L’enregistrement de la relance reste à confirmer. Conservez la demande en cours. Reprenez cette même demande.`,"reminder.cancelUnconfirmed":`L’annulation de la relance reste à confirmer. Actualisez les relances pour vérifier son état.`,"reminder.info":`La relance utilise le solde et l’adresse client au moment de sa préparation automatique. Une facture soldée ou annulée ne produit aucun courriel.`,"reminder.content":`La programmation utilise le rappel standard dans la langue actuelle, pas le texte du formulaire. Elle reste indépendante de ce brouillon.`,"reminder.date":`Date et heure locales`,"reminder.schedule":`Programmer la relance`,"reminder.confirm":`Programmer ce rappel standard ? Le mode affiché restera fixé et le serveur vérifiera la facture au moment prévu.`,"reminder.saved":`Relance enregistrée sur le serveur.`,"reminder.cancel":`Annuler la programmation`,"reminder.cancelConfirm":`Annuler cette relance programmée ?`,"reminder.empty":`Aucune relance programmée.`,"reminder.scheduled":`Programmée`,"reminder.cancelled":`Annulée`,"reminder.skipped":`Non soumise`,"reminder.queued":`Préparée : consultez le résultat dans l’historique des courriels et des reprises.`,"reminder.invoice-ineligible":`La facture est soldée, annulée ou son client est désactivé.`,"reminder.recipient-invalid":`L’adresse actuelle du client est invalide.`,"reminder.permission-revoked":`Le compte initiateur est désactivé ou ses permissions ont changé.`,"reminder.mode-changed":`Le mode du fournisseur a changé. Aucun envoi automatique.`,"reminder.error":`Le résultat de la demande concernant cette relance reste à confirmer. Vérifiez son suivi avant de recommencer.`,"reminder.conflict":`Cet identifiant correspond à une autre demande. Le résultat de votre demande reste inconnu. Conservez la demande d’origine.`,"reminder.rejected":`Le serveur a refusé cette programmation avant sa création.`,"reminder.rejected.invoice-ineligible":`Aucune relance créée : la facture n’est plus éligible. Actualisez les factures et choisissez une facture non soldée.`,"reminder.rejected.invoice-changed":`Aucune relance créée : la version de la facture a changé. Actualisez les factures avant de recommencer.`,"reminder.rejected.recipient-invalid":`Aucune relance créée : l’adresse du client est invalide. Corrigez cette adresse avant de recommencer.`,"reminder.rejected.mode-changed":`Aucune relance créée : le mode du fournisseur a changé. Actualisez les accès avant de recommencer.`,"reminder.rejected.date-invalid":`Aucune relance créée : choisissez une date future dans les 366 jours.`,"reminder.rejected.already-scheduled":`Aucune relance créée : cette facture possède déjà une relance programmée. Consultez les relances existantes.`,"reminder.rejected.limit":`Aucune relance créée : la limite de 100 programmations actives est atteinte.`,"reminder.not_found":`Cette relance n’existe pas.`},en:{"reminder.title":`Scheduled reminders`,"reminder.loadError":`Unable to load reminders. Reload the list to check recorded requests.`,"reminder.scheduleUnconfirmed":`Reminder scheduling is unconfirmed. Keep the current request. Resume that same request.`,"reminder.cancelUnconfirmed":`Reminder cancellation is unconfirmed. Refresh reminders to check its status.`,"reminder.info":`The reminder uses the balance and client address at automatic preparation time. A settled or void invoice produces no email.`,"reminder.content":`Scheduling uses the standard reminder in the current language, not the form text. It remains independent of this draft.`,"reminder.date":`Local date and time`,"reminder.schedule":`Schedule reminder`,"reminder.confirm":`Schedule this standard reminder? The displayed mode remains fixed and the server checks the invoice at the scheduled time.`,"reminder.saved":`Reminder saved on the server.`,"reminder.cancel":`Cancel schedule`,"reminder.cancelConfirm":`Cancel this scheduled reminder?`,"reminder.empty":`No scheduled reminders.`,"reminder.scheduled":`Scheduled`,"reminder.cancelled":`Cancelled`,"reminder.skipped":`Not submitted`,"reminder.queued":`Prepared: check the email and retry history for the result.`,"reminder.invoice-ineligible":`The invoice is settled or void, or its client is disabled.`,"reminder.recipient-invalid":`The current client email address is invalid.`,"reminder.permission-revoked":`The initiating account is disabled or its permissions changed.`,"reminder.mode-changed":`The provider mode changed. No automatic submission.`,"reminder.error":`The result of this reminder request is unconfirmed. Check its status before trying again.`,"reminder.conflict":`This identifier belongs to another request. Your request result remains unknown. Keep the original request.`,"reminder.rejected":`The server rejected this schedule before creating it.`,"reminder.rejected.invoice-ineligible":`No reminder created: the invoice is no longer eligible. Refresh the invoices and select an unpaid invoice.`,"reminder.rejected.invoice-changed":`No reminder created: the invoice version changed. Refresh the invoices before trying again.`,"reminder.rejected.recipient-invalid":`No reminder created: the client address is invalid. Correct the address before trying again.`,"reminder.rejected.mode-changed":`No reminder created: the provider mode changed. Refresh access before trying again.`,"reminder.rejected.date-invalid":`No reminder created: select a future time within 366 days.`,"reminder.rejected.already-scheduled":`No reminder created: this invoice already has a scheduled reminder. Check the existing reminders.`,"reminder.rejected.limit":`No reminder created: the limit of 100 active schedules has been reached.`,"reminder.not_found":`This reminder does not exist.`}};var g$1={fr:{group:{title:`Relances programmées`,description:`Rappels de paiement ponctuels, persistants et annulables avant leur préparation.`},operations:{reminderList:{summary:`Lister les relances programmées`,description:`Retourne 100 relances, avec priorité aux programmations actives. Le résultat externe reste dans l’opération associée.`},reminderCreate:{summary:`Programmer une relance de facture`,description:`Utilisez un UUID v4 stable. Exige une facture émise avec un solde positif et une date future dans les 366 jours. Le serveur relit le solde et le destinataire à la date prévue.`},reminderCancel:{summary:`Annuler une relance programmée`,description:`Annule uniquement une relance encore programmée. Une relance déjà préparée possède une opération indépendante qui ne peut pas être annulée par cette route.`}}},en:{group:{title:`Scheduled reminders`,description:`Persistent, one-time payment reminders, cancellable before preparation.`},operations:{reminderList:{summary:`List scheduled reminders`,description:`Returns 100 reminders, with active schedules first. The linked operation contains the external result.`},reminderCreate:{summary:`Schedule an invoice reminder`,description:`Use a stable UUID v4. Requires an issued invoice with a positive balance and a future time within 366 days. The server reads the balance and recipient again at the scheduled time.`},reminderCancel:{summary:`Cancel a scheduled reminder`,description:`Cancels only a reminder that is still scheduled. A prepared reminder has an independent operation that this route cannot cancel.`}}}};var G$1={fr:{"emailTemplate.title":`Modèles de courriels`,"emailTemplate.hint":`Les modèles partagent uniquement l’objet et le texte entre les comptes autorisés. Leur utilisation conserve le destinataire et la référence du formulaire.`,"emailTemplate.save":`Créer un modèle avec ce texte`,"emailTemplate.update":`Mettre à jour le modèle ouvert`,"emailTemplate.use":`Utiliser ce modèle`,"emailTemplate.empty":`Aucun modèle enregistré.`,"emailTemplate.saved":`Modèle enregistré. Le courriel du formulaire n’a pas été soumis.`,"emailTemplate.applied":`Texte du modèle copié. Vérifiez le destinataire, la référence et le contenu avant de soumettre le courriel.`,"emailTemplate.archiveConfirm":`Archiver ce modèle partagé ? Les courriels et brouillons existants restent inchangés.`,"emailTemplate.updateConfirm":`Remplacer le texte du modèle partagé par celui du formulaire ?`,"emailTemplate.error":`L’opération sur le modèle a échoué. Le texte du formulaire est conservé.`,"email_template.conflict":`Ce modèle a changé, a été archivé ou la limite de 100 modèles est atteinte. Rechargez la liste.`,"email_template.not_found":`Ce modèle n’existe pas.`},en:{"emailTemplate.title":`Email templates`,"emailTemplate.hint":`Templates share only the subject and body between authorized accounts. Using a template preserves the form’s recipient and reference.`,"emailTemplate.save":`Create a template from this text`,"emailTemplate.update":`Update the open template`,"emailTemplate.use":`Use this template`,"emailTemplate.empty":`No saved templates.`,"emailTemplate.saved":`Template saved. The email in the form was not submitted.`,"emailTemplate.applied":`Template text copied. Check the recipient, reference, and content before submitting the email.`,"emailTemplate.archiveConfirm":`Archive this shared template? Existing emails and drafts remain unchanged.`,"emailTemplate.updateConfirm":`Replace the shared template text with the form text?`,"emailTemplate.error":`The template operation failed. The form text is preserved.`,"email_template.conflict":`This template changed, was archived, or the limit of 100 templates was reached. Reload the list.`,"email_template.not_found":`This template does not exist.`}};var v$3={fr:{group:{title:`Modèles de courriels`,description:`Modèles partagés, versionnés et archivables. Texte brut ou formaté sans exécution de variables.`},operations:{emailTemplateList:{summary:`Lister les modèles de courriels`,description:`Retourne les modèles actifs partagés entre les comptes autorisés. Aucun destinataire n’est conservé dans un modèle.`},emailTemplateSave:{summary:`Enregistrer un modèle de courriel`,description:`Utilisez un UUID v4 stable et la version zéro à la création. Les mises à jour vérifient la version attendue. Limite de 100 modèles actifs. Aucun envoi.`},emailTemplateArchive:{summary:`Archiver un modèle de courriel`,description:`Vérifie la version attendue. Conserve le contenu et l’audit. Ne modifie aucun brouillon ou courriel existant.`}}},en:{group:{title:`Email templates`,description:`Shared, versioned templates with archival. Plain or formatted text without variable execution.`},operations:{emailTemplateList:{summary:`List email templates`,description:`Returns active templates shared between authorized accounts. Templates store no recipient.`},emailTemplateSave:{summary:`Save an email template`,description:`Use a stable UUID v4 and version zero on creation. Updates check the expected version. Limit of 100 active templates. Sends nothing.`},emailTemplateArchive:{summary:`Archive an email template`,description:`Checks the expected version. Preserves content and audit history. Changes no existing draft or email.`}}}};var K$2={fr:{"adminPages.preferencesHint":`Choisissez le thème, la langue et la présentation des messages. Ces préférences suivent votre compte.`,"adminPages.theme":`Thème`,"adminPages.lightTheme":`Clair`,"adminPages.darkTheme":`Sombre`,"adminPages.applyPreferences":`Appliquer les préférences`,"adminPages.preferencesApplied":`Préférences enregistrées.`,"adminPages.preferencesError":`Impossible d’enregistrer les préférences.`,"adminPages.preferencesInvalid":`Choisissez une valeur dans chaque liste.`,"adminPages.flashMode":`Présentation des messages`,"adminPages.flashInline":`Dans la page`,"adminPages.flashToast":`Notifications en haut`,"adminPages.flashSnack":`Notifications en bas`,"adminPages.closePermissions":`Fermer les permissions`,"adminPages.conditionsCount.one":`{count} modèle de conditions`,"adminPages.conditionsCount.other":`{count} modèles de conditions`,"adminPages.tokensCount.one":`{count} jeton affiché sur {total}.`,"adminPages.tokensCount.other":`{count} jetons affichés sur {total}.`,"adminPages.membersCount.one":`{count} compte affiché sur {total}.`,"adminPages.membersCount.other":`{count} comptes affichés sur {total}.`,"adminPages.invitationsCount.one":`{count} invitation affichée sur {total}.`,"adminPages.invitationsCount.other":`{count} invitations affichées sur {total}.`},en:{"adminPages.preferencesHint":`Choose the theme, language, and message presentation. These preferences follow your account.`,"adminPages.theme":`Theme`,"adminPages.lightTheme":`Light`,"adminPages.darkTheme":`Dark`,"adminPages.applyPreferences":`Apply preferences`,"adminPages.preferencesApplied":`Preferences saved.`,"adminPages.preferencesError":`Unable to save preferences.`,"adminPages.preferencesInvalid":`Choose a value from each list.`,"adminPages.flashMode":`Message presentation`,"adminPages.flashInline":`In the page`,"adminPages.flashToast":`Notifications at the top`,"adminPages.flashSnack":`Notifications at the bottom`,"adminPages.closePermissions":`Close permissions`,"adminPages.conditionsCount.one":`{count} terms template`,"adminPages.conditionsCount.other":`{count} terms templates`,"adminPages.tokensCount.one":`{count} token displayed out of {total} loaded.`,"adminPages.tokensCount.other":`{count} tokens displayed out of {total} loaded.`,"adminPages.membersCount.one":`{count} account displayed out of {total} loaded.`,"adminPages.membersCount.other":`{count} accounts displayed out of {total} loaded.`,"adminPages.invitationsCount.one":`{count} invitation displayed out of {total} loaded.`,"adminPages.invitationsCount.other":`{count} invitations displayed out of {total} loaded.`}};var Y$2={fr:{"referenceEditor.catalogIntro":`La prestation sera enregistrée dans le catalogue, puis ajoutée au devis. Le devis reste ouvert.`,"referenceEditor.conditionsIntro":`Le modèle sera enregistré, puis appliqué au devis. Le remplacement de conditions existantes demande une confirmation.`,"referenceEditor.saveCatalog":`Créer et ajouter au devis`,"referenceEditor.saveConditions":`Créer et appliquer au devis`,"referenceEditor.conditionsSaved":`Le modèle de conditions est enregistré.`,"referenceEditor.catalogUncertain":`La réponse manque. Fermez cet éditeur, puis vérifiez le catalogue avant de créer une autre prestation.`,"referenceEditor.conditionsUncertain":`La réponse manque. Fermez cet éditeur, puis vérifiez les modèles disponibles avant de créer un autre modèle.`,"referenceEditor.leaveUncertain":`Fermer cet éditeur ? La création reste incertaine. Vérifiez les éléments disponibles avant une nouvelle création.`,"referenceEditor.unsavedConditions":`Abandonner les modifications non enregistrées de ce modèle de conditions ?`},en:{"referenceEditor.catalogIntro":`The service will be saved in the catalog, then added to the quote. The quote stays open.`,"referenceEditor.conditionsIntro":`The template will be saved, then applied to the quote. Replacing existing terms requires confirmation.`,"referenceEditor.saveCatalog":`Create and add to quote`,"referenceEditor.saveConditions":`Create and apply to quote`,"referenceEditor.conditionsSaved":`The terms template is saved.`,"referenceEditor.catalogUncertain":`The response is missing. Close this editor, then check the catalog before creating another service.`,"referenceEditor.conditionsUncertain":`The response is missing. Close this editor, then check the available templates before creating another template.`,"referenceEditor.leaveUncertain":`Close this editor? The creation is still uncertain. Check the available items before creating another one.`,"referenceEditor.unsavedConditions":`Discard the unsaved changes to this terms template?`}};var J$2={fr:{"entityList.invoices.one":`{count} facture`,"entityList.invoices.other":`{count} factures`,"entityList.credits.one":`{count} avoir`,"entityList.credits.other":`{count} avoirs`,"entityList.receipts.one":`{count} encaissement`,"entityList.receipts.other":`{count} encaissements`,"entityList.refunds.one":`{count} remboursement`,"entityList.refunds.other":`{count} remboursements`,"entityList.affairs.one":`{count} affaire`,"entityList.affairs.other":`{count} affaires`,"entityList.tests.one":`{count} test`,"entityList.tests.other":`{count} tests`},en:{"entityList.invoices.one":`{count} invoice`,"entityList.invoices.other":`{count} invoices`,"entityList.credits.one":`{count} credit note`,"entityList.credits.other":`{count} credit notes`,"entityList.receipts.one":`{count} receipt`,"entityList.receipts.other":`{count} receipts`,"entityList.refunds.one":`{count} refund`,"entityList.refunds.other":`{count} refunds`,"entityList.affairs.one":`{count} affair`,"entityList.affairs.other":`{count} affairs`,"entityList.tests.one":`{count} test`,"entityList.tests.other":`{count} tests`}};var $$2={fr:{"clientTables.affairSearch":`Rechercher une affaire`,"clientTables.documentSearch":`Rechercher un document`,"clientTables.accessSearch":`Rechercher un accès par e-mail`,"clientTables.affairStatus":`Statut du devis`,"clientTables.documentType":`Type de document`,"clientTables.date":`Date`,"clientTables.updatedAt":`Modifié le`,"clientTables.reference":`Référence`,"clientTables.title":`Titre`,"clientTables.affairNoMatches":`Aucune affaire ne correspond aux critères`,"clientTables.documentNoMatches":`Aucun document ne correspond aux critères`,"clientTables.accessNoMatches":`Aucun accès ne correspond aux critères`,"clientTables.affairCount.one":`{count} affaire`,"clientTables.affairCount.other":`{count} affaires`,"clientTables.documentCount.one":`{count} document`,"clientTables.documentCount.other":`{count} documents`,"clientTables.accessCount.one":`{count} accès`,"clientTables.accessCount.other":`{count} accès`},en:{"clientTables.affairSearch":`Search affairs`,"clientTables.documentSearch":`Search documents`,"clientTables.accessSearch":`Search access accounts by email`,"clientTables.affairStatus":`Quote status`,"clientTables.documentType":`Document type`,"clientTables.date":`Date`,"clientTables.updatedAt":`Updated on`,"clientTables.reference":`Reference`,"clientTables.title":`Title`,"clientTables.affairNoMatches":`No affairs match the criteria`,"clientTables.documentNoMatches":`No documents match the criteria`,"clientTables.accessNoMatches":`No access accounts match the criteria`,"clientTables.affairCount.one":`{count} affair`,"clientTables.affairCount.other":`{count} affairs`,"clientTables.documentCount.one":`{count} document`,"clientTables.documentCount.other":`{count} documents`,"clientTables.accessCount.one":`{count} access account`,"clientTables.accessCount.other":`{count} access accounts`}};var X$2={fr:{"commercialHeader.quoteDescription":`Devis pour {client}.`,"commercialHeader.orderDescription":`Commande pour {client}.`,"commercialHeader.invoiceDescription":`Facture pour {client}.`,"commercialHeader.affairDescription":`Affaire pour {client}.`,"commercialHeader.relatedDocuments":`Documents liés`,"commercialHeader.draftInvoice":`Facture brouillon`,"commercialHeader.savedVersion":`Version enregistrée : {version}`,"commercialHeader.acceptedVersion":`Devis accepté : version {version}`},en:{"commercialHeader.quoteDescription":`Quote for {client}.`,"commercialHeader.orderDescription":`Order for {client}.`,"commercialHeader.invoiceDescription":`Invoice for {client}.`,"commercialHeader.affairDescription":`Business case for {client}.`,"commercialHeader.relatedDocuments":`Related documents`,"commercialHeader.draftInvoice":`Draft invoice`,"commercialHeader.savedVersion":`Saved version: {version}`,"commercialHeader.acceptedVersion":`Accepted quote: version {version}`}};var Z$2={fr:{"teamInvitation.uncertain":`Le résultat de l’invitation reste inconnu. Réessayez avec la même demande pour récupérer le lien sans créer une autre invitation.`,"teamInvitation.retry":`Réessayer la même invitation`},en:{"teamInvitation.uncertain":`The invitation result is unknown. Retry the same request to retrieve the link without creating another invitation.`,"teamInvitation.retry":`Retry the same invitation`}};var ee$2={fr:{"settingsHeader.conditionDescription":`Préparez des conditions réutilisables dans vos devis.`,"settingsHeader.invitationDescription":`Créez un lien d’invitation avec le profil d’accès du membre.`,"settingsHeader.tokenDescription":`Définissez le nom, l’expiration et les permissions du jeton API.`,"settingsHeader.simulationsDescription":`Vérifiez les intégrations en mode simulation.`,"settingsHeader.businessCardDescription":`Préparez votre carte de visite et ses versions pour l’impression.`},en:{"settingsHeader.conditionDescription":`Prepare reusable conditions for your quotes.`,"settingsHeader.invitationDescription":`Create an invitation link with the member’s access profile.`,"settingsHeader.tokenDescription":`Set the API token name, expiration and permissions.`,"settingsHeader.simulationsDescription":`Check integrations in simulation mode.`,"settingsHeader.businessCardDescription":`Prepare your business card and its versions for printing.`}};var ie$1={fr:{"documentText.formatting":`Mise en forme des conditions`,"documentText.structure":`Paragraphes et titres`,"documentText.emphasis":`Style du texte`,"documentText.lists":`Listes`,"documentText.history":`Historique des modifications`,"documentText.paragraph":`Paragraphe`,"documentText.heading":`Titre`,"documentText.subheading":`Sous-titre`,"documentText.bold":`Gras`,"documentText.italic":`Italique`,"documentText.bulletList":`Liste à puces`,"documentText.orderedList":`Liste numérotée`,"documentText.undo":`Annuler la modification`,"documentText.redo":`Rétablir la modification`,"documentText.placement":`Emplacement dans le PDF`,"documentText.inline":`À la suite du tableau et des totaux`,"documentText.newPage":`Commencer sur une nouvelle page`},en:{"documentText.formatting":`Terms formatting`,"documentText.structure":`Paragraphs and headings`,"documentText.emphasis":`Text style`,"documentText.lists":`Lists`,"documentText.history":`Change history`,"documentText.paragraph":`Paragraph`,"documentText.heading":`Heading`,"documentText.subheading":`Subheading`,"documentText.bold":`Bold`,"documentText.italic":`Italic`,"documentText.bulletList":`Bullet list`,"documentText.orderedList":`Numbered list`,"documentText.undo":`Undo change`,"documentText.redo":`Redo change`,"documentText.placement":`Placement in the PDF`,"documentText.inline":`After the table and totals`,"documentText.newPage":`Start on a new page`}};var te$1={fr:{"supplier.title":`Fournisseurs`,"supplier.listIntro":`Gérez les coordonnées et les paramètres de paiement de vos fournisseurs.`,"supplier.create":`Créer un fournisseur`,"supplier.tabs":`États des fournisseurs`,"supplier.tab.active":`Actifs`,"supplier.tab.archived":`Archivés`,"supplier.tab.all":`Tous`,"supplier.search":`Rechercher un fournisseur`,"supplier.clearSearch":`Effacer la recherche`,"supplier.loading":`Chargement des fournisseurs…`,"supplier.loadingDetail":`Chargement du fournisseur…`,"supplier.error":`Impossible de charger ou d’enregistrer le fournisseur.`,"supplier.empty":`Aucun fournisseur`,"supplier.emptyIntro":`Créez un fournisseur pour enregistrer ses coordonnées de paiement.`,"supplier.noMatches":`Aucun fournisseur trouvé`,"supplier.changeSearch":`Modifiez ou effacez votre recherche.`,"supplier.count.one":`{count} fournisseur`,"supplier.count.other":`{count} fournisseurs`,"supplier.name":`Nom`,"supplier.contact":`Contact`,"supplier.country":`Pays`,"supplier.currency":`Devise par défaut`,"supplier.paymentTerms":`Délai de paiement`,"supplier.paymentTermsDays":`{count} jours`,"supplier.status":`État`,"supplier.active":`Actif`,"supplier.archived":`Archivé`,"supplier.notProvided":`Non renseigné`,"supplier.backToList":`Retour aux fournisseurs`,"supplier.detailIntro":`Coordonnées, identité légale et paramètres de paiement.`,"supplier.edit":`Modifier`,"supplier.archive":`Archiver`,"supplier.reactivate":`Réactiver`,"supplier.confirmArchive":`Archiver ce fournisseur\xA0?`,"supplier.confirmReactivate":`Réactiver ce fournisseur\xA0?`,"supplier.identity":`Identité et contact`,"supplier.registrationNumber":`Numéro d’immatriculation`,"supplier.vatNumber":`Numéro de TVA`,"supplier.taxTreatment":`Régime fiscal`,"supplier.taxTreatment.france":`France`,"supplier.taxTreatment.eu":`Union européenne — autoliquidation`,"supplier.taxTreatment.import":`Hors Union européenne — importation`,"supplier.taxTreatment.local":`Taxe locale étrangère`,"supplier.viesValidatedAt":`Validation VIES`,"supplier.tax_invalid":`Vérifiez le régime fiscal et les identifiants fiscaux.`,"supplier.vies_unavailable":`Le service VIES ne peut pas valider ce numéro de TVA.`,"supplier.email":`Courriel`,"supplier.phone":`Téléphone`,"supplier.address":`Adresse`,"supplier.payment":`Paiement`,"supplier.iban":`IBAN`,"supplier.bic":`BIC`,"supplier.createTitle":`Créer un fournisseur`,"supplier.createIntro":`Saisissez les informations utilisées pour les achats et les paiements.`,"supplier.editTitle":`Modifier le fournisseur`,"supplier.editIntro":`Actualisez les coordonnées et les paramètres de paiement.`,"supplier.cancel":`Annuler`,"supplier.save":`Enregistrer`,"supplier.saving":`Enregistrement…`,"supplier.unsavedChanges":`Abandonner les modifications du fournisseur\xA0?`,"supplier.archivedEdit":`Réactivez ce fournisseur avant de le modifier.`,"supplier.nameInvalid":`Saisissez un nom de 160 caractères maximum.`,"supplier.emailInvalid":`Saisissez un courriel valide.`,"supplier.phoneInvalid":`Saisissez un numéro de téléphone valide.`,"supplier.currencyInvalid":`Saisissez un code de devise ISO à trois lettres majuscules.`,"supplier.paymentTermsInvalid":`Saisissez un délai compris entre 0 et 365 jours.`,"supplier.ibanInvalid":`Saisissez un IBAN valide.`,"supplier.bicInvalid":`Saisissez un BIC valide.`,"supplier.fieldInvalid":`Vérifiez cette valeur.`,"supplier.addressLine1":`Adresse`,"supplier.addressLine2":`Complément d’adresse`,"supplier.postalCode":`Code postal`,"supplier.city":`Ville`,"supplier.not_found":`Ce fournisseur est introuvable.`,"supplier.version_conflict":`Le fournisseur a changé. Actualisez la page avant de recommencer.`,"supplier.creation_conflict":`Cette demande de création a déjà été utilisée avec d’autres données.`,"backOffice.navigation.suppliers":`Fournisseurs`,"page.back_office_suppliers":`Fournisseurs | Back office`,"page.back_office_supplier_detail":`Fournisseur | Back office`,"page.description.back_office_suppliers":`Liste et gestion des fournisseurs.`,"page.description.back_office_supplier_detail":`Coordonnées et paramètres du fournisseur.`},en:{"supplier.title":`Suppliers`,"supplier.listIntro":`Manage supplier contact details and payment settings.`,"supplier.create":`Create supplier`,"supplier.tabs":`Supplier states`,"supplier.tab.active":`Active`,"supplier.tab.archived":`Archived`,"supplier.tab.all":`All`,"supplier.search":`Search suppliers`,"supplier.clearSearch":`Clear search`,"supplier.loading":`Loading suppliers…`,"supplier.loadingDetail":`Loading supplier…`,"supplier.error":`The supplier cannot be loaded or saved.`,"supplier.empty":`No suppliers`,"supplier.emptyIntro":`Create a supplier to store its payment details.`,"supplier.noMatches":`No suppliers found`,"supplier.changeSearch":`Change or clear your search.`,"supplier.count.one":`{count} supplier`,"supplier.count.other":`{count} suppliers`,"supplier.name":`Name`,"supplier.contact":`Contact`,"supplier.country":`Country`,"supplier.currency":`Default currency`,"supplier.paymentTerms":`Payment terms`,"supplier.paymentTermsDays":`{count} days`,"supplier.status":`Status`,"supplier.active":`Active`,"supplier.archived":`Archived`,"supplier.notProvided":`Not provided`,"supplier.backToList":`Back to suppliers`,"supplier.detailIntro":`Contact details, legal identity, and payment settings.`,"supplier.edit":`Edit`,"supplier.archive":`Archive`,"supplier.reactivate":`Reactivate`,"supplier.confirmArchive":`Archive this supplier?`,"supplier.confirmReactivate":`Reactivate this supplier?`,"supplier.identity":`Identity and contact`,"supplier.registrationNumber":`Registration number`,"supplier.vatNumber":`VAT number`,"supplier.taxTreatment":`Tax treatment`,"supplier.taxTreatment.france":`France`,"supplier.taxTreatment.eu":`European Union — reverse charge`,"supplier.taxTreatment.import":`Outside European Union — import`,"supplier.taxTreatment.local":`Foreign local tax`,"supplier.viesValidatedAt":`VIES validation`,"supplier.tax_invalid":`Check the tax treatment and tax identifiers.`,"supplier.vies_unavailable":`The VIES service cannot validate this VAT number.`,"supplier.email":`Email`,"supplier.phone":`Phone`,"supplier.address":`Address`,"supplier.payment":`Payment`,"supplier.iban":`IBAN`,"supplier.bic":`BIC`,"supplier.createTitle":`Create supplier`,"supplier.createIntro":`Enter the information used for purchases and payments.`,"supplier.editTitle":`Edit supplier`,"supplier.editIntro":`Update contact details and payment settings.`,"supplier.cancel":`Cancel`,"supplier.save":`Save`,"supplier.saving":`Saving…`,"supplier.unsavedChanges":`Discard the supplier changes?`,"supplier.archivedEdit":`Reactivate this supplier before you edit it.`,"supplier.nameInvalid":`Enter a name with at most 160 characters.`,"supplier.emailInvalid":`Enter a valid email address.`,"supplier.phoneInvalid":`Enter a valid phone number.`,"supplier.currencyInvalid":`Enter a three-letter uppercase ISO currency code.`,"supplier.paymentTermsInvalid":`Enter a term from 0 through 365 days.`,"supplier.ibanInvalid":`Enter a valid IBAN.`,"supplier.bicInvalid":`Enter a valid BIC.`,"supplier.fieldInvalid":`Check this value.`,"supplier.addressLine1":`Address`,"supplier.addressLine2":`Address complement`,"supplier.postalCode":`Postal code`,"supplier.city":`City`,"supplier.not_found":`This supplier cannot be found.`,"supplier.version_conflict":`The supplier changed. Refresh the page before you try again.`,"supplier.creation_conflict":`This creation request was already used with different data.`,"backOffice.navigation.suppliers":`Suppliers`,"page.back_office_suppliers":`Suppliers | Back office`,"page.back_office_supplier_detail":`Supplier | Back office`,"page.description.back_office_suppliers":`Supplier list and management.`,"page.description.back_office_supplier_detail":`Supplier contact details and settings.`}};var ne$1={fr:{"company.title":`Paramètres de la société`,"company.intro":`Configurez la juridiction, la comptabilité, les modules et la conservation.`,"company.loading":`Chargement des paramètres de la société…`,"company.error":`Impossible de charger ou d’enregistrer les paramètres de la société.`,"company.saved":`Les paramètres de la société sont enregistrés.`,"company.legal":`Juridiction et devise`,"company.jurisdiction":`Juridiction`,"company.functionalCurrency":`Devise fonctionnelle`,"company.accountingInitialized":`La comptabilité est initialisée. La devise fonctionnelle est définitive.`,"company.accountingNotInitialized":`Vous pouvez modifier la devise avant l’initialisation comptable.`,"company.fiscalYear":`Exercice comptable`,"company.fiscalMonth":`Mois de début`,"company.fiscalDay":`Jour de début`,"company.fiscalDuration":`Un nouvel exercice dure douze mois par défaut.`,"company.modules":`Modules activés`,"company.module.sales":`Ventes`,"company.module.purchasing":`Achats`,"company.module.banking":`Banque`,"company.module.accounting":`Comptabilité`,"company.module.tax":`Fiscalité France`,"company.module.ai":`Analyse assistée`,"company.module.demonstration":`Démonstration`,"company.module.sales.hint":`Gère les clients, devis, commandes, factures et avoirs.`,"company.module.purchasing.hint":`Gère les fournisseurs, factures d’achat et paiements.`,"company.module.banking.hint":`Gère les relevés bancaires, transactions et rapprochements.`,"company.module.accounting.hint":`Gère les écritures, journaux, exercices et contrôles comptables.`,"company.module.tax.hint":`Gère les règles fiscales françaises et les déclarations de TVA.`,"company.module.ai.hint":`Active les analyses assistées pour les documents compatibles.`,"company.module.demonstration.hint":`Autorise la réinitialisation protégée des données hors production.`,"company.retention":`Conservation`,"company.retentionYears":`Durée de conservation en années`,"company.retentionExplanation":`La durée minimale de dix ans couvre les obligations françaises pour les pièces comptables.`,"company.save":`Enregistrer`,"company.initializeAccounting":`Initialiser la comptabilité`,"company.initializeConfirm":`Initialiser la comptabilité\xA0? La devise fonctionnelle deviendra définitive.`,"company.unsavedChanges":`Abandonner les modifications des paramètres de la société\xA0?`,"company.settings_conflict":`Les paramètres ont changé. Actualisez la page avant de recommencer.`,"company.functional_currency_locked":`La devise fonctionnelle est définitive après l’initialisation comptable.`,"company.accounting_already_initialized":`La comptabilité est déjà initialisée.`,"company.exchangeRates":`Taux de change`,"company.exchangeRatesHint":`Un taux indique les unités de devise étrangère pour une unité de devise fonctionnelle.`,"company.exchangeRateImport":`Importer les taux BCE`,"company.exchangeRateOverride":`Enregistrer la surcharge`,"company.exchangeRateDate":`Date du taux`,"company.exchangeRateCurrency":`Devise étrangère`,"company.exchangeRateValue":`Taux`,"company.exchangeRatePair":`Paire`,"company.exchangeRateSource":`Source`,"company.exchangeRateEcb":`BCE`,"company.exchangeRateManual":`Surcharge manuelle`,"company.exchangeRateEmpty":`Aucun taux de change.`,"company.exchangeRateInvalid":`Saisissez une date, une devise et un taux positif valides.`,"company.exchange_rate_conflict":`La devise étrangère doit différer de la devise fonctionnelle.`,"company.exchange_rate_import_failed":`L’import des taux de la BCE a échoué.`},en:{"company.title":`Company settings`,"company.intro":`Configure jurisdiction, accounting, modules, and retention.`,"company.loading":`Loading company settings…`,"company.error":`The company settings cannot be loaded or saved.`,"company.saved":`The company settings are saved.`,"company.legal":`Jurisdiction and currency`,"company.jurisdiction":`Jurisdiction`,"company.functionalCurrency":`Functional currency`,"company.accountingInitialized":`Accounting is initialized. The functional currency is permanent.`,"company.accountingNotInitialized":`You can change the currency before accounting initialization.`,"company.fiscalYear":`Fiscal year`,"company.fiscalMonth":`Start month`,"company.fiscalDay":`Start day`,"company.fiscalDuration":`A new fiscal year lasts twelve months by default.`,"company.modules":`Enabled modules`,"company.module.sales":`Sales`,"company.module.purchasing":`Purchasing`,"company.module.banking":`Banking`,"company.module.accounting":`Accounting`,"company.module.tax":`France tax`,"company.module.ai":`Assisted analysis`,"company.module.demonstration":`Demonstration`,"company.module.sales.hint":`Manages clients, quotes, orders, invoices, and credit notes.`,"company.module.purchasing.hint":`Manages suppliers, purchase invoices, and payments.`,"company.module.banking.hint":`Manages bank statements, transactions, and reconciliations.`,"company.module.accounting.hint":`Manages entries, journals, fiscal years, and accounting controls.`,"company.module.tax.hint":`Manages French tax rules and VAT returns.`,"company.module.ai.hint":`Enables assisted analysis for compatible documents.`,"company.module.demonstration.hint":`Allows protected data resets outside production.`,"company.retention":`Retention`,"company.retentionYears":`Retention period in years`,"company.retentionExplanation":`The ten-year minimum covers French retention rules for accounting records.`,"company.save":`Save`,"company.initializeAccounting":`Initialize accounting`,"company.initializeConfirm":`Initialize accounting? The functional currency will become permanent.`,"company.unsavedChanges":`Discard the company settings changes?`,"company.settings_conflict":`The settings changed. Refresh the page before you try again.`,"company.functional_currency_locked":`The functional currency is permanent after accounting initialization.`,"company.accounting_already_initialized":`Accounting is already initialized.`,"company.exchangeRates":`Exchange rates`,"company.exchangeRatesHint":`A rate gives foreign currency units for one functional currency unit.`,"company.exchangeRateImport":`Import ECB rates`,"company.exchangeRateOverride":`Save override`,"company.exchangeRateDate":`Rate date`,"company.exchangeRateCurrency":`Foreign currency`,"company.exchangeRateValue":`Rate`,"company.exchangeRatePair":`Pair`,"company.exchangeRateSource":`Source`,"company.exchangeRateEcb":`ECB`,"company.exchangeRateManual":`Manual override`,"company.exchangeRateEmpty":`No exchange rates.`,"company.exchangeRateInvalid":`Enter a valid date, currency, and positive rate.`,"company.exchange_rate_conflict":`The foreign currency must differ from the functional currency.`,"company.exchange_rate_import_failed":`The ECB exchange-rate import failed.`}};var ae$1={fr:{"supplierInvoice.title":`Factures fournisseurs`,"supplierInvoice.intro":`Contrôlez et approuvez les factures reçues avant leur paiement.`,"supplierInvoice.create":`Saisir une facture`,"supplierInvoice.creditAction":`Créer un avoir fournisseur`,"supplierInvoice.kind":`Type de document`,"supplierInvoice.kind.invoice":`Facture fournisseur`,"supplierInvoice.kind.credit":`Avoir fournisseur`,"supplierInvoice.sourceInvoice":`Facture d’origine`,"supplierInvoice.openSourceInvoice":`Ouvrir la facture d’origine`,"supplierInvoice.evidence":`Pièces justificatives`,"supplierInvoice.evidenceAdd":`Ajouter une pièce`,"supplierInvoice.evidenceEmpty":`Aucune pièce justificative.`,"supplierInvoice.evidenceDownload":`Télécharger`,"supplier_invoice.evidence_invalid":`Sélectionnez un fichier non vide.`,"supplierInvoice.analysis.action":`Analyser un document`,"supplierInvoice.analysis.title":`Analyser une facture fournisseur`,"supplierInvoice.analysis.intro":`Sélectionnez le fournisseur et le document. Contrôlez ensuite le brouillon créé.`,"supplierInvoice.analysis.loading":`Chargement du service d’analyse…`,"supplierInvoice.analysis.file":`Document à analyser`,"supplierInvoice.analysis.fileRequired":`Sélectionnez un document à analyser.`,"supplierInvoice.analysis.invalidFile":`Sélectionnez un fichier PDF, JPEG, PNG ou WebP.`,"supplierInvoice.analysis.externalNotice":`Ce document sera envoyé au service externe configuré.`,"supplierInvoice.analysis.localNotice":`Le document reste sur ce serveur pendant l’analyse.`,"supplierInvoice.analysis.consent":`J’autorise cet envoi externe pour ce document.`,"supplierInvoice.analysis.submit":`Créer le brouillon`,"supplierInvoice.analysis.failed":`Impossible d’analyser ce document.`,"supplierInvoice.analysisSettings.title":`Analyse des factures fournisseurs`,"supplierInvoice.analysisSettings.intro":`Configurez le service qui extrait les données des documents reçus.`,"supplierInvoice.analysisSettings.open":`Configurer l’analyse`,"supplierInvoice.analysisSettings.loading":`Chargement de la configuration d’analyse…`,"supplierInvoice.analysisSettings.adapter":`Adaptateur`,"supplierInvoice.analysisSettings.local":`Analyse locale simulée`,"supplierInvoice.analysisSettings.openai":`OpenAI`,"supplierInvoice.analysisSettings.endpoint":`Adresse HTTPS du service`,"supplierInvoice.analysisSettings.apiKey":`Nouvelle clé API`,"supplierInvoice.analysisSettings.credentialPresent":`Une clé API est enregistrée. Laissez ce champ vide pour la conserver.`,"supplierInvoice.analysisSettings.credentialMissing":`Aucune clé API n’est enregistrée.`,"supplierInvoice.analysisSettings.save":`Enregistrer la configuration`,"supplierInvoice.analysisSettings.saved":`La configuration d’analyse est enregistrée.`,"supplierInvoice.analysisSettings.error":`Impossible de charger ou d’enregistrer la configuration.`,"supplierInvoice.analysisSettings.unsavedChanges":`Abandonner les modifications de la configuration d’analyse\xA0?`,"supplierPaymentBatch.open":`Préparer les virements`,"supplierPaymentBatch.title":`Virements fournisseurs`,"supplierPaymentBatch.intro":`Regroupez les factures approuvées dans un fichier bancaire SEPA pain.001.`,"supplierPaymentBatch.loading":`Chargement des virements fournisseurs…`,"supplierPaymentBatch.createTitle":`Nouveau lot de virements`,"supplierPaymentBatch.executionDate":`Date d’exécution`,"supplierPaymentBatch.select":`Sélection`,"supplierPaymentBatch.selectInvoice":`Sélectionner la facture {reference}`,"supplierPaymentBatch.emptyEligible":`Aucune facture approuvée en EUR.`,"supplierPaymentBatch.create":`Générer le fichier pain.001`,"supplierPaymentBatch.created":`Le lot de virements est créé.`,"supplierPaymentBatch.download":`Télécharger le fichier XML`,"supplierPaymentBatch.history":`Fichiers générés`,"supplierPaymentBatch.messageId":`Identifiant du message`,"supplierPaymentBatch.transactionCount":`Virements`,"supplierPaymentBatch.controlSum":`Somme de contrôle`,"supplierPaymentBatch.file":`Fichier`,"supplierPaymentBatch.emptyHistory":`Aucun fichier de virements généré.`,"supplierInvoice.createTitle":`Saisir une facture fournisseur`,"supplierInvoice.editTitle":`Modifier la facture fournisseur`,"supplierInvoice.editorIntro":`Saisissez les données du document reçu. Confirmez-les après votre contrôle.`,"supplierInvoice.back":`Retour aux factures fournisseurs`,"supplierInvoice.loading":`Chargement des factures fournisseurs…`,"supplierInvoice.loadingDetail":`Chargement de la facture fournisseur…`,"supplierInvoice.empty":`Aucune facture fournisseur.`,"supplierInvoice.count.one":`{count} facture fournisseur`,"supplierInvoice.count.other":`{count} factures fournisseurs`,"supplierInvoice.loadedTotal":`Total chargé :`,"supplierInvoice.reference":`Référence fournisseur`,"supplierInvoice.supplier":`Fournisseur`,"supplierInvoice.chooseSupplier":`Sélectionnez un fournisseur`,"supplierInvoice.invoiceDate":`Date de facture`,"supplierInvoice.dueDate":`Date d’échéance`,"supplierInvoice.currency":`Devise`,"supplierInvoice.status":`État`,"supplierInvoice.total":`Total TTC`,"supplierInvoice.net":`Total HT`,"supplierInvoice.vat":`TVA`,"supplierInvoice.totals":`Totaux`,"supplierInvoice.details":`Informations`,"supplierInvoice.source":`Origine`,"supplierInvoice.source.manual":`Saisie manuelle`,"supplierInvoice.source.ocr":`Analyse OCR`,"supplierInvoice.lines":`Lignes de facture`,"supplierInvoice.description":`Description`,"supplierInvoice.netAmount":`Montant HT`,"supplierInvoice.vatRate":`Taux de TVA`,"supplierInvoice.addLine":`Ajouter une ligne`,"supplierInvoice.removeLine":`Supprimer la ligne`,"supplierInvoice.notes":`Notes internes`,"supplierInvoice.save":`Enregistrer le brouillon`,"supplierInvoice.cancel":`Annuler`,"supplierInvoice.edit":`Modifier`,"supplierInvoice.confirmAction":`Confirmer`,"supplierInvoice.approveAction":`Approuver`,"supplierInvoice.cancelAction":`Annuler la facture`,"supplierInvoice.confirm.confirm":`Confirmer cette facture et figer ses données ?`,"supplierInvoice.confirm.approve":`Approuver cette facture pour son paiement ?`,"supplierInvoice.confirm.cancel":`Annuler cette facture fournisseur ?`,"supplierInvoice.unsavedChanges":`Abandonner les modifications de cette facture fournisseur ?`,"supplierInvoice.status.draft":`Brouillon`,"supplierInvoice.status.confirmed":`Confirmée`,"supplierInvoice.status.approved":`Approuvée`,"supplierInvoice.status.paid":`Payée`,"supplierInvoice.status.cancelled":`Annulée`,"supplierInvoice.error":`Impossible de charger ou d’enregistrer les factures fournisseurs.`,"supplier_invoice.not_found":`Cette facture fournisseur est introuvable.`,"supplier_invoice.version_conflict":`Cette facture a changé. Actualisez la page avant de recommencer.`,"supplier_invoice.creation_conflict":`Cette demande de création contient maintenant d’autres données.`,"supplier_invoice.reference_exists":`Cette référence existe déjà pour ce fournisseur.`,"supplier_invoice.not_editable":`Seul un brouillon peut être modifié.`,"supplier_invoice.invalid_transition":`Cette action ne correspond pas à l’état actuel de la facture.`,"supplier_invoice.exchange_rate_missing":`Ajoutez un taux de change daté avant de confirmer cette facture fournisseur.`,"supplier_invoice.accounting_unavailable":`Ouvrez une période comptable et vérifiez le journal des achats ainsi que les comptes PCG requis.`,"supplier_invoice.supplier_unavailable":`Le fournisseur sélectionné est indisponible.`,"supplier_invoice.analysis_not_configured":`Le service d’analyse des factures fournisseurs n’est pas configuré.`,"supplier_invoice.analysis_consent_required":`Donnez votre accord avant l’envoi du document au service externe.`,"supplier_invoice.analysis_failed":`Le service n’a pas pu analyser ce document.`,"supplier_invoice.encryption_unavailable":`La clé de chiffrement des secrets est indisponible.`,"supplier_invoice.date_order_invalid":`La date d’échéance doit suivre la date de facture.`,"supplier_payment_batch.not_found":`Ce lot de virements est introuvable.`,"supplier_payment_batch.creation_conflict":`Cette demande de création contient maintenant d’autres données.`,"supplier_payment_batch.invoice_not_payable":`Sélectionnez uniquement des factures approuvées avec un montant positif.`,"supplier_payment_batch.currency_not_supported":`Le format SEPA pain.001 accepte uniquement les factures en EUR.`,"supplier_payment_batch.debtor_account_incomplete":`Renseignez le compte de paiement dans les coordonnées émetteur.`,"supplier_payment_batch.creditor_account_incomplete":`Renseignez l’IBAN de chaque fournisseur sélectionné.`,"supplier_payment_batch.party_name_too_long":`Le nom de l’émetteur ou d’un fournisseur dépasse 70 caractères.`,"page.back_office_supplier_invoices":`Factures fournisseurs | Froment Software`,"page.description.back_office_supplier_invoices":`Gestion des factures fournisseurs.`,"backOffice.navigation.purchases":`Achats`},en:{"supplierInvoice.title":`Supplier invoices`,"supplierInvoice.intro":`Review and approve received invoices before payment.`,"supplierInvoice.create":`Enter an invoice`,"supplierInvoice.creditAction":`Create supplier credit`,"supplierInvoice.kind":`Document type`,"supplierInvoice.kind.invoice":`Supplier invoice`,"supplierInvoice.kind.credit":`Supplier credit`,"supplierInvoice.sourceInvoice":`Source invoice`,"supplierInvoice.openSourceInvoice":`Open source invoice`,"supplierInvoice.evidence":`Evidence`,"supplierInvoice.evidenceAdd":`Add evidence`,"supplierInvoice.evidenceEmpty":`No evidence file.`,"supplierInvoice.evidenceDownload":`Download`,"supplier_invoice.evidence_invalid":`Select a non-empty file.`,"supplierInvoice.analysis.action":`Analyze a document`,"supplierInvoice.analysis.title":`Analyze a supplier invoice`,"supplierInvoice.analysis.intro":`Select the supplier and document. Then review the created draft.`,"supplierInvoice.analysis.loading":`Loading the analysis service…`,"supplierInvoice.analysis.file":`Document to analyze`,"supplierInvoice.analysis.fileRequired":`Select a document to analyze.`,"supplierInvoice.analysis.invalidFile":`Select a PDF, JPEG, PNG, or WebP file.`,"supplierInvoice.analysis.externalNotice":`This document will be sent to the configured external service.`,"supplierInvoice.analysis.localNotice":`The document stays on this server during analysis.`,"supplierInvoice.analysis.consent":`I authorize this external submission for this document.`,"supplierInvoice.analysis.submit":`Create draft`,"supplierInvoice.analysis.failed":`This document cannot be analyzed.`,"supplierInvoice.analysisSettings.title":`Supplier invoice analysis`,"supplierInvoice.analysisSettings.intro":`Configure the service that extracts data from received documents.`,"supplierInvoice.analysisSettings.open":`Configure analysis`,"supplierInvoice.analysisSettings.loading":`Loading analysis settings…`,"supplierInvoice.analysisSettings.adapter":`Adapter`,"supplierInvoice.analysisSettings.local":`Simulated local analysis`,"supplierInvoice.analysisSettings.openai":`OpenAI`,"supplierInvoice.analysisSettings.endpoint":`Service HTTPS address`,"supplierInvoice.analysisSettings.apiKey":`New API key`,"supplierInvoice.analysisSettings.credentialPresent":`An API key is stored. Leave this field empty to keep it.`,"supplierInvoice.analysisSettings.credentialMissing":`No API key is stored.`,"supplierInvoice.analysisSettings.save":`Save settings`,"supplierInvoice.analysisSettings.saved":`The analysis settings are saved.`,"supplierInvoice.analysisSettings.error":`The settings cannot be loaded or saved.`,"supplierInvoice.analysisSettings.unsavedChanges":`Discard the analysis settings changes?`,"supplierPaymentBatch.open":`Prepare transfers`,"supplierPaymentBatch.title":`Supplier payments`,"supplierPaymentBatch.intro":`Group approved invoices in a SEPA pain.001 bank file.`,"supplierPaymentBatch.loading":`Loading supplier payments…`,"supplierPaymentBatch.createTitle":`New payment batch`,"supplierPaymentBatch.executionDate":`Execution date`,"supplierPaymentBatch.select":`Select`,"supplierPaymentBatch.selectInvoice":`Select invoice {reference}`,"supplierPaymentBatch.emptyEligible":`No approved EUR invoice.`,"supplierPaymentBatch.create":`Generate pain.001 file`,"supplierPaymentBatch.created":`The payment batch is created.`,"supplierPaymentBatch.download":`Download XML file`,"supplierPaymentBatch.history":`Generated files`,"supplierPaymentBatch.messageId":`Message ID`,"supplierPaymentBatch.transactionCount":`Transfers`,"supplierPaymentBatch.controlSum":`Control sum`,"supplierPaymentBatch.file":`File`,"supplierPaymentBatch.emptyHistory":`No payment file generated.`,"supplierInvoice.createTitle":`Enter a supplier invoice`,"supplierInvoice.editTitle":`Edit supplier invoice`,"supplierInvoice.editorIntro":`Enter the received document data. Confirm it after review.`,"supplierInvoice.back":`Back to supplier invoices`,"supplierInvoice.loading":`Loading supplier invoices…`,"supplierInvoice.loadingDetail":`Loading supplier invoice…`,"supplierInvoice.empty":`No supplier invoices.`,"supplierInvoice.count.one":`{count} supplier invoice`,"supplierInvoice.count.other":`{count} supplier invoices`,"supplierInvoice.loadedTotal":`Loaded total:`,"supplierInvoice.reference":`Supplier reference`,"supplierInvoice.supplier":`Supplier`,"supplierInvoice.chooseSupplier":`Select a supplier`,"supplierInvoice.invoiceDate":`Invoice date`,"supplierInvoice.dueDate":`Due date`,"supplierInvoice.currency":`Currency`,"supplierInvoice.status":`Status`,"supplierInvoice.total":`Gross total`,"supplierInvoice.net":`Net total`,"supplierInvoice.vat":`VAT`,"supplierInvoice.totals":`Totals`,"supplierInvoice.details":`Details`,"supplierInvoice.source":`Source`,"supplierInvoice.source.manual":`Manual entry`,"supplierInvoice.source.ocr":`OCR analysis`,"supplierInvoice.lines":`Invoice lines`,"supplierInvoice.description":`Description`,"supplierInvoice.netAmount":`Net amount`,"supplierInvoice.vatRate":`VAT rate`,"supplierInvoice.addLine":`Add line`,"supplierInvoice.removeLine":`Remove line`,"supplierInvoice.notes":`Internal notes`,"supplierInvoice.save":`Save draft`,"supplierInvoice.cancel":`Cancel`,"supplierInvoice.edit":`Edit`,"supplierInvoice.confirmAction":`Confirm`,"supplierInvoice.approveAction":`Approve`,"supplierInvoice.cancelAction":`Cancel invoice`,"supplierInvoice.confirm.confirm":`Confirm this invoice and freeze its data?`,"supplierInvoice.confirm.approve":`Approve this invoice for payment?`,"supplierInvoice.confirm.cancel":`Cancel this supplier invoice?`,"supplierInvoice.unsavedChanges":`Discard this supplier invoice’s changes?`,"supplierInvoice.status.draft":`Draft`,"supplierInvoice.status.confirmed":`Confirmed`,"supplierInvoice.status.approved":`Approved`,"supplierInvoice.status.paid":`Paid`,"supplierInvoice.status.cancelled":`Cancelled`,"supplierInvoice.error":`The supplier invoices cannot be loaded or saved.`,"supplier_invoice.not_found":`This supplier invoice cannot be found.`,"supplier_invoice.version_conflict":`This invoice changed. Refresh the page before you try again.`,"supplier_invoice.creation_conflict":`This creation request now contains different data.`,"supplier_invoice.reference_exists":`This reference already exists for this supplier.`,"supplier_invoice.not_editable":`Only a draft can be edited.`,"supplier_invoice.invalid_transition":`This action does not match the current invoice status.`,"supplier_invoice.exchange_rate_missing":`Add a dated exchange rate before you confirm this supplier invoice.`,"supplier_invoice.accounting_unavailable":`Open an accounting period and check the purchase journal and required PCG accounts.`,"supplier_invoice.supplier_unavailable":`The selected supplier is unavailable.`,"supplier_invoice.analysis_not_configured":`The supplier invoice analysis service is not configured.`,"supplier_invoice.analysis_consent_required":`Give consent before sending the document to the external service.`,"supplier_invoice.analysis_failed":`The service could not analyze this document.`,"supplier_invoice.encryption_unavailable":`The secret encryption key is unavailable.`,"supplier_invoice.date_order_invalid":`The due date must follow the invoice date.`,"supplier_payment_batch.not_found":`This payment batch cannot be found.`,"supplier_payment_batch.creation_conflict":`This creation request now contains different data.`,"supplier_payment_batch.invoice_not_payable":`Select only approved invoices with a positive amount.`,"supplier_payment_batch.currency_not_supported":`The SEPA pain.001 format accepts only EUR invoices.`,"supplier_payment_batch.debtor_account_incomplete":`Enter the payment account in the issuer details.`,"supplier_payment_batch.creditor_account_incomplete":`Enter an IBAN for each selected supplier.`,"supplier_payment_batch.party_name_too_long":`The issuer name or a supplier name exceeds 70 characters.`,"page.back_office_supplier_invoices":`Supplier invoices | Froment Software`,"page.description.back_office_supplier_invoices":`Supplier invoice management.`,"backOffice.navigation.purchases":`Purchases`}};var h$1={fr:{group:{title:`Factures fournisseurs`,description:`Saisie, confirmation et approbation des factures fournisseurs.`},operations:{supplierInvoiceList:{summary:`Lister les factures fournisseurs`,description:`Retourne toutes les factures fournisseurs et leurs lignes.`},supplierInvoiceGet:{summary:`Lire une facture fournisseur`,description:`Retourne une facture fournisseur et ses lignes.`},supplierInvoiceCreate:{summary:`Créer une facture fournisseur`,description:`Crée un brouillon manuel ou issu d’une analyse OCR.`},supplierInvoiceUpdate:{summary:`Modifier une facture fournisseur`,description:`Modifie un brouillon avec contrôle de version.`},supplierInvoiceConfirm:{summary:`Confirmer une facture fournisseur`,description:`Fige les données contrôlées du brouillon.`},supplierInvoiceApprove:{summary:`Approuver une facture fournisseur`,description:`Approuve une facture confirmée pour son paiement.`},supplierInvoiceCancel:{summary:`Annuler une facture fournisseur`,description:`Annule un brouillon ou une facture confirmée.`},supplierInvoiceAnalysisSettings:{summary:`Lire la configuration d’analyse`,description:`Retourne l’adaptateur actif sans exposer ses secrets.`},supplierInvoiceAnalysisStatus:{summary:`Lire le mode d’analyse`,description:`Indique si l’analyse envoie le document à un service externe.`},supplierInvoiceAnalysisSettingsUpdate:{summary:`Configurer l’analyse des factures fournisseurs`,description:`Configure un adaptateur local ou HTTP et chiffre ses identifiants.`},supplierInvoiceAnalyze:{summary:`Analyser une facture fournisseur`,description:`Crée un brouillon OCR après le consentement requis.`},supplierPaymentBatchList:{summary:`Lister les lots de virements`,description:`Retourne les derniers fichiers pain.001 générés.`},supplierPaymentBatchCreate:{summary:`Créer un lot de virements`,description:`Génère un fichier pain.001 immuable pour les factures approuvées en EUR.`},supplierPaymentBatchDownload:{summary:`Télécharger un lot de virements`,description:`Retourne le fichier XML pain.001 généré.`}}},en:{group:{title:`Supplier invoices`,description:`Entry, confirmation, and approval of supplier invoices.`},operations:{supplierInvoiceList:{summary:`List supplier invoices`,description:`Returns all supplier invoices and their lines.`},supplierInvoiceGet:{summary:`Get a supplier invoice`,description:`Returns one supplier invoice and its lines.`},supplierInvoiceCreate:{summary:`Create a supplier invoice`,description:`Creates a manual or OCR analysis draft.`},supplierInvoiceUpdate:{summary:`Update a supplier invoice`,description:`Updates a draft with a version check.`},supplierInvoiceConfirm:{summary:`Confirm a supplier invoice`,description:`Freezes the reviewed draft data.`},supplierInvoiceApprove:{summary:`Approve a supplier invoice`,description:`Approves a confirmed invoice for payment.`},supplierInvoiceCancel:{summary:`Cancel a supplier invoice`,description:`Cancels a draft or confirmed invoice.`},supplierInvoiceAnalysisSettings:{summary:`Get analysis settings`,description:`Returns the active adapter without exposing its secrets.`},supplierInvoiceAnalysisStatus:{summary:`Get the analysis mode`,description:`Indicates if analysis sends the document to an external service.`},supplierInvoiceAnalysisSettingsUpdate:{summary:`Configure supplier invoice analysis`,description:`Configures a local or HTTP adapter and encrypts its credentials.`},supplierInvoiceAnalyze:{summary:`Analyze a supplier invoice`,description:`Creates an OCR draft after the required consent.`},supplierPaymentBatchList:{summary:`List payment batches`,description:`Returns the latest generated pain.001 files.`},supplierPaymentBatchCreate:{summary:`Create a payment batch`,description:`Generates an immutable pain.001 file for approved EUR invoices.`},supplierPaymentBatchDownload:{summary:`Download a payment batch`,description:`Returns the generated pain.001 XML file.`}}}};var se={fr:{"affair.noHistory":`Aucun événement enregistré pour cette affaire.`,"affair.intro":`Regroupez plusieurs devis, commandes et factures pour un même client.`,"affair.create":`Créer une affaire`,"affair.createQuote":`Créer un devis`,"affair.archive":`Archiver l’affaire`,"affair.archiveConfirm":`Archiver cette affaire ? Les documents seront conservés et l’affaire restera consultable.`,"affair.reopen":`Rouvrir l’affaire`,"affair.selectClient":`Sélectionnez un client`,"affair.reference":`Numéro d’affaire`,"affair.details":`Informations`,"affair.documents":`Documents liés`,"affair.noDocuments":`Aucun document lié.`,"affair.open":`Ouverte`,"affair.closed":`Clôturée`,"affair.error":`Impossible de charger ou d’enregistrer les affaires.`,"affair.edit":`Modifier l’affaire`,"affair.save":`Enregistrer l’affaire`,"affair.not_found":`Cette affaire est introuvable.`,"affair.conflict":`L’affaire a changé ou le document sélectionné est incompatible.`,"inlineEdit.editField":`Modifier : {field}`,"inlineEdit.save":`Enregistrer`,"inlineEdit.cancel":`Annuler`},en:{"affair.noHistory":`No recorded events for this affair.`,"affair.intro":`Group multiple quotes, orders, and invoices for one client.`,"affair.create":`Create an affair`,"affair.createQuote":`Create a quote`,"affair.archive":`Archive affair`,"affair.archiveConfirm":`Archive this affair? Its documents will remain available and the affair will remain accessible.`,"affair.reopen":`Reopen affair`,"affair.selectClient":`Select a client`,"affair.reference":`Affair number`,"affair.details":`Details`,"affair.documents":`Linked documents`,"affair.noDocuments":`No linked documents.`,"affair.open":`Open`,"affair.closed":`Closed`,"affair.error":`Unable to load or save affairs.`,"affair.edit":`Edit affair`,"affair.save":`Save affair`,"affair.not_found":`This affair was not found.`,"affair.conflict":`The affair changed or the selected document is incompatible.`,"inlineEdit.editField":`Edit: {field}`,"inlineEdit.save":`Save`,"inlineEdit.cancel":`Cancel`}};var re={fr:{"documentLine.actions":`Actions`,"documentLine.add":`Ajouter une ligne`,"documentLine.cancel":`Annuler`,"documentLine.description":`Description`,"documentLine.descriptionPlaceholder":`Ex. Atelier de cadrage fonctionnel`,"documentLine.descriptionInvalid":`Saisissez une description de 160 caractères au maximum.`,"documentLine.descriptionNumber":`Description de la ligne {number}`,"documentLine.edit":`Modifier`,"documentLine.editNumber":`Modifier la ligne {number}`,"documentLine.invalid":`Corrigez les valeurs de cette ligne.`,"documentLine.number":`Ligne {number}`,"documentLine.quantity":`Quantité`,"documentLine.quantityInvalid":`Saisissez une quantité positive avec trois décimales au maximum.`,"documentLine.quantityNumber":`Quantité de la ligne {number}`,"documentLine.remove":`Supprimer`,"documentLine.save":`Enregistrer`,"documentLine.subtotal":`Total HT`,"documentLine.total":`Total`,"documentLine.totalWithTax":`Total TTC`,"documentLine.unitPrice":`Prix unitaire`,"documentLine.unitPriceInvalid":`Saisissez un prix positif ou nul avec deux décimales au maximum.`,"documentLine.unitPriceNumber":`Prix unitaire de la ligne {number}`,"documentLine.vatRate":`TVA`,"documentLine.vatRateInvalid":`Saisissez un taux compris entre 0 et 100.`,"documentLine.vatRateNumber":`Taux de TVA de la ligne {number}`,"documentLine.vatTotal":`TVA`},en:{"documentLine.actions":`Actions`,"documentLine.add":`Add line`,"documentLine.cancel":`Cancel`,"documentLine.description":`Description`,"documentLine.descriptionPlaceholder":`e.g. Functional scoping workshop`,"documentLine.descriptionInvalid":`Enter a description with no more than 160 characters.`,"documentLine.descriptionNumber":`Line {number} description`,"documentLine.edit":`Edit`,"documentLine.editNumber":`Edit line {number}`,"documentLine.invalid":`Correct the values in this line.`,"documentLine.number":`Line {number}`,"documentLine.quantity":`Quantity`,"documentLine.quantityInvalid":`Enter a positive quantity with no more than three decimal places.`,"documentLine.quantityNumber":`Line {number} quantity`,"documentLine.remove":`Remove`,"documentLine.save":`Save`,"documentLine.subtotal":`Subtotal`,"documentLine.total":`Total`,"documentLine.totalWithTax":`Total including VAT`,"documentLine.unitPrice":`Unit price`,"documentLine.unitPriceInvalid":`Enter a non-negative price with no more than two decimal places.`,"documentLine.unitPriceNumber":`Line {number} unit price`,"documentLine.vatRate":`VAT`,"documentLine.vatRateInvalid":`Enter a rate from 0 to 100.`,"documentLine.vatRateNumber":`Line {number} VAT rate`,"documentLine.vatTotal":`VAT`}};var oe$1={fr:{"accounting.title":`Comptabilité`,"accounting.intro":`Gérez le plan comptable, les journaux, les périodes, les écritures et les exports réglementaires.`,"accounting.sections":`Sections de la comptabilité`,"accounting.accounts":`Plan comptable`,"accounting.journals":`Journaux`,"accounting.periods":`Périodes`,"accounting.entries":`Écritures`,"accounting.reports":`États`,"accounting.opening":`Balance d’ouverture`,"accounting.evidence":`Pièces`,"accounting.lettering":`Lettrage`,"accounting.loading":`Chargement de la comptabilité…`,"accounting.loadError":`Impossible de charger les données comptables.`,"accounting.error":`Impossible de terminer l’opération comptable.`,"accounting.period_transition_invalid":`Cette transition de période n’est pas autorisée.`,"accounting.period_has_drafts":`Validez ou supprimez les brouillons avant de verrouiller la période.`,"accounting.period_reopen_acknowledgement_invalid":`Saisissez le libellé exact de l’exercice pour autoriser sa réouverture.`,"accounting.tax_filing_configuration_invalid":`Configurez le prestataire de télédéclaration.`,"accounting.tax_filing_failed":`La télédéclaration a échoué.`,"accounting.encryption_unavailable":`Le chiffrement des secrets n’est pas configuré.`,"accounting.saved":`Données comptables enregistrées.`,"accounting.code":`Code`,"accounting.label":`Libellé`,"accounting.kind":`Type`,"accounting.status":`État`,"accounting.actions":`Actions`,"accounting.active":`Actif`,"accounting.archived":`Archivé`,"accounting.edit":`Modifier`,"accounting.archive":`Archiver`,"accounting.reactivate":`Réactiver`,"accounting.save":`Enregistrer`,"accounting.cancel":`Annuler`,"accounting.create":`Créer`,"accounting.add":`Ajouter`,"accounting.remove":`Retirer`,"accounting.account.add":`Ajouter un compte`,"accounting.account.edit":`Modifier le compte`,"accounting.journal.add":`Ajouter un journal`,"accounting.journal.edit":`Modifier le journal`,"accounting.period.add":`Ajouter un exercice`,"accounting.entry.add":`Ajouter une écriture`,"accounting.accountKind.asset":`Actif`,"accounting.accountKind.liability":`Passif`,"accounting.accountKind.equity":`Capitaux propres`,"accounting.accountKind.income":`Produit`,"accounting.accountKind.expense":`Charge`,"accounting.journalKind.sales":`Ventes`,"accounting.journalKind.purchases":`Achats`,"accounting.journalKind.bank":`Banque`,"accounting.journalKind.general":`Opérations diverses`,"accounting.journalKind.opening":`À nouveaux`,"accounting.startsOn":`Date de début`,"accounting.endsOn":`Date de fin`,"accounting.period":`Période`,"accounting.period.open":`Ouverte`,"accounting.period.locked":`Verrouillée`,"accounting.period.closed":`Clôturée`,"accounting.period.final":`Clôture définitive`,"accounting.lock":`Verrouiller`,"accounting.close":`Clôturer`,"accounting.reopen":`Réouvrir`,"accounting.reopenWarning":`Réouvrir l’exercice « {label} » autorise de nouvelles écritures. Cette action peut rendre incohérents les états, déclarations et exports déjà produits.`,"accounting.reopenAcknowledgement":`Saisissez « {label} » pour confirmer la réouverture.`,"accounting.finalClose":`Clôturer définitivement`,"accounting.journal":`Journal`,"accounting.date":`Date`,"accounting.reference":`Référence`,"accounting.description":`Description`,"accounting.account":`Compte`,"accounting.debit":`Débit`,"accounting.credit":`Crédit`,"accounting.line.add":`Ajouter une ligne`,"accounting.createDraft":`Créer le brouillon`,"accounting.entry.draft":`Brouillon`,"accounting.entry.posted":`Validée`,"accounting.entry.reversed":`Extournée`,"accounting.post":`Valider`,"accounting.reverse":`Extourner`,"accounting.generate":`Générer`,"accounting.fec":`Exporter le FEC`,"accounting.balance":`Solde`,"accounting.total":`Total`,"accounting.ca3":`Exporter la CA3`,"accounting.taxFiling":`Télédéclaration de TVA`,"accounting.taxFiling.load":`Charger la configuration`,"accounting.taxFiling.adapter":`Adaptateur`,"accounting.taxFiling.local":`Simulateur local`,"accounting.taxFiling.http":`Prestataire HTTP`,"accounting.taxFiling.endpoint":`Adresse du prestataire`,"accounting.taxFiling.apiKey":`Clé API`,"accounting.taxFiling.credentialStored":`Une clé est enregistrée.`,"accounting.taxFiling.submit":`Télédéclarer`,"accounting.taxFiling.confirm":`Confirmez-vous la télédéclaration de cette période ?`,"accounting.taxFiling.submitted":`La télédéclaration est enregistrée.`,"accounting.financialStatements":`Bilan et compte de résultat`,"accounting.assets":`Actif`,"accounting.liabilities":`Passif`,"accounting.equity":`Capitaux propres`,"accounting.income":`Produits`,"accounting.expenses":`Charges`,"accounting.netIncome":`Résultat net`,"accounting.vat":`État de TVA et cases CA3`,"accounting.ledger":`Grand livre et journaux`,"accounting.ca3.box16":`TVA brute`,"accounting.ca3.box20":`TVA déductible`,"accounting.ca3.box28":`TVA nette à payer`,"accounting.opening.title":`Importer une balance d’ouverture`,"accounting.opening.hint":`Sélectionnez le CSV et indiquez les noms exacts des quatre colonnes.`,"accounting.file":`Fichier`,"accounting.opening.accountColumn":`Colonne du compte`,"accounting.opening.labelColumn":`Colonne du libellé`,"accounting.opening.debitColumn":`Colonne du débit`,"accounting.opening.creditColumn":`Colonne du crédit`,"accounting.preview":`Prévisualiser`,"accounting.opening.balanced":`La balance est équilibrée.`,"accounting.opening.unbalanced":`La balance n’est pas équilibrée.`,"accounting.commit":`Valider l’import`,"accounting.evidence.add":`Ajouter une pièce justificative`,"accounting.entry":`Écriture`,"accounting.evidence.retention":`Les pièces et leurs traces sont conservées pendant au moins dix ans.`,"accounting.mediaType":`Type de fichier`,"accounting.fingerprint":`Empreinte SHA-256`,"accounting.select":`Sélectionner`,"accounting.download":`Télécharger`,"accounting.lettering.title":`Lettrer des écritures`,"accounting.lettering.hint":`Sélectionnez au moins deux lignes équilibrées du même compte.`,"accounting.lettering.apply":`Appliquer le lettrage`,"accounting.lettering.code":`Code de lettrage`,"accounting.lettering.pending":`À lettrer`,"accounting.lettering.completed":`Lettrée`,"accounting.evidence.pdf":`PDF`,"accounting.evidence.image":`Image`,"accounting.evidence.other":`Autre format`,"accounting.balance.zero":`Solde nul`,"accounting.rows.one":`{count} résultat`,"accounting.rows.other":`{count} résultats`,"demo.reset":`Réinitialiser la démonstration`,"demo.title":`Données de démonstration`,"demo.hint":`Restaurez toutes les données de démonstration de cet environnement hors production.`,"demo.password":`Mot de passe de réinitialisation`,"demo.confirm":`Remplacer toutes les données par le jeu de démonstration ? Toutes les sessions seront fermées.`,"demo.error":`La réinitialisation est indisponible. Vérifiez l’environnement et le secret serveur.`},en:{"accounting.title":`Accounting`,"accounting.intro":`Manage the chart of accounts, journals, periods, entries, and regulatory exports.`,"accounting.sections":`Accounting sections`,"accounting.accounts":`Chart of accounts`,"accounting.journals":`Journals`,"accounting.periods":`Periods`,"accounting.entries":`Entries`,"accounting.reports":`Reports`,"accounting.opening":`Opening balance`,"accounting.evidence":`Evidence`,"accounting.lettering":`Lettering`,"accounting.loading":`Loading accounting data…`,"accounting.loadError":`Accounting data cannot be loaded.`,"accounting.error":`The accounting operation failed.`,"accounting.period_transition_invalid":`This period transition is not allowed.`,"accounting.period_has_drafts":`Post or remove drafts before you lock the period.`,"accounting.period_reopen_acknowledgement_invalid":`Enter the exact period label to authorize reopening.`,"accounting.tax_filing_configuration_invalid":`Configure the tax filing provider.`,"accounting.tax_filing_failed":`The tax filing failed.`,"accounting.encryption_unavailable":`Secret encryption is not configured.`,"accounting.saved":`Accounting data saved.`,"accounting.code":`Code`,"accounting.label":`Label`,"accounting.kind":`Type`,"accounting.status":`Status`,"accounting.actions":`Actions`,"accounting.active":`Active`,"accounting.archived":`Archived`,"accounting.edit":`Edit`,"accounting.archive":`Archive`,"accounting.reactivate":`Reactivate`,"accounting.save":`Save`,"accounting.cancel":`Cancel`,"accounting.create":`Create`,"accounting.add":`Add`,"accounting.remove":`Remove`,"accounting.account.add":`Add account`,"accounting.account.edit":`Edit account`,"accounting.journal.add":`Add journal`,"accounting.journal.edit":`Edit journal`,"accounting.period.add":`Add fiscal year`,"accounting.entry.add":`Add entry`,"accounting.accountKind.asset":`Asset`,"accounting.accountKind.liability":`Liability`,"accounting.accountKind.equity":`Equity`,"accounting.accountKind.income":`Income`,"accounting.accountKind.expense":`Expense`,"accounting.journalKind.sales":`Sales`,"accounting.journalKind.purchases":`Purchases`,"accounting.journalKind.bank":`Bank`,"accounting.journalKind.general":`General`,"accounting.journalKind.opening":`Opening`,"accounting.startsOn":`Start date`,"accounting.endsOn":`End date`,"accounting.period":`Period`,"accounting.period.open":`Open`,"accounting.period.locked":`Locked`,"accounting.period.closed":`Closed`,"accounting.period.final":`Finally closed`,"accounting.lock":`Lock`,"accounting.close":`Close`,"accounting.reopen":`Reopen`,"accounting.reopenWarning":`Reopening “{label}” allows new entries. This action can make existing reports, filings, and exports inconsistent.`,"accounting.reopenAcknowledgement":`Enter “{label}” to confirm reopening.`,"accounting.finalClose":`Close finally`,"accounting.journal":`Journal`,"accounting.date":`Date`,"accounting.reference":`Reference`,"accounting.description":`Description`,"accounting.account":`Account`,"accounting.debit":`Debit`,"accounting.credit":`Credit`,"accounting.line.add":`Add line`,"accounting.createDraft":`Create draft`,"accounting.entry.draft":`Draft`,"accounting.entry.posted":`Posted`,"accounting.entry.reversed":`Reversed`,"accounting.post":`Post`,"accounting.reverse":`Reverse`,"accounting.generate":`Generate`,"accounting.fec":`Export FEC`,"accounting.balance":`Balance`,"accounting.total":`Total`,"accounting.ca3":`Export CA3`,"accounting.taxFiling":`VAT filing`,"accounting.taxFiling.load":`Load configuration`,"accounting.taxFiling.adapter":`Adapter`,"accounting.taxFiling.local":`Local simulator`,"accounting.taxFiling.http":`HTTP provider`,"accounting.taxFiling.endpoint":`Provider endpoint`,"accounting.taxFiling.apiKey":`API key`,"accounting.taxFiling.credentialStored":`A key is stored.`,"accounting.taxFiling.submit":`Submit VAT filing`,"accounting.taxFiling.confirm":`Do you confirm this period VAT filing?`,"accounting.taxFiling.submitted":`The VAT filing is recorded.`,"accounting.financialStatements":`Balance sheet and income statement`,"accounting.assets":`Assets`,"accounting.liabilities":`Liabilities`,"accounting.equity":`Equity`,"accounting.income":`Income`,"accounting.expenses":`Expenses`,"accounting.netIncome":`Net income`,"accounting.vat":`VAT report and CA3 boxes`,"accounting.ledger":`General ledger and journals`,"accounting.ca3.box16":`Gross VAT`,"accounting.ca3.box20":`Deductible VAT`,"accounting.ca3.box28":`Net VAT payable`,"accounting.opening.title":`Import an opening balance`,"accounting.opening.hint":`Select the CSV file and enter the exact names of its four columns.`,"accounting.file":`File`,"accounting.opening.accountColumn":`Account column`,"accounting.opening.labelColumn":`Label column`,"accounting.opening.debitColumn":`Debit column`,"accounting.opening.creditColumn":`Credit column`,"accounting.preview":`Preview`,"accounting.opening.balanced":`The balance is balanced.`,"accounting.opening.unbalanced":`The balance is not balanced.`,"accounting.commit":`Commit import`,"accounting.evidence.add":`Add evidence`,"accounting.entry":`Entry`,"accounting.evidence.retention":`Evidence and access records are retained for at least ten years.`,"accounting.mediaType":`File type`,"accounting.fingerprint":`SHA-256 fingerprint`,"accounting.select":`Select`,"accounting.download":`Download`,"accounting.lettering.title":`Letter entries`,"accounting.lettering.hint":`Select at least two balanced lines from the same account.`,"accounting.lettering.apply":`Apply lettering`,"accounting.lettering.code":`Lettering code`,"accounting.lettering.pending":`Pending`,"accounting.lettering.completed":`Lettered`,"accounting.evidence.pdf":`PDF`,"accounting.evidence.image":`Image`,"accounting.evidence.other":`Other format`,"accounting.balance.zero":`Zero balance`,"accounting.rows.one":`{count} result`,"accounting.rows.other":`{count} results`,"demo.reset":`Reset demonstration data`,"demo.title":`Demonstration data`,"demo.hint":`Restore all demonstration data for this non-production environment.`,"demo.password":`Reset password`,"demo.confirm":`Replace all data with the demonstration dataset? All sessions will close.`,"demo.error":`The reset is unavailable. Check the environment and the server secret.`}};var ke={fr:m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1({},re.fr),oe$1.fr),se.fr),C$1.fr),x$1.fr),A$1.fr),O$3.fr),R$1.fr),{"design.components.searchFilter":`Recherche : {query}`}),q$1.fr),S$2.fr),L$1.fr),W$1.fr),I$2.fr),D$1.fr),P$1.fr),E$2.fr),_$1.fr),z$2.fr),{"design.components.workflows":`Parcours complets`}),y$1.fr),F$2.fr),N$3.fr),U$2.fr),V$1.fr),j$2.fr),M$2.fr),B$1.fr),H$1.fr),Q$2.fr),G$1.fr),K$2.fr),Y$2.fr),J$2.fr),$$2.fr),X$2.fr),Z$2.fr),ee$2.fr),ie$1.fr),te$1.fr),ne$1.fr),ae$1.fr),{"design.confirmation.title":`Modales de confirmation`,"design.confirmation.hint":`Le focus commence sur Annuler. Tab reste dans la modale. Échap et le fond annulent la demande.`,"design.confirmation.open":`Ouvrir une confirmation`,"design.confirmation.discard":`Tester un abandon de modifications`,"design.confirmation.discardLabel":`Abandonner les modifications`,"design.confirmation.message":`Confirmer cette action de démonstration ?`,"design.confirmation.discardMessage":`Abandonner les modifications de démonstration ? Cette modale utilise le même service que les formulaires du backoffice.`,"design.confirmation.accepted":`Action de démonstration confirmée.`,"design.confirmation.cancelled":`Action de démonstration annulée.`,"design.confirmation.noEffect":`Ces exemples ne modifient aucune donnée et n’appellent aucun service externe.`,"login.heading":`Connexion`,"login.description":`Vos documents et le suivi de vos règlements, au même endroit.`,"login.access":`Votre compte donne accès aux documents et aux actions qui vous concernent.`,"login.demoHeading":`Comptes de démonstration`,"login.demoDescription":`Données fictives réinitialisées régulièrement. Choisissez un compte pour vous connecter.`,"login.demoPassword":`Mot de passe des comptes`,"bank.history":`Historique des rapprochements`,"bank.historyHint":`Les 100 derniers rapprochements, avec dates, identifiants des auteurs et motifs de dissociation.`,"bank.historyEmpty":`Aucun rapprochement enregistré pour cette opération.`,"emails.prepareReminder":`Préparer un rappel de paiement`,"emails.preparingReminder":`Préparation du rappel…`,"emails.reminderFailed":`Impossible de préparer le rappel. Vérifiez que la facture est émise et présente un solde restant.`,"emails.reminderReview":`Vérifiez le destinataire et le solde avant de soumettre le message. Le destinataire vient de la fiche client actuelle. Aucune pièce jointe n’est ajoutée. Aucun envoi automatique n’est programmé.`,"emails.reminderSubject":`Rappel de paiement — {reference}`,"emails.reminderBody":`Bonjour,
12
12
 
13
13
  Selon nos r\xE8glements enregistr\xE9s, le solde de la facture {reference} est de {amount}. Son \xE9ch\xE9ance est le {dueDate}.
14
14
 
@@ -47,7 +47,7 @@ Nous souhaitons \xE9changer au sujet du projet suivant :
47
47
  - \xC9ch\xE9ance souhait\xE9e :
48
48
  - Budget indicatif :
49
49
 
50
- Merci.`,"services.offer.renovation.title":`Audit et rénovation`,"services.offer.renovation.desc":`Nous analysons vos projets, leur environnement, leurs risques et leurs lacunes. Nous proposons ensuite des corrections, des mises à niveau, des automatisations et une refactorisation progressive.`,"services.offer.renovation.cta":`Voir le détail de l’audit et de la rénovation`,"services.offer.development.title":`Développement tout compris`,"services.offer.development.desc":`Nous prenons en charge la conception, la réalisation, les tests et le déploiement d’une application métier ou d’un outil interne.`,"services.offer.development.cta":`Voir le détail du développement`,"serviceDetail.back":`Retour aux prestations`,"serviceDetail.renovation.title":`Audit et rénovation`,"serviceDetail.renovation.lead":`Comprendre les problèmes réels avant d’investir, puis moderniser l’existant sans réécriture systématique.`,"serviceDetail.renovation.scope.title":`Ce que nous analysons et améliorons`,"serviceDetail.renovation.scope.projects.title":`Projets et architecture`,"serviceDetail.renovation.scope.projects.desc":`Structure du code, dépendances, flux de données, points de fragilité et capacité d’évolution.`,"serviceDetail.renovation.scope.delivery.title":`Chaîne de livraison`,"serviceDetail.renovation.scope.delivery.desc":`Builds, tests, intégration continue, déploiements et délais entre une modification et sa mise en service.`,"serviceDetail.renovation.scope.quality.title":`CVE, failles et secrets`,"serviceDetail.renovation.scope.quality.desc":`Recherche de CVE et de failles avec des outils d’analyse statique adaptés aux langages. Détection des secrets présents dans le code et l’historique Git.`,"serviceDetail.renovation.scope.quality.staticAnalysis":`Outils d’analyse statique`,"serviceDetail.renovation.scope.quality.trufflehog":`TruffleHog`,"serviceDetail.renovation.scope.environment.title":`Environnement de travail`,"serviceDetail.renovation.scope.environment.desc":`Installation locale, secrets, documentation, outils et difficultés rencontrées par l’équipe existante.`,"serviceDetail.renovation.deliverables.title":`Ce que vous recevez`,"serviceDetail.renovation.deliverables.audit":`Un constat documenté, factuel et classé par niveau de risque.`,"serviceDetail.renovation.deliverables.plan":`Un plan d’amélioration priorisé avec les coûts, les dépendances et les résultats attendus.`,"serviceDetail.renovation.deliverables.work":`Les corrections et rénovations retenues dans le devis, validées sur votre environnement.`,"serviceDetail.renovation.deliverables.handover":`Le code, les tests et les instructions nécessaires pour maintenir et faire évoluer le logiciel.`,"serviceDetail.renovation.fit.title":`Cette prestation est adaptée si…`,"serviceDetail.renovation.fit.desc":`Votre logiciel reste utile, mais il devient lent à modifier, difficile à déployer ou risqué à maintenir.`,"serviceDetail.development.title":`Développement tout compris`,"serviceDetail.development.lead":`Un interlocuteur unique pour transformer un besoin métier en logiciel testé, déployé et documenté.`,"serviceDetail.development.scope.title":`Une prestation complète`,"serviceDetail.development.scope.design.title":`Conception`,"serviceDetail.development.scope.design.desc":`Clarification des usages, parcours, données, contraintes et critères de validation.`,"serviceDetail.development.scope.build.title":`Réalisation`,"serviceDetail.development.scope.build.desc":`Développement de l’interface, des règles métier, des intégrations et des automatisations nécessaires.`,"serviceDetail.development.scope.tests.title":`Tests`,"serviceDetail.development.scope.tests.desc":`Tests automatisés et validations fonctionnelles ciblés sur les usages et les risques du produit.`,"serviceDetail.development.scope.deploy.title":`Déploiement`,"serviceDetail.development.scope.deploy.desc":`Mise en service reproductible, configuration des environnements et préparation de l’exploitation.`,"serviceDetail.development.deliverables.title":`Ce qui est inclus`,"serviceDetail.development.deliverables.product":`Une application web, une application de bureau ou un outil interne conforme au périmètre validé.`,"serviceDetail.development.deliverables.source":`Le code source et les dépendances nécessaires pour construire le produit.`,"serviceDetail.development.deliverables.tests":`Les tests automatisés et les critères utilisés pour valider la livraison.`,"serviceDetail.development.deliverables.operations":`La documentation et les instructions de déploiement, d’utilisation et de maintenance.`,"serviceDetail.development.fit.title":`Cette prestation est adaptée si…`,"serviceDetail.development.fit.desc":`Vous avez un besoin métier précis et souhaitez confier toute la réalisation jusqu’à la mise en service.`,"services.examples.title":`Cas concrets`,"services.examples.upgrades.title":`Montées de version`,"services.examples.upgrades.desc":`Mettre à niveau les dépendances et bibliothèques, traiter les incompatibilités puis valider le comportement par les tests.`,"services.examples.build.title":`Chaîne de build`,"services.examples.build.before":`Rendre les builds reproductibles avec`,"services.examples.build.after":`: dépendances déclarées, environnements identiques et cache partagé.`,"services.examples.ci.title":`Intégration continue`,"services.examples.ci.desc":`Reprendre une CI existante, supprimer les tâches inutiles, paralléliser les étapes et mettre en cache les résultats réutilisables.`,"services.examples.tests.title":`Tests automatisés`,"services.examples.tests.desc":`Mettre en place des tests unitaires, d’intégration et d’architecture pour stabiliser l’existant et vérifier automatiquement le fonctionnement de l’application.`,"services.examples.environments.title":`Environnements de développement`,"services.examples.environments.before":`Déclarer et automatiser des environnements reproductibles avec`,"services.examples.secrets.title":`Gestion des secrets`,"services.examples.secrets.before":`Centraliser les secrets dans un coffre sur site, un service cloud ou une solution légère :`,"services.examples.secrets.through":`Automatiser leur injection dans les applications avec`,"services.examples.ai.title":`Agents IA`,"services.examples.ai.before":`Intégrer des agents spécialisés aux échanges de conception : préparation du backlog, analyse pendant les réunions et prototypage en direct avec`,"services.examples.ai.usage":`Suivre les volumes, les modèles et les coûts avec`,"services.examples.metrics.title":`Mesures techniques`,"services.examples.metrics.before":`Mesurer les temps de réponse, de test, de build, de CI et de déploiement. Publier des indicateurs horodatés dans`,"services.examples.metrics.after":`afin de suivre des valeurs mesurées plutôt que des estimations.`,"services.examples.infrastructure.title":`Infrastructure et déploiement`,"services.examples.infrastructure.before":`Déclarer, tester et reproduire les déploiements sur site ou dans le cloud avec NixOS, cache de build et infrastructure as code via`,"services.examples.or":`ou`,"services.process.kicker":`Méthode de livraison`,"services.process.title":`Déroulement d’une mission`,"services.process.analysis.title":`Qualifier le besoin`,"services.process.analysis.desc":`Nous réalisons un examen initial limité pour comprendre le contexte et préparer le devis. L’audit approfondi commence après validation.`,"services.process.quote.title":`Établir le devis`,"services.process.quote.desc":`Nous vous remettons un devis détaillé. Il précise les prestations, les livrables, le calendrier et le prix.`,"services.process.agreement.title":`Valider le cadre`,"services.process.agreement.desc":`Vous acceptez la proposition. Si nous précisons ensuite un objectif ou le périmètre, nous vous soumettons un devis mis à jour avant de commencer.`,"services.process.delivery.title":`Réaliser la mission`,"services.process.delivery.desc":`Nous réalisons la mission au contact de vos interlocuteurs et de votre équipe de développement existante.`,"services.process.validation.title":`Valider la livraison`,"services.process.validation.desc":`Vous validez les livrables selon les critères du devis, puis vous réglez le solde de la mission.`,"services.practical.title":`En pratique`,"services.practical.method":`Méthode`,"services.practical.method.desc":`Le devis fixe le périmètre, le prix, les livrables et les critères d’acceptation.`,"services.practical.schedule":`Délais`,"services.practical.schedule.desc":`Le calendrier est défini selon le périmètre, les dépendances et les validations attendues.`,"services.practical.deliverables":`Livrables`,"services.practical.deliverables.desc":`Code source, tests, documentation et instructions de mise en service selon la mission.`,"services.criteria.title":`Éléments utiles pour commencer`,"services.criteria.context":`Le contexte et les utilisateurs concernés.`,"services.criteria.problem":`Le problème principal ou le résultat attendu.`,"services.criteria.deadline":`L’échéance connue et les contraintes techniques.`,"serviceDetail.contact.title":`Échanger sur votre besoin`,"clients.title":`Expérience`,"clients.sectors.title":`Secteurs d’expérience`,"clients.cv":`Voir le CV complet`,"clients.sector.industry":`Industrie`,"clients.sector.insurance":`Assurance`,"clients.sector.services":`Services`,"about.faq.title":`Questions fréquentes`,"about.faq.intro":`Des réponses directes sur le fonctionnement d’une collaboration.`,"about.faq.process.q":`Comment se déroule une mission ?`,"about.faq.stack.q":`Comment choisissez-vous les technologies ?`,"about.faq.remote.q":`Travaillez-vous à distance ?`,"about.faq.nda.q":`Acceptez-vous les accords de confidentialité ?`,"about.faq.timeline.q":`Comment fixez-vous le calendrier ?`,"about.faq.maintenance.q":`Proposez-vous une maintenance après livraison ?`,"about.faq.pricing.q":`Comment les prestations sont-elles facturées ?`,"about.faq.availability.q":`Quelle est votre disponibilité ?`,"about.faq.process.a":`Un premier échange précise le besoin, les contraintes et les critères de réussite. Le devis fixe ensuite le périmètre, les livrables et les modalités de suivi avant le développement et la mise en service.`,"about.faq.stack.a":`Le choix dépend du produit, de l’équipe et du système existant. Technologies utilisées : Angular, SvelteKit, ASP.NET, WPF, Go, Linux et PostgreSQL.`,"about.faq.remote.a":`Oui, le travail se fait principalement à distance, avec des points de suivi convenus selon la mission.`,"about.faq.nda.a":`Oui, après accord sur les obligations, la durée et les informations concernées.`,"about.faq.timeline.a":`Le calendrier dépend du périmètre, des dépendances et des validations attendues. Il est défini dans le devis plutôt que promis avant le cadrage.`,"about.faq.maintenance.a":`Oui. Correctifs, mises à jour et évolutions peuvent être prévus dès le devis ou convenus après la livraison.`,"about.faq.pricing.a":`Au forfait lorsque le périmètre est suffisamment stable. Les incertitudes sont d’abord isolées dans une phase de cadrage.`,"about.faq.availability.a":`Les missions sont planifiées à temps partiel. La date de début est confirmée avant le devis.`,"not_found.title":`Cette page n’existe pas.`,"not_found.lead":`Vérifiez l’adresse ou revenez à l’accueil.`,"not_found.cta":`Retour à l’accueil`,"not_found.links_label":`Prochaines étapes`,"not_found.services":`Voir les prestations`,"not_found.contact":`Écrire à Froment Software`,"about.contact.title":`Contact`,"about.contact.mail":`Nous écrire`,"about.contact.book":`Prendre rendez-vous`,"blog.title":`Blog`,"blog.lead":`Notes techniques, retours d’expérience et idées.`,"blog.topics":`Sujets`,"blog.back":`Retour au blog`,"blog.missing":`Article introuvable`,"legal.kicker":`Informations du site`,"legal.title":`Mentions légales`,"legal.lead":`Les informations essentielles sur l’édition, l’hébergement et l’utilisation des contenus de froment.software.`,"legal.updated":`Mis à jour le 19 août 2026`,"legal.summary.title":`En bref`,"legal.summary.content":`froment.software présente l’activité et les services de conseil en ingénierie logicielle de Sacha FROMENT. Son espace privé fournit des comptes aux clients et aux administrateurs.`,"legal.publisher.title":`Édition du site`,"legal.publisher.content":`Le site froment.software est édité et maintenu par Sacha FROMENT. Les demandes administratives ou juridiques peuvent être adressées par e-mail.`,"legal.hosting.title":`Hébergement`,"legal.hosting.content":`Le site est servi comme un site statique et hébergé sur une infrastructure privée administrée par l’éditeur. Les demandes techniques relatives à l’hébergement peuvent être envoyées au même contact.`,"legal.ip.title":`Contenus et propriété intellectuelle`,"legal.ip.content":`Sauf mention contraire, les textes, éléments graphiques et composants propres à froment.software restent la propriété de leur auteur. Une citation courte avec attribution est possible ; toute autre réutilisation doit faire l’objet d’un accord préalable.`,"legal.links.title":`Liens externes`,"legal.links.content":`Le site renvoie vers des démonstrations, un service de prise de rendez-vous et d’autres sites. Leur contenu et leurs pratiques relèvent de leurs éditeurs respectifs.`,"legal.contact.title":`Contact`,"legal.contact.content":`Pour une question relative au site, à un contenu ou à une demande juridique :`,"legal.related.title":`Documents associés`,"legal.related.content":`Consultez également les informations sur les données techniques et le stockage du choix de langue.`,"legal.related.privacy":`Politique de confidentialité`,"legal.related.cookies":`Cookies et stockage local`,"privacy.kicker":`Données et navigation`,"privacy.title":`Politique de confidentialité`,"privacy.lead":`Ce que ce site traite automatiquement, ce qu’il conserve dans votre navigateur et comment poser une question.`,"privacy.updated":`Mis à jour le 19 août 2026`,"privacy.summary.title":`À retenir`,"privacy.summary.content":`Le site n’intègre ni outil publicitaire ni mesure d’audience. Le serveur peut journaliser les requêtes techniques. Le navigateur conserve la langue et, après connexion, deux cookies strictement nécessaires.`,"privacy.who.title":`Responsable du site`,"privacy.who.content":`Sacha FROMENT édite froment.software et répond aux demandes relatives aux données traitées par ce site.`,"privacy.data.title":`Journaux techniques du serveur`,"privacy.data.content":`Lors du chargement d’une page ou d’un fichier, le serveur peut journaliser automatiquement des données de requête telles que l’adresse IP, la date et l’heure, le chemin demandé, l’agent utilisateur et le code de réponse. Cette journalisation technique résulte de la requête adressée au serveur ; elle n’est pas présentée comme reposant sur un consentement. Elle peut servir au diagnostic, à la disponibilité et à la sécurité du service.`,"privacy.retention.title":`Conservation des journaux`,"privacy.retention.content":`Aucune durée fixe n’est annoncée ici, car elle dépend de la configuration d’exploitation. Vous pouvez demander les informations à jour sur la conservation ou le traitement d’une requête précise.`,"privacy.storage.title":`Préférence de langue`,"privacy.storage.content":`Le site enregistre la langue choisie dans le stockage local du navigateur sous la clé « froment.software.language », avec la valeur « fr » ou « en ». Ce réglage persiste jusqu’à sa modification ou sa suppression depuis le navigateur. Il ne s’agit ni d’un cookie ni d’une session.`,"privacy.session.title":`Espace privé`,"privacy.session.content":`Après une connexion, le navigateur conserve temporairement un jeton d’accès en mémoire. Un cookie de renouvellement sécurisé maintient la connexion pendant 30 jours au maximum. Le serveur limite ce cookie aux routes d’authentification.`,"privacy.external.title":`E-mail et services externes`,"privacy.external.content":`Les liens de contact ouvrent votre logiciel de messagerie ; aucun message n’est envoyé par le site lui-même. Si vous suivez un lien vers un autre domaine, ce service applique ses propres règles de traitement.`,"privacy.rights.title":`Demandes relatives aux données`,"privacy.rights.content":`Vous pouvez demander quelles données techniques sont disponibles, signaler une erreur ou solliciter une suppression lorsque la requête peut être identifiée. Une adresse IP, une date et une plage horaire peuvent être nécessaires pour retrouver une ligne de journal. Cette présentation est informative et ne constitue pas un conseil juridique.`,"privacy.contact.title":`Contact`,"privacy.contact.content":`Pour une question ou une demande liée à la confidentialité :`,"privacy.related.title":`À lire aussi`,"privacy.related.cookies":`Détail des cookies et du stockage local`,"privacy.related.legal":`Mentions légales`,"cookies.kicker":`Stockage du navigateur`,"cookies.title":`Cookies et stockage local`,"cookies.lead":`Le site public mémorise uniquement la langue. L’espace privé utilise deux cookies strictement nécessaires après une connexion.`,"cookies.updated":`Mis à jour le 19 août 2026`,"cookies.summary.title":`Situation actuelle`,"cookies.summary.content":`L’application ne crée aucun cookie de mesure d’audience ou de publicité. Le cookie « __Secure-froment-refresh » maintient la connexion à l’espace privé.`,"cookies.what.title":`Différence entre cookie et stockage local`,"cookies.what.content":`Un cookie peut être envoyé automatiquement au serveur avec une requête. Le stockage local reste dans le navigateur. froment.software utilise le stockage local pour la langue et les cookies uniquement pour l’espace privé.`,"cookies.why.title":`Réglage enregistré`,"cookies.why.content":`La clé « froment.software.language » contient « fr » ou « en ». En l’absence de valeur valide, le site choisit le français si la langue du navigateur commence par « fr », et l’anglais dans les autres cas, puis mémorise ce choix localement.`,"cookies.control.title":`Modifier ou supprimer le réglage`,"cookies.control.content":`Utilisez le sélecteur de langue dans l’en-tête pour remplacer la valeur. Vous pouvez aussi supprimer les données du site dans les réglages de votre navigateur. Le site continuera de fonctionner et détectera de nouveau la langue au prochain chargement.`,"cookies.privacy.title":`Données techniques`,"cookies.privacy.content":`Le stockage local est distinct des journaux techniques que le serveur peut produire lorsqu’il répond à une requête.`,"cookies.privacy.link":`Lire la politique de confidentialité`,"cookies.contact.title":`Contact`,"cookies.contact.content":`Pour une question sur ce réglage ou le fonctionnement du site :`}),en:m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1({},re.en),oe$1.en),se.en),C$1.en),x$1.en),A$1.en),O$3.en),R$1.en),{"design.components.searchFilter":`Search: {query}`}),q$1.en),S$2.en),L$1.en),W$1.en),I$2.en),P$1.en),D$1.en),E$2.en),_$1.en),z$2.en),{"design.components.workflows":`Complete workflows`}),y$1.en),F$2.en),N$3.en),U$2.en),V$1.en),j$2.en),M$2.en),B$1.en),H$1.en),Q$2.en),G$1.en),K$2.en),Y$2.en),J$2.en),$$2.en),X$2.en),Z$2.en),ee$2.en),ie$1.en),te$1.en),ne$1.en),ae$1.en),{"design.confirmation.title":`Confirmation dialogs`,"design.confirmation.hint":`Focus starts on Cancel. Tab stays in the dialog. Escape and the backdrop cancel the request.`,"design.confirmation.open":`Open a confirmation`,"design.confirmation.discard":`Test discarding changes`,"design.confirmation.discardLabel":`Discard changes`,"design.confirmation.message":`Confirm this demonstration action?`,"design.confirmation.discardMessage":`Discard the demonstration changes? This dialog uses the same service as the backoffice forms.`,"design.confirmation.accepted":`Demonstration action confirmed.`,"design.confirmation.cancelled":`Demonstration action cancelled.`,"design.confirmation.noEffect":`These examples do not change data or call external services.`,"login.heading":`Sign in`,"login.description":`Your documents and payment records, in one place.`,"login.access":`Your account gives you access to the documents and actions available to you.`,"bank.history":`Reconciliation history`,"bank.historyHint":`The latest 100 matches, with dates, actor identifiers and reasons for removal.`,"bank.historyEmpty":`No reconciliation recorded for this transaction.`,"emails.prepareReminder":`Prepare a payment reminder`,"emails.preparingReminder":`Preparing the reminder…`,"emails.reminderFailed":`Cannot prepare the reminder. Check that the invoice is issued and has a remaining balance.`,"emails.reminderReview":`Check the recipient and balance before submitting the message. The recipient comes from the current client profile. No attachment is added. No automatic delivery is scheduled.`,"emails.reminderSubject":`Payment reminder — {reference}`,"emails.reminderBody":`Hello,
50
+ Merci.`,"services.offer.renovation.title":`Audit et rénovation`,"services.offer.renovation.desc":`Nous analysons vos projets, leur environnement, leurs risques et leurs lacunes. Nous proposons ensuite des corrections, des mises à niveau, des automatisations et une refactorisation progressive.`,"services.offer.renovation.cta":`Voir le détail de l’audit et de la rénovation`,"services.offer.development.title":`Développement tout compris`,"services.offer.development.desc":`Nous prenons en charge la conception, la réalisation, les tests et le déploiement d’une application métier ou d’un outil interne.`,"services.offer.development.cta":`Voir le détail du développement`,"serviceDetail.back":`Retour aux prestations`,"serviceDetail.renovation.title":`Audit et rénovation`,"serviceDetail.renovation.lead":`Comprendre les problèmes réels avant d’investir, puis moderniser l’existant sans réécriture systématique.`,"serviceDetail.renovation.scope.title":`Ce que nous analysons et améliorons`,"serviceDetail.renovation.scope.projects.title":`Projets et architecture`,"serviceDetail.renovation.scope.projects.desc":`Structure du code, dépendances, flux de données, points de fragilité et capacité d’évolution.`,"serviceDetail.renovation.scope.delivery.title":`Chaîne de livraison`,"serviceDetail.renovation.scope.delivery.desc":`Builds, tests, intégration continue, déploiements et délais entre une modification et sa mise en service.`,"serviceDetail.renovation.scope.quality.title":`CVE, failles et secrets`,"serviceDetail.renovation.scope.quality.desc":`Recherche de CVE et de failles avec des outils d’analyse statique adaptés aux langages. Détection des secrets présents dans le code et l’historique Git.`,"serviceDetail.renovation.scope.quality.staticAnalysis":`Outils d’analyse statique`,"serviceDetail.renovation.scope.quality.trufflehog":`TruffleHog`,"serviceDetail.renovation.scope.environment.title":`Environnement de travail`,"serviceDetail.renovation.scope.environment.desc":`Installation locale, secrets, documentation, outils et difficultés rencontrées par l’équipe existante.`,"serviceDetail.renovation.deliverables.title":`Ce que vous recevez`,"serviceDetail.renovation.deliverables.audit":`Un constat documenté, factuel et classé par niveau de risque.`,"serviceDetail.renovation.deliverables.plan":`Un plan d’amélioration priorisé avec les coûts, les dépendances et les résultats attendus.`,"serviceDetail.renovation.deliverables.work":`Les corrections et rénovations retenues dans le devis, validées sur votre environnement.`,"serviceDetail.renovation.deliverables.handover":`Le code, les tests et les instructions nécessaires pour maintenir et faire évoluer le logiciel.`,"serviceDetail.renovation.fit.title":`Cette prestation est adaptée si…`,"serviceDetail.renovation.fit.desc":`Votre logiciel reste utile, mais il devient lent à modifier, difficile à déployer ou risqué à maintenir.`,"serviceDetail.development.title":`Développement tout compris`,"serviceDetail.development.lead":`Un interlocuteur unique pour transformer un besoin métier en logiciel testé, déployé et documenté.`,"serviceDetail.development.scope.title":`Une prestation complète`,"serviceDetail.development.scope.design.title":`Conception`,"serviceDetail.development.scope.design.desc":`Clarification des usages, parcours, données, contraintes et critères de validation.`,"serviceDetail.development.scope.build.title":`Réalisation`,"serviceDetail.development.scope.build.desc":`Développement de l’interface, des règles métier, des intégrations et des automatisations nécessaires.`,"serviceDetail.development.scope.tests.title":`Tests`,"serviceDetail.development.scope.tests.desc":`Tests automatisés et validations fonctionnelles ciblés sur les usages et les risques du produit.`,"serviceDetail.development.scope.deploy.title":`Déploiement`,"serviceDetail.development.scope.deploy.desc":`Mise en service reproductible, configuration des environnements et préparation de l’exploitation.`,"serviceDetail.development.deliverables.title":`Ce qui est inclus`,"serviceDetail.development.deliverables.product":`Une application web, une application de bureau ou un outil interne conforme au périmètre validé.`,"serviceDetail.development.deliverables.source":`Le code source et les dépendances nécessaires pour construire le produit.`,"serviceDetail.development.deliverables.tests":`Les tests automatisés et les critères utilisés pour valider la livraison.`,"serviceDetail.development.deliverables.operations":`La documentation et les instructions de déploiement, d’utilisation et de maintenance.`,"serviceDetail.development.fit.title":`Cette prestation est adaptée si…`,"serviceDetail.development.fit.desc":`Vous avez un besoin métier précis et souhaitez confier toute la réalisation jusqu’à la mise en service.`,"services.examples.title":`Cas concrets`,"services.examples.upgrades.title":`Montées de version`,"services.examples.upgrades.desc":`Mettre à niveau les dépendances et bibliothèques, traiter les incompatibilités puis valider le comportement par les tests.`,"services.examples.build.title":`Chaîne de build`,"services.examples.build.before":`Rendre les builds reproductibles avec`,"services.examples.build.after":`: dépendances déclarées, environnements identiques et cache partagé.`,"services.examples.ci.title":`Intégration continue`,"services.examples.ci.desc":`Reprendre une CI existante, supprimer les tâches inutiles, paralléliser les étapes et mettre en cache les résultats réutilisables.`,"services.examples.tests.title":`Tests automatisés`,"services.examples.tests.desc":`Mettre en place des tests unitaires, d’intégration et d’architecture pour stabiliser l’existant et vérifier automatiquement le fonctionnement de l’application.`,"services.examples.environments.title":`Environnements de développement`,"services.examples.environments.before":`Déclarer et automatiser des environnements reproductibles avec`,"services.examples.secrets.title":`Gestion des secrets`,"services.examples.secrets.before":`Centraliser les secrets dans un coffre sur site, un service cloud ou une solution légère :`,"services.examples.secrets.through":`Automatiser leur injection dans les applications avec`,"services.examples.ai.title":`Agents IA`,"services.examples.ai.before":`Intégrer des agents spécialisés aux échanges de conception : préparation du backlog, analyse pendant les réunions et prototypage en direct avec`,"services.examples.ai.usage":`Suivre les volumes, les modèles et les coûts avec`,"services.examples.metrics.title":`Mesures techniques`,"services.examples.metrics.before":`Mesurer les temps de réponse, de test, de build, de CI et de déploiement. Publier des indicateurs horodatés dans`,"services.examples.metrics.after":`afin de suivre des valeurs mesurées plutôt que des estimations.`,"services.examples.infrastructure.title":`Infrastructure et déploiement`,"services.examples.infrastructure.before":`Déclarer, tester et reproduire les déploiements sur site ou dans le cloud avec NixOS, cache de build et infrastructure as code via`,"services.examples.or":`ou`,"services.process.kicker":`Méthode de livraison`,"services.process.title":`Déroulement d’une mission`,"services.process.analysis.title":`Qualifier le besoin`,"services.process.analysis.desc":`Nous réalisons un examen initial limité pour comprendre le contexte et préparer le devis. L’audit approfondi commence après validation.`,"services.process.quote.title":`Établir le devis`,"services.process.quote.desc":`Nous vous remettons un devis détaillé. Il précise les prestations, les livrables, le calendrier et le prix.`,"services.process.agreement.title":`Valider le cadre`,"services.process.agreement.desc":`Vous acceptez la proposition. Si nous précisons ensuite un objectif ou le périmètre, nous vous soumettons un devis mis à jour avant de commencer.`,"services.process.delivery.title":`Réaliser la mission`,"services.process.delivery.desc":`Nous réalisons la mission au contact de vos interlocuteurs et de votre équipe de développement existante.`,"services.process.validation.title":`Valider la livraison`,"services.process.validation.desc":`Vous validez les livrables selon les critères du devis, puis vous réglez le solde de la mission.`,"services.practical.title":`En pratique`,"services.practical.method":`Méthode`,"services.practical.method.desc":`Le devis fixe le périmètre, le prix, les livrables et les critères d’acceptation.`,"services.practical.schedule":`Délais`,"services.practical.schedule.desc":`Le calendrier est défini selon le périmètre, les dépendances et les validations attendues.`,"services.practical.deliverables":`Livrables`,"services.practical.deliverables.desc":`Code source, tests, documentation et instructions de mise en service selon la mission.`,"services.criteria.title":`Éléments utiles pour commencer`,"services.criteria.context":`Le contexte et les utilisateurs concernés.`,"services.criteria.problem":`Le problème principal ou le résultat attendu.`,"services.criteria.deadline":`L’échéance connue et les contraintes techniques.`,"serviceDetail.contact.title":`Échanger sur votre besoin`,"clients.title":`Expérience`,"clients.sectors.title":`Secteurs d’expérience`,"clients.cv":`Voir le CV complet`,"clients.sector.industry":`Industrie`,"clients.sector.insurance":`Assurance`,"clients.sector.services":`Services`,"about.faq.title":`Questions fréquentes`,"about.faq.intro":`Des réponses directes sur le fonctionnement d’une collaboration.`,"about.faq.process.q":`Comment se déroule une mission ?`,"about.faq.stack.q":`Comment choisissez-vous les technologies ?`,"about.faq.remote.q":`Travaillez-vous à distance ?`,"about.faq.nda.q":`Acceptez-vous les accords de confidentialité ?`,"about.faq.timeline.q":`Comment fixez-vous le calendrier ?`,"about.faq.maintenance.q":`Proposez-vous une maintenance après livraison ?`,"about.faq.pricing.q":`Comment les prestations sont-elles facturées ?`,"about.faq.availability.q":`Quelle est votre disponibilité ?`,"about.faq.process.a":`Un premier échange précise le besoin, les contraintes et les critères de réussite. Le devis fixe ensuite le périmètre, les livrables et les modalités de suivi avant le développement et la mise en service.`,"about.faq.stack.a":`Le choix dépend du produit, de l’équipe et du système existant. Technologies utilisées : Angular, SvelteKit, ASP.NET, WPF, Go, Linux et PostgreSQL.`,"about.faq.remote.a":`Oui, le travail se fait principalement à distance, avec des points de suivi convenus selon la mission.`,"about.faq.nda.a":`Oui, après accord sur les obligations, la durée et les informations concernées.`,"about.faq.timeline.a":`Le calendrier dépend du périmètre, des dépendances et des validations attendues. Il est défini dans le devis plutôt que promis avant le cadrage.`,"about.faq.maintenance.a":`Oui. Correctifs, mises à jour et évolutions peuvent être prévus dès le devis ou convenus après la livraison.`,"about.faq.pricing.a":`Au forfait lorsque le périmètre est suffisamment stable. Les incertitudes sont d’abord isolées dans une phase de cadrage.`,"about.faq.availability.a":`Les missions sont planifiées à temps partiel. La date de début est confirmée avant le devis.`,"not_found.title":`Cette page n’existe pas.`,"not_found.lead":`Vérifiez l’adresse ou revenez à l’accueil.`,"not_found.cta":`Retour à l’accueil`,"not_found.links_label":`Prochaines étapes`,"not_found.services":`Voir les prestations`,"not_found.contact":`Écrire à Froment Software`,"about.contact.title":`Contact`,"about.contact.mail":`Nous écrire`,"about.contact.book":`Prendre rendez-vous`,"blog.title":`Blog`,"blog.lead":`Notes techniques, retours d’expérience et idées.`,"blog.topics":`Sujets`,"blog.back":`Retour au blog`,"blog.missing":`Article introuvable`,"legal.kicker":`Informations du site`,"legal.title":`Mentions légales`,"legal.lead":`Les informations essentielles sur l’édition, l’hébergement et l’utilisation des contenus de froment.software.`,"legal.updated":`Mis à jour le 19 août 2026`,"legal.summary.title":`En bref`,"legal.summary.content":`froment.software présente l’activité et les services de conseil en ingénierie logicielle de Sacha FROMENT. Son espace privé fournit des comptes aux clients et aux administrateurs.`,"legal.publisher.title":`Édition du site`,"legal.publisher.content":`Le site froment.software est édité et maintenu par Sacha FROMENT. Les demandes administratives ou juridiques peuvent être adressées par e-mail.`,"legal.hosting.title":`Hébergement`,"legal.hosting.content":`Le site est servi comme un site statique et hébergé sur une infrastructure privée administrée par l’éditeur. Les demandes techniques relatives à l’hébergement peuvent être envoyées au même contact.`,"legal.ip.title":`Contenus et propriété intellectuelle`,"legal.ip.content":`Sauf mention contraire, les textes, éléments graphiques et composants propres à froment.software restent la propriété de leur auteur. Une citation courte avec attribution est possible ; toute autre réutilisation doit faire l’objet d’un accord préalable.`,"legal.links.title":`Liens externes`,"legal.links.content":`Le site renvoie vers des démonstrations, un service de prise de rendez-vous et d’autres sites. Leur contenu et leurs pratiques relèvent de leurs éditeurs respectifs.`,"legal.contact.title":`Contact`,"legal.contact.content":`Pour une question relative au site, à un contenu ou à une demande juridique :`,"legal.related.title":`Documents associés`,"legal.related.content":`Consultez également les informations sur les données techniques et le stockage du choix de langue.`,"legal.related.privacy":`Politique de confidentialité`,"legal.related.cookies":`Cookies et stockage local`,"privacy.kicker":`Données et navigation`,"privacy.title":`Politique de confidentialité`,"privacy.lead":`Ce que ce site traite automatiquement, ce qu’il conserve dans votre navigateur et comment poser une question.`,"privacy.updated":`Mis à jour le 19 août 2026`,"privacy.summary.title":`À retenir`,"privacy.summary.content":`Le site n’intègre ni outil publicitaire ni mesure d’audience. Le serveur peut journaliser les requêtes techniques. Le navigateur conserve la langue et, après connexion, deux cookies strictement nécessaires.`,"privacy.who.title":`Responsable du site`,"privacy.who.content":`Sacha FROMENT édite froment.software et répond aux demandes relatives aux données traitées par ce site.`,"privacy.data.title":`Journaux techniques du serveur`,"privacy.data.content":`Lors du chargement d’une page ou d’un fichier, le serveur peut journaliser automatiquement des données de requête telles que l’adresse IP, la date et l’heure, le chemin demandé, l’agent utilisateur et le code de réponse. Cette journalisation technique résulte de la requête adressée au serveur ; elle n’est pas présentée comme reposant sur un consentement. Elle peut servir au diagnostic, à la disponibilité et à la sécurité du service.`,"privacy.retention.title":`Conservation des journaux`,"privacy.retention.content":`Aucune durée fixe n’est annoncée ici, car elle dépend de la configuration d’exploitation. Vous pouvez demander les informations à jour sur la conservation ou le traitement d’une requête précise.`,"privacy.storage.title":`Préférence de langue`,"privacy.storage.content":`Le site enregistre la langue choisie dans le stockage local du navigateur sous la clé « froment.software.language », avec la valeur « fr » ou « en ». Ce réglage persiste jusqu’à sa modification ou sa suppression depuis le navigateur. Il ne s’agit ni d’un cookie ni d’une session.`,"privacy.session.title":`Espace privé`,"privacy.session.content":`Après une connexion, le navigateur conserve temporairement un jeton d’accès en mémoire. Un cookie de renouvellement sécurisé maintient la connexion pendant 30 jours au maximum. Le serveur limite ce cookie aux routes d’authentification.`,"privacy.external.title":`E-mail et services externes`,"privacy.external.content":`Les liens de contact ouvrent votre logiciel de messagerie ; aucun message n’est envoyé par le site lui-même. Si vous suivez un lien vers un autre domaine, ce service applique ses propres règles de traitement.`,"privacy.rights.title":`Demandes relatives aux données`,"privacy.rights.content":`Vous pouvez demander quelles données techniques sont disponibles, signaler une erreur ou solliciter une suppression lorsque la requête peut être identifiée. Une adresse IP, une date et une plage horaire peuvent être nécessaires pour retrouver une ligne de journal. Cette présentation est informative et ne constitue pas un conseil juridique.`,"privacy.contact.title":`Contact`,"privacy.contact.content":`Pour une question ou une demande liée à la confidentialité :`,"privacy.related.title":`À lire aussi`,"privacy.related.cookies":`Détail des cookies et du stockage local`,"privacy.related.legal":`Mentions légales`,"cookies.kicker":`Stockage du navigateur`,"cookies.title":`Cookies et stockage local`,"cookies.lead":`Le site public mémorise uniquement la langue. L’espace privé utilise deux cookies strictement nécessaires après une connexion.`,"cookies.updated":`Mis à jour le 19 août 2026`,"cookies.summary.title":`Situation actuelle`,"cookies.summary.content":`L’application ne crée aucun cookie de mesure d’audience ou de publicité. Le cookie « __Secure-froment-refresh » maintient la connexion à l’espace privé.`,"cookies.what.title":`Différence entre cookie et stockage local`,"cookies.what.content":`Un cookie peut être envoyé automatiquement au serveur avec une requête. Le stockage local reste dans le navigateur. froment.software utilise le stockage local pour la langue et les cookies uniquement pour l’espace privé.`,"cookies.why.title":`Réglage enregistré`,"cookies.why.content":`La clé « froment.software.language » contient « fr » ou « en ». En l’absence de valeur valide, le site choisit le français si la langue du navigateur commence par « fr », et l’anglais dans les autres cas, puis mémorise ce choix localement.`,"cookies.control.title":`Modifier ou supprimer le réglage`,"cookies.control.content":`Utilisez le sélecteur de langue dans l’en-tête pour remplacer la valeur. Vous pouvez aussi supprimer les données du site dans les réglages de votre navigateur. Le site continuera de fonctionner et détectera de nouveau la langue au prochain chargement.`,"cookies.privacy.title":`Données techniques`,"cookies.privacy.content":`Le stockage local est distinct des journaux techniques que le serveur peut produire lorsqu’il répond à une requête.`,"cookies.privacy.link":`Lire la politique de confidentialité`,"cookies.contact.title":`Contact`,"cookies.contact.content":`Pour une question sur ce réglage ou le fonctionnement du site :`}),en:m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1({},re.en),oe$1.en),se.en),C$1.en),x$1.en),A$1.en),O$3.en),R$1.en),{"design.components.searchFilter":`Search: {query}`}),q$1.en),S$2.en),L$1.en),W$1.en),I$2.en),D$1.en),P$1.en),E$2.en),_$1.en),z$2.en),{"design.components.workflows":`Complete workflows`}),y$1.en),F$2.en),N$3.en),U$2.en),V$1.en),j$2.en),M$2.en),B$1.en),H$1.en),Q$2.en),G$1.en),K$2.en),Y$2.en),J$2.en),$$2.en),X$2.en),Z$2.en),ee$2.en),ie$1.en),te$1.en),ne$1.en),ae$1.en),{"design.confirmation.title":`Confirmation dialogs`,"design.confirmation.hint":`Focus starts on Cancel. Tab stays in the dialog. Escape and the backdrop cancel the request.`,"design.confirmation.open":`Open a confirmation`,"design.confirmation.discard":`Test discarding changes`,"design.confirmation.discardLabel":`Discard changes`,"design.confirmation.message":`Confirm this demonstration action?`,"design.confirmation.discardMessage":`Discard the demonstration changes? This dialog uses the same service as the backoffice forms.`,"design.confirmation.accepted":`Demonstration action confirmed.`,"design.confirmation.cancelled":`Demonstration action cancelled.`,"design.confirmation.noEffect":`These examples do not change data or call external services.`,"login.heading":`Sign in`,"login.description":`Your documents and payment records, in one place.`,"login.access":`Your account gives you access to the documents and actions available to you.`,"login.demoHeading":`Demo accounts`,"login.demoDescription":`Synthetic data resets regularly. Choose an account to sign in.`,"login.demoPassword":`Account password`,"bank.history":`Reconciliation history`,"bank.historyHint":`The latest 100 matches, with dates, actor identifiers and reasons for removal.`,"bank.historyEmpty":`No reconciliation recorded for this transaction.`,"emails.prepareReminder":`Prepare a payment reminder`,"emails.preparingReminder":`Preparing the reminder…`,"emails.reminderFailed":`Cannot prepare the reminder. Check that the invoice is issued and has a remaining balance.`,"emails.reminderReview":`Check the recipient and balance before submitting the message. The recipient comes from the current client profile. No attachment is added. No automatic delivery is scheduled.`,"emails.reminderSubject":`Payment reminder — {reference}`,"emails.reminderBody":`Hello,
51
51
 
52
52
  According to our recorded payments, invoice {reference} has a remaining balance of {amount}. Its due date is {dueDate}.
53
53
 
@@ -86,4 +86,4 @@ We would like to discuss the following project:
86
86
  - Desired deadline:
87
87
  - Approximate budget:
88
88
 
89
- Thank you.`,"services.offer.renovation.title":`Audit and renovation`,"services.offer.renovation.desc":`We assess your projects, environment, risks and gaps. We then propose fixes, upgrades, automation and gradual refactoring.`,"services.offer.renovation.cta":`View audit and renovation details`,"services.offer.development.title":`All-inclusive development`,"services.offer.development.desc":`We handle the design, implementation, testing and deployment of a business application or internal tool.`,"services.offer.development.cta":`View development details`,"serviceDetail.back":`Back to services`,"serviceDetail.renovation.title":`Audit and renovation`,"serviceDetail.renovation.lead":`Understand the real problems before investing, then modernize existing software without a systematic rewrite.`,"serviceDetail.renovation.scope.title":`What we assess and improve`,"serviceDetail.renovation.scope.projects.title":`Projects and architecture`,"serviceDetail.renovation.scope.projects.desc":`Code structure, dependencies, data flows, weak points and capacity for further change.`,"serviceDetail.renovation.scope.delivery.title":`Delivery pipeline`,"serviceDetail.renovation.scope.delivery.desc":`Builds, tests, continuous integration, deployments and lead time from a change to production.`,"serviceDetail.renovation.scope.quality.title":`CVEs, vulnerabilities and secrets`,"serviceDetail.renovation.scope.quality.desc":`CVE and vulnerability detection with static analysis tools suited to each language. Detection of secrets in source code and Git history.`,"serviceDetail.renovation.scope.quality.staticAnalysis":`Static analysis tools`,"serviceDetail.renovation.scope.quality.trufflehog":`TruffleHog`,"serviceDetail.renovation.scope.environment.title":`Working environment`,"serviceDetail.renovation.scope.environment.desc":`Local setup, secrets, documentation, tools and problems faced by the existing team.`,"serviceDetail.renovation.deliverables.title":`What you receive`,"serviceDetail.renovation.deliverables.audit":`A documented, factual assessment ranked by risk level.`,"serviceDetail.renovation.deliverables.plan":`A prioritized improvement plan with costs, dependencies and expected results.`,"serviceDetail.renovation.deliverables.work":`The fixes and renovation agreed in the quote, validated in your environment.`,"serviceDetail.renovation.deliverables.handover":`The code, tests, documentation and instructions required for subsequent work.`,"serviceDetail.renovation.fit.title":`This service fits if…`,"serviceDetail.renovation.fit.desc":`Your software remains useful, but it is slow to change, hard to deploy or risky to maintain.`,"serviceDetail.development.title":`All-inclusive development`,"serviceDetail.development.lead":`One contact to turn a business need into tested, deployed and documented software.`,"serviceDetail.development.scope.title":`End-to-end delivery`,"serviceDetail.development.scope.design.title":`Design`,"serviceDetail.development.scope.design.desc":`Clarification of uses, journeys, data, constraints and approval criteria.`,"serviceDetail.development.scope.build.title":`Implementation`,"serviceDetail.development.scope.build.desc":`Development of the interface, business rules, integrations and required automation.`,"serviceDetail.development.scope.tests.title":`Testing`,"serviceDetail.development.scope.tests.desc":`Automated tests and functional checks focused on product uses and risks.`,"serviceDetail.development.scope.deploy.title":`Deployment`,"serviceDetail.development.scope.deploy.desc":`Reproducible rollout, environment configuration and preparation for operations.`,"serviceDetail.development.deliverables.title":`What is included`,"serviceDetail.development.deliverables.product":`A web application, desktop application or internal tool that meets the approved scope.`,"serviceDetail.development.deliverables.source":`The source code and dependencies required to build the product.`,"serviceDetail.development.deliverables.tests":`Automated tests and the criteria used to approve delivery.`,"serviceDetail.development.deliverables.operations":`Documentation and instructions for deployment, use and maintenance.`,"serviceDetail.development.fit.title":`This service fits if…`,"serviceDetail.development.fit.desc":`You have a precise business need and want to delegate delivery through production rollout.`,"services.examples.title":`Concrete examples`,"services.examples.upgrades.title":`Version upgrades`,"services.examples.upgrades.desc":`Upgrade dependencies and libraries, resolve incompatibilities, then validate behaviour through tests.`,"services.examples.build.title":`Build pipeline`,"services.examples.build.before":`Make builds reproducible with`,"services.examples.build.after":`: declared dependencies, identical environments and shared caches.`,"services.examples.ci.title":`Continuous integration`,"services.examples.ci.desc":`Take over an existing CI pipeline, remove unnecessary work, parallelize stages and cache reusable results.`,"services.examples.tests.title":`Automated tests`,"services.examples.tests.desc":`Add unit, integration and architecture tests to stabilize existing software and automatically verify application behaviour.`,"services.examples.environments.title":`Development environments`,"services.examples.environments.before":`Declare and automate reproducible development environments with`,"services.examples.secrets.title":`Secret management`,"services.examples.secrets.before":`Centralize secrets in an on-premises vault, a cloud service or a lightweight solution:`,"services.examples.secrets.through":`Automate their injection into applications with`,"services.examples.ai.title":`AI agents`,"services.examples.ai.before":`Integrate specialized agents into design discussions: backlog preparation, meeting analysis and live prototyping with`,"services.examples.ai.usage":`Track usage, models and costs with`,"services.examples.metrics.title":`Technical measurements`,"services.examples.metrics.before":`Measure response, test, build, CI and deployment times. Publish timestamped indicators to`,"services.examples.metrics.after":`to track measured values instead of estimates.`,"services.examples.infrastructure.title":`Infrastructure and deployment`,"services.examples.infrastructure.before":`Declare, test and reproduce on-premises or cloud deployments with NixOS, build caching and infrastructure as code through`,"services.examples.or":`or`,"services.process.kicker":`Delivery method`,"services.process.title":`How an engagement works`,"services.process.analysis.title":`Qualify the need`,"services.process.analysis.desc":`We perform a limited initial review to understand the context and prepare the quote. The full audit starts after approval.`,"services.process.quote.title":`Prepare the quote`,"services.process.quote.desc":`We provide a detailed quote. It defines the services, deliverables, schedule and price.`,"services.process.agreement.title":`Approve the scope`,"services.process.agreement.desc":`You accept the proposal. If we then refine an objective or the scope, we submit an updated quote before work starts.`,"services.process.delivery.title":`Deliver the work`,"services.process.delivery.desc":`We deliver the work in close contact with your stakeholders and existing development team.`,"services.process.validation.title":`Approve delivery`,"services.process.validation.desc":`You approve the deliverables against the quote criteria, then pay the remaining balance.`,"services.practical.title":`In practice`,"services.practical.method":`Method`,"services.practical.method.desc":`The quote defines scope, price, deliverables and acceptance criteria.`,"services.practical.schedule":`Schedule`,"services.practical.schedule.desc":`The schedule is defined from the scope, dependencies and expected approvals.`,"services.practical.deliverables":`Deliverables`,"services.practical.deliverables.desc":`Source code, tests, documentation and rollout instructions appropriate to the engagement.`,"services.criteria.title":`Useful information to get started`,"services.criteria.context":`The context and affected users.`,"services.criteria.problem":`The main problem or expected result.`,"services.criteria.deadline":`The known deadline and technical constraints.`,"serviceDetail.contact.title":`Discuss your need`,"clients.title":`Experience`,"clients.sectors.title":`Industry experience`,"clients.cv":`View full CV`,"clients.sector.industry":`Industry`,"clients.sector.insurance":`Insurance`,"clients.sector.services":`Services`,"about.faq.title":`Frequently asked questions`,"about.faq.intro":`Direct answers about how a collaboration works.`,"about.faq.process.q":`How does an engagement work?`,"about.faq.stack.q":`How do you choose technologies?`,"about.faq.remote.q":`Do you work remotely?`,"about.faq.nda.q":`Do you accept confidentiality agreements?`,"about.faq.timeline.q":`How do you set the schedule?`,"about.faq.maintenance.q":`Do you offer maintenance after delivery?`,"about.faq.pricing.q":`How are services billed?`,"about.faq.availability.q":`What is your availability?`,"about.faq.process.a":`An initial discussion identifies the need, constraints and success criteria. The quote then defines scope, deliverables and follow-up terms before development and go-live.`,"about.faq.stack.a":`The choice depends on the product, team and existing system. Technologies used: Angular, SvelteKit, ASP.NET, WPF, Go, Linux and PostgreSQL.`,"about.faq.remote.a":`Yes. Work is mainly remote, with review points agreed for each engagement.`,"about.faq.nda.a":`Yes, after agreement on the obligations, duration and information covered.`,"about.faq.timeline.a":`The schedule depends on scope, dependencies and expected approvals. It is defined in the quote rather than promised before scoping.`,"about.faq.maintenance.a":`Yes. Fixes, upgrades and further changes can be included in the quote or agreed after delivery.`,"about.faq.pricing.a":`Fixed-price when the scope is stable enough. Uncertainty is first isolated in a scoping phase.`,"about.faq.availability.a":`Engagements are scheduled part-time. The start date is confirmed before the quote.`,"not_found.title":`This page does not exist.`,"not_found.lead":`Check the address or return to the home page.`,"not_found.cta":`Back to home`,"not_found.links_label":`Next steps`,"not_found.services":`View services`,"not_found.contact":`Email Froment Software`,"about.contact.title":`Contact`,"about.contact.mail":`Email us`,"about.contact.book":`Book an appointment`,"blog.title":`Blog`,"blog.lead":`Technical notes, experience reports and ideas.`,"blog.topics":`Topics`,"blog.back":`Back to the blog`,"blog.missing":`Article not found`,"legal.kicker":`Site information`,"legal.title":`Legal notice`,"legal.lead":`Essential information about the publishing, hosting and use of froment.software content.`,"legal.updated":`Updated 19 August 2026`,"legal.summary.title":`At a glance`,"legal.summary.content":`froment.software presents Sacha FROMENT’s software-engineering consultancy work and services. Its private area provides accounts for clients and administrators.`,"legal.publisher.title":`Site publisher`,"legal.publisher.content":`froment.software is published and maintained by Sacha FROMENT. Administrative or legal requests can be sent by email.`,"legal.hosting.title":`Hosting`,"legal.hosting.content":`The site is served as a static website and hosted on private infrastructure administered by the publisher. Technical requests relating to hosting can be sent to the same contact.`,"legal.ip.title":`Content and intellectual property`,"legal.ip.content":`Unless stated otherwise, text, graphics and components created for froment.software remain their author’s property. Short quotations with attribution are permitted; any other reuse requires prior agreement.`,"legal.links.title":`External links`,"legal.links.content":`The site links to demonstrations, a booking service and other websites. Their content and practices are the responsibility of their respective publishers.`,"legal.contact.title":`Contact`,"legal.contact.content":`For a question about the site, its content or a legal request:`,"legal.related.title":`Related documents`,"legal.related.content":`You can also read how technical data and the language preference are handled.`,"legal.related.privacy":`Privacy policy`,"legal.related.cookies":`Cookies and local storage`,"privacy.kicker":`Data and browsing`,"privacy.title":`Privacy policy`,"privacy.lead":`What this site processes automatically, what it keeps in your browser and how to ask a question.`,"privacy.updated":`Updated 19 August 2026`,"privacy.summary.title":`Key points`,"privacy.summary.content":`The site has no advertising tool or audience analytics. The server may log technical requests. The browser stores the language and, after sign-in, two strictly necessary cookies.`,"privacy.who.title":`Site operator`,"privacy.who.content":`Sacha FROMENT publishes froment.software and handles requests about data processed by this site.`,"privacy.data.title":`Technical server logs`,"privacy.data.content":`When a page or file is loaded, the server may automatically log request data such as the IP address, date and time, requested path, user agent and response status. This technical logging results from the request sent to the server; it is not presented as consent-based. It may be used for service diagnosis, availability and security.`,"privacy.retention.title":`Log retention`,"privacy.retention.content":`No fixed duration is stated here because it depends on the operating configuration. You may request current information about retention or the handling of a specific request.`,"privacy.storage.title":`Language preference`,"privacy.storage.content":`The site stores the selected language in the browser’s local storage under the key “froment.software.language”, with the value “fr” or “en”. This setting persists until it is changed or cleared in the browser. It is neither a cookie nor a session.`,"privacy.session.title":`Private area`,"privacy.session.content":`After sign-in, the browser temporarily stores an access token in memory. A secure refresh cookie maintains access for up to 30 days. The server restricts this cookie to authentication routes.`,"privacy.external.title":`Email and external services`,"privacy.external.content":`Contact links open your email application; the site itself does not send a message. If you follow a link to another domain, that service applies its own data-handling rules.`,"privacy.rights.title":`Data requests`,"privacy.rights.content":`You may ask what technical data is available, report an error or request deletion when the request can be identified. An IP address, date and time range may be needed to locate a log entry. This is practical information, not legal advice.`,"privacy.contact.title":`Contact`,"privacy.contact.content":`For a privacy question or data request:`,"privacy.related.title":`Related information`,"privacy.related.cookies":`Details about cookies and local storage`,"privacy.related.legal":`Legal notice`,"cookies.kicker":`Browser storage`,"cookies.title":`Cookies and local storage`,"cookies.lead":`The public site only stores the display language. The private area uses two strictly necessary cookies after sign-in.`,"cookies.updated":`Updated 19 August 2026`,"cookies.summary.title":`Current behaviour`,"cookies.summary.content":`The application creates no audience analytics or advertising cookie. The “__Secure-froment-refresh” cookie maintains private-area authentication.`,"cookies.what.title":`Cookies and local storage are different`,"cookies.what.content":`A cookie may be sent to the server automatically with a request. Local storage remains in the browser. froment.software uses local storage for language and cookies only for the private area.`,"cookies.why.title":`Stored setting`,"cookies.why.content":`The key “froment.software.language” contains “fr” or “en”. If no valid value exists, the site selects French when the browser language starts with “fr”, and English otherwise, then stores that choice locally.`,"cookies.control.title":`Change or clear the setting`,"cookies.control.content":`Use the language selector in the header to replace the value. You can also clear site data in your browser settings. The site will continue to work and will detect the language again on the next load.`,"cookies.privacy.title":`Technical data`,"cookies.privacy.content":`Local storage is separate from the technical logs the server may produce when responding to a request.`,"cookies.privacy.link":`Read the privacy policy`,"cookies.contact.title":`Contact`,"cookies.contact.content":`For a question about this setting or how the site works:`})};function ye(t){let i=[],n=0,a=-1;for(let s=0;s<t.length;s+=1)t[s]===`{`?a=s:t[s]===`}`&&(a>=n&&a+1<s&&(a>n&&i.push({kind:`text`,value:t.slice(n,a)}),i.push({kind:`parameter`,name:t.slice(a+1,s)}),n=s+1),a=-1);return n<t.length&&i.push({kind:`text`,value:t.slice(n)}),i}function Ce(t,i){return t.map(n=>n.kind===`text`?n.value:Object.hasOwn(i,n.name)?String(i[n.name]):`{${n.name}}`).join(``)}var xe=[{code:`fr`,labelKey:`lang.fr`},{code:`en`,labelKey:`lang.en`}];function o$3(t,i){return ke[t][i]}var De={fr:new Intl.PluralRules(`fr`),en:new Intl.PluralRules(`en`)};var Te=new Map;function bt$1(t,i){return Re(o$3(t,i))}function we(t,i,n){return Oe(o$3(t,i),n)}function Ae(t,i,n){let a=`${i}.one`,s=`${i}.other`;return Ee(t,{one:o$3(t,a),other:o$3(t,s)},n)}function Ee(t,i,n){if(!Number.isSafeInteger(n.count)||n.count<0)throw new RangeError(`Le compteur de traduction doit être un entier sûr positif ou nul.`);return Oe(i[De[t].select(n.count)===`one`?`one`:`other`],n)}function Oe(t,i){return Ce(Re(t),i)}function Re(t){let i=Te.get(t);return i===void 0&&(i=ye(t),Te.set(t,i)),i}var ce$1={fr:{invoiceReceiptList:{summary:`Lister les encaissements enregistrés`,description:`Retourne les encaissements actifs et annulés avec leur facture et leur client. Inclut la date, l’auteur et le motif des corrections. Cette lecture ne crée aucun encaissement. Les paiements de test Stripe sont exclus. La limite est de 10 000 lignes. Au-delà, retourne 413 avec invoice.workspace_limit, sans résultat partiel.`},creditNoteList:{summary:`Lister les avoirs émis`,description:`Retourne les avoirs persistés avec leur facture, leur commande et leur client. Les montants proviennent de l’avoir immuable. Cette lecture ne modifie aucun document. La limite est de 10 000 lignes. Au-delà, retourne 413 avec invoice.workspace_limit, sans résultat partiel.`},invoiceRefundList:{summary:`Lister les remboursements enregistrés`,description:`Retourne les saisies actives et annulées avec leur facture et leur client. Une saisie locale ne prouve aucun virement bancaire. Cette lecture ne déclenche aucun remboursement. La limite est de 10 000 lignes. Au-delà, retourne 413 avec invoice.workspace_limit, sans résultat partiel.`},invoiceHistory:{summary:`Lire l’historique d’une facture`,description:`Retourne les événements persistés de la facture et de ses documents, par date décroissante. Exige aussi audit.read. Aucun événement n’est déduit du statut actuel. Une facture absente produit une réponse 404. La limite est de 10 000 événements, documents compris. Au-delà, retourne 413 avec invoice.workspace_limit, sans résultat partiel.`},bankTransactionGet:{summary:`Consulter une opération bancaire`,description:`Retourne une opération importée avec ses affectations et ses montants restants. La lecture par identifiant ne dépend pas de la limite de la liste. Elle ne contacte aucune banque.`},bankImportPreview:{summary:`Valider un relevé avant import`,description:`Valide le compte et toutes les lignes CSV avec le parseur utilisé par l’import. Distingue les opérations nouvelles des opérations déjà présentes. Ne persiste aucune ligne. La confirmation revalide le relevé dans la transaction d’import.`},bankLedgerEntryGet:{summary:`Consulter une écriture bancaire`,description:`Retourne une écriture persistée par identifiant, indépendamment de la période du journal. Inclut la référence de sa source et ses lignes comptables. Ne crée aucune écriture ni contrepassation.`},bankLedgerSourceGet:{summary:`Consulter une source à comptabiliser`,description:`Retourne le contexte d’un débit bancaire ou d’une commission de rapprochement. La comptabilisation reste une action distincte et explicite. Ce journal local ne constitue pas une comptabilité générale.`}},en:{invoiceReceiptList:{summary:`List recorded receipts`,description:`Returns active and cancelled receipts with their invoice and client. Includes the date, actor and reason for corrections. This read creates no receipt. Stripe test payments are excluded. The limit is 10,000 rows. Larger results return 413 with invoice.workspace_limit and no partial result.`},creditNoteList:{summary:`List issued credit notes`,description:`Returns persisted credit notes with their invoice, order and client. Amounts come from the immutable credit note. This read changes no document. The limit is 10,000 rows. Larger results return 413 with invoice.workspace_limit and no partial result.`},invoiceRefundList:{summary:`List recorded refunds`,description:`Returns active and cancelled records with their invoice and client. A local record does not prove a bank transfer. This read initiates no refund. The limit is 10,000 rows. Larger results return 413 with invoice.workspace_limit and no partial result.`},invoiceHistory:{summary:`Read invoice history`,description:`Returns persisted invoice and document events in descending date order. Also requires audit.read. No event is inferred from the current status. A missing invoice returns 404. The limit is 10,000 events, including document events. Larger results return 413 with invoice.workspace_limit and no partial result.`},bankTransactionGet:{summary:`Read a bank transaction`,description:`Returns an imported transaction with its allocations and remaining amounts. Access by identifier does not depend on the list limit. This read contacts no bank.`},bankImportPreview:{summary:`Validate a statement before import`,description:`Validates the account and all CSV rows with the import parser. Separates new transactions from existing transactions. Persists no row. Confirmation validates the statement again within the import transaction.`},bankLedgerEntryGet:{summary:`Read a bank ledger entry`,description:`Returns a persisted entry by identifier, independently of the journal period. Includes its source reference and accounting lines. Creates no entry or reversal.`},bankLedgerSourceGet:{summary:`Read a source to post`,description:`Returns the context of a bank debit or reconciliation fee. Posting remains a separate, explicit action. This local journal is not general accounting.`}}};var qe={providerEmailGet:[`Lire l’état du courriel`,`Read email delivery status`],providerEmailCancel:[`Annuler le courriel`,`Cancel email`],providerEmailEvents:[`Lire les événements du courriel`,`Read email events`],providerEmailVerifyWebhook:[`Vérifier une notification de courriel`,`Verify an email notification`],providerSignatureGet:[`Lire le dossier de signature`,`Read signature request`],providerSignatureCancel:[`Annuler la signature`,`Cancel signature request`],providerSignatureRemind:[`Relancer les signataires`,`Remind signers`],providerSignatureDocument:[`Récupérer le document signé`,`Retrieve signed document`],providerSignatureProof:[`Récupérer la preuve de signature`,`Retrieve signature evidence`],providerSignatureEvents:[`Lire les événements de signature`,`Read signature events`],providerSignatureVerifyWebhook:[`Vérifier une notification de signature`,`Verify a signature notification`],providerPaymentGet:[`Lire le paiement fournisseur`,`Read provider payment`],providerPaymentCancel:[`Annuler le paiement fournisseur`,`Cancel provider payment`],providerPaymentCapture:[`Capturer le paiement autorisé`,`Capture an authorized payment`],providerPaymentRefund:[`Demander un remboursement`,`Request a refund`],providerPaymentGetRefund:[`Lire le remboursement`,`Read refund status`],providerPaymentEvents:[`Lire les événements de paiement`,`Read payment events`],providerPaymentVerifyWebhook:[`Vérifier une notification de paiement`,`Verify a payment notification`],providerBankConnect:[`Préparer une connexion bancaire`,`Prepare a bank connection`],providerBankConnection:[`Lire la connexion bancaire`,`Read bank connection`],providerBankRevoke:[`Révoquer la connexion bancaire`,`Revoke bank connection`],providerBankAccounts:[`Lister les comptes bancaires`,`List bank accounts`],providerBankTransactions:[`Lister les opérations bancaires`,`List bank transactions`],providerBankVerifyWebhook:[`Vérifier une notification bancaire`,`Verify a bank notification`],providerElectronicInvoiceGet:[`Lire le statut de facturation électronique`,`Read electronic invoice status`],providerElectronicInvoiceCancel:[`Annuler la transmission électronique`,`Cancel electronic invoice submission`],providerElectronicInvoiceDownload:[`Récupérer la facture électronique`,`Retrieve electronic invoice`],providerElectronicInvoiceInbox:[`Lister les factures électroniques reçues`,`List received electronic invoices`],providerElectronicInvoiceReport:[`Transmettre un rapport électronique`,`Submit an electronic report`],providerElectronicInvoiceGetReport:[`Lire le statut du rapport`,`Read electronic report status`],providerElectronicInvoiceEvents:[`Lire les événements de facturation électronique`,`Read electronic invoice events`],providerElectronicInvoiceVerifyWebhook:[`Vérifier une notification de facturation électronique`,`Verify an electronic invoice notification`]};var _e="> [!important]\n> Implémentation actuelle : mock sans effet externe. `executed: false` est obligatoire en mode simulation. `preview` contient un exemple, jamais un résultat réel.\n\nChaque appel est indépendant. Aucun statut métier, règlement ou document local ne change. Les fichiers restent indisponibles et les notifications restent non vérifiées. Les routes de vérification ne sont pas des récepteurs publics de webhooks.";var ze="> [!important]\n> Current implementation: mock without external effects. Simulation requires `executed: false`. `preview` contains an example, never an actual result.\n\nEach call is independent. No business status, payment, or local document changes. Files remain unavailable and notifications remain unverified. Verification routes are not public webhook receivers.";var le$2={fr:Object.fromEntries(Object.entries(qe).map(([t,[i]])=>[t,{summary:i,description:_e}])),en:Object.fromEntries(Object.entries(qe).map(([t,[,i]])=>[t,{summary:i,description:ze}]))};var Se=[`accountingAccountCreate`,`accountingAccountList`,`accountingAccountUpdate`,`accountingBalanceReport`,`accountingCa3Export`,`accountingEntryCreate`,`accountingEntryList`,`accountingEntryPost`,`accountingEntryReverse`,`accountingEvidenceCreate`,`accountingEvidenceDownload`,`accountingEvidenceList`,`accountingFecExport`,`accountingFinancialReport`,`accountingJournalCreate`,`accountingJournalList`,`accountingJournalUpdate`,`accountingLedgerReport`,`accountingLetterableLineList`,`accountingLetteringCreate`,`accountingOpeningCommit`,`accountingOpeningPreview`,`accountingPeriodClose`,`accountingPeriodCreate`,`accountingPeriodFinalClose`,`accountingPeriodList`,`accountingPeriodLock`,`accountingPeriodReopen`,`accountingTaxFilingSettings`,`accountingTaxFilingSettingsUpdate`,`accountingTaxFilingSubmissionList`,`accountingTaxFilingSubmit`,`accountingTaxReport`];var Le=[`demoReset`,`invoiceCreditAllocate`,`invoiceCreditAllocationCancel`,`supplierBankMatch`,`supplierBankMatchList`,`supplierBankPaymentList`,`supplierBankUnmatch`,`supplierCreditCreate`,`supplierInvoiceEvidenceCreate`,`supplierInvoiceEvidenceDownload`,`supplierInvoiceEvidenceList`];var b$1=(t,i,n)=>Object.fromEntries(t.map(a=>[a,{summary:i,description:n}]));c$2.fr.group,m$2.fr.group,l.fr.group,d.fr.group,h$1.fr.group,u$2.fr.group,p$3.fr.group,f$3.fr.group,v$3.fr.group,g$1.fr.group,m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1({},b$1(Se,`Gérer la comptabilité`,`Exécute une opération comptable selon les permissions et les règles de période applicables.`)),b$1(Le,`Gérer la suite de gestion`,`Exécute une opération métier selon les permissions et les contrôles applicables.`)),c$2.fr.operations),{blogFeed:{summary:`Lire le flux Atom du blog`,description:`Retourne les résumés français des publications au format Atom XML. Aucune authentification requise.`}}),ce$1.fr),m$2.fr.operations),f$3.fr.operations),T$3.fr),w$4.fr),{integrationRetryList:{summary:`Lire les reprises automatiques`,description:`Retourne les 100 reprises les plus récentes. Chaque reprise conserve la demande et son mode. Cinq tentatives au maximum après l’appel initial.`}}),v$3.fr.operations),g$1.fr.operations),le$2.fr),l.fr.operations),d.fr.operations),h$1.fr.operations),u$2.fr.operations),p$3.fr.operations),{bankPaymentList:{summary:`Lister les soldes rapprochables des règlements`,description:`Retourne les règlements actifs d’une facture et leurs montants disponibles, après déduction de toutes les affectations actives.`},bankMatchHistory:{summary:`Consulter les rapprochements conservés`,description:`Afficher les 100 derniers rapprochements d’une opération, avec auteurs, dates et motifs de dissociation.`},bankMatchSuggestionList:{summary:`Proposer des rapprochements`,description:`Classe au maximum dix règlements probables. Une confirmation humaine reste obligatoire.`},bankTransactionList:{summary:`Lister les opérations bancaires`,description:`Retourne les 1 000 dernières opérations et leurs rapprochements actifs.`},bankImport:{summary:`Importer un relevé CSV`,description:`Importe atomiquement les lignes et refuse les références réutilisées avec des valeurs différentes.`},bankMatch:{summary:`Rapprocher un encaissement`,description:`Affecte amountCents au règlement et amountCents moins feeCents au crédit bancaire. La commission doit être inférieure au montant affecté. Utilisez une clé UUID v4 stable. Ne crée aucun règlement.`},bankUnmatch:{summary:`Dissocier un rapprochement`,description:`Conserve le rapprochement précédent et son motif de dissociation.`},integrationStatus:{summary:`Lister les modes des adaptateurs`,description:`Indique les services simulés et les prestataires connectés.`},integrationOperationList:{summary:`Consulter les opérations externes`,description:`Retourne les 100 dernières demandes et leurs reçus.`},integrationOperationCreate:{summary:`Soumettre une demande externe`,description:`Enregistre la demande et appelle son adaptateur avec une clé d’idempotence. Une simulation ne réalise aucune opération externe.`},catalogList:{summary:`Lister les prestations`,description:`Liste les prestations actives et archivées.`},catalogCreate:{summary:`Créer une prestation`,description:`Enregistre une description, une quantité, un prix en euros et un taux de TVA.`},catalogUpdate:{summary:`Modifier une prestation`,description:`Modifie ou archive une prestation si sa version correspond à expectedVersion. Les lignes de devis restent inchangées.`},clientList:{summary:`Lister les clients`,description:`Liste les clients actifs et archivés.`},clientGet:{summary:`Obtenir un client`,description:`Renvoie un client par identifiant.`},clientCreate:{summary:`Créer un client`,description:`Crée un client.`},clientUpdate:{summary:`Modifier un client`,description:`Modifie un client actif.`},clientArchive:{summary:`Archiver un client`,description:`Archive un client.`},clientReactivate:{summary:`Réactiver un client`,description:`Réactive un client archivé.`},companySettingsGet:{summary:`Lire la configuration de la société`,description:`Renvoie la juridiction, la devise, l’exercice et les modules activés.`},brandingGet:{summary:`Lire l’identité de l’entreprise`,description:`Renvoie le nom et le logo affichés sur la page de connexion.`},brandingUpdate:{summary:`Modifier l’identité de l’entreprise`,description:`Enregistre le nom et le logo si la version correspond.`},companySettingsUpdate:{summary:`Modifier la configuration de la société`,description:`Modifie la configuration si sa version correspond.`},companyAccountingInitialize:{summary:`Initialiser la comptabilité`,description:`Fixe définitivement la devise fonctionnelle de la comptabilité.`},companyExchangeRateList:{summary:`Lister les taux de change`,description:`Renvoie les taux BCE et les surcharges manuelles enregistrés.`},companyExchangeRateSet:{summary:`Surcharger un taux de change`,description:`Enregistre un taux daté et trace la surcharge manuelle.`},companyExchangeRateImport:{summary:`Importer les taux de la BCE`,description:`Importe les taux récents et conserve les surcharges manuelles.`},supplierList:{summary:`Lister les fournisseurs`,description:`Liste les fournisseurs actifs et archivés.`},supplierGet:{summary:`Obtenir un fournisseur`,description:`Renvoie un fournisseur par identifiant.`},supplierCreate:{summary:`Créer un fournisseur`,description:`Crée un fournisseur avec ses coordonnées et ses paramètres de paiement.`},supplierUpdate:{summary:`Modifier un fournisseur`,description:`Modifie un fournisseur actif si sa version correspond.`},supplierArchive:{summary:`Archiver un fournisseur`,description:`Archive un fournisseur.`},supplierReactivate:{summary:`Réactiver un fournisseur`,description:`Réactive un fournisseur archivé.`},orderList:{summary:`Lister les commandes`,description:`Liste les commandes créées depuis les devis acceptés.`},orderPdfDownload:{summary:`Télécharger le PDF d’une commande`,description:`Télécharge le PDF existant d’une commande.`},quoteList:{summary:`Lister les devis`,description:`Liste les devis et leur dernière révision.`},quoteGet:{summary:`Obtenir un devis`,description:`Renvoie un devis et toutes ses révisions.`},quotePdfDownload:{summary:`Télécharger le PDF d’un devis`,description:`Télécharge le PDF existant d’une révision de devis.`},quoteCreate:{summary:`Créer un devis`,description:`Crée la première révision d’un devis.`},quoteSend:{summary:`Envoyer un devis`,description:`Crée un lien public de consultation pour un devis rendu.`},quoteLinkState:{summary:`Consulter l’état du lien de signature`,description:`Retourne l’identifiant et l’expiration du lien courant, sans révéler son jeton.`},quoteLinkReplace:{summary:`Remplacer un lien de signature`,description:`Révoque le lien attendu et crée un nouveau lien pour le même devis envoyé non signé.`},quoteCancel:{summary:`Annuler un devis`,description:`Annule un devis modifiable.`},quoteRevisionCreate:{summary:`Créer une révision de devis`,description:`Crée une révision d’un devis modifiable.`},invoiceList:{summary:`Lister les factures`,description:`Liste les factures et leur état actuel.`},invoiceGet:{summary:`Obtenir une facture`,description:`Renvoie une facture et ses révisions.`},invoicePdfDownload:{summary:`Télécharger le PDF d’une facture`,description:`Télécharge le PDF existant d’une révision de facture.`},invoiceCreate:{summary:`Créer une facture`,description:`Crée un brouillon de facture depuis une commande.`},invoiceRevisionCreate:{summary:`Créer une révision de facture`,description:`Crée une révision de brouillon de facture.`},invoiceIssue:{summary:`Émettre une facture`,description:`Attribue le numéro légal et émet la facture.`},invoicePaymentCancel:{summary:`Annuler une saisie de règlement`,description:`Conserve le règlement et le motif de correction. Rétablit le solde dû sans modifier le document émis ni effectuer de remboursement.`},invoicePaymentExport:{summary:`Exporter les règlements`,description:`Exporte les règlements reçus entre from et to inclus, dans un CSV UTF-8. Limite de 10 000 lignes ; aucune troncature silencieuse.`},invoicePaymentCreate:{summary:`Enregistrer un règlement`,description:`Enregistre un règlement partiel ou complet. Réutilisez requestId avec les mêmes valeurs après une erreur réseau. Le solde ne peut pas devenir négatif.`},invoiceVoid:{summary:`Annuler une facture`,description:`Annule une facture.`},affairList:{summary:`Lister les affaires`,description:`Liste les affaires indépendantes et leurs documents liés.`},affairGet:{summary:`Consulter une affaire`,description:`Retourne une affaire et les identifiants de ses documents liés.`},affairCreate:{summary:`Créer une affaire`,description:`Crée une affaire numérotée pour un client.`},affairUpdate:{summary:`Modifier une affaire`,description:`Modifie le titre ou le statut avec contrôle de version.`},affairEventList:{summary:`Lister les événements d’une affaire`,description:`Liste les événements commerciaux liés à un client.`},bootstrapCreate:{summary:`Créer le premier administrateur`,description:`Initialise le premier compte administrateur.`},bootstrapStatus:{summary:`Obtenir l’état de l’initialisation`,description:`Indique si la création du premier administrateur reste disponible.`},clientAccessCreate:{summary:`Créer un accès client`,description:`Crée un nouveau compte d’accès pour un client.`},clientAccessList:{summary:`Lister les accès client`,description:`Liste les comptes qui peuvent accéder au portail d’un client.`},clientAccessRevoke:{summary:`Supprimer un accès client`,description:`Supprime un compte du portail et révoque ses sessions.`},clientInvoiceList:{summary:`Lister les factures du client`,description:`Liste les factures accessibles au client connecté.`},clientInvoicePdf:{summary:`Télécharger une facture du client`,description:`Télécharge le PDF d’une facture accessible au client connecté.`},clientOrderList:{summary:`Lister les commandes du client`,description:`Liste les commandes accessibles au client connecté.`},clientOrderPdf:{summary:`Télécharger une commande du client`,description:`Télécharge le PDF d’une commande accessible au client connecté.`},clientQuoteList:{summary:`Lister les devis du client`,description:`Liste les devis accessibles au client connecté.`},clientQuotePdf:{summary:`Télécharger un devis du client`,description:`Télécharge le PDF d’un devis accessible au client connecté.`},health:{summary:`Vérifier la santé du service`,description:`Renvoie l’état de santé du service et de ses dépendances.`},apiTokenCreate:{summary:`Créer un jeton d’API`,description:`Crée un jeton Bearer et révèle son secret une seule fois.`},apiTokenList:{summary:`Lister les jetons d’API`,description:`Liste les jetons actifs, expirés et révoqués.`},apiTokenRevoke:{summary:`Révoquer un jeton d’API`,description:`Révoque définitivement un jeton.`},invoicePdfRender:{summary:`Générer le PDF d’une facture`,description:`Génère et conserve le PDF d’une révision de facture.`},invoicePreview:{summary:`Prévisualiser une facture`,description:`Génère un aperçu sans créer de document conservé.`},issuerSettingsGet:{summary:`Obtenir les paramètres émetteur`,description:`Renvoie les coordonnées utilisées dans les documents.`},issuerSettingsUpdate:{summary:`Modifier les paramètres émetteur`,description:`Modifie les coordonnées utilisées dans les futurs documents.`},login:{summary:`Se connecter`,description:`Authentifie un compte et crée une session.`},logout:{summary:`Se déconnecter`,description:`Révoque la session active.`},refresh:{summary:`Renouveler la session`,description:`Renouvelle la session et ses cookies. La réponse contient le mode d’accès et l’expiration, sans jeton secret.`},passwordChange:{summary:`Changer le mot de passe`,description:`Vérifie le mot de passe actuel et révoque toutes les sessions dans la transaction de changement. Réservé aux sessions navigateur.`},currentAccount:{summary:`Consulter le compte courant`,description:`Retourne le compte authentifié.`},updatePreferences:{summary:`Modifier les préférences du compte`,description:`Modifie le thème, la langue et le mode des messages du compte connecté.`},accountSessionList:{summary:`Lister les sessions actives`,description:`Liste les familles de sessions actives du compte connecté, sans jetons ni empreintes.`},accountSessionRevoke:{summary:`Fermer une autre session`,description:`Révoque une famille de sessions appartenant au compte connecté. La session actuelle utilise la déconnexion habituelle.`},orderPdfRender:{summary:`Générer le PDF d’une commande`,description:`Génère et conserve le PDF d’une commande.`},orderPreview:{summary:`Prévisualiser une commande`,description:`Génère un aperçu sans créer de document conservé.`},publicQuoteGet:{summary:`Consulter un devis public`,description:`Ouvre un devis avec un lien public valide.`},publicQuotePdfDownload:{summary:`Télécharger un devis public`,description:`Télécharge le PDF associé à un lien public valide.`},publicQuoteSign:{summary:`Signer un devis public`,description:`Accepte et signe un devis avec un lien public valide.`},quoteConditionPresetCreate:{summary:`Créer un préréglage de devis`,description:`Crée un jeu de conditions réutilisable.`},quoteConditionPresetDelete:{summary:`Supprimer un préréglage de devis`,description:`Supprime un jeu de conditions réutilisable.`},quoteConditionPresetList:{summary:`Lister les préréglages de devis`,description:`Liste les jeux de conditions réutilisables.`},quoteConditionPresetUpdate:{summary:`Modifier un préréglage de devis`,description:`Modifie un jeu de conditions réutilisable.`},quotePdfRender:{summary:`Générer le PDF d’un devis`,description:`Génère et conserve le PDF d’une révision de devis.`},quotePreview:{summary:`Prévisualiser un devis`,description:`Génère un aperçu sans créer de document conservé.`},version:{summary:`Obtenir la version du service`,description:`Renvoie les métadonnées du déploiement actif.`}}),c$2.en.group,m$2.en.group,l.en.group,d.en.group,h$1.en.group,u$2.en.group,p$3.en.group,f$3.en.group,v$3.en.group,g$1.en.group,m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1(l$1(m$4(l$1(m$4(l$1(l$1(l$1({},b$1(Se,`Manage accounting`,`Runs an accounting operation with the applicable permissions and period rules.`)),b$1(Le,`Manage the business suite`,`Runs a business operation with the applicable permissions and controls.`)),c$2.en.operations),{blogFeed:{summary:`Read the blog Atom feed`,description:`Returns French article summaries as Atom XML. Authentication is not required.`}}),ce$1.en),{catalogList:{summary:`List services`,description:`Lists active and archived services.`}}),m$2.en.operations),f$3.en.operations),T$3.en),w$4.en),{integrationRetryList:{summary:`Read automatic retries`,description:`Returns the latest 100 retry records. Each retry preserves the request and its mode. At most five attempts follow the initial call.`}}),v$3.en.operations),g$1.en.operations),le$2.en),l.en.operations),d.en.operations),h$1.en.operations),u$2.en.operations),p$3.en.operations),{bankPaymentList:{summary:`List available payment balances for reconciliation`,description:`Returns active invoice payments and their available amounts after deducting all active allocations.`},bankMatchHistory:{summary:`Read reconciliation history`,description:`Return the latest 100 matches for a transaction, including actors, dates and reasons for removal.`},bankMatchSuggestionList:{summary:`Suggest reconciliations`,description:`Ranks at most ten probable receipts. Human confirmation remains required.`},bankTransactionList:{summary:`List bank transactions`,description:`Returns the latest 1,000 transactions and their active matches.`},bankImport:{summary:`Import a CSV statement`,description:`Imports rows atomically and rejects reused references with changed values.`},bankMatch:{summary:`Reconcile a receipt`,description:`Allocates amountCents to the payment and amountCents minus feeCents to the bank credit. The fee must be less than the allocated amount. Use a stable UUID v4 key. Creates no payment.`},bankUnmatch:{summary:`Remove a match`,description:`Preserves the previous match and the reason for removing it.`},integrationStatus:{summary:`List adapter modes`,description:`Identifies simulated services and connected providers.`},integrationOperationList:{summary:`Read external operations`,description:`Returns the latest 100 requests and their receipts.`},integrationOperationCreate:{summary:`Submit an external request`,description:`Records the request and calls its adapter with an idempotency key. A simulation performs no external operation.`},catalogCreate:{summary:`Create a service`,description:`Stores a description, quantity, price in euros and VAT rate.`},catalogUpdate:{summary:`Update a service`,description:`Updates or archives a service when its version matches expectedVersion. Quote lines remain unchanged.`},clientList:{summary:`List clients`,description:`Lists active and archived clients.`},clientGet:{summary:`Get a client`,description:`Returns one client by identifier.`},clientCreate:{summary:`Create a client`,description:`Creates a client.`},clientUpdate:{summary:`Update a client`,description:`Updates an active client.`},clientArchive:{summary:`Archive a client`,description:`Archives a client.`},clientReactivate:{summary:`Reactivate a client`,description:`Reactivates an archived client.`},companySettingsGet:{summary:`Get company settings`,description:`Returns jurisdiction, currency, fiscal year, and enabled modules.`},brandingGet:{summary:`Get enterprise branding`,description:`Returns the name and logo shown on the login page.`},brandingUpdate:{summary:`Update enterprise branding`,description:`Saves the name and logo when the version matches.`},companySettingsUpdate:{summary:`Update company settings`,description:`Updates the settings when their version matches.`},companyAccountingInitialize:{summary:`Initialize accounting`,description:`Permanently locks the accounting functional currency.`},companyExchangeRateList:{summary:`List exchange rates`,description:`Returns stored ECB rates and manual overrides.`},companyExchangeRateSet:{summary:`Override an exchange rate`,description:`Stores a dated rate and audits the manual override.`},companyExchangeRateImport:{summary:`Import ECB rates`,description:`Imports recent rates and preserves manual overrides.`},supplierList:{summary:`List suppliers`,description:`Lists active and archived suppliers.`},supplierGet:{summary:`Get a supplier`,description:`Returns one supplier by identifier.`},supplierCreate:{summary:`Create a supplier`,description:`Creates a supplier with contact and payment settings.`},supplierUpdate:{summary:`Update a supplier`,description:`Updates an active supplier when its version matches.`},supplierArchive:{summary:`Archive a supplier`,description:`Archives a supplier.`},supplierReactivate:{summary:`Reactivate a supplier`,description:`Reactivates an archived supplier.`},orderList:{summary:`List orders`,description:`Lists orders created from accepted quotes.`},orderPdfDownload:{summary:`Download an order PDF`,description:`Downloads an existing order PDF.`},quoteList:{summary:`List quotes`,description:`Lists quotes and their latest revision.`},quoteGet:{summary:`Get a quote`,description:`Returns a quote and all of its revisions.`},quotePdfDownload:{summary:`Download a quote PDF`,description:`Downloads an existing quote revision PDF.`},quoteCreate:{summary:`Create a quote`,description:`Creates the first revision of a quote.`},quoteSend:{summary:`Send a quote`,description:`Creates a public consultation link for a rendered quote.`},quoteLinkState:{summary:`Read signature link state`,description:`Returns the current link identifier and expiration without revealing its token.`},quoteLinkReplace:{summary:`Replace a signature link`,description:`Revokes the expected link and creates a new link for the same unsigned sent quote.`},quoteCancel:{summary:`Cancel a quote`,description:`Cancels an editable quote.`},quoteRevisionCreate:{summary:`Create a quote revision`,description:`Creates a new revision of an editable quote.`},invoiceList:{summary:`List invoices`,description:`Lists invoices and their current state.`},invoiceGet:{summary:`Get an invoice`,description:`Returns an invoice and its revisions.`},invoicePdfDownload:{summary:`Download an invoice PDF`,description:`Downloads an existing invoice revision PDF.`},invoiceCreate:{summary:`Create an invoice`,description:`Creates a draft invoice from an order.`},invoiceRevisionCreate:{summary:`Create an invoice revision`,description:`Creates a new draft invoice revision.`},invoiceIssue:{summary:`Issue an invoice`,description:`Assigns the legal invoice number and issues the invoice.`},invoicePaymentExport:{summary:`Export payments`,description:`Exports payments received between from and to inclusive as UTF-8 CSV. Limited to 10,000 rows without silent truncation.`},invoicePaymentCancel:{summary:`Cancel a payment entry`,description:`Keeps the payment and correction reason. Restores the outstanding balance without changing the issued document or making a refund.`},invoicePaymentCreate:{summary:`Record a payment`,description:`Records a partial or full payment. Reuse requestId with unchanged values after a network error. The balance cannot become negative.`},invoiceVoid:{summary:`Void an invoice`,description:`Voids an invoice.`},affairList:{summary:`List affairs`,description:`Lists independent affairs and their linked documents.`},affairGet:{summary:`Read an affair`,description:`Returns an affair and its linked document identifiers.`},affairCreate:{summary:`Create an affair`,description:`Creates a numbered affair for one client.`},affairUpdate:{summary:`Update an affair`,description:`Updates the title or status with version control.`},affairEventList:{summary:`List affair events`,description:`Lists the commercial events related to a client.`},bootstrapCreate:{summary:`Create the first administrator`,description:`Creates the first administrator account.`},bootstrapStatus:{summary:`Get bootstrap status`,description:`Reports whether first administrator creation remains available.`},clientAccessCreate:{summary:`Create client access`,description:`Creates a new access account for a client.`},clientAccessList:{summary:`List client access accounts`,description:`Lists the accounts that can access a client portal.`},clientAccessRevoke:{summary:`Remove client access`,description:`Removes a portal account and revokes its sessions.`},clientInvoiceList:{summary:`List client invoices`,description:`Lists invoices available to the authenticated client.`},clientInvoicePdf:{summary:`Download a client invoice`,description:`Downloads an invoice PDF available to the authenticated client.`},clientOrderList:{summary:`List client orders`,description:`Lists orders available to the authenticated client.`},clientOrderPdf:{summary:`Download a client order`,description:`Downloads an order PDF available to the authenticated client.`},clientQuoteList:{summary:`List client quotes`,description:`Lists quotes available to the authenticated client.`},clientQuotePdf:{summary:`Download a client quote`,description:`Downloads a quote PDF available to the authenticated client.`},health:{summary:`Check service health`,description:`Returns the health of the service and its dependencies.`},apiTokenCreate:{summary:`Create an API token`,description:`Creates a Bearer token and reveals its secret once.`},apiTokenList:{summary:`List API tokens`,description:`Lists active, expired, and revoked tokens.`},apiTokenRevoke:{summary:`Revoke an API token`,description:`Permanently revokes a token.`},invoicePdfRender:{summary:`Render an invoice PDF`,description:`Renders and stores an invoice revision PDF.`},invoicePreview:{summary:`Preview an invoice`,description:`Renders a preview without creating a stored document.`},issuerSettingsGet:{summary:`Get issuer settings`,description:`Returns the issuer details used in documents.`},issuerSettingsUpdate:{summary:`Update issuer settings`,description:`Updates the issuer details used in future documents.`},login:{summary:`Log in`,description:`Authenticates an account and creates a session.`},logout:{summary:`Log out`,description:`Revokes the active session.`},refresh:{summary:`Renew the session`,description:`Renews the session and its cookies. The response contains the access mode and expiration, without a secret token.`},currentAccount:{summary:`Get current account`,description:`Returns the authenticated account.`},updatePreferences:{summary:`Update account preferences`,description:`Updates the theme, language, and message mode for the signed-in account.`},accountSessionList:{summary:`List active sessions`,description:`Lists active session families owned by the signed-in account, without tokens or hashes.`},accountSessionRevoke:{summary:`Close another session`,description:`Revokes a session family owned by the signed-in account. The current session uses the standard sign-out action.`},passwordChange:{summary:`Change password`,description:`Verifies the current password and revokes all sessions in the password change transaction. Requires a browser session.`},orderPdfRender:{summary:`Render an order PDF`,description:`Renders and stores an order PDF.`},orderPreview:{summary:`Preview an order`,description:`Renders a preview without creating a stored document.`},publicQuoteGet:{summary:`Open a public quote`,description:`Opens a quote with a valid public link.`},publicQuotePdfDownload:{summary:`Download a public quote`,description:`Downloads the PDF for a valid public link.`},publicQuoteSign:{summary:`Sign a public quote`,description:`Accepts and signs a quote with a valid public link.`},quoteConditionPresetCreate:{summary:`Create a quote preset`,description:`Creates a reusable set of quote terms.`},quoteConditionPresetDelete:{summary:`Delete a quote preset`,description:`Deletes a reusable set of quote terms.`},quoteConditionPresetList:{summary:`List quote presets`,description:`Lists reusable sets of quote terms.`},quoteConditionPresetUpdate:{summary:`Update a quote preset`,description:`Updates a reusable set of quote terms.`},quotePdfRender:{summary:`Render a quote PDF`,description:`Renders and stores a quote revision PDF.`},quotePreview:{summary:`Preview a quote`,description:`Renders a preview without creating a stored document.`},version:{summary:`Get service version`,description:`Returns the active deployment metadata.`}});function k$2(t){return t===`fr`||t===`en`}var We=`froment.software.language`;var Ie=class t{document=g$2(H$3);language=Ke(`fr`);languages=xe;constructor(){Ol(()=>{let i=this.detectLanguage();this.language.set(i),this.writeStoredLanguage(i)}),ou(()=>{let i=this.language();this.document.documentElement.lang=i,this.document.documentElement.setAttribute(`data-language`,i)})}t(i){return o$3(this.language(),i)}tf(i,n){return we(this.language(),i,n)}plural(i,n){return Ae(this.language(),i,n)}setLanguage(i){k$2(i)&&(this.language.set(i),this.writeStoredLanguage(i))}detectLanguage(){let i=this.document.location.pathname.split(`/`)[1];if(k$2(i))return i;let n=this.readStoredLanguage();return k$2(n)?n:(globalThis.navigator?.language?.toLowerCase()??`fr`).startsWith(`fr`)?`fr`:`en`}readStoredLanguage(){try{return globalThis.localStorage?.getItem(We)??null}catch{return null}}writeStoredLanguage(i){try{globalThis.localStorage?.setItem(We,i)}catch{}}static ɵfac=function(n){return new(n||t)};static ɵprov=A$2({token:t,factory:t.ɵfac,providedIn:`root`})};function m$1(i,t){if(i&1&&Ly(0,`div`,0),i&2)ky(`aria-label`,qS().i18n.t(`shell.loading`))}var v$2=class i{navigation=g$2(ue).currentNavigation;i18n=g$2(Ie);static ɵfac=function(n){return new(n||i)};static ɵcmp=Fb({type:i,selectors:[[`app-navigation-progress`]],decls:1,vars:1,consts:[[`role`,`progressbar`,1,`navigation-bar`]],template:function(n,d){n&1&&OS(0,m$1,1,1,`div`,0),n&2&&kS(d.navigation()?0:-1)},styles:[`[_nghost-%COMP%]{position:absolute;inset-block-start:100%;inset-inline:0;z-index:var(--%NS%z-header);display:block;block-size:3px;pointer-events:none}.navigation-bar[_ngcontent-%COMP%]{position:absolute;inset:0;visibility:hidden;background:var(--%NS%color-link);box-shadow:0 1px 7px color-mix(in oklab,var(--%NS%color-link) 35%,transparent);animation:_ngcontent-%COMP%_navigation-reveal 0s .15s forwards}@media(prefers-reduced-motion:no-preference){.navigation-bar[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_navigation-reveal 0s .15s forwards,_ngcontent-%COMP%_navigation-pulse 1.2s ease-in-out .15s infinite}}@keyframes _ngcontent-%COMP%_navigation-reveal{to{visibility:visible}}@keyframes _ngcontent-%COMP%_navigation-pulse{0%,to{opacity:.4}50%{opacity:1}}@media print{[_nghost-%COMP%]{display:none}}`]})};var u$1={appEnvironment:`development`,sitePhase:`live`,commit:null,githubRepositoryUrl:null};var c$1=()=>globalThis.fromentRuntimeConfig??u$1;var a$1=class n{browser=xU(g$2(yo$1));value=this.browser?c$1():void 0;productionConstruction=this.value?.appEnvironment===`production`&&this.value.sitePhase===`construction`;commitUrl(t){let e=this.value?.githubRepositoryUrl;if(!(!e||!t))return`${e.replace(/\/$/,``).replace(/\.git$/,``)}/commit/${t}`}static ɵfac=function(e){return new(e||n)};static ɵprov=A$2({token:n,factory:n.ɵfac,providedIn:`root`})};var N$2=n=>({commit:n});function O$2(n,l){if(n&1&&(Us(0,`a`,5),y_(1),fd()),n&2){let e=qS(3);Fy(`href`,e.commitUrl,Qg),ky(`aria-label`,e.i18n.tf(`version.commitLink`,k_(3,N$2,e.shortCommit))),ZC(),vd(` `,e.shortCommit,` `)}}function k$1(n,l){if(n&1&&(Us(0,`span`,3)(1,`a`,4),y_(2),fd(),OS(3,O$2,2,5,`a`,5),fd()),n&2){let e=qS(),i=qS();Xy(`staging`,i.environment===`staging`),ZC(),ky(`aria-label`,i.i18n.t(e.nameKey)),ZC(),vd(` `,i.i18n.t(e.labelKey),` `),ZC(),kS(i.shortCommit?3:-1)}}function E$1(n,l){if(n&1&&OS(0,k$1,4,5,`span`,2),n&2)kS(qS().placement()!==`hidden`?0:-1)}function w$3(n,l){if(n&1&&(Us(0,`a`,0),y_(1),fd()),n&2){let e=qS();ZC(),nv(e.i18n.t(`nav.version`))}}function K$1(n,l){if(n&1&&(Us(0,`aside`,1)(1,`div`,6)(2,`p`,7),y_(3),fd(),Us(4,`div`)(5,`h2`,8),y_(6),fd(),Us(7,`p`),y_(8),fd()()()()),n&2){let e=qS();ZC(3),nv(e.i18n.t(`shell.construction.kicker`)),ZC(3),nv(e.i18n.t(`shell.construction.title`)),ZC(2),nv(e.i18n.t(`shell.construction.description`))}}var z$1=n=>{if(n===`development`)return{labelKey:`shell.environment.development`,nameKey:`shell.environment.developmentName`};if(n===`staging`)return{labelKey:`shell.environment.staging`,nameKey:`shell.environment.stagingName`}};var M$1=class n{publicPage=NH.required();placement=NH.required();i18n=g$2(Ie);runtime=g$2(a$1);environment=this.runtime.value?.appEnvironment;environmentStatus=z$1(this.environment);shortCommit=this.runtime.value?.commit?.slice(0,8);commitUrl=this.runtime.commitUrl(this.runtime.value?.commit);static ɵfac=function(e){return new(e||n)};static ɵcmp=Fb({type:n,selectors:[[`app-environment-status`]],inputs:{publicPage:[1,`publicPage`],placement:[1,`placement`]},decls:3,vars:2,consts:[[`routerLink`,`/version`,1,`version-link`],[`aria-labelledby`,`construction-title`,1,`construction-notice`,`runtime-construction-only`],[1,`environment-ribbon`,3,`staging`],[1,`environment-ribbon`],[`routerLink`,`/version`,1,`environment-name`],[`target`,`_blank`,`rel`,`noopener noreferrer`,1,`environment-commit`,3,`href`],[1,`construction-inner`],[1,`construction-kicker`],[`id`,`construction-title`]],template:function(e,i){if(e&1&&(OS(0,E$1,1,1)(1,w$3,2,1,`a`,0),OS(2,K$1,9,3,`aside`,1)),e&2){let x;kS((x=i.environmentStatus)?0:i.placement()===`sidebar`?1:-1,x),ZC(2),kS(i.publicPage()?2:-1)}},dependencies:[Dt],styles:[`[_nghost-%COMP%]{display:contents}.environment-ribbon[_ngcontent-%COMP%]{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.35rem;min-block-size:1.25rem;padding:.1rem .35rem;border:1px solid rgba(83,12,17,.65);border-radius:var(--%NS%radius-xs);background:repeating-linear-gradient(135deg,rgba(255,255,255,.08) 0 2px,transparent 2px 5px),#a1232aeb;color:#fff;font-family:var(--%NS%font-mono);font-size:.625rem;font-weight:700;letter-spacing:.08em;line-height:1.4;text-align:center;text-decoration:none;text-transform:uppercase}.environment-ribbon.staging[_ngcontent-%COMP%]{border-color:#5b3c03ad;background:repeating-linear-gradient(135deg,rgba(255,255,255,.09) 0 2px,transparent 2px 5px),#ab710feb}.environment-ribbon[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{color:inherit;text-decoration:none}.environment-ribbon[_ngcontent-%COMP%] a[_ngcontent-%COMP%]:hover{text-decoration:underline}.environment-commit[_ngcontent-%COMP%]{font-size:.5625rem;font-weight:400;letter-spacing:.02em;text-transform:none}.version-link[_ngcontent-%COMP%]{color:var(--%NS%color-muted);font-size:var(--%NS%text-sm);text-decoration:none}.version-link[_ngcontent-%COMP%]:hover{color:var(--%NS%color-ink);text-decoration:underline}.environment-ribbon[_ngcontent-%COMP%] a[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--%NS%color-focus);outline-offset:3px}.construction-notice[_ngcontent-%COMP%]{position:relative;overflow:hidden;border-bottom:1px solid color-mix(in oklab,var(--%NS%color-warning) 55%,var(--%NS%color-line));background:radial-gradient(circle at 1px 1px,rgba(71,47,6,.12) .7px,transparent .8px) 0 0/6px 6px,linear-gradient(100deg,var(--%NS%color-warning-soft),var(--%NS%color-surface-raised));box-shadow:inset 0 -1px #ffffff57}.construction-notice[_ngcontent-%COMP%]:after{position:absolute;inset:0;background:repeating-linear-gradient(-12deg,transparent 0 1.5rem,color-mix(in oklab,var(--%NS%color-warning) 7%,transparent) 1.5rem 1.58rem);content:"";pointer-events:none}.construction-inner[_ngcontent-%COMP%]{position:relative;z-index:1;display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:var(--%NS%space-4);width:calc(100% - 2 * var(--%NS%shell-gutter));max-width:var(--%NS%layout-max);margin-inline:auto;padding:var(--%NS%space-4) var(--%NS%page-x)}.construction-kicker[_ngcontent-%COMP%]{width:max-content;padding:.3rem .48rem;border:1px solid currentColor;color:var(--%NS%color-warning);font-family:var(--%NS%font-mono);font-size:var(--%NS%text-xs);font-weight:700;letter-spacing:.08em;line-height:1}.construction-inner[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], .construction-inner[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0}.construction-inner[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:var(--%NS%text-base);line-height:1.2}.construction-inner[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] + p[_ngcontent-%COMP%]{margin-top:var(--%NS%space-1);color:var(--%NS%color-muted);font-size:var(--%NS%text-sm)}@media(max-width:36rem){.construction-inner[_ngcontent-%COMP%]{grid-template-columns:1fr;gap:var(--%NS%space-2)}}@media print{.environment-ribbon[_ngcontent-%COMP%], .construction-notice[_ngcontent-%COMP%]{display:none}}`]})};var t=e=>e.canDeactivate();var c=[{path:``,pathMatch:`full`,redirectTo:`security`},{path:`security`,loadComponent:()=>import(`./chunk-xlLlHW0G2.js`).then(e=>e.AccountSecurity),canDeactivate:[t]},{path:`passkeys`,loadComponent:()=>import(`./chunk-CAr--Z8G2.js`).then(e=>e.AccountPasskeys),canDeactivate:[t]},{path:`sessions`,loadComponent:()=>import(`./chunk-BidSGJER.js`).then(e=>e.AccountSessions),canDeactivate:[t]},{path:`preferences`,loadComponent:()=>import(`./chunk-CsdHWYnL.js`).then(e=>e.AccountPreferences),canDeactivate:[t]}];var j$1=[`*`];function F$1(t,n){t&1&&By(0)}var r$2=class t{name=NH.required({alias:`appTabPanel`});template=g$2(Cr$1);static ɵfac=function(e){return new(e||t)};static ɵdir=ad({type:t,selectors:[[`ng-template`,`appTabPanel`,``]],inputs:{name:[1,`appTabPanel`,`name`]}})};var o$2=class t{panels=Ke(new Map);static ɵfac=function(e){return new(e||t)};static ɵprov=A$2({token:t,factory:t.ɵfac})};var O$1=class t{registry=g$2(o$2);panels=kH(r$2,{descendants:!0});constructor(){ou(()=>{this.registry.panels.set(new Map(this.panels().map(n=>[n.name(),n.template])))})}static ɵfac=function(e){return new(e||t)};static ɵcmp=Fb({type:t,selectors:[[``,`appTabLayout`,``]],contentQueries:function(e,a,x){e&1&&Zy(x,a.panels,r$2,5),e&2&&e_()},features:[A_([o$2])],ngContentSelectors:j$1,decls:1,vars:0,template:function(e,a){e&1&&(ZS(),KS(0))},styles:[`[_nghost-%COMP%]{display:grid;gap:var(--%NS%space-4);min-inline-size:0}`]})};var w$2=class t{route=g$2(G$2);registry=g$2(o$2);context=this.route.snapshot.data;panel=Ft(()=>{let n=this.route.snapshot.data.panel;return this.registry.panels().get(n)??null});static ɵfac=function(e){return new(e||t)};static ɵcmp=Fb({type:t,selectors:[[`app-tab-panel-outlet`]],hostAttrs:[2,`display`,`grid`,`gap`,`var(--space-4)`,`min-inline-size`,`0`],decls:1,vars:2,consts:[[4,`ngTemplateOutlet`,`ngTemplateOutletContext`]],template:function(e,a){e&1&&Iy(0,F$1,1,0,`ng-container`,0),e&2&&Fy(`ngTemplateOutlet`,a.panel())(`ngTemplateOutletContext`,a.context)},dependencies:[IN],encapsulation:2})};var a=class e{document=g$2(H$3);async copy(o){try{let t=this.document.defaultView?.navigator.clipboard;if(t===void 0)throw new Error(`clipboard_unavailable`);return await t.writeText(o),!0}catch{let t=this.document.createElement(`textarea`);t.value=o,t.style.position=`fixed`,t.style.opacity=`0`,this.document.body.appendChild(t),t.select();let c=this.document.execCommand(`copy`);return t.remove(),c}}static ɵfac=function(t){return new(t||e)};static ɵprov=A$2({token:e,factory:e.ɵfac,providedIn:`root`})};function U$1(n){n||(n=g$2(pe$3));let e=new x$3(t=>{if(n.destroyed){t.next();return}return n.onDestroy(t.next.bind(t))});return t=>t.pipe(kE(e))}function T$2(n,e){let d=!e?.manualCleanup?e?.injector?.get(pe$3)??g$2(pe$3):null,l=p$2(e?.equal),o;e?.requireSync?o=Ke({kind:0},{equal:l}):o=Ke({kind:1,value:e?.initialValue},{equal:l});let i,b=n.subscribe({next:r=>o.set({kind:1,value:r}),error:r=>{o.set({kind:2,error:r}),i?.()},complete:()=>{i?.()}});if(e?.requireSync&&o().kind===0)throw new y$2(601,!1);return i=d?.onDestroy(b.unsubscribe.bind(b)),Ft(()=>{let r=o();switch(r.kind){case 1:return r.value;case 2:throw r.error;case 0:throw new y$2(601,!1)}},{equal:e?.equal})}function p$2(n=Object.is){return(e,t)=>e.kind===1&&t.kind===1&&n(e.value,t.value)}function u(e,n){e&1&&(Op(),Ly(0,`path`,1))}function f$2(e,n){e&1&&(Op(),Ly(0,`path`,2))}function v$1(e,n){e&1&&(Op(),Ly(0,`path`,3))}function g(e,n){e&1&&(Op(),Ly(0,`path`,4))}function E(e,n){e&1&&(Op(),Ly(0,`path`,5))}function M(e,n){e&1&&(Op(),Ly(0,`path`,6))}function x(e,n){e&1&&(Op(),Ly(0,`path`,7))}function y(e,n){e&1&&(Op(),Ly(0,`path`,8))}function V(e,n){e&1&&(Op(),Ly(0,`path`,9))}function b(e,n){e&1&&(Op(),Ly(0,`path`,10))}function S$1(e,n){e&1&&(Op(),Ly(0,`path`,11))}function C(e,n){e&1&&(Op(),Ly(0,`circle`,33)(1,`path`,34))}function I$1(e,n){e&1&&(Op(),Ly(0,`path`,12))}function G(e,n){e&1&&(Op(),Ly(0,`path`,13))}function T$1(e,n){e&1&&(Op(),Ly(0,`path`,35)(1,`circle`,36)(2,`circle`,37))}function H(e,n){e&1&&(Op(),Ly(0,`circle`,38)(1,`circle`,39)(2,`path`,40))}function z(e,n){e&1&&(Op(),Ly(0,`path`,14))}function w$1(e,n){e&1&&(Op(),Ly(0,`path`,15))}function L(e,n){e&1&&(Op(),Ly(0,`path`,16))}function k(e,n){e&1&&(Op(),Ly(0,`path`,17))}function A(e,n){e&1&&(Op(),Ly(0,`path`,18))}function N$1(e,n){e&1&&(Op(),Ly(0,`circle`,41)(1,`circle`,42)(2,`circle`,43))}function D(e,n){e&1&&(Op(),Ly(0,`path`,19))}function P(e,n){e&1&&(Op(),Ly(0,`path`,20))}function O(e,n){e&1&&(Op(),Ly(0,`path`,21))}function j(e,n){e&1&&(Op(),Ly(0,`path`,22))}function q(e,n){e&1&&(Op(),Ly(0,`path`,23))}function B(e,n){e&1&&(Op(),Ly(0,`circle`,44)(1,`path`,45))}function F(e,n){e&1&&(Op(),Ly(0,`path`,24))}function J$1(e,n){e&1&&(Op(),Ly(0,`path`,25))}function K(e,n){e&1&&(Op(),Ly(0,`circle`,46)(1,`path`,47))}function Q$1(e,n){e&1&&(Op(),Ly(0,`path`,26))}function R(e,n){e&1&&(Op(),Ly(0,`path`,27))}function U(e,n){e&1&&(Op(),Ly(0,`path`,28))}function W(e,n){e&1&&(Op(),Ly(0,`path`,29))}function X$1(e,n){e&1&&(Op(),Ly(0,`path`,48)(1,`circle`,49))}function Y$1(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`rect`,50)(2,`path`,51),hd())}function Z$1(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,52)(2,`rect`,53),hd())}function $$1(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,54)(2,`path`,55),hd())}function ee$1(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,56),hd())}function ae(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,57)(2,`path`,58)(3,`path`,59),hd())}function ne(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,60)(2,`path`,61),hd())}function te(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`rect`,62)(2,`path`,63)(3,`rect`,64),hd())}function me(e,n){e&1&&(Op(),Ly(0,`path`,30))}function ie(e,n){e&1&&(Op(),Ly(0,`path`,31))}function ce(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,65)(2,`circle`,66),hd())}function oe(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,67)(2,`rect`,68)(3,`path`,69),hd())}function le$1(e,n){e&1&&(Op(),Ly(0,`path`,32))}function pe$1(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,70)(2,`path`,71)(3,`path`,72),hd())}var r$1=class e{name=NH.required();static ɵfac=function(o){return new(o||e)};static ɵcmp=Fb({type:e,selectors:[[`app-icon`]],inputs:{name:[1,`name`]},decls:50,vars:1,consts:[[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`d`,`M13 4v16m4-16v16m2-16H9.5a4.5 4.5 0 0 0 0 9H13`],[`d`,`M4 12h8m-8 6V6m8 12V6m9 12h-4c0-4 4-3 4-6c0-1.5-2-2.5-4-1`],[`d`,`M4 12h8m-8 6V6m8 12V6m5.5 4.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2m-2 3.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2`],[`d`,`M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8`],[`d`,`M19 4h-9m4 16H5M15 4L9 20`],[`d`,`M3 5h.01M3 12h.01M3 19h.01M8 5h13M8 12h13M8 19h13`],[`d`,`M11 5h10m-10 7h10m-10 7h10M4 4h1v5M4 9h2m.5 11H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02`],[`d`,`M9 14 4 9l5-5M4 9h10.5a5.5 5.5 0 0 1 0 11H11`],[`d`,`m15 14 5-5-5-5M20 9H9.5a5.5 5.5 0 0 0 0 11H13`],[`d`,`M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L8 18l-4 1 1-4z`],[`d`,`M3 3h7v7H3zm11 0h7v7h-7zM3 14h7v7H3zm11 0h7v7h-7z`],[`d`,`M3 7V5a2 2 0 0 1 2-2h5l2 3h7a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`],[`d`,`M6 3h9l4 4v14H5V3zm8 0v5h5M8 12h8m-8 4h6`],[`d`,`m3 9 9-6 9 6zm2 3v7m5-7v7m4-7v7m5-7v7M3 22h18`],[`d`,`M4 6h16M4 12h16M4 18h16M8 3v6m8 0v6m-6 0v6`],[`d`,`M4 3h4v18H4zm8 0h4v18h-4zm7 1 3 16`],[`d`,`M12 5v16m0-16C8 2 4 3 2 4v16c3-1 7-1 10 1 3-2 7-2 10-1V4c-2-1-6-2-10 1`],[`d`,`M4 6h16M4 12h16M4 18h16`],[`d`,`m6 6 12 12M6 18 18 6`],[`d`,`m20 6-11 11-5-5`],[`d`,`m12 19-7-7 7-7m-7 7h14`],[`d`,`m9 18 6-6-6-6`],[`d`,`m8 9 4-4 4 4m-8 6 4 4 4-4`],[`d`,`M10 5H5v14h5m4-11 4 4-4 4m4-4H9`],[`d`,`M12 5v14M5 12h14`],[`d`,`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3`],[`d`,`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12`],[`d`,`M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8zM14 2v6h6M12 18v-6m-3 3h6`],[`d`,`M4 7h16M7 12h10M10 17h4`],[`d`,`M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2M6.453 15h11.094M8.5 2h7`],[`d`,`M18 5a2 2 0 0 1 2 2v8.526a2 2 0 0 0 .212.897l1.068 2.127a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45l1.068-2.127A2 2 0 0 0 4 15.526V7a2 2 0 0 1 2-2zm2.054 10.987H3.946`],[`d`,`M12 16v5m4-6.361V21m4-10.344V21m2-18-8.646 8.646a.5.5 0 0 1-.708 0L9.354 8.354a.5.5 0 0 0-.707 0L2 15m2 3.463V21m4-6.344V21`],[`cx`,`9`,`cy`,`8`,`r`,`3`],[`d`,`M3 21v-2a6 6 0 0 1 12 0v2m1-17a3 3 0 0 1 0 6m3 11v-2a6 6 0 0 0-3-5.2`],[`d`,`M10 17h4V5H2v12h3m9-8h4l4 4v4h-3m-9 0H8`],[`cx`,`6.5`,`cy`,`17.5`,`r`,`2.5`],[`cx`,`16.5`,`cy`,`17.5`,`r`,`2.5`],[`cx`,`9`,`cy`,`20`,`r`,`1`],[`cx`,`19`,`cy`,`20`,`r`,`1`],[`d`,`M3 4h2l2.4 10.4A2 2 0 0 0 9.3 16H18a2 2 0 0 0 1.9-1.4L21 8H6`],[`cx`,`5`,`cy`,`12`,`r`,`1`],[`cx`,`12`,`cy`,`12`,`r`,`1`],[`cx`,`19`,`cy`,`12`,`r`,`1`],[`cx`,`12`,`cy`,`8`,`r`,`3`],[`d`,`M5 21v-2a7 7 0 0 1 14 0v2`],[`cx`,`10`,`cy`,`10`,`r`,`7`],[`d`,`m15 15 6 6`],[`d`,`M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16`],[`cx`,`5`,`cy`,`19`,`r`,`1`],[`width`,`20`,`height`,`16`,`x`,`2`,`y`,`4`,`rx`,`2`],[`d`,`m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7`],[`d`,`M8 2v4m8-4v4M3 10h18`],[`width`,`18`,`height`,`18`,`x`,`3`,`y`,`4`,`rx`,`2`],[`d`,`M15 3h6v6m0-6-9 9`],[`d`,`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`],[`d`,`m8 9-4 3 4 3m8-6 4 3-4 3m-2-9-4 12`],[`d`,`M12 22v-9m3.17-10.79a1.67 1.67 0 0 1 1.63 0L21 4.57a1.93 1.93 0 0 1 0 3.36L8.82 14.79a1.66 1.66 0 0 1-1.64 0L3 12.43a1.93 1.93 0 0 1 0-3.36z`],[`d`,`M20 13v3.87a2.06 2.06 0 0 1-1.11 1.83l-6 3.08a1.93 1.93 0 0 1-1.78 0l-6-3.08A2.06 2.06 0 0 1 4 16.87V13`],[`d`,`M21 12.43a1.93 1.93 0 0 0 0-3.36L8.83 2.2a1.64 1.64 0 0 0-1.63 0L3 4.57a1.93 1.93 0 0 0 0 3.36l12.18 6.86a1.64 1.64 0 0 0 1.63 0z`],[`d`,`m15 12-9.373 9.373a1 1 0 0 1-3.001-3L12 9m6 6 4-4`],[`d`,`m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172v-.344a2 2 0 0 0-.586-1.414l-1.657-1.657A6 6 0 0 0 12.516 3H9l1.243 1.243A6 6 0 0 1 12 8.485V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5`],[`width`,`8`,`height`,`8`,`x`,`3`,`y`,`3`,`rx`,`2`],[`d`,`M7 11v4a2 2 0 0 0 2 2h4`],[`width`,`8`,`height`,`8`,`x`,`13`,`y`,`13`,`rx`,`2`],[`d`,`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`],[`cx`,`16.5`,`cy`,`7.5`,`r`,`.5`,`fill`,`currentColor`],[`d`,`M12 8V4H8`],[`width`,`16`,`height`,`12`,`x`,`4`,`y`,`8`,`rx`,`2`],[`d`,`M2 14h2m16 0h2m-7-1v2m-6-2v2`],[`d`,`m10.852 14.772-.383.923m2.679-.923a3 3 0 1 0-2.296-5.544l-.383-.923m2.679.923.383-.923`],[`d`,`m13.53 15.696-.382-.924a3 3 0 1 1-2.296-5.544m3.92 1.624.923-.383m-.923 2.679.923.383`],[`d`,`M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5m-15 4H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5M6 18h.01M6 6h.01m3.228 4.852-.923-.383m.923 2.679-.923.383`]],template:function(o,_){if(o&1&&(Op(),pd(0,`svg`,0),OS(1,u,1,0,`:svg:path`,1)(2,f$2,1,0,`:svg:path`,2)(3,v$1,1,0,`:svg:path`,3)(4,g,1,0,`:svg:path`,4)(5,E,1,0,`:svg:path`,5)(6,M,1,0,`:svg:path`,6)(7,x,1,0,`:svg:path`,7)(8,y,1,0,`:svg:path`,8)(9,V,1,0,`:svg:path`,9)(10,b,1,0,`:svg:path`,10)(11,S$1,1,0,`:svg:path`,11)(12,C,2,0)(13,I$1,1,0,`:svg:path`,12)(14,G,1,0,`:svg:path`,13)(15,T$1,3,0)(16,H,3,0)(17,z,1,0,`:svg:path`,14)(18,w$1,1,0,`:svg:path`,15)(19,L,1,0,`:svg:path`,16)(20,k,1,0,`:svg:path`,17)(21,A,1,0,`:svg:path`,18)(22,N$1,3,0)(23,D,1,0,`:svg:path`,19)(24,P,1,0,`:svg:path`,20)(25,O,1,0,`:svg:path`,21)(26,j,1,0,`:svg:path`,22)(27,q,1,0,`:svg:path`,23)(28,B,2,0)(29,F,1,0,`:svg:path`,24)(30,J$1,1,0,`:svg:path`,25)(31,K,2,0)(32,Q$1,1,0,`:svg:path`,26)(33,R,1,0,`:svg:path`,27)(34,U,1,0,`:svg:path`,28)(35,W,1,0,`:svg:path`,29)(36,X$1,2,0)(37,Y$1,3,0,`:svg:g`)(38,Z$1,3,0,`:svg:g`)(39,$$1,3,0,`:svg:g`)(40,ee$1,2,0,`:svg:g`)(41,ae,4,0,`:svg:g`)(42,ne,3,0,`:svg:g`)(43,te,4,0,`:svg:g`)(44,me,1,0,`:svg:path`,30)(45,ie,1,0,`:svg:path`,31)(46,ce,3,0,`:svg:g`)(47,oe,4,0,`:svg:g`)(48,le$1,1,0,`:svg:path`,32)(49,pe$1,4,0,`:svg:g`),hd()),o&2){let m;ZC(),kS((m=_.name())===`paragraph`?1:m===`heading-2`?2:m===`heading-3`?3:m===`bold`?4:m===`italic`?5:m===`list-bullets`?6:m===`list-numbers`?7:m===`undo`?8:m===`redo`?9:m===`pencil`?10:m===`dashboard`?11:m===`clients`?12:m===`folder`?13:m===`invoice`?14:m===`truck`?15:m===`shopping-cart`?16:m===`bank`?17:m===`settings`?18:m===`catalog`?19:m===`book`?20:m===`menu`?21:m===`more`?22:m===`close`?23:m===`check`?24:m===`arrow-left`?25:m===`chevron-right`?26:m===`chevron`?27:m===`user`?28:m===`logout`?29:m===`plus`?30:m===`search`?31:m===`download`?32:m===`upload`?33:m===`file-plus`?34:m===`filter`?35:m===`rss`?36:m===`mail`?37:m===`calendar`?38:m===`external`?39:m===`development`?40:m===`upgrade`?41:m===`build`?42:m===`ci`?43:m===`tests`?44:m===`environment`?45:m===`secrets`?46:m===`ai`?47:m===`metrics`?48:m===`infrastructure`?49:-1)}},styles:[`[_nghost-%COMP%]{display:inline-flex;flex:0 0 auto;color:var(--%NS%icon-color, var(--%NS%color-muted))}svg[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.75}`]})};var p$1=[`*`];function S(t,a){t&1&&Py(0,`app-icon`,0),t&2&&Fy(`name`,a)}function m(t,a){if(t&1&&OS(0,S,1,1,`app-icon`,0),t&2){let o;kS((o=qS().icon())?0:-1,o)}}function f$1(t,a){t&1&&Py(0,`app-icon`,0),t&2&&Fy(`name`,a)}function _(t,a){if(t&1&&OS(0,f$1,1,1,`app-icon`,0),t&2){let o;kS((o=qS().icon())?0:-1,o)}}var N=class t{variant=NH(`default`);size=NH(`default`);iconOnly=NH(!1);icon=NH();iconPosition=NH(`start`);static ɵfac=function(o){return new(o||t)};static ɵcmp=Fb({type:t,selectors:[[`button`,`appButton`,``],[`a`,`appLinkButton`,``]],hostVars:3,hostBindings:function(o,n){o&2&&ky(`data-button-variant`,n.variant())(`data-button-size`,n.size())(`data-button-icon-only`,n.iconOnly()?``:null)},inputs:{variant:[1,`variant`],size:[1,`size`],iconOnly:[1,`iconOnly`],icon:[1,`icon`],iconPosition:[1,`iconPosition`]},ngContentSelectors:p$1,decls:3,vars:2,consts:[[3,`name`]],template:function(o,n){o&1&&(ZS(),OS(0,m,1,1),KS(1),OS(2,_,1,1)),o&2&&(kS(n.iconPosition()===`start`?0:-1),ZC(2),kS(n.iconPosition()===`end`?2:-1))},dependencies:[r$1],styles:[`[_nghost-%COMP%]{--%NS%icon-color: var(--%NS%button-text);--%NS%button-color: var(--%NS%color-button-default);--%NS%button-highlight: var(--%NS%color-button-default-highlight);--%NS%button-border: var(--%NS%color-button-default-border);--%NS%button-border-bottom: var(--%NS%color-button-default-border-bottom);--%NS%button-text: var(--%NS%color-button-on-default);appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:var(--%NS%space-2);min-height:var(--%NS%control-height);padding:.4rem .75rem;border:1px solid var(--%NS%button-border);border-bottom-color:var(--%NS%button-border-bottom);border-radius:var(--%NS%radius-md);background-color:color-mix(in srgb,var(--%NS%button-color) 60%,var(--%NS%button-highlight));background-image:linear-gradient(to bottom,var(--%NS%button-color),var(--%NS%button-highlight));background-repeat:repeat-x;color:var(--%NS%button-text);font-size:var(--%NS%text-sm);font-weight:600;line-height:1.2;text-decoration:none;text-shadow:var(--%NS%shadow-button-default-label);box-shadow:inset 0 1px #fff3,0 1px 2px #0000000d;cursor:pointer}[_nghost-%COMP%]:visited{color:var(--%NS%button-text)}[data-button-variant=primary][_nghost-%COMP%]{--%NS%button-color: var(--%NS%color-button-primary);--%NS%button-highlight: var(--%NS%color-button-primary-highlight);--%NS%button-text: var(--%NS%color-button-on-color)}[data-button-size=small][_nghost-%COMP%]{min-height:2rem;padding:.25rem .5rem;font-size:var(--%NS%text-xs)}[data-button-size=small][data-button-icon-only][_nghost-%COMP%]{width:2rem}[data-button-size=large][_nghost-%COMP%]{min-height:3rem;padding:.55rem 1rem;font-size:var(--%NS%text-base)}[data-button-size=large][data-button-icon-only][_nghost-%COMP%]{width:3rem}[data-button-variant=info][_nghost-%COMP%]{--%NS%button-color: var(--%NS%color-button-info);--%NS%button-highlight: var(--%NS%color-button-info-highlight);--%NS%button-text: var(--%NS%color-button-on-color)}[data-button-variant=success][_nghost-%COMP%]{--%NS%button-color: var(--%NS%color-button-success);--%NS%button-highlight: var(--%NS%color-button-success-highlight);--%NS%button-text: var(--%NS%color-button-on-color)}[data-button-variant=warning][_nghost-%COMP%]{--%NS%button-color: var(--%NS%color-button-warning);--%NS%button-highlight: var(--%NS%color-button-warning-highlight);--%NS%button-text: var(--%NS%color-button-on-color)}[data-button-variant=danger][_nghost-%COMP%]{--%NS%button-color: var(--%NS%color-button-danger);--%NS%button-highlight: var(--%NS%color-button-danger-highlight);--%NS%button-text: var(--%NS%color-button-on-color)}[data-button-variant=dark][_nghost-%COMP%]{--%NS%button-color: var(--%NS%color-button-dark);--%NS%button-highlight: var(--%NS%color-button-dark-highlight);--%NS%button-text: var(--%NS%color-button-on-color)}[_nghost-%COMP%]:is([data-button-variant=primary],[data-button-variant=info],[data-button-variant=success],[data-button-variant=warning],[data-button-variant=danger],[data-button-variant=dark]){--%NS%button-border: rgb(0 0 0 / .1);--%NS%button-border-bottom: rgb(0 0 0 / .25);text-shadow:0 -1px 0 rgba(0,0,0,.25)}[_nghost-%COMP%]:is([data-button-variant=info],[data-button-variant=success],[data-button-variant=warning]){--%NS%button-text: var(--%NS%color-button-on-bright);text-shadow:none}[data-button-variant=link][_nghost-%COMP%]{--%NS%icon-color: var(--%NS%color-link);border-color:transparent;background:transparent;color:var(--%NS%color-link);text-decoration:underline;text-shadow:none;box-shadow:none}[data-button-icon-only][_nghost-%COMP%]{width:var(--%NS%control-height);padding:0}[aria-busy=true][_nghost-%COMP%]:before{width:.85rem;height:.85rem;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;content:"";animation:_ngcontent-%COMP%_button-loading .7s linear infinite}[_nghost-%COMP%]:is(:active,[data-button-state=active]):not(:disabled,[aria-disabled=true],[data-button-variant=ghost],[data-button-variant=link]){background-color:var(--%NS%button-highlight);background-image:none;box-shadow:inset 0 2px 4px #00000026,0 1px 2px #0000000d}@media(hover:hover)and (pointer:fine){[_nghost-%COMP%]:is(:hover,[data-button-state=hover]):not(:disabled,[aria-disabled=true],[data-button-variant=ghost],[data-button-variant=link]){background-color:var(--%NS%button-highlight);background-image:linear-gradient(to bottom,var(--%NS%button-highlight),var(--%NS%button-color));color:var(--%NS%button-text)}[data-button-variant=link][_nghost-%COMP%]:hover:not(:disabled,[aria-disabled=true]), [data-button-variant=link][data-button-state=hover][_nghost-%COMP%]:not(:disabled,[aria-disabled=true]){--%NS%icon-color: var(--%NS%color-link-hover);border-color:transparent;background:transparent;color:var(--%NS%color-link-hover)}}[data-button-variant=ghost][_nghost-%COMP%]{--%NS%icon-color: currentColor;border-color:transparent;border-radius:var(--%NS%radius-sm);background:transparent;color:var(--%NS%color-muted);text-decoration:none;text-shadow:none;box-shadow:none;cursor:pointer}[data-button-variant=ghost][_nghost-%COMP%]:is(:hover,[data-button-state=hover]):not(:disabled,[aria-disabled=true],:active,[data-button-state=active],[aria-pressed=true],[aria-expanded=true]){background:color-mix(in oklab,var(--%NS%color-surface-sunken),transparent 35%);color:var(--%NS%color-ink)}[data-button-variant=ghost][_nghost-%COMP%]:is(:active,[data-button-state=active]):not(:disabled,[aria-disabled=true]), [data-button-variant=ghost][_nghost-%COMP%]:is([aria-pressed=true],[aria-expanded=true]){background:var(--%NS%color-panel);color:var(--%NS%color-ink);box-shadow:var(--%NS%shadow-panel)}[data-button-variant=ghost][_nghost-%COMP%]:focus-visible{outline:2px solid var(--%NS%color-focus);outline-offset:-2px}[data-button-variant=ghost][_nghost-%COMP%]:is(:disabled,[aria-disabled=true]){cursor:not-allowed;opacity:.55}@keyframes _ngcontent-%COMP%_button-loading{to{transform:rotate(1turn)}}@media(prefers-reduced-motion:reduce){[aria-busy=true][_nghost-%COMP%]:before{animation-duration:1.4s}}@media(forced-colors:active){[_nghost-%COMP%]{box-shadow:none}}`]})};var w=new E$4(`AUTH_COOKIE_LOCK_MANAGER`,{providedIn:`root`,factory:()=>xU(g$2(yo$1))?navigator.locks:void 0});var o$1=class r{manager=g$2(w);run(e){return this.manager?.request(`froment-auth-cookie`,e)??e()}static ɵfac=function(t){return new(t||r)};static ɵprov=A$2({token:r,factory:r.ɵfac,providedIn:`root`})};var p=3e4;var T=2147483647;var v=class r{http=new OD(g$2(Ra));cookieLock=g$2(o$1);destroyRef=g$2(pe$3);document=g$2(H$3);state=Ke(void 0);refreshRequest;refreshTimer;generation=0;identityState=Ke(0);identity=this.identityState.asReadonly();revisionState=Ke(0);revision=this.revisionState.asReadonly();refreshState=Ke(!1);refreshing=this.refreshState.asReadonly();constructor(){let e=this.document.defaultView,t=()=>{this.document.visibilityState!==`hidden`&&this.refreshExpiringSession()};this.document.addEventListener(`visibilitychange`,t),e?.addEventListener(`focus`,t),this.destroyRef.onDestroy(()=>{this.refreshTimer!==void 0&&clearTimeout(this.refreshTimer),this.document.removeEventListener(`visibilitychange`,t),e?.removeEventListener(`focus`,t)})}current(){let e=this.state();if(e!==void 0&&e.expiresAt<=Date.now()){this.clear();return}return e}mode(){return this.current()?.mode}set(e){return this.identityState.update(t=>t+1),this.updateSession(e)}updateSession(e){return this.generation+=1,this.revisionState.update(t=>t+1),this.state.set(e),this.scheduleRefresh(e.expiresAt),e}clear(){this.identityState.update(e=>e+1),this.generation+=1,this.revisionState.update(e=>e+1),this.state.set(void 0),this.refreshTimer!==void 0&&clearTimeout(this.refreshTimer),this.refreshTimer=void 0}refresh(){if(this.refreshRequest!==void 0)return this.refreshRequest;this.refreshState.set(!0),this.revisionState.update(t=>t+1);let e=this.generation;return this.refreshRequest=this.cookieLock.run(async()=>{try{let t=await JD(this.http.post(`/api/auth/refresh`,void 0)),{decodeBrowserSession:y}=await import(`./chunk-CdeX3SOP.js`),S=y(t);return this.generation!==e?this.mode():this.updateSession(S).mode}catch{return this.generation===e&&this.clear(),this.mode()}}).finally(()=>{this.refreshRequest=void 0,this.refreshState.set(!1)}),this.refreshRequest}scheduleRefresh(e){if(this.refreshTimer!==void 0&&clearTimeout(this.refreshTimer),e<=Date.now()){this.refreshTimer=void 0;return}let t=Math.max(0,e-Date.now()-p);this.refreshTimer=setTimeout(()=>{this.refresh()},Math.min(t,T))}refreshExpiringSession(){let e=this.state();e!==void 0&&e.expiresAt<=Date.now()+p&&this.refresh()}static ɵfac=function(t){return new(t||r)};static ɵprov=A$2({token:r,factory:r.ɵfac,providedIn:`root`})};var de=()=>({access:`session`});var o=(...e)=>({access:`permissions`,permissions:e});var lt=async(e,t)=>{let a=t.permissions,[{CompanyModule:s,PermissionCode:p},{Schema:C}]=await Promise.all([import(`./chunk-ClevJX5T2.js`),import(`./chunk-CGo7Fepz2.js`)]),M=e.account(),x=C.Array(p).check(C.isMinLength(1));if(M?.mode!==`administrator`||t.access!==`permissions`||!C.is(x)(a))return!1;let me=mt(a),fe=t.modules;if(C.is(C.Array(s))(fe))for(let R of fe)me.add(R);return a.every(R=>e.can(R))&&[...me].every(R=>M.enabledModules.includes(R))};var mt=e=>{let t=new Set;for(let a of e)a.startsWith(`supplier`)?t.add(`purchasing`):a.startsWith(`bank.`)?t.add(`banking`):a.startsWith(`accounting.`)?t.add(`accounting`):a.startsWith(`demo.`)?t.add(`demonstration`):(a.startsWith(`quote.`)||a.startsWith(`order.`)||a.startsWith(`invoice.`)||a.startsWith(`payment.`)||a.startsWith(`client.`)||a.startsWith(`catalog.`)||a.startsWith(`ledger.`)||a.startsWith(`document.`))&&t.add(`sales`);return t};var ft=e=>e.pathFromRoot.map(t=>t.routeConfig?.data??t.data).filter(t=>t.access!==void 0||t.permissions!==void 0);var pe=async e=>{let t=g$2(ce$3),a=g$2(ue),{Authentication:s}=await import(`./chunk-B6BtInzP2.js`),p=t.get(s);if(await p.sessionMode()!==`administrator`)return a.createUrlTree([`/login`]);if((await p.currentAccount())?.mode!==`administrator`)return a.createUrlTree([`/login`]);let M=ft(e);return M.length>0&&(await Promise.all(M.map(x=>x.access===`session`&&x.permissions===void 0||lt(p,x)))).every(Boolean)?!0:a.createUrlTree([`/account`])};var r=pe;var f=pe;var h=pe;var Q=async(e,t)=>{let a=g$2(ce$3),s=g$2(ue),{Authentication:p}=await import(`./chunk-B6BtInzP2.js`);return await a.get(p).sessionMode()===`client`?!0:s.createUrlTree([`/login`],{queryParams:{returnUrl:t.url}})};var Je=[{path:`billing`,pathMatch:`full`,loadComponent:()=>import(`./chunk-uYhVCHeh2.js`).then(e=>e.Billing),canActivate:[r],data:m$4(l$1({},o(`invoice.read`)),{titleKey:`billingWorkspace.invoices`,robots:`noindex, nofollow`})},{path:`billing/receipts`,loadComponent:()=>import(`./chunk-BTDByxsO2.js`).then(e=>e.ReceiptList),canActivate:[r],data:m$4(l$1({},o(`payment.read`,`invoice.read`)),{titleKey:`billingWorkspace.receipts`,robots:`noindex, nofollow`})},{path:`billing/credit-notes`,loadComponent:()=>import(`./chunk-DiSSXeWw2.js`).then(e=>e.CreditNotes),canActivate:[r],data:m$4(l$1({},o(`invoice.read`)),{titleKey:`billingWorkspace.credits`,robots:`noindex, nofollow`})},{path:`billing/refunds`,loadComponent:()=>import(`./chunk-DFQAtlu22.js`).then(e=>e.RefundList),canActivate:[r],data:m$4(l$1({},o(`payment.read`,`invoice.read`)),{titleKey:`billingWorkspace.refunds`,robots:`noindex, nofollow`})},{path:`invoices/new`,loadComponent:()=>import(`./chunk-BtH61zrc.js`).then(e=>e.InvoiceEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.create`,`order.read`)),{titleKey:`backOffice.invoice.title.new`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/edit`,loadComponent:()=>import(`./chunk-BtH61zrc.js`).then(e=>e.InvoiceEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.update`,`order.read`)),{titleKey:`billingWorkspace.edit`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/issue`,loadComponent:()=>import(`./chunk-C9_g77K0.js`).then(e=>e.InvoiceIssue),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.issue`)),{titleKey:`billingWorkspace.issueTitle`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/payments/new`,loadComponent:()=>import(`./chunk-Cc534gtY.js`).then(e=>e.PaymentEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.mark-paid`)),{titleKey:`billingWorkspace.recordReceipt`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/payments/:paymentId/cancel`,loadComponent:()=>import(`./chunk-0C-62od6.js`).then(e=>e.ReceiptCancel),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.mark-paid`)),{titleKey:`payment.cancel`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/credits/new`,loadComponent:()=>import(`./chunk-CV1Zh4JH.js`).then(e=>e.CreditEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.credit`)),{titleKey:`credit.issue`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/credits/:creditNoteId/edit`,loadComponent:()=>import(`./chunk-CV1Zh4JH.js`).then(e=>e.CreditEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.credit`)),{titleKey:`credit.editDraft`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/credit-allocations/new`,loadComponent:()=>import(`./chunk-DjQuCwaE.js`).then(e=>e.CreditAllocationEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.refund`)),{titleKey:`credit.allocate`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/refunds/new`,loadComponent:()=>import(`./chunk-BrRhr7VS.js`).then(e=>e.RefundEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.refund`)),{titleKey:`credit.recordRefund`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/refunds/:refundId/cancel`,loadComponent:()=>import(`./chunk-BMU6gPN0.js`).then(e=>e.RefundCancel),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.refund`)),{titleKey:`credit.cancelRefund`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/credit-allocations/:allocationId/cancel`,loadComponent:()=>import(`./chunk-BMU6gPN0.js`).then(e=>e.RefundCancel),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.refund`)),{titleKey:`credit.cancelAllocation`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/void`,loadComponent:()=>import(`./chunk-CVZQi-q62.js`).then(e=>e.InvoiceVoid),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.void`)),{titleKey:`backOffice.invoice.void`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId`,loadComponent:()=>import(`./chunk-DuQk8dor2.js`).then(e=>e.InvoiceDetail),canActivate:[r],data:m$4(l$1({},o(`invoice.read`)),{titleKey:`billingWorkspace.invoices`,robots:`noindex, nofollow`})}];var Xe=[{path:`banking/import`,loadComponent:()=>import(`./chunk-BhwbhxlY2.js`).then(e=>e.BankImport),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`bank.import`)),{titleKey:`bank.import`,robots:`noindex, nofollow`})},{path:`banking/transactions/:transactionId`,loadComponent:()=>import(`./chunk-cxgj3JaU2.js`).then(e=>e.BankReconciliation),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`bank.read`)),{titleKey:`bankWorkspace.reconciliation`,robots:`noindex, nofollow`})},{path:`banking/ledger/post/:sourceKind/:sourceId`,loadComponent:()=>import(`./chunk-BhCP8fQA.js`).then(e=>e.LedgerPost),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`ledger.read`,`ledger.post`)),{titleKey:`bankWorkspace.postTitle`,robots:`noindex, nofollow`})},{path:`banking/ledger/:entryId/reverse`,loadComponent:()=>import(`./chunk-CihZnkoG2.js`).then(e=>e.LedgerReversal),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`ledger.read`)),{titleKey:`bankWorkspace.reverseTitle`,robots:`noindex, nofollow`})},{path:`banking/ledger`,loadComponent:()=>import(`./chunk-dClaCeUx.js`).then(e=>e.BankLedger),canActivate:[r],data:m$4(l$1({},o(`ledger.read`)),{titleKey:`bankWorkspace.entries`,robots:`noindex, nofollow`})},{path:`banking`,loadComponent:()=>import(`./chunk-CuQMh9Mm2.js`).then(e=>e.Banking),canActivate:[r],data:m$4(l$1({},o(`bank.read`)),{titleKey:`bankWorkspace.transactions`,robots:`noindex, nofollow`})}];var Ze=[{path:``,pathMatch:`full`,loadComponent:()=>import(`./chunk-BYalGDdQ.js`).then(e=>e.ConfigurationIndex)},{path:`company`,canActivate:[f],data:o(`company.read`),loadComponent:()=>import(`./chunk-BuKqE_YG2.js`).then(e=>e.CompanySettingsPage),canDeactivate:[t]},{path:`issuer`,canActivate:[f],data:o(`issuer.read`),loadComponent:()=>import(`./chunk-CC05ZHq-.js`).then(e=>e.IssuerSettings),canDeactivate:[t]},{path:`conditions/new`,canActivate:[f],data:o(`condition.manage`),loadComponent:()=>import(`./chunk-BUnVNwR0.js`).then(e=>e.ConditionEditor),canDeactivate:[t]},{path:`conditions/:presetId/edit`,canActivate:[f],data:o(`condition.read`,`condition.manage`),loadComponent:()=>import(`./chunk-BUnVNwR0.js`).then(e=>e.ConditionEditor),canDeactivate:[t]},{path:`conditions`,canActivate:[f],data:o(`condition.read`),loadComponent:()=>import(`./chunk-CdDlz5SQ2.js`).then(e=>e.QuoteConditionPresets),canDeactivate:[t]},{path:`business-card`,canActivate:[f],data:o(`issuer.read`),loadComponent:()=>import(`./chunk-BxQ7up-t.js`).then(e=>e.BusinessCard),canDeactivate:[t]},{path:`supplier-invoice-analysis`,canActivate:[f],data:o(`integration.configure`),loadComponent:()=>import(`./chunk-H2FHxG4A.js`).then(e=>e.SupplierInvoiceAnalysisSettingsPage),canDeactivate:[t]}];var et=[{path:`team/roles/new`,loadComponent:()=>import(`./chunk-CvjKWUFl.js`).then(e=>e.RoleEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`role.manage`)),{titleKey:`role.createTitle`,robots:`noindex, nofollow`})},{path:`team/roles/:roleId/edit`,loadComponent:()=>import(`./chunk-CvjKWUFl.js`).then(e=>e.RoleEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`role.read`,`role.manage`)),{titleKey:`role.editTitle`,robots:`noindex, nofollow`})},{path:`team/roles`,loadComponent:()=>import(`./chunk-Bt1ivJuj2.js`).then(e=>e.RolesPage),canActivate:[r],data:m$4(l$1({},o(`role.read`)),{titleKey:`role.title`,robots:`noindex, nofollow`})},{path:`team/invitations/new`,loadComponent:()=>import(`./chunk-Ce_TeGo52.js`).then(e=>e.TeamInvitation),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`user.create`)),{titleKey:`configurationWorkspace.newInvitation`,robots:`noindex, nofollow`})},{path:`team`,loadComponent:()=>import(`./chunk-DS8Gi0yV2.js`).then(e=>e.Team),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`user.read`)),{titleKey:`team.title`,robots:`noindex, nofollow`})}];var tt=[{path:`api/new`,loadComponent:()=>import(`./chunk-CmhHSFX72.js`).then(e=>e.ApiTokenEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`api-token.manage`)),{titleKey:`backOffice.apiTokens.create`,robots:`noindex, nofollow`})},{path:`api`,loadComponent:()=>import(`./chunk-D6HQPG4L.js`).then(e=>e.ApiTokens),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`api-token.manage`)),{titleKey:`backOffice.apiTokens.title`,robots:`noindex, nofollow`})}];var ot=[{path:`services`,pathMatch:`full`,loadComponent:()=>import(`./chunk-C2WwmFiS.js`).then(e=>e.Connections),canActivate:[r],data:m$4(l$1({},o(`integration.configure`)),{titleKey:`connections.title`,robots:`noindex, nofollow`})},{path:`services/simulations`,loadComponent:()=>import(`./chunk-BV-2_l7u2.js`).then(e=>e.Integrations),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`integration.manage`)),{titleKey:`configurationWorkspace.simulations`,robots:`noindex, nofollow`})},{path:`services/resend/tests/new`,loadComponent:()=>import(`./chunk-CJKvPHwX.js`).then(e=>e.EmailTest),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`integration.configure`)),{titleKey:`configurationWorkspace.newTest`,robots:`noindex, nofollow`})},{path:`services/resend/tests/:requestId`,loadComponent:()=>import(`./chunk-Ba4cFLiE2.js`).then(e=>e.EmailTestDetail),canActivate:[r],data:m$4(l$1({},o(`integration.configure`)),{titleKey:`configurationWorkspace.testDetail`,robots:`noindex, nofollow`})},{path:`services/resend/tests`,loadComponent:()=>import(`./chunk-Bylz8GTy2.js`).then(e=>e.EmailTestList),canActivate:[r],data:m$4(l$1({},o(`integration.configure`)),{titleKey:`configurationWorkspace.tests`,robots:`noindex, nofollow`})},{path:`services/stripe/tests/new`,loadComponent:()=>import(`./chunk-CY4lfBdp2.js`).then(e=>e.Checkout),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`integration.configure`,`invoice.read`)),{titleKey:`configurationWorkspace.newTest`,robots:`noindex, nofollow`})},{path:`services/stripe/tests/:requestId`,loadComponent:()=>import(`./chunk-B86wqImw.js`).then(e=>e.CheckoutDetail),canActivate:[r],data:m$4(l$1({},o(`integration.configure`,`invoice.read`)),{titleKey:`configurationWorkspace.testDetail`,robots:`noindex, nofollow`})},{path:`services/stripe/tests`,loadComponent:()=>import(`./chunk-DSIpVKzQ.js`).then(e=>e.CheckoutList),canActivate:[r],data:m$4(l$1({},o(`integration.configure`,`invoice.read`)),{titleKey:`configurationWorkspace.tests`,robots:`noindex, nofollow`})},...[`resend`,`stripe`,`signwell`,`superpdp`].map(e=>({path:`services/${e}`,data:m$4(l$1({},o(`integration.configure`)),{provider:e,titleKey:`configurationWorkspace.connection`,robots:`noindex, nofollow`}),loadComponent:()=>import(`./chunk-GjZTRlHL.js`).then(t=>t.ProviderConnection),canActivate:[r]}))];var at={path:`audit`,loadComponent:()=>import(`./chunk-jEvWOBug.js`).then(e=>e.Audit),canActivate:[r],data:m$4(l$1({},o(`audit.read`)),{titleKey:`audit.title`,robots:`noindex, nofollow`})};var nt=[{path:`accounting`,loadComponent:()=>import(`./chunk-BE8oALxd.js`).then(e=>e.Accounting),canActivate:[r],data:m$4(l$1({},o(`accounting.read`)),{titleKey:`accounting.title`,robots:`noindex, nofollow`})}];var it=(e,t)=>e.fragment!==t.fragment;var le=`app-shell`;var rt=(e,t)=>t.map(a=>m$4(l$1({},a),{data:m$4(l$1({},a.data),{shell:e})}));function $(e){let t=`public`,a=e;for(;a;){let s=a.data.shell;s&&(t=s),a=a.firstChild}return t}var I=(e,t,a)=>[{path:``,redirectTo:e,pathMatch:`full`},...a.map(s=>({path:s,component:w$2,data:{panel:t,tab:s}}))];var ct=[...rt(`administrator`,[...Je,...Xe,...nt,...et,...tt,...ot,at]),{path:`join`,loadComponent:()=>import(`./chunk-BMsK7VjB2.js`).then(e=>e.TeamJoin),canDeactivate:[t],data:{shell:`public`,titleKey:`team.join`,robots:`noindex, nofollow`}},{path:``,redirectTo:`login`,pathMatch:`full`},{path:`quote`,canDeactivate:[t],runGuardsAndResolvers:it,loadComponent:()=>import(`./chunk-DyaBJhQt2.js`).then(e=>e.PublicQuote),data:{shell:`standalone`,titleKey:`page.public_quote`,descriptionKey:`page.description.public_quote`,robots:`noindex, nofollow`},children:[{path:``,redirectTo:`summary`,pathMatch:`full`},{path:`summary`,component:w$2,data:{panel:`summary`}},{path:`document`,component:w$2,data:{panel:`document`}},{path:`signature`,component:w$2,data:{panel:`signature`}},{path:`confirmation`,component:w$2,data:{panel:`confirmation`}}]},{path:`login`,loadComponent:()=>import(`./chunk-z-mghjkB.js`).then(e=>e.Login),data:{shell:`public`,titleKey:`page.back_office`,descriptionKey:`page.description.back_office`,robots:`noindex, nofollow`}},{path:`sign-out`,loadComponent:()=>import(`./chunk-bP01prsY.js`).then(e=>e.SignOut),canDeactivate:[t],data:{shell:`public`,titleKey:`backOffice.signOut`,robots:`noindex, nofollow`}},{path:`bootstrap`,loadComponent:()=>import(`./chunk-BzOWqX4m2.js`).then(e=>e.Bootstrap),data:{shell:`public`,titleKey:`page.back_office`,descriptionKey:`page.description.back_office`,robots:`noindex, nofollow`}},{path:`dashboard`,loadComponent:()=>import(`./chunk-B_pX979y.js`).then(e=>e.Dashboard),canActivate:[r],data:m$4(l$1({shell:`administrator`},o(`client.read`,`quote.read`,`order.read`,`invoice.read`)),{titleKey:`page.back_office`,descriptionKey:`page.description.back_office`,robots:`noindex, nofollow`})},{path:`account`,loadComponent:()=>import(`./chunk-THRzZN4s.js`).then(e=>e.AccountLayout),children:c,canActivate:[r],canActivateChild:[h],data:m$4(l$1({shell:`administrator`},de()),{titleKey:`account.security_title`,descriptionKey:`page.description.back_office`,robots:`noindex, nofollow`})},{path:`client/account`,loadComponent:()=>import(`./chunk-THRzZN4s.js`).then(e=>e.AccountLayout),children:c,canActivate:[Q],data:{shell:`client`,titleKey:`account.security_title`,descriptionKey:`page.description.back_office`,robots:`noindex, nofollow`}},{path:`client/documents/:kind/:documentId`,loadComponent:()=>import(`./chunk-DsZGgyjH2.js`).then(e=>e.CustomerDocumentDetail),canActivate:[Q],data:{shell:`client`,titleKey:`page.back_office_client`,robots:`noindex, nofollow`}},{path:`client`,loadComponent:()=>import(`./chunk-DxjwnDdp.js`).then(e=>e.ClientPortal),canActivate:[Q],data:{shell:`client`,titleKey:`page.back_office_client`,descriptionKey:`page.description.back_office_client`,robots:`noindex, nofollow`}},{path:`clients`,loadComponent:()=>import(`./chunk-CIIIDIUz.js`).then(e=>e.Clients),canActivate:[r],canActivateChild:[h],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_clients`},o(`client.read`)),{descriptionKey:`page.description.back_office_clients`,robots:`noindex, nofollow`}),children:I(`active`,`clients`,[`active`,`archived`,`all`])},{path:`purchases`,loadComponent:()=>import(`./chunk-D2P8u0ih2.js`).then(e=>e.SupplierInvoicesPage),canActivate:[r],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_supplier_invoices`},o(`supplier-invoice.read`)),{descriptionKey:`page.description.back_office_supplier_invoices`,robots:`noindex, nofollow`})},{path:`purchases/new`,loadComponent:()=>import(`./chunk-kb-UZrxn2.js`).then(e=>e.SupplierInvoiceEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`,titleKey:`supplierInvoice.createTitle`},o(`supplier-invoice.create`)),{robots:`noindex, nofollow`})},{path:`purchases/analyze`,loadComponent:()=>import(`./chunk-DT9HaYIg.js`).then(e=>e.SupplierInvoiceAnalysisPage),canActivate:[r],data:m$4(l$1({shell:`administrator`,titleKey:`supplierInvoice.analysis.title`},o(`supplier-invoice.analyze`,`supplier.read`)),{modules:[`purchasing`,`ai`],robots:`noindex, nofollow`})},{path:`purchases/payments`,loadComponent:()=>import(`./chunk-DmBRHpbi2.js`).then(e=>e.SupplierPaymentBatchesPage),canActivate:[r],data:m$4(l$1({shell:`administrator`,titleKey:`supplierPaymentBatch.title`},o(`supplier-invoice.pay`,`supplier-invoice.read`)),{robots:`noindex, nofollow`})},{path:`purchases/:invoiceId/edit`,loadComponent:()=>import(`./chunk-kb-UZrxn2.js`).then(e=>e.SupplierInvoiceEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`,titleKey:`supplierInvoice.editTitle`},o(`supplier-invoice.read`,`supplier-invoice.update`)),{robots:`noindex, nofollow`})},{path:`purchases/:invoiceId`,loadComponent:()=>import(`./chunk-C1jIGjiG.js`).then(e=>e.SupplierInvoiceDetail),canActivate:[r],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_supplier_invoices`},o(`supplier-invoice.read`)),{descriptionKey:`page.description.back_office_supplier_invoices`,robots:`noindex, nofollow`})},{path:`suppliers`,loadComponent:()=>import(`./chunk-Chasvinb.js`).then(e=>e.Suppliers),canActivate:[r],canActivateChild:[h],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_suppliers`},o(`supplier.read`)),{descriptionKey:`page.description.back_office_suppliers`,robots:`noindex, nofollow`}),children:I(`active`,`suppliers`,[`active`,`archived`,`all`])},{path:`suppliers/new`,loadComponent:()=>import(`./chunk-BbWEBemE.js`).then(e=>e.SupplierEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`supplier.create`)),{titleKey:`supplier.createTitle`,robots:`noindex, nofollow`})},{path:`suppliers/:supplierId/edit`,loadComponent:()=>import(`./chunk-BbWEBemE.js`).then(e=>e.SupplierEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`supplier.read`,`supplier.update`)),{titleKey:`supplier.editTitle`,robots:`noindex, nofollow`})},{path:`suppliers/:supplierId`,loadComponent:()=>import(`./chunk-BqbhE2jJ.js`).then(e=>e.SupplierDetail),canActivate:[r],data:m$4(l$1({shell:`administrator`},o(`supplier.read`)),{titleKey:`page.back_office_supplier_detail`,descriptionKey:`page.description.back_office_supplier_detail`,robots:`noindex, nofollow`})},{path:`clients/new`,loadComponent:()=>import(`./chunk-ynjMwOUq.js`).then(e=>e.ClientEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`client.create`)),{titleKey:`backOffice.clients.create`,robots:`noindex, nofollow`})},{path:`clients/:clientId/edit`,loadComponent:()=>import(`./chunk-ynjMwOUq.js`).then(e=>e.ClientEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`client.read`,`client.update`)),{titleKey:`clientsWorkspace.edit`,robots:`noindex, nofollow`})},{path:`clients/:clientId/access/new`,loadComponent:()=>import(`./chunk-DIyfCN-v.js`).then(e=>e.ClientAccessEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`client.read`,`client.access.manage`)),{titleKey:`page.back_office_client_detail`,robots:`noindex, nofollow`})},{path:`clients/:clientId`,loadComponent:()=>import(`./chunk-RRqL4AoW2.js`).then(e=>e.ClientDetail),canActivate:[r],canActivateChild:[h],canDeactivate:[t],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_client_detail`},o(`client.read`)),{descriptionKey:`page.description.back_office_client_detail`,robots:`noindex, nofollow`}),children:[{path:``,redirectTo:`profile`,pathMatch:`full`},{path:`profile`,component:w$2,data:{panel:`profile`}},{path:`affairs`,component:w$2,data:{panel:`affairs`}},{path:`documents`,component:w$2,data:{panel:`documents`}},{path:`access`,component:w$2,canActivate:[f],data:l$1({panel:`access`},o(`client.access.manage`))}]},{path:`affairs`,loadComponent:()=>import(`./chunk-CgThkMbX2.js`).then(e=>e.Affairs),canActivate:[r],canActivateChild:[h],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_quotes`},o(`affair.read`)),{descriptionKey:`page.description.back_office_quotes`,robots:`noindex, nofollow`}),children:I(`attention`,`affairs`,[`attention`,`active`,`completed`,`all`])},{path:`affairs/:affairId`,loadComponent:()=>import(`./chunk-TRzqZ7nT.js`).then(e=>e.AffairDetail),canActivate:[r],canActivateChild:[h],children:[...I(`overview`,`affair-detail`,[`overview`]),{path:`history`,component:w$2,canActivate:[f],data:l$1({panel:`affair-detail`,tab:`history`},o(`audit.read`))}],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_affair_detail`},o(`affair.read`,`quote.read`,`order.read`,`invoice.read`)),{descriptionKey:`page.description.back_office_affair_detail`,robots:`noindex, nofollow`})},{path:`quotes/new`,loadComponent:()=>import(`./chunk-D2reBpeg2.js`).then(e=>e.QuoteEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`quote.create`,`client.read`,`catalog.read`,`condition.read`,`issuer.read`)),{titleKey:`page.back_office_quote_editor`,descriptionKey:`page.description.back_office_quote_editor`,robots:`noindex, nofollow`})},{path:`quotes/:quoteId/edit`,loadComponent:()=>import(`./chunk-D2reBpeg2.js`).then(e=>e.QuoteEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`quote.read`,`quote.update`,`client.read`,`catalog.read`,`condition.read`,`issuer.read`)),{titleKey:`page.back_office_quote_editor`,descriptionKey:`page.description.back_office_quote_editor`,robots:`noindex, nofollow`})},{path:`quotes/:quoteId/publication`,loadComponent:()=>import(`./chunk-ByBw4qTD.js`).then(e=>e.QuotePublication),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`quote.read`,`quote.send`)),{titleKey:`commercial.publicationTitle`,robots:`noindex, nofollow`})},{path:`quotes/:quoteId`,loadComponent:()=>import(`./chunk-ByfP_6io2.js`).then(e=>e.QuoteDetail),canActivate:[r],canActivateChild:[h],canDeactivate:[t],children:I(`summary`,`quote-detail`,[`summary`,`document`]),data:m$4(l$1({shell:`administrator`},o(`quote.read`)),{titleKey:`commercial.quote`,robots:`noindex, nofollow`})},{path:`orders/:orderId`,loadComponent:()=>import(`./chunk-D2Albj_1.js`).then(e=>e.OrderDetail),canActivate:[r],data:m$4(l$1({shell:`administrator`},o(`order.read`,`quote.read`)),{titleKey:`commercial.order`,robots:`noindex, nofollow`})},{path:`catalog/new`,loadComponent:()=>import(`./chunk-BSxXPdhz2.js`).then(e=>e.CatalogEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`catalog.manage`)),{titleKey:`catalog.create`,robots:`noindex, nofollow`})},{path:`catalog/:itemId/edit`,loadComponent:()=>import(`./chunk-BSxXPdhz2.js`).then(e=>e.CatalogEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`catalog.read`,`catalog.manage`)),{titleKey:`catalogWorkspace.editTitle`,robots:`noindex, nofollow`})},{path:`catalog`,loadComponent:()=>import(`./chunk-DqoyE916.js`).then(e=>e.Catalog),canActivate:[r],canActivateChild:[h],data:m$4(l$1({shell:`administrator`},o(`catalog.read`)),{titleKey:`catalog.title`,robots:`noindex, nofollow`}),children:I(`active`,`catalog`,[`active`,`archived`,`all`])},{path:`configuration`,loadComponent:()=>import(`./chunk-Bans5XmP2.js`).then(e=>e.Configuration),canActivate:[r],canActivateChild:[h],data:m$4(l$1({shell:`administrator`},de()),{titleKey:`page.back_office_issuer_settings`,descriptionKey:`page.description.back_office_issuer_settings`,robots:`noindex, nofollow`}),children:Ze},{path:`emails/new`,loadComponent:()=>import(`./chunk-THDcl3GX2.js`).then(e=>e.EmailComposer),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.draft.manage`)),{titleKey:`emailsWorkspace.newMessage`,robots:`noindex, nofollow`})},{path:`emails/drafts/:draftId/edit`,loadComponent:()=>import(`./chunk-THDcl3GX2.js`).then(e=>e.EmailComposer),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.draft.manage`)),{titleKey:`emailsWorkspace.editDraft`,robots:`noindex, nofollow`})},{path:`emails/messages/:operationId`,loadComponent:()=>import(`./chunk-BtRCqgfa.js`).then(e=>e.EmailDetail),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.draft.manage`)),{titleKey:`emailsWorkspace.message`,robots:`noindex, nofollow`})},{path:`emails/templates/new`,loadComponent:()=>import(`./chunk-BAjZiy9u2.js`).then(e=>e.EmailTemplateEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.template.manage`)),{titleKey:`emailsWorkspace.newTemplate`,robots:`noindex, nofollow`})},{path:`emails/templates/:templateId/edit`,loadComponent:()=>import(`./chunk-BAjZiy9u2.js`).then(e=>e.EmailTemplateEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.template.manage`)),{titleKey:`emailsWorkspace.editTemplate`,robots:`noindex, nofollow`})},{path:`emails/reminders/new`,loadComponent:()=>import(`./chunk-BRUZgvLR2.js`).then(e=>e.ReminderEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.reminder.manage`)),{titleKey:`emailsWorkspace.newReminder`,robots:`noindex, nofollow`})},{path:`emails`,loadComponent:()=>import(`./chunk-VKqyG94L.js`).then(e=>e.Emails),canActivate:[r],canActivateChild:[h],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.draft.manage`)),{titleKey:`emails.title`,descriptionKey:`emails.intro`,robots:`noindex, nofollow`}),children:[{path:``,redirectTo:`messages`,pathMatch:`full`},{path:`messages`,component:w$2,canActivate:[f],data:l$1({panel:`emails`,tab:`messages`},o(`integration.manage`))},{path:`drafts`,component:w$2,canActivate:[f],data:l$1({panel:`emails`,tab:`drafts`},o(`email.draft.manage`))},{path:`reminders`,component:w$2,canActivate:[f],data:l$1({panel:`emails`,tab:`reminders`},o(`email.reminder.manage`,`invoice.read`,`client.read`,`integration.manage`))},{path:`templates`,component:w$2,canActivate:[f],data:l$1({panel:`emails`,tab:`templates`},o(`email.template.manage`))}]},{path:`version`,loadComponent:()=>import(`./chunk-C7DvmZKC.js`).then(e=>e.Version),data:{shell:`standalone`,titleKey:`page.version`,descriptionKey:`page.description.version`}},{path:`404`,loadComponent:()=>import(`./chunk-DXsw8_Za2.js`).then(e=>e.NotFoundComponent),data:{titleKey:`page.not_found`,descriptionKey:`page.description.not_found`,robots:`noindex, nofollow`}},{path:`**`,loadComponent:()=>import(`./chunk-DXsw8_Za2.js`).then(e=>e.NotFoundComponent),data:{titleKey:`page.not_found`,descriptionKey:`page.description.not_found`,robots:`noindex, nofollow`}}];var ut=e=>e===`/api/auth/account`||e===`/api/auth/login`||e===`/api/auth/refresh`||e===`/api/auth/logout`||e===`/api/auth/password`||e===`/api/bootstrap`||e===`/api/team/accept`||e.startsWith(`/api/public/`)||e===`/api/health`||e===`/api/version`;var st=(e,t)=>{let a=g$2(v);return!e.url.startsWith(`/api/`)||ut(e.url)||e.headers.has(`Authorization`)?t(e):t(e).pipe(qa(s=>s.status!==401?fE(()=>s):nt$1(a.refresh()).pipe(Qa(()=>a.mode()===void 0?fE(()=>s):t(e)))))};var dt={providers:[DI(),uA(dA(),lA([st])),s8(o8(),i8()),Uo(ct,zo(),Po({anchorScrolling:`enabled`,scrollPositionRestoration:`enabled`}),$o(e=>{let t=e.error instanceof Error?e.error.message:String(e.error);if(!/chunk|dynamically imported module|importing a module script/i.test(t))return;let a=Number(sessionStorage.getItem(`froment.chunk-reload`));Date.now()-a<1e4||(sessionStorage.setItem(`froment.chunk-reload`,String(Date.now())),location.reload())}))]};var Y=class e{router=g$2(ue);document=g$2(H$3);injector=g$2(ce$3);isBrowser=xU(g$2(yo$1));navigationEnd=T$2(this.router.events.pipe(jt(t=>t instanceof x$2)),{initialValue:null});initialNavigationComplete=this.router.navigated;previousUrl=this.router.url;constructor(){ou(()=>{let t=this.navigationEnd();if(!t)return;let a=this.previousUrl;if(this.previousUrl=t.urlAfterRedirects,!this.initialNavigationComplete){this.initialNavigationComplete=!0;return}let s=this.router.parseUrl(t.urlAfterRedirects).fragment;a.split(/[?#]/,1)[0]===t.urlAfterRedirects.split(/[?#]/,1)[0]&&this.router.parseUrl(a).fragment===s||(s?this.focusFragment(s):this.focusMainAfterRender())})}focusFragment(t){this.isBrowser&&Ol(()=>{let a=this.document.getElementById(t);if(!a)return this.focusMain();let s=a.matches(`h1, h2, h3, h4, h5, h6, [role="heading"]`)?a:a.querySelector(`h1, h2, h3, h4, h5, h6, [role="heading"]`)??a;this.focusElement(s)},{injector:this.injector})}focusElement(t){let a=!t.hasAttribute(`tabindex`)&&!t.matches(`a[href], area[href], button, input, select, textarea, iframe, [contenteditable="true"]`);if(a&&(t.tabIndex=-1),t.focus({preventScroll:!0}),a){if(this.document.activeElement!==t)return t.removeAttribute(`tabindex`);t.addEventListener(`blur`,()=>t.removeAttribute(`tabindex`),{once:!0})}}focusMain(){this.document.getElementById(`main-content`)?.focus({preventScroll:!0})}focusMainAfterRender(){this.isBrowser&&Ol(()=>this.focusMain(),{injector:this.injector})}static ɵfac=function(a){return new(a||e)};static ɵprov=A$2({token:e,factory:e.ɵfac,providedIn:`root`})};var J=class e{router=g$2(ue);route=g$2(G$2);i18n=g$2(Ie);title=g$2(r8);meta=g$2(n8);navigationEnd=T$2(this.router.events.pipe(jt(t=>t instanceof x$2)),{initialValue:null});constructor(){ou(()=>{this.i18n.language(),this.navigationEnd(),this.updateRoute()})}updateRoute(){let t=this.route.snapshot;for(;t.firstChild;)t=t.firstChild;this.setPageTitle(t.data.titleKey),this.meta.updateTag({name:`robots`,content:`noindex, nofollow`})}setPageTitle(t){if(t){let a=this.i18n.t(t).split(` | `)[0];this.title.setTitle(a)}}static ɵfac=function(a){return new(a||e)};static ɵprov=A$2({token:e,factory:e.ɵfac,providedIn:`root`})};var X=class e{document=g$2(H$3);textCopy=g$2(a);hideTimer;message=Ke(null);async copy(t,a){let s=this.document.defaultView?.location;if(!s)return;let p=`${s.origin}${s.pathname}${s.search}#${t}`;await this.textCopy.copy(p)&&(clearTimeout(this.hideTimer),this.message.set(a),this.hideTimer=setTimeout(()=>this.message.set(null),2400))}static ɵfac=function(a){return new(a||e)};static ɵprov=A$2({token:e,factory:e.ɵfac,providedIn:`root`})};function gt(e,t){e&1&&(pd(0,`div`,0),y_(1),hd()),e&2&&(ZC(),nv(t))}var Z=class e{anchorCopy=g$2(X);static ɵfac=function(a){return new(a||e)};static ɵcmp=Fb({type:e,selectors:[[`app-copy-notice`]],decls:1,vars:1,consts:[[`role`,`status`,`aria-live`,`polite`,1,`copy-notice`,`visible`]],template:function(a,s){if(a&1&&OS(0,gt,2,1,`div`,0),a&2){let p;kS((p=s.anchorCopy.message())?0:-1,p)}},styles:[`[_nghost-%COMP%]{display:contents}.copy-notice[_ngcontent-%COMP%]{position:fixed;right:var(--%NS%page-x);bottom:var(--%NS%space-4);z-index:var(--%NS%z-skip-link);max-width:min(24rem,100vw - 2 * var(--%NS%page-x));padding:var(--%NS%space-2) var(--%NS%space-3);border:1px solid var(--%NS%color-line-strong);border-radius:var(--%NS%radius-sm);background:var(--%NS%color-surface-raised);box-shadow:var(--%NS%shadow-sm);font-size:var(--%NS%text-sm);opacity:0;pointer-events:none;transform:translateY(var(--%NS%space-2));transition:opacity var(--%NS%duration-base) var(--%NS%ease-out),transform var(--%NS%duration-base) var(--%NS%ease-out)}.copy-notice.visible[_ngcontent-%COMP%]{opacity:1;transform:translateY(0)}@media(prefers-reduced-motion:reduce){.copy-notice[_ngcontent-%COMP%]{transition:none}}`]})};var ee=class e{administrator=NH(!1);static ɵfac=function(a){return new(a||e)};static ɵcmp=Fb({type:e,selectors:[[`app-back-office-header-placeholder`]],inputs:{administrator:[1,`administrator`]},decls:12,vars:2,consts:[[`aria-hidden`,`true`,1,`sidebar`],[1,`placeholder`,`account-placeholder`],[1,`navigation-placeholder`],[1,`placeholder`],[`aria-hidden`,`true`,1,`workspace-header`],[1,`placeholder`,`search-placeholder`],[1,`placeholder`,`actions-placeholder`]],template:function(a,s){a&1&&(Us(0,`div`,0),Py(1,`span`,1),Us(2,`div`,2),Py(3,`span`,3)(4,`span`,3)(5,`span`,3)(6,`span`,3)(7,`span`,3),fd()(),Us(8,`div`,4),Py(9,`app-navigation-progress`)(10,`span`,5)(11,`span`,6),fd()),a&2&&(ZC(8),Xy(`administrator`,s.administrator()))},dependencies:[v$2],styles:[`[_nghost-%COMP%]{display:contents}.sidebar[_ngcontent-%COMP%]{grid-area:sidebar;position:sticky;inset-block-start:0;block-size:100dvh;overflow-y:auto;display:flex;flex-direction:column;gap:var(--%NS%space-5);padding:var(--%NS%space-4);border-inline-end:1px solid var(--%NS%color-line);background:var(--%NS%color-header)}@media(max-width:63.999rem){.sidebar[_ngcontent-%COMP%]{display:none}}.workspace-header[_ngcontent-%COMP%]{grid-area:header;position:sticky;inset-block-start:0;z-index:var(--%NS%z-header);display:flex;align-items:center;flex-wrap:wrap;gap:var(--%NS%space-3);min-block-size:3.75rem;padding:var(--%NS%space-3) var(--%NS%page-x);border-block-end:1px solid var(--%NS%color-line);background:var(--%NS%color-surface)}.placeholder[_ngcontent-%COMP%]{display:block;block-size:1.5rem;border-radius:var(--%NS%radius-xs);background:var(--%NS%color-surface-sunken)}.account-placeholder[_ngcontent-%COMP%]{block-size:3.75rem}.navigation-placeholder[_ngcontent-%COMP%]{display:grid;gap:var(--%NS%space-4)}.search-placeholder[_ngcontent-%COMP%]{inline-size:min(100%,32rem);block-size:var(--%NS%control-height)}.actions-placeholder[_ngcontent-%COMP%]{display:none;inline-size:12rem;block-size:var(--%NS%control-height)}@media(max-width:40rem){.administrator[_ngcontent-%COMP%] .search-placeholder[_ngcontent-%COMP%]{inline-size:100%}.administrator[_ngcontent-%COMP%] .actions-placeholder[_ngcontent-%COMP%]{display:block}}@media print{.sidebar[_ngcontent-%COMP%], .workspace-header[_ngcontent-%COMP%]{display:none}}`]})};var vt=()=>[import(`./chunk-DK0GFIMr.js`).then(e=>e.FlashOutlet)];var ht=()=>[import(`./chunk-BnPSwNBN.js`).then(e=>e.BackOfficeHeader)];function yt(e,t){if(e&1&&Py(0,`app-back-office-header`,8),e&2)Fy(`administrator`,qS(2).administrator())}function bt(e,t){if(e&1&&Py(0,`app-back-office-header-placeholder`,8),e&2)Fy(`administrator`,qS(2).administrator())}function St(e,t){if(e&1){let a=zS();Us(0,`div`,9),Py(1,`app-navigation-progress`),Us(2,`p`,10),y_(3),fd(),Us(4,`button`,11),Gy(`click`,function(){Ip(a);return wp(qS(2).reload())}),y_(5),fd()()}if(e&2){let a=qS(2);ZC(3),nv(a.i18n.t(`shell.navigationUnavailable`)),ZC(2),nv(a.i18n.t(`shell.reload`))}}function kt(e,t){if(e&1&&(wy(0,yt,1,1)(1,bt,1,1)(2,St,6,2),MS(3,0,ht,null,1,2)),e&2){let a=qS();ZC(3),NS(a.startup()===`ready`)}}function Ct(e,t){e&1&&Py(0,`app-navigation-progress`,3)}function Mt(e,t){if(e&1&&Py(0,`app-environment-status`,4),e&2)Fy(`publicPage`,qS().publicPage())}function xt(e,t){if(e&1&&(Us(0,`div`,6),Py(1,`span`,12),Us(2,`p`),y_(3),fd()()),e&2){let a=qS();ZC(3),nv(a.i18n.t(`shell.loading`))}}function _t(e,t){if(e&1){let a=zS();Us(0,`div`,7)(1,`p`,10),y_(2),fd(),Us(3,`button`,11),Gy(`click`,function(){Ip(a);return wp(qS().reload())}),y_(4),fd()()}if(e&2){let a=qS();ZC(2),nv(a.i18n.t(`shell.loadError`)),ZC(2),nv(a.i18n.t(`shell.reload`))}}function Nt(e,t){e&1&&Py(0,`app-flash-outlet`)}jN(class e{i18n=g$2(Ie);router=g$2(ue);navigating=Ft(()=>this.router.currentNavigation()!==null);document=g$2(H$3);transferState=g$2(At$1);initialShell=this.router.navigated?$(this.router.routerState.snapshot.root):this.transferState.get(le,void 0);shell=Ke(this.initialShell);startup=Ke(this.initialShell===void 0?`loading`:`ready`);backOffice=Ft(()=>this.shell()===`administrator`||this.shell()===`client`);administrator=Ft(()=>this.shell()===`administrator`);standalonePage=Ft(()=>this.shell()===`standalone`);publicPage=Ft(()=>this.shell()===`public`);constructor(){g$2(Y),g$2(J),this.transferState.onSerialize(le,()=>this.shell()),this.router.events.pipe(U$1()).subscribe(t=>{t instanceof x$2?(this.shell.set($(this.router.routerState.snapshot.root)),this.startup.set(`ready`)):this.startup()!==`ready`&&(t instanceof je?(this.shell.set($(t.state.root)),this.startup.set(`loading`)):t instanceof J$3?this.startup.set(`loading`):(t instanceof se$1||t instanceof H$2||t instanceof j$3&&t.code!==b$2.Redirect&&t.code!==b$2.SupersededByNewNavigation)&&this.startup.set(`error`))})}reload(){this.document.defaultView?.location.reload()}static ɵfac=function(a){return new(a||e)};static ɵcmp=Fb({type:e,selectors:[[`app-root`]],decls:15,vars:12,consts:[[`mainContent`,``],[1,`app-shell`],[`href`,`#main-content`,1,`skip-link`,3,`click`],[1,`standalone-progress`],[`ngSkipHydration`,``,`placement`,`hidden`,3,`publicPage`],[`id`,`main-content`,`tabindex`,`-1`],[`role`,`status`,1,`startup-status`],[1,`startup-status`],[3,`administrator`],[1,`header-error`],[`role`,`alert`],[`appButton`,``,`type`,`button`,3,`click`],[`aria-hidden`,`true`,1,`loading-spinner`]],template:function(a,s){if(a&1){let p=zS();Us(0,`div`,1)(1,`a`,2),Gy(`click`,function(M){Ip(p);let x=t_(7);return M.preventDefault(),wp(x.focus({preventScroll:!0}))}),y_(2),fd(),OS(3,kt,5,1)(4,Ct,1,0,`app-navigation-progress`,3),OS(5,Mt,1,1,`app-environment-status`,4),Us(6,`main`,5,0),OS(8,xt,4,1,`div`,6)(9,_t,5,2,`div`,7),wy(10,Nt,1,0),MS(11,10,vt),Py(13,`router-outlet`),fd(),Py(14,`app-copy-notice`),fd()}a&2&&(Xy(`back-office-shell`,s.backOffice())(`standalone-shell`,s.standalonePage()),ZC(2),nv(s.i18n.t(`shell.skip`)),ZC(),kS(s.backOffice()?3:s.standalonePage()?4:-1),ZC(2),kS(s.backOffice()?-1:5),ZC(),Xy(`startup-main`,s.startup()!==`ready`),ky(`aria-busy`,s.navigating()),ZC(2),kS(s.startup()===`loading`?8:s.startup()===`error`?9:-1),ZC(3),NS(s.backOffice()))},dependencies:[ee,N,Z,M$1,v$2,gr],styles:[`[_nghost-%COMP%]{display:block;min-height:100dvh}.app-shell[_ngcontent-%COMP%]{display:flex;min-width:0;min-height:100dvh;flex-direction:column;color:var(--%NS%color-ink)}.back-office-shell[_ngcontent-%COMP%]{display:grid;grid-template-columns:16rem minmax(0,1fr);grid-template-rows:auto minmax(0,1fr);grid-template-areas:"sidebar header" "sidebar content";align-items:start;background:var(--%NS%color-surface)}.back-office-shell[_ngcontent-%COMP%] main[_ngcontent-%COMP%]{grid-area:content;width:100%;max-width:var(--%NS%page-width-wide);margin-block:0;margin-inline:auto}.back-office-shell[_ngcontent-%COMP%] app-copy-notice[_ngcontent-%COMP%]{display:contents}.startup-main[_ngcontent-%COMP%]{display:flex;align-self:stretch}.startup-status[_ngcontent-%COMP%], .header-error[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:var(--%NS%space-3);padding:var(--%NS%page-y) var(--%NS%page-x);color:var(--%NS%color-muted)}.startup-status[_ngcontent-%COMP%]{flex:1;min-width:0;flex-direction:column;flex-wrap:nowrap;justify-content:center;gap:var(--%NS%space-4);color:var(--%NS%color-ink);font-size:var(--%NS%text-xl);text-align:center}.header-error[_ngcontent-%COMP%]{position:relative;grid-area:header}.standalone-progress[_ngcontent-%COMP%]{position:fixed;inset-block-start:0}.loading-spinner[_ngcontent-%COMP%]{flex:none;inline-size:3rem;block-size:3rem;border:3px solid var(--%NS%color-line-strong);border-block-start-color:var(--%NS%color-ink);border-radius:50%}@media(prefers-reduced-motion:no-preference){.loading-spinner[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_loading-spin .8s linear infinite}}@keyframes _ngcontent-%COMP%_loading-spin{to{transform:rotate(360deg)}}@media(max-width:63.999rem){.back-office-shell[_ngcontent-%COMP%]{grid-template-columns:minmax(0,1fr);grid-template-areas:"header" "content"}}.skip-link[_ngcontent-%COMP%]{position:fixed;top:var(--%NS%space-2);inset-inline-start:var(--%NS%space-3);z-index:var(--%NS%z-skip-link);padding:var(--%NS%space-2) var(--%NS%space-3);border:1px solid var(--%NS%color-line-strong);border-radius:var(--%NS%radius-sm);background:var(--%NS%color-surface-raised);font-size:var(--%NS%text-sm);clip-path:inset(50%);translate:0 calc(-100% - var(--%NS%space-6))}.skip-link[_ngcontent-%COMP%]:focus-visible{clip-path:none;translate:0 0}main[_ngcontent-%COMP%]{flex:1;min-width:0;width:calc(100% - 2 * var(--%NS%shell-gutter));max-width:var(--%NS%layout-max);margin-block:var(--%NS%shell-gutter);margin-inline:auto;outline:none}.standalone-shell[_ngcontent-%COMP%] main[_ngcontent-%COMP%]{width:100%;max-width:none;margin:0}#main-content[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--%NS%color-focus);outline-offset:-2px;box-shadow:none}@media print{.back-office-shell[_ngcontent-%COMP%] main[_ngcontent-%COMP%]{max-width:none}.back-office-shell[_ngcontent-%COMP%]{display:block}main[_ngcontent-%COMP%]{width:100%;max-width:none;margin:0}}`],changeDetection:1})},dt).catch(e=>console.error(e));export{oe$2 as C,x$2 as E,gr as S,ue as T,o$3 as _,T$2 as a,No as b,O$1 as c,M$1 as d,a$1 as f,bt$1 as g,Ne as h,r$1 as i,r$2 as l,Ie as m,v as n,U$1 as o,v$2 as p,N as r,a as s,o$1 as t,c as u,Dt as v,p$4 as w,ce$2 as x,G$2 as y};
89
+ Thank you.`,"services.offer.renovation.title":`Audit and renovation`,"services.offer.renovation.desc":`We assess your projects, environment, risks and gaps. We then propose fixes, upgrades, automation and gradual refactoring.`,"services.offer.renovation.cta":`View audit and renovation details`,"services.offer.development.title":`All-inclusive development`,"services.offer.development.desc":`We handle the design, implementation, testing and deployment of a business application or internal tool.`,"services.offer.development.cta":`View development details`,"serviceDetail.back":`Back to services`,"serviceDetail.renovation.title":`Audit and renovation`,"serviceDetail.renovation.lead":`Understand the real problems before investing, then modernize existing software without a systematic rewrite.`,"serviceDetail.renovation.scope.title":`What we assess and improve`,"serviceDetail.renovation.scope.projects.title":`Projects and architecture`,"serviceDetail.renovation.scope.projects.desc":`Code structure, dependencies, data flows, weak points and capacity for further change.`,"serviceDetail.renovation.scope.delivery.title":`Delivery pipeline`,"serviceDetail.renovation.scope.delivery.desc":`Builds, tests, continuous integration, deployments and lead time from a change to production.`,"serviceDetail.renovation.scope.quality.title":`CVEs, vulnerabilities and secrets`,"serviceDetail.renovation.scope.quality.desc":`CVE and vulnerability detection with static analysis tools suited to each language. Detection of secrets in source code and Git history.`,"serviceDetail.renovation.scope.quality.staticAnalysis":`Static analysis tools`,"serviceDetail.renovation.scope.quality.trufflehog":`TruffleHog`,"serviceDetail.renovation.scope.environment.title":`Working environment`,"serviceDetail.renovation.scope.environment.desc":`Local setup, secrets, documentation, tools and problems faced by the existing team.`,"serviceDetail.renovation.deliverables.title":`What you receive`,"serviceDetail.renovation.deliverables.audit":`A documented, factual assessment ranked by risk level.`,"serviceDetail.renovation.deliverables.plan":`A prioritized improvement plan with costs, dependencies and expected results.`,"serviceDetail.renovation.deliverables.work":`The fixes and renovation agreed in the quote, validated in your environment.`,"serviceDetail.renovation.deliverables.handover":`The code, tests, documentation and instructions required for subsequent work.`,"serviceDetail.renovation.fit.title":`This service fits if…`,"serviceDetail.renovation.fit.desc":`Your software remains useful, but it is slow to change, hard to deploy or risky to maintain.`,"serviceDetail.development.title":`All-inclusive development`,"serviceDetail.development.lead":`One contact to turn a business need into tested, deployed and documented software.`,"serviceDetail.development.scope.title":`End-to-end delivery`,"serviceDetail.development.scope.design.title":`Design`,"serviceDetail.development.scope.design.desc":`Clarification of uses, journeys, data, constraints and approval criteria.`,"serviceDetail.development.scope.build.title":`Implementation`,"serviceDetail.development.scope.build.desc":`Development of the interface, business rules, integrations and required automation.`,"serviceDetail.development.scope.tests.title":`Testing`,"serviceDetail.development.scope.tests.desc":`Automated tests and functional checks focused on product uses and risks.`,"serviceDetail.development.scope.deploy.title":`Deployment`,"serviceDetail.development.scope.deploy.desc":`Reproducible rollout, environment configuration and preparation for operations.`,"serviceDetail.development.deliverables.title":`What is included`,"serviceDetail.development.deliverables.product":`A web application, desktop application or internal tool that meets the approved scope.`,"serviceDetail.development.deliverables.source":`The source code and dependencies required to build the product.`,"serviceDetail.development.deliverables.tests":`Automated tests and the criteria used to approve delivery.`,"serviceDetail.development.deliverables.operations":`Documentation and instructions for deployment, use and maintenance.`,"serviceDetail.development.fit.title":`This service fits if…`,"serviceDetail.development.fit.desc":`You have a precise business need and want to delegate delivery through production rollout.`,"services.examples.title":`Concrete examples`,"services.examples.upgrades.title":`Version upgrades`,"services.examples.upgrades.desc":`Upgrade dependencies and libraries, resolve incompatibilities, then validate behaviour through tests.`,"services.examples.build.title":`Build pipeline`,"services.examples.build.before":`Make builds reproducible with`,"services.examples.build.after":`: declared dependencies, identical environments and shared caches.`,"services.examples.ci.title":`Continuous integration`,"services.examples.ci.desc":`Take over an existing CI pipeline, remove unnecessary work, parallelize stages and cache reusable results.`,"services.examples.tests.title":`Automated tests`,"services.examples.tests.desc":`Add unit, integration and architecture tests to stabilize existing software and automatically verify application behaviour.`,"services.examples.environments.title":`Development environments`,"services.examples.environments.before":`Declare and automate reproducible development environments with`,"services.examples.secrets.title":`Secret management`,"services.examples.secrets.before":`Centralize secrets in an on-premises vault, a cloud service or a lightweight solution:`,"services.examples.secrets.through":`Automate their injection into applications with`,"services.examples.ai.title":`AI agents`,"services.examples.ai.before":`Integrate specialized agents into design discussions: backlog preparation, meeting analysis and live prototyping with`,"services.examples.ai.usage":`Track usage, models and costs with`,"services.examples.metrics.title":`Technical measurements`,"services.examples.metrics.before":`Measure response, test, build, CI and deployment times. Publish timestamped indicators to`,"services.examples.metrics.after":`to track measured values instead of estimates.`,"services.examples.infrastructure.title":`Infrastructure and deployment`,"services.examples.infrastructure.before":`Declare, test and reproduce on-premises or cloud deployments with NixOS, build caching and infrastructure as code through`,"services.examples.or":`or`,"services.process.kicker":`Delivery method`,"services.process.title":`How an engagement works`,"services.process.analysis.title":`Qualify the need`,"services.process.analysis.desc":`We perform a limited initial review to understand the context and prepare the quote. The full audit starts after approval.`,"services.process.quote.title":`Prepare the quote`,"services.process.quote.desc":`We provide a detailed quote. It defines the services, deliverables, schedule and price.`,"services.process.agreement.title":`Approve the scope`,"services.process.agreement.desc":`You accept the proposal. If we then refine an objective or the scope, we submit an updated quote before work starts.`,"services.process.delivery.title":`Deliver the work`,"services.process.delivery.desc":`We deliver the work in close contact with your stakeholders and existing development team.`,"services.process.validation.title":`Approve delivery`,"services.process.validation.desc":`You approve the deliverables against the quote criteria, then pay the remaining balance.`,"services.practical.title":`In practice`,"services.practical.method":`Method`,"services.practical.method.desc":`The quote defines scope, price, deliverables and acceptance criteria.`,"services.practical.schedule":`Schedule`,"services.practical.schedule.desc":`The schedule is defined from the scope, dependencies and expected approvals.`,"services.practical.deliverables":`Deliverables`,"services.practical.deliverables.desc":`Source code, tests, documentation and rollout instructions appropriate to the engagement.`,"services.criteria.title":`Useful information to get started`,"services.criteria.context":`The context and affected users.`,"services.criteria.problem":`The main problem or expected result.`,"services.criteria.deadline":`The known deadline and technical constraints.`,"serviceDetail.contact.title":`Discuss your need`,"clients.title":`Experience`,"clients.sectors.title":`Industry experience`,"clients.cv":`View full CV`,"clients.sector.industry":`Industry`,"clients.sector.insurance":`Insurance`,"clients.sector.services":`Services`,"about.faq.title":`Frequently asked questions`,"about.faq.intro":`Direct answers about how a collaboration works.`,"about.faq.process.q":`How does an engagement work?`,"about.faq.stack.q":`How do you choose technologies?`,"about.faq.remote.q":`Do you work remotely?`,"about.faq.nda.q":`Do you accept confidentiality agreements?`,"about.faq.timeline.q":`How do you set the schedule?`,"about.faq.maintenance.q":`Do you offer maintenance after delivery?`,"about.faq.pricing.q":`How are services billed?`,"about.faq.availability.q":`What is your availability?`,"about.faq.process.a":`An initial discussion identifies the need, constraints and success criteria. The quote then defines scope, deliverables and follow-up terms before development and go-live.`,"about.faq.stack.a":`The choice depends on the product, team and existing system. Technologies used: Angular, SvelteKit, ASP.NET, WPF, Go, Linux and PostgreSQL.`,"about.faq.remote.a":`Yes. Work is mainly remote, with review points agreed for each engagement.`,"about.faq.nda.a":`Yes, after agreement on the obligations, duration and information covered.`,"about.faq.timeline.a":`The schedule depends on scope, dependencies and expected approvals. It is defined in the quote rather than promised before scoping.`,"about.faq.maintenance.a":`Yes. Fixes, upgrades and further changes can be included in the quote or agreed after delivery.`,"about.faq.pricing.a":`Fixed-price when the scope is stable enough. Uncertainty is first isolated in a scoping phase.`,"about.faq.availability.a":`Engagements are scheduled part-time. The start date is confirmed before the quote.`,"not_found.title":`This page does not exist.`,"not_found.lead":`Check the address or return to the home page.`,"not_found.cta":`Back to home`,"not_found.links_label":`Next steps`,"not_found.services":`View services`,"not_found.contact":`Email Froment Software`,"about.contact.title":`Contact`,"about.contact.mail":`Email us`,"about.contact.book":`Book an appointment`,"blog.title":`Blog`,"blog.lead":`Technical notes, experience reports and ideas.`,"blog.topics":`Topics`,"blog.back":`Back to the blog`,"blog.missing":`Article not found`,"legal.kicker":`Site information`,"legal.title":`Legal notice`,"legal.lead":`Essential information about the publishing, hosting and use of froment.software content.`,"legal.updated":`Updated 19 August 2026`,"legal.summary.title":`At a glance`,"legal.summary.content":`froment.software presents Sacha FROMENT’s software-engineering consultancy work and services. Its private area provides accounts for clients and administrators.`,"legal.publisher.title":`Site publisher`,"legal.publisher.content":`froment.software is published and maintained by Sacha FROMENT. Administrative or legal requests can be sent by email.`,"legal.hosting.title":`Hosting`,"legal.hosting.content":`The site is served as a static website and hosted on private infrastructure administered by the publisher. Technical requests relating to hosting can be sent to the same contact.`,"legal.ip.title":`Content and intellectual property`,"legal.ip.content":`Unless stated otherwise, text, graphics and components created for froment.software remain their author’s property. Short quotations with attribution are permitted; any other reuse requires prior agreement.`,"legal.links.title":`External links`,"legal.links.content":`The site links to demonstrations, a booking service and other websites. Their content and practices are the responsibility of their respective publishers.`,"legal.contact.title":`Contact`,"legal.contact.content":`For a question about the site, its content or a legal request:`,"legal.related.title":`Related documents`,"legal.related.content":`You can also read how technical data and the language preference are handled.`,"legal.related.privacy":`Privacy policy`,"legal.related.cookies":`Cookies and local storage`,"privacy.kicker":`Data and browsing`,"privacy.title":`Privacy policy`,"privacy.lead":`What this site processes automatically, what it keeps in your browser and how to ask a question.`,"privacy.updated":`Updated 19 August 2026`,"privacy.summary.title":`Key points`,"privacy.summary.content":`The site has no advertising tool or audience analytics. The server may log technical requests. The browser stores the language and, after sign-in, two strictly necessary cookies.`,"privacy.who.title":`Site operator`,"privacy.who.content":`Sacha FROMENT publishes froment.software and handles requests about data processed by this site.`,"privacy.data.title":`Technical server logs`,"privacy.data.content":`When a page or file is loaded, the server may automatically log request data such as the IP address, date and time, requested path, user agent and response status. This technical logging results from the request sent to the server; it is not presented as consent-based. It may be used for service diagnosis, availability and security.`,"privacy.retention.title":`Log retention`,"privacy.retention.content":`No fixed duration is stated here because it depends on the operating configuration. You may request current information about retention or the handling of a specific request.`,"privacy.storage.title":`Language preference`,"privacy.storage.content":`The site stores the selected language in the browser’s local storage under the key “froment.software.language”, with the value “fr” or “en”. This setting persists until it is changed or cleared in the browser. It is neither a cookie nor a session.`,"privacy.session.title":`Private area`,"privacy.session.content":`After sign-in, the browser temporarily stores an access token in memory. A secure refresh cookie maintains access for up to 30 days. The server restricts this cookie to authentication routes.`,"privacy.external.title":`Email and external services`,"privacy.external.content":`Contact links open your email application; the site itself does not send a message. If you follow a link to another domain, that service applies its own data-handling rules.`,"privacy.rights.title":`Data requests`,"privacy.rights.content":`You may ask what technical data is available, report an error or request deletion when the request can be identified. An IP address, date and time range may be needed to locate a log entry. This is practical information, not legal advice.`,"privacy.contact.title":`Contact`,"privacy.contact.content":`For a privacy question or data request:`,"privacy.related.title":`Related information`,"privacy.related.cookies":`Details about cookies and local storage`,"privacy.related.legal":`Legal notice`,"cookies.kicker":`Browser storage`,"cookies.title":`Cookies and local storage`,"cookies.lead":`The public site only stores the display language. The private area uses two strictly necessary cookies after sign-in.`,"cookies.updated":`Updated 19 August 2026`,"cookies.summary.title":`Current behaviour`,"cookies.summary.content":`The application creates no audience analytics or advertising cookie. The “__Secure-froment-refresh” cookie maintains private-area authentication.`,"cookies.what.title":`Cookies and local storage are different`,"cookies.what.content":`A cookie may be sent to the server automatically with a request. Local storage remains in the browser. froment.software uses local storage for language and cookies only for the private area.`,"cookies.why.title":`Stored setting`,"cookies.why.content":`The key “froment.software.language” contains “fr” or “en”. If no valid value exists, the site selects French when the browser language starts with “fr”, and English otherwise, then stores that choice locally.`,"cookies.control.title":`Change or clear the setting`,"cookies.control.content":`Use the language selector in the header to replace the value. You can also clear site data in your browser settings. The site will continue to work and will detect the language again on the next load.`,"cookies.privacy.title":`Technical data`,"cookies.privacy.content":`Local storage is separate from the technical logs the server may produce when responding to a request.`,"cookies.privacy.link":`Read the privacy policy`,"cookies.contact.title":`Contact`,"cookies.contact.content":`For a question about this setting or how the site works:`})};function ye(t){let i=[],n=0,a=-1;for(let s=0;s<t.length;s+=1)t[s]===`{`?a=s:t[s]===`}`&&(a>=n&&a+1<s&&(a>n&&i.push({kind:`text`,value:t.slice(n,a)}),i.push({kind:`parameter`,name:t.slice(a+1,s)}),n=s+1),a=-1);return n<t.length&&i.push({kind:`text`,value:t.slice(n)}),i}function Ce(t,i){return t.map(n=>n.kind===`text`?n.value:Object.hasOwn(i,n.name)?String(i[n.name]):`{${n.name}}`).join(``)}var xe=[{code:`fr`,labelKey:`lang.fr`},{code:`en`,labelKey:`lang.en`}];function o$3(t,i){return ke[t][i]}var Pe={fr:new Intl.PluralRules(`fr`),en:new Intl.PluralRules(`en`)};var Te=new Map;function bt$1(t,i){return Re(o$3(t,i))}function we(t,i,n){return Oe(o$3(t,i),n)}function Ae(t,i,n){let a=`${i}.one`,s=`${i}.other`;return Ee(t,{one:o$3(t,a),other:o$3(t,s)},n)}function Ee(t,i,n){if(!Number.isSafeInteger(n.count)||n.count<0)throw new RangeError(`Le compteur de traduction doit être un entier sûr positif ou nul.`);return Oe(i[Pe[t].select(n.count)===`one`?`one`:`other`],n)}function Oe(t,i){return Ce(Re(t),i)}function Re(t){let i=Te.get(t);return i===void 0&&(i=ye(t),Te.set(t,i)),i}var ce$1={fr:{invoiceReceiptList:{summary:`Lister les encaissements enregistrés`,description:`Retourne les encaissements actifs et annulés avec leur facture et leur client. Inclut la date, l’auteur et le motif des corrections. Cette lecture ne crée aucun encaissement. Les paiements de test Stripe sont exclus. La limite est de 10 000 lignes. Au-delà, retourne 413 avec invoice.workspace_limit, sans résultat partiel.`},creditNoteList:{summary:`Lister les avoirs émis`,description:`Retourne les avoirs persistés avec leur facture, leur commande et leur client. Les montants proviennent de l’avoir immuable. Cette lecture ne modifie aucun document. La limite est de 10 000 lignes. Au-delà, retourne 413 avec invoice.workspace_limit, sans résultat partiel.`},invoiceRefundList:{summary:`Lister les remboursements enregistrés`,description:`Retourne les saisies actives et annulées avec leur facture et leur client. Une saisie locale ne prouve aucun virement bancaire. Cette lecture ne déclenche aucun remboursement. La limite est de 10 000 lignes. Au-delà, retourne 413 avec invoice.workspace_limit, sans résultat partiel.`},invoiceHistory:{summary:`Lire l’historique d’une facture`,description:`Retourne les événements persistés de la facture et de ses documents, par date décroissante. Exige aussi audit.read. Aucun événement n’est déduit du statut actuel. Une facture absente produit une réponse 404. La limite est de 10 000 événements, documents compris. Au-delà, retourne 413 avec invoice.workspace_limit, sans résultat partiel.`},bankTransactionGet:{summary:`Consulter une opération bancaire`,description:`Retourne une opération importée avec ses affectations et ses montants restants. La lecture par identifiant ne dépend pas de la limite de la liste. Elle ne contacte aucune banque.`},bankImportPreview:{summary:`Valider un relevé avant import`,description:`Valide le compte et toutes les lignes CSV avec le parseur utilisé par l’import. Distingue les opérations nouvelles des opérations déjà présentes. Ne persiste aucune ligne. La confirmation revalide le relevé dans la transaction d’import.`},bankLedgerEntryGet:{summary:`Consulter une écriture bancaire`,description:`Retourne une écriture persistée par identifiant, indépendamment de la période du journal. Inclut la référence de sa source et ses lignes comptables. Ne crée aucune écriture ni contrepassation.`},bankLedgerSourceGet:{summary:`Consulter une source à comptabiliser`,description:`Retourne le contexte d’un débit bancaire ou d’une commission de rapprochement. La comptabilisation reste une action distincte et explicite. Ce journal local ne constitue pas une comptabilité générale.`}},en:{invoiceReceiptList:{summary:`List recorded receipts`,description:`Returns active and cancelled receipts with their invoice and client. Includes the date, actor and reason for corrections. This read creates no receipt. Stripe test payments are excluded. The limit is 10,000 rows. Larger results return 413 with invoice.workspace_limit and no partial result.`},creditNoteList:{summary:`List issued credit notes`,description:`Returns persisted credit notes with their invoice, order and client. Amounts come from the immutable credit note. This read changes no document. The limit is 10,000 rows. Larger results return 413 with invoice.workspace_limit and no partial result.`},invoiceRefundList:{summary:`List recorded refunds`,description:`Returns active and cancelled records with their invoice and client. A local record does not prove a bank transfer. This read initiates no refund. The limit is 10,000 rows. Larger results return 413 with invoice.workspace_limit and no partial result.`},invoiceHistory:{summary:`Read invoice history`,description:`Returns persisted invoice and document events in descending date order. Also requires audit.read. No event is inferred from the current status. A missing invoice returns 404. The limit is 10,000 events, including document events. Larger results return 413 with invoice.workspace_limit and no partial result.`},bankTransactionGet:{summary:`Read a bank transaction`,description:`Returns an imported transaction with its allocations and remaining amounts. Access by identifier does not depend on the list limit. This read contacts no bank.`},bankImportPreview:{summary:`Validate a statement before import`,description:`Validates the account and all CSV rows with the import parser. Separates new transactions from existing transactions. Persists no row. Confirmation validates the statement again within the import transaction.`},bankLedgerEntryGet:{summary:`Read a bank ledger entry`,description:`Returns a persisted entry by identifier, independently of the journal period. Includes its source reference and accounting lines. Creates no entry or reversal.`},bankLedgerSourceGet:{summary:`Read a source to post`,description:`Returns the context of a bank debit or reconciliation fee. Posting remains a separate, explicit action. This local journal is not general accounting.`}}};var qe={providerEmailGet:[`Lire l’état du courriel`,`Read email delivery status`],providerEmailCancel:[`Annuler le courriel`,`Cancel email`],providerEmailEvents:[`Lire les événements du courriel`,`Read email events`],providerEmailVerifyWebhook:[`Vérifier une notification de courriel`,`Verify an email notification`],providerSignatureGet:[`Lire le dossier de signature`,`Read signature request`],providerSignatureCancel:[`Annuler la signature`,`Cancel signature request`],providerSignatureRemind:[`Relancer les signataires`,`Remind signers`],providerSignatureDocument:[`Récupérer le document signé`,`Retrieve signed document`],providerSignatureProof:[`Récupérer la preuve de signature`,`Retrieve signature evidence`],providerSignatureEvents:[`Lire les événements de signature`,`Read signature events`],providerSignatureVerifyWebhook:[`Vérifier une notification de signature`,`Verify a signature notification`],providerPaymentGet:[`Lire le paiement fournisseur`,`Read provider payment`],providerPaymentCancel:[`Annuler le paiement fournisseur`,`Cancel provider payment`],providerPaymentCapture:[`Capturer le paiement autorisé`,`Capture an authorized payment`],providerPaymentRefund:[`Demander un remboursement`,`Request a refund`],providerPaymentGetRefund:[`Lire le remboursement`,`Read refund status`],providerPaymentEvents:[`Lire les événements de paiement`,`Read payment events`],providerPaymentVerifyWebhook:[`Vérifier une notification de paiement`,`Verify a payment notification`],providerBankConnect:[`Préparer une connexion bancaire`,`Prepare a bank connection`],providerBankConnection:[`Lire la connexion bancaire`,`Read bank connection`],providerBankRevoke:[`Révoquer la connexion bancaire`,`Revoke bank connection`],providerBankAccounts:[`Lister les comptes bancaires`,`List bank accounts`],providerBankTransactions:[`Lister les opérations bancaires`,`List bank transactions`],providerBankVerifyWebhook:[`Vérifier une notification bancaire`,`Verify a bank notification`],providerElectronicInvoiceGet:[`Lire le statut de facturation électronique`,`Read electronic invoice status`],providerElectronicInvoiceCancel:[`Annuler la transmission électronique`,`Cancel electronic invoice submission`],providerElectronicInvoiceDownload:[`Récupérer la facture électronique`,`Retrieve electronic invoice`],providerElectronicInvoiceInbox:[`Lister les factures électroniques reçues`,`List received electronic invoices`],providerElectronicInvoiceReport:[`Transmettre un rapport électronique`,`Submit an electronic report`],providerElectronicInvoiceGetReport:[`Lire le statut du rapport`,`Read electronic report status`],providerElectronicInvoiceEvents:[`Lire les événements de facturation électronique`,`Read electronic invoice events`],providerElectronicInvoiceVerifyWebhook:[`Vérifier une notification de facturation électronique`,`Verify an electronic invoice notification`]};var _e="> [!important]\n> Implémentation actuelle : mock sans effet externe. `executed: false` est obligatoire en mode simulation. `preview` contient un exemple, jamais un résultat réel.\n\nChaque appel est indépendant. Aucun statut métier, règlement ou document local ne change. Les fichiers restent indisponibles et les notifications restent non vérifiées. Les routes de vérification ne sont pas des récepteurs publics de webhooks.";var ze="> [!important]\n> Current implementation: mock without external effects. Simulation requires `executed: false`. `preview` contains an example, never an actual result.\n\nEach call is independent. No business status, payment, or local document changes. Files remain unavailable and notifications remain unverified. Verification routes are not public webhook receivers.";var le$2={fr:Object.fromEntries(Object.entries(qe).map(([t,[i]])=>[t,{summary:i,description:_e}])),en:Object.fromEntries(Object.entries(qe).map(([t,[,i]])=>[t,{summary:i,description:ze}]))};var Se=[`accountingAccountCreate`,`accountingAccountList`,`accountingAccountUpdate`,`accountingBalanceReport`,`accountingCa3Export`,`accountingEntryCreate`,`accountingEntryList`,`accountingEntryPost`,`accountingEntryReverse`,`accountingEvidenceCreate`,`accountingEvidenceDownload`,`accountingEvidenceList`,`accountingFecExport`,`accountingFinancialReport`,`accountingJournalCreate`,`accountingJournalList`,`accountingJournalUpdate`,`accountingLedgerReport`,`accountingLetterableLineList`,`accountingLetteringCreate`,`accountingOpeningCommit`,`accountingOpeningPreview`,`accountingPeriodClose`,`accountingPeriodCreate`,`accountingPeriodFinalClose`,`accountingPeriodList`,`accountingPeriodLock`,`accountingPeriodReopen`,`accountingTaxFilingSettings`,`accountingTaxFilingSettingsUpdate`,`accountingTaxFilingSubmissionList`,`accountingTaxFilingSubmit`,`accountingTaxReport`];var Le=[`demoReset`,`invoiceCreditAllocate`,`invoiceCreditAllocationCancel`,`supplierBankMatch`,`supplierBankMatchList`,`supplierBankPaymentList`,`supplierBankUnmatch`,`supplierCreditCreate`,`supplierInvoiceEvidenceCreate`,`supplierInvoiceEvidenceDownload`,`supplierInvoiceEvidenceList`];var b$1=(t,i,n)=>Object.fromEntries(t.map(a=>[a,{summary:i,description:n}]));c$2.fr.group,m$2.fr.group,l.fr.group,d.fr.group,h$1.fr.group,u$2.fr.group,p$3.fr.group,f$3.fr.group,v$3.fr.group,g$1.fr.group,m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1({},b$1(Se,`Gérer la comptabilité`,`Exécute une opération comptable selon les permissions et les règles de période applicables.`)),b$1(Le,`Gérer la suite de gestion`,`Exécute une opération métier selon les permissions et les contrôles applicables.`)),c$2.fr.operations),{blogFeed:{summary:`Lire le flux Atom du blog`,description:`Retourne les résumés français des publications au format Atom XML. Aucune authentification requise.`}}),ce$1.fr),m$2.fr.operations),f$3.fr.operations),T$3.fr),w$4.fr),{integrationRetryList:{summary:`Lire les reprises automatiques`,description:`Retourne les 100 reprises les plus récentes. Chaque reprise conserve la demande et son mode. Cinq tentatives au maximum après l’appel initial.`}}),v$3.fr.operations),g$1.fr.operations),le$2.fr),l.fr.operations),d.fr.operations),h$1.fr.operations),u$2.fr.operations),p$3.fr.operations),{bankPaymentList:{summary:`Lister les soldes rapprochables des règlements`,description:`Retourne les règlements actifs d’une facture et leurs montants disponibles, après déduction de toutes les affectations actives.`},bankMatchHistory:{summary:`Consulter les rapprochements conservés`,description:`Afficher les 100 derniers rapprochements d’une opération, avec auteurs, dates et motifs de dissociation.`},bankMatchSuggestionList:{summary:`Proposer des rapprochements`,description:`Classe au maximum dix règlements probables. Une confirmation humaine reste obligatoire.`},bankTransactionList:{summary:`Lister les opérations bancaires`,description:`Retourne les 1 000 dernières opérations et leurs rapprochements actifs.`},bankImport:{summary:`Importer un relevé CSV`,description:`Importe atomiquement les lignes et refuse les références réutilisées avec des valeurs différentes.`},bankMatch:{summary:`Rapprocher un encaissement`,description:`Affecte amountCents au règlement et amountCents moins feeCents au crédit bancaire. La commission doit être inférieure au montant affecté. Utilisez une clé UUID v4 stable. Ne crée aucun règlement.`},bankUnmatch:{summary:`Dissocier un rapprochement`,description:`Conserve le rapprochement précédent et son motif de dissociation.`},integrationStatus:{summary:`Lister les modes des adaptateurs`,description:`Indique les services simulés et les prestataires connectés.`},integrationOperationList:{summary:`Consulter les opérations externes`,description:`Retourne les 100 dernières demandes et leurs reçus.`},integrationOperationCreate:{summary:`Soumettre une demande externe`,description:`Enregistre la demande et appelle son adaptateur avec une clé d’idempotence. Une simulation ne réalise aucune opération externe.`},catalogList:{summary:`Lister les prestations`,description:`Liste les prestations actives et archivées.`},catalogCreate:{summary:`Créer une prestation`,description:`Enregistre une description, une quantité, un prix en euros et un taux de TVA.`},catalogUpdate:{summary:`Modifier une prestation`,description:`Modifie ou archive une prestation si sa version correspond à expectedVersion. Les lignes de devis restent inchangées.`},clientList:{summary:`Lister les clients`,description:`Liste les clients actifs et archivés.`},clientGet:{summary:`Obtenir un client`,description:`Renvoie un client par identifiant.`},clientCreate:{summary:`Créer un client`,description:`Crée un client.`},clientUpdate:{summary:`Modifier un client`,description:`Modifie un client actif.`},clientArchive:{summary:`Archiver un client`,description:`Archive un client.`},clientReactivate:{summary:`Réactiver un client`,description:`Réactive un client archivé.`},companySettingsGet:{summary:`Lire la configuration de la société`,description:`Renvoie la juridiction, la devise, l’exercice et les modules activés.`},brandingGet:{summary:`Lire l’identité de l’entreprise`,description:`Renvoie le nom et le logo affichés sur la page de connexion.`},brandingUpdate:{summary:`Modifier l’identité de l’entreprise`,description:`Enregistre le nom et le logo si la version correspond.`},companySettingsUpdate:{summary:`Modifier la configuration de la société`,description:`Modifie la configuration si sa version correspond.`},companyAccountingInitialize:{summary:`Initialiser la comptabilité`,description:`Fixe définitivement la devise fonctionnelle de la comptabilité.`},companyExchangeRateList:{summary:`Lister les taux de change`,description:`Renvoie les taux BCE et les surcharges manuelles enregistrés.`},companyExchangeRateSet:{summary:`Surcharger un taux de change`,description:`Enregistre un taux daté et trace la surcharge manuelle.`},companyExchangeRateImport:{summary:`Importer les taux de la BCE`,description:`Importe les taux récents et conserve les surcharges manuelles.`},supplierList:{summary:`Lister les fournisseurs`,description:`Liste les fournisseurs actifs et archivés.`},supplierGet:{summary:`Obtenir un fournisseur`,description:`Renvoie un fournisseur par identifiant.`},supplierCreate:{summary:`Créer un fournisseur`,description:`Crée un fournisseur avec ses coordonnées et ses paramètres de paiement.`},supplierUpdate:{summary:`Modifier un fournisseur`,description:`Modifie un fournisseur actif si sa version correspond.`},supplierArchive:{summary:`Archiver un fournisseur`,description:`Archive un fournisseur.`},supplierReactivate:{summary:`Réactiver un fournisseur`,description:`Réactive un fournisseur archivé.`},orderList:{summary:`Lister les commandes`,description:`Liste les commandes créées depuis les devis acceptés.`},orderPdfDownload:{summary:`Télécharger le PDF d’une commande`,description:`Télécharge le PDF existant d’une commande.`},quoteList:{summary:`Lister les devis`,description:`Liste les devis et leur dernière révision.`},quoteGet:{summary:`Obtenir un devis`,description:`Renvoie un devis et toutes ses révisions.`},quotePdfDownload:{summary:`Télécharger le PDF d’un devis`,description:`Télécharge le PDF existant d’une révision de devis.`},quoteCreate:{summary:`Créer un devis`,description:`Crée la première révision d’un devis.`},quoteSend:{summary:`Envoyer un devis`,description:`Crée un lien public de consultation pour un devis rendu.`},quoteLinkState:{summary:`Consulter l’état du lien de signature`,description:`Retourne l’identifiant et l’expiration du lien courant, sans révéler son jeton.`},quoteLinkReplace:{summary:`Remplacer un lien de signature`,description:`Révoque le lien attendu et crée un nouveau lien pour le même devis envoyé non signé.`},quoteCancel:{summary:`Annuler un devis`,description:`Annule un devis modifiable.`},quoteRevisionCreate:{summary:`Créer une révision de devis`,description:`Crée une révision d’un devis modifiable.`},invoiceList:{summary:`Lister les factures`,description:`Liste les factures et leur état actuel.`},invoiceGet:{summary:`Obtenir une facture`,description:`Renvoie une facture et ses révisions.`},invoicePdfDownload:{summary:`Télécharger le PDF d’une facture`,description:`Télécharge le PDF existant d’une révision de facture.`},invoiceCreate:{summary:`Créer une facture`,description:`Crée un brouillon de facture depuis une commande.`},invoiceRevisionCreate:{summary:`Créer une révision de facture`,description:`Crée une révision de brouillon de facture.`},invoiceIssue:{summary:`Émettre une facture`,description:`Attribue le numéro légal et émet la facture.`},invoicePaymentCancel:{summary:`Annuler une saisie de règlement`,description:`Conserve le règlement et le motif de correction. Rétablit le solde dû sans modifier le document émis ni effectuer de remboursement.`},invoicePaymentExport:{summary:`Exporter les règlements`,description:`Exporte les règlements reçus entre from et to inclus, dans un CSV UTF-8. Limite de 10 000 lignes ; aucune troncature silencieuse.`},invoicePaymentCreate:{summary:`Enregistrer un règlement`,description:`Enregistre un règlement partiel ou complet. Réutilisez requestId avec les mêmes valeurs après une erreur réseau. Le solde ne peut pas devenir négatif.`},invoiceVoid:{summary:`Annuler une facture`,description:`Annule une facture.`},affairList:{summary:`Lister les affaires`,description:`Liste les affaires indépendantes et leurs documents liés.`},affairGet:{summary:`Consulter une affaire`,description:`Retourne une affaire et les identifiants de ses documents liés.`},affairCreate:{summary:`Créer une affaire`,description:`Crée une affaire numérotée pour un client.`},affairUpdate:{summary:`Modifier une affaire`,description:`Modifie le titre ou le statut avec contrôle de version.`},affairEventList:{summary:`Lister les événements d’une affaire`,description:`Liste les événements commerciaux liés à un client.`},bootstrapCreate:{summary:`Créer le premier administrateur`,description:`Initialise le premier compte administrateur.`},bootstrapStatus:{summary:`Obtenir l’état de l’initialisation`,description:`Indique si la création du premier administrateur reste disponible.`},clientAccessCreate:{summary:`Créer un accès client`,description:`Crée un nouveau compte d’accès pour un client.`},clientAccessList:{summary:`Lister les accès client`,description:`Liste les comptes qui peuvent accéder au portail d’un client.`},clientAccessRevoke:{summary:`Supprimer un accès client`,description:`Supprime un compte du portail et révoque ses sessions.`},clientInvoiceList:{summary:`Lister les factures du client`,description:`Liste les factures accessibles au client connecté.`},clientInvoicePdf:{summary:`Télécharger une facture du client`,description:`Télécharge le PDF d’une facture accessible au client connecté.`},clientOrderList:{summary:`Lister les commandes du client`,description:`Liste les commandes accessibles au client connecté.`},clientOrderPdf:{summary:`Télécharger une commande du client`,description:`Télécharge le PDF d’une commande accessible au client connecté.`},clientQuoteList:{summary:`Lister les devis du client`,description:`Liste les devis accessibles au client connecté.`},clientQuotePdf:{summary:`Télécharger un devis du client`,description:`Télécharge le PDF d’un devis accessible au client connecté.`},health:{summary:`Vérifier la santé du service`,description:`Renvoie l’état de santé du service et de ses dépendances.`},apiTokenCreate:{summary:`Créer un jeton d’API`,description:`Crée un jeton Bearer et révèle son secret une seule fois.`},apiTokenList:{summary:`Lister les jetons d’API`,description:`Liste les jetons actifs, expirés et révoqués.`},apiTokenRevoke:{summary:`Révoquer un jeton d’API`,description:`Révoque définitivement un jeton.`},invoicePdfRender:{summary:`Générer le PDF d’une facture`,description:`Génère et conserve le PDF d’une révision de facture.`},invoicePreview:{summary:`Prévisualiser une facture`,description:`Génère un aperçu sans créer de document conservé.`},issuerSettingsGet:{summary:`Obtenir les paramètres émetteur`,description:`Renvoie les coordonnées utilisées dans les documents.`},issuerSettingsUpdate:{summary:`Modifier les paramètres émetteur`,description:`Modifie les coordonnées utilisées dans les futurs documents.`},login:{summary:`Se connecter`,description:`Authentifie un compte et crée une session.`},logout:{summary:`Se déconnecter`,description:`Révoque la session active.`},refresh:{summary:`Renouveler la session`,description:`Renouvelle la session et ses cookies. La réponse contient le mode d’accès et l’expiration, sans jeton secret.`},passwordChange:{summary:`Changer le mot de passe`,description:`Vérifie le mot de passe actuel et révoque toutes les sessions dans la transaction de changement. Réservé aux sessions navigateur.`},currentAccount:{summary:`Consulter le compte courant`,description:`Retourne le compte authentifié.`},updatePreferences:{summary:`Modifier les préférences du compte`,description:`Modifie le thème, la langue et le mode des messages du compte connecté.`},accountSessionList:{summary:`Lister les sessions actives`,description:`Liste les familles de sessions actives du compte connecté, sans jetons ni empreintes.`},accountSessionRevoke:{summary:`Fermer une autre session`,description:`Révoque une famille de sessions appartenant au compte connecté. La session actuelle utilise la déconnexion habituelle.`},orderPdfRender:{summary:`Générer le PDF d’une commande`,description:`Génère et conserve le PDF d’une commande.`},orderPreview:{summary:`Prévisualiser une commande`,description:`Génère un aperçu sans créer de document conservé.`},publicQuoteGet:{summary:`Consulter un devis public`,description:`Ouvre un devis avec un lien public valide.`},publicQuotePdfDownload:{summary:`Télécharger un devis public`,description:`Télécharge le PDF associé à un lien public valide.`},publicQuoteSign:{summary:`Signer un devis public`,description:`Accepte et signe un devis avec un lien public valide.`},quoteConditionPresetCreate:{summary:`Créer un préréglage de devis`,description:`Crée un jeu de conditions réutilisable.`},quoteConditionPresetDelete:{summary:`Supprimer un préréglage de devis`,description:`Supprime un jeu de conditions réutilisable.`},quoteConditionPresetList:{summary:`Lister les préréglages de devis`,description:`Liste les jeux de conditions réutilisables.`},quoteConditionPresetUpdate:{summary:`Modifier un préréglage de devis`,description:`Modifie un jeu de conditions réutilisable.`},quotePdfRender:{summary:`Générer le PDF d’un devis`,description:`Génère et conserve le PDF d’une révision de devis.`},quotePreview:{summary:`Prévisualiser un devis`,description:`Génère un aperçu sans créer de document conservé.`},version:{summary:`Obtenir la version du service`,description:`Renvoie les métadonnées du déploiement actif.`}}),c$2.en.group,m$2.en.group,l.en.group,d.en.group,h$1.en.group,u$2.en.group,p$3.en.group,f$3.en.group,v$3.en.group,g$1.en.group,m$4(l$1(l$1(l$1(l$1(l$1(l$1(l$1(l$1(m$4(l$1(l$1(l$1(l$1(m$4(l$1(m$4(l$1(l$1(l$1({},b$1(Se,`Manage accounting`,`Runs an accounting operation with the applicable permissions and period rules.`)),b$1(Le,`Manage the business suite`,`Runs a business operation with the applicable permissions and controls.`)),c$2.en.operations),{blogFeed:{summary:`Read the blog Atom feed`,description:`Returns French article summaries as Atom XML. Authentication is not required.`}}),ce$1.en),{catalogList:{summary:`List services`,description:`Lists active and archived services.`}}),m$2.en.operations),f$3.en.operations),T$3.en),w$4.en),{integrationRetryList:{summary:`Read automatic retries`,description:`Returns the latest 100 retry records. Each retry preserves the request and its mode. At most five attempts follow the initial call.`}}),v$3.en.operations),g$1.en.operations),le$2.en),l.en.operations),d.en.operations),h$1.en.operations),u$2.en.operations),p$3.en.operations),{bankPaymentList:{summary:`List available payment balances for reconciliation`,description:`Returns active invoice payments and their available amounts after deducting all active allocations.`},bankMatchHistory:{summary:`Read reconciliation history`,description:`Return the latest 100 matches for a transaction, including actors, dates and reasons for removal.`},bankMatchSuggestionList:{summary:`Suggest reconciliations`,description:`Ranks at most ten probable receipts. Human confirmation remains required.`},bankTransactionList:{summary:`List bank transactions`,description:`Returns the latest 1,000 transactions and their active matches.`},bankImport:{summary:`Import a CSV statement`,description:`Imports rows atomically and rejects reused references with changed values.`},bankMatch:{summary:`Reconcile a receipt`,description:`Allocates amountCents to the payment and amountCents minus feeCents to the bank credit. The fee must be less than the allocated amount. Use a stable UUID v4 key. Creates no payment.`},bankUnmatch:{summary:`Remove a match`,description:`Preserves the previous match and the reason for removing it.`},integrationStatus:{summary:`List adapter modes`,description:`Identifies simulated services and connected providers.`},integrationOperationList:{summary:`Read external operations`,description:`Returns the latest 100 requests and their receipts.`},integrationOperationCreate:{summary:`Submit an external request`,description:`Records the request and calls its adapter with an idempotency key. A simulation performs no external operation.`},catalogCreate:{summary:`Create a service`,description:`Stores a description, quantity, price in euros and VAT rate.`},catalogUpdate:{summary:`Update a service`,description:`Updates or archives a service when its version matches expectedVersion. Quote lines remain unchanged.`},clientList:{summary:`List clients`,description:`Lists active and archived clients.`},clientGet:{summary:`Get a client`,description:`Returns one client by identifier.`},clientCreate:{summary:`Create a client`,description:`Creates a client.`},clientUpdate:{summary:`Update a client`,description:`Updates an active client.`},clientArchive:{summary:`Archive a client`,description:`Archives a client.`},clientReactivate:{summary:`Reactivate a client`,description:`Reactivates an archived client.`},companySettingsGet:{summary:`Get company settings`,description:`Returns jurisdiction, currency, fiscal year, and enabled modules.`},brandingGet:{summary:`Get enterprise branding`,description:`Returns the name and logo shown on the login page.`},brandingUpdate:{summary:`Update enterprise branding`,description:`Saves the name and logo when the version matches.`},companySettingsUpdate:{summary:`Update company settings`,description:`Updates the settings when their version matches.`},companyAccountingInitialize:{summary:`Initialize accounting`,description:`Permanently locks the accounting functional currency.`},companyExchangeRateList:{summary:`List exchange rates`,description:`Returns stored ECB rates and manual overrides.`},companyExchangeRateSet:{summary:`Override an exchange rate`,description:`Stores a dated rate and audits the manual override.`},companyExchangeRateImport:{summary:`Import ECB rates`,description:`Imports recent rates and preserves manual overrides.`},supplierList:{summary:`List suppliers`,description:`Lists active and archived suppliers.`},supplierGet:{summary:`Get a supplier`,description:`Returns one supplier by identifier.`},supplierCreate:{summary:`Create a supplier`,description:`Creates a supplier with contact and payment settings.`},supplierUpdate:{summary:`Update a supplier`,description:`Updates an active supplier when its version matches.`},supplierArchive:{summary:`Archive a supplier`,description:`Archives a supplier.`},supplierReactivate:{summary:`Reactivate a supplier`,description:`Reactivates an archived supplier.`},orderList:{summary:`List orders`,description:`Lists orders created from accepted quotes.`},orderPdfDownload:{summary:`Download an order PDF`,description:`Downloads an existing order PDF.`},quoteList:{summary:`List quotes`,description:`Lists quotes and their latest revision.`},quoteGet:{summary:`Get a quote`,description:`Returns a quote and all of its revisions.`},quotePdfDownload:{summary:`Download a quote PDF`,description:`Downloads an existing quote revision PDF.`},quoteCreate:{summary:`Create a quote`,description:`Creates the first revision of a quote.`},quoteSend:{summary:`Send a quote`,description:`Creates a public consultation link for a rendered quote.`},quoteLinkState:{summary:`Read signature link state`,description:`Returns the current link identifier and expiration without revealing its token.`},quoteLinkReplace:{summary:`Replace a signature link`,description:`Revokes the expected link and creates a new link for the same unsigned sent quote.`},quoteCancel:{summary:`Cancel a quote`,description:`Cancels an editable quote.`},quoteRevisionCreate:{summary:`Create a quote revision`,description:`Creates a new revision of an editable quote.`},invoiceList:{summary:`List invoices`,description:`Lists invoices and their current state.`},invoiceGet:{summary:`Get an invoice`,description:`Returns an invoice and its revisions.`},invoicePdfDownload:{summary:`Download an invoice PDF`,description:`Downloads an existing invoice revision PDF.`},invoiceCreate:{summary:`Create an invoice`,description:`Creates a draft invoice from an order.`},invoiceRevisionCreate:{summary:`Create an invoice revision`,description:`Creates a new draft invoice revision.`},invoiceIssue:{summary:`Issue an invoice`,description:`Assigns the legal invoice number and issues the invoice.`},invoicePaymentExport:{summary:`Export payments`,description:`Exports payments received between from and to inclusive as UTF-8 CSV. Limited to 10,000 rows without silent truncation.`},invoicePaymentCancel:{summary:`Cancel a payment entry`,description:`Keeps the payment and correction reason. Restores the outstanding balance without changing the issued document or making a refund.`},invoicePaymentCreate:{summary:`Record a payment`,description:`Records a partial or full payment. Reuse requestId with unchanged values after a network error. The balance cannot become negative.`},invoiceVoid:{summary:`Void an invoice`,description:`Voids an invoice.`},affairList:{summary:`List affairs`,description:`Lists independent affairs and their linked documents.`},affairGet:{summary:`Read an affair`,description:`Returns an affair and its linked document identifiers.`},affairCreate:{summary:`Create an affair`,description:`Creates a numbered affair for one client.`},affairUpdate:{summary:`Update an affair`,description:`Updates the title or status with version control.`},affairEventList:{summary:`List affair events`,description:`Lists the commercial events related to a client.`},bootstrapCreate:{summary:`Create the first administrator`,description:`Creates the first administrator account.`},bootstrapStatus:{summary:`Get bootstrap status`,description:`Reports whether first administrator creation remains available.`},clientAccessCreate:{summary:`Create client access`,description:`Creates a new access account for a client.`},clientAccessList:{summary:`List client access accounts`,description:`Lists the accounts that can access a client portal.`},clientAccessRevoke:{summary:`Remove client access`,description:`Removes a portal account and revokes its sessions.`},clientInvoiceList:{summary:`List client invoices`,description:`Lists invoices available to the authenticated client.`},clientInvoicePdf:{summary:`Download a client invoice`,description:`Downloads an invoice PDF available to the authenticated client.`},clientOrderList:{summary:`List client orders`,description:`Lists orders available to the authenticated client.`},clientOrderPdf:{summary:`Download a client order`,description:`Downloads an order PDF available to the authenticated client.`},clientQuoteList:{summary:`List client quotes`,description:`Lists quotes available to the authenticated client.`},clientQuotePdf:{summary:`Download a client quote`,description:`Downloads a quote PDF available to the authenticated client.`},health:{summary:`Check service health`,description:`Returns the health of the service and its dependencies.`},apiTokenCreate:{summary:`Create an API token`,description:`Creates a Bearer token and reveals its secret once.`},apiTokenList:{summary:`List API tokens`,description:`Lists active, expired, and revoked tokens.`},apiTokenRevoke:{summary:`Revoke an API token`,description:`Permanently revokes a token.`},invoicePdfRender:{summary:`Render an invoice PDF`,description:`Renders and stores an invoice revision PDF.`},invoicePreview:{summary:`Preview an invoice`,description:`Renders a preview without creating a stored document.`},issuerSettingsGet:{summary:`Get issuer settings`,description:`Returns the issuer details used in documents.`},issuerSettingsUpdate:{summary:`Update issuer settings`,description:`Updates the issuer details used in future documents.`},login:{summary:`Log in`,description:`Authenticates an account and creates a session.`},logout:{summary:`Log out`,description:`Revokes the active session.`},refresh:{summary:`Renew the session`,description:`Renews the session and its cookies. The response contains the access mode and expiration, without a secret token.`},currentAccount:{summary:`Get current account`,description:`Returns the authenticated account.`},updatePreferences:{summary:`Update account preferences`,description:`Updates the theme, language, and message mode for the signed-in account.`},accountSessionList:{summary:`List active sessions`,description:`Lists active session families owned by the signed-in account, without tokens or hashes.`},accountSessionRevoke:{summary:`Close another session`,description:`Revokes a session family owned by the signed-in account. The current session uses the standard sign-out action.`},passwordChange:{summary:`Change password`,description:`Verifies the current password and revokes all sessions in the password change transaction. Requires a browser session.`},orderPdfRender:{summary:`Render an order PDF`,description:`Renders and stores an order PDF.`},orderPreview:{summary:`Preview an order`,description:`Renders a preview without creating a stored document.`},publicQuoteGet:{summary:`Open a public quote`,description:`Opens a quote with a valid public link.`},publicQuotePdfDownload:{summary:`Download a public quote`,description:`Downloads the PDF for a valid public link.`},publicQuoteSign:{summary:`Sign a public quote`,description:`Accepts and signs a quote with a valid public link.`},quoteConditionPresetCreate:{summary:`Create a quote preset`,description:`Creates a reusable set of quote terms.`},quoteConditionPresetDelete:{summary:`Delete a quote preset`,description:`Deletes a reusable set of quote terms.`},quoteConditionPresetList:{summary:`List quote presets`,description:`Lists reusable sets of quote terms.`},quoteConditionPresetUpdate:{summary:`Update a quote preset`,description:`Updates a reusable set of quote terms.`},quotePdfRender:{summary:`Render a quote PDF`,description:`Renders and stores a quote revision PDF.`},quotePreview:{summary:`Preview a quote`,description:`Renders a preview without creating a stored document.`},version:{summary:`Get service version`,description:`Returns the active deployment metadata.`}});function k$2(t){return t===`fr`||t===`en`}var We=`froment.software.language`;var Ie=class t{document=g$2(H$3);language=Ke(`fr`);languages=xe;constructor(){Ol(()=>{let i=this.detectLanguage();this.language.set(i),this.writeStoredLanguage(i)}),ou(()=>{let i=this.language();this.document.documentElement.lang=i,this.document.documentElement.setAttribute(`data-language`,i)})}t(i){return o$3(this.language(),i)}tf(i,n){return we(this.language(),i,n)}plural(i,n){return Ae(this.language(),i,n)}setLanguage(i){k$2(i)&&(this.language.set(i),this.writeStoredLanguage(i))}detectLanguage(){let i=this.document.location.pathname.split(`/`)[1];if(k$2(i))return i;let n=this.readStoredLanguage();return k$2(n)?n:(globalThis.navigator?.language?.toLowerCase()??`fr`).startsWith(`fr`)?`fr`:`en`}readStoredLanguage(){try{return globalThis.localStorage?.getItem(We)??null}catch{return null}}writeStoredLanguage(i){try{globalThis.localStorage?.setItem(We,i)}catch{}}static ɵfac=function(n){return new(n||t)};static ɵprov=A$2({token:t,factory:t.ɵfac,providedIn:`root`})};function m$1(i,t){if(i&1&&Ly(0,`div`,0),i&2)ky(`aria-label`,qS().i18n.t(`shell.loading`))}var v$2=class i{navigation=g$2(ue).currentNavigation;i18n=g$2(Ie);static ɵfac=function(n){return new(n||i)};static ɵcmp=Fb({type:i,selectors:[[`app-navigation-progress`]],decls:1,vars:1,consts:[[`role`,`progressbar`,1,`navigation-bar`]],template:function(n,d){n&1&&OS(0,m$1,1,1,`div`,0),n&2&&kS(d.navigation()?0:-1)},styles:[`[_nghost-%COMP%]{position:absolute;inset-block-start:100%;inset-inline:0;z-index:var(--%NS%z-header);display:block;block-size:3px;pointer-events:none}.navigation-bar[_ngcontent-%COMP%]{position:absolute;inset:0;visibility:hidden;background:var(--%NS%color-link);box-shadow:0 1px 7px color-mix(in oklab,var(--%NS%color-link) 35%,transparent);animation:_ngcontent-%COMP%_navigation-reveal 0s .15s forwards}@media(prefers-reduced-motion:no-preference){.navigation-bar[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_navigation-reveal 0s .15s forwards,_ngcontent-%COMP%_navigation-pulse 1.2s ease-in-out .15s infinite}}@keyframes _ngcontent-%COMP%_navigation-reveal{to{visibility:visible}}@keyframes _ngcontent-%COMP%_navigation-pulse{0%,to{opacity:.4}50%{opacity:1}}@media print{[_nghost-%COMP%]{display:none}}`]})};var a$1={appEnvironment:`development`,sitePhase:`live`,commit:null,githubRepositoryUrl:null,demo:null};var c$1=()=>globalThis.fromentRuntimeConfig??a$1;var u$1=class n{browser=xU(g$2(yo$1));value=this.browser?c$1():void 0;productionConstruction=this.value?.appEnvironment===`production`&&this.value.sitePhase===`construction`;commitUrl(o){let e=this.value?.githubRepositoryUrl;if(!(!e||!o))return`${e.replace(/\/$/,``).replace(/\.git$/,``)}/commit/${o}`}static ɵfac=function(e){return new(e||n)};static ɵprov=A$2({token:n,factory:n.ɵfac,providedIn:`root`})};var N$2=n=>({commit:n});function O$2(n,l){if(n&1&&(Us(0,`a`,5),y_(1),fd()),n&2){let e=qS(3);Fy(`href`,e.commitUrl,Qg),ky(`aria-label`,e.i18n.tf(`version.commitLink`,k_(3,N$2,e.shortCommit))),ZC(),vd(` `,e.shortCommit,` `)}}function k$1(n,l){if(n&1&&(Us(0,`span`,3)(1,`a`,4),y_(2),fd(),OS(3,O$2,2,5,`a`,5),fd()),n&2){let e=qS(),i=qS();Xy(`staging`,i.environment===`staging`),ZC(),ky(`aria-label`,i.i18n.t(e.nameKey)),ZC(),vd(` `,i.i18n.t(e.labelKey),` `),ZC(),kS(i.shortCommit?3:-1)}}function E$1(n,l){if(n&1&&OS(0,k$1,4,5,`span`,2),n&2)kS(qS().placement()!==`hidden`?0:-1)}function w$3(n,l){if(n&1&&(Us(0,`a`,0),y_(1),fd()),n&2){let e=qS();ZC(),nv(e.i18n.t(`nav.version`))}}function K$1(n,l){if(n&1&&(Us(0,`aside`,1)(1,`div`,6)(2,`p`,7),y_(3),fd(),Us(4,`div`)(5,`h2`,8),y_(6),fd(),Us(7,`p`),y_(8),fd()()()()),n&2){let e=qS();ZC(3),nv(e.i18n.t(`shell.construction.kicker`)),ZC(3),nv(e.i18n.t(`shell.construction.title`)),ZC(2),nv(e.i18n.t(`shell.construction.description`))}}var z$1=n=>{if(n===`development`)return{labelKey:`shell.environment.development`,nameKey:`shell.environment.developmentName`};if(n===`staging`)return{labelKey:`shell.environment.staging`,nameKey:`shell.environment.stagingName`}};var M$1=class n{publicPage=NH.required();placement=NH.required();i18n=g$2(Ie);runtime=g$2(u$1);environment=this.runtime.value?.appEnvironment;environmentStatus=z$1(this.environment);shortCommit=this.runtime.value?.commit?.slice(0,8);commitUrl=this.runtime.commitUrl(this.runtime.value?.commit);static ɵfac=function(e){return new(e||n)};static ɵcmp=Fb({type:n,selectors:[[`app-environment-status`]],inputs:{publicPage:[1,`publicPage`],placement:[1,`placement`]},decls:3,vars:2,consts:[[`routerLink`,`/version`,1,`version-link`],[`aria-labelledby`,`construction-title`,1,`construction-notice`,`runtime-construction-only`],[1,`environment-ribbon`,3,`staging`],[1,`environment-ribbon`],[`routerLink`,`/version`,1,`environment-name`],[`target`,`_blank`,`rel`,`noopener noreferrer`,1,`environment-commit`,3,`href`],[1,`construction-inner`],[1,`construction-kicker`],[`id`,`construction-title`]],template:function(e,i){if(e&1&&(OS(0,E$1,1,1)(1,w$3,2,1,`a`,0),OS(2,K$1,9,3,`aside`,1)),e&2){let x;kS((x=i.environmentStatus)?0:i.placement()===`sidebar`?1:-1,x),ZC(2),kS(i.publicPage()?2:-1)}},dependencies:[Dt],styles:[`[_nghost-%COMP%]{display:contents}.environment-ribbon[_ngcontent-%COMP%]{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.35rem;min-block-size:1.25rem;padding:.1rem .35rem;border:1px solid rgba(83,12,17,.65);border-radius:var(--%NS%radius-xs);background:repeating-linear-gradient(135deg,rgba(255,255,255,.08) 0 2px,transparent 2px 5px),#a1232aeb;color:#fff;font-family:var(--%NS%font-mono);font-size:.625rem;font-weight:700;letter-spacing:.08em;line-height:1.4;text-align:center;text-decoration:none;text-transform:uppercase}.environment-ribbon.staging[_ngcontent-%COMP%]{border-color:#5b3c03ad;background:repeating-linear-gradient(135deg,rgba(255,255,255,.09) 0 2px,transparent 2px 5px),#ab710feb}.environment-ribbon[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{color:inherit;text-decoration:none}.environment-ribbon[_ngcontent-%COMP%] a[_ngcontent-%COMP%]:hover{text-decoration:underline}.environment-commit[_ngcontent-%COMP%]{font-size:.5625rem;font-weight:400;letter-spacing:.02em;text-transform:none}.version-link[_ngcontent-%COMP%]{color:var(--%NS%color-muted);font-size:var(--%NS%text-sm);text-decoration:none}.version-link[_ngcontent-%COMP%]:hover{color:var(--%NS%color-ink);text-decoration:underline}.environment-ribbon[_ngcontent-%COMP%] a[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--%NS%color-focus);outline-offset:3px}.construction-notice[_ngcontent-%COMP%]{position:relative;overflow:hidden;border-bottom:1px solid color-mix(in oklab,var(--%NS%color-warning) 55%,var(--%NS%color-line));background:radial-gradient(circle at 1px 1px,rgba(71,47,6,.12) .7px,transparent .8px) 0 0/6px 6px,linear-gradient(100deg,var(--%NS%color-warning-soft),var(--%NS%color-surface-raised));box-shadow:inset 0 -1px #ffffff57}.construction-notice[_ngcontent-%COMP%]:after{position:absolute;inset:0;background:repeating-linear-gradient(-12deg,transparent 0 1.5rem,color-mix(in oklab,var(--%NS%color-warning) 7%,transparent) 1.5rem 1.58rem);content:"";pointer-events:none}.construction-inner[_ngcontent-%COMP%]{position:relative;z-index:1;display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:var(--%NS%space-4);width:calc(100% - 2 * var(--%NS%shell-gutter));max-width:var(--%NS%layout-max);margin-inline:auto;padding:var(--%NS%space-4) var(--%NS%page-x)}.construction-kicker[_ngcontent-%COMP%]{width:max-content;padding:.3rem .48rem;border:1px solid currentColor;color:var(--%NS%color-warning);font-family:var(--%NS%font-mono);font-size:var(--%NS%text-xs);font-weight:700;letter-spacing:.08em;line-height:1}.construction-inner[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], .construction-inner[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0}.construction-inner[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:var(--%NS%text-base);line-height:1.2}.construction-inner[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] + p[_ngcontent-%COMP%]{margin-top:var(--%NS%space-1);color:var(--%NS%color-muted);font-size:var(--%NS%text-sm)}@media(max-width:36rem){.construction-inner[_ngcontent-%COMP%]{grid-template-columns:1fr;gap:var(--%NS%space-2)}}@media print{.environment-ribbon[_ngcontent-%COMP%], .construction-notice[_ngcontent-%COMP%]{display:none}}`]})};var t=e=>e.canDeactivate();var c=[{path:``,pathMatch:`full`,redirectTo:`security`},{path:`security`,loadComponent:()=>import(`./chunk-C_QyIKvy.js`).then(e=>e.AccountSecurity),canDeactivate:[t]},{path:`passkeys`,loadComponent:()=>import(`./chunk-DEXzwHB0.js`).then(e=>e.AccountPasskeys),canDeactivate:[t]},{path:`sessions`,loadComponent:()=>import(`./chunk-4ipZT9nT.js`).then(e=>e.AccountSessions),canDeactivate:[t]},{path:`preferences`,loadComponent:()=>import(`./chunk-Bi4Jixry2.js`).then(e=>e.AccountPreferences),canDeactivate:[t]}];var j$1=[`*`];function F$1(t,n){t&1&&By(0)}var r$2=class t{name=NH.required({alias:`appTabPanel`});template=g$2(Cr$1);static ɵfac=function(e){return new(e||t)};static ɵdir=ad({type:t,selectors:[[`ng-template`,`appTabPanel`,``]],inputs:{name:[1,`appTabPanel`,`name`]}})};var o$2=class t{panels=Ke(new Map);static ɵfac=function(e){return new(e||t)};static ɵprov=A$2({token:t,factory:t.ɵfac})};var O$1=class t{registry=g$2(o$2);panels=kH(r$2,{descendants:!0});constructor(){ou(()=>{this.registry.panels.set(new Map(this.panels().map(n=>[n.name(),n.template])))})}static ɵfac=function(e){return new(e||t)};static ɵcmp=Fb({type:t,selectors:[[``,`appTabLayout`,``]],contentQueries:function(e,a,x){e&1&&Zy(x,a.panels,r$2,5),e&2&&e_()},features:[A_([o$2])],ngContentSelectors:j$1,decls:1,vars:0,template:function(e,a){e&1&&(ZS(),KS(0))},styles:[`[_nghost-%COMP%]{display:grid;gap:var(--%NS%space-4);min-inline-size:0}`]})};var w$2=class t{route=g$2(G$2);registry=g$2(o$2);context=this.route.snapshot.data;panel=Ft(()=>{let n=this.route.snapshot.data.panel;return this.registry.panels().get(n)??null});static ɵfac=function(e){return new(e||t)};static ɵcmp=Fb({type:t,selectors:[[`app-tab-panel-outlet`]],hostAttrs:[2,`display`,`grid`,`gap`,`var(--space-4)`,`min-inline-size`,`0`],decls:1,vars:2,consts:[[4,`ngTemplateOutlet`,`ngTemplateOutletContext`]],template:function(e,a){e&1&&Iy(0,F$1,1,0,`ng-container`,0),e&2&&Fy(`ngTemplateOutlet`,a.panel())(`ngTemplateOutletContext`,a.context)},dependencies:[IN],encapsulation:2})};var a=class e{document=g$2(H$3);async copy(o){try{let t=this.document.defaultView?.navigator.clipboard;if(t===void 0)throw new Error(`clipboard_unavailable`);return await t.writeText(o),!0}catch{let t=this.document.createElement(`textarea`);t.value=o,t.style.position=`fixed`,t.style.opacity=`0`,this.document.body.appendChild(t),t.select();let c=this.document.execCommand(`copy`);return t.remove(),c}}static ɵfac=function(t){return new(t||e)};static ɵprov=A$2({token:e,factory:e.ɵfac,providedIn:`root`})};function U$1(n){n||(n=g$2(pe$3));let e=new x$3(t=>{if(n.destroyed){t.next();return}return n.onDestroy(t.next.bind(t))});return t=>t.pipe(kE(e))}function T$2(n,e){let d=!e?.manualCleanup?e?.injector?.get(pe$3)??g$2(pe$3):null,l=p$2(e?.equal),o;e?.requireSync?o=Ke({kind:0},{equal:l}):o=Ke({kind:1,value:e?.initialValue},{equal:l});let i,b=n.subscribe({next:r=>o.set({kind:1,value:r}),error:r=>{o.set({kind:2,error:r}),i?.()},complete:()=>{i?.()}});if(e?.requireSync&&o().kind===0)throw new y$2(601,!1);return i=d?.onDestroy(b.unsubscribe.bind(b)),Ft(()=>{let r=o();switch(r.kind){case 1:return r.value;case 2:throw r.error;case 0:throw new y$2(601,!1)}},{equal:e?.equal})}function p$2(n=Object.is){return(e,t)=>e.kind===1&&t.kind===1&&n(e.value,t.value)}function u(e,n){e&1&&(Op(),Ly(0,`path`,1))}function f$2(e,n){e&1&&(Op(),Ly(0,`path`,2))}function v$1(e,n){e&1&&(Op(),Ly(0,`path`,3))}function g(e,n){e&1&&(Op(),Ly(0,`path`,4))}function E(e,n){e&1&&(Op(),Ly(0,`path`,5))}function M(e,n){e&1&&(Op(),Ly(0,`path`,6))}function x(e,n){e&1&&(Op(),Ly(0,`path`,7))}function y(e,n){e&1&&(Op(),Ly(0,`path`,8))}function V(e,n){e&1&&(Op(),Ly(0,`path`,9))}function b(e,n){e&1&&(Op(),Ly(0,`path`,10))}function S$1(e,n){e&1&&(Op(),Ly(0,`path`,11))}function C(e,n){e&1&&(Op(),Ly(0,`circle`,33)(1,`path`,34))}function I$1(e,n){e&1&&(Op(),Ly(0,`path`,12))}function G(e,n){e&1&&(Op(),Ly(0,`path`,13))}function T$1(e,n){e&1&&(Op(),Ly(0,`path`,35)(1,`circle`,36)(2,`circle`,37))}function H(e,n){e&1&&(Op(),Ly(0,`circle`,38)(1,`circle`,39)(2,`path`,40))}function z(e,n){e&1&&(Op(),Ly(0,`path`,14))}function w$1(e,n){e&1&&(Op(),Ly(0,`path`,15))}function L(e,n){e&1&&(Op(),Ly(0,`path`,16))}function k(e,n){e&1&&(Op(),Ly(0,`path`,17))}function A(e,n){e&1&&(Op(),Ly(0,`path`,18))}function N$1(e,n){e&1&&(Op(),Ly(0,`circle`,41)(1,`circle`,42)(2,`circle`,43))}function D(e,n){e&1&&(Op(),Ly(0,`path`,19))}function P(e,n){e&1&&(Op(),Ly(0,`path`,20))}function O(e,n){e&1&&(Op(),Ly(0,`path`,21))}function j(e,n){e&1&&(Op(),Ly(0,`path`,22))}function q(e,n){e&1&&(Op(),Ly(0,`path`,23))}function B(e,n){e&1&&(Op(),Ly(0,`circle`,44)(1,`path`,45))}function F(e,n){e&1&&(Op(),Ly(0,`path`,24))}function J$1(e,n){e&1&&(Op(),Ly(0,`path`,25))}function K(e,n){e&1&&(Op(),Ly(0,`circle`,46)(1,`path`,47))}function Q$1(e,n){e&1&&(Op(),Ly(0,`path`,26))}function R(e,n){e&1&&(Op(),Ly(0,`path`,27))}function U(e,n){e&1&&(Op(),Ly(0,`path`,28))}function W(e,n){e&1&&(Op(),Ly(0,`path`,29))}function X$1(e,n){e&1&&(Op(),Ly(0,`path`,48)(1,`circle`,49))}function Y$1(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`rect`,50)(2,`path`,51),hd())}function Z$1(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,52)(2,`rect`,53),hd())}function $$1(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,54)(2,`path`,55),hd())}function ee$1(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,56),hd())}function ae(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,57)(2,`path`,58)(3,`path`,59),hd())}function ne(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,60)(2,`path`,61),hd())}function te(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`rect`,62)(2,`path`,63)(3,`rect`,64),hd())}function me(e,n){e&1&&(Op(),Ly(0,`path`,30))}function ie(e,n){e&1&&(Op(),Ly(0,`path`,31))}function ce(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,65)(2,`circle`,66),hd())}function oe(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,67)(2,`rect`,68)(3,`path`,69),hd())}function le$1(e,n){e&1&&(Op(),Ly(0,`path`,32))}function pe$1(e,n){e&1&&(Op(),pd(0,`g`),Ly(1,`path`,70)(2,`path`,71)(3,`path`,72),hd())}var r$1=class e{name=NH.required();static ɵfac=function(o){return new(o||e)};static ɵcmp=Fb({type:e,selectors:[[`app-icon`]],inputs:{name:[1,`name`]},decls:50,vars:1,consts:[[`viewBox`,`0 0 24 24`,`aria-hidden`,`true`],[`d`,`M13 4v16m4-16v16m2-16H9.5a4.5 4.5 0 0 0 0 9H13`],[`d`,`M4 12h8m-8 6V6m8 12V6m9 12h-4c0-4 4-3 4-6c0-1.5-2-2.5-4-1`],[`d`,`M4 12h8m-8 6V6m8 12V6m5.5 4.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2m-2 3.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2`],[`d`,`M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8`],[`d`,`M19 4h-9m4 16H5M15 4L9 20`],[`d`,`M3 5h.01M3 12h.01M3 19h.01M8 5h13M8 12h13M8 19h13`],[`d`,`M11 5h10m-10 7h10m-10 7h10M4 4h1v5M4 9h2m.5 11H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02`],[`d`,`M9 14 4 9l5-5M4 9h10.5a5.5 5.5 0 0 1 0 11H11`],[`d`,`m15 14 5-5-5-5M20 9H9.5a5.5 5.5 0 0 0 0 11H13`],[`d`,`M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L8 18l-4 1 1-4z`],[`d`,`M3 3h7v7H3zm11 0h7v7h-7zM3 14h7v7H3zm11 0h7v7h-7z`],[`d`,`M3 7V5a2 2 0 0 1 2-2h5l2 3h7a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`],[`d`,`M6 3h9l4 4v14H5V3zm8 0v5h5M8 12h8m-8 4h6`],[`d`,`m3 9 9-6 9 6zm2 3v7m5-7v7m4-7v7m5-7v7M3 22h18`],[`d`,`M4 6h16M4 12h16M4 18h16M8 3v6m8 0v6m-6 0v6`],[`d`,`M4 3h4v18H4zm8 0h4v18h-4zm7 1 3 16`],[`d`,`M12 5v16m0-16C8 2 4 3 2 4v16c3-1 7-1 10 1 3-2 7-2 10-1V4c-2-1-6-2-10 1`],[`d`,`M4 6h16M4 12h16M4 18h16`],[`d`,`m6 6 12 12M6 18 18 6`],[`d`,`m20 6-11 11-5-5`],[`d`,`m12 19-7-7 7-7m-7 7h14`],[`d`,`m9 18 6-6-6-6`],[`d`,`m8 9 4-4 4 4m-8 6 4 4 4-4`],[`d`,`M10 5H5v14h5m4-11 4 4-4 4m4-4H9`],[`d`,`M12 5v14M5 12h14`],[`d`,`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3`],[`d`,`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12`],[`d`,`M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8zM14 2v6h6M12 18v-6m-3 3h6`],[`d`,`M4 7h16M7 12h10M10 17h4`],[`d`,`M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2M6.453 15h11.094M8.5 2h7`],[`d`,`M18 5a2 2 0 0 1 2 2v8.526a2 2 0 0 0 .212.897l1.068 2.127a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45l1.068-2.127A2 2 0 0 0 4 15.526V7a2 2 0 0 1 2-2zm2.054 10.987H3.946`],[`d`,`M12 16v5m4-6.361V21m4-10.344V21m2-18-8.646 8.646a.5.5 0 0 1-.708 0L9.354 8.354a.5.5 0 0 0-.707 0L2 15m2 3.463V21m4-6.344V21`],[`cx`,`9`,`cy`,`8`,`r`,`3`],[`d`,`M3 21v-2a6 6 0 0 1 12 0v2m1-17a3 3 0 0 1 0 6m3 11v-2a6 6 0 0 0-3-5.2`],[`d`,`M10 17h4V5H2v12h3m9-8h4l4 4v4h-3m-9 0H8`],[`cx`,`6.5`,`cy`,`17.5`,`r`,`2.5`],[`cx`,`16.5`,`cy`,`17.5`,`r`,`2.5`],[`cx`,`9`,`cy`,`20`,`r`,`1`],[`cx`,`19`,`cy`,`20`,`r`,`1`],[`d`,`M3 4h2l2.4 10.4A2 2 0 0 0 9.3 16H18a2 2 0 0 0 1.9-1.4L21 8H6`],[`cx`,`5`,`cy`,`12`,`r`,`1`],[`cx`,`12`,`cy`,`12`,`r`,`1`],[`cx`,`19`,`cy`,`12`,`r`,`1`],[`cx`,`12`,`cy`,`8`,`r`,`3`],[`d`,`M5 21v-2a7 7 0 0 1 14 0v2`],[`cx`,`10`,`cy`,`10`,`r`,`7`],[`d`,`m15 15 6 6`],[`d`,`M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16`],[`cx`,`5`,`cy`,`19`,`r`,`1`],[`width`,`20`,`height`,`16`,`x`,`2`,`y`,`4`,`rx`,`2`],[`d`,`m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7`],[`d`,`M8 2v4m8-4v4M3 10h18`],[`width`,`18`,`height`,`18`,`x`,`3`,`y`,`4`,`rx`,`2`],[`d`,`M15 3h6v6m0-6-9 9`],[`d`,`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`],[`d`,`m8 9-4 3 4 3m8-6 4 3-4 3m-2-9-4 12`],[`d`,`M12 22v-9m3.17-10.79a1.67 1.67 0 0 1 1.63 0L21 4.57a1.93 1.93 0 0 1 0 3.36L8.82 14.79a1.66 1.66 0 0 1-1.64 0L3 12.43a1.93 1.93 0 0 1 0-3.36z`],[`d`,`M20 13v3.87a2.06 2.06 0 0 1-1.11 1.83l-6 3.08a1.93 1.93 0 0 1-1.78 0l-6-3.08A2.06 2.06 0 0 1 4 16.87V13`],[`d`,`M21 12.43a1.93 1.93 0 0 0 0-3.36L8.83 2.2a1.64 1.64 0 0 0-1.63 0L3 4.57a1.93 1.93 0 0 0 0 3.36l12.18 6.86a1.64 1.64 0 0 0 1.63 0z`],[`d`,`m15 12-9.373 9.373a1 1 0 0 1-3.001-3L12 9m6 6 4-4`],[`d`,`m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172v-.344a2 2 0 0 0-.586-1.414l-1.657-1.657A6 6 0 0 0 12.516 3H9l1.243 1.243A6 6 0 0 1 12 8.485V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5`],[`width`,`8`,`height`,`8`,`x`,`3`,`y`,`3`,`rx`,`2`],[`d`,`M7 11v4a2 2 0 0 0 2 2h4`],[`width`,`8`,`height`,`8`,`x`,`13`,`y`,`13`,`rx`,`2`],[`d`,`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`],[`cx`,`16.5`,`cy`,`7.5`,`r`,`.5`,`fill`,`currentColor`],[`d`,`M12 8V4H8`],[`width`,`16`,`height`,`12`,`x`,`4`,`y`,`8`,`rx`,`2`],[`d`,`M2 14h2m16 0h2m-7-1v2m-6-2v2`],[`d`,`m10.852 14.772-.383.923m2.679-.923a3 3 0 1 0-2.296-5.544l-.383-.923m2.679.923.383-.923`],[`d`,`m13.53 15.696-.382-.924a3 3 0 1 1-2.296-5.544m3.92 1.624.923-.383m-.923 2.679.923.383`],[`d`,`M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5m-15 4H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5M6 18h.01M6 6h.01m3.228 4.852-.923-.383m.923 2.679-.923.383`]],template:function(o,_){if(o&1&&(Op(),pd(0,`svg`,0),OS(1,u,1,0,`:svg:path`,1)(2,f$2,1,0,`:svg:path`,2)(3,v$1,1,0,`:svg:path`,3)(4,g,1,0,`:svg:path`,4)(5,E,1,0,`:svg:path`,5)(6,M,1,0,`:svg:path`,6)(7,x,1,0,`:svg:path`,7)(8,y,1,0,`:svg:path`,8)(9,V,1,0,`:svg:path`,9)(10,b,1,0,`:svg:path`,10)(11,S$1,1,0,`:svg:path`,11)(12,C,2,0)(13,I$1,1,0,`:svg:path`,12)(14,G,1,0,`:svg:path`,13)(15,T$1,3,0)(16,H,3,0)(17,z,1,0,`:svg:path`,14)(18,w$1,1,0,`:svg:path`,15)(19,L,1,0,`:svg:path`,16)(20,k,1,0,`:svg:path`,17)(21,A,1,0,`:svg:path`,18)(22,N$1,3,0)(23,D,1,0,`:svg:path`,19)(24,P,1,0,`:svg:path`,20)(25,O,1,0,`:svg:path`,21)(26,j,1,0,`:svg:path`,22)(27,q,1,0,`:svg:path`,23)(28,B,2,0)(29,F,1,0,`:svg:path`,24)(30,J$1,1,0,`:svg:path`,25)(31,K,2,0)(32,Q$1,1,0,`:svg:path`,26)(33,R,1,0,`:svg:path`,27)(34,U,1,0,`:svg:path`,28)(35,W,1,0,`:svg:path`,29)(36,X$1,2,0)(37,Y$1,3,0,`:svg:g`)(38,Z$1,3,0,`:svg:g`)(39,$$1,3,0,`:svg:g`)(40,ee$1,2,0,`:svg:g`)(41,ae,4,0,`:svg:g`)(42,ne,3,0,`:svg:g`)(43,te,4,0,`:svg:g`)(44,me,1,0,`:svg:path`,30)(45,ie,1,0,`:svg:path`,31)(46,ce,3,0,`:svg:g`)(47,oe,4,0,`:svg:g`)(48,le$1,1,0,`:svg:path`,32)(49,pe$1,4,0,`:svg:g`),hd()),o&2){let m;ZC(),kS((m=_.name())===`paragraph`?1:m===`heading-2`?2:m===`heading-3`?3:m===`bold`?4:m===`italic`?5:m===`list-bullets`?6:m===`list-numbers`?7:m===`undo`?8:m===`redo`?9:m===`pencil`?10:m===`dashboard`?11:m===`clients`?12:m===`folder`?13:m===`invoice`?14:m===`truck`?15:m===`shopping-cart`?16:m===`bank`?17:m===`settings`?18:m===`catalog`?19:m===`book`?20:m===`menu`?21:m===`more`?22:m===`close`?23:m===`check`?24:m===`arrow-left`?25:m===`chevron-right`?26:m===`chevron`?27:m===`user`?28:m===`logout`?29:m===`plus`?30:m===`search`?31:m===`download`?32:m===`upload`?33:m===`file-plus`?34:m===`filter`?35:m===`rss`?36:m===`mail`?37:m===`calendar`?38:m===`external`?39:m===`development`?40:m===`upgrade`?41:m===`build`?42:m===`ci`?43:m===`tests`?44:m===`environment`?45:m===`secrets`?46:m===`ai`?47:m===`metrics`?48:m===`infrastructure`?49:-1)}},styles:[`[_nghost-%COMP%]{display:inline-flex;flex:0 0 auto;color:var(--%NS%icon-color, var(--%NS%color-muted))}svg[_ngcontent-%COMP%]{width:1.25rem;height:1.25rem;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.75}`]})};var p$1=[`*`];function S(t,a){t&1&&Py(0,`app-icon`,0),t&2&&Fy(`name`,a)}function m(t,a){if(t&1&&OS(0,S,1,1,`app-icon`,0),t&2){let o;kS((o=qS().icon())?0:-1,o)}}function f$1(t,a){t&1&&Py(0,`app-icon`,0),t&2&&Fy(`name`,a)}function _(t,a){if(t&1&&OS(0,f$1,1,1,`app-icon`,0),t&2){let o;kS((o=qS().icon())?0:-1,o)}}var N=class t{variant=NH(`default`);size=NH(`default`);iconOnly=NH(!1);icon=NH();iconPosition=NH(`start`);static ɵfac=function(o){return new(o||t)};static ɵcmp=Fb({type:t,selectors:[[`button`,`appButton`,``],[`a`,`appLinkButton`,``]],hostVars:3,hostBindings:function(o,n){o&2&&ky(`data-button-variant`,n.variant())(`data-button-size`,n.size())(`data-button-icon-only`,n.iconOnly()?``:null)},inputs:{variant:[1,`variant`],size:[1,`size`],iconOnly:[1,`iconOnly`],icon:[1,`icon`],iconPosition:[1,`iconPosition`]},ngContentSelectors:p$1,decls:3,vars:2,consts:[[3,`name`]],template:function(o,n){o&1&&(ZS(),OS(0,m,1,1),KS(1),OS(2,_,1,1)),o&2&&(kS(n.iconPosition()===`start`?0:-1),ZC(2),kS(n.iconPosition()===`end`?2:-1))},dependencies:[r$1],styles:[`[_nghost-%COMP%]{--%NS%icon-color: var(--%NS%button-text);--%NS%button-color: var(--%NS%color-button-default);--%NS%button-highlight: var(--%NS%color-button-default-highlight);--%NS%button-border: var(--%NS%color-button-default-border);--%NS%button-border-bottom: var(--%NS%color-button-default-border-bottom);--%NS%button-text: var(--%NS%color-button-on-default);appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:var(--%NS%space-2);min-height:var(--%NS%control-height);padding:.4rem .75rem;border:1px solid var(--%NS%button-border);border-bottom-color:var(--%NS%button-border-bottom);border-radius:var(--%NS%radius-md);background-color:color-mix(in srgb,var(--%NS%button-color) 60%,var(--%NS%button-highlight));background-image:linear-gradient(to bottom,var(--%NS%button-color),var(--%NS%button-highlight));background-repeat:repeat-x;color:var(--%NS%button-text);font-size:var(--%NS%text-sm);font-weight:600;line-height:1.2;text-decoration:none;text-shadow:var(--%NS%shadow-button-default-label);box-shadow:inset 0 1px #fff3,0 1px 2px #0000000d;cursor:pointer}[_nghost-%COMP%]:visited{color:var(--%NS%button-text)}[data-button-variant=primary][_nghost-%COMP%]{--%NS%button-color: var(--%NS%color-button-primary);--%NS%button-highlight: var(--%NS%color-button-primary-highlight);--%NS%button-text: var(--%NS%color-button-on-color)}[data-button-size=small][_nghost-%COMP%]{min-height:2rem;padding:.25rem .5rem;font-size:var(--%NS%text-xs)}[data-button-size=small][data-button-icon-only][_nghost-%COMP%]{width:2rem}[data-button-size=large][_nghost-%COMP%]{min-height:3rem;padding:.55rem 1rem;font-size:var(--%NS%text-base)}[data-button-size=large][data-button-icon-only][_nghost-%COMP%]{width:3rem}[data-button-variant=info][_nghost-%COMP%]{--%NS%button-color: var(--%NS%color-button-info);--%NS%button-highlight: var(--%NS%color-button-info-highlight);--%NS%button-text: var(--%NS%color-button-on-color)}[data-button-variant=success][_nghost-%COMP%]{--%NS%button-color: var(--%NS%color-button-success);--%NS%button-highlight: var(--%NS%color-button-success-highlight);--%NS%button-text: var(--%NS%color-button-on-color)}[data-button-variant=warning][_nghost-%COMP%]{--%NS%button-color: var(--%NS%color-button-warning);--%NS%button-highlight: var(--%NS%color-button-warning-highlight);--%NS%button-text: var(--%NS%color-button-on-color)}[data-button-variant=danger][_nghost-%COMP%]{--%NS%button-color: var(--%NS%color-button-danger);--%NS%button-highlight: var(--%NS%color-button-danger-highlight);--%NS%button-text: var(--%NS%color-button-on-color)}[data-button-variant=dark][_nghost-%COMP%]{--%NS%button-color: var(--%NS%color-button-dark);--%NS%button-highlight: var(--%NS%color-button-dark-highlight);--%NS%button-text: var(--%NS%color-button-on-color)}[_nghost-%COMP%]:is([data-button-variant=primary],[data-button-variant=info],[data-button-variant=success],[data-button-variant=warning],[data-button-variant=danger],[data-button-variant=dark]){--%NS%button-border: rgb(0 0 0 / .1);--%NS%button-border-bottom: rgb(0 0 0 / .25);text-shadow:0 -1px 0 rgba(0,0,0,.25)}[_nghost-%COMP%]:is([data-button-variant=info],[data-button-variant=success],[data-button-variant=warning]){--%NS%button-text: var(--%NS%color-button-on-bright);text-shadow:none}[data-button-variant=link][_nghost-%COMP%]{--%NS%icon-color: var(--%NS%color-link);border-color:transparent;background:transparent;color:var(--%NS%color-link);text-decoration:underline;text-shadow:none;box-shadow:none}[data-button-icon-only][_nghost-%COMP%]{width:var(--%NS%control-height);padding:0}[aria-busy=true][_nghost-%COMP%]:before{width:.85rem;height:.85rem;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;content:"";animation:_ngcontent-%COMP%_button-loading .7s linear infinite}[_nghost-%COMP%]:is(:active,[data-button-state=active]):not(:disabled,[aria-disabled=true],[data-button-variant=ghost],[data-button-variant=link]){background-color:var(--%NS%button-highlight);background-image:none;box-shadow:inset 0 2px 4px #00000026,0 1px 2px #0000000d}@media(hover:hover)and (pointer:fine){[_nghost-%COMP%]:is(:hover,[data-button-state=hover]):not(:disabled,[aria-disabled=true],[data-button-variant=ghost],[data-button-variant=link]){background-color:var(--%NS%button-highlight);background-image:linear-gradient(to bottom,var(--%NS%button-highlight),var(--%NS%button-color));color:var(--%NS%button-text)}[data-button-variant=link][_nghost-%COMP%]:hover:not(:disabled,[aria-disabled=true]), [data-button-variant=link][data-button-state=hover][_nghost-%COMP%]:not(:disabled,[aria-disabled=true]){--%NS%icon-color: var(--%NS%color-link-hover);border-color:transparent;background:transparent;color:var(--%NS%color-link-hover)}}[data-button-variant=ghost][_nghost-%COMP%]{--%NS%icon-color: currentColor;border-color:transparent;border-radius:var(--%NS%radius-sm);background:transparent;color:var(--%NS%color-muted);text-decoration:none;text-shadow:none;box-shadow:none;cursor:pointer}[data-button-variant=ghost][_nghost-%COMP%]:is(:hover,[data-button-state=hover]):not(:disabled,[aria-disabled=true],:active,[data-button-state=active],[aria-pressed=true],[aria-expanded=true]){background:color-mix(in oklab,var(--%NS%color-surface-sunken),transparent 35%);color:var(--%NS%color-ink)}[data-button-variant=ghost][_nghost-%COMP%]:is(:active,[data-button-state=active]):not(:disabled,[aria-disabled=true]), [data-button-variant=ghost][_nghost-%COMP%]:is([aria-pressed=true],[aria-expanded=true]){background:var(--%NS%color-panel);color:var(--%NS%color-ink);box-shadow:var(--%NS%shadow-panel)}[data-button-variant=ghost][_nghost-%COMP%]:focus-visible{outline:2px solid var(--%NS%color-focus);outline-offset:-2px}[data-button-variant=ghost][_nghost-%COMP%]:is(:disabled,[aria-disabled=true]){cursor:not-allowed;opacity:.55}@keyframes _ngcontent-%COMP%_button-loading{to{transform:rotate(1turn)}}@media(prefers-reduced-motion:reduce){[aria-busy=true][_nghost-%COMP%]:before{animation-duration:1.4s}}@media(forced-colors:active){[_nghost-%COMP%]{box-shadow:none}}`]})};var w=new E$4(`AUTH_COOKIE_LOCK_MANAGER`,{providedIn:`root`,factory:()=>xU(g$2(yo$1))?navigator.locks:void 0});var o$1=class r{manager=g$2(w);run(e){return this.manager?.request(`froment-auth-cookie`,e)??e()}static ɵfac=function(t){return new(t||r)};static ɵprov=A$2({token:r,factory:r.ɵfac,providedIn:`root`})};var p=3e4;var T=2147483647;var v=class r{http=new OD(g$2(Ra));cookieLock=g$2(o$1);destroyRef=g$2(pe$3);document=g$2(H$3);state=Ke(void 0);refreshRequest;refreshTimer;generation=0;identityState=Ke(0);identity=this.identityState.asReadonly();revisionState=Ke(0);revision=this.revisionState.asReadonly();refreshState=Ke(!1);refreshing=this.refreshState.asReadonly();constructor(){let e=this.document.defaultView,t=()=>{this.document.visibilityState!==`hidden`&&this.refreshExpiringSession()};this.document.addEventListener(`visibilitychange`,t),e?.addEventListener(`focus`,t),this.destroyRef.onDestroy(()=>{this.refreshTimer!==void 0&&clearTimeout(this.refreshTimer),this.document.removeEventListener(`visibilitychange`,t),e?.removeEventListener(`focus`,t)})}current(){let e=this.state();if(e!==void 0&&e.expiresAt<=Date.now()){this.clear();return}return e}mode(){return this.current()?.mode}set(e){return this.identityState.update(t=>t+1),this.updateSession(e)}updateSession(e){return this.generation+=1,this.revisionState.update(t=>t+1),this.state.set(e),this.scheduleRefresh(e.expiresAt),e}clear(){this.identityState.update(e=>e+1),this.generation+=1,this.revisionState.update(e=>e+1),this.state.set(void 0),this.refreshTimer!==void 0&&clearTimeout(this.refreshTimer),this.refreshTimer=void 0}refresh(){if(this.refreshRequest!==void 0)return this.refreshRequest;this.refreshState.set(!0),this.revisionState.update(t=>t+1);let e=this.generation;return this.refreshRequest=this.cookieLock.run(async()=>{try{let t=await JD(this.http.post(`/api/auth/refresh`,void 0)),{decodeBrowserSession:y}=await import(`./chunk-owvOEsA9.js`),S=y(t);return this.generation!==e?this.mode():this.updateSession(S).mode}catch{return this.generation===e&&this.clear(),this.mode()}}).finally(()=>{this.refreshRequest=void 0,this.refreshState.set(!1)}),this.refreshRequest}scheduleRefresh(e){if(this.refreshTimer!==void 0&&clearTimeout(this.refreshTimer),e<=Date.now()){this.refreshTimer=void 0;return}let t=Math.max(0,e-Date.now()-p);this.refreshTimer=setTimeout(()=>{this.refresh()},Math.min(t,T))}refreshExpiringSession(){let e=this.state();e!==void 0&&e.expiresAt<=Date.now()+p&&this.refresh()}static ɵfac=function(t){return new(t||r)};static ɵprov=A$2({token:r,factory:r.ɵfac,providedIn:`root`})};var de=()=>({access:`session`});var o=(...e)=>({access:`permissions`,permissions:e});var lt=async(e,t)=>{let a=t.permissions,[{CompanyModule:s,PermissionCode:p},{Schema:C}]=await Promise.all([import(`./chunk-C19Alcnx2.js`),import(`./chunk-CGo7Fepz.js`)]),M=e.account(),x=C.Array(p).check(C.isMinLength(1));if(M?.mode!==`administrator`||t.access!==`permissions`||!C.is(x)(a))return!1;let me=mt(a),fe=t.modules;if(C.is(C.Array(s))(fe))for(let R of fe)me.add(R);return a.every(R=>e.can(R))&&[...me].every(R=>M.enabledModules.includes(R))};var mt=e=>{let t=new Set;for(let a of e)a.startsWith(`supplier`)?t.add(`purchasing`):a.startsWith(`bank.`)?t.add(`banking`):a.startsWith(`accounting.`)?t.add(`accounting`):a.startsWith(`demo.`)?t.add(`demonstration`):(a.startsWith(`quote.`)||a.startsWith(`order.`)||a.startsWith(`invoice.`)||a.startsWith(`payment.`)||a.startsWith(`client.`)||a.startsWith(`catalog.`)||a.startsWith(`ledger.`)||a.startsWith(`document.`))&&t.add(`sales`);return t};var ft=e=>e.pathFromRoot.map(t=>t.routeConfig?.data??t.data).filter(t=>t.access!==void 0||t.permissions!==void 0);var pe=async e=>{let t=g$2(ce$3),a=g$2(ue),{Authentication:s}=await import(`./chunk-CV_fLVFT.js`),p=t.get(s);if(await p.sessionMode()!==`administrator`)return a.createUrlTree([`/login`]);if((await p.currentAccount())?.mode!==`administrator`)return a.createUrlTree([`/login`]);let M=ft(e);return M.length>0&&(await Promise.all(M.map(x=>x.access===`session`&&x.permissions===void 0||lt(p,x)))).every(Boolean)?!0:a.createUrlTree([`/account`])};var r=pe;var f=pe;var h=pe;var Q=async(e,t)=>{let a=g$2(ce$3),s=g$2(ue),{Authentication:p}=await import(`./chunk-CV_fLVFT.js`);return await a.get(p).sessionMode()===`client`?!0:s.createUrlTree([`/login`],{queryParams:{returnUrl:t.url}})};var Je=[{path:`billing`,pathMatch:`full`,loadComponent:()=>import(`./chunk-DQp-2GVv.js`).then(e=>e.Billing),canActivate:[r],data:m$4(l$1({},o(`invoice.read`)),{titleKey:`billingWorkspace.invoices`,robots:`noindex, nofollow`})},{path:`billing/receipts`,loadComponent:()=>import(`./chunk-Bf3eV_su2.js`).then(e=>e.ReceiptList),canActivate:[r],data:m$4(l$1({},o(`payment.read`,`invoice.read`)),{titleKey:`billingWorkspace.receipts`,robots:`noindex, nofollow`})},{path:`billing/credit-notes`,loadComponent:()=>import(`./chunk-Dnzjseqf2.js`).then(e=>e.CreditNotes),canActivate:[r],data:m$4(l$1({},o(`invoice.read`)),{titleKey:`billingWorkspace.credits`,robots:`noindex, nofollow`})},{path:`billing/refunds`,loadComponent:()=>import(`./chunk-BHDXYrox.js`).then(e=>e.RefundList),canActivate:[r],data:m$4(l$1({},o(`payment.read`,`invoice.read`)),{titleKey:`billingWorkspace.refunds`,robots:`noindex, nofollow`})},{path:`invoices/new`,loadComponent:()=>import(`./chunk-BR0demlX.js`).then(e=>e.InvoiceEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.create`,`order.read`)),{titleKey:`backOffice.invoice.title.new`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/edit`,loadComponent:()=>import(`./chunk-BR0demlX.js`).then(e=>e.InvoiceEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.update`,`order.read`)),{titleKey:`billingWorkspace.edit`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/issue`,loadComponent:()=>import(`./chunk-BI9lIdFn.js`).then(e=>e.InvoiceIssue),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.issue`)),{titleKey:`billingWorkspace.issueTitle`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/payments/new`,loadComponent:()=>import(`./chunk-DSpA-ZPx.js`).then(e=>e.PaymentEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.mark-paid`)),{titleKey:`billingWorkspace.recordReceipt`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/payments/:paymentId/cancel`,loadComponent:()=>import(`./chunk-COTrF1xY2.js`).then(e=>e.ReceiptCancel),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.mark-paid`)),{titleKey:`payment.cancel`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/credits/new`,loadComponent:()=>import(`./chunk-CNfmNEak.js`).then(e=>e.CreditEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.credit`)),{titleKey:`credit.issue`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/credits/:creditNoteId/edit`,loadComponent:()=>import(`./chunk-CNfmNEak.js`).then(e=>e.CreditEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.credit`)),{titleKey:`credit.editDraft`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/credit-allocations/new`,loadComponent:()=>import(`./chunk-DURq7J8U2.js`).then(e=>e.CreditAllocationEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.refund`)),{titleKey:`credit.allocate`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/refunds/new`,loadComponent:()=>import(`./chunk-D8t0s8LD.js`).then(e=>e.RefundEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.refund`)),{titleKey:`credit.recordRefund`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/refunds/:refundId/cancel`,loadComponent:()=>import(`./chunk-CaJrmM9V.js`).then(e=>e.RefundCancel),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.refund`)),{titleKey:`credit.cancelRefund`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/credit-allocations/:allocationId/cancel`,loadComponent:()=>import(`./chunk-CaJrmM9V.js`).then(e=>e.RefundCancel),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.refund`)),{titleKey:`credit.cancelAllocation`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId/void`,loadComponent:()=>import(`./chunk-Dl4V93zm2.js`).then(e=>e.InvoiceVoid),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`invoice.read`,`invoice.void`)),{titleKey:`backOffice.invoice.void`,robots:`noindex, nofollow`})},{path:`invoices/:invoiceId`,loadComponent:()=>import(`./chunk-BiECfDS7.js`).then(e=>e.InvoiceDetail),canActivate:[r],data:m$4(l$1({},o(`invoice.read`)),{titleKey:`billingWorkspace.invoices`,robots:`noindex, nofollow`})}];var Xe=[{path:`banking/import`,loadComponent:()=>import(`./chunk-DddDKWSn2.js`).then(e=>e.BankImport),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`bank.import`)),{titleKey:`bank.import`,robots:`noindex, nofollow`})},{path:`banking/transactions/:transactionId`,loadComponent:()=>import(`./chunk-B5xzAYYx2.js`).then(e=>e.BankReconciliation),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`bank.read`)),{titleKey:`bankWorkspace.reconciliation`,robots:`noindex, nofollow`})},{path:`banking/ledger/post/:sourceKind/:sourceId`,loadComponent:()=>import(`./chunk-CE9WzUCM.js`).then(e=>e.LedgerPost),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`ledger.read`,`ledger.post`)),{titleKey:`bankWorkspace.postTitle`,robots:`noindex, nofollow`})},{path:`banking/ledger/:entryId/reverse`,loadComponent:()=>import(`./chunk-DTPC4JtI2.js`).then(e=>e.LedgerReversal),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`ledger.read`)),{titleKey:`bankWorkspace.reverseTitle`,robots:`noindex, nofollow`})},{path:`banking/ledger`,loadComponent:()=>import(`./chunk-CYRUKYKv2.js`).then(e=>e.BankLedger),canActivate:[r],data:m$4(l$1({},o(`ledger.read`)),{titleKey:`bankWorkspace.entries`,robots:`noindex, nofollow`})},{path:`banking`,loadComponent:()=>import(`./chunk-a_Va_Nj7.js`).then(e=>e.Banking),canActivate:[r],data:m$4(l$1({},o(`bank.read`)),{titleKey:`bankWorkspace.transactions`,robots:`noindex, nofollow`})}];var Ze=[{path:``,pathMatch:`full`,loadComponent:()=>import(`./chunk-Bjo6eVnk.js`).then(e=>e.ConfigurationIndex)},{path:`company`,canActivate:[f],data:o(`company.read`),loadComponent:()=>import(`./chunk-B91VAo1J.js`).then(e=>e.CompanySettingsPage),canDeactivate:[t]},{path:`issuer`,canActivate:[f],data:o(`issuer.read`),loadComponent:()=>import(`./chunk-COXN76fu2.js`).then(e=>e.IssuerSettings),canDeactivate:[t]},{path:`conditions/new`,canActivate:[f],data:o(`condition.manage`),loadComponent:()=>import(`./chunk-DjwvqY3z2.js`).then(e=>e.ConditionEditor),canDeactivate:[t]},{path:`conditions/:presetId/edit`,canActivate:[f],data:o(`condition.read`,`condition.manage`),loadComponent:()=>import(`./chunk-DjwvqY3z2.js`).then(e=>e.ConditionEditor),canDeactivate:[t]},{path:`conditions`,canActivate:[f],data:o(`condition.read`),loadComponent:()=>import(`./chunk-CDS6LjBz2.js`).then(e=>e.QuoteConditionPresets),canDeactivate:[t]},{path:`business-card`,canActivate:[f],data:o(`issuer.read`),loadComponent:()=>import(`./chunk-Cx07K71K.js`).then(e=>e.BusinessCard),canDeactivate:[t]},{path:`supplier-invoice-analysis`,canActivate:[f],data:o(`integration.configure`),loadComponent:()=>import(`./chunk-Db2zQ-8C.js`).then(e=>e.SupplierInvoiceAnalysisSettingsPage),canDeactivate:[t]}];var et=[{path:`team/roles/new`,loadComponent:()=>import(`./chunk-DKlxu0GP2.js`).then(e=>e.RoleEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`role.manage`)),{titleKey:`role.createTitle`,robots:`noindex, nofollow`})},{path:`team/roles/:roleId/edit`,loadComponent:()=>import(`./chunk-DKlxu0GP2.js`).then(e=>e.RoleEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`role.read`,`role.manage`)),{titleKey:`role.editTitle`,robots:`noindex, nofollow`})},{path:`team/roles`,loadComponent:()=>import(`./chunk-DVyDnsGh.js`).then(e=>e.RolesPage),canActivate:[r],data:m$4(l$1({},o(`role.read`)),{titleKey:`role.title`,robots:`noindex, nofollow`})},{path:`team/invitations/new`,loadComponent:()=>import(`./chunk-CG4Kbo1n2.js`).then(e=>e.TeamInvitation),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`user.create`)),{titleKey:`configurationWorkspace.newInvitation`,robots:`noindex, nofollow`})},{path:`team`,loadComponent:()=>import(`./chunk-CvMAjyvr2.js`).then(e=>e.Team),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`user.read`)),{titleKey:`team.title`,robots:`noindex, nofollow`})}];var tt=[{path:`api/new`,loadComponent:()=>import(`./chunk-By2EFyNM.js`).then(e=>e.ApiTokenEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`api-token.manage`)),{titleKey:`backOffice.apiTokens.create`,robots:`noindex, nofollow`})},{path:`api`,loadComponent:()=>import(`./chunk-B9NV1rY62.js`).then(e=>e.ApiTokens),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`api-token.manage`)),{titleKey:`backOffice.apiTokens.title`,robots:`noindex, nofollow`})}];var ot=[{path:`services`,pathMatch:`full`,loadComponent:()=>import(`./chunk-Bn46cQyx.js`).then(e=>e.Connections),canActivate:[r],data:m$4(l$1({},o(`integration.configure`)),{titleKey:`connections.title`,robots:`noindex, nofollow`})},{path:`services/simulations`,loadComponent:()=>import(`./chunk-CUqj_Bxs2.js`).then(e=>e.Integrations),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`integration.manage`)),{titleKey:`configurationWorkspace.simulations`,robots:`noindex, nofollow`})},{path:`services/resend/tests/new`,loadComponent:()=>import(`./chunk-CYGyIy7J.js`).then(e=>e.EmailTest),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`integration.configure`)),{titleKey:`configurationWorkspace.newTest`,robots:`noindex, nofollow`})},{path:`services/resend/tests/:requestId`,loadComponent:()=>import(`./chunk-CwzCbuXH.js`).then(e=>e.EmailTestDetail),canActivate:[r],data:m$4(l$1({},o(`integration.configure`)),{titleKey:`configurationWorkspace.testDetail`,robots:`noindex, nofollow`})},{path:`services/resend/tests`,loadComponent:()=>import(`./chunk-D-VHaopx.js`).then(e=>e.EmailTestList),canActivate:[r],data:m$4(l$1({},o(`integration.configure`)),{titleKey:`configurationWorkspace.tests`,robots:`noindex, nofollow`})},{path:`services/stripe/tests/new`,loadComponent:()=>import(`./chunk-Dh86w63y.js`).then(e=>e.Checkout),canActivate:[r],canDeactivate:[t],data:m$4(l$1({},o(`integration.configure`,`invoice.read`)),{titleKey:`configurationWorkspace.newTest`,robots:`noindex, nofollow`})},{path:`services/stripe/tests/:requestId`,loadComponent:()=>import(`./chunk-DOinRyX_2.js`).then(e=>e.CheckoutDetail),canActivate:[r],data:m$4(l$1({},o(`integration.configure`,`invoice.read`)),{titleKey:`configurationWorkspace.testDetail`,robots:`noindex, nofollow`})},{path:`services/stripe/tests`,loadComponent:()=>import(`./chunk-XvyWOb2Q.js`).then(e=>e.CheckoutList),canActivate:[r],data:m$4(l$1({},o(`integration.configure`,`invoice.read`)),{titleKey:`configurationWorkspace.tests`,robots:`noindex, nofollow`})},...[`resend`,`stripe`,`signwell`,`superpdp`].map(e=>({path:`services/${e}`,data:m$4(l$1({},o(`integration.configure`)),{provider:e,titleKey:`configurationWorkspace.connection`,robots:`noindex, nofollow`}),loadComponent:()=>import(`./chunk-DubWLqvO.js`).then(t=>t.ProviderConnection),canActivate:[r]}))];var at={path:`audit`,loadComponent:()=>import(`./chunk-WNYFaDlu2.js`).then(e=>e.Audit),canActivate:[r],data:m$4(l$1({},o(`audit.read`)),{titleKey:`audit.title`,robots:`noindex, nofollow`})};var nt=[{path:`accounting`,loadComponent:()=>import(`./chunk-BNksdK_D2.js`).then(e=>e.Accounting),canActivate:[r],data:m$4(l$1({},o(`accounting.read`)),{titleKey:`accounting.title`,robots:`noindex, nofollow`})}];var it=(e,t)=>e.fragment!==t.fragment;var le=`app-shell`;var rt=(e,t)=>t.map(a=>m$4(l$1({},a),{data:m$4(l$1({},a.data),{shell:e})}));function $(e){let t=`public`,a=e;for(;a;){let s=a.data.shell;s&&(t=s),a=a.firstChild}return t}var I=(e,t,a)=>[{path:``,redirectTo:e,pathMatch:`full`},...a.map(s=>({path:s,component:w$2,data:{panel:t,tab:s}}))];var ct=[...rt(`administrator`,[...Je,...Xe,...nt,...et,...tt,...ot,at]),{path:`join`,loadComponent:()=>import(`./chunk-r6H-BfOd.js`).then(e=>e.TeamJoin),canDeactivate:[t],data:{shell:`public`,titleKey:`team.join`,robots:`noindex, nofollow`}},{path:``,redirectTo:`login`,pathMatch:`full`},{path:`quote`,canDeactivate:[t],runGuardsAndResolvers:it,loadComponent:()=>import(`./chunk-BcUjdID-.js`).then(e=>e.PublicQuote),data:{shell:`standalone`,titleKey:`page.public_quote`,descriptionKey:`page.description.public_quote`,robots:`noindex, nofollow`},children:[{path:``,redirectTo:`summary`,pathMatch:`full`},{path:`summary`,component:w$2,data:{panel:`summary`}},{path:`document`,component:w$2,data:{panel:`document`}},{path:`signature`,component:w$2,data:{panel:`signature`}},{path:`confirmation`,component:w$2,data:{panel:`confirmation`}}]},{path:`login`,loadComponent:()=>import(`./chunk-D1DvlGbP.js`).then(e=>e.Login),data:{shell:`public`,titleKey:`page.back_office`,descriptionKey:`page.description.back_office`,robots:`noindex, nofollow`}},{path:`sign-out`,loadComponent:()=>import(`./chunk-DIJSXeQC2.js`).then(e=>e.SignOut),canDeactivate:[t],data:{shell:`public`,titleKey:`backOffice.signOut`,robots:`noindex, nofollow`}},{path:`bootstrap`,loadComponent:()=>import(`./chunk-Bck0-DJt2.js`).then(e=>e.Bootstrap),data:{shell:`public`,titleKey:`page.back_office`,descriptionKey:`page.description.back_office`,robots:`noindex, nofollow`}},{path:`dashboard`,loadComponent:()=>import(`./chunk-CGfyD3XX2.js`).then(e=>e.Dashboard),canActivate:[r],data:m$4(l$1({shell:`administrator`},o(`client.read`,`quote.read`,`order.read`,`invoice.read`)),{titleKey:`page.back_office`,descriptionKey:`page.description.back_office`,robots:`noindex, nofollow`})},{path:`account`,loadComponent:()=>import(`./chunk-k6TIcaIA.js`).then(e=>e.AccountLayout),children:c,canActivate:[r],canActivateChild:[h],data:m$4(l$1({shell:`administrator`},de()),{titleKey:`account.security_title`,descriptionKey:`page.description.back_office`,robots:`noindex, nofollow`})},{path:`client/account`,loadComponent:()=>import(`./chunk-k6TIcaIA.js`).then(e=>e.AccountLayout),children:c,canActivate:[Q],data:{shell:`client`,titleKey:`account.security_title`,descriptionKey:`page.description.back_office`,robots:`noindex, nofollow`}},{path:`client/documents/:kind/:documentId`,loadComponent:()=>import(`./chunk-CApvwK4D.js`).then(e=>e.CustomerDocumentDetail),canActivate:[Q],data:{shell:`client`,titleKey:`page.back_office_client`,robots:`noindex, nofollow`}},{path:`client`,loadComponent:()=>import(`./chunk-CpXqQPuw.js`).then(e=>e.ClientPortal),canActivate:[Q],data:{shell:`client`,titleKey:`page.back_office_client`,descriptionKey:`page.description.back_office_client`,robots:`noindex, nofollow`}},{path:`clients`,loadComponent:()=>import(`./chunk-Bn6RkvPA2.js`).then(e=>e.Clients),canActivate:[r],canActivateChild:[h],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_clients`},o(`client.read`)),{descriptionKey:`page.description.back_office_clients`,robots:`noindex, nofollow`}),children:I(`active`,`clients`,[`active`,`archived`,`all`])},{path:`purchases`,loadComponent:()=>import(`./chunk-B8_dFe5w.js`).then(e=>e.SupplierInvoicesPage),canActivate:[r],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_supplier_invoices`},o(`supplier-invoice.read`)),{descriptionKey:`page.description.back_office_supplier_invoices`,robots:`noindex, nofollow`})},{path:`purchases/new`,loadComponent:()=>import(`./chunk-DMXgU6Nc2.js`).then(e=>e.SupplierInvoiceEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`,titleKey:`supplierInvoice.createTitle`},o(`supplier-invoice.create`)),{robots:`noindex, nofollow`})},{path:`purchases/analyze`,loadComponent:()=>import(`./chunk-IlM3eTPp2.js`).then(e=>e.SupplierInvoiceAnalysisPage),canActivate:[r],data:m$4(l$1({shell:`administrator`,titleKey:`supplierInvoice.analysis.title`},o(`supplier-invoice.analyze`,`supplier.read`)),{modules:[`purchasing`,`ai`],robots:`noindex, nofollow`})},{path:`purchases/payments`,loadComponent:()=>import(`./chunk-CubfQf-X2.js`).then(e=>e.SupplierPaymentBatchesPage),canActivate:[r],data:m$4(l$1({shell:`administrator`,titleKey:`supplierPaymentBatch.title`},o(`supplier-invoice.pay`,`supplier-invoice.read`)),{robots:`noindex, nofollow`})},{path:`purchases/:invoiceId/edit`,loadComponent:()=>import(`./chunk-DMXgU6Nc2.js`).then(e=>e.SupplierInvoiceEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`,titleKey:`supplierInvoice.editTitle`},o(`supplier-invoice.read`,`supplier-invoice.update`)),{robots:`noindex, nofollow`})},{path:`purchases/:invoiceId`,loadComponent:()=>import(`./chunk-CK6Sjqig.js`).then(e=>e.SupplierInvoiceDetail),canActivate:[r],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_supplier_invoices`},o(`supplier-invoice.read`)),{descriptionKey:`page.description.back_office_supplier_invoices`,robots:`noindex, nofollow`})},{path:`suppliers`,loadComponent:()=>import(`./chunk-tDREPM-0.js`).then(e=>e.Suppliers),canActivate:[r],canActivateChild:[h],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_suppliers`},o(`supplier.read`)),{descriptionKey:`page.description.back_office_suppliers`,robots:`noindex, nofollow`}),children:I(`active`,`suppliers`,[`active`,`archived`,`all`])},{path:`suppliers/new`,loadComponent:()=>import(`./chunk-D3XjW5Cm.js`).then(e=>e.SupplierEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`supplier.create`)),{titleKey:`supplier.createTitle`,robots:`noindex, nofollow`})},{path:`suppliers/:supplierId/edit`,loadComponent:()=>import(`./chunk-D3XjW5Cm.js`).then(e=>e.SupplierEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`supplier.read`,`supplier.update`)),{titleKey:`supplier.editTitle`,robots:`noindex, nofollow`})},{path:`suppliers/:supplierId`,loadComponent:()=>import(`./chunk-CLZ5xsSQ2.js`).then(e=>e.SupplierDetail),canActivate:[r],data:m$4(l$1({shell:`administrator`},o(`supplier.read`)),{titleKey:`page.back_office_supplier_detail`,descriptionKey:`page.description.back_office_supplier_detail`,robots:`noindex, nofollow`})},{path:`clients/new`,loadComponent:()=>import(`./chunk-fYJ7OBkh.js`).then(e=>e.ClientEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`client.create`)),{titleKey:`backOffice.clients.create`,robots:`noindex, nofollow`})},{path:`clients/:clientId/edit`,loadComponent:()=>import(`./chunk-fYJ7OBkh.js`).then(e=>e.ClientEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`client.read`,`client.update`)),{titleKey:`clientsWorkspace.edit`,robots:`noindex, nofollow`})},{path:`clients/:clientId/access/new`,loadComponent:()=>import(`./chunk-DdOc1fs-.js`).then(e=>e.ClientAccessEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`client.read`,`client.access.manage`)),{titleKey:`page.back_office_client_detail`,robots:`noindex, nofollow`})},{path:`clients/:clientId`,loadComponent:()=>import(`./chunk-BQrmVphu2.js`).then(e=>e.ClientDetail),canActivate:[r],canActivateChild:[h],canDeactivate:[t],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_client_detail`},o(`client.read`)),{descriptionKey:`page.description.back_office_client_detail`,robots:`noindex, nofollow`}),children:[{path:``,redirectTo:`profile`,pathMatch:`full`},{path:`profile`,component:w$2,data:{panel:`profile`}},{path:`affairs`,component:w$2,data:{panel:`affairs`}},{path:`documents`,component:w$2,data:{panel:`documents`}},{path:`access`,component:w$2,canActivate:[f],data:l$1({panel:`access`},o(`client.access.manage`))}]},{path:`affairs`,loadComponent:()=>import(`./chunk-DQr_9Q6T.js`).then(e=>e.Affairs),canActivate:[r],canActivateChild:[h],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_quotes`},o(`affair.read`)),{descriptionKey:`page.description.back_office_quotes`,robots:`noindex, nofollow`}),children:I(`attention`,`affairs`,[`attention`,`active`,`completed`,`all`])},{path:`affairs/:affairId`,loadComponent:()=>import(`./chunk-DpI44v1z.js`).then(e=>e.AffairDetail),canActivate:[r],canActivateChild:[h],children:[...I(`overview`,`affair-detail`,[`overview`]),{path:`history`,component:w$2,canActivate:[f],data:l$1({panel:`affair-detail`,tab:`history`},o(`audit.read`))}],data:m$4(l$1({shell:`administrator`,titleKey:`page.back_office_affair_detail`},o(`affair.read`,`quote.read`,`order.read`,`invoice.read`)),{descriptionKey:`page.description.back_office_affair_detail`,robots:`noindex, nofollow`})},{path:`quotes/new`,loadComponent:()=>import(`./chunk-BT8KtCYG.js`).then(e=>e.QuoteEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`quote.create`,`client.read`,`catalog.read`,`condition.read`,`issuer.read`)),{titleKey:`page.back_office_quote_editor`,descriptionKey:`page.description.back_office_quote_editor`,robots:`noindex, nofollow`})},{path:`quotes/:quoteId/edit`,loadComponent:()=>import(`./chunk-BT8KtCYG.js`).then(e=>e.QuoteEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`quote.read`,`quote.update`,`client.read`,`catalog.read`,`condition.read`,`issuer.read`)),{titleKey:`page.back_office_quote_editor`,descriptionKey:`page.description.back_office_quote_editor`,robots:`noindex, nofollow`})},{path:`quotes/:quoteId/publication`,loadComponent:()=>import(`./chunk-yfBrkklv.js`).then(e=>e.QuotePublication),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`quote.read`,`quote.send`)),{titleKey:`commercial.publicationTitle`,robots:`noindex, nofollow`})},{path:`quotes/:quoteId`,loadComponent:()=>import(`./chunk-Dqhs2Pyw2.js`).then(e=>e.QuoteDetail),canActivate:[r],canActivateChild:[h],canDeactivate:[t],children:I(`summary`,`quote-detail`,[`summary`,`document`]),data:m$4(l$1({shell:`administrator`},o(`quote.read`)),{titleKey:`commercial.quote`,robots:`noindex, nofollow`})},{path:`orders/:orderId`,loadComponent:()=>import(`./chunk-CKFB1V-p2.js`).then(e=>e.OrderDetail),canActivate:[r],data:m$4(l$1({shell:`administrator`},o(`order.read`,`quote.read`)),{titleKey:`commercial.order`,robots:`noindex, nofollow`})},{path:`catalog/new`,loadComponent:()=>import(`./chunk-DIBFSF2Z.js`).then(e=>e.CatalogEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`catalog.manage`)),{titleKey:`catalog.create`,robots:`noindex, nofollow`})},{path:`catalog/:itemId/edit`,loadComponent:()=>import(`./chunk-DIBFSF2Z.js`).then(e=>e.CatalogEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`catalog.read`,`catalog.manage`)),{titleKey:`catalogWorkspace.editTitle`,robots:`noindex, nofollow`})},{path:`catalog`,loadComponent:()=>import(`./chunk-CuepVIkm2.js`).then(e=>e.Catalog),canActivate:[r],canActivateChild:[h],data:m$4(l$1({shell:`administrator`},o(`catalog.read`)),{titleKey:`catalog.title`,robots:`noindex, nofollow`}),children:I(`active`,`catalog`,[`active`,`archived`,`all`])},{path:`configuration`,loadComponent:()=>import(`./chunk--RuvStn6.js`).then(e=>e.Configuration),canActivate:[r],canActivateChild:[h],data:m$4(l$1({shell:`administrator`},de()),{titleKey:`page.back_office_issuer_settings`,descriptionKey:`page.description.back_office_issuer_settings`,robots:`noindex, nofollow`}),children:Ze},{path:`emails/new`,loadComponent:()=>import(`./chunk-DMskLhpk2.js`).then(e=>e.EmailComposer),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.draft.manage`)),{titleKey:`emailsWorkspace.newMessage`,robots:`noindex, nofollow`})},{path:`emails/drafts/:draftId/edit`,loadComponent:()=>import(`./chunk-DMskLhpk2.js`).then(e=>e.EmailComposer),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.draft.manage`)),{titleKey:`emailsWorkspace.editDraft`,robots:`noindex, nofollow`})},{path:`emails/messages/:operationId`,loadComponent:()=>import(`./chunk-DM4Wc9U7.js`).then(e=>e.EmailDetail),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.draft.manage`)),{titleKey:`emailsWorkspace.message`,robots:`noindex, nofollow`})},{path:`emails/templates/new`,loadComponent:()=>import(`./chunk-Ca3lwqEF.js`).then(e=>e.EmailTemplateEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.template.manage`)),{titleKey:`emailsWorkspace.newTemplate`,robots:`noindex, nofollow`})},{path:`emails/templates/:templateId/edit`,loadComponent:()=>import(`./chunk-Ca3lwqEF.js`).then(e=>e.EmailTemplateEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.template.manage`)),{titleKey:`emailsWorkspace.editTemplate`,robots:`noindex, nofollow`})},{path:`emails/reminders/new`,loadComponent:()=>import(`./chunk-CCr_R2Cg.js`).then(e=>e.ReminderEditor),canActivate:[r],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.reminder.manage`)),{titleKey:`emailsWorkspace.newReminder`,robots:`noindex, nofollow`})},{path:`emails`,loadComponent:()=>import(`./chunk-DVJ4YZuU.js`).then(e=>e.Emails),canActivate:[r],canActivateChild:[h],canDeactivate:[t],data:m$4(l$1({shell:`administrator`},o(`email.draft.manage`)),{titleKey:`emails.title`,descriptionKey:`emails.intro`,robots:`noindex, nofollow`}),children:[{path:``,redirectTo:`messages`,pathMatch:`full`},{path:`messages`,component:w$2,canActivate:[f],data:l$1({panel:`emails`,tab:`messages`},o(`integration.manage`))},{path:`drafts`,component:w$2,canActivate:[f],data:l$1({panel:`emails`,tab:`drafts`},o(`email.draft.manage`))},{path:`reminders`,component:w$2,canActivate:[f],data:l$1({panel:`emails`,tab:`reminders`},o(`email.reminder.manage`,`invoice.read`,`client.read`,`integration.manage`))},{path:`templates`,component:w$2,canActivate:[f],data:l$1({panel:`emails`,tab:`templates`},o(`email.template.manage`))}]},{path:`version`,loadComponent:()=>import(`./chunk-CmokTGIG.js`).then(e=>e.Version),data:{shell:`standalone`,titleKey:`page.version`,descriptionKey:`page.description.version`}},{path:`404`,loadComponent:()=>import(`./chunk-DhLlQTD-2.js`).then(e=>e.NotFoundComponent),data:{titleKey:`page.not_found`,descriptionKey:`page.description.not_found`,robots:`noindex, nofollow`}},{path:`**`,loadComponent:()=>import(`./chunk-DhLlQTD-2.js`).then(e=>e.NotFoundComponent),data:{titleKey:`page.not_found`,descriptionKey:`page.description.not_found`,robots:`noindex, nofollow`}}];var ut=e=>e===`/api/auth/account`||e===`/api/auth/login`||e===`/api/auth/refresh`||e===`/api/auth/logout`||e===`/api/auth/password`||e===`/api/bootstrap`||e===`/api/team/accept`||e.startsWith(`/api/public/`)||e===`/api/health`||e===`/api/version`;var st=(e,t)=>{let a=g$2(v);return!e.url.startsWith(`/api/`)||ut(e.url)||e.headers.has(`Authorization`)?t(e):t(e).pipe(qa(s=>s.status!==401?fE(()=>s):nt$1(a.refresh()).pipe(Qa(()=>a.mode()===void 0?fE(()=>s):t(e)))))};var dt={providers:[DI(),uA(dA(),lA([st])),s8(o8(),i8()),Uo(ct,zo(),Po({anchorScrolling:`enabled`,scrollPositionRestoration:`enabled`}),$o(e=>{let t=e.error instanceof Error?e.error.message:String(e.error);if(!/chunk|dynamically imported module|importing a module script/i.test(t))return;let a=Number(sessionStorage.getItem(`froment.chunk-reload`));Date.now()-a<1e4||(sessionStorage.setItem(`froment.chunk-reload`,String(Date.now())),location.reload())}))]};var Y=class e{router=g$2(ue);document=g$2(H$3);injector=g$2(ce$3);isBrowser=xU(g$2(yo$1));navigationEnd=T$2(this.router.events.pipe(jt(t=>t instanceof x$2)),{initialValue:null});initialNavigationComplete=this.router.navigated;previousUrl=this.router.url;constructor(){ou(()=>{let t=this.navigationEnd();if(!t)return;let a=this.previousUrl;if(this.previousUrl=t.urlAfterRedirects,!this.initialNavigationComplete){this.initialNavigationComplete=!0;return}let s=this.router.parseUrl(t.urlAfterRedirects).fragment;a.split(/[?#]/,1)[0]===t.urlAfterRedirects.split(/[?#]/,1)[0]&&this.router.parseUrl(a).fragment===s||(s?this.focusFragment(s):this.focusMainAfterRender())})}focusFragment(t){this.isBrowser&&Ol(()=>{let a=this.document.getElementById(t);if(!a)return this.focusMain();let s=a.matches(`h1, h2, h3, h4, h5, h6, [role="heading"]`)?a:a.querySelector(`h1, h2, h3, h4, h5, h6, [role="heading"]`)??a;this.focusElement(s)},{injector:this.injector})}focusElement(t){let a=!t.hasAttribute(`tabindex`)&&!t.matches(`a[href], area[href], button, input, select, textarea, iframe, [contenteditable="true"]`);if(a&&(t.tabIndex=-1),t.focus({preventScroll:!0}),a){if(this.document.activeElement!==t)return t.removeAttribute(`tabindex`);t.addEventListener(`blur`,()=>t.removeAttribute(`tabindex`),{once:!0})}}focusMain(){this.document.getElementById(`main-content`)?.focus({preventScroll:!0})}focusMainAfterRender(){this.isBrowser&&Ol(()=>this.focusMain(),{injector:this.injector})}static ɵfac=function(a){return new(a||e)};static ɵprov=A$2({token:e,factory:e.ɵfac,providedIn:`root`})};var J=class e{router=g$2(ue);route=g$2(G$2);i18n=g$2(Ie);title=g$2(r8);meta=g$2(n8);navigationEnd=T$2(this.router.events.pipe(jt(t=>t instanceof x$2)),{initialValue:null});constructor(){ou(()=>{this.i18n.language(),this.navigationEnd(),this.updateRoute()})}updateRoute(){let t=this.route.snapshot;for(;t.firstChild;)t=t.firstChild;this.setPageTitle(t.data.titleKey),this.meta.updateTag({name:`robots`,content:`noindex, nofollow`})}setPageTitle(t){if(t){let a=this.i18n.t(t).split(` | `)[0];this.title.setTitle(a)}}static ɵfac=function(a){return new(a||e)};static ɵprov=A$2({token:e,factory:e.ɵfac,providedIn:`root`})};var X=class e{document=g$2(H$3);textCopy=g$2(a);hideTimer;message=Ke(null);async copy(t,a){let s=this.document.defaultView?.location;if(!s)return;let p=`${s.origin}${s.pathname}${s.search}#${t}`;await this.textCopy.copy(p)&&(clearTimeout(this.hideTimer),this.message.set(a),this.hideTimer=setTimeout(()=>this.message.set(null),2400))}static ɵfac=function(a){return new(a||e)};static ɵprov=A$2({token:e,factory:e.ɵfac,providedIn:`root`})};function gt(e,t){e&1&&(pd(0,`div`,0),y_(1),hd()),e&2&&(ZC(),nv(t))}var Z=class e{anchorCopy=g$2(X);static ɵfac=function(a){return new(a||e)};static ɵcmp=Fb({type:e,selectors:[[`app-copy-notice`]],decls:1,vars:1,consts:[[`role`,`status`,`aria-live`,`polite`,1,`copy-notice`,`visible`]],template:function(a,s){if(a&1&&OS(0,gt,2,1,`div`,0),a&2){let p;kS((p=s.anchorCopy.message())?0:-1,p)}},styles:[`[_nghost-%COMP%]{display:contents}.copy-notice[_ngcontent-%COMP%]{position:fixed;right:var(--%NS%page-x);bottom:var(--%NS%space-4);z-index:var(--%NS%z-skip-link);max-width:min(24rem,100vw - 2 * var(--%NS%page-x));padding:var(--%NS%space-2) var(--%NS%space-3);border:1px solid var(--%NS%color-line-strong);border-radius:var(--%NS%radius-sm);background:var(--%NS%color-surface-raised);box-shadow:var(--%NS%shadow-sm);font-size:var(--%NS%text-sm);opacity:0;pointer-events:none;transform:translateY(var(--%NS%space-2));transition:opacity var(--%NS%duration-base) var(--%NS%ease-out),transform var(--%NS%duration-base) var(--%NS%ease-out)}.copy-notice.visible[_ngcontent-%COMP%]{opacity:1;transform:translateY(0)}@media(prefers-reduced-motion:reduce){.copy-notice[_ngcontent-%COMP%]{transition:none}}`]})};var ee=class e{administrator=NH(!1);static ɵfac=function(a){return new(a||e)};static ɵcmp=Fb({type:e,selectors:[[`app-back-office-header-placeholder`]],inputs:{administrator:[1,`administrator`]},decls:12,vars:2,consts:[[`aria-hidden`,`true`,1,`sidebar`],[1,`placeholder`,`account-placeholder`],[1,`navigation-placeholder`],[1,`placeholder`],[`aria-hidden`,`true`,1,`workspace-header`],[1,`placeholder`,`search-placeholder`],[1,`placeholder`,`actions-placeholder`]],template:function(a,s){a&1&&(Us(0,`div`,0),Py(1,`span`,1),Us(2,`div`,2),Py(3,`span`,3)(4,`span`,3)(5,`span`,3)(6,`span`,3)(7,`span`,3),fd()(),Us(8,`div`,4),Py(9,`app-navigation-progress`)(10,`span`,5)(11,`span`,6),fd()),a&2&&(ZC(8),Xy(`administrator`,s.administrator()))},dependencies:[v$2],styles:[`[_nghost-%COMP%]{display:contents}.sidebar[_ngcontent-%COMP%]{grid-area:sidebar;position:sticky;inset-block-start:0;block-size:100dvh;overflow-y:auto;display:flex;flex-direction:column;gap:var(--%NS%space-5);padding:var(--%NS%space-4);border-inline-end:1px solid var(--%NS%color-line);background:var(--%NS%color-header)}@media(max-width:63.999rem){.sidebar[_ngcontent-%COMP%]{display:none}}.workspace-header[_ngcontent-%COMP%]{grid-area:header;position:sticky;inset-block-start:0;z-index:var(--%NS%z-header);display:flex;align-items:center;flex-wrap:wrap;gap:var(--%NS%space-3);min-block-size:3.75rem;padding:var(--%NS%space-3) var(--%NS%page-x);border-block-end:1px solid var(--%NS%color-line);background:var(--%NS%color-surface)}.placeholder[_ngcontent-%COMP%]{display:block;block-size:1.5rem;border-radius:var(--%NS%radius-xs);background:var(--%NS%color-surface-sunken)}.account-placeholder[_ngcontent-%COMP%]{block-size:3.75rem}.navigation-placeholder[_ngcontent-%COMP%]{display:grid;gap:var(--%NS%space-4)}.search-placeholder[_ngcontent-%COMP%]{inline-size:min(100%,32rem);block-size:var(--%NS%control-height)}.actions-placeholder[_ngcontent-%COMP%]{display:none;inline-size:12rem;block-size:var(--%NS%control-height)}@media(max-width:40rem){.administrator[_ngcontent-%COMP%] .search-placeholder[_ngcontent-%COMP%]{inline-size:100%}.administrator[_ngcontent-%COMP%] .actions-placeholder[_ngcontent-%COMP%]{display:block}}@media print{.sidebar[_ngcontent-%COMP%], .workspace-header[_ngcontent-%COMP%]{display:none}}`]})};var vt=()=>[import(`./chunk-C0gTeWW62.js`).then(e=>e.FlashOutlet)];var ht=()=>[import(`./chunk-CL02A9wI.js`).then(e=>e.BackOfficeHeader)];function yt(e,t){if(e&1&&Py(0,`app-back-office-header`,8),e&2)Fy(`administrator`,qS(2).administrator())}function bt(e,t){if(e&1&&Py(0,`app-back-office-header-placeholder`,8),e&2)Fy(`administrator`,qS(2).administrator())}function St(e,t){if(e&1){let a=zS();Us(0,`div`,9),Py(1,`app-navigation-progress`),Us(2,`p`,10),y_(3),fd(),Us(4,`button`,11),Gy(`click`,function(){Ip(a);return wp(qS(2).reload())}),y_(5),fd()()}if(e&2){let a=qS(2);ZC(3),nv(a.i18n.t(`shell.navigationUnavailable`)),ZC(2),nv(a.i18n.t(`shell.reload`))}}function kt(e,t){if(e&1&&(wy(0,yt,1,1)(1,bt,1,1)(2,St,6,2),MS(3,0,ht,null,1,2)),e&2){let a=qS();ZC(3),NS(a.startup()===`ready`)}}function Ct(e,t){e&1&&Py(0,`app-navigation-progress`,3)}function Mt(e,t){if(e&1&&Py(0,`app-environment-status`,4),e&2)Fy(`publicPage`,qS().publicPage())}function xt(e,t){if(e&1&&(Us(0,`div`,6),Py(1,`span`,12),Us(2,`p`),y_(3),fd()()),e&2){let a=qS();ZC(3),nv(a.i18n.t(`shell.loading`))}}function _t(e,t){if(e&1){let a=zS();Us(0,`div`,7)(1,`p`,10),y_(2),fd(),Us(3,`button`,11),Gy(`click`,function(){Ip(a);return wp(qS().reload())}),y_(4),fd()()}if(e&2){let a=qS();ZC(2),nv(a.i18n.t(`shell.loadError`)),ZC(2),nv(a.i18n.t(`shell.reload`))}}function Nt(e,t){e&1&&Py(0,`app-flash-outlet`)}jN(class e{i18n=g$2(Ie);router=g$2(ue);navigating=Ft(()=>this.router.currentNavigation()!==null);document=g$2(H$3);transferState=g$2(At$1);initialShell=this.router.navigated?$(this.router.routerState.snapshot.root):this.transferState.get(le,void 0);shell=Ke(this.initialShell);startup=Ke(this.initialShell===void 0?`loading`:`ready`);backOffice=Ft(()=>this.shell()===`administrator`||this.shell()===`client`);administrator=Ft(()=>this.shell()===`administrator`);standalonePage=Ft(()=>this.shell()===`standalone`);publicPage=Ft(()=>this.shell()===`public`);constructor(){g$2(Y),g$2(J),this.transferState.onSerialize(le,()=>this.shell()),this.router.events.pipe(U$1()).subscribe(t=>{t instanceof x$2?(this.shell.set($(this.router.routerState.snapshot.root)),this.startup.set(`ready`)):this.startup()!==`ready`&&(t instanceof je?(this.shell.set($(t.state.root)),this.startup.set(`loading`)):t instanceof J$3?this.startup.set(`loading`):(t instanceof se$1||t instanceof H$2||t instanceof j$3&&t.code!==b$2.Redirect&&t.code!==b$2.SupersededByNewNavigation)&&this.startup.set(`error`))})}reload(){this.document.defaultView?.location.reload()}static ɵfac=function(a){return new(a||e)};static ɵcmp=Fb({type:e,selectors:[[`app-root`]],decls:15,vars:12,consts:[[`mainContent`,``],[1,`app-shell`],[`href`,`#main-content`,1,`skip-link`,3,`click`],[1,`standalone-progress`],[`ngSkipHydration`,``,`placement`,`hidden`,3,`publicPage`],[`id`,`main-content`,`tabindex`,`-1`],[`role`,`status`,1,`startup-status`],[1,`startup-status`],[3,`administrator`],[1,`header-error`],[`role`,`alert`],[`appButton`,``,`type`,`button`,3,`click`],[`aria-hidden`,`true`,1,`loading-spinner`]],template:function(a,s){if(a&1){let p=zS();Us(0,`div`,1)(1,`a`,2),Gy(`click`,function(M){Ip(p);let x=t_(7);return M.preventDefault(),wp(x.focus({preventScroll:!0}))}),y_(2),fd(),OS(3,kt,5,1)(4,Ct,1,0,`app-navigation-progress`,3),OS(5,Mt,1,1,`app-environment-status`,4),Us(6,`main`,5,0),OS(8,xt,4,1,`div`,6)(9,_t,5,2,`div`,7),wy(10,Nt,1,0),MS(11,10,vt),Py(13,`router-outlet`),fd(),Py(14,`app-copy-notice`),fd()}a&2&&(Xy(`back-office-shell`,s.backOffice())(`standalone-shell`,s.standalonePage()),ZC(2),nv(s.i18n.t(`shell.skip`)),ZC(),kS(s.backOffice()?3:s.standalonePage()?4:-1),ZC(2),kS(s.backOffice()?-1:5),ZC(),Xy(`startup-main`,s.startup()!==`ready`),ky(`aria-busy`,s.navigating()),ZC(2),kS(s.startup()===`loading`?8:s.startup()===`error`?9:-1),ZC(3),NS(s.backOffice()))},dependencies:[ee,N,Z,M$1,v$2,gr],styles:[`[_nghost-%COMP%]{display:block;min-height:100dvh}.app-shell[_ngcontent-%COMP%]{display:flex;min-width:0;min-height:100dvh;flex-direction:column;color:var(--%NS%color-ink)}.back-office-shell[_ngcontent-%COMP%]{display:grid;grid-template-columns:16rem minmax(0,1fr);grid-template-rows:auto minmax(0,1fr);grid-template-areas:"sidebar header" "sidebar content";align-items:start;background:var(--%NS%color-surface)}.back-office-shell[_ngcontent-%COMP%] main[_ngcontent-%COMP%]{grid-area:content;width:100%;max-width:var(--%NS%page-width-wide);margin-block:0;margin-inline:auto}.back-office-shell[_ngcontent-%COMP%] app-copy-notice[_ngcontent-%COMP%]{display:contents}.startup-main[_ngcontent-%COMP%]{display:flex;align-self:stretch}.startup-status[_ngcontent-%COMP%], .header-error[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:var(--%NS%space-3);padding:var(--%NS%page-y) var(--%NS%page-x);color:var(--%NS%color-muted)}.startup-status[_ngcontent-%COMP%]{flex:1;min-width:0;flex-direction:column;flex-wrap:nowrap;justify-content:center;gap:var(--%NS%space-4);color:var(--%NS%color-ink);font-size:var(--%NS%text-xl);text-align:center}.header-error[_ngcontent-%COMP%]{position:relative;grid-area:header}.standalone-progress[_ngcontent-%COMP%]{position:fixed;inset-block-start:0}.loading-spinner[_ngcontent-%COMP%]{flex:none;inline-size:3rem;block-size:3rem;border:3px solid var(--%NS%color-line-strong);border-block-start-color:var(--%NS%color-ink);border-radius:50%}@media(prefers-reduced-motion:no-preference){.loading-spinner[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_loading-spin .8s linear infinite}}@keyframes _ngcontent-%COMP%_loading-spin{to{transform:rotate(360deg)}}@media(max-width:63.999rem){.back-office-shell[_ngcontent-%COMP%]{grid-template-columns:minmax(0,1fr);grid-template-areas:"header" "content"}}.skip-link[_ngcontent-%COMP%]{position:fixed;top:var(--%NS%space-2);inset-inline-start:var(--%NS%space-3);z-index:var(--%NS%z-skip-link);padding:var(--%NS%space-2) var(--%NS%space-3);border:1px solid var(--%NS%color-line-strong);border-radius:var(--%NS%radius-sm);background:var(--%NS%color-surface-raised);font-size:var(--%NS%text-sm);clip-path:inset(50%);translate:0 calc(-100% - var(--%NS%space-6))}.skip-link[_ngcontent-%COMP%]:focus-visible{clip-path:none;translate:0 0}main[_ngcontent-%COMP%]{flex:1;min-width:0;width:calc(100% - 2 * var(--%NS%shell-gutter));max-width:var(--%NS%layout-max);margin-block:var(--%NS%shell-gutter);margin-inline:auto;outline:none}.standalone-shell[_ngcontent-%COMP%] main[_ngcontent-%COMP%]{width:100%;max-width:none;margin:0}#main-content[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--%NS%color-focus);outline-offset:-2px;box-shadow:none}@media print{.back-office-shell[_ngcontent-%COMP%] main[_ngcontent-%COMP%]{max-width:none}.back-office-shell[_ngcontent-%COMP%]{display:block}main[_ngcontent-%COMP%]{width:100%;max-width:none;margin:0}}`],changeDetection:1})},dt).catch(e=>console.error(e));export{oe$2 as C,x$2 as E,gr as S,ue as T,o$3 as _,T$2 as a,No as b,O$1 as c,M$1 as d,u$1 as f,bt$1 as g,Ne as h,r$1 as i,r$2 as l,Ie as m,v as n,U$1 as o,v$2 as p,N as r,a as s,o$1 as t,c as u,Dt as v,p$4 as w,ce$2 as x,G$2 as y};