n2words 1.24.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/README.md +285 -156
  2. package/dist/ArabicConverter.js +3 -0
  3. package/dist/ArabicConverter.js.map +1 -0
  4. package/dist/AzerbaijaniConverter.js +3 -0
  5. package/dist/AzerbaijaniConverter.js.map +1 -0
  6. package/dist/BanglaConverter.js +3 -0
  7. package/dist/BanglaConverter.js.map +1 -0
  8. package/dist/BiblicalHebrewConverter.js +3 -0
  9. package/dist/BiblicalHebrewConverter.js.map +1 -0
  10. package/dist/CroatianConverter.js +3 -0
  11. package/dist/CroatianConverter.js.map +1 -0
  12. package/dist/CzechConverter.js +3 -0
  13. package/dist/CzechConverter.js.map +1 -0
  14. package/dist/DanishConverter.js +3 -0
  15. package/dist/DanishConverter.js.map +1 -0
  16. package/dist/DutchConverter.js +3 -0
  17. package/dist/DutchConverter.js.map +1 -0
  18. package/dist/EnglishConverter.js +3 -0
  19. package/dist/EnglishConverter.js.map +1 -0
  20. package/dist/FilipinoConverter.js +3 -0
  21. package/dist/FilipinoConverter.js.map +1 -0
  22. package/dist/FrenchBelgiumConverter.js +3 -0
  23. package/dist/FrenchBelgiumConverter.js.map +1 -0
  24. package/dist/FrenchConverter.js +3 -0
  25. package/dist/FrenchConverter.js.map +1 -0
  26. package/dist/GermanConverter.js +3 -0
  27. package/dist/GermanConverter.js.map +1 -0
  28. package/dist/GreekConverter.js +3 -0
  29. package/dist/GreekConverter.js.map +1 -0
  30. package/dist/GujaratiConverter.js +3 -0
  31. package/dist/GujaratiConverter.js.map +1 -0
  32. package/dist/HebrewConverter.js +3 -0
  33. package/dist/HebrewConverter.js.map +1 -0
  34. package/dist/HindiConverter.js +3 -0
  35. package/dist/HindiConverter.js.map +1 -0
  36. package/dist/HungarianConverter.js +3 -0
  37. package/dist/HungarianConverter.js.map +1 -0
  38. package/dist/IndonesianConverter.js +3 -0
  39. package/dist/IndonesianConverter.js.map +1 -0
  40. package/dist/ItalianConverter.js +3 -0
  41. package/dist/ItalianConverter.js.map +1 -0
  42. package/dist/JapaneseConverter.js +3 -0
  43. package/dist/JapaneseConverter.js.map +1 -0
  44. package/dist/KannadaConverter.js +3 -0
  45. package/dist/KannadaConverter.js.map +1 -0
  46. package/dist/KoreanConverter.js +3 -0
  47. package/dist/KoreanConverter.js.map +1 -0
  48. package/dist/LatvianConverter.js +3 -0
  49. package/dist/LatvianConverter.js.map +1 -0
  50. package/dist/LithuanianConverter.js +3 -0
  51. package/dist/LithuanianConverter.js.map +1 -0
  52. package/dist/MalayConverter.js +3 -0
  53. package/dist/MalayConverter.js.map +1 -0
  54. package/dist/MarathiConverter.js +3 -0
  55. package/dist/MarathiConverter.js.map +1 -0
  56. package/dist/NorwegianBokmalConverter.js +3 -0
  57. package/dist/NorwegianBokmalConverter.js.map +1 -0
  58. package/dist/PersianConverter.js +3 -0
  59. package/dist/PersianConverter.js.map +1 -0
  60. package/dist/PolishConverter.js +3 -0
  61. package/dist/PolishConverter.js.map +1 -0
  62. package/dist/PortugueseConverter.js +3 -0
  63. package/dist/PortugueseConverter.js.map +1 -0
  64. package/dist/PunjabiConverter.js +3 -0
  65. package/dist/PunjabiConverter.js.map +1 -0
  66. package/dist/RomanianConverter.js +3 -0
  67. package/dist/RomanianConverter.js.map +1 -0
  68. package/dist/RussianConverter.js +3 -0
  69. package/dist/RussianConverter.js.map +1 -0
  70. package/dist/SerbianCyrillicConverter.js +3 -0
  71. package/dist/SerbianCyrillicConverter.js.map +1 -0
  72. package/dist/SerbianLatinConverter.js +3 -0
  73. package/dist/SerbianLatinConverter.js.map +1 -0
  74. package/dist/SimplifiedChineseConverter.js +3 -0
  75. package/dist/SimplifiedChineseConverter.js.map +1 -0
  76. package/dist/SpanishConverter.js +3 -0
  77. package/dist/SpanishConverter.js.map +1 -0
  78. package/dist/SwahiliConverter.js +3 -0
  79. package/dist/SwahiliConverter.js.map +1 -0
  80. package/dist/SwedishConverter.js +3 -0
  81. package/dist/SwedishConverter.js.map +1 -0
  82. package/dist/TamilConverter.js +3 -0
  83. package/dist/TamilConverter.js.map +1 -0
  84. package/dist/TeluguConverter.js +3 -0
  85. package/dist/TeluguConverter.js.map +1 -0
  86. package/dist/ThaiConverter.js +3 -0
  87. package/dist/ThaiConverter.js.map +1 -0
  88. package/dist/TraditionalChineseConverter.js +3 -0
  89. package/dist/TraditionalChineseConverter.js.map +1 -0
  90. package/dist/TurkishConverter.js +3 -0
  91. package/dist/TurkishConverter.js.map +1 -0
  92. package/dist/UkrainianConverter.js +3 -0
  93. package/dist/UkrainianConverter.js.map +1 -0
  94. package/dist/UrduConverter.js +3 -0
  95. package/dist/UrduConverter.js.map +1 -0
  96. package/dist/VietnameseConverter.js +3 -0
  97. package/dist/VietnameseConverter.js.map +1 -0
  98. package/dist/n2words.js +3 -2
  99. package/dist/n2words.js.map +1 -1
  100. package/lib/classes/abstract-language.d.ts +178 -0
  101. package/lib/classes/abstract-language.js +192 -185
  102. package/lib/classes/greedy-scale-language.d.ts +109 -0
  103. package/lib/classes/greedy-scale-language.js +96 -90
  104. package/lib/classes/slavic-language.d.ts +148 -0
  105. package/lib/classes/slavic-language.js +136 -106
  106. package/lib/classes/south-asian-language.d.ts +70 -0
  107. package/lib/classes/south-asian-language.js +58 -65
  108. package/lib/classes/turkic-language.d.ts +26 -0
  109. package/lib/classes/turkic-language.js +22 -26
  110. package/lib/languages/ar.d.ts +30 -0
  111. package/lib/languages/ar.js +49 -133
  112. package/lib/languages/az.d.ts +12 -0
  113. package/lib/languages/az.js +7 -23
  114. package/lib/languages/bn.d.ts +11 -0
  115. package/lib/languages/bn.js +12 -7
  116. package/lib/languages/cs.d.ts +88 -0
  117. package/lib/languages/cs.js +44 -113
  118. package/lib/languages/da.d.ts +15 -0
  119. package/lib/languages/da.js +40 -87
  120. package/lib/languages/de.d.ts +14 -0
  121. package/lib/languages/de.js +34 -68
  122. package/lib/languages/el.d.ts +14 -0
  123. package/lib/languages/el.js +22 -48
  124. package/lib/languages/en.d.ts +16 -0
  125. package/lib/languages/en.js +22 -59
  126. package/lib/languages/es.d.ts +15 -0
  127. package/lib/languages/es.js +49 -81
  128. package/lib/languages/fa.d.ts +47 -0
  129. package/lib/languages/fa.js +90 -73
  130. package/lib/languages/fil.d.ts +16 -0
  131. package/lib/languages/fil.js +35 -76
  132. package/lib/languages/fr-BE.d.ts +11 -0
  133. package/lib/languages/fr-BE.js +15 -51
  134. package/lib/languages/fr.d.ts +15 -0
  135. package/lib/languages/fr.js +33 -72
  136. package/lib/languages/gu.d.ts +11 -0
  137. package/lib/languages/gu.js +10 -34
  138. package/lib/languages/hbo.d.ts +113 -0
  139. package/lib/languages/hbo.js +251 -0
  140. package/lib/languages/he.d.ts +80 -0
  141. package/lib/languages/he.js +41 -164
  142. package/lib/languages/hi.d.ts +11 -0
  143. package/lib/languages/hi.js +12 -7
  144. package/lib/languages/hr.d.ts +80 -0
  145. package/lib/languages/hr.js +51 -95
  146. package/lib/languages/hu.d.ts +22 -0
  147. package/lib/languages/hu.js +35 -53
  148. package/lib/languages/id.d.ts +37 -0
  149. package/lib/languages/id.js +29 -44
  150. package/lib/languages/it.d.ts +37 -0
  151. package/lib/languages/it.js +36 -52
  152. package/lib/languages/ja.d.ts +17 -0
  153. package/lib/languages/ja.js +22 -75
  154. package/lib/languages/kn.d.ts +11 -0
  155. package/lib/languages/kn.js +10 -39
  156. package/lib/languages/ko.d.ts +14 -0
  157. package/lib/languages/ko.js +17 -45
  158. package/lib/languages/lt.d.ts +70 -0
  159. package/lib/languages/lt.js +28 -63
  160. package/lib/languages/lv.d.ts +70 -0
  161. package/lib/languages/lv.js +35 -58
  162. package/lib/languages/mr.d.ts +11 -0
  163. package/lib/languages/mr.js +10 -34
  164. package/lib/languages/ms.d.ts +31 -0
  165. package/lib/languages/ms.js +24 -20
  166. package/lib/languages/nb.d.ts +12 -0
  167. package/lib/languages/nb.js +36 -56
  168. package/lib/languages/nl.d.ts +16 -0
  169. package/lib/languages/nl.js +58 -109
  170. package/lib/languages/pa.d.ts +11 -0
  171. package/lib/languages/{pa-Guru.js → pa.js} +12 -7
  172. package/lib/languages/pl.d.ts +80 -0
  173. package/lib/languages/pl.js +26 -105
  174. package/lib/languages/pt.d.ts +29 -0
  175. package/lib/languages/pt.js +29 -64
  176. package/lib/languages/ro.d.ts +158 -0
  177. package/lib/languages/ro.js +60 -167
  178. package/lib/languages/ru.d.ts +85 -0
  179. package/lib/languages/ru.js +17 -37
  180. package/lib/languages/sr-Cyrl.d.ts +80 -0
  181. package/lib/languages/sr-Cyrl.js +113 -0
  182. package/lib/languages/sr-Latn.d.ts +80 -0
  183. package/lib/languages/sr-Latn.js +54 -98
  184. package/lib/languages/sv.d.ts +14 -0
  185. package/lib/languages/sv.js +26 -63
  186. package/lib/languages/sw.d.ts +39 -0
  187. package/lib/languages/sw.js +26 -21
  188. package/lib/languages/ta.d.ts +20 -0
  189. package/lib/languages/ta.js +26 -26
  190. package/lib/languages/te.d.ts +22 -0
  191. package/lib/languages/te.js +28 -38
  192. package/lib/languages/th.d.ts +17 -0
  193. package/lib/languages/th.js +25 -31
  194. package/lib/languages/tr.d.ts +12 -0
  195. package/lib/languages/tr.js +11 -38
  196. package/lib/languages/uk.d.ts +85 -0
  197. package/lib/languages/uk.js +18 -44
  198. package/lib/languages/ur.d.ts +11 -0
  199. package/lib/languages/ur.js +12 -7
  200. package/lib/languages/vi.d.ts +72 -0
  201. package/lib/languages/vi.js +25 -71
  202. package/lib/languages/zh-Hans.d.ts +21 -0
  203. package/lib/languages/zh-Hans.js +33 -87
  204. package/lib/languages/zh-Hant.d.ts +21 -0
  205. package/lib/languages/zh-Hant.js +111 -0
  206. package/lib/n2words.d.ts +209 -0
  207. package/lib/n2words.js +474 -191
  208. package/package.json +106 -67
  209. package/dist/languages/ar.js +0 -2
  210. package/dist/languages/ar.js.map +0 -1
  211. package/dist/languages/az.js +0 -2
  212. package/dist/languages/az.js.map +0 -1
  213. package/dist/languages/bn.js +0 -2
  214. package/dist/languages/bn.js.map +0 -1
  215. package/dist/languages/cs.js +0 -2
  216. package/dist/languages/cs.js.map +0 -1
  217. package/dist/languages/da.js +0 -2
  218. package/dist/languages/da.js.map +0 -1
  219. package/dist/languages/de.js +0 -2
  220. package/dist/languages/de.js.map +0 -1
  221. package/dist/languages/el.js +0 -2
  222. package/dist/languages/el.js.map +0 -1
  223. package/dist/languages/en.js +0 -2
  224. package/dist/languages/en.js.map +0 -1
  225. package/dist/languages/es.js +0 -2
  226. package/dist/languages/es.js.map +0 -1
  227. package/dist/languages/fa.js +0 -2
  228. package/dist/languages/fa.js.map +0 -1
  229. package/dist/languages/fil.js +0 -2
  230. package/dist/languages/fil.js.map +0 -1
  231. package/dist/languages/fr-BE.js +0 -2
  232. package/dist/languages/fr-BE.js.map +0 -1
  233. package/dist/languages/fr.js +0 -2
  234. package/dist/languages/fr.js.map +0 -1
  235. package/dist/languages/gu.js +0 -2
  236. package/dist/languages/gu.js.map +0 -1
  237. package/dist/languages/he.js +0 -2
  238. package/dist/languages/he.js.map +0 -1
  239. package/dist/languages/hi.js +0 -2
  240. package/dist/languages/hi.js.map +0 -1
  241. package/dist/languages/hr.js +0 -2
  242. package/dist/languages/hr.js.map +0 -1
  243. package/dist/languages/hu.js +0 -2
  244. package/dist/languages/hu.js.map +0 -1
  245. package/dist/languages/id.js +0 -2
  246. package/dist/languages/id.js.map +0 -1
  247. package/dist/languages/it.js +0 -2
  248. package/dist/languages/it.js.map +0 -1
  249. package/dist/languages/ja.js +0 -2
  250. package/dist/languages/ja.js.map +0 -1
  251. package/dist/languages/kn.js +0 -2
  252. package/dist/languages/kn.js.map +0 -1
  253. package/dist/languages/ko.js +0 -2
  254. package/dist/languages/ko.js.map +0 -1
  255. package/dist/languages/lt.js +0 -2
  256. package/dist/languages/lt.js.map +0 -1
  257. package/dist/languages/lv.js +0 -2
  258. package/dist/languages/lv.js.map +0 -1
  259. package/dist/languages/mr.js +0 -2
  260. package/dist/languages/mr.js.map +0 -1
  261. package/dist/languages/ms.js +0 -2
  262. package/dist/languages/ms.js.map +0 -1
  263. package/dist/languages/nb.js +0 -2
  264. package/dist/languages/nb.js.map +0 -1
  265. package/dist/languages/nl.js +0 -2
  266. package/dist/languages/nl.js.map +0 -1
  267. package/dist/languages/pa-Guru.js +0 -2
  268. package/dist/languages/pa-Guru.js.map +0 -1
  269. package/dist/languages/pl.js +0 -2
  270. package/dist/languages/pl.js.map +0 -1
  271. package/dist/languages/pt.js +0 -2
  272. package/dist/languages/pt.js.map +0 -1
  273. package/dist/languages/ro.js +0 -2
  274. package/dist/languages/ro.js.map +0 -1
  275. package/dist/languages/ru.js +0 -2
  276. package/dist/languages/ru.js.map +0 -1
  277. package/dist/languages/sr-Latn.js +0 -2
  278. package/dist/languages/sr-Latn.js.map +0 -1
  279. package/dist/languages/sv.js +0 -2
  280. package/dist/languages/sv.js.map +0 -1
  281. package/dist/languages/sw.js +0 -2
  282. package/dist/languages/sw.js.map +0 -1
  283. package/dist/languages/ta.js +0 -2
  284. package/dist/languages/ta.js.map +0 -1
  285. package/dist/languages/te.js +0 -2
  286. package/dist/languages/te.js.map +0 -1
  287. package/dist/languages/th.js +0 -2
  288. package/dist/languages/th.js.map +0 -1
  289. package/dist/languages/tr.js +0 -2
  290. package/dist/languages/tr.js.map +0 -1
  291. package/dist/languages/uk.js +0 -2
  292. package/dist/languages/uk.js.map +0 -1
  293. package/dist/languages/ur.js +0 -2
  294. package/dist/languages/ur.js.map +0 -1
  295. package/dist/languages/vi.js +0 -2
  296. package/dist/languages/vi.js.map +0 -1
  297. package/dist/languages/zh-Hans.js +0 -2
  298. package/dist/languages/zh-Hans.js.map +0 -1
  299. package/typings/classes/abstract-language.d.ts +0 -144
  300. package/typings/classes/greedy-scale-language.d.ts +0 -148
  301. package/typings/classes/slavic-language.d.ts +0 -145
  302. package/typings/classes/south-asian-language.d.ts +0 -101
  303. package/typings/classes/turkic-language.d.ts +0 -42
  304. package/typings/languages/ar.d.ts +0 -93
  305. package/typings/languages/az.d.ts +0 -25
  306. package/typings/languages/bn.d.ts +0 -1
  307. package/typings/languages/cs.d.ts +0 -120
  308. package/typings/languages/da.d.ts +0 -53
  309. package/typings/languages/de.d.ts +0 -26
  310. package/typings/languages/el.d.ts +0 -11
  311. package/typings/languages/en.d.ts +0 -30
  312. package/typings/languages/es.d.ts +0 -43
  313. package/typings/languages/fa.d.ts +0 -81
  314. package/typings/languages/fil.d.ts +0 -12
  315. package/typings/languages/fr-BE.d.ts +0 -41
  316. package/typings/languages/fr.d.ts +0 -43
  317. package/typings/languages/gu.d.ts +0 -12
  318. package/typings/languages/he.d.ts +0 -197
  319. package/typings/languages/hi.d.ts +0 -1
  320. package/typings/languages/hr.d.ts +0 -110
  321. package/typings/languages/hu.d.ts +0 -37
  322. package/typings/languages/id.d.ts +0 -69
  323. package/typings/languages/it.d.ts +0 -51
  324. package/typings/languages/ja.d.ts +0 -58
  325. package/typings/languages/kn.d.ts +0 -11
  326. package/typings/languages/ko.d.ts +0 -25
  327. package/typings/languages/lt.d.ts +0 -110
  328. package/typings/languages/lv.d.ts +0 -99
  329. package/typings/languages/mr.d.ts +0 -12
  330. package/typings/languages/ms.d.ts +0 -37
  331. package/typings/languages/nb.d.ts +0 -27
  332. package/typings/languages/nl.d.ts +0 -65
  333. package/typings/languages/pa-Guru.d.ts +0 -1
  334. package/typings/languages/pl.d.ts +0 -116
  335. package/typings/languages/pt.d.ts +0 -39
  336. package/typings/languages/ro.d.ts +0 -229
  337. package/typings/languages/ru.d.ts +0 -108
  338. package/typings/languages/sr-Latn.d.ts +0 -98
  339. package/typings/languages/sv.d.ts +0 -30
  340. package/typings/languages/sw.d.ts +0 -1
  341. package/typings/languages/ta.d.ts +0 -1
  342. package/typings/languages/te.d.ts +0 -1
  343. package/typings/languages/th.d.ts +0 -1
  344. package/typings/languages/tr.d.ts +0 -46
  345. package/typings/languages/uk.d.ts +0 -117
  346. package/typings/languages/ur.d.ts +0 -1
  347. package/typings/languages/vi.d.ts +0 -116
  348. package/typings/languages/zh-Hans.d.ts +0 -57
  349. package/typings/n2words.d.ts +0 -177
@@ -1 +1 @@
1
- {"version":3,"file":"n2words.js","mappings":"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OACL,CAAC,GAAI,OACL,CAAC,GAAI,SAoBPC,WAAAA,CAAaC,EAAUC,GACrB,MAAMC,EAAWhD,OAAOiD,KAAKH,GAAU,GACjCI,EAAalD,OAAOmD,OAAOL,GAAU,GACrCM,EAAYpD,OAAOiD,KAAKF,GAAW,GACnCM,EAAcrD,OAAOmD,OAAOJ,GAAW,GAG7C,OAAmB,KAAfG,GAAqBG,EAAc,KAC9B,CAAE,CAACD,GAAYC,GAIpBH,EAAa,MAAQA,EAAaG,EAC7B,CAAE,CAAC,GAAGL,KAAYI,KAAcF,EAAaG,GAIlDH,GAAc,MAAQG,EAAc,KAC/B,CAAE,CAAC,GAAGL,SAAgBI,KAAcF,EAAaG,GAItDA,EAAcH,EACT,CAAE,CAAC,GAAGF,KAAYI,KAAcF,EAAaG,GAG/C,CAAE,CAAC,GAAGL,KAAYI,KAAcF,EAAaG,EACtD,EAgBa,SAASC,EAAgBzE,EAAO6B,EAAU,CAAC,GACxD,OAAO,IAAI6B,EAAQ7B,GAAS4C,eAAezE,EAC7C,C,kDCxHA,MAAM0E,UAAcC,EAAAA,EAClBf,aAAe,QACfC,qBAAuB,QACvBC,SAAW,QACXc,YAAc,KACdC,aAAe,CACb,QACA,KACA,KACA,MACA,MACA,OACA,KACA,MACA,KACA,KACA,KACA,SACA,OACA,OACA,OACA,SACA,OACA,QACA,QACA,SACA,MACA,SACA,OACA,OACA,QACA,SACA,SACA,UACA,UACA,QACA,MACA,QACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UACA,QACA,UACA,SACA,UACA,SACA,WACA,UACA,WACA,WACA,QACA,OACA,UACA,OACA,QACA,OACA,OACA,QACA,UACA,UACA,OACA,MACA,OACA,OACA,QACA,QACA,QACA,SACA,QACA,QACA,UACA,QACA,UACA,SACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,QACA,UACA,QACA,SACA,SACA,QACA,SACA,UACA,UACA,QACA,QACA,WACA,QACA,UACA,UACA,SACA,UACA,WACA,WACA,aAGFC,WAAa,CACX,GACA,QACA,MACA,QACA,MACA,MACA,MACA,OACA,OAIW,SAA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MACA,KACA,MACA,MACA,MACA,MACA,SACA,QACA,QACA,QACA,SACA,QACA,SACA,SACA,OACA,MACA,OACA,MACA,MACA,OACA,OACA,OACA,OACA,OACA,QACA,MACA,QACA,OACA,OACA,QACA,QACA,OACA,QACA,QACA,SACA,OACA,SACA,QACA,UACA,SACA,SACA,QACA,UACA,SACA,QACA,QACA,SACA,QACA,SACA,UACA,UACA,QACA,UACA,SACA,QACA,MACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,OACA,SACA,OACA,SACA,QACA,QACA,SACA,UACA,SACA,QACA,QACA,QACA,OACA,SACA,QACA,SACA,UACA,QACA,QACA,SACA,QACA,QACA,OACA,UACA,SACA,UACA,WACA,WACA,UACA,UACA,UACA,YAGFC,WAAa,CACX,GACA,QACA,MACA,OACA,MACA,MACA,MACA,MACA,QAIW,SAASL,EAAgBzE,EAAO6B,EAAU,CAAC,GACxD,OAAO,IAAI4K,EAAQ5K,GAAS4C,eAAezE,EAC7C,C,qDCtFA,MAAM2E,UAA2BwC,EAAAA,EAM/BtC,aAOAD,YAQAE,WAqBA4H,aAAAA,CAAelF,GACb,MAAMmF,EAASnF,EAAO/E,WAEtB,GAAIkK,EAAO5N,QAAU,EACnB,MAAO,CAACyJ,OAAOmE,IAGjB,MAAMC,EAAS,GACTC,EAAQF,EAAOtL,OAAO,GAC5BuL,EAAOE,QAAQtE,OAAOqE,IAEtB,IAAIE,EAAYJ,EAAOtL,MAAM,GAAI,GACjC,KAAO0L,EAAUhO,OAAS,GAAG,CAC3B,MAAMqM,EAAQ2B,EAAU1L,OAAO,GAC/BuL,EAAOE,QAAQtE,OAAO4C,IACtB2B,EAAYA,EAAU1L,MAAM,GAAI,EAClC,CAEA,OAAOuL,CACT,CASAI,oBAAAA,CAAsBxF,GACpB,GAAe,IAAXA,EAAc,MAAO,GACzB,GAAIA,EAAS,IAAK,OAAO5H,KAAKiF,aAAa2C,GAE3C,MAAMnC,EAAWY,KAAKE,MAAMqB,EAAS,KAC/ByF,EAAYzF,EAAS,IACrB0F,EAAQ,GAYd,OAViB,IAAb7H,EACF6H,EAAMlF,KAAKp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BACVxG,EAAa,EAAQ,KAErBhB,EAAO3H,EAAY,GAAG2H,MAE1BlK,EAAOD,QAAU,SAAU4R,EAAQC,GACjC,IAGIC,EAHA1I,EAAIsI,EAAgBE,GACpB7D,EAAI,EACJxL,EAAS,GAEb,IAAKuP,KAAO1I,GAAI1G,EAAOyI,EAAY2G,IAAQpP,EAAO0G,EAAG0I,IAAQ3H,EAAK5H,EAAQuP,GAE1E,KAAOD,EAAM3Q,OAAS6M,GAAOrL,EAAO0G,EAAG0I,EAAMD,EAAM9D,SAChD4D,EAAQpP,EAAQuP,IAAQ3H,EAAK5H,EAAQuP,IAExC,OAAOvP,CACT,C,mDClBA,MAAMwP,UAAajL,EAAAA,EACjBf,aAAe,OACfC,qBAAuB,UACvBC,SAAW,MACXc,YAAc,KACdC,aAAe,CACb,MACA,MACA,KACA,MACA,MACA,OACA,KACA,MACA,MACA,KACA,KACA,QACA,OACA,OACA,OACA,QACA,OACA,OACA,SACA,OACA,MACA,OACA,QACA,QACA,QACA,OACA,QACA,SACA,UACA,QACA,MACA,QACA,OACA,SACA,SACA,SACA,QACA,SACA,QACA,UACA,QACA,UACA,SACA,WACA,SACA,WACA,SACA,WACA,UACA,QACA,OACA,QACA,OACA,OACA,MACA,OACA,OACA,QACA,SACA,QACA,OACA,QACA,QACA,QACA,SACA,SACA,UACA,QACA,QACA,QACA,MACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,SACA,QACA,MACA,SACA,QACA,SACA,SACA,QACA,SACA,QACA,SACA,QACA,MACA,SACA,QACA,SACA,UACA,SACA,UACA,SACA,UACA,UAGFC,WAAa,CACX,GACA,OACA,OACA,OACA,MACA,OACA,MACA,MACA,QAIW,SAASL,EAAgBzE,EAAO6B,EAAU,CAAC,GACxD,OAAO,IAAI+N,EAAK/N,GAAS4C,eAAezE,EAC1C,C,cC5HA,IAAI2B,EAAc,EAAQ,KACtBT,EAAiB,EAAQ,MAE7BpD,EAAOD,QAAU,SAAUyB,EAAQsC,EAAMiO,GAGvC,OAFIA,EAAW9O,KAAKY,EAAYkO,EAAW9O,IAAKa,EAAM,CAAEE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,MACH,EAAG,MACH,EAAG,SACH,EAAG,OACH,EAAG,QACH,EAAG,OACH,EAAG,SACH,EAAG,UAGLmF,aAAe,CACb,EAAG,OACH,EAAG,MACH,EAAG,MACH,EAAG,SACH,EAAG,OACH,EAAG,QACH,EAAG,OACH,EAAG,SACH,EAAG,UAGLhI,KAAO,CACL,EAAG,SACH,EAAG,cACH,EAAG,aACH,EAAG,aACH,EAAG,eACH,EAAG,aACH,EAAG,cACH,EAAG,aACH,EAAG,eACH,EAAG,gBAGL0E,SAAW,CACT,EAAG,WACH,EAAG,WACH,EAAG,QACH,EAAG,YACH,EAAG,aACH,EAAG,YACH,EAAG,cACH,EAAG,aAGL1G,SAAW,CACT,EAAG,MACH,EAAG,SACH,EAAG,SACH,EAAG,YACH,EAAG,UACH,EAAG,WACH,EAAG,UACH,EAAG,YACH,EAAG,aAGLiC,UAAY,CACV,EAAG,CAAC,SAAU,SAAU,SACxB,EAAG,CAAC,UAAW,WAAY,aAC3B,EAAG,CAAC,WAAY,YAAa,cAC7B,EAAG,CAAC,WAAY,YAAa,cAC7B,EAAG,CAAC,cAAe,eAAgB,iBACnC,EAAG,CAAC,cAAe,eAAgB,iBACnC,EAAG,CAAC,cAAe,eAAgB,iBACnC,EAAG,CAAC,aAAc,cAAe,gBACjC,EAAG,CAAC,YAAa,aAAc,eAC/B,GAAI,CAAC,YAAa,aAAc,gBAarB,SAAS7C,EAAgBzE,EAAO6B,EAAU,CAAC,GACxD,OAAO,IAAIuU,EAAQvU,GAAS4C,eAAezE,EAC7C,C,mDCjHA,MAAMqW,UAAgB1R,EAAAA,EACpBf,aAAe,SACfC,qBAAuB,QACvBC,SAAW,QACXc,YAAc,KACdC,aAAe,CACb,QACA,KACA,MACA,MACA,MACA,OACA,MACA,MACA,KACA,MACA,KACA,QACA,OACA,OACA,QACA,QACA,MACA,QACA,QACA,OACA,MACA,OACA,OACA,OACA,SACA,QACA,UACA,QACA,OACA,UACA,QACA,UACA,SACA,UACA,UACA,YACA,SACA,YACA,UACA,WACA,SACA,WACA,aACA,YACA,aACA,cACA,WACA,YACA,WACA,WACA,SACA,SACA,UACA,YACA,WACA,WACA,YACA,UACA,SACA,QACA,MACA,UACA,UACA,UACA,UACA,YACA,UACA,WACA,UACA,UACA,QACA,UACA,WACA,WACA,YACA,WACA,YACA,WACA,UACA,QACA,MACA,QACA,SACA,SACA,SACA,SACA,UACA,SACA,QACA,UACA,QACA,WACA,YACA,YACA,YACA,YACA,aACA,YACA,WACA,aAGFC,WAAa,CACX,GACA,QACA,MACA,OACA,MACA,MACA,MACA,OACA,QAIW,SAASL,EAAgBzE,EAAO6B,EAAU,CAAC,GACxD,OAAO,IAAIwU,EAAQxU,GAAS4C,eAAezE,EAC7C,C,mDC1GA,MAAMsW,UAAyB3R,EAAAA,EAC7Bf,aAAe,KACfC,qBAAuB,QACvBC,SAAW,QACXc,YAAc,KACd6G,yBAA0B,EAE1B5G,aAAe,CACb,QACA,KACA,KACA,OACA,MACA,OACA,IACA,MACA,KACA,KACA,KACA,SACA,MACA,MACA,MACA,OACA,MACA,QACA,OACA,QACA,MACA,QACA,QACA,UACA,QACA,OACA,SACA,WACA,WACA,WACA,QACA,UACA,SACA,UACA,UACA,WACA,SACA,WACA,UACA,WACA,QACA,UACA,UACA,YACA,WACA,YACA,UACA,WACA,UACA,UACA,OACA,QACA,OACA,SACA,OACA,SACA,QACA,UACA,UACA,SACA,MACA,OACA,OACA,SACA,OACA,QACA,OACA,OACA,OACA,cACA,UACA,SACA,QACA,QACA,UACA,UACA,QACA,YACA,WACA,WACA,OACA,UACA,SACA,SACA,WACA,SACA,SACA,WACA,UACA,WACA,QACA,SACA,QACA,UACA,UACA,UACA,SACA,WACA,WACA,YAGFC,WAAa,CACX,GACA,OACA,MACA,OACA,MACA,MACA,MACA,OACA,OAeW,SAASL,EAAgBzE,EAAO6B,EAAU,CAAC,GACxD,OAAO,IAAIyU,EAAiBzU,GAAS4C,eAAezE,EACtD,C,2DCzJA,MAAMuW,UAAepP,EAAAA,EACnBvD,aAAe,QACfC,qBAAuB,UACvBC,SAAW,SACX2H,yBAA0B,EAC1B5G,aAAe,CACb,SACA,OACA,QACA,OACA,SACA,MACA,MACA,MACA,UACA,WACA,MACA,UACA,WACA,SACA,YACA,UACA,SACA,UACA,cACA,aACA,OACA,cACA,aACA,YACA,cACA,WACA,WACA,WACA,eACA,gBACA,SACA,cACA,eACA,cACA,gBACA,aACA,aACA,aACA,iBACA,kBACA,OACA,YACA,aACA,YACA,cACA,WACA,WACA,WACA,eACA,gBACA,OACA,YACA,aACA,YACA,cACA,WACA,WACA,WACA,eACA,gBACA,OACA,YACA,aACA,YACA,cACA,WACA,WACA,WACA,eACA,gBACA,SACA,cACA,eACA,cACA,gBACA,aACA,aACA,aACA,iBACA,kBACA,OACA,YACA,aACA,YACA,cACA,WACA,WACA,WACA,eACA,gBACA,QACA,aACA,cACA,aACA,eACA,YACA,YACA,YACA,gBACA,kBAGFQ,SAAW,CACT,GACA,MACA,cACA,aACA,eACA,YACA,YACA,YACA,gBACA,kBAIFmR,OAAS,CACP,OACA,QACA,OACA,SACA,MACA,MACA,MACA,UACA,YAGFC,OAAS,CACP,GACA,SACA,OACA,OACA,OACA,OACA,OACA,OACA,QASFC,mBAAAA,CAAqBlP,GACnB,OAAO5H,KAAKiF,aAAa2C,EAC3B,CAQAwF,oBAAAA,CAAsBxF,GACpB,GAAe,IAAXA,EAAc,MAAO,GACzB,GAAIA,EAAS,IAAK,OAAO5H,KAAK8W,oBAAoBlP,GAElD,MAAMnC,EAAWY,KAAKE,MAAMqB,EAAS,KAC/ByF,EAAYzF,EAAS,IACrB0F,EAAQ,CAACtN,KAAKyF,SAASA,IAM7B,OAJI4H,EAAY,GACdC,EAAMlF,KAAKpI,KAAK8W,oBAAoBzJ,IAG/BC,EAAM3L,KAAK,KAAKgK,MACzB,CAQAoL,WAAAA,CAAanP,GACX,MAAMmF,EAASnF,EAAO/E,WACtB,GAAIkK,EAAO5N,QAAU,EAAG,MAAO,CAACyJ,OAAOmE,IAEvC,MAAMC,EAAS,GACTC,EAAQF,EAAOtL,OAAO,GAC5BuL,EAAOE,QAAQtE,OAAOqE,IAEtB,IAAIE,EAAYJ,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","sources":["webpack://n2words/webpack/universalModuleDefinition","webpack://n2words/./node_modules/core-js/internals/is-object.js","webpack://n2words/./node_modules/core-js/internals/get-iterator.js","webpack://n2words/./node_modules/core-js/modules/es.iterator.find.js","webpack://n2words/./node_modules/core-js/internals/make-built-in.js","webpack://n2words/./node_modules/core-js/internals/function-name.js","webpack://n2words/./node_modules/core-js/internals/html.js","webpack://n2words/./node_modules/core-js/internals/hidden-keys.js","webpack://n2words/./node_modules/core-js/internals/iterate-simple.js","webpack://n2words/./node_modules/core-js/internals/function-bind-native.js","webpack://n2words/./lib/languages/en.js","webpack://n2words/./lib/languages/hi.js","webpack://n2words/./node_modules/core-js/internals/an-instance.js","webpack://n2words/./node_modules/core-js/internals/iterator-helper-throws-on-invalid-iterator.js","webpack://n2words/./lib/languages/pt.js","webpack://n2words/./node_modules/core-js/internals/math-trunc.js","webpack://n2words/./node_modules/core-js/internals/is-symbol.js","webpack://n2words/./node_modules/core-js/internals/get-iterator-method.js","webpack://n2words/./node_modules/core-js/internals/object-keys.js","webpack://n2words/./lib/languages/vi.js","webpack://n2words/./node_modules/core-js/internals/internal-state.js","webpack://n2words/./node_modules/core-js/internals/to-integer-or-infinity.js","webpack://n2words/./lib/languages/ar.js","webpack://n2words/./lib/languages/mr.js","webpack://n2words/./node_modules/core-js/internals/iterator-close-all.js","webpack://n2words/./lib/languages/lv.js","webpack://n2words/./lib/languages/pa-Guru.js","webpack://n2words/./lib/classes/south-asian-language.js","webpack://n2words/./lib/languages/he.js","webpack://n2words/./node_modules/core-js/internals/object-is-prototype-of.js","webpack://n2words/./node_modules/core-js/modules/es.set.union.v2.js","webpack://n2words/./node_modules/core-js/modules/es.iterator.map.js","webpack://n2words/./lib/languages/uk.js","webpack://n2words/./node_modules/core-js/internals/get-iterator-direct.js","webpack://n2words/./node_modules/core-js/internals/object-keys-internal.js","webpack://n2words/./lib/languages/ur.js","webpack://n2words/./node_modules/core-js/internals/define-built-in-accessor.js","webpack://n2words/./node_modules/core-js/internals/to-string-tag-support.js","webpack://n2words/./node_modules/core-js/internals/classof-raw.js","webpack://n2words/./lib/languages/fr.js","webpack://n2words/./node_modules/core-js/internals/correct-prototype-getter.js","webpack://n2words/./node_modules/core-js/internals/object-create.js","webpack://n2words/./lib/languages/ms.js","webpack://n2words/./node_modules/core-js/modules/es.set.is-superset-of.v2.js","webpack://n2words/./node_modules/core-js/internals/create-iter-result-object.js","webpack://n2words/./lib/languages/az.js","webpack://n2words/./lib/languages/sr-Latn.js","webpack://n2words/./node_modules/core-js/internals/iterate.js","webpack://n2words/./node_modules/core-js/internals/to-primitive.js","webpack://n2words/./node_modules/core-js/internals/object-get-prototype-of.js","webpack://n2words/./node_modules/core-js/internals/is-forced.js","webpack://n2words/./node_modules/core-js/internals/environment-user-agent.js","webpack://n2words/./lib/languages/ru.js","webpack://n2words/./lib/languages/bn.js","webpack://n2words/./lib/languages/gu.js","webpack://n2words/./lib/languages/te.js","webpack://n2words/./node_modules/core-js/internals/uid.js","webpack://n2words/./node_modules/core-js/internals/set-difference.js","webpack://n2words/./lib/languages/el.js","webpack://n2words/./node_modules/core-js/internals/set-symmetric-difference.js","webpack://n2words/./node_modules/core-js/internals/inspect-source.js","webpack://n2words/./node_modules/core-js/internals/object-get-own-property-symbols.js","webpack://n2words/./node_modules/core-js/internals/descriptors.js","webpack://n2words/./node_modules/core-js/internals/get-set-record.js","webpack://n2words/./node_modules/core-js/internals/set-is-subset-of.js","webpack://n2words/./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js","webpack://n2words/./lib/languages/de.js","webpack://n2words/./lib/classes/turkic-language.js","webpack://n2words/./lib/languages/id.js","webpack://n2words/./node_modules/core-js/internals/document-create-element.js","webpack://n2words/./lib/classes/greedy-scale-language.js","webpack://n2words/./lib/languages/th.js","webpack://n2words/./node_modules/core-js/modules/es.array.push.js","webpack://n2words/./node_modules/core-js/internals/is-null-or-undefined.js","webpack://n2words/./node_modules/core-js/internals/set-union.js","webpack://n2words/./node_modules/core-js/internals/is-array-iterator-method.js","webpack://n2words/./node_modules/core-js/internals/ordinary-to-primitive.js","webpack://n2words/./node_modules/core-js/internals/is-array.js","webpack://n2words/./node_modules/core-js/internals/set-helpers.js","webpack://n2words/./lib/languages/it.js","webpack://n2words/./node_modules/core-js/internals/set-is-disjoint-from.js","webpack://n2words/./lib/languages/ro.js","webpack://n2words/./node_modules/core-js/internals/symbol-constructor-detection.js","webpack://n2words/./node_modules/core-js/internals/array-set-length.js","webpack://n2words/./node_modules/core-js/internals/iterator-helper-without-closing-on-early-error.js","webpack://n2words/./node_modules/core-js/internals/global-this.js","webpack://n2words/./lib/languages/nl.js","webpack://n2words/./node_modules/core-js/internals/create-property.js","webpack://n2words/./node_modules/core-js/internals/is-callable.js","webpack://n2words/./node_modules/core-js/internals/object-define-property.js","webpack://n2words/./node_modules/core-js/internals/set-method-accept-set-like.js","webpack://n2words/./lib/languages/fil.js","webpack://n2words/./node_modules/core-js/modules/es.set.symmetric-difference.v2.js","webpack://n2words/./node_modules/core-js/internals/own-keys.js","webpack://n2words/./node_modules/core-js/internals/set-size.js","webpack://n2words/./lib/languages/ja.js","webpack://n2words/./node_modules/core-js/internals/to-indexed-object.js","webpack://n2words/./node_modules/core-js/internals/to-absolute-index.js","webpack://n2words/./lib/languages/tr.js","webpack://n2words/./node_modules/core-js/internals/shared.js","webpack://n2words/./lib/languages/pl.js","webpack://n2words/./lib/languages/fa.js","webpack://n2words/./node_modules/core-js/modules/es.set.is-subset-of.v2.js","webpack://n2words/./node_modules/core-js/internals/ie8-dom-define.js","webpack://n2words/./node_modules/core-js/internals/get-method.js","webpack://n2words/./node_modules/core-js/internals/function-bind-context.js","webpack://n2words/./lib/languages/hr.js","webpack://n2words/./node_modules/core-js/internals/shared-key.js","webpack://n2words/./node_modules/core-js/internals/length-of-array-like.js","webpack://n2words/./node_modules/core-js/internals/iterators.js","webpack://n2words/./node_modules/core-js/internals/define-built-ins.js","webpack://n2words/./lib/classes/abstract-language.js","webpack://n2words/./node_modules/core-js/internals/call-with-safe-iteration-closing.js","webpack://n2words/./lib/languages/sv.js","webpack://n2words/./node_modules/core-js/internals/is-pure.js","webpack://n2words/./lib/languages/fr-BE.js","webpack://n2words/./node_modules/core-js/internals/add-to-unscopables.js","webpack://n2words/./node_modules/core-js/internals/export.js","webpack://n2words/./lib/languages/cs.js","webpack://n2words/./node_modules/core-js/internals/create-non-enumerable-property.js","webpack://n2words/./node_modules/core-js/internals/function-uncurry-this-accessor.js","webpack://n2words/./node_modules/core-js/internals/object-define-properties.js","webpack://n2words/./node_modules/core-js/internals/try-to-string.js","webpack://n2words/./node_modules/core-js/internals/does-not-exceed-safe-integer.js","webpack://n2words/./node_modules/core-js/internals/define-built-in.js","webpack://n2words/./lib/languages/nb.js","webpack://n2words/./node_modules/core-js/internals/classof.js","webpack://n2words/./node_modules/core-js/internals/to-property-key.js","webpack://n2words/./node_modules/core-js/internals/create-property-descriptor.js","webpack://n2words/./node_modules/core-js/internals/use-symbol-as-uid.js","webpack://n2words/./node_modules/core-js/internals/indexed-object.js","webpack://n2words/./node_modules/core-js/internals/a-set.js","webpack://n2words/./lib/classes/slavic-language.js","webpack://n2words/./node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack://n2words/./node_modules/core-js/internals/function-uncurry-this-clause.js","webpack://n2words/./node_modules/core-js/internals/array-to-reversed.js","webpack://n2words/./node_modules/core-js/internals/shared-store.js","webpack://n2words/./node_modules/core-js/modules/es.set.difference.v2.js","webpack://n2words/./node_modules/core-js/internals/iterators-core.js","webpack://n2words/./node_modules/core-js/internals/copy-constructor-properties.js","webpack://n2words/./node_modules/core-js/internals/require-object-coercible.js","webpack://n2words/./node_modules/core-js/internals/get-built-in.js","webpack://n2words/./lib/languages/da.js","webpack://n2words/./node_modules/core-js/modules/es.set.intersection.v2.js","webpack://n2words/./node_modules/core-js/internals/to-length.js","webpack://n2words/./node_modules/core-js/modules/es.iterator.constructor.js","webpack://n2words/./node_modules/core-js/internals/well-known-symbol.js","webpack://n2words/./lib/languages/ko.js","webpack://n2words/./lib/languages/sw.js","webpack://n2words/./node_modules/core-js/internals/set-iterate.js","webpack://n2words/./node_modules/core-js/internals/object-get-own-property-names.js","webpack://n2words/./node_modules/core-js/internals/set-is-superset-of.js","webpack://n2words/./node_modules/core-js/internals/an-object.js","webpack://n2words/./node_modules/core-js/internals/weak-map-basic-detection.js","webpack://n2words/./lib/languages/es.js","webpack://n2words/./node_modules/core-js/internals/v8-prototype-define-bug.js","webpack://n2words/./node_modules/core-js/internals/enum-bug-keys.js","webpack://n2words/./node_modules/core-js/internals/set-intersection.js","webpack://n2words/./node_modules/core-js/internals/object-property-is-enumerable.js","webpack://n2words/./node_modules/core-js/internals/to-object.js","webpack://n2words/./node_modules/core-js/internals/fails.js","webpack://n2words/./node_modules/core-js/internals/set-clone.js","webpack://n2words/./node_modules/core-js/internals/has-own-property.js","webpack://n2words/./node_modules/core-js/internals/a-callable.js","webpack://n2words/./lib/languages/kn.js","webpack://n2words/./lib/languages/lt.js","webpack://n2words/./node_modules/core-js/internals/define-global-property.js","webpack://n2words/./node_modules/core-js/internals/iterator-create-proxy.js","webpack://n2words/./node_modules/core-js/internals/function-uncurry-this.js","webpack://n2words/./node_modules/core-js/internals/environment-v8-version.js","webpack://n2words/./node_modules/core-js/internals/iterator-close.js","webpack://n2words/./node_modules/core-js/internals/function-call.js","webpack://n2words/./node_modules/core-js/internals/array-includes.js","webpack://n2words/./node_modules/core-js/modules/es.array.to-reversed.js","webpack://n2words/./lib/languages/ta.js","webpack://n2words/./lib/languages/zh-Hans.js","webpack://n2words/./lib/languages/hu.js","webpack://n2words/./node_modules/core-js/internals/set-method-get-keys-before-cloning-detection.js","webpack://n2words/webpack/bootstrap","webpack://n2words/webpack/runtime/define property getters","webpack://n2words/webpack/runtime/hasOwnProperty shorthand","webpack://n2words/./lib/n2words.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"n2words\"] = factory();\n\telse\n\t\troot[\"n2words\"] = factory();\n})(globalThis, () => {\nreturn ","'use strict';\nvar isCallable = require('../internals/is-callable');\n\nmodule.exports = function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n throw new $TypeError(tryToString(argument) + ' is not iterable');\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar iterate = require('../internals/iterate');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar getIteratorDirect = require('../internals/get-iterator-direct');\nvar iteratorClose = require('../internals/iterator-close');\nvar iteratorHelperWithoutClosingOnEarlyError = require('../internals/iterator-helper-without-closing-on-early-error');\n\nvar findWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('find', TypeError);\n\n// `Iterator.prototype.find` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.find\n$({ target: 'Iterator', proto: true, real: true, forced: findWithoutClosingOnEarlyError }, {\n find: function find(predicate) {\n anObject(this);\n try {\n aCallable(predicate);\n } catch (error) {\n iteratorClose(this, 'throw', error);\n }\n\n if (findWithoutClosingOnEarlyError) return call(findWithoutClosingOnEarlyError, this, predicate);\n\n var record = getIteratorDirect(this);\n var counter = 0;\n return iterate(record, function (value, stop) {\n if (predicate(value, counter++)) return stop(value);\n }, { IS_RECORD: true, INTERRUPTED: true }).result;\n }\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\).*$/, '$1') + ']';\n }\n if (options && options.getter) name = 'get ' + name;\n if (options && options.setter) name = 'set ' + name;\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n else value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n } else if (value.prototype) value.prototype = undefined;\n } catch (error) { /* empty */ }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar call = require('../internals/function-call');\n\nmodule.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) {\n var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator;\n var next = record.next;\n var step, result;\n while (!(step = call(next, iterator)).done) {\n result = fn(step.value);\n if (result !== undefined) return result;\n }\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-function-prototype-bind -- safe\n var test = (function () { /* empty */ }).bind();\n // eslint-disable-next-line no-prototype-builtins -- safe\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n","import GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * English language converter.\n *\n * Converts numbers to English words, supporting:\n * - Negative numbers (prepended with \"minus\")\n * - Decimal numbers (word \"point\" between whole and fractional parts)\n * - Numbers up to octillions\n *\n * Merge rules:\n * - Hyphenated for compound tens (e.g., \"twenty-three\")\n * - \"and\" after hundreds (e.g., \"one hundred and one\")\n * - Space-separated for larger composites (e.g., \"one thousand twenty-three\")\n */\nexport class English extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'point'\n zeroWord = 'zero'\n scaleWordPairs = [\n [1_000_000_000_000_000_000_000_000_000n, 'octillion'],\n [1_000_000_000_000_000_000_000_000n, 'septillion'],\n [1_000_000_000_000_000_000_000n, 'sextillion'],\n [1_000_000_000_000_000_000n, 'quintillion'],\n [1_000_000_000_000_000n, 'quadrillion'],\n [1_000_000_000_000n, 'trillion'],\n [1_000_000_000n, 'billion'],\n [1_000_000n, 'million'],\n [1000n, 'thousand'],\n [100n, 'hundred'],\n [90n, 'ninety'],\n [80n, 'eighty'],\n [70n, 'seventy'],\n [60n, 'sixty'],\n [50n, 'fifty'],\n [40n, 'forty'],\n [30n, 'thirty'],\n [20n, 'twenty'],\n [19n, 'nineteen'],\n [18n, 'eighteen'],\n [17n, 'seventeen'],\n [16n, 'sixteen'],\n [15n, 'fifteen'],\n [14n, 'fourteen'],\n [13n, 'thirteen'],\n [12n, 'twelve'],\n [11n, 'eleven'],\n [10n, 'ten'],\n [9n, 'nine'],\n [8n, 'eight'],\n [7n, 'seven'],\n [6n, 'six'],\n [5n, 'five'],\n [4n, 'four'],\n [3n, 'three'],\n [2n, 'two'],\n [1n, 'one'],\n [0n, 'zero']\n ]\n\n /**\n * Merges two adjacent word-number pairs according to English grammar rules.\n *\n * English-specific rules:\n * - Implicit \"one\": `mergeScales({ 'one': 1n }, { 'hundred': 100n })` → `{ 'one hundred': 100n }`\n * - Hyphenated compounds: `mergeScales({ 'twenty': 20n }, { 'three': 3n })` → `{ 'twenty-three': 23n }`\n * - \"and\" after hundreds: `mergeScales({ 'one hundred': 100n }, { 'one': 1n })` → `{ 'one hundred and one': 101n }`\n * - Multiplication: `mergeScales({ 'one': 1n }, { 'thousand': 1000n })` → `{ 'one thousand': 1000n }`\n *\n * @param {Object} leftPair Left word-set as `{ word: BigInt }`.\n * @param {Object} rightPair Right word-set as `{ word: BigInt }`.\n * @returns {Object} Merged pair with combined word and resulting numeric value.\n *\n * @example\n * mergeScales({ 'one': 1n }, { 'hundred': 100n }); // { 'one hundred': 100n }\n * mergeScales({ 'twenty': 20n }, { 'three': 3n }); // { 'twenty-three': 23n }\n */\n mergeScales (leftPair, rightPair) {\n const leftWord = Object.keys(leftPair)[0]\n const leftNumber = Object.values(leftPair)[0]\n const rightWord = Object.keys(rightPair)[0]\n const rightNumber = Object.values(rightPair)[0]\n\n // Rule 1: Implicit \"one\" - omit when multiplying (\"one hundred\" → \"hundred\")\n if (leftNumber === 1n && rightNumber < 100n) {\n return { [rightWord]: rightNumber }\n }\n\n // Rule 2: Hyphenate compounds under 100 (\"twenty-three\")\n if (leftNumber < 100n && leftNumber > rightNumber) {\n return { [`${leftWord}-${rightWord}`]: leftNumber + rightNumber }\n }\n\n // Rule 3: Add \"and\" before units after hundreds (\"one hundred and one\")\n if (leftNumber >= 100n && rightNumber < 100n) {\n return { [`${leftWord} and ${rightWord}`]: leftNumber + rightNumber }\n }\n\n // Rule 4: Multiply when right > left (\"one thousand\")\n if (rightNumber > leftNumber) {\n return { [`${leftWord} ${rightWord}`]: leftNumber * rightNumber }\n }\n\n return { [`${leftWord} ${rightWord}`]: leftNumber + rightNumber }\n }\n}\n\n/**\n * Converts a number to English cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options] Conversion options (see English class options).\n * @returns {string} The number expressed in English words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(42); // 'forty-two'\n * convertToWords('1.5'); // 'one point five'\n */\nexport default function convertToWords (value, options = {}) {\n return new English(options).convertToWords(value)\n}\n","import SouthAsianLanguage from '../classes/south-asian-language.js'\n\nclass Hindi extends SouthAsianLanguage {\n negativeWord = 'माइनस'\n decimalSeparatorWord = 'दशमलव'\n zeroWord = 'शून्य'\n hundredWord = 'सौ'\n belowHundred = [\n 'शून्य',\n 'एक',\n 'दो',\n 'तीन',\n 'चार',\n 'पाँच',\n 'छह',\n 'सात',\n 'आठ',\n 'नौ',\n 'दस',\n 'ग्यारह',\n 'बारह',\n 'तेरह',\n 'चौदह',\n 'पंद्रह',\n 'सोलह',\n 'सत्रह',\n 'अठारह',\n 'उन्नीस',\n 'बीस',\n 'इक्कीस',\n 'बाईस',\n 'तेईस',\n 'चौबीस',\n 'पच्चीस',\n 'छब्बीस',\n 'सत्ताईस',\n 'अट्ठाईस',\n 'उनतीस',\n 'तीस',\n 'इकतीस',\n 'बत्तीस',\n 'तैंतीस',\n 'चौंतीस',\n 'पैंतीस',\n 'छत्तीस',\n 'सैंतीस',\n 'अड़तीस',\n 'उनतालीस',\n 'चालीस',\n 'इकतालीस',\n 'बयालीस',\n 'तेतालीस',\n 'चवालीस',\n 'पैंतालीस',\n 'छियालीस',\n 'सैंतालीस',\n 'अड़तालीस',\n 'उनचास',\n 'पचास',\n 'इक्यावन',\n 'बावन',\n 'तिरपन',\n 'चौवन',\n 'पचपन',\n 'छप्पन',\n 'सत्तावन',\n 'अट्ठावन',\n 'उनसठ',\n 'साठ',\n 'इकसठ',\n 'बासठ',\n 'तिरसठ',\n 'चौंसठ',\n 'पैंसठ',\n 'छियासठ',\n 'सड़सठ',\n 'अड़सठ',\n 'उनहत्तर',\n 'सत्तर',\n 'इकहत्तर',\n 'बहत्तर',\n 'तिहत्तर',\n 'चौहत्तर',\n 'पचहत्तर',\n 'छिहत्तर',\n 'सतहत्तर',\n 'अठहत्तर',\n 'उन्यासी',\n 'अस्सी',\n 'इक्यासी',\n 'बयासी',\n 'तिरासी',\n 'चौरासी',\n 'पचासी',\n 'छियासी',\n 'सत्तासी',\n 'अट्ठासी',\n 'नवासी',\n 'नब्बे',\n 'इक्यानवे',\n 'बानवे',\n 'तिरानवे',\n 'चौरानवे',\n 'पचानवे',\n 'छियानवे',\n 'सत्तानवे',\n 'अट्ठानवे',\n 'निन्यानवे'\n ]\n\n scaleWords = [\n '',\n 'हज़ार',\n 'लाख',\n 'करोड़',\n 'अरब',\n 'खरब',\n 'नील',\n 'पद्म',\n 'शंख'\n ]\n}\n\nexport default function convertToWords (value, options = {}) {\n return new Hindi(options).convertToWords(value)\n}\n","'use strict';\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it, Prototype) {\n if (isPrototypeOf(Prototype, it)) return it;\n throw new $TypeError('Incorrect invocation');\n};\n","'use strict';\n// Should throw an error on invalid iterator\n// https://issues.chromium.org/issues/336839115\nmodule.exports = function (methodName, argument) {\n // eslint-disable-next-line es/no-iterator -- required for testing\n var method = typeof Iterator == 'function' && Iterator.prototype[methodName];\n if (method) try {\n method.call({ next: null }, argument).next();\n } catch (error) {\n return true;\n }\n};\n","import GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * (European) Portuguese language converter.\n *\n * Features:\n * - Gender-aware hundreds (hundredos, duzentos, etc.)\n * - Million/Billion pluralization\n * - \"e\" (and) conjunction for number combinations\n * - Post-processing to normalize word flow\n */\nexport class Portuguese extends GreedyScaleLanguage {\n negativeWord = 'menos'\n decimalSeparatorWord = 'vírgula'\n zeroWord = 'zero'\n scaleWordPairs = [\n [1_000_000_000_000_000_000_000_000n, 'quatrilião'],\n [1_000_000_000_000_000_000n, 'trilião'],\n [1_000_000_000_000n, 'bilião'],\n [1_000_000n, 'milião'],\n [1000n, 'mil'],\n [100n, 'cem'],\n [90n, 'noventa'],\n [80n, 'oitenta'],\n [70n, 'setenta'],\n [60n, 'sessenta'],\n [50n, 'cinquenta'],\n [40n, 'quarenta'],\n [30n, 'trinta'],\n [20n, 'vinte'],\n [19n, 'dezanove'],\n [18n, 'dezoito'],\n [17n, 'dezassete'],\n [16n, 'dezasseis'],\n [15n, 'quinze'],\n [14n, 'catorze'],\n [13n, 'treze'],\n [12n, 'doze'],\n [11n, 'onze'],\n [10n, 'dez'],\n [9n, 'nove'],\n [8n, 'oito'],\n [7n, 'sete'],\n [6n, 'seis'],\n [5n, 'cinco'],\n [4n, 'quatro'],\n [3n, 'três'],\n [2n, 'dois'],\n [1n, 'um'],\n [0n, 'zero']\n ]\n\n hundreds = {\n 1: 'cento',\n 2: 'duzentos',\n 3: 'trezentos',\n 4: 'quatrocentos',\n 5: 'quinhentos',\n 6: 'seiscentos',\n 7: 'setecentos',\n 8: 'oitocentos',\n 9: 'novecentos'\n }\n\n // Pre-compiled regex patterns for postClean - avoid recompilation\n static POSTCLEAN_REGEX = / e (.*entos?) (?=.*e)/g\n\n finalizeWords (words) {\n return words.replaceAll(Portuguese.POSTCLEAN_REGEX, ' $1 ')\n }\n\n /**\n * Merges two adjacent word-number pairs according to Portuguese grammar rules.\n *\n * Portuguese-specific rules:\n * - Implicit \"um\": `mergeScales({ 'um': 1n }, { 'mil': 1000n })` → `{ 'mil': 1000n }`\n * - \"e\" (and) between most combinations: `mergeScales({ 'vinte': 20n }, { 'três': 3n })` → `{ 'vinte e três': 23n }`\n * - Special handling: \"cem\" (100) becomes \"cento\" when followed by non-thousands\n * - Gender-aware hundreds: \"duzentos\", \"trezentos\", etc.\n * - Million pluralization: \"milhões\" instead of \"milhão\" when coefficient > 1\n * - Post-processing with postClean() to normalize word flow\n *\n * @param {Object} current The left operand as `{ word: BigInt }`.\n * @param {Object} next The right operand as `{ word: BigInt }`.\n * @returns {Object} Merged pair with combined word and resulting numeric value.\n *\n * @example\n * mergeScales({ 'um': 1n }, { 'mil': 1000n }); // { 'mil': 1000n }\n * mergeScales({ 'vinte': 20n }, { 'dois': 2n }); // { 'vinte e dois': 22n }\n */\n mergeScales (current, next) {\n // Extract words and numeric values\n let cText = Object.keys(current)[0]\n let nText = Object.keys(next)[0]\n const cNumber = Object.values(current)[0] // BigInt\n const nNumber = Object.values(next)[0] // BigInt\n\n // Implicit \"um\": omit before millions (\"um milhão\" → \"milhão\")\n if (cNumber === 1n) {\n if (nNumber < 1_000_000n) return { [nText]: nNumber }\n cText = 'um'\n } else if (cNumber === 100n && nNumber % 1000n !== 0n) {\n // Special handling: \"cem\" (100) becomes \"cento\" when followed by non-thousands\n cText = 'cento'\n }\n\n if (nNumber < cNumber) {\n return { [`${cText} e ${nText}`]: cNumber + nNumber }\n }\n\n // Handle \"milião\" -> \"milhão\" conversion\n if (nText === 'milião') nText = 'milhão'\n\n // Pluralization logic for large numbers\n if (cNumber > 1n) {\n if (nNumber % 1_000_000_000n === 0n) {\n nText = nText.replace('bilião', 'biliões')\n } else if (nNumber % 1_000_000n === 0n) {\n nText = nText.replace('milhão', 'milhões')\n }\n }\n\n if (nNumber === 100n) {\n cText = this.hundreds[cNumber]\n return { [`${cText}`]: cNumber * nNumber }\n }\n\n return { [`${cText} ${nText}`]: cNumber * nNumber }\n }\n}\n\n/**\n * Converts a number to Portuguese cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options] Conversion options (see Portuguese class options).\n * @returns {string} The number expressed in Portuguese words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(42); // 'quarenta e dois'\n * convertToWords('100.5'); // 'cem vírgula cinco'\n */\nexport default function convertToWords (value, options = {}) {\n return new Portuguese(options).convertToWords(value)\n}\n","'use strict';\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n","'use strict';\nvar classof = require('../internals/classof');\nvar getMethod = require('../internals/get-method');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR)\n || getMethod(it, '@@iterator')\n || Iterators[classof(it)];\n};\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","import AbstractLanguage from '../classes/abstract-language.js'\n\n/**\n * Vietnamese language converter.\n *\n * Converts numbers to Vietnamese words following Vietnamese number naming:\n * - Base-10 grouping system (trăm = hundred, nghìn = thousand, triệu = million, tỷ = billion)\n * - Special pronunciation rules for 5 and 15 (lăm instead of năm)\n * - Special pronunciation for final 1 in compound numbers (mốt instead of một)\n * - \"Lẻ\" (odd/extra) used when tens place is zero but units exist\n *\n * Key Features:\n * - Base number mapping for 0-19 (with special forms)\n * - Tens mapping (hai mươi, ba mươi, etc.)\n * - Group-based algorithm:\n * 1. Split number into groups of 3 digits\n * 2. For each group, build words using special pronunciation rules:\n * - \"Mốt\" instead of \"một\" for final 1 (e.g., 21 → hai mươi mốt)\n * - \"Lăm\" instead of \"năm\" for 15 and mid-group 5 (e.g., 15, 105)\n * - \"Lẻ\" prefix when tens=0 but units>0 (e.g., 101 → một trăm lẻ một)\n * 3. Append magnitude word (nghìn/triệu/tỷ)\n * 4. Join all groups with spaces\n * - Support for large numbers up to vigintillions\n *\n * Features:\n * - Natural Vietnamese number flow\n * - Proper handling of special cases (mốt, lăm)\n * - Contextual pronunciation adjustments\n */\nexport class Vietnamese extends AbstractLanguage {\n negativeWord = 'âm'\n decimalSeparatorWord = 'phẩy'\n zeroWord = 'không'\n base = {\n 0: 'không',\n 1: 'một',\n 2: 'hai',\n 3: 'ba',\n 4: 'bốn',\n 5: 'năm',\n 6: 'sáu',\n 7: 'bảy',\n 8: 'tám',\n 9: 'chín',\n 10: 'mười',\n 11: 'mười một',\n 12: 'mười hai',\n 13: 'mười ba',\n 14: 'mười bốn',\n 15: 'mười lăm',\n 16: 'mười sáu',\n 17: 'mười bảy',\n 18: 'mười tám',\n 19: 'mười chín'\n }\n\n tens = {\n 20: 'hai mươi',\n 30: 'ba mươi',\n 40: 'bốn mươi',\n 50: 'năm mươi',\n 60: 'sáu mươi',\n 70: 'bảy mươi',\n 80: 'tám mươi',\n 90: 'chín mươi'\n }\n\n thousands = {\n 1: 'nghìn', // 10^1\n 2: 'triệu', // 10^2\n 3: 'tỷ', // 10^3\n 4: 'nghìn tỷ',\n 5: 'trăm nghìn tỷ',\n 6: 'Quintillion',\n 7: 'Sextillion',\n 8: 'Septillion',\n 9: 'Octillion',\n 10: 'Nonillion',\n 11: 'Decillion',\n 12: 'Undecillion',\n 13: 'Duodecillion',\n 14: 'Tredecillion',\n 15: 'Quattuordecillion',\n 16: 'Sexdecillion',\n 17: 'Septendecillion',\n 18: 'Octodecillion',\n 19: 'Novemdecillion',\n 20: 'Vigintillion'\n }\n\n /**\n * Convert numbers less than 100 to Vietnamese words.\n *\n * @param {number} number The number to convert (0-99).\n * @returns {string} The Vietnamese representation.\n */\n convertLess100 (number) {\n const unitsPart = number % 10\n const tensPart = number - unitsPart\n const tensPartText = this.tens[tensPart]\n if (unitsPart === 0) {\n return tensPartText\n }\n const unitsPartText = this.base[unitsPart]\n let suffix = unitsPartText\n if (unitsPart === 1) {\n suffix = 'mốt'\n }\n if (unitsPart === 5) {\n suffix = 'lăm'\n }\n return tensPartText + ' ' + suffix\n }\n\n /**\n * Convert numbers less than 1000 to Vietnamese words.\n *\n * @param {number} number The number to convert (0-999).\n * @returns {string} The Vietnamese representation.\n */\n convertLess1000 (number) {\n const words = []\n const tensUnitsPart = number % 100\n const hundredsPart = number - tensUnitsPart\n if (hundredsPart > 0) {\n words.push(this.base[hundredsPart / 100], 'trăm')\n }\n if (tensUnitsPart > 0 && tensUnitsPart < 10) {\n if (words.length > 0) {\n words.push('lẻ')\n }\n if (tensUnitsPart === 5) {\n words.push('năm')\n } else {\n words.push(this.base[tensUnitsPart])\n }\n }\n if (tensUnitsPart >= 10) {\n words.push(this.convertWholePart(tensUnitsPart))\n }\n return words.join(' ')\n }\n\n /**\n * Convert numbers greater than 1000 to Vietnamese words.\n *\n * @param {bigint} number The number to convert (>= 1000).\n * @returns {string} The Vietnamese representation.\n */\n convertMore1000 (number) {\n const words = []\n let division = number / 1000n\n let power = 1\n while (division >= 1000n) {\n division = division / 1000n\n power = power + 1\n }\n const r = number - (division * BigInt(Math.pow(1000, power)))\n words.push(this.convertWholePart(division), this.thousands[power])\n if (r > 0n) {\n if (r <= 99n) {\n words.push('lẻ')\n }\n words.push(this.convertWholePart(r))\n }\n return words.join(' ')\n }\n\n convertWholePart (number) {\n if (number < 20n) {\n return this.base[Number(number)]\n } else {\n if (number < 100n) {\n return this.convertLess100(Number(number))\n } else {\n return (number < 1000n ? this.convertLess1000(Number(number)) : this.convertMore1000(number))\n }\n }\n }\n}\n\n/**\n * Converts a number to Vietnamese cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options={}] Configuration options.\n * @returns {string} The number expressed in Vietnamese words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Vietnamese(options).convertToWords(value)\n}\n","'use strict';\nvar NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = globalThis.TypeError;\nvar WeakMap = globalThis.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw new TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n /* eslint-disable no-self-assign -- prototype methods protection */\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n /* eslint-enable no-self-assign -- prototype methods protection */\n set = function (it, metadata) {\n if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","'use strict';\nvar trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n","import AbstractLanguage from '../classes/abstract-language.js'\n\n/**\n * @typedef {Object} ArabicOptions\n * @property {string} [negativeWord='ناقص'] Word for negative numbers (minus).\n * @property {boolean} [feminine=false] Use feminine forms for numbers.\n */\n\n/**\n * Arabic language converter.\n *\n * Converts numbers to Arabic words with full grammatical support:\n * - Gender agreement (masculine/feminine forms)\n * - Complex pluralization rules (singular, dual, plural forms)\n * - Special handling for hundreds, thousands, millions, etc.\n * - Right-to-left text orientation\n * - Traditional Arabic number naming conventions\n *\n * Key Features:\n * - Gender-aware number forms (واحد masculine vs واحدة feminine)\n * - Dual forms: اثنان/اثنتان (two masculine/feminine)\n * - Complex rule system for numbers 3-10 (requiring feminine when referring to countables)\n * - Group-based algorithm: splits number by powers of 1000 (ones, thousands, millions, billions)\n * - Tanween (nunation) for indefinite numbers\n * - Sophisticated pluralization with singular, dual, and plural forms\n *\n * Algorithm:\n * 1. Break number into groups of 3 digits (right to left)\n * 2. For each non-zero group, convert to words using gender and plural rules\n * 3. Append the appropriate magnitude word (ألف/مليون/مليار) with proper plural form\n * 4. Join all groups with spaces\n *\n * Features:\n * - Support for gender-aware number forms\n * - Proper handling of Arabic dual forms (اثنان/اثنتان)\n * - Complex group processing for large numbers\n * - Right-to-left text orientation\n * - Traditional Arabic number naming conventions\n */\nexport class Arabic extends AbstractLanguage {\n decimalSeparatorWord = 'فاصلة'\n zeroWord = 'صفر'\n arabicTens = ['عشرون', 'ثلاثون', 'أربعون', 'خمسون', 'ستون', 'سبعون', 'ثمانون', 'تسعون']\n arabicHundreds = ['', 'مائة', 'مئتان', 'ثلاثمائة', 'أربعمائة', 'خمسمائة', 'ستمائة', 'سبعمائة', 'ثمانمائة', 'تسعمائة']\n arabicAppendedTwos = ['مئتا', 'ألفا', 'مليونا', 'مليارا', 'تريليونا', 'كوادريليونا', 'كوينتليونا', 'سكستيليونا']\n arabicTwos = ['مئتان', 'ألفان', 'مليونان', 'ملياران', 'تريليونان', 'كوادريليونان', 'كوينتليونان', 'سكستيليونان']\n arabicGroup = ['مائة', 'ألف', 'مليون', 'مليار', 'تريليون', 'كوادريليون', 'كوينتليون', 'سكستيليون']\n arabicAppendedGroup = ['', 'ألفاً', 'مليوناً', 'ملياراً', 'تريليوناً', 'كوادريليوناً', 'كوينتليوناً', 'سكستيليوناً']\n arabicPluralGroups = ['', 'آلاف', 'ملايين', 'مليارات', 'تريليونات', 'كوادريليونات', 'كوينتليونات', 'سكستيليونات']\n ones = {\n masculine: [\n 'واحد',\n 'اثنان',\n 'ثلاثة',\n 'أربعة',\n 'خمسة',\n 'ستة',\n 'سبعة',\n 'ثمانية',\n 'تسعة',\n 'عشرة',\n 'أحد عشر',\n 'اثنا عشر',\n 'ثلاثة عشر',\n 'أربعة عشر',\n 'خمسة عشر',\n 'ستة عشر',\n 'سبعة عشر',\n 'ثمانية عشر',\n 'تسعة عشر'\n ],\n feminine: [\n 'واحدة',\n 'اثنتان',\n 'ثلاث',\n 'أربع',\n 'خمس',\n 'ست',\n 'سبع',\n 'ثمان',\n 'تسع',\n 'عشر',\n 'إحدى عشرة',\n 'اثنتا عشرة',\n 'ثلاث عشرة',\n 'أربع عشرة',\n 'خمس عشرة',\n 'ست عشرة',\n 'سبع عشرة',\n 'ثماني عشرة',\n 'تسع عشرة'\n ]\n }\n\n /**\n * Initializes the Arabic converter with language-specific options.\n *\n * @param {ArabicOptions} [options={}] Configuration options.\n */\n constructor ({ negativeWord = 'ناقص', feminine = false } = {}) {\n super()\n\n this.feminine = feminine\n this.negativeWord = negativeWord\n\n this.selectedOnes = this.ones[this.feminine ? 'feminine' : 'masculine']\n }\n\n /**\n * Returns the feminine status of a given digit (1-9).\n *\n * @param {number} digit - The digit to check (1-9).\n * @returns {string} The word form of the digit based on feminine status.\n */\n digitFeminineStatus (digit) {\n return this.selectedOnes[digit - 1]\n }\n\n /**\n * Processes the Arabic group number and returns the corresponding Arabic representation.\n * @param {number} groupNumber - The number to process. (Range: 1-999)\n * @param {number} groupLevel - Group level to process. (See example)\n * @returns {string} The Arabic representation of the group number.\n * @example 12345678 is processed in blocks of 3: '678' (group 0), '345' (group 1), '12' (group 2).\n */\n processArabicGroup (groupNumber, groupLevel, fullNumber) {\n const tens = groupNumber % 100\n const hundredsRaw = groupNumber / 100\n const hundreds = Math.trunc(hundredsRaw)\n let returnValue = ''\n\n // Process hundreds\n if (hundreds > 0) {\n if (tens === 0 && hundreds === 2) {\n returnValue = this.arabicTwos[0]\n } else {\n const hundredsWord = this.arabicHundreds[hundreds]\n if (hundredsWord) {\n returnValue = hundredsWord\n if (tens !== 0) {\n returnValue += ' و'\n }\n }\n }\n }\n\n // Process tens and ones\n if (tens > 0) {\n if (tens < 20) { // 1 -> 19\n if (tens === 2 && hundreds === 0 && groupLevel > 0) {\n // Cache expensive log10 calculation\n const numValue = Number(fullNumber)\n const pow = Math.trunc(Math.log10(numValue))\n if (pow % 3 === 0 && fullNumber === BigInt(2 * Math.pow(10, pow))) {\n returnValue = groupNumber === 2 ? this.arabicTwos[groupLevel] : this.arabicAppendedTwos[groupLevel]\n } else {\n returnValue = this.arabicTwos[groupLevel]\n }\n } else if (tens === 1 && groupLevel > 0) {\n returnValue += this.arabicGroup[groupLevel]\n } else {\n returnValue += this.selectedOnes[tens - 1]\n }\n } else { // 20 -> 99\n const ones = tens % 10\n const tensIndex = Math.trunc(tens / 10) - 2\n\n if (ones > 0) {\n returnValue += this.selectedOnes[ones - 1]\n returnValue += ' و'\n }\n returnValue += this.arabicTens[tensIndex]\n }\n }\n\n return returnValue\n }\n\n /**\n * Converts a number to its cardinal representation in Arabic.\n * It process by blocks of 3 digits.\n * @param {bigint} number - The number to convert.\n * @returns {string} The cardinal representation of the number in Arabic.\n */\n convertWholePart (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n let temp = number\n let group = 0\n let result = ''\n\n // Process each group of 3 digits (right to left)\n while (temp > 0n) {\n const numberToProcess = Number(temp % 1000n)\n temp = temp / 1000n\n\n if (numberToProcess > 0) {\n const groupDescription = this.processArabicGroup(numberToProcess, group, number)\n\n if (groupDescription) {\n // Add group name for thousands, millions, etc.\n if (group > 0) {\n if (result) {\n result = ' و' + result\n }\n\n if (numberToProcess > 2) {\n const remainder = numberToProcess % 100\n if (remainder === 1) {\n result = this.arabicGroup[group] + ' ' + result\n } else if (numberToProcess >= 3 && numberToProcess <= 10) {\n result = this.arabicPluralGroups[group] + ' ' + result\n } else {\n result = (result ? this.arabicAppendedGroup[group] : this.arabicGroup[group]) + ' ' + result\n }\n }\n }\n\n // Add group description (prepend for RTL)\n result = groupDescription + ' ' + result\n }\n }\n\n group++\n }\n\n return result.replace(/\\s+/g, ' ').trim()\n }\n}\n\n/**\n * Converts a number to Arabic cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {ArabicOptions} [options={}] Configuration options.\n * @returns {string} The number expressed in Arabic words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Arabic(options).convertToWords(value)\n}\n","/**\n * Marathi language implementation for n2words\n *\n * Marathi uses Indian-style number grouping (3 digits, then 2-2 from right).\n * Numbers: शून्य (0), एक (1), दोन (2), तीन (3), चार (4), पाच (5)...\n *\n * @module lib/languages/mr\n * @example\n * import mr from './lib/languages/mr.js'\n * mr(42) // 'बेचाळीस'\n * mr(1000) // 'एक हजार'\n */\n\nimport SouthAsianLanguage from '../classes/south-asian-language.js'\n\n/**\n * Marathi language implementation\n * Extends SouthAsianLanguage for Indian-style grouping\n */\nclass MarathiLanguage extends SouthAsianLanguage {\n negativeWord = 'उणे'\n decimalSeparatorWord = 'दशांश'\n zeroWord = 'शून्य'\n hundredWord = 'शंभर'\n convertDecimalsPerDigit = true\n\n belowHundred = [\n 'शून्य',\n 'एक',\n 'दोन',\n 'तीन',\n 'चार',\n 'पाच',\n 'सहा',\n 'सात',\n 'आठ',\n 'नऊ',\n 'दहा',\n 'अकरा',\n 'बारा',\n 'तेरा',\n 'चौदा',\n 'पंधरा',\n 'सोळा',\n 'सतरा',\n 'अठरा',\n 'एकोणीस',\n 'वीस',\n 'एकवीस',\n 'बावीस',\n 'तेवीस',\n 'चोवीस',\n 'पंचवीस',\n 'सव्वीस',\n 'सत्तावीस',\n 'अठ्ठावीस',\n 'एकोणतीस',\n 'तीस',\n 'एकतीस',\n 'बत्तीस',\n 'तेहेतीस',\n 'चौतीस',\n 'पस्तीस',\n 'छत्तीस',\n 'सदतीस',\n 'अडतीस',\n 'एकोणचाळीस',\n 'चाळीस',\n 'एकेचाळीस',\n 'बेचाळीस',\n 'त्रेचाळीस',\n 'चव्वेचाळीस',\n 'पंचेचाळीस',\n 'सेहेचाळीस',\n 'सत्तेचाळीस',\n 'अठ्ठेचाळीस',\n 'एकोणपन्नास',\n 'पन्नास',\n 'एक्काव्वन',\n 'बावन्न',\n 'त्रेपन्न',\n 'चोपन्न',\n 'पंचाव्वन',\n 'छप्पन्न',\n 'सत्तावन्न',\n 'अठ्ठावन्न',\n 'एकोणसाठ',\n 'साठ',\n 'एकसष्ठ',\n 'बासष्ठ',\n 'त्रेसष्ठ',\n 'चौसष्ठ',\n 'पासष्ठ',\n 'सहासष्ठ',\n 'सदुसष्ठ',\n 'अडुसष्ठ',\n 'एकोणसत्तर',\n 'सत्तर',\n 'एकाहत्तर',\n 'बाहत्तर',\n 'त्र्याहत्तर',\n 'चौऱ्याहत्तर',\n 'पंच्याहत्तर',\n 'शहात्तर',\n 'सत्याहत्तर',\n 'अठ्ठ्याहत्तर',\n 'एकोणऐंशी',\n 'ऐंशी',\n 'एक्याऐंशी',\n 'ब्याऐंशी',\n 'त्र्याऐंशी',\n 'चौऱ्याऐंशी',\n 'पंच्याऐंशी',\n 'शहाऐंशी',\n 'सत्याऐंशी',\n 'अठ्ठ्याऐंशी',\n 'एकोणनव्वद',\n 'नव्वद',\n 'एक्याण्णव',\n 'ब्याण्णव',\n 'त्र्याण्णव',\n 'चौऱ्याण्णव',\n 'पंच्याण्णव',\n 'शहाण्णव',\n 'सत्याण्णव',\n 'अठ्ठ्याण्णव',\n 'नव्याण्णव'\n ]\n\n scaleWords = [\n '',\n 'हजार',\n 'लाख',\n 'कोटी',\n 'अब्ज',\n 'खर्व',\n 'निखर्व',\n 'महापद्म',\n 'शंकू'\n ]\n}\n\n/**\n * Convert a number to Marathi words\n *\n * @param {number|string|bigint} value - The number to convert\n * @param {Object} [options={}] - Conversion options\n * @returns {string} The Marathi word representation\n * @example\n * convertToWords(42) // 'बेचाळीस'\n * convertToWords(1000) // 'एक हजार'\n * convertToWords(100000) // 'एक लाख'\n */\nexport default function convertToWords (value, options = {}) {\n return new MarathiLanguage(options).convertToWords(value)\n}\n","'use strict';\nvar iteratorClose = require('../internals/iterator-close');\n\nmodule.exports = function (iters, kind, value) {\n for (var i = iters.length - 1; i >= 0; i--) {\n if (iters[i] === undefined) continue;\n try {\n value = iteratorClose(iters[i].iterator, kind, value);\n } catch (error) {\n kind = 'throw';\n value = error;\n }\n }\n if (kind === 'throw') throw value;\n return value;\n};\n","import SlavicLanguage from '../classes/slavic-language.js'\n\n/**\n * @typedef {Object} SlavicOptions\n * @property {boolean} [feminine=false] Use feminine forms for numbers.\n */\n\n/**\n * Latvian language converter.\n *\n * Implements Latvian number words using the Slavic language pattern:\n * - Latvian number words (viens, divi, trīs, četri, pieci...)\n * - Latvian-specific pluralization patterns\n * - Baltic grammatical structure\n * - Simplified gender handling compared to Lithuanian\n *\n * Key Features:\n * - Three-form pluralization system shared across Slavic/Baltic languages\n * * Form 1 (singular): 1 (e.g., \"tūkstotis\")\n * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., \"tūkstoši\")\n * * Form 3 (many): all other numbers (e.g., \"tūkstošu\")\n * - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)\n * - Large number handling via thousands[] array with indexed [singular, few, many] forms\n *\n * Features:\n * - Latvian diacritical marks (ī, ā, ē, ū, etc.)\n * - Three-form pluralization (adapted for Latvian)\n * - Baltic number naming conventions\n * - Compound number formation (divdesmit, trīsdesmit)\n *\n * Inherits from SlavicLanguage for pluralization algorithms.\n */\nexport class Latvian extends SlavicLanguage {\n negativeWord = 'mīnus'\n decimalSeparatorWord = 'komats'\n zeroWord = 'nulle'\n ones = {\n 1: 'viens',\n 2: 'divi',\n 3: 'trīs',\n 4: 'četri',\n 5: 'pieci',\n 6: 'seši',\n 7: 'septiņi',\n 8: 'astoņi',\n 9: 'deviņi'\n }\n\n tens = {\n 0: 'desmit',\n 1: 'vienpadsmit',\n 2: 'divpadsmit',\n 3: 'trīspadsmit',\n 4: 'četrpadsmit',\n 5: 'piecpadsmit',\n 6: 'sešpadsmit',\n 7: 'septiņpadsmit',\n 8: 'astoņpadsmit',\n 9: 'deviņpadsmit'\n }\n\n twenties = {\n 2: 'divdesmit',\n 3: 'trīsdesmit',\n 4: 'četrdesmit',\n 5: 'piecdesmit',\n 6: 'sešdesmit',\n 7: 'septiņdesmit',\n 8: 'astoņdesmit',\n 9: 'deviņdesmit'\n }\n\n hundreds = ['simts', 'simti', 'simtu']\n\n thousands = {\n 1: ['tūkstotis', 'tūkstoši', 'tūkstošu'],\n 2: ['miljons', 'miljoni', 'miljonu'],\n 3: ['miljards', 'miljardi', 'miljardu'],\n 4: ['triljons', 'triljoni', 'triljonu'],\n 5: ['kvadriljons', 'kvadriljoni', 'kvadriljonu'],\n 6: ['kvintiljons', 'kvintiljoni', 'kvintiljonu'],\n 7: ['sikstiljons', 'sikstiljoni', 'sikstiljonu'],\n 8: ['septiljons', 'septiljoni', 'septiljonu'],\n 9: ['oktiljons', 'oktiljoni', 'oktiljonu'],\n 10: ['nontiljons', 'nontiljoni', 'nontiljonu']\n }\n\n pluralize (n, forms) {\n if (n === 0n) {\n return forms[2]\n }\n\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if (lastDigit === 1n && lastTwoDigits !== 11n) {\n return forms[0]\n }\n\n return forms[1]\n }\n\n convertWholePart (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n const words = []\n const chunks = this.splitByX(number.toString(), 3)\n let index = chunks.length\n for (const x of chunks) {\n index = index - 1\n if (x === 0n) {\n continue\n }\n const [n1, n2, n3] = this.getDigits(x)\n if (n3 > 0n) {\n if (n3 === 1n && n2 === 0n && n1 > 0n) {\n words.push(this.hundreds[2])\n } else if (n3 > 1n) {\n words.push(this.ones[n3], this.hundreds[1])\n } else {\n words.push(this.hundreds[0])\n }\n }\n if (n2 > 1n) {\n words.push(this.twenties[n2])\n }\n if (n2 === 1n) {\n words.push(this.tens[n1])\n } else if (n1 > 0n && !(index > 0 && x === 1n)) {\n words.push(this.ones[n1])\n }\n if (index > 0) {\n words.push(this.pluralize(x, this.thousands[index]))\n }\n }\n return words.join(' ')\n }\n}\n\n/**\n * Converts a number to Latvian cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options={}] Configuration options.\n * @param {boolean} [options.feminine=false] Use feminine forms for numbers.\n * @returns {string} The number expressed in Latvian words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Latvian(options).convertToWords(value)\n}\n","import SouthAsianLanguage from '../classes/south-asian-language.js'\n\nclass Punjabi extends SouthAsianLanguage {\n negativeWord = 'ਮਾਇਨਸ'\n decimalSeparatorWord = 'ਦਸ਼ਮਲਵ'\n zeroWord = 'ਸਿਫ਼ਰ'\n hundredWord = 'ਸੌ'\n belowHundred = [\n 'ਸਿਫ਼ਰ',\n 'ਇੱਕ',\n 'ਦੋ',\n 'ਤਿੰਨ',\n 'ਚਾਰ',\n 'ਪੰਜ',\n 'ਛੇ',\n 'ਸੱਤ',\n 'ਅੱਠ',\n 'ਨੌਂ',\n 'ਦੱਸ',\n 'ਗਿਆਰਾਂ',\n 'ਬਾਰਾਂ',\n 'ਤੇਰਾਂ',\n 'ਚੌਦਾਂ',\n 'ਪੰਦਰਾਂ',\n 'ਸੋਲਾਂ',\n 'ਸਤਾਰਾਂ',\n 'ਅਠਾਰਾਂ',\n 'ਉੱਨੀ',\n 'ਵੀਹ',\n 'ਇੱਕੀ',\n 'ਬਾਈ',\n 'ਤੇਈ',\n 'ਚੌਬੀ',\n 'ਪੱਚੀ',\n 'ਛੱਬੀ',\n 'ਸਤਾਈ',\n 'ਅਠਾਈ',\n 'ਉਨੱਤੀ',\n 'ਤੀਹ',\n 'ਇਕੱਤੀ',\n 'ਬੱਤੀ',\n 'ਤੇਤੀ',\n 'ਚੌਂਤੀ',\n 'ਪੈਂਤੀ',\n 'ਛੱਤੀ',\n 'ਸੈਂਤੀ',\n 'ਅਠੱਤੀ',\n 'ਉਨਤਾਲੀ',\n 'ਚਾਲੀ',\n 'ਇਕਤਾਲੀ',\n 'ਬਿਆਲੀ',\n 'ਤਿਰਤਾਲੀ',\n 'ਚੁਵਾਲੀ',\n 'ਪੰਤਾਲੀ',\n 'ਛਿਆਲੀ',\n 'ਸੈਂਤਾਲੀ',\n 'ਅਠਤਾਲੀ',\n 'ਉਨੰਜਾ',\n 'ਪੰਜਾਹ',\n 'ਇਕਵੰਜਾ',\n 'ਬਵੰਜਾ',\n 'ਤਰਵੰਜਾ',\n 'ਚੁਰਵੰਜਾ',\n 'ਪੰਜਵੰਜਾ',\n 'ਛਪੰਜਾ',\n 'ਸੱਤਵੰਜਾ',\n 'ਅਠਵੰਜਾ',\n 'ਉਨਾਹਠ',\n 'ਸੱਠ',\n 'ਇਕਾਹਠ',\n 'ਬਾਹਠ',\n 'ਤਰਸਠ',\n 'ਚੌਂਸਠ',\n 'ਪੈਂਸਠ',\n 'ਛਿਆਸਠ',\n 'ਸੜਸਠ',\n 'ਅੜਸਠ',\n 'ਉਣਹੱਤਰ',\n 'ਸਤੱਰ',\n 'ਇਕਹੱਤਰ',\n 'ਬਹੱਤਰ',\n 'ਤਹੱਤਰ',\n 'ਚੌਹੱਤਰ',\n 'ਪੰਝਹੱਤਰ',\n 'ਛਿਹੱਤਰ',\n 'ਸਤੱਤਰ',\n 'ਅਠੱਤਰ',\n 'ਉਨਾਸੀ',\n 'ਅੱਸੀ',\n 'ਇਕਿਆਸੀ',\n 'ਬਿਆਸੀ',\n 'ਤਰਿਆਸੀ',\n 'ਚੌਰਿਆਸੀ',\n 'ਪਚਾਸੀ',\n 'ਛਿਆਸੀ',\n 'ਸੱਤਾਸੀ',\n 'ਅਠਾਸੀ',\n 'ਨਵਾਸੀ',\n 'ਨੱਬੇ',\n 'ਇਕਾਨਵੇਂ',\n 'ਬਾਨਵੇਂ',\n 'ਤਰਾਨਵੇਂ',\n 'ਚੁਰਾਨਵੇਂ',\n 'ਪੰਚਾਨਵੇਂ',\n 'ਛਿਆਨਵੇਂ',\n 'ਸਤਾਨਵੇਂ',\n 'ਅਠਾਨਵੇਂ',\n 'ਨਿਨਾਨਵੇਂ'\n ]\n\n scaleWords = [\n '',\n 'ਹਜ਼ਾਰ',\n 'ਲੱਖ',\n 'ਕਰੋੜ',\n 'ਅਰਬ',\n 'ਖਰਬ',\n 'ਨੀਲ',\n 'ਪਦਮ',\n 'ਸ਼ੰਖ'\n ]\n}\n\nexport default function convertToWords (value, options = {}) {\n return new Punjabi(options).convertToWords(value)\n}\n","import AbstractLanguage from './abstract-language.js'\n\n/**\n * @typedef {Array<string>} SouthAsianScaleWords\n * Array of scale words for the Indian numbering system, in ascending order.\n * - Index 0: Usually empty/unused (ones place)\n * - Index 1: Thousands (hazaar/হাজার/हजार)\n * - Index 2: Lakhs (lakh/লাখ/लाख)\n * - Index 3: Crores (crore/কোটি/करोड़)\n * - Index 4: Arabs (arab/আরব/अरब)\n * Each index i represents the scale word for groups at position i in the Indian system.\n */\n\n/**\n * @typedef {Array<string>} SouthAsianBelowHundred\n * Array of words for numbers 0-99, indexed directly.\n * belowHundred[0] = word for 0, belowHundred[42] = word for 42, etc.\n */\n\n/**\n * Base class for South Asian languages with shared grouping patterns.\n *\n * This class provides a reusable implementation for South Asian languages that share:\n * - Indian-style number grouping: last 3 digits, then 2-2 (1,23,45,67,89)\n * - Lakh (100,000), Crore (10,000,000), Arab (1,000,000,000) scale words\n * - Standard negative and decimal handling (inherits AbstractLanguage decimal logic,\n * including `convertDecimalsPerDigit` support when set by subclasses)\n *\n * Used by: Hindi (hi), Bengali (bn), Urdu (ur), Punjabi (pa), Marathi (mr), Gujarati (gu), Kannada (kn)\n *\n * Subclasses MUST define language-specific vocabulary via class properties:\n * - `belowHundred` array with digit and teen words (0-99)\n * - `hundredWord` string used inside `convertBelowThousand`\n * - `scaleWords` array with grouping words (hazaar, lakh, crore, etc.) indexed by grouping level\n * - `negativeWord`, `decimalSeparatorWord`, `zeroWord`, `wordSeparator`\n *\n * @abstract\n * @extends AbstractLanguage\n */\nclass SouthAsianLanguage extends AbstractLanguage {\n /**\n * Array of words for numbers 0-99 (digits and teens).\n * Index directly: belowHundred[0] through belowHundred[99].\n * @type {Array<string>}\n */\n belowHundred\n\n /**\n * Word for \"hundred\" in the language (e.g., 'सौ' in Hindi, 'শত' in Bengali).\n * Used to construct hundreds (e.g., \"1 hundred\", \"2 hundred\").\n * @type {string}\n */\n hundredWord\n\n /**\n * Array of scale words for Indian-style grouping (hazaar, lakh, crore, arab, etc.).\n * Index 0 is typically unused (ones place, no scale word).\n * Index 1 is for thousands, Index 2 for lakhs, Index 3 for crores, etc.\n * @type {Array<string>}\n */\n scaleWords\n\n /**\n * Split a number into Indian numbering system groups.\n *\n * The Indian system groups differently than Western (3-3-3) systems:\n * - First group (rightmost): Up to 3 digits (ones, tens, hundreds)\n * - Subsequent groups: Exactly 2 digits each (thousands, lakhs, crores, etc.)\n *\n * This creates the familiar Indian comma pattern: 1,23,45,67,890\n *\n * @protected\n * @param {bigint} number The number to split into groups\n * @returns {Array<number>} Array of groups from most significant to least significant\n *\n * @example\n * // splitToGroups(1234567n) → [12, 34, 567]\n * // Reads as: 12 lakhs, 34 thousands, 567 units\n * // splitToGroups(98765432n) → [9, 87, 65, 432]\n * // Reads as: 9 crores, 87 lakhs, 65 thousands, 432 units\n */\n splitToGroups (number) {\n const numStr = number.toString()\n\n if (numStr.length <= 3) {\n return [Number(numStr)]\n }\n\n const groups = []\n const last3 = numStr.slice(-3)\n groups.unshift(Number(last3))\n\n let remaining = numStr.slice(0, -3)\n while (remaining.length > 0) {\n const group = remaining.slice(-2)\n groups.unshift(Number(group))\n remaining = remaining.slice(0, -2)\n }\n\n return groups\n }\n\n /**\n * Convert a number below 1000 to words (0-999).\n *\n * @protected\n * @param {number} number Value between 0 and 999\n * @returns {string} Language-specific word representation\n */\n convertBelowThousand (number) {\n if (number === 0) return ''\n if (number < 100) return this.belowHundred[number]\n\n const hundreds = Math.trunc(number / 100)\n const remainder = number % 100\n const parts = []\n\n if (hundreds === 1) {\n parts.push(this.belowHundred[1] + ' ' + this.hundredWord)\n } else {\n parts.push(this.belowHundred[hundreds] + ' ' + this.hundredWord)\n }\n\n if (remainder > 0) {\n parts.push(this.belowHundred[remainder])\n }\n\n return parts.join(' ')\n }\n\n /**\n * Convert whole number to cardinal words using South Asian grouping.\n *\n * @param {bigint} number Number to convert\n * @returns {string} Cardinal representation\n */\n convertWholePart (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n\n const groups = this.splitToGroups(number)\n const groupCount = groups.length\n const words = []\n\n for (let i = 0; i < groupCount; i++) {\n const groupValue = groups[i]\n if (groupValue === 0) continue\n\n const scaleIndex = groupCount - i - 1\n words.push(this.convertBelowThousand(groupValue))\n if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {\n words.push(this.scaleWords[scaleIndex])\n }\n }\n\n return words.join(' ').trim()\n }\n}\n\nexport default SouthAsianLanguage\n","import SlavicLanguage from '../classes/slavic-language.js'\n\n/**\n * @typedef {Object} HebrewOptions\n * @property {string} [and='ו'] Conjunction character (typically 'ו' for and).\n * @property {boolean} [biblical=false] Use biblical scale words instead of modern ones.\n * @property {boolean} [feminine=false] Use feminine forms for numbers.\n */\n\n/**\n * Hebrew language converter.\n *\n * Implements Hebrew number words using the Slavic language pattern:\n * - Hebrew alphabet and right-to-left text\n * - Hebrew number words (אחת, שתים, שלוש, ארבע...)\n * - Feminine number forms (default in Hebrew)\n * - Optional \"ve\" (ו, \"and\") conjunction between number groups\n *\n * Key Features:\n * - Three-form pluralization system shared across Slavic languages\n * * Form 1 (singular): 1 (e.g., \"אלף\")\n * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., \"אלפים\")\n * * Form 3 (many): all other numbers (e.g., \"אלף\")\n * - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)\n * - Large number handling via thousands[] array with indexed [singular, few, many] forms\n *\n * Features:\n * - Right-to-left text orientation\n * - Feminine grammatical gender for numbers\n * - Three-form pluralization (similar to Slavic pattern)\n * - Conjunction control via \"and\" option\n *\n * Inherits from SlavicLanguage for complex pluralization algorithms.\n */\nexport class Hebrew extends SlavicLanguage {\n negativeWord = 'מינוס'\n decimalSeparatorWord = 'נקודה'\n zeroWord = 'אפס'\n convertDecimalsPerDigit = true\n\n // Modern Hebrew (feminine forms)\n ones = {\n 1: 'אחת',\n 2: 'שתים',\n 3: 'שלש',\n 4: 'ארבע',\n 5: 'חמש',\n 6: 'שש',\n 7: 'שבע',\n 8: 'שמונה',\n 9: 'תשע'\n }\n\n tens = {\n 0: 'עשר',\n 1: 'אחת עשרה',\n 2: 'שתים עשרה',\n 3: 'שלש עשרה',\n 4: 'ארבע עשרה',\n 5: 'חמש עשרה',\n 6: 'שש עשרה',\n 7: 'שבע עשרה',\n 8: 'שמונה עשרה',\n 9: 'תשע עשרה'\n }\n\n twenties = {\n 2: 'עשרים',\n 3: 'שלשים',\n 4: 'ארבעים',\n 5: 'חמישים',\n 6: 'ששים',\n 7: 'שבעים',\n 8: 'שמונים',\n 9: 'תשעים'\n }\n\n hundreds = {\n 1: 'מאה',\n 2: 'מאתיים',\n 3: 'מאות'\n }\n\n thousands = {\n 1: 'אלף',\n 2: 'אלפיים',\n 3: 'שלשת אלפים',\n 4: 'ארבעת אלפים',\n 5: 'חמשת אלפים',\n 6: 'ששת אלפים',\n 7: 'שבעת אלפים',\n 8: 'שמונת אלפים',\n 9: 'תשעת אלפים'\n }\n\n scale = {\n 1: 'אלף', // thousand (singular)\n 2: 'מיליון', // million\n 3: 'מיליארד', // billion\n 4: 'טריליון', // trillion\n 5: 'קוודרליון', // quadrillion\n 6: 'קווינטיליון' // quintillion\n }\n\n scalePlural = {\n 1: 'אלפים', // thousands\n 2: 'מיליונים', // millions\n 3: 'מיליארדים', // billions\n 4: 'טריליונים', // trillions\n 5: 'קוודרליונים', // quadrillions\n 6: 'קווינטיליונים' // quintillions\n }\n\n // Biblical Hebrew (masculine forms)\n biblicalOnes = {\n 1: 'אחד',\n 2: 'שניים',\n 3: 'שלשה',\n 4: 'ארבעה',\n 5: 'חמשה',\n 6: 'ששה',\n 7: 'שבעה',\n 8: 'שמונה',\n 9: 'תשעה'\n }\n\n biblicalTens = {\n 0: 'עשרה',\n 1: 'אחד עשר',\n 2: 'שנים עשר',\n 3: 'שלשה עשר',\n 4: 'ארבעה עשר',\n 5: 'חמשה עשר',\n 6: 'ששה עשר',\n 7: 'שבעה עשר',\n 8: 'שמונה עשר',\n 9: 'תשעה עשר'\n }\n\n biblicalTwenties = {\n 2: 'עשרים',\n 3: 'שלשים',\n 4: 'ארבעים',\n 5: 'חמישים',\n 6: 'ששים',\n 7: 'שבעים',\n 8: 'שמונים',\n 9: 'תשעים'\n }\n\n biblicalHundreds = {\n 1: 'מאה',\n 2: 'מאתיים',\n 3: 'מאות'\n }\n\n biblicalThousands = {\n 1: 'אלף',\n 2: 'אלפיים',\n 3: 'שלשת אלפים',\n 4: 'ארבעת אלפים',\n 5: 'חמשת אלפים',\n 6: 'ששת אלפים',\n 7: 'שבעת אלפים',\n 8: 'שמונת אלפים',\n 9: 'תשעת אלפים'\n }\n\n biblicalScale = {\n 1: 'אלף',\n 2: 'מיליון',\n 3: 'מיליארד',\n 4: 'טריליון',\n 5: 'קוודרליון',\n 6: 'קווינטיליון'\n }\n\n biblicalScalePlural = {\n 1: 'אלפים',\n 2: 'מיליונים',\n 3: 'מיליארדים',\n 4: 'טריליונים',\n 5: 'קוודרליונים',\n 6: 'קווינטיליונים'\n }\n\n /**\n * Initializes the Hebrew converter with language-specific options.\n *\n * @param {HebrewOptions} [options={}] Configuration options.\n */\n constructor ({ and = 'ו', biblical = false, feminine = false } = {}) {\n super({ feminine })\n\n this.and = and\n this.feminine = feminine\n\n this.biblical = biblical\n if (this.biblical) {\n this.ones = this.biblicalOnes\n this.tens = this.biblicalTens\n this.twenties = this.biblicalTwenties\n this.hundreds = this.biblicalHundreds\n this.thousands = this.biblicalThousands\n this.scale = this.biblicalScale\n this.scalePlural = this.biblicalScalePlural\n }\n }\n\n convertWholePart (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n const words = []\n const chunks = this.splitByX(number.toString(), 3)\n let index = chunks.length\n for (const x of chunks) {\n index = index - 1\n if (x === 0n) {\n continue\n }\n\n const [n1, n2, n3] = this.getDigits(x)\n\n if (index > 0) {\n // For thousands and above, handle the full chunk value\n const chunkWords = []\n let hasHundreds = false\n\n // Process hundreds in this chunk\n if (n3 > 0n) {\n hasHundreds = true\n if (n3 <= 2n) {\n chunkWords.push(this.hundreds[n3])\n } else {\n chunkWords.push(this.ones[n3] + ' ' + this.hundreds[3])\n }\n }\n\n // Process tens in this chunk\n if (n2 > 1n) {\n // Add conjunction if there were hundreds before\n const tensWord = this.twenties[n2]\n chunkWords.push(hasHundreds ? this.and + tensWord : tensWord)\n }\n\n // Process ones in this chunk\n if (n2 === 1n) {\n // Add conjunction if there were hundreds before\n const onesWord = this.tens[n1]\n chunkWords.push(hasHundreds ? this.and + onesWord : onesWord)\n } else if (n1 > 0n) {\n // For \"one million\", \"one billion\", etc., don't add the word \"one\"\n if (x === 1n && index > 1) {\n // Skip adding \"one\" for millions/billions/etc.\n } else if (x <= 9n && chunkWords.length === 0 && index === 1) {\n // Use special forms for 1-9 thousand\n chunkWords.push(this.thousands[n1])\n } else {\n const onesWord = this.ones[n1]\n // Add conjunction if there were hundreds or tens before\n chunkWords.push((hasHundreds || n2 > 0n) ? this.and + onesWord : onesWord)\n }\n }\n\n // Add scale word (thousand, million, billion, etc.)\n if (x > 9n || index > 1) {\n // For numbers > 9 or higher scales, use appropriate scale word\n if (x === 1n) {\n // Singular form (e.g., \"one thousand\", \"one million\")\n chunkWords.push(this.scale[index])\n } else if (x === 2n && index === 1) {\n // Special dual form for \"two thousand\" (already in thousands[2])\n return [this.thousands[2], ...words].join(' ')\n } else if (x === 2n) {\n // For two million, two billion, etc. - use plural form\n chunkWords.push(this.scalePlural[index])\n } else if (index === 1) {\n // For thousands (10+), always use singular \"אלף\"\n chunkWords.push(this.scale[index])\n } else {\n // For millions/billions/etc. use plural form\n chunkWords.push(this.scalePlural[index])\n }\n }\n\n words.push(chunkWords.join(' '))\n continue\n }\n\n if (n3 > 0n) {\n if (n3 <= 2n) {\n words.push(this.hundreds[n3])\n } else {\n words.push(this.ones[n3] + ' ' + this.hundreds[3])\n }\n }\n\n if (n2 > 1n) {\n words.push(this.twenties[n2])\n }\n\n if (n2 === 1n) {\n words.push(this.tens[n1])\n } else if (n1 > 0n) {\n words.push(this.ones[n1])\n }\n }\n\n if (words.length > 1) {\n words[words.length - 1] = this.and + words.at(-1)\n }\n\n return words.join(' ')\n }\n}\n\n/**\n * Converts a number to Hebrew cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {HebrewOptions} [options={}] Configuration options.\n * @returns {string} The number expressed in Hebrew words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Hebrew(options).convertToWords(value)\n}\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","'use strict';\nvar $ = require('../internals/export');\nvar union = require('../internals/set-union');\nvar setMethodGetKeysBeforeCloning = require('../internals/set-method-get-keys-before-cloning-detection');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar FORCED = !setMethodAcceptSetLike('union') || !setMethodGetKeysBeforeCloning('union');\n\n// `Set.prototype.union` method\n// https://tc39.es/ecma262/#sec-set.prototype.union\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n union: union\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar getIteratorDirect = require('../internals/get-iterator-direct');\nvar createIteratorProxy = require('../internals/iterator-create-proxy');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar iteratorClose = require('../internals/iterator-close');\nvar iteratorHelperThrowsOnInvalidIterator = require('../internals/iterator-helper-throws-on-invalid-iterator');\nvar iteratorHelperWithoutClosingOnEarlyError = require('../internals/iterator-helper-without-closing-on-early-error');\nvar IS_PURE = require('../internals/is-pure');\n\nvar MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('map', function () { /* empty */ });\nvar mapWithoutClosingOnEarlyError = !IS_PURE && !MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR\n && iteratorHelperWithoutClosingOnEarlyError('map', TypeError);\n\nvar FORCED = IS_PURE || MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR || mapWithoutClosingOnEarlyError;\n\nvar IteratorProxy = createIteratorProxy(function () {\n var iterator = this.iterator;\n var result = anObject(call(this.next, iterator));\n var done = this.done = !!result.done;\n if (!done) return callWithSafeIterationClosing(iterator, this.mapper, [result.value, this.counter++], true);\n});\n\n// `Iterator.prototype.map` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.map\n$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, {\n map: function map(mapper) {\n anObject(this);\n try {\n aCallable(mapper);\n } catch (error) {\n iteratorClose(this, 'throw', error);\n }\n\n if (mapWithoutClosingOnEarlyError) return call(mapWithoutClosingOnEarlyError, this, mapper);\n\n return new IteratorProxy(getIteratorDirect(this), {\n mapper: mapper\n });\n }\n});\n","import SlavicLanguage from '../classes/slavic-language.js'\n\n/**\n * @typedef {Object} SlavicOptions\n * @property {boolean} [feminine=false] Use feminine forms for numbers.\n */\n\n/**\n * Ukrainian language converter.\n *\n * Implements Ukrainian number words using the Slavic language pattern:\n * - Ukrainian number words (один/одна, два/дві, три, чотири...)\n * - Gender-aware forms (masculine/feminine)\n * - Slavic three-form pluralization (тисяча/тисячі/тисяч)\n * - Ukrainian orthography and phonology\n *\n * Key Features:\n * - Three-form pluralization system shared across Slavic languages\n * * Form 1 (singular): 1 (e.g., \"тисяча\")\n * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., \"тисячі\")\n * * Form 3 (many): all other numbers (e.g., \"тисяч\")\n * - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)\n * - Large number handling via thousands[] array with indexed [singular, few, many] forms\n *\n * Features:\n * - Ukrainian-specific letters (і, ї, ґ, є)\n * - Apostrophe usage (п'ять, дев'ять)\n * - Close structural similarity to Russian with distinct vocabulary\n *\n * Inherits from SlavicLanguage for complex pluralization algorithms.\n */\nexport class Ukrainian extends SlavicLanguage {\n negativeWord = 'мiнус'\n decimalSeparatorWord = 'кома'\n zeroWord = 'нуль'\n ones = {\n 1: 'один',\n 2: 'два',\n 3: 'три',\n 4: 'чотири',\n 5: 'п\\'ять',\n 6: 'шiсть',\n 7: 'сiм',\n 8: 'вiсiм',\n 9: 'дев\\'ять'\n }\n\n onesFeminine = {\n 1: 'одна',\n 2: 'двi',\n 3: 'три',\n 4: 'чотири',\n 5: 'п\\'ять',\n 6: 'шiсть',\n 7: 'сiм',\n 8: 'вiсiм',\n 9: 'дев\\'ять'\n }\n\n tens = {\n 0: 'десять',\n 1: 'одинадцять',\n 2: 'дванадцять',\n 3: 'тринадцять',\n 4: 'чотирнадцять',\n 5: 'п\\'ятнадцять',\n 6: 'шiстнадцять',\n 7: 'сiмнадцять',\n 8: 'вiсiмнадцять',\n 9: 'дев\\'ятнадцять'\n }\n\n twenties = {\n 2: 'двадцять',\n 3: 'тридцять',\n 4: 'сорок',\n 5: 'п\\'ятдесят',\n 6: 'шiстдесят',\n 7: 'сiмдесят',\n 8: 'вiсiмдесят',\n 9: 'дев\\'яносто'\n }\n\n hundreds = {\n 1: 'сто',\n 2: 'двiстi',\n 3: 'триста',\n 4: 'чотириста',\n 5: 'п\\'ятсот',\n 6: 'шiстсот',\n 7: 'сiмсот',\n 8: 'вiсiмсот',\n 9: 'дев\\'ятсот'\n }\n\n thousands = {\n 1: ['тисяча', 'тисячi', 'тисяч'], // 10^ 3\n 2: ['мiльйон', 'мiльйони', 'мiльйонiв'], // 10^ 6\n 3: ['мiльярд', 'мiльярди', 'мiльярдiв'], // 10^ 9\n 4: ['трильйон', 'трильйони', 'трильйонiв'], // 10^ 12\n 5: ['квадрильйон', 'квадрильйони', 'квадрильйонiв'], // 10^ 15\n 6: ['квiнтильйон', 'квiнтильйони', 'квiнтильйонiв'], // 10^ 18\n 7: ['секстильйон', 'секстильйони', 'секстильйонiв'], // 10^ 21\n 8: ['септильйон', 'септильйони', 'септильйонiв'], // 10^ 24\n 9: ['октильйон', 'октильйони', 'октильйонiв'], // 10^ 27\n 10: ['нонiльйон', 'нонiльйони', 'нонiльйонiв'] // 10^ 30\n }\n}\n\n/**\n * Converts a number to Ukrainian cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options={}] Configuration options.\n * @param {boolean} [options.feminine=false] Use feminine forms for numbers.\n * @returns {string} The number expressed in Ukrainian words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Ukrainian(options).convertToWords(value)\n}\n","'use strict';\n// `GetIteratorDirect(obj)` abstract operation\n// https://tc39.es/ecma262/#sec-getiteratordirect\nmodule.exports = function (obj) {\n return {\n iterator: obj,\n next: obj.next,\n done: false\n };\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n","import SouthAsianLanguage from '../classes/south-asian-language.js'\n\nclass Urdu extends SouthAsianLanguage {\n negativeWord = 'منفی'\n decimalSeparatorWord = 'اعشاریہ'\n zeroWord = 'صفر'\n hundredWord = 'سو'\n belowHundred = [\n 'صفر',\n 'ایک',\n 'دو',\n 'تین',\n 'چار',\n 'پانچ',\n 'چھ',\n 'سات',\n 'آٹھ',\n 'نو',\n 'دس',\n 'گیارہ',\n 'بارہ',\n 'تیرہ',\n 'چودہ',\n 'پندرہ',\n 'سولہ',\n 'سترہ',\n 'اٹھارہ',\n 'انیس',\n 'بیس',\n 'اکیس',\n 'بائیس',\n 'تیئیس',\n 'چوبیس',\n 'پچیس',\n 'چھبیس',\n 'ستائیس',\n 'اٹھائیس',\n 'انتیس',\n 'تیس',\n 'اکتیس',\n 'بتیس',\n 'تینتیس',\n 'چونتیس',\n 'پینتیس',\n 'چھتیس',\n 'سینتیس',\n 'اڑتیس',\n 'انتالیس',\n 'چالیس',\n 'اکتالیس',\n 'بیالیس',\n 'تینتالیس',\n 'چوالیس',\n 'پینتالیس',\n 'چھالیس',\n 'سینتالیس',\n 'اڑتالیس',\n 'انچاس',\n 'پچاس',\n 'اکاون',\n 'باون',\n 'ترپن',\n 'چون',\n 'پچپن',\n 'چھپن',\n 'ستاون',\n 'اٹھاون',\n 'انسٹھ',\n 'ساٹھ',\n 'اکسٹھ',\n 'باسٹھ',\n 'ترسٹھ',\n 'چونسٹھ',\n 'پینسٹھ',\n 'چھیاسٹھ',\n 'سڑسٹھ',\n 'اڑسٹھ',\n 'انہتر',\n 'ستر',\n 'اکہتر',\n 'بہتر',\n 'تہتر',\n 'چوہتر',\n 'پچھتر',\n 'چھہتر',\n 'ستتر',\n 'اٹھہتر',\n 'اناسی',\n 'اسی',\n 'اکیاسی',\n 'بیاسی',\n 'تریاسی',\n 'چوراسی',\n 'پچاسی',\n 'چھیاسی',\n 'ستاسی',\n 'اٹھاسی',\n 'نواسی',\n 'نوے',\n 'اکانوے',\n 'بانوے',\n 'ترانوے',\n 'چورانوے',\n 'پچانوے',\n 'چھیانوے',\n 'ستانوے',\n 'اٹھانوے',\n 'ننانوے'\n ]\n\n scaleWords = [\n '',\n 'ہزار',\n 'لاکھ',\n 'کروڑ',\n 'ارب',\n 'کھرب',\n 'نیل',\n 'پدم',\n 'شنکھ'\n ]\n}\n\nexport default function convertToWords (value, options = {}) {\n return new Urdu(options).convertToWords(value)\n}\n","'use strict';\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineProperty = require('../internals/object-define-property');\n\nmodule.exports = function (target, name, descriptor) {\n if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true });\n if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true });\n return defineProperty.f(target, name, descriptor);\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n// eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n","import GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * @typedef {Object} FrenchOptions\n * @property {boolean} [withHyphenSeparator=false] Use hyphens (true) instead of spaces (false) in compounds.\n */\n\n/**\n * French language converter.\n *\n * Special handling:\n * - Pluralization of \"cent\" (hundred) and other words\n * - \"et\" (and) before odd numbers in tens place\n * - Hyphenation for compound numbers\n * - Regional number word variations\n */\nexport class French extends GreedyScaleLanguage {\n negativeWord = 'moins'\n decimalSeparatorWord = 'virgule'\n zeroWord = 'zéro'\n scaleWordPairs = [\n [1_000_000_000_000_000_000_000_000_000n, 'quadrilliard'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillion'],\n [1_000_000_000_000_000_000_000n, 'trilliard'],\n [1_000_000_000_000_000_000n, 'trillion'],\n [1_000_000_000_000_000n, 'billiard'],\n [1_000_000_000_000n, 'billion'],\n [1_000_000_000n, 'milliard'],\n [1_000_000n, 'million'],\n [1000n, 'mille'],\n [100n, 'cent'],\n [],\n [80n, 'quatre-vingts'],\n [],\n [60n, 'soixante'],\n [50n, 'cinquante'],\n [40n, 'quarante'],\n [30n, 'trente'],\n [20n, 'vingt'],\n [19n, 'dix-neuf'],\n [18n, 'dix-huit'],\n [17n, 'dix-sept'],\n [16n, 'seize'],\n [15n, 'quinze'],\n [14n, 'quatorze'],\n [13n, 'treize'],\n [12n, 'douze'],\n [11n, 'onze'],\n [10n, 'dix'],\n [9n, 'neuf'],\n [8n, 'huit'],\n [7n, 'sept'],\n [6n, 'six'],\n [5n, 'cinq'],\n [4n, 'quatre'],\n [3n, 'trois'],\n [2n, 'deux'],\n [1n, 'un'],\n [0n, 'zéro']\n ]\n\n /**\n * Initializes the French converter with language-specific options.\n *\n * @param {FrenchOptions} [options={}] Configuration options.\n */\n constructor ({ withHyphenSeparator = false } = {}) {\n super()\n\n this.withHyphenSeparator = withHyphenSeparator\n\n if (this.withHyphenSeparator) {\n this.wordSeparator = '-'\n }\n }\n\n /**\n * Merges two adjacent word-number pairs according to French grammar rules.\n *\n * French-specific rules:\n * - Removes trailing 's' from multiples of 80 or 100 when followed by smaller numbers\n * - Adds 's' to hundreds when appropriate\n * - Uses \"et\" (and) when joining odd numbers to tens (e.g., \"vingt et un\")\n * - Hyphens for compound tens (e.g., \"vingt-deux\")\n *\n * @param {Object} currentPair The left operand as `{ word: number }`.\n * @param {Object} nextPair The right operand as `{ word: number }`.\n * @returns {Object} Merged pair with combined word and resulting number.\n */\n mergeScales (currentPair, nextPair) {\n let currentWord = Object.keys(currentPair)[0]\n let nextWord = Object.keys(nextPair)[0]\n const currentNumber = Object.values(currentPair)[0]\n const nextNumber = Object.values(nextPair)[0]\n\n if (currentNumber === 1n) {\n if (nextNumber < 1_000_000n) {\n return nextPair\n }\n } else {\n if (\n ((currentNumber - 80n) % 100n === 0n || (currentNumber % 100n === 0n && currentNumber < 1000n)) &&\n nextNumber < 1_000_000n &&\n currentWord.at(-1) === 's'\n ) {\n currentWord = currentWord.slice(0, -1)\n }\n\n if (\n currentNumber < 1000n && nextNumber !== 1000n &&\n nextWord.at(-1) !== 's' &&\n nextNumber % 100n === 0n\n ) {\n nextWord += 's'\n }\n }\n\n if (nextNumber < currentNumber && currentNumber < 100n) {\n if (nextNumber % 10n === 1n && currentNumber !== 80n) {\n return { [`${currentWord}${this.wordSeparator}et${this.wordSeparator}${nextWord}`]: currentNumber + nextNumber }\n }\n return { [`${currentWord}-${nextWord}`]: currentNumber + nextNumber }\n }\n\n if (nextNumber > currentNumber) return { [`${currentWord}${this.wordSeparator}${nextWord}`]: currentNumber * nextNumber }\n return { [`${currentWord}${this.wordSeparator}${nextWord}`]: currentNumber + nextNumber }\n }\n}\n\n/**\n * Converts a number to French cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options] Conversion options (see FR class).\n * @returns {string} The number expressed in French words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(42, { lang: 'fr' }); // 'quarante-deux'\n * convertToWords(81, { lang: 'fr' }); // 'quatre-vingt-un'\n */\nexport default function convertToWords (value, options = {}) {\n return new French(options).convertToWords(value)\n}\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","'use strict';\n/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar definePropertiesModule = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n // eslint-disable-next-line no-useless-assignment -- avoid memory leak\n activeXDocument = null;\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n","import AbstractLanguage from '../classes/abstract-language.js'\n\n/**\n * Malay (Bahasa Melayu) language converter.\n *\n * Conventions:\n * - Base-10 structure\n * - \"Se-\" prefix for singular units (seratus, seribu, sejuta, sebilion, setrilion)\n * - Space-separated components (no conjunction like \"dan\" for tens/ones)\n * - Grouping by thousands (ribu, juta, bilion, trilion)\n */\nexport class Malay extends AbstractLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'perpuluhan'\n zeroWord = 'sifar'\n base = {\n 0: [],\n 1: ['satu'],\n 2: ['dua'],\n 3: ['tiga'],\n 4: ['empat'],\n 5: ['lima'],\n 6: ['enam'],\n 7: ['tujuh'],\n 8: ['lapan'],\n 9: ['sembilan']\n }\n\n thousands = {\n 3: 'ribu',\n 6: 'juta',\n 9: 'bilion',\n 12: 'trilion'\n }\n\n splitBy3 (number) {\n const blocks = []\n const stringNumber = number.toString()\n const length = stringNumber.length\n let firstBlock\n\n if (length < 3) {\n blocks.push([stringNumber])\n } else {\n const firstBlockLength = length % 3\n\n if (firstBlockLength > 0) {\n firstBlock = [stringNumber.slice(0, firstBlockLength)]\n blocks.push(firstBlock)\n }\n\n for (let index = firstBlockLength; index < length; index += 3) {\n const nextBlock = [stringNumber.slice(index, index + 3)]\n blocks.push(nextBlock)\n }\n }\n return blocks\n }\n\n spell (blocks) {\n let wordBlocks = []\n let spelling\n const firstBlock = blocks[0]\n if (firstBlock[0].length === 1) {\n spelling = firstBlock[0] === '0' ? ['sifar'] : this.base[Math.trunc(firstBlock[0])]\n } else if (firstBlock[0].length === 2) {\n spelling = this.getTens(firstBlock[0])\n } else {\n spelling = [...this.getHundreds(firstBlock[0][0]), ...this.getTens(firstBlock[0].slice(1, 3))]\n }\n wordBlocks = [...wordBlocks, [firstBlock[0], spelling]]\n for (let index = 1; index < blocks.length; index++) {\n let block = blocks[index]\n spelling = [...this.getHundreds(block[0][0]), ...this.getTens(block[0].slice(1, 3))]\n block = [...block, spelling]\n wordBlocks = [...wordBlocks, block]\n }\n return wordBlocks\n }\n\n getHundreds (number) { // 'ratus'\n if (number === '1') {\n return ['seratus']\n } else if (number === '0') {\n return []\n } else {\n return [...this.base[Math.trunc(number)], 'ratus']\n }\n }\n\n getTens (number) { // 'puluh' and 'belas'\n if (number[0] === '1') {\n if (number[1] === '0') {\n return ['sepuluh']\n } else if (number[1] === '1') {\n return ['sebelas']\n }\n return [...this.base[Math.trunc(number[1])], 'belas']\n }\n\n if (number[0] === '0') {\n return this.base[Math.trunc(number[1])]\n }\n\n return [...this.base[Math.trunc(number[0])], 'puluh', ...this.base[Math.trunc(number[1])]]\n }\n\n join (wordBlocks) {\n const wordList = []\n const length = wordBlocks.length - 1\n\n for (let index = 0; index <= length; index++) {\n const words = wordBlocks[index][1]\n const isLast = index === length\n const scaleWord = isLast ? null : this.thousands[(length - index) * 3]\n\n if (!isLast && words.length === 1 && words[0] === 'satu') {\n // Use se- prefix for singular scale units: seribu, sejuta, sebilion, setrilion\n wordList.push('se' + scaleWord)\n continue\n }\n\n // Add current block words\n for (const w of words) wordList.push(w)\n\n // Append scale word if applicable and current block contributed words\n if (!isLast && words.length > 0) {\n wordList.push(scaleWord)\n }\n }\n\n return wordList.join(' ')\n }\n\n convertWholePart (number) {\n return this.join(\n this.spell(\n this.splitBy3(number)\n )\n ).trim()\n }\n}\n\nexport default function convertToWords (value, options = {}) {\n return new Malay(options).convertToWords(value)\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar isSupersetOf = require('../internals/set-is-superset-of');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar INCORRECT = !setMethodAcceptSetLike('isSupersetOf', function (result) {\n return !result;\n});\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issupersetof\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n isSupersetOf: isSupersetOf\n});\n","'use strict';\n// `CreateIterResultObject` abstract operation\n// https://tc39.es/ecma262/#sec-createiterresultobject\nmodule.exports = function (value, done) {\n return { value: value, done: done };\n};\n","import TurkicLanguage from '../classes/turkic-language.js'\n\n/**\n * Azerbaijani language converter.\n *\n * Inherits from TurkicLanguage shared patterns:\n * - Space-separated number combinations\n * - Omits '1' before hundreds and thousands\n * - Supports flexible word spacing configuration\n */\nexport class Azerbaijani extends TurkicLanguage {\n negativeWord = 'mənfi'\n decimalSeparatorWord = 'nöqtə'\n zeroWord = 'sıfır'\n scaleWordPairs = [[1_000_000_000_000_000_000n, 'kentilyon'],\n [1_000_000_000_000_000n, 'katrilyon'],\n [1_000_000_000_000n, 'trilyon'],\n [1_000_000_000n, 'milyar'],\n [1_000_000n, 'milyon'],\n [1000n, 'min'],\n [100n, 'yüz'],\n [90n, 'doxsan'],\n [80n, 'səksən'],\n [70n, 'yetmiş'],\n [60n, 'altmış'],\n [50n, 'əlli'],\n [40n, 'qırx'],\n [30n, 'otuz'],\n [20n, 'iyirmi'],\n [10n, 'on'],\n [9n, 'doqquz'],\n [8n, 'səkkiz'],\n [7n, 'yeddi'],\n [6n, 'altı'],\n [5n, 'beş'],\n [4n, 'dörd'],\n [3n, 'üç'],\n [2n, 'iki'],\n [1n, 'bir'],\n [0n, 'sıfır']]\n}\n\n/**\n * Converts a number to Azerbaijani cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options] Conversion options (see AZ class).\n * @returns {string} The number expressed in Azerbaijani words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(42, { lang: 'az' }); // 'qırx iki'\n * convertToWords(1000, { lang: 'az' }); // 'min'\n */\nexport default function convertToWords (value, options = {}) {\n return new Azerbaijani(options).convertToWords(value)\n}\n","import SlavicLanguage from '../classes/slavic-language.js'\n\n/**\n * @typedef {Object} SlavicOptions\n * @property {boolean} [feminine=false] Use feminine forms for numbers.\n */\n\n/**\n * Serbian language converter.\n *\n * Implements Serbian number words using the Slavic language pattern:\n * - Serbian number words (jedan/jedna, dva/dve, tri, četiri...)\n * - Gender-aware forms (masculine/feminine)\n * - Slavic three-form pluralization (hiljada/hiljade/hiljada)\n * - Latin script representation\n *\n * Key Features:\n * - Three-form pluralization system shared across Slavic languages\n * * Form 1 (singular): 1 (e.g., \"hiljada\")\n * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., \"hiljade\")\n * * Form 3 (many): all other numbers (e.g., \"hiljada\")\n * - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)\n * - Large number handling via SCALE[] array with indexed [singular, few, many] forms\n * - Gender-specific number forms for 1 and 2 (masculine/feminine dual forms)\n *\n * Features:\n * - Dual gender forms for 1 and 2 (jedan/jedna, dva/dve)\n * - Similar structure to Croatian with different orthography\n * - Latin script (Serbian can use both Latin and Cyrillic)\n *\n * Inherits from SlavicLanguage for complex pluralization algorithms.\n */\nexport class Serbian extends SlavicLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'zapeta'\n zeroWord = 'nula'\n ones = {\n 1: ['jedan', 'jedna'],\n 2: ['dva', 'dve'],\n 3: ['tri', 'tri'],\n 4: ['četiri', 'četiri'],\n 5: ['pet', 'pet'],\n 6: ['šest', 'šest'],\n 7: ['sedam', 'sedam'],\n 8: ['osam', 'osam'],\n 9: ['devet', 'devet']\n }\n\n tens = {\n 0: 'deset',\n 1: 'jedanaest',\n 2: 'dvanaest',\n 3: 'trinaest',\n 4: 'četrnaest',\n 5: 'petnaest',\n 6: 'šesnaest',\n 7: 'sedamnaest',\n 8: 'osamnaest',\n 9: 'devetnaest'\n }\n\n twenties = {\n 2: 'dvadeset',\n 3: 'trideset',\n 4: 'četrdeset',\n 5: 'pedeset',\n 6: 'šezdeset',\n 7: 'sedamdeset',\n 8: 'osamdeset',\n 9: 'devedeset'\n }\n\n hundreds = {\n 1: 'sto',\n 2: 'dvesta',\n 3: 'trista',\n 4: 'četiristo',\n 5: 'petsto',\n 6: 'šesto',\n 7: 'sedamsto',\n 8: 'osamsto',\n 9: 'devetsto'\n }\n\n SCALE = [\n ['', '', '', false],\n ['hiljada', 'hiljade', 'hiljada', true], // 10 ^ 3\n ['milion', 'miliona', 'miliona', false], // 10 ^ 6\n ['milijarda', 'milijarde', 'milijarda', false], // 10 ^ 9\n ['bilion', 'biliona', 'biliona', false], // 10 ^ 12\n ['bilijarda', 'bilijarde', 'bilijarda', false], // 10 ^ 15\n ['trilion', 'triliona', 'triliona', false], // 10 ^ 18\n ['trilijarda', 'trilijarde', 'trilijarda', false], // 10 ^ 21\n ['kvadrilion', 'kvadriliona', 'kvadriliona', false], // 10 ^ 24\n ['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda', false], // 10 ^ 27\n ['kvintilion', 'kvintiliona', 'kvintiliona', false] // 10 ^ 30\n ]\n\n pluralize (n, forms) {\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit === 1n) {\n return forms[0]\n }\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit > 1n && lastDigit < 5n) {\n return forms[1]\n }\n\n return forms[2]\n }\n\n convertWholePart (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n const words = []\n const chunks = this.splitByX(number.toString(), 3)\n let index = chunks.length\n for (const x of chunks) {\n index = index - 1\n const [n1, n2, n3] = this.getDigits(x)\n if (n3 > 0) {\n words.push(this.hundreds[n3])\n }\n if (n2 > 1) {\n words.push(this.twenties[n2])\n }\n if (n2 === 1n) {\n words.push(this.tens[n1])\n } else if (n1 > 0) {\n const isFeminine = (this.feminine || this.SCALE[index][3])\n const genderIndex = isFeminine ? 1 : 0\n words.push(this.ones[n1][genderIndex])\n }\n if ((index > 0) && (x !== 0n)) {\n words.push(this.pluralize(x, this.SCALE[index]))\n }\n }\n return words.join(' ')\n }\n}\n\n/**\n * Converts a number to Serbian cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options={}] Configuration options.\n * @param {boolean} [options.feminine=false] Use feminine forms for numbers.\n * @returns {string} The number expressed in Serbian words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Serbian(options).convertToWords(value)\n}\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar $TypeError = TypeError;\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_RECORD = !!(options && options.IS_RECORD);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator, 'normal');\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_RECORD) {\n iterator = iterable.iterator;\n } else if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n }\n iterator = getIterator(iterable, iterFn);\n }\n\n next = IS_RECORD ? iterable.next : iterator.next;\n while (!(step = call(next, iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw new $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n// eslint-disable-next-line es/no-object-getprototypeof -- safe\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {\n var object = toObject(O);\n if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n var constructor = object.constructor;\n if (isCallable(constructor) && object instanceof constructor) {\n return constructor.prototype;\n } return object instanceof $Object ? ObjectPrototype : null;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value === POLYFILL ? true\n : value === NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nvar navigator = globalThis.navigator;\nvar userAgent = navigator && navigator.userAgent;\n\nmodule.exports = userAgent ? String(userAgent) : '';\n","import SlavicLanguage from '../classes/slavic-language.js'\n\n/**\n * @typedef {Object} SlavicOptions\n * @property {boolean} [feminine=false] Use feminine forms for numbers.\n */\n\n/**\n * Russian language converter.\n *\n * Converts numbers to Russian words with full grammatical support:\n * - Gender agreement (masculine/feminine forms)\n * - Complex pluralization rules (one/few/many forms)\n * - Declension patterns for thousands, millions, billions, etc.\n * - Proper case endings for number words\n *\n * Features:\n * - Gender-aware forms (один/одна, два/две)\n * - Three-form pluralization (тысяча/тысячи/тысяч)\n * - Support for very large numbers (up to nonillions)\n * - Proper spacing and conjunction rules\n *\n * This class extends SlavicLanguage, which provides the conversion algorithm\n * shared by Czech, Polish, Ukrainian, Serbian, Croatian, Hebrew, Lithuanian, Latvian.\n */\nexport class Russian extends SlavicLanguage {\n negativeWord = 'минус'\n decimalSeparatorWord = 'запятая'\n zeroWord = 'ноль'\n\n ones = {\n 1: 'один',\n 2: 'два',\n 3: 'три',\n 4: 'четыре',\n 5: 'пять',\n 6: 'шесть',\n 7: 'семь',\n 8: 'восемь',\n 9: 'девять'\n }\n\n onesFeminine = {\n 1: 'одна',\n 2: 'две',\n 3: 'три',\n 4: 'четыре',\n 5: 'пять',\n 6: 'шесть',\n 7: 'семь',\n 8: 'восемь',\n 9: 'девять'\n }\n\n tens = {\n 0: 'десять',\n 1: 'одиннадцать',\n 2: 'двенадцать',\n 3: 'тринадцать',\n 4: 'четырнадцать',\n 5: 'пятнадцать',\n 6: 'шестнадцать',\n 7: 'семнадцать',\n 8: 'восемнадцать',\n 9: 'девятнадцать'\n }\n\n twenties = {\n 2: 'двадцать',\n 3: 'тридцать',\n 4: 'сорок',\n 5: 'пятьдесят',\n 6: 'шестьдесят',\n 7: 'семьдесят',\n 8: 'восемьдесят',\n 9: 'девяносто'\n }\n\n hundreds = {\n 1: 'сто',\n 2: 'двести',\n 3: 'триста',\n 4: 'четыреста',\n 5: 'пятьсот',\n 6: 'шестьсот',\n 7: 'семьсот',\n 8: 'восемьсот',\n 9: 'девятьсот'\n }\n\n thousands = {\n 1: ['тысяча', 'тысячи', 'тысяч'], // 10^ 3\n 2: ['миллион', 'миллиона', 'миллионов'], // 10^ 6\n 3: ['миллиард', 'миллиарда', 'миллиардов'], // 10^ 9\n 4: ['триллион', 'триллиона', 'триллионов'], // 10^ 12\n 5: ['квадриллион', 'квадриллиона', 'квадриллионов'], // 10^ 15\n 6: ['квинтиллион', 'квинтиллиона', 'квинтиллионов'], // 10^ 18\n 7: ['секстиллион', 'секстиллиона', 'секстиллионов'], // 10^ 21\n 8: ['септиллион', 'септиллиона', 'септиллионов'], // 10^ 24\n 9: ['октиллион', 'октиллиона', 'октиллионов'], // 10^ 27\n 10: ['нониллион', 'нониллиона', 'нониллионов'] // 10^ 30\n }\n}\n\n/**\n * Converts a number to Russian cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {SlavicOptions} [options={}] Configuration options.\n * @returns {string} The number expressed in Russian words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Russian(options).convertToWords(value)\n}\n","import SouthAsianLanguage from '../classes/south-asian-language.js'\n\nclass Bengali extends SouthAsianLanguage {\n negativeWord = 'মাইনাস'\n decimalSeparatorWord = 'দশমিক'\n zeroWord = 'শূন্য'\n hundredWord = 'শত'\n belowHundred = [\n 'শূন্য',\n 'এক',\n 'দুই',\n 'তিন',\n 'চার',\n 'পাঁচ',\n 'ছয়',\n 'সাত',\n 'আট',\n 'নয়',\n 'দশ',\n 'এগারো',\n 'বারো',\n 'তেরো',\n 'চৌদ্দ',\n 'পনেরো',\n 'ষোল',\n 'সতেরো',\n 'আঠারো',\n 'উনিশ',\n 'বিশ',\n 'একুশ',\n 'বাইশ',\n 'তেইশ',\n 'চব্বিশ',\n 'পঁচিশ',\n 'ছাব্বিশ',\n 'সাতাশ',\n 'আঠাশ',\n 'উনত্রিশ',\n 'ত্রিশ',\n 'একত্রিশ',\n 'বত্রিশ',\n 'তেত্রিশ',\n 'চৌত্রিশ',\n 'পঁয়ত্রিশ',\n 'ছত্রিশ',\n 'সাঁইত্রিশ',\n 'আটত্রিশ',\n 'উনচল্লিশ',\n 'চল্লিশ',\n 'একচল্লিশ',\n 'বেয়াল্লিশ',\n 'তেতাল্লিশ',\n 'চুয়াল্লিশ',\n 'পঁয়তাল্লিশ',\n 'ছেচল্লিশ',\n 'সাতচল্লিশ',\n 'আটচল্লিশ',\n 'উনপঞ্চাশ',\n 'পঞ্চাশ',\n 'একান্ন',\n 'বাহান্ন',\n 'তিপ্পান্ন',\n 'চুয়ান্ন',\n 'পঞ্চান্ন',\n 'ছাপ্পান্ন',\n 'সাতান্ন',\n 'আটান্ন',\n 'উনষাট',\n 'ষাট',\n 'একষট্টি',\n 'বাষট্টি',\n 'তেষট্টি',\n 'চৌষট্টি',\n 'পঁয়ষট্টি',\n 'ছেষট্টি',\n 'সাতষট্টি',\n 'আটষট্টি',\n 'ঊনসত্তর',\n 'সত্তর',\n 'একাত্তর',\n 'বাহাত্তর',\n 'তেহাত্তর',\n 'চুয়াত্তর',\n 'পঁচাত্তর',\n 'ছিয়াত্তর',\n 'সাতাত্তর',\n 'আটাত্তর',\n 'উনআশি',\n 'আশি',\n 'একাশি',\n 'বিরাশি',\n 'তিরাশি',\n 'চুরাশি',\n 'পঁচাশি',\n 'ছিয়াশি',\n 'সাতাশি',\n 'আটাশি',\n 'উননব্বই',\n 'নব্বই',\n 'একানব্বই',\n 'বিরানব্বই',\n 'তিরানব্বই',\n 'চুরানব্বই',\n 'পঁচানব্বই',\n 'ছিয়ানব্বই',\n 'সাতানব্বই',\n 'আটানব্বই',\n 'নিরানব্বই'\n ]\n\n scaleWords = [\n '',\n 'হাজার',\n 'লাখ',\n 'কোটি',\n 'আরব',\n 'খরব',\n 'নীল',\n 'পদ্ম',\n 'শঙ্খ'\n ]\n}\n\nexport default function convertToWords (value, options = {}) {\n return new Bengali(options).convertToWords(value)\n}\n","/**\n * Gujarati language implementation for n2words\n *\n * Gujarati uses Indian-style number grouping (3 digits, then 2-2 from right).\n * Numbers: શૂન્ય (0), એક (1), બે (2), ત્રણ (3), ચાર (4), પાંચ (5)...\n *\n * @module lib/languages/gu\n * @example\n * import gu from './lib/languages/gu.js'\n * gu(42) // 'બેતાળીસ'\n * gu(1000) // 'એક હજાર'\n */\n\nimport SouthAsianLanguage from '../classes/south-asian-language.js'\n\n/**\n * Gujarati language implementation\n * Extends SouthAsianLanguage for Indian-style grouping\n */\nclass GujaratiLanguage extends SouthAsianLanguage {\n negativeWord = 'ઋણ'\n decimalSeparatorWord = 'દશાંશ'\n zeroWord = 'શૂન્ય'\n hundredWord = 'સો'\n convertDecimalsPerDigit = true\n\n belowHundred = [\n 'શૂન્ય',\n 'એક',\n 'બે',\n 'ત્રણ',\n 'ચાર',\n 'પાંચ',\n 'છ',\n 'સાત',\n 'આઠ',\n 'નવ',\n 'દસ',\n 'અગિયાર',\n 'બાર',\n 'તેર',\n 'ચૌદ',\n 'પંદર',\n 'સોળ',\n 'સત્તર',\n 'અઢાર',\n 'ઓગણીસ',\n 'વીસ',\n 'એકવીસ',\n 'બાવીસ',\n 'ત્રેવીસ',\n 'ચોવીસ',\n 'પચીસ',\n 'છવ્વીસ',\n 'સત્તાવીસ',\n 'અઠ્ઠાવીસ',\n 'ઓગણત્રીસ',\n 'ત્રીસ',\n 'એકત્રીસ',\n 'બત્રીસ',\n 'તેત્રીસ',\n 'ચોત્રીસ',\n 'પાંત્રીસ',\n 'છત્રીસ',\n 'સાડત્રીસ',\n 'અડત્રીસ',\n 'ઓગણચાલીસ',\n 'ચાલીસ',\n 'એકતાલીસ',\n 'બેતાળીસ',\n 'ત્રેતાળીસ',\n 'ચુંમાલીસ',\n 'પિસ્તાલીસ',\n 'છેતાળીસ',\n 'સુડતાળીસ',\n 'અડતાળીસ',\n 'ઓગણપચાસ',\n 'પચાસ',\n 'એકાવન',\n 'બાવન',\n 'ત્રેપન',\n 'ચોપન',\n 'પંચાવન',\n 'છપ્પન',\n 'સત્તાવન',\n 'અઠ્ઠાવન',\n 'ઓગણસાઠ',\n 'સાઠ',\n 'એકસઠ',\n 'બાસઠ',\n 'ત્રેસઠ',\n 'ચોસઠ',\n 'પાંસઠ',\n 'છાસઠ',\n 'સડસઠ',\n 'અડસઠ',\n 'અગણોસિત્તેર',\n 'સિત્તેર',\n 'એકોતેર',\n 'બોતેર',\n 'તોતેર',\n 'ચુમોતેર',\n 'પંચોતેર',\n 'છોતેર',\n 'સિત્યોતેર',\n 'ઇઠ્યોતેર',\n 'ઓગણાએંસી',\n 'એંસી',\n 'એક્યાસી',\n 'બ્યાસી',\n 'ત્યાસી',\n 'ચોર્યાસી',\n 'પંચાસી',\n 'છ્યાસી',\n 'સિત્યાસી',\n 'અઠ્યાસી',\n 'નેવ્યાસી',\n 'નેવું',\n 'એકાણું',\n 'બાણું',\n 'ત્રાણું',\n 'ચોરાણું',\n 'પંચાણું',\n 'છન્નું',\n 'સત્તાણું',\n 'અઠ્ઠાણું',\n 'નવ્વાણું'\n ]\n\n scaleWords = [\n '',\n 'હજાર',\n 'લાખ',\n 'કરોડ',\n 'અબજ',\n 'ખરબ',\n 'નીલ',\n 'પદ્મ',\n 'શંખ'\n ]\n}\n\n/**\n * Convert a number to Gujarati words\n *\n * @param {number|string|bigint} value - The number to convert\n * @param {Object} [options={}] - Conversion options\n * @returns {string} The Gujarati word representation\n * @example\n * convertToWords(42) // 'બેતાળીસ'\n * convertToWords(1000) // 'એક હજાર'\n * convertToWords(100000) // 'એક લાખ'\n */\nexport default function convertToWords (value, options = {}) {\n return new GujaratiLanguage(options).convertToWords(value)\n}\n","import AbstractLanguage from '../classes/abstract-language.js'\n\nclass Telugu extends AbstractLanguage {\n negativeWord = 'మైనస్'\n decimalSeparatorWord = 'పాయింట్'\n zeroWord = 'సున్నా'\n convertDecimalsPerDigit = true // Enable digit-by-digit decimal conversion\n belowHundred = [\n 'సున్నా',\n 'ఒకటి',\n 'రెండు',\n 'మూడు',\n 'నాలుగు',\n 'ఐదు',\n 'ఆరు',\n 'ఏడు',\n 'ఎనిమిది',\n 'తొమ్మిది',\n 'పది',\n 'పదకొండు',\n 'పన్నెండు',\n 'పదమూడు',\n 'పద్నాలుగు',\n 'పదిహేను',\n 'పదహారు',\n 'పదిహేడు',\n 'పద్దెనిమిది',\n 'పంతొమ్మిది',\n 'ఇరవై',\n 'ఇరవై ఒక్కటి',\n 'ఇరవై రెండు',\n 'ఇరవై మూడు',\n 'ఇరవై నాలుగు',\n 'ఇరవై ఐదు',\n 'ఇరవై ఆరు',\n 'ఇరవై ఏడు',\n 'ఇరవై ఎనిమిది',\n 'ఇరవై తొమ్మిది',\n 'ముప్పై',\n 'ముప్పై ఒకటి',\n 'ముప్పై రెండు',\n 'ముప్పై మూడు',\n 'ముప్పై నాలుగు',\n 'ముప్పై ఐదు',\n 'ముప్పై ఆరు',\n 'ముప్పై ఏడు',\n 'ముప్పై ఎనిమిది',\n 'ముప్పై తొమ్మిది',\n 'నలభై',\n 'నలభై ఒకటి',\n 'నలభై రెండు',\n 'నలభై మూడు',\n 'నలభై నాలుగు',\n 'నలభై ఐదు',\n 'నలభై ఆరు',\n 'నలభై ఏడు',\n 'నలభై ఎనిమిది',\n 'నలభై తొమ్మిది',\n 'యాభై',\n 'యాభై ఒకటి',\n 'యాభై రెండు',\n 'యాభై మూడు',\n 'యాభై నాలుగు',\n 'యాభై ఐదు',\n 'యాభై ఆరు',\n 'యాభై ఏడు',\n 'యాభై ఎనిమిది',\n 'యాభై తొమ్మిది',\n 'అరవై',\n 'అరవై ఒకటి',\n 'అరవై రెండు',\n 'అరవై మూడు',\n 'అరవై నాలుగు',\n 'అరవై ఐదు',\n 'అరవై ఆరు',\n 'అరవై ఏడు',\n 'అరవై ఎనిమిది',\n 'అరవై తొమ్మిది',\n 'డెబ్బై',\n 'డెబ్బై ఒకటి',\n 'డెబ్బై రెండు',\n 'డెబ్బై మూడు',\n 'డెబ్బై నాలుగు',\n 'డెబ్బై ఐదు',\n 'డెబ్బై ఆరు',\n 'డెబ్బై ఏడు',\n 'డెబ్బై ఎనిమిది',\n 'డెబ్బై తొమ్మిది',\n 'ఎనభై',\n 'ఎనభై ఒకటి',\n 'ఎనభై రెండు',\n 'ఎనభై మూడు',\n 'ఎనభై నాలుగు',\n 'ఎనభై ఐదు',\n 'ఎనభై ఆరు',\n 'ఎనభై ఏడు',\n 'ఎనభై ఎనిమిది',\n 'ఎనభై తొమ్మిది',\n 'తొంభై',\n 'తొంభై ఒకటి',\n 'తొంభై రెండు',\n 'తొంభై మూడు',\n 'తొంభై నాలుగు',\n 'తొంభై ఐదు',\n 'తొంభై ఆరు',\n 'తొంభై ఏడు',\n 'తొంభై ఎనిమిది',\n 'తొంభై తొమ్మిది'\n ]\n\n hundreds = [\n '',\n 'వంద',\n 'రెండు వందలు',\n 'మూడు వందలు',\n 'నాలుగు వందలు',\n 'ఐదు వందలు',\n 'ఆరు వందలు',\n 'ఏడు వందలు',\n 'ఎనిమిది వందలు',\n 'తొమ్మిది వందలు'\n ]\n\n // Digits map 1–9 for decimal reading\n digits = [\n 'ఒకటి',\n 'రెండు',\n 'మూడు',\n 'నాలుగు',\n 'ఐదు',\n 'ఆరు',\n 'ఏడు',\n 'ఎనిమిది',\n 'తొమ్మిది'\n ]\n\n scales = [\n '',\n 'వెయ్యి',\n 'లక్ష',\n 'కోటి',\n 'అరబ్',\n 'ఖరబ్',\n 'నిల్',\n 'పడ్మ',\n 'శంకు'\n ]\n\n /**\n * Convert numbers below 100 to Telugu words.\n *\n * @param {number} number The number to convert (0-99).\n * @returns {string} The Telugu representation.\n */\n convertBelowHundred (number) {\n return this.belowHundred[number]\n }\n\n /**\n * Convert numbers below 1000 to Telugu words.\n *\n * @param {number} number The number to convert (0-999).\n * @returns {string} The Telugu representation.\n */\n convertBelowThousand (number) {\n if (number === 0) return ''\n if (number < 100) return this.convertBelowHundred(number)\n\n const hundreds = Math.trunc(number / 100)\n const remainder = number % 100\n const parts = [this.hundreds[hundreds]]\n\n if (remainder > 0) {\n parts.push(this.convertBelowHundred(remainder))\n }\n\n return parts.join(' ').trim()\n }\n\n /**\n * Split a number using Indian-style grouping (3-2-2 digits from right).\n *\n * @param {bigint} number The number to split.\n * @returns {number[]} Array of number groups.\n */\n splitIndian (number) {\n const numStr = number.toString()\n if (numStr.length <= 3) return [Number(numStr)]\n\n const groups = []\n const last3 = numStr.slice(-3)\n groups.unshift(Number(last3))\n\n let remaining = numStr.slice(0, -3)\n while (remaining.length > 0) {\n const group = remaining.slice(-2)\n groups.unshift(Number(group))\n remaining = remaining.slice(0, -2)\n }\n\n return groups\n }\n\n convertWholePart (number) {\n if (number === 0n) return this.zeroWord\n\n const groups = this.splitIndian(number)\n const groupCount = groups.length\n const words = []\n\n for (let i = 0; i < groupCount; i++) {\n const groupValue = groups[i]\n if (groupValue === 0) continue\n\n const scaleIndex = groupCount - i - 1\n const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ఒక' : this.convertBelowThousand(groupValue)\n words.push(groupWords)\n if (scaleIndex > 0 && this.scales[scaleIndex]) {\n words.push(this.scales[scaleIndex])\n }\n }\n\n return words.join(' ').trim()\n }\n}\n\nexport default function convertToWords (value, options = {}) {\n return new Telugu(options).convertToWords(value)\n}\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.1.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar clone = require('../internals/set-clone');\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.difference` method\n// https://tc39.es/ecma262/#sec-set.prototype.difference\nmodule.exports = function difference(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = clone(O);\n if (size(O) <= otherRec.size) iterateSet(O, function (e) {\n if (otherRec.includes(e)) remove(result, e);\n });\n else iterateSimple(otherRec.getIterator(), function (e) {\n if (has(result, e)) remove(result, e);\n });\n return result;\n};\n","/**\n * Converts numbers to their word representation in Greek (Ελληνικά).\n * @module languages/el\n */\n\nimport GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * Greek language implementation using scale-based number conversion.\n * @extends GreedyScaleLanguage\n */\nclass GreekLanguage extends GreedyScaleLanguage {\n negativeWord = 'μείον'\n decimalSeparatorWord = 'κόμμα'\n zeroWord = 'μηδέν'\n convertDecimalsPerDigit = true\n\n scaleWordPairs = [\n // Large numbers (limited set for now)\n [1_000_000_000n, 'δισεκατομμύριο'],\n [1_000_000n, 'εκατομμύριο'],\n [1000n, 'χίλια'],\n\n // Hundreds\n [900n, 'εννιακόσια'],\n [800n, 'οκτακόσια'],\n [700n, 'επτακόσια'],\n [600n, 'εξακόσια'],\n [500n, 'πεντακόσια'],\n [400n, 'τετρακόσια'],\n [300n, 'τριακόσια'],\n [200n, 'διακόσια'],\n [100n, 'εκατό'],\n\n // Tens\n [90n, 'ενενήντα'],\n [80n, 'ογδόντα'],\n [70n, 'εβδομήντα'],\n [60n, 'εξήντα'],\n [50n, 'πενήντα'],\n [40n, 'σαράντα'],\n [30n, 'τριάντα'],\n [20n, 'είκοσι'],\n [19n, 'δεκαεννέα'],\n [18n, 'δεκαοκτώ'],\n [17n, 'δεκαεπτά'],\n [16n, 'δεκαέξι'],\n [15n, 'δεκαπέντε'],\n [14n, 'δεκατέσσερα'],\n [13n, 'δεκατρία'],\n [12n, 'δώδεκα'],\n [11n, 'έντεκα'],\n [10n, 'δέκα'],\n\n // Singles\n [9n, 'εννέα'],\n [8n, 'οκτώ'],\n [7n, 'επτά'],\n [6n, 'έξι'],\n [5n, 'πέντε'],\n [4n, 'τέσσερα'],\n [3n, 'τρία'],\n [2n, 'δύο'],\n [1n, 'ένα'],\n [0n, 'μηδέν']\n ]\n\n /**\n * Merges two adjacent word-number pairs according to Greek grammar rules.\n *\n * Greek-specific rules:\n * - Implicit \"one\": χίλια (thousand), not ένα χίλια\n * - Space-separated composites\n * - Multiplication for scales (e.g., δύο χίλια = two thousand)\n *\n * @param {Object} leftPair - Left word-number pair (e.g., { 'δύο': 2n })\n * @param {Object} rightPair - Right word-number pair (e.g., { 'χίλια': 1000n })\n * @returns {Object} Merged word-number pair\n */\n mergeScales (leftPair, rightPair) {\n const leftWord = Object.keys(leftPair)[0]\n const leftNumber = Object.values(leftPair)[0]\n const rightWord = Object.keys(rightPair)[0]\n const rightNumber = Object.values(rightPair)[0]\n\n // Implicit one: omit \"ένα\" before any following value (> 0)\n if (leftNumber === 1n) {\n return rightPair\n }\n\n // No special handling needed for trailing 'ένα';\n // nested merge will first collapse {1, 'ένα'} -> 'ένα'.\n\n // Multiplication: larger right scale multiplied by left number\n if (rightNumber > leftNumber) {\n return { [`${leftWord} ${rightWord}`]: leftNumber * rightNumber }\n }\n\n // Addition: smaller numbers added together\n return { [`${leftWord} ${rightWord}`]: leftNumber + rightNumber }\n }\n}\n\n/**\n * Converts a number to its word representation in Greek.\n * @param {number|string|bigint} value - The number to convert\n * @param {Object} [options={}] - Conversion options\n * @returns {string} The word representation of the number\n * @example\n * convertToWords(42) // 'σαράντα δύο'\n * convertToWords(1000) // 'χίλια'\n * convertToWords(2000) // 'δύο χίλια'\n */\nexport default function convertToWords (value, options = {}) {\n return new GreekLanguage(options).convertToWords(value)\n}\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar clone = require('../internals/set-clone');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.symmetricDifference` method\n// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference\nmodule.exports = function symmetricDifference(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (e) {\n if (has(O, e)) remove(result, e);\n else add(result, e);\n });\n return result;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","'use strict';\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","'use strict';\nvar fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7;\n});\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar call = require('../internals/function-call');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar getIteratorDirect = require('../internals/get-iterator-direct');\n\nvar INVALID_SIZE = 'Invalid size';\nvar $RangeError = RangeError;\nvar $TypeError = TypeError;\nvar max = Math.max;\n\nvar SetRecord = function (set, intSize) {\n this.set = set;\n this.size = max(intSize, 0);\n this.has = aCallable(set.has);\n this.keys = aCallable(set.keys);\n};\n\nSetRecord.prototype = {\n getIterator: function () {\n return getIteratorDirect(anObject(call(this.keys, this.set)));\n },\n includes: function (it) {\n return call(this.has, this.set, it);\n }\n};\n\n// `GetSetRecord` abstract operation\n// https://tc39.es/proposal-set-methods/#sec-getsetrecord\nmodule.exports = function (obj) {\n anObject(obj);\n var numSize = +obj.size;\n // NOTE: If size is undefined, then numSize will be NaN\n // eslint-disable-next-line no-self-compare -- NaN check\n if (numSize !== numSize) throw new $TypeError(INVALID_SIZE);\n var intSize = toIntegerOrInfinity(numSize);\n if (intSize < 0) throw new $RangeError(INVALID_SIZE);\n return new SetRecord(obj, intSize);\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar size = require('../internals/set-size');\nvar iterate = require('../internals/set-iterate');\nvar getSetRecord = require('../internals/get-set-record');\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issubsetof\nmodule.exports = function isSubsetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) > otherRec.size) return false;\n return iterate(O, function (e) {\n if (!otherRec.includes(e)) return false;\n }, true) !== false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar isDisjointFrom = require('../internals/set-is-disjoint-from');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar INCORRECT = !setMethodAcceptSetLike('isDisjointFrom', function (result) {\n return !result;\n});\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n isDisjointFrom: isDisjointFrom\n});\n","import GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * German language converter.\n *\n * Handles German grammatical features:\n * - \"eins\" vs \"ein\" and \"eine\" forms for 1\n * - Compound words without separators (e.g., \"einundzwanzig\" = 21)\n * - Million/Billion pluralization\n * - Special characters (e.g., \"ü\", \"ö\", \"ß\")\n */\nexport class German extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'komma'\n zeroWord = 'null'\n scaleWordPairs = [\n [1_000_000_000_000_000_000_000_000_000n, 'Quadrilliarde'],\n [1_000_000_000_000_000_000_000_000n, 'Quadrillion'],\n [1_000_000_000_000_000_000_000n, 'Trilliarde'],\n [1_000_000_000_000_000_000n, 'Trillion'],\n [1_000_000_000_000_000n, 'Billiarde'],\n [1_000_000_000_000n, 'Billion'],\n [1_000_000_000n, 'Milliarde'],\n [1_000_000n, 'Million'],\n [1000n, 'tausend'],\n [100n, 'hundert'],\n [90n, 'neunzig'],\n [80n, 'achtzig'],\n [70n, 'siebzig'],\n [60n, 'sechzig'],\n [50n, 'fünfzig'],\n [40n, 'vierzig'],\n [30n, 'dreißig'],\n [20n, 'zwanzig'],\n [19n, 'neunzehn'],\n [18n, 'achtzehn'],\n [17n, 'siebzehn'],\n [16n, 'sechzehn'],\n [15n, 'fünfzehn'],\n [14n, 'vierzehn'],\n [13n, 'dreizehn'],\n [12n, 'zwölf'],\n [11n, 'elf'],\n [10n, 'zehn'],\n [9n, 'neun'],\n [8n, 'acht'],\n [7n, 'sieben'],\n [6n, 'sechs'],\n [5n, 'fünf'],\n [4n, 'vier'],\n [3n, 'drei'],\n [2n, 'zwei'],\n [1n, 'eins'],\n [0n, 'null']\n ]\n\n /**\n * Merges two adjacent word-number pairs according to German grammar rules.\n *\n * German-specific rules:\n * - Implicit \"eins\": `mergeScales({ 'eins': 1n }, { 'hundert': 100n })` → `{ 'einhundert': 100n }`\n * - Compound words without separators (e.g., \"einundzwanzig\" = 21)\n * - Special handling for forms of 1 (eins/ein/eine) depending on context\n * - Pluralization of millions and higher: \"Millionen\", \"Milliarden\"\n * - Reordering of tens and units: `mergeScales({ 'zwanzig': 20n }, { 'eins': 1n })` → `{ 'einundzwanzig': 21n }`\n *\n * @param {Object} currentPair The left operand as `{ word: BigInt }`.\n * @param {Object} nextPair The right operand as `{ word: BigInt }`.\n * @returns {Object} Merged pair with combined word and resulting numeric value.\n *\n * @example\n * mergeScales({ 'eins': 1n }, { 'hundert': 100n }); // { 'einhundert': 100n }\n * mergeScales({ 'zwanzig': 20n }, { 'drei': 3n }); // { 'dreiundzwanzig': 23n }\n */\n mergeScales (currentPair, nextPair) {\n let currentWord = Object.keys(currentPair)[0]\n let nextWord = Object.keys(nextPair)[0]\n const currentNumber = Object.values(currentPair)[0]\n const nextNumber = Object.values(nextPair)[0]\n\n // Handle form of 1: \"eins\" → \"ein(e)\" in certain contexts\n if (currentNumber === 1n) {\n if (nextNumber === 100n || nextNumber === 1000n) {\n return { [`ein${nextWord}`]: nextNumber }\n }\n if (nextNumber < 1_000_000n) {\n return nextPair\n }\n currentWord = 'eine'\n }\n\n if (nextNumber > currentNumber) {\n // Multiply: apply pluralization rules for millions\n if (nextNumber >= 1_000_000n) {\n if (currentNumber > 1n) {\n nextWord += nextWord.at(-1) === 'e' ? 'n' : 'en'\n }\n currentWord += ' '\n }\n return { [`${currentWord}${nextWord}`]: currentNumber * nextNumber }\n }\n\n // Add: handle special case of tens + units\n if (nextNumber < 10n && currentNumber > 10n && currentNumber < 100n) {\n // German reverses tens and units (einundzwanzig = one and twenty)\n if (nextNumber === 1n) {\n nextWord = 'ein'\n }\n const temp = nextWord\n nextWord = currentWord\n currentWord = `${temp}und`\n } else if (currentNumber >= 1_000_000n) {\n currentWord += ' '\n }\n\n return { [`${currentWord}${nextWord}`]: currentNumber + nextNumber }\n }\n}\n\n/**\n * Converts a number to German cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options] Conversion options (see German class options).\n * @returns {string} The number expressed in German words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(42); // 'zweiundvierzig'\n * convertToWords('1.5'); // 'eins komma fünf'\n */\nexport default function convertToWords (value, options = {}) {\n return new German(options).convertToWords(value)\n}\n","import GreedyScaleLanguage from './greedy-scale-language.js'\n\n/**\n * @typedef {Object} TurkicWordPair\n * @property {string} word - The Turkic word or phrase\n * @property {bigint} value - The numeric value represented by the word\n */\n\n/**\n * Base class for Turkic languages with shared grammar patterns.\n *\n * This class provides a reusable implementation for Turkic languages that share:\n * - Space-separated number combinations\n * - Implicit 'bir' (one) before hundreds and thousands\n * - Simple multiplication/addition logic\n * - Consistent magnitude handling\n * - Inherits decimal handling from AbstractLanguage via GreedyScaleLanguage\n * (supports both grouped and per-digit modes via the `convertDecimalsPerDigit` class property).\n *\n * Used by: Turkish (TR), Azerbaijani (AZ)\n *\n * Subclasses MUST define (from GreedyScaleLanguage requirements):\n * - `scaleWordPairs` array of [value, word] pairs as a class property (ordered descending by value).\n * Optionally, language-specific class properties (e.g., `negativeWord`, `zeroWord`, `decimalSeparatorWord`, `wordSeparator`).\n *\n * TurkicLanguage provides a default `mergeScales()` implementation; subclasses may override\n * if specialized merge logic is needed (unlikely for Turkic languages).\n *\n * @abstract\n * @extends GreedyScaleLanguage\n */\nclass TurkicLanguage extends GreedyScaleLanguage {\n /**\n * Merges two adjacent word-number pairs according to Turkic grammar rules.\n *\n * Shared Turkic patterns:\n * - Implicit 'bir' (one) before hundreds and thousands\n * - Space separator (wordSeparator property) for all combinations\n * - Multiplies when right > left (crossing magnitude boundary)\n * - Adds otherwise (combining same-magnitude components)\n *\n * @param {Object} leftPair The left operand as `{ word: bigint }`.\n * @param {Object} rightPair The right operand as `{ word: bigint }`.\n * @returns {Object} Merged pair with combined word and resulting number (bigint).\n */\n mergeScales (leftPair, rightPair) {\n const [[leftWord, leftNumber]] = Object.entries(leftPair)\n const [[rightWord, rightNumber]] = Object.entries(rightPair)\n\n // Implicit 'bir' (one) before certain magnitudes:\n // Omit '1' before hundreds (100n) and thousands (1000n) to form natural combinations\n if (leftNumber === 1n && (rightNumber <= 100n || rightNumber === 1000n)) {\n return rightPair // Return just the magnitude word (e.g., \"yüz\", not \"bir yüz\")\n }\n\n // Combine numbers with space separator (wordSeparator from GreedyScaleLanguage):\n // Multiply when crossing magnitude boundary, add otherwise\n const mergedNumber = rightNumber > leftNumber ? leftNumber * rightNumber : leftNumber + rightNumber\n return { [`${leftWord}${this.wordSeparator}${rightWord}`]: mergedNumber }\n }\n}\n\nexport default TurkicLanguage\n","import AbstractLanguage from '../classes/abstract-language.js'\n\n/**\n * Indonesian language converter.\n *\n * Converts numbers to Indonesian words following Indonesian conventions:\n * - Simple base-10 structure\n * - \"Se-\" prefix for one (e.g., \"seratus\" = one hundred, \"seribu\" = one thousand)\n * - Space-separated number components\n * - Straightforward grouping by thousands\n *\n * Key Features:\n * - Base number mapping (base) for single digits 0-9\n * - Magnitude scale (thousands) mapping powers of 10 to Indonesian words\n * - Group-based algorithm:\n * 1. Split number into groups of 3 digits\n * 2. For each group, convert ones/tens/hundreds using base and naming rules\n * 3. Apply \"se-\" prefix for 1 (seratus, seribu, sejuta)\n * 4. Combine with magnitude words\n * 5. Join all parts with spaces\n * - Regular patterns (puluh for tens, ratus for hundreds, ribu for thousands)\n * - Clear grouping: ribu (10³), juta (10⁶), miliar (10⁹), triliun (10¹²)\n *\n * Features:\n * - \"Se-\" prefix usage for singular units\n * - Support for very large numbers (up to decillions)\n */\nexport class Indonesian extends AbstractLanguage {\n negativeWord = 'min'\n decimalSeparatorWord = 'koma'\n zeroWord = 'nol'\n base = {\n 0: [],\n 1: ['satu'],\n 2: ['dua'],\n 3: ['tiga'],\n 4: ['empat'],\n 5: ['lima'],\n 6: ['enam'],\n 7: ['tujuh'],\n 8: ['delapan'],\n 9: ['sembilan']\n }\n\n thousands = {\n 3: 'ribu', // 10^3\n 6: 'juta', // 10^6\n 9: 'miliar', // 10^9\n 12: 'triliun',\n 15: 'kuadriliun',\n 18: 'kuantiliun',\n 21: 'sekstiliun',\n 24: 'septiliun',\n 27: 'oktiliun',\n 30: 'noniliun',\n 33: 'desiliun'\n }\n\n splitBy3 (number) {\n // Split to groups of 3 numbers: 1234567 -> [['1'], ['234'], ['567']]\n const blocks = []\n const stringNumber = number.toString()\n const length = stringNumber.length\n let firstBlock\n\n if (length < 3) {\n blocks.push([stringNumber])\n } else {\n const firstBlockLength = length % 3\n\n if (firstBlockLength > 0) {\n firstBlock = [stringNumber.slice(0, firstBlockLength)]\n blocks.push(firstBlock)\n }\n\n for (let index = firstBlockLength; index < length; index += 3) {\n const nextBlock = [stringNumber.slice(index, index + 3)]\n blocks.push(nextBlock)\n }\n }\n return blocks\n }\n\n spell (blocks) {\n let wordBlocks = []\n let spelling\n const firstBlock = blocks[0]\n if (firstBlock[0].length === 1) {\n spelling = firstBlock[0] === '0' ? ['nol'] : this.base[Math.trunc(firstBlock[0])]\n } else if (firstBlock[0].length === 2) {\n spelling = this.getTens(firstBlock[0])\n } else {\n spelling = [...this.getHundreds(firstBlock[0][0]), ...this.getTens(firstBlock[0].slice(1, 3))]\n }\n wordBlocks = [...wordBlocks, [firstBlock[0], spelling]]\n for (let index = 1; index < blocks.length; index++) {\n let block = blocks[index]\n spelling = [...this.getHundreds(block[0][0]), ...this.getTens(block[0].slice(1, 3))]\n block = [...block, spelling]\n wordBlocks = [...wordBlocks, block]\n }\n return wordBlocks\n }\n\n getHundreds (number) {\n if (number === '1') {\n return ['seratus']\n } else if (number === '0') {\n return []\n } else {\n return [...this.base[Math.trunc(number)], 'ratus']\n }\n }\n\n getTens (number) {\n if (number[0] === '1') {\n if (number[1] === '0') {\n return ['sepuluh']\n } else if (number[1] === '1') {\n return ['sebelas']\n }\n return [...this.base[Math.trunc(number[1])], 'belas']\n }\n\n if (number[0] === '0') {\n return this.base[Math.trunc(number[1])]\n }\n\n return [...this.base[Math.trunc(number[0])], 'puluh', ...this.base[Math.trunc(number[1])]]\n }\n\n join (wordBlocks) {\n let wordList = []\n const length = wordBlocks.length - 1\n const firstBlock = [wordBlocks[0]]\n let start = 0\n if (length === 1 && firstBlock[0][0] === '1') {\n wordList.push('seribu')\n start = 1\n }\n for (let index = start; index < length + 1; index++) {\n wordList = [...wordList, ...wordBlocks[index][1]]\n if (wordBlocks[index][1].length === 0) {\n continue\n }\n if (index === length) {\n break\n }\n wordList = [...wordList, this.thousands[(length - index) * 3]]\n }\n return wordList.join(' ')\n }\n\n convertWholePart (number) {\n return this.join(\n this.spell(\n this.splitBy3(number)\n )\n ).trim()\n }\n}\n\n/**\n * Converts a number to Indonesian cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options={}] Configuration options.\n * @returns {string} The number expressed in Indonesian words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Indonesian(options).convertToWords(value)\n}\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\n\nvar document = globalThis.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","import AbstractLanguage from './abstract-language.js'\n\n/**\n * @typedef {Object} WordSet\n * @property {string} word - The language word or phrase\n * @property {bigint} value - The numeric value represented by the word\n */\n\n/**\n * @typedef {Array.<Array.<(bigint|string)>>} ScaleWordPairs\n * Array of scale word pairs in descending order. Each pair contains:\n * - [0]: BigInt numeric value\n * - [1]: String word representation\n * Must be ordered largest to smallest for the greedy algorithm.\n */\n\n/**\n * Greedy scale language converter implementing the \"highest-matching scale word\" algorithm.\n *\n * Responsibilities:\n * - Decompose a whole-number value into a sequence of scale word-sets.\n * - Provide helpers to merge and post-process matched word-sets.\n * - Inherits decimal handling from AbstractLanguage (supports grouped and per-digit\n * modes via the `convertDecimalsPerDigit` class property).\n *\n * Subclass requirements:\n * - Define `scaleWordPairs` (ordered descending) as `[BigInt, string]` tuples.\n * - Implement `mergeScales(leftWordSet, rightWordSet)` to combine adjacent word-sets\n * per language grammar.\n *\n * Scale words specification:\n * - `scaleWordPairs` is an Array of 2-tuples: `[BigInt, string]` where the first element\n * is the numeric value (BigInt) and the second is the word used for that value.\n * - Scale words MUST be ordered from largest to smallest (descending) for the algorithm\n * to function correctly.\n *\n * @abstract\n * @extends AbstractLanguage\n * @example\n * // Example `scaleWordPairs` for English (descending order):\n * // [[1000000000n, 'billion'], [1000000n, 'million'], [1000n, 'thousand'], [100n, 'hundred'], ..., [1n, 'one']]\n */\n\nclass GreedyScaleLanguage extends AbstractLanguage {\n /**\n * Array of scale word pairs mapping numeric values to their word representations.\n *\n * Each element is a 2-tuple: `[BigInt, string]` where the first element is the\n * numeric value and the second is the word for that value. The array MUST be\n * ordered from largest to smallest (descending) for the greedy algorithm to work correctly.\n *\n * @type {Array.<Array.<(bigint|string)>>}\n * @example\n * // English scale words (descending order):\n * // [[1000000000n, 'billion'], [1000000n, 'million'], [1000n, 'thousand'], [100n, 'hundred'], ..., [1n, 'one']]\n */\n scaleWordPairs\n\n /**\n * Return the word associated with an exact scale word-set numeric value.\n *\n * @param {bigint|number} scaleValue Numeric word-set object key (prefer BigInt for exact matching).\n * @returns {string|undefined} The word for the provided scale value, or `undefined`.\n */\n getScaleWord (scaleValue) {\n const matchingPair = this.scaleWordPairs.find((pair) => pair[0] === scaleValue)\n return matchingPair?.[1]\n }\n\n /**\n * Decompose a whole-number into a sequence of scale word-sets.\n *\n * This internal helper returns a nested structure that represents quantities and\n * their matching scale words (e.g. `[{ 'one': 1n }, { 'hundred': 100n }, ...]`).\n * The result is designed to be reduced by `mergeWordSets()` using language-specific `mergeScales()`.\n *\n * For quantities > 1, the multiplier is recursively decomposed. For quantity = 1,\n * the implicit \"one\" is represented with `{ 'one': 1n }` and typically omitted during mergeScales().\n *\n * @protected\n * @param {bigint} wholeNumber The integer value to decompose (BigInt preferred).\n * @returns {Array<Object|Array>} An array of word-set objects and possibly nested arrays.\n */\n decomposeToScales (wholeNumber) {\n const decomposeWordSets = []\n let remainingValue = wholeNumber\n\n do {\n const matchingScaleWordPair = this.scaleWordPairs.find((scaleWordPair) => remainingValue >= scaleWordPair[0])\n if (!matchingScaleWordPair) break\n\n const multiplier = remainingValue === 0n ? 1n : remainingValue / matchingScaleWordPair[0]\n\n if (multiplier === 1n) {\n decomposeWordSets.push({ [this.getScaleWord(1n)]: 1n })\n } else {\n decomposeWordSets.push(this.decomposeToScales(multiplier))\n }\n\n decomposeWordSets.push({ [matchingScaleWordPair[1]]: matchingScaleWordPair[0] })\n\n remainingValue = remainingValue === 0n ? 0n : remainingValue % matchingScaleWordPair[0]\n } while (remainingValue > 0n)\n\n return decomposeWordSets\n }\n\n /**\n * Reduce a nested array of word-sets into a single merged word-set object.\n *\n * This method repeatedly applies the subclass `mergeScales()` operation until a single\n * object remains. It normalizes nested arrays by recursively merging them.\n *\n * @protected\n * @param {Array<Object|Array>} mergeWordSetsList Array of word-set objects and nested arrays.\n * @returns {Object} Merged word-set where the single object key is the language string\n * and its value is the numeric BigInt result for that string.\n */\n mergeWordSets (mergeWordSetsList) {\n while (mergeWordSetsList.length > 1) {\n const [firstWordSet, secondWordSet, ...remainingWordSets] = mergeWordSetsList\n\n if (!Array.isArray(firstWordSet) && !Array.isArray(secondWordSet)) {\n const merged = this.mergeScales(firstWordSet, secondWordSet)\n mergeWordSetsList = remainingWordSets.length > 0 ? [merged, remainingWordSets] : [merged]\n continue\n }\n\n const normalizedWordSets = mergeWordSetsList.map((wordSetElement) => {\n if (!Array.isArray(wordSetElement)) return wordSetElement\n return wordSetElement.length === 1 ? wordSetElement[0] : this.mergeWordSets(wordSetElement)\n })\n\n mergeWordSetsList = normalizedWordSets\n }\n\n return mergeWordSetsList[0]\n }\n\n /**\n * Combine two adjacent word-sets into a single merged word-set.\n *\n * This is the core language-specific method that must be implemented by subclasses\n * to define how adjacent word-sets are combined according to the language's grammar.\n * For example, English combines \"twenty\" + \"three\" → \"twenty-three\", while\n * French might combine \"quatre-vingts\" + \"dix\" → \"quatre-vingt-dix\".\n *\n * @abstract\n * @protected\n * @param {Object} leftWordSet Left operand as `{ word: bigint }` pair.\n * @param {Object} rightWordSet Right operand as `{ word: bigint }` pair.\n * @returns {Object} Single merged word-set object with combined text and numeric value.\n *\n * @example\n * // English implementation might handle:\n * // mergeScales({ 'twenty': 20n }, { 'three': 3n }) → { 'twenty-three': 23n }\n * // mergeScales({ 'one': 1n }, { 'hundred': 100n }) → { 'one hundred': 100n }\n */\n mergeScales (leftWordSet, rightWordSet) {\n throw new Error('mergeScales() must be implemented by subclass')\n }\n\n /**\n * Final string post-processing hook.\n *\n * Subclasses may override to apply language-specific whitespace, punctuation or\n * orthographic corrections.\n *\n * @protected\n * @param {string} output Merged language string produced by `convertWholePart` flow.\n * @returns {string} Final formatted string.\n */\n finalizeWords (output) {\n return output.trimEnd()\n }\n\n /**\n * Convert an integer value to its language-specific cardinal words.\n *\n * This method orchestrates decomposition, merging and final formatting. It does\n * not handle decimals or sign; those concerns are implemented in\n * `AbstractLanguage.convertToWords` which calls this helper for the whole-number part.\n *\n * @param {bigint|number} wholeNumber Whole-number value to convert (BigInt is preferred).\n * @returns {string} The cardinal representation for `value` in the language.\n */\n convertWholePart (wholeNumber) {\n const decomposeWordSets = this.decomposeToScales(wholeNumber)\n const mergedWordSet = this.mergeWordSets(decomposeWordSets)\n const resultString = Object.keys(mergedWordSet)[0]\n return this.finalizeWords(resultString)\n }\n}\n\nexport default GreedyScaleLanguage\n","import AbstractLanguage from '../classes/abstract-language.js'\n\nclass Thai extends AbstractLanguage {\n negativeWord = 'ลบ'\n decimalSeparatorWord = 'จุด'\n zeroWord = 'ศูนย์'\n wordSeparator = ''\n convertDecimalsPerDigit = true // Enable digit-by-digit decimal conversion\n\n // Digits map 1–9\n digits = ['หนึ่ง', 'สอง', 'สาม', 'สี่', 'ห้า', 'หก', 'เจ็ด', 'แปด', 'เก้า']\n\n /**\n * Convert numbers below one million to Thai words.\n *\n * @param {number} number The number to convert (0-999999).\n * @returns {string} The Thai representation.\n */\n convertBelowMillion (number) {\n if (number === 0) return ''\n\n let value = number\n const parts = []\n\n const hundredThousands = Math.trunc(value / 100000)\n value %= 100000\n const tenThousands = Math.trunc(value / 10000)\n value %= 10000\n const thousands = Math.trunc(value / 1000)\n value %= 1000\n const hundreds = Math.trunc(value / 100)\n value %= 100\n const tens = Math.trunc(value / 10)\n const ones = value % 10\n\n if (hundredThousands > 0) {\n parts.push(this.digits[hundredThousands - 1] + 'แสน')\n }\n\n if (tenThousands > 0) {\n if (tenThousands === 1) {\n parts.push('หนึ่งหมื่น')\n } else {\n parts.push(this.digits[tenThousands - 1] + 'หมื่น')\n }\n }\n\n if (thousands > 0) {\n parts.push(this.digits[thousands - 1] + 'พัน')\n }\n\n if (hundreds > 0) {\n parts.push(this.digits[hundreds - 1] + 'ร้อย')\n }\n\n if (tens > 0) {\n if (tens === 1) {\n parts.push('สิบ')\n } else if (tens === 2) {\n parts.push('ยี่สิบ')\n } else {\n parts.push(this.digits[tens - 1] + 'สิบ')\n }\n }\n\n if (ones > 0) {\n const hasHigher = hundredThousands > 0 || tenThousands > 0 || thousands > 0 || hundreds > 0 || tens > 0\n if (ones === 1 && (tens > 0 || hasHigher)) {\n parts.push('เอ็ด')\n } else {\n parts.push(this.digits[ones - 1])\n }\n }\n\n return parts.join('')\n }\n\n /**\n * Split a number into million-sized groups for processing.\n *\n * @param {bigint} number The number to split.\n * @returns {number[]} Array of number groups.\n */\n splitMillionGroups (number) {\n const groups = []\n let remaining = number\n\n const million = 1_000_000n\n while (remaining > 0n) {\n const chunk = Number(remaining % million)\n groups.unshift(chunk)\n remaining = remaining / million\n }\n\n return groups\n }\n\n convertWholePart (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n\n const groups = this.splitMillionGroups(number)\n const parts = []\n\n for (let i = 0; i < groups.length; i++) {\n const groupValue = groups[i]\n if (groupValue === 0) continue\n\n parts.push(this.convertBelowMillion(groupValue))\n const remaining = groups.length - i - 1\n if (remaining > 0) {\n parts.push('ล้าน'.repeat(remaining))\n }\n }\n\n return parts.join('')\n }\n}\n\nexport default function convertToWords (value, options = {}) {\n return new Thai(options).convertToWords(value)\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar setArrayLength = require('../internals/array-set-length');\nvar doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer');\nvar fails = require('../internals/fails');\n\nvar INCORRECT_TO_LENGTH = fails(function () {\n return [].push.call({ length: 0x100000000 }, 1) !== 4294967297;\n});\n\n// V8 <= 121 and Safari <= 15.4; FF < 23 throws InternalError\n// https://bugs.chromium.org/p/v8/issues/detail?id=12681\nvar properErrorOnNonWritableLength = function () {\n try {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty([], 'length', { writable: false }).push();\n } catch (error) {\n return error instanceof TypeError;\n }\n};\n\nvar FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength();\n\n// `Array.prototype.push` method\n// https://tc39.es/ecma262/#sec-array.prototype.push\n$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n push: function push(item) {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n var argCount = arguments.length;\n doesNotExceedSafeInteger(len + argCount);\n for (var i = 0; i < argCount; i++) {\n O[len] = arguments[i];\n len++;\n }\n setArrayLength(O, len);\n return len;\n }\n});\n","'use strict';\n// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar add = require('../internals/set-helpers').add;\nvar clone = require('../internals/set-clone');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\n\n// `Set.prototype.union` method\n// https://tc39.es/ecma262/#sec-set.prototype.union\nmodule.exports = function union(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (it) {\n add(result, it);\n });\n return result;\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw new $TypeError(\"Can't convert object to primitive value\");\n};\n","'use strict';\nvar classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n return classof(argument) === 'Array';\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-set -- safe\nvar SetPrototype = Set.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-set -- safe\n Set: Set,\n add: uncurryThis(SetPrototype.add),\n has: uncurryThis(SetPrototype.has),\n remove: uncurryThis(SetPrototype['delete']),\n proto: SetPrototype\n};\n","import GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * Italian language converter.\n *\n * Converts numbers to Italian words following Italian conventions:\n * - Phonetic contractions (removes duplicate vowels: \"ventotto\" not \"ventiotto\")\n * - Accentuation rules for \"tre\" in compounds (\"ventitré\" not \"ventitre\")\n * - Special handling for \"uno\" and vowel agreement\n * - Complex composition patterns for large numbers\n *\n * Architecture Note:\n * Unlike other GreedyScaleLanguage subclasses, Italian uses a custom algorithm\n * rather than the standard highest-matching-scale approach. This is necessary\n * because Italian's word formation rules are irregular and context-dependent.\n * See tensToCardinal(), hundredsToCardinal(), and bigNumberToCardinal().\n *\n * Features:\n * - Vowel elision (e.g., \"ventotto\" not \"ventiotto\")\n * - Accentuation of final \"tre\" (ventitré, trentacinque - note: accent on compound tres)\n * - Exponent-based large number naming (milione, miliardo, trilione)\n * - Custom word construction for hundreds and thousands\n */\nexport class Italian extends GreedyScaleLanguage {\n negativeWord = 'meno'\n decimalSeparatorWord = 'virgola'\n zeroWord = 'zero'\n cardinalWords = [\n this.zeroWord, 'uno', 'due', 'tre', 'quattro', 'cinque', 'sei', 'sette', 'otto',\n 'nove', 'dieci', 'undici', 'dodici', 'tredici', 'quattordici', 'quindici',\n 'sedici', 'diciassette', 'diciotto', 'diciannove'\n ]\n\n strTens = { 2: 'venti', 3: 'trenta', 4: 'quaranta', 6: 'sessanta' }\n\n exponentPrefixes = [this.zeroWord, 'm', 'b', 'tr', 'quadr', 'quint', 'sest', 'sett', 'ott', 'nov', 'dec']\n\n accentuate (string) {\n const splittedString = string.split(' ')\n\n const result = splittedString.map(word => {\n return word.slice(-3) === 'tre' && word.length > 3 ? word.replaceAll('tré', 'tre').slice(0, -3) + 'tré' : word.replaceAll('tré', 'tre')\n })\n return result.join(' ')\n }\n\n omitIfZero (numberToString) {\n return numberToString === this.zeroWord ? '' : numberToString\n }\n\n phoneticContraction (string) {\n return string.replaceAll('oo', 'o').replaceAll('ao', 'o').replaceAll('io', 'o').replaceAll('au', 'u').replaceAll('iu', 'u')\n }\n\n tensToCardinal (number) {\n const tens = Math.floor(number / 10)\n const units = number % 10\n const prefix = Object.prototype.hasOwnProperty.call(this.strTens, tens) ? this.strTens[tens] : this.cardinalWords[tens].slice(0, -1) + 'anta'\n const postfix = this.omitIfZero(this.cardinalWords[units])\n return this.phoneticContraction(prefix + postfix)\n }\n\n hundredsToCardinal (number) {\n const hundreds = Math.floor(number / 100)\n let prefix = 'cento'\n if (hundreds !== 1) {\n prefix = this.cardinalWords[hundreds] + prefix\n }\n const postfix = this.omitIfZero(this.convertWholePart(number % 100))\n return this.phoneticContraction(prefix + postfix)\n }\n\n thousandsToCardinal (number) {\n const thousands = Math.floor(number / 1000)\n const prefix = thousands === 1 ? 'mille' : this.convertWholePart(thousands) + 'mila'\n const postfix = this.omitIfZero(this.convertWholePart(number % 1000))\n return prefix + postfix\n }\n\n exponentLengthToString (exponentLength) {\n const prefix = this.exponentPrefixes[Math.floor(exponentLength / 6)]\n return exponentLength % 6 === 0 ? prefix + 'ilione' : prefix + 'iliardo'\n }\n\n bigNumberToCardinal (number) {\n const digits = [...number.toString()]\n\n let preDigits = digits.length % 3\n if (preDigits === 0) {\n preDigits = 3\n }\n\n const multiplier = digits.slice(0, preDigits) // first `preDigits` elements\n const exponent = digits.slice(preDigits) // without the first `preDigits` elements\n\n let prefix, postfix\n let infix = this.exponentLengthToString(exponent.length)\n\n if (multiplier.join('') === '1') {\n prefix = 'un '\n } else {\n prefix = this.convertWholePart(Math.trunc(Number(multiplier.join(''))))\n infix = ' ' + infix.slice(0, -1) + 'i' // without last element\n }\n\n const isSetsEqual = (a, b) => a.size === b.size && [...a].every(value => b.has(value))\n if (isSetsEqual(new Set(exponent), new Set(['0']))) {\n postfix = ''\n } else {\n postfix = this.convertWholePart(Math.trunc(exponent.join('')))\n\n infix += (postfix.includes(' e ') ? ', ' : ' e ')\n }\n\n return prefix + infix + postfix\n }\n\n convertWholePart (number) {\n let words = ''\n\n if (number < 20) {\n words = this.cardinalWords[number]\n } else if (number < 100) {\n words = this.tensToCardinal(Number(number))\n } else if (number < 1000) {\n words = this.hundredsToCardinal(Number(number))\n } else if (number < 1_000_000) {\n words = this.thousandsToCardinal(Number(number))\n } else {\n words = this.bigNumberToCardinal(number)\n }\n\n return this.accentuate(words)\n }\n}\n\n/**\n * Converts a number to Italian cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options={}] Configuration options.\n * @returns {string} The number expressed in Italian words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Italian(options).convertToWords(value)\n}\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar has = require('../internals/set-helpers').has;\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\nvar iteratorClose = require('../internals/iterator-close');\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom\nmodule.exports = function isDisjointFrom(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) <= otherRec.size) return iterateSet(O, function (e) {\n if (otherRec.includes(e)) return false;\n }, true) !== false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (has(O, e)) return iteratorClose(iterator, 'normal', false);\n }) !== false;\n};\n","import AbstractLanguage from '../classes/abstract-language.js'\n\n/**\n * @typedef {Object} RomanianOptions\n * @property {boolean} [feminine=false] Use feminine forms for numbers.\n */\n\n/**\n * Romanian language converter.\n *\n * Converts numbers to Romanian words with full grammatical support:\n * - Gender agreement (masculine/feminine forms)\n * - Complex pluralization (singular/plural forms)\n * - \"De\" preposition insertion for groups >= 20\n * - Special feminine handling for thousands\n * - Proper case and agreement patterns\n *\n * Key Features:\n * - Gender-aware number forms (unu/una, doi/două, doisprezece/douăsprezece)\n * - Group-based algorithm:\n * 1. Split number into groups of 3 digits\n * 2. Convert each group using gender rules and special forms\n * 3. Insert \"de\" preposition for groups >= 20 (e.g., \"douăzeci de mii\")\n * 4. Append magnitude word with proper singular/plural form (mie/mii, milion/milioane)\n * 5. Join with spaces\n * - Special feminine units for thousands group\n * - Automatic \"de\" insertion rules (nouăsprezece mii vs douăzeci de mii)\n * - Proper singular/plural forms (mie/mii, milion/milioane)\n * - Support for very large numbers (up to decillions)\n *\n * Features:\n * - Feminine units for thousands group\n * - Support for very large numbers (up to decillions)\n */\nexport class Romanian extends AbstractLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'virgulă'\n zeroWord = 'zero'\n\n ones = {\n 1: 'unu',\n 2: 'doi',\n 3: 'trei',\n 4: 'patru',\n 5: 'cinci',\n 6: 'șase',\n 7: 'șapte',\n 8: 'opt',\n 9: 'nouă'\n }\n\n onesFeminine = {\n 1: 'una',\n 2: 'două',\n 3: 'trei',\n 4: 'patru',\n 5: 'cinci',\n 6: 'șase',\n 7: 'șapte',\n 8: 'opt',\n 9: 'nouă'\n }\n\n tens = {\n 0: 'zece',\n 1: 'unsprezece',\n 2: 'douăsprezece',\n 3: 'treisprezece',\n 4: 'paisprezece',\n 5: 'cincisprezece',\n 6: 'șaisprezece',\n 7: 'șaptesprezece',\n 8: 'optsprezece',\n 9: 'nouăsprezece'\n }\n\n tensMasculine = {\n 0: 'zece',\n 1: 'unsprezece',\n 2: 'doisprezece',\n 3: 'treisprezece',\n 4: 'paisprezece',\n 5: 'cincisprezece',\n 6: 'șaisprezece',\n 7: 'șaptesprezece',\n 8: 'optsprezece',\n 9: 'nouăsprezece'\n }\n\n twenties = {\n 2: 'douăzeci',\n 3: 'treizeci',\n 4: 'patruzeci',\n 5: 'cincizeci',\n 6: 'șaizeci',\n 7: 'șaptezeci',\n 8: 'optzeci',\n 9: 'nouăzeci'\n }\n\n hundreds = {\n 1: 'o sută',\n 2: 'două sute',\n 3: 'trei sute',\n 4: 'patru sute',\n 5: 'cinci sute',\n 6: 'șase sute',\n 7: 'șapte sute',\n 8: 'opt sute',\n 9: 'nouă sute'\n }\n\n /**\n * Romanian big units.\n * For each power group we keep: singular, plural, feminineUnits?, needsDe?\n * - 10^3: mie/mii (feminine units in chunk; \"de\" for chunk >= 20)\n * - 10^6: milion/milioane (\"de\" for chunk >= 20)\n * - 10^9: miliard/miliarde (\"de\" for chunk >= 20)\n */\n thousands = {\n 1: { singular: 'mie', plural: 'mii', feminine: true, needsDe: true }, // 10^3\n 2: { singular: 'milion', plural: 'milioane', feminine: false, needsDe: true }, // 10^6\n 3: { singular: 'miliard', plural: 'miliarde', feminine: false, needsDe: true }, // 10^9\n 4: { singular: 'trilion', plural: 'trilioane', feminine: false, needsDe: true }, // 10^12\n 5: { singular: 'cvadrilion', plural: 'cvadrilioane', feminine: false, needsDe: true }, // 10^15\n 6: { singular: 'cvintilion', plural: 'cvintilioane', feminine: false, needsDe: true }, // 10^18\n 7: { singular: 'sextilion', plural: 'sextilioane', feminine: false, needsDe: true }, // 10^21\n 8: { singular: 'septilion', plural: 'septilioane', feminine: false, needsDe: true }, // 10^24\n 9: { singular: 'octilion', plural: 'octilioane', feminine: false, needsDe: true }, // 10^27\n 10: { singular: 'decilion', plural: 'decilioane', feminine: false, needsDe: true } // 10^33\n }\n\n /**\n * Initializes the Romanian converter with language-specific options.\n *\n * @param {RomanianOptions} [options={}] Configuration options.\n */\n constructor ({ feminine = false } = {}) {\n super()\n\n this.feminine = feminine\n }\n\n /**\n * Split numeric string into BigInt groups of size x from left to right.\n * @param {string} n - The numeric string to split\n * @param {number} x - The size of each group\n * @returns {bigint[]} Array of BigInt groups\n */\n splitByX (n, x) {\n const results = []\n const l = n.length\n let result\n\n if (l > x) {\n const start = l % x\n if (start > 0) {\n result = n.slice(0, start)\n results.push(BigInt(result))\n }\n for (let index = start; index < l; index += x) {\n result = n.slice(index, index + x)\n results.push(BigInt(result))\n }\n } else {\n results.push(BigInt(n))\n }\n return results\n }\n\n getDigits (value) {\n const stringValue = value.toString().padStart(3, '0').slice(-3)\n const a = [...stringValue].toReversed()\n return a.map(BigInt)\n }\n\n /**\n * Romanian pluralization & \"de\" rule for big units.\n * - 1 → singular with article (\"o mie\", \"un milion\", \"un miliard\", …)\n * - otherwise → spell chunk + (optional \"de\") + plural\n * \"de\" is inserted when chunk >= 20 (e.g., \"douăzeci de mii/milioane/miliarde\").\n * @param {bigint} chunk - The chunk value\n * @param {object} form - The form object with singular, plural, feminine, needsDe properties\n * @returns {string} The pluralized form\n */\n romanianPluralize (chunk, form) {\n const n = Number(chunk)\n\n if (n === 1) {\n // article differs for feminine \"mie\" (o mie) vs the rest (un milion/miliard…)\n const article = form.feminine ? 'o' : 'un'\n return `${article} ${form.singular}`\n }\n\n // For 21 with big units, use feminine \"una\" with plural nouns\n if (n === 21 && form.needsDe) {\n return `douăzeci și una de ${form.plural}`\n }\n\n // spell the chunk itself (use feminine units for big numbers)\n const words = this.spellUnder1000(n, true)\n\n // \"de\" after >= 20 (covers 20, 21, 100, 101, 999, etc.)\n const needsDe = form.needsDe && n >= 20\n const de = needsDe ? ' de ' : ' '\n\n return `${words}${de}${form.plural}`\n }\n\n spellUnder100 (n, feminineUnits = false) {\n if (n < 10) {\n return (feminineUnits ? this.onesFeminine : this.ones)[n]\n }\n if (n < 20) {\n return this.tens[n - 10]\n }\n const t = Math.floor(n / 10)\n const u = n % 10\n return u\n ? `${this.twenties[t]} și ${(feminineUnits ? this.onesFeminine : this.ones)[u]}`\n : this.twenties[t]\n }\n\n spellUnder1000 (n, feminineUnits = false) {\n if (n < 100) return this.spellUnder100(n, feminineUnits)\n const h = Math.floor(n / 100)\n const r = n % 100\n const hundredWords = this.hundreds[h]\n if (!r) return hundredWords\n // Standard readable form: \"o sută unu\" (for units) or \"o sută cincizeci\" (for tens)\n const separator = ' '\n return `${hundredWords}${separator}${this.spellUnder100(r, feminineUnits)}`\n }\n\n /**\n * Override decimalDigitsToWords to use masculine forms for decimal places\n * @param {string} decimal Decimal string to convert\n * @returns {string} Value in written format\n */\n decimalDigitsToWords (decimal) {\n const words = []\n\n const chars = [...decimal]\n\n // Loop through characters adding leading zeros to words array\n let index = 0\n while (index < chars.length && chars[index] === '0') {\n words.push(this.zeroWord)\n index++\n }\n\n // Prevent further processing if entire string was zeros\n if (index === chars.length) {\n return words\n }\n\n // Convert and add remaining using masculine forms for decimal places\n const decimalNumber = BigInt(decimal)\n const masculineWords = this.toCardinalWithMasculine(decimalNumber)\n return [...words, masculineWords]\n }\n\n /**\n * Convert number to cardinal form using masculine units\n * @param {bigint} number Number to convert\n * @returns {string} Value in written format\n */\n toCardinalWithMasculine (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n\n const words = []\n const chunks = this.splitByX(number.toString(), 3)\n let index = chunks.length\n\n for (const x of chunks) {\n let onesMap = []\n index = index - 1\n\n if (x === 0n) continue\n\n const [n1, n2, n3] = this.getDigits(x) // units, tens, hundreds (as BigInt)\n\n // hundreds\n if (n3 > 0n) {\n words.push(this.hundreds[Number(n3)])\n }\n\n // tens & teens\n if (n2 > 1n) {\n words.push(this.twenties[Number(n2)])\n }\n\n if (n2 === 1n) {\n words.push(this.tensMasculine[Number(n1)])\n } else if (n1 > 0n) {\n // Always use masculine units for decimal places\n onesMap = this.ones\n\n // if there is a twenty/treizeci/etc AND ones > 0 → add \"și\"\n if (n2 > 1n) words.push('și')\n words.push(onesMap[Number(n1)])\n }\n\n // big unit name (mie/mii, milion/milioane, …)\n if (index > 0) {\n const form = this.thousands[index]\n if (form) {\n words.push(this.romanianPluralize(x, form))\n } else {\n // For very large numbers beyond our defined units, just spell out the number\n words.push(this.spellUnder1000(Number(x), false))\n }\n }\n }\n\n return words.join(' ').replaceAll(/\\s+/g, ' ').trim()\n }\n\n convertWholePart (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n const words = []\n const chunks = this.splitByX(number.toString(), 3)\n let index = chunks.length\n for (const x of chunks) {\n let onesMap = []\n index = index - 1\n if (x === 0n) continue\n const [n1, n2, n3] = this.getDigits(x) // units, tens, hundreds (as BigInt)\n // hundreds (only for the last group, not for thousands)\n if (n3 > 0n && index === 0) {\n words.push(this.hundreds[Number(n3)])\n }\n // tens & teens (only for the last group, not for thousands)\n if (index === 0) {\n if (n2 > 1n) {\n words.push(this.twenties[Number(n2)])\n }\n if (n2 === 1n) {\n words.push(this.tens[Number(n1)])\n } else if (n1 > 0n) {\n // pick masculine/feminine units (only for the last group, not for thousands)\n const feminineUnits = this.feminine && index === 0\n onesMap = feminineUnits ? this.onesFeminine : this.ones\n // if there is a twenty/treizeci/etc AND ones > 0 → add \"și\"\n if (n2 > 1n) words.push('și')\n words.push(onesMap[Number(n1)])\n }\n }\n // big unit name (mie/mii, milion/milioane, …)\n if (index > 0) {\n const form = this.thousands[index]\n if (form) {\n words.push(this.romanianPluralize(x, form))\n } else {\n // For very large numbers beyond our defined units, just spell out the number\n words.push(this.spellUnder1000(Number(x), true))\n }\n }\n }\n return words.join(' ').replaceAll(/\\s+/g, ' ').trim()\n }\n}\n\n/**\n * Converts a number to Romanian cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options={}] Configuration options.\n * @param {boolean} [options.feminine=false] Use feminine forms for numbers.\n * @returns {string} The number expressed in Romanian words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Romanian(options).convertToWords(value)\n}\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/environment-v8-version');\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\nvar $String = globalThis.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol('symbol detection');\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n // of course, fail.\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar isArray = require('../internals/is-array');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Safari < 13 does not throw an error in this case\nvar SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () {\n // makes no sense without proper strict mode support\n if (this !== undefined) return true;\n try {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty([], 'length', { writable: false }).length = 1;\n } catch (error) {\n return error instanceof TypeError;\n }\n}();\n\nmodule.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) {\n if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) {\n throw new $TypeError('Cannot set read only .length');\n } return O.length = length;\n} : function (O, length) {\n return O.length = length;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\n// https://github.com/tc39/ecma262/pull/3467\nmodule.exports = function (METHOD_NAME, ExpectedError) {\n var Iterator = globalThis.Iterator;\n var IteratorPrototype = Iterator && Iterator.prototype;\n var method = IteratorPrototype && IteratorPrototype[METHOD_NAME];\n\n var CLOSED = false;\n\n if (method) try {\n method.call({\n next: function () { return { done: true }; },\n 'return': function () { CLOSED = true; }\n }, -1);\n } catch (error) {\n // https://bugs.webkit.org/show_bug.cgi?id=291195\n if (!(error instanceof ExpectedError)) CLOSED = false;\n }\n\n if (!CLOSED) return method;\n};\n","'use strict';\nvar check = function (it) {\n return it && it.Math === Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n check(typeof this == 'object' && this) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n","import GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * @typedef {Object} DutchOptions\n * @property {boolean} [includeOptionalAnd=false] Include optional \"en\" separator.\n * @property {boolean} [noHundredPairs=false] Disable comma before hundreds.\n * @property {boolean} [accentOne=true] Use accented \"één\" for one.\n */\n\n/**\n * Dutch language converter.\n *\n * Features:\n * - Optional \"en\" (and) separator for tens (includeOptionalAnd)\n * - Optional comma before hundreds (noHundredPairs)\n * - Compound word formation without hyphenation\n */\nexport class Dutch extends GreedyScaleLanguage {\n negativeWord = 'min'\n decimalSeparatorWord = 'komma'\n zeroWord = 'nul'\n scaleWordPairs = [\n [1_000_000_000_000_000_000_000_000_000n, 'quadriljard'],\n [1_000_000_000_000_000_000_000_000n, 'quadriljoen'],\n [1_000_000_000_000_000_000_000n, 'triljard'],\n [1_000_000_000_000_000_000n, 'triljoen'],\n [1_000_000_000_000_000n, 'biljard'],\n [1_000_000_000_000n, 'biljoen'],\n [1_000_000_000n, 'miljard'],\n [1_000_000n, 'miljoen'],\n [1000n, 'duizend'],\n [100n, 'honderd'],\n [90n, 'negentig'],\n [80n, 'tachtig'],\n [70n, 'zeventig'],\n [60n, 'zestig'],\n [50n, 'vijftig'],\n [40n, 'veertig'],\n [30n, 'dertig'],\n [20n, 'twintig'],\n [19n, 'negentien'],\n [18n, 'achttien'],\n [17n, 'zeventien'],\n [16n, 'zestien'],\n [15n, 'vijftien'],\n [14n, 'veertien'],\n [13n, 'dertien'],\n [12n, 'twaalf'],\n [11n, 'elf'],\n [10n, 'tien'],\n [9n, 'negen'],\n [8n, 'acht'],\n [7n, 'zeven'],\n [6n, 'zes'],\n [5n, 'vijf'],\n [4n, 'vier'],\n [3n, 'drie'],\n [2n, 'twee'],\n [1n, 'één'],\n [0n, 'nul']\n ]\n\n /**\n * Initializes the Dutch converter with language-specific options.\n *\n * @param {DutchOptions} [options={}] Configuration options.\n */\n constructor ({ includeOptionalAnd = false, noHundredPairs = false, accentOne = true } = {}) {\n super()\n\n this.includeOptionalAnd = includeOptionalAnd\n\n this.noHundredPairs = noHundredPairs\n\n this.accentOne = accentOne\n if (!this.accentOne) {\n this.scaleWordPairs[this.scaleWordPairs.length - 2][1] = 'een'\n }\n }\n\n /**\n * Merges two adjacent word-number pairs according to Dutch grammar rules.\n *\n * Dutch-specific rules:\n * - Implicit \"één\": `mergeScales({ 'één': 1n }, { 'duizend': 1000n })` → `{ 'duizend': 1000n }`\n * - Reversed digit order for tens + units: `mergeScales({ 'twintig': 20n }, { 'één': 1n })` → `{ 'ééntwintig': 21n }`\n * - Optional \"en\" separator based on includeOptionalAnd option\n * - Compound words without separators for most combinations\n * - Converts 'één' to 'een' in compound words (no accent in compounds)\n * - Space separators for large numbers (millions+)\n *\n * @param {Object} current The left operand as `{ word: BigInt }`.\n * @param {Object} next The right operand as `{ word: BigInt }`.\n * @returns {Object} Merged pair with combined word and resulting numeric value.\n *\n * @example\n * mergeScales({ 'één': 1n }, { 'duizend': 1000n }); // { 'duizend': 1000n }\n * mergeScales({ 'twintig': 20n }, { 'drie': 3n }); // { 'drieentwintig': 23n }\n */\n mergeScales (current, next) {\n let cText = Object.keys(current)[0]\n let nText = Object.keys(next)[0]\n const cNumber = Object.values(current)[0] // BigInt\n const nNumber = Object.values(next)[0] // BigInt\n\n // Implicit \"een\": omit before large multipliers (\"miljoen\" not \"een miljoen\")\n if (cNumber === 1n) {\n if (nNumber < 1_000_000n) {\n return next\n }\n cText = this.accentOne ? 'één' : 'een'\n }\n\n // Handle multiplication and spacing\n if (nNumber > cNumber) {\n let hadSpace = false\n // Large scale words (millions+): add space before multiplier\n if (nNumber >= 1_000_000n) {\n cText += ' '\n hadSpace = true\n } else if (nNumber > 100n) {\n // Hundreds and above: add space after multiplier\n nText += ' '\n hadSpace = true\n }\n // Convert 'één' to 'een' in compounds (when no space or accentOne disabled)\n if (!hadSpace || !this.accentOne) {\n cText = cText.replace(/één/g, 'een')\n nText = nText.replace(/één/g, 'een')\n }\n return { [`${cText}${nText}`]: cNumber * nNumber }\n }\n\n // Track if we're adding a space (which keeps words separate)\n let hasSpace = false\n\n if (nNumber < 10n && cNumber > 10n && cNumber < 100n) {\n const temporary = nText\n nText = cText\n const andTxt = temporary.endsWith('e') ? 'ën' : 'en'\n cText = `${temporary}${andTxt}`\n } else if (nNumber < 13n && cNumber < 1000n && this.includeOptionalAnd) {\n cText = `${cText}en`\n } else if (nNumber < 13n && cNumber >= 1000n && this.includeOptionalAnd) {\n nText = ` en ${nText}`\n hasSpace = true\n } else if (cNumber >= 1_000_000n) {\n cText += ' '\n hasSpace = true\n } else if (cNumber === 1000n) {\n cText += ' '\n hasSpace = true\n }\n\n // Convert 'één' to 'een' in direct compounds (no space)\n // Keep 'één' only if there's a space AND accentOne=true\n if (!hasSpace) {\n cText = cText.replace(/één/g, 'een')\n nText = nText.replace(/één/g, 'een')\n } else if (!this.accentOne) {\n cText = cText.replace(/één/g, 'een')\n nText = nText.replace(/één/g, 'een')\n }\n\n return { [`${cText}${nText}`]: cNumber + nNumber }\n }\n\n convertWholePart (value) {\n if (value >= 1100n && value < 10_000n && !this.noHundredPairs) {\n const high = value / 100n\n const low = value % 100n\n if (high % 10n !== 0n) {\n let result = super.convertWholePart(high) + 'honderd'\n if (low) {\n result +=\n (this.includeOptionalAnd ? ' en ' : ' ') + super.convertWholePart(low)\n }\n return result\n }\n }\n return super.convertWholePart(value)\n }\n}\n\n/**\n * Converts a number to Dutch cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options] Conversion options (see Dutch class options).\n * @param {boolean} [options.includeOptionalAnd=false] Include optional 'en' (and) separator.\n * @param {boolean} [options.noHundredPairs=false] Don't combine hundreds with tens/units.\n * @param {boolean} [options.accentOne=true] Use accented 'één' for standalone 1.\n * @returns {string} The number expressed in Dutch words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(1); // 'één' (default accent)\n * convertToWords(1, { accentOne: false }); // 'een'\n * convertToWords(21); // 'eenentwintig' (no accent in compounds)\n * convertToWords(42); // 'tweeenveertig'\n * convertToWords('1.5'); // 'één komma vijf'\n */\nexport default function convertToWords (value, options = {}) {\n return new Dutch(options).convertToWords(value)\n}\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value));\n else object[key] = value;\n};\n","'use strict';\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\nvar documentAll = typeof document == 'object' && document.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nmodule.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\n\nvar createSetLike = function (size) {\n return {\n size: size,\n has: function () {\n return false;\n },\n keys: function () {\n return {\n next: function () {\n return { done: true };\n }\n };\n }\n };\n};\n\nvar createSetLikeWithInfinitySize = function (size) {\n return {\n size: size,\n has: function () {\n return true;\n },\n keys: function () {\n throw new Error('e');\n }\n };\n};\n\nmodule.exports = function (name, callback) {\n var Set = getBuiltIn('Set');\n try {\n new Set()[name](createSetLike(0));\n try {\n // late spec change, early WebKit ~ Safari 17 implementation does not pass it\n // https://github.com/tc39/proposal-set-methods/pull/88\n // also covered engines with\n // https://bugs.webkit.org/show_bug.cgi?id=272679\n new Set()[name](createSetLike(-1));\n return false;\n } catch (error2) {\n if (!callback) return true;\n // early V8 implementation bug\n // https://issues.chromium.org/issues/351332634\n try {\n new Set()[name](createSetLikeWithInfinitySize(-Infinity));\n return false;\n } catch (error) {\n var set = new Set([1, 2]);\n return callback(set[name](createSetLikeWithInfinitySize(Infinity)));\n }\n }\n } catch (error) {\n return false;\n }\n};\n","/**\n * Filipino (Tagalog) language implementation for n2words\n *\n * Uses scale-based system with irregular patterns for numbers 1-19.\n * Filipino numbers follow patterns like: sampu (10), labinisa (11), dalawampu (20)\n *\n * @module lib/languages/tl\n * @example\n * import fil from './lib/languages/fil.js'\n * tl(42) // 'apatnapu dalawa'\n * tl(1000) // 'isang libo'\n */\n\nimport GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * Filipino language implementation\n * Extends GreedyScaleLanguage with scale-based number conversion\n */\nclass FilipinoLanguage extends GreedyScaleLanguage {\n negativeWord = 'negatibo'\n decimalSeparatorWord = 'punto'\n zeroWord = 'zero'\n convertDecimalsPerDigit = true // Read decimals digit-by-digit\n\n scaleWordPairs = [\n [1000000000000n, 'trilyong'],\n [1000000000n, 'milyong'],\n [1000000n, 'milyong'],\n [1000n, 'libong'],\n [100n, 'daang'],\n\n // Tens\n [90n, 'siyamnapu'],\n [80n, 'walumpu'],\n [70n, 'pitumpu'],\n [60n, 'animnapu'],\n [50n, 'limampu'],\n [40n, 'apatnapu'],\n [30n, 'tatlumpu'],\n [20n, 'dalawampu'],\n\n // Teens (must come before 10 to be matched first)\n [19n, 'labinsiyam'],\n [18n, 'labingwalo'],\n [17n, 'labimpito'],\n [16n, 'labinanum'],\n [15n, 'labinlima'],\n [14n, 'labinapat'],\n [13n, 'labintatlo'],\n [12n, 'labindalawa'],\n [11n, 'labinisa'],\n [10n, 'sampu'],\n\n // Ones\n [9n, 'siyam'],\n [8n, 'walo'],\n [7n, 'pito'],\n [6n, 'anim'],\n [5n, 'lima'],\n [4n, 'apat'],\n [3n, 'tatlo'],\n [2n, 'dalawa'],\n [1n, 'isa'],\n [0n, 'zero']\n ]\n\n /**\n * Convert a whole number to Filipino words.\n * Overrides parent to handle zero explicitly.\n *\n * @param {bigint} wholeNumber The whole number to convert.\n * @returns {string} The Filipino representation.\n */\n convertWholePart (wholeNumber) {\n // Handle zero explicitly\n if (wholeNumber === 0n) {\n return this.zeroWord\n }\n return super.convertWholePart(wholeNumber)\n }\n\n /**\n * Merge two word-sets according to Filipino grammar rules.\n *\n * Features Filipino-specific rules:\n * - \"ng\" connector between words\n * - Consonant-ending words use \"na\" instead of \"ng\"\n * - Implicit \"one\" omission (\"isang daan\" → \"daan\")\n *\n * @param {Object} leftWordSet Left word-set as `{ word: BigInt }`.\n * @param {Object} rightWordSet Right word-set as `{ word: BigInt }`.\n * @returns {Object} Merged word-set with combined text and value.\n */\n mergeScales (leftWordSet, rightWordSet) {\n const leftWord = Object.keys(leftWordSet)[0]\n const rightWord = Object.keys(rightWordSet)[0]\n const leftValue = Object.values(leftWordSet)[0]\n const rightValue = Object.values(rightWordSet)[0]\n\n // Don't merge zero with anything - just return the non-zero value\n if (leftValue === 0n) {\n return rightWordSet\n }\n if (rightValue === 0n) {\n return leftWordSet\n }\n\n // Implicit \"one\" - omit when adding with values < 100\n if (leftValue === 1n && rightValue < 100n) {\n return rightWordSet\n }\n\n // Multiply when right is a scale word AND right > left\n // Use \"ng\" connector for Filipino, but consonant-ending words use \" na \"\n if (rightValue > leftValue && rightValue >= 100n) {\n // Words ending in consonants (not vowels) use \" na \" instead of \"ng\"\n const vowels = ['a', 'e', 'i', 'o', 'u']\n const lastChar = leftWord[leftWord.length - 1]\n if (!vowels.includes(lastChar)) {\n return {\n [`${leftWord} na ${rightWord}`]: leftValue * rightValue\n }\n }\n // Vowel-ending words add \"ng\"\n return {\n [`${leftWord}ng ${rightWord}`]: leftValue * rightValue\n }\n }\n\n // Special Filipino rule: certain tens words take \"-ng\" linker when followed by ones\n // Only limampu (50) confirmed to use this pattern\n if (leftValue >= 10n && leftValue < 100n && rightValue >= 1n && rightValue < 10n) {\n const tensWithNg = ['limampu']\n if (tensWithNg.includes(leftWord)) {\n return {\n [`${leftWord}ng ${rightWord}`]: leftValue + rightValue\n }\n }\n }\n\n // Default: space for addition\n return {\n [`${leftWord} ${rightWord}`]: leftValue + rightValue\n }\n }\n}\n\n/**\n * Convert a number to Filipino words\n *\n * @param {number|string|bigint} value - The number to convert\n * @param {Object} [options={}] - Conversion options\n * @returns {string} The Filipino word representation\n * @example\n * convertToWords(42) // 'apatnapu dalawa'\n * convertToWords(1000) // 'isang libo'\n * convertToWords(123456) // 'isang daang dalawampung tatlong libong apat na daang limampung anim'\n */\nexport default function convertToWords (value, options = {}) {\n return new FilipinoLanguage(options).convertToWords(value)\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar symmetricDifference = require('../internals/set-symmetric-difference');\nvar setMethodGetKeysBeforeCloning = require('../internals/set-method-get-keys-before-cloning-detection');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar FORCED = !setMethodAcceptSetLike('symmetricDifference') || !setMethodGetKeysBeforeCloning('symmetricDifference');\n\n// `Set.prototype.symmetricDifference` method\n// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n symmetricDifference: symmetricDifference\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","'use strict';\nvar uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');\nvar SetHelpers = require('../internals/set-helpers');\n\nmodule.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) {\n return set.size;\n};\n","import AbstractLanguage from '../classes/abstract-language.js'\n\n/**\n * Japanese language converter.\n *\n * Converts numbers to Japanese kanji numerals using the Sino-Japanese system:\n * - Uses kanji characters (一, 二, 三, etc.)\n * - Grouping by 万 (man, 10,000) and 億 (oku, 100,000,000)\n * - Unique scale units: 兆 (chō, trillion), 京 (kei, 10^16)\n * - Special rules for 1: omitted before 十 (10), 百 (100), 千 (1000), but kept for 万 and above\n *\n * Key Features:\n * - Sino-Japanese number system (standard for general counting)\n * - Grouping by powers of 10,000 (万-based system, not 1,000)\n * - Scale units: 万 (10^4), 億 (10^8), 兆 (10^12), 京 (10^16)\n * - Special handling of 一 (one) prefix\n * - Support for very large numbers up to 無量大数 (10^68)\n *\n * Algorithm:\n * 1. Split number into groups of 4 digits (万-based, not 3-digit thousand-based)\n * 2. Convert each group to kanji using special rules\n * 3. Append appropriate scale word (万, 億, 兆, etc.)\n * 4. Join all groups\n *\n * Special Rules:\n * - 10, 100, 1000: Don't use 一 prefix (十, 百, 千 not 一十, 一百, 一千)\n * - 10,000+: Keep 一 prefix (一万, 一億, 一兆)\n * - Zero: 零 or 〇 (both acceptable, 零 is more formal)\n */\nexport class Japanese extends AbstractLanguage {\n negativeWord = 'マイナス'\n decimalSeparatorWord = '点'\n zeroWord = '零'\n wordSeparator = '' // Japanese doesn't use spaces between characters\n convertDecimalsPerDigit = true // Enable digit-by-digit decimal conversion\n\n // Digits used for group conversion (1-9)\n digits = ['一', '二', '三', '四', '五', '六', '七', '八', '九']\n\n // Scale words for grouping by 10^4\n scales = [\n '', // 10^0 (ones)\n '万', // 10^4 (man)\n '億', // 10^8 (oku)\n '兆', // 10^12 (chō)\n '京', // 10^16 (kei)\n '垓', // 10^20 (gai)\n '秭', // 10^24 (jo/shi)\n '穣', // 10^28 (jō)\n '溝', // 10^32 (kō)\n '澗', // 10^36 (kan)\n '正', // 10^40 (sei)\n '載', // 10^44 (sai)\n '極', // 10^48 (goku)\n '恒河沙', // 10^52 (gōgasha)\n '阿僧祇', // 10^56 (asōgi)\n '那由他', // 10^60 (nayuta)\n '不可思議', // 10^64 (fukashigi)\n '無量大数' // 10^68 (muryōtaisū)\n ]\n\n /**\n * Converts a group of up to 4 digits to Japanese kanji.\n * Handles special rules for omitting 一 before 十, 百, 千.\n *\n * Rule: Within a group, omit 一 before 十/百/千 EXCEPT when:\n * - It's a lower group (not isTopGroup) AND\n * - It would be the only character in that position\n *\n * @param {bigint} num - Number from 0 to 9999\n * @param {boolean} isTopGroup - Whether this is the highest non-zero group\n * @returns {string} Japanese kanji representation\n */\n convertGroup (num, isTopGroup = false) {\n if (num === 0n) return ''\n\n const thousands = num / 1000n\n const hundreds = (num % 1000n) / 100n\n const tens = (num % 100n) / 10n\n const ones = num % 10n\n\n let result = ''\n\n // Thousands (千)\n if (thousands > 0n) {\n // Always omit 一 before 千 when thousands === 1\n if (thousands === 1n) {\n result += '千'\n } else {\n result += this.digits[Number(thousands) - 1] + '千'\n }\n }\n\n // Hundreds (百)\n if (hundreds > 0n) {\n // Always omit 一 before 百 when hundreds === 1\n if (hundreds === 1n) {\n result += '百'\n } else {\n result += this.digits[Number(hundreds) - 1] + '百'\n }\n }\n\n // Tens (十)\n if (tens > 0n) {\n // Always omit 一 before 十 when tens === 1\n if (tens === 1n) {\n result += '十'\n } else {\n result += this.digits[Number(tens) - 1] + '十'\n }\n }\n\n // Ones\n if (ones > 0n) {\n result += this.digits[Number(ones) - 1]\n }\n\n return result\n }\n\n /**\n * Converts a BigInt number to Japanese cardinal form.\n *\n * @param {bigint} number - The number to convert\n * @returns {string} Japanese kanji representation\n */\n convertWholePart (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n\n let temp = number\n let scaleIndex = 0\n const groups = []\n\n // Split into groups of 4 digits (万-based system)\n while (temp > 0n) {\n const group = temp % 10000n\n if (group > 0n) {\n groups.push({ value: group, scale: scaleIndex })\n }\n temp = temp / 10000n\n scaleIndex++\n }\n\n // Reverse to process from highest to lowest\n groups.reverse()\n\n let result = ''\n\n for (let i = 0; i < groups.length; i++) {\n const { value, scale } = groups[i]\n const isTopGroup = (i === 0)\n\n const groupStr = this.convertGroup(value, isTopGroup)\n\n // For scales >= 1 (万 and above), always add the scale word\n if (scale >= 1) {\n // Special case: if group is 1 and scale >= 1, we need 一 before the scale\n if (value === 1n) {\n result += '一' + this.scales[scale]\n } else {\n result += groupStr + this.scales[scale]\n }\n } else {\n result += groupStr\n }\n }\n\n return result\n }\n}\n\n/**\n * Converts a value to cardinal (written) form in Japanese.\n *\n * @param {number|string|bigint} value - Number to convert.\n * @param {Object} [options] - Options for the converter.\n * @returns {string} Value in Japanese kanji numerals.\n * @throws {Error} If value is invalid.\n *\n * @example\n * convertToWords(42, { lang: 'ja' }); // '四十二'\n * convertToWords(1000, { lang: 'ja' }); // '千'\n * convertToWords(10000, { lang: 'ja' }); // '一万'\n */\nexport default function convertToWords (value, options = {}) {\n return new Japanese(options).convertToWords(value)\n}\n","'use strict';\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","import TurkicLanguage from '../classes/turkic-language.js'\n\n/**\n * @typedef {Object} TurkishOptions\n * @property {boolean} [dropSpaces=false] Remove spaces between words if true.\n */\n\n/**\n * Turkish language converter.\n *\n * Inherits from TurkicLanguage shared patterns:\n * - Space-separated number combinations\n * - Omits '1' before hundreds and thousands\n * - Optional word spacing (dropSpaces option)\n * - Supports 'ş', 'ç', 'ğ', 'ı', 'ü', 'ö' characters\n */\nexport class Turkish extends TurkicLanguage {\n negativeWord = 'eksi'\n decimalSeparatorWord = 'virgül'\n zeroWord = 'sıfır'\n wordSeparator = ' '\n scaleWordPairs = [\n [1_000_000_000_000_000_000n, 'kentilyon'],\n [1_000_000_000_000_000n, 'katrilyon'],\n [1_000_000_000_000n, 'trilyon'],\n [1_000_000_000n, 'milyar'],\n [1_000_000n, 'milyon'],\n [1000n, 'bin'],\n [100n, 'yüz'],\n [90n, 'doksan'],\n [80n, 'seksen'],\n [70n, 'yetmiş'],\n [60n, 'altmış'],\n [50n, 'elli'],\n [40n, 'kırk'],\n [30n, 'otuz'],\n [20n, 'yirmi'],\n [10n, 'on'],\n [9n, 'dokuz'],\n [8n, 'sekiz'],\n [7n, 'yedi'],\n [6n, 'altı'],\n [5n, 'beş'],\n [4n, 'dört'],\n [3n, 'üç'],\n [2n, 'iki'],\n [1n, 'bir'],\n [0n, 'sıfır']\n ]\n\n /**\n * Initializes the Turkish converter with language-specific options.\n *\n * @param {TurkishOptions} [options={}] Configuration options.\n */\n constructor ({ dropSpaces = false } = {}) {\n super()\n\n this.dropSpaces = dropSpaces\n\n if (this.dropSpaces === true) {\n this.wordSeparator = ''\n }\n }\n}\n\n/**\n * Converts a number to Turkish cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options] Conversion options (see TR class).\n * @param {boolean} [options.dropSpaces=false] Remove spaces between words if true.\n * @returns {string} The number expressed in Turkish words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(42, { lang: 'tr' }); // 'kırk iki'\n * convertToWords(42, { lang: 'tr', dropSpaces: true }); // 'kırkiki'\n */\nexport default function convertToWords (value, options = {}) {\n return new Turkish(options).convertToWords(value)\n}\n","'use strict';\nvar store = require('../internals/shared-store');\n\nmodule.exports = function (key, value) {\n return store[key] || (store[key] = value || {});\n};\n","import SlavicLanguage from '../classes/slavic-language.js'\n\n/**\n * @typedef {Object} SlavicOptions\n * @property {boolean} [feminine=false] Use feminine forms for numbers.\n */\n\n/**\n * Polish language converter.\n *\n * Implements Polish number words using the Slavic language pattern:\n * - Polish number words (jeden, dwa, trzy, cztery, pięć...)\n * - Complex Slavic three-form pluralization (tysiąc/tysiące/tysięcy)\n * - Polish-specific declension patterns\n * - Distinctive Polish phonology and orthography\n *\n * Key Features:\n * - Three-form pluralization system shared across Slavic languages\n * * Form 1 (singular): 1 (e.g., \"tysiąc\")\n * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., \"tysiące\")\n * * Form 3 (many): all other numbers (e.g., \"tysięcy\")\n * - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)\n * - Large number handling via thousands[] array with indexed [singular, few, many] forms\n *\n * Features:\n * - Polish diacritical marks (ą, ć, ę, ł, ń, ś, ź, ż)\n * - Gender and case agreement\n * - Polish-specific number word endings\n *\n * Inherits from SlavicLanguage for complex pluralization algorithms.\n */\nexport class Polish extends SlavicLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'przecinek'\n zeroWord = 'zero'\n ones = {\n 1: 'jeden',\n 2: 'dwa',\n 3: 'trzy',\n 4: 'cztery',\n 5: 'pięć',\n 6: 'sześć',\n 7: 'siedem',\n 8: 'osiem',\n 9: 'dziewięć'\n }\n\n tens = {\n 0: 'dziesięć',\n 1: 'jedenaście',\n 2: 'dwanaście',\n 3: 'trzynaście',\n 4: 'czternaście',\n 5: 'piętnaście',\n 6: 'szesnaście',\n 7: 'siedemnaście',\n 8: 'osiemnaście',\n 9: 'dziewiętnaście'\n }\n\n twenties = {\n 2: 'dwadzieścia',\n 3: 'trzydzieści',\n 4: 'czterdzieści',\n 5: 'pięćdziesiąt',\n 6: 'sześćdziesiąt',\n 7: 'siedemdziesiąt',\n 8: 'osiemdziesiąt',\n 9: 'dziewięćdziesiąt'\n }\n\n hundreds = {\n 1: 'sto',\n 2: 'dwieście',\n 3: 'trzysta',\n 4: 'czterysta',\n 5: 'pięćset',\n 6: 'sześćset',\n 7: 'siedemset',\n 8: 'osiemset',\n 9: 'dziewięćset'\n }\n\n thousands = {\n 1: ['tysiąc', 'tysiące', 'tysięcy'], // 10^ 3\n 2: ['milion', 'miliony', 'milionów'], // 10^ 6\n 3: ['miliard', 'miliardy', 'miliardów'], // 10^ 9\n 4: ['bilion', 'biliony', 'bilionów'], // 10^ 12\n 5: ['biliard', 'biliardy', 'biliardów'], // 10^ 15\n 6: ['trylion', 'tryliony', 'trylionów'], // 10^ 18\n 7: ['tryliard', 'tryliardy', 'tryliardów'], // 10^ 21\n 8: ['kwadrylion', 'kwadryliony', 'kwadrylionów'], // 10^ 24\n 9: ['kwaryliard', 'kwadryliardy', 'kwadryliardów'], // 10^ 27\n 10: ['kwintylion', 'kwintyliony', 'kwintylionów'] // 10^ 30\n }\n\n /**\n * Implements Polish-specific three-form pluralization rules.\n *\n * Polish three-form system:\n * - Form 1 (singular): exactly n=1 (e.g., \"tysiąc\")\n * - Form 2 (few): n ends in 2-4, excluding teens (22-24, 32-34...) (e.g., \"tysiące\")\n * - Form 3 (many): all other numbers (e.g., \"tysięcy\")\n *\n * @param {bigint} n The number to classify.\n * @param {Array<string>} forms Array of [singular, few, many] word forms.\n * @returns {string} The appropriate form for the number n.\n */\n pluralize (n, forms) {\n if (n === 1n) {\n return forms[0]\n }\n\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if (lastDigit < 5n && lastDigit > 1n && (lastTwoDigits < 10n || lastTwoDigits > 20n)) {\n return forms[1]\n }\n\n return forms[2]\n }\n\n /**\n * Converts a whole number to Polish cardinal form.\n *\n * Algorithm (chunk-based decomposition):\n * 1. Split number into chunks of 3 digits (right-to-left): ones, thousands, millions, etc.\n * 2. For each non-zero chunk:\n * a. Extract hundreds digit (n3), tens digit (n2), ones digit (n1)\n * b. Add hundreds word (e.g., \"sto\", \"dwieście\")\n * c. Add tens/ones (handles teens 10-19 separately from compound tens)\n * d. Add pluralized magnitude word (e.g., \"tysiące\", \"miliony\")\n * 3. Join all words with spaces\n *\n * Example: 1234 → chunks [1, 234] → \"jeden tysiąc dwieście trzydzieści cztery\"\n * - Chunk 1 (index=1, thousands): \"jeden\" + \"tysiąc\"\n * - Chunk 234 (index=0): \"dwieście\" + \"trzydzieści\" + \"cztery\"\n *\n * Special case: When chunk=1 at thousands+ levels, omit the ones word to avoid\n * redundancy with the pluralized magnitude (e.g., just \"tysiąc\" not \"jeden tysiąc\").\n *\n * @param {bigint} number The whole number to convert.\n * @returns {string} The number expressed in Polish words.\n */\n convertWholePart (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n const words = []\n const chunks = this.splitByX(number.toString(), 3)\n let index = chunks.length\n for (const x of chunks) {\n index = index - 1\n if (x === 0n) {\n continue\n }\n const [n1, n2, n3] = this.getDigits(x)\n if (n3 > 0n) {\n words.push(this.hundreds[n3])\n }\n if (n2 > 1n) {\n words.push(this.twenties[n2])\n }\n if (n2 === 1n) {\n words.push(this.tens[n1])\n } else if (n1 > 0n && !(index > 0 && x === 1n)) {\n words.push(this.ones[n1])\n }\n if (index > 0) {\n words.push(this.pluralize(x, this.thousands[index]))\n }\n }\n return words.join(' ')\n }\n}\n\n/**\n * Converts a number to Polish cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {SlavicOptions} [options={}] Configuration options.\n * @returns {string} The number expressed in Polish words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Polish(options).convertToWords(value)\n}\n","import AbstractLanguage from '../classes/abstract-language.js'\n\n/**\n * Persian (Farsi) language converter.\n *\n * Converts numbers to Persian words using Persian-Arabic numerals:\n * - Right-to-left script orientation\n * - Base-10 decimal system with Persian number words\n * - Conjunction \"و\" (va/and) for compound numbers\n * - Traditional Persian number naming conventions\n *\n * Key Features:\n * - Named number lookup table (namedNumbers) for direct mapping 0-999\n * - Group-based algorithm for numbers >= 1000:\n * 1. Split into groups of 3 digits\n * 2. Convert each group to words using named table or recursion\n * 3. Append magnitude word (هزار/میلیون/میلیارد)\n * 4. Join with \"و\" (and) conjunction\n * - Special compound forms (دویست for 200, سیصد for 300)\n * - Proper Persian grammatical structure\n * - Support for large numbers (thousands, millions, billions, trillions)\n *\n * Features:\n * - Native Persian digits and words\n * - Special compound forms (e.g., دویست for 200, سیصد for 300)\n * - Support for large numbers (thousands, millions)\n * - Proper Persian grammatical structure\n */\nexport class Farsi extends AbstractLanguage {\n negativeWord = 'منفى'\n decimalSeparatorWord = 'ممیّز'\n zeroWord = 'صفر'\n namedNumbers = {\n 0: 'صفر',\n 1: 'یک',\n 2: 'دو',\n 3: 'سه',\n 4: 'چهار',\n 5: 'پنج',\n 6: 'شش',\n 7: 'هفت',\n 8: 'هشت',\n 9: 'نه',\n 10: 'ده',\n 11: 'یازده',\n 12: 'دوازده',\n 13: 'سیزده',\n 14: 'چهارده',\n 15: 'پانزده',\n 16: 'شانزده',\n 17: 'هفده',\n 18: 'هجده',\n 19: 'نوزده',\n 20: 'بیست',\n 30: 'سی',\n 40: 'چهل',\n 50: 'پنجاه',\n 60: 'شصت',\n 70: 'هفتاد',\n 80: 'هشتاد',\n 90: 'نود',\n 100: 'صد',\n 200: 'دویست',\n 300: 'سيصد',\n 400: 'چهار صد',\n 500: 'پانصد',\n 600: 'ششصد',\n 700: 'هفتصد',\n 800: 'هشتصد',\n 900: 'نهصد',\n 1000: 'هزار',\n 1_000_000: 'میلیون'\n }\n\n convertWholePart (number) {\n if (this.namedNumbers[number] && number !== 1_000_000n) {\n return this.namedNumbers[number]\n }\n\n if (number > 20n && number < 100n) {\n const xone = number % 10n\n const xten = number - xone\n return `${this.namedNumbers[xten]} و ${this.namedNumbers[xone]}`\n }\n\n if (number > 100n && number < 1000n) {\n const xhundred = 100n * (number / 100n)\n const tail = this.convertWholePart(number - xhundred)\n return `${this.namedNumbers[xhundred]} و ${tail}`\n }\n\n if (number > 1000n && number < 1_000_000n) {\n const thousandMultiplier = number / 1000n\n const namedThousandMultiplier =\n (thousandMultiplier === 1n\n ? ''\n : this.convertWholePart(thousandMultiplier)) +\n ' ' +\n this.namedNumbers[1000]\n const tailNumber = number - thousandMultiplier * 1000n\n const tail = tailNumber === 0n ? '' : ' ' + this.convertWholePart(tailNumber)\n return `${namedThousandMultiplier}${tail}`\n }\n\n if (number >= 1_000_000n) {\n const millionMultiplier = number / 1_000_000n\n const namedMillion =\n this.convertWholePart(millionMultiplier) + ' ' + this.namedNumbers[1_000_000]\n const tailNumber = number - millionMultiplier * 1_000_000n\n const tail = tailNumber === 0n ? '' : ' و ' + this.convertWholePart(tailNumber)\n return `${namedMillion}${tail}`\n }\n }\n}\n\n/**\n * Converts a number to Persian cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options={}] Configuration options.\n * @returns {string} The number expressed in Persian words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Farsi(options).convertToWords(value)\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar isSubsetOf = require('../internals/set-is-subset-of');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar INCORRECT = !setMethodAcceptSetLike('isSubsetOf', function (result) {\n return result;\n});\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issubsetof\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n isSubsetOf: isSubsetOf\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a !== 7;\n});\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar aCallable = require('../internals/a-callable');\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n aCallable(fn);\n return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","import SlavicLanguage from '../classes/slavic-language.js'\n\n/**\n * @typedef {Object} SlavicOptions\n * @property {boolean} [feminine=false] Use feminine forms for numbers.\n */\n\n/**\n * Croatian language converter.\n *\n * Implements Croatian number words using the Slavic language pattern:\n * - Croatian number words (jedan/jedna, dva/dvije, tri, četiri...)\n * - Gender-aware forms (masculine/feminine)\n * - Slavic three-form pluralization (tisuća/tisuće/tisuća)\n * - Croatian-specific declension endings\n *\n * Key Features:\n * - Three-form pluralization system shared across Slavic languages\n * * Form 1 (singular): 1 (e.g., \"tisuća\")\n * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., \"tisuće\")\n * * Form 3 (many): all other numbers (e.g., \"tisuća\")\n * - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)\n * - Large number handling via thousands[] array with indexed [singular, few, many] forms\n * - Gender-specific number forms for 1 and 2 (masculine/feminine dual forms)\n *\n * Features:\n * - Dual gender forms for 1 and 2 (jedan/jedna, dva/dvije)\n * - Latin script orthography\n * - Similar structure to Serbian\n *\n * Inherits from SlavicLanguage for complex pluralization algorithms.\n */\nexport class Croatian extends SlavicLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'zarez'\n zeroWord = 'nula'\n ones = {\n 1: ['jedan', 'jedna'],\n 2: ['dva', 'dvije'],\n 3: ['tri', 'tri'],\n 4: ['četiri', 'četiri'],\n 5: ['pet', 'pet'],\n 6: ['šest', 'šest'],\n 7: ['sedam', 'sedam'],\n 8: ['osam', 'osam'],\n 9: ['devet', 'devet']\n }\n\n tens = {\n 0: 'deset',\n 1: 'jedanaest',\n 2: 'dvanaest',\n 3: 'trinaest',\n 4: 'četrnaest',\n 5: 'petnaest',\n 6: 'šesnaest',\n 7: 'sedamnaest',\n 8: 'osamnaest',\n 9: 'devetnaest'\n }\n\n twenties = {\n 2: 'dvadeset',\n 3: 'trideset',\n 4: 'četrdeset',\n 5: 'pedeset',\n 6: 'šezdeset',\n 7: 'sedamdeset',\n 8: 'osamdeset',\n 9: 'devedeset'\n }\n\n hundreds = {\n 1: 'sto',\n 2: 'dvjesto',\n 3: 'tristo',\n 4: 'četiristo',\n 5: 'petsto',\n 6: 'šesto',\n 7: 'sedamsto',\n 8: 'osamsto',\n 9: 'devetsto'\n }\n\n SCALE = {\n 0: ['', '', '', false],\n 1: ['tisuća', 'tisuće', 'tisuća', true], // 10 ^ 3\n 2: ['milijun', 'milijuna', 'milijuna', false], // 10 ^ 6\n 3: ['milijarda', 'milijarde', 'milijarda', false], // 10 ^ 9\n 4: ['bilijun', 'bilijuna', 'bilijuna', false], // 10 ^ 12\n 5: ['bilijarda', 'bilijarde', 'bilijarda', false], // 10 ^ 15\n 6: ['trilijun', 'trilijuna', 'trilijuna', false], // 10 ^ 18\n 7: ['trilijarda', 'trilijarde', 'trilijarda', false], // 10 ^ 21\n 8: ['kvadrilijun', 'kvadrilijuna', 'kvadrilijuna', false], // 10 ^ 24\n 9: ['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda', false], // 10 ^ 27\n 10: ['kvintilijun', 'kvintilijuna', 'kvintilijuna', false] // 10 ^ 30\n }\n\n pluralize (n, forms) {\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit === 1n) {\n return forms[0]\n }\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit > 1n && lastDigit < 5n) {\n return forms[1]\n }\n\n return forms[2]\n }\n\n convertWholePart (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n const words = []\n const chunks = this.splitByX(number.toString(), 3)\n let index = chunks.length\n for (const x of chunks) {\n index = index - 1\n const [n1, n2, n3] = this.getDigits(x)\n if (n3 > 0n) {\n words.push(this.hundreds[n3])\n }\n if (n2 > 1n) {\n words.push(this.twenties[n2])\n }\n if (n2 === 1n) {\n words.push(this.tens[n1])\n } else if (n1 > 0n) {\n const isFeminine = (this.feminine || this.SCALE[index][3])\n const genderIndex = isFeminine ? 1 : 0\n words.push(this.ones[n1][genderIndex])\n }\n if ((index > 0) && (x !== 0n)) {\n words.push(this.pluralize(x, this.SCALE[index]))\n }\n }\n return words.join(' ')\n }\n}\n\n/**\n * Converts a number to Croatian cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options={}] Configuration options.\n * @param {boolean} [options.feminine=false] Use feminine forms for numbers.\n * @returns {string} The number expressed in Croatian words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Croatian(options).convertToWords(value)\n}\n","'use strict';\nvar shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","'use strict';\nvar toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar defineBuiltIn = require('../internals/define-built-in');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) defineBuiltIn(target, key, src[key], options);\n return target;\n};\n","/**\n * Abstract base class for language converters.\n *\n * What this class handles:\n * - Validates and normalizes caller input (`number | string | bigint`), rejecting NaN/invalid strings.\n * - Splits sign, whole, and decimal parts, caching the whole part for languages that need it.\n * - Delegates whole-number wording to `convertWholePart(wholeNumber)` implemented by subclasses.\n * - Converts decimals via `decimalDigitsToWords()`, preserving leading zeros and supporting per-digit mode when `convertDecimalsPerDigit` is true.\n *\n * What subclasses must provide:\n * - `convertWholePart(wholeNumber)` method implementation (required; abstract).\n * - `negativeWord` class property (word preceding negative numbers, e.g., \"minus\").\n * - `zeroWord` class property (word for digit 0, e.g., \"zero\").\n * - `decimalSeparatorWord` class property (word between whole and decimal, e.g., \"point\").\n * - `wordSeparator` class property (word separator in output, typically a space).\n * Optional: override `convertDecimalsPerDigit`, `digits`, or `convertDigitToWord()` for custom behavior.\n *\n * This class stays minimal; language grammar lives in subclasses.\n *\n * @abstract\n */\nclass AbstractLanguage {\n /**\n * Word that precedes negative numbers (e.g., \"minus\", \"negative\", \"moins\").\n * @type {string}\n */\n negativeWord = ''\n\n /**\n * Word that separates whole and decimal parts (e.g., \"point\", \"virgule\", \"comma\").\n * @type {string}\n */\n decimalSeparatorWord = ''\n\n /**\n * Word representation for the digit 0 (e.g., \"zero\", \"zéro\", \"null\").\n * @type {string}\n */\n zeroWord = ''\n\n /**\n * Character(s) used to separate words in the output (typically a space).\n * @type {string}\n */\n wordSeparator = ' '\n\n /**\n * Cached whole number portion from the most recent conversion.\n * Some languages need access to this value during conversion for\n * pluralization rules or special cases (e.g., Czech, Hebrew).\n * @type {bigint}\n */\n cachedWholeNumber = 0n\n\n /**\n * Whether to convert decimal digits individually rather than grouped.\n * - `true`: Each digit converted separately (e.g., \"05\" → \"zero five\")\n * - `false`: Leading zeros preserved, remaining grouped (e.g., \"14\" → \"fourteen\")\n * Used by languages like Japanese, Thai, Tamil, Telugu.\n * @type {boolean}\n */\n convertDecimalsPerDigit = false\n\n /**\n * Optional array of digit words for direct lookup in `convertDigitToWord()`.\n * - Length 10: indices 0–9 map directly to digit words\n * - Length 9: indices 0–8 map to words for digits 1–9\n * - `null`: Falls back to `convertWholePart()` for digit conversion\n * @type {string[]|null}\n */\n digits = null\n\n /**\n * Convert a single decimal digit (0-9) to its word representation.\n *\n * Default behavior:\n * - 0 returns the language's `zeroWord`\n * - If a `digits` array is present, use it for direct lookup\n * - Length 10: indices 0–9 map directly\n * - Length 9: indices 1–9 map via `idx - 1`\n * - Otherwise delegate to `convertWholePart(digit)`\n *\n * Subclasses may override this for custom logic.\n *\n * @protected\n * @param {bigint} digit A single digit value (0-9) as BigInt\n * @returns {string} The word representation of the digit\n */\n convertDigitToWord (digit) {\n const idx = Number(digit)\n if (idx === 0) return this.zeroWord\n\n if (Array.isArray(this.digits)) {\n if (this.digits.length === 10) {\n return this.digits[idx] ?? this.zeroWord\n }\n if (this.digits.length === 9) {\n return this.digits[idx - 1] ?? this.zeroWord\n }\n }\n\n return this.convertWholePart(digit)\n }\n\n /**\n * Convert the decimal fractional digits into words.\n *\n * Behavior depends on the `convertDecimalsPerDigit` class property:\n *\n * **Per-digit mode** (`convertDecimalsPerDigit: true`):\n * - Each decimal digit is converted individually using `convertDigitToWord()`\n * - Example: \"05\" -> [zero, 'five'], \"14\" -> ['one', 'four']\n * - Used by: Japanese, Thai, Tamil, Telugu\n *\n * **Grouped mode** (default, `convertDecimalsPerDigit: false`):\n * - Leading zeros are preserved as individual `zeroWord` entries\n * - Remaining digits are grouped and converted as a number\n * - Example: \"05\" -> [zero, 'five'], \"14\" -> ['fourteen']\n * - Used by: Most languages (English, Spanish, French, etc.)\n *\n * @protected\n * @param {string} decimalString The decimal digits as a string (e.g. `'05'` for 3.05).\n * @returns {Array<string>} Array of word tokens representing the fractional part.\n *\n * @example\n * // Per-digit mode\n * decimalDigitsToWords('05'); // -> [this.zeroWord, 'five']\n * decimalDigitsToWords('14'); // -> ['one', 'four']\n *\n * // Grouped mode\n * decimalDigitsToWords('05'); // -> [this.zeroWord, 'five']\n * decimalDigitsToWords('14'); // -> ['fourteen']\n */\n decimalDigitsToWords (decimalString) {\n const words = []\n const len = decimalString.length\n\n if (this.convertDecimalsPerDigit) {\n for (let i = 0; i < len; i++) {\n const decimalDigit = BigInt(decimalString[i])\n words.push(this.convertDigitToWord(decimalDigit))\n }\n return words\n }\n\n // Default grouped-decimal behavior with leading zero preservation\n let i = 0\n while (i < len && decimalString[i] === '0') {\n words.push(this.zeroWord)\n i++\n }\n\n if (i === len) return words\n\n const remainingDigits = decimalString.slice(i)\n words.push(this.convertWholePart(BigInt(remainingDigits)))\n\n return words\n }\n\n /**\n * Convert a numeric input into its language cardinal representation.\n *\n * This is the public entry point used by consumers. It normalizes the input\n * (accepting `number | string | bigint`), validates it, splits sign and\n * fractional parts, and delegates whole-number conversion to\n * `convertWholePart(BigInt)` and fractional conversion to `decimalDigitsToWords()`.\n *\n * Errors and validation:\n * - Passing `NaN` (as `number`) throws `TypeError`.\n * - Passing a non-numeric `string` throws `Error`.\n * - Passing an unsupported type throws `TypeError`.\n *\n * @public\n * @param {number|string|bigint} value Numeric input to convert. Strings may include a single `.` decimal marker.\n * @returns {string} The localized cardinal string.\n * @throws {TypeError|Error} For invalid input as described above.\n */\n convertToWords (value) {\n // Normalize and validate input\n const inputType = typeof value\n\n if (inputType === 'number') {\n if (Number.isNaN(value)) throw new TypeError('NaN is not an accepted number.')\n value = value.toString()\n } else if (inputType === 'string') {\n value = value.trim()\n if (value.length === 0 || Number.isNaN(Number(value))) { throw new Error('Invalid number format: \"' + value + '\"') }\n } else if (inputType !== 'bigint') {\n throw new TypeError(\n 'Invalid variable type, expected number|string|bigint, received: ' + inputType\n )\n }\n\n const words = []\n\n // Detect negativity and strip sign for further processing.\n // Must check before type coercion for BigInt (comparison works but slice does not).\n let isNegative = false\n if (inputType === 'bigint') {\n if (value < 0n) {\n isNegative = true\n value = -value\n }\n } else {\n // For strings, check first character before normalization\n if (value[0] === '-') {\n isNegative = true\n value = value.slice(1)\n }\n }\n\n // Extract whole and decimal parts based on type.\n // BigInt has no decimal point; strings may contain a single '.'.\n // Default whole part to '0' if empty (e.g., '.5' -> '0' + '.5')\n let wholeNumber\n let decimalPart\n if (inputType === 'bigint') {\n wholeNumber = value\n } else {\n const decimalPointIndex = value.indexOf('.')\n if (decimalPointIndex === -1) {\n wholeNumber = BigInt(value)\n } else {\n const wholePartString = value.slice(0, decimalPointIndex) || '0'\n wholeNumber = BigInt(wholePartString)\n decimalPart = value.slice(decimalPointIndex + 1)\n }\n }\n\n this.cachedWholeNumber = wholeNumber\n\n if (isNegative) words.push(this.negativeWord)\n\n words.push(this.convertWholePart(wholeNumber))\n\n // Append decimal portion if present (separator + fractional digits)\n if (decimalPart) {\n words.push(this.decimalSeparatorWord)\n words.push(...this.decimalDigitsToWords(decimalPart))\n }\n\n return words.join(this.wordSeparator)\n }\n\n /**\n * Convert a BigInt whole number to its cardinal word representation.\n *\n * This is a template method that subclasses MUST implement to provide\n * language-specific number conversion logic.\n *\n * @abstract\n * @param {bigint} wholeNumber The whole number part to convert\n * @returns {string} The cardinal representation in the target language\n */\n convertWholePart (wholeNumber) {\n throw new Error('convertWholePart() must be implemented by subclass')\n }\n}\n\nexport default AbstractLanguage\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n};\n","import GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * Swedish language converter.\n *\n * Converts numbers to Swedish words, supporting:\n * - Negative numbers (prepended with \"minus\")\n * - Decimal numbers (word \"komma\" between whole and fractional parts)\n * - Numbers up to quadrillions\n *\n * Merge rules:\n * - Hyphenated for compound tens (e.g., \"tjugo-tre\")\n * - \"och\" (and) after hundreds (e.g., \"hundra och ett\")\n * - Space-separated for larger composites (e.g., \"en miljon\")\n */\nexport class Swedish extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'komma'\n zeroWord = 'noll'\n wordSeparator = ' '\n scaleWordPairs = [\n [1_000_000_000_000_000_000_000_000_000n, 'kvadriljon'],\n [1_000_000_000_000_000_000_000_000n, 'triljon'],\n [1_000_000_000_000_000_000_000n, 'biljon'],\n [1_000_000_000_000_000_000n, 'miljard'],\n [1_000_000_000_000n, 'biljon'],\n [1_000_000_000n, 'miljard'],\n [1_000_000n, 'miljon'],\n [1000n, 'tusen'],\n [100n, 'hundra'],\n [90n, 'nittio'],\n [80n, 'åttio'],\n [70n, 'sjuttio'],\n [60n, 'sextio'],\n [50n, 'femtio'],\n [40n, 'fyrtio'],\n [30n, 'trettio'],\n [20n, 'tjugo'],\n [19n, 'nitton'],\n [18n, 'arton'],\n [17n, 'sjutton'],\n [16n, 'sexton'],\n [15n, 'femton'],\n [14n, 'fjorton'],\n [13n, 'tretton'],\n [12n, 'tolv'],\n [11n, 'elva'],\n [10n, 'tio'],\n [9n, 'nio'],\n [8n, 'åtta'],\n [7n, 'sju'],\n [6n, 'sex'],\n [5n, 'fem'],\n [4n, 'fyra'],\n [3n, 'tre'],\n [2n, 'två'],\n [1n, 'ett'],\n [0n, 'noll']\n ]\n\n /**\n * Merges two adjacent word-number pairs according to Swedish grammar rules.\n *\n * Swedish-specific rules:\n * - Implicit \"ett\": `mergeScales({ 'ett': 1n }, { 'hundra': 100n })` → `{ 'hundra': 100n }`\n * - Hyphenated compounds: `mergeScales({ 'tjugo': 20n }, { 'tre': 3n })` → `{ 'tjugo-tre': 23n }`\n * - \"och\" after hundreds: `mergeScales({ 'hundra': 100n }, { 'ett': 1n })` → `{ 'hundra och ett': 101n }`\n * - \"en\" for millions: `mergeScales({ 'ett': 1n }, { 'miljon': 1000000n })` → `{ 'en miljon': 1000000n }`\n *\n * @param {Object} leftPair Left word-set as `{ word: BigInt }`.\n * @param {Object} rightPair Right word-set as `{ word: BigInt }`.\n * @returns {Object} Merged pair with combined word and resulting numeric value.\n *\n * @example\n * mergeScales({ 'ett': 1n }, { 'hundra': 100n }); // { 'hundra': 100n }\n * mergeScales({ 'tjugo': 20n }, { 'tre': 3n }); // { 'tjugo-tre': 23n }\n */\n mergeScales (leftPair, rightPair) {\n const leftWord = Object.keys(leftPair)[0]\n const rightWord = Object.keys(rightPair)[0]\n const leftNumber = Object.values(leftPair)[0]\n const rightNumber = Object.values(rightPair)[0]\n\n if (leftNumber === 1n && rightNumber < 100n) {\n return rightPair\n }\n\n // Omit 'ett' before 'hundra' and 'tusen'\n if (leftNumber === 1n && (rightNumber === 100n || rightNumber === 1000n)) {\n return rightPair\n }\n\n if (leftNumber < 100n && leftNumber > rightNumber) {\n return { [`${leftWord}-${rightWord}`]: leftNumber + rightNumber }\n }\n\n if (leftNumber >= 100n && rightNumber < 100n) {\n return { [`${leftWord} och ${rightWord}`]: leftNumber + rightNumber }\n }\n\n if (rightNumber > leftNumber) {\n if (leftNumber === 1n && rightNumber >= 1_000_000n) {\n return { [`en ${rightWord}`]: leftNumber * rightNumber }\n }\n return { [`${leftWord} ${rightWord}`]: leftNumber * rightNumber }\n }\n\n return { [`${leftWord} ${rightWord}`]: leftNumber + rightNumber }\n }\n}\n\n/**\n * Converts a number to Swedish cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options] Conversion options (see Swedish class options).\n * @returns {string} The number expressed in Swedish words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(42); // 'fyrtio-två'\n * convertToWords('1.5'); // 'ett komma fem'\n */\nexport default function convertToWords (value, options = {}) {\n return new Swedish(options).convertToWords(value)\n}\n","'use strict';\nmodule.exports = false;\n","import { French } from './fr.js'\n\n/**\n * @typedef {Object} BelgianFrenchOptions\n * @property {boolean} [withHyphenSeparator=false] Use hyphens (true) instead of spaces (false) in compounds.\n */\n\n/**\n * Belgian French language converter.\n *\n * Extends the French converter with Belgian French regional variant:\n * - Uses \"septante\" (70) instead of \"soixante-dix\"\n * - Uses \"nonante\" (90) instead of \"quatre-vingt-dix\"\n * - Maintains standard French \"quatre-vingts\" for 80\n * - More regular and logical number system than standard French\n *\n * Features:\n * - Regional number word variations (septante, nonante)\n * - Simplified tens naming (no complex arithmetic)\n * - Inherits all other French grammar rules from FR class\n * - Same pluralization and hyphenation patterns as standard French\n */\nexport class BelgianFrench extends French {\n /**\n * Initializes the Belgian French converter.\n *\n * @param {BelgianFrenchOptions} [options={}] Configuration options.\n */\n constructor (options = {}) {\n super(options)\n // Fill the empty placeholder slots with Belgian variants\n // First empty slot (index 10) is for 90n (between 100n and 80n)\n // Second empty slot (index 12) is for 70n (between 80n and 60n)\n this.scaleWordPairs = this.scaleWordPairs.map((pair, index) => {\n if (Array.isArray(pair) && pair.length === 0) {\n // Check next pair to determine which slot this is\n const nextPair = this.scaleWordPairs[index + 1]\n if (nextPair && nextPair[0] === 80n) {\n return [90n, 'nonante']\n } else if (nextPair && nextPair[0] === 60n) {\n return [70n, 'septante']\n }\n }\n return pair\n })\n }\n}\n\n/**\n * Converts a number to Belgian French cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options={}] Configuration options.\n * @param {boolean} [options.withHyphenSeparator=false] Use hyphens (true) instead of spaces (false) in compounds.\n * @returns {string} The number expressed in Belgian French words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new BelgianFrench(options).convertToWords(value)\n}\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] === undefined) {\n defineProperty(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.dontCallGetSet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = globalThis;\n } else if (STATIC) {\n target = globalThis[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = globalThis[TARGET] && globalThis[TARGET].prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n","import SlavicLanguage from '../classes/slavic-language.js'\n\n/**\n * @typedef {Object} SlavicOptions\n * @property {boolean} [feminine=false] Use feminine forms for numbers.\n */\n\n/**\n * Czech language converter.\n *\n * Implements Czech number words using the Slavic language pattern:\n * - Czech number words (jedna, dva, tři, čtyři, pět...)\n * - Slavic three-form pluralization (tisíc/tisíce/tisíc)\n * - Gender agreement for numbers 1-2\n * - Czech-specific number word endings\n *\n * Key Features:\n * - Three-form pluralization system shared across Slavic languages\n * * Form 1 (singular): 1 (e.g., \"tisíc\")\n * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., \"tisíce\")\n * * Form 3 (many): all other numbers (e.g., \"tisíc\")\n * - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)\n * - Large number handling via thousands[] array with indexed [singular, few, many] forms\n *\n * Inherits from SlavicLanguage:\n * - Complex pluralization rules (one/few/many forms)\n * - Group-based large number handling (chunk decomposition via splitByX())\n * - Proper declension patterns via pluralize() method\n */\nexport class Czech extends SlavicLanguage {\n negativeWord = 'mínus'\n zeroWord = 'nula'\n ones = {\n 1: 'jedna',\n 2: 'dva',\n 3: 'tři',\n 4: 'čtyři',\n 5: 'pět',\n 6: 'šest',\n 7: 'sedm',\n 8: 'osm',\n 9: 'devět'\n }\n\n tens = {\n 0: 'deset',\n 1: 'jedenáct',\n 2: 'dvanáct',\n 3: 'třináct',\n 4: 'čtrnáct',\n 5: 'patnáct',\n 6: 'šestnáct',\n 7: 'sedmnáct',\n 8: 'osmnáct',\n 9: 'devatenáct'\n }\n\n twenties = {\n 2: 'dvacet',\n 3: 'třicet',\n 4: 'čtyřicet',\n 5: 'padesát',\n 6: 'šedesát',\n 7: 'sedmdesát',\n 8: 'osmdesát',\n 9: 'devadesát'\n }\n\n hundreds = {\n 1: 'sto',\n 2: 'dvě stě',\n 3: 'tři sta',\n 4: 'čtyři sta',\n 5: 'pět set',\n 6: 'šest set',\n 7: 'sedm set',\n 8: 'osm set',\n 9: 'devět set'\n }\n\n thousands = {\n 1: ['tisíc', 'tisíce', 'tisíc'], // 10^ 3\n 2: ['milion', 'miliony', 'milionů'], // 10^ 6\n 3: ['miliarda', 'miliardy', 'miliard'], // 10^ 9\n 4: ['bilion', 'biliony', 'bilionů'], // 10^ 12\n 5: ['biliarda', 'biliardy', 'biliard'], // 10^ 15\n 6: ['trilion', 'triliony', 'trilionů'], // 10^ 18\n 7: ['triliarda', 'triliardy', 'triliard'], // 10^ 21\n 8: ['kvadrilion', 'kvadriliony', 'kvadrilionů'], // 10^ 24\n 9: ['kvadriliarda', 'kvadriliardy', 'kvadriliard'], // 10^ 27\n 10: ['quintillion', 'quintilliony', 'quintillionů'] // 10^ 30\n }\n\n /**\n * Returns the Czech word for the decimal separator based on the whole number.\n *\n * @returns {string} The Czech word for the decimal separator.\n */\n get decimalSeparatorWord () {\n if (this.cachedWholeNumber === 0n || this.cachedWholeNumber === 1n) {\n return 'celá'\n } else if (this.cachedWholeNumber >= 2n && this.cachedWholeNumber <= 4n) {\n return 'celé'\n } else {\n return 'celých'\n }\n }\n\n /**\n * Initializes the Czech converter with language-specific options.\n *\n * @param {SlavicOptions} [options={}] Configuration options (inherited from SlavicLanguage).\n */\n constructor (options = {}) {\n super(options)\n\n // Remove the inherited decimalSeparatorWord property so our getter works\n delete this.decimalSeparatorWord\n }\n\n /**\n * Implements Czech-specific three-form pluralization rules.\n *\n * Czech three-form system:\n * - Form 1 (singular): exactly n=1 (e.g., \"tisíc\")\n * - Form 2 (few): n ends in 2-4, excluding teens (22-24, 32-34...) (e.g., \"tisíce\")\n * - Form 3 (many): all other numbers (e.g., \"tisíc\" for 0, 5+)\n *\n * @param {bigint} n The number to classify.\n * @param {Array<string>} forms Array of [singular, few, many] word forms.\n * @returns {string} The appropriate form for the number n.\n */\n pluralize (n, forms) {\n if (n === 1n) {\n return forms[0]\n }\n\n // Check if n is in the \"few\" form range (2-4, 22-24, 32-34, etc., excluding teens)\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if (lastDigit > 1n && lastDigit < 5n && (lastTwoDigits < 10n || lastTwoDigits > 20n)) {\n return forms[1]\n }\n\n return forms[2]\n }\n\n /**\n * Converts a whole number to Czech cardinal form.\n *\n * Algorithm (chunk-based decomposition):\n * 1. Split number into chunks of 3 digits (right-to-left): ones, thousands, millions, etc.\n * 2. For each non-zero chunk:\n * a. Extract hundreds digit (n3), tens digit (n2), ones digit (n1)\n * b. Add hundreds word (e.g., \"sto\", \"dvě stě\")\n * c. Add tens/ones (handles teens 10-19 separately from compound tens)\n * d. Add pluralized magnitude word (e.g., \"tisíce\", \"miliony\")\n * 3. Join all words with spaces\n *\n * Example: 1234 → chunks [1, 234] → \"jeden tisíc dvěstěčtyřicet\"\n * - Chunk 1 (index=1, thousands): \"jeden\" + \"tisíc\"\n * - Chunk 234 (index=0): \"dvě stě\" + \"třicet\" + \"čtyři\"\n *\n * Special case: When chunk=1 at thousands+ levels, omit the ones word to avoid\n * redundancy with the pluralized magnitude (e.g., just \"tisíc\" not \"jeden tisíc\").\n *\n * @param {bigint} number The whole number to convert.\n * @returns {string} The number expressed in Czech words.\n */\n convertWholePart (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n const words = []\n const chunks = this.splitByX(number.toString(), 3)\n let index = chunks.length\n for (const x of chunks) {\n index--\n if (x === 0n) continue\n const [n1, n2, n3] = this.getDigits(x)\n if (n3 > 0n) {\n words.push(this.hundreds[n3])\n }\n if (n2 > 1n) {\n words.push(this.twenties[n2])\n }\n if (n2 === 1n) {\n words.push(this.tens[n1])\n } else if (n1 > 0n && !(index > 0 && x === 1n)) {\n words.push(this.ones[n1])\n }\n if (index > 0) {\n words.push(this.pluralize(x, this.thousands[index]))\n }\n }\n return words.join(' ')\n }\n}\n\n/**\n * Converts a number to Czech cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {SlavicOptions} [options={}] Configuration options.\n * @returns {string} The number expressed in Czech words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Czech(options).convertToWords(value)\n}\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\n\nmodule.exports = function (object, key, method) {\n try {\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));\n } catch (error) { /* empty */ }\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n","'use strict';\nvar $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","'use strict';\nvar $TypeError = TypeError;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991\n\nmodule.exports = function (it) {\n if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded');\n return it;\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar definePropertyModule = require('../internals/object-define-property');\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nmodule.exports = function (O, key, value, options) {\n if (!options) options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value)) makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple) O[key] = value;\n else defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe) delete O[key];\n else if (O[key]) simple = true;\n } catch (error) { /* empty */ }\n if (simple) O[key] = value;\n else definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n } return O;\n};\n","import GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * Norwegian language converter.\n *\n * GreedyScaleLanguage with inline Norwegian merge rules:\n * - Hyphenation for compound numbers (e.g., \"tjueen\")\n * - \"og\" (and) for hundreds combinations\n * - Comma separation for non-magnitude additions\n * - Implicit '1' before tens and magnitudes\n * - Space separators for large numbers\n */\nexport class Norwegian extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'komma'\n zeroWord = 'null'\n scaleWordPairs = [\n [1_000_000_000_000_000_000_000_000_000_000_000n, 'quintillard'],\n [1_000_000_000_000_000_000_000_000_000_000n, 'quintillion'],\n [1_000_000_000_000_000_000_000_000_000n, 'quadrillard'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillion'],\n [1_000_000_000_000_000_000_000n, 'trillard'],\n [1_000_000_000_000_000_000n, 'trillion'],\n [1_000_000_000_000_000n, 'billard'],\n [1_000_000_000_000n, 'billion'],\n [1_000_000_000n, 'millard'],\n [1_000_000n, 'million'],\n [1000n, 'tusen'],\n [100n, 'hundre'],\n [90n, 'nitti'],\n [80n, 'åtti'],\n [70n, 'sytti'],\n [60n, 'seksti'],\n [50n, 'femti'],\n [40n, 'førti'],\n [30n, 'tretti'],\n [20n, 'tjue'],\n [19n, 'nitten'],\n [18n, 'atten'],\n [17n, 'sytten'],\n [16n, 'seksten'],\n [15n, 'femten'],\n [14n, 'fjorten'],\n [13n, 'tretten'],\n [12n, 'tolv'],\n [11n, 'elleve'],\n [10n, 'ti'],\n [9n, 'ni'],\n [8n, 'åtte'],\n [7n, 'syv'],\n [6n, 'seks'],\n [5n, 'fem'],\n [4n, 'fire'],\n [3n, 'tre'],\n [2n, 'to'],\n [1n, 'en'],\n [0n, 'null']\n ]\n\n /**\n * Merges two adjacent word-number pairs according to Norwegian grammar rules.\n *\n * Norwegian-specific rules:\n * - Implicit \\\"en\\\": `mergeScales({ 'en': 1n }, { 'hundre': 100n })` → `{ 'hundre': 100n }`\n * - Hyphenation for compound tens: `mergeScales({ 'tjue': 20n }, { 'en': 1n })` → `{ 'tjue-en': 21n }`\n * - \\\"og\\\" (and) after hundreds: `mergeScales({ 'hundre': 100n }, { 'en': 1n })` → `{ 'hundre og en': 101n }`\n * - Space-separated for large numbers (thousands+)\n * - Comma separator for non-magnitude additions (e.g., \\\"tusen, en\\\")\n *\n * @param {Object} leftPair The left operand as `{ word: BigInt }`.\n * @param {Object} rightPair The right operand as `{ word: BigInt }`.\n * @returns {Object} Merged pair with combined word and resulting numeric value.\n *\n * @example\n * mergeScales({ 'en': 1n }, { 'hundre': 100n }); // { 'hundre': 100n }\n * mergeScales({ 'tjue': 20n }, { 'tre': 3n }); // { 'tjue-tre': 23n }\n */\n // Norwegian merge rules mirror the former Scandinavian base logic\n mergeScales (leftPair, rightPair) {\n const leftWord = Object.keys(leftPair)[0]\n const rightWord = Object.keys(rightPair)[0]\n const leftNumber = Object.values(leftPair)[0]\n const rightNumber = Object.values(rightPair)[0]\n\n if (leftNumber === 1n && rightNumber < 100n) {\n return rightPair\n }\n\n if (leftNumber < 100n && leftNumber > rightNumber) {\n return { [`${leftWord}-${rightWord}`]: leftNumber + rightNumber }\n }\n\n if (leftNumber >= 100n && rightNumber < 100n) {\n return { [`${leftWord} og ${rightWord}`]: leftNumber + rightNumber }\n }\n\n if (rightNumber > leftNumber) {\n return { [`${leftWord} ${rightWord}`]: leftNumber * rightNumber }\n }\n\n return { [`${leftWord}, ${rightWord}`]: leftNumber + rightNumber }\n }\n}\n\n/**\n * Converts a number to Norwegian cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options] Conversion options (see Norwegian class options).\n * @returns {string} The number expressed in Norwegian words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(42); // 'førti-to'\n * convertToWords('1.5'); // 'en komma fem'\n */\nexport default function convertToWords (value, options = {}) {\n return new Norwegian(options).convertToWords(value)\n}\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","'use strict';\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL &&\n !Symbol.sham &&\n typeof Symbol.iterator == 'symbol';\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) === 'String' ? split(it, '') : $Object(it);\n} : $Object;\n","'use strict';\nvar has = require('../internals/set-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[SetData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","import AbstractLanguage from './abstract-language.js'\n\n/**\n * @typedef {string[]} SlavicPluralForms\n * Array of three plural forms for Slavic languages:\n * - [0]: Singular form (for numbers ending in 1, except 11)\n * - [1]: Few form (for numbers ending in 2-4, except 12-14)\n * - [2]: Many form (for all other numbers: 0, 5-20, and numbers ending in 0, 5-9, 11-19)\n */\n\n/**\n * @typedef {Object.<string, SlavicPluralForms>} SlavicThousandsMap\n * Mapping from power indices to their plural forms.\n * Example: { '0': ['тысяча', 'тысячи', 'тысяч'], '1': ['миллион', 'миллиона', 'миллионов'] }\n */\n\n/**\n * Base class for Slavic and related languages with complex pluralization.\n *\n * This class provides a reusable implementation for languages that share:\n * - Three-form pluralization (singular/few/many)\n * - Gender-aware number forms (masculine/feminine for 1, 2)\n * - Hundreds, tens, ones decomposition\n * - Chunk-based large number handling (thousands, millions, etc.)\n * - Inherits decimal handling from AbstractLanguage (supports both grouped and\n * per-digit modes via the `convertDecimalsPerDigit` class property).\n *\n * Used by: Russian, Czech, Polish, Ukrainian, Serbian, Croatian,\n * as well as Baltic (Lithuanian, Latvian) and Hebrew languages.\n *\n * Subclasses MUST define these properties with language-specific vocabulary:\n * - `ones` - Object mapping 1-9 to masculine forms\n * - `onesFeminine` - Object mapping 1-9 to feminine forms\n * - `tens` - Object mapping 0-9 to teen numbers (10-19)\n * - `twenties` - Object mapping 2-9 to tens (20-90)\n * - `hundreds` - Object mapping 1-9 to hundreds (100-900)\n * - `thousands` - Object mapping power indices to [singular, few, many] forms\n * - `feminine` - Boolean indicating if feminine forms should be used (optional)\n *\n * @abstract\n * @extends AbstractLanguage\n */\nclass SlavicLanguage extends AbstractLanguage {\n /**\n * Masculine forms for digits 1-9.\n *\n * @type {object}\n */\n ones = {}\n\n /**\n * Feminine forms for digits 1-9.\n *\n * @type {object}\n */\n onesFeminine = {}\n\n /**\n * Words for tens (10, 20, 30, etc.).\n *\n * @type {object}\n */\n tens = {}\n\n /**\n * Special forms for 21-29 in some languages.\n *\n * @type {object}\n */\n twenties = {}\n\n /**\n * Words for hundreds (100, 200, 300, etc.).\n *\n * @type {object}\n */\n hundreds = {}\n\n /**\n * Scale words for thousands, millions, etc.\n *\n * @type {object}\n */\n thousands = {}\n\n /**\n * Use feminine forms for numbers (affects 1-9).\n *\n * @type {boolean}\n */\n feminine\n\n /**\n * Initializes the Slavic language converter with language-specific options.\n *\n * @param {Object} [options={}] Configuration options.\n * @param {boolean} [options.feminine=false] Use feminine forms for numbers (affects gender agreement).\n */\n constructor ({ feminine = false } = {}) {\n super()\n\n this.feminine = feminine\n }\n\n /**\n * Converts a whole number to its word representation.\n *\n * This method implements the Slavic number construction algorithm:\n * 1. Split number into 3-digit chunks (right to left)\n * 2. For each chunk: convert hundreds, tens, ones\n * 3. Apply gender rules for ones (feminine for thousands, or when feminine=true)\n * 4. Add pluralized power word (thousand/million/billion/etc.)\n * 5. Join all parts with spaces\n *\n * @param {bigint} number The whole number to convert (non-negative).\n * @returns {string} The number in words.\n */\n convertWholePart (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n\n const words = []\n const chunks = this.splitByX(number.toString(), 3)\n let chunkIndex = chunks.length\n\n for (const chunkValue of chunks) {\n chunkIndex = chunkIndex - 1\n\n if (chunkValue === 0n) {\n continue\n }\n\n const [onesDigit, tensDigit, hundredsDigit] = this.getDigits(chunkValue)\n\n if (hundredsDigit > 0n) {\n words.push(this.hundreds[hundredsDigit])\n }\n\n if (tensDigit > 1n) {\n words.push(this.twenties[tensDigit])\n }\n\n // Handle teens (10-19) or ones (1-9)\n if (tensDigit === 1n) {\n // Teens: use tens array directly\n words.push(this.tens[onesDigit])\n } else if (onesDigit > 0n) {\n // Ones: use feminine form for thousands (chunkIndex 1) or when feminine=true (chunkIndex 0)\n const onesArray =\n chunkIndex === 1 || (this.feminine && chunkIndex === 0)\n ? this.onesFeminine\n : this.ones\n words.push(onesArray[onesDigit])\n }\n\n // Add power word (thousand, million, etc.) with proper pluralization\n if (chunkIndex > 0) {\n words.push(this.pluralize(chunkValue, this.thousands[chunkIndex]))\n }\n }\n\n return words.join(' ')\n }\n\n /**\n * Splits a number string into chunks of X digits.\n *\n * Example: splitByX('1234567', 3) => [1n, 234n, 567n]\n *\n * @param {string} numberString The number as a string.\n * @param {number} chunkSize Chunk size (typically 3 for thousands grouping).\n * @returns {bigint[]} Array of BigInt chunks.\n */\n splitByX (numberString, chunkSize) {\n const chunks = []\n const stringLength = numberString.length\n\n if (stringLength > chunkSize) {\n const remainderLength = stringLength % chunkSize\n\n if (remainderLength > 0) {\n chunks.push(BigInt(numberString.slice(0, remainderLength)))\n }\n\n for (let i = remainderLength; i < stringLength; i += chunkSize) {\n chunks.push(BigInt(numberString.slice(i, i + chunkSize)))\n }\n } else {\n chunks.push(BigInt(numberString))\n }\n\n return chunks\n }\n\n /**\n * Extracts individual digits from a number (units, tens, hundreds).\n *\n * Returns digits in reverse order: [ones, tens, hundreds]\n * Example: 456 => [6n, 5n, 4n]\n *\n * @param {bigint} value The number to extract digits from (0-999).\n * @returns {bigint[]} Array of [ones, tens, hundreds] as BigInts.\n */\n getDigits (value) {\n // Direct BigInt arithmetic is faster than string manipulation\n const onesPlace = value % 10n\n const tensPlace = (value / 10n) % 10n\n const hundredsPlace = value / 100n\n return [onesPlace, tensPlace, hundredsPlace]\n }\n\n /**\n * Selects the correct plural form based on Slavic pluralization rules.\n *\n * Slavic languages use three forms:\n * - Form 0 (singular): numbers ending in 1 (but not 11)\n * - Form 1 (few): numbers ending in 2-4 (but not 12-14)\n * - Form 2 (many): all other numbers (0, 5-20, 25-30, etc.)\n *\n * Examples (Russian):\n * - 1, 21, 31... => тысяча (form 0)\n * - 2-4, 22-24, 32-34... => тысячи (form 1)\n * - 0, 5-20, 25-30... => тысяч (form 2)\n *\n * @param {bigint} n The number to check.\n * @param {string[]} forms Array of [singular, few, many] forms.\n * @returns {string} The appropriate form for the number.\n */\n pluralize (number, pluralForms) {\n const remainder100 = number % 100n\n const remainder10 = number % 10n\n\n // Check if in 11-19 range (special case)\n if (remainder100 >= 10n && remainder100 <= 20n) {\n return pluralForms[2] // Always use \"many\" form for 11-20\n }\n\n if (remainder10 === 1n) {\n return pluralForms[0] // Singular\n }\n\n if (remainder10 >= 2n && remainder10 <= 4n) {\n return pluralForms[1] // Few (2-4)\n }\n\n return pluralForms[2] // Many\n }\n}\n\nexport default SlavicLanguage\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","'use strict';\nvar classofRaw = require('../internals/classof-raw');\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = function (fn) {\n // Nashorn bug:\n // https://github.com/zloirock/core-js/issues/1128\n // https://github.com/zloirock/core-js/issues/1130\n if (classofRaw(fn) === 'Function') return uncurryThis(fn);\n};\n","'use strict';\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// https://tc39.es/ecma262/#sec-array.prototype.toreversed\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.toreversed\nmodule.exports = function (O, C) {\n var len = lengthOfArrayLike(O);\n var A = new C(len);\n var k = 0;\n for (; k < len; k++) A[k] = O[len - k - 1];\n return A;\n};\n","'use strict';\nvar IS_PURE = require('../internals/is-pure');\nvar globalThis = require('../internals/global-this');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {});\n\n(store.versions || (store.versions = [])).push({\n version: '3.47.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2014-2025 Denis Pushkarev (zloirock.ru), 2025 CoreJS Company (core-js.io)',\n license: 'https://github.com/zloirock/core-js/blob/v3.47.0/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar difference = require('../internals/set-difference');\nvar fails = require('../internals/fails');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar SET_LIKE_INCORRECT_BEHAVIOR = !setMethodAcceptSetLike('difference', function (result) {\n return result.size === 0;\n});\n\nvar FORCED = SET_LIKE_INCORRECT_BEHAVIOR || fails(function () {\n // https://bugs.webkit.org/show_bug.cgi?id=288595\n var setLike = {\n size: 1,\n has: function () { return true; },\n keys: function () {\n var index = 0;\n return {\n next: function () {\n var done = index++ > 1;\n if (baseSet.has(1)) baseSet.clear();\n return { done: done, value: 2 };\n }\n };\n }\n };\n // eslint-disable-next-line es/no-set -- testing\n var baseSet = new Set([1, 2, 3, 4]);\n // eslint-disable-next-line es/no-set-prototype-difference -- testing\n return baseSet.difference(setLike).size !== 3;\n});\n\n// `Set.prototype.difference` method\n// https://tc39.es/ecma262/#sec-set.prototype.difference\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n difference: difference\n});\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n defineBuiltIn(IteratorPrototype, ITERATOR, function () {\n return this;\n });\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n","'use strict';\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw new $TypeError(\"Can't call method on \" + it);\n return it;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method];\n};\n","import GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * @typedef {Object} DanishOptions\n * @property {boolean} [ordFlag=false] Enable ordinal number conversion.\n */\n\n/**\n * Danish language converter.\n *\n * GreedyScaleLanguage with Danish-specific extensions:\n * - Unique vigesimal (base-20) number system for 50-90\n * - Special composition rules (\"og\" for \"and\" between units and tens)\n * - Reverse digit order (e.g., \"fem-og-tyve\" = five-and-twenty = 25)\n * - Support for ordinal numbers via ordFlag option\n *\n * Key Features:\n * - Vigesimal tens: halvtreds (50), treds (60), halvfjerds (70), firs (80), halvfems (90)\n * - Units-before-tens pattern (e.g., \"tre-og-tyve\" = 23)\n * - \"et\" prefix for hundreds/thousands (not \"en\")\n * - Optional ordinal number conversion via ordFlag option\n * - Inline merge logic tailored for Danish ordering\n */\nexport class Danish extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'komma'\n zeroWord = 'nul'\n scaleWordPairs = [\n [1_000_000_000_000_000_000_000_000_000n, 'quadrillarder'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillioner'],\n [1_000_000_000_000_000_000_000n, 'trillarder'],\n [1_000_000_000_000_000_000n, 'trillioner'],\n [1_000_000_000_000_000n, 'billarder'],\n [1_000_000_000_000n, 'billioner'],\n [1_000_000_000n, 'millarder'],\n [1_000_000n, 'millioner'],\n [1000n, 'tusind'],\n [100n, 'hundrede'],\n [90n, 'halvfems'],\n [80n, 'firs'],\n [70n, 'halvfjerds'],\n [60n, 'treds'],\n [50n, 'halvtreds'],\n [40n, 'fyrre'],\n [30n, 'tredive'],\n [20n, 'tyve'],\n [19n, 'nitten'],\n [18n, 'atten'],\n [17n, 'sytten'],\n [16n, 'seksten'],\n [15n, 'femten'],\n [14n, 'fjorten'],\n [13n, 'tretten'],\n [12n, 'tolv'],\n [11n, 'elleve'],\n [10n, 'ti'],\n [9n, 'ni'],\n [8n, 'otte'],\n [7n, 'syv'],\n [6n, 'seks'],\n [5n, 'fem'],\n [4n, 'fire'],\n [3n, 'tre'],\n [2n, 'to'],\n [1n, 'et'],\n [0n, 'nul']\n ]\n\n /**\n * Initializes the Danish converter with language-specific options.\n *\n * @param {DanishOptions} [options={}] Configuration options.\n */\n constructor ({ ordFlag = false } = {}) {\n super()\n\n this.ordFlag = ordFlag\n }\n\n /**\n * Merges two adjacent word-number pairs according to Danish grammar rules.\n * Danish uses complex vigesimal (base-20) patterns and reverse digit ordering.\n *\n * Key Danish patterns:\n * - Vigesimal tens: halvtreds(50), treds(60), halvfjerds(70), firs(80), halvfems(90)\n * - Units-before-tens order with \"og\" (and): \"tre-og-tyve\" (3 and 20 = 25)\n * - \"et\" prefix for hundreds/thousands (not \"en\")\n * - Space separators for large magnitudes (≥ millions)\n * - Ordinal support via this.ordFlag\n *\n * @param {Object} current The left operand as `{ word: bigint }`.\n * @param {Object} next The right operand as `{ word: bigint }`.\n * @returns {Object} Merged pair with combined word and resulting number (bigint).\n */\n mergeScales (current, next) {\n let cText = Object.keys(current)[0]\n let nText = Object.keys(next)[0]\n const cNumber = Object.values(current)[0] // BigInt (e.g., 1n, 100n, 1000n)\n const nNumber = Object.values(next)[0] // BigInt (e.g., magnitude level like 100n, 1000n)\n\n // Prepend \"et\" to hundreds and thousands (not \"en\") for proper Danish form\n if (nNumber === 100n || nNumber === 1000n) {\n next = { [`et${nText}`]: nNumber }\n }\n\n // Implicit '1' handling: omit '1' before most magnitudes (except millions/ordinals)\n if (cNumber === 1n) {\n if (nNumber < 1_000_000n || this.ordFlag) {\n return next // Just the magnitude word (e.g., \"hundrede\" not \"en hundrede\")\n }\n cText = 'en' // Explicit \"en\" (one) for millions and above\n }\n\n // Multiplication across magnitude boundaries\n if (nNumber > cNumber) {\n // Space for million+ (e.g., \"en million\", \"to millioner\")\n if (nNumber >= 1_000_000n) {\n cText += ' '\n }\n return { [`${cText}${nText}`]: cNumber * nNumber }\n }\n\n // Addition with separator rules:\n // \"og\" (and) for hundreds + smaller numbers\n if (cNumber >= 100n && cNumber < 1000n) {\n cText += ' og '\n } else if (cNumber >= 1000n && cNumber <= 100_000n) {\n // Special \"e og\" for thousands (e.g., \"tusinde og tyve\")\n cText += 'e og '\n }\n\n // Units-before-tens reversal (Danish vigesimal pattern):\n // For small units (< 10) with tens (10-99), swap order: \"tre og tyve\" (25)\n if (nNumber < 10n && cNumber > 10n && cNumber < 100n) {\n if (nNumber === 1n) {\n nText = 'en' // Convert 1 to \"en\" for vigesimal context\n }\n // Swap positions: units go after \"og\", tens go before\n const temporary = nText\n nText = cText\n cText = temporary + 'og'\n } else if (cNumber >= 1_000_000n) {\n // Space for large magnitudes (millions+)\n cText += ' '\n }\n\n return { [`${cText}${nText}`]: cNumber + nNumber }\n }\n}\n\n/**\n * Converts a number to Danish cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options] Conversion options (see Danish class options).\n * @param {boolean} [options.ordFlag=false] Enable ordinal number conversion.\n * @returns {string} The number expressed in Danish words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(25); // 'femogtyve' (five-and-twenty)\n * convertToWords(50); // 'halvtreds' (half-third-times-twenty)\n */\nexport default function convertToWords (value, options = {}) {\n return new Danish(options).convertToWords(value)\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar intersection = require('../internals/set-intersection');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar INCORRECT = !setMethodAcceptSetLike('intersection', function (result) {\n return result.size === 2 && result.has(1) && result.has(2);\n}) || fails(function () {\n // eslint-disable-next-line es/no-array-from, es/no-set, es/no-set-prototype-intersection -- testing\n return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2';\n});\n\n// `Set.prototype.intersection` method\n// https://tc39.es/ecma262/#sec-set.prototype.intersection\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n intersection: intersection\n});\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n var len = toIntegerOrInfinity(argument);\n return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar anInstance = require('../internals/an-instance');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar createProperty = require('../internals/create-property');\nvar fails = require('../internals/fails');\nvar hasOwn = require('../internals/has-own-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IS_PURE = require('../internals/is-pure');\n\nvar CONSTRUCTOR = 'constructor';\nvar ITERATOR = 'Iterator';\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nvar $TypeError = TypeError;\nvar NativeIterator = globalThis[ITERATOR];\n\n// FF56- have non-standard global helper `Iterator`\nvar FORCED = IS_PURE\n || !isCallable(NativeIterator)\n || NativeIterator.prototype !== IteratorPrototype\n // FF44- non-standard `Iterator` passes previous tests\n || !fails(function () { NativeIterator({}); });\n\nvar IteratorConstructor = function Iterator() {\n anInstance(this, IteratorPrototype);\n if (getPrototypeOf(this) === IteratorPrototype) throw new $TypeError('Abstract class Iterator not directly constructable');\n};\n\nvar defineIteratorPrototypeAccessor = function (key, value) {\n if (DESCRIPTORS) {\n defineBuiltInAccessor(IteratorPrototype, key, {\n configurable: true,\n get: function () {\n return value;\n },\n set: function (replacement) {\n anObject(this);\n if (this === IteratorPrototype) throw new $TypeError(\"You can't redefine this property\");\n if (hasOwn(this, key)) this[key] = replacement;\n else createProperty(this, key, replacement);\n }\n });\n } else IteratorPrototype[key] = value;\n};\n\nif (!hasOwn(IteratorPrototype, TO_STRING_TAG)) defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR);\n\nif (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) {\n defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor);\n}\n\nIteratorConstructor.prototype = IteratorPrototype;\n\n// `Iterator` constructor\n// https://tc39.es/ecma262/#sec-iterator\n$({ global: true, constructor: true, forced: FORCED }, {\n Iterator: IteratorConstructor\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Symbol = globalThis.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n ? Symbol[name]\n : createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","import GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * Korean language converter.\n *\n * Features:\n * - Space-separated for large numbers (>= 만/10,000)\n * - Concatenated for smaller numbers\n * - Omits '일' (1) before multipliers\n */\nexport class Korean extends GreedyScaleLanguage {\n negativeWord = '마이너스'\n decimalSeparatorWord = '점'\n zeroWord = '영'\n scaleWordPairs = [\n [10_000_000_000_000_000_000_000_000_000n, '양'],\n [1_000_000_000_000_000_000_000_000n, '자'],\n [100_000_000_000_000_000_000n, '해'],\n [10_000_000_000_000_000n, '경'],\n [1_000_000_000_000n, '조'],\n [100_000_000n, '억'],\n [10_000n, '만'],\n [1000n, '천'],\n [100n, '백'],\n [10n, '십'],\n [9n, '구'],\n [8n, '팔'],\n [7n, '칠'],\n [6n, '육'],\n [5n, '오'],\n [4n, '사'],\n [3n, '삼'],\n [2n, '이'],\n [1n, '일'],\n [0n, '영']\n ]\n\n /**\n * Merges two adjacent word-number pairs according to Korean grammar rules.\n *\n * Korean-specific rules:\n * - Omits '일' (1) before multipliers <= 만 (10,000)\n * - Concatenates without space for small numbers (< 만)\n * - Separates with space for large numbers (>= 만)\n * - Multiplies when right > left, adds when left > right\n *\n * @param {Object} leftPair The left operand as `{ word: number }`.\n * @param {Object} rightPair The right operand as `{ word: number }`.\n * @returns {Object} Merged pair with combined word and resulting number.\n */\n mergeScales (leftPair, rightPair) {\n const leftWord = Object.keys(leftPair)[0]\n const rightWord = Object.keys(rightPair)[0]\n const leftNumber = Object.values(leftPair)[0] // BigInt\n const rightNumber = Object.values(rightPair)[0] // BigInt\n\n // Implicit \"일\": omit 1 before multipliers up to 만 (10,000)\n if (leftNumber === 1n && rightNumber <= 10_000n) return rightPair\n // Concatenate (no space) for small numbers less than 만\n if (leftNumber < 10_000n && leftNumber > rightNumber) return { [`${leftWord}${rightWord}`]: leftNumber + rightNumber }\n // Space-separate for large numbers (>= 만) when adding\n if (leftNumber >= 10_000n && leftNumber > rightNumber) return { [`${leftWord} ${rightWord}`]: leftNumber + rightNumber }\n // Multiply for all scale combinations\n return { [`${leftWord}${rightWord}`]: leftNumber * rightNumber }\n }\n}\n\n/**\n * Converts a number to Korean cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options] Conversion options (see Korean class options).\n * @returns {string} The number expressed in Korean words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(42); // '사십이'\n * convertToWords(10001); // '만 일'\n */\nexport default function convertToWords (value, options = {}) {\n return new Korean(options).convertToWords(value)\n}\n","import AbstractLanguage from '../classes/abstract-language.js'\n\nclass Swahili extends AbstractLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'nukta'\n zeroWord = 'sifuri'\n digits = {\n 0: 'sifuri',\n 1: 'moja',\n 2: 'mbili',\n 3: 'tatu',\n 4: 'nne',\n 5: 'tano',\n 6: 'sita',\n 7: 'saba',\n 8: 'nane',\n 9: 'tisa'\n }\n\n tens = {\n 10: 'kumi',\n 20: 'ishirini',\n 30: 'thelathini',\n 40: 'arobaini',\n 50: 'hamsini',\n 60: 'sitini',\n 70: 'sabini',\n 80: 'themanini',\n 90: 'tisini'\n }\n\n scales = [\n '',\n 'elfu',\n 'milioni',\n 'bilioni',\n 'trilioni'\n ]\n\n wordsUnder100 (n) {\n if (n < 10) return this.digits[n]\n if (n === 10) return this.tens[10]\n if (n < 20) {\n // 11-19: 'kumi na <digit>'\n return this.tens[10] + ' na ' + this.digits[n - 10]\n }\n const tens = Math.trunc(n / 10) * 10\n const ones = n % 10\n if (ones === 0) return this.tens[tens]\n return this.tens[tens] + ' na ' + this.digits[ones]\n }\n\n wordsUnder1000 (n) {\n if (n < 100) return this.wordsUnder100(n)\n if (n === 100) return 'mia moja'\n const hundreds = Math.trunc(n / 100)\n const rest = n % 100\n const parts = []\n\n // Hundreds: 'mia <digit>'\n parts.push('mia ' + this.digits[hundreds])\n if (rest > 0) {\n if (rest < 10) {\n parts.push('na ' + this.digits[rest])\n } else {\n parts.push(this.wordsUnder100(rest))\n }\n }\n\n return parts.join(' ')\n }\n\n splitBy3 (number) {\n const s = number.toString()\n if (s.length <= 3) return [Number(s)]\n const groups = []\n const last3 = s.slice(-3)\n groups.unshift(Number(last3))\n let remaining = s.slice(0, -3)\n while (remaining.length > 0) {\n const group = remaining.slice(-3)\n groups.unshift(Number(group))\n remaining = remaining.slice(0, -3)\n }\n return groups\n }\n\n convertWholePart (number) {\n if (number === 0n) return this.zeroWord\n\n const groups = this.splitBy3(number)\n const parts = []\n\n for (let i = 0; i < groups.length; i++) {\n const val = groups[i]\n if (val === 0) continue\n const scaleIndex = groups.length - i - 1\n // scale word\n if (scaleIndex === 0) {\n if (val < 10 && parts.length > 0) {\n parts.push('na ' + this.digits[val])\n } else if (val === 100 && parts.length > 0) {\n // In compound numbers (e.g., 1100 -> 'elfu moja mia'), use 'mia' not 'mia moja'\n parts.push('mia')\n } else {\n parts.push(this.wordsUnder1000(val))\n }\n } else {\n // e.g., 'elfu moja', 'milioni mbili'\n const unit = (val === 1) ? 'moja' : this.wordsUnder1000(val)\n parts.push(this.scales[scaleIndex] + ' ' + unit)\n }\n }\n\n return parts.join(' ').trim()\n }\n}\n\nexport default function convertToWords (value, options = {}) {\n return new Swahili(options).convertToWords(value)\n}\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar iterateSimple = require('../internals/iterate-simple');\nvar SetHelpers = require('../internals/set-helpers');\n\nvar Set = SetHelpers.Set;\nvar SetPrototype = SetHelpers.proto;\nvar forEach = uncurryThis(SetPrototype.forEach);\nvar keys = uncurryThis(SetPrototype.keys);\nvar next = keys(new Set()).next;\n\nmodule.exports = function (set, fn, interruptible) {\n return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn);\n};\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar has = require('../internals/set-helpers').has;\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\nvar iteratorClose = require('../internals/iterator-close');\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issupersetof\nmodule.exports = function isSupersetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) < otherRec.size) return false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (!has(O, e)) return iteratorClose(iterator, 'normal', false);\n }) !== false;\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw new $TypeError($String(argument) + ' is not an object');\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = globalThis.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n","import GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * @typedef {Object} SpanishOptions\n * @property {string} [genderStem='o'] Masculine 'o' or feminine 'a' ending.\n */\n\n/**\n * Spanish language converter.\n *\n * Handles Spanish grammatical features:\n * - Gender agreement for numbers (masculine by default, feminine via `genderStem`)\n * - \"y\" (and) between tens and units (e.g., \"veinte y uno\")\n * - Special forms for hundreds (e.g., \"cien\", \"ciento\", \"doscientos\")\n * - Million pluralization\n */\nexport class Spanish extends GreedyScaleLanguage {\n negativeWord = 'menos'\n decimalSeparatorWord = 'punto'\n zeroWord = 'cero'\n scaleWordPairs = [\n [1_000_000_000_000_000_000_000_000n, 'cuatrillón'],\n [1_000_000_000_000_000_000n, 'trillón'],\n [1_000_000_000_000n, 'billón'],\n [1_000_000n, 'millón'],\n [1000n, 'mil'],\n [100n, 'cien'],\n [90n, 'noventa'],\n [80n, 'ochenta'],\n [70n, 'setenta'],\n [60n, 'sesenta'],\n [50n, 'cincuenta'],\n [40n, 'cuarenta'],\n [30n, 'treinta'],\n [29n, 'veintinueve'],\n [28n, 'veintiocho'],\n [27n, 'veintisiete'],\n [26n, 'veintiséis'],\n [25n, 'veinticinco'],\n [24n, 'veinticuatro'],\n [23n, 'veintitrés'],\n [22n, 'veintidós'],\n [21n, 'veintiuno'],\n [20n, 'veinte'],\n [19n, 'diecinueve'],\n [18n, 'dieciocho'],\n [17n, 'diecisiete'],\n [16n, 'dieciseis'],\n [15n, 'quince'],\n [14n, 'catorce'],\n [13n, 'trece'],\n [12n, 'doce'],\n [11n, 'once'],\n [10n, 'diez'],\n [9n, 'nueve'],\n [8n, 'ocho'],\n [7n, 'siete'],\n [6n, 'seis'],\n [5n, 'cinco'],\n [4n, 'cuatro'],\n [3n, 'tres'],\n [2n, 'dos'],\n [1n, 'uno'],\n [0n, 'cero']\n ]\n\n /**\n * Initializes the Spanish converter.\n *\n * @param {SpanishOptions} [options={}] Configuration options.\n */\n constructor ({ genderStem = 'o' } = {}) {\n super()\n\n this.genderStem = genderStem\n }\n\n /**\n * Merges two adjacent word-number pairs according to Spanish grammar rules.\n *\n * Spanish-specific rules:\n * - Implicit \"uno\": `mergeScales({ 'uno': 1n }, { 'mil': 1000n })` → `{ 'mil': 1000n }`\n * - \"y\" (and) between tens and units: `mergeScales({ 'veinte': 20n }, { 'uno': 1n })` → `{ 'veinte y uno': 21n }`\n * - Gender agreement for hundreds: \"cien\" + suffix based on genderStem\n * - Special forms for hundreds (cien/ciento/quinientos/setecientos/novecientos)\n * - Million pluralization when coefficient > 1: \"millones\" instead of \"millón\"\n *\n * @param {Object} currentPair The left operand as `{ word: BigInt }`.\n * @param {Object} nextPair The right operand as `{ word: BigInt }`.\n * @returns {Object} Merged pair with combined word and resulting numeric value.\n *\n * @example\n * mergeScales({ 'uno': 1n }, { 'mil': 1000n }); // { 'mil': 1000n }\n * mergeScales({ 'veinte': 20n }, { 'tres': 3n }); // { 'veinte y tres': 23n }\n */\n mergeScales (currentPair, nextPair) {\n let currentWord = Object.keys(currentPair)[0]\n let nextWord = Object.keys(nextPair)[0]\n const currentNumber = Object.values(currentPair)[0]\n const nextNumber = Object.values(nextPair)[0]\n\n if (currentNumber === 1n) {\n if (nextNumber < 1_000_000n) return nextPair\n currentWord = 'un'\n } else if (currentNumber === 100n && nextNumber % 1000n !== 0n) {\n currentWord += 't' + this.genderStem\n }\n\n if (nextNumber < currentNumber) {\n if (currentNumber < 100n) {\n return { [`${currentWord} y ${nextWord}`]: currentNumber + nextNumber }\n }\n return { [`${currentWord} ${nextWord}`]: currentNumber + nextNumber }\n }\n\n if (nextNumber % 1_000_000n === 0n && currentNumber > 1n) {\n nextWord = nextWord.slice(0, -3) + 'lones'\n }\n\n if (nextNumber === 100n) {\n if (currentNumber === 5n) {\n currentWord = 'quinien'\n nextWord = ''\n } else if (currentNumber === 7n) {\n currentWord = 'sete'\n } else if (currentNumber === 9n) {\n currentWord = 'nove'\n }\n nextWord += 't' + this.genderStem + 's'\n } else {\n nextWord = ' ' + nextWord\n }\n\n return { [`${currentWord}${nextWord}`]: currentNumber * nextNumber }\n }\n}\n\n/**\n * Converts a number to Spanish cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options] Conversion options (see ES class).\n * @returns {string} The number expressed in Spanish words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(42, { lang: 'es' }); // 'cuarenta y dos'\n * convertToWords(100, { lang: 'es' }); // 'cien'\n */\nexport default function convertToWords (value, options = {}) {\n return new Spanish(options).convertToWords(value)\n}\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype !== 42;\n});\n","'use strict';\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\n\n// `Set.prototype.intersection` method\n// https://tc39.es/ecma262/#sec-set.prototype.intersection\nmodule.exports = function intersection(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = new Set();\n\n if (size(O) > otherRec.size) {\n iterateSimple(otherRec.getIterator(), function (e) {\n if (has(O, e)) add(result, e);\n });\n } else {\n iterateSet(O, function (e) {\n if (otherRec.includes(e)) add(result, e);\n });\n }\n\n return result;\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","'use strict';\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n","'use strict';\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","'use strict';\nvar SetHelpers = require('../internals/set-helpers');\nvar iterate = require('../internals/set-iterate');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\nmodule.exports = function (set) {\n var result = new Set();\n iterate(set, function (it) {\n add(result, it);\n });\n return result;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw new $TypeError(tryToString(argument) + ' is not a function');\n};\n","/**\n * Converts numbers to their word representation in Kannada (ಕನ್ನಡ).\n * @module languages/kn\n */\n\nimport SouthAsianLanguage from '../classes/south-asian-language.js'\n\n/**\n * Kannada language implementation using Indian-style number grouping.\n * @extends SouthAsianLanguage\n */\nclass KannadaLanguage extends SouthAsianLanguage {\n negativeWord = 'ಋಣಾತ್ಮಕ'\n decimalSeparatorWord = 'ದಶಮಾಂಶ'\n zeroWord = 'ಸೊನ್ನೆ'\n hundredWord = 'ನೂರು'\n convertDecimalsPerDigit = true\n\n /**\n * Array of number words from 0 to 99.\n * Index matches the number value.\n * @type {string[]}\n */\n belowHundred = [\n 'ಸೊನ್ನೆ', 'ಒಂದು', 'ಎರಡು', 'ಮೂರು', 'ನಾಲ್ಕು', 'ಐದು', 'ಆರು', 'ಏಳು', 'ಎಂಟು', 'ಒಂಬತ್ತು',\n 'ಹತ್ತು', 'ಹನ್ನೊಂದು', 'ಹನ್ನೆರಡು', 'ಹದಿಮೂರು', 'ಹದಿನಾಲ್ಕು', 'ಹದಿನೈದು', 'ಹದಿನಾರು', 'ಹದಿನೇಳು', 'ಹದಿನೆಂಟು', 'ಹತ್ತೊಂಬತ್ತು',\n 'ಇಪ್ಪತ್ತು', 'ಇಪ್ಪತ್ತೊಂದು', 'ಇಪ್ಪತ್ತೆರಡು', 'ಇಪ್ಪತ್ತಮೂರು', 'ಇಪ್ಪತ್ತನಾಲ್ಕು', 'ಇಪ್ಪತ್ತೈದು', 'ಇಪ್ಪತ್ತಾರು', 'ಇಪ್ಪತ್ತೇಳು', 'ಇಪ್ಪತ್ತೆಂಟು', 'ಇಪ್ಪತ್ತೊಂಬತ್ತು',\n 'ಮೂವತ್ತು', 'ಮೂವತ್ತೊಂದು', 'ಮೂವತ್ತೆರಡು', 'ಮೂವತ್ತಮೂರು', 'ಮೂವತ್ತನಾಲ್ಕು', 'ಮೂವತ್ತೈದು', 'ಮೂವತ್ತಾರು', 'ಮೂವತ್ತೇಳು', 'ಮೂವತ್ತೆಂಟು', 'ಮೂವತ್ತೊಂಬತ್ತು',\n 'ನಲವತ್ತು', 'ನಲವತ್ತೊಂದು', 'ನಲವತ್ತೆರಡು', 'ನಲವತ್ತಮೂರು', 'ನಲವತ್ತನಾಲ್ಕು', 'ನಲವತ್ತೈದು', 'ನಲವತ್ತಾರು', 'ನಲವತ್ತೇಳು', 'ನಲವತ್ತೆಂಟು', 'ನಲವತ್ತೊಂಬತ್ತು',\n 'ಐವತ್ತು', 'ಐವತ್ತೊಂದು', 'ಐವತ್ತೆರಡು', 'ಐವತ್ತಮೂರು', 'ಐವತ್ತನಾಲ್ಕು', 'ಐವತ್ತೈದು', 'ಐವತ್ತಾರು', 'ಐವತ್ತೇಳು', 'ಐವತ್ತೆಂಟು', 'ಐವತ್ತೊಂಬತ್ತು',\n 'ಅರವತ್ತು', 'ಅರವತ್ತೊಂದು', 'ಅರವತ್ತೆರಡು', 'ಅರವತ್ತಮೂರು', 'ಅರವತ್ತನಾಲ್ಕು', 'ಅರವತ್ತೈದು', 'ಅರವತ್ತಾರು', 'ಅರವತ್ತೇಳು', 'ಅರವತ್ತೆಂಟು', 'ಅರವತ್ತೊಂಬತ್ತು',\n 'ಎಪ್ಪತ್ತು', 'ಎಪ್ಪತ್ತೊಂದು', 'ಎಪ್ಪತ್ತೆರಡು', 'ಎಪ್ಪತ್ತಮೂರು', 'ಎಪ್ಪತ್ತನಾಲ್ಕು', 'ಎಪ್ಪತ್ತೈದು', 'ಎಪ್ಪತ್ತಾರು', 'ಎಪ್ಪತ್ತೇಳು', 'ಎಪ್ಪತ್ತೆಂಟು', 'ಎಪ್ಪತ್ತೊಂಬತ್ತು',\n 'ಎಂಬತ್ತು', 'ಎಂಬತ್ತೊಂದು', 'ಎಂಬತ್ತೆರಡು', 'ಎಂಬತ್ತಮೂರು', 'ಎಂಬತ್ತನಾಲ್ಕು', 'ಎಂಬತ್ತೈದು', 'ಎಂಬತ್ತಾರು', 'ಎಂಬತ್ತೇಳು', 'ಎಂಬತ್ತೆಂಟು', 'ಎಂಬತ್ತೊಂಬತ್ತು',\n 'ತೊಂಬತ್ತು', 'ತೊಂಬತ್ತೊಂದು', 'ತೊಂಬತ್ತೆರಡು', 'ತೊಂಬತ್ತಮೂರು', 'ತೊಂಬತ್ತನಾಲ್ಕು', 'ತೊಂಬತ್ತೈದು', 'ತೊಂಬತ್ತಾರು', 'ತೊಂಬತ್ತೇಳು', 'ತೊಂಬತ್ತೆಂಟು', 'ತೊಂಬತ್ತೊಂಬತ್ತು'\n ]\n\n /**\n * Scale words for powers of ten in Indian numbering system.\n * Index 0 = units, 1 = thousand, 2 = lakh, 3 = crore, etc.\n * @type {string[]}\n */\n scaleWords = [\n '', // units\n 'ಸಾವಿರ', // thousand (1,000)\n 'ಲಕ್ಷ', // lakh (100,000)\n 'ಕೋಟಿ', // crore (10,000,000)\n 'ಅಬ್ಜ', // arab (1,000,000,000)\n 'ಖರ್ವ', // kharab (100,000,000,000)\n 'ನೀಲ', // neel (10,000,000,000,000)\n 'ಪದ್ಮ', // padma (1,000,000,000,000,000)\n 'ಶಂಖ' // shankh (100,000,000,000,000,000)\n ]\n\n /**\n * Converts numbers using the belowHundred array directly.\n */\n}\n\n/**\n * Converts a number to its word representation in Kannada.\n * @param {number|string|bigint} value - The number to convert\n * @param {Object} [options={}] - Conversion options\n * @returns {string} The word representation of the number\n * @example\n * convertToWords(42) // 'ನಲವತ್ತೆರಡು'\n * convertToWords(1000) // 'ಒಂದು ಸಾವಿರ'\n * convertToWords(100000) // 'ಒಂದು ಲಕ್ಷ'\n */\nexport default function convertToWords (value, options = {}) {\n return new KannadaLanguage(options).convertToWords(value)\n}\n","import SlavicLanguage from '../classes/slavic-language.js'\n\n/**\n * @typedef {Object} SlavicOptions\n * @property {boolean} [feminine=false] Use feminine forms for numbers.\n */\n\n/**\n * Lithuanian language converter.\n *\n * Implements Lithuanian number words using the Slavic language pattern:\n * - Lithuanian number words (vienas/viena, du/dvi, trys, keturi...)\n * - Gender-aware forms (masculine/feminine)\n * - Baltic three-form pluralization (tūkstantis/tūkstančiai/tūkstančių)\n * - Lithuanian-specific declension patterns\n *\n * Key Features:\n * - Three-form pluralization system shared across Slavic/Baltic languages\n * * Form 1 (singular): 1 (e.g., \"tūkstantis\")\n * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., \"tūkstančiai\")\n * * Form 3 (many): all other numbers (e.g., \"tūkstančių\")\n * - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)\n * - Large number handling via thousands[] array with indexed [singular, few, many] forms\n * - Gender-specific number forms for 1 and 2 (masculine/feminine dual forms)\n *\n * Features:\n * - Dual gender forms (vienas/viena, du/dvi, keturi/keturios)\n * - Complex declension patterns for large numbers\n * - Baltic language characteristics\n *\n * Inherits from SlavicLanguage as Lithuanian uses similar pluralization.\n */\nexport class Lithuanian extends SlavicLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'kablelis'\n zeroWord = 'nulis'\n ones = {\n 1: 'vienas',\n 2: 'du',\n 3: 'trys',\n 4: 'keturi',\n 5: 'penki',\n 6: 'šeši',\n 7: 'septyni',\n 8: 'aštuoni',\n 9: 'devyni'\n }\n\n onesFeminine = {\n 1: 'viena',\n 2: 'dvi',\n 3: 'trys',\n 4: 'keturios',\n 5: 'penkios',\n 6: 'šešios',\n 7: 'septynios',\n 8: 'aštuonios',\n 9: 'devynios'\n }\n\n tens = {\n 0: 'dešimt',\n 1: 'vienuolika',\n 2: 'dvylika',\n 3: 'trylika',\n 4: 'keturiolika',\n 5: 'penkiolika',\n 6: 'šešiolika',\n 7: 'septyniolika',\n 8: 'aštuoniolika',\n 9: 'devyniolika'\n }\n\n twenties = {\n 2: 'dvidešimt',\n 3: 'trisdešimt',\n 4: 'keturiasdešimt',\n 5: 'penkiasdešimt',\n 6: 'šešiasdešimt',\n 7: 'septyniasdešimt',\n 8: 'aštuoniasdešimt',\n 9: 'devyniasdešimt'\n }\n\n hundreds = ['šimtas', 'šimtai']\n\n thousands = {\n 1: ['tūkstantis', 'tūkstančiai', 'tūkstančių'],\n 2: ['milijonas', 'milijonai', 'milijonų'],\n 3: ['milijardas', 'milijardai', 'milijardų'],\n 4: ['trilijonas', 'trilijonai', 'trilijonų'],\n 5: ['kvadrilijonas', 'kvadrilijonai', 'kvadrilijonų'],\n 6: ['kvintilijonas', 'kvintilijonai', 'kvintilijonų'],\n 7: ['sikstilijonas', 'sikstilijonai', 'sikstilijonų'],\n 8: ['septilijonas', 'septilijonai', 'septilijonų'],\n 9: ['oktilijonas', 'oktilijonai', 'oktilijonų'],\n 10: ['naintilijonas', 'naintilijonai', 'naintilijonų']\n }\n\n pluralize (n, forms) {\n if (n === 0n) {\n return forms[2]\n }\n\n const [n1, n2] = this.getDigits(n)\n\n if (n2 === 1n || n1 === 0n) {\n return forms[2]\n }\n\n if (n1 === 1n) {\n return forms[0]\n }\n\n return forms[1]\n }\n\n convertWholePart (number) {\n if (number === 0n) {\n return this.zeroWord\n }\n const words = []\n const chunks = this.splitByX(number.toString(), 3)\n let index = chunks.length\n for (const x of chunks) {\n index = index - 1\n if (x === 0n) {\n continue\n }\n const [n1, n2, n3] = this.getDigits(x)\n if (n3 > 0n) {\n words.push(this.ones[n3])\n if (n3 > 1n) {\n words.push(this.hundreds[1])\n } else {\n words.push(this.hundreds[0])\n }\n }\n if (n2 > 1n) {\n words.push(this.twenties[n2])\n }\n if (n2 === 1n) {\n words.push(this.tens[n1])\n } else if (n1 > 0n) {\n if ((index === 1 || (this.feminine && index === 0)) && number < 1000n) {\n words.push(this.onesFeminine[n1])\n } else {\n words.push(this.ones[n1])\n }\n }\n if (index > 0) {\n words.push(this.pluralize(x, this.thousands[index]))\n }\n }\n return words.join(' ')\n }\n}\n\n/**\n * Converts a number to Lithuanian cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options={}] Configuration options.\n * @param {boolean} [options.feminine=false] Use feminine forms for numbers.\n * @returns {string} The number expressed in Lithuanian words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n */\nexport default function convertToWords (value, options = {}) {\n return new Lithuanian(options).convertToWords(value)\n}\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(globalThis, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n globalThis[key] = value;\n } return value;\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar create = require('../internals/object-create');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar InternalStateModule = require('../internals/internal-state');\nvar getMethod = require('../internals/get-method');\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar iteratorClose = require('../internals/iterator-close');\nvar iteratorCloseAll = require('../internals/iterator-close-all');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ITERATOR_HELPER = 'IteratorHelper';\nvar WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator';\nvar NORMAL = 'normal';\nvar THROW = 'throw';\nvar setInternalState = InternalStateModule.set;\n\nvar createIteratorProxyPrototype = function (IS_ITERATOR) {\n var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER);\n\n return defineBuiltIns(create(IteratorPrototype), {\n next: function next() {\n var state = getInternalState(this);\n // for simplification:\n // for `%WrapForValidIteratorPrototype%.next` or with `state.returnHandlerResult` our `nextHandler` returns `IterResultObject`\n // for `%IteratorHelperPrototype%.next` - just a value\n if (IS_ITERATOR) return state.nextHandler();\n if (state.done) return createIterResultObject(undefined, true);\n try {\n var result = state.nextHandler();\n return state.returnHandlerResult ? result : createIterResultObject(result, state.done);\n } catch (error) {\n state.done = true;\n throw error;\n }\n },\n 'return': function () {\n var state = getInternalState(this);\n var iterator = state.iterator;\n state.done = true;\n if (IS_ITERATOR) {\n var returnMethod = getMethod(iterator, 'return');\n return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true);\n }\n if (state.inner) try {\n iteratorClose(state.inner.iterator, NORMAL);\n } catch (error) {\n return iteratorClose(iterator, THROW, error);\n }\n if (state.openIters) try {\n iteratorCloseAll(state.openIters, NORMAL);\n } catch (error) {\n return iteratorClose(iterator, THROW, error);\n }\n if (iterator) iteratorClose(iterator, NORMAL);\n return createIterResultObject(undefined, true);\n }\n });\n};\n\nvar WrapForValidIteratorPrototype = createIteratorProxyPrototype(true);\nvar IteratorHelperPrototype = createIteratorProxyPrototype(false);\n\ncreateNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper');\n\nmodule.exports = function (nextHandler, IS_ITERATOR, RETURN_HANDLER_RESULT) {\n var IteratorProxy = function Iterator(record, state) {\n if (state) {\n state.iterator = record.iterator;\n state.next = record.next;\n } else state = record;\n state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER;\n state.returnHandlerResult = !!RETURN_HANDLER_RESULT;\n state.nextHandler = nextHandler;\n state.counter = 0;\n state.done = false;\n setInternalState(this, state);\n };\n\n IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype;\n\n return IteratorProxy;\n};\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\n\nvar process = globalThis.process;\nvar Deno = globalThis.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n","'use strict';\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar getMethod = require('../internals/get-method');\n\nmodule.exports = function (iterator, kind, value) {\n var innerResult, innerError;\n anObject(iterator);\n try {\n innerResult = getMethod(iterator, 'return');\n if (!innerResult) {\n if (kind === 'throw') throw value;\n return value;\n }\n innerResult = call(innerResult, iterator);\n } catch (error) {\n innerError = true;\n innerResult = error;\n }\n if (kind === 'throw') throw value;\n if (innerError) throw innerResult;\n anObject(innerResult);\n return value;\n};\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar call = Function.prototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n if (length === 0) return !IS_INCLUDES && -1;\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el !== el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value !== value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar arrayToReversed = require('../internals/array-to-reversed');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\nvar $Array = Array;\n\n// `Array.prototype.toReversed` method\n// https://tc39.es/ecma262/#sec-array.prototype.toreversed\n$({ target: 'Array', proto: true }, {\n toReversed: function toReversed() {\n return arrayToReversed(toIndexedObject(this), $Array);\n }\n});\n\naddToUnscopables('toReversed');\n","import AbstractLanguage from '../classes/abstract-language.js'\n\nclass Tamil extends AbstractLanguage {\n negativeWord = 'மைனஸ்'\n decimalSeparatorWord = 'புள்ளி'\n zeroWord = 'பூஜ்ஜியம்'\n convertDecimalsPerDigit = true // Enable digit-by-digit decimal conversion\n belowHundred = [\n 'பூஜ்ஜியம்',\n 'ஒன்று',\n 'இரண்டு',\n 'மூன்று',\n 'நான்கு',\n 'ஐந்து',\n 'ஆறு',\n 'ஏழு',\n 'எட்டு',\n 'ஒன்பது',\n 'பத்து',\n 'பதினொன்று',\n 'பன்னிரண்டு',\n 'பதிமூன்று',\n 'பதினான்கு',\n 'பதினைந்து',\n 'பதினாறு',\n 'பதினேழு',\n 'பதினெட்டு',\n 'பத்தொன்பது',\n 'இருபது',\n 'இருபத்தொன்று',\n 'இருபத்திரண்டு',\n 'இருபத்திமூன்று',\n 'இருபத்திநான்கு',\n 'இருபத்தைந்து',\n 'இருபத்தாறு',\n 'இருபத்தேழு',\n 'இருபத்தெட்டு',\n 'இருபத்தொன்பது',\n 'முப்பது',\n 'முப்பத்தொன்று',\n 'முப்பத்திரண்டு',\n 'முப்பத்திமூன்று',\n 'முப்பத்திநான்கு',\n 'முப்பத்தைந்து',\n 'முப்பத்தாறு',\n 'முப்பத்தேழு',\n 'முப்பத்தெட்டு',\n 'முப்பத்தொன்பது',\n 'நாற்பது',\n 'நாற்பத்தொன்று',\n 'நாற்பத்திரண்டு',\n 'நாற்பத்திமூன்று',\n 'நாற்பத்திநான்கு',\n 'நாற்பத்தைந்து',\n 'நாற்பத்தாறு',\n 'நாற்பத்தேழு',\n 'நாற்பத்தெட்டு',\n 'நாற்பத்தொன்பது',\n 'ஐம்பது',\n 'ஐம்பத்தொன்று',\n 'ஐம்பத்திரண்டு',\n 'ஐம்பத்திமூன்று',\n 'ஐம்பத்திநான்கு',\n 'ஐம்பத்தைந்து',\n 'ஐம்பத்தாறு',\n 'ஐம்பத்தேழு',\n 'ஐம்பத்தெட்டு',\n 'ஐம்பத்தொன்பது',\n 'அறுபது',\n 'அறுபத்தொன்று',\n 'அறுபத்திரண்டு',\n 'அறுபத்திமூன்று',\n 'அறுபத்திநான்கு',\n 'அறுபத்தைந்து',\n 'அறுபத்தாறு',\n 'அறுபத்தேழு',\n 'அறுபத்தெட்டு',\n 'அறுபத்தொன்பது',\n 'எழுபது',\n 'எழுபத்தொன்று',\n 'எழுபத்திரண்டு',\n 'எழுபத்திமூன்று',\n 'எழுபத்திநான்கு',\n 'எழுபத்தைந்து',\n 'எழுபத்தாறு',\n 'எழுபத்தேழு',\n 'எழுபத்தெட்டு',\n 'எழுபத்தொன்பது',\n 'எண்பது',\n 'எண்பத்தொன்று',\n 'எண்பத்திரண்டு',\n 'எண்பத்திமூன்று',\n 'எண்பத்திநான்கு',\n 'எண்பத்தைந்து',\n 'எண்பத்தாறு',\n 'எண்பத்தேழு',\n 'எண்பத்தெட்டு',\n 'எண்பத்தொன்பது',\n 'தொண்ணூறு',\n 'தொண்ணூற்று ஒன்று',\n 'தொண்ணூற்று இரண்டு',\n 'தொண்ணூற்று மூன்று',\n 'தொண்ணூற்று நான்கு',\n 'தொண்ணூற்று ஐந்து',\n 'தொண்ணூற்று ஆறு',\n 'தொண்ணூற்று ஏழு',\n 'தொண்ணூற்று எட்டு',\n 'தொண்ணூற்று ஒன்பது'\n ]\n\n hundreds = [\n '',\n 'நூறு',\n 'இருநூறு',\n 'முன்னூறு',\n 'நானூறு',\n 'ஐநூறு',\n 'அறுநூறு',\n 'எழுநூறு',\n 'எண்நூறு',\n 'தொள்ளாயிரம்'\n ]\n\n // Digits map 1–9 for decimal reading\n digits = [\n 'ஒன்று',\n 'இரண்டு',\n 'மூன்று',\n 'நான்கு',\n 'ஐந்து',\n 'ஆறு',\n 'ஏழு',\n 'எட்டு',\n 'ஒன்பது'\n ]\n\n scales = [\n '',\n 'ஆயிரம்',\n 'லட்சம்',\n 'கோடி',\n 'அரபு',\n 'கராபு',\n 'நீல்',\n 'பத்ம',\n 'சங்கு'\n ]\n\n /**\n * Convert numbers below 100 to Tamil words.\n *\n * @param {number} number The number to convert (0-99).\n * @returns {string} The Tamil representation.\n */\n convertBelowHundred (number) {\n return this.belowHundred[number]\n }\n\n convertBelowThousand (number) {\n if (number === 0) return ''\n if (number < 100) return this.convertBelowHundred(number)\n\n const hundreds = Math.trunc(number / 100)\n const remainder = number % 100\n let hundredPart = this.hundreds[hundreds]\n\n if (remainder > 0) {\n if (hundredPart.endsWith('ம்')) {\n hundredPart = hundredPart.replace(/ம்$/, 'த்து')\n } else if (hundredPart.endsWith('று')) {\n hundredPart = hundredPart.slice(0, -2) + 'ற்று'\n }\n }\n\n const parts = [hundredPart]\n if (remainder > 0) {\n parts.push(this.convertBelowHundred(remainder))\n }\n\n return parts.join(' ').trim()\n }\n\n splitIndian (number) {\n const numStr = number.toString()\n if (numStr.length <= 3) return [Number(numStr)]\n\n const groups = []\n const last3 = numStr.slice(-3)\n groups.unshift(Number(last3))\n\n let remaining = numStr.slice(0, -3)\n while (remaining.length > 0) {\n const group = remaining.slice(-2)\n groups.unshift(Number(group))\n remaining = remaining.slice(0, -2)\n }\n\n return groups\n }\n\n convertWholePart (number) {\n if (number === 0n) return this.zeroWord\n\n const groups = this.splitIndian(number)\n const groupCount = groups.length\n const words = []\n\n for (let i = 0; i < groupCount; i++) {\n const groupValue = groups[i]\n if (groupValue === 0) continue\n\n const scaleIndex = groupCount - i - 1\n const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ஒரு' : this.convertBelowThousand(groupValue)\n words.push(groupWords)\n if (scaleIndex > 0 && this.scales[scaleIndex]) {\n words.push(this.scales[scaleIndex])\n }\n }\n\n return words.join(' ').trim()\n }\n}\n\nexport default function convertToWords (value, options = {}) {\n return new Tamil(options).convertToWords(value)\n}\n","import GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * @typedef {Object} ChineseOptions\n * @property {boolean} [formal=true] Use formal/financial numerals (壹贰叁) vs. common numerals (一二三).\n */\n\n/**\n * Chinese language converter.\n *\n * Features:\n * - Concatenated number-word format (no spaces)\n * - Implicit zero insertion for positional values\n * - Decimal digits pronounced individually\n * - Supports both formal (financial) and common (everyday) styles\n */\nexport class Chinese extends GreedyScaleLanguage {\n negativeWord = '负'\n decimalSeparatorWord = '点'\n zeroWord = '零'\n wordSeparator = ''\n\n /**\n * Initializes the Chinese converter.\n *\n * @param {ChineseOptions} [options={}] Configuration options.\n */\n constructor ({ formal = true } = {}) {\n super()\n\n this.formal = formal\n\n if (this.formal) {\n this.scaleWordPairs = [\n [1_000_000_000_000n, '万'],\n [100_000_000n, '亿'],\n [10_000n, '万'],\n [1000n, '仟'],\n [100n, '佰'],\n [10n, '拾'],\n [9n, '玖'],\n [8n, '捌'],\n [7n, '柒'],\n [6n, '陆'],\n [5n, '伍'],\n [4n, '肆'],\n [3n, '叁'],\n [2n, '贰'],\n [1n, '壹'],\n [0n, '零']\n ]\n } else {\n this.scaleWordPairs = [\n [1_000_000_000_000n, '万'],\n [100_000_000n, '亿'],\n [10_000n, '万'],\n [1000n, '千'],\n [100n, '百'],\n [10n, '十'],\n [9n, '九'],\n [8n, '八'],\n [7n, '七'],\n [6n, '六'],\n [5n, '五'],\n [4n, '四'],\n [3n, '三'],\n [2n, '二'],\n [1n, '一'],\n [0n, '零']\n ]\n }\n }\n\n /**\n * Merges two adjacent word-number pairs according to Chinese grammar rules.\n *\n * Chinese-specific rules:\n * - Omits '一' (or '壹' in formal style) before single digits (< 10)\n * - Concatenates without space\n * - Inserts '零' (zero) when positional values skip magnitude levels\n * - Multiplies when right > left, adds otherwise\n *\n * @param {Object} leftPair The left operand as `{ word: number }`.\n * @param {Object} rightPair The right operand as `{ word: number }`.\n * @returns {Object} Merged pair with combined word and resulting number.\n */\n mergeScales (leftPair, rightPair) {\n const leftWord = Object.keys(leftPair)[0]\n const leftNumber = Object.values(leftPair)[0]\n const rightWord = Object.keys(rightPair)[0]\n const rightNumber = Object.values(rightPair)[0]\n\n // Implicit one: omit 1 before single digits (< 10)\n if (leftNumber === 1n && rightNumber < 10n) {\n return rightPair\n }\n\n // Multiply when right > left (scale words like 千, 万, 亿)\n if (rightNumber > leftNumber) {\n return { [`${leftWord}${rightWord}`]: leftNumber * rightNumber }\n }\n\n // Insert \"零\" (zero) when position skip levels (e.g., 1003 = 千零三)\n // zeroDigit() checks if gap exists between left and right magnitude\n if (this.zeroDigit(leftNumber) > this.digit(rightNumber)) {\n return { [`${leftWord}${this.zeroWord}${rightWord}`]: leftNumber + rightNumber }\n }\n\n // Default: concatenate without zero insertion\n return { [`${leftWord}${rightWord}`]: leftNumber + rightNumber }\n }\n\n /**\n * Get the number of digits in a number.\n *\n * @param {bigint|number} number_ The number to count digits for.\n * @returns {number} The count of digits.\n */\n digit (number_) {\n return number_.toString().length\n }\n\n /**\n * Count the number of zeros in a number.\n *\n * @param {bigint|number} number_ The number to count zeros in.\n * @returns {number} The count of zero digits.\n */\n zeroDigit (number_) {\n return [...number_.toString()].filter(c => c === '0').length\n }\n\n /**\n * Convert decimal digits to words by reading each digit individually.\n * Overrides the default grouped behavior from AbstractLanguage.\n *\n * @param {string} decimalString The decimal digits as a string.\n * @returns {Array<string>} Array of individual digit words.\n */\n decimalDigitsToWords (decimalString) {\n const words = []\n for (let i = 0; i < decimalString.length; i++) {\n const digitValue = BigInt(decimalString[i])\n words.push(this.convertWholePart(digitValue))\n }\n return words\n }\n}\n\n/**\n * Converts a number to Chinese cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {ChineseOptions} [options] Conversion options.\n * @returns {string} The number expressed in Chinese words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(42); // '肆拾贰' (formal style)\n * convertToWords(42, { formal: false }); // '四十二' (common style)\n */\nexport default function convertToWords (value, options = {}) {\n return new Chinese(options).convertToWords(value)\n}\n","import GreedyScaleLanguage from '../classes/greedy-scale-language.js'\n\n/**\n * Hungarian language converter.\n *\n * Converts numbers to Hungarian words following Hungarian conventions:\n * - Agglutinative structure for compound numbers\n * - No spaces between tens and units (e.g., \"huszonegy\" = twenty-one)\n * - Special handling for \"egy\" (one) - often omitted as multiplier\n * - Vowel harmony in compound words\n *\n * Features:\n * - Compact number representations (húsz, harminc, negyven)\n * - Pre-composed twenties (huszonegy through huszonkilenc)\n * - \"egész\" as decimal separator (meaning \"whole\")\n * - Support for very large numbers (up to quadrilliards)\n */\nexport class Hungarian extends GreedyScaleLanguage {\n negativeWord = 'mínusz'\n decimalSeparatorWord = 'egész'\n zeroWord = 'nulla'\n scaleWordPairs = [\n [1_000_000_000_000_000_000_000_000_000n, 'quadrilliárd'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillió'],\n [1_000_000_000_000_000_000_000n, 'trilliárd'],\n [1_000_000_000_000_000_000n, 'trillió'],\n [1_000_000_000_000_000n, 'billiárd'],\n [1_000_000_000_000n, 'billió'],\n [1_000_000_000n, 'milliárd'],\n [1_000_000n, 'millió'],\n [1000n, 'ezer'],\n [100n, 'száz'],\n [90n, 'kilencven'],\n [80n, 'nyolcvan'],\n [70n, 'hetven'],\n [60n, 'hatvan'],\n [50n, 'ötven'],\n [40n, 'negyven'],\n [30n, 'harminc'],\n [29n, 'huszonkilenc'],\n [28n, 'huszonnyolc'],\n [27n, 'huszonhét'],\n [26n, 'huszonhat'],\n [25n, 'huszonöt'],\n [24n, 'huszonnégy'],\n [23n, 'huszonhárom'],\n [22n, 'huszonkettő'],\n [21n, 'huszonegy'],\n [20n, 'húsz'],\n [19n, 'tizenkilenc'],\n [18n, 'tizennyolc'],\n [17n, 'tizenhét'],\n [16n, 'tizenhat'],\n [15n, 'tizenöt'],\n [14n, 'tizennégy'],\n [13n, 'tizenhárom'],\n [12n, 'tizenkettő'],\n [11n, 'tizenegy'],\n [10n, 'tíz'],\n [9n, 'kilenc'],\n [8n, 'nyolc'],\n [7n, 'hét'],\n [6n, 'hat'],\n [5n, 'öt'],\n [4n, 'négy'],\n [3n, 'három'],\n [2n, 'kettő'],\n [1n, 'egy'],\n [0n, 'nulla']\n ]\n\n tensToCardinal (number) {\n // Expecting `number` as bigint when called from convertWholePart\n if (this.getScaleWord(number)) {\n return this.getScaleWord(number)\n } else {\n const tens = number / 10n\n const units = number % 10n\n return this.getScaleWord(tens * 10n) + this.convertWholePart(units)\n }\n }\n\n hundredsToCardinal (number) {\n const hundreds = number / 100n\n let prefix = 'száz'\n if (hundreds !== 1n) {\n prefix = this.convertWholePart(hundreds, '') + prefix\n }\n const postfix = this.convertWholePart(number % 100n, '')\n return prefix + postfix\n }\n\n thousandsToCardinal (number) {\n const thousands = number / 1000n\n let prefix = 'ezer'\n if (thousands !== 1n) {\n prefix = this.convertWholePart(thousands, '') + prefix\n }\n const postfix = this.convertWholePart(number % 1000n, '')\n const middle = (number <= 2000n || postfix === '') ? '' : '-'\n return prefix + middle + postfix\n }\n\n bigNumberToCardinal (number) {\n const numberLength = number.toString().length\n const digits = (numberLength % 3 === 0) ? numberLength - 2 : numberLength\n const exp = 10 ** (Math.floor(digits / 3) * 3)\n const prefix = this.convertWholePart(number / BigInt(exp), '')\n const rest = this.convertWholePart(number % BigInt(exp), '')\n const postfix = (rest === '') ? '' : ('-' + rest)\n return prefix + this.getScaleWord(BigInt(exp)) + postfix\n }\n\n convertWholePart (number, zeroWord = this.zeroWord) {\n let words = ''\n\n // Normalize to BigInt for consistent comparisons\n if (typeof number !== 'bigint') number = BigInt(number)\n\n if (number === 0n) {\n words = zeroWord\n } else if (zeroWord === '' && number === 2n) {\n words = 'két'\n } else if (number < 30n) {\n words = this.getScaleWord(number)\n } else if (number < 100n) {\n words = this.tensToCardinal(number)\n } else if (number < 1000n) {\n words = this.hundredsToCardinal(number)\n } else if (number < 1_000_000n) {\n words = this.thousandsToCardinal(number)\n } else {\n words = this.bigNumberToCardinal(number)\n }\n\n return words\n }\n}\n\n/**\n * Converts a number to Hungarian cardinal (written) form.\n *\n * @param {number|string|bigint} value The number to convert.\n * @param {Object} [options] Conversion options (see Hungarian class options).\n * @returns {string} The number expressed in Hungarian words.\n * @throws {TypeError} If value is NaN or invalid type.\n * @throws {Error} If value is an invalid number string.\n *\n * @example\n * convertToWords(42); // 'negyvenkettő'\n * convertToWords(21); // 'huszonegy'\n */\nexport default function convertToWords (value, options = {}) {\n return new Hungarian(options).convertToWords(value)\n}\n","'use strict';\n// Should get iterator record of a set-like object before cloning this\n// https://bugs.webkit.org/show_bug.cgi?id=289430\nmodule.exports = function (METHOD_NAME) {\n try {\n // eslint-disable-next-line es/no-set -- needed for test\n var baseSet = new Set();\n var setLike = {\n size: 0,\n has: function () { return true; },\n keys: function () {\n // eslint-disable-next-line es/no-object-defineproperty -- needed for test\n return Object.defineProperty({}, 'next', {\n get: function () {\n baseSet.clear();\n baseSet.add(4);\n return function () {\n return { done: true };\n };\n }\n });\n }\n };\n var result = baseSet[METHOD_NAME](setLike);\n\n return result.size === 1 && result.values().next().value === 4;\n } catch (error) {\n return false;\n }\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/**\n * @module n2words\n */\n\n/** @typedef {'ar'|'az'|'bn'|'cs'|'de'|'da'|'el'|'en'|'es'|'fa'|'fr'|'fr-BE'|'gu'|'he'|'hi'|'hr'|'hu'|'id'|'it'|'ja'|'kn'|'ko'|'lt'|'lv'|'mr'|'ms'|'nl'|'nb'|'pa-Guru'|'pl'|'pt'|'ro'|'ru'|'sr-Latn'|'sv'|'sw'|'ta'|'te'|'th'|'fil'|'tr'|'uk'|'ur'|'vi'|'zh-Hans'} LanguageCode */\n\n/**\n * @typedef {Object} ArabicOptions\n * @property {string} [negativeWord='ناقص'] - Word for negative numbers (minus).\n * @property {boolean} [feminine=false] - Use feminine forms for numbers.\n */\n\n/**\n * @typedef {Object} ChineseOptions\n * @property {boolean} [formal=true] - Use formal/financial numerals (壹贰叁) vs. common numerals (一二三).\n */\n\n/**\n * @typedef {Object} HebrewOptions\n * @property {string} [and='ו'] - Conjunction character (typically 'ו' for and).\n * @property {boolean} [biblical=false] - Use biblical scale words instead of modern ones.\n * @property {boolean} [feminine=false] - Use feminine forms for numbers.\n */\n\n/**\n * @typedef {Object} SpanishOptions\n * @property {('o'|'a'|string)} [genderStem='o'] - Masculine 'o' or feminine 'a' ending.\n */\n\n/**\n * @typedef {Object} DutchOptions\n * @property {boolean} [includeOptionalAnd=false] - Include optional \"en\" separator.\n * @property {boolean} [noHundredPairs=false] - Disable comma before hundreds.\n * @property {boolean} [accentOne=true] - Use accented \"één\" for one.\n */\n\n/**\n * @typedef {Object} FrenchOptions\n * @property {boolean} [withHyphenSeparator=false] - Use hyphens (true) instead of spaces (false) in compounds.\n */\n\n/**\n * @typedef {Object} TurkishOptions\n * @property {boolean} [dropSpaces=false] - Remove spaces between words if true.\n */\n\n/**\n * @typedef {Object} RomanianOptions\n * @property {boolean} [feminine=false] - Use feminine forms for numbers.\n */\n\n/**\n * @typedef {Object} DanishOptions\n * @property {boolean} [ordFlag=false] - Enable ordinal number conversion.\n */\n\n/**\n * @typedef {Object} SlavicOptions\n * @property {boolean} [feminine=false] - Use feminine forms for numbers.\n */\n\n/**\n * Configuration object for number-to-words conversion with comprehensive language support.\n *\n * @typedef {Object} N2WordsOptions\n * @property {LanguageCode} [lang='en'] - Target language code with full autocomplete support.\n * Supports many languages with regional variants (e.g., 'fr-BE').\n * Falls back progressively from most-specific to least-specific (e.g., 'fr-BE' -> 'fr').\n * Throws an error if no match is found after fallback attempts.\n * @property {string} [negativeWord] - (Arabic only) Word for negative numbers.\n * @property {boolean} [feminine] - (Arabic, Hebrew, Romanian, Slavic languages) Use feminine forms.\n * @property {boolean} [formal] - (Chinese only) Use formal/financial numerals.\n * @property {string} [and] - (Hebrew only) Conjunction character.\n * @property {boolean} [biblical] - (Hebrew only) Use biblical scale words.\n * @property {('o'|'a'|string)} [genderStem] - (Spanish only) Gender ending.\n * @property {boolean} [includeOptionalAnd] - (Dutch only) Include optional \"en\".\n * @property {boolean} [noHundredPairs] - (Dutch only) Disable comma before hundreds.\n * @property {boolean} [accentOne] - (Dutch only) Use accented \"één\".\n * @property {boolean} [withHyphenSeparator] - (French, Belgian French) Use hyphens.\n * @property {boolean} [dropSpaces] - (Turkish, Azerbaijani) Remove spaces.\n * @property {boolean} [ordFlag] - (Danish only) Enable ordinal conversion.\n *\n * Language-specific options are automatically validated and forwarded to converters.\n * See individual language implementations for detailed option descriptions.\n */\n\nimport ar from './languages/ar.js'\nimport az from './languages/az.js'\nimport cs from './languages/cs.js'\nimport de from './languages/de.js'\nimport da from './languages/da.js'\nimport en from './languages/en.js'\nimport es from './languages/es.js'\nimport fa from './languages/fa.js'\nimport sw from './languages/sw.js'\nimport fr from './languages/fr.js'\nimport frBE from './languages/fr-BE.js'\nimport he from './languages/he.js'\nimport hr from './languages/hr.js'\nimport hu from './languages/hu.js'\nimport id from './languages/id.js'\nimport ms from './languages/ms.js'\nimport it from './languages/it.js'\nimport ja from './languages/ja.js'\nimport hi from './languages/hi.js'\nimport bn from './languages/bn.js'\nimport ko from './languages/ko.js'\nimport th from './languages/th.js'\nimport ta from './languages/ta.js'\nimport te from './languages/te.js'\nimport sv from './languages/sv.js'\nimport lt from './languages/lt.js'\nimport lv from './languages/lv.js'\nimport nl from './languages/nl.js'\nimport nb from './languages/nb.js'\nimport pl from './languages/pl.js'\nimport pt from './languages/pt.js'\nimport ro from './languages/ro.js'\nimport ru from './languages/ru.js'\nimport srLatn from './languages/sr-Latn.js'\nimport tr from './languages/tr.js'\nimport uk from './languages/uk.js'\nimport vi from './languages/vi.js'\nimport zhHans from './languages/zh-Hans.js'\nimport ur from './languages/ur.js'\nimport paGuru from './languages/pa-Guru.js'\nimport fil from './languages/fil.js'\nimport mr from './languages/mr.js'\nimport gu from './languages/gu.js'\nimport kn from './languages/kn.js'\nimport el from './languages/el.js'\n\n/**\n * Language converter registry.\n * Contains converters for all supported languages, statically imported to work\n * in both Node.js and browser environments (enables bundler dead-code elimination).\n * Keys are language codes (e.g., 'en', 'fr', 'fr-BE'); values are converter functions.\n * @type {Object<string, Function>}\n */\nconst dict = {\n ar,\n az,\n cs,\n de,\n da,\n en,\n es,\n fa,\n sw,\n fr,\n 'fr-BE': frBE,\n he,\n hr,\n hu,\n id,\n ms,\n it,\n ja,\n hi,\n bn,\n ko,\n th,\n ta,\n te,\n sv,\n lt,\n lv,\n nl,\n nb,\n pl,\n pt,\n ro,\n ru,\n 'sr-Latn': srLatn,\n tr,\n uk,\n vi,\n 'zh-Hans': zhHans,\n ur,\n 'pa-Guru': paGuru,\n fil,\n mr,\n gu,\n kn,\n el\n}\n\n/**\n * Convert a numeric value to its cardinal (written) form in the requested language.\n *\n * This is the main entry point. The library dispatches synchronously to the appropriate\n * per-language converter based on the `lang` option. For browser builds, language converters\n * are statically imported so bundlers (webpack/rollup) can include them in output; Node.js\n * maintains identical behavior via the same static imports.\n *\n * @param {number|string|bigint} value The number to convert. Accepts:\n * - `number` (integer or floating-point),\n * - `string` (numeric string, possibly with decimal point),\n * - `bigint` for very large integers.\n * Decimal numbers as strings preserve precision that `number` type cannot.\n * @param {N2WordsOptions} [options={}] Optional configuration object.\n *\n * @returns {string} A human-readable cardinal representation of `value` in the\n * requested language.\n *\n * @throws {TypeError} If `options` is provided but is not an object.\n * @throws {Error} If the requested language is unsupported (no match after fallback).\n *\n * @example\n * // Basic usage\n * convertToWords(1, { lang: 'en' }) // => 'one'\n * convertToWords('45.67', { lang: 'en' }) // => 'forty-five point six seven'\n * convertToWords(123n, { lang: 'fr' }) // => 'cent vingt-trois'\n *\n * @example\n * // Language-specific options (see individual language implementations)\n * convertToWords(1, { lang: 'zh-Hans', formal: true }) // Chinese formal style\n * convertToWords(1, { lang: 'cs', feminine: true }) // Czech feminine form\n */\nexport default function (value, options = {}) {\n if (options !== null && options !== undefined && typeof options !== 'object') {\n throw new TypeError('Options must be an object, received: ' + typeof options)\n }\n\n if (options === null) {\n options = {}\n }\n\n let languageCode = options.lang\n\n if (languageCode === undefined) {\n return dict.en(value, options)\n }\n\n if (typeof languageCode !== 'string') {\n languageCode = String(languageCode)\n }\n\n let languageConverter = dict[languageCode]\n if (languageConverter !== undefined) {\n return languageConverter(value, options)\n }\n\n // Progressive fallback for regional variants: strip suffix on each iteration.\n // Example: 'fr-BE-XX' -> try 'fr-BE' -> try 'fr' -> throw error\n // Uses lastIndexOf for efficiency (O(n) vs O(n²) with repeated substring)\n let lastDashIndex = languageCode.lastIndexOf('-')\n while (lastDashIndex > 0) {\n const candidateLanguageCode = languageCode.slice(0, lastDashIndex)\n languageConverter = dict[candidateLanguageCode]\n if (languageConverter !== undefined) {\n return languageConverter(value, options)\n }\n lastDashIndex = candidateLanguageCode.lastIndexOf('-')\n }\n\n throw new Error('Unsupported language: \"' + languageCode + '\". Check supported language codes in the documentation.')\n}\n"],"names":["root","factory","exports","module","define","amd","globalThis","isCallable","it","call","aCallable","anObject","tryToString","getIteratorMethod","$TypeError","TypeError","argument","usingIterator","iteratorMethod","arguments","length","$","iterate","getIteratorDirect","iteratorClose","findWithoutClosingOnEarlyError","iteratorHelperWithoutClosingOnEarlyError","target","proto","real","forced","find","predicate","this","error","record","counter","value","stop","IS_RECORD","INTERRUPTED","result","uncurryThis","fails","hasOwn","DESCRIPTORS","CONFIGURABLE_FUNCTION_NAME","inspectSource","InternalStateModule","enforceInternalState","enforce","getInternalState","get","$String","String","defineProperty","Object","stringSlice","slice","replace","join","CONFIGURABLE_LENGTH","TEMPLATE","split","makeBuiltIn","name","options","getter","setter","configurable","arity","constructor","writable","prototype","undefined","state","source","Function","toString","FunctionPrototype","getDescriptor","getOwnPropertyDescriptor","EXISTS","PROPER","CONFIGURABLE","getBuiltIn","fn","ITERATOR_INSTEAD_OF_RECORD","step","iterator","next","done","test","bind","hasOwnProperty","English","GreedyScaleLanguage","negativeWord","decimalSeparatorWord","zeroWord","scaleWordPairs","mergeScales","leftPair","rightPair","leftWord","keys","leftNumber","values","rightWord","rightNumber","convertToWords","Hindi","SouthAsianLanguage","hundredWord","belowHundred","scaleWords","isPrototypeOf","Prototype","methodName","method","Iterator","Portuguese","hundreds","static","finalizeWords","words","replaceAll","POSTCLEAN_REGEX","current","cText","nText","cNumber","nNumber","ceil","Math","floor","trunc","x","n","USE_SYMBOL_AS_UID","$Object","$Symbol","classof","getMethod","isNullOrUndefined","Iterators","ITERATOR","wellKnownSymbol","internalObjectKeys","enumBugKeys","O","Vietnamese","AbstractLanguage","base","tens","thousands","convertLess100","number","unitsPart","tensPart","tensPartText","suffix","convertLess1000","tensUnitsPart","hundredsPart","push","convertWholePart","convertMore1000","division","power","r","BigInt","pow","Number","set","has","NATIVE_WEAK_MAP","isObject","createNonEnumerableProperty","shared","sharedKey","hiddenKeys","OBJECT_ALREADY_INITIALIZED","WeakMap","store","metadata","facade","STATE","getterFor","TYPE","type","Arabic","arabicTens","arabicHundreds","arabicAppendedTwos","arabicTwos","arabicGroup","arabicAppendedGroup","arabicPluralGroups","ones","masculine","feminine","super","selectedOnes","digitFeminineStatus","digit","processArabicGroup","groupNumber","groupLevel","fullNumber","hundredsRaw","returnValue","hundredsWord","numValue","log10","tensIndex","temp","group","numberToProcess","groupDescription","trim","MarathiLanguage","convertDecimalsPerDigit","iters","kind","i","Latvian","SlavicLanguage","twenties","pluralize","forms","chunks","splitByX","index","n1","n2","n3","getDigits","Punjabi","splitToGroups","numStr","groups","last3","unshift","remaining","convertBelowThousand","remainder","parts","groupCount","groupValue","scaleIndex","Hebrew","scale","scalePlural","biblicalOnes","biblicalTens","biblicalTwenties","biblicalHundreds","biblicalThousands","biblicalScale","biblicalScalePlural","and","biblical","chunkWords","hasHundreds","tensWord","onesWord","at","union","setMethodGetKeysBeforeCloning","setMethodAcceptSetLike","createIteratorProxy","callWithSafeIterationClosing","iteratorHelperThrowsOnInvalidIterator","IS_PURE","MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR","mapWithoutClosingOnEarlyError","FORCED","IteratorProxy","mapper","map","Ukrainian","onesFeminine","obj","toIndexedObject","indexOf","object","names","key","Urdu","descriptor","f","French","withHyphenSeparator","wordSeparator","currentPair","nextPair","currentWord","nextWord","currentNumber","nextNumber","F","getPrototypeOf","activeXDocument","definePropertiesModule","html","documentCreateElement","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","content","LT","NullProtoObjectViaActiveX","write","close","parentWindow","NullProtoObject","ActiveXObject","iframeDocument","iframe","JS","document","domain","style","display","appendChild","src","contentWindow","open","create","Properties","Malay","splitBy3","blocks","stringNumber","firstBlock","firstBlockLength","nextBlock","spell","spelling","wordBlocks","getTens","getHundreds","block","wordList","isLast","scaleWord","w","isSupersetOf","Azerbaijani","TurkicLanguage","Serbian","SCALE","lastDigit","lastTwoDigits","genderIndex","isArrayIteratorMethod","lengthOfArrayLike","getIterator","Result","stopped","ResultPrototype","iterable","unboundFunction","iterFn","that","AS_ENTRIES","IS_ITERATOR","condition","callFn","isSymbol","ordinaryToPrimitive","TO_PRIMITIVE","input","pref","exoticToPrim","toObject","CORRECT_PROTOTYPE_GETTER","ObjectPrototype","replacement","isForced","feature","detection","data","normalize","POLYFILL","NATIVE","string","toLowerCase","navigator","userAgent","Russian","Bengali","GujaratiLanguage","Telugu","digits","scales","convertBelowHundred","splitIndian","groupWords","id","postfix","random","aSet","SetHelpers","clone","size","getSetRecord","iterateSet","iterateSimple","remove","other","otherRec","e","includes","GreekLanguage","add","keysIter","functionToString","getOwnPropertySymbols","toIntegerOrInfinity","INVALID_SIZE","$RangeError","RangeError","max","SetRecord","intSize","numSize","isDisjointFrom","German","entries","mergedNumber","Indonesian","start","createElement","getScaleWord","scaleValue","matchingPair","pair","decomposeToScales","wholeNumber","decomposeWordSets","remainingValue","matchingScaleWordPair","scaleWordPair","multiplier","mergeWordSets","mergeWordSetsList","firstWordSet","secondWordSet","remainingWordSets","Array","isArray","merged","normalizedWordSets","wordSetElement","leftWordSet","rightWordSet","Error","output","trimEnd","mergedWordSet","resultString","Thai","convertBelowMillion","hundredThousands","tenThousands","splitMillionGroups","million","chunk","repeat","setArrayLength","doesNotExceedSafeInteger","properErrorOnNonWritableLength","item","len","argCount","ArrayPrototype","val","valueOf","SetPrototype","Set","Italian","cardinalWords","strTens","exponentPrefixes","accentuate","word","omitIfZero","numberToString","phoneticContraction","tensToCardinal","units","prefix","hundredsToCardinal","thousandsToCardinal","exponentLengthToString","exponentLength","bigNumberToCardinal","preDigits","exponent","infix","isSetsEqual","a","b","every","Romanian","tensMasculine","singular","plural","needsDe","results","l","padStart","toReversed","romanianPluralize","form","spellUnder1000","spellUnder100","feminineUnits","t","u","h","hundredWords","decimalDigitsToWords","decimal","chars","decimalNumber","masculineWords","toCardinalWithMasculine","onesMap","V8_VERSION","symbol","Symbol","sham","SILENT_ON_NON_WRITABLE_LENGTH_SET","METHOD_NAME","ExpectedError","IteratorPrototype","CLOSED","check","window","self","global","Dutch","includeOptionalAnd","noHundredPairs","accentOne","hadSpace","hasSpace","temporary","andTxt","endsWith","high","low","definePropertyModule","createPropertyDescriptor","documentAll","all","IE8_DOM_DEFINE","V8_PROTOTYPE_DEFINE_BUG","toPropertyKey","$defineProperty","$getOwnPropertyDescriptor","ENUMERABLE","WRITABLE","P","Attributes","enumerable","createSetLike","createSetLikeWithInfinitySize","callback","error2","Infinity","FilipinoLanguage","leftValue","rightValue","vowels","lastChar","symmetricDifference","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","concat","uncurryThisAccessor","Japanese","convertGroup","num","isTopGroup","reverse","groupStr","IndexedObject","requireObjectCoercible","min","integer","Turkish","dropSpaces","Polish","Farsi","namedNumbers","xone","xten","xhundred","tail","thousandMultiplier","tailNumber","millionMultiplier","isSubsetOf","V","func","NATIVE_BIND","apply","Croatian","uid","toLength","defineBuiltIn","cachedWholeNumber","convertDigitToWord","idx","decimalString","decimalDigit","remainingDigits","inputType","isNaN","decimalPart","isNegative","decimalPointIndex","wholePartString","ENTRIES","Swedish","BelgianFrench","UNSCOPABLES","defineGlobalProperty","copyConstructorProperties","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","dontCallGetSet","Czech","objectKeys","defineProperties","props","simple","unsafe","nonConfigurable","nonWritable","Norwegian","TO_STRING_TAG_SUPPORT","classofRaw","TO_STRING_TAG","CORRECT_ARGUMENTS","tag","tryGet","callee","toPrimitive","bitmap","NATIVE_SYMBOL","propertyIsEnumerable","chunkIndex","chunkValue","onesDigit","tensDigit","hundredsDigit","onesArray","numberString","chunkSize","stringLength","remainderLength","pluralForms","remainder100","remainder10","propertyIsEnumerableModule","C","A","k","SHARED","versions","version","mode","copyright","license","difference","setLike","baseSet","clear","PrototypeOfArrayIteratorPrototype","arrayIterator","BUGGY_SAFARI_ITERATORS","ownKeys","getOwnPropertyDescriptorModule","exceptions","namespace","Danish","ordFlag","intersection","from","anInstance","defineBuiltInAccessor","createProperty","CONSTRUCTOR","NativeIterator","IteratorConstructor","defineIteratorPrototypeAccessor","WellKnownSymbolsStore","createWellKnownSymbol","withoutSetter","Korean","Swahili","wordsUnder100","wordsUnder1000","rest","s","unit","forEach","interruptible","getOwnPropertyNames","Spanish","genderStem","$propertyIsEnumerable","NASHORN_BUG","exec","KannadaLanguage","Lithuanian","defineBuiltIns","createIterResultObject","iteratorCloseAll","ITERATOR_HELPER","WRAP_FOR_VALID_ITERATOR","NORMAL","THROW","setInternalState","createIteratorProxyPrototype","nextHandler","returnHandlerResult","returnMethod","inner","openIters","WrapForValidIteratorPrototype","IteratorHelperPrototype","RETURN_HANDLER_RESULT","uncurryThisWithBind","match","process","Deno","v8","innerResult","innerError","toAbsoluteIndex","createMethod","IS_INCLUDES","$this","el","fromIndex","arrayToReversed","addToUnscopables","$Array","Tamil","hundredPart","Chinese","formal","zeroDigit","number_","filter","c","digitValue","Hungarian","numberLength","exp","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","d","definition","o","prop","dict","ar","az","cs","de","da","en","es","fa","sw","fr","frBE","he","hr","hu","ms","ja","hi","bn","ko","th","ta","te","sv","lt","lv","nl","nb","pl","pt","ro","ru","srLatn","tr","uk","vi","zhHans","ur","paGuru","fil","mr","gu","kn","languageCode","lang","languageConverter","lastDashIndex","lastIndexOf","candidateLanguageCode"],"ignoreList":[],"sourceRoot":""}
1
+ {"version":3,"file":"n2words.js","sources":["../lib/classes/abstract-language.js","../lib/classes/greedy-scale-language.js","../lib/classes/turkic-language.js","../lib/classes/south-asian-language.js","../lib/classes/slavic-language.js","../lib/languages/fr.js","../lib/languages/pt.js","../lib/n2words.js","../lib/languages/ar.js","../lib/languages/az.js","../lib/languages/bn.js","../lib/languages/hbo.js","../lib/languages/hr.js","../lib/languages/cs.js","../lib/languages/da.js","../lib/languages/nl.js","../lib/languages/en.js","../lib/languages/fil.js","../lib/languages/fr-BE.js","../lib/languages/de.js","../lib/languages/el.js","../lib/languages/gu.js","../lib/languages/he.js","../lib/languages/hi.js","../lib/languages/hu.js","../lib/languages/id.js","../lib/languages/it.js","../lib/languages/ja.js","../lib/languages/kn.js","../lib/languages/ko.js","../lib/languages/lv.js","../lib/languages/lt.js","../lib/languages/ms.js","../lib/languages/mr.js","../lib/languages/nb.js","../lib/languages/fa.js","../lib/languages/pl.js","../lib/languages/pa.js","../lib/languages/ro.js","../lib/languages/ru.js","../lib/languages/sr-Cyrl.js","../lib/languages/sr-Latn.js","../lib/languages/zh-Hans.js","../lib/languages/es.js","../lib/languages/sw.js","../lib/languages/sv.js","../lib/languages/ta.js","../lib/languages/te.js","../lib/languages/th.js","../lib/languages/zh-Hant.js","../lib/languages/tr.js","../lib/languages/uk.js","../lib/languages/ur.js","../lib/languages/vi.js"],"sourcesContent":["/**\n * Abstract base class for language converters.\n *\n * This class provides the framework for converting numbers to words in any language.\n * It handles the common conversion flow while delegating language-specific logic to subclasses.\n *\n * ## Responsibilities\n *\n * - Receives pre-validated and normalized input from the public API (n2words.js)\n * - Handles negative number prefixing via `negativeWord`\n * - Converts decimals via `decimalDigitsToWords()`, preserving leading zeros\n * - Delegates integer conversion to `integerToWords()` (implemented by subclasses)\n *\n * ## Required Subclass Implementation\n *\n * Subclasses MUST provide:\n * - `integerToWords(integerPart)` - Core conversion logic (abstract method)\n * - `negativeWord` - Word preceding negative numbers (e.g., \"minus\"))\n * - `zeroWord` - Word for the digit 0 (e.g., \"zero\")\n * - `decimalSeparatorWord` - Word between whole and decimal parts (e.g., \"point\")\n *\n * ## Optional Overrides\n *\n * Subclasses MAY override:\n * - `wordSeparator` - Character(s) between words (default: space, empty for CJK languages)\n * - `usePerDigitDecimals` - Enable per-digit decimal mode (default: false)\n * - `decimalIntegerToWords()` - Custom decimal conversion (e.g., Romanian masculine forms)\n * - `decimalDigitsToWords()` - Complete decimal conversion override\n * - `toWords()` - Override to capture integerPart for context-dependent rules (e.g., Czech)\n *\n * ## Input Contract\n *\n * Input validation and normalization happen at the public API boundary (n2words.js).\n * This class assumes it receives clean, pre-processed data via `toWords()`.\n *\n * @abstract\n */\nexport class AbstractLanguage {\n // ============================================================================\n // Private Fields\n // ============================================================================\n\n /**\n * Private storage for options.\n * @type {Object}\n */\n #options = {}\n\n // ============================================================================\n // Required Properties (subclasses must define)\n // ============================================================================\n\n /**\n * Word that precedes negative numbers (e.g., \"minus\", \"negative\", \"moins\").\n * @type {string}\n */\n negativeWord = ''\n\n /**\n * Word that separates integer and decimal parts (e.g., \"point\", \"virgule\", \"comma\").\n * @type {string}\n */\n decimalSeparatorWord = ''\n\n /**\n * Word representation for the digit 0 (e.g., \"zero\", \"zéro\", \"null\").\n * Used for zero values and leading zeros in decimals.\n * @type {string}\n */\n zeroWord = ''\n\n // ============================================================================\n // Optional Properties (subclasses may override)\n // ============================================================================\n\n /**\n * Character(s) used to separate words in the output.\n *\n * Defaults to a single space. Set to empty string for languages without\n * word separators (e.g., Japanese, Thai, Chinese).\n *\n * @type {string}\n */\n wordSeparator = ' '\n\n /**\n * Whether to convert decimal digits individually rather than grouped.\n *\n * - `false` (default): Leading zeros preserved, remaining digits grouped as a number\n * - Example: \"05\" → [\"zero\", \"five\"], \"14\" → [\"fourteen\"]\n * - Used by: English, Spanish, French, German, etc.\n *\n * - `true`: Each digit converted separately\n * - Example: \"05\" → [\"zero\", \"five\"], \"14\" → [\"one\", \"four\"]\n * - Used by: Japanese, Thai, Tamil, Telugu, Greek, Hebrew, Filipino\n *\n * @type {boolean}\n */\n usePerDigitDecimals = false\n\n // ============================================================================\n // Public Accessors\n // ============================================================================\n\n /**\n * Read-only access to options set via `setOptions()`.\n * @type {Object}\n */\n get options () {\n return this.#options\n }\n\n // ============================================================================\n // Public Methods\n // ============================================================================\n\n /**\n * Converts pre-normalized numeric components to words.\n *\n * This is the main entry point called by the public API (makeConverter in n2words.js).\n * It assembles the final word representation from the provided components.\n *\n * **Caller contract (enforced by makeConverter):**\n * - `integerPart` is a non-negative BigInt (>= 0n)\n * - `decimalPart` is a string of digits only (no sign, no decimal point)\n * - `isNegative` reflects the original input sign\n *\n * **Conversion flow:**\n * 1. Prepend negative word if applicable\n * 2. Convert integer part via `integerToWords()`\n * 3. If decimals present: append separator and decimal words\n * 4. Join all parts with `wordSeparator`\n *\n * Subclasses needing access to the integer part during decimal conversion\n * (e.g., for context-dependent separator words) should override this\n * method to cache the value before calling super.toWords().\n *\n * @public\n * @param {boolean} isNegative Whether the original number was negative\n * @param {bigint} integerPart The integer part (always non-negative)\n * @param {string} [decimalPart] - Decimal digits if present (e.g., \"14\" for 3.14)\n * @returns {string} The localized cardinal string\n */\n toWords (isNegative, integerPart, decimalPart) {\n const words = []\n\n if (isNegative) words.push(this.negativeWord)\n\n words.push(this.integerToWords(integerPart))\n\n if (decimalPart) {\n words.push(this.decimalSeparatorWord)\n words.push(...this.decimalDigitsToWords(decimalPart))\n }\n\n return words.join(this.wordSeparator)\n }\n\n // ============================================================================\n // Abstract Methods (subclasses must implement)\n // ============================================================================\n\n /**\n * Converts a BigInt integer part to its cardinal word representation.\n *\n * This is the core template method that subclasses MUST implement to provide\n * language-specific number conversion logic.\n *\n * @abstract\n * @param {bigint} integerPart The integer part to convert (always >= 0n)\n * @returns {string} The cardinal representation in the target language\n * @throws {Error} If not implemented by subclass\n */\n integerToWords (integerPart) {\n throw new Error('integerToWords() must be implemented by subclass')\n }\n\n // ============================================================================\n // Protected Methods (subclasses may override or call)\n // ============================================================================\n\n /**\n * Sets options by merging language defaults with user-provided options.\n *\n * Merges defaults first, then user options (later keys override earlier ones).\n * Stores the result in the private `#options` field, accessible via the\n * read-only `options` getter.\n *\n * @protected\n * @param {Object} [defaults={}] - Default option values for the language\n * @param {Object} [userOptions={}] - Runtime options supplied by the caller\n *\n * @example\n * constructor(options = {}) {\n * super()\n * this.setOptions({ gender: 'masculine' }, options)\n * }\n */\n setOptions (defaults = {}, userOptions = {}) {\n this.#options = {\n ...defaults,\n ...userOptions\n }\n }\n\n /**\n * Converts an integer to words in decimal context.\n *\n * By default, delegates to `integerToWords()`. Override this method\n * when decimal conversion requires different behavior than integer conversion.\n *\n * Called with:\n * - Single digits (0-9) when `usePerDigitDecimals = true`\n * - Grouped numbers when `usePerDigitDecimals = false`\n *\n * **Use cases for overriding:**\n * - Romanian: Decimals always use masculine forms regardless of gender option\n * - Languages with different plural/gender rules for decimal vs integer parts\n *\n * @protected\n * @param {bigint} integerPart The integer to convert (single digit or grouped)\n * @returns {string} The word representation for use in decimal context\n */\n decimalIntegerToWords (integerPart) {\n return this.integerToWords(integerPart)\n }\n\n /**\n * Converts decimal fractional digits into an array of words.\n *\n * Leading zeros are always preserved individually. The remaining digits\n * are converted based on `usePerDigitDecimals`:\n *\n * - `false` (default): Remaining digits grouped as a single number\n * - \"05\" → [\"zero\", \"five\"], \"14\" → [\"fourteen\"]\n *\n * - `true`: Each remaining digit converted separately\n * - \"05\" → [\"zero\", \"five\"], \"14\" → [\"one\", \"four\"]\n *\n * @protected\n * @param {string} decimalPart Decimal digits as string (e.g., \"05\" for 3.05)\n * @returns {string[]} Array of word tokens for the fractional part\n */\n decimalDigitsToWords (decimalPart) {\n const words = []\n\n // Always preserve leading zeros individually\n let i = 0\n while (i < decimalPart.length && decimalPart[i] === '0') {\n words.push(this.zeroWord)\n i++\n }\n\n const remainder = decimalPart.slice(i)\n if (!remainder) return words\n\n // Convert remainder: per-digit or as single number\n if (this.usePerDigitDecimals) {\n for (const char of remainder) {\n words.push(this.decimalIntegerToWords(BigInt(char)))\n }\n } else {\n words.push(this.decimalIntegerToWords(BigInt(remainder)))\n }\n\n return words\n }\n}\n","import { AbstractLanguage } from './abstract-language.js'\n\n/**\n * Greedy scale language converter implementing the \"highest-matching scale word\" algorithm.\n *\n * Responsibilities:\n * - Decompose an integer into a sequence of word-sets using greedy matching.\n * - Provide helpers to reduce and post-process matched word-sets.\n * - Inherits decimal handling from AbstractLanguage (supports grouped and per-digit\n * modes via the `usePerDigitDecimals` class property).\n *\n * Subclass requirements:\n * - Define `scaleWords` (ordered descending) as `[bigint, string]` tuples.\n * - Implement 'combineWordSets(preceding, following)' to combine adjacent word-sets\n * per language grammar.\n *\n * Scale words specification:\n * - `scaleWords` is an Array of 2-tuples: `[bigint, string]` where the first element\n * is the numeric scale value and the second is the word for that value.\n * - Scale words MUST be ordered from largest to smallest (descending) for the algorithm\n * to function correctly.\n *\n * Terminology:\n * - **Scale**: A magnitude value (100n, 1000n, 1000000n)\n * - **Word-set**: An object `{ word: bigint }` representing a partial result\n * - **Scale word**: The word for a scale value (\"hundred\", \"thousand\")\n *\n * @abstract\n * @extends AbstractLanguage\n */\n\nexport class GreedyScaleLanguage extends AbstractLanguage {\n // ============================================================================\n // Required Properties (subclasses must define)\n // ============================================================================\n\n /**\n * Array of scale words mapping numeric values to their word representations.\n *\n * Each element is a 2-tuple: `[bigint, string]` where the first element is the\n * numeric scale value and the second is the word for that value. The array MUST be\n * ordered from largest to smallest (descending) for the greedy algorithm to work correctly.\n *\n * @type {Array<[bigint, string]>}\n * @example\n * // English scale words (descending order):\n * // [[1000000000n, 'billion'], [1000000n, 'million'], [1000n, 'thousand'], [100n, 'hundred'], ..., [1n, 'one']]\n */\n scaleWords\n\n // ============================================================================\n // Public Methods\n // ============================================================================\n\n /**\n * Returns the word for an exact scale value.\n *\n * @param {bigint} scale The scale value to look up (prefer BigInt for exact matching).\n * @returns {string|undefined} The word for the provided scale, or `undefined`.\n */\n wordForScale (scale) {\n const match = this.scaleWords.find((pair) => pair[0] === scale)\n return match?.[1]\n }\n\n // ============================================================================\n // Protected Methods (subclasses may call or override)\n // ============================================================================\n\n /**\n * Decomposes an integer into a sequence of word-sets.\n *\n * This internal helper returns a nested structure that represents quantities and\n * their matching scale words (e.g. `[{ 'one': 1n }, { 'hundred': 100n }, ...]`).\n * The result is designed to be reduced by `reduceWordSets()` using language-specific `combineWordSets()`.\n *\n * For quantities > 1, the multiplier is recursively decomposed. For quantity = 1,\n * the implicit \"one\" is represented with `{ 'one': 1n }` and typically omitted during combineWordSets().\n *\n * @protected\n * @param {bigint} integerPart The integer to decompose.\n * @returns {Array<Object|Array>} An array of word-set objects and possibly nested arrays.\n */\n decomposeInteger (integerPart) {\n const wordSets = []\n let remaining = integerPart\n\n do {\n const match = this.scaleWords.find((pair) => remaining >= pair[0])\n if (!match) break\n\n const multiplier = remaining === 0n ? 1n : remaining / match[0]\n\n if (multiplier === 1n) {\n wordSets.push({ [this.wordForScale(1n)]: 1n })\n } else {\n wordSets.push(this.decomposeInteger(multiplier))\n }\n\n wordSets.push({ [match[1]]: match[0] })\n\n remaining = remaining === 0n ? 0n : remaining % match[0]\n } while (remaining > 0n)\n\n return wordSets\n }\n\n /**\n * Reduces a nested array of word-sets into a single word-set object.\n *\n * This method repeatedly applies the subclass `combineWordSets()` operation until a single\n * object remains. It normalizes nested arrays by recursively reducing them.\n *\n * @protected\n * @param {Array<Object|Array>} wordSets Array of word-set objects and nested arrays.\n * @returns {Object} Reduced word-set where the single object key is the language string\n * and its value is the numeric BigInt result for that string.\n */\n reduceWordSets (wordSets) {\n while (wordSets.length > 1) {\n const [first, second, ...rest] = wordSets\n\n if (!Array.isArray(first) && !Array.isArray(second)) {\n const combined = this.combineWordSets(first, second)\n wordSets = rest.length > 0 ? [combined, rest] : [combined]\n continue\n }\n\n const normalized = wordSets.map((element) => {\n if (!Array.isArray(element)) return element\n return element.length === 1 ? element[0] : this.reduceWordSets(element)\n })\n\n wordSets = normalized\n }\n\n return wordSets[0]\n }\n\n // ============================================================================\n // Abstract Methods (subclasses must implement)\n // ============================================================================\n\n /**\n * Combines two adjacent word-sets into a single word-set.\n *\n * This is the core language-specific method that must be implemented by subclasses\n * to define how adjacent word-sets are combined according to the language's grammar.\n * For example, English combines \"twenty\" + \"three\" → \"twenty-three\", while\n * French might combine \"quatre-vingts\" + \"dix\" → \"quatre-vingt-dix\".\n *\n * @abstract\n * @protected\n * @param {Object} preceding Preceding word-set as `{ word: bigint }`.\n * @param {Object} following Following word-set as `{ word: bigint }`.\n * @returns {Object} Combined word-set with merged text and resulting numeric value.\n *\n * @example\n * // English implementation might handle:\n * // combineWordSets({ 'twenty': 20n }, { 'three': 3n }) → { 'twenty-three': 23n }\n * // combineWordSets({ 'one': 1n }, { 'hundred': 100n }) → { 'one hundred': 100n }\n */\n combineWordSets (preceding, following) {\n throw new Error('combineWordSets() must be implemented by subclass')\n }\n\n // ============================================================================\n // Optional Methods (subclasses may override)\n // ============================================================================\n\n /**\n * Final string post-processing hook.\n *\n * Subclasses may override to apply language-specific whitespace, punctuation or\n * orthographic corrections.\n *\n * @protected\n * @param {string} output Language string produced by the conversion flow.\n * @returns {string} Final formatted string.\n */\n finalizeWords (output) {\n return output.trimEnd()\n }\n\n /**\n * Converts an integer to its language-specific cardinal words.\n *\n * This method orchestrates decomposition, reduction, and final formatting. It does\n * not handle decimals or sign; those concerns are implemented in\n * `AbstractLanguage.toWords` which calls this method for the integer part.\n *\n * @param {bigint} integerPart The integer to convert.\n * @returns {string} The cardinal representation for the integer in the language.\n */\n integerToWords (integerPart) {\n const wordSets = this.decomposeInteger(integerPart)\n const reduced = this.reduceWordSets(wordSets)\n const result = Object.keys(reduced)[0]\n return this.finalizeWords(result)\n }\n}\n","import { GreedyScaleLanguage } from './greedy-scale-language.js'\n\n/**\n * Base class for Turkic languages with shared grammar patterns.\n *\n * This class provides a reusable implementation for Turkic languages that share:\n * - Space-separated number combinations\n * - Implicit 'bir' (one) before hundreds and thousands\n * - Simple multiplication/addition logic\n * - Consistent magnitude handling\n * - Inherits decimal handling from AbstractLanguage via GreedyScaleLanguage\n * (supports both grouped and per-digit modes via the `usePerDigitDecimals` class property).\n *\n * Used by: Turkish (TR), Azerbaijani (AZ)\n *\n * Subclasses MUST define (from GreedyScaleLanguage requirements):\n * - `scaleWords` array of [value, word] tuples as a class property (ordered descending by value).\n * Optionally, language-specific class properties (e.g., `negativeWord`, `zeroWord`, `decimalSeparatorWord`, `wordSeparator`).\n *\n * TurkicLanguage provides a default `combineWordSets()` implementation; subclasses may override\n * if specialized combine logic is needed (unlikely for Turkic languages).\n *\n * @abstract\n * @extends GreedyScaleLanguage\n */\nexport class TurkicLanguage extends GreedyScaleLanguage {\n // ============================================================================\n // Inherited Implementation (overrides GreedyScaleLanguage)\n // ============================================================================\n\n /**\n * Combines two adjacent word-sets according to Turkic grammar rules.\n *\n * Shared Turkic patterns:\n * - Implicit 'bir' (one) before hundreds and thousands\n * - Space separator (wordSeparator property) for all combinations\n * - Multiplies when following > preceding (crossing magnitude boundary)\n * - Adds otherwise (combining same-magnitude components)\n *\n * @param {Object} preceding Preceding word-set as { word: bigint }.\n * @param {Object} following Following word-set as { word: bigint }.\n * @returns {Object} Combined word-set with merged word and resulting number.\n */\n combineWordSets (preceding, following) {\n const [[precedingWord, precedingValue]] = Object.entries(preceding)\n const [[followingWord, followingValue]] = Object.entries(following)\n\n // Implicit 'bir' (one) before certain magnitudes:\n // Omit '1' before hundreds (100n) and thousands (1000n) to form natural combinations\n if (precedingValue === 1n && (followingValue <= 100n || followingValue === 1000n)) {\n return following // Return just the magnitude word (e.g., \"yüz\", not \"bir yüz\")\n }\n\n // Combine numbers with space separator (wordSeparator from GreedyScaleLanguage):\n // Multiply when crossing magnitude boundary, add otherwise\n const resultNumber = followingValue > precedingValue ? precedingValue * followingValue : precedingValue + followingValue\n return { [`${precedingWord}${this.wordSeparator}${followingWord}`]: resultNumber }\n }\n}\n","import { AbstractLanguage } from './abstract-language.js'\n\n/**\n * Base class for South Asian languages with shared grouping patterns.\n *\n * This class provides a reusable implementation for South Asian languages that share:\n * - Indian-style number grouping: last 3 digits, then 2-2 (1,23,45,67,89)\n * - Lakh (100,000), Crore (10,000,000), Arab (1,000,000,000) scale words\n * - Standard negative and decimal handling (inherits AbstractLanguage decimal logic,\n * including `usePerDigitDecimals` support when set by subclasses)\n *\n * Used by: Hindi (hi), Bengali (bn), Urdu (ur), Punjabi (pa), Marathi (mr), Gujarati (gu), Kannada (kn)\n *\n * Subclasses MUST define language-specific vocabulary via class properties:\n * - `belowHundredWords` array with digit and teen words (0-99)\n * - `hundredWord` string used inside `segmentToWords`\n * - `scaleWords` array with grouping words (hazaar, lakh, crore, etc.) indexed by grouping level\n * - `negativeWord`, `decimalSeparatorWord`, `zeroWord`, `wordSeparator`\n *\n * @abstract\n * @extends AbstractLanguage\n */\nexport class SouthAsianLanguage extends AbstractLanguage {\n // ============================================================================\n // Required Properties (subclasses must define)\n // ============================================================================\n\n /**\n * Array of words for numbers 0-99 (digits and teens).\n * Index directly: belowHundredWords[0] through belowHundredWords[99].\n * @type {Array<string>}\n */\n belowHundredWords\n\n /**\n * Word for \"hundred\" in the language (e.g., 'सौ' in Hindi, 'শত' in Bengali).\n * Used to construct hundreds (e.g., \"1 hundred\", \"2 hundred\").\n * @type {string}\n */\n hundredWord\n\n /**\n * Array of scale words for Indian-style grouping (hazaar, lakh, crore, arab, etc.).\n * Index 0 contains empty string (ones place has no scale word).\n * Index 1 is for thousands, Index 2 for lakhs, Index 3 for crores, etc.\n * @type {Array<string>}\n */\n scaleWords\n\n // ============================================================================\n // Protected Methods (subclasses may call or override)\n // ============================================================================\n\n /**\n * Splits a number into Indian numbering system segments.\n *\n * The Indian system segments differently than Western (3-3-3) systems:\n * - First segment (rightmost): Up to 3 digits (ones, tens, hundreds)\n * - Subsequent segments: Exactly 2 digits each (thousands, lakhs, crores, etc.)\n *\n * This creates the familiar Indian comma pattern: 1,23,45,67,890\n *\n * @protected\n * @param {bigint} integerPart The integer to split into segments.\n * @returns {Array<number>} Array of segments from most significant to least significant.\n *\n * @example\n * // splitToSegments(1234567n) → [12, 34, 567]\n * // Reads as: 12 lakhs, 34 thousands, 567 units\n * // splitToSegments(98765432n) → [9, 87, 65, 432]\n * // Reads as: 9 crores, 87 lakhs, 65 thousands, 432 units\n */\n splitToSegments (integerPart) {\n const numStr = integerPart.toString()\n\n if (numStr.length <= 3) {\n return [Number(numStr)]\n }\n\n const segments = []\n const last3 = numStr.slice(-3)\n segments.unshift(Number(last3))\n\n let remaining = numStr.slice(0, -3)\n while (remaining.length > 0) {\n const segment = remaining.slice(-2)\n segments.unshift(Number(segment))\n remaining = remaining.slice(0, -2)\n }\n\n return segments\n }\n\n /**\n * Converts a segment (0-999) to words.\n *\n * @protected\n * @param {number} segmentValue Value between 0 and 999.\n * @returns {string} Language-specific word representation.\n */\n segmentToWords (segmentValue) {\n if (segmentValue === 0) return ''\n if (segmentValue < 100) return this.belowHundredWords[segmentValue]\n\n const hundreds = Math.trunc(segmentValue / 100)\n const remainder = segmentValue % 100\n const parts = []\n\n if (hundreds === 1) {\n parts.push(this.belowHundredWords[1] + ' ' + this.hundredWord)\n } else {\n parts.push(this.belowHundredWords[hundreds] + ' ' + this.hundredWord)\n }\n\n if (remainder > 0) {\n parts.push(this.belowHundredWords[remainder])\n }\n\n return parts.join(' ')\n }\n\n // ============================================================================\n // Public Methods\n // ============================================================================\n\n /**\n * Converts integer to cardinal words using South Asian grouping.\n *\n * @param {bigint} integerPart Number to convert.\n * @returns {string} Cardinal representation.\n */\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n\n const segments = this.splitToSegments(integerPart)\n const segmentCount = segments.length\n const words = []\n\n for (let i = 0; i < segmentCount; i++) {\n const segmentValue = segments[i]\n if (segmentValue === 0) continue\n\n const scaleIndex = segmentCount - i - 1\n words.push(this.segmentToWords(segmentValue))\n if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {\n words.push(this.scaleWords[scaleIndex])\n }\n }\n\n return words.join(' ').trim()\n }\n}\n","import { AbstractLanguage } from './abstract-language.js'\n\n/**\n * Base class for Slavic and related languages with complex pluralization.\n *\n * This class provides a reusable implementation for languages that share:\n * - Three-form pluralization (singular/few/many)\n * - Gender-aware number forms (masculine/feminine for 1-9)\n * - Hundreds, tens, ones decomposition pattern\n * - Segment-based large number handling (thousands, millions, etc.)\n * - Inherits decimal handling from AbstractLanguage (supports both grouped and\n * per-digit modes via the `usePerDigitDecimals` class property).\n *\n * Used by: Russian (ru), Czech (cs), Polish (pl), Ukrainian (uk), Serbian (sr-Latn),\n * Croatian (hr), Lithuanian (lt), Latvian (lv), Hebrew (he), and Biblical Hebrew (hbo).\n *\n * Subclasses MUST define these properties with language-specific vocabulary:\n * - `onesWords` - Object mapping 1-9 to masculine forms (or default forms)\n * - `onesFeminineWords` - Object mapping 1-9 to feminine forms (if gender distinction exists)\n * - `teensWords` - Object mapping 0-9 to teen numbers (10-19)\n * - `twentiesWords` - Object mapping 2-9 to tens (20-90)\n * - `hundredsWords` - Object mapping 1-9 to hundreds (100-900) or special hundreds handling\n * - `pluralForms` - Object mapping segment indices to [singular, few, many] plural forms\n *\n * Optional properties:\n * - `scaleGenders` - Object mapping segment indices to boolean (true = feminine scale word)\n * If not defined, defaults to thousands (index 1) being feminine, others masculine.\n *\n * @abstract\n * @extends AbstractLanguage\n */\nexport class SlavicLanguage extends AbstractLanguage {\n // ============================================================================\n // Required Properties (subclasses must define)\n // ============================================================================\n\n /**\n * Masculine forms for digits 1-9 (or default forms if no gender distinction).\n *\n * @type {Object.<number, string>}\n */\n onesWords = {}\n\n /**\n * Feminine forms for digits 1-9 (if language has gender distinction).\n *\n * @type {Object.<number, string>}\n */\n onesFeminineWords = {}\n\n /**\n * Words for teen numbers (10-19).\n *\n * @type {Object.<number, string>}\n */\n teensWords = {}\n\n /**\n * Words for multiples of ten (20, 30, 40, etc.).\n *\n * @type {Object.<number, string>}\n */\n twentiesWords = {}\n\n /**\n * Words for hundreds (100, 200, 300, etc.) or special hundreds handling.\n *\n * @type {Object.<number, string>}\n */\n hundredsWords = {}\n\n /**\n * Plural forms for scale words (thousands, millions, billions, etc.).\n * Maps segment indices to [singular, few, many] forms.\n *\n * @type {Object.<number, string[]>}\n */\n pluralForms = {}\n\n // ============================================================================\n // Optional Properties (subclasses may override)\n // ============================================================================\n\n /**\n * Gender of each scale word.\n * Maps segment indices to boolean: true = feminine, false = masculine.\n * Default is empty (all masculine). Languages with feminine thousands\n * (Russian, Ukrainian, Serbian, Croatian) should set `{ 1: true }`.\n *\n * @type {Object.<number, boolean>}\n */\n scaleGenders = {}\n\n /**\n * Whether to omit \"one\" before scale words (e.g., \"thousand\" instead of \"one thousand\").\n * When true, 1000 becomes \"tysiąc\" (Polish) instead of \"jeden tysiąc\".\n * Used by Polish, Czech, and similar languages.\n *\n * @type {boolean}\n */\n omitOneBeforeScale = false\n\n // ============================================================================\n // Constructor\n // ============================================================================\n\n /**\n * Constructs a SlavicLanguage instance with optional configuration.\n *\n * @param {Object} [options] Configuration options.\n * @param {('masculine'|'feminine')} [options.gender='masculine'] Grammatical gender for number forms.\n */\n constructor (options = {}) {\n super()\n\n this.setOptions({\n gender: 'masculine'\n }, options)\n }\n\n // ============================================================================\n // Public Methods\n // ============================================================================\n\n /**\n * Converts an integer to its word representation.\n *\n * This method implements the Slavic number construction algorithm:\n * 1. Split number into 3-digit segments from right to left (567, 234, 1 for 1,234,567)\n * 2. For each segment (processing left to right): convert hundreds, tens, ones\n * 3. Apply gender rules: feminine forms for thousands segment or when feminine=true\n * 4. Add appropriate pluralized scale word (thousand/million/billion/etc.)\n * 5. Join all parts with spaces\n *\n * @param {bigint} integerPart The integer to convert (non-negative).\n * @returns {string} The number in words.\n */\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let segmentIndex = segments.length\n\n for (const segmentValue of segments) {\n segmentIndex = segmentIndex - 1\n\n if (segmentValue === 0n) {\n continue\n }\n\n const [onesDigit, tensDigit, hundredsDigit] = this.extractDigits(segmentValue)\n\n if (hundredsDigit > 0n) {\n words.push(this.hundredsWords[hundredsDigit])\n }\n\n if (tensDigit > 1n) {\n words.push(this.twentiesWords[tensDigit])\n }\n\n // Handle teens (10-19) or ones (1-9)\n if (tensDigit === 1n) {\n // Teens: use teensWords array directly\n words.push(this.teensWords[onesDigit])\n } else if (onesDigit > 0n) {\n // Skip \"one\" before scale words if omitOneBeforeScale is set\n // e.g., Polish says \"tysiąc\" not \"jeden tysiąc\" for 1000\n const shouldOmitOne = this.omitOneBeforeScale && segmentIndex > 0 && segmentValue === 1n\n\n if (!shouldOmitOne) {\n // Determine if feminine forms should be used:\n // 1. Check scaleGenders for this segment index (e.g., thousands = index 1)\n // 2. Also use feminine if user requested gender='feminine' for the ones segment\n const isScaleFeminine = this.scaleGenders[segmentIndex] === true\n const isFeminine = isScaleFeminine || (this.options.gender === 'feminine' && segmentIndex === 0)\n const onesArray = isFeminine ? this.onesFeminineWords : this.onesWords\n words.push(onesArray[onesDigit])\n }\n }\n\n // Add power word (thousand, million, etc.) with proper pluralization\n if (segmentIndex > 0) {\n words.push(this.pluralize(segmentValue, this.pluralForms[segmentIndex]))\n }\n }\n\n return words.join(' ')\n }\n\n // ============================================================================\n // Protected Methods (subclasses may call or override)\n // ============================================================================\n\n /**\n * Splits a number string into segments of specified size from right to left.\n *\n * Example: splitToSegments('1234567', 3) => [1n, 234n, 567n]\n * This represents: 1 million + 234 thousand + 567 ones\n *\n * @param {string} numberString The number as a string.\n * @param {number} segmentSize Segment size (typically 3 for thousands grouping).\n * @returns {bigint[]} Array of BigInt segments from highest to lowest scale.\n */\n splitToSegments (numberString, segmentSize) {\n const segments = []\n const stringLength = numberString.length\n\n if (stringLength > segmentSize) {\n const remainderLength = stringLength % segmentSize\n\n if (remainderLength > 0) {\n segments.push(BigInt(numberString.slice(0, remainderLength)))\n }\n\n for (let i = remainderLength; i < stringLength; i += segmentSize) {\n segments.push(BigInt(numberString.slice(i, i + segmentSize)))\n }\n } else {\n segments.push(BigInt(numberString))\n }\n\n return segments\n }\n\n /**\n * Extracts individual digits from a number (units, tens, hundreds).\n *\n * Returns digits in reverse order: [ones, tens, hundreds]\n * Example: 456 => [6n, 5n, 4n]\n *\n * @param {bigint} value The number to extract digits from (0-999).\n * @returns {bigint[]} Array of [ones, tens, hundreds] as BigInts.\n */\n extractDigits (value) {\n // Direct BigInt arithmetic is faster than string manipulation\n const onesPlace = value % 10n\n const tensPlace = (value / 10n) % 10n\n const hundredsPlace = value / 100n\n return [onesPlace, tensPlace, hundredsPlace]\n }\n\n /**\n * Selects the correct plural form based on Slavic pluralization rules.\n *\n * Slavic languages typically use three forms:\n * - Form 0 (singular): numbers ending in 1, except 11 (1, 21, 31, 101...)\n * - Form 1 (few): numbers ending in 2-4, except 12-14 (2-4, 22-24, 32-34...)\n * - Form 2 (many): all other numbers (0, 5-20, 25-30, 100, 111-119...)\n *\n * Examples using Russian тысяча (thousand):\n * - 1, 21, 31... ⇒ тысяча (form 0, singular)\n * - 2-4, 22-24, 32-34... ⇒ тысячи (form 1, few)\n * - 0, 5-20, 25-30, 100... ⇒ тысяч (form 2, many)\n *\n * @param {bigint} number The number to check.\n * @param {string[]} pluralForms Array of [singular, few, many] forms.\n * @returns {string} The appropriate form for the number.\n */\n pluralize (number, pluralForms) {\n const remainder100 = number % 100n\n const remainder10 = number % 10n\n\n // Check if in 11-19 range (special case)\n if (remainder100 >= 10n && remainder100 <= 20n) {\n return pluralForms[2] // Always use \"many\" form for 11-20\n }\n\n if (remainder10 === 1n) {\n return pluralForms[0] // Singular\n }\n\n if (remainder10 >= 2n && remainder10 <= 4n) {\n return pluralForms[1] // Few (2-4)\n }\n\n return pluralForms[2] // Many\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * French language converter.\n *\n * Supports:\n * - Pluralization of \"cent\" (hundred) and other words\n * - \"et\" (and) before odd numbers in tens place\n * - Optional hyphenation for compound numbers\n */\nexport class French extends GreedyScaleLanguage {\n negativeWord = 'moins'\n decimalSeparatorWord = 'virgule'\n zeroWord = 'zéro'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'quadrilliard'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillion'],\n [1_000_000_000_000_000_000_000n, 'trilliard'],\n [1_000_000_000_000_000_000n, 'trillion'],\n [1_000_000_000_000_000n, 'billiard'],\n [1_000_000_000_000n, 'billion'],\n [1_000_000_000n, 'milliard'],\n [1_000_000n, 'million'],\n [1000n, 'mille'],\n [100n, 'cent'],\n [80n, 'quatre-vingts'],\n [60n, 'soixante'],\n [50n, 'cinquante'],\n [40n, 'quarante'],\n [30n, 'trente'],\n [20n, 'vingt'],\n [19n, 'dix-neuf'],\n [18n, 'dix-huit'],\n [17n, 'dix-sept'],\n [16n, 'seize'],\n [15n, 'quinze'],\n [14n, 'quatorze'],\n [13n, 'treize'],\n [12n, 'douze'],\n [11n, 'onze'],\n [10n, 'dix'],\n [9n, 'neuf'],\n [8n, 'huit'],\n [7n, 'sept'],\n [6n, 'six'],\n [5n, 'cinq'],\n [4n, 'quatre'],\n [3n, 'trois'],\n [2n, 'deux'],\n [1n, 'un'],\n [0n, 'zéro']\n ]\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n withHyphenSeparator: false\n }, options)\n\n if (options.withHyphenSeparator) {\n this.wordSeparator = '-'\n }\n }\n\n /** Combines two word-sets with French pluralization and hyphenation rules. */\n combineWordSets (preceding, following) {\n let precedingWord = Object.keys(preceding)[0]\n let followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingValue = Object.values(following)[0]\n\n if (precedingValue === 1n) {\n if (followingValue < 1_000_000n) {\n return following\n }\n } else {\n if (\n ((precedingValue - 80n) % 100n === 0n || (precedingValue % 100n === 0n && precedingValue < 1000n)) &&\n followingValue < 1_000_000n &&\n precedingWord.at(-1) === 's'\n ) {\n precedingWord = precedingWord.slice(0, -1)\n }\n\n if (\n precedingValue < 1000n && followingValue !== 1000n &&\n followingWord.at(-1) !== 's' &&\n followingValue % 100n === 0n\n ) {\n followingWord += 's'\n }\n }\n\n if (followingValue < precedingValue && precedingValue < 100n) {\n if (followingValue % 10n === 1n && precedingValue !== 80n) {\n return { [`${precedingWord}${this.wordSeparator}et${this.wordSeparator}${followingWord}`]: precedingValue + followingValue }\n }\n return { [`${precedingWord}-${followingWord}`]: precedingValue + followingValue }\n }\n\n if (followingValue > precedingValue) return { [`${precedingWord}${this.wordSeparator}${followingWord}`]: precedingValue * followingValue }\n return { [`${precedingWord}${this.wordSeparator}${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * (European) Portuguese language converter.\n *\n * Supports:\n * - Gender-aware hundreds (duzentos, trezentos)\n * - \"e\" (and) conjunction for number combinations\n * - Post-processing to normalize word flow\n */\nexport class Portuguese extends GreedyScaleLanguage {\n negativeWord = 'menos'\n decimalSeparatorWord = 'vírgula'\n zeroWord = 'zero'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000n, 'quatrilião'],\n [1_000_000_000_000_000_000n, 'trilião'],\n [1_000_000_000_000n, 'bilião'],\n [1_000_000n, 'milião'],\n [1000n, 'mil'],\n [100n, 'cem'],\n [90n, 'noventa'],\n [80n, 'oitenta'],\n [70n, 'setenta'],\n [60n, 'sessenta'],\n [50n, 'cinquenta'],\n [40n, 'quarenta'],\n [30n, 'trinta'],\n [20n, 'vinte'],\n [19n, 'dezanove'],\n [18n, 'dezoito'],\n [17n, 'dezassete'],\n [16n, 'dezasseis'],\n [15n, 'quinze'],\n [14n, 'catorze'],\n [13n, 'treze'],\n [12n, 'doze'],\n [11n, 'onze'],\n [10n, 'dez'],\n [9n, 'nove'],\n [8n, 'oito'],\n [7n, 'sete'],\n [6n, 'seis'],\n [5n, 'cinco'],\n [4n, 'quatro'],\n [3n, 'três'],\n [2n, 'dois'],\n [1n, 'um'],\n [0n, 'zero']\n ]\n\n hundredsWords = {\n 1: 'cento',\n 2: 'duzentos',\n 3: 'trezentos',\n 4: 'quatrocentos',\n 5: 'quinhentos',\n 6: 'seiscentos',\n 7: 'setecentos',\n 8: 'oitocentos',\n 9: 'novecentos'\n }\n\n // Pre-compiled regex patterns for postClean - avoid recompilation\n static POSTCLEAN_REGEX = / e (.*entos?) (?=.*e)/g\n\n finalizeWords (words) {\n return words.replaceAll(Portuguese.POSTCLEAN_REGEX, ' $1 ')\n }\n\n /** Combines two word-sets according to Portuguese grammar rules. */\n combineWordSets (preceding, following) {\n // Extract words and numeric values\n let precedingWord = Object.keys(preceding)[0]\n let followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0] // BigInt\n const followingValue = Object.values(following)[0] // BigInt\n\n // Implicit \"um\": omit before millions (\"um milhão\" → \"milhão\")\n if (precedingValue === 1n) {\n if (followingValue < 1_000_000n) return { [followingWord]: followingValue }\n precedingWord = 'um'\n } else if (precedingValue === 100n && followingValue % 1000n !== 0n) {\n // Special handling: \"cem\" (100) becomes \"cento\" when followed by non-thousands\n precedingWord = 'cento'\n }\n\n if (followingValue < precedingValue) {\n return { [`${precedingWord} e ${followingWord}`]: precedingValue + followingValue }\n }\n\n // Handle \"milião\" -> \"milhão\" conversion\n if (followingWord === 'milião') followingWord = 'milhão'\n\n // Pluralization logic for large numbers\n if (precedingValue > 1n) {\n if (followingValue % 1_000_000_000n === 0n) {\n followingWord = followingWord.replace('bilião', 'biliões')\n } else if (followingValue % 1_000_000n === 0n) {\n followingWord = followingWord.replace('milhão', 'milhões')\n }\n }\n\n if (followingValue === 100n) {\n precedingWord = this.hundredsWords[precedingValue]\n return { [`${precedingWord}`]: precedingValue * followingValue }\n }\n\n return { [`${precedingWord} ${followingWord}`]: precedingValue * followingValue }\n }\n}\n","/**\n * n2words - Convert numbers to words in multiple languages\n *\n * This file is the main entry point for the n2words library.\n * It exports converter functions for all supported languages.\n *\n * ## For Contributors\n *\n * When adding a new language, this file must be updated in THREE sections:\n * 1. Language Imports - Add import statement (alphabetically sorted)\n * 2. Language Converters - Create converter with makeConverter() (alphabetically sorted)\n * 3. Exports - Add to export list (alphabetically sorted)\n *\n * Use the scaffolding tool to automate this process:\n * npm run lang:add <language-code>\n *\n * ## Public API Structure\n *\n * Each language exports a converter function:\n * - Name: `{LanguageName}Converter` (e.g., EnglishConverter, SpanishConverter)\n * - Signature: `(value: NumericValue, options?: Options) => string`\n * - Input: number, bigint, or string (numeric strings only)\n * - Output: Words representing the number in the target language\n *\n * Languages without options use signature: `(value: NumericValue) => string`\n * Languages with options define a typedef (e.g., ArabicOptions) and use: `(value: NumericValue, options?: ArabicOptions) => string`\n *\n * @module n2words\n */\n\n// ============================================================================\n// Language Imports\n// ============================================================================\n\nimport { Arabic } from './languages/ar.js'\nimport { Azerbaijani } from './languages/az.js'\nimport { Bangla } from './languages/bn.js'\nimport { Czech } from './languages/cs.js'\nimport { Danish } from './languages/da.js'\nimport { German } from './languages/de.js'\nimport { Greek } from './languages/el.js'\nimport { English } from './languages/en.js'\nimport { Spanish } from './languages/es.js'\nimport { Persian } from './languages/fa.js'\nimport { Filipino } from './languages/fil.js'\nimport { French } from './languages/fr.js'\nimport { FrenchBelgium } from './languages/fr-BE.js'\nimport { Gujarati } from './languages/gu.js'\nimport { Hebrew } from './languages/he.js'\nimport { BiblicalHebrew } from './languages/hbo.js'\nimport { Hindi } from './languages/hi.js'\nimport { Croatian } from './languages/hr.js'\nimport { Hungarian } from './languages/hu.js'\nimport { Indonesian } from './languages/id.js'\nimport { Italian } from './languages/it.js'\nimport { Japanese } from './languages/ja.js'\nimport { Kannada } from './languages/kn.js'\nimport { Korean } from './languages/ko.js'\nimport { Lithuanian } from './languages/lt.js'\nimport { Latvian } from './languages/lv.js'\nimport { Marathi } from './languages/mr.js'\nimport { Malay } from './languages/ms.js'\nimport { Dutch } from './languages/nl.js'\nimport { NorwegianBokmal } from './languages/nb.js'\nimport { Punjabi } from './languages/pa.js'\nimport { Polish } from './languages/pl.js'\nimport { Portuguese } from './languages/pt.js'\nimport { Romanian } from './languages/ro.js'\nimport { Russian } from './languages/ru.js'\nimport { SerbianCyrillic } from './languages/sr-Cyrl.js'\nimport { SerbianLatin } from './languages/sr-Latn.js'\nimport { Swedish } from './languages/sv.js'\nimport { Swahili } from './languages/sw.js'\nimport { Tamil } from './languages/ta.js'\nimport { Telugu } from './languages/te.js'\nimport { Thai } from './languages/th.js'\nimport { Turkish } from './languages/tr.js'\nimport { Ukrainian } from './languages/uk.js'\nimport { Urdu } from './languages/ur.js'\nimport { Vietnamese } from './languages/vi.js'\nimport { SimplifiedChinese } from './languages/zh-Hans.js'\nimport { TraditionalChinese } from './languages/zh-Hant.js'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n//\n// This section defines TypeScript-compatible JSDoc types for:\n// - NumericValue: The input types accepted by all converters\n// - {Language}Options: Optional configuration for languages that support it\n//\n// Keep options typedefs alphabetically sorted for maintainability.\n// ============================================================================\n\n/**\n * Numeric value that can be converted to words.\n * Accepts number, bigint, or numeric string representations.\n * @typedef {number | bigint | string} NumericValue\n */\n\n/**\n * @typedef {Object} ArabicOptions\n * @property {string} [negativeWord] Word for negative numbers\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} BiblicalHebrewOptions\n * @property {string} [andWord='ו'] Conjunction character (typically 'ו' for and)\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} CroatianOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} CzechOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} DanishOptions\n * @property {boolean} [ordFlag=false] Enable ordinal number conversion\n */\n\n/**\n * @typedef {Object} DutchOptions\n * @property {boolean} [includeOptionalAnd=false] Include optional \"en\" separator\n * @property {boolean} [noHundredPairing=false] Disable hundred-pairing (e.g., \"twelve hundred\" becomes \"one thousand two hundred\")\n * @property {boolean} [accentOne=true] Use accented \"één\" for one\n */\n\n/**\n * @typedef {Object} FrenchOptions\n * @property {boolean} [withHyphenSeparator=false] Use hyphens (true) instead of spaces (false) in compounds\n */\n\n/**\n * @typedef {Object} FrenchBelgiumOptions\n * @property {boolean} [withHyphenSeparator=false] Use hyphens (true) instead of spaces (false) in compounds\n */\n\n/**\n * @typedef {Object} HebrewOptions\n * @property {string} [andWord='ו'] Conjunction character (typically 'ו' for and)\n */\n\n/**\n * @typedef {Object} LatvianOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} LithuanianOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} PolishOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} RomanianOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} RussianOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} SerbianCyrillicOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} SerbianLatinOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} SimplifiedChineseOptions\n * @property {boolean} [formal=true] Use formal/financial numerals (壹贰叁) vs. common numerals (一二三)\n */\n\n/**\n * @typedef {Object} SpanishOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} TraditionalChineseOptions\n * @property {boolean} [formal=true] Use formal/financial numerals (壹貳參) vs. common numerals (一二三)\n */\n\n/**\n * @typedef {Object} TurkishOptions\n * @property {boolean} [dropSpaces=false] Remove spaces between words if true\n */\n\n/**\n * @typedef {Object} UkrainianOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n// ============================================================================\n// Converter Factory\n// ============================================================================\n//\n// makeConverter() is a factory function that creates converter functions from\n// language classes. It provides a consistent functional API for all languages:\n//\n// const result = EnglishConverter(42) // \"forty-two\"\n// const result = ArabicConverter(1, {gender: 'feminine'}) // \"واحدة\"\n//\n// This design:\n// - Hides class instantiation details from public API\n// - Ensures each conversion uses a fresh instance\n// - Maintains immutability (no shared state between conversions)\n// ============================================================================\n\n/**\n * Creates a converter function for a language class.\n *\n * This factory handles all input validation and normalization at the public API\n * boundary, then delegates to the language class with pre-processed data.\n *\n * @template {Object} [TOptions={}]\n * @param {new (options?: TOptions) => { toWords: (isNegative: boolean, integerPart: bigint, decimalPart?: string) => string }} LanguageClass - Language class constructor\n * @returns {(value: NumericValue, options?: TOptions) => string} Converter function\n */\nfunction makeConverter (LanguageClass) {\n /**\n * @param {NumericValue} value\n * @param {TOptions} [options]\n * @returns {string}\n */\n return function convertToWords (value, options) {\n if (options !== undefined && !isPlainObject(options)) {\n throw new TypeError('options must be a plain object if provided')\n }\n\n const { isNegative, integerPart, decimalPart } = parseNumericValue(value)\n return new LanguageClass(options).toWords(isNegative, integerPart, decimalPart)\n }\n}\n\n// ============================================================================\n// Input Parsing Utilities\n// ============================================================================\n\n/**\n * @typedef {Object} ParsedNumericValue\n * @property {boolean} isNegative - Whether the value is negative\n * @property {bigint} integerPart - The absolute integer part\n * @property {string} [decimalPart] - The decimal digits (without the point)\n */\n\n/**\n * Parses and validates a numeric value into its components.\n * Handles number, string, and bigint inputs uniformly.\n *\n * @param {NumericValue} value The value to parse\n * @returns {ParsedNumericValue} The parsed components\n * @throws {TypeError} If value is not a valid numeric type\n * @throws {Error} If value is not a valid number format\n */\nfunction parseNumericValue (value) {\n const type = typeof value\n\n // BigInt: simplest case - no decimals, no scientific notation\n if (type === 'bigint') {\n return value < 0n\n ? { isNegative: true, integerPart: -value }\n : { isNegative: false, integerPart: value }\n }\n\n // Reject invalid types early\n if (type !== 'number' && type !== 'string') {\n throw new TypeError(\n `Invalid value type: expected number, string, or bigint, received ${type}`\n )\n }\n\n // Convert to normalized string\n const str = type === 'number'\n ? numberToString(value)\n : stringToNormalizedForm(value)\n\n return parseNumericString(str)\n}\n\n/**\n * Converts a JavaScript number to a decimal string.\n * Handles special cases: Infinity, NaN, and scientific notation.\n *\n * @param {number} value The number to convert\n * @returns {string} Decimal string representation\n * @throws {Error} If value is not finite\n */\nfunction numberToString (value) {\n if (!Number.isFinite(value)) {\n throw new Error('Number must be finite (NaN and Infinity are not supported)')\n }\n\n const str = value.toString()\n\n // Expand scientific notation (used for values >= 1e21 or < 1e-6)\n if (str.includes('e') || str.includes('E')) {\n return expandScientificNotation(str)\n }\n\n return str\n}\n\n/**\n * Validates and normalizes a string numeric input.\n *\n * @param {string} value The string to validate\n * @returns {string} Trimmed and validated string\n * @throws {Error} If string is empty or not a valid number format\n */\nfunction stringToNormalizedForm (value) {\n const trimmed = value.trim()\n\n if (trimmed.length === 0) {\n throw new Error(`Invalid number format: \"${value}\"`)\n }\n\n // Validate by attempting conversion (handles edge cases like \"1e21\", \"-.5\", etc.)\n if (Number.isNaN(Number(trimmed))) {\n throw new Error(`Invalid number format: \"${value}\"`)\n }\n\n // Expand scientific notation if present\n if (trimmed.includes('e') || trimmed.includes('E')) {\n return expandScientificNotation(trimmed)\n }\n\n return trimmed\n}\n\n/**\n * Parses a normalized numeric string into its components.\n *\n * @param {string} str A normalized decimal string (no scientific notation)\n * @returns {ParsedNumericValue} The parsed components\n */\nfunction parseNumericString (str) {\n // Extract sign\n const isNegative = str[0] === '-'\n if (isNegative) {\n str = str.slice(1)\n }\n\n // Split into integer and decimal parts\n const dotIndex = str.indexOf('.')\n if (dotIndex === -1) {\n return { isNegative, integerPart: BigInt(str) }\n }\n\n const integerStr = str.slice(0, dotIndex) || '0'\n const decimalPart = str.slice(dotIndex + 1)\n\n return { isNegative, integerPart: BigInt(integerStr), decimalPart }\n}\n\n/**\n * Expands scientific notation to decimal form.\n * JavaScript uses scientific notation for values >= 1e21 or < 1e-6.\n *\n * @param {string} str String possibly in scientific notation (e.g., \"1e+21\")\n * @returns {string} Decimal form (e.g., \"1000000000000000000000\")\n */\nfunction expandScientificNotation (str) {\n const [mantissa, expStr] = str.toLowerCase().split('e')\n const exp = parseInt(expStr, 10)\n\n // Extract digits and determine original decimal position\n const dotIndex = mantissa.indexOf('.')\n const digits = dotIndex === -1\n ? mantissa\n : mantissa.slice(0, dotIndex) + mantissa.slice(dotIndex + 1)\n const integerLength = dotIndex === -1 ? mantissa.length : dotIndex\n\n // Calculate new decimal position after applying exponent\n const newDotPosition = integerLength + exp\n\n if (newDotPosition >= digits.length) {\n // Pure integer: pad with trailing zeros\n return digits + '0'.repeat(newDotPosition - digits.length)\n }\n\n if (newDotPosition <= 0) {\n // Pure decimal: pad with leading zeros after decimal point\n return '0.' + '0'.repeat(-newDotPosition) + digits\n }\n\n // Mixed: insert decimal point at new position\n return digits.slice(0, newDotPosition) + '.' + digits.slice(newDotPosition)\n}\n\n/**\n * Checks if a value is a plain object (not null, array, or other object types).\n *\n * @param {*} value Value to check\n * @returns {boolean} True if value is a plain object\n */\nfunction isPlainObject (value) {\n if (value === null || typeof value !== 'object') return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\n// ============================================================================\n// Language Converters\n// ============================================================================\n//\n// Each converter is created using makeConverter() with explicit type annotations.\n//\n// Pattern for languages WITHOUT options:\n// const LanguageConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Language))\n//\n// Pattern for languages WITH options:\n// const LanguageConverter = /** @type {(value: NumericValue, options?: LanguageOptions) => string} */ (makeConverter(Language))\n//\n// IMPORTANT: Keep converters alphabetically sorted by converter name.\n// ============================================================================\n\nconst ArabicConverter = /** @type {(value: NumericValue, options?: ArabicOptions) => string} */ (makeConverter(Arabic))\nconst AzerbaijaniConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Azerbaijani))\nconst BanglaConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Bangla))\nconst BiblicalHebrewConverter = /** @type {(value: NumericValue, options?: BiblicalHebrewOptions) => string} */ (makeConverter(BiblicalHebrew))\nconst CroatianConverter = /** @type {(value: NumericValue, options?: CroatianOptions) => string} */ (makeConverter(Croatian))\nconst CzechConverter = /** @type {(value: NumericValue, options?: CzechOptions) => string} */ (makeConverter(Czech))\nconst DanishConverter = /** @type {(value: NumericValue, options?: DanishOptions) => string} */ (makeConverter(Danish))\nconst DutchConverter = /** @type {(value: NumericValue, options?: DutchOptions) => string} */ (makeConverter(Dutch))\nconst EnglishConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(English))\nconst FilipinoConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Filipino))\nconst FrenchConverter = /** @type {(value: NumericValue, options?: FrenchOptions) => string} */ (makeConverter(French))\nconst FrenchBelgiumConverter = /** @type {(value: NumericValue, options?: FrenchBelgiumOptions) => string} */ (makeConverter(FrenchBelgium))\nconst GermanConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(German))\nconst GreekConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Greek))\nconst GujaratiConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Gujarati))\nconst HebrewConverter = /** @type {(value: NumericValue, options?: HebrewOptions) => string} */ (makeConverter(Hebrew))\nconst HindiConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Hindi))\nconst HungarianConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Hungarian))\nconst IndonesianConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Indonesian))\nconst ItalianConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Italian))\nconst JapaneseConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Japanese))\nconst KannadaConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Kannada))\nconst KoreanConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Korean))\nconst LatvianConverter = /** @type {(value: NumericValue, options?: LatvianOptions) => string} */ (makeConverter(Latvian))\nconst LithuanianConverter = /** @type {(value: NumericValue, options?: LithuanianOptions) => string} */ (makeConverter(Lithuanian))\nconst MalayConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Malay))\nconst MarathiConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Marathi))\nconst NorwegianBokmalConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(NorwegianBokmal))\nconst PersianConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Persian))\nconst PolishConverter = /** @type {(value: NumericValue, options?: PolishOptions) => string} */ (makeConverter(Polish))\nconst PortugueseConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Portuguese))\nconst PunjabiConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Punjabi))\nconst RomanianConverter = /** @type {(value: NumericValue, options?: RomanianOptions) => string} */ (makeConverter(Romanian))\nconst RussianConverter = /** @type {(value: NumericValue, options?: RussianOptions) => string} */ (makeConverter(Russian))\nconst SerbianCyrillicConverter = /** @type {(value: NumericValue, options?: SerbianCyrillicOptions) => string} */ (makeConverter(SerbianCyrillic))\nconst SerbianLatinConverter = /** @type {(value: NumericValue, options?: SerbianLatinOptions) => string} */ (makeConverter(SerbianLatin))\nconst SimplifiedChineseConverter = /** @type {(value: NumericValue, options?: SimplifiedChineseOptions) => string} */ (makeConverter(SimplifiedChinese))\nconst SpanishConverter = /** @type {(value: NumericValue, options?: SpanishOptions) => string} */ (makeConverter(Spanish))\nconst SwahiliConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Swahili))\nconst SwedishConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Swedish))\nconst TamilConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Tamil))\nconst TeluguConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Telugu))\nconst ThaiConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Thai))\nconst TraditionalChineseConverter = /** @type {(value: NumericValue, options?: TraditionalChineseOptions) => string} */ (makeConverter(TraditionalChinese))\nconst TurkishConverter = /** @type {(value: NumericValue, options?: TurkishOptions) => string} */ (makeConverter(Turkish))\nconst UkrainianConverter = /** @type {(value: NumericValue, options?: UkrainianOptions) => string} */ (makeConverter(Ukrainian))\nconst UrduConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Urdu))\nconst VietnameseConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Vietnamese))\n\n// ============================================================================\n// Exports\n// ============================================================================\n//\n// All converter functions are exported for public use.\n//\n// IMPORTANT: Keep exports alphabetically sorted for maintainability.\n// ============================================================================\n\nexport {\n ArabicConverter,\n AzerbaijaniConverter,\n BanglaConverter,\n BiblicalHebrewConverter,\n CroatianConverter,\n CzechConverter,\n DanishConverter,\n DutchConverter,\n EnglishConverter,\n FilipinoConverter,\n FrenchConverter,\n FrenchBelgiumConverter,\n GermanConverter,\n GreekConverter,\n GujaratiConverter,\n HebrewConverter,\n HindiConverter,\n HungarianConverter,\n IndonesianConverter,\n ItalianConverter,\n JapaneseConverter,\n KannadaConverter,\n KoreanConverter,\n LatvianConverter,\n LithuanianConverter,\n MalayConverter,\n MarathiConverter,\n NorwegianBokmalConverter,\n PersianConverter,\n PolishConverter,\n PortugueseConverter,\n PunjabiConverter,\n RomanianConverter,\n RussianConverter,\n SerbianCyrillicConverter,\n SerbianLatinConverter,\n SimplifiedChineseConverter,\n SpanishConverter,\n SwahiliConverter,\n SwedishConverter,\n TamilConverter,\n TeluguConverter,\n ThaiConverter,\n TraditionalChineseConverter,\n TurkishConverter,\n UkrainianConverter,\n UrduConverter,\n VietnameseConverter\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Arabic language converter.\n *\n * Supports:\n * - Gender agreement (masculine/feminine forms)\n * - Complex pluralization (singular/dual/plural)\n * - Traditional Arabic number naming conventions\n * - Right-to-left text orientation\n */\nexport class Arabic extends AbstractLanguage {\n negativeWord = 'ناقص'\n decimalSeparatorWord = 'فاصلة'\n zeroWord = 'صفر'\n\n tensWords = ['عشرون', 'ثلاثون', 'أربعون', 'خمسون', 'ستون', 'سبعون', 'ثمانون', 'تسعون']\n hundredsWords = ['', 'مائة', 'مئتان', 'ثلاثمائة', 'أربعمائة', 'خمسمائة', 'ستمائة', 'سبعمائة', 'ثمانمائة', 'تسعمائة']\n\n // Magnitude words with three forms: singular, appended (tanween), plural\n scaleWords = ['مائة', 'ألف', 'مليون', 'مليار', 'تريليون', 'كوادريليون', 'كوينتليون', 'سكستيليون']\n scaleAppendedWords = ['', 'ألفاً', 'مليوناً', 'ملياراً', 'تريليوناً', 'كوادريليوناً', 'كوينتليوناً', 'سكستيليوناً']\n scalePluralWords = ['', 'آلاف', 'ملايين', 'مليارات', 'تريليونات', 'كوادريليونات', 'كوينتليونات', 'سكستيليونات']\n\n // Dual forms (Arabic has singular, dual, plural)\n dualWords = ['مئتان', 'ألفان', 'مليونان', 'ملياران', 'تريليونان', 'كوادريليونان', 'كوينتليونان', 'سكستيليونان']\n dualAppendedWords = ['مئتا', 'ألفا', 'مليونا', 'مليارا', 'تريليونا', 'كوادريليونا', 'كوينتليونا', 'سكستيليونا']\n\n // Gender-specific number words (1-19)\n ones = {\n masculine: [\n 'واحد', 'اثنان', 'ثلاثة', 'أربعة', 'خمسة', 'ستة', 'سبعة', 'ثمانية', 'تسعة', 'عشرة',\n 'أحد عشر', 'اثنا عشر', 'ثلاثة عشر', 'أربعة عشر', 'خمسة عشر', 'ستة عشر', 'سبعة عشر', 'ثمانية عشر', 'تسعة عشر'\n ],\n feminine: [\n 'واحدة', 'اثنتان', 'ثلاث', 'أربع', 'خمس', 'ست', 'سبع', 'ثمان', 'تسع', 'عشر',\n 'إحدى عشرة', 'اثنتا عشرة', 'ثلاث عشرة', 'أربع عشرة', 'خمس عشرة', 'ست عشرة', 'سبع عشرة', 'ثماني عشرة', 'تسع عشرة'\n ]\n }\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n gender: 'masculine'\n }, options)\n\n // Allow custom negativeWord via options\n if (options.negativeWord !== undefined) {\n this.negativeWord = options.negativeWord\n }\n }\n\n /** Selects masculine or feminine number forms based on options. */\n get selectedOnes () {\n return this.ones[this.options.gender === 'feminine' ? 'feminine' : 'masculine']\n }\n\n /** Converts a 3-digit segment (0-999) to Arabic words with gender/plural rules. */\n segmentToWords (groupNumber, groupLevel, fullNumber) {\n const tens = groupNumber % 100\n const hundredsRaw = groupNumber / 100\n const hundreds = Math.trunc(hundredsRaw)\n let returnValue = ''\n\n // Process hundreds\n if (hundreds > 0) {\n if (tens === 0 && hundreds === 2) {\n returnValue = this.dualWords[0]\n } else {\n const hundredsWord = this.hundredsWords[hundreds]\n if (hundredsWord) {\n returnValue = hundredsWord\n if (tens !== 0) {\n returnValue += ' و'\n }\n }\n }\n }\n\n // Process tens and ones\n if (tens > 0) {\n if (tens < 20) { // 1 -> 19\n if (tens === 2 && hundreds === 0 && groupLevel > 0) {\n // Cache expensive log10 calculation\n const numValue = Number(fullNumber)\n const pow = Math.trunc(Math.log10(numValue))\n if (pow % 3 === 0 && fullNumber === BigInt(2 * Math.pow(10, pow))) {\n returnValue = groupNumber === 2 ? this.dualWords[groupLevel] : this.dualAppendedWords[groupLevel]\n } else {\n returnValue = this.dualWords[groupLevel]\n }\n } else if (tens === 1 && groupLevel > 0) {\n returnValue += this.scaleWords[groupLevel]\n } else {\n returnValue += this.selectedOnes[tens - 1]\n }\n } else { // 20 -> 99\n const ones = tens % 10\n const tensIndex = Math.trunc(tens / 10) - 2\n\n if (ones > 0) {\n returnValue += this.selectedOnes[ones - 1]\n returnValue += ' و'\n }\n returnValue += this.tensWords[tensIndex]\n }\n }\n\n return returnValue\n }\n\n /** Converts integer part to Arabic words by processing 3-digit groups. */\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n let temp = integerPart\n let group = 0\n let result = ''\n\n // Process each group of 3 digits (right to left)\n while (temp > 0n) {\n const numberToProcess = Number(temp % 1000n)\n temp = temp / 1000n\n\n if (numberToProcess > 0) {\n const groupDescription = this.segmentToWords(numberToProcess, group, integerPart)\n\n if (groupDescription) {\n // Add group name for thousands, millions, etc.\n if (group > 0) {\n if (result) {\n result = ' و' + result\n }\n\n if (numberToProcess > 2) {\n const remainder = numberToProcess % 100\n if (remainder === 1) {\n result = this.scaleWords[group] + ' ' + result\n } else if (numberToProcess >= 3 && numberToProcess <= 10) {\n result = this.scalePluralWords[group] + ' ' + result\n } else {\n result = (result ? this.scaleAppendedWords[group] : this.scaleWords[group]) + ' ' + result\n }\n }\n }\n\n // Add group description (prepend for RTL)\n result = groupDescription + ' ' + result\n }\n }\n\n group++\n }\n\n return result.replace(/\\s+/g, ' ').trim()\n }\n}\n","import { TurkicLanguage } from '../classes/turkic-language.js'\n\n/**\n * Azerbaijani language converter.\n *\n * Supports:\n * - Implicit \"bir\" (one) omission before hundreds and thousands\n * - Turkic language number patterns\n * - Large numbers up to quintillion\n */\nexport class Azerbaijani extends TurkicLanguage {\n negativeWord = 'mənfi'\n decimalSeparatorWord = 'nöqtə'\n zeroWord = 'sıfır'\n\n scaleWords = [[1_000_000_000_000_000_000n, 'kentilyon'],\n [1_000_000_000_000_000n, 'katrilyon'],\n [1_000_000_000_000n, 'trilyon'],\n [1_000_000_000n, 'milyar'],\n [1_000_000n, 'milyon'],\n [1000n, 'min'],\n [100n, 'yüz'],\n [90n, 'doxsan'],\n [80n, 'səksən'],\n [70n, 'yetmiş'],\n [60n, 'altmış'],\n [50n, 'əlli'],\n [40n, 'qırx'],\n [30n, 'otuz'],\n [20n, 'iyirmi'],\n [10n, 'on'],\n [9n, 'doqquz'],\n [8n, 'səkkiz'],\n [7n, 'yeddi'],\n [6n, 'altı'],\n [5n, 'beş'],\n [4n, 'dörd'],\n [3n, 'üç'],\n [2n, 'iki'],\n [1n, 'bir'],\n [0n, 'sıfır']]\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Bangla language converter.\n *\n * Supports:\n * - Indian numbering system (হাজার, লাখ, কোটি)\n * - Bangla script (Bengali)\n * - Complete word forms for 0-99\n */\nexport class Bangla extends SouthAsianLanguage {\n negativeWord = 'মাইনাস'\n decimalSeparatorWord = 'দশমিক'\n zeroWord = 'শূন্য'\n hundredWord = 'শত'\n\n belowHundredWords = [\n 'শূন্য',\n 'এক',\n 'দুই',\n 'তিন',\n 'চার',\n 'পাঁচ',\n 'ছয়',\n 'সাত',\n 'আট',\n 'নয়',\n 'দশ',\n 'এগারো',\n 'বারো',\n 'তেরো',\n 'চৌদ্দ',\n 'পনেরো',\n 'ষোল',\n 'সতেরো',\n 'আঠারো',\n 'উনিশ',\n 'বিশ',\n 'একুশ',\n 'বাইশ',\n 'তেইশ',\n 'চব্বিশ',\n 'পঁচিশ',\n 'ছাব্বিশ',\n 'সাতাশ',\n 'আঠাশ',\n 'উনত্রিশ',\n 'ত্রিশ',\n 'একত্রিশ',\n 'বত্রিশ',\n 'তেত্রিশ',\n 'চৌত্রিশ',\n 'পঁয়ত্রিশ',\n 'ছত্রিশ',\n 'সাঁইত্রিশ',\n 'আটত্রিশ',\n 'উনচল্লিশ',\n 'চল্লিশ',\n 'একচল্লিশ',\n 'বেয়াল্লিশ',\n 'তেতাল্লিশ',\n 'চুয়াল্লিশ',\n 'পঁয়তাল্লিশ',\n 'ছেচল্লিশ',\n 'সাতচল্লিশ',\n 'আটচল্লিশ',\n 'উনপঞ্চাশ',\n 'পঞ্চাশ',\n 'একান্ন',\n 'বাহান্ন',\n 'তিপ্পান্ন',\n 'চুয়ান্ন',\n 'পঞ্চান্ন',\n 'ছাপ্পান্ন',\n 'সাতান্ন',\n 'আটান্ন',\n 'উনষাট',\n 'ষাট',\n 'একষট্টি',\n 'বাষট্টি',\n 'তেষট্টি',\n 'চৌষট্টি',\n 'পঁয়ষট্টি',\n 'ছেষট্টি',\n 'সাতষট্টি',\n 'আটষট্টি',\n 'ঊনসত্তর',\n 'সত্তর',\n 'একাত্তর',\n 'বাহাত্তর',\n 'তেহাত্তর',\n 'চুয়াত্তর',\n 'পঁচাত্তর',\n 'ছিয়াত্তর',\n 'সাতাত্তর',\n 'আটাত্তর',\n 'উনআশি',\n 'আশি',\n 'একাশি',\n 'বিরাশি',\n 'তিরাশি',\n 'চুরাশি',\n 'পঁচাশি',\n 'ছিয়াশি',\n 'সাতাশি',\n 'আটাশি',\n 'উননব্বই',\n 'নব্বই',\n 'একানব্বই',\n 'বিরানব্বই',\n 'তিরানব্বই',\n 'চুরানব্বই',\n 'পঁচানব্বই',\n 'ছিয়ানব্বই',\n 'সাতানব্বই',\n 'আটানব্বই',\n 'নিরানব্বই'\n ]\n\n scaleWords = [\n '',\n 'হাজার',\n 'লাখ',\n 'কোটি',\n 'আরব',\n 'খরব',\n 'নীল',\n 'পদ্ম',\n 'শঙ্খ'\n ]\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Biblical Hebrew language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Gender agreement (masculine/feminine)\n * - Optional \"ו\" (and) conjunction control\n */\nexport class BiblicalHebrew extends SlavicLanguage {\n negativeWord = 'מינוס'\n decimalSeparatorWord = 'נקודה'\n zeroWord = 'אפס'\n usePerDigitDecimals = true\n\n // Biblical Hebrew (masculine forms as default - historically accurate)\n onesWords = {\n 1: 'אחד',\n 2: 'שניים',\n 3: 'שלשה',\n 4: 'ארבעה',\n 5: 'חמשה',\n 6: 'ששה',\n 7: 'שבעה',\n 8: 'שמונה',\n 9: 'תשעה'\n }\n\n teensWords = {\n 0: 'עשרה',\n 1: 'אחד עשר',\n 2: 'שנים עשר',\n 3: 'שלשה עשר',\n 4: 'ארבעה עשר',\n 5: 'חמשה עשר',\n 6: 'ששה עשר',\n 7: 'שבעה עשר',\n 8: 'שמונה עשר',\n 9: 'תשעה עשר'\n }\n\n twentiesWords = {\n 2: 'עשרים',\n 3: 'שלשים',\n 4: 'ארבעים',\n 5: 'חמישים',\n 6: 'ששים',\n 7: 'שבעים',\n 8: 'שמונים',\n 9: 'תשעים'\n }\n\n hundredsWords = {\n 1: 'מאה',\n 2: 'מאתיים',\n 3: 'מאות'\n }\n\n pluralForms = {\n 1: 'אלף',\n 2: 'אלפיים',\n 3: 'שלשה אלפים',\n 4: 'ארבעה אלפים',\n 5: 'חמשה אלפים',\n 6: 'ששה אלפים',\n 7: 'שבעה אלפים',\n 8: 'שמונה אלפים',\n 9: 'תשעה אלפים'\n }\n\n // Feminine forms for thousands (when feminine=true is specified)\n femininePluralForms = {\n 1: 'אלף',\n 2: 'אלפיים',\n 3: 'שלשת אלפים',\n 4: 'ארבעת אלפים',\n 5: 'חמשת אלפים',\n 6: 'ששת אלפים',\n 7: 'שבעת אלפים',\n 8: 'שמונת אלפים',\n 9: 'תשעת אלפים'\n }\n\n scale = {\n 1: 'אלף', // thousand (singular)\n 2: 'מיליון', // million\n 3: 'מיליארד', // billion\n 4: 'טריליון', // trillion\n 5: 'קוודרליון', // quadrillion\n 6: 'קווינטיליון' // quintillion\n }\n\n scalePlural = {\n 1: 'אלפים', // thousands\n 2: 'מיליונים', // millions\n 3: 'מיליארדים', // billions\n 4: 'טריליונים', // trillions\n 5: 'קוודרליונים', // quadrillions\n 6: 'קווינטיליונים' // quintillions\n }\n\n // Feminine forms (for when gender='feminine' is specified)\n onesFeminineWords = {\n 1: 'אחת',\n 2: 'שתים',\n 3: 'שלש',\n 4: 'ארבע',\n 5: 'חמש',\n 6: 'שש',\n 7: 'שבע',\n 8: 'שמונה',\n 9: 'תשע'\n }\n\n teensFeminineWords = {\n 0: 'עשר',\n 1: 'אחת עשרה',\n 2: 'שתים עשרה',\n 3: 'שלש עשרה',\n 4: 'ארבע עשרה',\n 5: 'חמש עשרה',\n 6: 'שש עשרה',\n 7: 'שבע עשרה',\n 8: 'שמונה עשרה',\n 9: 'תשע עשרה'\n }\n\n constructor (options = {}) {\n super(options)\n\n this.setOptions({\n andWord: 'ו',\n gender: 'masculine'\n }, options)\n\n if (this.options.gender === 'feminine') {\n this.onesWords = this.onesFeminineWords\n this.teensWords = this.teensFeminineWords\n this.pluralForms = this.femininePluralForms\n }\n }\n\n /** Converts integer part with Biblical Hebrew three-form pluralization. */\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let index = segments.length\n for (const x of segments) {\n index = index - 1\n if (x === 0n) {\n continue\n }\n\n const [n1, n2, n3] = this.extractDigits(x)\n\n if (index > 0) {\n // For thousands and above, handle the full chunk value\n const chunkWords = []\n let hasHundreds = false\n\n // Process hundreds in this chunk\n if (n3 > 0n) {\n hasHundreds = true\n if (n3 <= 2n) {\n chunkWords.push(this.hundredsWords[n3])\n } else {\n chunkWords.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])\n }\n }\n\n // Process tens in this chunk\n if (n2 > 1n) {\n // Add conjunction if there were hundreds before\n const tensWord = this.twentiesWords[n2]\n chunkWords.push(hasHundreds ? this.options.andWord + tensWord : tensWord)\n }\n\n // Process ones in this chunk\n if (n2 === 1n) {\n // Add conjunction if there were hundreds before\n const onesWord = this.teensWords[n1]\n chunkWords.push(hasHundreds ? this.options.andWord + onesWord : onesWord)\n } else if (n1 > 0n) {\n // For \"one million\", \"one billion\", etc., don't add the word \"one\"\n if (x === 1n && index > 1) {\n // Skip adding \"one\" for millions/billions/etc.\n } else if (x <= 9n && chunkWords.length === 0 && index === 1) {\n // Use special forms for 1-9 thousand\n chunkWords.push(this.pluralForms[n1])\n } else {\n const onesWord = this.onesWords[n1]\n // Add conjunction if there were hundreds or tens before\n chunkWords.push((hasHundreds || n2 > 0n) ? this.options.andWord + onesWord : onesWord)\n }\n }\n\n // Add scale word (thousand, million, billion, etc.)\n if (x > 9n || index > 1) {\n // For numbers > 9 or higher scales, use appropriate scale word\n if (x === 1n) {\n // Singular form (e.g., \"one thousand\", \"one million\")\n chunkWords.push(this.scale[index])\n } else if (x === 2n && index === 1) {\n // Special dual form for \"two thousand\" (already in thousands[2])\n return [this.pluralForms[2], ...words].join(' ')\n } else if (x === 2n) {\n // For two million, two billion, etc. - use plural form\n chunkWords.push(this.scalePlural[index])\n } else if (index === 1) {\n // For thousands (10+), always use singular \"אלף\"\n chunkWords.push(this.scale[index])\n } else {\n // For millions/billions/etc. use plural form\n chunkWords.push(this.scalePlural[index])\n }\n }\n\n words.push(chunkWords.join(' '))\n continue\n }\n\n if (n3 > 0n) {\n if (n3 <= 2n) {\n words.push(this.hundredsWords[n3])\n } else {\n words.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])\n }\n }\n\n if (n2 > 1n) {\n words.push(this.twentiesWords[n2])\n }\n\n if (n2 === 1n) {\n words.push(this.teensWords[n1])\n } else if (n1 > 0n) {\n words.push(this.onesWords[n1])\n }\n }\n\n if (words.length > 1) {\n words[words.length - 1] = this.options.andWord + words.at(-1)\n }\n\n return words.join(' ')\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Croatian language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Gender agreement (jedan/jedna, dva/dvije)\n * - Croatian-specific declension endings\n */\nexport class Croatian extends SlavicLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'zarez'\n zeroWord = 'nula'\n\n onesWords = {\n 1: 'jedan',\n 2: 'dva',\n 3: 'tri',\n 4: 'četiri',\n 5: 'pet',\n 6: 'šest',\n 7: 'sedam',\n 8: 'osam',\n 9: 'devet'\n }\n\n onesFeminineWords = {\n 1: 'jedna',\n 2: 'dvije',\n 3: 'tri',\n 4: 'četiri',\n 5: 'pet',\n 6: 'šest',\n 7: 'sedam',\n 8: 'osam',\n 9: 'devet'\n }\n\n teensWords = {\n 0: 'deset',\n 1: 'jedanaest',\n 2: 'dvanaest',\n 3: 'trinaest',\n 4: 'četrnaest',\n 5: 'petnaest',\n 6: 'šesnaest',\n 7: 'sedamnaest',\n 8: 'osamnaest',\n 9: 'devetnaest'\n }\n\n twentiesWords = {\n 2: 'dvadeset',\n 3: 'trideset',\n 4: 'četrdeset',\n 5: 'pedeset',\n 6: 'šezdeset',\n 7: 'sedamdeset',\n 8: 'osamdeset',\n 9: 'devedeset'\n }\n\n hundredsWords = {\n 1: 'sto',\n 2: 'dvjesto',\n 3: 'tristo',\n 4: 'četiristo',\n 5: 'petsto',\n 6: 'šesto',\n 7: 'sedamsto',\n 8: 'osamsto',\n 9: 'devetsto'\n }\n\n pluralForms = {\n 1: ['tisuća', 'tisuće', 'tisuća'], // 10 ^ 3\n 2: ['milijun', 'milijuna', 'milijuna'], // 10 ^ 6\n 3: ['milijarda', 'milijarde', 'milijarda'], // 10 ^ 9\n 4: ['bilijun', 'bilijuna', 'bilijuna'], // 10 ^ 12\n 5: ['bilijarda', 'bilijarde', 'bilijarda'], // 10 ^ 15\n 6: ['trilijun', 'trilijuna', 'trilijuna'], // 10 ^ 18\n 7: ['trilijarda', 'trilijarde', 'trilijarda'], // 10 ^ 21\n 8: ['kvadrilijun', 'kvadrilijuna', 'kvadrilijuna'], // 10 ^ 24\n 9: ['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda'], // 10 ^ 27\n 10: ['kvintilijun', 'kvintilijuna', 'kvintilijuna'] // 10 ^ 30\n }\n\n /**\n * Maps segment indices to whether they are grammatically feminine.\n * In Croatian, thousands (index 1) are feminine, others are masculine.\n * @type {Object.<number, boolean>}\n */\n scaleGenders = {\n 1: true // thousands are feminine (others default to false)\n }\n\n /** Selects Croatian plural form: 1 = singular, 2-4 = few, else = many. */\n pluralize (n, forms) {\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit === 1n) {\n return forms[0]\n }\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit > 1n && lastDigit < 5n) {\n return forms[1]\n }\n\n return forms[2]\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Czech language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Dynamic decimal separator (celá/celé/celých)\n * - Gender agreement in number words\n */\nexport class Czech extends SlavicLanguage {\n negativeWord = 'mínus'\n zeroWord = 'nula'\n\n onesWords = {\n 1: 'jedna',\n 2: 'dva',\n 3: 'tři',\n 4: 'čtyři',\n 5: 'pět',\n 6: 'šest',\n 7: 'sedm',\n 8: 'osm',\n 9: 'devět'\n }\n\n onesFeminineWords = {\n 1: 'jedna',\n 2: 'dvě',\n 3: 'tři',\n 4: 'čtyři',\n 5: 'pět',\n 6: 'šest',\n 7: 'sedm',\n 8: 'osm',\n 9: 'devět'\n }\n\n teensWords = {\n 0: 'deset',\n 1: 'jedenáct',\n 2: 'dvanáct',\n 3: 'třináct',\n 4: 'čtrnáct',\n 5: 'patnáct',\n 6: 'šestnáct',\n 7: 'sedmnáct',\n 8: 'osmnáct',\n 9: 'devatenáct'\n }\n\n twentiesWords = {\n 2: 'dvacet',\n 3: 'třicet',\n 4: 'čtyřicet',\n 5: 'padesát',\n 6: 'šedesát',\n 7: 'sedmdesát',\n 8: 'osmdesát',\n 9: 'devadesát'\n }\n\n hundredsWords = {\n 1: 'sto',\n 2: 'dvě stě',\n 3: 'tři sta',\n 4: 'čtyři sta',\n 5: 'pět set',\n 6: 'šest set',\n 7: 'sedm set',\n 8: 'osm set',\n 9: 'devět set'\n }\n\n pluralForms = {\n 1: ['tisíc', 'tisíce', 'tisíc'], // 10^ 3\n 2: ['milion', 'miliony', 'milionů'], // 10^ 6\n 3: ['miliarda', 'miliardy', 'miliard'], // 10^ 9\n 4: ['bilion', 'biliony', 'bilionů'], // 10^ 12\n 5: ['biliarda', 'biliardy', 'biliard'], // 10^ 15\n 6: ['trilion', 'triliony', 'trilionů'], // 10^ 18\n 7: ['triliarda', 'triliardy', 'triliard'], // 10^ 21\n 8: ['kvadrilion', 'kvadriliony', 'kvadrilionů'], // 10^ 24\n 9: ['kvadriliarda', 'kvadriliardy', 'kvadriliard'], // 10^ 27\n 10: ['quintillion', 'quintilliony', 'quintillionů'] // 10^ 30\n }\n\n /**\n * Czech omits \"one\" before scale words.\n * e.g., 1000 is \"tisíc\" not \"jedna tisíc\"\n */\n omitOneBeforeScale = true\n\n /**\n * Cached integer part for decimal separator word selection.\n * Set by toWords() before calling super.toWords().\n * @private\n */\n #integerPart = 0n\n\n /** Returns decimal separator word based on integer part (celá/celé/celých). */\n get decimalSeparatorWord () {\n if (this.#integerPart === 0n || this.#integerPart === 1n) {\n return 'celá'\n } else if (this.#integerPart >= 2n && this.#integerPart <= 4n) {\n return 'celé'\n } else {\n return 'celých'\n }\n }\n\n constructor (options = {}) {\n super(options)\n\n // Remove the inherited decimalSeparatorWord property so our getter works\n delete this.decimalSeparatorWord\n }\n\n /**\n * Override toWords to cache integer part before decimal separator is accessed.\n */\n toWords (isNegative, integerPart, decimalPart) {\n this.#integerPart = integerPart\n return super.toWords(isNegative, integerPart, decimalPart)\n }\n\n /** Selects Czech plural form: 1 = singular, 2-4 = few, else = many. */\n pluralize (n, forms) {\n if (n === 1n) {\n return forms[0]\n }\n\n // Check if n is in the \"few\" form range (2-4, 22-24, 32-34, etc., excluding teens)\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if (lastDigit > 1n && lastDigit < 5n && (lastTwoDigits < 10n || lastTwoDigits > 20n)) {\n return forms[1]\n }\n\n return forms[2]\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Danish language converter.\n *\n * Supports:\n * - Vigesimal (base-20) number system\n * - Units-before-tens ordering (e.g., \"tre-og-tyve\" = 23)\n * - Optional ordinal numbers via ordFlag option\n */\nexport class Danish extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'komma'\n zeroWord = 'nul'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'quadrillarder'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillioner'],\n [1_000_000_000_000_000_000_000n, 'trillarder'],\n [1_000_000_000_000_000_000n, 'trillioner'],\n [1_000_000_000_000_000n, 'billarder'],\n [1_000_000_000_000n, 'billioner'],\n [1_000_000_000n, 'millarder'],\n [1_000_000n, 'millioner'],\n [1000n, 'tusind'],\n [100n, 'hundrede'],\n [90n, 'halvfems'],\n [80n, 'firs'],\n [70n, 'halvfjerds'],\n [60n, 'treds'],\n [50n, 'halvtreds'],\n [40n, 'fyrre'],\n [30n, 'tredive'],\n [20n, 'tyve'],\n [19n, 'nitten'],\n [18n, 'atten'],\n [17n, 'sytten'],\n [16n, 'seksten'],\n [15n, 'femten'],\n [14n, 'fjorten'],\n [13n, 'tretten'],\n [12n, 'tolv'],\n [11n, 'elleve'],\n [10n, 'ti'],\n [9n, 'ni'],\n [8n, 'otte'],\n [7n, 'syv'],\n [6n, 'seks'],\n [5n, 'fem'],\n [4n, 'fire'],\n [3n, 'tre'],\n [2n, 'to'],\n [1n, 'et'],\n [0n, 'nul']\n ]\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n ordFlag: false\n }, options)\n }\n\n /** Combines two word-sets with Danish vigesimal and reversal rules. */\n combineWordSets (preceding, following) {\n let precedingWord = Object.keys(preceding)[0]\n let followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0] // BigInt (e.g., 1n, 100n, 1000n)\n const followingValue = Object.values(following)[0] // BigInt (e.g., magnitude level like 100n, 1000n)\n\n // Prepend \"et\" to hundreds and thousands (not \"en\") for proper Danish form\n if (followingValue === 100n || followingValue === 1000n) {\n following = { [`et${followingWord}`]: followingValue }\n }\n\n // Implicit '1' handling: omit '1' before most magnitudes (except millions/ordinals)\n if (precedingValue === 1n) {\n if (followingValue < 1_000_000n || this.options.ordFlag) {\n return following // Just the magnitude word (e.g., \"hundrede\" not \"en hundrede\")\n }\n precedingWord = 'en' // Explicit \"en\" (one) for millions and above\n }\n\n // Multiplication across magnitude boundaries\n if (followingValue > precedingValue) {\n // Space for million+ (e.g., \"en million\", \"to millioner\")\n if (followingValue >= 1_000_000n) {\n precedingWord += ' '\n }\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n\n // Addition with separator rules:\n // \"og\" (and) for hundreds + smaller numbers\n if (precedingValue >= 100n && precedingValue < 1000n) {\n precedingWord += ' og '\n } else if (precedingValue >= 1000n && precedingValue <= 100_000n) {\n // Special \"e og\" for thousands (e.g., \"tusinde og tyve\")\n precedingWord += 'e og '\n }\n\n // Units-before-tens reversal (Danish vigesimal pattern):\n // For small units (< 10) with tens (10-99), swap order: \"tre og tyve\" (25)\n if (followingValue < 10n && precedingValue > 10n && precedingValue < 100n) {\n if (followingValue === 1n) {\n followingWord = 'en' // Convert 1 to \"en\" for vigesimal context\n }\n // Swap positions: units go after \"og\", tens go before\n const temporary = followingWord\n followingWord = precedingWord\n precedingWord = temporary + 'og'\n } else if (precedingValue >= 1_000_000n) {\n // Space for large magnitudes (millions+)\n precedingWord += ' '\n }\n\n return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Dutch language converter.\n *\n * Supports:\n * - Optional \"en\" (and) separator for tens\n * - Optional comma before hundreds\n * - Compound word formation without hyphenation\n */\nexport class Dutch extends GreedyScaleLanguage {\n negativeWord = 'min'\n decimalSeparatorWord = 'komma'\n zeroWord = 'nul'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'quadriljard'],\n [1_000_000_000_000_000_000_000_000n, 'quadriljoen'],\n [1_000_000_000_000_000_000_000n, 'triljard'],\n [1_000_000_000_000_000_000n, 'triljoen'],\n [1_000_000_000_000_000n, 'biljard'],\n [1_000_000_000_000n, 'biljoen'],\n [1_000_000_000n, 'miljard'],\n [1_000_000n, 'miljoen'],\n [1000n, 'duizend'],\n [100n, 'honderd'],\n [90n, 'negentig'],\n [80n, 'tachtig'],\n [70n, 'zeventig'],\n [60n, 'zestig'],\n [50n, 'vijftig'],\n [40n, 'veertig'],\n [30n, 'dertig'],\n [20n, 'twintig'],\n [19n, 'negentien'],\n [18n, 'achttien'],\n [17n, 'zeventien'],\n [16n, 'zestien'],\n [15n, 'vijftien'],\n [14n, 'veertien'],\n [13n, 'dertien'],\n [12n, 'twaalf'],\n [11n, 'elf'],\n [10n, 'tien'],\n [9n, 'negen'],\n [8n, 'acht'],\n [7n, 'zeven'],\n [6n, 'zes'],\n [5n, 'vijf'],\n [4n, 'vier'],\n [3n, 'drie'],\n [2n, 'twee'],\n [1n, 'één'],\n [0n, 'nul']\n ]\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n includeOptionalAnd: false,\n noHundredPairing: false,\n accentOne: true\n }, options)\n\n if (!this.options.accentOne) {\n this.scaleWords[this.scaleWords.length - 2][1] = 'een'\n }\n }\n\n /** Combines two word-sets according to Dutch grammar rules. */\n combineWordSets (preceding, following) {\n let precedingWord = Object.keys(preceding)[0]\n let followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0] // BigInt\n const followingValue = Object.values(following)[0] // BigInt\n\n // Implicit \"een\": omit before large multipliers (\"miljoen\" not \"een miljoen\")\n if (precedingValue === 1n) {\n if (followingValue < 1_000_000n) {\n return following\n }\n precedingWord = this.options.accentOne ? 'één' : 'een'\n }\n\n // Handle multiplication and spacing\n if (followingValue > precedingValue) {\n let hadSpace = false\n // Large scale words (millions+): add space before multiplier\n if (followingValue >= 1_000_000n) {\n precedingWord += ' '\n hadSpace = true\n } else if (followingValue > 100n) {\n // Hundreds and above: add space after multiplier\n followingWord += ' '\n hadSpace = true\n }\n // Convert 'één' to 'een' in compounds (when no space or accentOne disabled)\n if (!hadSpace || !this.options.accentOne) {\n precedingWord = precedingWord.replace(/één/g, 'een')\n followingWord = followingWord.replace(/één/g, 'een')\n }\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n\n // Track if we're adding a space (which keeps words separate)\n let hasSpace = false\n\n if (followingValue < 10n && precedingValue > 10n && precedingValue < 100n) {\n const temporary = followingWord\n followingWord = precedingWord\n const andTxt = temporary.endsWith('e') ? 'ën' : 'en'\n precedingWord = `${temporary}${andTxt}`\n } else if (followingValue < 13n && precedingValue < 1000n && this.options.includeOptionalAnd) {\n precedingWord = `${precedingWord}en`\n } else if (followingValue < 13n && precedingValue >= 1000n && this.options.includeOptionalAnd) {\n followingWord = ` en ${followingWord}`\n hasSpace = true\n } else if (precedingValue >= 1_000_000n) {\n precedingWord += ' '\n hasSpace = true\n } else if (precedingValue === 1000n) {\n precedingWord += ' '\n hasSpace = true\n }\n\n // Convert 'één' to 'een' in direct compounds (no space)\n // Keep 'één' only if there's a space AND accentOne=true\n if (!hasSpace) {\n precedingWord = precedingWord.replace(/één/g, 'een')\n followingWord = followingWord.replace(/één/g, 'een')\n } else if (!this.options.accentOne) {\n precedingWord = precedingWord.replace(/één/g, 'een')\n followingWord = followingWord.replace(/één/g, 'een')\n }\n\n return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }\n }\n\n integerToWords (integerPart) {\n if (integerPart >= 1100n && integerPart < 10_000n && !this.options.noHundredPairing) {\n const high = integerPart / 100n\n const low = integerPart % 100n\n if (high % 10n !== 0n) {\n let result = super.integerToWords(high) + 'honderd'\n if (low) {\n result +=\n (this.options.includeOptionalAnd ? ' en ' : ' ') + super.integerToWords(low)\n }\n return result\n }\n }\n return super.integerToWords(integerPart)\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * English language converter.\n *\n * Supports:\n * - Hyphenated compounds (e.g., \"twenty-three\")\n * - \"and\" after hundreds (e.g., \"one hundred and one\")\n * - Numbers up to octillions\n */\nexport class English extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'point'\n zeroWord = 'zero'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'octillion'],\n [1_000_000_000_000_000_000_000_000n, 'septillion'],\n [1_000_000_000_000_000_000_000n, 'sextillion'],\n [1_000_000_000_000_000_000n, 'quintillion'],\n [1_000_000_000_000_000n, 'quadrillion'],\n [1_000_000_000_000n, 'trillion'],\n [1_000_000_000n, 'billion'],\n [1_000_000n, 'million'],\n [1000n, 'thousand'],\n [100n, 'hundred'],\n [90n, 'ninety'],\n [80n, 'eighty'],\n [70n, 'seventy'],\n [60n, 'sixty'],\n [50n, 'fifty'],\n [40n, 'forty'],\n [30n, 'thirty'],\n [20n, 'twenty'],\n [19n, 'nineteen'],\n [18n, 'eighteen'],\n [17n, 'seventeen'],\n [16n, 'sixteen'],\n [15n, 'fifteen'],\n [14n, 'fourteen'],\n [13n, 'thirteen'],\n [12n, 'twelve'],\n [11n, 'eleven'],\n [10n, 'ten'],\n [9n, 'nine'],\n [8n, 'eight'],\n [7n, 'seven'],\n [6n, 'six'],\n [5n, 'five'],\n [4n, 'four'],\n [3n, 'three'],\n [2n, 'two'],\n [1n, 'one'],\n [0n, 'zero']\n ]\n\n /** Combines two word-sets with English hyphenation and \"and\" rules. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const followingValue = Object.values(following)[0]\n\n // Rule 1: Implicit \"one\" - omit when multiplying (\"one hundred\" → \"hundred\")\n if (precedingValue === 1n && followingValue < 100n) {\n return { [followingWord]: followingValue }\n }\n\n // Rule 2: Hyphenate compounds under 100 (\"twenty-three\")\n if (precedingValue < 100n && precedingValue > followingValue) {\n return { [`${precedingWord}-${followingWord}`]: precedingValue + followingValue }\n }\n\n // Rule 3: Add \"and\" before units after hundreds (\"one hundred and one\")\n if (precedingValue >= 100n && followingValue < 100n) {\n return { [`${precedingWord} and ${followingWord}`]: precedingValue + followingValue }\n }\n\n // Rule 4: Multiply when following > preceding (\"one thousand\")\n if (followingValue > precedingValue) {\n return { [`${precedingWord} ${followingWord}`]: precedingValue * followingValue }\n }\n\n return { [`${precedingWord} ${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Filipino language converter.\n *\n * Supports:\n * - \"ng\" connectors between words\n * - Implicit \"one\" omission\n * - Special linkers for certain tens (e.g., \"limampung\")\n */\nexport class Filipino extends GreedyScaleLanguage {\n negativeWord = 'negatibo'\n decimalSeparatorWord = 'punto'\n zeroWord = 'zero'\n usePerDigitDecimals = true // Read decimals digit-by-digit\n\n scaleWords = [\n [1000000000000n, 'trilyong'],\n [1000000000n, 'milyong'],\n [1000000n, 'milyong'],\n [1000n, 'libong'],\n [100n, 'daang'],\n\n // Tens\n [90n, 'siyamnapu'],\n [80n, 'walumpu'],\n [70n, 'pitumpu'],\n [60n, 'animnapu'],\n [50n, 'limampu'],\n [40n, 'apatnapu'],\n [30n, 'tatlumpu'],\n [20n, 'dalawampu'],\n\n // Teens (must come before 10 to be matched first)\n [19n, 'labinsiyam'],\n [18n, 'labingwalo'],\n [17n, 'labimpito'],\n [16n, 'labinanum'],\n [15n, 'labinlima'],\n [14n, 'labinapat'],\n [13n, 'labintatlo'],\n [12n, 'labindalawa'],\n [11n, 'labinisa'],\n [10n, 'sampu'],\n\n // Ones\n [9n, 'siyam'],\n [8n, 'walo'],\n [7n, 'pito'],\n [6n, 'anim'],\n [5n, 'lima'],\n [4n, 'apat'],\n [3n, 'tatlo'],\n [2n, 'dalawa'],\n [1n, 'isa'],\n [0n, 'zero']\n ]\n\n /** Converts integer part with explicit zero handling. */\n integerToWords (integerPart) {\n // Handle zero explicitly\n if (integerPart === 0n) {\n return this.zeroWord\n }\n return super.integerToWords(integerPart)\n }\n\n /** Combines two word-sets with Filipino connector and linker rules. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingValue = Object.values(following)[0]\n\n // Don't merge zero with anything - just return the non-zero value\n if (precedingValue === 0n) {\n return following\n }\n if (followingValue === 0n) {\n return preceding\n }\n\n // Implicit \"one\" - omit when adding with values < 100\n if (precedingValue === 1n && followingValue < 100n) {\n return following\n }\n\n // Multiply when following is a scale word AND following > preceding\n // Use \"ng\" connector for Filipino, but consonant-ending words use \" na \"\n if (followingValue > precedingValue && followingValue >= 100n) {\n // Words ending in consonants (not vowels) use \" na \" instead of \"ng\"\n const vowels = ['a', 'e', 'i', 'o', 'u']\n const lastChar = precedingWord[precedingWord.length - 1]\n if (!vowels.includes(lastChar)) {\n return {\n [`${precedingWord} na ${followingWord}`]: precedingValue * followingValue\n }\n }\n // Vowel-ending words add \"ng\"\n return {\n [`${precedingWord}ng ${followingWord}`]: precedingValue * followingValue\n }\n }\n\n // Special Filipino rule: certain tens words take \"-ng\" linker when followed by ones\n // Only limampu (50) confirmed to use this pattern\n if (precedingValue >= 10n && precedingValue < 100n && followingValue >= 1n && followingValue < 10n) {\n const tensWithNg = ['limampu']\n if (tensWithNg.includes(precedingWord)) {\n return {\n [`${precedingWord}ng ${followingWord}`]: precedingValue + followingValue\n }\n }\n }\n\n // Default: space for addition\n return {\n [`${precedingWord} ${followingWord}`]: precedingValue + followingValue\n }\n }\n}\n","import { French } from './fr.js'\n\n/**\n * French (Belgium) language converter.\n *\n * Supports:\n * - Belgian regional variants: \"septante\" (70) and \"nonante\" (90)\n * - Simplified tens naming (no complex arithmetic)\n * - Inherits all other French grammar rules\n */\nexport class FrenchBelgium extends French {\n constructor (options = {}) {\n super(options)\n\n // Insert 90n ('nonante') after 80n and 70n ('septante') after 60n\n const tuples = [...this.scaleWords]\n // Find index of 80n and insert 90n after it\n const idx80 = tuples.findIndex(tuple => tuple[0] === 80n)\n if (idx80 !== -1) tuples.splice(idx80, 0, [90n, 'nonante'])\n // Find index of 60n and insert 70n after it\n const idx60 = tuples.findIndex(tuple => tuple[0] === 60n)\n if (idx60 !== -1) tuples.splice(idx60, 0, [70n, 'septante'])\n this.scaleWords = tuples\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * German language converter.\n *\n * Supports:\n * - Compound formation (no separators between words)\n * - Three forms of 1 (eins/ein/eine)\n * - Units-before-tens ordering (einundzwanzig = one and twenty)\n */\nexport class German extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'komma'\n zeroWord = 'null'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'Quadrilliarde'],\n [1_000_000_000_000_000_000_000_000n, 'Quadrillion'],\n [1_000_000_000_000_000_000_000n, 'Trilliarde'],\n [1_000_000_000_000_000_000n, 'Trillion'],\n [1_000_000_000_000_000n, 'Billiarde'],\n [1_000_000_000_000n, 'Billion'],\n [1_000_000_000n, 'Milliarde'],\n [1_000_000n, 'Million'],\n [1000n, 'tausend'],\n [100n, 'hundert'],\n [90n, 'neunzig'],\n [80n, 'achtzig'],\n [70n, 'siebzig'],\n [60n, 'sechzig'],\n [50n, 'fünfzig'],\n [40n, 'vierzig'],\n [30n, 'dreißig'],\n [20n, 'zwanzig'],\n [19n, 'neunzehn'],\n [18n, 'achtzehn'],\n [17n, 'siebzehn'],\n [16n, 'sechzehn'],\n [15n, 'fünfzehn'],\n [14n, 'vierzehn'],\n [13n, 'dreizehn'],\n [12n, 'zwölf'],\n [11n, 'elf'],\n [10n, 'zehn'],\n [9n, 'neun'],\n [8n, 'acht'],\n [7n, 'sieben'],\n [6n, 'sechs'],\n [5n, 'fünf'],\n [4n, 'vier'],\n [3n, 'drei'],\n [2n, 'zwei'],\n [1n, 'eins'],\n [0n, 'null']\n ]\n\n /** Combines two word-sets with German compound formation and reversal rules. */\n combineWordSets (preceding, following) {\n let precedingWord = Object.keys(preceding)[0]\n let followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingValue = Object.values(following)[0]\n\n // Handle form of 1: \"eins\" → \"ein(e)\" in certain contexts\n if (precedingValue === 1n) {\n if (followingValue === 100n || followingValue === 1000n) {\n return { [`ein${followingWord}`]: followingValue }\n }\n if (followingValue < 1_000_000n) {\n return following\n }\n precedingWord = 'eine'\n }\n\n if (followingValue > precedingValue) {\n // Multiply: apply pluralization rules for millions\n if (followingValue >= 1_000_000n) {\n if (precedingValue > 1n) {\n followingWord += followingWord.at(-1) === 'e' ? 'n' : 'en'\n }\n precedingWord += ' '\n }\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n\n // Add: handle special case of tens + units\n if (followingValue < 10n && precedingValue > 10n && precedingValue < 100n) {\n // German reverses tens and units (einundzwanzig = one and twenty)\n if (followingValue === 1n) {\n followingWord = 'ein'\n }\n const temp = followingWord\n followingWord = precedingWord\n precedingWord = `${temp}und`\n } else if (precedingValue >= 1_000_000n) {\n precedingWord += ' '\n }\n\n return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Greek language converter.\n *\n * Supports:\n * - Space-separated number composition\n * - Implicit \"one\" (ένα) omission before scale words\n * - Digit-by-digit decimal reading\n */\nexport class Greek extends GreedyScaleLanguage {\n negativeWord = 'μείον'\n decimalSeparatorWord = 'κόμμα'\n zeroWord = 'μηδέν'\n usePerDigitDecimals = true\n\n scaleWords = [\n // Large numbers (limited set for now)\n [1_000_000_000n, 'δισεκατομμύριο'],\n [1_000_000n, 'εκατομμύριο'],\n [1000n, 'χίλια'],\n\n // Hundreds\n [900n, 'εννιακόσια'],\n [800n, 'οκτακόσια'],\n [700n, 'επτακόσια'],\n [600n, 'εξακόσια'],\n [500n, 'πεντακόσια'],\n [400n, 'τετρακόσια'],\n [300n, 'τριακόσια'],\n [200n, 'διακόσια'],\n [100n, 'εκατό'],\n\n // Tens\n [90n, 'ενενήντα'],\n [80n, 'ογδόντα'],\n [70n, 'εβδομήντα'],\n [60n, 'εξήντα'],\n [50n, 'πενήντα'],\n [40n, 'σαράντα'],\n [30n, 'τριάντα'],\n [20n, 'είκοσι'],\n [19n, 'δεκαεννέα'],\n [18n, 'δεκαοκτώ'],\n [17n, 'δεκαεπτά'],\n [16n, 'δεκαέξι'],\n [15n, 'δεκαπέντε'],\n [14n, 'δεκατέσσερα'],\n [13n, 'δεκατρία'],\n [12n, 'δώδεκα'],\n [11n, 'έντεκα'],\n [10n, 'δέκα'],\n\n // Singles\n [9n, 'εννέα'],\n [8n, 'οκτώ'],\n [7n, 'επτά'],\n [6n, 'έξι'],\n [5n, 'πέντε'],\n [4n, 'τέσσερα'],\n [3n, 'τρία'],\n [2n, 'δύο'],\n [1n, 'ένα'],\n [0n, 'μηδέν']\n ]\n\n /** Combines two word-sets with Greek space-separation rules. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const followingValue = Object.values(following)[0]\n\n // Implicit one: omit \"ένα\" before any following value (> 0)\n if (precedingValue === 1n) {\n return following\n }\n\n // No special handling needed for trailing 'ένα';\n // nested merge will first collapse {1, 'ένα'} -> 'ένα'.\n\n // Multiplication: larger following scale multiplied by preceding number\n if (followingValue > precedingValue) {\n return { [`${precedingWord} ${followingWord}`]: precedingValue * followingValue }\n }\n\n // Addition: smaller numbers added together\n return { [`${precedingWord} ${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Gujarati language converter.\n *\n * Supports:\n * - Indian numbering system (હજાર, લાખ, કરોડ)\n * - Gujarati script\n * - Complete word forms for 0-99\n */\nexport class Gujarati extends SouthAsianLanguage {\n negativeWord = 'ઋણ'\n decimalSeparatorWord = 'દશાંશ'\n zeroWord = 'શૂન્ય'\n hundredWord = 'સો'\n usePerDigitDecimals = true\n\n belowHundredWords = [\n 'શૂન્ય',\n 'એક',\n 'બે',\n 'ત્રણ',\n 'ચાર',\n 'પાંચ',\n 'છ',\n 'સાત',\n 'આઠ',\n 'નવ',\n 'દસ',\n 'અગિયાર',\n 'બાર',\n 'તેર',\n 'ચૌદ',\n 'પંદર',\n 'સોળ',\n 'સત્તર',\n 'અઢાર',\n 'ઓગણીસ',\n 'વીસ',\n 'એકવીસ',\n 'બાવીસ',\n 'ત્રેવીસ',\n 'ચોવીસ',\n 'પચીસ',\n 'છવ્વીસ',\n 'સત્તાવીસ',\n 'અઠ્ઠાવીસ',\n 'ઓગણત્રીસ',\n 'ત્રીસ',\n 'એકત્રીસ',\n 'બત્રીસ',\n 'તેત્રીસ',\n 'ચોત્રીસ',\n 'પાંત્રીસ',\n 'છત્રીસ',\n 'સાડત્રીસ',\n 'અડત્રીસ',\n 'ઓગણચાલીસ',\n 'ચાલીસ',\n 'એકતાલીસ',\n 'બેતાળીસ',\n 'ત્રેતાળીસ',\n 'ચુંમાલીસ',\n 'પિસ્તાલીસ',\n 'છેતાળીસ',\n 'સુડતાળીસ',\n 'અડતાળીસ',\n 'ઓગણપચાસ',\n 'પચાસ',\n 'એકાવન',\n 'બાવન',\n 'ત્રેપન',\n 'ચોપન',\n 'પંચાવન',\n 'છપ્પન',\n 'સત્તાવન',\n 'અઠ્ઠાવન',\n 'ઓગણસાઠ',\n 'સાઠ',\n 'એકસઠ',\n 'બાસઠ',\n 'ત્રેસઠ',\n 'ચોસઠ',\n 'પાંસઠ',\n 'છાસઠ',\n 'સડસઠ',\n 'અડસઠ',\n 'અગણોસિત્તેર',\n 'સિત્તેર',\n 'એકોતેર',\n 'બોતેર',\n 'તોતેર',\n 'ચુમોતેર',\n 'પંચોતેર',\n 'છોતેર',\n 'સિત્યોતેર',\n 'ઇઠ્યોતેર',\n 'ઓગણાએંસી',\n 'એંસી',\n 'એક્યાસી',\n 'બ્યાસી',\n 'ત્યાસી',\n 'ચોર્યાસી',\n 'પંચાસી',\n 'છ્યાસી',\n 'સિત્યાસી',\n 'અઠ્યાસી',\n 'નેવ્યાસી',\n 'નેવું',\n 'એકાણું',\n 'બાણું',\n 'ત્રાણું',\n 'ચોરાણું',\n 'પંચાણું',\n 'છન્નું',\n 'સત્તાણું',\n 'અઠ્ઠાણું',\n 'નવ્વાણું'\n ]\n\n scaleWords = [\n '',\n 'હજાર',\n 'લાખ',\n 'કરોડ',\n 'અબજ',\n 'ખરબ',\n 'નીલ',\n 'પદ્મ',\n 'શંખ'\n ]\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Modern Hebrew language converter.\n *\n * Supports:\n * - Right-to-left text orientation\n * - Feminine grammatical forms (default in Modern Hebrew)\n * - Three-form pluralization (singular/few/many)\n * - Optional \"ve\" (ו) conjunction via options\n */\nexport class Hebrew extends SlavicLanguage {\n negativeWord = 'מינוס'\n decimalSeparatorWord = 'נקודה'\n zeroWord = 'אפס'\n usePerDigitDecimals = true\n\n // Feminine forms (default in Modern Hebrew)\n onesWords = {\n 1: 'אחת',\n 2: 'שתים',\n 3: 'שלש',\n 4: 'ארבע',\n 5: 'חמש',\n 6: 'שש',\n 7: 'שבע',\n 8: 'שמונה',\n 9: 'תשע'\n }\n\n teensWords = {\n 0: 'עשר',\n 1: 'אחת עשרה',\n 2: 'שתים עשרה',\n 3: 'שלש עשרה',\n 4: 'ארבע עשרה',\n 5: 'חמש עשרה',\n 6: 'שש עשרה',\n 7: 'שבע עשרה',\n 8: 'שמונה עשרה',\n 9: 'תשע עשרה'\n }\n\n twentiesWords = {\n 2: 'עשרים',\n 3: 'שלשים',\n 4: 'ארבעים',\n 5: 'חמישים',\n 6: 'ששים',\n 7: 'שבעים',\n 8: 'שמונים',\n 9: 'תשעים'\n }\n\n hundredsWords = {\n 1: 'מאה',\n 2: 'מאתיים',\n 3: 'מאות'\n }\n\n pluralForms = {\n 1: 'אלף',\n 2: 'אלפיים',\n 3: 'שלשת אלפים',\n 4: 'ארבעת אלפים',\n 5: 'חמשת אלפים',\n 6: 'ששת אלפים',\n 7: 'שבעת אלפים',\n 8: 'שמונת אלפים',\n 9: 'תשעת אלפים'\n }\n\n scale = {\n 1: 'אלף', // thousand (singular)\n 2: 'מיליון', // million\n 3: 'מיליארד', // billion\n 4: 'טריליון', // trillion\n 5: 'קוודרליון', // quadrillion\n 6: 'קווינטיליון' // quintillion\n }\n\n scalePlural = {\n 1: 'אלפים', // thousands\n 2: 'מיליונים', // millions\n 3: 'מיליארדים', // billions\n 4: 'טריליונים', // trillions\n 5: 'קוודרליונים', // quadrillions\n 6: 'קווינטיליונים' // quintillions\n }\n\n constructor (options = {}) {\n super(options)\n\n this.setOptions({\n andWord: 'ו'\n }, options)\n }\n\n /** Converts integer part to Hebrew words with special handling for thousands. */\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let index = segments.length\n for (const x of segments) {\n index = index - 1\n if (x === 0n) {\n continue\n }\n\n const [n1, n2, n3] = this.extractDigits(x)\n\n if (index > 0) {\n // For thousands and above, handle the full chunk value\n const chunkWords = []\n let hasHundreds = false\n\n // Process hundreds in this chunk\n if (n3 > 0n) {\n hasHundreds = true\n if (n3 <= 2n) {\n chunkWords.push(this.hundredsWords[n3])\n } else {\n chunkWords.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])\n }\n }\n\n // Process tens in this chunk\n if (n2 > 1n) {\n // Add conjunction if there were hundreds before\n const tensWord = this.twentiesWords[n2]\n chunkWords.push(hasHundreds ? this.options.andWord + tensWord : tensWord)\n }\n\n // Process ones in this chunk\n if (n2 === 1n) {\n // Add conjunction if there were hundreds before\n const onesWord = this.teensWords[n1]\n chunkWords.push(hasHundreds ? this.options.andWord + onesWord : onesWord)\n } else if (n1 > 0n) {\n // For \"one million\", \"one billion\", etc., don't add the word \"one\"\n if (x === 1n && index > 1) {\n // Skip adding \"one\" for millions/billions/etc.\n } else if (x <= 9n && chunkWords.length === 0 && index === 1) {\n // Use special forms for 1-9 thousand\n chunkWords.push(this.pluralForms[n1])\n } else {\n const onesWord = this.onesWords[n1]\n // Add conjunction if there were hundreds or tens before\n chunkWords.push((hasHundreds || n2 > 0n) ? this.options.andWord + onesWord : onesWord)\n }\n }\n\n // Add scale word (thousand, million, billion, etc.)\n if (x > 9n || index > 1) {\n // For numbers > 9 or higher scales, use appropriate scale word\n if (x === 1n) {\n // Singular form (e.g., \"one thousand\", \"one million\")\n chunkWords.push(this.scale[index])\n } else if (x === 2n && index === 1) {\n // Special dual form for \"two thousand\" (already in thousands[2])\n return [this.pluralForms[2], ...words].join(' ')\n } else if (x === 2n) {\n // For two million, two billion, etc. - use plural form\n chunkWords.push(this.scalePlural[index])\n } else if (index === 1) {\n // For thousands (10+), always use singular \"אלף\"\n chunkWords.push(this.scale[index])\n } else {\n // For millions/billions/etc. use plural form\n chunkWords.push(this.scalePlural[index])\n }\n }\n\n words.push(chunkWords.join(' '))\n continue\n }\n\n if (n3 > 0n) {\n if (n3 <= 2n) {\n words.push(this.hundredsWords[n3])\n } else {\n words.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])\n }\n }\n\n if (n2 > 1n) {\n words.push(this.twentiesWords[n2])\n }\n\n if (n2 === 1n) {\n words.push(this.teensWords[n1])\n } else if (n1 > 0n) {\n words.push(this.onesWords[n1])\n }\n }\n\n if (words.length > 1) {\n words[words.length - 1] = this.options.andWord + words.at(-1)\n }\n\n return words.join(' ')\n }\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Hindi language converter.\n *\n * Supports:\n * - Indian numbering system (हज़ार, लाख, करोड़)\n * - Devanagari script\n * - Complete word forms for 0-99\n */\nexport class Hindi extends SouthAsianLanguage {\n negativeWord = 'माइनस'\n decimalSeparatorWord = 'दशमलव'\n zeroWord = 'शून्य'\n hundredWord = 'सौ'\n\n belowHundredWords = [\n 'शून्य',\n 'एक',\n 'दो',\n 'तीन',\n 'चार',\n 'पाँच',\n 'छह',\n 'सात',\n 'आठ',\n 'नौ',\n 'दस',\n 'ग्यारह',\n 'बारह',\n 'तेरह',\n 'चौदह',\n 'पंद्रह',\n 'सोलह',\n 'सत्रह',\n 'अठारह',\n 'उन्नीस',\n 'बीस',\n 'इक्कीस',\n 'बाईस',\n 'तेईस',\n 'चौबीस',\n 'पच्चीस',\n 'छब्बीस',\n 'सत्ताईस',\n 'अट्ठाईस',\n 'उनतीस',\n 'तीस',\n 'इकतीस',\n 'बत्तीस',\n 'तैंतीस',\n 'चौंतीस',\n 'पैंतीस',\n 'छत्तीस',\n 'सैंतीस',\n 'अड़तीस',\n 'उनतालीस',\n 'चालीस',\n 'इकतालीस',\n 'बयालीस',\n 'तेतालीस',\n 'चवालीस',\n 'पैंतालीस',\n 'छियालीस',\n 'सैंतालीस',\n 'अड़तालीस',\n 'उनचास',\n 'पचास',\n 'इक्यावन',\n 'बावन',\n 'तिरपन',\n 'चौवन',\n 'पचपन',\n 'छप्पन',\n 'सत्तावन',\n 'अट्ठावन',\n 'उनसठ',\n 'साठ',\n 'इकसठ',\n 'बासठ',\n 'तिरसठ',\n 'चौंसठ',\n 'पैंसठ',\n 'छियासठ',\n 'सड़सठ',\n 'अड़सठ',\n 'उनहत्तर',\n 'सत्तर',\n 'इकहत्तर',\n 'बहत्तर',\n 'तिहत्तर',\n 'चौहत्तर',\n 'पचहत्तर',\n 'छिहत्तर',\n 'सतहत्तर',\n 'अठहत्तर',\n 'उन्यासी',\n 'अस्सी',\n 'इक्यासी',\n 'बयासी',\n 'तिरासी',\n 'चौरासी',\n 'पचासी',\n 'छियासी',\n 'सत्तासी',\n 'अट्ठासी',\n 'नवासी',\n 'नब्बे',\n 'इक्यानवे',\n 'बानवे',\n 'तिरानवे',\n 'चौरानवे',\n 'पचानवे',\n 'छियानवे',\n 'सत्तानवे',\n 'अट्ठानवे',\n 'निन्यानवे'\n ]\n\n scaleWords = [\n '',\n 'हज़ार',\n 'लाख',\n 'करोड़',\n 'अरब',\n 'खरब',\n 'नील',\n 'पद्म',\n 'शंख'\n ]\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Hungarian language converter.\n *\n * Supports:\n * - Agglutinative structure (no spaces between compound parts)\n * - Special handling for \"egy\" (one) omission\n * - Pre-composed twenties (huszonegy through huszonkilenc)\n */\nexport class Hungarian extends GreedyScaleLanguage {\n negativeWord = 'mínusz'\n decimalSeparatorWord = 'egész'\n zeroWord = 'nulla'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'quadrilliárd'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillió'],\n [1_000_000_000_000_000_000_000n, 'trilliárd'],\n [1_000_000_000_000_000_000n, 'trillió'],\n [1_000_000_000_000_000n, 'billiárd'],\n [1_000_000_000_000n, 'billió'],\n [1_000_000_000n, 'milliárd'],\n [1_000_000n, 'millió'],\n [1000n, 'ezer'],\n [100n, 'száz'],\n [90n, 'kilencven'],\n [80n, 'nyolcvan'],\n [70n, 'hetven'],\n [60n, 'hatvan'],\n [50n, 'ötven'],\n [40n, 'negyven'],\n [30n, 'harminc'],\n [29n, 'huszonkilenc'],\n [28n, 'huszonnyolc'],\n [27n, 'huszonhét'],\n [26n, 'huszonhat'],\n [25n, 'huszonöt'],\n [24n, 'huszonnégy'],\n [23n, 'huszonhárom'],\n [22n, 'huszonkettő'],\n [21n, 'huszonegy'],\n [20n, 'húsz'],\n [19n, 'tizenkilenc'],\n [18n, 'tizennyolc'],\n [17n, 'tizenhét'],\n [16n, 'tizenhat'],\n [15n, 'tizenöt'],\n [14n, 'tizennégy'],\n [13n, 'tizenhárom'],\n [12n, 'tizenkettő'],\n [11n, 'tizenegy'],\n [10n, 'tíz'],\n [9n, 'kilenc'],\n [8n, 'nyolc'],\n [7n, 'hét'],\n [6n, 'hat'],\n [5n, 'öt'],\n [4n, 'négy'],\n [3n, 'három'],\n [2n, 'kettő'],\n [1n, 'egy'],\n [0n, 'nulla']\n ]\n\n /** Converts tens (30-99) with agglutinative composition. */\n tensToCardinal (number) {\n // Expecting `number` as bigint when called from integerToWords\n if (this.wordForScale(number)) {\n return this.wordForScale(number)\n } else {\n const tens = number / 10n\n const units = number % 10n\n return this.wordForScale(tens * 10n) + this.integerToWords(units)\n }\n }\n\n /** Converts hundreds (100-999) with \"száz\" composition. */\n hundredsToCardinal (number) {\n const hundreds = number / 100n\n let prefix = 'száz'\n if (hundreds !== 1n) {\n prefix = this.integerToWords(hundreds, '') + prefix\n }\n const postfix = this.integerToWords(number % 100n, '')\n return prefix + postfix\n }\n\n /** Converts thousands (1000-999999) with \"ezer\" composition. */\n thousandsToCardinal (number) {\n const thousands = number / 1000n\n let prefix = 'ezer'\n if (thousands !== 1n) {\n prefix = this.integerToWords(thousands, '') + prefix\n }\n const postfix = this.integerToWords(number % 1000n, '')\n const middle = (number <= 2000n || postfix === '') ? '' : '-'\n return prefix + middle + postfix\n }\n\n /** Converts large numbers (millions and above) with scale words. */\n bigNumberToCardinal (number) {\n const numberLength = number.toString().length\n const digits = (numberLength % 3 === 0) ? numberLength - 2 : numberLength\n const exp = 10 ** (Math.floor(digits / 3) * 3)\n const prefix = this.integerToWords(number / BigInt(exp), '')\n const rest = this.integerToWords(number % BigInt(exp), '')\n const postfix = (rest === '') ? '' : ('-' + rest)\n return prefix + this.wordForScale(BigInt(exp)) + postfix\n }\n\n /** Converts integer part using Hungarian agglutinative rules. */\n integerToWords (integerPart, zeroWord = this.zeroWord) {\n let words = ''\n\n // Normalize to BigInt for consistent comparisons\n if (typeof integerPart !== 'bigint') integerPart = BigInt(integerPart)\n\n if (integerPart === 0n) {\n words = zeroWord\n } else if (zeroWord === '' && integerPart === 2n) {\n words = 'két'\n } else if (integerPart < 30n) {\n words = this.wordForScale(integerPart)\n } else if (integerPart < 100n) {\n words = this.tensToCardinal(integerPart)\n } else if (integerPart < 1000n) {\n words = this.hundredsToCardinal(integerPart)\n } else if (integerPart < 1_000_000n) {\n words = this.thousandsToCardinal(integerPart)\n } else {\n words = this.bigNumberToCardinal(integerPart)\n }\n\n return words\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Indonesian language converter.\n *\n * Supports:\n * - \"Se-\" prefix for one (seratus, seribu, sejuta)\n * - Regular patterns (puluh for tens, ratus for hundreds)\n * - Space-separated number components\n */\nexport class Indonesian extends AbstractLanguage {\n negativeWord = 'min'\n decimalSeparatorWord = 'koma'\n zeroWord = 'nol'\n\n /**\n * Word forms for digits 0-9.\n * @type {Object.<number, string[]>}\n */\n digitWords = {\n 0: [],\n 1: ['satu'],\n 2: ['dua'],\n 3: ['tiga'],\n 4: ['empat'],\n 5: ['lima'],\n 6: ['enam'],\n 7: ['tujuh'],\n 8: ['delapan'],\n 9: ['sembilan']\n }\n\n /**\n * Scale magnitude words keyed by exponent (10^n).\n * @type {Object.<number, string>}\n */\n scaleWords = {\n 3: 'ribu', // 10^3\n 6: 'juta', // 10^6\n 9: 'miliar', // 10^9\n 12: 'triliun',\n 15: 'kuadriliun',\n 18: 'kuantiliun',\n 21: 'sekstiliun',\n 24: 'septiliun',\n 27: 'oktiliun',\n 30: 'noniliun',\n 33: 'desiliun'\n }\n\n /** Splits number into groups of 3 digits. */\n splitBy3 (number) {\n // Split to groups of 3 numbers: 1234567 -> [['1'], ['234'], ['567']]\n const blocks = []\n const stringNumber = number.toString()\n const length = stringNumber.length\n let firstBlock\n\n if (length < 3) {\n blocks.push([stringNumber])\n } else {\n const firstBlockLength = length % 3\n\n if (firstBlockLength > 0) {\n firstBlock = [stringNumber.slice(0, firstBlockLength)]\n blocks.push(firstBlock)\n }\n\n for (let index = firstBlockLength; index < length; index += 3) {\n const nextBlock = [stringNumber.slice(index, index + 3)]\n blocks.push(nextBlock)\n }\n }\n return blocks\n }\n\n /** Converts digit blocks to Indonesian words. */\n spell (blocks) {\n let wordBlocks = []\n let spelling\n const firstBlock = blocks[0]\n if (firstBlock[0].length === 1) {\n spelling = firstBlock[0] === '0' ? ['nol'] : this.digitWords[Math.trunc(firstBlock[0])]\n } else if (firstBlock[0].length === 2) {\n spelling = this.getTens(firstBlock[0])\n } else {\n spelling = [...this.getHundreds(firstBlock[0][0]), ...this.getTens(firstBlock[0].slice(1, 3))]\n }\n wordBlocks = [...wordBlocks, [firstBlock[0], spelling]]\n for (let index = 1; index < blocks.length; index++) {\n let block = blocks[index]\n spelling = [...this.getHundreds(block[0][0]), ...this.getTens(block[0].slice(1, 3))]\n block = [...block, spelling]\n wordBlocks = [...wordBlocks, block]\n }\n return wordBlocks\n }\n\n /** Converts hundreds digit with \"seratus\" or \"ratus\" suffix. */\n getHundreds (number) {\n if (number === '1') {\n return ['seratus']\n } else if (number === '0') {\n return []\n } else {\n return [...this.digitWords[Math.trunc(number)], 'ratus']\n }\n }\n\n /** Converts tens and units digits with \"puluh\" or \"belas\" suffix. */\n getTens (number) {\n if (number[0] === '1') {\n if (number[1] === '0') {\n return ['sepuluh']\n } else if (number[1] === '1') {\n return ['sebelas']\n }\n return [...this.digitWords[Math.trunc(number[1])], 'belas']\n }\n\n if (number[0] === '0') {\n return this.digitWords[Math.trunc(number[1])]\n }\n\n return [...this.digitWords[Math.trunc(number[0])], 'puluh', ...this.digitWords[Math.trunc(number[1])]]\n }\n\n /** Joins word blocks with magnitude scale words. */\n join (wordBlocks) {\n let wordList = []\n const length = wordBlocks.length - 1\n const firstBlock = [wordBlocks[0]]\n let start = 0\n if (length === 1 && firstBlock[0][0] === '1') {\n wordList.push('seribu')\n start = 1\n }\n for (let index = start; index < length + 1; index++) {\n wordList = [...wordList, ...wordBlocks[index][1]]\n if (wordBlocks[index][1].length === 0) {\n continue\n }\n if (index === length) {\n break\n }\n wordList = [...wordList, this.scaleWords[(length - index) * 3]]\n }\n return wordList.join(' ')\n }\n\n /** Converts integer part using Indonesian group-based conversion. */\n integerToWords (integerPart) {\n return this.join(\n this.spell(\n this.splitBy3(integerPart)\n )\n ).trim()\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Italian language converter.\n *\n * Supports:\n * - Phonetic contractions (vowel elision: \"ventotto\" not \"ventiotto\")\n * - Accentuation rules for \"tre\" in compounds (\"ventitré\")\n * - Custom word construction for irregular patterns\n */\nexport class Italian extends AbstractLanguage {\n negativeWord = 'meno'\n decimalSeparatorWord = 'virgola'\n zeroWord = 'zero'\n\n onesWords = [\n this.zeroWord, 'uno', 'due', 'tre', 'quattro', 'cinque', 'sei', 'sette', 'otto',\n 'nove', 'dieci', 'undici', 'dodici', 'tredici', 'quattordici', 'quindici',\n 'sedici', 'diciassette', 'diciotto', 'diciannove'\n ]\n\n tensWords = { 2: 'venti', 3: 'trenta', 4: 'quaranta', 6: 'sessanta' }\n\n exponentPrefixes = [this.zeroWord, 'm', 'b', 'tr', 'quadr', 'quint', 'sest', 'sett', 'ott', 'nov', 'dec']\n\n /** Adds accent to final \"tre\" in compound words (ventitré). */\n accentuate (string) {\n const splittedString = string.split(' ')\n\n const result = splittedString.map(word => {\n return word.slice(-3) === 'tre' && word.length > 3 ? word.replaceAll('tré', 'tre').slice(0, -3) + 'tré' : word.replaceAll('tré', 'tre')\n })\n return result.join(' ')\n }\n\n /** Omits word if it represents zero. */\n omitIfZero (numberToString) {\n return numberToString === this.zeroWord ? '' : numberToString\n }\n\n /** Removes duplicate vowels for phonetic contractions. */\n phoneticContraction (string) {\n return string.replaceAll('oo', 'o').replaceAll('ao', 'o').replaceAll('io', 'o').replaceAll('au', 'u').replaceAll('iu', 'u')\n }\n\n /** Converts tens (20-99) with phonetic contractions. */\n tensToCardinal (number) {\n const tens = Math.floor(number / 10)\n const units = number % 10\n const prefix = Object.prototype.hasOwnProperty.call(this.tensWords, tens) ? this.tensWords[tens] : this.onesWords[tens].slice(0, -1) + 'anta'\n const postfix = this.omitIfZero(this.onesWords[units])\n return this.phoneticContraction(prefix + postfix)\n }\n\n /** Converts hundreds (100-999) with \"cento\" composition. */\n hundredsToCardinal (number) {\n const hundreds = Math.floor(number / 100)\n let prefix = 'cento'\n if (hundreds !== 1) {\n prefix = this.onesWords[hundreds] + prefix\n }\n const postfix = this.omitIfZero(this.integerToWords(number % 100))\n return this.phoneticContraction(prefix + postfix)\n }\n\n /** Converts thousands (1000-999999) with \"mille/mila\" composition. */\n thousandsToCardinal (number) {\n const thousands = Math.floor(number / 1000)\n const prefix = thousands === 1 ? 'mille' : this.integerToWords(thousands) + 'mila'\n const postfix = this.omitIfZero(this.integerToWords(number % 1000))\n return prefix + postfix\n }\n\n /** Converts exponent length to Italian scale word (milione, miliardo, etc.). */\n exponentLengthToString (exponentLength) {\n const prefix = this.exponentPrefixes[Math.floor(exponentLength / 6)]\n return exponentLength % 6 === 0 ? prefix + 'ilione' : prefix + 'iliardo'\n }\n\n /** Converts large numbers (millions and above) with exponent-based naming. */\n bigNumberToCardinal (number) {\n const digits = [...number.toString()]\n\n let preDigits = digits.length % 3\n if (preDigits === 0) {\n preDigits = 3\n }\n\n const multiplier = digits.slice(0, preDigits) // first `preDigits` elements\n const exponent = digits.slice(preDigits) // without the first `preDigits` elements\n\n let prefix, postfix\n let infix = this.exponentLengthToString(exponent.length)\n\n if (multiplier.join('') === '1') {\n prefix = 'un '\n } else {\n prefix = this.integerToWords(Math.trunc(Number(multiplier.join(''))))\n infix = ' ' + infix.slice(0, -1) + 'i' // without last element\n }\n\n const isSetsEqual = (a, b) => a.size === b.size && [...a].every(value => b.has(value))\n if (isSetsEqual(new Set(exponent), new Set(['0']))) {\n postfix = ''\n } else {\n postfix = this.integerToWords(Math.trunc(exponent.join('')))\n\n infix += (postfix.includes(' e ') ? ', ' : ' e ')\n }\n\n return prefix + infix + postfix\n }\n\n /** Converts integer part using Italian custom algorithm with accentuation. */\n integerToWords (integerPart) {\n let words = ''\n\n if (integerPart < 20) {\n words = this.onesWords[integerPart]\n } else if (integerPart < 100) {\n words = this.tensToCardinal(Number(integerPart))\n } else if (integerPart < 1000) {\n words = this.hundredsToCardinal(Number(integerPart))\n } else if (integerPart < 1_000_000) {\n words = this.thousandsToCardinal(Number(integerPart))\n } else {\n words = this.bigNumberToCardinal(integerPart)\n }\n\n return this.accentuate(words)\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Japanese language converter.\n *\n * Supports:\n * - Kanji numerals (一, 二, 三, etc.)\n * - Grouping by 万 (10,000) instead of 1,000\n * - Special 一 (one) omission rules (十, 百, 千 but 一万, 一億)\n */\nexport class Japanese extends AbstractLanguage {\n negativeWord = 'マイナス'\n decimalSeparatorWord = '点'\n zeroWord = '零'\n wordSeparator = '' // Japanese doesn't use spaces between characters\n usePerDigitDecimals = true // Enable digit-by-digit decimal conversion\n\n // Ones words used for group conversion (1-9)\n onesWords = ['一', '二', '三', '四', '五', '六', '七', '八', '九']\n\n // Scale words for grouping by 10^4\n scaleWords = [\n '', // 10^0 (ones)\n '万', // 10^4 (man)\n '億', // 10^8 (oku)\n '兆', // 10^12 (chō)\n '京', // 10^16 (kei)\n '垓', // 10^20 (gai)\n '秭', // 10^24 (jo/shi)\n '穣', // 10^28 (jō)\n '溝', // 10^32 (kō)\n '澗', // 10^36 (kan)\n '正', // 10^40 (sei)\n '載', // 10^44 (sai)\n '極', // 10^48 (goku)\n '恒河沙', // 10^52 (gōgasha)\n '阿僧祇', // 10^56 (asōgi)\n '那由他', // 10^60 (nayuta)\n '不可思議', // 10^64 (fukashigi)\n '無量大数' // 10^68 (muryōtaisū)\n ]\n\n /** Converts a segment of up to 4 digits to Japanese kanji with 一 omission rules. */\n segmentToWords (num) {\n if (num === 0n) return ''\n\n const thousands = num / 1000n\n const hundreds = (num % 1000n) / 100n\n const tens = (num % 100n) / 10n\n const ones = num % 10n\n\n let result = ''\n\n // Thousands (千)\n if (thousands > 0n) {\n // Always omit 一 before 千 when thousands === 1\n if (thousands === 1n) {\n result += '千'\n } else {\n result += this.onesWords[Number(thousands) - 1] + '千'\n }\n }\n\n // Hundreds (百)\n if (hundreds > 0n) {\n // Always omit 一 before 百 when hundreds === 1\n if (hundreds === 1n) {\n result += '百'\n } else {\n result += this.onesWords[Number(hundreds) - 1] + '百'\n }\n }\n\n // Tens (十)\n if (tens > 0n) {\n // Always omit 一 before 十 when tens === 1\n if (tens === 1n) {\n result += '十'\n } else {\n result += this.onesWords[Number(tens) - 1] + '十'\n }\n }\n\n // Ones\n if (ones > 0n) {\n result += this.onesWords[Number(ones) - 1]\n }\n\n return result\n }\n\n /** Converts integer part using Japanese 万-based grouping system. */\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n\n let temp = integerPart\n let scaleIndex = 0\n const groups = []\n\n // Split into groups of 4 digits (万-based system)\n while (temp > 0n) {\n const group = temp % 10000n\n if (group > 0n) {\n groups.push({ value: group, scale: scaleIndex })\n }\n temp = temp / 10000n\n scaleIndex++\n }\n\n // Reverse to process from highest to lowest\n groups.reverse()\n\n let result = ''\n\n for (let i = 0; i < groups.length; i++) {\n const { value, scale } = groups[i]\n\n const groupStr = this.segmentToWords(value)\n\n // For scales >= 1 (万 and above), always add the scale word\n if (scale >= 1) {\n // Special case: if group is 1 and scale >= 1, we need 一 before the scale\n if (value === 1n) {\n result += '一' + this.scaleWords[scale]\n } else {\n result += groupStr + this.scaleWords[scale]\n }\n } else {\n result += groupStr\n }\n }\n\n return result\n }\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Kannada language converter.\n *\n * Supports:\n * - Indian numbering system (ಸಾವಿರ, ಲಕ್ಷ, ಕೋಟಿ)\n * - Kannada script\n * - Complete word forms for 0-99\n */\nexport class Kannada extends SouthAsianLanguage {\n negativeWord = 'ಋಣಾತ್ಮಕ'\n decimalSeparatorWord = 'ದಶಮಾಂಶ'\n zeroWord = 'ಸೊನ್ನೆ'\n hundredWord = 'ನೂರು'\n usePerDigitDecimals = true\n\n belowHundredWords = [\n 'ಸೊನ್ನೆ', 'ಒಂದು', 'ಎರಡು', 'ಮೂರು', 'ನಾಲ್ಕು', 'ಐದು', 'ಆರು', 'ಏಳು', 'ಎಂಟು', 'ಒಂಬತ್ತು',\n 'ಹತ್ತು', 'ಹನ್ನೊಂದು', 'ಹನ್ನೆರಡು', 'ಹದಿಮೂರು', 'ಹದಿನಾಲ್ಕು', 'ಹದಿನೈದು', 'ಹದಿನಾರು', 'ಹದಿನೇಳು', 'ಹದಿನೆಂಟು', 'ಹತ್ತೊಂಬತ್ತು',\n 'ಇಪ್ಪತ್ತು', 'ಇಪ್ಪತ್ತೊಂದು', 'ಇಪ್ಪತ್ತೆರಡು', 'ಇಪ್ಪತ್ತಮೂರು', 'ಇಪ್ಪತ್ತನಾಲ್ಕು', 'ಇಪ್ಪತ್ತೈದು', 'ಇಪ್ಪತ್ತಾರು', 'ಇಪ್ಪತ್ತೇಳು', 'ಇಪ್ಪತ್ತೆಂಟು', 'ಇಪ್ಪತ್ತೊಂಬತ್ತು',\n 'ಮೂವತ್ತು', 'ಮೂವತ್ತೊಂದು', 'ಮೂವತ್ತೆರಡು', 'ಮೂವತ್ತಮೂರು', 'ಮೂವತ್ತನಾಲ್ಕು', 'ಮೂವತ್ತೈದು', 'ಮೂವತ್ತಾರು', 'ಮೂವತ್ತೇಳು', 'ಮೂವತ್ತೆಂಟು', 'ಮೂವತ್ತೊಂಬತ್ತು',\n 'ನಲವತ್ತು', 'ನಲವತ್ತೊಂದು', 'ನಲವತ್ತೆರಡು', 'ನಲವತ್ತಮೂರು', 'ನಲವತ್ತನಾಲ್ಕು', 'ನಲವತ್ತೈದು', 'ನಲವತ್ತಾರು', 'ನಲವತ್ತೇಳು', 'ನಲವತ್ತೆಂಟು', 'ನಲವತ್ತೊಂಬತ್ತು',\n 'ಐವತ್ತು', 'ಐವತ್ತೊಂದು', 'ಐವತ್ತೆರಡು', 'ಐವತ್ತಮೂರು', 'ಐವತ್ತನಾಲ್ಕು', 'ಐವತ್ತೈದು', 'ಐವತ್ತಾರು', 'ಐವತ್ತೇಳು', 'ಐವತ್ತೆಂಟು', 'ಐವತ್ತೊಂಬತ್ತು',\n 'ಅರವತ್ತು', 'ಅರವತ್ತೊಂದು', 'ಅರವತ್ತೆರಡು', 'ಅರವತ್ತಮೂರು', 'ಅರವತ್ತನಾಲ್ಕು', 'ಅರವತ್ತೈದು', 'ಅರವತ್ತಾರು', 'ಅರವತ್ತೇಳು', 'ಅರವತ್ತೆಂಟು', 'ಅರವತ್ತೊಂಬತ್ತು',\n 'ಎಪ್ಪತ್ತು', 'ಎಪ್ಪತ್ತೊಂದು', 'ಎಪ್ಪತ್ತೆರಡು', 'ಎಪ್ಪತ್ತಮೂರು', 'ಎಪ್ಪತ್ತನಾಲ್ಕು', 'ಎಪ್ಪತ್ತೈದು', 'ಎಪ್ಪತ್ತಾರು', 'ಎಪ್ಪತ್ತೇಳು', 'ಎಪ್ಪತ್ತೆಂಟು', 'ಎಪ್ಪತ್ತೊಂಬತ್ತು',\n 'ಎಂಬತ್ತು', 'ಎಂಬತ್ತೊಂದು', 'ಎಂಬತ್ತೆರಡು', 'ಎಂಬತ್ತಮೂರು', 'ಎಂಬತ್ತನಾಲ್ಕು', 'ಎಂಬತ್ತೈದು', 'ಎಂಬತ್ತಾರು', 'ಎಂಬತ್ತೇಳು', 'ಎಂಬತ್ತೆಂಟು', 'ಎಂಬತ್ತೊಂಬತ್ತು',\n 'ತೊಂಬತ್ತು', 'ತೊಂಬತ್ತೊಂದು', 'ತೊಂಬತ್ತೆರಡು', 'ತೊಂಬತ್ತಮೂರು', 'ತೊಂಬತ್ತನಾಲ್ಕು', 'ತೊಂಬತ್ತೈದು', 'ತೊಂಬತ್ತಾರು', 'ತೊಂಬತ್ತೇಳು', 'ತೊಂಬತ್ತೆಂಟು', 'ತೊಂಬತ್ತೊಂಬತ್ತು'\n ]\n\n scaleWords = [\n '', // units\n 'ಸಾವಿರ', // thousand (1,000)\n 'ಲಕ್ಷ', // lakh (100,000)\n 'ಕೋಟಿ', // crore (10,000,000)\n 'ಅಬ್ಜ', // arab (1,000,000,000)\n 'ಖರ್ವ', // kharab (100,000,000,000)\n 'ನೀಲ', // neel (10,000,000,000,000)\n 'ಪದ್ಮ', // padma (1,000,000,000,000,000)\n 'ಶಂಖ' // shankh (100,000,000,000,000,000)\n ]\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Korean language converter.\n *\n * Supports:\n * - Hangul numerals (일, 이, 삼, etc.)\n * - Grouping by 만 (10,000) system\n * - Implicit '일' (one) omission before multipliers\n */\nexport class Korean extends GreedyScaleLanguage {\n negativeWord = '마이너스'\n decimalSeparatorWord = '점'\n zeroWord = '영'\n\n scaleWords = [\n [10_000_000_000_000_000_000_000_000_000n, '양'],\n [1_000_000_000_000_000_000_000_000n, '자'],\n [100_000_000_000_000_000_000n, '해'],\n [10_000_000_000_000_000n, '경'],\n [1_000_000_000_000n, '조'],\n [100_000_000n, '억'],\n [10_000n, '만'],\n [1000n, '천'],\n [100n, '백'],\n [10n, '십'],\n [9n, '구'],\n [8n, '팔'],\n [7n, '칠'],\n [6n, '육'],\n [5n, '오'],\n [4n, '사'],\n [3n, '삼'],\n [2n, '이'],\n [1n, '일'],\n [0n, '영']\n ]\n\n /** Combines two word-sets according to Korean grammar rules. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0] // BigInt\n const followingValue = Object.values(following)[0] // BigInt\n\n // Implicit \"일\": omit 1 before multipliers up to 만 (10,000)\n if (precedingValue === 1n && followingValue <= 10_000n) return following\n // Concatenate (no space) for small numbers less than 만\n if (precedingValue < 10_000n && precedingValue > followingValue) return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }\n // Space-separate for large numbers (>= 만) when adding\n if (precedingValue >= 10_000n && precedingValue > followingValue) return { [`${precedingWord} ${followingWord}`]: precedingValue + followingValue }\n // Multiply for all scale combinations\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Latvian language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Latvian diacritical marks (ī, ā, ē, ū)\n * - Compound number formation (divdesmit, trīsdesmit)\n */\nexport class Latvian extends SlavicLanguage {\n negativeWord = 'mīnus'\n decimalSeparatorWord = 'komats'\n zeroWord = 'nulle'\n\n onesWords = {\n 1: 'viens',\n 2: 'divi',\n 3: 'trīs',\n 4: 'četri',\n 5: 'pieci',\n 6: 'seši',\n 7: 'septiņi',\n 8: 'astoņi',\n 9: 'deviņi'\n }\n\n onesFeminineWords = {\n 1: 'viena',\n 2: 'divas',\n 3: 'trīs',\n 4: 'četras',\n 5: 'piecas',\n 6: 'sešas',\n 7: 'septiņas',\n 8: 'astoņas',\n 9: 'deviņas'\n }\n\n teensWords = {\n 0: 'desmit',\n 1: 'vienpadsmit',\n 2: 'divpadsmit',\n 3: 'trīspadsmit',\n 4: 'četrpadsmit',\n 5: 'piecpadsmit',\n 6: 'sešpadsmit',\n 7: 'septiņpadsmit',\n 8: 'astoņpadsmit',\n 9: 'deviņpadsmit'\n }\n\n twentiesWords = {\n 2: 'divdesmit',\n 3: 'trīsdesmit',\n 4: 'četrdesmit',\n 5: 'piecdesmit',\n 6: 'sešdesmit',\n 7: 'septiņdesmit',\n 8: 'astoņdesmit',\n 9: 'deviņdesmit'\n }\n\n hundredsWords = ['simts', 'simti', 'simtu']\n\n pluralForms = {\n 1: ['tūkstotis', 'tūkstoši', 'tūkstošu'],\n 2: ['miljons', 'miljoni', 'miljonu'],\n 3: ['miljards', 'miljardi', 'miljardu'],\n 4: ['triljons', 'triljoni', 'triljonu'],\n 5: ['kvadriljons', 'kvadriljoni', 'kvadriljonu'],\n 6: ['kvintiljons', 'kvintiljoni', 'kvintiljonu'],\n 7: ['sikstiljons', 'sikstiljoni', 'sikstiljonu'],\n 8: ['septiljons', 'septiljoni', 'septiljonu'],\n 9: ['oktiljons', 'oktiljoni', 'oktiljonu'],\n 10: ['nontiljons', 'nontiljoni', 'nontiljonu']\n }\n\n pluralize (n, forms) {\n if (n === 0n) {\n return forms[2]\n }\n\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if (lastDigit === 1n && lastTwoDigits !== 11n) {\n return forms[0]\n }\n\n return forms[1]\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let index = segments.length\n for (const x of segments) {\n index = index - 1\n if (x === 0n) {\n continue\n }\n const [n1, n2, n3] = this.extractDigits(x)\n if (n3 > 0n) {\n if (n3 === 1n && n2 === 0n && n1 > 0n) {\n words.push(this.hundredsWords[2])\n } else if (n3 > 1n) {\n words.push(this.onesWords[n3], this.hundredsWords[1])\n } else {\n words.push(this.hundredsWords[0])\n }\n }\n if (n2 > 1n) {\n words.push(this.twentiesWords[n2])\n }\n if (n2 === 1n) {\n words.push(this.teensWords[n1])\n } else if (n1 > 0n && !(index > 0 && x === 1n)) {\n words.push(this.onesWords[n1])\n }\n if (index > 0) {\n words.push(this.pluralize(x, this.pluralForms[index]))\n }\n }\n return words.join(' ')\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Lithuanian language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Gender agreement (vienas/viena, du/dvi)\n * - Baltic declension patterns\n */\nexport class Lithuanian extends SlavicLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'kablelis'\n zeroWord = 'nulis'\n\n onesWords = {\n 1: 'vienas',\n 2: 'du',\n 3: 'trys',\n 4: 'keturi',\n 5: 'penki',\n 6: 'šeši',\n 7: 'septyni',\n 8: 'aštuoni',\n 9: 'devyni'\n }\n\n onesFeminineWords = {\n 1: 'viena',\n 2: 'dvi',\n 3: 'trys',\n 4: 'keturios',\n 5: 'penkios',\n 6: 'šešios',\n 7: 'septynios',\n 8: 'aštuonios',\n 9: 'devynios'\n }\n\n teensWords = {\n 0: 'dešimt',\n 1: 'vienuolika',\n 2: 'dvylika',\n 3: 'trylika',\n 4: 'keturiolika',\n 5: 'penkiolika',\n 6: 'šešiolika',\n 7: 'septyniolika',\n 8: 'aštuoniolika',\n 9: 'devyniolika'\n }\n\n twentiesWords = {\n 2: 'dvidešimt',\n 3: 'trisdešimt',\n 4: 'keturiasdešimt',\n 5: 'penkiasdešimt',\n 6: 'šešiasdešimt',\n 7: 'septyniasdešimt',\n 8: 'aštuoniasdešimt',\n 9: 'devyniasdešimt'\n }\n\n hundredsWords = ['šimtas', 'šimtai']\n\n pluralForms = {\n 1: ['tūkstantis', 'tūkstančiai', 'tūkstančių'],\n 2: ['milijonas', 'milijonai', 'milijonų'],\n 3: ['milijardas', 'milijardai', 'milijardų'],\n 4: ['trilijonas', 'trilijonai', 'trilijonų'],\n 5: ['kvadrilijonas', 'kvadrilijonai', 'kvadrilijonų'],\n 6: ['kvintilijonas', 'kvintilijonai', 'kvintilijonų'],\n 7: ['sikstilijonas', 'sikstilijonai', 'sikstilijonų'],\n 8: ['septilijonas', 'septilijonai', 'septilijonų'],\n 9: ['oktilijonas', 'oktilijonai', 'oktilijonų'],\n 10: ['naintilijonas', 'naintilijonai', 'naintilijonų']\n }\n\n pluralize (n, forms) {\n if (n === 0n) {\n return forms[2]\n }\n\n const [n1, n2] = this.extractDigits(n)\n\n if (n2 === 1n || n1 === 0n) {\n return forms[2]\n }\n\n if (n1 === 1n) {\n return forms[0]\n }\n\n return forms[1]\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let index = segments.length\n for (const x of segments) {\n index = index - 1\n if (x === 0n) {\n continue\n }\n const [n1, n2, n3] = this.extractDigits(x)\n if (n3 > 0n) {\n words.push(this.onesWords[n3])\n if (n3 > 1n) {\n words.push(this.hundredsWords[1])\n } else {\n words.push(this.hundredsWords[0])\n }\n }\n if (n2 > 1n) {\n words.push(this.twentiesWords[n2])\n }\n if (n2 === 1n) {\n words.push(this.teensWords[n1])\n } else if (n1 > 0n) {\n if ((index === 1 || (this.options.gender === 'feminine' && index === 0)) && integerPart < 1000n) {\n words.push(this.onesFeminineWords[n1])\n } else {\n words.push(this.onesWords[n1])\n }\n }\n if (index > 0) {\n words.push(this.pluralize(x, this.pluralForms[index]))\n }\n }\n return words.join(' ')\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Malay (Bahasa Melayu) language converter.\n *\n * Supports:\n * - \"Se-\" prefix for singular units (seratus, seribu, sejuta)\n * - Regular patterns (puluh for tens, ratus for hundreds)\n * - Space-separated number components\n */\nexport class Malay extends AbstractLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'perpuluhan'\n zeroWord = 'sifar'\n\n /**\n * Word forms for digits 0-9.\n * @type {Object.<number, string[]>}\n */\n digitWords = {\n 0: [],\n 1: ['satu'],\n 2: ['dua'],\n 3: ['tiga'],\n 4: ['empat'],\n 5: ['lima'],\n 6: ['enam'],\n 7: ['tujuh'],\n 8: ['lapan'],\n 9: ['sembilan']\n }\n\n /**\n * Scale magnitude words keyed by exponent (10^n).\n * @type {Object.<number, string>}\n */\n scaleWords = {\n 3: 'ribu',\n 6: 'juta',\n 9: 'bilion',\n 12: 'trilion'\n }\n\n splitBy3 (number) {\n const blocks = []\n const stringNumber = number.toString()\n const length = stringNumber.length\n let firstBlock\n\n if (length < 3) {\n blocks.push([stringNumber])\n } else {\n const firstBlockLength = length % 3\n\n if (firstBlockLength > 0) {\n firstBlock = [stringNumber.slice(0, firstBlockLength)]\n blocks.push(firstBlock)\n }\n\n for (let index = firstBlockLength; index < length; index += 3) {\n const nextBlock = [stringNumber.slice(index, index + 3)]\n blocks.push(nextBlock)\n }\n }\n return blocks\n }\n\n spell (blocks) {\n let wordBlocks = []\n let spelling\n const firstBlock = blocks[0]\n if (firstBlock[0].length === 1) {\n spelling = firstBlock[0] === '0' ? ['sifar'] : this.digitWords[Math.trunc(firstBlock[0])]\n } else if (firstBlock[0].length === 2) {\n spelling = this.getTens(firstBlock[0])\n } else {\n spelling = [...this.getHundreds(firstBlock[0][0]), ...this.getTens(firstBlock[0].slice(1, 3))]\n }\n wordBlocks = [...wordBlocks, [firstBlock[0], spelling]]\n for (let index = 1; index < blocks.length; index++) {\n let block = blocks[index]\n spelling = [...this.getHundreds(block[0][0]), ...this.getTens(block[0].slice(1, 3))]\n block = [...block, spelling]\n wordBlocks = [...wordBlocks, block]\n }\n return wordBlocks\n }\n\n getHundreds (number) { // 'ratus'\n if (number === '1') {\n return ['seratus']\n } else if (number === '0') {\n return []\n } else {\n return [...this.digitWords[Math.trunc(number)], 'ratus']\n }\n }\n\n getTens (number) { // 'puluh' and 'belas'\n if (number[0] === '1') {\n if (number[1] === '0') {\n return ['sepuluh']\n } else if (number[1] === '1') {\n return ['sebelas']\n }\n return [...this.digitWords[Math.trunc(number[1])], 'belas']\n }\n\n if (number[0] === '0') {\n return this.digitWords[Math.trunc(number[1])]\n }\n\n return [...this.digitWords[Math.trunc(number[0])], 'puluh', ...this.digitWords[Math.trunc(number[1])]]\n }\n\n join (wordBlocks) {\n const wordList = []\n const length = wordBlocks.length - 1\n\n for (let index = 0; index <= length; index++) {\n const words = wordBlocks[index][1]\n const isLast = index === length\n const scaleWord = isLast ? null : this.scaleWords[(length - index) * 3]\n\n if (!isLast && words.length === 1 && words[0] === 'satu') {\n // Use se- prefix for singular scale units: seribu, sejuta, sebilion, setrilion\n wordList.push('se' + scaleWord)\n continue\n }\n\n // Add current block words\n for (const w of words) wordList.push(w)\n\n // Append scale word if applicable and current block contributed words\n if (!isLast && words.length > 0) {\n wordList.push(scaleWord)\n }\n }\n\n return wordList.join(' ')\n }\n\n integerToWords (integerPart) {\n return this.join(\n this.spell(\n this.splitBy3(integerPart)\n )\n ).trim()\n }\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Marathi language converter.\n *\n * Supports:\n * - Indian numbering system (हजार, लाख, कोटी)\n * - Devanagari script\n * - Complete word forms for 0-99\n */\nexport class Marathi extends SouthAsianLanguage {\n negativeWord = 'उणे'\n decimalSeparatorWord = 'दशांश'\n zeroWord = 'शून्य'\n hundredWord = 'शंभर'\n usePerDigitDecimals = true\n\n belowHundredWords = [\n 'शून्य',\n 'एक',\n 'दोन',\n 'तीन',\n 'चार',\n 'पाच',\n 'सहा',\n 'सात',\n 'आठ',\n 'नऊ',\n 'दहा',\n 'अकरा',\n 'बारा',\n 'तेरा',\n 'चौदा',\n 'पंधरा',\n 'सोळा',\n 'सतरा',\n 'अठरा',\n 'एकोणीस',\n 'वीस',\n 'एकवीस',\n 'बावीस',\n 'तेवीस',\n 'चोवीस',\n 'पंचवीस',\n 'सव्वीस',\n 'सत्तावीस',\n 'अठ्ठावीस',\n 'एकोणतीस',\n 'तीस',\n 'एकतीस',\n 'बत्तीस',\n 'तेहेतीस',\n 'चौतीस',\n 'पस्तीस',\n 'छत्तीस',\n 'सदतीस',\n 'अडतीस',\n 'एकोणचाळीस',\n 'चाळीस',\n 'एकेचाळीस',\n 'बेचाळीस',\n 'त्रेचाळीस',\n 'चव्वेचाळीस',\n 'पंचेचाळीस',\n 'सेहेचाळीस',\n 'सत्तेचाळीस',\n 'अठ्ठेचाळीस',\n 'एकोणपन्नास',\n 'पन्नास',\n 'एक्काव्वन',\n 'बावन्न',\n 'त्रेपन्न',\n 'चोपन्न',\n 'पंचाव्वन',\n 'छप्पन्न',\n 'सत्तावन्न',\n 'अठ्ठावन्न',\n 'एकोणसाठ',\n 'साठ',\n 'एकसष्ठ',\n 'बासष्ठ',\n 'त्रेसष्ठ',\n 'चौसष्ठ',\n 'पासष्ठ',\n 'सहासष्ठ',\n 'सदुसष्ठ',\n 'अडुसष्ठ',\n 'एकोणसत्तर',\n 'सत्तर',\n 'एकाहत्तर',\n 'बाहत्तर',\n 'त्र्याहत्तर',\n 'चौऱ्याहत्तर',\n 'पंच्याहत्तर',\n 'शहात्तर',\n 'सत्याहत्तर',\n 'अठ्ठ्याहत्तर',\n 'एकोणऐंशी',\n 'ऐंशी',\n 'एक्याऐंशी',\n 'ब्याऐंशी',\n 'त्र्याऐंशी',\n 'चौऱ्याऐंशी',\n 'पंच्याऐंशी',\n 'शहाऐंशी',\n 'सत्याऐंशी',\n 'अठ्ठ्याऐंशी',\n 'एकोणनव्वद',\n 'नव्वद',\n 'एक्याण्णव',\n 'ब्याण्णव',\n 'त्र्याण्णव',\n 'चौऱ्याण्णव',\n 'पंच्याण्णव',\n 'शहाण्णव',\n 'सत्याण्णव',\n 'अठ्ठ्याण्णव',\n 'नव्याण्णव'\n ]\n\n scaleWords = [\n '',\n 'हजार',\n 'लाख',\n 'कोटी',\n 'अब्ज',\n 'खर्व',\n 'निखर्व',\n 'महापद्म',\n 'शंकू'\n ]\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Norwegian Bokmål language converter.\n *\n * Supports:\n * - Hyphenation for compound numbers (tjue-en)\n * - \"og\" (and) for hundreds combinations\n * - Implicit '1' omission before tens and magnitudes\n */\nexport class NorwegianBokmal extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'komma'\n zeroWord = 'null'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'oktillion'],\n [1_000_000_000_000_000_000_000_000n, 'septillion'],\n [1_000_000_000_000_000_000_000n, 'sekstillion'],\n [1_000_000_000_000_000_000n, 'kvintillion'],\n [1_000_000_000_000_000n, 'kvadrillion'],\n [1_000_000_000_000n, 'billion'],\n [1_000_000_000n, 'milliard'],\n [1_000_000n, 'million'],\n [1000n, 'tusen'],\n [100n, 'hundre'],\n [90n, 'nitti'],\n [80n, 'åtti'],\n [70n, 'sytti'],\n [60n, 'seksti'],\n [50n, 'femti'],\n [40n, 'førti'],\n [30n, 'tretti'],\n [20n, 'tjue'],\n [19n, 'nitten'],\n [18n, 'atten'],\n [17n, 'sytten'],\n [16n, 'seksten'],\n [15n, 'femten'],\n [14n, 'fjorten'],\n [13n, 'tretten'],\n [12n, 'tolv'],\n [11n, 'elleve'],\n [10n, 'ti'],\n [9n, 'ni'],\n [8n, 'åtte'],\n [7n, 'syv'],\n [6n, 'seks'],\n [5n, 'fem'],\n [4n, 'fire'],\n [3n, 'tre'],\n [2n, 'to'],\n [1n, 'en'],\n [0n, 'null']\n ]\n\n /**\n * Merges two adjacent word-sets according to Norwegian grammar rules.\n *\n * Norwegian-specific rules:\n * - Implicit \"en\": `combineWordSets({ 'en': 1n }, { 'hundre': 100n })` → `{ 'hundre': 100n }`\n * - Hyphenation for compound tens: `combineWordSets({ 'tjue': 20n }, { 'en': 1n })` → `{ 'tjue-en': 21n }`\n * - \"og\" (and) after hundreds: `combineWordSets({ 'hundre': 100n }, { 'en': 1n })` → `{ 'hundre og en': 101n }`\n * - Space-separated for large numbers (thousands+)\n * - Comma separator for non-magnitude additions (e.g., \\\"tusen, en\\\")\n *\n * @param {Object} preceding The preceding word-set as `{ word: BigInt }`.\n * @param {Object} following The following word-set as `{ word: BigInt }`.\n * @returns {Object} Merged pair with combined word and resulting numeric value.\n *\n * @example\n * combineWordSets({ 'en': 1n }, { 'hundre': 100n }); // { 'hundre': 100n }\n * combineWordSets({ 'tjue': 20n }, { 'tre': 3n }); // { 'tjue-tre': 23n }\n */\n // Norwegian merge rules mirror the former Scandinavian base logic\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingValue = Object.values(following)[0]\n\n if (precedingValue === 1n && followingValue < 100n) {\n return following\n }\n\n if (precedingValue < 100n && precedingValue > followingValue) {\n return { [`${precedingWord}-${followingWord}`]: precedingValue + followingValue }\n }\n\n if (precedingValue >= 100n && followingValue < 100n) {\n return { [`${precedingWord} og ${followingWord}`]: precedingValue + followingValue }\n }\n\n if (followingValue > precedingValue) {\n return { [`${precedingWord} ${followingWord}`]: precedingValue * followingValue }\n }\n\n return { [`${precedingWord}, ${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Persian language converter.\n *\n * Supports:\n * - \"و\" (and) conjunction for compound numbers\n * - Recursive conversion for larger numbers\n */\nexport class Persian extends AbstractLanguage {\n negativeWord = 'منفى'\n decimalSeparatorWord = 'ممیّز'\n zeroWord = 'صفر'\n\n /**\n * Words for digits 1-9.\n * @type {Object.<number, string>}\n */\n onesWords = {\n 1: 'یک',\n 2: 'دو',\n 3: 'سه',\n 4: 'چهار',\n 5: 'پنج',\n 6: 'شش',\n 7: 'هفت',\n 8: 'هشت',\n 9: 'نه'\n }\n\n /**\n * Words for teen numbers (10-19).\n * @type {Object.<number, string>}\n */\n teensWords = {\n 10: 'ده',\n 11: 'یازده',\n 12: 'دوازده',\n 13: 'سیزده',\n 14: 'چهارده',\n 15: 'پانزده',\n 16: 'شانزده',\n 17: 'هفده',\n 18: 'هجده',\n 19: 'نوزده'\n }\n\n /**\n * Words for multiples of ten (20-90).\n * @type {Object.<number, string>}\n */\n tensWords = {\n 20: 'بیست',\n 30: 'سی',\n 40: 'چهل',\n 50: 'پنجاه',\n 60: 'شصت',\n 70: 'هفتاد',\n 80: 'هشتاد',\n 90: 'نود'\n }\n\n /**\n * Words for hundreds (100-900).\n * @type {Object.<number, string>}\n */\n hundredsWords = {\n 100: 'صد',\n 200: 'دویست',\n 300: 'سيصد',\n 400: 'چهار صد',\n 500: 'پانصد',\n 600: 'ششصد',\n 700: 'هفتصد',\n 800: 'هشتصد',\n 900: 'نهصد'\n }\n\n /**\n * Scale magnitude words.\n * @type {Object.<number, string>}\n */\n scaleWords = {\n 1000: 'هزار',\n 1_000_000: 'میلیون'\n }\n\n /** Converts integer part using categorized word tables. */\n integerToWords (integerPart) {\n // Zero\n if (integerPart === 0n) {\n return this.zeroWord\n }\n\n // 1-9\n if (integerPart <= 9n) {\n return this.onesWords[integerPart]\n }\n\n // 10-19\n if (integerPart <= 19n) {\n return this.teensWords[integerPart]\n }\n\n // 20-99\n if (integerPart < 100n) {\n const ones = integerPart % 10n\n const tens = integerPart - ones\n if (ones === 0n) {\n return this.tensWords[tens]\n }\n return `${this.tensWords[tens]} و ${this.onesWords[ones]}`\n }\n\n // 100-999\n if (integerPart < 1000n) {\n const hundreds = 100n * (integerPart / 100n)\n const remainder = integerPart - hundreds\n if (remainder === 0n) {\n return this.hundredsWords[hundreds]\n }\n return `${this.hundredsWords[hundreds]} و ${this.integerToWords(remainder)}`\n }\n\n // 1000-999999\n if (integerPart < 1_000_000n) {\n const thousandMultiplier = integerPart / 1000n\n // Persian omits \"one\" before thousand: 1000 is just \"هزار\", not \"یک هزار\"\n const thousandPrefix = thousandMultiplier === 1n\n ? ''\n : this.integerToWords(thousandMultiplier) + ' '\n const remainder = integerPart % 1000n\n const suffix = remainder === 0n ? '' : ' ' + this.integerToWords(remainder)\n return `${thousandPrefix}${this.scaleWords[1000]}${suffix}`\n }\n\n // 1000000+\n const millionMultiplier = integerPart / 1_000_000n\n const millionPrefix = this.integerToWords(millionMultiplier) + ' ' + this.scaleWords[1_000_000]\n const remainder = integerPart % 1_000_000n\n const suffix = remainder === 0n ? '' : ' و ' + this.integerToWords(remainder)\n return `${millionPrefix}${suffix}`\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Polish language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Polish-specific declension patterns\n * - Distinctive Polish phonology and orthography\n */\nexport class Polish extends SlavicLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'przecinek'\n zeroWord = 'zero'\n\n onesWords = {\n 1: 'jeden',\n 2: 'dwa',\n 3: 'trzy',\n 4: 'cztery',\n 5: 'pięć',\n 6: 'sześć',\n 7: 'siedem',\n 8: 'osiem',\n 9: 'dziewięć'\n }\n\n onesFeminineWords = {\n 1: 'jedna',\n 2: 'dwie',\n 3: 'trzy',\n 4: 'cztery',\n 5: 'pięć',\n 6: 'sześć',\n 7: 'siedem',\n 8: 'osiem',\n 9: 'dziewięć'\n }\n\n teensWords = {\n 0: 'dziesięć',\n 1: 'jedenaście',\n 2: 'dwanaście',\n 3: 'trzynaście',\n 4: 'czternaście',\n 5: 'piętnaście',\n 6: 'szesnaście',\n 7: 'siedemnaście',\n 8: 'osiemnaście',\n 9: 'dziewiętnaście'\n }\n\n twentiesWords = {\n 2: 'dwadzieścia',\n 3: 'trzydzieści',\n 4: 'czterdzieści',\n 5: 'pięćdziesiąt',\n 6: 'sześćdziesiąt',\n 7: 'siedemdziesiąt',\n 8: 'osiemdziesiąt',\n 9: 'dziewięćdziesiąt'\n }\n\n hundredsWords = {\n 1: 'sto',\n 2: 'dwieście',\n 3: 'trzysta',\n 4: 'czterysta',\n 5: 'pięćset',\n 6: 'sześćset',\n 7: 'siedemset',\n 8: 'osiemset',\n 9: 'dziewięćset'\n }\n\n pluralForms = {\n 1: ['tysiąc', 'tysiące', 'tysięcy'], // 10^ 3\n 2: ['milion', 'miliony', 'milionów'], // 10^ 6\n 3: ['miliard', 'miliardy', 'miliardów'], // 10^ 9\n 4: ['bilion', 'biliony', 'bilionów'], // 10^ 12\n 5: ['biliard', 'biliardy', 'biliardów'], // 10^ 15\n 6: ['trylion', 'tryliony', 'trylionów'], // 10^ 18\n 7: ['tryliard', 'tryliardy', 'tryliardów'], // 10^ 21\n 8: ['kwadrylion', 'kwadryliony', 'kwadrylionów'], // 10^ 24\n 9: ['kwaryliard', 'kwadryliardy', 'kwadryliardów'], // 10^ 27\n 10: ['kwintylion', 'kwintyliony', 'kwintylionów'] // 10^ 30\n }\n\n /**\n * Polish omits \"one\" before scale words.\n * e.g., 1000 is \"tysiąc\" not \"jeden tysiąc\"\n */\n omitOneBeforeScale = true\n\n /** Implements Polish-specific three-form pluralization rules. */\n pluralize (n, forms) {\n if (n === 1n) {\n return forms[0]\n }\n\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if (lastDigit < 5n && lastDigit > 1n && (lastTwoDigits < 10n || lastTwoDigits > 20n)) {\n return forms[1]\n }\n\n return forms[2]\n }\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Punjabi language converter.\n *\n * Supports:\n * - Indian numbering system (ਹਜ਼ਾਰ, ਲੱਖ, ਕਰੋੜ)\n * - Gurmukhi script\n * - Complete word forms for 0-99\n */\nexport class Punjabi extends SouthAsianLanguage {\n negativeWord = 'ਮਾਇਨਸ'\n decimalSeparatorWord = 'ਦਸ਼ਮਲਵ'\n zeroWord = 'ਸਿਫ਼ਰ'\n hundredWord = 'ਸੌ'\n\n belowHundredWords = [\n 'ਸਿਫ਼ਰ',\n 'ਇੱਕ',\n 'ਦੋ',\n 'ਤਿੰਨ',\n 'ਚਾਰ',\n 'ਪੰਜ',\n 'ਛੇ',\n 'ਸੱਤ',\n 'ਅੱਠ',\n 'ਨੌਂ',\n 'ਦੱਸ',\n 'ਗਿਆਰਾਂ',\n 'ਬਾਰਾਂ',\n 'ਤੇਰਾਂ',\n 'ਚੌਦਾਂ',\n 'ਪੰਦਰਾਂ',\n 'ਸੋਲਾਂ',\n 'ਸਤਾਰਾਂ',\n 'ਅਠਾਰਾਂ',\n 'ਉੱਨੀ',\n 'ਵੀਹ',\n 'ਇੱਕੀ',\n 'ਬਾਈ',\n 'ਤੇਈ',\n 'ਚੌਬੀ',\n 'ਪੱਚੀ',\n 'ਛੱਬੀ',\n 'ਸਤਾਈ',\n 'ਅਠਾਈ',\n 'ਉਨੱਤੀ',\n 'ਤੀਹ',\n 'ਇਕੱਤੀ',\n 'ਬੱਤੀ',\n 'ਤੇਤੀ',\n 'ਚੌਂਤੀ',\n 'ਪੈਂਤੀ',\n 'ਛੱਤੀ',\n 'ਸੈਂਤੀ',\n 'ਅਠੱਤੀ',\n 'ਉਨਤਾਲੀ',\n 'ਚਾਲੀ',\n 'ਇਕਤਾਲੀ',\n 'ਬਿਆਲੀ',\n 'ਤਿਰਤਾਲੀ',\n 'ਚੁਵਾਲੀ',\n 'ਪੰਤਾਲੀ',\n 'ਛਿਆਲੀ',\n 'ਸੈਂਤਾਲੀ',\n 'ਅਠਤਾਲੀ',\n 'ਉਨੰਜਾ',\n 'ਪੰਜਾਹ',\n 'ਇਕਵੰਜਾ',\n 'ਬਵੰਜਾ',\n 'ਤਰਵੰਜਾ',\n 'ਚੁਰਵੰਜਾ',\n 'ਪੰਜਵੰਜਾ',\n 'ਛਪੰਜਾ',\n 'ਸੱਤਵੰਜਾ',\n 'ਅਠਵੰਜਾ',\n 'ਉਨਾਹਠ',\n 'ਸੱਠ',\n 'ਇਕਾਹਠ',\n 'ਬਾਹਠ',\n 'ਤਰਸਠ',\n 'ਚੌਂਸਠ',\n 'ਪੈਂਸਠ',\n 'ਛਿਆਸਠ',\n 'ਸੜਸਠ',\n 'ਅੜਸਠ',\n 'ਉਣਹੱਤਰ',\n 'ਸਤੱਰ',\n 'ਇਕਹੱਤਰ',\n 'ਬਹੱਤਰ',\n 'ਤਹੱਤਰ',\n 'ਚੌਹੱਤਰ',\n 'ਪੰਝਹੱਤਰ',\n 'ਛਿਹੱਤਰ',\n 'ਸਤੱਤਰ',\n 'ਅਠੱਤਰ',\n 'ਉਨਾਸੀ',\n 'ਅੱਸੀ',\n 'ਇਕਿਆਸੀ',\n 'ਬਿਆਸੀ',\n 'ਤਰਿਆਸੀ',\n 'ਚੌਰਿਆਸੀ',\n 'ਪਚਾਸੀ',\n 'ਛਿਆਸੀ',\n 'ਸੱਤਾਸੀ',\n 'ਅਠਾਸੀ',\n 'ਨਵਾਸੀ',\n 'ਨੱਬੇ',\n 'ਇਕਾਨਵੇਂ',\n 'ਬਾਨਵੇਂ',\n 'ਤਰਾਨਵੇਂ',\n 'ਚੁਰਾਨਵੇਂ',\n 'ਪੰਚਾਨਵੇਂ',\n 'ਛਿਆਨਵੇਂ',\n 'ਸਤਾਨਵੇਂ',\n 'ਅਠਾਨਵੇਂ',\n 'ਨਿਨਾਨਵੇਂ'\n ]\n\n scaleWords = [\n '',\n 'ਹਜ਼ਾਰ',\n 'ਲੱਖ',\n 'ਕਰੋੜ',\n 'ਅਰਬ',\n 'ਖਰਬ',\n 'ਨੀਲ',\n 'ਪਦਮ',\n 'ਸ਼ੰਖ'\n ]\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Romanian language converter.\n *\n * Supports:\n * - Gender agreement (unu/una, doi/două)\n * - Complex pluralization (singular/plural forms)\n * - \"De\" preposition insertion for groups >= 20\n */\nexport class Romanian extends AbstractLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'virgulă'\n zeroWord = 'zero'\n\n onesWords = {\n 1: 'unu',\n 2: 'doi',\n 3: 'trei',\n 4: 'patru',\n 5: 'cinci',\n 6: 'șase',\n 7: 'șapte',\n 8: 'opt',\n 9: 'nouă'\n }\n\n onesFeminineWords = {\n 1: 'una',\n 2: 'două',\n 3: 'trei',\n 4: 'patru',\n 5: 'cinci',\n 6: 'șase',\n 7: 'șapte',\n 8: 'opt',\n 9: 'nouă'\n }\n\n teensWords = {\n 0: 'zece',\n 1: 'unsprezece',\n 2: 'douăsprezece',\n 3: 'treisprezece',\n 4: 'paisprezece',\n 5: 'cincisprezece',\n 6: 'șaisprezece',\n 7: 'șaptesprezece',\n 8: 'optsprezece',\n 9: 'nouăsprezece'\n }\n\n teensMasculineWords = {\n 0: 'zece',\n 1: 'unsprezece',\n 2: 'doisprezece',\n 3: 'treisprezece',\n 4: 'paisprezece',\n 5: 'cincisprezece',\n 6: 'șaisprezece',\n 7: 'șaptesprezece',\n 8: 'optsprezece',\n 9: 'nouăsprezece'\n }\n\n twentiesWords = {\n 2: 'douăzeci',\n 3: 'treizeci',\n 4: 'patruzeci',\n 5: 'cincizeci',\n 6: 'șaizeci',\n 7: 'șaptezeci',\n 8: 'optzeci',\n 9: 'nouăzeci'\n }\n\n hundredsWords = {\n 1: 'o sută',\n 2: 'două sute',\n 3: 'trei sute',\n 4: 'patru sute',\n 5: 'cinci sute',\n 6: 'șase sute',\n 7: 'șapte sute',\n 8: 'opt sute',\n 9: 'nouă sute'\n }\n\n /**\n * Romanian big units.\n * For each power group we keep: singular, plural, feminineUnits?, needsDe?\n * - 10^3: mie/mii (feminine units in segment; \"de\" for segment >= 20)\n * - 10^6: milion/milioane (\"de\" for segment >= 20)\n * - 10^9: miliard/miliarde (\"de\" for segment >= 20)\n */\n scaleMetadata = {\n 1: { singular: 'mie', plural: 'mii', feminine: true, needsDe: true }, // 10^3\n 2: { singular: 'milion', plural: 'milioane', feminine: false, needsDe: true }, // 10^6\n 3: { singular: 'miliard', plural: 'miliarde', feminine: false, needsDe: true }, // 10^9\n 4: { singular: 'trilion', plural: 'trilioane', feminine: false, needsDe: true }, // 10^12\n 5: { singular: 'cvadrilion', plural: 'cvadrilioane', feminine: false, needsDe: true }, // 10^15\n 6: { singular: 'cvintilion', plural: 'cvintilioane', feminine: false, needsDe: true }, // 10^18\n 7: { singular: 'sextilion', plural: 'sextilioane', feminine: false, needsDe: true }, // 10^21\n 8: { singular: 'septilion', plural: 'septilioane', feminine: false, needsDe: true }, // 10^24\n 9: { singular: 'octilion', plural: 'octilioane', feminine: false, needsDe: true }, // 10^27\n 10: { singular: 'decilion', plural: 'decilioane', feminine: false, needsDe: true } // 10^33\n }\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n gender: 'masculine'\n }, options)\n }\n\n /** Split numeric string into BigInt segments of specified size from left to right. */\n splitToSegments (n, x) {\n const results = []\n const l = n.length\n let result\n\n if (l > x) {\n const start = l % x\n if (start > 0) {\n result = n.slice(0, start)\n results.push(BigInt(result))\n }\n for (let index = start; index < l; index += x) {\n result = n.slice(index, index + x)\n results.push(BigInt(result))\n }\n } else {\n results.push(BigInt(n))\n }\n return results\n }\n\n extractDigits (value) {\n const stringValue = value.toString().padStart(3, '0').slice(-3)\n const a = [...stringValue].toReversed()\n return a.map(BigInt)\n }\n\n /** Romanian pluralization & \"de\" rule for big units. */\n romanianPluralize (segment, form) {\n const n = Number(segment)\n\n if (n === 1) {\n // article differs for feminine \"mie\" (o mie) vs the rest (un milion/miliard…)\n const article = form.feminine ? 'o' : 'un'\n return `${article} ${form.singular}`\n }\n\n // For 21 with big units, use feminine \"una\" with plural nouns\n if (n === 21 && form.needsDe) {\n return `douăzeci și una de ${form.plural}`\n }\n\n // spell the segment itself (use feminine units for big numbers)\n const words = this.spellUnder1000(n, true)\n\n // \"de\" after >= 20 (covers 20, 21, 100, 101, 999, etc.)\n const needsDe = form.needsDe && n >= 20\n const de = needsDe ? ' de ' : ' '\n\n return `${words}${de}${form.plural}`\n }\n\n spellUnder100 (n, feminineUnits = false, masculineTeens = false) {\n if (n < 10) {\n return (feminineUnits ? this.onesFeminineWords : this.onesWords)[n]\n }\n if (n < 20) {\n return (masculineTeens ? this.teensMasculineWords : this.teensWords)[n - 10]\n }\n const t = Math.floor(n / 10)\n const u = n % 10\n return u\n ? `${this.twentiesWords[t]} și ${(feminineUnits ? this.onesFeminineWords : this.onesWords)[u]}`\n : this.twentiesWords[t]\n }\n\n spellUnder1000 (n, feminineUnits = false, masculineTeens = false) {\n if (n < 100) return this.spellUnder100(n, feminineUnits, masculineTeens)\n const h = Math.floor(n / 100)\n const r = n % 100\n const hundredWords = this.hundredsWords[h]\n if (!r) return hundredWords\n // Standard readable form: \"o sută unu\" (for units) or \"o sută cincizeci\" (for tens)\n const separator = ' '\n return `${hundredWords}${separator}${this.spellUnder100(r, feminineUnits, masculineTeens)}`\n }\n\n /** Decimals always use masculine forms regardless of gender option. */\n decimalIntegerToWords (integerPart) {\n if (integerPart === 0n) return this.zeroWord\n // Use spellUnder1000 with masculine forms (feminineUnits=false, masculineTeens=true)\n if (integerPart < 1000n) return this.spellUnder1000(Number(integerPart), false, true)\n // For larger decimals, process segments with masculine forms\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let index = segments.length\n for (const x of segments) {\n index = index - 1\n if (x === 0n) continue\n const [n1, n2, n3] = this.extractDigits(x)\n if (n3 > 0n) words.push(this.hundredsWords[Number(n3)])\n if (n2 > 1n) words.push(this.twentiesWords[Number(n2)])\n if (n2 === 1n) {\n words.push(this.teensMasculineWords[Number(n1)])\n } else if (n1 > 0n) {\n if (n2 > 1n) words.push('și')\n words.push(this.onesWords[Number(n1)])\n }\n if (index > 0) {\n const form = this.scaleMetadata[index]\n if (form) {\n words.push(this.romanianPluralize(x, form))\n } else {\n words.push(this.spellUnder1000(Number(x), false))\n }\n }\n }\n return words.join(' ').replaceAll(/\\s+/g, ' ').trim()\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let index = segments.length\n for (const x of segments) {\n let onesMap = []\n index = index - 1\n if (x === 0n) continue\n const [n1, n2, n3] = this.extractDigits(x) // units, tens, hundreds (as BigInt)\n // hundreds (only for the last group, not for thousands)\n if (n3 > 0n && index === 0) {\n words.push(this.hundredsWords[Number(n3)])\n }\n // tens & teens (only for the last group, not for thousands)\n if (index === 0) {\n if (n2 > 1n) {\n words.push(this.twentiesWords[Number(n2)])\n }\n if (n2 === 1n) {\n words.push(this.teensWords[Number(n1)])\n } else if (n1 > 0n) {\n // pick masculine/feminine units (only for the last group, not for thousands)\n const feminineUnits = this.options.gender === 'feminine' && index === 0\n onesMap = feminineUnits ? this.onesFeminineWords : this.onesWords\n // if there is a twenty/treizeci/etc AND ones > 0 → add \"și\"\n if (n2 > 1n) words.push('și')\n words.push(onesMap[Number(n1)])\n }\n }\n // big unit name (mie/mii, milion/milioane, …)\n if (index > 0) {\n const form = this.scaleMetadata[index]\n if (form) {\n words.push(this.romanianPluralize(x, form))\n } else {\n // For very large numbers beyond our defined units, just spell out the number\n words.push(this.spellUnder1000(Number(x), true))\n }\n }\n }\n return words.join(' ').replaceAll(/\\s+/g, ' ').trim()\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Russian language converter.\n *\n * Supports:\n * - Gender agreement (masculine/feminine forms)\n * - Three-form pluralization (one/few/many)\n * - Large numbers up to nonillions\n */\nexport class Russian extends SlavicLanguage {\n negativeWord = 'минус'\n decimalSeparatorWord = 'запятая'\n zeroWord = 'ноль'\n\n onesWords = {\n 1: 'один',\n 2: 'два',\n 3: 'три',\n 4: 'четыре',\n 5: 'пять',\n 6: 'шесть',\n 7: 'семь',\n 8: 'восемь',\n 9: 'девять'\n }\n\n onesFeminineWords = {\n 1: 'одна',\n 2: 'две',\n 3: 'три',\n 4: 'четыре',\n 5: 'пять',\n 6: 'шесть',\n 7: 'семь',\n 8: 'восемь',\n 9: 'девять'\n }\n\n teensWords = {\n 0: 'десять',\n 1: 'одиннадцать',\n 2: 'двенадцать',\n 3: 'тринадцать',\n 4: 'четырнадцать',\n 5: 'пятнадцать',\n 6: 'шестнадцать',\n 7: 'семнадцать',\n 8: 'восемнадцать',\n 9: 'девятнадцать'\n }\n\n twentiesWords = {\n 2: 'двадцать',\n 3: 'тридцать',\n 4: 'сорок',\n 5: 'пятьдесят',\n 6: 'шестьдесят',\n 7: 'семьдесят',\n 8: 'восемьдесят',\n 9: 'девяносто'\n }\n\n hundredsWords = {\n 1: 'сто',\n 2: 'двести',\n 3: 'триста',\n 4: 'четыреста',\n 5: 'пятьсот',\n 6: 'шестьсот',\n 7: 'семьсот',\n 8: 'восемьсот',\n 9: 'девятьсот'\n }\n\n pluralForms = {\n 1: ['тысяча', 'тысячи', 'тысяч'], // 10^ 3\n 2: ['миллион', 'миллиона', 'миллионов'], // 10^ 6\n 3: ['миллиард', 'миллиарда', 'миллиардов'], // 10^ 9\n 4: ['триллион', 'триллиона', 'триллионов'], // 10^ 12\n 5: ['квадриллион', 'квадриллиона', 'квадриллионов'], // 10^ 15\n 6: ['квинтиллион', 'квинтиллиона', 'квинтиллионов'], // 10^ 18\n 7: ['секстиллион', 'секстиллиона', 'секстиллионов'], // 10^ 21\n 8: ['септиллион', 'септиллиона', 'септиллионов'], // 10^ 24\n 9: ['октиллион', 'октиллиона', 'октиллионов'], // 10^ 27\n 10: ['нониллион', 'нониллиона', 'нониллионов'] // 10^ 30\n }\n\n /**\n * Russian thousands (тысяча) are feminine, requiring одна/две forms.\n * Other scales (million, billion, etc.) are masculine.\n */\n scaleGenders = {\n 1: true // thousands are feminine\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Serbian language converter (Cyrillic script).\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Gender agreement (један/једна, два/две)\n * - Cyrillic script representation\n */\nexport class SerbianCyrillic extends SlavicLanguage {\n negativeWord = 'минус'\n decimalSeparatorWord = 'запета'\n zeroWord = 'нула'\n\n onesWords = {\n 1: 'један',\n 2: 'два',\n 3: 'три',\n 4: 'четири',\n 5: 'пет',\n 6: 'шест',\n 7: 'седам',\n 8: 'осам',\n 9: 'девет'\n }\n\n onesFeminineWords = {\n 1: 'једна',\n 2: 'две',\n 3: 'три',\n 4: 'четири',\n 5: 'пет',\n 6: 'шест',\n 7: 'седам',\n 8: 'осам',\n 9: 'девет'\n }\n\n teensWords = {\n 0: 'десет',\n 1: 'једанаест',\n 2: 'дванаест',\n 3: 'тринаест',\n 4: 'четрнаест',\n 5: 'петнаест',\n 6: 'шеснаест',\n 7: 'седамнаест',\n 8: 'осамнаест',\n 9: 'деветнаест'\n }\n\n twentiesWords = {\n 2: 'двадесет',\n 3: 'тридесет',\n 4: 'четрдесет',\n 5: 'педесет',\n 6: 'шездесет',\n 7: 'седамдесет',\n 8: 'осамдесет',\n 9: 'деведесет'\n }\n\n hundredsWords = {\n 1: 'сто',\n 2: 'двеста',\n 3: 'триста',\n 4: 'четиристо',\n 5: 'петсто',\n 6: 'шесто',\n 7: 'седамсто',\n 8: 'осамсто',\n 9: 'девестo'\n }\n\n pluralForms = {\n 1: ['хиљада', 'хиљаде', 'хиљада'], // 10 ^ 3\n 2: ['милион', 'милиона', 'милиона'], // 10 ^ 6\n 3: ['милијарда', 'милијарде', 'милијарда'], // 10 ^ 9\n 4: ['билион', 'билиона', 'билиона'], // 10 ^ 12\n 5: ['билијарда', 'билијарде', 'билијарда'], // 10 ^ 15\n 6: ['трилион', 'трилиона', 'трилиона'], // 10 ^ 18\n 7: ['трилијарда', 'трилијарде', 'трилијарда'], // 10 ^ 21\n 8: ['квадрилион', 'квадрилиона', 'квадрилиона'], // 10 ^ 24\n 9: ['квадрилијарда', 'квадрилијарде', 'квадрилијарда'], // 10 ^ 27\n 10: ['квинтилион', 'квинтилиона', 'квинтилиона'] // 10 ^ 30\n }\n\n /**\n * Maps segment indices to whether they are grammatically feminine.\n * In Serbian, thousands (index 1) are feminine, others are masculine.\n * @type {Object.<number, boolean>}\n */\n scaleGenders = {\n 1: true // thousands are feminine (others default to false)\n }\n\n /** Selects Serbian plural form: 1 = singular, 2-4 = few, else = many. */\n pluralize (n, forms) {\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit === 1n) {\n return forms[0]\n }\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit > 1n && lastDigit < 5n) {\n return forms[1]\n }\n\n return forms[2]\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Serbian Latin language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Gender agreement (jedan/jedna, dva/dve)\n * - Latin script representation\n */\nexport class SerbianLatin extends SlavicLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'zapeta'\n zeroWord = 'nula'\n\n onesWords = {\n 1: 'jedan',\n 2: 'dva',\n 3: 'tri',\n 4: 'četiri',\n 5: 'pet',\n 6: 'šest',\n 7: 'sedam',\n 8: 'osam',\n 9: 'devet'\n }\n\n onesFeminineWords = {\n 1: 'jedna',\n 2: 'dve',\n 3: 'tri',\n 4: 'četiri',\n 5: 'pet',\n 6: 'šest',\n 7: 'sedam',\n 8: 'osam',\n 9: 'devet'\n }\n\n teensWords = {\n 0: 'deset',\n 1: 'jedanaest',\n 2: 'dvanaest',\n 3: 'trinaest',\n 4: 'četrnaest',\n 5: 'petnaest',\n 6: 'šesnaest',\n 7: 'sedamnaest',\n 8: 'osamnaest',\n 9: 'devetnaest'\n }\n\n twentiesWords = {\n 2: 'dvadeset',\n 3: 'trideset',\n 4: 'četrdeset',\n 5: 'pedeset',\n 6: 'šezdeset',\n 7: 'sedamdeset',\n 8: 'osamdeset',\n 9: 'devedeset'\n }\n\n hundredsWords = {\n 1: 'sto',\n 2: 'dvesta',\n 3: 'trista',\n 4: 'četiristo',\n 5: 'petsto',\n 6: 'šesto',\n 7: 'sedamsto',\n 8: 'osamsto',\n 9: 'devetsto'\n }\n\n pluralForms = {\n 1: ['hiljada', 'hiljade', 'hiljada'], // 10 ^ 3\n 2: ['milion', 'miliona', 'miliona'], // 10 ^ 6\n 3: ['milijarda', 'milijarde', 'milijarda'], // 10 ^ 9\n 4: ['bilion', 'biliona', 'biliona'], // 10 ^ 12\n 5: ['bilijarda', 'bilijarde', 'bilijarda'], // 10 ^ 15\n 6: ['trilion', 'triliona', 'triliona'], // 10 ^ 18\n 7: ['trilijarda', 'trilijarde', 'trilijarda'], // 10 ^ 21\n 8: ['kvadrilion', 'kvadriliona', 'kvadriliona'], // 10 ^ 24\n 9: ['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda'], // 10 ^ 27\n 10: ['kvintilion', 'kvintiliona', 'kvintiliona'] // 10 ^ 30\n }\n\n /**\n * Maps segment indices to whether they are grammatically feminine.\n * In Serbian, thousands (index 1) are feminine, others are masculine.\n * @type {Object.<number, boolean>}\n */\n scaleGenders = {\n 1: true // thousands are feminine (others default to false)\n }\n\n /** Selects Serbian plural form: 1 = singular, 2-4 = few, else = many. */\n pluralize (n, forms) {\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit === 1n) {\n return forms[0]\n }\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit > 1n && lastDigit < 5n) {\n return forms[1]\n }\n\n return forms[2]\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Simplified Chinese language converter.\n *\n * Supports:\n * - Simplified Chinese characters (简体中文)\n * - No word separators (concatenated format)\n * - Optional formal (financial) vs common numerals\n */\nexport class SimplifiedChinese extends GreedyScaleLanguage {\n negativeWord = '负'\n decimalSeparatorWord = '点'\n zeroWord = '零'\n wordSeparator = ''\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n formal: true\n }, options)\n\n if (this.options.formal) {\n this.scaleWords = [\n [1_000_000_000_000n, '万'],\n [100_000_000n, '亿'],\n [10_000n, '万'],\n [1000n, '仟'],\n [100n, '佰'],\n [10n, '拾'],\n [9n, '玖'],\n [8n, '捌'],\n [7n, '柒'],\n [6n, '陆'],\n [5n, '伍'],\n [4n, '肆'],\n [3n, '叁'],\n [2n, '贰'],\n [1n, '壹'],\n [0n, '零']\n ]\n } else {\n this.scaleWords = [\n [1_000_000_000_000n, '万'],\n [100_000_000n, '亿'],\n [10_000n, '万'],\n [1000n, '千'],\n [100n, '百'],\n [10n, '十'],\n [9n, '九'],\n [8n, '八'],\n [7n, '七'],\n [6n, '六'],\n [5n, '五'],\n [4n, '四'],\n [3n, '三'],\n [2n, '二'],\n [1n, '一'],\n [0n, '零']\n ]\n }\n }\n\n /** Combines two word-sets according to Chinese grammar rules. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const followingValue = Object.values(following)[0]\n\n // Implicit one: omit 1 before single digits (< 10)\n if (precedingValue === 1n && followingValue < 10n) {\n return following\n }\n\n // Multiply when following > preceding (scale words like 仁, 万, 亿)\n if (followingValue > precedingValue) {\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n\n // Insert \"零\" (zero) when position skip levels (e.g., 1003 = 千零三)\n // zeroDigit() checks if gap exists between preceding and following magnitude\n if (this.zeroDigit(precedingValue) > this.digit(followingValue)) {\n return { [`${precedingWord}${this.zeroWord}${followingWord}`]: precedingValue + followingValue }\n }\n\n // Default: concatenate without zero insertion\n return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }\n }\n\n /** Returns the number of digits in a number. */\n digit (number_) {\n return number_.toString().length\n }\n\n /** Counts the number of zero digits in a number. */\n zeroDigit (number_) {\n return [...number_.toString()].filter(c => c === '0').length\n }\n\n /** Converts decimal digits to words by reading each digit individually. */\n decimalDigitsToWords (decimalString) {\n const words = []\n for (let i = 0; i < decimalString.length; i++) {\n const digitValue = BigInt(decimalString[i])\n words.push(this.integerToWords(digitValue))\n }\n return words\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Spanish language converter.\n *\n * Supports:\n * - Gender agreement (masculine/feminine via genderStem option)\n * - \"y\" conjunction between tens and units\n * - Special hundred forms (cien/ciento)\n */\nexport class Spanish extends GreedyScaleLanguage {\n negativeWord = 'menos'\n decimalSeparatorWord = 'punto'\n zeroWord = 'cero'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000n, 'cuatrillón'],\n [1_000_000_000_000_000_000n, 'trillón'],\n [1_000_000_000_000n, 'billón'],\n [1_000_000n, 'millón'],\n [1000n, 'mil'],\n [100n, 'cien'],\n [90n, 'noventa'],\n [80n, 'ochenta'],\n [70n, 'setenta'],\n [60n, 'sesenta'],\n [50n, 'cincuenta'],\n [40n, 'cuarenta'],\n [30n, 'treinta'],\n [29n, 'veintinueve'],\n [28n, 'veintiocho'],\n [27n, 'veintisiete'],\n [26n, 'veintiséis'],\n [25n, 'veinticinco'],\n [24n, 'veinticuatro'],\n [23n, 'veintitrés'],\n [22n, 'veintidós'],\n [21n, 'veintiuno'],\n [20n, 'veinte'],\n [19n, 'diecinueve'],\n [18n, 'dieciocho'],\n [17n, 'diecisiete'],\n [16n, 'dieciseis'],\n [15n, 'quince'],\n [14n, 'catorce'],\n [13n, 'trece'],\n [12n, 'doce'],\n [11n, 'once'],\n [10n, 'diez'],\n [9n, 'nueve'],\n [8n, 'ocho'],\n [7n, 'siete'],\n [6n, 'seis'],\n [5n, 'cinco'],\n [4n, 'cuatro'],\n [3n, 'tres'],\n [2n, 'dos'],\n [1n, 'uno'],\n [0n, 'cero']\n ]\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n gender: 'masculine'\n }, options)\n\n // Apply gender agreement to scale words if feminine\n if (this.options.gender === 'feminine') {\n this.scaleWords = this.scaleWords.map(([value, word]) => {\n if (word === 'veintiuno') return [value, 'veintiuna']\n if (word === 'uno') return [value, 'una']\n return [value, word]\n })\n }\n }\n\n /** Combines two word-sets with Spanish gender and conjunction rules. */\n combineWordSets (preceding, following) {\n let precedingWord = Object.keys(preceding)[0]\n let followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingValue = Object.values(following)[0]\n const genderStem = this.options.gender === 'feminine' ? 'a' : 'o'\n\n if (precedingValue === 1n) {\n if (followingValue < 1_000_000n) return following\n precedingWord = 'un'\n } else if (precedingValue === 100n && followingValue % 1000n !== 0n) {\n precedingWord += 't' + genderStem\n }\n\n if (followingValue < precedingValue) {\n if (precedingValue < 100n) {\n return { [`${precedingWord} y ${followingWord}`]: precedingValue + followingValue }\n }\n return { [`${precedingWord} ${followingWord}`]: precedingValue + followingValue }\n }\n\n if (followingValue % 1_000_000n === 0n && precedingValue > 1n) {\n followingWord = followingWord.slice(0, -3) + 'lones'\n }\n\n if (followingValue === 100n) {\n if (precedingValue === 5n) {\n precedingWord = 'quinien'\n followingWord = ''\n } else if (precedingValue === 7n) {\n precedingWord = 'sete'\n } else if (precedingValue === 9n) {\n precedingWord = 'nove'\n }\n followingWord += 't' + genderStem + 's'\n } else {\n followingWord = ' ' + followingWord\n }\n\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Swahili language converter.\n *\n * Supports:\n * - Swahili number words (moja, mbili, tatu)\n * - Space-separated components\n * - Simple decimal point notation\n */\nexport class Swahili extends AbstractLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'nukta'\n zeroWord = 'sifuri'\n\n onesWords = {\n 0: 'sifuri',\n 1: 'moja',\n 2: 'mbili',\n 3: 'tatu',\n 4: 'nne',\n 5: 'tano',\n 6: 'sita',\n 7: 'saba',\n 8: 'nane',\n 9: 'tisa'\n }\n\n tensWords = {\n 10: 'kumi',\n 20: 'ishirini',\n 30: 'thelathini',\n 40: 'arobaini',\n 50: 'hamsini',\n 60: 'sitini',\n 70: 'sabini',\n 80: 'themanini',\n 90: 'tisini'\n }\n\n scaleWords = [\n '',\n 'elfu',\n 'milioni',\n 'bilioni',\n 'trilioni'\n ]\n\n wordsUnder100 (n) {\n if (n < 10) return this.onesWords[n]\n if (n === 10) return this.tensWords[10]\n if (n < 20) {\n // 11-19: 'kumi na <digit>'\n return this.tensWords[10] + ' na ' + this.onesWords[n - 10]\n }\n const tens = Math.trunc(n / 10) * 10\n const ones = n % 10\n if (ones === 0) return this.tensWords[tens]\n return this.tensWords[tens] + ' na ' + this.onesWords[ones]\n }\n\n wordsUnder1000 (n) {\n if (n < 100) return this.wordsUnder100(n)\n if (n === 100) return 'mia moja'\n const hundreds = Math.trunc(n / 100)\n const rest = n % 100\n const parts = []\n\n // Hundreds: 'mia <digit>'\n parts.push('mia ' + this.onesWords[hundreds])\n if (rest > 0) {\n if (rest < 10) {\n parts.push('na ' + this.onesWords[rest])\n } else {\n parts.push(this.wordsUnder100(rest))\n }\n }\n\n return parts.join(' ')\n }\n\n splitBy3 (number) {\n const s = number.toString()\n if (s.length <= 3) return [Number(s)]\n const groups = []\n const last3 = s.slice(-3)\n groups.unshift(Number(last3))\n let remaining = s.slice(0, -3)\n while (remaining.length > 0) {\n const group = remaining.slice(-3)\n groups.unshift(Number(group))\n remaining = remaining.slice(0, -3)\n }\n return groups\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) return this.zeroWord\n\n const groups = this.splitBy3(integerPart)\n const parts = []\n\n for (let i = 0; i < groups.length; i++) {\n const val = groups[i]\n if (val === 0) continue\n const scaleIndex = groups.length - i - 1\n // scale word\n if (scaleIndex === 0) {\n if (val < 10 && parts.length > 0) {\n parts.push('na ' + this.onesWords[val])\n } else if (val === 100 && parts.length > 0) {\n // In compound numbers (e.g., 1100 -> 'elfu moja mia'), use 'mia' not 'mia moja'\n parts.push('mia')\n } else {\n parts.push(this.wordsUnder1000(val))\n }\n } else {\n // e.g., 'elfu moja', 'milioni mbili'\n const unit = (val === 1) ? 'moja' : this.wordsUnder1000(val)\n parts.push(this.scaleWords[scaleIndex] + ' ' + unit)\n }\n }\n\n return parts.join(' ').trim()\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Swedish language converter.\n *\n * Supports:\n * - Hyphenation for compound tens (tjugo-tre)\n * - \"och\" (and) after hundreds\n * - Space-separated larger composites\n */\nexport class Swedish extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'komma'\n zeroWord = 'noll'\n wordSeparator = ' '\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'kvadriljon'],\n [1_000_000_000_000_000_000_000_000n, 'triljon'],\n [1_000_000_000_000_000_000_000n, 'biljon'],\n [1_000_000_000_000_000_000n, 'miljard'],\n [1_000_000_000_000n, 'biljon'],\n [1_000_000_000n, 'miljard'],\n [1_000_000n, 'miljon'],\n [1000n, 'tusen'],\n [100n, 'hundra'],\n [90n, 'nittio'],\n [80n, 'åttio'],\n [70n, 'sjuttio'],\n [60n, 'sextio'],\n [50n, 'femtio'],\n [40n, 'fyrtio'],\n [30n, 'trettio'],\n [20n, 'tjugo'],\n [19n, 'nitton'],\n [18n, 'arton'],\n [17n, 'sjutton'],\n [16n, 'sexton'],\n [15n, 'femton'],\n [14n, 'fjorton'],\n [13n, 'tretton'],\n [12n, 'tolv'],\n [11n, 'elva'],\n [10n, 'tio'],\n [9n, 'nio'],\n [8n, 'åtta'],\n [7n, 'sju'],\n [6n, 'sex'],\n [5n, 'fem'],\n [4n, 'fyra'],\n [3n, 'tre'],\n [2n, 'två'],\n [1n, 'ett'],\n [0n, 'noll']\n ]\n\n /** Combines two word-sets according to Swedish grammar rules. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingValue = Object.values(following)[0]\n\n if (precedingValue === 1n && followingValue < 100n) {\n return following\n }\n\n // Omit 'ett' before 'hundra' and 'tusen'\n if (precedingValue === 1n && (followingValue === 100n || followingValue === 1000n)) {\n return following\n }\n\n if (precedingValue < 100n && precedingValue > followingValue) {\n return { [`${precedingWord}-${followingWord}`]: precedingValue + followingValue }\n }\n\n if (precedingValue >= 100n && followingValue < 100n) {\n return { [`${precedingWord} och ${followingWord}`]: precedingValue + followingValue }\n }\n\n if (followingValue > precedingValue) {\n if (precedingValue === 1n && followingValue >= 1_000_000n) {\n return { [`en ${followingWord}`]: precedingValue * followingValue }\n }\n return { [`${precedingWord} ${followingWord}`]: precedingValue * followingValue }\n }\n\n return { [`${precedingWord} ${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Tamil language converter.\n *\n * Supports:\n * - Tamil numbering system\n * - Tamil script\n * - Complete word forms for 0-99\n */\nexport class Tamil extends AbstractLanguage {\n negativeWord = 'மைனஸ்'\n decimalSeparatorWord = 'புள்ளி'\n zeroWord = 'பூஜ்ஜியம்'\n usePerDigitDecimals = true // Enable digit-by-digit decimal conversion\n\n belowHundredWords = [\n 'பூஜ்ஜியம்',\n 'ஒன்று',\n 'இரண்டு',\n 'மூன்று',\n 'நான்கு',\n 'ஐந்து',\n 'ஆறு',\n 'ஏழு',\n 'எட்டு',\n 'ஒன்பது',\n 'பத்து',\n 'பதினொன்று',\n 'பன்னிரண்டு',\n 'பதிமூன்று',\n 'பதினான்கு',\n 'பதினைந்து',\n 'பதினாறு',\n 'பதினேழு',\n 'பதினெட்டு',\n 'பத்தொன்பது',\n 'இருபது',\n 'இருபத்தொன்று',\n 'இருபத்திரண்டு',\n 'இருபத்திமூன்று',\n 'இருபத்திநான்கு',\n 'இருபத்தைந்து',\n 'இருபத்தாறு',\n 'இருபத்தேழு',\n 'இருபத்தெட்டு',\n 'இருபத்தொன்பது',\n 'முப்பது',\n 'முப்பத்தொன்று',\n 'முப்பத்திரண்டு',\n 'முப்பத்திமூன்று',\n 'முப்பத்திநான்கு',\n 'முப்பத்தைந்து',\n 'முப்பத்தாறு',\n 'முப்பத்தேழு',\n 'முப்பத்தெட்டு',\n 'முப்பத்தொன்பது',\n 'நாற்பது',\n 'நாற்பத்தொன்று',\n 'நாற்பத்திரண்டு',\n 'நாற்பத்திமூன்று',\n 'நாற்பத்திநான்கு',\n 'நாற்பத்தைந்து',\n 'நாற்பத்தாறு',\n 'நாற்பத்தேழு',\n 'நாற்பத்தெட்டு',\n 'நாற்பத்தொன்பது',\n 'ஐம்பது',\n 'ஐம்பத்தொன்று',\n 'ஐம்பத்திரண்டு',\n 'ஐம்பத்திமூன்று',\n 'ஐம்பத்திநான்கு',\n 'ஐம்பத்தைந்து',\n 'ஐம்பத்தாறு',\n 'ஐம்பத்தேழு',\n 'ஐம்பத்தெட்டு',\n 'ஐம்பத்தொன்பது',\n 'அறுபது',\n 'அறுபத்தொன்று',\n 'அறுபத்திரண்டு',\n 'அறுபத்திமூன்று',\n 'அறுபத்திநான்கு',\n 'அறுபத்தைந்து',\n 'அறுபத்தாறு',\n 'அறுபத்தேழு',\n 'அறுபத்தெட்டு',\n 'அறுபத்தொன்பது',\n 'எழுபது',\n 'எழுபத்தொன்று',\n 'எழுபத்திரண்டு',\n 'எழுபத்திமூன்று',\n 'எழுபத்திநான்கு',\n 'எழுபத்தைந்து',\n 'எழுபத்தாறு',\n 'எழுபத்தேழு',\n 'எழுபத்தெட்டு',\n 'எழுபத்தொன்பது',\n 'எண்பது',\n 'எண்பத்தொன்று',\n 'எண்பத்திரண்டு',\n 'எண்பத்திமூன்று',\n 'எண்பத்திநான்கு',\n 'எண்பத்தைந்து',\n 'எண்பத்தாறு',\n 'எண்பத்தேழு',\n 'எண்பத்தெட்டு',\n 'எண்பத்தொன்பது',\n 'தொண்ணூறு',\n 'தொண்ணூற்று ஒன்று',\n 'தொண்ணூற்று இரண்டு',\n 'தொண்ணூற்று மூன்று',\n 'தொண்ணூற்று நான்கு',\n 'தொண்ணூற்று ஐந்து',\n 'தொண்ணூற்று ஆறு',\n 'தொண்ணூற்று ஏழு',\n 'தொண்ணூற்று எட்டு',\n 'தொண்ணூற்று ஒன்பது'\n ]\n\n hundredsWords = [\n '',\n 'நூறு',\n 'இருநூறு',\n 'முன்னூறு',\n 'நானூறு',\n 'ஐநூறு',\n 'அறுநூறு',\n 'எழுநூறு',\n 'எண்நூறு',\n 'தொள்ளாயிரம்'\n ]\n\n // Ones words map 1–9 for decimal reading\n onesWords = [\n 'ஒன்று',\n 'இரண்டு',\n 'மூன்று',\n 'நான்கு',\n 'ஐந்து',\n 'ஆறு',\n 'ஏழு',\n 'எட்டு',\n 'ஒன்பது'\n ]\n\n scaleWords = [\n '',\n 'ஆயிரம்',\n 'லட்சம்',\n 'கோடி',\n 'அரபு',\n 'கராபு',\n 'நீல்',\n 'பத்ம',\n 'சங்கு'\n ]\n\n /** Convert numbers below 100 to Tamil words. */\n convertBelowHundred (number) {\n return this.belowHundredWords[number]\n }\n\n convertBelowThousand (number) {\n if (number === 0) return ''\n if (number < 100) return this.convertBelowHundred(number)\n\n const hundreds = Math.trunc(number / 100)\n const remainder = number % 100\n let hundredPart = this.hundredsWords[hundreds]\n\n if (remainder > 0) {\n if (hundredPart.endsWith('ம்')) {\n hundredPart = hundredPart.replace(/ம்$/, 'த்து')\n } else if (hundredPart.endsWith('று')) {\n hundredPart = hundredPart.slice(0, -2) + 'ற்று'\n }\n }\n\n const parts = [hundredPart]\n if (remainder > 0) {\n parts.push(this.convertBelowHundred(remainder))\n }\n\n return parts.join(' ').trim()\n }\n\n splitIndian (number) {\n const numStr = number.toString()\n if (numStr.length <= 3) return [Number(numStr)]\n\n const groups = []\n const last3 = numStr.slice(-3)\n groups.unshift(Number(last3))\n\n let remaining = numStr.slice(0, -3)\n while (remaining.length > 0) {\n const group = remaining.slice(-2)\n groups.unshift(Number(group))\n remaining = remaining.slice(0, -2)\n }\n\n return groups\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) return this.zeroWord\n\n const groups = this.splitIndian(integerPart)\n const groupCount = groups.length\n const words = []\n\n for (let i = 0; i < groupCount; i++) {\n const groupValue = groups[i]\n if (groupValue === 0) continue\n\n const scaleIndex = groupCount - i - 1\n const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ஒரு' : this.convertBelowThousand(groupValue)\n words.push(groupWords)\n if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {\n words.push(this.scaleWords[scaleIndex])\n }\n }\n\n return words.join(' ').trim()\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Telugu language converter.\n *\n * Supports:\n * - Telugu numbering system\n * - Telugu script\n * - Complete word forms for 0-99\n */\nexport class Telugu extends AbstractLanguage {\n negativeWord = 'మైనస్'\n decimalSeparatorWord = 'పాయింట్'\n zeroWord = 'సున్నా'\n usePerDigitDecimals = true // Enable digit-by-digit decimal conversion\n\n belowHundredWords = [\n 'సున్నా',\n 'ఒకటి',\n 'రెండు',\n 'మూడు',\n 'నాలుగు',\n 'ఐదు',\n 'ఆరు',\n 'ఏడు',\n 'ఎనిమిది',\n 'తొమ్మిది',\n 'పది',\n 'పదకొండు',\n 'పన్నెండు',\n 'పదమూడు',\n 'పద్నాలుగు',\n 'పదిహేను',\n 'పదహారు',\n 'పదిహేడు',\n 'పద్దెనిమిది',\n 'పంతొమ్మిది',\n 'ఇరవై',\n 'ఇరవై ఒక్కటి',\n 'ఇరవై రెండు',\n 'ఇరవై మూడు',\n 'ఇరవై నాలుగు',\n 'ఇరవై ఐదు',\n 'ఇరవై ఆరు',\n 'ఇరవై ఏడు',\n 'ఇరవై ఎనిమిది',\n 'ఇరవై తొమ్మిది',\n 'ముప్పై',\n 'ముప్పై ఒకటి',\n 'ముప్పై రెండు',\n 'ముప్పై మూడు',\n 'ముప్పై నాలుగు',\n 'ముప్పై ఐదు',\n 'ముప్పై ఆరు',\n 'ముప్పై ఏడు',\n 'ముప్పై ఎనిమిది',\n 'ముప్పై తొమ్మిది',\n 'నలభై',\n 'నలభై ఒకటి',\n 'నలభై రెండు',\n 'నలభై మూడు',\n 'నలభై నాలుగు',\n 'నలభై ఐదు',\n 'నలభై ఆరు',\n 'నలభై ఏడు',\n 'నలభై ఎనిమిది',\n 'నలభై తొమ్మిది',\n 'యాభై',\n 'యాభై ఒకటి',\n 'యాభై రెండు',\n 'యాభై మూడు',\n 'యాభై నాలుగు',\n 'యాభై ఐదు',\n 'యాభై ఆరు',\n 'యాభై ఏడు',\n 'యాభై ఎనిమిది',\n 'యాభై తొమ్మిది',\n 'అరవై',\n 'అరవై ఒకటి',\n 'అరవై రెండు',\n 'అరవై మూడు',\n 'అరవై నాలుగు',\n 'అరవై ఐదు',\n 'అరవై ఆరు',\n 'అరవై ఏడు',\n 'అరవై ఎనిమిది',\n 'అరవై తొమ్మిది',\n 'డెబ్బై',\n 'డెబ్బై ఒకటి',\n 'డెబ్బై రెండు',\n 'డెబ్బై మూడు',\n 'డెబ్బై నాలుగు',\n 'డెబ్బై ఐదు',\n 'డెబ్బై ఆరు',\n 'డెబ్బై ఏడు',\n 'డెబ్బై ఎనిమిది',\n 'డెబ్బై తొమ్మిది',\n 'ఎనభై',\n 'ఎనభై ఒకటి',\n 'ఎనభై రెండు',\n 'ఎనభై మూడు',\n 'ఎనభై నాలుగు',\n 'ఎనభై ఐదు',\n 'ఎనభై ఆరు',\n 'ఎనభై ఏడు',\n 'ఎనభై ఎనిమిది',\n 'ఎనభై తొమ్మిది',\n 'తొంభై',\n 'తొంభై ఒకటి',\n 'తొంభై రెండు',\n 'తొంభై మూడు',\n 'తొంభై నాలుగు',\n 'తొంభై ఐదు',\n 'తొంభై ఆరు',\n 'తొంభై ఏడు',\n 'తొంభై ఎనిమిది',\n 'తొంభై తొమ్మిది'\n ]\n\n hundredsWords = [\n '',\n 'వంద',\n 'రెండు వందలు',\n 'మూడు వందలు',\n 'నాలుగు వందలు',\n 'ఐదు వందలు',\n 'ఆరు వందలు',\n 'ఏడు వందలు',\n 'ఎనిమిది వందలు',\n 'తొమ్మిది వందలు'\n ]\n\n // Ones words map 1–9 for decimal reading\n onesWords = [\n 'ఒకటి',\n 'రెండు',\n 'మూడు',\n 'నాలుగు',\n 'ఐదు',\n 'ఆరు',\n 'ఏడు',\n 'ఎనిమిది',\n 'తొమ్మిది'\n ]\n\n scaleWords = [\n '',\n 'వెయ్యి',\n 'లక్ష',\n 'కోటి',\n 'అరబ్',\n 'ఖరబ్',\n 'నిల్',\n 'పడ్మ',\n 'శంకు'\n ]\n\n /** Convert numbers below 100 to Telugu words. */\n convertBelowHundred (number) {\n return this.belowHundredWords[number]\n }\n\n /** Convert numbers below 1000 to Telugu words. */\n convertBelowThousand (number) {\n if (number === 0) return ''\n if (number < 100) return this.convertBelowHundred(number)\n\n const hundreds = Math.trunc(number / 100)\n const remainder = number % 100\n const parts = [this.hundredsWords[hundreds]]\n\n if (remainder > 0) {\n parts.push(this.convertBelowHundred(remainder))\n }\n\n return parts.join(' ').trim()\n }\n\n /** Split a number using Indian-style grouping (3-2-2 digits from right). */\n splitIndian (number) {\n const numStr = number.toString()\n if (numStr.length <= 3) return [Number(numStr)]\n\n const groups = []\n const last3 = numStr.slice(-3)\n groups.unshift(Number(last3))\n\n let remaining = numStr.slice(0, -3)\n while (remaining.length > 0) {\n const group = remaining.slice(-2)\n groups.unshift(Number(group))\n remaining = remaining.slice(0, -2)\n }\n\n return groups\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) return this.zeroWord\n\n const groups = this.splitIndian(integerPart)\n const groupCount = groups.length\n const words = []\n\n for (let i = 0; i < groupCount; i++) {\n const groupValue = groups[i]\n if (groupValue === 0) continue\n\n const scaleIndex = groupCount - i - 1\n const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ఒక' : this.convertBelowThousand(groupValue)\n words.push(groupWords)\n if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {\n words.push(this.scaleWords[scaleIndex])\n }\n }\n\n return words.join(' ').trim()\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Thai language converter.\n *\n * Supports:\n * - Thai numerals (ศูนย์, หนึ่ง, สอง, สาม)\n * - No word separators (continuous Thai script)\n * - Digit-by-digit decimal reading\n */\nexport class Thai extends AbstractLanguage {\n negativeWord = 'ลบ'\n decimalSeparatorWord = 'จุด'\n zeroWord = 'ศูนย์'\n wordSeparator = ''\n usePerDigitDecimals = true // Enable digit-by-digit decimal conversion\n\n // Ones words map 1–9\n onesWords = ['หนึ่ง', 'สอง', 'สาม', 'สี่', 'ห้า', 'หก', 'เจ็ด', 'แปด', 'เก้า']\n\n /** Converts numbers below one million to Thai words. */\n convertBelowMillion (number) {\n if (number === 0) return ''\n\n let value = number\n const parts = []\n\n const hundredThousands = Math.trunc(value / 100000)\n value %= 100000\n const tenThousands = Math.trunc(value / 10000)\n value %= 10000\n const thousands = Math.trunc(value / 1000)\n value %= 1000\n const hundreds = Math.trunc(value / 100)\n value %= 100\n const tens = Math.trunc(value / 10)\n const ones = value % 10\n\n if (hundredThousands > 0) {\n parts.push(this.onesWords[hundredThousands - 1] + 'แสน')\n }\n\n if (tenThousands > 0) {\n if (tenThousands === 1) {\n parts.push('หนึ่งหมื่น')\n } else {\n parts.push(this.onesWords[tenThousands - 1] + 'หมื่น')\n }\n }\n\n if (thousands > 0) {\n parts.push(this.onesWords[thousands - 1] + 'พัน')\n }\n\n if (hundreds > 0) {\n parts.push(this.onesWords[hundreds - 1] + 'ร้อย')\n }\n\n if (tens > 0) {\n if (tens === 1) {\n parts.push('สิบ')\n } else if (tens === 2) {\n parts.push('ยี่สิบ')\n } else {\n parts.push(this.onesWords[tens - 1] + 'สิบ')\n }\n }\n\n if (ones > 0) {\n const hasHigher = hundredThousands > 0 || tenThousands > 0 || thousands > 0 || hundreds > 0 || tens > 0\n if (ones === 1 && (tens > 0 || hasHigher)) {\n parts.push('เอ็ด')\n } else {\n parts.push(this.onesWords[ones - 1])\n }\n }\n\n return parts.join('')\n }\n\n /** Split a number into million-sized groups for processing. */\n splitMillionGroups (number) {\n const groups = []\n let remaining = number\n\n const million = 1_000_000n\n while (remaining > 0n) {\n const chunk = Number(remaining % million)\n groups.unshift(chunk)\n remaining = remaining / million\n }\n\n return groups\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n\n const groups = this.splitMillionGroups(integerPart)\n const parts = []\n\n for (let i = 0; i < groups.length; i++) {\n const groupValue = groups[i]\n if (groupValue === 0) continue\n\n parts.push(this.convertBelowMillion(groupValue))\n const remaining = groups.length - i - 1\n if (remaining > 0) {\n parts.push('ล้าน'.repeat(remaining))\n }\n }\n\n return parts.join('')\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Traditional Chinese language converter.\n *\n * Supports:\n * - Traditional Chinese characters (繁體中文)\n * - No word separators (concatenated format)\n * - Optional formal (financial) vs common numerals\n */\nexport class TraditionalChinese extends GreedyScaleLanguage {\n negativeWord = '負'\n decimalSeparatorWord = '點'\n zeroWord = '零'\n wordSeparator = ''\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n formal: true\n }, options)\n\n if (this.options.formal) {\n this.scaleWords = [\n [1_000_000_000_000n, '萬'],\n [100_000_000n, '億'],\n [10_000n, '萬'],\n [1000n, '仟'],\n [100n, '佰'],\n [10n, '拾'],\n [9n, '玖'],\n [8n, '捌'],\n [7n, '柒'],\n [6n, '陸'],\n [5n, '伍'],\n [4n, '肆'],\n [3n, '參'],\n [2n, '貳'],\n [1n, '壹'],\n [0n, '零']\n ]\n } else {\n this.scaleWords = [\n [1_000_000_000_000n, '萬'],\n [100_000_000n, '億'],\n [10_000n, '萬'],\n [1000n, '千'],\n [100n, '百'],\n [10n, '十'],\n [9n, '九'],\n [8n, '八'],\n [7n, '七'],\n [6n, '六'],\n [5n, '五'],\n [4n, '四'],\n [3n, '三'],\n [2n, '二'],\n [1n, '一'],\n [0n, '零']\n ]\n }\n }\n\n /** Combines two word-sets with Traditional Chinese grammar rules and zero insertion. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const followingValue = Object.values(following)[0]\n\n // Implicit one: omit 1 before single digits (< 10)\n if (precedingValue === 1n && followingValue < 10n) {\n return following\n }\n\n // Multiply when following > preceding (scale words like 千, 萬, 億)\n if (followingValue > precedingValue) {\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n\n // Insert \"零\" (zero) when position skip levels (e.g., 1003 = 千零三)\n // zeroDigit() checks if gap exists between preceding and following magnitude\n if (this.zeroDigit(precedingValue) > this.digit(followingValue)) {\n return { [`${precedingWord}${this.zeroWord}${followingWord}`]: precedingValue + followingValue }\n }\n\n // Default: concatenate without zero insertion\n return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }\n }\n\n /** Returns the number of digits in a number. */\n digit (number_) {\n return number_.toString().length\n }\n\n /** Counts the number of zero digits in a number. */\n zeroDigit (number_) {\n return [...number_.toString()].filter(c => c === '0').length\n }\n\n /** Converts decimal digits to words by reading each digit individually. */\n decimalDigitsToWords (decimalString) {\n const words = []\n for (let i = 0; i < decimalString.length; i++) {\n const digitValue = BigInt(decimalString[i])\n words.push(this.integerToWords(digitValue))\n }\n return words\n }\n}\n","import { TurkicLanguage } from '../classes/turkic-language.js'\n\n/**\n * Turkish language converter.\n *\n * Supports:\n * - Omits 'bir' (one) before hundreds and thousands\n * - Optional space removal via dropSpaces option\n */\nexport class Turkish extends TurkicLanguage {\n negativeWord = 'eksi'\n decimalSeparatorWord = 'virgül'\n zeroWord = 'sıfır'\n wordSeparator = ' '\n\n scaleWords = [\n [1_000_000_000_000_000_000n, 'kentilyon'],\n [1_000_000_000_000_000n, 'katrilyon'],\n [1_000_000_000_000n, 'trilyon'],\n [1_000_000_000n, 'milyar'],\n [1_000_000n, 'milyon'],\n [1000n, 'bin'],\n [100n, 'yüz'],\n [90n, 'doksan'],\n [80n, 'seksen'],\n [70n, 'yetmiş'],\n [60n, 'altmış'],\n [50n, 'elli'],\n [40n, 'kırk'],\n [30n, 'otuz'],\n [20n, 'yirmi'],\n [10n, 'on'],\n [9n, 'dokuz'],\n [8n, 'sekiz'],\n [7n, 'yedi'],\n [6n, 'altı'],\n [5n, 'beş'],\n [4n, 'dört'],\n [3n, 'üç'],\n [2n, 'iki'],\n [1n, 'bir'],\n [0n, 'sıfır']\n ]\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n dropSpaces: false\n }, options)\n\n if (this.options.dropSpaces) {\n this.wordSeparator = ''\n }\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Ukrainian language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Gender agreement (один/одна, два/дві)\n * - Ukrainian orthography and phonology\n */\nexport class Ukrainian extends SlavicLanguage {\n negativeWord = 'мiнус'\n decimalSeparatorWord = 'кома'\n zeroWord = 'нуль'\n\n onesWords = {\n 1: 'один',\n 2: 'два',\n 3: 'три',\n 4: 'чотири',\n 5: 'п\\'ять',\n 6: 'шiсть',\n 7: 'сiм',\n 8: 'вiсiм',\n 9: 'дев\\'ять'\n }\n\n onesFeminineWords = {\n 1: 'одна',\n 2: 'двi',\n 3: 'три',\n 4: 'чотири',\n 5: 'п\\'ять',\n 6: 'шiсть',\n 7: 'сiм',\n 8: 'вiсiм',\n 9: 'дев\\'ять'\n }\n\n teensWords = {\n 0: 'десять',\n 1: 'одинадцять',\n 2: 'дванадцять',\n 3: 'тринадцять',\n 4: 'чотирнадцять',\n 5: 'п\\'ятнадцять',\n 6: 'шiстнадцять',\n 7: 'сiмнадцять',\n 8: 'вiсiмнадцять',\n 9: 'дев\\'ятнадцять'\n }\n\n twentiesWords = {\n 2: 'двадцять',\n 3: 'тридцять',\n 4: 'сорок',\n 5: 'п\\'ятдесят',\n 6: 'шiстдесят',\n 7: 'сiмдесят',\n 8: 'вiсiмдесят',\n 9: 'дев\\'яносто'\n }\n\n hundredsWords = {\n 1: 'сто',\n 2: 'двiстi',\n 3: 'триста',\n 4: 'чотириста',\n 5: 'п\\'ятсот',\n 6: 'шiстсот',\n 7: 'сiмсот',\n 8: 'вiсiмсот',\n 9: 'дев\\'ятсот'\n }\n\n pluralForms = {\n 1: ['тисяча', 'тисячi', 'тисяч'], // 10^ 3\n 2: ['мiльйон', 'мiльйони', 'мiльйонiв'], // 10^ 6\n 3: ['мiльярд', 'мiльярди', 'мiльярдiв'], // 10^ 9\n 4: ['трильйон', 'трильйони', 'трильйонiв'], // 10^ 12\n 5: ['квадрильйон', 'квадрильйони', 'квадрильйонiв'], // 10^ 15\n 6: ['квiнтильйон', 'квiнтильйони', 'квiнтильйонiв'], // 10^ 18\n 7: ['секстильйон', 'секстильйони', 'секстильйонiв'], // 10^ 21\n 8: ['септильйон', 'септильйони', 'септильйонiв'], // 10^ 24\n 9: ['октильйон', 'октильйони', 'октильйонiв'], // 10^ 27\n 10: ['нонiльйон', 'нонiльйони', 'нонiльйонiв'] // 10^ 30\n }\n\n /**\n * Ukrainian thousands (тисяча) are feminine, requiring одна/двi forms.\n * Other scales (million, billion, etc.) are masculine.\n */\n scaleGenders = {\n 1: true // thousands are feminine\n }\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Urdu language converter.\n *\n * Supports:\n * - Indian numbering system (ہزار, لاکھ, کروڑ)\n * - Urdu script (right-to-left)\n * - Complete word forms for 0-99\n */\nexport class Urdu extends SouthAsianLanguage {\n negativeWord = 'منفی'\n decimalSeparatorWord = 'اعشاریہ'\n zeroWord = 'صفر'\n hundredWord = 'سو'\n\n belowHundredWords = [\n 'صفر',\n 'ایک',\n 'دو',\n 'تین',\n 'چار',\n 'پانچ',\n 'چھ',\n 'سات',\n 'آٹھ',\n 'نو',\n 'دس',\n 'گیارہ',\n 'بارہ',\n 'تیرہ',\n 'چودہ',\n 'پندرہ',\n 'سولہ',\n 'سترہ',\n 'اٹھارہ',\n 'انیس',\n 'بیس',\n 'اکیس',\n 'بائیس',\n 'تیئیس',\n 'چوبیس',\n 'پچیس',\n 'چھبیس',\n 'ستائیس',\n 'اٹھائیس',\n 'انتیس',\n 'تیس',\n 'اکتیس',\n 'بتیس',\n 'تینتیس',\n 'چونتیس',\n 'پینتیس',\n 'چھتیس',\n 'سینتیس',\n 'اڑتیس',\n 'انتالیس',\n 'چالیس',\n 'اکتالیس',\n 'بیالیس',\n 'تینتالیس',\n 'چوالیس',\n 'پینتالیس',\n 'چھالیس',\n 'سینتالیس',\n 'اڑتالیس',\n 'انچاس',\n 'پچاس',\n 'اکاون',\n 'باون',\n 'ترپن',\n 'چون',\n 'پچپن',\n 'چھپن',\n 'ستاون',\n 'اٹھاون',\n 'انسٹھ',\n 'ساٹھ',\n 'اکسٹھ',\n 'باسٹھ',\n 'ترسٹھ',\n 'چونسٹھ',\n 'پینسٹھ',\n 'چھیاسٹھ',\n 'سڑسٹھ',\n 'اڑسٹھ',\n 'انہتر',\n 'ستر',\n 'اکہتر',\n 'بہتر',\n 'تہتر',\n 'چوہتر',\n 'پچھتر',\n 'چھہتر',\n 'ستتر',\n 'اٹھہتر',\n 'اناسی',\n 'اسی',\n 'اکیاسی',\n 'بیاسی',\n 'تریاسی',\n 'چوراسی',\n 'پچاسی',\n 'چھیاسی',\n 'ستاسی',\n 'اٹھاسی',\n 'نواسی',\n 'نوے',\n 'اکانوے',\n 'بانوے',\n 'ترانوے',\n 'چورانوے',\n 'پچانوے',\n 'چھیانوے',\n 'ستانوے',\n 'اٹھانوے',\n 'ننانوے'\n ]\n\n scaleWords = [\n '',\n 'ہزار',\n 'لاکھ',\n 'کروڑ',\n 'ارب',\n 'کھرب',\n 'نیل',\n 'پدم',\n 'شنکھ'\n ]\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Vietnamese language converter.\n *\n * Supports:\n * - Special pronunciation rules (lăm for 5, mốt for final 1)\n * - \"Lẻ\" (odd/extra) when tens place is zero\n * - Vietnamese diacritical marks\n */\nexport class Vietnamese extends AbstractLanguage {\n negativeWord = 'âm'\n decimalSeparatorWord = 'phẩy'\n zeroWord = 'không'\n\n belowTwentyWords = {\n 0: 'không',\n 1: 'một',\n 2: 'hai',\n 3: 'ba',\n 4: 'bốn',\n 5: 'năm',\n 6: 'sáu',\n 7: 'bảy',\n 8: 'tám',\n 9: 'chín',\n 10: 'mười',\n 11: 'mười một',\n 12: 'mười hai',\n 13: 'mười ba',\n 14: 'mười bốn',\n 15: 'mười lăm',\n 16: 'mười sáu',\n 17: 'mười bảy',\n 18: 'mười tám',\n 19: 'mười chín'\n }\n\n twentiesWords = {\n 20: 'hai mươi',\n 30: 'ba mươi',\n 40: 'bốn mươi',\n 50: 'năm mươi',\n 60: 'sáu mươi',\n 70: 'bảy mươi',\n 80: 'tám mươi',\n 90: 'chín mươi'\n }\n\n scaleWords = {\n 1: 'nghìn', // 10^1\n 2: 'triệu', // 10^2\n 3: 'tỷ', // 10^3\n 4: 'nghìn tỷ',\n 5: 'trăm nghìn tỷ',\n 6: 'Quintillion',\n 7: 'Sextillion',\n 8: 'Septillion',\n 9: 'Octillion',\n 10: 'Nonillion',\n 11: 'Decillion',\n 12: 'Undecillion',\n 13: 'Duodecillion',\n 14: 'Tredecillion',\n 15: 'Quattuordecillion',\n 16: 'Sexdecillion',\n 17: 'Septendecillion',\n 18: 'Octodecillion',\n 19: 'Novemdecillion',\n 20: 'Vigintillion'\n }\n\n /** Convert numbers less than 100 to Vietnamese words. */\n convertLess100 (number) {\n const unitsPart = number % 10\n const tensPart = number - unitsPart\n const tensPartText = this.twentiesWords[tensPart]\n if (unitsPart === 0) {\n return tensPartText\n }\n const unitsPartText = this.belowTwentyWords[unitsPart]\n let suffix = unitsPartText\n if (unitsPart === 1) {\n suffix = 'mốt'\n }\n if (unitsPart === 5) {\n suffix = 'lăm'\n }\n return tensPartText + ' ' + suffix\n }\n\n /** Convert numbers less than 1000 to Vietnamese words. */\n convertLess1000 (number) {\n const words = []\n const tensUnitsPart = number % 100\n const hundredsPart = number - tensUnitsPart\n if (hundredsPart > 0) {\n words.push(this.belowTwentyWords[hundredsPart / 100], 'trăm')\n }\n if (tensUnitsPart > 0 && tensUnitsPart < 10) {\n if (words.length > 0) {\n words.push('lẻ')\n }\n if (tensUnitsPart === 5) {\n words.push('năm')\n } else {\n words.push(this.belowTwentyWords[tensUnitsPart])\n }\n }\n if (tensUnitsPart >= 10) {\n words.push(this.integerToWords(tensUnitsPart))\n }\n return words.join(' ')\n }\n\n /** Convert numbers greater than 1000 to Vietnamese words. */\n convertMore1000 (number) {\n const words = []\n let division = number / 1000n\n let power = 1\n while (division >= 1000n) {\n division = division / 1000n\n power = power + 1\n }\n const r = number - (division * BigInt(Math.pow(1000, power)))\n words.push(this.integerToWords(division), this.scaleWords[power])\n if (r > 0n) {\n if (r <= 99n) {\n words.push('lẻ')\n }\n words.push(this.integerToWords(r))\n }\n return words.join(' ')\n }\n\n integerToWords (integerPart) {\n if (integerPart < 20n) {\n return this.belowTwentyWords[Number(integerPart)]\n } else {\n if (integerPart < 100n) {\n return this.convertLess100(Number(integerPart))\n } else {\n return (integerPart < 1000n ? this.convertLess1000(Number(integerPart)) : this.convertMore1000(integerPart))\n }\n }\n }\n}\n"],"names":["AbstractLanguage","options","negativeWord","decimalSeparatorWord","zeroWord","wordSeparator","usePerDigitDecimals","this","toWords","isNegative","integerPart","decimalPart","words","push","integerToWords","decimalDigitsToWords","join","Error","setOptions","defaults","userOptions","decimalIntegerToWords","i","length","remainder","slice","char","BigInt","GreedyScaleLanguage","scaleWords","wordForScale","scale","match","find","pair","decomposeInteger","wordSets","remaining","multiplier","reduceWordSets","first","second","rest","Array","isArray","combined","combineWordSets","normalized","map","element","preceding","following","finalizeWords","output","trimEnd","reduced","result","Object","keys","TurkicLanguage","precedingWord","precedingValue","entries","followingWord","followingValue","resultNumber","SouthAsianLanguage","belowHundredWords","hundredWord","splitToSegments","numStr","toString","Number","segments","last3","unshift","segment","segmentToWords","segmentValue","hundreds","Math","trunc","parts","segmentCount","scaleIndex","trim","SlavicLanguage","onesWords","onesFeminineWords","teensWords","twentiesWords","hundredsWords","pluralForms","scaleGenders","omitOneBeforeScale","constructor","super","gender","segmentIndex","onesDigit","tensDigit","hundredsDigit","extractDigits","onesArray","pluralize","numberString","segmentSize","stringLength","remainderLength","value","number","remainder100","remainder10","French","withHyphenSeparator","values","at","Portuguese","static","replaceAll","POSTCLEAN_REGEX","replace","makeConverter","LanguageClass","undefined","proto","getPrototypeOf","prototype","isPlainObject","TypeError","type","str","isFinite","includes","expandScientificNotation","numberToString","trimmed","isNaN","stringToNormalizedForm","dotIndex","indexOf","integerStr","parseNumericString","parseNumericValue","mantissa","expStr","toLowerCase","split","exp","parseInt","digits","newDotPosition","repeat","ArabicConverter","tensWords","scaleAppendedWords","scalePluralWords","dualWords","dualAppendedWords","ones","masculine","feminine","selectedOnes","groupNumber","groupLevel","fullNumber","tens","hundredsRaw","returnValue","hundredsWord","numValue","pow","log10","tensIndex","temp","group","numberToProcess","groupDescription","AzerbaijaniConverter","BanglaConverter","BiblicalHebrewConverter","femininePluralForms","scalePlural","teensFeminineWords","andWord","index","x","n1","n2","n3","chunkWords","hasHundreds","tensWord","onesWord","CroatianConverter","n","forms","lastDigit","lastTwoDigits","CzechConverter","DanishConverter","ordFlag","temporary","DutchConverter","includeOptionalAnd","noHundredPairing","accentOne","hadSpace","hasSpace","andTxt","endsWith","high","low","EnglishConverter","FilipinoConverter","vowels","lastChar","FrenchConverter","FrenchBelgiumConverter","tuples","idx80","findIndex","tuple","splice","idx60","GermanConverter","GreekConverter","GujaratiConverter","HebrewConverter","HindiConverter","HungarianConverter","tensToCardinal","units","hundredsToCardinal","prefix","thousandsToCardinal","thousands","postfix","bigNumberToCardinal","numberLength","floor","IndonesianConverter","digitWords","splitBy3","blocks","stringNumber","firstBlock","firstBlockLength","nextBlock","spell","spelling","wordBlocks","getTens","getHundreds","block","wordList","start","ItalianConverter","exponentPrefixes","accentuate","string","word","omitIfZero","phoneticContraction","hasOwnProperty","call","exponentLengthToString","exponentLength","preDigits","exponent","infix","isSetsEqual","a","b","Set","size","every","has","JapaneseConverter","num","groups","reverse","groupStr","KannadaConverter","KoreanConverter","LatvianConverter","LithuanianConverter","MalayConverter","isLast","scaleWord","w","MarathiConverter","NorwegianBokmalConverter","PersianConverter","thousandMultiplier","thousandPrefix","suffix","millionMultiplier","PolishConverter","PortugueseConverter","PunjabiConverter","RomanianConverter","teensMasculineWords","scaleMetadata","singular","plural","needsDe","results","l","padStart","toReversed","romanianPluralize","form","spellUnder1000","spellUnder100","feminineUnits","masculineTeens","t","u","h","r","hundredWords","onesMap","RussianConverter","SerbianCyrillicConverter","SerbianLatinConverter","SimplifiedChineseConverter","formal","zeroDigit","digit","number_","filter","c","decimalString","digitValue","SpanishConverter","genderStem","SwahiliConverter","wordsUnder100","wordsUnder1000","s","val","unit","SwedishConverter","TamilConverter","convertBelowHundred","convertBelowThousand","hundredPart","splitIndian","groupCount","groupValue","groupWords","TeluguConverter","ThaiConverter","convertBelowMillion","hundredThousands","tenThousands","splitMillionGroups","million","chunk","TraditionalChineseConverter","TurkishConverter","dropSpaces","UkrainianConverter","UrduConverter","VietnameseConverter","belowTwentyWords","convertLess100","unitsPart","tensPart","tensPartText","convertLess1000","tensUnitsPart","hundredsPart","convertMore1000","division","power"],"mappings":";8OAqCO,MAAMA,EASXC,GAAW,CAAA,EAUXC,aAAe,GAMfC,qBAAuB,GAOvBC,SAAW,GAcXC,cAAgB,IAehBC,qBAAsB,EAUtB,WAAIL,GACF,OAAOM,MAAKN,CACd,CAiCAO,OAAAA,CAASC,EAAYC,EAAaC,GAChC,MAAMC,EAAQ,GAWd,OATIH,GAAYG,EAAMC,KAAKN,KAAKL,cAEhCU,EAAMC,KAAKN,KAAKO,eAAeJ,IAE3BC,IACFC,EAAMC,KAAKN,KAAKJ,sBAChBS,EAAMC,QAAQN,KAAKQ,qBAAqBJ,KAGnCC,EAAMI,KAAKT,KAAKF,cACzB,CAiBAS,cAAAA,CAAgBJ,GACd,MAAM,IAAIO,MAAM,mDAClB,CAuBAC,UAAAA,CAAYC,EAAW,GAAIC,EAAc,CAAA,GACvCb,MAAKN,EAAW,IACXkB,KACAC,EAEP,CAoBAC,qBAAAA,CAAuBX,GACrB,OAAOH,KAAKO,eAAeJ,EAC7B,CAkBAK,oBAAAA,CAAsBJ,GACpB,MAAMC,EAAQ,GAGd,IAAIU,EAAI,EACR,KAAOA,EAAIX,EAAYY,QAA6B,MAAnBZ,EAAYW,IAC3CV,EAAMC,KAAKN,KAAKH,UAChBkB,IAGF,MAAME,EAAYb,EAAYc,MAAMH,GACpC,IAAKE,EAAW,OAAOZ,EAGvB,GAAIL,KAAKD,oBACP,IAAK,MAAMoB,KAAQF,EACjBZ,EAAMC,KAAKN,KAAKc,sBAAsBM,OAAOD,UAG/Cd,EAAMC,KAAKN,KAAKc,sBAAsBM,OAAOH,KAG/C,OAAOZ,CACT,EC3OK,MAAMgB,UAA4B5B,EAiBvC6B,WAYAC,YAAAA,CAAcC,GACZ,MAAMC,EAAQzB,KAAKsB,WAAWI,KAAMC,GAASA,EAAK,KAAOH,GACzD,OAAOC,IAAQ,EACjB,CAoBAG,gBAAAA,CAAkBzB,GAChB,MAAM0B,EAAW,GACjB,IAAIC,EAAY3B,EAEhB,EAAG,CACD,MAAMsB,EAAQzB,KAAKsB,WAAWI,KAAMC,GAASG,GAAaH,EAAK,IAC/D,IAAKF,EAAO,MAEZ,MAAMM,EAA2B,KAAdD,EAAmB,GAAKA,EAAYL,EAAM,GAE1C,KAAfM,EACFF,EAASvB,KAAK,CAAE,CAACN,KAAKuB,aAAa,KAAM,KAEzCM,EAASvB,KAAKN,KAAK4B,iBAAiBG,IAGtCF,EAASvB,KAAK,CAAE,CAACmB,EAAM,IAAKA,EAAM,KAElCK,EAA0B,KAAdA,EAAmB,GAAKA,EAAYL,EAAM,EACxD,OAASK,EAAY,IAErB,OAAOD,CACT,CAaAG,cAAAA,CAAgBH,GACd,KAAOA,EAASb,OAAS,GAAG,CAC1B,MAAOiB,EAAOC,KAAWC,GAAQN,EAEjC,IAAKO,MAAMC,QAAQJ,KAAWG,MAAMC,QAAQH,GAAS,CACnD,MAAMI,EAAWtC,KAAKuC,gBAAgBN,EAAOC,GAC7CL,EAAWM,EAAKnB,OAAS,EAAI,CAACsB,EAAUH,GAAQ,CAACG,GACjD,QACF,CAEA,MAAME,EAAaX,EAASY,IAAKC,GAC1BN,MAAMC,QAAQK,GACO,IAAnBA,EAAQ1B,OAAe0B,EAAQ,GAAK1C,KAAKgC,eAAeU,GAD3BA,GAItCb,EAAWW,CACb,CAEA,OAAOX,EAAS,EAClB,CAyBAU,eAAAA,CAAiBI,EAAWC,GAC1B,MAAM,IAAIlC,MAAM,oDAClB,CAgBAmC,aAAAA,CAAeC,GACb,OAAOA,EAAOC,SAChB,CAYAxC,cAAAA,CAAgBJ,GACd,MAAM0B,EAAW7B,KAAK4B,iBAAiBzB,GACjC6C,EAAUhD,KAAKgC,eAAeH,GAC9BoB,EAASC,OAAOC,KAAKH,GAAS,GACpC,OAAOhD,KAAK6C,cAAcI,EAC5B,EC9KK,MAAMG,UAAuB/B,EAkBlCkB,eAAAA,CAAiBI,EAAWC,GAC1B,OAAQS,EAAeC,IAAmBJ,OAAOK,QAAQZ,KACjDa,EAAeC,IAAmBP,OAAOK,QAAQX,GAIzD,GAAuB,KAAnBU,IAA0BG,GAAkB,MAA2B,QAAnBA,GACtD,OAAOb,EAKT,MAAMc,EAAeD,EAAiBH,EAAiBA,EAAiBG,EAAiBH,EAAiBG,EAC1G,MAAO,CAAE,CAAC,GAAGJ,IAAgBrD,KAAKF,gBAAgB0D,KAAkBE,EACtE,ECnCK,MAAMC,UAA2BlE,EAUtCmE,kBAOAC,YAQAvC,WAyBAwC,eAAAA,CAAiB3D,GACf,MAAM4D,EAAS5D,EAAY6D,WAE3B,GAAID,EAAO/C,QAAU,EACnB,MAAO,CAACiD,OAAOF,IAGjB,MAAMG,EAAW,GACXC,EAAQJ,EAAO7C,UACrBgD,EAASE,QAAQH,OAAOE,IAExB,IAAIrC,EAAYiC,EAAO7C,MAAM,GAAG,GAChC,KAAOY,EAAUd,OAAS,GAAG,CAC3B,MAAMqD,EAAUvC,EAAUZ,UAC1BgD,EAASE,QAAQH,OAAOI,IACxBvC,EAAYA,EAAUZ,MAAM,GAAG,EACjC,CAEA,OAAOgD,CACT,CASAI,cAAAA,CAAgBC,GACd,GAAqB,IAAjBA,EAAoB,MAAO,GAC/B,GAAIA,EAAe,IAAK,OAAOvE,KAAK4D,kBAAkBW,GAEtD,MAAMC,EAAWC,KAAKC,MAAMH,EAAe,KACrCtD,EAAYsD,EAAe,IAC3BI,EAAQ,GAYd,OAViB,IAAbH,EACFG,EAAMrE,KAAKN,KAAK4D,kBAAkB,GAAK,IAAM5D,KAAK6D,aAElDc,EAAMrE,KAAKN,KAAK4D,kBAAkBY,GAAY,IAAMxE,KAAK6D,aAGvD5C,EAAY,GACd0D,EAAMrE,KAAKN,KAAK4D,kBAAkB3C,IAG7B0D,EAAMlE,KAAK,IACpB,CAYAF,cAAAA,CAAgBJ,GACd,GAAoB,KAAhBA,EACF,OAAOH,KAAKH,SAGd,MAAMqE,EAAWlE,KAAK8D,gBAAgB3D,GAChCyE,EAAeV,EAASlD,OACxBX,EAAQ,GAEd,IAAK,IAAIU,EAAI,EAAGA,EAAI6D,EAAc7D,IAAK,CACrC,MAAMwD,EAAeL,EAASnD,GAC9B,GAAqB,IAAjBwD,EAAoB,SAExB,MAAMM,EAAaD,EAAe7D,EAAI,EACtCV,EAAMC,KAAKN,KAAKsE,eAAeC,IAC3BM,EAAa,GAAK7E,KAAKsB,WAAWuD,IACpCxE,EAAMC,KAAKN,KAAKsB,WAAWuD,GAE/B,CAEA,OAAOxE,EAAMI,KAAK,KAAKqE,MACzB,ECzHK,MAAMC,UAAuBtF,EAUlCuF,UAAY,CAAA,EAOZC,kBAAoB,CAAA,EAOpBC,WAAa,CAAA,EAObC,cAAgB,CAAA,EAOhBC,cAAgB,CAAA,EAQhBC,YAAc,CAAA,EAcdC,aAAe,CAAA,EASfC,oBAAqB,EAYrBC,WAAAA,CAAa9F,EAAU,IACrB+F,QAEAzF,KAAKW,WAAW,CACd+E,OAAQ,aACPhG,EACL,CAmBAa,cAAAA,CAAgBJ,GACd,GAAoB,KAAhBA,EACF,OAAOH,KAAKH,SAGd,MAAMQ,EAAQ,GACR6D,EAAWlE,KAAK8D,gBAAgB3D,EAAY6D,WAAY,GAC9D,IAAI2B,EAAezB,EAASlD,OAE5B,IAAK,MAAMuD,KAAgBL,EAAU,CAGnC,GAFAyB,GAA8B,EAET,KAAjBpB,EACF,SAGF,MAAOqB,EAAWC,EAAWC,GAAiB9F,KAAK+F,cAAcxB,GAWjE,GATIuB,EAAgB,IAClBzF,EAAMC,KAAKN,KAAKoF,cAAcU,IAG5BD,EAAY,IACdxF,EAAMC,KAAKN,KAAKmF,cAAcU,IAId,KAAdA,EAEFxF,EAAMC,KAAKN,KAAKkF,WAAWU,SACtB,GAAIA,EAAY,MAGC5F,KAAKuF,oBAAsBI,EAAe,GAAsB,KAAjBpB,GAEjD,CAIlB,MAEMyB,GAFsD,IAApChG,KAAKsF,aAAaK,IACqB,aAAxB3F,KAAKN,QAAQgG,QAA0C,IAAjBC,EAC9C3F,KAAKiF,kBAAoBjF,KAAKgF,UAC7D3E,EAAMC,KAAK0F,EAAUJ,GACvB,CAIED,EAAe,GACjBtF,EAAMC,KAAKN,KAAKiG,UAAU1B,EAAcvE,KAAKqF,YAAYM,IAE7D,CAEA,OAAOtF,EAAMI,KAAK,IACpB,CAgBAqD,eAAAA,CAAiBoC,EAAcC,GAC7B,MAAMjC,EAAW,GACXkC,EAAeF,EAAalF,OAElC,GAAIoF,EAAeD,EAAa,CAC9B,MAAME,EAAkBD,EAAeD,EAEnCE,EAAkB,GACpBnC,EAAS5D,KAAKc,OAAO8E,EAAahF,MAAM,EAAGmF,KAG7C,IAAK,IAAItF,EAAIsF,EAAiBtF,EAAIqF,EAAcrF,GAAKoF,EACnDjC,EAAS5D,KAAKc,OAAO8E,EAAahF,MAAMH,EAAGA,EAAIoF,IAEnD,MACEjC,EAAS5D,KAAKc,OAAO8E,IAGvB,OAAOhC,CACT,CAWA6B,aAAAA,CAAeO,GAKb,MAAO,CAHWA,EAAQ,IACPA,EAAQ,IAAO,IACZA,EAAQ,KAEhC,CAmBAL,SAAAA,CAAWM,EAAQlB,GACjB,MAAMmB,EAAeD,EAAS,KACxBE,EAAcF,EAAS,IAG7B,OAAIC,GAAgB,KAAOA,GAAgB,IAClCnB,EAAY,GAGD,KAAhBoB,EACKpB,EAAY,GAGjBoB,GAAe,IAAMA,GAAe,GAC/BpB,EAAY,GAGdA,EAAY,EACrB,EC7QK,MAAMqB,UAAerF,EAC1B1B,aAAe,QACfC,qBAAuB,UACvBC,SAAW,OAEXyB,WAAa,CACX,CAAC,8BAAwC,gBACzC,CAAC,2BAAoC,eACrC,CAAC,wBAAgC,aACjC,CAAC,qBAA4B,YAC7B,CAAC,kBAAwB,YACzB,CAAC,eAAoB,WACrB,CAAC,YAAgB,YACjB,CAAC,SAAY,WACb,CAAC,MAAO,SACR,CAAC,KAAM,QACP,CAAC,IAAK,iBACN,CAAC,IAAK,YACN,CAAC,IAAK,aACN,CAAC,IAAK,YACN,CAAC,IAAK,UACN,CAAC,IAAK,SACN,CAAC,IAAK,YACN,CAAC,IAAK,YACN,CAAC,IAAK,YACN,CAAC,IAAK,SACN,CAAC,IAAK,UACN,CAAC,IAAK,YACN,CAAC,IAAK,UACN,CAAC,IAAK,SACN,CAAC,IAAK,QACN,CAAC,IAAK,OACN,CAAC,GAAI,QACL,CAAC,GAAI,QACL,CAAC,GAAI,QACL,CAAC,GAAI,OACL,CAAC,GAAI,QACL,CAAC,GAAI,UACL,CAAC,GAAI,SACL,CAAC,GAAI,QACL,CAAC,GAAI,MACL,CAAC,GAAI,SAGPkE,WAAAA,CAAa9F,EAAU,IACrB+F,QAEAzF,KAAKW,WAAW,CACdgG,qBAAqB,GACpBjH,GAECA,EAAQiH,sBACV3G,KAAKF,cAAgB,IAEzB,CAGAyC,eAAAA,CAAiBI,EAAWC,GAC1B,IAAIS,EAAgBH,OAAOC,KAAKR,GAAW,GACvCa,EAAgBN,OAAOC,KAAKP,GAAW,GAC3C,MAAMU,EAAiBJ,OAAO0D,OAAOjE,GAAW,GAC1Cc,EAAiBP,OAAO0D,OAAOhE,GAAW,GAEhD,GAAuB,KAAnBU,GACF,GAAIG,EAAiB,SACnB,OAAOb,QAILU,EAAiB,KAAO,MAAS,IAAOA,EAAiB,MAAS,IAAMA,EAAiB,QAC3FG,EAAiB,UACQ,MAAzBJ,EAAcwD,IAAG,KAEjBxD,EAAgBA,EAAcnC,MAAM,GAAG,IAIvCoC,EAAiB,OAA4B,QAAnBG,GACD,MAAzBD,EAAcqD,IAAG,IACjBpD,EAAiB,MAAS,KAE1BD,GAAiB,KAIrB,OAAIC,EAAiBH,GAAkBA,EAAiB,KAClDG,EAAiB,KAAQ,IAAyB,MAAnBH,EAC1B,CAAE,CAAC,GAAGD,IAAgBrD,KAAKF,kBAAkBE,KAAKF,gBAAgB0D,KAAkBF,EAAiBG,GAEvG,CAAE,CAAC,GAAGJ,KAAiBG,KAAkBF,EAAiBG,GAG/DA,EAAiBH,EAAuB,CAAE,CAAC,GAAGD,IAAgBrD,KAAKF,gBAAgB0D,KAAkBF,EAAiBG,GACnH,CAAE,CAAC,GAAGJ,IAAgBrD,KAAKF,gBAAgB0D,KAAkBF,EAAiBG,EACvF,EC9FK,MAAMqD,UAAmBzF,EAC9B1B,aAAe,QACfC,qBAAuB,UACvBC,SAAW,OAEXyB,WAAa,CACX,CAAC,2BAAoC,cACrC,CAAC,qBAA4B,WAC7B,CAAC,eAAoB,UACrB,CAAC,SAAY,UACb,CAAC,MAAO,OACR,CAAC,KAAM,OACP,CAAC,IAAK,WACN,CAAC,IAAK,WACN,CAAC,IAAK,WACN,CAAC,IAAK,YACN,CAAC,IAAK,aACN,CAAC,IAAK,YACN,CAAC,IAAK,UACN,CAAC,IAAK,SACN,CAAC,IAAK,YACN,CAAC,IAAK,WACN,CAAC,IAAK,aACN,CAAC,IAAK,aACN,CAAC,IAAK,UACN,CAAC,IAAK,WACN,CAAC,IAAK,SACN,CAAC,IAAK,QACN,CAAC,IAAK,QACN,CAAC,IAAK,OACN,CAAC,GAAI,QACL,CAAC,GAAI,QACL,CAAC,GAAI,QACL,CAAC,GAAI,QACL,CAAC,GAAI,SACL,CAAC,GAAI,UACL,CAAC,GAAI,QACL,CAAC,GAAI,QACL,CAAC,GAAI,MACL,CAAC,GAAI,SAGP8D,cAAgB,CACd,EAAG,QACH,EAAG,WACH,EAAG,YACH,EAAG,eACH,EAAG,aACH,EAAG,aACH,EAAG,aACH,EAAG,aACH,EAAG,cAIL2B,uBAAyB,yBAEzBlE,aAAAA,CAAexC,GACb,OAAOA,EAAM2G,WAAWF,EAAWG,gBAAiB,OACtD,CAGA1E,eAAAA,CAAiBI,EAAWC,GAE1B,IAAIS,EAAgBH,OAAOC,KAAKR,GAAW,GACvCa,EAAgBN,OAAOC,KAAKP,GAAW,GAC3C,MAAMU,EAAiBJ,OAAO0D,OAAOjE,GAAW,GAC1Cc,EAAiBP,OAAO0D,OAAOhE,GAAW,GAGhD,GAAuB,KAAnBU,EAAuB,CACzB,GAAIG,EAAiB,SAAY,MAAO,CAAED,CAACA,GAAgBC,GAC3DJ,EAAgB,IAClB,MAA8B,OAAnBC,GAA2BG,EAAiB,OAAU,KAE/DJ,EAAgB,SAGlB,OAAII,EAAiBH,EACZ,CAAE,CAAC,GAAGD,OAAmBG,KAAkBF,EAAiBG,IAI/C,WAAlBD,IAA4BA,EAAgB,UAG5CF,EAAiB,KACfG,EAAiB,aAAmB,GACtCD,EAAgBA,EAAc0D,QAAQ,SAAU,WACvCzD,EAAiB,UAAe,KACzCD,EAAgBA,EAAc0D,QAAQ,SAAU,aAI7B,OAAnBzD,GACFJ,EAAgBrD,KAAKoF,cAAc9B,GAC5B,CAAE,CAAC,GAAGD,KAAkBC,EAAiBG,IAG3C,CAAE,CAAC,GAAGJ,KAAiBG,KAAkBF,EAAiBG,GACnE,EC6HF,SAAS0D,EAAeC,GAMtB,OAAO,SAAyBd,EAAO5G,GACrC,QAAgB2H,IAAZ3H,IA0KR,SAAwB4G,GACtB,GAAc,OAAVA,GAAmC,iBAAVA,EAAoB,OAAO,EACxD,MAAMgB,EAAQpE,OAAOqE,eAAejB,GACpC,OAAOgB,IAAUpE,OAAOsE,WAAuB,OAAVF,CACvC,CA9KkCG,CAAc/H,GAC1C,MAAM,IAAIgI,UAAU,8CAGtB,MAAMxH,WAAEA,EAAUC,YAAEA,EAAWC,YAAEA,GAyBrC,SAA4BkG,GAC1B,MAAMqB,SAAcrB,EAGpB,GAAa,WAATqB,EACF,OAAOrB,EAAQ,GACX,CAAEpG,YAAY,EAAMC,aAAcmG,GAClC,CAAEpG,YAAY,EAAOC,YAAamG,GAIxC,GAAa,WAATqB,GAA8B,WAATA,EACvB,MAAM,IAAID,UACR,oEAAoEC,KAKxE,MAAMC,EAAe,WAATD,EAed,SAAyBrB,GACvB,IAAKrC,OAAO4D,SAASvB,GACnB,MAAM,IAAI5F,MAAM,8DAGlB,MAAMkH,EAAMtB,EAAMtC,WAGlB,OAAI4D,EAAIE,SAAS,MAAQF,EAAIE,SAAS,KAC7BC,EAAyBH,GAG3BA,CACT,CA3BMI,CAAe1B,GAoCrB,SAAiCA,GAC/B,MAAM2B,EAAU3B,EAAMxB,OAEtB,GAAuB,IAAnBmD,EAAQjH,OACV,MAAM,IAAIN,MAAM,2BAA2B4F,MAI7C,GAAIrC,OAAOiE,MAAMjE,OAAOgE,IACtB,MAAM,IAAIvH,MAAM,2BAA2B4F,MAI7C,OAAI2B,EAAQH,SAAS,MAAQG,EAAQH,SAAS,KACrCC,EAAyBE,GAG3BA,CACT,CArDME,CAAuB7B,GAE3B,OA2DF,SAA6BsB,GAE3B,MAAM1H,EAAwB,MAAX0H,EAAI,GACnB1H,IACF0H,EAAMA,EAAI1G,MAAM,IAIlB,MAAMkH,EAAWR,EAAIS,QAAQ,KAC7B,IAAiB,IAAbD,EACF,MAAO,CAAElI,aAAYC,YAAaiB,OAAOwG,IAG3C,MAAMU,EAAaV,EAAI1G,MAAM,EAAGkH,IAAa,IACvChI,EAAcwH,EAAI1G,MAAMkH,EAAW,GAEzC,MAAO,CAAElI,aAAYC,YAAaiB,OAAOkH,GAAalI,cACxD,CA5ESmI,CAAmBX,EAC5B,CAhDqDY,CAAkBlC,GACnE,OAAO,IAAIc,EAAc1H,GAASO,QAAQC,EAAYC,EAAaC,EACrE,CACF,CAiIA,SAAS2H,EAA0BH,GACjC,MAAOa,EAAUC,GAAUd,EAAIe,cAAcC,MAAM,KAC7CC,EAAMC,SAASJ,EAAQ,IAGvBN,EAAWK,EAASJ,QAAQ,KAC5BU,OAASX,EACXK,EACAA,EAASvH,MAAM,EAAGkH,GAAYK,EAASvH,MAAMkH,EAAW,GAItDY,IAH6B,IAAbZ,EAAkBK,EAASzH,OAASoH,GAGnBS,EAEvC,OAAIG,GAAkBD,EAAO/H,OAEpB+H,EAAS,IAAIE,OAAOD,EAAiBD,EAAO/H,QAGjDgI,GAAkB,EAEb,KAAO,IAAIC,QAAQD,GAAkBD,EAIvCA,EAAO7H,MAAM,EAAG8H,GAAkB,IAAMD,EAAO7H,MAAM8H,EAC9D,CA6BA,MAAME,EAA2F/B,ECta1F,cAAqB1H,EAC1BE,aAAe,OACfC,qBAAuB,QACvBC,SAAW,MAEXsJ,UAAY,CAAC,QAAS,SAAU,SAAU,QAAS,OAAQ,QAAS,SAAU,SAC9E/D,cAAgB,CAAC,GAAI,OAAQ,QAAS,WAAY,WAAY,UAAW,SAAU,UAAW,WAAY,WAG1G9D,WAAa,CAAC,OAAQ,MAAO,QAAS,QAAS,UAAW,aAAc,YAAa,aACrF8H,mBAAqB,CAAC,GAAI,QAAS,UAAW,UAAW,YAAa,eAAgB,cAAe,eACrGC,iBAAmB,CAAC,GAAI,OAAQ,SAAU,UAAW,YAAa,eAAgB,cAAe,eAGjGC,UAAY,CAAC,QAAS,QAAS,UAAW,UAAW,YAAa,eAAgB,cAAe,eACjGC,kBAAoB,CAAC,OAAQ,OAAQ,SAAU,SAAU,WAAY,cAAe,aAAc,cAGlGC,KAAO,CACLC,UAAW,CACT,OAAQ,QAAS,QAAS,QAAS,OAAQ,MAAO,OAAQ,SAAU,OAAQ,OAC5E,UAAW,WAAY,YAAa,YAAa,WAAY,UAAW,WAAY,aAAc,YAEpGC,SAAU,CACR,QAAS,SAAU,OAAQ,OAAQ,MAAO,KAAM,MAAO,OAAQ,MAAO,MACtE,YAAa,aAAc,YAAa,YAAa,WAAY,UAAW,WAAY,aAAc,aAI1GlE,WAAAA,CAAa9F,EAAU,IACrB+F,QAEAzF,KAAKW,WAAW,CACd+E,OAAQ,aACPhG,QAG0B2H,IAAzB3H,EAAQC,eACVK,KAAKL,aAAeD,EAAQC,aAEhC,CAGA,gBAAIgK,GACF,OAAO3J,KAAKwJ,KAA6B,aAAxBxJ,KAAKN,QAAQgG,OAAwB,WAAa,YACrE,CAGApB,cAAAA,CAAgBsF,EAAaC,EAAYC,GACvC,MAAMC,EAAOH,EAAc,IACrBI,EAAcJ,EAAc,IAC5BpF,EAAWC,KAAKC,MAAMsF,GAC5B,IAAIC,EAAc,GAGlB,GAAIzF,EAAW,EACb,GAAa,IAATuF,GAA2B,IAAbvF,EAChByF,EAAcjK,KAAKsJ,UAAU,OACxB,CACL,MAAMY,EAAelK,KAAKoF,cAAcZ,GACpC0F,IACFD,EAAcC,EACD,IAATH,IACFE,GAAe,MAGrB,CAIF,GAAIF,EAAO,EACT,GAAIA,EAAO,GACT,GAAa,IAATA,GAA2B,IAAbvF,GAAkBqF,EAAa,EAAG,CAElD,MAAMM,EAAWlG,OAAO6F,GAClBM,EAAM3F,KAAKC,MAAMD,KAAK4F,MAAMF,IAEhCF,EADEG,EAAM,GAAM,GAAKN,IAAe1I,OAAO,EAAIqD,KAAK2F,IAAI,GAAIA,IAC5B,IAAhBR,EAAoB5J,KAAKsJ,UAAUO,GAAc7J,KAAKuJ,kBAAkBM,GAExE7J,KAAKsJ,UAAUO,EAEjC,MACEI,GADkB,IAATF,GAAcF,EAAa,EACrB7J,KAAKsB,WAAWuI,GAEhB7J,KAAK2J,aAAaI,EAAO,OAErC,CACL,MAAMP,EAAOO,EAAO,GACdO,EAAY7F,KAAKC,MAAMqF,EAAO,IAAM,EAEtCP,EAAO,IACTS,GAAejK,KAAK2J,aAAaH,EAAO,GACxCS,GAAe,MAEjBA,GAAejK,KAAKmJ,UAAUmB,EAChC,CAGF,OAAOL,CACT,CAGA1J,cAAAA,CAAgBJ,GACd,GAAoB,KAAhBA,EACF,OAAOH,KAAKH,SAEd,IAAI0K,EAAOpK,EACPqK,EAAQ,EACRvH,EAAS,GAGb,KAAOsH,EAAO,IAAI,CAChB,MAAME,EAAkBxG,OAAOsG,EAAO,OAGtC,GAFAA,GAAc,MAEVE,EAAkB,EAAG,CACvB,MAAMC,EAAmB1K,KAAKsE,eAAemG,EAAiBD,EAAOrK,GAEjEuK,IAEEF,EAAQ,IACNvH,IACFA,EAAS,KAAOA,GAGdwH,EAAkB,KAGlBxH,EADgB,GADAwH,EAAkB,IAEzBzK,KAAKsB,WAAWkJ,GAAS,IAAMvH,EAC/BwH,GAAmB,GAAKA,GAAmB,GAC3CzK,KAAKqJ,iBAAiBmB,GAAS,IAAMvH,GAEpCA,EAASjD,KAAKoJ,mBAAmBoB,GAASxK,KAAKsB,WAAWkJ,IAAU,IAAMvH,GAM1FA,EAASyH,EAAmB,IAAMzH,EAEtC,CAEAuH,GACF,CAEA,OAAOvH,EAAOiE,QAAQ,OAAQ,KAAKpC,MACrC,IDqRI6F,EAAuExD,EExatE,cAA0B/D,EAC/BzD,aAAe,QACfC,qBAAuB,QACvBC,SAAW,QAEXyB,WAAa,CAAC,CAAC,qBAA4B,aACzC,CAAC,kBAAwB,aACzB,CAAC,eAAoB,WACrB,CAAC,YAAgB,UACjB,CAAC,SAAY,UACb,CAAC,MAAO,OACR,CAAC,KAAM,OACP,CAAC,IAAK,UACN,CAAC,IAAK,UACN,CAAC,IAAK,UACN,CAAC,IAAK,UACN,CAAC,IAAK,QACN,CAAC,IAAK,QACN,CAAC,IAAK,QACN,CAAC,IAAK,UACN,CAAC,IAAK,MACN,CAAC,GAAI,UACL,CAAC,GAAI,UACL,CAAC,GAAI,SACL,CAAC,GAAI,QACL,CAAC,GAAI,OACL,CAAC,GAAI,QACL,CAAC,GAAI,MACL,CAAC,GAAI,OACL,CAAC,GAAI,OACL,CAAC,GAAI,YF2YHsJ,EAAkEzD,EGzajE,cAAqBxD,EAC1BhE,aAAe,SACfC,qBAAuB,QACvBC,SAAW,QACXgE,YAAc,KAEdD,kBAAoB,CAClB,QACA,KACA,MACA,MACA,MACA,OACA,MACA,MACA,KACA,MACA,KACA,QACA,OACA,OACA,QACA,QACA,MACA,QACA,QACA,OACA,MACA,OACA,OACA,OACA,SACA,QACA,UACA,QACA,OACA,UACA,QACA,UACA,SACA,UACA,UACA,YACA,SACA,YACA,UACA,WACA,SACA,WACA,aACA,YACA,aACA,cACA,WACA,YACA,WACA,WACA,SACA,SACA,UACA,YACA,WACA,WACA,YACA,UACA,SACA,QACA,MACA,UACA,UACA,UACA,UACA,YACA,UACA,WACA,UACA,UACA,QACA,UACA,WACA,WACA,YACA,WACA,YACA,WACA,UACA,QACA,MACA,QACA,SACA,SACA,SACA,SACA,UACA,SACA,QACA,UACA,QACA,WACA,YACA,YACA,YACA,YACA,aACA,YACA,WACA,aAGFtC,WAAa,CACX,GACA,QACA,MACA,OACA,MACA,MACA,MACA,OACA,UHoTEuJ,EAA2G1D,EI1a1G,cAA6BpC,EAClCpF,aAAe,QACfC,qBAAuB,QACvBC,SAAW,MACXE,qBAAsB,EAGtBiF,UAAY,CACV,EAAG,MACH,EAAG,QACH,EAAG,OACH,EAAG,QACH,EAAG,OACH,EAAG,MACH,EAAG,OACH,EAAG,QACH,EAAG,QAGLE,WAAa,CACX,EAAG,OACH,EAAG,UACH,EAAG,WACH,EAAG,WACH,EAAG,YACH,EAAG,WACH,EAAG,UACH,EAAG,WACH,EAAG,YACH,EAAG,YAGLC,cAAgB,CACd,EAAG,QACH,E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,OACL,CAAC,GAAI,SACL,CAAC,GAAI,WACL,CAAC,GAAI,QACL,CAAC,GAAI,OACL,CAAC,GAAI,OACL,CAAC,GAAI,UAIPiB,eAAAA,CAAiBI,EAAWC,GAC1B,MAAMS,EAAgBH,OAAOC,KAAKR,GAAW,GACvCW,EAAiBJ,OAAO0D,OAAOjE,GAAW,GAC1Ca,EAAgBN,OAAOC,KAAKP,GAAW,GACvCa,EAAiBP,OAAO0D,OAAOhE,GAAW,GAGhD,OAAuB,KAAnBU,EACKV,EAOLa,EAAiBH,EACZ,CAAE,CAAC,GAAGD,KAAiBG,KAAkBF,EAAiBG,GAI5D,CAAE,CAAC,GAAGJ,KAAiBG,KAAkBF,EAAiBG,EACnE,IbuWImK,EAAoEzG,EcrbnE,cAAuBxD,EAC5BhE,aAAe,KACfC,qBAAuB,QACvBC,SAAW,QACXgE,YAAc,KACd9D,qBAAsB,EAEtB6D,kBAAoB,CAClB,QACA,KACA,KACA,OACA,MACA,OACA,IACA,MACA,KACA,KACA,KACA,SACA,MACA,MACA,MACA,OACA,MACA,QACA,OACA,QACA,MACA,QACA,QACA,UACA,QACA,OACA,SACA,WACA,WACA,WACA,QACA,UACA,SACA,UACA,UACA,WACA,SACA,WACA,UACA,WACA,QACA,UACA,UACA,YACA,WACA,YACA,UACA,WACA,UACA,UACA,OACA,QACA,OACA,SACA,OACA,SACA,QACA,UACA,UACA,SACA,MACA,OACA,OACA,SACA,OACA,QACA,OACA,OACA,OACA,cACA,UACA,SACA,QACA,QACA,UACA,UACA,QACA,YACA,WACA,WACA,OACA,UACA,SACA,SACA,WACA,SACA,SACA,WACA,UACA,WACA,QACA,SACA,QACA,UACA,UACA,UACA,SACA,WACA,WACA,YAGFtC,WAAa,CACX,GACA,OACA,MACA,OACA,MACA,MACA,MACA,OACA,Sd+TEuM,EAA2F1G,Eerb1F,cAAqBpC,EAC1BpF,aAAe,QACfC,qBAAuB,QACvBC,SAAW,MACXE,qBAAsB,EAGtBiF,UAAY,CACV,EAAG,MACH,EAAG,OACH,EAAG,MACH,EAAG,OACH,EAAG,MACH,EAA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,QACA,SACA,SACA,UACA,UACA,QACA,MACA,QACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UACA,QACA,UACA,SACA,UACA,SACA,WACA,UACA,WACA,WACA,QACA,OACA,UACA,OACA,QACA,OACA,OACA,QACA,UACA,UACA,OACA,MACA,OACA,OACA,QACA,QACA,QACA,SACA,QACA,QACA,UACA,QACA,UACA,SACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,QACA,UACA,QACA,SACA,SACA,QACA,SACA,UACA,UACA,QACA,QACA,WACA,QACA,UACA,UACA,SACA,UACA,WACA,WACA,aAGFtC,WAAa,CACX,GACA,QACA,MACA,QACA,MACA,MACA,MACA,OACA,ShBkUEyM,EAAqE5G,EiBxbpE,cAAwB9F,EAC7B1B,aAAe,SACfC,qBAAuB,QACvBC,SAAW,QAEXyB,WAAa,CACX,CAAC,8BAAwC,gBACzC,CAAC,2BAAoC,cACrC,CAAC,wBAAgC,aACjC,CAAC,qBAA4B,WAC7B,CAAC,kBAAwB,YACzB,CAAC,eAAoB,UACrB,CAAC,YAAgB,YACjB,CAAC,SAAY,UACb,CAAC,MAAO,QACR,CAAC,KAAM,QACP,CAAC,IAAK,aACN,CAAC,IAAK,YACN,CAAC,IAAK,UACN,CAAC,IAAK,UACN,CAAC,IAAK,SACN,CAAC,IAAK,WACN,CAAC,IAAK,WACN,CAAC,IAAK,gBACN,CAAC,IAAK,eACN,CAAC,IAAK,aACN,CAAC,IAAK,aACN,CAAC,IAAK,YACN,CAAC,IAAK,cACN,CAAC,IAAK,eACN,CAAC,IAAK,eACN,CAAC,IAAK,aACN,CAAC,IAAK,QACN,CAAC,IAAK,eACN,CAAC,IAAK,cACN,CAAC,IAAK,YACN,CAAC,IAAK,YACN,CAAC,IAAK,WACN,CAAC,IAAK,aACN,CAAC,IAAK,cACN,CAAC,IAAK,cACN,CAAC,IAAK,YACN,CAAC,IAAK,OACN,CAAC,GAAI,UACL,CAAC,GAAI,SACL,CAAC,GAAI,OACL,CAAC,GAAI,OACL,CAAC,GAAI,MACL,CAAC,GAAI,QACL,CAAC,GAAI,SAC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Gf,MAAMC,EAAYF,EAAI,IAChBG,EAAgBH,EAAI,KAE1B,OAAIE,EAAY,IAAMA,EAAY,KAAOC,EAAgB,KAAOA,EAAgB,KACvEF,EAAM,GAGRA,EAAM,EACf,I7BmWIuG,EAAsEjL,EAAcL,GACpFuL,EAAmElL,E8BtclE,cAAsBxD,EAC3BhE,aAAe,QACfC,qBAAuB,SACvBC,SAAW,QACXgE,YAAc,KAEdD,kBAAoB,CAClB,QACA,MACA,KACA,OACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,SACA,QACA,QACA,QACA,SACA,QACA,SACA,SACA,OACA,MACA,OACA,MACA,MACA,OACA,OACA,OACA,OACA,OACA,QACA,MACA,QACA,OACA,OACA,QACA,QACA,OACA,QACA,QACA,SACA,OACA,SACA,QACA,UACA,SACA,SACA,QACA,UACA,SACA,QACA,QACA,SACA,QACA,SACA,UACA,UACA,QACA,UACA,SACA,QACA,MACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,OACA,SACA,OACA,SACA,QACA,QACA,SACA,UACA,SACA,QACA,QACA,QACA,OACA,SACA,QACA,SACA,UACA,QACA,QACA,SACA,QACA,QACA,OACA,UACA,SACA,UACA,WACA,WACA,UACA,UACA,UACA,YAGFtC,WAAa,CACX,GACA,QACA,MACA,OACA,MACA,MACA,MACA,MACA,U9BiVEgR,EAA+FnL,E+Bvc9F,cAAuB1H,EAC5BE,aAAe,QACfC,qBAAuB,UACvBC,SAAW,OAEXmF,UAAY,CACV,EAAG,MACH,EAAG,MACH,EAAG,OACH,EAAG,QACH,EAAG,QACH,EAAG,OACH,EAAG,QACH,EAAG,MACH,EAAG,QAGLC,kBAAoB,CAClB,EAAG,MACH,EAAG,OACH,EAAG,OACH,EAAG,QACH,EAAG,QACH,EAAG,OACH,EAAG,QACH,EAAG,MACH,EAAG,QAGLC,WAAa,CACX,EAAG,OACH,EAAG,aACH,EAAG,eACH,EAAG,eACH,EAAG,cACH,EAAG,gBACH,EAAG,cACH,EAAG,gBACH,EAAG,cACH,EAAG,gBAGLqN,oBAAsB,C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A,SACA,SACA,SACA,QACA,MACA,MACA,QACA,SACA,QACA,YACA,aACA,YACA,YACA,YACA,UACA,UACA,YACA,aACA,SACA,eACA,gBACA,iBACA,iBACA,eACA,aACA,aACA,eACA,gBACA,UACA,gBACA,iBACA,kBACA,kBACA,gBACA,cACA,cACA,gBACA,iBACA,UACA,gBACA,iBACA,kBACA,kBACA,gBACA,cACA,cACA,gBACA,iBACA,SACA,eACA,gBACA,iBACA,iBACA,eACA,aACA,aACA,eACA,gBACA,SACA,eACA,gBACA,iBACA,iBACA,eACA,aACA,aACA,eACA,gBACA,SACA,eACA,gBACA,iBACA,iBACA,eACA,aACA,aACA,eACA,gBACA,SACA,eACA,gBACA,iBACA,iBACA,eACA,aACA,aACA,eACA,gBACA,WACA,mBACA,oBACA,oBACA,oBACA,mBACA,iBACA,iBACA,mBACA,qBAGFwB,cAAgB,CACd,GACA,OACA,UACA,WACA,SACA,QACA,UACA,UACA,UACA,eAIFJ,UAAY,CACV,QACA,SACA,SACA,SACA,QACA,MACA,MACA,QACA,UAGF1D,WAAa,CACX,GACA,SACA,SACA,OACA,OACA,QACA,OACA,OACA,SAIF4T,mBAAAA,CAAqB3O,GACnB,OAAOvG,KAAK4D,kBAAkB2C,EAChC,CAEA4O,oBAAAA,CAAsB5O,GACpB,GAAe,IAAXA,EAAc,MAAO,GACzB,GAAIA,EAAS,IAAK,OAAOvG,KAAKkV,oBAAoB3O,GAElD,MAAM/B,EAAWC,KAAKC,MAAM6B,EAAS,KAC/BtF,EAAYsF,EAAS,IAC3B,IAAI6O,EAAcpV,KAAKoF,cAAcZ,GAEjCvD,EAAY,IACVmU,EAAYzI,SAAS,MACvByI,EAAcA,EAAYlO,QAAQ,MAAO,QAChCkO,EAAYzI,SAAS,QAC9ByI,EAAcA,EAAYlU,MAAM,GAAG,GAAM,SAI7C,MAAMyD,EAAQ,CAACyQ,GAKf,OAJInU,EAAY,GACd0D,EAAMrE,KAAKN,KAAKkV,oBAAoBjU,IAG/B0D,EAAMlE,KAAK,KAAKqE,MACzB,CAEAuQ,WAAAA,CAAa9O,GAC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Ae,OACfC,qBAAuB,UACvBC,SAAW,MACXgE,YAAc,KAEdD,kBAAoB,CAClB,MACA,MACA,KACA,MACA,MACA,OACA,KACA,MACA,MACA,KACA,KACA,QACA,OACA,OACA,OACA,QACA,OACA,OACA,SACA,OACA,MACA,OACA,QACA,QACA,QACA,OACA,QACA,SACA,UACA,QACA,MACA,QACA,OACA,SACA,SACA,SACA,QACA,SACA,QACA,UACA,QACA,UACA,SACA,WACA,SACA,WACA,SACA,WACA,UACA,QACA,OACA,QACA,OACA,OACA,MACA,OACA,OACA,QACA,SACA,QACA,OACA,QACA,QACA,QACA,SACA,SACA,UACA,QACA,QACA,QACA,MACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,SACA,QACA,MACA,SACA,QACA,SACA,SACA,QACA,SACA,QACA,SACA,QACA,MACA,SACA,QACA,SACA,UACA,SACA,UACA,SACA,UACA,UAGFtC,WAAa,CACX,GACA,OACA,OACA,OACA,MACA,OACA,MACA,MACA,U7CgWEgV,GAAsEnP,E8CtdrE,cAAyB1H,EAC9BE,aAAe,KACfC,qBAAuB,OACvBC,SAAW,QAEX0W,iBAAmB,CACjB,EAAG,QACH,EAAG,MACH,EAAG,MACH,EAAG,KACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,OACH,GAAI,OACJ,GAAI,WACJ,GAAI,WACJ,GAAI,UACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,aAGNpR,cAAgB,CACd,GAAI,WACJ,GAAI,UACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,aAGN7D,WAAa,CACX,EAAG,QACH,EAAG,QACH,EAAG,KACH,EAAG,WACH,EAAG,gBACH,EAAG,cACH,EAAG,aACH,EAAG,aACH,EAAG,YACH,GAAI,YACJ,GAAI,YACJ,GAAI,cACJ,GAAI,eACJ,GAAI,eACJ,GAAI,oBACJ,GAAI,eACJ,GAAI,kBACJ,GAAI,gBACJ,GAAI,iBACJ,GAAI,gBAINkV,cAAAA,CAAgBjQ,GACd,MAAMkQ,EAAYlQ,EAAS,GACrBmQ,EAAWnQ,EAASkQ,EACpBE,EAAe3W,KAAKmF,cAAcuR,GACxC,GAAkB,IAAdD,EACF,OAAOE,EAGT,IAAI1E,EADkBjS,KAAKuW,iBAAiBE,GAQ5C,OANkB,IAAdA,IACFxE,EAAS,OAEO,IAAdwE,IACFxE,EAAS,OAEJ0E,EAAe,IAAM1E,CAC9B,CAGA2E,eAAAA,CAAiBrQ,GACf,MAAMlG,EAAQ,GACRwW,EAAgBtQ,EAAS,IACzBuQ,EAAevQ,EAASsQ,EAiB9B,OAhBIC,EAAe,GACjBzW,EAAMC,KAAKN,KAAKuW,iBAAiBO,EAAe,KAAM,QAEpDD,EAAgB,GAAKA,EAAgB,KACnCxW,EAAMW,OAAS,GACjBX,EAAMC,KAAK,MAES,IAAlBuW,EACFxW,EAAMC,KAAK,OAEXD,EAAMC,KAAKN,KAAKuW,iBAAiBM,KAGjCA,GAAiB,IACnBxW,EAAMC,KAAKN,KAAKO,eAAesW,IAE1BxW,EAAMI,KAAK,IACpB,CAGAsW,eAAAA,CAAiBxQ,GACf,MAAMlG,EAAQ,GACd,IAAI2W,EAAWzQ,EAAS,MACpB0Q,EAAQ,EACZ,KAAOD,GAAY,OACjBA,GAAsB,MACtBC,GAAgB,EAElB,MAAMxD,EAAIlN,EAAUyQ,EAAW5V,OAAOqD,KAAK2F,IAAI,IAAM6M,IAQrD,OAPA5W,EAAMC,KAAKN,KAAKO,eAAeyW,GAAWhX,KAAKsB,WAAW2V,IACtDxD,EAAI,KACFA,GAAK,KACPpT,EAAMC,KAAK,MAEbD,EAAMC,KAAKN,KAAKO,eAAekT,KAE1BpT,EAAMI,KAAK,IACpB,CAEAF,cAAAA,CAAgBJ,GACd,OAAIA,EAAc,IACTH,KAAKuW,iBAAiBtS,OAAO9D,IAEhCA,EAAc,KACTH,KAAKwW,eAAevS,OAAO9D,IAE1BA,EAAc,MAAQH,KAAK4W,gBAAgB3S,OAAO9D,IAAgBH,KAAK+W,gBAAgB5W,EAGrG"}