stdnum 1.10.0 → 1.10.2

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 (496) hide show
  1. package/README.md +1 -0
  2. package/lib/cjs/in/gstin.js +3 -3
  3. package/lib/cjs/no/fodselsnummer.js +2 -2
  4. package/lib/cjs/tw/natid.js +8 -5
  5. package/lib/cjs/tw/ui.js +8 -5
  6. package/lib/esm/in/gstin.js +3 -3
  7. package/lib/esm/no/fodselsnummer.js +2 -2
  8. package/lib/esm/tw/natid.js +8 -5
  9. package/lib/esm/tw/ui.js +8 -5
  10. package/package.json +5 -2
  11. package/src/ad/index.ts +1 -0
  12. package/src/ad/nrt.spec.ts +36 -0
  13. package/src/ad/nrt.ts +87 -0
  14. package/src/al/index.ts +1 -0
  15. package/src/al/nipt.spec.ts +43 -0
  16. package/src/al/nipt.ts +111 -0
  17. package/src/ar/cbu.spec.ts +28 -0
  18. package/src/ar/cbu.ts +96 -0
  19. package/src/ar/cuit.spec.ts +28 -0
  20. package/src/ar/cuit.ts +102 -0
  21. package/src/ar/dni.spec.ts +22 -0
  22. package/src/ar/dni.ts +72 -0
  23. package/src/ar/index.ts +3 -0
  24. package/src/at/businessid.spec.ts +34 -0
  25. package/src/at/businessid.ts +73 -0
  26. package/src/at/index.ts +4 -0
  27. package/src/at/tin.spec.ts +173 -0
  28. package/src/at/tin.ts +140 -0
  29. package/src/at/uid.spec.ts +44 -0
  30. package/src/at/uid.ts +84 -0
  31. package/src/at/vnr.spec.ts +38 -0
  32. package/src/at/vnr.ts +84 -0
  33. package/src/au/abn.spec.ts +28 -0
  34. package/src/au/abn.ts +78 -0
  35. package/src/au/acn.spec.ts +34 -0
  36. package/src/au/acn.ts +76 -0
  37. package/src/au/index.ts +3 -0
  38. package/src/au/tfn.spec.ts +28 -0
  39. package/src/au/tfn.ts +79 -0
  40. package/src/az/index.ts +2 -0
  41. package/src/az/pin.spec.ts +16 -0
  42. package/src/az/pin.ts +61 -0
  43. package/src/az/tin.spec.ts +28 -0
  44. package/src/az/tin.ts +64 -0
  45. package/src/ba/index.ts +1 -0
  46. package/src/ba/jmbg.spec.ts +28 -0
  47. package/src/ba/jmbg.ts +85 -0
  48. package/src/be/bis.spec.ts +184 -0
  49. package/src/be/bis.ts +85 -0
  50. package/src/be/index.ts +4 -0
  51. package/src/be/insz.spec.ts +51 -0
  52. package/src/be/insz.ts +55 -0
  53. package/src/be/nn.spec.ts +117 -0
  54. package/src/be/nn.ts +77 -0
  55. package/src/be/personIdentifierHelpers.spec.ts +254 -0
  56. package/src/be/personIdentifierHelpers.ts +130 -0
  57. package/src/be/vat.spec.ts +46 -0
  58. package/src/be/vat.ts +84 -0
  59. package/src/bg/egn.spec.ts +28 -0
  60. package/src/bg/egn.ts +75 -0
  61. package/src/bg/index.ts +3 -0
  62. package/src/bg/pnf.spec.ts +28 -0
  63. package/src/bg/pnf.ts +73 -0
  64. package/src/bg/vat.spec.ts +34 -0
  65. package/src/bg/vat.ts +120 -0
  66. package/src/br/cnpj.spec.ts +34 -0
  67. package/src/br/cnpj.ts +89 -0
  68. package/src/br/cpf.spec.ts +34 -0
  69. package/src/br/cpf.ts +87 -0
  70. package/src/br/index.ts +2 -0
  71. package/src/by/index.ts +1 -0
  72. package/src/by/unp.spec.ts +34 -0
  73. package/src/by/unp.ts +108 -0
  74. package/src/bz/index.ts +1 -0
  75. package/src/bz/tin.spec.ts +28 -0
  76. package/src/bz/tin.ts +67 -0
  77. package/src/ca/bn.spec.ts +40 -0
  78. package/src/ca/bn.ts +88 -0
  79. package/src/ca/gst.spec.ts +34 -0
  80. package/src/ca/gst.ts +70 -0
  81. package/src/ca/index.ts +5 -0
  82. package/src/ca/pst.spec.ts +28 -0
  83. package/src/ca/pst.ts +71 -0
  84. package/src/ca/qst.spec.ts +47 -0
  85. package/src/ca/qst.ts +88 -0
  86. package/src/ca/sin.spec.ts +34 -0
  87. package/src/ca/sin.ts +72 -0
  88. package/src/ch/index.ts +3 -0
  89. package/src/ch/ssn.spec.ts +50 -0
  90. package/src/ch/ssn.ts +74 -0
  91. package/src/ch/uid.spec.ts +34 -0
  92. package/src/ch/uid.ts +82 -0
  93. package/src/ch/vat.spec.ts +28 -0
  94. package/src/ch/vat.ts +83 -0
  95. package/src/cl/index.ts +2 -0
  96. package/src/cl/run.ts +13 -0
  97. package/src/cl/rut.spec.ts +50 -0
  98. package/src/cl/rut.ts +97 -0
  99. package/src/cn/index.ts +2 -0
  100. package/src/cn/ric.spec.ts +34 -0
  101. package/src/cn/ric.ts +86 -0
  102. package/src/cn/uscc.spec.ts +34 -0
  103. package/src/cn/uscc.ts +110 -0
  104. package/src/co/index.ts +1 -0
  105. package/src/co/nit.spec.ts +40 -0
  106. package/src/co/nit.ts +85 -0
  107. package/src/cr/cpf.spec.ts +34 -0
  108. package/src/cr/cpf.ts +93 -0
  109. package/src/cr/cpj.spec.ts +28 -0
  110. package/src/cr/cpj.ts +111 -0
  111. package/src/cr/cr.spec.ts +28 -0
  112. package/src/cr/cr.ts +75 -0
  113. package/src/cr/index.ts +3 -0
  114. package/src/cu/index.ts +1 -0
  115. package/src/cu/ni.spec.ts +34 -0
  116. package/src/cu/ni.ts +74 -0
  117. package/src/cy/index.ts +1 -0
  118. package/src/cy/vat.spec.ts +28 -0
  119. package/src/cy/vat.ts +98 -0
  120. package/src/cz/dic.spec.ts +28 -0
  121. package/src/cz/dic.ts +127 -0
  122. package/src/cz/index.ts +2 -0
  123. package/src/cz/rc.spec.ts +44 -0
  124. package/src/cz/rc.ts +95 -0
  125. package/src/de/idnr.spec.ts +34 -0
  126. package/src/de/idnr.ts +91 -0
  127. package/src/de/index.ts +6 -0
  128. package/src/de/passport.spec.ts +31 -0
  129. package/src/de/passport.ts +86 -0
  130. package/src/de/pwnr.spec.ts +62 -0
  131. package/src/de/pwnr.ts +190 -0
  132. package/src/de/stnr.spec.ts +85 -0
  133. package/src/de/stnr.ts +193 -0
  134. package/src/de/svnr.spec.ts +56 -0
  135. package/src/de/svnr.ts +158 -0
  136. package/src/de/vat.spec.ts +28 -0
  137. package/src/de/vat.ts +74 -0
  138. package/src/dk/cpr.spec.ts +34 -0
  139. package/src/dk/cpr.ts +129 -0
  140. package/src/dk/cvr.spec.ts +28 -0
  141. package/src/dk/cvr.ts +81 -0
  142. package/src/dk/index.ts +2 -0
  143. package/src/do/cedula.spec.ts +34 -0
  144. package/src/do/cedula.ts +67 -0
  145. package/src/do/index.ts +3 -0
  146. package/src/do/ncf.spec.ts +34 -0
  147. package/src/do/ncf.ts +133 -0
  148. package/src/do/rnc.spec.ts +40 -0
  149. package/src/do/rnc.ts +74 -0
  150. package/src/dz/index.ts +1 -0
  151. package/src/dz/nif.spec.ts +39 -0
  152. package/src/dz/nif.ts +80 -0
  153. package/src/ec/ci.spec.ts +28 -0
  154. package/src/ec/ci.ts +92 -0
  155. package/src/ec/index.ts +2 -0
  156. package/src/ec/ruc.spec.ts +37 -0
  157. package/src/ec/ruc.ts +117 -0
  158. package/src/ee/ik.spec.ts +28 -0
  159. package/src/ee/ik.ts +114 -0
  160. package/src/ee/index.ts +3 -0
  161. package/src/ee/kmkr.spec.ts +28 -0
  162. package/src/ee/kmkr.ts +76 -0
  163. package/src/ee/registrikood.spec.ts +28 -0
  164. package/src/ee/registrikood.ts +80 -0
  165. package/src/eg/index.ts +1 -0
  166. package/src/eg/tn.spec.ts +44 -0
  167. package/src/eg/tn.ts +96 -0
  168. package/src/es/cif.spec.ts +43 -0
  169. package/src/es/cif.ts +84 -0
  170. package/src/es/dni.spec.ts +28 -0
  171. package/src/es/dni.ts +83 -0
  172. package/src/es/index.ts +5 -0
  173. package/src/es/nie.spec.ts +28 -0
  174. package/src/es/nie.ts +79 -0
  175. package/src/es/nif.spec.ts +52 -0
  176. package/src/es/nif.ts +95 -0
  177. package/src/es/nss.spec.ts +28 -0
  178. package/src/es/nss.ts +132 -0
  179. package/src/exceptions.ts +66 -0
  180. package/src/fi/alv.spec.ts +28 -0
  181. package/src/fi/alv.ts +76 -0
  182. package/src/fi/hetu.spec.ts +37 -0
  183. package/src/fi/hetu.ts +108 -0
  184. package/src/fi/index.ts +3 -0
  185. package/src/fi/ytunnus.spec.ts +28 -0
  186. package/src/fi/ytunnus.ts +49 -0
  187. package/src/fo/index.ts +1 -0
  188. package/src/fo/vn.spec.ts +34 -0
  189. package/src/fo/vn.ts +71 -0
  190. package/src/fr/index.ts +5 -0
  191. package/src/fr/nif.spec.ts +34 -0
  192. package/src/fr/nif.ts +82 -0
  193. package/src/fr/nir.spec.ts +36 -0
  194. package/src/fr/nir.ts +98 -0
  195. package/src/fr/siren.spec.ts +28 -0
  196. package/src/fr/siren.ts +68 -0
  197. package/src/fr/siret.spec.ts +38 -0
  198. package/src/fr/siret.ts +79 -0
  199. package/src/fr/tva.spec.ts +40 -0
  200. package/src/fr/tva.ts +125 -0
  201. package/src/gb/index.ts +3 -0
  202. package/src/gb/nino-prefixes.ts +245 -0
  203. package/src/gb/nino.spec.ts +80 -0
  204. package/src/gb/nino.ts +80 -0
  205. package/src/gb/utr.spec.ts +28 -0
  206. package/src/gb/utr.ts +76 -0
  207. package/src/gb/vat.spec.ts +40 -0
  208. package/src/gb/vat.ts +112 -0
  209. package/src/gen/ean.spec.ts +34 -0
  210. package/src/gen/ean.ts +71 -0
  211. package/src/gen/index.ts +1 -0
  212. package/src/gh/index.ts +1 -0
  213. package/src/gh/tin.spec.ts +42 -0
  214. package/src/gh/tin.ts +93 -0
  215. package/src/gn/index.ts +1 -0
  216. package/src/gn/nifp.spec.ts +40 -0
  217. package/src/gn/nifp.ts +72 -0
  218. package/src/gr/amka.spec.ts +28 -0
  219. package/src/gr/amka.ts +76 -0
  220. package/src/gr/index.ts +2 -0
  221. package/src/gr/vat.spec.ts +34 -0
  222. package/src/gr/vat.ts +84 -0
  223. package/src/gt/cui.spec.ts +34 -0
  224. package/src/gt/cui.ts +110 -0
  225. package/src/gt/index.ts +2 -0
  226. package/src/gt/nit.spec.ts +34 -0
  227. package/src/gt/nit.ts +86 -0
  228. package/src/hk/hkid.spec.ts +52 -0
  229. package/src/hk/hkid.ts +90 -0
  230. package/src/hk/index.ts +1 -0
  231. package/src/hr/index.ts +1 -0
  232. package/src/hr/oib.spec.ts +28 -0
  233. package/src/hr/oib.ts +67 -0
  234. package/src/hu/anum.spec.ts +28 -0
  235. package/src/hu/anum.ts +71 -0
  236. package/src/hu/index.ts +1 -0
  237. package/src/id/index.ts +1 -0
  238. package/src/id/npwp.spec.ts +34 -0
  239. package/src/id/npwp.ts +116 -0
  240. package/src/ie/index.ts +2 -0
  241. package/src/ie/pps.spec.ts +58 -0
  242. package/src/ie/pps.ts +81 -0
  243. package/src/ie/vat.spec.ts +40 -0
  244. package/src/ie/vat.ts +99 -0
  245. package/src/il/hp.spec.ts +38 -0
  246. package/src/il/hp.ts +75 -0
  247. package/src/il/idnr.spec.ts +28 -0
  248. package/src/il/idnr.ts +70 -0
  249. package/src/il/index.ts +2 -0
  250. package/src/in/aadhaar.spec.ts +40 -0
  251. package/src/in/aadhaar.ts +85 -0
  252. package/src/in/epic.spec.ts +34 -0
  253. package/src/in/epic.ts +85 -0
  254. package/src/in/gstin.spec.ts +34 -0
  255. package/src/in/gstin.ts +156 -0
  256. package/src/in/index.ts +4 -0
  257. package/src/in/pan.spec.ts +40 -0
  258. package/src/in/pan.ts +93 -0
  259. package/src/index.ts +404 -0
  260. package/src/is/index.ts +2 -0
  261. package/src/is/kennitala.spec.ts +46 -0
  262. package/src/is/kennitala.ts +80 -0
  263. package/src/is/vsk.spec.ts +22 -0
  264. package/src/is/vsk.ts +60 -0
  265. package/src/it/aic.spec.ts +40 -0
  266. package/src/it/aic.ts +97 -0
  267. package/src/it/codicefiscale.spec.ts +28 -0
  268. package/src/it/codicefiscale.ts +167 -0
  269. package/src/it/index.ts +3 -0
  270. package/src/it/iva.spec.ts +28 -0
  271. package/src/it/iva.ts +65 -0
  272. package/src/jp/cn.spec.ts +28 -0
  273. package/src/jp/cn.ts +77 -0
  274. package/src/jp/index.ts +1 -0
  275. package/src/ke/index.ts +1 -0
  276. package/src/ke/pin.spec.ts +34 -0
  277. package/src/ke/pin.ts +77 -0
  278. package/src/kr/brn.spec.ts +28 -0
  279. package/src/kr/brn.ts +91 -0
  280. package/src/kr/index.ts +2 -0
  281. package/src/kr/rrn.spec.ts +34 -0
  282. package/src/kr/rrn.ts +104 -0
  283. package/src/li/index.ts +1 -0
  284. package/src/li/peid.spec.ts +22 -0
  285. package/src/li/peid.ts +71 -0
  286. package/src/lt/asmens.spec.ts +28 -0
  287. package/src/lt/asmens.ts +73 -0
  288. package/src/lt/index.ts +2 -0
  289. package/src/lt/pvm.spec.ts +34 -0
  290. package/src/lt/pvm.ts +75 -0
  291. package/src/lu/index.ts +1 -0
  292. package/src/lu/tva.spec.ts +28 -0
  293. package/src/lu/tva.ts +70 -0
  294. package/src/lv/index.ts +1 -0
  295. package/src/lv/pvn.spec.ts +44 -0
  296. package/src/lv/pvn.ts +102 -0
  297. package/src/ma/ice.spec.ts +39 -0
  298. package/src/ma/ice.ts +72 -0
  299. package/src/ma/ice9.spec.ts +28 -0
  300. package/src/ma/ice9.ts +62 -0
  301. package/src/ma/index.ts +2 -0
  302. package/src/mc/index.ts +1 -0
  303. package/src/mc/tva.spec.ts +28 -0
  304. package/src/mc/tva.ts +67 -0
  305. package/src/md/idno.spec.ts +28 -0
  306. package/src/md/idno.ts +78 -0
  307. package/src/md/index.ts +1 -0
  308. package/src/me/index.ts +2 -0
  309. package/src/me/jmbg.ts +17 -0
  310. package/src/me/pib.spec.ts +158 -0
  311. package/src/me/pib.ts +77 -0
  312. package/src/mk/edb.spec.ts +50 -0
  313. package/src/mk/edb.ts +88 -0
  314. package/src/mk/index.ts +2 -0
  315. package/src/mk/jmbg.ts +17 -0
  316. package/src/mt/index.ts +1 -0
  317. package/src/mt/vat.spec.ts +28 -0
  318. package/src/mt/vat.ts +69 -0
  319. package/src/mu/index.ts +1 -0
  320. package/src/mu/nid.spec.ts +34 -0
  321. package/src/mu/nid.ts +89 -0
  322. package/src/mx/banks.ts +658 -0
  323. package/src/mx/clabe.spec.ts +68 -0
  324. package/src/mx/clabe.ts +105 -0
  325. package/src/mx/curp.spec.ts +28 -0
  326. package/src/mx/curp.ts +261 -0
  327. package/src/mx/index.ts +3 -0
  328. package/src/mx/rfc.spec.ts +69 -0
  329. package/src/mx/rfc.ts +193 -0
  330. package/src/my/index.ts +1 -0
  331. package/src/my/nric.spec.ts +40 -0
  332. package/src/my/nric.ts +91 -0
  333. package/src/nl/bsn.spec.ts +68 -0
  334. package/src/nl/bsn.ts +81 -0
  335. package/src/nl/btw.spec.ts +40 -0
  336. package/src/nl/btw.ts +95 -0
  337. package/src/nl/index.ts +3 -0
  338. package/src/nl/onderwijsnummer.spec.ts +34 -0
  339. package/src/nl/onderwijsnummer.ts +77 -0
  340. package/src/no/fodselsnummer.spec.ts +56 -0
  341. package/src/no/fodselsnummer.ts +118 -0
  342. package/src/no/index.ts +4 -0
  343. package/src/no/kontonr.spec.ts +34 -0
  344. package/src/no/kontonr.ts +84 -0
  345. package/src/no/mva.spec.ts +28 -0
  346. package/src/no/mva.ts +80 -0
  347. package/src/no/orgnr.spec.ts +28 -0
  348. package/src/no/orgnr.ts +75 -0
  349. package/src/nz/bank.spec.ts +28 -0
  350. package/src/nz/bank.ts +238 -0
  351. package/src/nz/index.ts +2 -0
  352. package/src/nz/ird.spec.ts +34 -0
  353. package/src/nz/ird.ts +102 -0
  354. package/src/pe/ce.spec.ts +46 -0
  355. package/src/pe/ce.ts +61 -0
  356. package/src/pe/cui.spec.ts +28 -0
  357. package/src/pe/cui.ts +85 -0
  358. package/src/pe/index.ts +3 -0
  359. package/src/pe/ruc.spec.ts +46 -0
  360. package/src/pe/ruc.ts +84 -0
  361. package/src/pk/cnic.spec.ts +34 -0
  362. package/src/pk/cnic.ts +97 -0
  363. package/src/pk/index.ts +2 -0
  364. package/src/pk/ntn.spec.ts +22 -0
  365. package/src/pk/ntn.ts +65 -0
  366. package/src/pl/index.ts +3 -0
  367. package/src/pl/nip.spec.ts +34 -0
  368. package/src/pl/nip.ts +74 -0
  369. package/src/pl/pesel.spec.ts +34 -0
  370. package/src/pl/pesel.ts +97 -0
  371. package/src/pl/regon.spec.ts +52 -0
  372. package/src/pl/regon.ts +88 -0
  373. package/src/pt/cc.spec.ts +43 -0
  374. package/src/pt/cc.ts +74 -0
  375. package/src/pt/index.ts +3 -0
  376. package/src/pt/nif.spec.ts +28 -0
  377. package/src/pt/nif.ts +78 -0
  378. package/src/pt/nipc.ts +27 -0
  379. package/src/py/cedula.spec.ts +46 -0
  380. package/src/py/cedula.ts +73 -0
  381. package/src/py/index.ts +2 -0
  382. package/src/py/ruc.spec.ts +40 -0
  383. package/src/py/ruc.ts +93 -0
  384. package/src/ro/cif.spec.ts +40 -0
  385. package/src/ro/cif.ts +62 -0
  386. package/src/ro/cnp.spec.ts +50 -0
  387. package/src/ro/cnp.ts +158 -0
  388. package/src/ro/cui.spec.ts +28 -0
  389. package/src/ro/cui.ts +83 -0
  390. package/src/ro/index.ts +4 -0
  391. package/src/ro/onrc.spec.ts +28 -0
  392. package/src/ro/onrc.ts +109 -0
  393. package/src/rs/index.ts +2 -0
  394. package/src/rs/jmbg.ts +16 -0
  395. package/src/rs/pib.spec.ts +28 -0
  396. package/src/rs/pib.ts +69 -0
  397. package/src/ru/index.ts +1 -0
  398. package/src/ru/inn.spec.ts +32 -0
  399. package/src/ru/inn.ts +106 -0
  400. package/src/se/index.ts +3 -0
  401. package/src/se/orgnr.spec.ts +28 -0
  402. package/src/se/orgnr.ts +68 -0
  403. package/src/se/personnummer.spec.ts +45 -0
  404. package/src/se/personnummer.ts +143 -0
  405. package/src/se/vat.spec.ts +28 -0
  406. package/src/se/vat.ts +73 -0
  407. package/src/sg/index.ts +1 -0
  408. package/src/sg/uen.spec.ts +46 -0
  409. package/src/sg/uen.ts +209 -0
  410. package/src/si/ddv.spec.ts +28 -0
  411. package/src/si/ddv.ts +76 -0
  412. package/src/si/emso.spec.ts +15 -0
  413. package/src/si/emso.ts +27 -0
  414. package/src/si/index.ts +3 -0
  415. package/src/si/jmbg.ts +20 -0
  416. package/src/sk/dph.spec.ts +28 -0
  417. package/src/sk/dph.ts +71 -0
  418. package/src/sk/index.ts +2 -0
  419. package/src/sk/rc.ts +12 -0
  420. package/src/sm/coe.spec.ts +34 -0
  421. package/src/sm/coe.ts +80 -0
  422. package/src/sm/index.ts +1 -0
  423. package/src/sv/index.ts +1 -0
  424. package/src/sv/nit.spec.ts +34 -0
  425. package/src/sv/nit.ts +117 -0
  426. package/src/th/idnr.spec.ts +41 -0
  427. package/src/th/idnr.ts +80 -0
  428. package/src/th/index.ts +3 -0
  429. package/src/th/moa.spec.ts +62 -0
  430. package/src/th/moa.ts +85 -0
  431. package/src/th/tin.spec.ts +77 -0
  432. package/src/th/tin.ts +56 -0
  433. package/src/tn/index.ts +1 -0
  434. package/src/tn/mf.spec.ts +37 -0
  435. package/src/tn/mf.ts +169 -0
  436. package/src/tr/index.ts +2 -0
  437. package/src/tr/tckimlik.spec.ts +40 -0
  438. package/src/tr/tckimlik.ts +87 -0
  439. package/src/tr/vkn.spec.ts +28 -0
  440. package/src/tr/vkn.ts +87 -0
  441. package/src/tw/ban.spec.ts +28 -0
  442. package/src/tw/ban.ts +67 -0
  443. package/src/tw/index.ts +5 -0
  444. package/src/tw/natid.spec.ts +41 -0
  445. package/src/tw/natid.ts +109 -0
  446. package/src/tw/tax_code.spec.ts +34 -0
  447. package/src/tw/tax_code.ts +98 -0
  448. package/src/tw/ubn.spec.ts +28 -0
  449. package/src/tw/ubn.ts +80 -0
  450. package/src/tw/ui.spec.ts +49 -0
  451. package/src/tw/ui.ts +111 -0
  452. package/src/types.ts +82 -0
  453. package/src/ua/edrpou.spec.ts +28 -0
  454. package/src/ua/edrpou.ts +88 -0
  455. package/src/ua/index.ts +2 -0
  456. package/src/ua/rntrc.spec.ts +28 -0
  457. package/src/ua/rntrc.ts +77 -0
  458. package/src/us/ein.spec.ts +28 -0
  459. package/src/us/ein.ts +179 -0
  460. package/src/us/index.ts +2 -0
  461. package/src/us/ssn.spec.ts +28 -0
  462. package/src/us/ssn.ts +117 -0
  463. package/src/util/checksum.spec.ts +70 -0
  464. package/src/util/checksum.ts +258 -0
  465. package/src/util/index.ts +13 -0
  466. package/src/util/isValidDate.spec.ts +49 -0
  467. package/src/util/isValidDate.ts +87 -0
  468. package/src/util/iso7064.spec.ts +17 -0
  469. package/src/util/iso7064.ts +8 -0
  470. package/src/util/pymod.ts +8 -0
  471. package/src/util/strings/char.ts +18 -0
  472. package/src/util/strings/clean.spec.ts +15 -0
  473. package/src/util/strings/clean.ts +305 -0
  474. package/src/util/strings/format.ts +18 -0
  475. package/src/util/strings/index.ts +5 -0
  476. package/src/util/strings/reverseString.ts +3 -0
  477. package/src/util/strings/splitAt.spec.ts +15 -0
  478. package/src/util/strings/splitAt.ts +16 -0
  479. package/src/uy/cedula.spec.ts +28 -0
  480. package/src/uy/cedula.ts +74 -0
  481. package/src/uy/index.ts +3 -0
  482. package/src/uy/nie.spec.ts +28 -0
  483. package/src/uy/nie.ts +84 -0
  484. package/src/uy/rut.spec.ts +34 -0
  485. package/src/uy/rut.ts +99 -0
  486. package/src/ve/index.ts +1 -0
  487. package/src/ve/rif.spec.ts +38 -0
  488. package/src/ve/rif.ts +92 -0
  489. package/src/vn/index.ts +1 -0
  490. package/src/vn/mst.spec.ts +40 -0
  491. package/src/vn/mst.ts +100 -0
  492. package/src/za/idnr.spec.ts +28 -0
  493. package/src/za/idnr.ts +84 -0
  494. package/src/za/index.ts +2 -0
  495. package/src/za/tin.spec.ts +28 -0
  496. package/src/za/tin.ts +75 -0
package/src/es/nss.ts ADDED
@@ -0,0 +1,132 @@
1
+ /**
2
+ * NSS (El número de Seguridad Social, Social Security Number).
3
+ *
4
+ * The SSN is a tax identification number for individuals entities. It has 12 digits
5
+ * where where the first 2 digits indicate province, followed by 8 digits and
6
+ * a 2 digit checksum
7
+ *
8
+ * Sources:
9
+ * https://cis.ier.hit-u.ac.jp/English/society/conference1001/delgado-paper.pdf
10
+ * https://www.grupoalquerque.es/ferias/2012/archivos/digitos/codigo_seguridad_social.pdf
11
+ *
12
+ * TAX/PERSON
13
+ */
14
+
15
+ import * as exceptions from '../exceptions';
16
+ import { strings } from '../util';
17
+ import { Validator, ValidateReturn } from '../types';
18
+
19
+ const PROVINCES = {
20
+ ÁLAVA: '01',
21
+ ALBACETE: '02',
22
+ ALICANTE: '03',
23
+ ALMERÍA: '04',
24
+ ASTURIAS: '33',
25
+ ÁVILA: '05',
26
+ BADAJOZ: '06',
27
+ BALEARES: '07',
28
+ BARCELONA: '08',
29
+ BURGOS: '09',
30
+ CÁCERES: '10',
31
+ CÁDIZ: '11',
32
+ CANTABRIA: '39',
33
+ CASTELLÓN: '12',
34
+ 'CIUDAD REAL': '13',
35
+ CÓRDOBA: '14',
36
+ CORUÑA: '15',
37
+ CUENCA: '16',
38
+ GERONA: '17',
39
+ GRANADA: '18',
40
+ GUADALAJARA: '19',
41
+ GUIPÚZCOA: '20',
42
+ HUELVA: '21',
43
+ HUESCA: '22',
44
+ JAÉN: '23',
45
+ LEÓN: '24',
46
+ LÉRIDA: '25',
47
+ LUGO: '27',
48
+ MADRID: '28',
49
+ MÁLAGA: '29',
50
+ MURCIA: '30',
51
+ NAVARRA: '31',
52
+ ORENSE: '32',
53
+ PALENCIA: '34',
54
+ 'PALMAS (LAS)': '35',
55
+ PONTEVEDRA: '36',
56
+ 'RIOJA (LA)': '26',
57
+ SALAMANCA: '37',
58
+ 'SANTA CRUZ DE TENERIFE': '38',
59
+ SEGOVIA: '40',
60
+ SEVILLA: '41',
61
+ SORIA: '42',
62
+ TARRAGONA: '43',
63
+ TERUEL: '44',
64
+ TOLEDO: '45',
65
+ VALENCIA: '46',
66
+ VALLADOLID: '47',
67
+ VIZCAYA: '48',
68
+ ZAMORA: '49',
69
+ ZARAGOZA: '50',
70
+ 'OTROS TERRITORIOS': '53',
71
+ EXTRANJERO: '66',
72
+ };
73
+ const VALID_PROVINCES = Object.values(PROVINCES);
74
+
75
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
76
+ return strings.cleanUnicode(input, ' -/');
77
+ }
78
+
79
+ const impl: Validator = {
80
+ name: 'Spanish Social Security Number',
81
+ localName: 'Número de Seguridad Social',
82
+ abbreviation: 'NSS',
83
+ compact(input: string): string {
84
+ const [value, err] = clean(input);
85
+
86
+ if (err) {
87
+ throw err;
88
+ }
89
+
90
+ return value;
91
+ },
92
+
93
+ format(input: string): string {
94
+ const [value] = clean(input);
95
+
96
+ return strings.splitAt(value, 2).join('-');
97
+ },
98
+
99
+ validate(input: string): ValidateReturn {
100
+ const [value, error] = clean(input);
101
+
102
+ if (error) {
103
+ return { isValid: false, error };
104
+ }
105
+ if (value.length !== 12) {
106
+ return { isValid: false, error: new exceptions.InvalidLength() };
107
+ }
108
+
109
+ if (!strings.isdigits(value)) {
110
+ return { isValid: false, error: new exceptions.InvalidComponent() };
111
+ }
112
+
113
+ const [province, body, check] = strings.splitAt(value, 2, 10);
114
+ if (!VALID_PROVINCES.includes(province)) {
115
+ return { isValid: false, error: new exceptions.InvalidComponent() };
116
+ }
117
+
118
+ if (parseInt(province + body, 10) % 97 !== parseInt(check, 10)) {
119
+ return { isValid: false, error: new exceptions.InvalidChecksum() };
120
+ }
121
+
122
+ return {
123
+ isValid: true,
124
+ compact: value,
125
+ isIndividual: true,
126
+ isCompany: false,
127
+ };
128
+ },
129
+ };
130
+
131
+ export const { name, localName, abbreviation, validate, format, compact } =
132
+ impl;
@@ -0,0 +1,66 @@
1
+ /* eslint-disable max-classes-per-file */
2
+ /**
3
+ * Collection of exceptions.
4
+ * The validation functions of stdnum should raise one of the below exceptions
5
+ * when validation of the number fails.
6
+ */
7
+
8
+ /**
9
+ * Top-level error for validating numbers.
10
+ *
11
+ * This exception should normally not be raised, only subclasses of this
12
+ * exception.
13
+ */
14
+ export class ValidationError extends Error {
15
+ constructor(msg: string) {
16
+ super(msg);
17
+ this.name = 'ValidationError';
18
+ }
19
+ }
20
+
21
+ /**
22
+ * Something is wrong with the format of the number.
23
+ *
24
+ * This generally means characters or delimiters that are not allowed are
25
+ * part of the number or required parts are missing.
26
+ */
27
+ export class InvalidFormat extends ValidationError {
28
+ constructor(msg = 'The number has an invlidad format.') {
29
+ super(msg);
30
+ this.name = 'InvalidFormat';
31
+ }
32
+ }
33
+
34
+ /**
35
+ * The number's internal checksum or check digit does not match.
36
+ */
37
+ export class InvalidChecksum extends ValidationError {
38
+ constructor(msg = "The number number's checksum or check digit is invalid.") {
39
+ super(msg);
40
+ this.name = 'InvalidChecksum';
41
+ }
42
+ }
43
+
44
+ /**
45
+ * The length of the number is wrong
46
+ */
47
+ export class InvalidLength extends ValidationError {
48
+ constructor(msg = 'The number has an invalid length.') {
49
+ super(msg);
50
+ this.name = 'InvalidLength';
51
+ }
52
+ }
53
+
54
+ /**
55
+ * One of the parts of the number has an invalid reference.
56
+ *
57
+ * Some part of the number refers to some external entity like a country
58
+ * code, a date or a predefined collection of values. The number contains
59
+ * some invalid reference.
60
+ */
61
+ export class InvalidComponent extends ValidationError {
62
+ constructor(msg = 'One of the parts of the number are invalid or unknown.') {
63
+ super(msg);
64
+ this.name = 'InvalidComponent';
65
+ }
66
+ }
@@ -0,0 +1,28 @@
1
+ import { validate, format } from './alv';
2
+ import { InvalidLength, InvalidChecksum } from '../exceptions';
3
+
4
+ describe('fi/alv', () => {
5
+ it('format:FI 20774740', () => {
6
+ const result = format('FI 20774740');
7
+
8
+ expect(result).toEqual('20774740');
9
+ });
10
+
11
+ it('validate:FI 20774740', () => {
12
+ const result = validate('FI 20774740');
13
+
14
+ expect(result.isValid && result.compact).toEqual('20774740');
15
+ });
16
+
17
+ it('validate:123458', () => {
18
+ const result = validate('123458');
19
+
20
+ expect(result.error).toBeInstanceOf(InvalidLength);
21
+ });
22
+
23
+ it('validate:20774741', () => {
24
+ const result = validate('20774741');
25
+
26
+ expect(result.error).toBeInstanceOf(InvalidChecksum);
27
+ });
28
+ });
package/src/fi/alv.ts ADDED
@@ -0,0 +1,76 @@
1
+ /**
2
+ * ALV nro (Arvonlisäveronumero, Finnish VAT number).
3
+ *
4
+ * The number is an 8-digit code with a weighted checksum.
5
+ *
6
+ * ENTITY
7
+ */
8
+
9
+ import * as exceptions from '../exceptions';
10
+ import { strings } from '../util';
11
+ import { Validator, ValidateReturn } from '../types';
12
+ import { weightedSum } from '../util/checksum';
13
+
14
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
15
+ const [value, err] = strings.cleanUnicode(input, ' ');
16
+ if (err !== null) {
17
+ return [value, err];
18
+ }
19
+ if (value.startsWith('FI')) {
20
+ return [value.substr(2), null];
21
+ }
22
+ return [value, null];
23
+ }
24
+
25
+ const impl: Validator = {
26
+ name: 'Finnish VAT Number',
27
+ localName: 'Arvonlisäveronumero Mervärdesskattenummer',
28
+ abbreviation: 'ALV nro',
29
+ compact(input: string): string {
30
+ const [value, err] = clean(input);
31
+
32
+ if (err) {
33
+ throw err;
34
+ }
35
+
36
+ return value;
37
+ },
38
+
39
+ format(input: string): string {
40
+ const [value] = clean(input);
41
+
42
+ return value;
43
+ },
44
+
45
+ validate(input: string): ValidateReturn {
46
+ const [value, error] = clean(input);
47
+
48
+ if (error) {
49
+ return { isValid: false, error };
50
+ }
51
+ if (value.length !== 8) {
52
+ return { isValid: false, error: new exceptions.InvalidLength() };
53
+ }
54
+ if (!strings.isdigits(value)) {
55
+ return { isValid: false, error: new exceptions.InvalidFormat() };
56
+ }
57
+
58
+ const sum = weightedSum(value, {
59
+ modulus: 11,
60
+ weights: [7, 9, 10, 5, 8, 4, 2, 1],
61
+ });
62
+ if (sum !== 0) {
63
+ return { isValid: false, error: new exceptions.InvalidChecksum() };
64
+ }
65
+
66
+ return {
67
+ isValid: true,
68
+ compact: value,
69
+ isIndividual: false,
70
+ isCompany: true,
71
+ };
72
+ },
73
+ };
74
+
75
+ export const { name, localName, abbreviation, validate, format, compact } =
76
+ impl;
@@ -0,0 +1,37 @@
1
+ import { validate, format } from './hetu';
2
+ import { InvalidLength, InvalidChecksum } from '../exceptions';
3
+
4
+ describe('fi/hetu', () => {
5
+ it('format:131052-308T', () => {
6
+ const result = format('131052-308T');
7
+
8
+ expect(result).toEqual('131052-308T');
9
+ });
10
+
11
+ it('validate:131052-308T', () => {
12
+ const result = validate('131052-308T');
13
+
14
+ expect(result.isValid && result.compact).toEqual('131052-308T');
15
+ });
16
+
17
+ test.each(['131022B3082', '131052X308T', '131052-308T'])(
18
+ 'validate:%s',
19
+ value => {
20
+ const result = validate(value);
21
+
22
+ expect(result.isValid).toEqual(true);
23
+ },
24
+ );
25
+
26
+ it('validate:12345678', () => {
27
+ const result = validate('12345678');
28
+
29
+ expect(result.error).toBeInstanceOf(InvalidLength);
30
+ });
31
+
32
+ it('validate:131052-308U', () => {
33
+ const result = validate('131052-308U');
34
+
35
+ expect(result.error).toBeInstanceOf(InvalidChecksum);
36
+ });
37
+ });
package/src/fi/hetu.ts ADDED
@@ -0,0 +1,108 @@
1
+ /**
2
+ * HETU (Henkilötunnus, Finnish personal identity code).
3
+ *
4
+ * Module for handling Finnish personal identity codes (HETU, Henkilötunnus).
5
+ * See https://www.vaestorekisterikeskus.fi/default.aspx?id=45 for checksum
6
+ * calculation details and https://tarkistusmerkit.teppovuori.fi/tarkmerk.htm#hetu1
7
+ * for historical details.
8
+ *
9
+ * PERSON
10
+ */
11
+
12
+ import * as exceptions from '../exceptions';
13
+ import { isValidDate, strings } from '../util';
14
+ import { Validator, ValidateReturn } from '../types';
15
+
16
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
17
+ return strings.cleanUnicode(input, ' ');
18
+ }
19
+
20
+ const CHECK_ALPHA = '0123456789ABCDEFHJKLMNPRSTUVWXY';
21
+ const CENTURY: Record<string, string> = {
22
+ '+': '18',
23
+ '-': '19',
24
+ Y: '19',
25
+ X: '19',
26
+ W: '19',
27
+ V: '19',
28
+ U: '19',
29
+ A: '20',
30
+ B: '20',
31
+ C: '20',
32
+ D: '20',
33
+ E: '20',
34
+ F: '20',
35
+ };
36
+ const VALID_CENTURY = Object.keys(CENTURY);
37
+
38
+ const impl: Validator = {
39
+ name: 'Finnish Personal Identity Code',
40
+ localName: 'Henkilötunnus',
41
+ abbreviation: 'HETU',
42
+
43
+ compact(input: string): string {
44
+ const [value, err] = clean(input);
45
+
46
+ if (err) {
47
+ throw err;
48
+ }
49
+
50
+ return value;
51
+ },
52
+
53
+ format(input: string): string {
54
+ const [value] = clean(input);
55
+
56
+ return value;
57
+ },
58
+
59
+ validate(input: string): ValidateReturn {
60
+ const [value, error] = clean(input);
61
+
62
+ if (error) {
63
+ return { isValid: false, error };
64
+ }
65
+ if (value.length !== 11) {
66
+ return { isValid: false, error: new exceptions.InvalidLength() };
67
+ }
68
+
69
+ const [front, , back, check2] = strings.splitAt(value, 6, 7, -1);
70
+ if (
71
+ !strings.isdigits(front) ||
72
+ !strings.isdigits(back) ||
73
+ !CHECK_ALPHA.includes(check2)
74
+ ) {
75
+ return { isValid: false, error: new exceptions.InvalidFormat() };
76
+ }
77
+ if (!VALID_CENTURY.includes(value[6])) {
78
+ return { isValid: false, error: new exceptions.InvalidComponent() };
79
+ }
80
+
81
+ const [dd, mm, yy, century, person, check] = strings.splitAt(
82
+ value,
83
+ 2,
84
+ 4,
85
+ 6,
86
+ 7,
87
+ 10,
88
+ );
89
+ if (!isValidDate(`${CENTURY[century]}${yy}`, mm, dd, true)) {
90
+ return { isValid: false, error: new exceptions.InvalidComponent() };
91
+ }
92
+
93
+ const checkable = `${dd}${mm}${yy}${person}`;
94
+ if (CHECK_ALPHA[parseInt(checkable, 10) % CHECK_ALPHA.length] !== check) {
95
+ return { isValid: false, error: new exceptions.InvalidChecksum() };
96
+ }
97
+
98
+ return {
99
+ isValid: true,
100
+ compact: value,
101
+ isIndividual: true,
102
+ isCompany: false,
103
+ };
104
+ },
105
+ };
106
+
107
+ export const { name, localName, abbreviation, validate, format, compact } =
108
+ impl;
@@ -0,0 +1,3 @@
1
+ export * as alv from './alv';
2
+ export * as hetu from './hetu';
3
+ export * as ytunnus from './ytunnus';
@@ -0,0 +1,28 @@
1
+ import { validate, format } from './ytunnus';
2
+ import { InvalidLength, InvalidChecksum } from '../exceptions';
3
+
4
+ describe('fi/ytunnus', () => {
5
+ it('format:20774740', () => {
6
+ const result = format('20774740');
7
+
8
+ expect(result).toEqual('2077474-0');
9
+ });
10
+
11
+ it('validate:2077474-0', () => {
12
+ const result = validate('2077474-0');
13
+
14
+ expect(result.isValid && result.compact).toEqual('20774740');
15
+ });
16
+
17
+ it('validate:1234567', () => {
18
+ const result = validate('1234567');
19
+
20
+ expect(result.error).toBeInstanceOf(InvalidLength);
21
+ });
22
+
23
+ it('validate:2077474-1', () => {
24
+ const result = validate('2077474-1');
25
+
26
+ expect(result.error).toBeInstanceOf(InvalidChecksum);
27
+ });
28
+ });
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Y-tunnus (Finnish business identifier).
3
+ *
4
+ * The number is an 8-digit code with a weighted checksum.
5
+ *
6
+ * ENTITY
7
+ */
8
+
9
+ import { strings } from '../util';
10
+ import { Validator, ValidateReturn } from '../types';
11
+ import { validate as alvValidate } from './alv';
12
+
13
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
14
+ return strings.cleanUnicode(input, ' -');
15
+ }
16
+
17
+ const impl: Validator = {
18
+ name: 'Finnish Business Identifier',
19
+ localName: 'Yritys- ja yhteisötunnus',
20
+ abbreviation: 'Y-tunnus',
21
+ compact(input: string): string {
22
+ const [value, err] = clean(input);
23
+
24
+ if (err) {
25
+ throw err;
26
+ }
27
+
28
+ return value;
29
+ },
30
+
31
+ format(input: string): string {
32
+ const [value] = clean(input);
33
+
34
+ return strings.splitAt(value, -1).join('-');
35
+ },
36
+
37
+ validate(input: string): ValidateReturn {
38
+ const [value, error] = clean(input);
39
+
40
+ if (error) {
41
+ return { isValid: false, error };
42
+ }
43
+
44
+ return alvValidate(value);
45
+ },
46
+ };
47
+
48
+ export const { name, localName, abbreviation, validate, format, compact } =
49
+ impl;
@@ -0,0 +1 @@
1
+ export * as vn from './vn';
@@ -0,0 +1,34 @@
1
+ import { validate, format } from './vn';
2
+ import { InvalidLength, InvalidFormat } from '../exceptions';
3
+
4
+ describe('fo/vn', () => {
5
+ it('format:623857', () => {
6
+ const result = format('623857');
7
+
8
+ expect(result).toEqual('623857');
9
+ });
10
+
11
+ it('fvalidate:623857', () => {
12
+ const result = validate('623857');
13
+
14
+ expect(result.isValid && result.compact).toEqual('623857');
15
+ });
16
+
17
+ test.each(['623857', '33 28 28', '563.609'])('validate:%s', value => {
18
+ const result = validate(value);
19
+
20
+ expect(result.isValid).toEqual(true);
21
+ });
22
+
23
+ it('validate:62385', () => {
24
+ const result = validate('62385');
25
+
26
+ expect(result.error).toBeInstanceOf(InvalidLength);
27
+ });
28
+
29
+ it('validate:62385A', () => {
30
+ const result = validate('62385A');
31
+
32
+ expect(result.error).toBeInstanceOf(InvalidFormat);
33
+ });
34
+ });
package/src/fo/vn.ts ADDED
@@ -0,0 +1,71 @@
1
+ /**
2
+ * V-number (Vinnutal, Faroe Islands tax number).
3
+ *
4
+ * In the Faroe Islands the legal persons TIN equals the V number issued by the
5
+ * Faroese Tax Administration. It is a consecutive number.
6
+ *
7
+ * Source
8
+ * https://www.taks.fo/fo/borgari/bolkar/at-stovna-virki/
9
+ * https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Faroe-islands-TIN.pdf
10
+ *
11
+ * ENTITY/PERSON
12
+ */
13
+
14
+ import * as exceptions from '../exceptions';
15
+ import { strings } from '../util';
16
+ import { Validator, ValidateReturn } from '../types';
17
+
18
+ function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
19
+ return strings.cleanUnicode(input, ' -.');
20
+ }
21
+
22
+ // const validRe = /^[PCGQV]{1}00[A-Z0-9]{8}$/;
23
+
24
+ // const ALPHABET = '0123456789X';
25
+
26
+ const impl: Validator = {
27
+ name: 'Vinnutal',
28
+ localName: 'NAME',
29
+ abbreviation: 'VN',
30
+
31
+ compact(input: string): string {
32
+ const [value, err] = clean(input);
33
+
34
+ if (err) {
35
+ throw err;
36
+ }
37
+
38
+ return value;
39
+ },
40
+
41
+ format(input: string): string {
42
+ const [value] = clean(input);
43
+
44
+ return value;
45
+ },
46
+
47
+ validate(input: string): ValidateReturn {
48
+ const [value, error] = clean(input);
49
+
50
+ if (error) {
51
+ return { isValid: false, error };
52
+ }
53
+ if (value.length !== 6) {
54
+ return { isValid: false, error: new exceptions.InvalidLength() };
55
+ }
56
+
57
+ if (!strings.isdigits(value)) {
58
+ return { isValid: false, error: new exceptions.InvalidFormat() };
59
+ }
60
+
61
+ return {
62
+ isValid: true,
63
+ compact: value,
64
+ isIndividual: false,
65
+ isCompany: false,
66
+ };
67
+ },
68
+ };
69
+
70
+ export const { name, localName, abbreviation, validate, format, compact } =
71
+ impl;
@@ -0,0 +1,5 @@
1
+ export * as nif from './nif';
2
+ export * as nir from './nir';
3
+ export * as siren from './siren';
4
+ export * as siret from './siret';
5
+ export * as tva from './tva';
@@ -0,0 +1,34 @@
1
+ import { validate, format } from './nif';
2
+ import { InvalidComponent, InvalidLength } from '../exceptions';
3
+
4
+ describe('fr/nif', () => {
5
+ it('format:0701987765432', () => {
6
+ const result = format('0701987765432');
7
+
8
+ expect(result).toEqual('07 01 987 765 432');
9
+ });
10
+
11
+ test.each(['3023217600053', '0701987765493'])('validate:%s', value => {
12
+ const result = validate(value);
13
+
14
+ expect(result.isValid && result.compact).toEqual(value);
15
+ });
16
+
17
+ test.each(['0000000000000'])('validate:%s', value => {
18
+ const result = validate(value);
19
+
20
+ expect(result.isValid).toEqual(false);
21
+ });
22
+
23
+ it('validate:12345678', () => {
24
+ const result = validate('12345678');
25
+
26
+ expect(result.error).toBeInstanceOf(InvalidLength);
27
+ });
28
+
29
+ it('validate:9701987765432', () => {
30
+ const result = validate('9701987765432');
31
+
32
+ expect(result.error).toBeInstanceOf(InvalidComponent);
33
+ });
34
+ });