@push.rocks/smartlinuxrepo 1.1.2 → 1.2.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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/alpine/apkindexreader.d.ts +87 -0
- package/dist_ts/alpine/apkindexreader.js +193 -0
- package/dist_ts/arch/indexreader.d.ts +35 -0
- package/dist_ts/arch/indexreader.js +45 -0
- package/dist_ts/arch/reader.js +1 -1
- package/dist_ts/debian/indexbuilder.js +8 -23
- package/dist_ts/debian/indexreader.d.ts +107 -0
- package/dist_ts/debian/indexreader.js +274 -0
- package/dist_ts/debian/reader.js +1 -1
- package/dist_ts/debian/rules.d.ts +18 -0
- package/dist_ts/debian/rules.js +81 -2
- package/dist_ts/index.d.ts +14 -4
- package/dist_ts/index.js +9 -3
- package/dist_ts/readers/decompress.d.ts +1 -2
- package/dist_ts/readers/decompress.js +1 -1
- package/dist_ts/readers/document.d.ts +36 -0
- package/dist_ts/readers/document.js +110 -0
- package/dist_ts/rpm/repodata.d.ts +3 -2
- package/dist_ts/rpm/repodata.js +5 -4
- package/dist_ts/rpm/repodatareader.d.ts +173 -0
- package/dist_ts/rpm/repodatareader.js +414 -0
- package/dist_ts/rpm/xmlreader.d.ts +70 -0
- package/dist_ts/rpm/xmlreader.js +576 -0
- package/dist_ts/shared/errors.d.ts +12 -4
- package/dist_ts/shared/errors.js +1 -1
- package/dist_ts/shared/limits.d.ts +8 -1
- package/dist_ts/shared/limits.js +5 -2
- package/dist_ts/shared/types.d.ts +2 -0
- package/dist_ts/signing/verifiers.d.ts +43 -0
- package/dist_ts/signing/verifiers.js +81 -2
- package/package.json +1 -1
- package/readme.md +53 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/alpine/apkindexreader.ts +265 -0
- package/ts/arch/indexreader.ts +66 -0
- package/ts/arch/reader.ts +2 -1
- package/ts/debian/indexbuilder.ts +13 -23
- package/ts/debian/indexreader.ts +372 -0
- package/ts/debian/reader.ts +2 -1
- package/ts/debian/rules.ts +83 -1
- package/ts/index.ts +40 -2
- package/ts/readers/decompress.ts +1 -3
- package/ts/readers/document.ts +136 -0
- package/ts/rpm/repodata.ts +4 -3
- package/ts/rpm/repodatareader.ts +582 -0
- package/ts/rpm/xmlreader.ts +680 -0
- package/ts/shared/errors.ts +13 -4
- package/ts/shared/limits.ts +9 -1
- package/ts/shared/types.ts +3 -0
- package/ts/signing/verifiers.ts +113 -1
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
import { LinuxRepoError, limitExceeded } from '../shared/errors.js';
|
|
2
|
+
const LT = 0x3c;
|
|
3
|
+
const GT = 0x3e;
|
|
4
|
+
const AMP = 0x26;
|
|
5
|
+
const SLASH = 0x2f;
|
|
6
|
+
const BANG = 0x21;
|
|
7
|
+
const QUESTION = 0x3f;
|
|
8
|
+
const EQUALS = 0x3d;
|
|
9
|
+
const QUOTE = 0x22;
|
|
10
|
+
const APOSTROPHE = 0x27;
|
|
11
|
+
const SEMICOLON = 0x3b;
|
|
12
|
+
const HASH = 0x23;
|
|
13
|
+
const CR = 0x0d;
|
|
14
|
+
const LF = 0x0a;
|
|
15
|
+
const TAB = 0x09;
|
|
16
|
+
const SPACE = 0x20;
|
|
17
|
+
const BRACKET_CLOSE = 0x5d;
|
|
18
|
+
const utf8 = new TextDecoder('utf-8');
|
|
19
|
+
const ascii = (textArg) => Uint8Array.from(textArg, (characterArg) => characterArg.charCodeAt(0));
|
|
20
|
+
const COMMENT_OPEN = ascii('<!--');
|
|
21
|
+
const CDATA_OPEN = ascii('<![CDATA[');
|
|
22
|
+
const XML_DECLARATION_OPEN = ascii('<?xml');
|
|
23
|
+
const PREDEFINED = new Map([
|
|
24
|
+
['lt', '<'],
|
|
25
|
+
['gt', '>'],
|
|
26
|
+
['amp', '&'],
|
|
27
|
+
['apos', "'"],
|
|
28
|
+
['quot', '"'],
|
|
29
|
+
]);
|
|
30
|
+
function isSpace(byteArg) {
|
|
31
|
+
return byteArg === SPACE || byteArg === TAB || byteArg === LF || byteArg === CR;
|
|
32
|
+
}
|
|
33
|
+
function isNameStart(byteArg) {
|
|
34
|
+
return ((byteArg >= 0x61 && byteArg <= 0x7a) ||
|
|
35
|
+
(byteArg >= 0x41 && byteArg <= 0x5a) ||
|
|
36
|
+
byteArg === 0x5f ||
|
|
37
|
+
byteArg === 0x3a ||
|
|
38
|
+
byteArg >= 0x80);
|
|
39
|
+
}
|
|
40
|
+
function isNameChar(byteArg) {
|
|
41
|
+
return isNameStart(byteArg) || (byteArg >= 0x30 && byteArg <= 0x39) || byteArg === 0x2e || byteArg === 0x2d;
|
|
42
|
+
}
|
|
43
|
+
function isXmlCharacter(codePointArg) {
|
|
44
|
+
return (codePointArg === 0x09 ||
|
|
45
|
+
codePointArg === 0x0a ||
|
|
46
|
+
codePointArg === 0x0d ||
|
|
47
|
+
(codePointArg >= 0x20 && codePointArg <= 0xd7ff) ||
|
|
48
|
+
(codePointArg >= 0xe000 && codePointArg <= 0xfffd) ||
|
|
49
|
+
(codePointArg >= 0x10000 && codePointArg <= 0x10ffff));
|
|
50
|
+
}
|
|
51
|
+
/** Scans one document; see the module comment. */
|
|
52
|
+
export function scanXmlDocument(documentArg, optionsArg) {
|
|
53
|
+
return new XmlScanner(documentArg, optionsArg).scan();
|
|
54
|
+
}
|
|
55
|
+
class XmlScanner {
|
|
56
|
+
options;
|
|
57
|
+
doc;
|
|
58
|
+
buffer;
|
|
59
|
+
limits;
|
|
60
|
+
constructor(documentArg, options) {
|
|
61
|
+
this.options = options;
|
|
62
|
+
this.doc = documentArg;
|
|
63
|
+
this.buffer = Buffer.from(documentArg.buffer, documentArg.byteOffset, documentArg.byteLength);
|
|
64
|
+
this.limits = options.limits;
|
|
65
|
+
}
|
|
66
|
+
scan() {
|
|
67
|
+
const doc = this.doc;
|
|
68
|
+
this.checkCharacters();
|
|
69
|
+
let pos = 0;
|
|
70
|
+
if (doc[0] === 0xef && doc[1] === 0xbb && doc[2] === 0xbf) {
|
|
71
|
+
pos = 3;
|
|
72
|
+
}
|
|
73
|
+
if (this.startsWith(pos, XML_DECLARATION_OPEN) && (isSpace(doc[pos + 5]) || doc[pos + 5] === QUESTION)) {
|
|
74
|
+
pos = this.xmlDeclaration(pos);
|
|
75
|
+
}
|
|
76
|
+
pos = this.misc(pos);
|
|
77
|
+
if (pos >= doc.length || doc[pos] !== LT || !isNameStart(doc[pos + 1])) {
|
|
78
|
+
throw this.malformed('the document has no root element', pos);
|
|
79
|
+
}
|
|
80
|
+
const rootStart = pos;
|
|
81
|
+
const root = this.startTag(pos);
|
|
82
|
+
if (root.name !== this.options.rootName) {
|
|
83
|
+
throw this.malformed(`the root element is <${root.name}>, expected <${this.options.rootName}>`, pos);
|
|
84
|
+
}
|
|
85
|
+
let rootEndStart = root.end;
|
|
86
|
+
let rootEnd = root.end;
|
|
87
|
+
if (!root.selfClosing) {
|
|
88
|
+
pos = root.end;
|
|
89
|
+
let units = 0;
|
|
90
|
+
for (;;) {
|
|
91
|
+
while (pos < doc.length && isSpace(doc[pos])) {
|
|
92
|
+
pos += 1;
|
|
93
|
+
}
|
|
94
|
+
if (pos >= doc.length) {
|
|
95
|
+
throw this.malformed(`the <${root.name}> element is not closed`, rootStart);
|
|
96
|
+
}
|
|
97
|
+
if (doc[pos] !== LT) {
|
|
98
|
+
throw this.malformed(`character data between the units of <${root.name}>`, pos);
|
|
99
|
+
}
|
|
100
|
+
if (doc[pos + 1] === SLASH) {
|
|
101
|
+
rootEndStart = pos;
|
|
102
|
+
rootEnd = this.endTag(pos, { name: root.name, nameStart: root.nameStart, nameEnd: root.nameEnd, text: null });
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
if (!isNameStart(doc[pos + 1])) {
|
|
106
|
+
throw this.malformed(`markup other than an element between the units of <${root.name}>`, pos);
|
|
107
|
+
}
|
|
108
|
+
const tag = this.startTag(pos);
|
|
109
|
+
units += 1;
|
|
110
|
+
if (units > this.limits.maxEntries) {
|
|
111
|
+
throw limitExceeded('maxEntries', this.limits.maxEntries, `<${root.name}> unit count`);
|
|
112
|
+
}
|
|
113
|
+
if (tag.name === this.options.unitName) {
|
|
114
|
+
const handler = this.options.createUnit(pos);
|
|
115
|
+
const end = this.element(pos, tag, handler);
|
|
116
|
+
this.options.unit(handler, pos, end);
|
|
117
|
+
pos = end;
|
|
118
|
+
}
|
|
119
|
+
else if (this.options.keepOtherChildren) {
|
|
120
|
+
const end = this.element(pos, tag, null);
|
|
121
|
+
this.options.other(tag.name, pos, end);
|
|
122
|
+
pos = end;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
throw this.malformed(`<${root.name}> holds a <${tag.name}> element, expected <${this.options.unitName}>`, pos);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
pos = this.misc(rootEnd);
|
|
130
|
+
if (pos < doc.length) {
|
|
131
|
+
throw this.malformed('content after the root element', pos);
|
|
132
|
+
}
|
|
133
|
+
return { rootStart, rootStartEnd: root.end, rootAttributes: root.attributes, rootEndStart, rootEnd };
|
|
134
|
+
}
|
|
135
|
+
/** Strict UTF-8 holding only XML characters (XML 1.0 `Char`). */
|
|
136
|
+
checkCharacters() {
|
|
137
|
+
const doc = this.doc;
|
|
138
|
+
const length = doc.length;
|
|
139
|
+
let i = 0;
|
|
140
|
+
while (i < length) {
|
|
141
|
+
const b0 = doc[i];
|
|
142
|
+
if (b0 < 0x80) {
|
|
143
|
+
if (b0 < 0x20 && b0 !== TAB && b0 !== LF && b0 !== CR) {
|
|
144
|
+
throw this.malformed('the document holds a control character that is not an XML character', i);
|
|
145
|
+
}
|
|
146
|
+
i += 1;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
let need;
|
|
150
|
+
let codePoint;
|
|
151
|
+
let low = 0x80;
|
|
152
|
+
let high = 0xbf;
|
|
153
|
+
if (b0 >= 0xc2 && b0 <= 0xdf) {
|
|
154
|
+
need = 1;
|
|
155
|
+
codePoint = b0 & 0x1f;
|
|
156
|
+
}
|
|
157
|
+
else if (b0 >= 0xe0 && b0 <= 0xef) {
|
|
158
|
+
need = 2;
|
|
159
|
+
codePoint = b0 & 0x0f;
|
|
160
|
+
if (b0 === 0xe0) {
|
|
161
|
+
low = 0xa0;
|
|
162
|
+
}
|
|
163
|
+
else if (b0 === 0xed) {
|
|
164
|
+
high = 0x9f;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else if (b0 >= 0xf0 && b0 <= 0xf4) {
|
|
168
|
+
need = 3;
|
|
169
|
+
codePoint = b0 & 0x07;
|
|
170
|
+
if (b0 === 0xf0) {
|
|
171
|
+
low = 0x90;
|
|
172
|
+
}
|
|
173
|
+
else if (b0 === 0xf4) {
|
|
174
|
+
high = 0x8f;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
throw this.malformed('the document is not valid UTF-8', i);
|
|
179
|
+
}
|
|
180
|
+
if (i + need >= length) {
|
|
181
|
+
throw this.malformed('the document is not valid UTF-8', i);
|
|
182
|
+
}
|
|
183
|
+
for (let k = 1; k <= need; k++) {
|
|
184
|
+
const b = doc[i + k];
|
|
185
|
+
if (b < (k === 1 ? low : 0x80) || b > (k === 1 ? high : 0xbf)) {
|
|
186
|
+
throw this.malformed('the document is not valid UTF-8', i);
|
|
187
|
+
}
|
|
188
|
+
codePoint = (codePoint << 6) | (b & 0x3f);
|
|
189
|
+
}
|
|
190
|
+
if (!isXmlCharacter(codePoint)) {
|
|
191
|
+
throw this.malformed('the document holds a code point that is not an XML character', i);
|
|
192
|
+
}
|
|
193
|
+
i += need + 1;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/** `<?xml version="1.x" [encoding="UTF-8"] [standalone="yes|no"] ?>`; returns the offset after it. */
|
|
197
|
+
xmlDeclaration(startArg) {
|
|
198
|
+
const doc = this.doc;
|
|
199
|
+
let pos = startArg + XML_DECLARATION_OPEN.length;
|
|
200
|
+
const pseudo = [];
|
|
201
|
+
for (;;) {
|
|
202
|
+
const before = pos;
|
|
203
|
+
while (pos < doc.length && isSpace(doc[pos])) {
|
|
204
|
+
pos += 1;
|
|
205
|
+
}
|
|
206
|
+
if (doc[pos] === QUESTION && doc[pos + 1] === GT) {
|
|
207
|
+
pos += 2;
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
if (pos === before || !isNameStart(doc[pos])) {
|
|
211
|
+
throw this.malformed('a malformed XML declaration', startArg);
|
|
212
|
+
}
|
|
213
|
+
const nameStart = pos;
|
|
214
|
+
while (pos < doc.length && isNameChar(doc[pos])) {
|
|
215
|
+
pos += 1;
|
|
216
|
+
}
|
|
217
|
+
const name = this.decode(nameStart, pos);
|
|
218
|
+
pos = this.skipSpace(pos);
|
|
219
|
+
if (doc[pos] !== EQUALS) {
|
|
220
|
+
throw this.malformed('a malformed XML declaration', startArg);
|
|
221
|
+
}
|
|
222
|
+
pos = this.skipSpace(pos + 1);
|
|
223
|
+
const quote = doc[pos];
|
|
224
|
+
if (quote !== QUOTE && quote !== APOSTROPHE) {
|
|
225
|
+
throw this.malformed('a malformed XML declaration', startArg);
|
|
226
|
+
}
|
|
227
|
+
const valueEnd = doc.indexOf(quote, pos + 1);
|
|
228
|
+
if (valueEnd < 0) {
|
|
229
|
+
throw this.malformed('a malformed XML declaration', startArg);
|
|
230
|
+
}
|
|
231
|
+
pseudo.push([name, this.decode(pos + 1, valueEnd)]);
|
|
232
|
+
pos = valueEnd + 1;
|
|
233
|
+
if (pos - startArg > this.limits.maxHeaderBytes) {
|
|
234
|
+
throw limitExceeded('maxHeaderBytes', this.limits.maxHeaderBytes, 'XML declaration');
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const names = pseudo.map(([name]) => name);
|
|
238
|
+
const expected = ['version', 'encoding', 'standalone'].filter((name) => names.includes(name));
|
|
239
|
+
if (names.length === 0 || names[0] !== 'version' || names.join() !== expected.join()) {
|
|
240
|
+
throw this.malformed('a malformed XML declaration', startArg);
|
|
241
|
+
}
|
|
242
|
+
for (const [name, value] of pseudo) {
|
|
243
|
+
if (name === 'version' && !/^1\.[0-9]+$/.test(value)) {
|
|
244
|
+
throw this.malformed('a malformed XML declaration version', startArg);
|
|
245
|
+
}
|
|
246
|
+
if (name === 'encoding' && value.toLowerCase() !== 'utf-8') {
|
|
247
|
+
throw this.malformed(`the document declares the encoding ${JSON.stringify(value)}, not UTF-8`, startArg);
|
|
248
|
+
}
|
|
249
|
+
if (name === 'standalone' && value !== 'yes' && value !== 'no') {
|
|
250
|
+
throw this.malformed('a malformed XML declaration standalone value', startArg);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return pos;
|
|
254
|
+
}
|
|
255
|
+
/** Whitespace, comments and processing instructions (prolog and trailer); returns the first other offset. */
|
|
256
|
+
misc(startArg) {
|
|
257
|
+
const doc = this.doc;
|
|
258
|
+
let pos = startArg;
|
|
259
|
+
for (;;) {
|
|
260
|
+
while (pos < doc.length && isSpace(doc[pos])) {
|
|
261
|
+
pos += 1;
|
|
262
|
+
}
|
|
263
|
+
if (pos >= doc.length || doc[pos] !== LT) {
|
|
264
|
+
return pos;
|
|
265
|
+
}
|
|
266
|
+
if (doc[pos + 1] === BANG) {
|
|
267
|
+
if (!this.startsWith(pos, COMMENT_OPEN)) {
|
|
268
|
+
throw this.malformed('a declaration (<!DOCTYPE or another <!) outside the root element', pos);
|
|
269
|
+
}
|
|
270
|
+
pos = this.comment(pos);
|
|
271
|
+
}
|
|
272
|
+
else if (doc[pos + 1] === QUESTION) {
|
|
273
|
+
pos = this.processingInstruction(pos);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
return pos;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/** `<!-- ... -->` without `--` inside; returns the offset after it. */
|
|
281
|
+
comment(startArg) {
|
|
282
|
+
const close = this.buffer.indexOf('--', startArg + COMMENT_OPEN.length, 'latin1');
|
|
283
|
+
if (close < 0) {
|
|
284
|
+
throw this.malformed('a comment is not closed', startArg);
|
|
285
|
+
}
|
|
286
|
+
if (this.doc[close + 2] !== GT) {
|
|
287
|
+
throw this.malformed('a comment holds "--"', close);
|
|
288
|
+
}
|
|
289
|
+
return close + 3;
|
|
290
|
+
}
|
|
291
|
+
/** `<?target ...?>` with a target other than `xml`; returns the offset after it. */
|
|
292
|
+
processingInstruction(startArg) {
|
|
293
|
+
const doc = this.doc;
|
|
294
|
+
let pos = startArg + 2;
|
|
295
|
+
if (!isNameStart(doc[pos])) {
|
|
296
|
+
throw this.malformed('a processing instruction without a target', startArg);
|
|
297
|
+
}
|
|
298
|
+
while (pos < doc.length && isNameChar(doc[pos])) {
|
|
299
|
+
pos += 1;
|
|
300
|
+
}
|
|
301
|
+
if (this.decode(startArg + 2, pos).toLowerCase() === 'xml') {
|
|
302
|
+
throw this.malformed('an XML declaration that is not at the start of the document', startArg);
|
|
303
|
+
}
|
|
304
|
+
if (!(doc[pos] === QUESTION && doc[pos + 1] === GT) && !isSpace(doc[pos])) {
|
|
305
|
+
throw this.malformed('a malformed processing instruction target', startArg);
|
|
306
|
+
}
|
|
307
|
+
const close = this.buffer.indexOf('?>', pos, 'latin1');
|
|
308
|
+
if (close < 0) {
|
|
309
|
+
throw this.malformed('a processing instruction is not closed', startArg);
|
|
310
|
+
}
|
|
311
|
+
return close + 2;
|
|
312
|
+
}
|
|
313
|
+
/** `<name attr="value" ...>` or `<name .../>`. */
|
|
314
|
+
startTag(startArg) {
|
|
315
|
+
const doc = this.doc;
|
|
316
|
+
const limit = startArg + this.limits.maxHeaderBytes;
|
|
317
|
+
let pos = startArg + 1;
|
|
318
|
+
const nameStart = pos;
|
|
319
|
+
while (pos < doc.length && isNameChar(doc[pos])) {
|
|
320
|
+
pos += 1;
|
|
321
|
+
}
|
|
322
|
+
const nameEnd = pos;
|
|
323
|
+
if (pos > limit) {
|
|
324
|
+
throw limitExceeded('maxHeaderBytes', this.limits.maxHeaderBytes, 'start tag');
|
|
325
|
+
}
|
|
326
|
+
const name = this.decode(nameStart, nameEnd);
|
|
327
|
+
const attributes = [];
|
|
328
|
+
const seen = new Set();
|
|
329
|
+
for (;;) {
|
|
330
|
+
if (pos > limit) {
|
|
331
|
+
throw limitExceeded('maxHeaderBytes', this.limits.maxHeaderBytes, `<${name}> start tag`);
|
|
332
|
+
}
|
|
333
|
+
const afterName = pos;
|
|
334
|
+
pos = this.skipSpace(pos);
|
|
335
|
+
if (pos >= doc.length) {
|
|
336
|
+
throw this.malformed(`the <${name}> start tag is not closed`, startArg);
|
|
337
|
+
}
|
|
338
|
+
if (doc[pos] === GT) {
|
|
339
|
+
return { name, nameStart, nameEnd, attributes, end: pos + 1, selfClosing: false };
|
|
340
|
+
}
|
|
341
|
+
if (doc[pos] === SLASH && doc[pos + 1] === GT) {
|
|
342
|
+
return { name, nameStart, nameEnd, attributes, end: pos + 2, selfClosing: true };
|
|
343
|
+
}
|
|
344
|
+
if (pos === afterName || !isNameStart(doc[pos])) {
|
|
345
|
+
throw this.malformed(`a malformed <${name}> start tag`, pos);
|
|
346
|
+
}
|
|
347
|
+
const attributeStart = pos;
|
|
348
|
+
while (pos < doc.length && isNameChar(doc[pos])) {
|
|
349
|
+
pos += 1;
|
|
350
|
+
}
|
|
351
|
+
if (pos > limit) {
|
|
352
|
+
throw limitExceeded('maxHeaderBytes', this.limits.maxHeaderBytes, `<${name}> start tag`);
|
|
353
|
+
}
|
|
354
|
+
const attributeName = this.decode(attributeStart, pos);
|
|
355
|
+
if (seen.has(attributeName)) {
|
|
356
|
+
throw this.malformed(`the <${name}> start tag repeats the attribute ${attributeName}`, attributeStart);
|
|
357
|
+
}
|
|
358
|
+
seen.add(attributeName);
|
|
359
|
+
pos = this.skipSpace(pos);
|
|
360
|
+
if (doc[pos] !== EQUALS) {
|
|
361
|
+
throw this.malformed(`the attribute ${attributeName} has no value`, attributeStart);
|
|
362
|
+
}
|
|
363
|
+
pos = this.skipSpace(pos + 1);
|
|
364
|
+
const quote = doc[pos];
|
|
365
|
+
if (quote !== QUOTE && quote !== APOSTROPHE) {
|
|
366
|
+
throw this.malformed(`the attribute ${attributeName} value is not quoted`, pos);
|
|
367
|
+
}
|
|
368
|
+
const valueEnd = doc.indexOf(quote, pos + 1);
|
|
369
|
+
if (valueEnd < 0 || valueEnd > limit) {
|
|
370
|
+
if (valueEnd > limit) {
|
|
371
|
+
throw limitExceeded('maxHeaderBytes', this.limits.maxHeaderBytes, `<${name}> start tag`);
|
|
372
|
+
}
|
|
373
|
+
throw this.malformed(`the attribute ${attributeName} value is not closed`, pos);
|
|
374
|
+
}
|
|
375
|
+
attributes.push({ name: attributeName, value: this.characterData(pos + 1, valueEnd, true, true) });
|
|
376
|
+
pos = valueEnd + 1;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/** `</name S?>` matching `openArg`; returns the offset after it. */
|
|
380
|
+
endTag(startArg, openArg) {
|
|
381
|
+
const doc = this.doc;
|
|
382
|
+
let pos = startArg + 2;
|
|
383
|
+
const nameStart = pos;
|
|
384
|
+
while (pos < doc.length && isNameChar(doc[pos])) {
|
|
385
|
+
pos += 1;
|
|
386
|
+
}
|
|
387
|
+
const length = openArg.nameEnd - openArg.nameStart;
|
|
388
|
+
if (pos - nameStart !== length || this.buffer.compare(this.buffer, openArg.nameStart, openArg.nameEnd, nameStart, pos) !== 0) {
|
|
389
|
+
throw this.malformed(`an end tag does not match <${openArg.name}>`, startArg);
|
|
390
|
+
}
|
|
391
|
+
pos = this.skipSpace(pos);
|
|
392
|
+
if (doc[pos] !== GT) {
|
|
393
|
+
throw this.malformed(`a malformed </${openArg.name}> end tag`, startArg);
|
|
394
|
+
}
|
|
395
|
+
return pos + 1;
|
|
396
|
+
}
|
|
397
|
+
/** The content of an element through its end tag; returns the offset after the end tag. */
|
|
398
|
+
element(startArg, tagArg, handlerArg) {
|
|
399
|
+
const doc = this.doc;
|
|
400
|
+
const maxEnd = startArg + this.limits.maxMetadataBytes;
|
|
401
|
+
const capture = handlerArg !== null && handlerArg.start(0, tagArg.name, tagArg.attributes);
|
|
402
|
+
if (tagArg.selfClosing) {
|
|
403
|
+
handlerArg?.end(0, tagArg.name, capture ? '' : null);
|
|
404
|
+
return tagArg.end;
|
|
405
|
+
}
|
|
406
|
+
const stack = [{ name: tagArg.name, nameStart: tagArg.nameStart, nameEnd: tagArg.nameEnd, text: capture ? [] : null }];
|
|
407
|
+
let pos = tagArg.end;
|
|
408
|
+
while (stack.length > 0) {
|
|
409
|
+
if (pos > maxEnd) {
|
|
410
|
+
throw limitExceeded('maxMetadataBytes', this.limits.maxMetadataBytes, `<${tagArg.name}> element`);
|
|
411
|
+
}
|
|
412
|
+
if (pos >= doc.length) {
|
|
413
|
+
throw this.malformed(`the <${stack[stack.length - 1].name}> element is not closed`, startArg);
|
|
414
|
+
}
|
|
415
|
+
const top = stack[stack.length - 1];
|
|
416
|
+
if (doc[pos] !== LT) {
|
|
417
|
+
let textEnd = doc.indexOf(LT, pos);
|
|
418
|
+
if (textEnd < 0) {
|
|
419
|
+
textEnd = doc.length;
|
|
420
|
+
}
|
|
421
|
+
const text = this.characterData(pos, textEnd, top.text !== null, false);
|
|
422
|
+
if (text !== null) {
|
|
423
|
+
top.text.push(text);
|
|
424
|
+
}
|
|
425
|
+
pos = textEnd;
|
|
426
|
+
continue;
|
|
427
|
+
}
|
|
428
|
+
const next = doc[pos + 1];
|
|
429
|
+
if (next === SLASH) {
|
|
430
|
+
const end = this.endTag(pos, top);
|
|
431
|
+
stack.pop();
|
|
432
|
+
handlerArg?.end(stack.length, top.name, top.text === null ? null : top.text.join(''));
|
|
433
|
+
pos = end;
|
|
434
|
+
}
|
|
435
|
+
else if (next === BANG) {
|
|
436
|
+
if (this.startsWith(pos, COMMENT_OPEN)) {
|
|
437
|
+
pos = this.comment(pos);
|
|
438
|
+
}
|
|
439
|
+
else if (this.startsWith(pos, CDATA_OPEN)) {
|
|
440
|
+
const close = this.buffer.indexOf(']]>', pos + CDATA_OPEN.length, 'latin1');
|
|
441
|
+
if (close < 0) {
|
|
442
|
+
throw this.malformed('a CDATA section is not closed', pos);
|
|
443
|
+
}
|
|
444
|
+
if (top.text !== null) {
|
|
445
|
+
top.text.push(normalizeLineEnds(this.decode(pos + CDATA_OPEN.length, close)));
|
|
446
|
+
}
|
|
447
|
+
pos = close + 3;
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
throw this.malformed('a declaration inside an element', pos);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
else if (next === QUESTION) {
|
|
454
|
+
pos = this.processingInstruction(pos);
|
|
455
|
+
}
|
|
456
|
+
else if (isNameStart(next)) {
|
|
457
|
+
// the root, the unit's open elements and the new one
|
|
458
|
+
if (stack.length + 2 > this.limits.maxEntries) {
|
|
459
|
+
throw limitExceeded('maxEntries', this.limits.maxEntries, 'open XML elements');
|
|
460
|
+
}
|
|
461
|
+
const tag = this.startTag(pos);
|
|
462
|
+
const depth = stack.length;
|
|
463
|
+
const captureChild = handlerArg !== null && handlerArg.start(depth, tag.name, tag.attributes);
|
|
464
|
+
if (tag.selfClosing) {
|
|
465
|
+
handlerArg?.end(depth, tag.name, captureChild ? '' : null);
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
stack.push({ name: tag.name, nameStart: tag.nameStart, nameEnd: tag.nameEnd, text: captureChild ? [] : null });
|
|
469
|
+
}
|
|
470
|
+
pos = tag.end;
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
throw this.malformed('a "<" that starts no markup', pos);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
if (pos > maxEnd) {
|
|
477
|
+
throw limitExceeded('maxMetadataBytes', this.limits.maxMetadataBytes, `<${tagArg.name}> element`);
|
|
478
|
+
}
|
|
479
|
+
return pos;
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Checks character data or an attribute value in `[startArg, endArg)` (no
|
|
483
|
+
* `]]>` in text, no `<` in values, only the accepted references) and, when
|
|
484
|
+
* `decodeArg`, returns its decoded value; otherwise null.
|
|
485
|
+
*/
|
|
486
|
+
characterData(startArg, endArg, decodeArg, attributeArg) {
|
|
487
|
+
const doc = this.doc;
|
|
488
|
+
const parts = [];
|
|
489
|
+
let runStart = startArg;
|
|
490
|
+
for (let i = startArg; i < endArg; i++) {
|
|
491
|
+
const b = doc[i];
|
|
492
|
+
if (b === LT) {
|
|
493
|
+
throw this.malformed('an attribute value holds "<"', i);
|
|
494
|
+
}
|
|
495
|
+
if (b === GT && !attributeArg && i - 2 >= startArg && doc[i - 1] === BRACKET_CLOSE && doc[i - 2] === BRACKET_CLOSE) {
|
|
496
|
+
throw this.malformed('character data holds "]]>"', i - 2);
|
|
497
|
+
}
|
|
498
|
+
if (b !== AMP) {
|
|
499
|
+
continue;
|
|
500
|
+
}
|
|
501
|
+
const semicolon = doc.indexOf(SEMICOLON, i + 1);
|
|
502
|
+
if (semicolon < 0 || semicolon >= endArg || semicolon - i > 12) {
|
|
503
|
+
throw this.malformed('a reference is not terminated', i);
|
|
504
|
+
}
|
|
505
|
+
const replacement = this.reference(i, semicolon);
|
|
506
|
+
if (decodeArg) {
|
|
507
|
+
parts.push(this.literal(runStart, i, attributeArg), replacement);
|
|
508
|
+
}
|
|
509
|
+
i = semicolon;
|
|
510
|
+
runStart = semicolon + 1;
|
|
511
|
+
}
|
|
512
|
+
if (!decodeArg) {
|
|
513
|
+
return null;
|
|
514
|
+
}
|
|
515
|
+
parts.push(this.literal(runStart, endArg, attributeArg));
|
|
516
|
+
return parts.join('');
|
|
517
|
+
}
|
|
518
|
+
/** The literal run `[startArg, endArg)`: line ends normalized, and in attribute values whitespace to spaces. */
|
|
519
|
+
literal(startArg, endArg, attributeArg) {
|
|
520
|
+
if (startArg === endArg) {
|
|
521
|
+
return '';
|
|
522
|
+
}
|
|
523
|
+
const text = normalizeLineEnds(this.decode(startArg, endArg));
|
|
524
|
+
return attributeArg ? text.replace(/[\t\n]/g, ' ') : text;
|
|
525
|
+
}
|
|
526
|
+
/** The character a reference `&...;` stands for. */
|
|
527
|
+
reference(startArg, semicolonArg) {
|
|
528
|
+
const doc = this.doc;
|
|
529
|
+
if (doc[startArg + 1] === HASH) {
|
|
530
|
+
const hex = doc[startArg + 2] === 0x78;
|
|
531
|
+
const digits = this.decode(startArg + (hex ? 3 : 2), semicolonArg);
|
|
532
|
+
if (!(hex ? /^[0-9a-fA-F]+$/ : /^[0-9]+$/).test(digits)) {
|
|
533
|
+
throw this.malformed('a malformed character reference', startArg);
|
|
534
|
+
}
|
|
535
|
+
const codePoint = Number.parseInt(digits, hex ? 16 : 10);
|
|
536
|
+
if (!isXmlCharacter(codePoint)) {
|
|
537
|
+
throw this.malformed('a character reference to a character XML does not allow', startArg);
|
|
538
|
+
}
|
|
539
|
+
return String.fromCodePoint(codePoint);
|
|
540
|
+
}
|
|
541
|
+
const replacement = PREDEFINED.get(this.decode(startArg + 1, semicolonArg));
|
|
542
|
+
if (replacement === undefined) {
|
|
543
|
+
throw this.malformed('a reference to an undeclared entity', startArg);
|
|
544
|
+
}
|
|
545
|
+
return replacement;
|
|
546
|
+
}
|
|
547
|
+
skipSpace(posArg) {
|
|
548
|
+
let pos = posArg;
|
|
549
|
+
while (pos < this.doc.length && isSpace(this.doc[pos])) {
|
|
550
|
+
pos += 1;
|
|
551
|
+
}
|
|
552
|
+
return pos;
|
|
553
|
+
}
|
|
554
|
+
startsWith(posArg, bytesArg) {
|
|
555
|
+
if (posArg + bytesArg.length > this.doc.length) {
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
for (let i = 0; i < bytesArg.length; i++) {
|
|
559
|
+
if (this.doc[posArg + i] !== bytesArg[i]) {
|
|
560
|
+
return false;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
return true;
|
|
564
|
+
}
|
|
565
|
+
decode(startArg, endArg) {
|
|
566
|
+
return utf8.decode(this.doc.subarray(startArg, endArg));
|
|
567
|
+
}
|
|
568
|
+
malformed(messageArg, offsetArg) {
|
|
569
|
+
return new LinuxRepoError('malformed-index', messageArg, { field: `<${this.options.rootName}> document`, value: offsetArg });
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
/** XML 1.0 section 2.11: CRLF and lone CR become LF. */
|
|
573
|
+
function normalizeLineEnds(textArg) {
|
|
574
|
+
return textArg.includes('\r') ? textArg.replace(/\r\n?/g, '\n') : textArg;
|
|
575
|
+
}
|
|
576
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1scmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvcnBtL3htbHJlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBMkVwRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQztBQUNqQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQztBQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ25CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQztBQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2xCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQztBQUNuQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFFM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUcsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25DLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN0QyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1QyxNQUFNLFVBQVUsR0FBZ0MsSUFBSSxHQUFHLENBQUM7SUFDdEQsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO0lBQ1gsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO0lBQ1gsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO0lBQ1osQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO0lBQ2IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO0NBQ2QsQ0FBQyxDQUFDO0FBRUgsU0FBUyxPQUFPLENBQUMsT0FBZTtJQUM5QixPQUFPLE9BQU8sS0FBSyxLQUFLLElBQUksT0FBTyxLQUFLLEdBQUcsSUFBSSxPQUFPLEtBQUssRUFBRSxJQUFJLE9BQU8sS0FBSyxFQUFFLENBQUM7QUFDbEYsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE9BQWU7SUFDbEMsT0FBTyxDQUNMLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDO1FBQ3BDLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDO1FBQ3BDLE9BQU8sS0FBSyxJQUFJO1FBQ2hCLE9BQU8sS0FBSyxJQUFJO1FBQ2hCLE9BQU8sSUFBSSxJQUFJLENBQ2hCLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsT0FBZTtJQUNqQyxPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQztBQUM5RyxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsWUFBb0I7SUFDMUMsT0FBTyxDQUNMLFlBQVksS0FBSyxJQUFJO1FBQ3JCLFlBQVksS0FBSyxJQUFJO1FBQ3JCLFlBQVksS0FBSyxJQUFJO1FBQ3JCLENBQUMsWUFBWSxJQUFJLElBQUksSUFBSSxZQUFZLElBQUksTUFBTSxDQUFDO1FBQ2hELENBQUMsWUFBWSxJQUFJLE1BQU0sSUFBSSxZQUFZLElBQUksTUFBTSxDQUFDO1FBQ2xELENBQUMsWUFBWSxJQUFJLE9BQU8sSUFBSSxZQUFZLElBQUksUUFBUSxDQUFDLENBQ3RELENBQUM7QUFDSixDQUFDO0FBbUJELGtEQUFrRDtBQUNsRCxNQUFNLFVBQVUsZUFBZSxDQUFDLFdBQXVCLEVBQUUsVUFBMkI7SUFDbEYsT0FBTyxJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDeEQsQ0FBQztBQUVELE1BQU0sVUFBVTtJQU9LLE9BQU87SUFOVCxHQUFHLENBQWE7SUFDaEIsTUFBTSxDQUFTO0lBQ2YsTUFBTSxDQUFnQztJQUV2RCxZQUNFLFdBQXVCLEVBQ04sT0FBd0I7dUJBQXhCLE9BQU87UUFFeEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUYsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQy9CLENBQUM7SUFFTSxJQUFJO1FBQ1QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNyQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzFELEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdkcsR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2RSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUN0QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLElBQUksZ0JBQWdCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdkcsQ0FBQztRQUNELElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDNUIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ2YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsU0FBUyxDQUFDO2dCQUNSLE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzdDLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ1gsQ0FBQztnQkFDRCxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3RCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLHlCQUF5QixFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUM5RSxDQUFDO2dCQUNELElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO29CQUNwQixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsd0NBQXdDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDbEYsQ0FBQztnQkFDRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQzNCLFlBQVksR0FBRyxHQUFHLENBQUM7b0JBQ25CLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUM5RyxNQUFNO2dCQUNSLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDL0IsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLHNEQUFzRCxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ2hHLENBQUM7Z0JBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDL0IsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDWCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNuQyxNQUFNLGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQztnQkFDekYsQ0FBQztnQkFDRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDckMsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFDWixDQUFDO3FCQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUMxQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUN2QyxHQUFHLEdBQUcsR0FBRyxDQUFDO2dCQUNaLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxjQUFjLEdBQUcsQ0FBQyxJQUFJLHdCQUF3QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNqSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QixJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN2RyxDQUFDO0lBRUQsaUVBQWlFO0lBQ3pELGVBQWU7UUFDckIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNyQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLE9BQU8sQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxJQUFJLEVBQUUsR0FBRyxJQUFJLElBQUksRUFBRSxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztvQkFDdEQsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLHFFQUFxRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNqRyxDQUFDO2dCQUNELENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ1AsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLElBQVksQ0FBQztZQUNqQixJQUFJLFNBQWlCLENBQUM7WUFDdEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQ2YsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLElBQUksRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQzdCLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ1QsU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDeEIsQ0FBQztpQkFBTSxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNwQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUNULFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDaEIsR0FBRyxHQUFHLElBQUksQ0FBQztnQkFDYixDQUFDO3FCQUFNLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUN2QixJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQUksRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ1QsU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUNoQixHQUFHLEdBQUcsSUFBSSxDQUFDO2dCQUNiLENBQUM7cUJBQU0sSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ3ZCLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsaUNBQWlDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGlDQUFpQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdELENBQUM7WUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQzlELE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0QsQ0FBQztnQkFDRCxTQUFTLEdBQUcsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLDhEQUE4RCxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFGLENBQUM7WUFDRCxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVELHNHQUFzRztJQUM5RixjQUFjLENBQUMsUUFBZ0I7UUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNyQixJQUFJLEdBQUcsR0FBRyxRQUFRLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDO1FBQ2pELE1BQU0sTUFBTSxHQUE0QixFQUFFLENBQUM7UUFDM0MsU0FBUyxDQUFDO1lBQ1IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ25CLE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ2pELEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ1QsTUFBTTtZQUNSLENBQUM7WUFDRCxJQUFJLEdBQUcsS0FBSyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLDZCQUE2QixFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7WUFDRCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUM7WUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEQsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUNYLENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6QyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLDZCQUE2QixFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7WUFDRCxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksS0FBSyxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzVDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzdDLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsNkJBQTZCLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDaEUsQ0FBQztZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxHQUFHLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNuQixJQUFJLEdBQUcsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUN2RixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxNQUFNLFFBQVEsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUYsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNyRixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsNkJBQTZCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNuQyxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQ0FBcUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN4RSxDQUFDO1lBQ0QsSUFBSSxJQUFJLEtBQUssVUFBVSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDM0QsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLHNDQUFzQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDM0csQ0FBQztZQUNELElBQUksSUFBSSxLQUFLLFlBQVksSUFBSSxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDL0QsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLDhDQUE4QyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsNkdBQTZHO0lBQ3JHLElBQUksQ0FBQyxRQUFnQjtRQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3JCLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQztRQUNuQixTQUFTLENBQUM7WUFDUixPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ1gsQ0FBQztZQUNELElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUN6QyxPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUN4QyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsa0VBQWtFLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ2hHLENBQUM7Z0JBQ0QsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUIsQ0FBQztpQkFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3JDLEdBQUcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsdUVBQXVFO0lBQy9ELE9BQU8sQ0FBQyxRQUFnQjtRQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbEYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMseUJBQXlCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxPQUFPLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVELG9GQUFvRjtJQUM1RSxxQkFBcUIsQ0FBQyxRQUFnQjtRQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3JCLElBQUksR0FBRyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQywyQ0FBMkMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBQ0QsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoRCxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNELE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyw2REFBNkQsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUUsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLDJDQUEyQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLHdDQUF3QyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxPQUFPLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVELGtEQUFrRDtJQUMxQyxRQUFRLENBQUMsUUFBZ0I7UUFDL0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNyQixNQUFNLEtBQUssR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDcEQsSUFBSSxHQUFHLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUN2QixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUM7UUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoRCxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNwQixJQUFJLEdBQUcsR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNoQixNQUFNLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsTUFBTSxVQUFVLEdBQW9CLEVBQUUsQ0FBQztRQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQy9CLFNBQVMsQ0FBQztZQUNSLElBQUksR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDO2dCQUNoQixNQUFNLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksYUFBYSxDQUFDLENBQUM7WUFDM0YsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztZQUN0QixHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksMkJBQTJCLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDMUUsQ0FBQztZQUNELElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUNwQixPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUNwRixDQUFDO1lBQ0QsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ25GLENBQUM7WUFDRCxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixJQUFJLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvRCxDQUFDO1lBQ0QsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDO1lBQzNCLE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hELEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxHQUFHLEdBQUcsS0FBSyxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sYUFBYSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLElBQUksSUFBSSxhQUFhLENBQUMsQ0FBQztZQUMzRixDQUFDO1lBQ0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdkQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUkscUNBQXFDLGFBQWEsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ3pHLENBQUM7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3hCLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUN4QixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLGFBQWEsZUFBZSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7WUFDRCxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksS0FBSyxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzVDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsYUFBYSxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsRixDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzdDLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxRQUFRLEdBQUcsS0FBSyxFQUFFLENBQUM7Z0JBQ3JDLElBQUksUUFBUSxHQUFHLEtBQUssRUFBRSxDQUFDO29CQUNyQixNQUFNLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksYUFBYSxDQUFDLENBQUM7Z0JBQzNGLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixhQUFhLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7WUFDRCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzdHLEdBQUcsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQsb0VBQW9FO0lBQzVELE1BQU0sQ0FBQyxRQUFnQixFQUFFLE9BQXFCO1FBQ3BELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDckIsSUFBSSxHQUFHLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUN2QixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUM7UUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoRCxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNuRCxJQUFJLEdBQUcsR0FBRyxTQUFTLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3SCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsOEJBQThCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRixDQUFDO1FBQ0QsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixPQUFPLENBQUMsSUFBSSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRUQsMkZBQTJGO0lBQ25GLE9BQU8sQ0FBQyxRQUFnQixFQUFFLE1BQWlCLEVBQUUsVUFBa0M7UUFDckYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNyQixNQUFNLE1BQU0sR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUN2RCxNQUFNLE9BQU8sR0FBRyxVQUFVLEtBQUssSUFBSSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNGLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNwQixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQW1CLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkksSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNyQixPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsSUFBSSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sYUFBYSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQztZQUNwRyxDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLHlCQUF5QixFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2hHLENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ25DLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNoQixPQUFPLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztnQkFDdkIsQ0FBQztnQkFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3hFLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUNsQixHQUFHLENBQUMsSUFBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkIsQ0FBQztnQkFDRCxHQUFHLEdBQUcsT0FBTyxDQUFDO2dCQUNkLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDWixVQUFVLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN0RixHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQ1osQ0FBQztpQkFBTSxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUN2QyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDMUIsQ0FBQztxQkFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7b0JBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDNUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ2QsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLCtCQUErQixFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUM3RCxDQUFDO29CQUNELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDdEIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hGLENBQUM7b0JBQ0QsR0FBRyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ2xCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsaUNBQWlDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQy9ELENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3QixHQUFHLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7aUJBQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDN0IscURBQXFEO2dCQUNyRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQzlDLE1BQU0sYUFBYSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2dCQUNqRixDQUFDO2dCQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQy9CLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQzNCLE1BQU0sWUFBWSxHQUFHLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzlGLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNwQixVQUFVLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0QsQ0FBQztxQkFBTSxDQUFDO29CQUNOLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2pILENBQUM7Z0JBQ0QsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDaEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzRCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sYUFBYSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQztRQUNwRyxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGFBQWEsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxTQUFrQixFQUFFLFlBQXFCO1FBQy9GLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDckIsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBQzNCLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUNiLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssYUFBYSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQ25ILE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNkLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hELElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLElBQUksTUFBTSxJQUFJLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQy9ELE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQywrQkFBK0IsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDakQsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNuRSxDQUFDO1lBQ0QsQ0FBQyxHQUFHLFNBQVMsQ0FBQztZQUNkLFFBQVEsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0hBQWdIO0lBQ3hHLE9BQU8sQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxZQUFxQjtRQUNyRSxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN4QixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzlELE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzVELENBQUM7SUFFRCxvREFBb0Q7SUFDNUMsU0FBUyxDQUFDLFFBQWdCLEVBQUUsWUFBb0I7UUFDdEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNyQixJQUFJLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDL0IsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUM7WUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQ0FBaUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwRSxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLHlEQUF5RCxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzVGLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRU8sU0FBUyxDQUFDLE1BQWM7UUFDOUIsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDO1FBQ2pCLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVPLFVBQVUsQ0FBQyxNQUFjLEVBQUUsUUFBb0I7UUFDckQsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLE1BQU0sQ0FBQyxRQUFnQixFQUFFLE1BQWM7UUFDN0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTyxTQUFTLENBQUMsVUFBa0IsRUFBRSxTQUFpQjtRQUNyRCxPQUFPLElBQUksY0FBYyxDQUFDLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDL0gsQ0FBQztDQUNGO0FBRUQsd0RBQXdEO0FBQ3hELFNBQVMsaUJBQWlCLENBQUMsT0FBZTtJQUN4QyxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFDNUUsQ0FBQyJ9
|