@coderoftime/fints 0.1.0 → 0.3.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 (289) hide show
  1. package/CHANGELOG.md +519 -1
  2. package/README.md +138 -40
  3. package/dist/client.d.ts +49 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +242 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/core/account.d.ts +46 -7
  8. package/dist/core/account.d.ts.map +1 -1
  9. package/dist/core/account.js +143 -24
  10. package/dist/core/account.js.map +1 -1
  11. package/dist/core/amount.d.ts +15 -4
  12. package/dist/core/amount.d.ts.map +1 -1
  13. package/dist/core/amount.js +46 -9
  14. package/dist/core/amount.js.map +1 -1
  15. package/dist/core/balance.d.ts +4 -0
  16. package/dist/core/balance.d.ts.map +1 -1
  17. package/dist/core/balance.js +11 -5
  18. package/dist/core/balance.js.map +1 -1
  19. package/dist/core/bank-info.d.ts +21 -4
  20. package/dist/core/bank-info.d.ts.map +1 -1
  21. package/dist/core/bank-info.js +26 -5
  22. package/dist/core/bank-info.js.map +1 -1
  23. package/dist/core/client.d.ts +81 -19
  24. package/dist/core/client.d.ts.map +1 -1
  25. package/dist/core/config.d.ts +40 -20
  26. package/dist/core/config.d.ts.map +1 -1
  27. package/dist/core/config.js +85 -30
  28. package/dist/core/config.js.map +1 -1
  29. package/dist/core/errors.d.ts +100 -26
  30. package/dist/core/errors.d.ts.map +1 -1
  31. package/dist/core/errors.js +136 -53
  32. package/dist/core/errors.js.map +1 -1
  33. package/dist/core/feedback.d.ts +11 -1
  34. package/dist/core/feedback.d.ts.map +1 -1
  35. package/dist/core/feedback.js +14 -2
  36. package/dist/core/feedback.js.map +1 -1
  37. package/dist/core/transaction.d.ts +11 -1
  38. package/dist/core/transaction.d.ts.map +1 -1
  39. package/dist/core/transaction.js +21 -4
  40. package/dist/core/transaction.js.map +1 -1
  41. package/dist/core/transport.d.ts +48 -6
  42. package/dist/core/transport.d.ts.map +1 -1
  43. package/dist/core/transport.js +126 -29
  44. package/dist/core/transport.js.map +1 -1
  45. package/dist/formats/camt.d.ts +28 -5
  46. package/dist/formats/camt.d.ts.map +1 -1
  47. package/dist/formats/camt.js +132 -50
  48. package/dist/formats/camt.js.map +1 -1
  49. package/dist/formats/mt940.d.ts +29 -5
  50. package/dist/formats/mt940.d.ts.map +1 -1
  51. package/dist/formats/mt940.js +209 -113
  52. package/dist/formats/mt940.js.map +1 -1
  53. package/dist/formats/readers.d.ts +6 -2
  54. package/dist/formats/readers.d.ts.map +1 -1
  55. package/dist/formats/readers.js +28 -29
  56. package/dist/formats/readers.js.map +1 -1
  57. package/dist/formats/record-budget.d.ts +7 -0
  58. package/dist/formats/record-budget.d.ts.map +1 -0
  59. package/dist/formats/record-budget.js +17 -0
  60. package/dist/formats/record-budget.js.map +1 -0
  61. package/dist/formats/sepa-purpose.d.ts +9 -0
  62. package/dist/formats/sepa-purpose.d.ts.map +1 -1
  63. package/dist/formats/sepa-purpose.js +32 -2
  64. package/dist/formats/sepa-purpose.js.map +1 -1
  65. package/dist/index.d.ts +3 -3
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +2 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/session/app-approval.d.ts +11 -5
  70. package/dist/session/app-approval.d.ts.map +1 -1
  71. package/dist/session/app-approval.js +23 -12
  72. package/dist/session/app-approval.js.map +1 -1
  73. package/dist/session/dialog-runner.d.ts +11 -11
  74. package/dist/session/dialog-runner.d.ts.map +1 -1
  75. package/dist/session/dialog-runner.js +34 -19
  76. package/dist/session/dialog-runner.js.map +1 -1
  77. package/dist/session/login-guard.d.ts +54 -49
  78. package/dist/session/login-guard.d.ts.map +1 -1
  79. package/dist/session/login-guard.js +170 -83
  80. package/dist/session/login-guard.js.map +1 -1
  81. package/dist/session/sepa-accounts.d.ts +20 -14
  82. package/dist/session/sepa-accounts.d.ts.map +1 -1
  83. package/dist/session/sepa-accounts.js +62 -46
  84. package/dist/session/sepa-accounts.js.map +1 -1
  85. package/dist/session/session-setup.d.ts +41 -24
  86. package/dist/session/session-setup.d.ts.map +1 -1
  87. package/dist/session/session-setup.js +106 -63
  88. package/dist/session/session-setup.js.map +1 -1
  89. package/dist/session/session-state.d.ts +10 -6
  90. package/dist/session/session-state.d.ts.map +1 -1
  91. package/dist/session/session-state.js +72 -18
  92. package/dist/session/session-state.js.map +1 -1
  93. package/dist/session/signed-dialog.d.ts +83 -0
  94. package/dist/session/signed-dialog.d.ts.map +1 -0
  95. package/dist/session/signed-dialog.js +185 -0
  96. package/dist/session/signed-dialog.js.map +1 -0
  97. package/dist/session/tan-selection.d.ts +26 -18
  98. package/dist/session/tan-selection.d.ts.map +1 -1
  99. package/dist/session/tan-selection.js +44 -33
  100. package/dist/session/tan-selection.js.map +1 -1
  101. package/dist/session/user-prompts.d.ts +14 -5
  102. package/dist/session/user-prompts.d.ts.map +1 -1
  103. package/dist/session/user-prompts.js +53 -18
  104. package/dist/session/user-prompts.js.map +1 -1
  105. package/dist/tan/challenge.d.ts +47 -24
  106. package/dist/tan/challenge.d.ts.map +1 -1
  107. package/dist/tan/challenge.js +56 -51
  108. package/dist/tan/challenge.js.map +1 -1
  109. package/dist/tan/flicker.d.ts +11 -1
  110. package/dist/tan/flicker.d.ts.map +1 -1
  111. package/dist/tan/flicker.js +70 -24
  112. package/dist/tan/flicker.js.map +1 -1
  113. package/dist/tan/tan-image.d.ts +6 -2
  114. package/dist/tan/tan-image.d.ts.map +1 -1
  115. package/dist/tan/tan-image.js +14 -6
  116. package/dist/tan/tan-image.js.map +1 -1
  117. package/dist/tan/tan-models.d.ts +14 -2
  118. package/dist/tan/tan-models.d.ts.map +1 -1
  119. package/dist/tan/tan-models.js +24 -7
  120. package/dist/tan/tan-models.js.map +1 -1
  121. package/dist/util/arguments.d.ts +13 -0
  122. package/dist/util/arguments.d.ts.map +1 -0
  123. package/dist/util/arguments.js +40 -0
  124. package/dist/util/arguments.js.map +1 -0
  125. package/dist/util/async.d.ts +4 -3
  126. package/dist/util/async.d.ts.map +1 -1
  127. package/dist/util/async.js +6 -7
  128. package/dist/util/async.js.map +1 -1
  129. package/dist/util/bytes.d.ts +3 -4
  130. package/dist/util/bytes.d.ts.map +1 -1
  131. package/dist/util/bytes.js +13 -21
  132. package/dist/util/bytes.js.map +1 -1
  133. package/dist/util/call-context.d.ts.map +1 -1
  134. package/dist/util/call-context.js +3 -2
  135. package/dist/util/call-context.js.map +1 -1
  136. package/dist/util/dates.d.ts +6 -20
  137. package/dist/util/dates.d.ts.map +1 -1
  138. package/dist/util/dates.js +58 -28
  139. package/dist/util/dates.js.map +1 -1
  140. package/dist/util/errors.d.ts +13 -3
  141. package/dist/util/errors.d.ts.map +1 -1
  142. package/dist/util/errors.js +19 -6
  143. package/dist/util/errors.js.map +1 -1
  144. package/dist/util/immutable-map.d.ts +5 -2
  145. package/dist/util/immutable-map.d.ts.map +1 -1
  146. package/dist/util/immutable-map.js +15 -12
  147. package/dist/util/immutable-map.js.map +1 -1
  148. package/dist/util/inspect.d.ts +11 -0
  149. package/dist/util/inspect.d.ts.map +1 -0
  150. package/dist/util/inspect.js +14 -0
  151. package/dist/util/inspect.js.map +1 -0
  152. package/dist/util/json.d.ts +4 -0
  153. package/dist/util/json.d.ts.map +1 -1
  154. package/dist/util/json.js +18 -0
  155. package/dist/util/json.js.map +1 -1
  156. package/dist/util/text.d.ts +38 -5
  157. package/dist/util/text.d.ts.map +1 -1
  158. package/dist/util/text.js +90 -16
  159. package/dist/util/text.js.map +1 -1
  160. package/dist/util/xml.d.ts +9 -6
  161. package/dist/util/xml.d.ts.map +1 -1
  162. package/dist/util/xml.js +129 -56
  163. package/dist/util/xml.js.map +1 -1
  164. package/dist/v3/account-extension.d.ts.map +1 -1
  165. package/dist/v3/account-extension.js +7 -10
  166. package/dist/v3/account-extension.js.map +1 -1
  167. package/dist/v3/bank-connection.d.ts +54 -0
  168. package/dist/v3/bank-connection.d.ts.map +1 -0
  169. package/dist/v3/bank-connection.js +118 -0
  170. package/dist/v3/bank-connection.js.map +1 -0
  171. package/dist/v3/dialog.d.ts +84 -46
  172. package/dist/v3/dialog.d.ts.map +1 -1
  173. package/dist/v3/dialog.js +174 -60
  174. package/dist/v3/dialog.js.map +1 -1
  175. package/dist/v3/message.d.ts +32 -11
  176. package/dist/v3/message.d.ts.map +1 -1
  177. package/dist/v3/message.js +144 -83
  178. package/dist/v3/message.js.map +1 -1
  179. package/dist/v3/parameter-store.d.ts +111 -0
  180. package/dist/v3/parameter-store.d.ts.map +1 -0
  181. package/dist/v3/parameter-store.js +197 -0
  182. package/dist/v3/parameter-store.js.map +1 -0
  183. package/dist/v3/parameters.d.ts +44 -17
  184. package/dist/v3/parameters.d.ts.map +1 -1
  185. package/dist/v3/parameters.js +136 -60
  186. package/dist/v3/parameters.js.map +1 -1
  187. package/dist/v3/protocol.d.ts +50 -50
  188. package/dist/v3/protocol.d.ts.map +1 -1
  189. package/dist/v3/protocol.js +91 -210
  190. package/dist/v3/protocol.js.map +1 -1
  191. package/dist/v3/queries.d.ts +51 -0
  192. package/dist/v3/queries.d.ts.map +1 -0
  193. package/dist/v3/queries.js +128 -0
  194. package/dist/v3/queries.js.map +1 -0
  195. package/dist/v3/segments.d.ts +43 -19
  196. package/dist/v3/segments.d.ts.map +1 -1
  197. package/dist/v3/segments.js +84 -33
  198. package/dist/v3/segments.js.map +1 -1
  199. package/dist/v3/syntax.d.ts +68 -13
  200. package/dist/v3/syntax.d.ts.map +1 -1
  201. package/dist/v3/syntax.js +183 -102
  202. package/dist/v3/syntax.js.map +1 -1
  203. package/package.json +10 -6
  204. package/src/client.ts +293 -0
  205. package/src/core/account.ts +153 -24
  206. package/src/core/amount.ts +45 -10
  207. package/src/core/balance.ts +12 -5
  208. package/src/core/bank-info.ts +29 -5
  209. package/src/core/client.ts +83 -19
  210. package/src/core/config.ts +95 -35
  211. package/src/core/errors.ts +148 -54
  212. package/src/core/feedback.ts +16 -2
  213. package/src/core/transaction.ts +22 -4
  214. package/src/core/transport.ts +153 -32
  215. package/src/formats/camt.ts +153 -45
  216. package/src/formats/mt940.ts +244 -122
  217. package/src/formats/readers.ts +28 -31
  218. package/src/formats/record-budget.ts +18 -0
  219. package/src/formats/sepa-purpose.ts +29 -2
  220. package/src/index.ts +4 -2
  221. package/src/session/app-approval.ts +51 -38
  222. package/src/session/dialog-runner.ts +61 -31
  223. package/src/session/login-guard.ts +189 -87
  224. package/src/session/sepa-accounts.ts +63 -45
  225. package/src/session/session-setup.ts +105 -68
  226. package/src/session/session-state.ts +74 -23
  227. package/src/session/signed-dialog.ts +222 -0
  228. package/src/session/tan-selection.ts +50 -39
  229. package/src/session/user-prompts.ts +62 -18
  230. package/src/tan/challenge.ts +87 -64
  231. package/src/tan/flicker.ts +72 -23
  232. package/src/tan/tan-image.ts +15 -6
  233. package/src/tan/tan-models.ts +26 -7
  234. package/src/util/arguments.ts +40 -0
  235. package/src/util/async.ts +10 -9
  236. package/src/util/bytes.ts +14 -20
  237. package/src/util/call-context.ts +3 -2
  238. package/src/util/dates.ts +64 -33
  239. package/src/util/errors.ts +22 -6
  240. package/src/util/immutable-map.ts +15 -12
  241. package/src/util/inspect.ts +14 -0
  242. package/src/util/json.ts +16 -0
  243. package/src/util/text.ts +87 -15
  244. package/src/util/xml.ts +130 -52
  245. package/src/v3/account-extension.ts +7 -12
  246. package/src/v3/bank-connection.ts +126 -0
  247. package/src/v3/dialog.ts +186 -92
  248. package/src/v3/message.ts +140 -79
  249. package/src/v3/parameter-store.ts +226 -0
  250. package/src/v3/parameters.ts +166 -66
  251. package/src/v3/protocol.ts +103 -253
  252. package/src/v3/queries.ts +198 -0
  253. package/src/v3/segments.ts +86 -31
  254. package/src/v3/syntax.ts +172 -93
  255. package/dist/session/bank-connection.d.ts +0 -28
  256. package/dist/session/bank-connection.d.ts.map +0 -1
  257. package/dist/session/bank-connection.js +0 -48
  258. package/dist/session/bank-connection.js.map +0 -1
  259. package/dist/session/parameter-data.d.ts +0 -83
  260. package/dist/session/parameter-data.d.ts.map +0 -1
  261. package/dist/session/parameter-data.js +0 -68
  262. package/dist/session/parameter-data.js.map +0 -1
  263. package/dist/session/pin-tan-client.d.ts +0 -54
  264. package/dist/session/pin-tan-client.d.ts.map +0 -1
  265. package/dist/session/pin-tan-client.js +0 -153
  266. package/dist/session/pin-tan-client.js.map +0 -1
  267. package/dist/session/pin-tan-dialog.d.ts +0 -71
  268. package/dist/session/pin-tan-dialog.d.ts.map +0 -1
  269. package/dist/session/pin-tan-dialog.js +0 -124
  270. package/dist/session/pin-tan-dialog.js.map +0 -1
  271. package/dist/session/protocol.d.ts +0 -209
  272. package/dist/session/protocol.d.ts.map +0 -1
  273. package/dist/session/protocol.js +0 -75
  274. package/dist/session/protocol.js.map +0 -1
  275. package/dist/session/response-handler.d.ts +0 -48
  276. package/dist/session/response-handler.d.ts.map +0 -1
  277. package/dist/session/response-handler.js +0 -121
  278. package/dist/session/response-handler.js.map +0 -1
  279. package/dist/v3/client.d.ts +0 -24
  280. package/dist/v3/client.d.ts.map +0 -1
  281. package/dist/v3/client.js +0 -16
  282. package/dist/v3/client.js.map +0 -1
  283. package/src/session/bank-connection.ts +0 -51
  284. package/src/session/parameter-data.ts +0 -137
  285. package/src/session/pin-tan-client.ts +0 -186
  286. package/src/session/pin-tan-dialog.ts +0 -160
  287. package/src/session/protocol.ts +0 -311
  288. package/src/session/response-handler.ts +0 -130
  289. package/src/v3/client.ts +0 -29
@@ -1,8 +1,19 @@
1
- import { concatBytes } from '../util/bytes.js';
1
+ import { invalidArgument } from '../util/errors.js';
2
+ import { trimBlanks } from '../util/text.js';
2
3
  import { FinTsTransportError } from './errors.js';
4
+ /** The longest delay `setTimeout` takes; it fires at once for a longer one, such as `Infinity`. */
5
+ const maxTimeoutMs = 2 ** 31 - 1;
3
6
  /**
4
7
  * Default `FinTsTransport`: HTTP POST with `fetch`.
5
8
  *
9
+ * Without the `fetch` option it sends with the global `fetch` as it is at each request, and cannot bypass what that
10
+ * does, for plain http to a local server (`FinTsConfig.allowInsecureUrl`) as for https: whatever replaces that `fetch`
11
+ * or handles its requests, such as a test's stub of `globalThis.fetch` or on Node.js a global dispatcher (undici's
12
+ * `setGlobalDispatcher`), gets every message, PIN and TAN included, and a proxy that the runtime takes from the
13
+ * environment, as Node.js does with `NODE_USE_ENV_PROXY=1`, and Deno and Bun do from `HTTP_PROXY`, sees the PIN of
14
+ * plain http unencrypted. Exempt the host with `NO_PROXY`, such as `localhost,127.0.0.1,::1`, or pass a `fetch` that
15
+ * connects directly.
16
+ *
6
17
  * In a browser it only reaches servers that allow the page's origin (CORS), which bank servers do not: a web app needs
7
18
  * a server of its own between browser and bank, reached with a `FinTsTransport` of its own.
8
19
  */
@@ -10,33 +21,52 @@ export class HttpTransport {
10
21
  timeoutMs;
11
22
  maxResponseBytes;
12
23
  fetchFn;
24
+ /**
25
+ * Throws `TypeError` if `timeoutMs` is not a positive number of at most 2147483647, or `maxResponseBytes` is not a
26
+ * positive number.
27
+ */
13
28
  constructor(options = {}) {
14
- this.fetchFn = options.fetch ?? ((input, init) => fetch(input, init));
29
+ const custom = options.fetch;
30
+ // Called as a plain function: a browser's native `fetch` fails as a method of another object.
31
+ this.fetchFn = custom === undefined ? (input, init) => fetch(input, init) : (input, init) => custom(input, init);
15
32
  this.timeoutMs = options.timeoutMs ?? 90_000;
16
33
  this.maxResponseBytes = options.maxResponseBytes ?? 16 << 20;
34
+ if (!isPositive(this.timeoutMs) || this.timeoutMs > maxTimeoutMs) {
35
+ throw invalidArgument(`Must be a positive number of at most ${maxTimeoutMs}`, 'timeoutMs');
36
+ }
37
+ if (!isPositive(this.maxResponseBytes))
38
+ throw invalidArgument('Must be a positive number', 'maxResponseBytes');
17
39
  }
18
- async post(url, body, contentType) {
40
+ /** Fails with `FinTsTransportError` at the timeout or once `signal` is aborted; sends nothing if it is already. */
41
+ async post(url, body, contentType, signal) {
42
+ if (signal?.aborted)
43
+ throw new FinTsTransportError('Request aborted');
19
44
  const controller = new AbortController();
20
- let timer;
21
- // Waiting for the timeout as well covers a `fetch` that cannot abort a request.
22
- const timedOut = new Promise((_, reject) => {
23
- timer = setTimeout(() => {
24
- controller.abort();
25
- reject(new FinTsTransportError('Request timed out'));
26
- }, this.timeoutMs);
45
+ // Raced with the exchange, for a `fetch` that cannot abort a request.
46
+ const stopped = new Promise((_, reject) => {
47
+ controller.signal.addEventListener('abort', () => {
48
+ reject(controller.signal.reason);
49
+ });
27
50
  });
51
+ const stop = (message) => () => {
52
+ controller.abort(new FinTsTransportError(message));
53
+ };
54
+ const timer = setTimeout(stop('Request timed out'), this.timeoutMs);
55
+ const abort = stop('Request aborted');
56
+ signal?.addEventListener('abort', abort);
28
57
  try {
29
- return await Promise.race([this.exchange(url, body, contentType, controller.signal), timedOut]);
58
+ return await Promise.race([this.exchange(url, body, contentType, controller.signal), stopped]);
30
59
  }
31
60
  catch (error) {
61
+ if (controller.signal.aborted)
62
+ throw controller.signal.reason;
32
63
  if (error instanceof FinTsTransportError)
33
64
  throw error;
34
- if (controller.signal.aborted)
35
- throw new FinTsTransportError('Request timed out');
36
- throw new FinTsTransportError(describe(error));
65
+ throw new FinTsTransportError(failureMessage(error));
37
66
  }
38
67
  finally {
39
68
  clearTimeout(timer);
69
+ signal?.removeEventListener('abort', abort);
40
70
  }
41
71
  }
42
72
  async exchange(url, body, contentType, signal) {
@@ -46,47 +76,114 @@ export class HttpTransport {
46
76
  headers: { 'Content-Type': contentType, 'Cache-Control': 'no-cache', Pragma: 'no-cache' },
47
77
  // The PIN travels in the body: never let the request be repeated at another address.
48
78
  redirect: 'manual',
79
+ // In a browser: no cookies of the page and no referrer go with the PIN, and no cache keeps the exchange.
80
+ credentials: 'omit',
81
+ referrerPolicy: 'no-referrer',
82
+ cache: 'no-store',
49
83
  signal,
50
84
  });
51
85
  if (response.type === 'opaqueredirect') {
52
86
  throw new FinTsTransportError('The server redirects the request, which the client does not follow');
53
87
  }
88
+ // A `fetch` that ignores `redirect`, as one over XMLHttpRequest does, shows a redirect it followed only here.
89
+ if (response.redirected || (response.url && response.url !== withoutFragment(url))) {
90
+ await discard(response);
91
+ throw new FinTsTransportError('The fetch followed a redirect: the request may have gone to another address');
92
+ }
54
93
  if (response.status < 200 || response.status > 299) {
55
- await response.body?.cancel().catch(() => undefined);
56
- throw new FinTsTransportError(`HTTP ${response.status} ${response.statusText}`.trim(), {
94
+ await discard(response);
95
+ throw new FinTsTransportError(trimBlanks(`HTTP ${response.status} ${response.statusText}`), {
57
96
  statusCode: response.status,
58
97
  });
59
98
  }
99
+ const announced = response.headers.get('Content-Length');
100
+ if (announced !== null && /^\d+$/.test(announced) && Number(announced) > this.maxResponseBytes) {
101
+ await discard(response);
102
+ throw this.tooLarge();
103
+ }
60
104
  return this.readBody(response);
61
105
  }
62
106
  async readBody(response) {
63
- const reader = response.body?.getReader();
64
- if (reader === undefined)
65
- return new Uint8Array(await response.arrayBuffer());
66
- const chunks = [];
107
+ // A `fetch` that does not stream, as one over XMLHttpRequest or node-fetch, gives no body or one of another kind.
108
+ const body = response.body;
109
+ if (typeof body?.getReader !== 'function') {
110
+ const bytes = new Uint8Array(await response.arrayBuffer());
111
+ if (bytes.length > this.maxResponseBytes)
112
+ throw this.tooLarge();
113
+ return bytes;
114
+ }
115
+ const reader = body.getReader();
116
+ // Copied as they arrive: many tiny chunks kept as they are would take many times the bytes they hold, and a `fetch`
117
+ // may refill the chunk it handed out.
118
+ let bytes = new Uint8Array(0);
67
119
  let size = 0;
68
120
  for (;;) {
69
121
  const { done, value } = await reader.read();
70
122
  if (done)
71
123
  break;
72
- chunks.push(value);
73
- size += value.length;
74
- if (size > this.maxResponseBytes) {
124
+ const end = size + value.length;
125
+ if (end > this.maxResponseBytes) {
75
126
  await reader.cancel().catch(() => undefined);
76
- throw new FinTsTransportError(`Response larger than ${this.maxResponseBytes} bytes`);
127
+ throw this.tooLarge();
128
+ }
129
+ if (end > bytes.length) {
130
+ const grown = new Uint8Array(Math.min(Math.max(2 * bytes.length, end), this.maxResponseBytes));
131
+ grown.set(bytes.subarray(0, size));
132
+ bytes = grown;
77
133
  }
134
+ bytes.set(value, size);
135
+ size = end;
78
136
  }
79
- return concatBytes(chunks);
137
+ return bytes.slice(0, size);
138
+ }
139
+ tooLarge() {
140
+ return new FinTsTransportError(`Response larger than ${this.maxResponseBytes} bytes`);
80
141
  }
81
142
  close() {
82
143
  // `fetch` keeps no connection the transport could release.
83
144
  }
84
145
  }
85
- /** The message of a `fetch` failure, with its cause: Node.js reports `fetch failed` and the reason in the cause. */
86
- function describe(error) {
146
+ /** `url` as `Response.url` gives it: without fragment. */
147
+ function withoutFragment(url) {
148
+ const copy = new URL(url);
149
+ copy.hash = '';
150
+ return copy.href;
151
+ }
152
+ /** Cancels the body of a response the transport rejects, unless it cannot be cancelled, as a Node.js stream cannot. */
153
+ async function discard(response) {
154
+ try {
155
+ await response.body?.cancel();
156
+ }
157
+ catch {
158
+ // The response is rejected all the same.
159
+ }
160
+ }
161
+ function isPositive(value) {
162
+ return Number.isFinite(value) && value > 0;
163
+ }
164
+ /**
165
+ * The message of a failed request, with the reason its cause gives: Node.js reports `fetch failed` and the reason in the
166
+ * cause. Only messages and codes, since the error may hold the request, PIN and TAN included.
167
+ */
168
+ export function failureMessage(error) {
87
169
  if (!(error instanceof Error))
88
170
  return String(error);
89
- const cause = error.cause;
90
- return cause instanceof Error ? `${error.message}: ${cause.message}` : error.message;
171
+ const reason = error.cause instanceof Error ? reasonOf(error.cause) : '';
172
+ return reason ? `${error.message}: ${reason}` : error.message;
173
+ }
174
+ /**
175
+ * The message of `cause`, or where it has none, the distinct messages of its `errors` or its `code`: Node.js reports a
176
+ * failed connection to a host with IPv6 and IPv4 addresses as an `AggregateError` without a message.
177
+ */
178
+ function reasonOf(cause) {
179
+ if (cause.message)
180
+ return cause.message;
181
+ if (cause instanceof AggregateError) {
182
+ const messages = cause.errors.flatMap((error) => (error instanceof Error && error.message ? [error.message] : []));
183
+ if (messages.length > 0)
184
+ return [...new Set(messages)].join('; ');
185
+ }
186
+ const code = cause.code;
187
+ return typeof code === 'string' ? code : '';
91
188
  }
92
189
  //# sourceMappingURL=transport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/core/transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/core/transport.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,35 @@
1
1
  import { Transaction, type TransactionStatus } from '../core/transaction.js';
2
- /** Parser for ISO 20022 camt.052 and camt.053 account reports. */
2
+ import { RecordBudget } from './record-budget.js';
3
+ /** One report (camt.052), statement (camt.053) or notification (camt.054): the entries of one account. */
4
+ export interface CamtStatement {
5
+ /** The bank's identification of the statement (`Id`). */
6
+ readonly reference: string | undefined;
7
+ /** The account the statement is for: its IBAN, or the bank's other identification of it where it states none. */
8
+ readonly accountId: string | undefined;
9
+ /** The currency of the account, where the statement states it. */
10
+ readonly currency: string | undefined;
11
+ /** The transactions of the statement, in the order the bank lists them. */
12
+ readonly transactions: readonly Transaction[];
13
+ }
14
+ /** Parser for ISO 20022 camt.052, camt.053 and camt.054 account reports, statements and notifications. */
3
15
  export declare const Camt: Readonly<{
4
16
  /**
5
- * Parses all entries; throws `FormatError` for malformed XML, and for an entry without amount, currency, credit/debit
6
- * indicator or date.
7
- *
8
- * `status` overrides the booking status stated in the entries.
17
+ * Parses the transactions of all statements in one list, which does not tell the account of each: a document may hold
18
+ * statements of several accounts, which `parse` keeps apart. Throws as `parse` does.
9
19
  */
10
20
  parseTransactions(xml: string, status?: TransactionStatus): Transaction[];
21
+ /**
22
+ * Parses all statements, each with the account it is for. Throws `FormatError` for malformed XML, for XML nested more
23
+ * than 100 levels deep or of more than 500,000 nodes besides text or one per 16 characters, whichever is more, for a
24
+ * document without any statement, for an entry without amount, currency, credit/debit indicator or date, for a date
25
+ * it cannot read, for remittance information of more than 65,536 characters, and for more than 200,000 statements and
26
+ * transactions.
27
+ *
28
+ * `status` overrides the booking status stated in the entries, unless it is `undefined` or `null`; throws `TypeError`
29
+ * for one other than `booked` and `pending`.
30
+ */
31
+ parse(xml: string, status?: TransactionStatus): CamtStatement[];
11
32
  }>;
33
+ /** `Camt.parse`, which takes each statement and transaction from `budget`, before it builds it. */
34
+ export declare function parseCamt(xml: string, status: TransactionStatus | undefined, budget: RecordBudget): CamtStatement[];
12
35
  //# sourceMappingURL=camt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"camt.d.ts","sourceRoot":"","sources":["../../src/formats/camt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAM7E,kEAAkE;AAClE,eAAO,MAAM,IAAI;IACf;;;;;OAKG;2BACoB,MAAM,WAAW,iBAAiB,GAAG,WAAW,EAAE;EAIzE,CAAC"}
1
+ {"version":3,"file":"camt.d.ts","sourceRoot":"","sources":["../../src/formats/camt.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAO5F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,0GAA0G;AAC1G,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,iHAAiH;IACjH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,SAAS,WAAW,EAAE,CAAC;CAC/C;AAKD,0GAA0G;AAC1G,eAAO,MAAM,IAAI;IACf;;;OAGG;2BACoB,MAAM,WAAW,iBAAiB,GAAG,WAAW,EAAE;IAIzE;;;;;;;;;OASG;eACQ,MAAM,WAAW,iBAAiB,GAAG,aAAa,EAAE;EAG/D,CAAC;AAOH,mGAAmG;AACnG,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,aAAa,EAAE,CAoBnH"}
@@ -1,33 +1,72 @@
1
- import { Amount } from '../core/amount.js';
2
- import { Transaction } from '../core/transaction.js';
1
+ import { addsUpTo, Amount } from '../core/amount.js';
2
+ import { requireStatus, Transaction } from '../core/transaction.js';
3
3
  import { parseIsoDate } from '../util/dates.js';
4
- import { FormatError } from '../util/errors.js';
4
+ import { fail, FormatError } from '../util/errors.js';
5
+ import { frozenWithInspect } from '../util/inspect.js';
6
+ import { counted, maskedId, nonBlank, trimBlanks } from '../util/text.js';
5
7
  import { parseXml } from '../util/xml.js';
8
+ import { maxFieldLength } from './mt940.js';
9
+ import { RecordBudget } from './record-budget.js';
6
10
  import { providedReference, SepaPurpose } from './sepa-purpose.js';
7
- /** Parser for ISO 20022 camt.052 and camt.053 account reports. */
11
+ /** Local names of the elements of a document that hold the entries of one account. */
12
+ const statementNames = new Set(['Rpt', 'Stmt', 'Ntfctn']);
13
+ /** Parser for ISO 20022 camt.052, camt.053 and camt.054 account reports, statements and notifications. */
8
14
  export const Camt = Object.freeze({
9
15
  /**
10
- * Parses all entries; throws `FormatError` for malformed XML, and for an entry without amount, currency, credit/debit
11
- * indicator or date.
12
- *
13
- * `status` overrides the booking status stated in the entries.
16
+ * Parses the transactions of all statements in one list, which does not tell the account of each: a document may hold
17
+ * statements of several accounts, which `parse` keeps apart. Throws as `parse` does.
14
18
  */
15
19
  parseTransactions(xml, status) {
16
- const root = parseXml(xml.trim());
17
- return root.descendantsNamed('Ntry').flatMap((entry) => new CamtEntry(entry, status).transactions());
20
+ return Camt.parse(xml, status).flatMap((s) => s.transactions);
21
+ },
22
+ /**
23
+ * Parses all statements, each with the account it is for. Throws `FormatError` for malformed XML, for XML nested more
24
+ * than 100 levels deep or of more than 500,000 nodes besides text or one per 16 characters, whichever is more, for a
25
+ * document without any statement, for an entry without amount, currency, credit/debit indicator or date, for a date
26
+ * it cannot read, for remittance information of more than 65,536 characters, and for more than 200,000 statements and
27
+ * transactions.
28
+ *
29
+ * `status` overrides the booking status stated in the entries, unless it is `undefined` or `null`; throws `TypeError`
30
+ * for one other than `booked` and `pending`.
31
+ */
32
+ parse(xml, status) {
33
+ return parseCamt(xml, forcedStatus(status), new RecordBudget());
18
34
  },
19
35
  });
36
+ /** The `status` of `Camt.parse`; `undefined` for `null`, the status the entries state. */
37
+ function forcedStatus(status) {
38
+ return status === undefined || status === null ? undefined : requireStatus(status);
39
+ }
40
+ /** `Camt.parse`, which takes each statement and transaction from `budget`, before it builds it. */
41
+ export function parseCamt(xml, status, budget) {
42
+ const root = parseXml(trimBlanks(xml));
43
+ const statements = root.childElements.flatMap((message) => message.childElements.filter((c) => statementNames.has(c.localName)));
44
+ if (statements.length === 0)
45
+ throw new FormatError('camt document without report, statement or notification');
46
+ return statements.map((statement) => {
47
+ budget.take();
48
+ const account = statement.child('Acct');
49
+ const entries = statement.childrenNamed('Ntry');
50
+ return frozenWithInspect({
51
+ reference: statement.textAt(['Id']),
52
+ accountId: account?.textAt(['Id', 'IBAN']) ?? account?.textAt(['Id', 'Othr', 'Id']),
53
+ currency: account?.textAt(['Ccy']),
54
+ transactions: Object.freeze(entries.flatMap((entry) => new CamtEntry(entry, status, budget).transactions())),
55
+ }, (s) => `CamtStatement(${maskedId(s.accountId ?? '')}, ${counted(s.transactions.length, 'transaction')})`);
56
+ });
57
+ }
20
58
  /** Width of the purpose lines banks cut the remittance information into, as in MT940 and DTAUS. */
21
59
  const cutLineLength = 35;
22
60
  /**
23
- * One booking (`Ntry`) of a report; a batch booking yields one transaction per transaction detail (`TxDtls`) when every
24
- * detail states its amount.
61
+ * One booking (`Ntry`) of a report; a batch booking yields one transaction per transaction detail (`TxDtls`) when the
62
+ * details state their amounts and these add up to the booked amount.
25
63
  *
26
64
  * Nothing is guessed: what the entry lacks, and what the reader needs, is a `FormatError`. The one exception is the
27
65
  * value date, which `Transaction.valueDate` requires: an entry with a booking date only takes that.
28
66
  */
29
67
  class CamtEntry {
30
68
  entry;
69
+ budget;
31
70
  amountElement;
32
71
  currency;
33
72
  debit;
@@ -35,10 +74,13 @@ class CamtEntry {
35
74
  status;
36
75
  bookingDate;
37
76
  valueDate;
77
+ bookingText;
78
+ bankReference;
38
79
  /** German banks send `transaction type+GVC+prima nota`, for example `NDDT+105+9310`. */
39
80
  proprietaryCode;
40
- constructor(entry, forcedStatus) {
81
+ constructor(entry, forcedStatus, budget) {
41
82
  this.entry = entry;
83
+ this.budget = budget;
42
84
  this.amountElement = entry.child('Amt') ?? fail('camt entry without amount');
43
85
  this.currency = this.amountElement.getAttribute('Ccy') ?? fail('camt amount without currency');
44
86
  this.debit = debitIndicator(entry.textAt(['CdtDbtInd'])) ?? fail('camt entry without credit/debit indicator');
@@ -46,6 +88,8 @@ class CamtEntry {
46
88
  this.status = forcedStatus ?? this.statusOfEntry();
47
89
  this.bookingDate = dateOf(entry.child('BookgDt'));
48
90
  this.valueDate = dateOf(entry.child('ValDt')) ?? this.bookingDate ?? fail('camt entry without date');
91
+ this.bookingText = entry.textAt(['AddtlNtryInf']);
92
+ this.bankReference = entry.textAt(['AcctSvcrRef']);
49
93
  this.proprietaryCode = entry.textAt(['BkTxCd', 'Prtry', 'Cd'])?.split('+') ?? [];
50
94
  }
51
95
  statusOfEntry() {
@@ -53,48 +97,53 @@ class CamtEntry {
53
97
  return code === 'PDNG' || code === 'INFO' ? 'pending' : 'booked';
54
98
  }
55
99
  transactions() {
56
- const total = Amount.parseDecimal(this.amountElement.innerText, this.currency);
57
- const details = this.entry.descendantsNamed('TxDtls');
100
+ const total = amountOf(this.amountElement, this.currency);
101
+ const details = this.entry.childrenNamed('NtryDtls').flatMap((d) => d.childrenNamed('TxDtls'));
58
102
  if (details.length <= 1)
59
103
  return [this.transaction(details[0], total, this.debit)];
104
+ // A batch is split only into details that make up its booking: each states its amount, and they add up to the
105
+ // booked one, in its currency. It stays one booking otherwise, without the details of any one of them, which would
106
+ // describe the others wrongly.
107
+ const booking = this.transaction(undefined, total, this.debit);
60
108
  const amounts = details.map((detail) => detail.at(['AmtDtls', 'TxAmt', 'Amt']) ?? detail.child('Amt'));
61
- // Without the amount of every detail the batch cannot be split. It stays one booking then, without the details of
62
- // any one of them, which would describe the others wrongly.
63
109
  if (amounts.includes(undefined))
64
- return [this.transaction(undefined, total, this.debit)];
65
- return details.map((detail, i) => {
66
- const amount = amounts[i];
67
- return this.transaction(detail, Amount.parseDecimal(amount.innerText, amount.getAttribute('Ccy') ?? this.currency),
68
- // A detail may book in the other direction than the batch as a whole.
69
- debitIndicator(detail.textAt(['CdtDbtInd'])) ?? this.debit);
70
- });
110
+ return [booking];
111
+ const split = details.map((detail, i) => this.transaction(detail, amountOf(amounts[i], this.currency),
112
+ // A detail may book in the other direction than the batch as a whole.
113
+ debitIndicator(detail.textAt(['CdtDbtInd'])) ?? this.debit));
114
+ const parts = split.map((t) => t.amount);
115
+ return addsUpTo(parts, booking.amount) ? split : [booking];
71
116
  }
72
117
  /** A transaction of `amount`, booked as a debit if `debit`, with what `details` tell about it. */
73
118
  transaction(details, amount, debit) {
119
+ this.budget.take();
74
120
  const parties = details?.child('RltdPties');
75
121
  const agents = details?.child('RltdAgts');
76
122
  // The related parties describe the original operation, which a reversal books the other way round (ISO 20022
77
123
  // `RvslInd`: with `CRDT` the original operation was a debit, with `DBIT` a credit).
78
124
  const originalDebit = debit !== this.reversal;
79
125
  const counterparty = originalDebit ? 'Cdtr' : 'Dbtr';
80
- const lines = (details?.descendantsNamed('Ustrd') ?? [])
81
- .map((line) => line.innerText.trim())
82
- .filter((text) => text !== '');
83
- const purposeParts = lines.map((line, i) => (i > 0 && lines[i - 1].length !== cutLineLength ? ` ${line}` : line));
84
- const purpose = purposeParts.join('');
126
+ const lines = (details?.child('RmtInf')?.childrenNamed('Ustrd') ?? [])
127
+ .map((line) => line.innerText)
128
+ .filter((text) => trimBlanks(text) !== '');
129
+ // A line of 35 characters goes on in the next one as it is, maybe in the middle of a word or before a blank; any
130
+ // other line ends a phrase, which the next one follows after a blank.
131
+ const cut = (i) => lines[i]?.length === cutLineLength;
132
+ const purposeParts = lines.map((line, i) => {
133
+ const part = cut(i) ? line : trimBlanks(line, { start: false });
134
+ return i === 0 || cut(i - 1) ? part : ` ${trimBlanks(part, { end: false })}`;
135
+ });
136
+ const remittance = purposeParts.join('');
137
+ // As long as an MT940 field: the keywords of megabytes of text would take memory without limit.
138
+ if (remittance.length > maxFieldLength)
139
+ throw new FormatError('camt remittance information too long');
85
140
  const keywords = SepaPurpose.parseParts(purposeParts);
86
141
  const endToEndId = providedReference(details?.textAt(['Refs', 'EndToEndId']));
87
142
  const mandateId = details?.textAt(['Refs', 'MndtId']);
88
- const creditorId = creditorIdOf(parties);
143
+ const creditorId = creditorIdOf(parties?.child('Cdtr'));
89
144
  const purposeCode = details?.textAt(['Purp', 'Cd']);
90
145
  const typeId = this.proprietaryCode[0]?.length === 4 ? this.proprietaryCode[0] : undefined;
91
- const purposeCodes = new Map(keywords);
92
- if (endToEndId !== undefined)
93
- purposeCodes.set('EREF', endToEndId);
94
- if (mandateId !== undefined)
95
- purposeCodes.set('MREF', mandateId);
96
- if (creditorId !== undefined)
97
- purposeCodes.set('CRED', creditorId);
146
+ const purposeCodes = withKeywordsStatedApart(keywords, { EREF: endToEndId, MREF: mandateId, CRED: creditorId });
98
147
  if (purposeCode !== undefined)
99
148
  purposeCodes.set('PURP', purposeCode);
100
149
  return new Transaction({
@@ -103,8 +152,11 @@ class CamtEntry {
103
152
  valueDate: this.valueDate,
104
153
  amount: debit ? amount.negate() : amount,
105
154
  isReversal: this.reversal,
106
- bookingText: this.entry.textAt(['AddtlNtryInf']) ?? details?.textAt(['AddtlTxInf']),
107
- purpose: keywords.get('SVWZ') ?? (purpose === '' ? details?.textAt(['AddtlTxInf']) : purpose),
155
+ bookingText: this.bookingText ?? details?.textAt(['AddtlTxInf']),
156
+ purpose: keywords.get('SVWZ') ??
157
+ nonBlank(remittance) ??
158
+ details?.textAt(['RmtInf', 'Strd', 'CdtrRefInf', 'Ref']) ??
159
+ details?.textAt(['AddtlTxInf']),
108
160
  counterpartyName: partyName(parties?.child(counterparty)),
109
161
  counterpartyIban: parties?.child(`${counterparty}Acct`)?.textAt(['Id', 'IBAN']),
110
162
  counterpartyAccountNumber: parties?.child(`${counterparty}Acct`)?.textAt(['Id', 'Othr', 'Id']),
@@ -113,7 +165,7 @@ class CamtEntry {
113
165
  mandateId,
114
166
  creditorId,
115
167
  customerReference: details?.textAt(['Refs', 'InstrId']) ?? details?.textAt(['Refs', 'PmtInfId']),
116
- bankReference: details?.textAt(['Refs', 'AcctSvcrRef']) ?? this.entry.textAt(['AcctSvcrRef']),
168
+ bankReference: details?.textAt(['Refs', 'AcctSvcrRef']) ?? this.bankReference,
117
169
  transactionCode: this.proprietaryCode[1],
118
170
  transactionTypeId: typeId,
119
171
  primaNota: this.proprietaryCode[2],
@@ -123,8 +175,30 @@ class CamtEntry {
123
175
  });
124
176
  }
125
177
  }
126
- function fail(message) {
127
- throw new FormatError(message);
178
+ /**
179
+ * The amount `element` states, in its currency or else in `currency`; throws `FormatError` for a negative one, whose
180
+ * sign the credit/debit indicator would turn: the indicator alone gives the direction.
181
+ */
182
+ function amountOf(element, currency) {
183
+ const amount = Amount.parseDecimal(element.innerText, element.getAttribute('Ccy') ?? currency);
184
+ if (amount.isNegative)
185
+ throw new FormatError('Negative camt amount', element.innerText);
186
+ return amount;
187
+ }
188
+ /**
189
+ * `keywords` with the values of EREF, MREF and CRED that the bank `stated` apart, as `endToEndId`, `mandateId` and
190
+ * `creditorId`, in the place the text gives them, and without those it does not state: in the remittance text, which
191
+ * the payer or the payee writes, a creditor ID or mandate reference could be that of a creditor the app trusts.
192
+ */
193
+ function withKeywordsStatedApart(keywords, stated) {
194
+ const codes = new Map(keywords);
195
+ for (const [keyword, value] of Object.entries(stated)) {
196
+ if (value === undefined)
197
+ codes.delete(keyword);
198
+ else
199
+ codes.set(keyword, value);
200
+ }
201
+ return codes;
128
202
  }
129
203
  /** `true` for `DBIT`, `false` for `CRDT`, `undefined` if `indicator` is missing; throws for any other value. */
130
204
  function debitIndicator(indicator) {
@@ -139,8 +213,15 @@ function debitIndicator(indicator) {
139
213
  throw new FormatError('camt credit/debit indicator is neither CRDT nor DBIT', indicator);
140
214
  }
141
215
  }
216
+ /**
217
+ * The calendar date of `e`: its date (`Dt`), or else its date and time (`DtTm`), both read by `parseIsoDate`, so that
218
+ * a date and time, which may be stated in UTC or another offset, counts on its German day; `undefined` if it states
219
+ * neither. Throws `FormatError` for one it cannot read, which would pass for a missing one otherwise, such as a value
220
+ * date the booking date stands in for.
221
+ */
142
222
  function dateOf(e) {
143
- return parseIsoDate(e?.textAt(['Dt']) ?? e?.textAt(['DtTm']));
223
+ const date = e?.textAt(['Dt']) ?? e?.textAt(['DtTm']);
224
+ return date === undefined ? undefined : (parseIsoDate(date) ?? fail('Unreadable camt date', date));
144
225
  }
145
226
  function partyName(party) {
146
227
  return party?.textAt(['Nm']) ?? party?.textAt(['Pty', 'Nm']);
@@ -148,12 +229,13 @@ function partyName(party) {
148
229
  function bicOf(agent) {
149
230
  return agent?.textAt(['FinInstnId', 'BIC']) ?? agent?.textAt(['FinInstnId', 'BICFI']);
150
231
  }
151
- /** The SEPA creditor identifier: the `Othr` identification in the scheme `SEPA`. */
152
- function creditorIdOf(parties) {
153
- for (const other of parties?.descendantsNamed('Othr') ?? []) {
154
- if (other.textAt(['SchmeNm', 'Prtry']) === 'SEPA')
155
- return other.textAt(['Id']);
156
- }
157
- return undefined;
232
+ /**
233
+ * The SEPA creditor identifier of the `creditor`: its private `Othr` identification in the scheme `SEPA`. The other
234
+ * parties' identifications are the creditor's or the debtor's to choose, and may be in that scheme as well.
235
+ */
236
+ function creditorIdOf(creditor) {
237
+ const identifications = creditor?.at(['Id', 'PrvtId']) ?? creditor?.at(['Pty', 'Id', 'PrvtId']);
238
+ const sepa = identifications?.childrenNamed('Othr').find((other) => other.textAt(['SchmeNm', 'Prtry']) === 'SEPA');
239
+ return sepa?.textAt(['Id']);
158
240
  }
159
241
  //# sourceMappingURL=camt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"camt.js","sourceRoot":"","sources":["../../src/formats/camt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"camt.js","sourceRoot":"","sources":["../../src/formats/camt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,WAAW,EAA0B,MAAM,wBAAwB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAcnE,sFAAsF;AACtF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE1D,0GAA0G;AAC1G,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;IAChC;;;OAGG;IACH,iBAAiB,CAAC,GAAW,EAAE,MAA0B;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAChE,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,GAAW,EAAE,MAA0B;QAC3C,OAAO,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;IAClE,CAAC;CACF,CAAC,CAAC;AAEH,0FAA0F;AAC1F,SAAS,YAAY,CAAC,MAAe;IACnC,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AACrF,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,MAAqC,EAAE,MAAoB;IAChG,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACxD,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CACrE,CAAC;IACF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,WAAW,CAAC,yDAAyD,CAAC,CAAC;IAC9G,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QAClC,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAChD,OAAO,iBAAiB,CACtB;YACE,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;YACnC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YACnF,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;YAClC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;SAC7G,EACD,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,QAAQ,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CACzG,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,mGAAmG;AACnG,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,SAAS;IAeM;IAEA;IAhBF,aAAa,CAAa;IAC1B,QAAQ,CAAS;IACjB,KAAK,CAAU;IACf,QAAQ,CAAU;IAClB,MAAM,CAAoB;IAC1B,WAAW,CAAmB;IAC9B,SAAS,CAAO;IAChB,WAAW,CAAqB;IAChC,aAAa,CAAqB;IAEnD,wFAAwF;IACvE,eAAe,CAAoB;IAEpD,YACmB,KAAiB,EAClC,YAA2C,EAC1B,MAAoB;QAFpB,UAAK,GAAL,KAAK,CAAY;QAEjB,WAAM,GAAN,MAAM,CAAc;QAErC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC/F,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC9G,IAAI,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,GAAG,YAAY,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACnD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACrG,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACnF,CAAC;IAEO,aAAa;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnE,CAAC;IAED,YAAY;QACV,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/F,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,8GAA8G;QAC9G,mHAAmH;QACnH,+BAA+B;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACvG,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CACtC,IAAI,CAAC,WAAW,CACd,MAAM,EACN,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;QACpC,sEAAsE;QACtE,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAC3D,CACF,CAAC;QACF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,kGAAkG;IAC1F,WAAW,CAAC,OAA+B,EAAE,MAAc,EAAE,KAAc;QACjF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1C,6GAA6G;QAC7G,oFAAoF;QACpF,MAAM,aAAa,GAAG,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC;QAC9C,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;aACnE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;aAC7B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7C,iHAAiH;QACjH,sEAAsE;QACtE,MAAM,GAAG,GAAG,CAAC,CAAS,EAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,aAAa,CAAC;QACvE,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACzC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC/E,CAAC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,gGAAgG;QAChG,IAAI,UAAU,CAAC,MAAM,GAAG,cAAc;YAAE,MAAM,IAAI,WAAW,CAAC,sCAAsC,CAAC,CAAC;QACtG,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9E,MAAM,SAAS,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,MAAM,YAAY,GAAG,uBAAuB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAChH,IAAI,WAAW,KAAK,SAAS;YAAE,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACrE,OAAO,IAAI,WAAW,CAAC;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM;YACxC,UAAU,EAAE,IAAI,CAAC,QAAQ;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,OAAO,EAAE,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAChE,OAAO,EACL,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;gBACpB,QAAQ,CAAC,UAAU,CAAC;gBACpB,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;gBACxD,OAAO,EAAE,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACjC,gBAAgB,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YACzD,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,YAAY,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC/E,yBAAyB,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,YAAY,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAC9F,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC;YAC3D,UAAU;YACV,SAAS;YACT,UAAU;YACV,iBAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,IAAI,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAChG,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa;YAC7E,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YACxC,iBAAiB,EAAE,MAAM;YACzB,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YAClC,gBAAgB,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACxD,cAAc,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACtD,YAAY;SACb,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,OAAmB,EAAE,QAAgB;IACrD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC;IAC/F,IAAI,MAAM,CAAC,UAAU;QAAE,MAAM,IAAI,WAAW,CAAC,sBAAsB,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACxF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAC9B,QAAqC,EACrC,MAAsE;IAEtE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChC,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;;YAC1C,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gHAAgH;AAChH,SAAS,cAAc,CAAC,SAA6B;IACnD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd,KAAK,MAAM;YACT,OAAO,KAAK,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB;YACE,MAAM,IAAI,WAAW,CAAC,sDAAsD,EAAE,SAAS,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,CAAyB;IACvC,MAAM,IAAI,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC,CAAC;AACrG,CAAC;AAED,SAAS,SAAS,CAAC,KAA6B;IAC9C,OAAO,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,KAAK,CAAC,KAA6B;IAC1C,OAAO,KAAK,EAAE,MAAM,CAAC,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,IAAI,KAAK,EAAE,MAAM,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;AACxF,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,QAAgC;IACpD,MAAM,eAAe,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChG,MAAM,IAAI,GAAG,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;IACnH,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9B,CAAC"}