@modelprofile.com/flexharness 11.3.1 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/classes.flexharness.core.d.ts +4 -0
  3. package/dist_ts/classes.flexharness.core.js +69 -25
  4. package/dist_ts/classes.flexharness.imports.js +4 -3
  5. package/dist_ts/classes.flexharness.reversions.d.ts +7 -1
  6. package/dist_ts/classes.flexharness.reversions.js +43 -29
  7. package/dist_ts/classes.flexharness.sessions.js +2 -6
  8. package/dist_ts/classes.stores.js +20 -18
  9. package/dist_ts/index.d.ts +1 -0
  10. package/dist_ts/index.js +2 -1
  11. package/dist_ts/interfaces.d.ts +24 -2
  12. package/dist_ts/interfaces.flexharness.d.ts +8 -1
  13. package/dist_ts/interfaces.js +1 -1
  14. package/dist_ts/plugins.d.ts +3 -3
  15. package/dist_ts/plugins.js +3 -3
  16. package/dist_ts/utils.projectionchange.d.ts +34 -0
  17. package/dist_ts/utils.projectionchange.js +135 -0
  18. package/dist_ts/utils.storecodecs.d.ts +10 -3
  19. package/dist_ts/utils.storecodecs.js +29 -4
  20. package/dist_ts/utils.storerules.d.ts +1 -1
  21. package/dist_ts/utils.storerules.js +1 -1
  22. package/dist_ts_migration/v3_legacyflexharness.js +6 -5
  23. package/dist_ts_stores_nosqldb/classes.nosqldbstores.d.ts +5 -4
  24. package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +44 -25
  25. package/dist_ts_stores_nosqldb/classes.recordstore.d.ts +152 -20
  26. package/dist_ts_stores_nosqldb/classes.recordstore.js +369 -66
  27. package/dist_ts_stores_nosqldb/index.d.ts +1 -1
  28. package/dist_ts_stores_nosqldb/index.js +2 -2
  29. package/dist_ts_stores_nosqldb/plugins.d.ts +1 -1
  30. package/dist_ts_stores_nosqldb/plugins.js +1 -1
  31. package/dist_ts_stores_testing/contract.d.ts +33 -0
  32. package/dist_ts_stores_testing/contract.js +566 -0
  33. package/dist_ts_stores_testing/fixtures.d.ts +20 -0
  34. package/dist_ts_stores_testing/fixtures.js +112 -0
  35. package/dist_ts_stores_testing/index.d.ts +2 -0
  36. package/dist_ts_stores_testing/index.js +3 -0
  37. package/dist_ts_stores_testing/plugins.d.ts +5 -0
  38. package/dist_ts_stores_testing/plugins.js +7 -0
  39. package/dist_ts_typedrequest/catalog.d.ts +4 -4
  40. package/dist_ts_typedrequest/catalog.js +25 -7
  41. package/dist_ts_typedrequest/describe.js +23 -11
  42. package/dist_ts_typedrequest/interfaces.d.ts +17 -1
  43. package/package.json +9 -3
  44. package/readme.md +6 -3
  45. package/ts/00_commitinfo_data.ts +1 -1
  46. package/ts/classes.flexharness.core.ts +74 -24
  47. package/ts/classes.flexharness.imports.ts +3 -2
  48. package/ts/classes.flexharness.reversions.ts +53 -28
  49. package/ts/classes.flexharness.sessions.ts +2 -5
  50. package/ts/classes.stores.ts +40 -37
  51. package/ts/index.ts +5 -0
  52. package/ts/interfaces.flexharness.ts +8 -1
  53. package/ts/interfaces.ts +27 -2
  54. package/ts/plugins.ts +12 -7
  55. package/ts/readme.md +6 -3
  56. package/ts/utils.projectionchange.ts +190 -0
  57. package/ts/utils.storecodecs.ts +42 -7
  58. package/ts/utils.storerules.ts +2 -2
  59. package/ts_migration/v3_legacyflexharness.ts +11 -6
  60. package/ts_stores_nosqldb/classes.nosqldbstores.ts +59 -46
  61. package/ts_stores_nosqldb/classes.recordstore.ts +445 -64
  62. package/ts_stores_nosqldb/index.ts +1 -0
  63. package/ts_stores_nosqldb/plugins.ts +4 -3
  64. package/ts_stores_nosqldb/readme.md +6 -2
  65. package/ts_stores_testing/contract.ts +776 -0
  66. package/ts_stores_testing/fixtures.ts +127 -0
  67. package/ts_stores_testing/index.ts +17 -0
  68. package/ts_stores_testing/plugins.ts +20 -0
  69. package/ts_stores_testing/readme.md +62 -0
  70. package/ts_typedrequest/catalog.ts +24 -6
  71. package/ts_typedrequest/describe.ts +19 -10
  72. package/ts_typedrequest/interfaces.ts +21 -1
  73. package/ts_typedrequest/readme.md +5 -3
@@ -0,0 +1,566 @@
1
+ import * as plugins from './plugins.js';
2
+ import { FlexHarnessStoreConflictError, FlexHarnessStoreFormatError, FlexHarnessValidationError, } from '../dist_ts/errors.js';
3
+ import { createWholeProjectionChange } from '../dist_ts/utils.projectionchange.js';
4
+ import { agentEvent, appendEvents, finishedJob, permissionSnapshot, projectionSnapshot, projectionWithRuns, runMessages, runSegment, scopeSnapshot, } from './fixtures.js';
5
+ function liveProjectState(generation, revision = 1, sequence = 1) {
6
+ return {
7
+ schemaVersion: 1,
8
+ revision,
9
+ sessionGenerationId: generation,
10
+ sessionGenerationSequence: sequence,
11
+ scratchpad: '',
12
+ tasks: [],
13
+ };
14
+ }
15
+ function projectTombstone(generation, revision = 1, sequence = 1) {
16
+ return {
17
+ schemaVersion: 1,
18
+ revision,
19
+ sessionGenerationId: generation,
20
+ sessionGenerationSequence: sequence,
21
+ deletedAt: '2026-08-14T00:00:00.000Z',
22
+ };
23
+ }
24
+ /** Exactly one of `attempts` succeeded and another was rejected with `errorClass`. */
25
+ function assertOneWinner(attempts, errorClass) {
26
+ plugins.assert.equal(attempts.filter((result) => result.status === 'fulfilled').length, 1);
27
+ const rejection = attempts.find((result) => result.status === 'rejected');
28
+ plugins.assert.ok(rejection?.reason instanceof errorClass, `expected a ${errorClass.name}, got ${String(rejection?.reason)}`);
29
+ }
30
+ /**
31
+ * `operation` fails as an awaiting caller sees it: FlexHarness awaits every store call, so a store
32
+ * may reject or throw.
33
+ */
34
+ function assertRejects(operation, expected) {
35
+ return expected === undefined
36
+ ? plugins.assert.rejects(async () => operation())
37
+ : plugins.assert.rejects(async () => operation(), expected);
38
+ }
39
+ /** `operation` rejects with `errorClass` and a message that contains `text`. */
40
+ async function assertRejectsWith(operation, errorClass, text) {
41
+ await assertRejects(operation, (error) => {
42
+ plugins.assert.ok(error instanceof errorClass, `expected a ${errorClass.name}, got ${String(error)}`);
43
+ plugins.assert.ok(error.message.includes(text), `expected "${text}" in: ${error.message}`);
44
+ return true;
45
+ });
46
+ }
47
+ /**
48
+ * A store may check a change against the stored value when it saves it or when it next loads the
49
+ * value; either way the change must not load. Returns which of the two rejected it.
50
+ */
51
+ async function assertChangeRejected(save, load) {
52
+ try {
53
+ await save();
54
+ }
55
+ catch (error) {
56
+ plugins.assert.ok(error instanceof FlexHarnessStoreFormatError, `expected a format error, got ${String(error)}`);
57
+ return 'save';
58
+ }
59
+ await assertRejects(load, FlexHarnessStoreFormatError);
60
+ return 'load';
61
+ }
62
+ /**
63
+ * The behaviour every `IFlexHarnessStores` implementation shares, as test cases for any runner.
64
+ * Each case opens its own fixture, so backends need no cleanup between cases.
65
+ */
66
+ export function createFlexStoreContractTests(backend) {
67
+ const tests = [];
68
+ const contractTest = (title, body) => {
69
+ tests.push({
70
+ title: `${backend.name}: ${title}`,
71
+ async run() {
72
+ const fixture = await backend.open();
73
+ try {
74
+ await body(fixture);
75
+ }
76
+ finally {
77
+ await fixture.close();
78
+ }
79
+ },
80
+ });
81
+ };
82
+ contractTest('scope store clones snapshots and enforces CAS', async ({ stores }) => {
83
+ plugins.assert.equal(await stores.scopes.load('scope'), undefined);
84
+ const first = scopeSnapshot(1);
85
+ await stores.scopes.save('scope', first, 0);
86
+ first.sessions[0].status = 'failed';
87
+ const loaded = await stores.scopes.load('scope');
88
+ plugins.assert.ok(loaded);
89
+ plugins.assert.equal(loaded.sessions[0].status, 'idle');
90
+ loaded.sessions[0].status = 'failed';
91
+ plugins.assert.equal((await stores.scopes.load('scope'))?.sessions[0].status, 'idle');
92
+ assertOneWinner(await Promise.allSettled([
93
+ stores.scopes.save('scope', scopeSnapshot(2, 'session-a'), 1),
94
+ stores.scopes.save('scope', scopeSnapshot(2, 'session-b'), 1),
95
+ ]), FlexHarnessStoreConflictError);
96
+ plugins.assert.equal((await stores.scopes.load('scope'))?.revision, 2);
97
+ });
98
+ contractTest('saves require the next revision and report the stored one', async ({ stores }) => {
99
+ await assertRejects(() => stores.scopes.save('scope', scopeSnapshot(2), 0), FlexHarnessStoreFormatError);
100
+ await assertRejects(() => stores.scopes.save('scope', scopeSnapshot(0), -1), FlexHarnessValidationError);
101
+ plugins.assert.equal(await stores.scopes.load('scope'), undefined);
102
+ const saveProjection = (revision, expectedRevision) => stores.projections.save('scope', 'session-1', createWholeProjectionChange(projectionSnapshot(revision)), expectedRevision);
103
+ await saveProjection(1, 0);
104
+ await saveProjection(2, 1);
105
+ await assertRejects(() => saveProjection(4, 2), FlexHarnessStoreFormatError);
106
+ await assertRejects(() => saveProjection(2, 1), (error) => {
107
+ plugins.assert.ok(error instanceof FlexHarnessStoreConflictError);
108
+ plugins.assert.equal(error.expectedRevision, 1);
109
+ plugins.assert.equal(error.actualRevision, 2);
110
+ return true;
111
+ });
112
+ plugins.assert.equal((await stores.projections.load('scope', 'session-1'))?.revision, 2);
113
+ await stores.permissions.save('scope', 'session-1', permissionSnapshot(1), 0);
114
+ await assertRejects(() => stores.permissions.save('scope', 'session-1', permissionSnapshot(1), 0), FlexHarnessStoreConflictError);
115
+ });
116
+ contractTest('session records are exact per storage key and session', async ({ stores }) => {
117
+ const projection = createWholeProjectionChange(projectionSnapshot(1));
118
+ await stores.projections.save('namespace-a', 'session', projection, 0);
119
+ await stores.permissions.save('namespace-a', 'session', permissionSnapshot(1), 0);
120
+ plugins.assert.equal(await stores.projections.load('namespace-b', 'session'), undefined);
121
+ plugins.assert.equal(await stores.permissions.load('namespace-b', 'session'), undefined);
122
+ plugins.assert.equal(await stores.projections.load('namespace-a', 'other'), undefined);
123
+ await stores.projections.save('namespace-b', 'session', projection, 0);
124
+ const eventsA = await stores.agentEvents.getStore('namespace-a', 'session');
125
+ const eventsB = await stores.agentEvents.getStore('namespace-b', 'session');
126
+ await eventsA.save('session', appendEvents(agentEvent('event-a')), 0);
127
+ plugins.assert.equal(await eventsB.load('session'), undefined);
128
+ await stores.projections.deleteSession('namespace-a', 'session');
129
+ plugins.assert.equal(await stores.projections.load('namespace-a', 'session'), undefined);
130
+ plugins.assert.equal((await stores.projections.load('namespace-b', 'session'))?.revision, 1);
131
+ });
132
+ contractTest('split session domains stay independent', async ({ stores }) => {
133
+ await stores.scopes.save('scope', scopeSnapshot(1), 0);
134
+ await stores.projections.save('scope', 'session-1', createWholeProjectionChange(projectionSnapshot(1)), 0);
135
+ await stores.permissions.save('scope', 'session-1', permissionSnapshot(1), 0);
136
+ const eventStore = await stores.agentEvents.getStore('scope', 'session-1');
137
+ const jobStore = await stores.jobs.getStore('scope', 'session-1');
138
+ plugins.assert.equal(await eventStore.save('session-1', appendEvents(), 0), 1);
139
+ plugins.assert.equal(await jobStore.save([], 0), 1);
140
+ plugins.assert.equal((await stores.scopes.load('scope'))?.sessions.length, 1);
141
+ plugins.assert.equal((await stores.projections.load('scope', 'session-1'))?.revision, 1);
142
+ plugins.assert.deepEqual((await stores.permissions.load('scope', 'session-1'))?.rememberedPermissionKeys, ['shell:approved']);
143
+ plugins.assert.equal((await eventStore.load('session-1'))?.revision, 1);
144
+ plugins.assert.equal((await jobStore.load())?.revision, 1);
145
+ plugins.assert.equal(await stores.projections.load('scope', 'another-session'), undefined);
146
+ await Promise.all([
147
+ stores.projections.deleteSession('scope', 'session-1'),
148
+ stores.permissions.deleteSession('scope', 'session-1'),
149
+ stores.agentEvents.deleteSession('scope', 'session-1'),
150
+ stores.jobs.deleteSession('scope', 'session-1'),
151
+ ]);
152
+ plugins.assert.equal(await stores.projections.load('scope', 'session-1'), undefined);
153
+ plugins.assert.equal(await stores.permissions.load('scope', 'session-1'), undefined);
154
+ plugins.assert.equal(await eventStore.load('session-1'), undefined);
155
+ plugins.assert.equal(await jobStore.load(), undefined);
156
+ plugins.assert.notEqual(await stores.agentEvents.getStore('scope', 'session-1'), eventStore);
157
+ plugins.assert.notEqual(await stores.jobs.getStore('scope', 'session-1'), jobStore);
158
+ plugins.assert.equal((await stores.scopes.load('scope'))?.sessions.length, 1);
159
+ await stores.agentEvents.deleteSession('scope', 'unknown');
160
+ await stores.jobs.deleteSession('scope', 'unknown');
161
+ const unknownEventStore = await stores.agentEvents.getStore('scope', 'unknown');
162
+ const unknownJobStore = await stores.jobs.getStore('scope', 'unknown');
163
+ await stores.agentEvents.deleteSession('scope', 'unknown');
164
+ await stores.jobs.deleteSession('scope', 'unknown');
165
+ plugins.assert.notEqual(await stores.agentEvents.getStore('scope', 'unknown'), unknownEventStore);
166
+ plugins.assert.notEqual(await stores.jobs.getStore('scope', 'unknown'), unknownJobStore);
167
+ });
168
+ contractTest('stores reject non-serializable snapshots at their boundary', async ({ stores }) => {
169
+ const invalid = scopeSnapshot(1);
170
+ invalid.nonJson = new Date();
171
+ await assertRejects(() => stores.scopes.save('scope', invalid, 0), FlexHarnessStoreFormatError);
172
+ });
173
+ contractTest('projection saves apply list changes to the stored lists', async ({ stores }) => {
174
+ const save = (change, expectedRevision) => stores.projections.save('scope', 'session-1', change, expectedRevision);
175
+ const load = () => stores.projections.load('scope', 'session-1');
176
+ await save(createWholeProjectionChange(projectionWithRuns(1, ['run-1'])), 0);
177
+ const appended = projectionWithRuns(2, ['run-1', 'run-2']);
178
+ await save({
179
+ ...appended,
180
+ messages: { start: 0, end: 2, items: runMessages('run-2') },
181
+ reversionSegments: { start: 0, end: 1, items: [runSegment('run-2')] },
182
+ }, 1);
183
+ plugins.assert.deepEqual(await load(), appended);
184
+ const trimmed = projectionWithRuns(3, ['run-2', 'run-3']);
185
+ await save({
186
+ ...trimmed,
187
+ messages: { start: 2, end: 4, items: runMessages('run-3') },
188
+ reversionSegments: { start: 1, end: 2, items: [runSegment('run-3')] },
189
+ }, 2);
190
+ plugins.assert.deepEqual(await load(), trimmed);
191
+ const replaced = projectionWithRuns(4, ['run-4']);
192
+ await save(createWholeProjectionChange(replaced), 3);
193
+ plugins.assert.deepEqual(await load(), replaced);
194
+ const emptied = projectionSnapshot(5);
195
+ await save(createWholeProjectionChange(emptied), 4);
196
+ plugins.assert.deepEqual(await load(), emptied);
197
+ });
198
+ contractTest('projection changes are checked in form and against the stored lists', async ({ stores }) => {
199
+ const save = (change, expectedRevision) => stores.projections.save('scope', 'session-1', change, expectedRevision);
200
+ await save(createWholeProjectionChange(projectionWithRuns(1, ['run-1'])), 0);
201
+ const next = projectionWithRuns(2, ['run-1', 'run-2']);
202
+ const whole = createWholeProjectionChange(next);
203
+ const malformed = [
204
+ { ...whole, messages: { start: 1, end: 0, items: next.messages } },
205
+ { ...whole, messages: { start: -1, end: 0, items: next.messages } },
206
+ { ...whole, reversionSegments: { start: 0, end: 0, items: 'segments' } },
207
+ { ...whole, schemaVersion: 2 },
208
+ ];
209
+ for (const change of malformed) {
210
+ await assertRejects(() => save(change, 1), FlexHarnessStoreFormatError);
211
+ }
212
+ plugins.assert.equal((await stores.projections.load('scope', 'session-1'))?.revision, 1);
213
+ const rejectedBy = await assertChangeRejected(() => save({
214
+ ...next,
215
+ messages: { start: 0, end: 4, items: [] },
216
+ reversionSegments: { start: 0, end: 2, items: [] },
217
+ }, 1), () => stores.projections.load('scope', 'session-1'));
218
+ if (rejectedBy === 'save') {
219
+ plugins.assert.equal((await stores.projections.load('scope', 'session-1'))?.revision, 1);
220
+ }
221
+ });
222
+ contractTest('projection validation rejects public attachment payload fields', async ({ stores }) => {
223
+ const invalid = {
224
+ ...projectionSnapshot(1),
225
+ messages: [
226
+ {
227
+ messageId: 'message',
228
+ sessionId: 'session-1',
229
+ runId: 'run',
230
+ role: 'user',
231
+ status: 'completed',
232
+ createdAt: '2026-08-05T00:00:00.000Z',
233
+ parts: [
234
+ {
235
+ partId: 'attachment',
236
+ type: 'attachment',
237
+ attachmentType: 'file',
238
+ source: 'inline-base64',
239
+ data: 'c2VjcmV0',
240
+ },
241
+ ],
242
+ },
243
+ ],
244
+ };
245
+ await assertRejects(() => stores.projections.save('scope', 'session-1', createWholeProjectionChange(invalid), 0), FlexHarnessStoreFormatError);
246
+ });
247
+ contractTest('projection validation rejects malformed reversion ownership and correlation', async ({ stores }) => {
248
+ const base = projectionWithRuns(1, ['run']);
249
+ const segment = base.reversionSegments[0];
250
+ const invalidSnapshots = [
251
+ {
252
+ ...structuredClone(base),
253
+ reversionSegments: [{ ...segment, workspaceCaptured: true, captureId: 'capture' }],
254
+ },
255
+ {
256
+ ...structuredClone(base),
257
+ reversionSegments: [{
258
+ ...segment,
259
+ status: 'capturing',
260
+ workspaceCaptured: true,
261
+ captureId: 'capture',
262
+ }],
263
+ revertCursor: 0,
264
+ },
265
+ {
266
+ ...structuredClone(base),
267
+ messages: [...runMessages('failed'), ...runMessages('run')],
268
+ reversionSegments: [
269
+ { ...runSegment('failed'), status: 'failed', eventIds: ['event-shared'] },
270
+ { ...segment, eventIds: ['event-shared'] },
271
+ ],
272
+ },
273
+ {
274
+ ...structuredClone(base),
275
+ messages: [...runMessages('failed'), ...runMessages('run')],
276
+ reversionSegments: [{ ...runSegment('failed'), status: 'failed' }, segment],
277
+ pendingReversion: {
278
+ kind: 'apply',
279
+ operationId: 'apply',
280
+ direction: 'undo',
281
+ fromCursor: 1,
282
+ toCursor: 0,
283
+ segmentRunIds: ['failed', 'run'],
284
+ appliedRunIds: ['failed'],
285
+ },
286
+ },
287
+ ];
288
+ for (let index = 0; index < invalidSnapshots.length; index++) {
289
+ await assertRejects(() => stores.projections.save(`invalid-reversion-${index}`, 'session-1', createWholeProjectionChange(invalidSnapshots[index]), 0), FlexHarnessStoreFormatError);
290
+ }
291
+ });
292
+ contractTest('projection schema 3 validates protocol-2 metadata, dispositions, and release ownership', async ({ stores }) => {
293
+ const valid = {
294
+ ...projectionWithRuns(1, ['run']),
295
+ reversionSegments: [{
296
+ ...runSegment('run'),
297
+ workspaceCaptured: true,
298
+ protocolVersion: 2,
299
+ provenance: 'workspace',
300
+ disposition: 'no-change',
301
+ affectedWorkspaces: [],
302
+ }],
303
+ };
304
+ await stores.projections.save('valid-schema-3', 'session-1', createWholeProjectionChange(valid), 0);
305
+ plugins.assert.deepEqual(await stores.projections.load('valid-schema-3', 'session-1'), valid);
306
+ const segment = valid.reversionSegments[0];
307
+ const invalid = [
308
+ { ...structuredClone(valid), reversionSegments: [{ ...segment, disposition: 'pending' }] },
309
+ { ...structuredClone(valid), reversionSegments: [{ ...segment, disposition: 'nonrevertible' }] },
310
+ {
311
+ ...structuredClone(valid),
312
+ reversionSegments: [{
313
+ ...segment,
314
+ affectedWorkspaces: [{ id: 'workspace', label: 'Workspace' }],
315
+ }],
316
+ },
317
+ {
318
+ ...structuredClone(valid),
319
+ reversionSegments: [{
320
+ ...segment,
321
+ disposition: 'revertible',
322
+ captureId: 'capture',
323
+ workspaceReference: { capture: true },
324
+ affectedWorkspaces: [{ id: 'workspace', label: 'Workspace' }],
325
+ }],
326
+ pendingReversionReleases: [{
327
+ runId: 'run',
328
+ captureId: 'capture',
329
+ reference: { capture: true },
330
+ protocolVersion: 2,
331
+ }],
332
+ },
333
+ {
334
+ ...structuredClone(valid),
335
+ reversionSegments: [{
336
+ ...segment,
337
+ disposition: 'revertible',
338
+ captureId: 'capture-whitespace-id',
339
+ workspaceReference: { capture: true },
340
+ affectedWorkspaces: [{ id: ' ', label: 'Workspace' }],
341
+ }],
342
+ },
343
+ {
344
+ ...structuredClone(valid),
345
+ reversionSegments: [{
346
+ ...segment,
347
+ disposition: 'revertible',
348
+ captureId: 'capture-whitespace-label',
349
+ workspaceReference: { capture: true },
350
+ affectedWorkspaces: [{ id: 'workspace', label: '\t' }],
351
+ }],
352
+ },
353
+ {
354
+ ...structuredClone(valid),
355
+ reversionSegments: [{ ...segment, disposition: 'nonrevertible', reasonCode: 'git conflict' }],
356
+ },
357
+ ];
358
+ for (let index = 0; index < invalid.length; index++) {
359
+ await assertRejects(() => stores.projections.save(`invalid-schema-3-${index}`, 'session-1', createWholeProjectionChange(invalid[index]), 0), FlexHarnessStoreFormatError);
360
+ }
361
+ });
362
+ contractTest('Agent event saves apply removals, replacements and appends', async ({ stores }) => {
363
+ const eventStore = await stores.agentEvents.getStore('scope', 'session');
364
+ plugins.assert.equal(await eventStore.save('session', appendEvents(agentEvent('first'), agentEvent('second')), 0), 1);
365
+ const replacement = agentEvent('second', 'Replaced prompt');
366
+ plugins.assert.equal(await eventStore.save('session', {
367
+ remove: ['first'],
368
+ replace: [replacement],
369
+ append: [agentEvent('third')],
370
+ }, 1), 2);
371
+ const snapshot = await eventStore.load('session');
372
+ plugins.assert.ok(snapshot);
373
+ plugins.assert.equal(snapshot.revision, 2);
374
+ plugins.assert.deepEqual(snapshot.events, [replacement, agentEvent('third')]);
375
+ const rejectedBy = await assertChangeRejected(() => eventStore.save('session', { remove: ['first'], replace: [], append: [] }, 2), () => eventStore.load('session'));
376
+ if (rejectedBy === 'save')
377
+ plugins.assert.equal((await eventStore.load('session'))?.revision, 2);
378
+ });
379
+ contractTest('Agent stores validate every change after strict JSON safety', async ({ stores }) => {
380
+ const eventStore = await stores.agentEvents.getStore('scope', 'session');
381
+ plugins.assert.ok(eventStore.archive, `${backend.name} Agent event stores must archive.`);
382
+ const canonicalEvent = agentEvent();
383
+ plugins.assert.equal(canonicalEvent.sequence, undefined);
384
+ plugins.assert.equal(await eventStore.save('session', appendEvents(canonicalEvent), 0), 1);
385
+ await eventStore.archive({
386
+ schemaVersion: 2,
387
+ sessionId: 'session',
388
+ archiveId: 'archive',
389
+ createdAt: 1,
390
+ events: [canonicalEvent],
391
+ });
392
+ const malformedEvent = { ...canonicalEvent, id: 'malformed', content: 42 };
393
+ await assertRejectsWith(() => eventStore.save('session', appendEvents(malformedEvent), 1), FlexHarnessStoreFormatError, 'append[0].content');
394
+ await assertRejectsWith(() => eventStore.archive({
395
+ schemaVersion: 2,
396
+ sessionId: 'session',
397
+ archiveId: 'malformed',
398
+ createdAt: 1,
399
+ events: [malformedEvent],
400
+ }), FlexHarnessStoreFormatError, 'Agent event archive events[0].content');
401
+ const unsafeEvent = { ...canonicalEvent, id: 'unsafe', content: new Date() };
402
+ await assertRejectsWith(() => eventStore.save('session', appendEvents(unsafeEvent), 1), FlexHarnessStoreFormatError, '$change.append[0].content');
403
+ plugins.assert.equal((await eventStore.load('session'))?.revision, 1);
404
+ });
405
+ contractTest('Agent event stores are session-bound, CAS-safe, and archive once', async ({ stores }) => {
406
+ const eventStore = await stores.agentEvents.getStore('scope', 'session');
407
+ plugins.assert.ok(eventStore.archive && eventStore.loadArchive, `${backend.name} Agent event stores must archive.`);
408
+ await assertRejects(() => eventStore.load('other-session'), FlexHarnessValidationError);
409
+ plugins.assert.equal(await eventStore.save('session', appendEvents(agentEvent('first')), 0), 1);
410
+ await assertRejects(() => eventStore.save('session', appendEvents(agentEvent('second')), 0), (error) => {
411
+ plugins.assert.ok(error instanceof plugins.AgentEventStoreConflictError);
412
+ plugins.assert.equal(error.actualRevision, 1);
413
+ return true;
414
+ });
415
+ plugins.assert.equal(await eventStore.save('session', appendEvents(agentEvent('second')), 1), 2);
416
+ const snapshot = await eventStore.load('session');
417
+ plugins.assert.ok(snapshot);
418
+ plugins.assert.equal(snapshot.schemaVersion, 2);
419
+ plugins.assert.equal(snapshot.revision, 2);
420
+ plugins.assert.deepEqual(snapshot.events.map((event) => event.id), ['first', 'second']);
421
+ const archive = {
422
+ schemaVersion: 2,
423
+ sessionId: 'session',
424
+ archiveId: 'archive',
425
+ createdAt: 1,
426
+ events: [agentEvent('first')],
427
+ };
428
+ plugins.assert.equal(await eventStore.loadArchive('session', 'archive'), undefined);
429
+ await eventStore.archive(archive);
430
+ await eventStore.archive(structuredClone(archive));
431
+ plugins.assert.deepEqual(await eventStore.loadArchive('session', 'archive'), archive);
432
+ await assertRejects(() => eventStore.archive({ ...archive, events: [agentEvent('second')] }));
433
+ plugins.assert.equal((await eventStore.loadArchive('session', 'archive'))?.events[0].id, 'first');
434
+ await stores.agentEvents.deleteSession('scope', 'session');
435
+ const reopened = await stores.agentEvents.getStore('scope', 'session');
436
+ plugins.assert.equal(await reopened.load('session'), undefined);
437
+ plugins.assert.equal(await reopened.loadArchive?.('session', 'archive'), undefined);
438
+ });
439
+ contractTest('tool job stores are CAS-safe and honour abort signals', async ({ stores }) => {
440
+ const jobStore = await stores.jobs.getStore('scope', 'session');
441
+ plugins.assert.equal(await jobStore.save([finishedJob()], 0), 1);
442
+ await assertRejects(() => jobStore.save([], 0), (error) => {
443
+ plugins.assert.ok(error instanceof plugins.ToolJobStoreConflictError);
444
+ plugins.assert.equal(error.actualRevision, 1);
445
+ return true;
446
+ });
447
+ const snapshot = await jobStore.load();
448
+ plugins.assert.ok(snapshot);
449
+ plugins.assert.equal(snapshot.revision, 1);
450
+ plugins.assert.deepEqual(snapshot.jobs, [finishedJob()]);
451
+ const aborted = AbortSignal.abort(new Error('caller aborted'));
452
+ await assertRejects(() => jobStore.load(aborted), { message: 'caller aborted' });
453
+ await assertRejects(() => jobStore.save([], 1, aborted), { message: 'caller aborted' });
454
+ plugins.assert.equal((await jobStore.load())?.revision, 1);
455
+ });
456
+ contractTest('project stores fence session generations and tombstones', async ({ stores }) => {
457
+ const store = stores.projectManagement;
458
+ const application = { actor: 'application' };
459
+ await store.save('namespace', 'session', liveProjectState('generation-a'), 0, application);
460
+ await assertRejects(() => store.save('namespace', 'session', liveProjectState('generation-a'), 0, application), FlexHarnessStoreConflictError);
461
+ await store.save('namespace', 'session', liveProjectState('generation-a', 2), 1, {
462
+ actor: 'agent',
463
+ runId: 'run',
464
+ toolCallId: 'tool-call',
465
+ });
466
+ await store.tombstoneSession('namespace', 'session', projectTombstone('generation-a', 3), 2);
467
+ await store.tombstoneSession('namespace', 'session', projectTombstone('generation-a', 3), 2);
468
+ plugins.assert.deepEqual(await store.load('namespace', 'session'), projectTombstone('generation-a', 3));
469
+ await assertRejects(() => store.save('namespace', 'session', liveProjectState('generation-a', 4), 3, application), FlexHarnessStoreConflictError);
470
+ const replacement = liveProjectState('generation-b', 1, 2);
471
+ await store.save('namespace', 'session', replacement, 0, application);
472
+ plugins.assert.deepEqual(await store.load('namespace', 'session'), replacement);
473
+ await assertRejects(() => store.save('namespace', 'session', liveProjectState('generation-c'), 0, application), FlexHarnessStoreConflictError);
474
+ await assertRejects(() => store.tombstoneSession('namespace', 'session', projectTombstone('generation-a'), 0), FlexHarnessStoreConflictError);
475
+ });
476
+ contractTest('project stores purge one exact namespace without affecting another', async ({ stores }) => {
477
+ const store = stores.projectManagement;
478
+ const application = { actor: 'application' };
479
+ await store.save('namespace-a', 'same-id', liveProjectState('a-live'), 0, application);
480
+ await store.tombstoneSession('namespace-a', 'tombstoned', projectTombstone('a-tombstone'), 0);
481
+ await store.save('namespace-b', 'same-id', liveProjectState('b-live'), 0, application);
482
+ await store.tombstoneSession('namespace-b', 'tombstoned', projectTombstone('b-tombstone'), 0);
483
+ await store.tombstoneSession('namespace-b', 'generation-fence', projectTombstone('old-generation'), 0);
484
+ await store.save('namespace-b', 'generation-fence', liveProjectState('new-generation', 1, 2), 0, application);
485
+ await assertRejects(() => store.tombstoneSession('namespace-b', 'generation-fence', projectTombstone('old-generation'), 0), FlexHarnessStoreConflictError);
486
+ await store.purgeNamespace('namespace-a');
487
+ plugins.assert.equal(await store.load('namespace-a', 'same-id'), undefined);
488
+ plugins.assert.equal(await store.load('namespace-a', 'tombstoned'), undefined);
489
+ plugins.assert.notEqual(await store.load('namespace-b', 'same-id'), undefined);
490
+ plugins.assert.notEqual(await store.load('namespace-b', 'tombstoned'), undefined);
491
+ });
492
+ if (backend.storesResults)
493
+ contractTest('result stores write each handle once, clone values, list and delete them', async ({ stores }) => {
494
+ const results = stores.results;
495
+ plugins.assert.ok(results, `${backend.name} declares storesResults without a result store.`);
496
+ const large = { items: Array.from({ length: 2000 }, (_, index) => ({ index, text: 'x'.repeat(600) })) };
497
+ plugins.assert.equal(await results.load('scope', 'session-1', 'res_1'), undefined);
498
+ await results.save('scope', 'session-1', 'res_1', large);
499
+ await results.save('scope', 'session-2', 'res_1', 'other session');
500
+ const loaded = (await results.load('scope', 'session-1', 'res_1'));
501
+ plugins.assert.deepEqual(loaded, large);
502
+ loaded.items[0].text = 'changed';
503
+ plugins.assert.equal((await results.load('scope', 'session-1', 'res_1')).items[0].text, 'x'.repeat(600));
504
+ await assertRejects(() => results.save('scope', 'session-1', 'res_1', 'again'), FlexHarnessStoreConflictError);
505
+ await results.save('scope', 'session-1', 'res_2', 2);
506
+ await results.save('scope', 'session-1', 'res_3', 3);
507
+ plugins.assert.deepEqual(await results.list('scope', 'session-1'), ['res_1', 'res_2', 'res_3']);
508
+ await results.delete('scope', 'session-1', 'res_2');
509
+ plugins.assert.deepEqual(await results.list('scope', 'session-1'), ['res_1', 'res_3']);
510
+ plugins.assert.equal(await results.load('scope', 'session-1', 'res_2'), undefined);
511
+ plugins.assert.equal(await results.load('scope', 'session-1', 'res_3'), 3);
512
+ await results.deleteSession('scope', 'session-1');
513
+ plugins.assert.equal(await results.load('scope', 'session-1', 'res_1'), undefined);
514
+ plugins.assert.deepEqual(await results.list('scope', 'session-1'), []);
515
+ plugins.assert.equal(await results.load('scope', 'session-2', 'res_1'), 'other session');
516
+ plugins.assert.deepEqual(await results.list('scope', 'session-2'), ['res_1']);
517
+ });
518
+ if (backend.releasesSessions)
519
+ contractTest('provider release evicts wrappers without deleting persisted session data', async ({ stores }) => {
520
+ const eventStore = await stores.agentEvents.getStore('release', 'session');
521
+ const jobStore = await stores.jobs.getStore('release', 'session');
522
+ await eventStore.save('session', appendEvents(agentEvent()), 0);
523
+ await jobStore.save([], 0);
524
+ plugins.assert.ok(stores.agentEvents.releaseSession && stores.jobs.releaseSession, `${backend.name} declares releasesSessions without releaseSession hooks.`);
525
+ await stores.agentEvents.releaseSession('release', 'session');
526
+ await stores.jobs.releaseSession('release', 'session');
527
+ const reloadedEventStore = await stores.agentEvents.getStore('release', 'session');
528
+ const reloadedJobStore = await stores.jobs.getStore('release', 'session');
529
+ plugins.assert.notEqual(reloadedEventStore, eventStore);
530
+ plugins.assert.notEqual(reloadedJobStore, jobStore);
531
+ plugins.assert.equal((await reloadedEventStore.load('session'))?.revision, 1);
532
+ plugins.assert.equal((await reloadedJobStore.load())?.revision, 1);
533
+ });
534
+ if (backend.sharedBackingStore)
535
+ contractTest('bundles over one backing store share CAS revisions', async (fixture) => {
536
+ plugins.assert.ok(fixture.openPeer, `${backend.name} declares sharedBackingStore without openPeer.`);
537
+ const first = fixture.stores;
538
+ const second = await fixture.openPeer();
539
+ assertOneWinner(await Promise.allSettled([
540
+ first.scopes.save('shared', scopeSnapshot(1, 'first'), 0),
541
+ second.scopes.save('shared', scopeSnapshot(1, 'second'), 0),
542
+ ]), FlexHarnessStoreConflictError);
543
+ plugins.assert.deepEqual(await first.scopes.load('shared'), await second.scopes.load('shared'));
544
+ const firstEvents = await first.agentEvents.getStore('shared', 'session');
545
+ const secondEvents = await second.agentEvents.getStore('shared', 'session');
546
+ await firstEvents.save('session', appendEvents(agentEvent('from-first')), 0);
547
+ plugins.assert.equal((await secondEvents.load('session'))?.events[0].id, 'from-first');
548
+ await assertRejects(() => secondEvents.save('session', appendEvents(agentEvent('stale')), 0), plugins.AgentEventStoreConflictError);
549
+ await secondEvents.save('session', appendEvents(agentEvent('from-second')), 1);
550
+ plugins.assert.deepEqual((await firstEvents.load('session'))?.events.map((event) => event.id), ['from-first', 'from-second']);
551
+ const projection = projectionWithRuns(1, ['run-1']);
552
+ await first.projections.save('shared', 'session-1', createWholeProjectionChange(projection), 0);
553
+ const appended = projectionWithRuns(2, ['run-1', 'run-2']);
554
+ await second.projections.save('shared', 'session-1', {
555
+ ...appended,
556
+ messages: { start: 0, end: 2, items: runMessages('run-2') },
557
+ reversionSegments: { start: 0, end: 1, items: [runSegment('run-2')] },
558
+ }, 1);
559
+ plugins.assert.deepEqual(await first.projections.load('shared', 'session-1'), appended);
560
+ await first.permissions.save('shared', 'session', permissionSnapshot(1), 0);
561
+ await second.permissions.deleteSession('shared', 'session');
562
+ plugins.assert.equal(await first.permissions.load('shared', 'session'), undefined);
563
+ });
564
+ return tests;
565
+ }
566
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19zdG9yZXNfdGVzdGluZy9jb250cmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLDJCQUEyQixFQUMzQiwwQkFBMEIsR0FDM0IsTUFBTSxpQkFBaUIsQ0FBQztBQVN6QixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RSxPQUFPLEVBQ0wsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsV0FBVyxFQUNYLFVBQVUsRUFDVixhQUFhLEdBQ2QsTUFBTSxlQUFlLENBQUM7QUFrQ3ZCLFNBQVMsZ0JBQWdCLENBQ3ZCLFVBQWtCLEVBQ2xCLFFBQVEsR0FBRyxDQUFDLEVBQ1osUUFBUSxHQUFHLENBQUM7SUFFWixPQUFPO1FBQ0wsYUFBYSxFQUFFLENBQUM7UUFDaEIsUUFBUTtRQUNSLG1CQUFtQixFQUFFLFVBQVU7UUFDL0IseUJBQXlCLEVBQUUsUUFBUTtRQUNuQyxVQUFVLEVBQUUsRUFBRTtRQUNkLEtBQUssRUFBRSxFQUFFO0tBQ1YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUN2QixVQUFrQixFQUNsQixRQUFRLEdBQUcsQ0FBQyxFQUNaLFFBQVEsR0FBRyxDQUFDO0lBRVosT0FBTztRQUNMLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLFFBQVE7UUFDUixtQkFBbUIsRUFBRSxVQUFVO1FBQy9CLHlCQUF5QixFQUFFLFFBQVE7UUFDbkMsU0FBUyxFQUFFLDBCQUEwQjtLQUN0QyxDQUFDO0FBQ0osQ0FBQztBQUVELHNGQUFzRjtBQUN0RixTQUFTLGVBQWUsQ0FBQyxRQUF5QyxFQUFFLFVBQXVCO0lBQ3pGLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNGLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQW1DLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDO0lBQzNHLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLFlBQVksVUFBVSxFQUFFLGNBQWMsVUFBVSxDQUFDLElBQUksU0FBUyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoSSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxhQUFhLENBQ3BCLFNBQXdCLEVBQ3hCLFFBQXlDO0lBRXpDLE9BQU8sUUFBUSxLQUFLLFNBQVM7UUFDM0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixLQUFLLFVBQVUsaUJBQWlCLENBQzlCLFNBQWlDLEVBQ2pDLFVBQXVCLEVBQ3ZCLElBQVk7SUFFWixNQUFNLGFBQWEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFjLEVBQUUsRUFBRTtRQUNoRCxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLFlBQVksVUFBVSxFQUFFLGNBQWMsVUFBVSxDQUFDLElBQUksU0FBUyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsSUFBSSxTQUFTLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLG9CQUFvQixDQUNqQyxJQUE0QixFQUM1QixJQUE0QjtJQUU1QixJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLFlBQVksMkJBQTJCLEVBQUUsZ0NBQWdDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakgsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNELE1BQU0sYUFBYSxDQUFDLElBQUksRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQzFDLE9BQWtDO0lBRWxDLE1BQU0sS0FBSyxHQUE2QixFQUFFLENBQUM7SUFDM0MsTUFBTSxZQUFZLEdBQUcsQ0FDbkIsS0FBYSxFQUNiLElBQTJELEVBQ3JELEVBQUU7UUFDUixLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ1QsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUU7WUFDbEMsS0FBSyxDQUFDLEdBQUc7Z0JBQ1AsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQztvQkFDSCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdEIsQ0FBQzt3QkFBUyxDQUFDO29CQUNULE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN4QixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLFlBQVksQ0FBQywrQ0FBK0MsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQ2pGLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbkUsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7UUFDcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRCxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4RCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7UUFDckMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV0RixlQUFlLENBQUMsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3RCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDOUQsQ0FBQyxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFDbkMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUMsQ0FBQyxDQUFDO0lBRUgsWUFBWSxDQUFDLDJEQUEyRCxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7UUFDN0YsTUFBTSxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBQ3pHLE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQ3pHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFbkUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxRQUFnQixFQUFFLGdCQUF3QixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDNUYsT0FBTyxFQUNQLFdBQVcsRUFDWCwyQkFBMkIsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUN6RCxnQkFBZ0IsQ0FDakIsQ0FBQztRQUNGLE1BQU0sY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQixNQUFNLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0IsTUFBTSxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFjLEVBQUUsRUFBRTtZQUNqRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLFlBQVksNkJBQTZCLENBQUMsQ0FBQztZQUNsRSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV6RixNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUUsTUFBTSxhQUFhLENBQ2pCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzdFLDZCQUE2QixDQUM5QixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxZQUFZLENBQUMsdURBQXVELEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtRQUN6RixNQUFNLFVBQVUsR0FBRywyQkFBMkIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkUsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3pGLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3pGLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFdkUsTUFBTSxPQUFPLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDNUUsTUFBTSxPQUFPLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDNUUsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3pGLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDLENBQUM7SUFFSCxZQUFZLENBQUMsd0NBQXdDLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtRQUMxRSxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkQsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0csTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sVUFBVSxHQUFHLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0UsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVwRCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekYsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQ3RCLENBQUMsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSx3QkFBd0IsRUFDL0UsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUNuQixDQUFDO1FBQ0YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTNGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNoQixNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDO1lBQ3RELE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUM7WUFDdEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQztZQUN0RCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDO1NBQ2hELENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3JGLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3JGLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNwRSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2RCxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM3RixPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTlFLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEYsTUFBTSxlQUFlLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkUsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0QsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNsRyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUMzRixDQUFDLENBQUMsQ0FBQztJQUVILFlBQVksQ0FBQyw0REFBNEQsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQzlGLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQXVDLENBQUM7UUFDdkUsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzdCLE1BQU0sYUFBYSxDQUNqQixHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBd0MsRUFBRSxDQUFDLENBQUMsRUFDOUUsMkJBQTJCLENBQzVCLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILFlBQVksQ0FBQyx5REFBeUQsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQzNGLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBNkIsRUFBRSxnQkFBd0IsRUFBRSxFQUFFLENBQ3ZFLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDMUUsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU3RSxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMzRCxNQUFNLElBQUksQ0FBQztZQUNULEdBQUcsUUFBUTtZQUNYLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzNELGlCQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFO1NBQ3RFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDTixPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWpELE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzFELE1BQU0sSUFBSSxDQUFDO1lBQ1QsR0FBRyxPQUFPO1lBQ1YsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDM0QsaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUU7U0FDdEUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNOLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFaEQsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRCxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWpELE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxZQUFZLENBQUMscUVBQXFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtRQUN2RyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQTZCLEVBQUUsZ0JBQXdCLEVBQUUsRUFBRSxDQUN2RSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3RSxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN2RCxNQUFNLEtBQUssR0FBRywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxNQUFNLFNBQVMsR0FBNEI7WUFDekMsRUFBRSxHQUFHLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNsRSxFQUFFLEdBQUcsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDbkUsRUFBRSxHQUFHLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBbUIsRUFBRSxFQUFFO1lBQ2pGLEVBQUUsR0FBRyxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQVUsRUFBRTtTQUN4QyxDQUFDO1FBQ0YsS0FBSyxNQUFNLE1BQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUMvQixNQUFNLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLDJCQUEyQixDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFekYsTUFBTSxVQUFVLEdBQUcsTUFBTSxvQkFBb0IsQ0FDM0MsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ1QsR0FBRyxJQUFJO1lBQ1AsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDekMsaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtTQUNuRCxFQUFFLENBQUMsQ0FBQyxFQUNMLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FDcEQsQ0FBQztRQUNGLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0YsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsWUFBWSxDQUFDLGdFQUFnRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7UUFDbEcsTUFBTSxPQUFPLEdBQW1DO1lBQzlDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLFFBQVEsRUFBRTtnQkFDUjtvQkFDRSxTQUFTLEVBQUUsU0FBUztvQkFDcEIsU0FBUyxFQUFFLFdBQVc7b0JBQ3RCLEtBQUssRUFBRSxLQUFLO29CQUNaLElBQUksRUFBRSxNQUFNO29CQUNaLE1BQU0sRUFBRSxXQUFXO29CQUNuQixTQUFTLEVBQUUsMEJBQTBCO29CQUNyQyxLQUFLLEVBQUU7d0JBQ0w7NEJBQ0UsTUFBTSxFQUFFLFlBQVk7NEJBQ3BCLElBQUksRUFBRSxZQUFZOzRCQUNsQixjQUFjLEVBQUUsTUFBTTs0QkFDdEIsTUFBTSxFQUFFLGVBQWU7NEJBQ3ZCLElBQUksRUFBRSxVQUFVO3lCQUNSO3FCQUNYO2lCQUNGO2FBQ0Y7U0FDRixDQUFDO1FBQ0YsTUFBTSxhQUFhLENBQ2pCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsMkJBQTJCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzVGLDJCQUEyQixDQUM1QixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxZQUFZLENBQUMsNkVBQTZFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtRQUMvRyxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxNQUFNLGdCQUFnQixHQUFxQztZQUN6RDtnQkFDRSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3hCLGlCQUFpQixFQUFFLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDO2FBQ25GO1lBQ0Q7Z0JBQ0UsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO2dCQUN4QixpQkFBaUIsRUFBRSxDQUFDO3dCQUNsQixHQUFHLE9BQU87d0JBQ1YsTUFBTSxFQUFFLFdBQVc7d0JBQ25CLGlCQUFpQixFQUFFLElBQUk7d0JBQ3ZCLFNBQVMsRUFBRSxTQUFTO3FCQUNyQixDQUFDO2dCQUNGLFlBQVksRUFBRSxDQUFDO2FBQ2hCO1lBQ0Q7Z0JBQ0UsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO2dCQUN4QixRQUFRLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0QsaUJBQWlCLEVBQUU7b0JBQ2pCLEVBQUUsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRTtvQkFDekUsRUFBRSxHQUFHLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRTtpQkFDM0M7YUFDRjtZQUNEO2dCQUNFLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQztnQkFDeEIsUUFBUSxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNELGlCQUFpQixFQUFFLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsT0FBTyxDQUFDO2dCQUMzRSxnQkFBZ0IsRUFBRTtvQkFDaEIsSUFBSSxFQUFFLE9BQU87b0JBQ2IsV0FBVyxFQUFFLE9BQU87b0JBQ3BCLFNBQVMsRUFBRSxNQUFNO29CQUNqQixVQUFVLEVBQUUsQ0FBQztvQkFDYixRQUFRLEVBQUUsQ0FBQztvQkFDWCxhQUFhLEVBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDO29CQUNoQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUM7aUJBQzFCO2FBQ0Y7U0FDRixDQUFDO1FBQ0YsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzdELE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUMvQyxxQkFBcUIsS0FBSyxFQUFFLEVBQzVCLFdBQVcsRUFDWCwyQkFBMkIsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNwRCxDQUFDLENBQ0YsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILFlBQVksQ0FBQyx3RkFBd0YsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQzFILE1BQU0sS0FBSyxHQUFtQztZQUM1QyxHQUFHLGtCQUFrQixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLGlCQUFpQixFQUFFLENBQUM7b0JBQ2xCLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztvQkFDcEIsaUJBQWlCLEVBQUUsSUFBSTtvQkFDdkIsZUFBZSxFQUFFLENBQUM7b0JBQ2xCLFVBQVUsRUFBRSxXQUFXO29CQUN2QixXQUFXLEVBQUUsV0FBVztvQkFDeEIsa0JBQWtCLEVBQUUsRUFBRTtpQkFDdkIsQ0FBQztTQUNILENBQUM7UUFDRixNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsRUFBRSwyQkFBMkIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTlGLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLE9BQU8sR0FBcUM7WUFDaEQsRUFBRSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUU7WUFDMUYsRUFBRSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUU7WUFDaEc7Z0JBQ0UsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO2dCQUN6QixpQkFBaUIsRUFBRSxDQUFDO3dCQUNsQixHQUFHLE9BQU87d0JBQ1Ysa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDO3FCQUM5RCxDQUFDO2FBQ0g7WUFDRDtnQkFDRSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3pCLGlCQUFpQixFQUFFLENBQUM7d0JBQ2xCLEdBQUcsT0FBTzt3QkFDVixXQUFXLEVBQUUsWUFBWTt3QkFDekIsU0FBUyxFQUFFLFNBQVM7d0JBQ3BCLGtCQUFrQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTt3QkFDckMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDO3FCQUM5RCxDQUFDO2dCQUNGLHdCQUF3QixFQUFFLENBQUM7d0JBQ3pCLEtBQUssRUFBRSxLQUFLO3dCQUNaLFNBQVMsRUFBRSxTQUFTO3dCQUNwQixTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO3dCQUM1QixlQUFlLEVBQUUsQ0FBQztxQkFDbkIsQ0FBQzthQUNIO1lBQ0Q7Z0JBQ0UsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO2dCQUN6QixpQkFBaUIsRUFBRSxDQUFDO3dCQUNsQixHQUFHLE9BQU87d0JBQ1YsV0FBVyxFQUFFLFlBQVk7d0JBQ3pCLFNBQVMsRUFBRSx1QkFBdUI7d0JBQ2xDLGtCQUFrQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTt3QkFDckMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDO3FCQUN4RCxDQUFDO2FBQ0g7WUFDRDtnQkFDRSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3pCLGlCQUFpQixFQUFFLENBQUM7d0JBQ2xCLEdBQUcsT0FBTzt3QkFDVixXQUFXLEVBQUUsWUFBWTt3QkFDekIsU0FBUyxFQUFFLDBCQUEwQjt3QkFDckMsa0JBQWtCLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO3dCQUNyQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7cUJBQ3ZELENBQUM7YUFDSDtZQUNEO2dCQUNFLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQztnQkFDekIsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxDQUFDO2FBQzlGO1NBQ0YsQ0FBQztRQUNGLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDcEQsTUFBTSxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQy9DLG9CQUFvQixLQUFLLEVBQUUsRUFDM0IsV0FBVyxFQUNYLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUMzQyxDQUFDLENBQ0YsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILFlBQVksQ0FBQyw0REFBNEQsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQzlGLE1BQU0sVUFBVSxHQUFHLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0SCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDNUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNwRCxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDakIsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDO1lBQ3RCLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QixFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1YsTUFBTSxRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlFLE1BQU0sVUFBVSxHQUFHLE1BQU0sb0JBQW9CLENBQzNDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQ25GLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQ2pDLENBQUM7UUFDRixJQUFJLFVBQVUsS0FBSyxNQUFNO1lBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkcsQ0FBQyxDQUFDLENBQUM7SUFFSCxZQUFZLENBQUMsNkRBQTZELEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtRQUMvRixNQUFNLFVBQVUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6RSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksbUNBQW1DLENBQUMsQ0FBQztRQUMxRixNQUFNLGNBQWMsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUVwQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNGLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUN2QixhQUFhLEVBQUUsQ0FBQztZQUNoQixTQUFTLEVBQUUsU0FBUztZQUNwQixTQUFTLEVBQUUsU0FBUztZQUNwQixTQUFTLEVBQUUsQ0FBQztZQUNaLE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQztTQUN6QixDQUFDLENBQUM7UUFFSCxNQUFNLGNBQWMsR0FBRyxFQUFFLEdBQUcsY0FBYyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBb0MsQ0FBQztRQUM3RyxNQUFNLGlCQUFpQixDQUNyQixHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2pFLDJCQUEyQixFQUMzQixtQkFBbUIsQ0FDcEIsQ0FBQztRQUNGLE1BQU0saUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQVEsQ0FBQztZQUNoRCxhQUFhLEVBQUUsQ0FBQztZQUNoQixTQUFTLEVBQUUsU0FBUztZQUNwQixTQUFTLEVBQUUsV0FBVztZQUN0QixTQUFTLEVBQUUsQ0FBQztZQUNaLE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQztTQUN6QixDQUFDLEVBQUUsMkJBQTJCLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztRQUUxRSxNQUFNLFdBQVcsR0FBRyxFQUFFLEdBQUcsY0FBYyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQW9DLENBQUM7UUFDL0csTUFBTSxpQkFBaUIsQ0FDckIsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUM5RCwyQkFBMkIsRUFDM0IsMkJBQTJCLENBQzVCLENBQUM7UUFDRixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDLENBQUMsQ0FBQztJQUVILFlBQVksQ0FBQyxrRUFBa0UsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQ3BHLE1BQU0sVUFBVSxHQUFHLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLG1DQUFtQyxDQUFDLENBQUM7UUFDcEgsTUFBTSxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQ3hGLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sYUFBYSxDQUNqQixHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3ZFLENBQUMsS0FBYyxFQUFFLEVBQUU7WUFDakIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxZQUFZLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ3pFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQ0YsQ0FBQztRQUNGLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pHLE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRCxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRXhGLE1BQU0sT0FBTyxHQUErQjtZQUMxQyxhQUFhLEVBQUUsQ0FBQztZQUNoQixTQUFTLEVBQUUsU0FBUztZQUNwQixTQUFTLEVBQUUsU0FBUztZQUNwQixTQUFTLEVBQUUsQ0FBQztZQUNaLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QixDQUFDO1FBQ0YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNwRixNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEYsTUFBTSxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQVEsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9GLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFbEcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RixDQUFDLENBQUMsQ0FBQztJQUVILFlBQVksQ0FBQyx1REFBdUQsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQ3pGLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakUsTUFBTSxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFjLEVBQUUsRUFBRTtZQUNqRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLFlBQVksT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUM7WUFDdEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXpELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDeEYsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUMsQ0FBQztJQUVILFlBQVksQ0FBQyx5REFBeUQsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQzNGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztRQUN2QyxNQUFNLFdBQVcsR0FBRyxFQUFFLEtBQUssRUFBRSxhQUFzQixFQUFFLENBQUM7UUFDdEQsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzNGLE1BQU0sYUFBYSxDQUNqQixHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUMxRiw2QkFBNkIsQ0FDOUIsQ0FBQztRQUNGLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDL0UsS0FBSyxFQUFFLE9BQU87WUFDZCxLQUFLLEVBQUUsS0FBSztZQUNaLFVBQVUsRUFBRSxXQUFXO1NBQ3hCLENBQUMsQ0FBQztRQUVILE1BQU0sS0FBSyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdGLE1BQU0sS0FBSyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdGLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEcsTUFBTSxhQUFhLENBQ2pCLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUM3Riw2QkFBNkIsQ0FDOUIsQ0FBQztRQUVGLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN0RSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sYUFBYSxDQUNqQixHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUMxRiw2QkFBNkIsQ0FDOUIsQ0FBQztRQUNGLE1BQU0sYUFBYSxDQUNqQixHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDekYsNkJBQTZCLENBQzlCLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILFlBQVksQ0FBQyxvRUFBb0UsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQ3RHLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztRQUN2QyxNQUFNLFdBQVcsR0FBRyxFQUFFLEtBQUssRUFBRSxhQUFzQixFQUFFLENBQUM7UUFDdEQsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0sS0FBSyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUYsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0sS0FBSyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUYsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLENBQzFCLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsRUFDbEMsQ0FBQyxDQUNGLENBQUM7UUFDRixNQUFNLEtBQUssQ0FBQyxJQUFJLENBQ2QsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3hDLENBQUMsRUFDRCxXQUFXLENBQ1osQ0FBQztRQUNGLE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDOUMsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUNsQyxDQUFDLENBQ0YsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBRWxDLE1BQU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDL0UsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMvRSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3BGLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxPQUFPLENBQUMsYUFBYTtRQUFFLFlBQVksQ0FBQywwRUFBMEUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1lBQ3ZJLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDL0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksaURBQWlELENBQUMsQ0FBQztZQUM3RixNQUFNLEtBQUssR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ25GLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN6RCxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDbkUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBaUIsQ0FBQztZQUNuRixPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNqQixDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ25GLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQ2hCLENBQUM7WUFDRixNQUFNLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLDZCQUE2QixDQUFDLENBQUM7WUFDL0csTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyRCxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN2RixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNuRixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzRSxNQUFNLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ25GLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDekYsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDaEYsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0I7UUFBRSxZQUFZLENBQUMsMEVBQTBFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtZQUMxSSxNQUFNLFVBQVUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRSxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsRSxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ2YsTUFBTSxDQUFDLFdBQVcsQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQy9ELEdBQUcsT0FBTyxDQUFDLElBQUksMERBQTBELENBQzFFLENBQUM7WUFFRixNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM5RCxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2RCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ25GLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDMUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDeEQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5RSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLE9BQU8sQ0FBQyxrQkFBa0I7UUFBRSxZQUFZLENBQUMsb0RBQW9ELEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ25ILE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxnREFBZ0QsQ0FBQyxDQUFDO1lBQ3JHLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDN0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEMsZUFBZSxDQUFDLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQztnQkFDdkMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDNUQsQ0FBQyxFQUFFLDZCQUE2QixDQUFDLENBQUM7WUFDbkMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFFaEcsTUFBTSxXQUFXLEdBQUcsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDMUUsTUFBTSxZQUFZLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDNUUsTUFBTSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0UsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3ZGLE1BQU0sYUFBYSxDQUNqQixHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3hFLE9BQU8sQ0FBQyw0QkFBNEIsQ0FDckMsQ0FBQztZQUNGLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQy9FLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUN0QixDQUFDLE1BQU0sV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFDcEUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQzlCLENBQUM7WUFFRixNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSwyQkFBMkIsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoRyxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMzRCxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUU7Z0JBQ25ELEdBQUcsUUFBUTtnQkFDWCxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDM0QsaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUU7YUFDdEUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNOLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRXhGLE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM1RSxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM1RCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyJ9