@coderoftime/fints 0.0.0-stage → 0.1.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.
- package/CHANGELOG.md +11 -0
- package/LICENSE +28 -0
- package/README.md +156 -2
- package/dist/core/account.d.ts +140 -0
- package/dist/core/account.d.ts.map +1 -0
- package/dist/core/account.js +174 -0
- package/dist/core/account.js.map +1 -0
- package/dist/core/amount.d.ts +62 -0
- package/dist/core/amount.d.ts.map +1 -0
- package/dist/core/amount.js +189 -0
- package/dist/core/amount.js.map +1 -0
- package/dist/core/balance.d.ts +54 -0
- package/dist/core/balance.d.ts.map +1 -0
- package/dist/core/balance.js +53 -0
- package/dist/core/balance.js.map +1 -0
- package/dist/core/bank-info.d.ts +49 -0
- package/dist/core/bank-info.d.ts.map +1 -0
- package/dist/core/bank-info.js +52 -0
- package/dist/core/bank-info.js.map +1 -0
- package/dist/core/client.d.ts +126 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +2 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/config.d.ts +68 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +113 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/errors.d.ts +91 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +182 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/feedback.d.ts +69 -0
- package/dist/core/feedback.d.ts.map +1 -0
- package/dist/core/feedback.js +124 -0
- package/dist/core/feedback.js.map +1 -0
- package/dist/core/transaction.d.ts +98 -0
- package/dist/core/transaction.d.ts.map +1 -0
- package/dist/core/transaction.js +91 -0
- package/dist/core/transaction.js.map +1 -0
- package/dist/core/transport.d.ts +37 -0
- package/dist/core/transport.d.ts.map +1 -0
- package/dist/core/transport.js +92 -0
- package/dist/core/transport.js.map +1 -0
- package/dist/formats/camt.d.ts +12 -0
- package/dist/formats/camt.d.ts.map +1 -0
- package/dist/formats/camt.js +159 -0
- package/dist/formats/camt.js.map +1 -0
- package/dist/formats/mt940.d.ts +42 -0
- package/dist/formats/mt940.d.ts.map +1 -0
- package/dist/formats/mt940.js +297 -0
- package/dist/formats/mt940.js.map +1 -0
- package/dist/formats/readers.d.ts +11 -0
- package/dist/formats/readers.d.ts.map +1 -0
- package/dist/formats/readers.js +47 -0
- package/dist/formats/readers.js.map +1 -0
- package/dist/formats/sepa-purpose.d.ts +22 -0
- package/dist/formats/sepa-purpose.d.ts.map +1 -0
- package/dist/formats/sepa-purpose.js +68 -0
- package/dist/formats/sepa-purpose.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/session/app-approval.d.ts +60 -0
- package/dist/session/app-approval.d.ts.map +1 -0
- package/dist/session/app-approval.js +215 -0
- package/dist/session/app-approval.js.map +1 -0
- package/dist/session/bank-connection.d.ts +28 -0
- package/dist/session/bank-connection.d.ts.map +1 -0
- package/dist/session/bank-connection.js +48 -0
- package/dist/session/bank-connection.js.map +1 -0
- package/dist/session/dialog-runner.d.ts +34 -0
- package/dist/session/dialog-runner.d.ts.map +1 -0
- package/dist/session/dialog-runner.js +112 -0
- package/dist/session/dialog-runner.js.map +1 -0
- package/dist/session/login-guard.d.ts +73 -0
- package/dist/session/login-guard.d.ts.map +1 -0
- package/dist/session/login-guard.js +109 -0
- package/dist/session/login-guard.js.map +1 -0
- package/dist/session/parameter-data.d.ts +83 -0
- package/dist/session/parameter-data.d.ts.map +1 -0
- package/dist/session/parameter-data.js +68 -0
- package/dist/session/parameter-data.js.map +1 -0
- package/dist/session/pin-tan-client.d.ts +54 -0
- package/dist/session/pin-tan-client.d.ts.map +1 -0
- package/dist/session/pin-tan-client.js +153 -0
- package/dist/session/pin-tan-client.js.map +1 -0
- package/dist/session/pin-tan-dialog.d.ts +71 -0
- package/dist/session/pin-tan-dialog.d.ts.map +1 -0
- package/dist/session/pin-tan-dialog.js +124 -0
- package/dist/session/pin-tan-dialog.js.map +1 -0
- package/dist/session/protocol.d.ts +209 -0
- package/dist/session/protocol.d.ts.map +1 -0
- package/dist/session/protocol.js +75 -0
- package/dist/session/protocol.js.map +1 -0
- package/dist/session/response-handler.d.ts +48 -0
- package/dist/session/response-handler.d.ts.map +1 -0
- package/dist/session/response-handler.js +121 -0
- package/dist/session/response-handler.js.map +1 -0
- package/dist/session/sepa-accounts.d.ts +34 -0
- package/dist/session/sepa-accounts.d.ts.map +1 -0
- package/dist/session/sepa-accounts.js +96 -0
- package/dist/session/sepa-accounts.js.map +1 -0
- package/dist/session/session-setup.d.ts +72 -0
- package/dist/session/session-setup.d.ts.map +1 -0
- package/dist/session/session-setup.js +160 -0
- package/dist/session/session-setup.js.map +1 -0
- package/dist/session/session-state.d.ts +47 -0
- package/dist/session/session-state.d.ts.map +1 -0
- package/dist/session/session-state.js +147 -0
- package/dist/session/session-state.js.map +1 -0
- package/dist/session/tan-selection.d.ts +88 -0
- package/dist/session/tan-selection.d.ts.map +1 -0
- package/dist/session/tan-selection.js +178 -0
- package/dist/session/tan-selection.js.map +1 -0
- package/dist/session/user-prompts.d.ts +61 -0
- package/dist/session/user-prompts.d.ts.map +1 -0
- package/dist/session/user-prompts.js +164 -0
- package/dist/session/user-prompts.js.map +1 -0
- package/dist/tan/challenge.d.ts +114 -0
- package/dist/tan/challenge.d.ts.map +1 -0
- package/dist/tan/challenge.js +185 -0
- package/dist/tan/challenge.js.map +1 -0
- package/dist/tan/flicker.d.ts +36 -0
- package/dist/tan/flicker.d.ts.map +1 -0
- package/dist/tan/flicker.js +262 -0
- package/dist/tan/flicker.js.map +1 -0
- package/dist/tan/tan-image.d.ts +21 -0
- package/dist/tan/tan-image.d.ts.map +1 -0
- package/dist/tan/tan-image.js +41 -0
- package/dist/tan/tan-image.js.map +1 -0
- package/dist/tan/tan-models.d.ts +145 -0
- package/dist/tan/tan-models.d.ts.map +1 -0
- package/dist/tan/tan-models.js +148 -0
- package/dist/tan/tan-models.js.map +1 -0
- package/dist/util/async.d.ts +24 -0
- package/dist/util/async.d.ts.map +1 -0
- package/dist/util/async.js +49 -0
- package/dist/util/async.js.map +1 -0
- package/dist/util/bytes.d.ts +23 -0
- package/dist/util/bytes.d.ts.map +1 -0
- package/dist/util/bytes.js +136 -0
- package/dist/util/bytes.js.map +1 -0
- package/dist/util/call-context.d.ts +12 -0
- package/dist/util/call-context.d.ts.map +1 -0
- package/dist/util/call-context.js +29 -0
- package/dist/util/call-context.js.map +1 -0
- package/dist/util/dates.d.ts +62 -0
- package/dist/util/dates.d.ts.map +1 -0
- package/dist/util/dates.js +169 -0
- package/dist/util/dates.js.map +1 -0
- package/dist/util/errors.d.ts +9 -0
- package/dist/util/errors.d.ts.map +1 -0
- package/dist/util/errors.js +15 -0
- package/dist/util/errors.js.map +1 -0
- package/dist/util/immutable-map.d.ts +16 -0
- package/dist/util/immutable-map.d.ts.map +1 -0
- package/dist/util/immutable-map.js +38 -0
- package/dist/util/immutable-map.js.map +1 -0
- package/dist/util/json.d.ts +13 -0
- package/dist/util/json.d.ts.map +1 -0
- package/dist/util/json.js +44 -0
- package/dist/util/json.js.map +1 -0
- package/dist/util/text.d.ts +20 -0
- package/dist/util/text.d.ts.map +1 -0
- package/dist/util/text.js +78 -0
- package/dist/util/text.js.map +1 -0
- package/dist/util/xml.d.ts +35 -0
- package/dist/util/xml.d.ts.map +1 -0
- package/dist/util/xml.js +183 -0
- package/dist/util/xml.js.map +1 -0
- package/dist/v3/account-extension.d.ts +25 -0
- package/dist/v3/account-extension.d.ts.map +1 -0
- package/dist/v3/account-extension.js +176 -0
- package/dist/v3/account-extension.js.map +1 -0
- package/dist/v3/client.d.ts +24 -0
- package/dist/v3/client.d.ts.map +1 -0
- package/dist/v3/client.js +16 -0
- package/dist/v3/client.js.map +1 -0
- package/dist/v3/dialog.d.ts +78 -0
- package/dist/v3/dialog.d.ts.map +1 -0
- package/dist/v3/dialog.js +138 -0
- package/dist/v3/dialog.js.map +1 -0
- package/dist/v3/message.d.ts +72 -0
- package/dist/v3/message.d.ts.map +1 -0
- package/dist/v3/message.js +259 -0
- package/dist/v3/message.js.map +1 -0
- package/dist/v3/parameters.d.ts +79 -0
- package/dist/v3/parameters.d.ts.map +1 -0
- package/dist/v3/parameters.js +396 -0
- package/dist/v3/parameters.js.map +1 -0
- package/dist/v3/protocol.d.ts +68 -0
- package/dist/v3/protocol.d.ts.map +1 -0
- package/dist/v3/protocol.js +263 -0
- package/dist/v3/protocol.js.map +1 -0
- package/dist/v3/segments.d.ts +89 -0
- package/dist/v3/segments.d.ts.map +1 -0
- package/dist/v3/segments.js +283 -0
- package/dist/v3/segments.js.map +1 -0
- package/dist/v3/syntax.d.ts +76 -0
- package/dist/v3/syntax.d.ts.map +1 -0
- package/dist/v3/syntax.js +301 -0
- package/dist/v3/syntax.js.map +1 -0
- package/package.json +63 -4
- package/src/core/account.ts +250 -0
- package/src/core/amount.ts +209 -0
- package/src/core/balance.ts +84 -0
- package/src/core/bank-info.ts +66 -0
- package/src/core/client.ts +149 -0
- package/src/core/config.ts +141 -0
- package/src/core/errors.ts +203 -0
- package/src/core/feedback.ts +137 -0
- package/src/core/transaction.ts +156 -0
- package/src/core/transport.ts +114 -0
- package/src/formats/camt.ts +169 -0
- package/src/formats/mt940.ts +333 -0
- package/src/formats/readers.ts +56 -0
- package/src/formats/sepa-purpose.ts +75 -0
- package/src/index.ts +68 -0
- package/src/session/app-approval.ts +265 -0
- package/src/session/bank-connection.ts +51 -0
- package/src/session/dialog-runner.ts +119 -0
- package/src/session/login-guard.ts +135 -0
- package/src/session/parameter-data.ts +137 -0
- package/src/session/pin-tan-client.ts +186 -0
- package/src/session/pin-tan-dialog.ts +160 -0
- package/src/session/protocol.ts +311 -0
- package/src/session/response-handler.ts +130 -0
- package/src/session/sepa-accounts.ts +97 -0
- package/src/session/session-setup.ts +165 -0
- package/src/session/session-state.ts +170 -0
- package/src/session/tan-selection.ts +192 -0
- package/src/session/user-prompts.ts +174 -0
- package/src/tan/challenge.ts +252 -0
- package/src/tan/flicker.ts +270 -0
- package/src/tan/tan-image.ts +36 -0
- package/src/tan/tan-models.ts +247 -0
- package/src/util/async.ts +53 -0
- package/src/util/bytes.ts +135 -0
- package/src/util/call-context.ts +40 -0
- package/src/util/dates.ts +193 -0
- package/src/util/errors.ts +16 -0
- package/src/util/immutable-map.ts +47 -0
- package/src/util/json.ts +51 -0
- package/src/util/text.ts +82 -0
- package/src/util/xml.ts +172 -0
- package/src/v3/account-extension.ts +190 -0
- package/src/v3/client.ts +29 -0
- package/src/v3/dialog.ts +199 -0
- package/src/v3/message.ts +321 -0
- package/src/v3/parameters.ts +451 -0
- package/src/v3/protocol.ts +331 -0
- package/src/v3/segments.ts +331 -0
- package/src/v3/syntax.ts +307 -0
package/dist/util/xml.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { FormatError } from './errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* An element of a parsed XML document, looked up by local name: camt documents come with and without namespace
|
|
4
|
+
* prefixes.
|
|
5
|
+
*/
|
|
6
|
+
export class XmlElement {
|
|
7
|
+
localName;
|
|
8
|
+
attributes;
|
|
9
|
+
children = [];
|
|
10
|
+
constructor(
|
|
11
|
+
/** The name without namespace prefix. */
|
|
12
|
+
localName,
|
|
13
|
+
/** The attributes by name without namespace prefix; namespace declarations are left out. */
|
|
14
|
+
attributes) {
|
|
15
|
+
this.localName = localName;
|
|
16
|
+
this.attributes = attributes;
|
|
17
|
+
}
|
|
18
|
+
get childElements() {
|
|
19
|
+
return this.children.filter((c) => c instanceof XmlElement);
|
|
20
|
+
}
|
|
21
|
+
/** The text of this element and all below it. */
|
|
22
|
+
get innerText() {
|
|
23
|
+
return this.children.map((c) => (c instanceof XmlElement ? c.innerText : c)).join('');
|
|
24
|
+
}
|
|
25
|
+
getAttribute(localName) {
|
|
26
|
+
return this.attributes.get(localName);
|
|
27
|
+
}
|
|
28
|
+
/** The first child element called `localName`. */
|
|
29
|
+
child(localName) {
|
|
30
|
+
return this.childElements.find((c) => c.localName === localName);
|
|
31
|
+
}
|
|
32
|
+
/** The element reached by following child names along `path`; this element for an empty path. */
|
|
33
|
+
at(path) {
|
|
34
|
+
return path.reduce((element, name) => element?.child(name), this);
|
|
35
|
+
}
|
|
36
|
+
/** The trimmed text of the element at `path`, or `undefined` if it is missing or empty. */
|
|
37
|
+
textAt(path) {
|
|
38
|
+
const text = this.at(path)?.innerText.trim();
|
|
39
|
+
return text === undefined || text === '' ? undefined : text;
|
|
40
|
+
}
|
|
41
|
+
/** All elements below this one called `localName`, in document order. */
|
|
42
|
+
descendantsNamed(localName) {
|
|
43
|
+
const found = [];
|
|
44
|
+
const visit = (element) => {
|
|
45
|
+
for (const c of element.childElements) {
|
|
46
|
+
if (c.localName === localName)
|
|
47
|
+
found.push(c);
|
|
48
|
+
visit(c);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
visit(this);
|
|
52
|
+
return found;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const namePattern = /[^\s<>/=!?"']+/y;
|
|
56
|
+
const attributePattern = /\s+([^\s<>/=!?"']+)\s*=\s*(?:"([^"<]*)"|'([^'<]*)')/y;
|
|
57
|
+
/** The match of the sticky `pattern` at `position` in `text`. */
|
|
58
|
+
function matchAt(pattern, text, position) {
|
|
59
|
+
pattern.lastIndex = position;
|
|
60
|
+
return pattern.exec(text);
|
|
61
|
+
}
|
|
62
|
+
const predefinedEntities = { amp: '&', lt: '<', gt: '>', quot: '"', apos: "'" };
|
|
63
|
+
function localNameOf(qualified) {
|
|
64
|
+
const colon = qualified.indexOf(':');
|
|
65
|
+
return colon < 0 ? qualified : qualified.substring(colon + 1);
|
|
66
|
+
}
|
|
67
|
+
/** Resolves the character and predefined entity references in `text`; throws `FormatError` for any other. */
|
|
68
|
+
function decodeEntities(text) {
|
|
69
|
+
return text.replace(/&([^;&\s]*);?/g, (match, name) => {
|
|
70
|
+
if (!match.endsWith(';'))
|
|
71
|
+
throw new FormatError('Invalid XML: unterminated entity reference');
|
|
72
|
+
if (name.startsWith('#')) {
|
|
73
|
+
const hex = name.startsWith('#x');
|
|
74
|
+
const digits = name.substring(hex ? 2 : 1);
|
|
75
|
+
const code = (hex ? /^[0-9a-fA-F]+$/ : /^\d+$/).test(digits) ? parseInt(digits, hex ? 16 : 10) : NaN;
|
|
76
|
+
if (!(code > 0 && code <= 0x10ffff && (code < 0xd800 || code > 0xdfff))) {
|
|
77
|
+
throw new FormatError('Invalid XML character reference', match);
|
|
78
|
+
}
|
|
79
|
+
return String.fromCodePoint(code);
|
|
80
|
+
}
|
|
81
|
+
const value = predefinedEntities[name];
|
|
82
|
+
if (value === undefined)
|
|
83
|
+
throw new FormatError('Invalid XML: unknown entity', match);
|
|
84
|
+
return value;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Parses an XML document and returns its root element; throws `FormatError` if it is not well-formed.
|
|
89
|
+
*
|
|
90
|
+
* A document type declaration is refused: bank data have none, and its entities could expand without limit.
|
|
91
|
+
*/
|
|
92
|
+
export function parseXml(xml) {
|
|
93
|
+
let position = 0;
|
|
94
|
+
const stack = [];
|
|
95
|
+
let root;
|
|
96
|
+
const fail = (reason) => {
|
|
97
|
+
throw new FormatError(`Invalid XML: ${reason} at position ${position}`);
|
|
98
|
+
};
|
|
99
|
+
const skipPast = (terminator, what) => {
|
|
100
|
+
const end = xml.indexOf(terminator, position);
|
|
101
|
+
if (end < 0)
|
|
102
|
+
fail(`unterminated ${what}`);
|
|
103
|
+
position = end + terminator.length;
|
|
104
|
+
};
|
|
105
|
+
while (position < xml.length) {
|
|
106
|
+
const lt = xml.indexOf('<', position);
|
|
107
|
+
const textEnd = lt < 0 ? xml.length : lt;
|
|
108
|
+
if (textEnd > position) {
|
|
109
|
+
const text = xml.substring(position, textEnd);
|
|
110
|
+
const parent = stack.at(-1);
|
|
111
|
+
if (parent)
|
|
112
|
+
parent.children.push(decodeEntities(text));
|
|
113
|
+
else if (text.trim() !== '')
|
|
114
|
+
fail('text outside the root element');
|
|
115
|
+
position = textEnd;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (xml.startsWith('<?', position)) {
|
|
119
|
+
skipPast('?>', 'processing instruction');
|
|
120
|
+
}
|
|
121
|
+
else if (xml.startsWith('<!--', position)) {
|
|
122
|
+
skipPast('-->', 'comment');
|
|
123
|
+
}
|
|
124
|
+
else if (xml.startsWith('<![CDATA[', position)) {
|
|
125
|
+
const parent = stack.at(-1) ?? fail('CDATA outside the root element');
|
|
126
|
+
const start = position + 9;
|
|
127
|
+
skipPast(']]>', 'CDATA section');
|
|
128
|
+
parent.children.push(xml.substring(start, position - 3));
|
|
129
|
+
}
|
|
130
|
+
else if (xml.startsWith('<!', position)) {
|
|
131
|
+
fail('document type declarations are not supported');
|
|
132
|
+
}
|
|
133
|
+
else if (xml.startsWith('</', position)) {
|
|
134
|
+
position += 2;
|
|
135
|
+
const name = matchAt(namePattern, xml, position)?.[0] ?? fail('missing end tag name');
|
|
136
|
+
position += name.length;
|
|
137
|
+
while (/\s/.test(xml.charAt(position)))
|
|
138
|
+
position++;
|
|
139
|
+
if (xml.charAt(position) !== '>')
|
|
140
|
+
fail('malformed end tag');
|
|
141
|
+
position++;
|
|
142
|
+
const open = stack.pop();
|
|
143
|
+
if (open === undefined || open.localName !== localNameOf(name))
|
|
144
|
+
fail(`unexpected end tag ${name}`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
position++;
|
|
148
|
+
const name = matchAt(namePattern, xml, position)?.[0] ?? fail('missing element name');
|
|
149
|
+
position += name.length;
|
|
150
|
+
const attributes = new Map();
|
|
151
|
+
for (;;) {
|
|
152
|
+
const attribute = matchAt(attributePattern, xml, position);
|
|
153
|
+
if (!attribute)
|
|
154
|
+
break;
|
|
155
|
+
position += attribute[0].length;
|
|
156
|
+
const attributeName = attribute[1];
|
|
157
|
+
if (attributeName !== 'xmlns' && !attributeName.startsWith('xmlns:')) {
|
|
158
|
+
attributes.set(localNameOf(attributeName), decodeEntities(attribute[2] ?? attribute[3] ?? ''));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
while (/\s/.test(xml.charAt(position)))
|
|
162
|
+
position++;
|
|
163
|
+
const selfClosing = xml.startsWith('/>', position);
|
|
164
|
+
if (!selfClosing && xml.charAt(position) !== '>')
|
|
165
|
+
fail(`malformed start tag ${name}`);
|
|
166
|
+
position += selfClosing ? 2 : 1;
|
|
167
|
+
const element = new XmlElement(localNameOf(name), attributes);
|
|
168
|
+
const parent = stack.at(-1);
|
|
169
|
+
if (parent)
|
|
170
|
+
parent.children.push(element);
|
|
171
|
+
else if (root)
|
|
172
|
+
fail('a second root element');
|
|
173
|
+
else
|
|
174
|
+
root = element;
|
|
175
|
+
if (!selfClosing)
|
|
176
|
+
stack.push(element);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (stack.length > 0)
|
|
180
|
+
fail(`unclosed element ${stack.at(-1).localName}`);
|
|
181
|
+
return root ?? fail('no root element');
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/util/xml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AccountDataStatus, type Account } from '../core/account.js';
|
|
2
|
+
import { Balance } from '../core/balance.js';
|
|
3
|
+
/**
|
|
4
|
+
* The account extension of the user parameter data (HIUPD "Erweiterung, kontobezogen", Formals E.3.1): JSON with the
|
|
5
|
+
* BIC, the balance, and what the bank tells about the data it holds for the account.
|
|
6
|
+
*/
|
|
7
|
+
export declare class AccountExtension {
|
|
8
|
+
/** The BIC of the account, which spares the SEPA account list (Formals F.3.4). */
|
|
9
|
+
readonly bic: string | undefined;
|
|
10
|
+
/** What the bank tells about the account's data. */
|
|
11
|
+
readonly status: AccountDataStatus;
|
|
12
|
+
private readonly balance;
|
|
13
|
+
/** Whether `balance` holds all a balance query would deliver (`BalComplete`). */
|
|
14
|
+
private readonly balanceComplete;
|
|
15
|
+
private constructor();
|
|
16
|
+
/**
|
|
17
|
+
* Reads `json`; `undefined` if it is not a JSON object or any element is malformed, which voids the whole extension
|
|
18
|
+
* (Formals F.2, KF3).
|
|
19
|
+
*/
|
|
20
|
+
static tryParse(json: string): AccountExtension | undefined;
|
|
21
|
+
private static read;
|
|
22
|
+
/** The balance of `account`, where the extension holds all a balance query would deliver (Formals F.3.2). */
|
|
23
|
+
completeBalance(account: Account): Balance | undefined;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=account-extension.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-extension.d.ts","sourceRoot":"","sources":["../../src/v3/account-extension.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAuB7C;;;GAGG;AACH,qBAAa,gBAAgB;IAEzB,kFAAkF;IAClF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAChC,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,eAAe;IAPlC,OAAO;IAUP;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAU3D,OAAO,CAAC,MAAM,CAAC,IAAI;IAgBnB,6GAA6G;IAC7G,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;CAiBvD"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// Internal to the package, and named after the FinTS specification. Documentation is where the meaning is not evident.
|
|
2
|
+
import { AccountDataStatus } from '../core/account.js';
|
|
3
|
+
import { Amount, withMark } from '../core/amount.js';
|
|
4
|
+
import { Balance } from '../core/balance.js';
|
|
5
|
+
import { parseFintsDate, parseUtcPlusOneDateTime } from '../util/dates.js';
|
|
6
|
+
import { FormatError } from '../util/errors.js';
|
|
7
|
+
/**
|
|
8
|
+
* The account extension of the user parameter data (HIUPD "Erweiterung, kontobezogen", Formals E.3.1): JSON with the
|
|
9
|
+
* BIC, the balance, and what the bank tells about the data it holds for the account.
|
|
10
|
+
*/
|
|
11
|
+
export class AccountExtension {
|
|
12
|
+
bic;
|
|
13
|
+
status;
|
|
14
|
+
balance;
|
|
15
|
+
balanceComplete;
|
|
16
|
+
constructor(
|
|
17
|
+
/** The BIC of the account, which spares the SEPA account list (Formals F.3.4). */
|
|
18
|
+
bic,
|
|
19
|
+
/** What the bank tells about the account's data. */
|
|
20
|
+
status, balance,
|
|
21
|
+
/** Whether `balance` holds all a balance query would deliver (`BalComplete`). */
|
|
22
|
+
balanceComplete) {
|
|
23
|
+
this.bic = bic;
|
|
24
|
+
this.status = status;
|
|
25
|
+
this.balance = balance;
|
|
26
|
+
this.balanceComplete = balanceComplete;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Reads `json`; `undefined` if it is not a JSON object or any element is malformed, which voids the whole extension
|
|
30
|
+
* (Formals F.2, KF3).
|
|
31
|
+
*/
|
|
32
|
+
static tryParse(json) {
|
|
33
|
+
try {
|
|
34
|
+
const decoded = JSON.parse(json);
|
|
35
|
+
return isObject(decoded) ? AccountExtension.read(new Json(decoded)) : undefined;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (error instanceof FormatError || error instanceof SyntaxError)
|
|
39
|
+
return undefined;
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
static read(json) {
|
|
44
|
+
const balance = json.object('AcctBal');
|
|
45
|
+
const next = json.object('AcctStatNext');
|
|
46
|
+
return new AccountExtension(json.string('BIC'), new AccountDataStatus({
|
|
47
|
+
inventory: json.object('Inventory')?.strings ?? new Map(),
|
|
48
|
+
lastTransactions: json.string('umsltzt'),
|
|
49
|
+
nextTransactionsAt: next === undefined ? undefined : moment(next, '000000'),
|
|
50
|
+
transactionBalancesCurrent: json.flag('BalStatAcct') || json.flag('BalStatAct'),
|
|
51
|
+
}), balance === undefined ? undefined : readBalance(balance), json.flag('BalComplete'));
|
|
52
|
+
}
|
|
53
|
+
/** The balance of `account`, where the extension holds all a balance query would deliver (Formals F.3.2). */
|
|
54
|
+
completeBalance(account) {
|
|
55
|
+
const b = this.balance;
|
|
56
|
+
if (b === undefined || !this.balanceComplete)
|
|
57
|
+
return undefined;
|
|
58
|
+
return new Balance({
|
|
59
|
+
account,
|
|
60
|
+
booked: b.booked.amount,
|
|
61
|
+
bookedAsOf: b.booked.date,
|
|
62
|
+
bookedAsOfTime: b.booked.time,
|
|
63
|
+
pending: b.pending?.amount,
|
|
64
|
+
creditLine: b.creditLine,
|
|
65
|
+
available: b.available,
|
|
66
|
+
used: b.used,
|
|
67
|
+
overdraft: b.overdraft,
|
|
68
|
+
bookingDate: b.bookingDate,
|
|
69
|
+
bookingTime: b.bookingTime,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function readBalance(json) {
|
|
74
|
+
const currency = json.string('Cur') ?? fail('Extension balance without currency');
|
|
75
|
+
const amount = (key) => {
|
|
76
|
+
const value = json.string(key);
|
|
77
|
+
return value === undefined ? undefined : Amount.parseDecimal(value, currency);
|
|
78
|
+
};
|
|
79
|
+
const saldo = (key) => {
|
|
80
|
+
const s = json.object(key);
|
|
81
|
+
if (s === undefined)
|
|
82
|
+
return undefined;
|
|
83
|
+
const value = s.string('Val') ?? fail('Extension balance without value');
|
|
84
|
+
return {
|
|
85
|
+
amount: withMark(Amount.parseDecimal(value, currency), s.string('DebCrd'), 'C', 'D'),
|
|
86
|
+
date: parseFintsDate(s.string('Date')) ?? fail('Extension balance without date'),
|
|
87
|
+
time: moment(s),
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
const bookTime = json.object('BookTime');
|
|
91
|
+
return {
|
|
92
|
+
booked: saldo('CurValBal') ?? fail('Extension balance without booked balance'),
|
|
93
|
+
pending: saldo('InclPendTransBal'),
|
|
94
|
+
creditLine: amount('OverdraftLim'),
|
|
95
|
+
available: amount('AvailFunds'),
|
|
96
|
+
used: amount('AlrdyDrwnOnBal'),
|
|
97
|
+
overdraft: amount('OverDraft'),
|
|
98
|
+
bookingDate: bookTime === undefined ? undefined : parseFintsDate(bookTime.string('Date')),
|
|
99
|
+
bookingTime: bookTime === undefined ? undefined : moment(bookTime),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The moment of `Date` and `Time` in `json`, which the extension states in UTC+01:00 all year round; `undefined`
|
|
104
|
+
* without a time, unless `defaultTime` stands in for it.
|
|
105
|
+
*/
|
|
106
|
+
function moment(json, defaultTime) {
|
|
107
|
+
const time = json.string('Time') ?? defaultTime;
|
|
108
|
+
if (time === undefined)
|
|
109
|
+
return undefined;
|
|
110
|
+
return parseUtcPlusOneDateTime(json.string('Date'), time) ?? fail('Extension date or time is malformed');
|
|
111
|
+
}
|
|
112
|
+
function fail(message) {
|
|
113
|
+
throw new FormatError(message);
|
|
114
|
+
}
|
|
115
|
+
function isObject(value) {
|
|
116
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* A JSON object of the extension, read by key without regard to case: the specification itself spells some keys
|
|
120
|
+
* differently (`OverDraftLim` and `OverdraftLim`). Values of the wrong type are a `FormatError`.
|
|
121
|
+
*/
|
|
122
|
+
class Json {
|
|
123
|
+
values = new Map();
|
|
124
|
+
constructor(values) {
|
|
125
|
+
for (const [key, value] of Object.entries(values))
|
|
126
|
+
this.values.set(key.toLowerCase(), value);
|
|
127
|
+
}
|
|
128
|
+
value(key) {
|
|
129
|
+
return this.values.get(key.toLowerCase());
|
|
130
|
+
}
|
|
131
|
+
/** A string, or a number written as string: dates and times come as either. */
|
|
132
|
+
string(key) {
|
|
133
|
+
const value = this.value(key);
|
|
134
|
+
if (value === undefined || value === null)
|
|
135
|
+
return undefined;
|
|
136
|
+
if (typeof value === 'string')
|
|
137
|
+
return value.trim() === '' ? undefined : value.trim();
|
|
138
|
+
if (typeof value === 'number')
|
|
139
|
+
return String(value);
|
|
140
|
+
throw new FormatError(`Extension element "${key}" is not text`);
|
|
141
|
+
}
|
|
142
|
+
flag(key) {
|
|
143
|
+
const value = this.value(key);
|
|
144
|
+
if (value === undefined || value === null)
|
|
145
|
+
return false;
|
|
146
|
+
if (typeof value === 'boolean')
|
|
147
|
+
return value;
|
|
148
|
+
if (typeof value === 'string')
|
|
149
|
+
return value === 'J' || value.toLowerCase() === 'true';
|
|
150
|
+
throw new FormatError(`Extension element "${key}" is not a flag`);
|
|
151
|
+
}
|
|
152
|
+
object(key) {
|
|
153
|
+
const value = this.value(key);
|
|
154
|
+
if (value === undefined || value === null)
|
|
155
|
+
return undefined;
|
|
156
|
+
if (isObject(value))
|
|
157
|
+
return new Json(value);
|
|
158
|
+
throw new FormatError(`Extension element "${key}" is not an object`);
|
|
159
|
+
}
|
|
160
|
+
/** The object's values as strings, keyed in capitals, as segment IDs are written. */
|
|
161
|
+
get strings() {
|
|
162
|
+
const result = new Map();
|
|
163
|
+
for (const [key, value] of this.values) {
|
|
164
|
+
if (value === null)
|
|
165
|
+
result.set(key.toUpperCase(), '');
|
|
166
|
+
else if (typeof value === 'string')
|
|
167
|
+
result.set(key.toUpperCase(), value);
|
|
168
|
+
else if (typeof value === 'number')
|
|
169
|
+
result.set(key.toUpperCase(), String(value));
|
|
170
|
+
else
|
|
171
|
+
throw new FormatError(`Extension element "${key}" is not text`);
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=account-extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-extension.js","sourceRoot":"","sources":["../../src/v3/account-extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { FinTsClientOptions } from '../core/client.js';
|
|
2
|
+
import { FinTsConfig, type FinTsConfigInit } from '../core/config.js';
|
|
3
|
+
import { PinTanClient } from '../session/pin-tan-client.js';
|
|
4
|
+
import type { IncomingMessage3 } from './message.js';
|
|
5
|
+
import type { SegmentSpec } from './syntax.js';
|
|
6
|
+
/** What `FinTs3Client` takes. */
|
|
7
|
+
export interface FinTs3ClientInit {
|
|
8
|
+
/** Where and as whom to log in: a `FinTsConfig`, or what its constructor takes. */
|
|
9
|
+
config: FinTsConfig | FinTsConfigInit;
|
|
10
|
+
/** The user's PIN; the client keeps it in memory only and never logs it. */
|
|
11
|
+
pin: string;
|
|
12
|
+
/** How the client reaches the user and the bank. */
|
|
13
|
+
options: FinTsClientOptions;
|
|
14
|
+
}
|
|
15
|
+
/** FinTS 3.0 PIN/TAN client, the version German banks use. */
|
|
16
|
+
export declare class FinTs3Client extends PinTanClient<IncomingMessage3, SegmentSpec> {
|
|
17
|
+
/**
|
|
18
|
+
* Throws `TypeError` if the configuration is invalid, if the PIN is empty, or if the PIN or login data contain
|
|
19
|
+
* characters FinTS 3.0 cannot send: it uses ISO 8859-1, so `€` and most non-Latin letters are not possible. Throws as
|
|
20
|
+
* well for a product ID longer than 25 or a product version longer than 5 characters.
|
|
21
|
+
*/
|
|
22
|
+
constructor(init: FinTs3ClientInit);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/v3/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,MAAM,EAAE,WAAW,GAAG,eAAe,CAAC;IACtC,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,OAAO,EAAE,kBAAkB,CAAC;CAC7B;AAED,8DAA8D;AAC9D,qBAAa,YAAa,SAAQ,YAAY,CAAC,gBAAgB,EAAE,WAAW,CAAC;IAC3E;;;;OAIG;gBACS,IAAI,EAAE,gBAAgB;CAInC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { FinTsConfig } from '../core/config.js';
|
|
2
|
+
import { PinTanClient } from '../session/pin-tan-client.js';
|
|
3
|
+
import { FinTs3Protocol } from './protocol.js';
|
|
4
|
+
/** FinTS 3.0 PIN/TAN client, the version German banks use. */
|
|
5
|
+
export class FinTs3Client extends PinTanClient {
|
|
6
|
+
/**
|
|
7
|
+
* Throws `TypeError` if the configuration is invalid, if the PIN is empty, or if the PIN or login data contain
|
|
8
|
+
* characters FinTS 3.0 cannot send: it uses ISO 8859-1, so `€` and most non-Latin letters are not possible. Throws as
|
|
9
|
+
* well for a product ID longer than 25 or a product version longer than 5 characters.
|
|
10
|
+
*/
|
|
11
|
+
constructor(init) {
|
|
12
|
+
const config = init.config instanceof FinTsConfig ? init.config : new FinTsConfig(init.config);
|
|
13
|
+
super(init.options, (logger) => new FinTs3Protocol(config, init.pin, init.options.transport, logger));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/v3/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAwB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAa/C,8DAA8D;AAC9D,MAAM,OAAO,YAAa,SAAQ,YAA2C;IAC3E;;;;OAIG;IACH,YAAY,IAAsB;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,YAAY,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/F,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACxG,CAAC;CACF"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { PinTanDialog } from '../session/pin-tan-dialog.js';
|
|
2
|
+
import type { Approval, StartWithOrder } from '../session/protocol.js';
|
|
3
|
+
import { TanMethod } from '../tan/tan-models.js';
|
|
4
|
+
import { IncomingMessage3 } from './message.js';
|
|
5
|
+
import type { Bpd3 } from './parameters.js';
|
|
6
|
+
import type { SegmentSpec } from './syntax.js';
|
|
7
|
+
/** How a message is signed: the security function of the TAN method and the customer system ID. */
|
|
8
|
+
export interface Signing3 {
|
|
9
|
+
readonly securityFunction: string;
|
|
10
|
+
readonly systemId: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* What a dialog needs from the session: the parameter data received so far, the segments that open a dialog, and the
|
|
14
|
+
* way to the bank. The `FinTs3Protocol` provides it, and keeps the login data and the PIN to itself.
|
|
15
|
+
*/
|
|
16
|
+
export interface FinTs3DialogHost {
|
|
17
|
+
/** The bank parameter data received so far, if any. */
|
|
18
|
+
readonly bankParameters: Bpd3 | undefined;
|
|
19
|
+
/** The customer system ID the bank assigned; `undefined` before the synchronization. */
|
|
20
|
+
readonly systemId: string | undefined;
|
|
21
|
+
/** Identification (HKIDN) and processing preparation (HKVVB), which open every dialog. */
|
|
22
|
+
initSegments(systemId: string, anonymous?: boolean): SegmentSpec[];
|
|
23
|
+
/**
|
|
24
|
+
* Sends `segments` as message `number` of the dialog `dialogId` and returns the bank's answer, not yet parsed.
|
|
25
|
+
*
|
|
26
|
+
* With `signing` the message is signed with the PIN and the `tan`, after `LoginGuard.check`; without, it goes out
|
|
27
|
+
* unsigned, as in an anonymous dialog.
|
|
28
|
+
*/
|
|
29
|
+
post(message: {
|
|
30
|
+
dialogId: string;
|
|
31
|
+
number: number;
|
|
32
|
+
segments: readonly SegmentSpec[];
|
|
33
|
+
signing: Signing3 | undefined;
|
|
34
|
+
tan: string | undefined;
|
|
35
|
+
}): Promise<Uint8Array>;
|
|
36
|
+
}
|
|
37
|
+
/** One FinTS 3.0 dialog: numbered messages under the dialog ID the bank assigns in its first answer. */
|
|
38
|
+
export declare class FinTs3Dialog extends PinTanDialog<IncomingMessage3, SegmentSpec> {
|
|
39
|
+
private readonly host;
|
|
40
|
+
private readonly anonymous;
|
|
41
|
+
private systemId;
|
|
42
|
+
private id;
|
|
43
|
+
private constructor();
|
|
44
|
+
static signed(host: FinTs3DialogHost, method: TanMethod, tanMedium?: string): FinTs3Dialog;
|
|
45
|
+
/** A dialog without login, which only delivers the bank parameter data. */
|
|
46
|
+
static anonymous(host: FinTs3DialogHost): FinTs3Dialog;
|
|
47
|
+
protected get bankParameters(): Bpd3 | undefined;
|
|
48
|
+
get isActive(): boolean;
|
|
49
|
+
/** The version of the HKTAN segments: that of the HITANS segment the bank describes the method in. */
|
|
50
|
+
private get tanVersion();
|
|
51
|
+
start(synchronize?: boolean): Promise<IncomingMessage3>;
|
|
52
|
+
/**
|
|
53
|
+
* Opens the dialog, asking strong authentication for `order` with a two-step method, then sends `order` in the next
|
|
54
|
+
* message.
|
|
55
|
+
*/
|
|
56
|
+
startWith(order: SegmentSpec): StartWithOrder<IncomingMessage3>;
|
|
57
|
+
/**
|
|
58
|
+
* Opens the anonymous dialog; the answer carries the bank parameter data.
|
|
59
|
+
*
|
|
60
|
+
* With `announceSca` the message also carries HKTAN, the way a client that can do strong customer authentication
|
|
61
|
+
* tells the bank so, whereupon the bank may send parameter data suited to it (PIN/TAN, B.4.3.1).
|
|
62
|
+
*/
|
|
63
|
+
requestBankParameters(announceSca?: boolean): Promise<IncomingMessage3>;
|
|
64
|
+
send(order: SegmentSpec): Promise<IncomingMessage3>;
|
|
65
|
+
protected sendEnd(): Promise<void>;
|
|
66
|
+
private tanRequest;
|
|
67
|
+
/**
|
|
68
|
+
* The approval a HITAN segment of process 4 asks for, answered with HKTAN process 2 (TAN) or S (status).
|
|
69
|
+
*
|
|
70
|
+
* Throws `FinTsProtocolError` for an app approval with a method of HITANS #6: the status request (process S) came with
|
|
71
|
+
* version 7, along with app approvals (PIN/TAN B.5.2).
|
|
72
|
+
*/
|
|
73
|
+
protected approvalIn(response: IncomingMessage3): Approval<IncomingMessage3> | undefined;
|
|
74
|
+
private sendSegments;
|
|
75
|
+
/** The bank assigns the dialog ID in its answer to the first message. */
|
|
76
|
+
protected readDialogData(response: IncomingMessage3): void;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/v3/dialog.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAW/C,mGAAmG;AACnG,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,QAAQ,CAAC,cAAc,EAAE,IAAI,GAAG,SAAS,CAAC;IAE1C,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAEtC,0FAA0F;IAC1F,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,CAAC;IAEnE;;;;;OAKG;IACH,IAAI,CAAC,OAAO,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;QACjC,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;QAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;KACzB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACzB;AAED,wGAAwG;AACxG,qBAAa,YAAa,SAAQ,YAAY,CAAC,gBAAgB,EAAE,WAAW,CAAC;IAKzE,OAAO,CAAC,QAAQ,CAAC,IAAI;IAGrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,EAAE,CAAc;IAExB,OAAO;IAUP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY;IAI1F,2EAA2E;IAC3E,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY;IAItD,SAAS,KAAK,cAAc,IAAI,IAAI,GAAG,SAAS,CAE/C;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,sGAAsG;IACtG,OAAO,KAAK,UAAU,GAErB;IAED,KAAK,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IASrD;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,CAAC,gBAAgB,CAAC;IAW/D;;;;;OAKG;IACH,qBAAqB,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAOrE,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;cAKnC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC,OAAO,CAAC,UAAU;IAIlB;;;;;OAKG;IACH,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,CAAC,GAAG,SAAS;IAoBxF,OAAO,CAAC,YAAY;IAgBpB,yEAAyE;IACzE,SAAS,CAAC,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;CAG3D"}
|