payload 0.14.31-beta.0 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/.eslintrc.js +6 -0
  2. package/CHANGELOG.md +60 -71
  3. package/dist/admin/components/elements/elements.spec.d.ts +1 -0
  4. package/dist/admin/components/elements/elements.spec.js +12 -0
  5. package/dist/admin/components/forms/field-types/RichText/RichText.js +1 -1
  6. package/dist/admin/components/forms/field-types/RichText/index.scss +4 -1
  7. package/dist/admin/components/forms/field-types/Select/index.js +1 -1
  8. package/dist/admin/components/utilities/CustomProvider/index.d.ts +4 -0
  9. package/dist/admin/components/utilities/CustomProvider/index.js +18 -0
  10. package/dist/admin/index.js +3 -1
  11. package/dist/auth/auth.spec.d.ts +1 -0
  12. package/dist/auth/auth.spec.js +198 -0
  13. package/dist/collections/graphql/resolvers/resolvers.spec.d.ts +1 -0
  14. package/dist/collections/graphql/resolvers/resolvers.spec.js +360 -0
  15. package/dist/collections/operations/find.d.ts +1 -0
  16. package/dist/collections/operations/find.js +4 -2
  17. package/dist/collections/operations/local/find.d.ts +1 -0
  18. package/dist/collections/operations/local/find.js +3 -2
  19. package/dist/collections/operations/local/local.spec.d.ts +1 -0
  20. package/dist/collections/operations/local/local.spec.js +175 -0
  21. package/dist/collections/tests/collections.spec.d.ts +1 -0
  22. package/dist/collections/tests/collections.spec.js +725 -0
  23. package/dist/collections/tests/hooks.spec.d.ts +1 -0
  24. package/dist/collections/tests/hooks.spec.js +152 -0
  25. package/dist/collections/tests/pointField.spec.d.ts +1 -0
  26. package/dist/collections/tests/pointField.spec.js +208 -0
  27. package/dist/collections/tests/relationships.spec.d.ts +1 -0
  28. package/dist/collections/tests/relationships.spec.js +174 -0
  29. package/dist/collections/tests/uploads.spec.d.ts +1 -0
  30. package/dist/collections/tests/uploads.spec.js +328 -0
  31. package/dist/config/sanitize.js +4 -1
  32. package/dist/config/schema.js +2 -1
  33. package/dist/config/types.d.ts +2 -1
  34. package/dist/errors/errors.spec.d.ts +1 -0
  35. package/dist/errors/errors.spec.js +29 -0
  36. package/dist/express/middleware/errorHandler.spec.d.ts +1 -0
  37. package/dist/express/middleware/errorHandler.spec.js +91 -0
  38. package/dist/fields/config/schema.js +5 -5
  39. package/dist/fields/validations.js +6 -5
  40. package/dist/fields/validations.spec.js +120 -1
  41. package/dist/globals/requestHandlers/globals.spec.d.ts +4 -0
  42. package/dist/globals/requestHandlers/globals.spec.js +161 -0
  43. package/dist/graphql/errorHandler.d.ts +2 -1
  44. package/dist/graphql/errorHandler.js +9 -6
  45. package/dist/graphql/index.d.ts +2 -1
  46. package/dist/graphql/index.js +13 -4
  47. package/dist/graphql/schema/buildObjectType.js +6 -36
  48. package/dist/graphql/utilities/formatName.js +3 -3
  49. package/dist/graphql/utilities/formatOptions.d.ts +3 -0
  50. package/dist/graphql/utilities/formatOptions.js +27 -0
  51. package/dist/preferences/graphql/resolvers.spec.d.ts +1 -0
  52. package/dist/preferences/graphql/resolvers.spec.js +115 -0
  53. package/dist/types/index.d.ts +1 -1
  54. package/dist/versions/drafts/appendVersionToQueryKey.js +8 -5
  55. package/docs/admin/components.mdx +10 -2
  56. package/docs/getting-started/installation.mdx +12 -0
  57. package/docs/local-api/overview.mdx +1 -0
  58. package/docs/versions/overview.mdx +2 -2
  59. package/package.json +1 -1
@@ -0,0 +1,725 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const uuid_1 = require("uuid");
7
+ const load_1 = __importDefault(require("../../config/load"));
8
+ const testCredentials_1 = require("../../mongoose/testCredentials");
9
+ require('isomorphic-fetch');
10
+ const { serverURL: url } = (0, load_1.default)();
11
+ let token = null;
12
+ let headers = null;
13
+ let localizedPostID;
14
+ const localizedPostTitle = 'title';
15
+ const englishPostDesc = 'english description';
16
+ const spanishPostDesc = 'spanish description';
17
+ describe('Collections - REST', () => {
18
+ beforeAll(async (done) => {
19
+ const response = await fetch(`${url}/api/admins/login`, {
20
+ body: JSON.stringify({
21
+ email: testCredentials_1.email,
22
+ password: testCredentials_1.password,
23
+ }),
24
+ headers: {
25
+ 'Content-Type': 'application/json',
26
+ },
27
+ method: 'post',
28
+ });
29
+ const data = await response.json();
30
+ ({ token } = data);
31
+ headers = {
32
+ Authorization: `JWT ${token}`,
33
+ 'Content-Type': 'application/json',
34
+ };
35
+ done();
36
+ });
37
+ describe('Create', () => {
38
+ let response;
39
+ let data;
40
+ beforeAll(async () => {
41
+ response = await fetch(`${url}/api/localized-posts`, {
42
+ body: JSON.stringify({
43
+ title: localizedPostTitle,
44
+ description: englishPostDesc,
45
+ priority: 1,
46
+ nonLocalizedGroup: {
47
+ text: 'english',
48
+ },
49
+ localizedGroup: {
50
+ text: 'english',
51
+ },
52
+ nonLocalizedArray: [
53
+ {
54
+ localizedEmbeddedText: 'english',
55
+ },
56
+ ],
57
+ richTextBlocks: [
58
+ {
59
+ blockType: 'richTextBlock',
60
+ blockName: 'Test Block Name',
61
+ content: [
62
+ {
63
+ children: [{ text: 'english' }],
64
+ },
65
+ ],
66
+ },
67
+ ],
68
+ }),
69
+ headers,
70
+ method: 'post',
71
+ });
72
+ data = await response.json();
73
+ });
74
+ it('should allow a localized post to be created', async () => {
75
+ expect(response.status).toBe(201);
76
+ expect(data.doc.title).toBeDefined();
77
+ expect(data.doc.id).toBeDefined();
78
+ expect(data.doc.nonLocalizedGroup.text).toStrictEqual('english');
79
+ expect(data.doc.localizedGroup.text).toStrictEqual('english');
80
+ expect(data.doc.nonLocalizedArray[0].localizedEmbeddedText).toStrictEqual('english');
81
+ expect(data.doc.richTextBlocks[0].content[0].children[0].text).toStrictEqual('english');
82
+ const timestampRegex = /^(\d{4})(?:-?W(\d+)(?:-?(\d+)D?)?|(?:-(\d+))?-(\d+))(?:[T ](\d+):(\d+)(?::(\d+)(?:\.(\d+))?)?)?(?:Z(-?\d*))?$/;
83
+ expect(data.doc.createdAt).toStrictEqual(expect.stringMatching(timestampRegex));
84
+ expect(data.doc.updatedAt).toStrictEqual(expect.stringMatching(timestampRegex));
85
+ localizedPostID = data.doc.id;
86
+ });
87
+ it('should add id to array items', async () => {
88
+ expect(data.doc.nonLocalizedArray[0].id).toBeDefined();
89
+ });
90
+ it('should add id to block items', async () => {
91
+ expect(data.doc.richTextBlocks[0].id).toBeDefined();
92
+ });
93
+ });
94
+ describe('Update', () => {
95
+ it('should allow updating an existing post', async () => {
96
+ const createResponse = await fetch(`${url}/api/localized-posts`, {
97
+ body: JSON.stringify({
98
+ title: 'newTitle',
99
+ description: 'original description',
100
+ richText: [
101
+ {
102
+ children: [{ text: 'english' }],
103
+ },
104
+ ],
105
+ priority: 1,
106
+ }),
107
+ headers,
108
+ method: 'post',
109
+ });
110
+ expect(createResponse.status).toBe(201);
111
+ const createData = await createResponse.json();
112
+ const { id } = createData.doc;
113
+ const updatedDesc = 'updated description';
114
+ const updatedRichText = [
115
+ {
116
+ children: [{ text: 'english update' }],
117
+ },
118
+ ];
119
+ const updatedNonLocalizedArray = [
120
+ {
121
+ localizedEmbeddedText: 'english',
122
+ },
123
+ {
124
+ localizedEmbeddedText: 'english update',
125
+ },
126
+ ];
127
+ const response = await fetch(`${url}/api/localized-posts/${id}`, {
128
+ body: JSON.stringify({
129
+ title: 'newTitle',
130
+ description: updatedDesc,
131
+ richText: updatedRichText,
132
+ nonLocalizedArray: updatedNonLocalizedArray,
133
+ priority: '',
134
+ }),
135
+ headers,
136
+ method: 'put',
137
+ });
138
+ const data = await response.json();
139
+ expect(response.status).toBe(200);
140
+ expect(data.doc.description).toBe(updatedDesc);
141
+ expect(data.doc.priority).not.toStrictEqual(1);
142
+ expect(data.doc.nonLocalizedArray).toHaveLength(2);
143
+ expect(data.doc.richText[0].children[0].text).toBe('english update');
144
+ // make certain the stored object is exactly the same as the returned object
145
+ const stored = await (await fetch(`${url}/api/localized-posts/${id}`, {
146
+ method: 'get',
147
+ headers,
148
+ })).json();
149
+ expect(data.doc).toMatchObject(stored);
150
+ });
151
+ it('should allow a Spanish locale to be added to an existing post', async () => {
152
+ const response = await fetch(`${url}/api/localized-posts/${localizedPostID}?locale=es`, {
153
+ body: JSON.stringify({
154
+ title: 'title in spanish',
155
+ description: spanishPostDesc,
156
+ priority: 1,
157
+ nonLocalizedGroup: {
158
+ text: 'spanish',
159
+ },
160
+ localizedGroup: {
161
+ text: 'spanish',
162
+ },
163
+ nonLocalizedArray: [
164
+ {
165
+ localizedEmbeddedText: 'spanish',
166
+ },
167
+ ],
168
+ richTextBlocks: [
169
+ {
170
+ blockType: 'richTextBlock',
171
+ blockName: 'Test Block Name',
172
+ content: [
173
+ {
174
+ children: [{ text: 'spanish' }],
175
+ },
176
+ ],
177
+ },
178
+ ],
179
+ }),
180
+ headers,
181
+ method: 'put',
182
+ });
183
+ const data = await response.json();
184
+ expect(response.status).toBe(200);
185
+ expect(data.doc.description).toBe(spanishPostDesc);
186
+ expect(data.doc.nonLocalizedGroup.text).toStrictEqual('spanish');
187
+ expect(data.doc.localizedGroup.text).toStrictEqual('spanish');
188
+ expect(data.doc.nonLocalizedArray[0].localizedEmbeddedText).toStrictEqual('spanish');
189
+ expect(data.doc.richTextBlocks[0].content[0].children[0].text).toStrictEqual('spanish');
190
+ });
191
+ });
192
+ describe('Read', () => {
193
+ describe('Localized', () => {
194
+ it('should allow a localized post to be retrieved in unspecified locale, defaulting to English', async () => {
195
+ const response = await fetch(`${url}/api/localized-posts/${localizedPostID}`);
196
+ const data = await response.json();
197
+ expect(response.status).toBe(200);
198
+ expect(data.description).toBe(englishPostDesc);
199
+ expect(data.nonLocalizedGroup.text).toStrictEqual('english');
200
+ expect(data.localizedGroup.text).toStrictEqual('english');
201
+ expect(data.nonLocalizedArray[0].localizedEmbeddedText).toStrictEqual('english');
202
+ expect(data.richTextBlocks[0].content[0].children[0].text).toStrictEqual('english');
203
+ });
204
+ it('should allow a localized post to be retrieved in specified English locale', async () => {
205
+ const response = await fetch(`${url}/api/localized-posts/${localizedPostID}?locale=en`);
206
+ const data = await response.json();
207
+ expect(response.status).toBe(200);
208
+ expect(data.description).toBe(englishPostDesc);
209
+ expect(data.nonLocalizedGroup.text).toStrictEqual('english');
210
+ expect(data.localizedGroup.text).toStrictEqual('english');
211
+ expect(data.nonLocalizedArray[0].localizedEmbeddedText).toStrictEqual('english');
212
+ expect(data.richTextBlocks[0].content[0].children[0].text).toStrictEqual('english');
213
+ });
214
+ it('should allow a localized post to be retrieved in Spanish', async () => {
215
+ const response = await fetch(`${url}/api/localized-posts/${localizedPostID}?locale=es`);
216
+ const data = await response.json();
217
+ expect(response.status).toBe(200);
218
+ expect(data.description).toBe(spanishPostDesc);
219
+ expect(data.nonLocalizedGroup.text).toStrictEqual('spanish');
220
+ expect(data.localizedGroup.text).toStrictEqual('spanish');
221
+ expect(data.nonLocalizedArray[0].localizedEmbeddedText).toStrictEqual('spanish');
222
+ expect(data.richTextBlocks[0].content[0].children[0].text).toStrictEqual('spanish');
223
+ });
224
+ it('should allow a localized post to be retrieved in all locales', async () => {
225
+ const response = await fetch(`${url}/api/localized-posts/${localizedPostID}?locale=all`);
226
+ const data = await response.json();
227
+ expect(response.status).toBe(200);
228
+ expect(data.description.es).toBe(spanishPostDesc);
229
+ expect(data.description.en).toBe(englishPostDesc);
230
+ });
231
+ });
232
+ it('should allow querying by id', async () => {
233
+ const response = await fetch(`${url}/api/localized-posts`, {
234
+ body: JSON.stringify({
235
+ title: 'another title',
236
+ description: 'description',
237
+ priority: 1,
238
+ }),
239
+ headers,
240
+ method: 'post',
241
+ });
242
+ expect(response.status).toBe(201);
243
+ const data = await response.json();
244
+ const getResponse = await fetch(`${url}/api/localized-posts/${data.doc.id}`);
245
+ expect(getResponse.status).toBe(200);
246
+ const getData = await getResponse.json();
247
+ expect(getData.id).toBeDefined();
248
+ });
249
+ it('should allow querying on a field', async () => {
250
+ const desc = 'query test';
251
+ const response = await fetch(`${url}/api/localized-posts`, {
252
+ body: JSON.stringify({
253
+ title: 'unique title here',
254
+ description: desc,
255
+ priority: 1,
256
+ nonLocalizedGroup: {
257
+ text: 'sample content',
258
+ },
259
+ }),
260
+ headers,
261
+ method: 'post',
262
+ });
263
+ expect(response.status).toBe(201);
264
+ const getResponse = await fetch(`${url}/api/localized-posts?where[description][equals]=${desc}`);
265
+ const data = await getResponse.json();
266
+ expect(getResponse.status).toBe(200);
267
+ expect(data.docs[0].description).toBe(desc);
268
+ expect(data.docs).toHaveLength(1);
269
+ const getResponse2 = await fetch(`${url}/api/localized-posts?where[nonLocalizedGroup.text][equals]=sample content`);
270
+ const data2 = await getResponse2.json();
271
+ expect(getResponse2.status).toBe(200);
272
+ expect(data2.docs[0].description).toBe(desc);
273
+ expect(data2.docs).toHaveLength(1);
274
+ });
275
+ it('should allow querying with OR', async () => {
276
+ const title1 = 'Or1';
277
+ const title2 = 'Or2';
278
+ const response = await fetch(`${url}/api/localized-posts`, {
279
+ body: JSON.stringify({
280
+ title: title1,
281
+ description: 'desc',
282
+ priority: 1,
283
+ }),
284
+ headers,
285
+ method: 'post',
286
+ });
287
+ const response2 = await fetch(`${url}/api/localized-posts`, {
288
+ body: JSON.stringify({
289
+ title: title2,
290
+ description: 'desc',
291
+ priority: 1,
292
+ }),
293
+ headers,
294
+ method: 'post',
295
+ });
296
+ expect(response.status).toBe(201);
297
+ expect(response2.status).toBe(201);
298
+ const queryResponse = await fetch(`${url}/api/localized-posts?where[or][0][title][equals]=${title1}&where[or][1][title][equals]=${title2}`);
299
+ const data = await queryResponse.json();
300
+ expect(queryResponse.status).toBe(200);
301
+ expect(data.docs).toHaveLength(2);
302
+ expect(data.docs).toContainEqual(expect.objectContaining({ title: title1 }));
303
+ expect(data.docs).toContainEqual(expect.objectContaining({ title: title2 }));
304
+ });
305
+ it('should allow querying with OR, 1 result', async () => {
306
+ const title1 = 'OrNegative1';
307
+ const title2 = 'OrNegative2';
308
+ const response = await fetch(`${url}/api/localized-posts`, {
309
+ body: JSON.stringify({
310
+ title: title1,
311
+ description: 'desc',
312
+ priority: 1,
313
+ }),
314
+ headers,
315
+ method: 'post',
316
+ });
317
+ const response2 = await fetch(`${url}/api/localized-posts`, {
318
+ body: JSON.stringify({
319
+ title: title2,
320
+ description: 'desc',
321
+ priority: 1,
322
+ }),
323
+ headers,
324
+ method: 'post',
325
+ });
326
+ expect(response.status).toBe(201);
327
+ expect(response2.status).toBe(201);
328
+ const queryResponse = await fetch(`${url}/api/localized-posts?where[or][0][title][equals]=${title1}&where[or][1][title][equals]=nonexistent`);
329
+ const data = await queryResponse.json();
330
+ expect(queryResponse.status).toBe(200);
331
+ expect(data.docs).toHaveLength(1);
332
+ expect(data.docs[0].title).toBe(title1);
333
+ });
334
+ it('should allow querying by a non-localized nested relationship property', async () => {
335
+ const relationshipBTitle = 'test';
336
+ const relationshipBRes = await fetch(`${url}/api/relationship-b?depth=0`, {
337
+ body: JSON.stringify({
338
+ title: relationshipBTitle,
339
+ }),
340
+ headers,
341
+ method: 'post',
342
+ });
343
+ const relationshipBData = await relationshipBRes.json();
344
+ const res = await fetch(`${url}/api/relationship-a?depth=0`, {
345
+ body: JSON.stringify({
346
+ post: relationshipBData.doc.id,
347
+ }),
348
+ headers,
349
+ method: 'post',
350
+ });
351
+ const additionalRelationshipARes = await fetch(`${url}/api/relationship-a?depth=0`, {
352
+ body: JSON.stringify({
353
+ postLocalizedMultiple: [
354
+ {
355
+ relationTo: 'localized-posts',
356
+ value: localizedPostID,
357
+ },
358
+ ],
359
+ }),
360
+ headers,
361
+ method: 'post',
362
+ });
363
+ const relationshipAData = await res.json();
364
+ expect(res.status).toBe(201);
365
+ expect(additionalRelationshipARes.status).toBe(201);
366
+ expect(relationshipAData.doc.post).toBe(relationshipBData.doc.id);
367
+ const queryRes = await fetch(`${url}/api/relationship-a?where[post.title][equals]=${relationshipBTitle}`);
368
+ const data = await queryRes.json();
369
+ expect(data.docs).toHaveLength(1);
370
+ });
371
+ it('should allow querying by a localized nested relationship property', async () => {
372
+ const res = await fetch(`${url}/api/relationship-a`, {
373
+ body: JSON.stringify({
374
+ LocalizedPost: [localizedPostID],
375
+ }),
376
+ headers,
377
+ method: 'post',
378
+ });
379
+ expect(res.status).toBe(201);
380
+ const queryRes1 = await fetch(`${url}/api/relationship-a?where[LocalizedPost.title][in]=${localizedPostTitle}`);
381
+ const data1 = await queryRes1.json();
382
+ expect(data1.docs).toHaveLength(1);
383
+ });
384
+ it('should allow querying by a localized nested relationship with many relationTos', async () => {
385
+ const relationshipBTitle = 'lawleifjawelifjew';
386
+ const relationshipB = await fetch(`${url}/api/relationship-b?depth=0`, {
387
+ body: JSON.stringify({
388
+ title: relationshipBTitle,
389
+ }),
390
+ headers,
391
+ method: 'post',
392
+ }).then((res) => res.json());
393
+ expect(relationshipB.doc.id).toBeDefined();
394
+ const res = await fetch(`${url}/api/relationship-a`, {
395
+ body: JSON.stringify({
396
+ postManyRelationships: {
397
+ value: relationshipB.doc.id,
398
+ relationTo: 'relationship-b',
399
+ },
400
+ }),
401
+ headers,
402
+ method: 'post',
403
+ });
404
+ expect(res.status).toBe(201);
405
+ const queryRes = await fetch(`${url}/api/relationship-a?where[postManyRelationships.value][equals]=${relationshipB.doc.id}`);
406
+ const data = await queryRes.json();
407
+ expect(data.docs).toHaveLength(1);
408
+ });
409
+ it('should allow querying by a non-localized relationship with many relationTos', async () => {
410
+ const relationshipB = await fetch(`${url}/api/relationship-b?depth=0`, {
411
+ body: JSON.stringify({
412
+ title: 'awefjlaiwejfalweiijfaew',
413
+ nonLocalizedRelationToMany: {
414
+ relationTo: 'localized-posts',
415
+ value: localizedPostID,
416
+ },
417
+ }),
418
+ headers,
419
+ method: 'post',
420
+ }).then((res) => res.json());
421
+ expect(relationshipB.doc.id).toBeDefined();
422
+ const queryRes = await fetch(`${url}/api/relationship-b?where[nonLocalizedRelationToMany.value][equals]=${localizedPostID}`);
423
+ const data = await queryRes.json();
424
+ expect(data.docs).toHaveLength(1);
425
+ });
426
+ it('should allow querying by a numeric custom ID', async () => {
427
+ const customID = 1988;
428
+ const customIDResult = await fetch(`${url}/api/custom-id?depth=0`, {
429
+ body: JSON.stringify({
430
+ id: customID,
431
+ name: 'woohoo',
432
+ }),
433
+ headers,
434
+ method: 'post',
435
+ }).then((res) => res.json());
436
+ expect(customIDResult.doc.id).toStrictEqual(customID);
437
+ await fetch(`${url}/api/custom-id?depth=0`, {
438
+ body: JSON.stringify({
439
+ id: 2343452,
440
+ name: 'another post',
441
+ }),
442
+ headers,
443
+ method: 'post',
444
+ }).then((res) => res.json());
445
+ const queryRes1 = await fetch(`${url}/api/custom-id?where[id][equals]=${customID}`, {
446
+ headers,
447
+ });
448
+ const data1 = await queryRes1.json();
449
+ expect(data1.docs).toHaveLength(1);
450
+ const queryByIDRes = await fetch(`${url}/api/custom-id/${customID}`, {
451
+ headers,
452
+ });
453
+ const queryByIDData = await queryByIDRes.json();
454
+ expect(queryByIDData.id).toStrictEqual(customID);
455
+ });
456
+ it('should allow querying by a field within a group', async () => {
457
+ const text = 'laiwjefliajwe';
458
+ await fetch(`${url}/api/localized-posts`, {
459
+ body: JSON.stringify({
460
+ title: 'super great title',
461
+ description: 'desc',
462
+ priority: 1,
463
+ nonLocalizedGroup: {
464
+ text,
465
+ },
466
+ localizedGroup: {
467
+ text,
468
+ },
469
+ }),
470
+ headers,
471
+ method: 'post',
472
+ });
473
+ const queryRes1 = await fetch(`${url}/api/localized-posts?where[nonLocalizedGroup.text][equals]=${text}`);
474
+ const data1 = await queryRes1.json();
475
+ expect(data1.docs).toHaveLength(1);
476
+ const queryRes2 = await fetch(`${url}/api/localized-posts?where[localizedGroup.text][equals]=${text}`);
477
+ const data2 = await queryRes2.json();
478
+ expect(queryRes2.status).toBe(200);
479
+ expect(data2.docs).toHaveLength(1);
480
+ });
481
+ });
482
+ describe('Delete', () => {
483
+ it('should allow a post to be deleted', async () => {
484
+ const response = await fetch(`${url}/api/localized-posts`, {
485
+ body: JSON.stringify({
486
+ title: 'title to be deleted',
487
+ description: englishPostDesc,
488
+ priority: 1,
489
+ }),
490
+ headers,
491
+ method: 'post',
492
+ });
493
+ const data = await response.json();
494
+ const docId = data.doc.id;
495
+ expect(response.status).toBe(201);
496
+ expect(docId).toBeDefined();
497
+ const deleteResponse = await fetch(`${url}/api/localized-posts/${docId}`, {
498
+ headers,
499
+ method: 'delete',
500
+ });
501
+ expect(deleteResponse.status).toBe(200);
502
+ const deleteData = await deleteResponse.json();
503
+ expect(deleteData.id).toBe(docId);
504
+ });
505
+ });
506
+ describe('Metadata', () => {
507
+ async function createPost(title, description) {
508
+ await fetch(`${url}/api/localized-posts`, {
509
+ body: JSON.stringify({
510
+ title: title || (0, uuid_1.v4)(),
511
+ description,
512
+ priority: 1,
513
+ }),
514
+ headers,
515
+ method: 'post',
516
+ });
517
+ }
518
+ it('should include metadata', async () => {
519
+ const desc = 'metadataDesc';
520
+ for (let i = 0; i < 12; i += 1) {
521
+ // eslint-disable-next-line no-await-in-loop
522
+ await createPost(null, desc);
523
+ }
524
+ const getResponse = await fetch(`${url}/api/localized-posts?where[description][equals]=${desc}`);
525
+ const data = await getResponse.json();
526
+ expect(getResponse.status).toBe(200);
527
+ // TODO: Assert exact length once query bug is fixed
528
+ expect(data.docs.length).toBeGreaterThan(0);
529
+ expect(data.totalDocs).toBeGreaterThan(0);
530
+ expect(data.limit).toBe(10);
531
+ expect(data.page).toBe(1);
532
+ expect(data.pagingCounter).toBe(1);
533
+ expect(data.hasPrevPage).toBe(false);
534
+ expect(data.hasNextPage).toBe(true);
535
+ expect(data.prevPage).toBeNull();
536
+ expect(data.nextPage).toBe(2);
537
+ });
538
+ it('should sort the results', async () => {
539
+ const desc = 'sort';
540
+ // Create 2 posts with different titles, same desc
541
+ const req1 = await fetch(`${url}/api/localized-posts`, {
542
+ body: JSON.stringify({
543
+ title: 'aaa',
544
+ description: desc,
545
+ priority: 1,
546
+ }),
547
+ headers,
548
+ method: 'post',
549
+ });
550
+ const req2 = await fetch(`${url}/api/localized-posts`, {
551
+ body: JSON.stringify({
552
+ title: 'zzz',
553
+ description: desc,
554
+ priority: 1,
555
+ }),
556
+ headers,
557
+ method: 'post',
558
+ });
559
+ const req1data = await req1.json();
560
+ const req2data = await req2.json();
561
+ const id1 = req1data.doc.id;
562
+ const id2 = req2data.doc.id;
563
+ // Query on shared desc and sort ascending
564
+ const getResponse = await fetch(`${url}/api/localized-posts?where[description][equals]=${desc}&sort=title`);
565
+ const data = await getResponse.json();
566
+ expect(getResponse.status).toBe(200);
567
+ expect(data.docs).toHaveLength(2);
568
+ expect(data.docs[0].id).toStrictEqual(id1);
569
+ expect(data.docs[1].id).toStrictEqual(id2);
570
+ // Query on shared desc and sort descending
571
+ const getResponseSorted = await fetch(`${url}/api/localized-posts?where[description][equals]=${desc}&sort=-title`);
572
+ const sortedData = await getResponseSorted.json();
573
+ expect(getResponse.status).toBe(200);
574
+ expect(sortedData.docs).toHaveLength(2);
575
+ // Opposite order from first request
576
+ expect(sortedData.docs[0].id).toStrictEqual(id2);
577
+ expect(sortedData.docs[1].id).toStrictEqual(id1);
578
+ });
579
+ });
580
+ describe('Field Access', () => {
581
+ it('should properly prevent / allow public users from reading a restricted field', async () => {
582
+ const firstArrayText1 = 'test 1';
583
+ const firstArrayText2 = 'test 2';
584
+ const response = await fetch(`${url}/api/localized-arrays`, {
585
+ body: JSON.stringify({
586
+ array: [
587
+ {
588
+ arrayText1: firstArrayText1,
589
+ arrayText2: 'test 2',
590
+ arrayText3: 'test 3',
591
+ allowPublicReadability: true,
592
+ },
593
+ {
594
+ arrayText1: firstArrayText2,
595
+ arrayText2: 'test 2',
596
+ arrayText3: 'test 3',
597
+ allowPublicReadability: false,
598
+ },
599
+ ],
600
+ }),
601
+ headers,
602
+ method: 'post',
603
+ });
604
+ const data = await response.json();
605
+ const docId = data.doc.id;
606
+ expect(response.status).toBe(201);
607
+ expect(data.doc.array[1].arrayText1).toStrictEqual(firstArrayText2);
608
+ const unauthenticatedResponse = await fetch(`${url}/api/localized-arrays/${docId}`, {
609
+ headers: {
610
+ 'Content-Type': 'application/json',
611
+ },
612
+ });
613
+ expect(unauthenticatedResponse.status).toBe(200);
614
+ const unauthenticatedData = await unauthenticatedResponse.json();
615
+ // This string should be allowed to come back
616
+ expect(unauthenticatedData.array[0].arrayText1).toBe(firstArrayText1);
617
+ // This string should be prevented from coming back
618
+ expect(unauthenticatedData.array[1].arrayText1).toBeUndefined();
619
+ const authenticatedResponse = await fetch(`${url}/api/localized-arrays/${docId}`, {
620
+ headers,
621
+ });
622
+ const authenticatedData = await authenticatedResponse.json();
623
+ // If logged in, we should get this field back
624
+ expect(authenticatedData.array[1].arrayText1).toStrictEqual(firstArrayText2);
625
+ });
626
+ });
627
+ describe('Unique', () => {
628
+ it('should prevent unique fields from duplicating data', async () => {
629
+ const nonUniqueTitle = 'title';
630
+ const response = await fetch(`${url}/api/uniques`, {
631
+ body: JSON.stringify({
632
+ title: nonUniqueTitle,
633
+ }),
634
+ headers,
635
+ method: 'post',
636
+ });
637
+ const data = await response.json();
638
+ expect(response.status).toBe(201);
639
+ expect(data.doc.title).toStrictEqual(nonUniqueTitle);
640
+ const failedResponse = await fetch(`${url}/api/uniques`, {
641
+ body: JSON.stringify({
642
+ title: nonUniqueTitle,
643
+ }),
644
+ headers,
645
+ method: 'post',
646
+ });
647
+ expect(failedResponse.status).toStrictEqual(500);
648
+ });
649
+ });
650
+ describe('Custom ID', () => {
651
+ const document = {
652
+ id: 1,
653
+ name: 'name',
654
+ };
655
+ let data;
656
+ beforeAll(async (done) => {
657
+ // create document
658
+ const create = await fetch(`${url}/api/custom-id`, {
659
+ body: JSON.stringify(document),
660
+ headers,
661
+ method: 'post',
662
+ });
663
+ data = await create.json();
664
+ done();
665
+ });
666
+ it('should create collections with custom ID', async () => {
667
+ expect(data.doc.id).toBe(document.id);
668
+ });
669
+ it('should read collections by custom ID', async () => {
670
+ const response = await fetch(`${url}/api/custom-id/${document.id}`, {
671
+ headers,
672
+ method: 'get',
673
+ });
674
+ const result = await response.json();
675
+ expect(result.id).toStrictEqual(document.id);
676
+ expect(result.name).toStrictEqual(document.name);
677
+ });
678
+ it('should update collection by custom ID', async () => {
679
+ const updatedDoc = { id: 'cannot-update-id', name: 'updated' };
680
+ const response = await fetch(`${url}/api/custom-id/${document.id}`, {
681
+ headers,
682
+ body: JSON.stringify(updatedDoc),
683
+ method: 'put',
684
+ });
685
+ const result = await response.json();
686
+ expect(result.doc.id).not.toStrictEqual(updatedDoc.id);
687
+ expect(result.doc.name).not.toStrictEqual(document.name);
688
+ expect(result.doc.name).toStrictEqual(updatedDoc.name);
689
+ });
690
+ it('should delete collection by custom ID', async () => {
691
+ const doc = {
692
+ id: 2,
693
+ name: 'delete me',
694
+ };
695
+ const createResponse = await fetch(`${url}/api/custom-id`, {
696
+ body: JSON.stringify(doc),
697
+ headers,
698
+ method: 'post',
699
+ });
700
+ const result = await createResponse.json();
701
+ const response = await fetch(`${url}/api/custom-id/${result.doc.id}`, {
702
+ headers,
703
+ method: 'delete',
704
+ });
705
+ expect(response.status).toBe(200);
706
+ const deleteData = await response.json();
707
+ expect(deleteData.id).toBe(doc.id);
708
+ });
709
+ it('should allow querying by custom ID', async () => {
710
+ const response = await fetch(`${url}/api/custom-id?where[id][equals]=${document.id}`, {
711
+ headers,
712
+ method: 'get',
713
+ });
714
+ const emptyResponse = await fetch(`${url}/api/custom-id?where[id][equals]=900`, {
715
+ headers,
716
+ method: 'get',
717
+ });
718
+ const result = await response.json();
719
+ const emptyResult = await emptyResponse.json();
720
+ expect(result.docs).toHaveLength(1);
721
+ expect(emptyResult.docs).toHaveLength(0);
722
+ });
723
+ });
724
+ });
725
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbnMuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb2xsZWN0aW9ucy90ZXN0cy9jb2xsZWN0aW9ucy5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQWtDO0FBQ2xDLDZEQUEwQztBQUMxQyxvRUFBaUU7QUFFakUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFNUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFBLGNBQVMsR0FBRSxDQUFDO0FBRXZDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztBQUNqQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7QUFFbkIsSUFBSSxlQUFlLENBQUM7QUFDcEIsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUM7QUFDbkMsTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUM7QUFDOUMsTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUM7QUFFOUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3ZCLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyxtQkFBbUIsRUFBRTtZQUN0RCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbkIsS0FBSyxFQUFMLHVCQUFLO2dCQUNMLFFBQVEsRUFBUiwwQkFBUTthQUNULENBQUM7WUFDRixPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjthQUNuQztZQUNELE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFbkMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ25CLE9BQU8sR0FBRztZQUNSLGFBQWEsRUFBRSxPQUFPLEtBQUssRUFBRTtZQUM3QixjQUFjLEVBQUUsa0JBQWtCO1NBQ25DLENBQUM7UUFFRixJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDdEIsSUFBSSxRQUFRLENBQUM7UUFDYixJQUFJLElBQUksQ0FBQztRQUVULFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNuQixRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxHQUFHLHNCQUFzQixFQUFFO2dCQUNuRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkIsS0FBSyxFQUFFLGtCQUFrQjtvQkFDekIsV0FBVyxFQUFFLGVBQWU7b0JBQzVCLFFBQVEsRUFBRSxDQUFDO29CQUNYLGlCQUFpQixFQUFFO3dCQUNqQixJQUFJLEVBQUUsU0FBUztxQkFDaEI7b0JBQ0QsY0FBYyxFQUFFO3dCQUNkLElBQUksRUFBRSxTQUFTO3FCQUNoQjtvQkFDRCxpQkFBaUIsRUFBRTt3QkFDakI7NEJBQ0UscUJBQXFCLEVBQUUsU0FBUzt5QkFDakM7cUJBQ0Y7b0JBQ0QsY0FBYyxFQUFFO3dCQUNkOzRCQUNFLFNBQVMsRUFBRSxlQUFlOzRCQUMxQixTQUFTLEVBQUUsaUJBQWlCOzRCQUM1QixPQUFPLEVBQUU7Z0NBQ1A7b0NBQ0UsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7aUNBQ2hDOzZCQUNGO3lCQUNGO3FCQUNGO2lCQUNGLENBQUM7Z0JBQ0YsT0FBTztnQkFDUCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztZQUNILElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMzRCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5RCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFeEYsTUFBTSxjQUFjLEdBQUcsK0dBQStHLENBQUM7WUFDdkksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUNoRixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBRWhGLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQ3RCLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN0RCxNQUFNLGNBQWMsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsc0JBQXNCLEVBQUU7Z0JBQy9ELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNuQixLQUFLLEVBQUUsVUFBVTtvQkFDakIsV0FBVyxFQUFFLHNCQUFzQjtvQkFDbkMsUUFBUSxFQUFFO3dCQUNSOzRCQUNFLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO3lCQUNoQztxQkFDRjtvQkFDRCxRQUFRLEVBQUUsQ0FBQztpQkFDWixDQUFDO2dCQUNGLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLE1BQU07YUFDZixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QyxNQUFNLFVBQVUsR0FBRyxNQUFNLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUU5QixNQUFNLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQztZQUMxQyxNQUFNLGVBQWUsR0FBRztnQkFDdEI7b0JBQ0UsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztpQkFDdkM7YUFDRixDQUFDO1lBQ0YsTUFBTSx3QkFBd0IsR0FBRztnQkFDL0I7b0JBQ0UscUJBQXFCLEVBQUUsU0FBUztpQkFDakM7Z0JBQ0Q7b0JBQ0UscUJBQXFCLEVBQUUsZ0JBQWdCO2lCQUN4QzthQUNGLENBQUM7WUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsd0JBQXdCLEVBQUUsRUFBRSxFQUFFO2dCQUMvRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkIsS0FBSyxFQUFFLFVBQVU7b0JBQ2pCLFdBQVcsRUFBRSxXQUFXO29CQUN4QixRQUFRLEVBQUUsZUFBZTtvQkFDekIsaUJBQWlCLEVBQUUsd0JBQXdCO29CQUMzQyxRQUFRLEVBQUUsRUFBRTtpQkFDYixDQUFDO2dCQUNGLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLEtBQUs7YUFDZCxDQUFDLENBQUM7WUFFSCxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVuQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBRXJFLDRFQUE0RTtZQUM1RSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQ25CLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyx3QkFBd0IsRUFBRSxFQUFFLEVBQUU7Z0JBQzlDLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE9BQU87YUFDUixDQUFDLENBQ0gsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVULE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtEQUErRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzdFLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyx3QkFBd0IsZUFBZSxZQUFZLEVBQUU7Z0JBQ3RGLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNuQixLQUFLLEVBQUUsa0JBQWtCO29CQUN6QixXQUFXLEVBQUUsZUFBZTtvQkFDNUIsUUFBUSxFQUFFLENBQUM7b0JBQ1gsaUJBQWlCLEVBQUU7d0JBQ2pCLElBQUksRUFBRSxTQUFTO3FCQUNoQjtvQkFDRCxjQUFjLEVBQUU7d0JBQ2QsSUFBSSxFQUFFLFNBQVM7cUJBQ2hCO29CQUNELGlCQUFpQixFQUFFO3dCQUNqQjs0QkFDRSxxQkFBcUIsRUFBRSxTQUFTO3lCQUNqQztxQkFDRjtvQkFDRCxjQUFjLEVBQUU7d0JBQ2Q7NEJBQ0UsU0FBUyxFQUFFLGVBQWU7NEJBQzFCLFNBQVMsRUFBRSxpQkFBaUI7NEJBQzVCLE9BQU8sRUFBRTtnQ0FDUDtvQ0FDRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztpQ0FDaEM7NkJBQ0Y7eUJBQ0Y7cUJBQ0Y7aUJBQ0YsQ0FBQztnQkFDRixPQUFPO2dCQUNQLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQyxDQUFDO1lBRUgsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFbkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JGLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7UUFDcEIsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7WUFDekIsRUFBRSxDQUFDLDRGQUE0RixFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUMxRyxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsd0JBQXdCLGVBQWUsRUFBRSxDQUFDLENBQUM7Z0JBQzlFLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUVuQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzFELE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2pGLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RGLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDJFQUEyRSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN6RixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsd0JBQXdCLGVBQWUsWUFBWSxDQUFDLENBQUM7Z0JBQ3hGLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUVuQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzFELE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2pGLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RGLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDBEQUEwRCxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN4RSxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsd0JBQXdCLGVBQWUsWUFBWSxDQUFDLENBQUM7Z0JBQ3hGLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUVuQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzFELE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2pGLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RGLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDhEQUE4RCxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUM1RSxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsd0JBQXdCLGVBQWUsYUFBYSxDQUFDLENBQUM7Z0JBQ3pGLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUVuQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMzQyxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsc0JBQXNCLEVBQUU7Z0JBQ3pELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNuQixLQUFLLEVBQUUsZUFBZTtvQkFDdEIsV0FBVyxFQUFFLGFBQWE7b0JBQzFCLFFBQVEsRUFBRSxDQUFDO2lCQUNaLENBQUM7Z0JBQ0YsT0FBTztnQkFDUCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWxDLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25DLE1BQU0sV0FBVyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyx3QkFBd0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRTdFLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXJDLE1BQU0sT0FBTyxHQUFHLE1BQU0sV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRXpDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEQsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDO1lBQzFCLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyxzQkFBc0IsRUFBRTtnQkFDekQsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25CLEtBQUssRUFBRSxtQkFBbUI7b0JBQzFCLFdBQVcsRUFBRSxJQUFJO29CQUNqQixRQUFRLEVBQUUsQ0FBQztvQkFDWCxpQkFBaUIsRUFBRTt3QkFDakIsSUFBSSxFQUFFLGdCQUFnQjtxQkFDdkI7aUJBQ0YsQ0FBQztnQkFDRixPQUFPO2dCQUNQLE1BQU0sRUFBRSxNQUFNO2FBQ2YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxLQUFLLENBQzdCLEdBQUcsR0FBRyxtREFBbUQsSUFBSSxFQUFFLENBQ2hFLENBQUM7WUFDRixNQUFNLElBQUksR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUV0QyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxLQUFLLENBQzlCLEdBQUcsR0FBRywyRUFBMkUsQ0FDbEYsQ0FBQztZQUNGLE1BQU0sS0FBSyxHQUFHLE1BQU0sWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRXhDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM3QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDckIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyxzQkFBc0IsRUFBRTtnQkFDekQsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25CLEtBQUssRUFBRSxNQUFNO29CQUNiLFdBQVcsRUFBRSxNQUFNO29CQUNuQixRQUFRLEVBQUUsQ0FBQztpQkFDWixDQUFDO2dCQUNGLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLE1BQU07YUFDZixDQUFDLENBQUM7WUFFSCxNQUFNLFNBQVMsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsc0JBQXNCLEVBQUU7Z0JBQzFELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNuQixLQUFLLEVBQUUsTUFBTTtvQkFDYixXQUFXLEVBQUUsTUFBTTtvQkFDbkIsUUFBUSxFQUFFLENBQUM7aUJBQ1osQ0FBQztnQkFDRixPQUFPO2dCQUNQLE1BQU0sRUFBRSxNQUFNO2FBQ2YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFbkMsTUFBTSxhQUFhLEdBQUcsTUFBTSxLQUFLLENBQy9CLEdBQUcsR0FBRyxvREFBb0QsTUFBTSxnQ0FBZ0MsTUFBTSxFQUFFLENBQ3pHLENBQUM7WUFDRixNQUFNLElBQUksR0FBRyxNQUFNLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUV4QyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0UsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdkQsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDO1lBQzdCLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQztZQUM3QixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsc0JBQXNCLEVBQUU7Z0JBQ3pELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNuQixLQUFLLEVBQUUsTUFBTTtvQkFDYixXQUFXLEVBQUUsTUFBTTtvQkFDbkIsUUFBUSxFQUFFLENBQUM7aUJBQ1osQ0FBQztnQkFDRixPQUFPO2dCQUNQLE1BQU0sRUFBRSxNQUFNO2FBQ2YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxTQUFTLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxHQUFHLHNCQUFzQixFQUFFO2dCQUMxRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkIsS0FBSyxFQUFFLE1BQU07b0JBQ2IsV0FBVyxFQUFFLE1BQU07b0JBQ25CLFFBQVEsRUFBRSxDQUFDO2lCQUNaLENBQUM7Z0JBQ0YsT0FBTztnQkFDUCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRW5DLE1BQU0sYUFBYSxHQUFHLE1BQU0sS0FBSyxDQUMvQixHQUFHLEdBQUcsb0RBQW9ELE1BQU0sMENBQTBDLENBQzNHLENBQUM7WUFDRixNQUFNLElBQUksR0FBRyxNQUFNLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUV4QyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUVBQXVFLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDckYsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7WUFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsNkJBQTZCLEVBQUU7Z0JBQ3hFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNuQixLQUFLLEVBQUUsa0JBQWtCO2lCQUMxQixDQUFDO2dCQUNGLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLE1BQU07YUFDZixDQUFDLENBQUM7WUFFSCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFeEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxHQUFHLDZCQUE2QixFQUFFO2dCQUMzRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFO2lCQUMvQixDQUFDO2dCQUNGLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLE1BQU07YUFDZixDQUFDLENBQUM7WUFFSCxNQUFNLDBCQUEwQixHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyw2QkFBNkIsRUFBRTtnQkFDbEYsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25CLHFCQUFxQixFQUFFO3dCQUNyQjs0QkFDRSxVQUFVLEVBQUUsaUJBQWlCOzRCQUM3QixLQUFLLEVBQUUsZUFBZTt5QkFDdkI7cUJBQ0Y7aUJBQ0YsQ0FBQztnQkFDRixPQUFPO2dCQUNQLE1BQU0sRUFBRSxNQUFNO2FBQ2YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUUzQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixNQUFNLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVsRSxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FDMUIsR0FBRyxHQUFHLGlEQUFpRCxrQkFBa0IsRUFBRSxDQUM1RSxDQUFDO1lBQ0YsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUVBQW1FLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDakYsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxHQUFHLHFCQUFxQixFQUFFO2dCQUNuRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkIsYUFBYSxFQUFFLENBQUMsZUFBZSxDQUFDO2lCQUNqQyxDQUFDO2dCQUNGLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLE1BQU07YUFDZixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUU3QixNQUFNLFNBQVMsR0FBRyxNQUFNLEtBQUssQ0FDM0IsR0FBRyxHQUFHLHNEQUFzRCxrQkFBa0IsRUFBRSxDQUNqRixDQUFDO1lBQ0YsTUFBTSxLQUFLLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFckMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0ZBQWdGLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDOUYsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztZQUMvQyxNQUFNLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsNkJBQTZCLEVBQUU7Z0JBQ3JFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNuQixLQUFLLEVBQUUsa0JBQWtCO2lCQUMxQixDQUFDO2dCQUNGLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLE1BQU07YUFDZixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUU3QixNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUUzQyxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcscUJBQXFCLEVBQUU7Z0JBQ25ELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNuQixxQkFBcUIsRUFBRTt3QkFDckIsS0FBSyxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDM0IsVUFBVSxFQUFFLGdCQUFnQjtxQkFDN0I7aUJBQ0YsQ0FBQztnQkFDRixPQUFPO2dCQUNQLE1BQU0sRUFBRSxNQUFNO2FBQ2YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFN0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQzFCLEdBQUcsR0FBRyxrRUFBa0UsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FDL0YsQ0FBQztZQUNGLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZFQUE2RSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzNGLE1BQU0sYUFBYSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyw2QkFBNkIsRUFBRTtnQkFDckUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25CLEtBQUssRUFBRSx5QkFBeUI7b0JBQ2hDLDBCQUEwQixFQUFFO3dCQUMxQixVQUFVLEVBQUUsaUJBQWlCO3dCQUM3QixLQUFLLEVBQUUsZUFBZTtxQkFDdkI7aUJBQ0YsQ0FBQztnQkFDRixPQUFPO2dCQUNQLE1BQU0sRUFBRSxNQUFNO2FBQ2YsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFFN0IsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFM0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQzFCLEdBQUcsR0FBRyx1RUFBdUUsZUFBZSxFQUFFLENBQy9GLENBQUM7WUFDRixNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM1RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFFdEIsTUFBTSxjQUFjLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxHQUFHLHdCQUF3QixFQUFFO2dCQUNqRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkIsRUFBRSxFQUFFLFFBQVE7b0JBQ1osSUFBSSxFQUFFLFFBQVE7aUJBQ2YsQ0FBQztnQkFDRixPQUFPO2dCQUNQLE1BQU0sRUFBRSxNQUFNO2FBQ2YsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFFN0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXRELE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyx3QkFBd0IsRUFBRTtnQkFDMUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25CLEVBQUUsRUFBRSxPQUFPO29CQUNYLElBQUksRUFBRSxjQUFjO2lCQUNyQixDQUFDO2dCQUNGLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLE1BQU07YUFDZixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUU3QixNQUFNLFNBQVMsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsb0NBQW9DLFFBQVEsRUFBRSxFQUFFO2dCQUNsRixPQUFPO2FBQ1IsQ0FBQyxDQUFDO1lBRUgsTUFBTSxLQUFLLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFckMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbkMsTUFBTSxZQUFZLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxHQUFHLGtCQUFrQixRQUFRLEVBQUUsRUFBRTtnQkFDbkUsT0FBTzthQUNSLENBQUMsQ0FBQztZQUNILE1BQU0sYUFBYSxHQUFHLE1BQU0sWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQy9ELE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQztZQUU3QixNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsc0JBQXNCLEVBQUU7Z0JBQ3hDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNuQixLQUFLLEVBQUUsbUJBQW1CO29CQUMxQixXQUFXLEVBQUUsTUFBTTtvQkFDbkIsUUFBUSxFQUFFLENBQUM7b0JBQ1gsaUJBQWlCLEVBQUU7d0JBQ2pCLElBQUk7cUJBQ0w7b0JBQ0QsY0FBYyxFQUFFO3dCQUNkLElBQUk7cUJBQ0w7aUJBQ0YsQ0FBQztnQkFDRixPQUFPO2dCQUNQLE1BQU0sRUFBRSxNQUFNO2FBQ2YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxTQUFTLEdBQUcsTUFBTSxLQUFLLENBQzNCLEdBQUcsR0FBRyw4REFBOEQsSUFBSSxFQUFFLENBQzNFLENBQUM7WUFDRixNQUFNLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVyQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVuQyxNQUFNLFNBQVMsR0FBRyxNQUFNLEtBQUssQ0FDM0IsR0FBRyxHQUFHLDJEQUEyRCxJQUFJLEVBQUUsQ0FDeEUsQ0FBQztZQUNGLE1BQU0sS0FBSyxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRXJDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUN0QixFQUFFLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDakQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxHQUFHLHNCQUFzQixFQUFFO2dCQUN6RCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkIsS0FBSyxFQUFFLHFCQUFxQjtvQkFDNUIsV0FBVyxFQUFFLGVBQWU7b0JBQzVCLFFBQVEsRUFBRSxDQUFDO2lCQUNaLENBQUM7Z0JBQ0YsT0FBTztnQkFDUCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUU1QixNQUFNLGNBQWMsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsd0JBQXdCLEtBQUssRUFBRSxFQUFFO2dCQUN4RSxPQUFPO2dCQUNQLE1BQU0sRUFBRSxRQUFRO2FBQ2pCLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRTtRQUN4QixLQUFLLFVBQVUsVUFBVSxDQUFDLEtBQUssRUFBRSxXQUFXO1lBQzFDLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyxzQkFBc0IsRUFBRTtnQkFDeEMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25CLEtBQUssRUFBRSxLQUFLLElBQUksSUFBQSxTQUFJLEdBQUU7b0JBQ3RCLFdBQVc7b0JBQ1gsUUFBUSxFQUFFLENBQUM7aUJBQ1osQ0FBQztnQkFDRixPQUFPO2dCQUNQLE1BQU0sRUFBRSxNQUFNO2FBQ2YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN2QyxNQUFNLElBQUksR0FBRyxjQUFjLENBQUM7WUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM5Qiw0Q0FBNEM7Z0JBQzVDLE1BQU0sVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM5QjtZQUVELE1BQU0sV0FBVyxHQUFHLE1BQU0sS0FBSyxDQUM3QixHQUFHLEdBQUcsbURBQW1ELElBQUksRUFBRSxDQUNoRSxDQUFDO1lBQ0YsTUFBTSxJQUFJLEdBQUcsTUFBTSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFdEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFckMsb0RBQW9EO1lBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlCQUF5QixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQztZQUVwQixrREFBa0Q7WUFDbEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxHQUFHLHNCQUFzQixFQUFFO2dCQUNyRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkIsS0FBSyxFQUFFLEtBQUs7b0JBQ1osV0FBVyxFQUFFLElBQUk7b0JBQ2pCLFFBQVEsRUFBRSxDQUFDO2lCQUNaLENBQUM7Z0JBQ0YsT0FBTztnQkFDUCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyxzQkFBc0IsRUFBRTtnQkFDckQsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25CLEtBQUssRUFBRSxLQUFLO29CQUNaLFdBQVcsRUFBRSxJQUFJO29CQUNqQixRQUFRLEVBQUUsQ0FBQztpQkFDWixDQUFDO2dCQUNGLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLE1BQU07YUFDZixDQUFDLENBQUM7WUFFSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUU1QiwwQ0FBMEM7WUFDMUMsTUFBTSxXQUFXLEdBQUcsTUFBTSxLQUFLLENBQzdCLEdBQUcsR0FBRyxtREFBbUQsSUFBSSxhQUFhLENBQzNFLENBQUM7WUFDRixNQUFNLElBQUksR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUV0QyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTNDLDJDQUEyQztZQUMzQyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sS0FBSyxDQUNuQyxHQUFHLEdBQUcsbURBQW1ELElBQUksY0FBYyxDQUM1RSxDQUFDO1lBQ0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVsRCxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxvQ0FBb0M7WUFDcEMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7UUFDNUIsRUFBRSxDQUFDLDhFQUE4RSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzVGLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQztZQUNqQyxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUM7WUFFakMsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxHQUFHLHVCQUF1QixFQUFFO2dCQUMxRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkIsS0FBSyxFQUFFO3dCQUNMOzRCQUNFLFVBQVUsRUFBRSxlQUFlOzRCQUMzQixVQUFVLEVBQUUsUUFBUTs0QkFDcEIsVUFBVSxFQUFFLFFBQVE7NEJBQ3BCLHNCQUFzQixFQUFFLElBQUk7eUJBQzdCO3dCQUNEOzRCQUNFLFVBQVUsRUFBRSxlQUFlOzRCQUMzQixVQUFVLEVBQUUsUUFBUTs0QkFDcEIsVUFBVSxFQUFFLFFBQVE7NEJBQ3BCLHNCQUFzQixFQUFFLEtBQUs7eUJBQzlCO3FCQUNGO2lCQUNGLENBQUM7Z0JBQ0YsT0FBTztnQkFDUCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFcEUsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcseUJBQXlCLEtBQUssRUFBRSxFQUFFO2dCQUNsRixPQUFPLEVBQUU7b0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjtpQkFDbkM7YUFDRixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVqRSw2Q0FBNkM7WUFDN0MsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFdEUsbURBQW1EO1lBQ25ELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFaEUsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcseUJBQXlCLEtBQUssRUFBRSxFQUFFO2dCQUNoRixPQUFPO2FBQ1IsQ0FBQyxDQUFDO1lBRUgsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLHFCQUFxQixDQUFDLElBQUksRUFBRSxDQUFDO1lBRTdELDhDQUE4QztZQUM5QyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMvRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDdEIsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2xFLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQztZQUUvQixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsY0FBYyxFQUFFO2dCQUNqRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkIsS0FBSyxFQUFFLGNBQWM7aUJBQ3RCLENBQUM7Z0JBQ0YsT0FBTztnQkFDUCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRW5DLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUVyRCxNQUFNLGNBQWMsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsY0FBYyxFQUFFO2dCQUN2RCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkIsS0FBSyxFQUFFLGNBQWM7aUJBQ3RCLENBQUM7Z0JBQ0YsT0FBTztnQkFDUCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtRQUN6QixNQUFNLFFBQVEsR0FBRztZQUNmLEVBQUUsRUFBRSxDQUFDO1lBQ0wsSUFBSSxFQUFFLE1BQU07U0FDYixDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUM7UUFDVCxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3ZCLGtCQUFrQjtZQUNsQixNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsZ0JBQWdCLEVBQUU7Z0JBQ2pELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztnQkFDOUIsT0FBTztnQkFDUCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztZQUNILElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMzQixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3hELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDcEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxHQUFHLGtCQUFrQixRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQ2xFLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLEtBQUs7YUFDZCxDQUFDLENBQUM7WUFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVyQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3JELE1BQU0sVUFBVSxHQUFHLEVBQUUsRUFBRSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUMvRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsa0JBQWtCLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRTtnQkFDbEUsT0FBTztnQkFDUCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7Z0JBQ2hDLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQyxDQUFDO1lBRUgsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNyRCxNQUFNLEdBQUcsR0FBRztnQkFDVixFQUFFLEVBQUUsQ0FBQztnQkFDTCxJQUFJLEVBQUUsV0FBVzthQUNsQixDQUFDO1lBQ0YsTUFBTSxjQUFjLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxHQUFHLGdCQUFnQixFQUFFO2dCQUN6RCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3pCLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLE1BQU07YUFDZixDQUFDLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMzQyxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsa0JBQWtCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQ3BFLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLFFBQVE7YUFDakIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2xELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyxvQ0FBb0MsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUNwRixPQUFPO2dCQUNQLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxhQUFhLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxHQUFHLHNDQUFzQyxFQUFFO2dCQUM5RSxPQUFPO2dCQUNQLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQyxDQUFDO1lBRUgsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckMsTUFBTSxXQUFXLEdBQUcsTUFBTSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIn0=