@serve.zone/dcrouter 20.2.0 → 32.0.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.
@@ -1,19 +1,54 @@
1
1
  import * as nodeCrypto from 'node:crypto';
2
- import * as nodeFs from 'node:fs/promises';
3
- import * as nodePath from 'node:path';
4
2
  import { domainToASCII } from 'node:url';
5
- import { TextDecoder } from 'node:util';
6
- import { getSmartMtaTextNamespace, hashSmartMtaStorageKey, normalizeSmartMtaStorageKey, validateSmartMtaTextValue, } from '../dist_ts/email/smartmta-storage-policy.js';
3
+ import { hashSmartMtaStorageKey } from '../dist_ts/email/smartmta-storage-policy.js';
7
4
  import { createGatewayMailDomainId, groupGatewayMailIdentities, normalizeGatewayMailDomain, normalizeGatewayMailDomainOwner, } from '../dist_ts/email/gateway-mail-domain-authority.js';
8
5
  import { deriveSmtpScramVerifier } from '../dist_ts/email/smtp-scram.js';
9
6
  import { evaluateInboundAcceptance } from '../dist_ts/email/helpers.inbound-security.js';
10
7
  import { getWebPushIndexSpecifications } from '../dist_ts/webpush/webpush-indexes.js';
8
+ import { canonicalJson as canonicalWebPushJson, openWebPushEnvelope, parseWebPushKeyRing, sealWebPushEnvelope, } from '../dist_ts/webpush/classes.webpush-crypto.js';
9
+ import { data as servezoneInterfacesData } from '@serve.zone/interfaces';
10
+ /** The verifier contract token CoreMail peers are stored under from interfaces 32.0.0 on. */
11
+ const coreMailVerifierFormat = servezoneInterfacesData.coreMailCredentialVerifierPolicy.format;
12
+ /**
13
+ * dcrouter migration runner.
14
+ *
15
+ * Uses @push.rocks/smartmigration via dynamic import so smartmigration's type
16
+ * chain (which pulls in mongodb 7.x and related types) doesn't leak into
17
+ * compile-time type checking for this folder.
18
+ */
19
+ /**
20
+ * A refusal dcrouter's own migration code authored. smartmigration redacts every
21
+ * unknown failure that crosses one of its boundaries, so this class is how a
22
+ * message that names the condition and the way out — and carries no secret —
23
+ * is told apart from an unknown throw and allowed through the sanitizer.
24
+ */
25
+ export class DcRouterMigrationError extends Error {
26
+ constructor(messageArg, optionsArg) {
27
+ super(messageArg, optionsArg);
28
+ this.name = 'DcRouterMigrationError';
29
+ }
30
+ }
11
31
  // Advance only with a registered schema migration, not each package release.
12
32
  // Released bridge-only ledgers must remain readable without rewriting history.
13
- export const dcRouterSchemaVersion = '19.1.0';
33
+ export const dcRouterSchemaVersion = '32.0.0';
14
34
  export async function createApplicationMigrationRunner(db, options = {}) {
15
- // The locked run re-reads the ledger and rejects a concurrent newer schema.
16
- return createMigrationRunner(db, dcRouterSchemaVersion, options);
35
+ const runner = await createMigrationRunner(db, dcRouterSchemaVersion, options);
36
+ return {
37
+ getCurrentVersion: () => runner.getCurrentVersion(),
38
+ run: async () => {
39
+ // smartmigration plans a reverse run whenever the ledger is ahead of the
40
+ // target, and in bridge mode the generated bridge is reversible, so a
41
+ // database a newer dcrouter wrote would be walked back instead of
42
+ // refused. Starting an application against data it cannot read is never
43
+ // what an operator meant, so this release refuses it by name.
44
+ const ledgerVersion = await runner.getCurrentVersion();
45
+ if (ledgerVersion && compareSemver(ledgerVersion, dcRouterSchemaVersion) > 0) {
46
+ throw new DcRouterMigrationError(`The migration ledger is at "${ledgerVersion}", which a newer dcrouter wrote. `
47
+ + `This release migrates data up to "${dcRouterSchemaVersion}" and refuses to run against it.`);
48
+ }
49
+ return await runner.run();
50
+ },
51
+ };
17
52
  }
18
53
  const DEFAULT_SOURCE_PROFILES = [
19
54
  {
@@ -59,7 +94,6 @@ const DEFAULT_SOURCE_PROFILES = [
59
94
  },
60
95
  },
61
96
  ];
62
- const remoteIngressHubSettingsMigrationBaseVersion = '13.43.5';
63
97
  function compareSemver(a, b) {
64
98
  const aParts = a.split('.').map((part) => Number.parseInt(part, 10) || 0);
65
99
  const bParts = b.split('.').map((part) => Number.parseInt(part, 10) || 0);
@@ -121,85 +155,6 @@ function resolveMigrationSourceProfileSecurity(profileId, profiles, visited = ne
121
155
  }
122
156
  return mergeMigrationSecurityFields(baseSecurity, profile.security || {});
123
157
  }
124
- async function rematerializeSourceProfileRouteSecurity(ctx) {
125
- const profileCollection = ctx.mongo.collection('SourceProfileDoc');
126
- const routeCollection = ctx.mongo.collection('RouteDoc');
127
- const profiles = new Map();
128
- for await (const profile of profileCollection.find({})) {
129
- if (typeof profile.id === 'string') {
130
- profiles.set(profile.id, profile);
131
- }
132
- }
133
- let inspected = 0;
134
- let migrated = 0;
135
- let skippedMissingProfile = 0;
136
- const now = Date.now();
137
- for await (const routeDoc of routeCollection.find({})) {
138
- const sourceProfileRef = routeDoc.metadata?.sourceProfileRef;
139
- if (typeof sourceProfileRef !== 'string' || sourceProfileRef.trim() === '')
140
- continue;
141
- inspected++;
142
- const resolvedSecurity = resolveMigrationSourceProfileSecurity(sourceProfileRef, profiles);
143
- const profile = profiles.get(sourceProfileRef);
144
- if (!resolvedSecurity || !profile) {
145
- skippedMissingProfile++;
146
- continue;
147
- }
148
- const currentSecurity = routeDoc.route?.security || {};
149
- const securityChanged = JSON.stringify(currentSecurity) !== JSON.stringify(resolvedSecurity);
150
- const profileNameChanged = routeDoc.metadata?.sourceProfileName !== profile.name;
151
- if (!securityChanged && !profileNameChanged)
152
- continue;
153
- const query = routeDoc._id
154
- ? { _id: routeDoc._id }
155
- : { id: routeDoc.id };
156
- await routeCollection.updateOne(query, {
157
- $set: {
158
- 'route.security': structuredClone(resolvedSecurity),
159
- 'metadata.sourceProfileName': profile.name,
160
- 'metadata.lastResolvedAt': now,
161
- updatedAt: now,
162
- },
163
- });
164
- migrated++;
165
- }
166
- ctx.log.log('info', `rematerialize-source-profile-route-security: migrated ${migrated}/${inspected} route(s), skipped ${skippedMissingProfile} missing profile ref(s)`);
167
- }
168
- async function migrateTargetProfileTargetHosts(ctx) {
169
- const collection = ctx.mongo.collection('TargetProfileDoc');
170
- const cursor = collection.find({ 'targets.host': { $exists: true } });
171
- let migrated = 0;
172
- for await (const doc of cursor) {
173
- const targets = (doc.targets || []).map((target) => {
174
- if (target && typeof target === 'object' && 'host' in target && !('ip' in target)) {
175
- const { host, ...rest } = target;
176
- return { ...rest, ip: host };
177
- }
178
- return target;
179
- });
180
- await collection.updateOne({ _id: doc._id }, { $set: { targets } });
181
- migrated++;
182
- }
183
- ctx.log.log('info', `rename-target-profile-host-to-ip: migrated ${migrated} profile(s)`);
184
- }
185
- async function backfillSystemRouteKeys(ctx) {
186
- const collection = ctx.mongo.collection('RouteDoc');
187
- const cursor = collection.find({
188
- origin: { $in: ['config', 'email', 'dns'] },
189
- systemKey: { $exists: false },
190
- 'route.name': { $type: 'string' },
191
- });
192
- let migrated = 0;
193
- for await (const doc of cursor) {
194
- const origin = typeof doc.origin === 'string' ? doc.origin : undefined;
195
- const routeName = typeof doc.route?.name === 'string' ? doc.route.name.trim() : '';
196
- if (!origin || !routeName)
197
- continue;
198
- await collection.updateOne({ _id: doc._id }, { $set: { systemKey: `${origin}:${routeName}` } });
199
- migrated++;
200
- }
201
- ctx.log.log('info', `backfill-system-route-keys: migrated ${migrated} route(s)`);
202
- }
203
158
  async function seedMissingDefaultSourceProfiles(ctx) {
204
159
  const collection = ctx.mongo.collection('SourceProfileDoc');
205
160
  const now = Date.now();
@@ -382,101 +337,6 @@ async function backfillGatewayDnsProxyIntent(ctx) {
382
337
  }
383
338
  ctx.log.log('info', `backfill-gateway-dns-proxy-intent: migrated ${migrated}/${inspected} route(s)`);
384
339
  }
385
- function normalizeMigrationSourceBinding(binding, profiles) {
386
- if (!binding || typeof binding !== 'object')
387
- return undefined;
388
- const sourceProfileRef = typeof binding.sourceProfileRef === 'string'
389
- ? binding.sourceProfileRef.trim()
390
- : '';
391
- if (!sourceProfileRef)
392
- return undefined;
393
- const profile = profiles.get(sourceProfileRef);
394
- const normalizedBinding = structuredClone(binding);
395
- normalizedBinding.sourceProfileRef = sourceProfileRef;
396
- const sourceProfileName = typeof normalizedBinding.sourceProfileName === 'string'
397
- ? normalizedBinding.sourceProfileName.trim()
398
- : '';
399
- if (sourceProfileName) {
400
- normalizedBinding.sourceProfileName = sourceProfileName;
401
- }
402
- else if (typeof profile?.name === 'string' && profile.name.trim()) {
403
- normalizedBinding.sourceProfileName = profile.name.trim();
404
- }
405
- else {
406
- delete normalizedBinding.sourceProfileName;
407
- }
408
- return normalizedBinding;
409
- }
410
- async function convertRouteAccessMetadataToSourceBindings(ctx) {
411
- const profileCollection = ctx.mongo.collection('SourceProfileDoc');
412
- const routeCollection = ctx.mongo.collection('RouteDoc');
413
- const profiles = new Map();
414
- const now = Date.now();
415
- for await (const profile of profileCollection.find({})) {
416
- if (typeof profile.id === 'string') {
417
- profiles.set(profile.id, profile);
418
- }
419
- }
420
- let inspected = 0;
421
- let migrated = 0;
422
- for await (const routeDoc of routeCollection.find({})) {
423
- const metadata = routeDoc.metadata || {};
424
- const existingSourceBindings = Array.isArray(metadata.sourceBindings)
425
- ? metadata.sourceBindings
426
- : [];
427
- const legacyPolicyBindings = Array.isArray(metadata.sourcePolicy?.bindings)
428
- ? metadata.sourcePolicy.bindings
429
- : [];
430
- const legacySourceProfileRef = typeof metadata.sourceProfileRef === 'string'
431
- ? metadata.sourceProfileRef.trim()
432
- : '';
433
- const hasLegacyAccessFields = legacyPolicyBindings.length > 0
434
- || legacySourceProfileRef.length > 0
435
- || metadata.sourcePolicy !== undefined
436
- || metadata.sourceProfileRef !== undefined
437
- || metadata.sourceProfileName !== undefined;
438
- if (!hasLegacyAccessFields && existingSourceBindings.length === 0) {
439
- continue;
440
- }
441
- inspected++;
442
- const sourceBindings = existingSourceBindings.length > 0
443
- ? existingSourceBindings
444
- .map((binding) => normalizeMigrationSourceBinding(binding, profiles))
445
- .filter(Boolean)
446
- : legacyPolicyBindings.length > 0
447
- ? legacyPolicyBindings
448
- .map((binding) => normalizeMigrationSourceBinding(binding, profiles))
449
- .filter(Boolean)
450
- : legacySourceProfileRef
451
- ? [normalizeMigrationSourceBinding({
452
- sourceProfileRef: legacySourceProfileRef,
453
- sourceProfileName: metadata.sourceProfileName,
454
- }, profiles)].filter(Boolean)
455
- : [];
456
- const $set = { updatedAt: now };
457
- const $unset = {
458
- 'metadata.sourcePolicy': '',
459
- 'metadata.sourceProfileRef': '',
460
- 'metadata.sourceProfileName': '',
461
- };
462
- if (sourceBindings.length > 0) {
463
- $set['metadata.sourceBindings'] = sourceBindings;
464
- $set['metadata.lastResolvedAt'] = now;
465
- }
466
- else if (existingSourceBindings.length === 0) {
467
- $unset['metadata.sourceBindings'] = '';
468
- }
469
- if (existingSourceBindings.length === 0 && legacyPolicyBindings.length === 0 && legacySourceProfileRef) {
470
- $unset['route.security'] = '';
471
- }
472
- const query = routeDoc._id
473
- ? { _id: routeDoc._id }
474
- : { id: routeDoc.id };
475
- await routeCollection.updateOne(query, { $set, $unset });
476
- migrated++;
477
- }
478
- ctx.log.log('info', `convert-route-access-metadata-to-source-bindings: migrated ${migrated}/${inspected} route(s)`);
479
- }
480
340
  async function backfillRemoteIngressHubSettings(ctx, options) {
481
341
  const collection = ctx.mongo.collection('RemoteIngressHubSettingsDoc');
482
342
  const seed = options.remoteIngressHubSettings || {};
@@ -553,73 +413,6 @@ async function backfillEmailServerSettings(ctx, options) {
553
413
  await collection.updateOne(doc._id ? { _id: doc._id } : { settingsId: 'email-server-settings' }, { $set });
554
414
  ctx.log.log('info', `backfill-email-server-settings: set ${Object.keys($set).length - 2} missing field(s)`);
555
415
  }
556
- async function backfillEmailOutboundMode(ctx, options) {
557
- const collection = ctx.mongo.collection('EmailServerSettingsDoc');
558
- const seed = options.emailServerSettings || {};
559
- const now = Date.now();
560
- const doc = await collection.findOne({ settingsId: 'email-server-settings' });
561
- const outboundMode = seed.outboundMode || 'direct';
562
- if (!doc) {
563
- await collection.insertOne({
564
- settingsId: 'email-server-settings',
565
- enabled: seed.enabled ?? Boolean(seed.emailConfig),
566
- outboundMode,
567
- emailConfig: seed.emailConfig || undefined,
568
- emailPortConfig: seed.emailPortConfig || undefined,
569
- updatedAt: now,
570
- updatedBy: 'migration',
571
- });
572
- ctx.log.log('info', 'backfill-email-outbound-mode: inserted singleton settings document');
573
- return;
574
- }
575
- if (doc.outboundMode !== undefined) {
576
- ctx.log.log('info', 'backfill-email-outbound-mode: no changes needed');
577
- return;
578
- }
579
- await collection.updateOne(doc._id ? { _id: doc._id } : { settingsId: 'email-server-settings' }, {
580
- $set: {
581
- outboundMode,
582
- updatedAt: now,
583
- updatedBy: doc.updatedBy || 'migration',
584
- },
585
- });
586
- ctx.log.log('info', 'backfill-email-outbound-mode: set missing outboundMode');
587
- }
588
- async function backfillRemoteIngressEdgeEgressDefaults(ctx) {
589
- const collection = ctx.mongo.collection('RemoteIngressEdgeDoc');
590
- const result = await collection.updateMany({ egress: { $exists: false } }, { $set: { egress: { enabled: false } } });
591
- ctx.log.log('info', `backfill-remote-ingress-edge-egress-defaults: set ${result.modifiedCount || 0} edge(s) to disabled egress`);
592
- }
593
- async function backfillEmailOutboundAndRemoteIngressEgressSettings(ctx, options) {
594
- await backfillEmailOutboundMode(ctx, options);
595
- await backfillRemoteIngressEdgeEgressDefaults(ctx);
596
- }
597
- async function flipEmailOutboundModeToRemoteIngress(ctx) {
598
- const collection = ctx.mongo.collection('EmailServerSettingsDoc');
599
- const doc = await collection.findOne({ settingsId: 'email-server-settings' });
600
- if (!doc) {
601
- ctx.log.log('info', 'flip-email-outbound-mode: no settings document, nothing to flip');
602
- return;
603
- }
604
- const mode = doc.outboundMode;
605
- const updatedBy = String(doc.updatedBy || '');
606
- // Operator-explicit 'direct' (set by a real identity) is preserved as opt-out;
607
- // missing or default/migration-authored 'direct' flips to the new default.
608
- const shouldFlip = mode === undefined
609
- || (mode === 'direct' && ['default', 'migration', ''].includes(updatedBy));
610
- if (!shouldFlip) {
611
- ctx.log.log('info', `flip-email-outbound-mode: keeping ${mode} (updatedBy: ${updatedBy || 'unknown'})`);
612
- return;
613
- }
614
- await collection.updateOne(doc._id ? { _id: doc._id } : { settingsId: 'email-server-settings' }, {
615
- $set: {
616
- outboundMode: 'remoteIngress',
617
- updatedAt: Date.now(),
618
- updatedBy: 'migration',
619
- },
620
- });
621
- ctx.log.log('info', 'flip-email-outbound-mode: outboundMode set to remoteIngress');
622
- }
623
416
  /**
624
417
  * The legacy bootstrap config carried a `central.eu-incoming` route with a
625
418
  * `deliver` action. SmartMTA's `deliver` action is an unimplemented stub that
@@ -743,152 +536,6 @@ async function convertLegacySmtpAuthUsers(ctx) {
743
536
  });
744
537
  ctx.log.log('info', `convert-legacy-smtp-auth-users: converted ${converted}, skipped ${skipped}; plaintext auth users stripped from persisted settings`);
745
538
  }
746
- async function backfillCachedEmailDirections(ctx) {
747
- const collection = ctx.mongo.collection('CachedEmail');
748
- const cursor = collection.find({ direction: { $exists: false } });
749
- let updated = 0;
750
- for await (const doc of cursor) {
751
- let routeData = {};
752
- try {
753
- routeData = JSON.parse(doc.routeData || '{}');
754
- }
755
- catch {
756
- routeData = {};
757
- }
758
- const authenticated = routeData?.session?.authenticated === true;
759
- const recipientDomains = [...new Set((doc.to || [])
760
- .map((address) => {
761
- const match = String(address).match(/@([^>]+)>?$/);
762
- return match ? match[1].toLowerCase() : undefined;
763
- })
764
- .filter(Boolean))];
765
- const acceptedAtParsed = Date.parse(routeData?.acceptedAt || '');
766
- await collection.updateOne({ _id: doc._id }, {
767
- $set: {
768
- direction: authenticated ? 'outbound' : 'inbound',
769
- recipientDomains,
770
- acceptedAt: Number.isFinite(acceptedAtParsed) ? acceptedAtParsed : Date.now(),
771
- },
772
- });
773
- updated++;
774
- }
775
- ctx.log.log('info', `backfill-cached-email-directions: annotated ${updated} cached email(s)`);
776
- }
777
- async function migrateGatewayCredentialPolicyBindings(ctx) {
778
- const gatewayClients = ctx.mongo.collection('GatewayClientDoc');
779
- const apiTokens = ctx.mongo.collection('ApiTokenDoc');
780
- const batchSize = 100;
781
- let migratedClients = 0;
782
- let migratedTokens = 0;
783
- let disabledOrphanTokens = 0;
784
- const digestClientPolicy = (clientArg, generationArg) => {
785
- const canonicalize = (valueArg) => {
786
- if (Array.isArray(valueArg))
787
- return valueArg.map((entryArg) => canonicalize(entryArg));
788
- if (valueArg && typeof valueArg === 'object') {
789
- return Object.fromEntries(Object.keys(valueArg)
790
- .sort((left, right) => left.localeCompare(right))
791
- .map((keyArg) => [keyArg, canonicalize(valueArg[keyArg])]));
792
- }
793
- return valueArg;
794
- };
795
- return nodeCrypto.createHash('sha256').update(JSON.stringify(canonicalize({
796
- id: clientArg.id,
797
- generation: generationArg,
798
- policy: {
799
- type: clientArg.type,
800
- hostnamePatterns: clientArg.hostnamePatterns || [],
801
- allowedRouteTargets: clientArg.allowedRouteTargets || [],
802
- capabilities: clientArg.capabilities || {},
803
- enabled: clientArg.enabled !== false,
804
- },
805
- }))).digest('hex');
806
- };
807
- while (true) {
808
- const batch = await gatewayClients.find({
809
- $or: [
810
- { policyGeneration: { $exists: false } },
811
- { policyGeneration: { $in: [null, 0] } },
812
- { credentialSequence: { $exists: false } },
813
- { credentialSequence: null },
814
- { activeCredentialSequence: { $exists: false } },
815
- { activeCredentialSequence: null },
816
- { pendingProvisioning: { $exists: false } },
817
- ],
818
- }).limit(batchSize).toArray();
819
- if (batch.length === 0)
820
- break;
821
- for (const client of batch) {
822
- const policyGeneration = Number.isSafeInteger(client.policyGeneration)
823
- && Number(client.policyGeneration) >= 1
824
- ? Number(client.policyGeneration)
825
- : 1;
826
- const credentialSequence = Number.isSafeInteger(client.credentialSequence)
827
- && Number(client.credentialSequence) >= 0
828
- ? Number(client.credentialSequence)
829
- : 0;
830
- let activeCredentialSequence = Number.isSafeInteger(client.activeCredentialSequence)
831
- && Number(client.activeCredentialSequence) >= 0
832
- ? Number(client.activeCredentialSequence)
833
- : 0;
834
- if (activeCredentialSequence === 0) {
835
- const activeDigest = digestClientPolicy(client, policyGeneration);
836
- const activeTokens = await apiTokens.find({
837
- enabled: true,
838
- 'policy.role': 'gatewayClient',
839
- 'policy.gatewayClient.id': client.id,
840
- 'gatewayCredentialLifecycle.source': 'provisioned',
841
- 'gatewayCredentialLifecycle.state': 'active',
842
- 'gatewayCredentialLifecycle.policyGeneration': policyGeneration,
843
- 'gatewayCredentialLifecycle.policyDigest': activeDigest,
844
- }).sort({ 'gatewayCredentialLifecycle.sequence': -1 }).limit(1).toArray();
845
- const activeSequence = activeTokens[0]?.gatewayCredentialLifecycle?.sequence;
846
- if (Number.isSafeInteger(activeSequence) && Number(activeSequence) >= 1) {
847
- activeCredentialSequence = Number(activeSequence);
848
- }
849
- }
850
- await gatewayClients.updateOne(client._id === undefined ? { id: client.id } : { _id: client._id, id: client.id }, {
851
- $set: {
852
- policyGeneration,
853
- credentialSequence,
854
- activeCredentialSequence,
855
- pendingProvisioning: client.pendingProvisioning ?? null,
856
- },
857
- });
858
- migratedClients++;
859
- }
860
- }
861
- while (true) {
862
- const batch = await apiTokens.find({
863
- 'policy.role': 'gatewayClient',
864
- $or: [
865
- { 'policy.gatewayClient.policyGeneration': { $exists: false } },
866
- { 'policy.gatewayClient.policyGeneration': { $in: [null, 0] } },
867
- ],
868
- }).limit(batchSize).toArray();
869
- if (batch.length === 0)
870
- break;
871
- for (const token of batch) {
872
- const gatewayClientId = typeof token.policy?.gatewayClient?.id === 'string'
873
- ? token.policy.gatewayClient.id.trim().toLowerCase()
874
- : '';
875
- const client = gatewayClientId
876
- ? await gatewayClients.findOne({ id: gatewayClientId })
877
- : null;
878
- const selector = token._id === undefined ? { id: token.id } : { _id: token._id, id: token.id };
879
- await apiTokens.updateOne(selector, {
880
- $set: {
881
- 'policy.gatewayClient.policyGeneration': client?.policyGeneration || 1,
882
- ...(!client ? { enabled: false } : {}),
883
- },
884
- });
885
- migratedTokens++;
886
- if (!client)
887
- disabledOrphanTokens++;
888
- }
889
- }
890
- ctx.log.log(disabledOrphanTokens > 0 ? 'warn' : 'info', `gateway-credential-policy-bindings: migrated ${migratedClients} client(s), ${migratedTokens} token(s), disabled ${disabledOrphanTokens} orphan token(s)`);
891
- }
892
539
  async function migrateWebPushProviderSchema(ctx) {
893
540
  const migrationBatchSize = 100;
894
541
  const bindingCollection = ctx.mongo.collection('WebPushBindingDoc');
@@ -896,7 +543,7 @@ async function migrateWebPushProviderSchema(ctx) {
896
543
  const spoolCollection = ctx.mongo.collection('WebPushSpoolDoc');
897
544
  const requireMongoDocumentId = (documentArg, documentTypeArg) => {
898
545
  if (documentArg?._id === undefined || documentArg?._id === null) {
899
- throw new Error(`web-push-provider-schema: ${documentTypeArg} document has no MongoDB id`);
546
+ throw new DcRouterMigrationError(`web-push-provider-schema: ${documentTypeArg} document has no MongoDB id`);
900
547
  }
901
548
  return documentArg._id;
902
549
  };
@@ -917,7 +564,7 @@ async function migrateWebPushProviderSchema(ctx) {
917
564
  },
918
565
  })), { ordered: false });
919
566
  if (result.modifiedCount === 0) {
920
- throw new Error(`web-push-provider-schema: ${documentTypeArg} backfill made no progress`);
567
+ throw new DcRouterMigrationError(`web-push-provider-schema: ${documentTypeArg} backfill made no progress`);
921
568
  }
922
569
  }
923
570
  };
@@ -945,7 +592,7 @@ async function migrateWebPushProviderSchema(ctx) {
945
592
  || binding.id !== binding.id.trim()
946
593
  || !Number.isSafeInteger(binding.lifecycleGeneration)
947
594
  || binding.lifecycleGeneration < 1) {
948
- throw new Error('web-push-provider-schema: malformed binding lifecycle authority');
595
+ throw new DcRouterMigrationError('web-push-provider-schema: malformed binding lifecycle authority');
949
596
  }
950
597
  }
951
598
  const backfillDependentLifecycles = async (collectionArg, documentTypeArg) => {
@@ -960,13 +607,13 @@ async function migrateWebPushProviderSchema(ctx) {
960
607
  if (typeof document.bindingId !== 'string'
961
608
  || document.bindingId.trim().length === 0
962
609
  || document.bindingId !== document.bindingId.trim()) {
963
- throw new Error(`web-push-provider-schema: malformed ${documentTypeArg} lifecycle authority`);
610
+ throw new DcRouterMigrationError(`web-push-provider-schema: malformed ${documentTypeArg} lifecycle authority`);
964
611
  }
965
612
  const binding = await bindingCollection.findOne({ id: document.bindingId }, { projection: { lifecycleGeneration: 1 } });
966
613
  if (!binding
967
614
  || !Number.isSafeInteger(binding.lifecycleGeneration)
968
615
  || binding.lifecycleGeneration < 1) {
969
- throw new Error(`web-push-provider-schema: orphan ${documentTypeArg} lifecycle authority`);
616
+ throw new DcRouterMigrationError(`web-push-provider-schema: orphan ${documentTypeArg} lifecycle authority`);
970
617
  }
971
618
  operations.push({
972
619
  updateOne: {
@@ -981,7 +628,7 @@ async function migrateWebPushProviderSchema(ctx) {
981
628
  }
982
629
  const result = await collectionArg.bulkWrite(operations, { ordered: false });
983
630
  if (result.modifiedCount === 0) {
984
- throw new Error(`web-push-provider-schema: ${documentTypeArg} backfill made no progress`);
631
+ throw new DcRouterMigrationError(`web-push-provider-schema: ${documentTypeArg} backfill made no progress`);
985
632
  }
986
633
  }
987
634
  };
@@ -997,13 +644,13 @@ async function migrateWebPushProviderSchema(ctx) {
997
644
  && (typeof documentArg.id !== 'string'
998
645
  || documentArg.id.trim().length === 0
999
646
  || documentArg.id !== documentArg.id.trim()))) {
1000
- throw new Error(`web-push-provider-schema: malformed ${documentTypeArg} lifecycle authority`);
647
+ throw new DcRouterMigrationError(`web-push-provider-schema: malformed ${documentTypeArg} lifecycle authority`);
1001
648
  }
1002
649
  const binding = await bindingCollection.findOne({ id: documentArg.bindingId }, { projection: { lifecycleGeneration: 1 } });
1003
650
  if (!binding
1004
651
  || !Number.isSafeInteger(binding.lifecycleGeneration)
1005
652
  || documentArg.lifecycleGeneration > binding.lifecycleGeneration) {
1006
- throw new Error(`web-push-provider-schema: orphan ${documentTypeArg} lifecycle authority`);
653
+ throw new DcRouterMigrationError(`web-push-provider-schema: orphan ${documentTypeArg} lifecycle authority`);
1007
654
  }
1008
655
  };
1009
656
  const streamLifecycleCollection = async (collectionArg, documentTypeArg) => {
@@ -1075,7 +722,7 @@ async function migrateServiceMailIdempotencyIndex(ctx) {
1075
722
  continue;
1076
723
  }
1077
724
  if (document._id === undefined || document._id === null) {
1078
- throw new Error('index-service-mail-idempotency: CachedEmail document has no _id');
725
+ throw new DcRouterMigrationError('index-service-mail-idempotency: CachedEmail document has no _id');
1079
726
  }
1080
727
  pendingUnsets.push({
1081
728
  updateOne: {
@@ -1118,829 +765,250 @@ async function migrateServiceMailIdempotencyIndex(ctx) {
1118
765
  */
1119
766
  export async function createMigrationRunner(db, targetVersion, options = {}) {
1120
767
  const sm = await import('@push.rocks/smartmigration');
1121
- const freshInstallVersion = compareSemver(targetVersion, serviceMailIdempotencyMigrationVersion) >= 0
1122
- ? serviceMailIdempotencyPreviousVersion
1123
- : targetVersion;
1124
768
  const migration = new sm.SmartMigration({
1125
769
  targetVersion,
1126
770
  db: db,
1127
- // Fresh installs run the mail idempotency and Web Push schema migrations.
1128
- freshInstallVersion,
1129
- // Retain historical bridge steps for already released package-version ledgers.
771
+ // A fresh install enters the chain at its start, so it still runs the mail
772
+ // idempotency and Web Push index steps that create its indexes.
773
+ freshInstallVersion: serviceMailIdempotencyPreviousVersion,
774
+ // 32.0.0 deleted every released step below the chain start. Without this
775
+ // floor a ledger from before it would be skip-forward resumed and stamped
776
+ // as if the deleted work had happened; with it, such a ledger is refused
777
+ // by name on the first read, before the lock and before any write.
778
+ oldestSupportedVersion: serviceMailIdempotencyPreviousVersion,
779
+ // A target that is not a step boundary is bridged rather than overshot.
1130
780
  targetVersionStrategy: 'bridge',
781
+ // dcrouter's own refusals name the condition and the way out and carry no
782
+ // secret, so they reach the operator unchanged; anything else is reported
783
+ // as the step or phase it failed in and nothing more.
784
+ errorSanitizer: (errorArg, contextArg) => (errorArg instanceof DcRouterMigrationError
785
+ ? { message: errorArg.message }
786
+ : {
787
+ message: contextArg.stepId
788
+ ? `Migration step "${contextArg.stepId}" failed.`
789
+ : `Migration ${contextArg.phase} failed.`,
790
+ }),
1131
791
  // A replacement process must be able to wait out the complete stale-lock TTL.
1132
792
  lockWaitMs: 11 * 60_000,
1133
793
  lockTtlMs: 10 * 60_000,
1134
794
  });
1135
- const gatewayClientRouteMetadataMigrationVersion = '15.0.0';
1136
- const gatewayClientRoutePublicSourceMigrationVersion = '15.0.2';
1137
- async function normalizeGatewayClientRouteMetadata(ctx) {
1138
- const collection = ctx.mongo.collection('RouteDoc');
1139
- const docs = await collection.find({
1140
- $or: [
1141
- { 'metadata.workHosterType': { $exists: true } },
1142
- { 'metadata.workHosterId': { $exists: true } },
1143
- { 'metadata.workAppId': { $exists: true } },
1144
- { 'metadata.ownerType': 'workhoster' },
1145
- ],
1146
- }).toArray();
1147
- for (const doc of docs) {
1148
- const metadata = doc.metadata || {};
1149
- const set = {};
1150
- if (!metadata.gatewayClientType && metadata.workHosterType) {
1151
- set['metadata.gatewayClientType'] = metadata.workHosterType;
1152
- }
1153
- if (!metadata.gatewayClientId && metadata.workHosterId) {
1154
- set['metadata.gatewayClientId'] = metadata.workHosterId;
1155
- }
1156
- if (!metadata.gatewayClientAppId && metadata.workAppId) {
1157
- set['metadata.gatewayClientAppId'] = metadata.workAppId;
1158
- }
1159
- if (metadata.ownerType === 'workhoster') {
1160
- set['metadata.ownerType'] = 'gatewayClient';
795
+ // Register steps in execution order; each `.from()` is the previous `.to()`,
796
+ // and `oldestSupportedVersion` pins the first one as the floor of this
797
+ // release. Registration stops at `targetVersion` so a target that is not a
798
+ // step boundary is bridged by smartmigration instead of overshooting.
799
+ const reaches = (versionArg) => compareSemver(targetVersion, versionArg) >= 0;
800
+ /**
801
+ * Close the chain. A `targetVersion` that is not a step boundary is bridged,
802
+ * and that bridge repeats the settings safeguards the chain reached rather
803
+ * than being a no-op: the persisted settings document can be seeded from
804
+ * bootstrap config in the very run that bridges it.
805
+ */
806
+ const finish = (chainEndArg) => {
807
+ if (compareSemver(targetVersion, chainEndArg) <= 0)
808
+ return migration;
809
+ migration
810
+ .step('backfill-settings-to-target')
811
+ .from(chainEndArg).to(targetVersion)
812
+ .description('Bridge to a target between two chain boundaries, repeating the settings safeguards')
813
+ .up(async (ctx) => {
814
+ await backfillRemoteIngressHubSettings(ctx, options);
815
+ await backfillEmailServerSettings(ctx, options);
816
+ if (compareSemver(chainEndArg, legacyCentralEuDeliverRouteMigrationVersion) >= 0) {
817
+ await removeLegacyCentralEuDeliverRoute(ctx);
1161
818
  }
1162
- const update = {
1163
- $unset: {
1164
- 'metadata.workHosterType': '',
1165
- 'metadata.workHosterId': '',
1166
- 'metadata.workAppId': '',
1167
- },
1168
- };
1169
- if (Object.keys(set).length > 0) {
1170
- update.$set = set;
819
+ if (compareSemver(chainEndArg, smtpAuthAccountsMigrationVersion) >= 0) {
820
+ await convertLegacySmtpAuthUsers(ctx);
1171
821
  }
1172
- await collection.updateOne({ _id: doc._id }, update);
1173
- }
1174
- ctx.log.log('info', `normalize-gateway-client-route-metadata: migrated ${docs.length} route(s)`);
1175
- }
1176
- function isStandardSourceBinding(binding) {
1177
- if (!binding || typeof binding !== 'object')
1178
- return false;
1179
- const sourceProfileRef = typeof binding.sourceProfileRef === 'string'
1180
- ? binding.sourceProfileRef.trim().toLowerCase()
1181
- : '';
1182
- const sourceProfileName = typeof binding.sourceProfileName === 'string'
1183
- ? binding.sourceProfileName.trim().toLowerCase()
1184
- : '';
1185
- return sourceProfileRef === 'standard' || sourceProfileName === 'standard';
1186
- }
1187
- async function preferPublicSourceBindingsForGatewayClientRoutes(ctx) {
1188
- const profileCollection = ctx.mongo.collection('SourceProfileDoc');
1189
- const routeCollection = ctx.mongo.collection('RouteDoc');
1190
- const profiles = await profileCollection.find({}).toArray();
1191
- const publicProfile = profiles.find((profile) => {
1192
- return typeof profile.id === 'string' && profile.id.trim().toLowerCase() === 'public';
1193
- }) || profiles.find((profile) => {
1194
- return typeof profile.name === 'string' && profile.name.trim().toLowerCase() === 'public';
1195
822
  });
1196
- if (!publicProfile?.id) {
1197
- ctx.log.log('warn', 'gateway-client-routes-use-public-source-profile: PUBLIC source profile not found, skipping');
1198
- return;
1199
- }
1200
- const publicBinding = {
1201
- sourceProfileRef: String(publicProfile.id),
1202
- sourceProfileName: typeof publicProfile.name === 'string' ? publicProfile.name : 'PUBLIC',
1203
- };
1204
- const cursor = routeCollection.find({
1205
- 'metadata.ownerType': 'gatewayClient',
1206
- });
1207
- const now = Date.now();
1208
- let inspected = 0;
1209
- let migrated = 0;
1210
- for await (const doc of cursor) {
1211
- inspected++;
1212
- const metadata = doc.metadata || {};
1213
- const sourceBindings = Array.isArray(metadata.sourceBindings)
1214
- ? metadata.sourceBindings
1215
- : [];
1216
- const shouldMigrate = sourceBindings.length === 0
1217
- || sourceBindings.every((binding) => isStandardSourceBinding(binding));
1218
- if (!shouldMigrate) {
1219
- continue;
1220
- }
1221
- await routeCollection.updateOne(doc._id ? { _id: doc._id } : { id: doc.id }, {
1222
- $set: {
1223
- 'metadata.sourceBindings': [publicBinding],
1224
- 'metadata.lastResolvedAt': now,
1225
- updatedAt: now,
1226
- },
1227
- $unset: {
1228
- 'route.security': '',
1229
- },
1230
- });
1231
- migrated++;
1232
- }
1233
- ctx.log.log('info', `gateway-client-routes-use-public-source-profile: migrated ${migrated}/${inspected} route(s)`);
1234
- }
1235
- // Register steps in execution order. Each step's .from() must match the
1236
- // previous step's .to() to form a contiguous chain.
823
+ return migration;
824
+ };
825
+ if (!reaches(serviceMailIdempotencyMigrationVersion))
826
+ return finish(serviceMailIdempotencyPreviousVersion);
1237
827
  migration
1238
- .step('rename-target-profile-host-to-ip')
1239
- .from('13.0.11').to('13.1.0')
1240
- .description('Rename ITargetProfileTarget.host → ip on all target profiles')
1241
- .up(async (ctx) => migrateTargetProfileTargetHosts(ctx))
1242
- .step('rename-domain-source-manual-to-dcrouter')
1243
- .from('13.1.0').to('13.8.1')
1244
- .description('Rename DomainDoc.source value from "manual" to "dcrouter"')
828
+ .step('index-service-mail-idempotency')
829
+ .from(serviceMailIdempotencyPreviousVersion).to(serviceMailIdempotencyMigrationVersion)
830
+ .description('Repair replay metadata and create the credential-scoped sparse unique service-mail index')
1245
831
  .up(async (ctx) => {
1246
- const collection = ctx.mongo.collection('DomainDoc');
1247
- const result = await collection.updateMany({ source: 'manual' }, { $set: { source: 'dcrouter' } });
1248
- ctx.log.log('info', `rename-domain-source-manual-to-dcrouter: migrated ${result.modifiedCount} domain(s)`);
1249
- })
1250
- .step('rename-record-source-manual-to-local')
1251
- .from('13.8.1').to('13.8.2')
1252
- .description('Rename DnsRecordDoc.source value from "manual" to "local"')
832
+ await migrateServiceMailIdempotencyIndex(ctx);
833
+ });
834
+ if (!reaches(webPushSchemaMigrationVersion))
835
+ return finish(serviceMailIdempotencyMigrationVersion);
836
+ migration
837
+ .step('web-push-provider-schema')
838
+ .from(webPushSchemaPreviousVersion).to(webPushSchemaMigrationVersion)
839
+ .description('Create durable Web Push binding, delivery, idempotency, and retention indexes')
1253
840
  .up(async (ctx) => {
1254
- const collection = ctx.mongo.collection('DnsRecordDoc');
1255
- const result = await collection.updateMany({ source: 'manual' }, { $set: { source: 'local' } });
1256
- ctx.log.log('info', `rename-record-source-manual-to-local: migrated ${result.modifiedCount} record(s)`);
1257
- })
1258
- .step('unify-routes-rename-collection')
1259
- .from('13.8.2').to('13.16.0')
1260
- .description('Rename StoredRouteDoc → RouteDoc, add origin field, drop RouteOverrideDoc')
841
+ await migrateWebPushProviderSchema(ctx);
842
+ await backfillRemoteIngressHubSettings(ctx, options);
843
+ await backfillEmailServerSettings(ctx, options);
844
+ });
845
+ if (!reaches(routeIngressPolicyMigrationVersion))
846
+ return finish(webPushSchemaMigrationVersion);
847
+ migration
848
+ .step('backfill-route-ingress-policies')
849
+ .from(routeIngressPolicyPreviousVersion).to(routeIngressPolicyMigrationVersion)
850
+ .description('Preserve existing route reachability with explicit direct hub and SmartVPN ingress policy')
1261
851
  .up(async (ctx) => {
1262
- const db = ctx.mongo;
1263
- // 1. Rename StoredRouteDoc → RouteDoc (smartdata uses exact class names)
1264
- const collections = await db.listCollections({ name: 'StoredRouteDoc' }).toArray();
1265
- if (collections.length > 0) {
1266
- await db.renameCollection('StoredRouteDoc', 'RouteDoc');
1267
- ctx.log.log('info', 'Renamed StoredRouteDoc → RouteDoc');
1268
- }
1269
- // 2. Set origin='api' on all migrated docs (they were API-created)
1270
- const routeCol = db.collection('RouteDoc');
1271
- const result = await routeCol.updateMany({ origin: { $exists: false } }, { $set: { origin: 'api' } });
1272
- ctx.log.log('info', `Set origin='api' on ${result.modifiedCount} migrated route(s)`);
1273
- // 3. Drop RouteOverrideDoc collection
1274
- const overrideCollections = await db.listCollections({ name: 'RouteOverrideDoc' }).toArray();
1275
- if (overrideCollections.length > 0) {
1276
- await db.collection('RouteOverrideDoc').drop();
1277
- ctx.log.log('info', 'Dropped RouteOverrideDoc collection');
1278
- }
1279
- })
1280
- .step('repair-target-profile-ip-migration')
1281
- .from('13.16.0').to('13.17.4')
1282
- .description('Repair TargetProfileDoc.targets host→ip migration for already-upgraded installs')
852
+ await backfillRouteIngressPolicies(ctx);
853
+ await backfillRemoteIngressHubSettings(ctx, options);
854
+ await backfillEmailServerSettings(ctx, options);
855
+ });
856
+ if (!reaches(sourceProfileNetworkNormalizationMigrationVersion))
857
+ return finish(routeIngressPolicyMigrationVersion);
858
+ migration
859
+ .step('normalize-private-source-profile-networks')
860
+ .from(routeIngressPolicyMigrationVersion).to(sourceProfileNetworkNormalizationMigrationVersion)
861
+ .description('Normalize legacy private source-profile wildcards to valid CIDR notation')
1283
862
  .up(async (ctx) => {
1284
- await migrateTargetProfileTargetHosts(ctx);
1285
- })
1286
- .step('backfill-system-route-keys')
1287
- .from('13.17.4').to('13.18.0')
1288
- .description('Backfill RouteDoc.systemKey for persisted config/email/dns routes')
863
+ await normalizeLegacyPrivateSourceProfileNetworks(ctx);
864
+ await backfillRemoteIngressHubSettings(ctx, options);
865
+ await backfillEmailServerSettings(ctx, options);
866
+ });
867
+ if (!reaches(gatewayDnsProxyIntentMigrationVersion))
868
+ return finish(sourceProfileNetworkNormalizationMigrationVersion);
869
+ migration
870
+ .step('backfill-gateway-dns-proxy-intent')
871
+ .from(sourceProfileNetworkNormalizationMigrationVersion).to(gatewayDnsProxyIntentMigrationVersion)
872
+ .description('Recover gateway route DNS proxy intent from owned provider record state')
1289
873
  .up(async (ctx) => {
1290
- await backfillSystemRouteKeys(ctx);
1291
- })
1292
- .step('rematerialize-source-profile-route-security')
1293
- .from('13.18.0').to('13.40.2')
1294
- .description('Replace stale route security with resolved source profile security')
874
+ await backfillGatewayDnsProxyIntent(ctx);
875
+ await backfillRemoteIngressHubSettings(ctx, options);
876
+ await backfillEmailServerSettings(ctx, options);
877
+ });
878
+ if (!reaches(legacyCentralEuDeliverRouteMigrationVersion))
879
+ return finish(gatewayDnsProxyIntentMigrationVersion);
880
+ migration
881
+ .step('remove-legacy-central-eu-deliver-route')
882
+ .from(gatewayDnsProxyIntentMigrationVersion).to(legacyCentralEuDeliverRouteMigrationVersion)
883
+ .description('Remove the legacy central.eu-incoming deliver route so accepted mail falls through to the domain inbound store policy')
1295
884
  .up(async (ctx) => {
1296
- await rematerializeSourceProfileRouteSecurity(ctx);
1297
- })
1298
- .step('seed-missing-default-source-profiles')
1299
- .from('13.40.2').to('13.42.0')
1300
- .description('Seed missing default source profiles for source-policy presets')
885
+ // Backfills run first so a leapfrog upgrade that seeds the settings doc
886
+ // (including the legacy route) in this very step is normalized before
887
+ // the step completes.
888
+ await backfillRemoteIngressHubSettings(ctx, options);
889
+ await backfillEmailServerSettings(ctx, options);
890
+ await removeLegacyCentralEuDeliverRoute(ctx);
891
+ });
892
+ if (!reaches(smtpAuthAccountsMigrationVersion))
893
+ return finish(legacyCentralEuDeliverRouteMigrationVersion);
894
+ migration
895
+ .step('convert-legacy-smtp-auth-users')
896
+ .from(legacyCentralEuDeliverRouteMigrationVersion).to(smtpAuthAccountsMigrationVersion)
897
+ .description('Convert legacy plaintext emailConfig.auth.users into hashed SMTP account documents and strip the plaintext from persisted settings')
1301
898
  .up(async (ctx) => {
1302
- await seedMissingDefaultSourceProfiles(ctx);
1303
- })
1304
- .step('convert-route-access-metadata-to-source-bindings')
1305
- .from('13.42.0').to('13.43.2')
1306
- .description('Convert route sourceProfileRef/sourcePolicy metadata to canonical sourceBindings')
899
+ await backfillRemoteIngressHubSettings(ctx, options);
900
+ await backfillEmailServerSettings(ctx, options);
901
+ await removeLegacyCentralEuDeliverRoute(ctx);
902
+ await convertLegacySmtpAuthUsers(ctx);
903
+ });
904
+ if (!reaches(monitoringEventsMigrationVersion))
905
+ return finish(smtpAuthAccountsMigrationVersion);
906
+ migration
907
+ .step('create-monitoring-event-indexes')
908
+ .from(smtpAuthAccountsMigrationVersion).to(monitoringEventsMigrationVersion)
909
+ .description('Create durable authentication event and email traffic bucket indexes')
910
+ .up(async (ctx) => {
911
+ await backfillRemoteIngressHubSettings(ctx, options);
912
+ await backfillEmailServerSettings(ctx, options);
913
+ await removeLegacyCentralEuDeliverRoute(ctx);
914
+ await convertLegacySmtpAuthUsers(ctx);
915
+ await createMonitoringEventIndexes(ctx);
916
+ });
917
+ if (!reaches(cachedEmailAcceptedAtIndexMigrationVersion))
918
+ return finish(monitoringEventsMigrationVersion);
919
+ migration
920
+ .step('index-cached-email-accepted-at')
921
+ .from(monitoringEventsMigrationVersion).to(cachedEmailAcceptedAtIndexMigrationVersion)
922
+ .description('Index CachedEmail.acceptedAt for retained email traffic and security views')
923
+ .up(async (ctx) => {
924
+ await backfillRemoteIngressHubSettings(ctx, options);
925
+ await backfillEmailServerSettings(ctx, options);
926
+ await removeLegacyCentralEuDeliverRoute(ctx);
927
+ await convertLegacySmtpAuthUsers(ctx);
928
+ await createCachedEmailAcceptedAtIndex(ctx);
929
+ });
930
+ if (!reaches(cachedEmailSecurityDispositionMigrationVersion))
931
+ return finish(cachedEmailAcceptedAtIndexMigrationVersion);
932
+ migration
933
+ .step('backfill-cached-email-security-disposition')
934
+ .from(cachedEmailAcceptedAtIndexMigrationVersion).to(cachedEmailSecurityDispositionMigrationVersion)
935
+ .description('Classify retained inbound authentication results without overwriting delivery state')
1307
936
  .up(async (ctx) => {
1308
- await convertRouteAccessMetadataToSourceBindings(ctx);
937
+ await backfillRemoteIngressHubSettings(ctx, options);
938
+ await backfillEmailServerSettings(ctx, options);
939
+ await removeLegacyCentralEuDeliverRoute(ctx);
940
+ await convertLegacySmtpAuthUsers(ctx);
941
+ await backfillCachedEmailSecurityDisposition(ctx);
942
+ });
943
+ if (!reaches(gatewayMailDomainAuthorityMigrationVersion))
944
+ return finish(cachedEmailSecurityDispositionMigrationVersion);
945
+ migration
946
+ .step('bridge-cached-email-security-disposition-to-gateway-mail-domain-authority')
947
+ .from(cachedEmailSecurityDispositionMigrationVersion).to(gatewayMailDomainAuthorityPreviousVersion)
948
+ .description('Bridge the 18.5.0 release before migrating WorkApp mail identity authority')
949
+ .up(async (ctx) => {
950
+ await backfillRemoteIngressHubSettings(ctx, options);
951
+ await backfillEmailServerSettings(ctx, options);
952
+ await removeLegacyCentralEuDeliverRoute(ctx);
953
+ await convertLegacySmtpAuthUsers(ctx);
1309
954
  })
1310
- .step('backfill-remote-ingress-hub-settings-current')
1311
- .from('13.43.2').to(remoteIngressHubSettingsMigrationBaseVersion)
1312
- .description('Backfill RemoteIngress hub singleton settings for current dcrouter 13.43.5 installs')
955
+ .step('migrate-gateway-mail-domain-authority')
956
+ .from(gatewayMailDomainAuthorityPreviousVersion).to(gatewayMailDomainAuthorityMigrationVersion)
957
+ .description('Move WorkApp mail identities into authoritative owner/domain SmartData documents')
1313
958
  .up(async (ctx) => {
1314
959
  await backfillRemoteIngressHubSettings(ctx, options);
1315
960
  await backfillEmailServerSettings(ctx, options);
961
+ await removeLegacyCentralEuDeliverRoute(ctx);
962
+ await convertLegacySmtpAuthUsers(ctx);
963
+ await migrateGatewayMailDomainAuthority(ctx);
1316
964
  });
1317
- if (compareSemver(targetVersion, gatewayClientRouteMetadataMigrationVersion) >= 0) {
1318
- migration
1319
- .step('normalize-gateway-client-route-metadata')
1320
- .from(remoteIngressHubSettingsMigrationBaseVersion).to(gatewayClientRouteMetadataMigrationVersion)
1321
- .description('Promote legacy workHoster route metadata to gatewayClient fields and drop the legacy fields')
1322
- .up(async (ctx) => {
1323
- await normalizeGatewayClientRouteMetadata(ctx);
1324
- await backfillRemoteIngressHubSettings(ctx, options);
1325
- await backfillEmailServerSettings(ctx, options);
1326
- });
1327
- if (compareSemver(targetVersion, gatewayClientRouteMetadataMigrationVersion) > 0) {
1328
- if (compareSemver(targetVersion, gatewayClientRoutePublicSourceMigrationVersion) >= 0) {
1329
- migration
1330
- .step('gateway-client-routes-use-public-source-profile')
1331
- .from(gatewayClientRouteMetadataMigrationVersion).to(gatewayClientRoutePublicSourceMigrationVersion)
1332
- .description('Move managed gateway-client routes from STANDARD to PUBLIC source profile')
1333
- .up(async (ctx) => {
1334
- await preferPublicSourceBindingsForGatewayClientRoutes(ctx);
1335
- await backfillRemoteIngressHubSettings(ctx, options);
1336
- await backfillEmailServerSettings(ctx, options);
1337
- });
1338
- if (compareSemver(targetVersion, gatewayClientRoutePublicSourceMigrationVersion) > 0) {
1339
- if (compareSemver(targetVersion, domainNameUniqueMigrationBaseVersion) >= 0) {
1340
- migration
1341
- .step('dedupe-domain-docs-by-name')
1342
- .from(gatewayClientRoutePublicSourceMigrationVersion).to(domainNameUniqueMigrationBaseVersion)
1343
- .description('Remove duplicate DomainDoc rows per name (oldest wins) before the unique name index')
1344
- .up(async (ctx) => {
1345
- await dedupeDomainDocsByName(ctx);
1346
- await backfillRemoteIngressHubSettings(ctx, options);
1347
- await backfillEmailServerSettings(ctx, options);
1348
- });
1349
- if (compareSemver(targetVersion, domainNameUniqueMigrationBaseVersion) > 0) {
1350
- if (compareSemver(targetVersion, emailOutboundEgressSettingsMigrationVersion) >= 0) {
1351
- migration
1352
- .step('backfill-remote-ingress-hub-settings-before-email-egress')
1353
- .from(domainNameUniqueMigrationBaseVersion).to(emailOutboundEgressSettingsMigrationPreviousVersion)
1354
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1355
- .up(async (ctx) => {
1356
- await backfillRemoteIngressHubSettings(ctx, options);
1357
- await backfillEmailServerSettings(ctx, options);
1358
- })
1359
- .step('backfill-email-outbound-and-remote-ingress-egress-settings')
1360
- .from(emailOutboundEgressSettingsMigrationPreviousVersion).to(emailOutboundEgressSettingsMigrationVersion)
1361
- .description('Backfill email outbound mode and default-disabled RemoteIngress edge egress policy')
1362
- .up(async (ctx) => {
1363
- await backfillEmailOutboundAndRemoteIngressEgressSettings(ctx, options);
1364
- });
1365
- if (compareSemver(targetVersion, emailOutboundEgressSettingsMigrationVersion) > 0) {
1366
- if (compareSemver(targetVersion, mailOverEdgesMigrationVersion) >= 0) {
1367
- migration
1368
- .step('mail-over-edges-defaults')
1369
- .from(emailOutboundEgressSettingsMigrationVersion).to(mailOverEdgesMigrationVersion)
1370
- .description('Default email outbound mode to remoteIngress and backfill CachedEmail direction metadata')
1371
- .up(async (ctx) => {
1372
- await flipEmailOutboundModeToRemoteIngress(ctx);
1373
- await backfillCachedEmailDirections(ctx);
1374
- await backfillRemoteIngressHubSettings(ctx, options);
1375
- await backfillEmailServerSettings(ctx, options);
1376
- });
1377
- if (compareSemver(targetVersion, mailOverEdgesMigrationVersion) > 0) {
1378
- if (compareSemver(targetVersion, cachedEmailStatusIndexMigrationVersion) >= 0) {
1379
- migration
1380
- .step('backfill-remote-ingress-hub-settings-before-cached-email-status-index')
1381
- .from(mailOverEdgesMigrationVersion).to(cachedEmailStatusIndexPreviousVersion)
1382
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1383
- .up(async (ctx) => {
1384
- await backfillRemoteIngressHubSettings(ctx, options);
1385
- await backfillEmailServerSettings(ctx, options);
1386
- });
1387
- migration
1388
- .step('index-cached-email-status')
1389
- .from(cachedEmailStatusIndexPreviousVersion).to(cachedEmailStatusIndexMigrationVersion)
1390
- .description('Index CachedEmail.status for bounded spool delivery scans')
1391
- .up(async (ctx) => {
1392
- const collection = ctx.mongo.collection('CachedEmail');
1393
- await collection.createIndex({ status: 1 }, { name: 'status_1' });
1394
- ctx.log.log('info', 'index-cached-email-status: ensured CachedEmail.status index');
1395
- });
1396
- if (compareSemver(targetVersion, cachedEmailStatusIndexMigrationVersion) > 0) {
1397
- if (compareSemver(targetVersion, emailDnsLifecycleMigrationVersion) >= 0) {
1398
- migration
1399
- .step('email-dns-lifecycle')
1400
- .from(cachedEmailStatusIndexMigrationVersion).to(emailDnsLifecycleMigrationVersion)
1401
- .description('Add durable email DNS lifecycle state, unique domains, and explicit managed record ownership')
1402
- .up(async (ctx) => {
1403
- await migrateEmailDnsLifecycle(ctx);
1404
- await backfillRemoteIngressHubSettings(ctx, options);
1405
- await backfillEmailServerSettings(ctx, options);
1406
- });
1407
- if (compareSemver(targetVersion, smartMtaManagedStorageMigrationVersion) >= 0) {
1408
- migration
1409
- .step('migrate-smartmta-managed-storage')
1410
- .from(emailDnsLifecycleMigrationVersion).to(smartMtaManagedStorageMigrationVersion)
1411
- .description('Import legacy SmartMTA text state into SmartData and repair sparse DNS ownership indexing')
1412
- .up(async (ctx) => {
1413
- await migrateSmartMtaManagedStorage(ctx, options);
1414
- await backfillRemoteIngressHubSettings(ctx, options);
1415
- await backfillEmailServerSettings(ctx, options);
1416
- });
1417
- if (compareSemver(targetVersion, smartMtaManagedStorageMigrationVersion) > 0) {
1418
- if (compareSemver(targetVersion, emailDnsProviderProvenanceMigrationVersion) >= 0) {
1419
- migration
1420
- .step('bridge-smartmta-storage-to-dcrouter-17')
1421
- .from(smartMtaManagedStorageMigrationVersion).to(emailDnsProviderProvenancePreviousVersion)
1422
- .description('Bridge SmartMTA storage schema to dcrouter 17.0.0')
1423
- .up(async (ctx) => {
1424
- await backfillRemoteIngressHubSettings(ctx, options);
1425
- await backfillEmailServerSettings(ctx, options);
1426
- })
1427
- .step('email-dns-provider-provenance')
1428
- .from(emailDnsProviderProvenancePreviousVersion).to(emailDnsProviderProvenanceMigrationVersion)
1429
- .description('Backfill durable provider-zone provenance for safe email DNS cleanup')
1430
- .up(async (ctx) => {
1431
- await migrateCachedEmailRawContentToBlobStorage(ctx, options);
1432
- await migrateEmailDnsProviderProvenance(ctx);
1433
- await backfillRemoteIngressHubSettings(ctx, options);
1434
- await backfillEmailServerSettings(ctx, options);
1435
- });
1436
- if (compareSemver(targetVersion, emailDnsProviderProvenanceMigrationVersion) > 0) {
1437
- if (compareSemver(targetVersion, ipIntelligenceRetentionMigrationVersion) >= 0) {
1438
- migration
1439
- .step('bridge-email-dns-provenance-to-ip-intelligence-retention')
1440
- .from(emailDnsProviderProvenanceMigrationVersion).to(ipIntelligenceRetentionPreviousVersion)
1441
- .description('Bridge email DNS provenance to the IP intelligence retention migration')
1442
- .up(async (ctx) => {
1443
- await backfillRemoteIngressHubSettings(ctx, options);
1444
- await backfillEmailServerSettings(ctx, options);
1445
- })
1446
- .step('bound-ip-intelligence-retention')
1447
- .from(ipIntelligenceRetentionPreviousVersion).to(ipIntelligenceRetentionMigrationVersion)
1448
- .description('Reset and index the rebuildable bounded IP intelligence cache')
1449
- .resumable()
1450
- .up(async (ctx) => {
1451
- await migrateIpIntelligenceRetention(ctx);
1452
- await backfillRemoteIngressHubSettings(ctx, options);
1453
- await backfillEmailServerSettings(ctx, options);
1454
- });
1455
- if (compareSemver(targetVersion, ipIntelligenceRetentionMigrationVersion) > 0) {
1456
- if (compareSemver(targetVersion, gatewayCredentialPolicyMigrationVersion) >= 0) {
1457
- migration
1458
- .step('gateway-credential-policy-bindings')
1459
- .from(ipIntelligenceRetentionMigrationVersion).to(gatewayCredentialPolicyMigrationVersion)
1460
- .description('Bind legacy gateway credentials to a durable live policy generation')
1461
- .up(async (ctx) => {
1462
- await migrateGatewayCredentialPolicyBindings(ctx);
1463
- await backfillRemoteIngressHubSettings(ctx, options);
1464
- await backfillEmailServerSettings(ctx, options);
1465
- });
1466
- if (compareSemver(targetVersion, gatewayCredentialPolicyMigrationVersion) > 0) {
1467
- if (compareSemver(targetVersion, serviceMailIdempotencyMigrationVersion) >= 0) {
1468
- migration
1469
- .step('bridge-gateway-credential-policy-to-service-mail-idempotency')
1470
- .from(gatewayCredentialPolicyMigrationVersion).to(serviceMailIdempotencyPreviousVersion)
1471
- .description('Bridge dcrouter releases before the service-mail idempotency index')
1472
- .up(async (ctx) => {
1473
- await backfillRemoteIngressHubSettings(ctx, options);
1474
- await backfillEmailServerSettings(ctx, options);
1475
- })
1476
- .step('index-service-mail-idempotency')
1477
- .from(serviceMailIdempotencyPreviousVersion).to(serviceMailIdempotencyMigrationVersion)
1478
- .description('Repair replay metadata and create the credential-scoped sparse unique service-mail index')
1479
- .up(async (ctx) => {
1480
- await migrateServiceMailIdempotencyIndex(ctx);
1481
- });
1482
- if (compareSemver(targetVersion, webPushSchemaMigrationVersion) >= 0) {
1483
- migration
1484
- .step('web-push-provider-schema')
1485
- .from(webPushSchemaPreviousVersion).to(webPushSchemaMigrationVersion)
1486
- .description('Create durable Web Push binding, delivery, idempotency, and retention indexes')
1487
- .up(async (ctx) => {
1488
- await migrateWebPushProviderSchema(ctx);
1489
- await backfillRemoteIngressHubSettings(ctx, options);
1490
- await backfillEmailServerSettings(ctx, options);
1491
- });
1492
- if (compareSemver(targetVersion, routeIngressPolicyMigrationVersion) >= 0) {
1493
- migration
1494
- .step('backfill-route-ingress-policies')
1495
- .from(routeIngressPolicyPreviousVersion).to(routeIngressPolicyMigrationVersion)
1496
- .description('Preserve existing route reachability with explicit direct hub and SmartVPN ingress policy')
1497
- .up(async (ctx) => {
1498
- await backfillRouteIngressPolicies(ctx);
1499
- await backfillRemoteIngressHubSettings(ctx, options);
1500
- await backfillEmailServerSettings(ctx, options);
1501
- });
1502
- if (compareSemver(targetVersion, routeIngressPolicyMigrationVersion) > 0) {
1503
- if (compareSemver(targetVersion, sourceProfileNetworkNormalizationMigrationVersion) >= 0) {
1504
- migration
1505
- .step('normalize-private-source-profile-networks')
1506
- .from(routeIngressPolicyMigrationVersion).to(sourceProfileNetworkNormalizationMigrationVersion)
1507
- .description('Normalize legacy private source-profile wildcards to valid CIDR notation')
1508
- .up(async (ctx) => {
1509
- await normalizeLegacyPrivateSourceProfileNetworks(ctx);
1510
- await backfillRemoteIngressHubSettings(ctx, options);
1511
- await backfillEmailServerSettings(ctx, options);
1512
- });
1513
- if (compareSemver(targetVersion, sourceProfileNetworkNormalizationMigrationVersion) > 0) {
1514
- if (compareSemver(targetVersion, gatewayDnsProxyIntentMigrationVersion) >= 0) {
1515
- migration
1516
- .step('backfill-gateway-dns-proxy-intent')
1517
- .from(sourceProfileNetworkNormalizationMigrationVersion).to(gatewayDnsProxyIntentMigrationVersion)
1518
- .description('Recover gateway route DNS proxy intent from owned provider record state')
1519
- .up(async (ctx) => {
1520
- await backfillGatewayDnsProxyIntent(ctx);
1521
- await backfillRemoteIngressHubSettings(ctx, options);
1522
- await backfillEmailServerSettings(ctx, options);
1523
- });
1524
- if (compareSemver(targetVersion, gatewayDnsProxyIntentMigrationVersion) > 0) {
1525
- if (compareSemver(targetVersion, legacyCentralEuDeliverRouteMigrationVersion) >= 0) {
1526
- migration
1527
- .step('remove-legacy-central-eu-deliver-route')
1528
- .from(gatewayDnsProxyIntentMigrationVersion).to(legacyCentralEuDeliverRouteMigrationVersion)
1529
- .description('Remove the legacy central.eu-incoming deliver route so accepted mail falls through to the domain inbound store policy')
1530
- .up(async (ctx) => {
1531
- // Backfills run first so a leapfrog upgrade that seeds the
1532
- // settings doc (including the legacy route) in this very
1533
- // step is normalized before the step completes.
1534
- await backfillRemoteIngressHubSettings(ctx, options);
1535
- await backfillEmailServerSettings(ctx, options);
1536
- await removeLegacyCentralEuDeliverRoute(ctx);
1537
- });
1538
- if (compareSemver(targetVersion, legacyCentralEuDeliverRouteMigrationVersion) > 0) {
1539
- if (compareSemver(targetVersion, smtpAuthAccountsMigrationVersion) >= 0) {
1540
- migration
1541
- .step('convert-legacy-smtp-auth-users')
1542
- .from(legacyCentralEuDeliverRouteMigrationVersion).to(smtpAuthAccountsMigrationVersion)
1543
- .description('Convert legacy plaintext emailConfig.auth.users into hashed SMTP account documents and strip the plaintext from persisted settings')
1544
- .up(async (ctx) => {
1545
- // Backfills run first so a leapfrog upgrade that seeds
1546
- // the settings doc (including plaintext users) in this
1547
- // very step is normalized before the step completes.
1548
- await backfillRemoteIngressHubSettings(ctx, options);
1549
- await backfillEmailServerSettings(ctx, options);
1550
- await removeLegacyCentralEuDeliverRoute(ctx);
1551
- await convertLegacySmtpAuthUsers(ctx);
1552
- });
1553
- if (compareSemver(targetVersion, smtpAuthAccountsMigrationVersion) > 0) {
1554
- if (compareSemver(targetVersion, monitoringEventsMigrationVersion) >= 0) {
1555
- migration
1556
- .step('create-monitoring-event-indexes')
1557
- .from(smtpAuthAccountsMigrationVersion).to(monitoringEventsMigrationVersion)
1558
- .description('Create durable authentication event and email traffic bucket indexes')
1559
- .up(async (ctx) => {
1560
- await backfillRemoteIngressHubSettings(ctx, options);
1561
- await backfillEmailServerSettings(ctx, options);
1562
- await removeLegacyCentralEuDeliverRoute(ctx);
1563
- await convertLegacySmtpAuthUsers(ctx);
1564
- await createMonitoringEventIndexes(ctx);
1565
- });
1566
- if (compareSemver(targetVersion, monitoringEventsMigrationVersion) > 0) {
1567
- if (compareSemver(targetVersion, cachedEmailAcceptedAtIndexMigrationVersion) >= 0) {
1568
- migration
1569
- .step('index-cached-email-accepted-at')
1570
- .from(monitoringEventsMigrationVersion).to(cachedEmailAcceptedAtIndexMigrationVersion)
1571
- .description('Index CachedEmail.acceptedAt for retained email traffic and security views')
1572
- .up(async (ctx) => {
1573
- await backfillRemoteIngressHubSettings(ctx, options);
1574
- await backfillEmailServerSettings(ctx, options);
1575
- await removeLegacyCentralEuDeliverRoute(ctx);
1576
- await convertLegacySmtpAuthUsers(ctx);
1577
- await createCachedEmailAcceptedAtIndex(ctx);
1578
- });
1579
- if (compareSemver(targetVersion, cachedEmailAcceptedAtIndexMigrationVersion) > 0) {
1580
- if (compareSemver(targetVersion, cachedEmailSecurityDispositionMigrationVersion) >= 0) {
1581
- migration
1582
- .step('backfill-cached-email-security-disposition')
1583
- .from(cachedEmailAcceptedAtIndexMigrationVersion).to(cachedEmailSecurityDispositionMigrationVersion)
1584
- .description('Classify retained inbound authentication results without overwriting delivery state')
1585
- .up(async (ctx) => {
1586
- await backfillRemoteIngressHubSettings(ctx, options);
1587
- await backfillEmailServerSettings(ctx, options);
1588
- await removeLegacyCentralEuDeliverRoute(ctx);
1589
- await convertLegacySmtpAuthUsers(ctx);
1590
- await backfillCachedEmailSecurityDisposition(ctx);
1591
- });
1592
- if (compareSemver(targetVersion, cachedEmailSecurityDispositionMigrationVersion) > 0) {
1593
- if (compareSemver(targetVersion, gatewayMailDomainAuthorityMigrationVersion) >= 0) {
1594
- migration
1595
- .step('bridge-cached-email-security-disposition-to-gateway-mail-domain-authority')
1596
- .from(cachedEmailSecurityDispositionMigrationVersion).to(gatewayMailDomainAuthorityPreviousVersion)
1597
- .description('Bridge the 18.5.0 release before migrating WorkApp mail identity authority')
1598
- .up(async (ctx) => {
1599
- await backfillRemoteIngressHubSettings(ctx, options);
1600
- await backfillEmailServerSettings(ctx, options);
1601
- await removeLegacyCentralEuDeliverRoute(ctx);
1602
- await convertLegacySmtpAuthUsers(ctx);
1603
- })
1604
- .step('migrate-gateway-mail-domain-authority')
1605
- .from(gatewayMailDomainAuthorityPreviousVersion).to(gatewayMailDomainAuthorityMigrationVersion)
1606
- .description('Move WorkApp mail identities into authoritative owner/domain SmartData documents')
1607
- .up(async (ctx) => {
1608
- await backfillRemoteIngressHubSettings(ctx, options);
1609
- await backfillEmailServerSettings(ctx, options);
1610
- await removeLegacyCentralEuDeliverRoute(ctx);
1611
- await convertLegacySmtpAuthUsers(ctx);
1612
- await migrateGatewayMailDomainAuthority(ctx);
1613
- });
1614
- if (compareSemver(targetVersion, smartDb5ManagedRecordKeyRepairMigrationVersion) >= 0) {
1615
- migration
1616
- .step('repair-smartdb5-managed-record-key-index')
1617
- .from(gatewayMailDomainAuthorityMigrationVersion).to(smartDb5ManagedRecordKeyRepairMigrationVersion)
1618
- .description('Replace the legacy partial managedRecordKey index with a SmartDB 5-compatible sparse unique index')
1619
- .up(async (ctx) => {
1620
- await backfillRemoteIngressHubSettings(ctx, options);
1621
- await backfillEmailServerSettings(ctx, options);
1622
- await removeLegacyCentralEuDeliverRoute(ctx);
1623
- await convertLegacySmtpAuthUsers(ctx);
1624
- await repairManagedRecordKeyIndex(ctx, 'smartdb5-managed-record-key-index');
1625
- });
1626
- if (compareSemver(targetVersion, testingAccessMigrationVersion) >= 0) {
1627
- migration
1628
- .step('testing-access-and-exact-certificate-identities')
1629
- .from(smartDb5ManagedRecordKeyRepairMigrationVersion).to(testingAccessMigrationVersion)
1630
- .description('Isolate exact certificates and initialize durable testing access and recovery indexes')
1631
- .up(async (ctx) => {
1632
- await backfillRemoteIngressHubSettings(ctx, options);
1633
- await backfillEmailServerSettings(ctx, options);
1634
- await removeLegacyCentralEuDeliverRoute(ctx);
1635
- await convertLegacySmtpAuthUsers(ctx);
1636
- await migrateTestingAccess(ctx);
1637
- });
1638
- }
1639
- else if (compareSemver(targetVersion, smartDb5ManagedRecordKeyRepairMigrationVersion) > 0) {
1640
- migration
1641
- .step('backfill-settings-after-smartdb5-managed-record-key-repair')
1642
- .from(smartDb5ManagedRecordKeyRepairMigrationVersion).to(targetVersion)
1643
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1644
- .up(async (ctx) => {
1645
- await backfillRemoteIngressHubSettings(ctx, options);
1646
- await backfillEmailServerSettings(ctx, options);
1647
- await removeLegacyCentralEuDeliverRoute(ctx);
1648
- await convertLegacySmtpAuthUsers(ctx);
1649
- });
1650
- }
1651
- }
1652
- else if (compareSemver(targetVersion, gatewayMailDomainAuthorityMigrationVersion) > 0) {
1653
- migration
1654
- .step('backfill-settings-after-gateway-mail-domain-authority')
1655
- .from(gatewayMailDomainAuthorityMigrationVersion).to(targetVersion)
1656
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1657
- .up(async (ctx) => {
1658
- await backfillRemoteIngressHubSettings(ctx, options);
1659
- await backfillEmailServerSettings(ctx, options);
1660
- await removeLegacyCentralEuDeliverRoute(ctx);
1661
- await convertLegacySmtpAuthUsers(ctx);
1662
- });
1663
- }
1664
- }
1665
- else {
1666
- migration
1667
- .step('backfill-settings-after-cached-email-security-disposition')
1668
- .from(cachedEmailSecurityDispositionMigrationVersion).to(targetVersion)
1669
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1670
- .up(async (ctx) => {
1671
- await backfillRemoteIngressHubSettings(ctx, options);
1672
- await backfillEmailServerSettings(ctx, options);
1673
- await removeLegacyCentralEuDeliverRoute(ctx);
1674
- await convertLegacySmtpAuthUsers(ctx);
1675
- });
1676
- }
1677
- }
1678
- }
1679
- else {
1680
- migration
1681
- .step('backfill-settings-after-cached-email-accepted-at-index')
1682
- .from(cachedEmailAcceptedAtIndexMigrationVersion).to(targetVersion)
1683
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1684
- .up(async (ctx) => {
1685
- await backfillRemoteIngressHubSettings(ctx, options);
1686
- await backfillEmailServerSettings(ctx, options);
1687
- await removeLegacyCentralEuDeliverRoute(ctx);
1688
- await convertLegacySmtpAuthUsers(ctx);
1689
- });
1690
- }
1691
- }
1692
- }
1693
- else {
1694
- migration
1695
- .step('backfill-settings-after-monitoring-event-indexes')
1696
- .from(monitoringEventsMigrationVersion).to(targetVersion)
1697
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1698
- .up(async (ctx) => {
1699
- await backfillRemoteIngressHubSettings(ctx, options);
1700
- await backfillEmailServerSettings(ctx, options);
1701
- // Later bridges must keep every settings safeguard:
1702
- // legacy bootstrap config can reintroduce retired
1703
- // routes and plaintext SMTP auth users.
1704
- await removeLegacyCentralEuDeliverRoute(ctx);
1705
- await convertLegacySmtpAuthUsers(ctx);
1706
- });
1707
- }
1708
- }
1709
- }
1710
- else {
1711
- migration
1712
- .step('backfill-settings-after-smtp-auth-account-conversion')
1713
- .from(smtpAuthAccountsMigrationVersion).to(targetVersion)
1714
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1715
- .up(async (ctx) => {
1716
- await backfillRemoteIngressHubSettings(ctx, options);
1717
- await backfillEmailServerSettings(ctx, options);
1718
- await removeLegacyCentralEuDeliverRoute(ctx);
1719
- await convertLegacySmtpAuthUsers(ctx);
1720
- });
1721
- }
1722
- }
1723
- }
1724
- else {
1725
- migration
1726
- .step('backfill-settings-after-legacy-deliver-route-removal')
1727
- .from(legacyCentralEuDeliverRouteMigrationVersion).to(targetVersion)
1728
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1729
- .up(async (ctx) => {
1730
- await backfillRemoteIngressHubSettings(ctx, options);
1731
- await backfillEmailServerSettings(ctx, options);
1732
- // The backfill re-seeds emailConfig from a legacy
1733
- // config.json whenever the persisted doc lost it, so
1734
- // every later upgrade must strip the legacy route again.
1735
- await removeLegacyCentralEuDeliverRoute(ctx);
1736
- });
1737
- }
1738
- }
1739
- }
1740
- else {
1741
- migration
1742
- .step('backfill-settings-after-gateway-dns-proxy-intent')
1743
- .from(gatewayDnsProxyIntentMigrationVersion).to(targetVersion)
1744
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1745
- .up(async (ctx) => {
1746
- await backfillRemoteIngressHubSettings(ctx, options);
1747
- await backfillEmailServerSettings(ctx, options);
1748
- });
1749
- }
1750
- }
1751
- }
1752
- else {
1753
- migration
1754
- .step('backfill-settings-after-source-profile-network-normalization')
1755
- .from(sourceProfileNetworkNormalizationMigrationVersion).to(targetVersion)
1756
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1757
- .up(async (ctx) => {
1758
- await backfillRemoteIngressHubSettings(ctx, options);
1759
- await backfillEmailServerSettings(ctx, options);
1760
- });
1761
- }
1762
- }
1763
- }
1764
- else {
1765
- migration
1766
- .step('backfill-settings-after-route-ingress-policies')
1767
- .from(routeIngressPolicyMigrationVersion).to(targetVersion)
1768
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1769
- .up(async (ctx) => {
1770
- await backfillRemoteIngressHubSettings(ctx, options);
1771
- await backfillEmailServerSettings(ctx, options);
1772
- });
1773
- }
1774
- }
1775
- }
1776
- else if (compareSemver(targetVersion, webPushSchemaMigrationVersion) > 0) {
1777
- migration
1778
- .step('backfill-settings-after-web-push-provider-schema')
1779
- .from(webPushSchemaMigrationVersion).to(targetVersion)
1780
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1781
- .up(async (ctx) => {
1782
- await backfillRemoteIngressHubSettings(ctx, options);
1783
- await backfillEmailServerSettings(ctx, options);
1784
- });
1785
- }
1786
- }
1787
- else if (compareSemver(targetVersion, serviceMailIdempotencyMigrationVersion) > 0) {
1788
- migration
1789
- .step('backfill-settings-after-service-mail-idempotency')
1790
- .from(serviceMailIdempotencyMigrationVersion).to(targetVersion)
1791
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1792
- .up(async (ctx) => {
1793
- await backfillRemoteIngressHubSettings(ctx, options);
1794
- await backfillEmailServerSettings(ctx, options);
1795
- });
1796
- }
1797
- }
1798
- else {
1799
- migration
1800
- .step('backfill-settings-after-gateway-credential-policy-bindings')
1801
- .from(gatewayCredentialPolicyMigrationVersion).to(targetVersion)
1802
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1803
- .up(async (ctx) => {
1804
- await backfillRemoteIngressHubSettings(ctx, options);
1805
- await backfillEmailServerSettings(ctx, options);
1806
- });
1807
- }
1808
- }
1809
- }
1810
- else {
1811
- migration
1812
- .step('backfill-remote-ingress-hub-settings-after-ip-intelligence-retention')
1813
- .from(ipIntelligenceRetentionMigrationVersion).to(targetVersion)
1814
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1815
- .up(async (ctx) => {
1816
- await backfillRemoteIngressHubSettings(ctx, options);
1817
- await backfillEmailServerSettings(ctx, options);
1818
- });
1819
- }
1820
- }
1821
- }
1822
- else {
1823
- migration
1824
- .step('backfill-remote-ingress-hub-settings-after-email-dns-provenance')
1825
- .from(emailDnsProviderProvenanceMigrationVersion).to(targetVersion)
1826
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1827
- .up(async (ctx) => {
1828
- await backfillRemoteIngressHubSettings(ctx, options);
1829
- await backfillEmailServerSettings(ctx, options);
1830
- });
1831
- }
1832
- }
1833
- }
1834
- else {
1835
- migration
1836
- .step('backfill-remote-ingress-hub-settings-after-smartmta-storage')
1837
- .from(smartMtaManagedStorageMigrationVersion).to(targetVersion)
1838
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1839
- .up(async (ctx) => {
1840
- await backfillRemoteIngressHubSettings(ctx, options);
1841
- await backfillEmailServerSettings(ctx, options);
1842
- });
1843
- }
1844
- }
1845
- }
1846
- }
1847
- else {
1848
- migration
1849
- .step('backfill-remote-ingress-hub-settings-after-cached-email-status-index')
1850
- .from(cachedEmailStatusIndexMigrationVersion).to(targetVersion)
1851
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1852
- .up(async (ctx) => {
1853
- await backfillRemoteIngressHubSettings(ctx, options);
1854
- await backfillEmailServerSettings(ctx, options);
1855
- });
1856
- }
1857
- }
1858
- }
1859
- else {
1860
- migration
1861
- .step('backfill-remote-ingress-hub-settings-after-mail-over-edges')
1862
- .from(mailOverEdgesMigrationVersion).to(targetVersion)
1863
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1864
- .up(async (ctx) => {
1865
- await backfillRemoteIngressHubSettings(ctx, options);
1866
- await backfillEmailServerSettings(ctx, options);
1867
- });
1868
- }
1869
- }
1870
- }
1871
- else {
1872
- migration
1873
- .step('backfill-remote-ingress-hub-settings-after-email-egress')
1874
- .from(emailOutboundEgressSettingsMigrationVersion).to(targetVersion)
1875
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1876
- .up(async (ctx) => {
1877
- await backfillRemoteIngressHubSettings(ctx, options);
1878
- await backfillEmailServerSettings(ctx, options);
1879
- });
1880
- }
1881
- }
1882
- }
1883
- else {
1884
- migration
1885
- .step('backfill-remote-ingress-hub-settings')
1886
- .from(domainNameUniqueMigrationBaseVersion).to(targetVersion)
1887
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1888
- .up(async (ctx) => {
1889
- await backfillRemoteIngressHubSettings(ctx, options);
1890
- await backfillEmailServerSettings(ctx, options);
1891
- });
1892
- }
1893
- }
1894
- }
1895
- else {
1896
- migration
1897
- .step('backfill-remote-ingress-hub-settings')
1898
- .from(gatewayClientRoutePublicSourceMigrationVersion).to(targetVersion)
1899
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1900
- .up(async (ctx) => {
1901
- await backfillRemoteIngressHubSettings(ctx, options);
1902
- await backfillEmailServerSettings(ctx, options);
1903
- });
1904
- }
1905
- }
1906
- }
1907
- else {
1908
- migration
1909
- .step('backfill-remote-ingress-hub-settings')
1910
- .from(gatewayClientRouteMetadataMigrationVersion).to(targetVersion)
1911
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1912
- .up(async (ctx) => {
1913
- await backfillRemoteIngressHubSettings(ctx, options);
1914
- await backfillEmailServerSettings(ctx, options);
1915
- });
1916
- }
1917
- }
1918
- }
1919
- else if (compareSemver(targetVersion, remoteIngressHubSettingsMigrationBaseVersion) > 0) {
1920
- migration
1921
- .step('backfill-remote-ingress-hub-settings')
1922
- .from(remoteIngressHubSettingsMigrationBaseVersion).to(targetVersion)
1923
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1924
- .up(async (ctx) => {
1925
- await backfillRemoteIngressHubSettings(ctx, options);
1926
- await backfillEmailServerSettings(ctx, options);
1927
- });
1928
- }
1929
- return migration;
965
+ if (!reaches(smartDb5ManagedRecordKeyRepairMigrationVersion))
966
+ return finish(gatewayMailDomainAuthorityMigrationVersion);
967
+ migration
968
+ .step('repair-smartdb5-managed-record-key-index')
969
+ .from(gatewayMailDomainAuthorityMigrationVersion).to(smartDb5ManagedRecordKeyRepairMigrationVersion)
970
+ .description('Replace the legacy partial managedRecordKey index with a SmartDB 5-compatible sparse unique index')
971
+ .up(async (ctx) => {
972
+ await backfillRemoteIngressHubSettings(ctx, options);
973
+ await backfillEmailServerSettings(ctx, options);
974
+ await removeLegacyCentralEuDeliverRoute(ctx);
975
+ await convertLegacySmtpAuthUsers(ctx);
976
+ await repairManagedRecordKeyIndex(ctx, 'smartdb5-managed-record-key-index');
977
+ });
978
+ if (!reaches(testingAccessMigrationVersion))
979
+ return finish(smartDb5ManagedRecordKeyRepairMigrationVersion);
980
+ migration
981
+ .step('testing-access-and-exact-certificate-identities')
982
+ .from(smartDb5ManagedRecordKeyRepairMigrationVersion).to(testingAccessMigrationVersion)
983
+ .description('Isolate exact certificates and initialize durable testing access and recovery indexes')
984
+ .up(async (ctx) => {
985
+ await backfillRemoteIngressHubSettings(ctx, options);
986
+ await backfillEmailServerSettings(ctx, options);
987
+ await removeLegacyCentralEuDeliverRoute(ctx);
988
+ await convertLegacySmtpAuthUsers(ctx);
989
+ await migrateTestingAccess(ctx);
990
+ });
991
+ if (!reaches(webPushEncryptionContextMigrationVersion))
992
+ return finish(testingAccessMigrationVersion);
993
+ migration
994
+ .step('webpush-encryption-context')
995
+ .from(testingAccessMigrationVersion).to(webPushEncryptionContextMigrationVersion)
996
+ .description('Reseal every Web Push envelope under the associated data of interfaces 32')
997
+ .resumable()
998
+ .up(async (ctx) => {
999
+ await migrateWebPushEncryptionContext(ctx, options);
1000
+ });
1001
+ if (!reaches(coreMailPeerVerifierFormatMigrationVersion))
1002
+ return finish(webPushEncryptionContextMigrationVersion);
1003
+ migration
1004
+ .step('coremail-peer-verifier-format')
1005
+ .from(webPushEncryptionContextMigrationVersion).to(coreMailPeerVerifierFormatMigrationVersion)
1006
+ .description('Rewrite stored CoreMail gateway peer verifier formats to the unsuffixed argon2id contract token')
1007
+ .up(async (ctx) => {
1008
+ await migrateCoreMailPeerVerifierFormat(ctx);
1009
+ });
1010
+ return finish(coreMailPeerVerifierFormatMigrationVersion);
1930
1011
  }
1931
- const domainNameUniqueMigrationBaseVersion = '15.0.5';
1932
- const emailOutboundEgressSettingsMigrationPreviousVersion = '15.6.1';
1933
- const emailOutboundEgressSettingsMigrationVersion = '15.6.2';
1934
- const mailOverEdgesMigrationVersion = '16.0.0';
1935
- const cachedEmailStatusIndexPreviousVersion = '16.4.0';
1936
- const cachedEmailStatusIndexMigrationVersion = '16.4.1';
1937
- const emailDnsLifecycleMigrationVersion = '16.5.0';
1938
- const smartMtaManagedStorageMigrationVersion = '16.5.1';
1939
- const emailDnsProviderProvenancePreviousVersion = '17.0.0';
1940
- const emailDnsProviderProvenanceMigrationVersion = '17.1.0';
1941
- const ipIntelligenceRetentionPreviousVersion = '17.1.4';
1942
- const ipIntelligenceRetentionMigrationVersion = '17.1.5';
1943
- const gatewayCredentialPolicyMigrationVersion = '17.3.0';
1944
1012
  const serviceMailIdempotencyPreviousVersion = '17.7.2';
1945
1013
  const serviceMailIdempotencyMigrationVersion = '17.7.3';
1946
1014
  const webPushSchemaPreviousVersion = serviceMailIdempotencyMigrationVersion;
@@ -1958,12 +1026,13 @@ const gatewayMailDomainAuthorityPreviousVersion = '18.5.0';
1958
1026
  const gatewayMailDomainAuthorityMigrationVersion = '18.6.0';
1959
1027
  const smartDb5ManagedRecordKeyRepairMigrationVersion = '18.8.0';
1960
1028
  const testingAccessMigrationVersion = '19.1.0';
1961
- const cachedEmailRawContentMigrationBatchSize = 25;
1029
+ const webPushEncryptionContextMigrationVersion = '19.2.0';
1030
+ const coreMailPeerVerifierFormatMigrationVersion = '32.0.0';
1962
1031
  const legacyWorkAppMailIdentityStorageKey = '/workhosters/mail-identities.json';
1963
1032
  const gatewayMailDomainOwnerIndexName = 'gateway_mail_domain_owner_domain_unique';
1964
1033
  function normalizeGatewayMailDomainMigrationDocument(documentArg) {
1965
1034
  if (!documentArg || typeof documentArg !== 'object' || Array.isArray(documentArg)) {
1966
- throw new Error('GatewayMailDomainDoc must be an object');
1035
+ throw new DcRouterMigrationError('GatewayMailDomainDoc must be an object');
1967
1036
  }
1968
1037
  const owner = normalizeGatewayMailDomainOwner({
1969
1038
  gatewayClientType: documentArg.ownerGatewayClientType,
@@ -1972,14 +1041,14 @@ function normalizeGatewayMailDomainMigrationDocument(documentArg) {
1972
1041
  const domain = normalizeGatewayMailDomain(documentArg.domain);
1973
1042
  const expectedId = createGatewayMailDomainId(owner, domain);
1974
1043
  if (documentArg.id !== expectedId) {
1975
- throw new Error(`GatewayMailDomainDoc has a non-canonical id: ${documentArg.id}`);
1044
+ throw new DcRouterMigrationError(`GatewayMailDomainDoc has a non-canonical id: ${documentArg.id}`);
1976
1045
  }
1977
1046
  const groups = groupGatewayMailIdentities(documentArg.identities || []);
1978
1047
  if (groups.length !== 1 || groups[0].id !== expectedId) {
1979
- throw new Error(`GatewayMailDomainDoc identities do not match owner/domain: ${expectedId}`);
1048
+ throw new DcRouterMigrationError(`GatewayMailDomainDoc identities do not match owner/domain: ${expectedId}`);
1980
1049
  }
1981
1050
  if (!Number.isSafeInteger(documentArg.createdAt) || !Number.isSafeInteger(documentArg.updatedAt)) {
1982
- throw new Error(`GatewayMailDomainDoc timestamps are invalid: ${expectedId}`);
1051
+ throw new DcRouterMigrationError(`GatewayMailDomainDoc timestamps are invalid: ${expectedId}`);
1983
1052
  }
1984
1053
  return {
1985
1054
  id: expectedId,
@@ -1997,14 +1066,14 @@ function parseLegacyWorkAppMailIdentities(documentArg) {
1997
1066
  || documentArg.id !== expectedId
1998
1067
  || documentArg.key !== legacyWorkAppMailIdentityStorageKey
1999
1068
  || typeof documentArg.value !== 'string') {
2000
- throw new Error('Legacy WorkApp mail identity storage document is corrupt');
1069
+ throw new DcRouterMigrationError('Legacy WorkApp mail identity storage document is corrupt');
2001
1070
  }
2002
1071
  let parsed;
2003
1072
  try {
2004
1073
  parsed = JSON.parse(documentArg.value);
2005
1074
  }
2006
1075
  catch (error) {
2007
- throw new Error(`Legacy WorkApp mail identity JSON is malformed: ${error.message}`);
1076
+ throw new DcRouterMigrationError(`Legacy WorkApp mail identity JSON is malformed: ${error.message}`);
2008
1077
  }
2009
1078
  if (Array.isArray(parsed))
2010
1079
  return parsed;
@@ -2012,7 +1081,7 @@ function parseLegacyWorkAppMailIdentities(documentArg) {
2012
1081
  || typeof parsed !== 'object'
2013
1082
  || parsed.version !== 1
2014
1083
  || !Array.isArray(parsed.identities)) {
2015
- throw new Error('Legacy WorkApp mail identity state must use version 1 with an identities array');
1084
+ throw new DcRouterMigrationError('Legacy WorkApp mail identity state must use version 1 with an identities array');
2016
1085
  }
2017
1086
  return parsed.identities;
2018
1087
  }
@@ -2045,7 +1114,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
2045
1114
  normalized.domain,
2046
1115
  ]);
2047
1116
  if (canonicalKeys.has(canonicalKey) || existingById.has(normalized.id)) {
2048
- throw new Error(`Conflicting GatewayMailDomainDoc authority: ${normalized.id}`);
1117
+ throw new DcRouterMigrationError(`Conflicting GatewayMailDomainDoc authority: ${normalized.id}`);
2049
1118
  }
2050
1119
  canonicalKeys.add(canonicalKey);
2051
1120
  existingById.set(normalized.id, normalized);
@@ -2054,7 +1123,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
2054
1123
  for (const existingDocument of existingById.values()) {
2055
1124
  const desiredDocument = desiredById.get(existingDocument.id);
2056
1125
  if (!desiredDocument || JSON.stringify(existingDocument) !== JSON.stringify(desiredDocument)) {
2057
- throw new Error(`GatewayMailDomainDoc conflicts with legacy authority: ${existingDocument.id}`);
1126
+ throw new DcRouterMigrationError(`GatewayMailDomainDoc conflicts with legacy authority: ${existingDocument.id}`);
2058
1127
  }
2059
1128
  }
2060
1129
  for (const desiredDocument of desiredDocuments) {
@@ -2071,7 +1140,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
2071
1140
  ? [...desiredDocuments].sort((leftArg, rightArg) => leftArg.id.localeCompare(rightArg.id))
2072
1141
  : normalizedPersisted;
2073
1142
  if (JSON.stringify(normalizedPersisted) !== JSON.stringify(expectedDocuments)) {
2074
- throw new Error('GatewayMailDomainDoc migration verification failed');
1143
+ throw new DcRouterMigrationError('GatewayMailDomainDoc migration verification failed');
2075
1144
  }
2076
1145
  await domainCollection.createIndex({
2077
1146
  ownerGatewayClientType: 1,
@@ -2090,7 +1159,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
2090
1159
  ownerGatewayClientId: 1,
2091
1160
  domain: 1,
2092
1161
  })) {
2093
- throw new Error('GatewayMailDomainDoc unique owner/domain index verification failed');
1162
+ throw new DcRouterMigrationError('GatewayMailDomainDoc unique owner/domain index verification failed');
2094
1163
  }
2095
1164
  if (sourceDocument) {
2096
1165
  const deleted = await storageCollection.deleteOne({
@@ -2100,7 +1169,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
2100
1169
  value: sourceDocument.value,
2101
1170
  });
2102
1171
  if (deleted.deletedCount !== 1) {
2103
- throw new Error('Legacy WorkApp mail identity authority changed during migration');
1172
+ throw new DcRouterMigrationError('Legacy WorkApp mail identity authority changed during migration');
2104
1173
  }
2105
1174
  }
2106
1175
  ctx.log.log('info', `migrate-gateway-mail-domain-authority: verified ${normalizedPersisted.length} owner/domain document(s)`);
@@ -2213,148 +1282,6 @@ async function createMonitoringEventIndexes(ctx) {
2213
1282
  ]);
2214
1283
  ctx.log.log('info', 'create-monitoring-event-indexes: ensured authentication and email traffic indexes');
2215
1284
  }
2216
- async function lstatOrNull(targetPath) {
2217
- try {
2218
- return await nodeFs.lstat(targetPath);
2219
- }
2220
- catch (error) {
2221
- if (error.code === 'ENOENT')
2222
- return null;
2223
- throw error;
2224
- }
2225
- }
2226
- function assertLegacyPathContained(rootPath, targetPath) {
2227
- const resolvedRoot = nodePath.resolve(rootPath);
2228
- const resolvedTarget = nodePath.resolve(targetPath);
2229
- if (resolvedTarget !== resolvedRoot
2230
- && !resolvedTarget.startsWith(`${resolvedRoot}${nodePath.sep}`)) {
2231
- throw new Error(`Legacy SmartMTA path escapes configured root: ${targetPath}`);
2232
- }
2233
- }
2234
- async function collectLegacySmartMtaEntry(rootPath, relativePath, recursive, entries) {
2235
- const targetPath = nodePath.resolve(rootPath, relativePath);
2236
- assertLegacyPathContained(rootPath, targetPath);
2237
- const stat = await lstatOrNull(targetPath);
2238
- if (!stat)
2239
- return;
2240
- if (stat.isSymbolicLink()) {
2241
- throw new Error(`Legacy SmartMTA migration refuses symbolic link: ${targetPath}`);
2242
- }
2243
- if (stat.isDirectory()) {
2244
- if (!recursive) {
2245
- throw new Error(`Expected regular legacy SmartMTA file: ${targetPath}`);
2246
- }
2247
- const children = await nodeFs.readdir(targetPath);
2248
- for (const child of children.sort()) {
2249
- await collectLegacySmartMtaEntry(rootPath, nodePath.join(relativePath, child), true, entries);
2250
- }
2251
- return;
2252
- }
2253
- if (!stat.isFile()) {
2254
- throw new Error(`Legacy SmartMTA migration refuses non-regular file: ${targetPath}`);
2255
- }
2256
- const storageKey = normalizeSmartMtaStorageKey(`/${relativePath.split(nodePath.sep).join('/')}`);
2257
- const namespace = getSmartMtaTextNamespace(storageKey);
2258
- if (stat.size > namespace.maxBytes) {
2259
- throw new Error(`Legacy SmartMTA file ${targetPath} exceeds ${namespace.maxBytes} bytes`);
2260
- }
2261
- const contents = await nodeFs.readFile(targetPath);
2262
- let value;
2263
- try {
2264
- value = new TextDecoder('utf-8', { fatal: true }).decode(contents);
2265
- }
2266
- catch {
2267
- throw new Error(`Legacy SmartMTA file is not valid UTF-8: ${targetPath}`);
2268
- }
2269
- validateSmartMtaTextValue(storageKey, value);
2270
- entries.push({
2271
- key: storageKey,
2272
- value,
2273
- createdAt: stat.birthtime?.toISOString?.() || stat.mtime.toISOString(),
2274
- });
2275
- }
2276
- function validateSmartMtaStorageDocument(document) {
2277
- const normalizedKey = normalizeSmartMtaStorageKey(document.key);
2278
- const expectedId = hashSmartMtaStorageKey(normalizedKey);
2279
- if (document._id !== expectedId
2280
- || document.id !== expectedId
2281
- || document.key !== normalizedKey
2282
- || typeof document.value !== 'string') {
2283
- throw new Error(`Corrupt SmartMtaStorageDoc encountered during migration: ${document._id}`);
2284
- }
2285
- validateSmartMtaTextValue(document.key, document.value);
2286
- }
2287
- function validateDkimPair(domain, selector, privateKeyPem, publicKeyPem) {
2288
- let privateKey;
2289
- let publicKey;
2290
- try {
2291
- privateKey = nodeCrypto.createPrivateKey(privateKeyPem);
2292
- publicKey = nodeCrypto.createPublicKey(publicKeyPem);
2293
- }
2294
- catch (error) {
2295
- throw new Error(`Invalid DKIM PEM for ${selector}._domainkey.${domain}: ${error.message}`);
2296
- }
2297
- const derivedPublicKey = nodeCrypto.createPublicKey(privateKeyPem).export({
2298
- type: 'spki',
2299
- format: 'der',
2300
- });
2301
- const storedPublicKey = publicKey.export({
2302
- type: 'spki',
2303
- format: 'der',
2304
- });
2305
- if (derivedPublicKey.length !== storedPublicKey.length
2306
- || !nodeCrypto.timingSafeEqual(derivedPublicKey, storedPublicKey)) {
2307
- throw new Error(`DKIM private/public key mismatch for ${selector}._domainkey.${domain}`);
2308
- }
2309
- const rsaKeySize = privateKey.asymmetricKeyDetails?.modulusLength;
2310
- return {
2311
- domain,
2312
- selector,
2313
- publicKey: storedPublicKey.toString('base64'),
2314
- keySize: rsaKeySize || (privateKey.asymmetricKeyType === 'ed25519' ? 256 : 2048),
2315
- };
2316
- }
2317
- function extractDkimPairs(storageDocuments) {
2318
- const grouped = new Map();
2319
- for (const document of storageDocuments) {
2320
- validateSmartMtaStorageDocument(document);
2321
- const segments = document.key.split('/').filter(Boolean);
2322
- if (segments[0] !== 'email' || segments[1] !== 'dkim')
2323
- continue;
2324
- let domain;
2325
- let selector;
2326
- let filename;
2327
- if (segments.length === 4) {
2328
- [, , domain, filename] = segments;
2329
- selector = 'default';
2330
- }
2331
- else if (segments.length === 5) {
2332
- [, , domain, selector, filename] = segments;
2333
- }
2334
- else {
2335
- continue;
2336
- }
2337
- if (filename !== 'private.key' && filename !== 'public.key')
2338
- continue;
2339
- domain = domain.trim().toLowerCase();
2340
- selector = selector.trim().toLowerCase();
2341
- const groupKey = `${domain}\0${selector}`;
2342
- const group = grouped.get(groupKey) || { domain, selector };
2343
- if (filename === 'private.key')
2344
- group.privateKey = document.value;
2345
- if (filename === 'public.key')
2346
- group.publicKey = document.value;
2347
- grouped.set(groupKey, group);
2348
- }
2349
- const pairs = [];
2350
- for (const group of grouped.values()) {
2351
- if (!group.privateKey || !group.publicKey) {
2352
- throw new Error(`Incomplete DKIM keypair for ${group.selector}._domainkey.${group.domain}`);
2353
- }
2354
- pairs.push(validateDkimPair(group.domain, group.selector, group.privateKey, group.publicKey));
2355
- }
2356
- return pairs;
2357
- }
2358
1285
  async function repairManagedRecordKeyIndex(ctx, logPrefix) {
2359
1286
  const collection = ctx.mongo.collection('DnsRecordDoc');
2360
1287
  if (typeof collection.dropIndex === 'function') {
@@ -2384,408 +1311,6 @@ async function repairManagedRecordKeyIndex(ctx, logPrefix) {
2384
1311
  });
2385
1312
  ctx.log.log('info', `${logPrefix}: repaired managedRecordKey index and removed ${cleaned} non-string key(s)`);
2386
1313
  }
2387
- async function migrateSmartMtaManagedStorage(ctx, options) {
2388
- const storageCollection = ctx.mongo.collection('SmartMtaStorageDoc');
2389
- const legacyRoot = options.legacySmartMtaStoragePath;
2390
- let imported = 0;
2391
- let existing = 0;
2392
- if (legacyRoot) {
2393
- const rootStat = await lstatOrNull(legacyRoot);
2394
- if (rootStat?.isSymbolicLink()) {
2395
- throw new Error(`Legacy SmartMTA storage root must not be a symbolic link: ${legacyRoot}`);
2396
- }
2397
- if (rootStat && !rootStat.isDirectory()) {
2398
- throw new Error(`Legacy SmartMTA storage root must be a directory: ${legacyRoot}`);
2399
- }
2400
- const legacyEntries = [];
2401
- for (const relativePath of [
2402
- 'email/dkim',
2403
- 'email/dns',
2404
- 'email/bounces',
2405
- 'email/templates',
2406
- 'security',
2407
- ]) {
2408
- await collectLegacySmartMtaEntry(legacyRoot, relativePath, true, legacyEntries);
2409
- }
2410
- for (const relativePath of [
2411
- 'email/routes/config.json',
2412
- 'workhosters/mail-identities.json',
2413
- ]) {
2414
- await collectLegacySmartMtaEntry(legacyRoot, relativePath, false, legacyEntries);
2415
- }
2416
- for (const entry of legacyEntries) {
2417
- const id = hashSmartMtaStorageKey(entry.key);
2418
- const stored = await storageCollection.findOne({ _id: id });
2419
- if (stored) {
2420
- validateSmartMtaStorageDocument(stored);
2421
- if (stored.key !== entry.key || stored.value !== entry.value) {
2422
- throw new Error(`Legacy SmartMTA storage conflict for ${entry.key}`);
2423
- }
2424
- existing++;
2425
- continue;
2426
- }
2427
- const now = new Date().toISOString();
2428
- await storageCollection.insertOne({
2429
- _id: id,
2430
- id,
2431
- key: entry.key,
2432
- value: entry.value,
2433
- createdAt: entry.createdAt,
2434
- updatedAt: now,
2435
- });
2436
- imported++;
2437
- }
2438
- }
2439
- const dkimDocuments = await storageCollection.find({
2440
- key: {
2441
- $gte: '/email/dkim/',
2442
- $lt: '/email/dkim/\uffff',
2443
- },
2444
- }).toArray();
2445
- const dkimPairs = extractDkimPairs(dkimDocuments);
2446
- const pairsByDomain = new Map(dkimPairs.map((pair) => [`${pair.domain}\0${pair.selector}`, pair]));
2447
- const emailCollection = ctx.mongo.collection('EmailDomainDoc');
2448
- const emailDomains = await emailCollection.find({}).toArray();
2449
- let hydratedDomains = 0;
2450
- for (const emailDomain of emailDomains) {
2451
- const domain = String(emailDomain.domain || '').trim().toLowerCase();
2452
- const selector = String(emailDomain.dkim?.selector || 'default').trim().toLowerCase();
2453
- const pair = pairsByDomain.get(`${domain}\0${selector}`);
2454
- if (!pair)
2455
- continue;
2456
- const setPatch = {};
2457
- if (typeof emailDomain.dkim?.publicKey !== 'string' || !emailDomain.dkim.publicKey.trim()) {
2458
- setPatch['dkim.publicKey'] = pair.publicKey;
2459
- }
2460
- if (!emailDomain.activeDkim) {
2461
- setPatch.activeDkim = {
2462
- selector: pair.selector,
2463
- keySize: Number(emailDomain.dkim?.keySize) || pair.keySize,
2464
- publicKey: pair.publicKey,
2465
- createdAt: String(emailDomain.createdAt || new Date().toISOString()),
2466
- };
2467
- }
2468
- const reconciliationErrors = Array.isArray(emailDomain.reconciliation?.errors)
2469
- ? emailDomain.reconciliation.errors
2470
- : [];
2471
- if (reconciliationErrors.some((error) => error?.code === 'DKIM_KEY_UNAVAILABLE')) {
2472
- setPatch.reconciliation = {
2473
- ...emailDomain.reconciliation,
2474
- lifecycleStatus: 'pending',
2475
- desiredGeneration: Number(emailDomain.reconciliation?.desiredGeneration || 0) + 1,
2476
- errors: reconciliationErrors.filter((error) => error?.code !== 'DKIM_KEY_UNAVAILABLE'),
2477
- retryAt: new Date().toISOString(),
2478
- };
2479
- }
2480
- if (Object.keys(setPatch).length > 0) {
2481
- await emailCollection.updateOne({ _id: emailDomain._id }, { $set: setPatch });
2482
- hydratedDomains++;
2483
- }
2484
- }
2485
- await repairManagedRecordKeyIndex(ctx, 'smartmta-managed-storage');
2486
- ctx.log.log('info', `smartmta-managed-storage: imported ${imported}, already present ${existing}, validated ${dkimPairs.length} DKIM pair(s), hydrated ${hydratedDomains} domain(s)`);
2487
- }
2488
- async function migrateEmailDnsLifecycle(ctx) {
2489
- const emailCollection = ctx.mongo.collection('EmailDomainDoc');
2490
- const dnsCollection = ctx.mongo.collection('DnsRecordDoc');
2491
- const emailDocs = await emailCollection.find({}).toArray();
2492
- const byDomain = new Map();
2493
- for (const doc of emailDocs) {
2494
- const normalizedDomain = String(doc.domain || '').trim().toLowerCase();
2495
- if (!normalizedDomain)
2496
- continue;
2497
- if (doc.domain !== normalizedDomain) {
2498
- await emailCollection.updateOne({ _id: doc._id }, { $set: { domain: normalizedDomain } });
2499
- doc.domain = normalizedDomain;
2500
- }
2501
- const group = byDomain.get(normalizedDomain) || [];
2502
- group.push(doc);
2503
- byDomain.set(normalizedDomain, group);
2504
- }
2505
- let duplicateDomainsRemoved = 0;
2506
- for (const [domain, docs] of byDomain) {
2507
- docs.sort((a, b) => String(a.createdAt || '').localeCompare(String(b.createdAt || '')));
2508
- const survivor = docs[0];
2509
- for (const duplicate of docs.slice(1)) {
2510
- const patch = {};
2511
- for (const field of ['rateLimits', 'remoteIngress']) {
2512
- if (survivor[field] === undefined && duplicate[field] !== undefined) {
2513
- patch[field] = duplicate[field];
2514
- survivor[field] = duplicate[field];
2515
- }
2516
- }
2517
- if (Object.keys(patch).length > 0) {
2518
- await emailCollection.updateOne({ _id: survivor._id }, { $set: patch });
2519
- }
2520
- await emailCollection.deleteOne({ _id: duplicate._id });
2521
- duplicateDomainsRemoved++;
2522
- }
2523
- const dkim = survivor.dkim || {};
2524
- const publicKey = typeof dkim.publicKey === 'string' ? dkim.publicKey.trim() : '';
2525
- const now = new Date().toISOString();
2526
- const setPatch = {};
2527
- if (!Number.isInteger(dkim.retirementOverlapDays)) {
2528
- setPatch['dkim.retirementOverlapDays'] = 30;
2529
- }
2530
- if (!survivor.reconciliation) {
2531
- setPatch.reconciliation = {
2532
- lifecycleStatus: 'pending',
2533
- desiredGeneration: 1,
2534
- intents: [],
2535
- errors: [{
2536
- code: 'EGRESS_IDENTITY_PROOF_UNAVAILABLE',
2537
- message: 'RemoteIngress egress identity proof is unavailable until the capability release is consumed',
2538
- retryable: true,
2539
- }],
2540
- capability: {
2541
- egressIdentityProof: 'unsupported',
2542
- selectorCorrectSigning: dkim.selector === 'default' ? 'supported' : 'unsupported',
2543
- },
2544
- retryAt: new Date(Date.now() + 300_000).toISOString(),
2545
- };
2546
- }
2547
- if (publicKey && !survivor.activeDkim) {
2548
- setPatch.activeDkim = {
2549
- selector: String(dkim.selector || 'default'),
2550
- keySize: Number(dkim.keySize) || 2048,
2551
- publicKey,
2552
- createdAt: String(survivor.createdAt || now),
2553
- };
2554
- }
2555
- if (Object.keys(setPatch).length > 0) {
2556
- await emailCollection.updateOne({ _id: survivor._id }, { $set: setPatch });
2557
- }
2558
- byDomain.set(domain, [survivor]);
2559
- }
2560
- await emailCollection.createIndex({ domain: 1 }, { name: 'email_domain_unique', unique: true });
2561
- const survivingEmails = (await emailCollection.find({}).toArray());
2562
- const claimedKeys = new Set();
2563
- let adoptedRecords = 0;
2564
- for await (const record of dnsCollection.find({
2565
- managedRecordKey: { $exists: false },
2566
- createdBy: { $in: ['mail-edge-sync', 'email-domain-manager'] },
2567
- })) {
2568
- const type = String(record.type || '');
2569
- const name = String(record.name || '').toLowerCase();
2570
- const value = String(record.value || '').trim();
2571
- let managedOwnerId = '';
2572
- let managedRecordKey = '';
2573
- if (record.createdBy === 'mail-edge-sync' && ['A', 'AAAA'].includes(type)) {
2574
- managedOwnerId = `topology:legacy:${name}:${value}`;
2575
- managedRecordKey = `mail-topology:legacy:${type}:${name}:${value}`;
2576
- }
2577
- else if (record.createdBy === 'email-domain-manager') {
2578
- const candidates = survivingEmails.filter((email) => {
2579
- if (String(email.linkedDomainId) !== String(record.domainId))
2580
- return false;
2581
- const domain = String(email.domain || '').toLowerCase();
2582
- const selector = String(email.dkim?.selector || 'default').toLowerCase();
2583
- return name === domain
2584
- || name === `_dmarc.${domain}`
2585
- || name === `${selector}._domainkey.${domain}`
2586
- || name === `mx.${domain}`;
2587
- });
2588
- if (candidates.length === 1) {
2589
- managedOwnerId = `domain:${candidates[0].id}`;
2590
- managedRecordKey = `mail-domain:${candidates[0].id}:${type}:${name}:${value}`;
2591
- }
2592
- }
2593
- if (!managedRecordKey || claimedKeys.has(managedRecordKey)) {
2594
- continue;
2595
- }
2596
- claimedKeys.add(managedRecordKey);
2597
- await dnsCollection.updateOne({ _id: record._id }, { $set: { managedBy: 'mail-dns-reconciler', managedOwnerId, managedRecordKey } });
2598
- adoptedRecords++;
2599
- }
2600
- await repairManagedRecordKeyIndex(ctx, 'email-dns-lifecycle');
2601
- ctx.log.log('info', `email-dns-lifecycle: removed ${duplicateDomainsRemoved} duplicate domain(s), adopted ${adoptedRecords} unambiguous legacy record(s)`);
2602
- }
2603
- async function dedupeDomainDocsByName(ctx) {
2604
- const collection = ctx.mongo.collection('DomainDoc');
2605
- const docs = await collection.find({}).toArray();
2606
- const seen = new Map();
2607
- let removed = 0;
2608
- const sorted = [...docs].sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0));
2609
- for (const doc of sorted) {
2610
- const name = String(doc.name || '').toLowerCase();
2611
- if (!name)
2612
- continue;
2613
- if (seen.has(name)) {
2614
- await collection.deleteOne({ _id: doc._id });
2615
- removed++;
2616
- }
2617
- else {
2618
- seen.set(name, doc);
2619
- }
2620
- }
2621
- ctx.log.log('info', `dedupe-domain-docs-by-name: removed ${removed} duplicate domain doc(s)`);
2622
- }
2623
- async function migrateEmailDnsProviderProvenance(ctx) {
2624
- const emailCollection = ctx.mongo.collection('EmailDomainDoc');
2625
- const domainCollection = ctx.mongo.collection('DomainDoc');
2626
- const dnsCollection = ctx.mongo.collection('DnsRecordDoc');
2627
- const domains = await domainCollection.find({}).toArray();
2628
- const providerZoneIds = new Set(domains
2629
- .filter((domain) => domain?.source === 'provider')
2630
- .map((domain) => String(domain.id || domain._id || ''))
2631
- .filter(Boolean));
2632
- const records = await dnsCollection.find({}).toArray();
2633
- const retainedRecords = [];
2634
- let normalizedProviderIds = 0;
2635
- let deletedStaleProviderMirrors = 0;
2636
- for (const record of records) {
2637
- if (typeof record.providerRecordId === 'string' && !record.providerRecordId.trim()) {
2638
- const identitySelector = record._id !== undefined && record._id !== null
2639
- ? { _id: record._id }
2640
- : typeof record.id === 'string' && record.id.trim()
2641
- ? { id: record.id }
2642
- : undefined;
2643
- if (!identitySelector) {
2644
- throw new Error('DnsRecordDoc with empty providerRecordId has no usable identity');
2645
- }
2646
- if (record.source === 'synced'
2647
- && providerZoneIds.has(String(record.domainId || ''))) {
2648
- const result = await dnsCollection.deleteOne({
2649
- ...identitySelector,
2650
- source: 'synced',
2651
- providerRecordId: record.providerRecordId,
2652
- });
2653
- deletedStaleProviderMirrors += result.deletedCount || 0;
2654
- continue;
2655
- }
2656
- await dnsCollection.updateOne({ ...identitySelector, providerRecordId: record.providerRecordId }, { $unset: { providerRecordId: '' } });
2657
- delete record.providerRecordId;
2658
- normalizedProviderIds++;
2659
- }
2660
- retainedRecords.push(record);
2661
- }
2662
- let backfilledDomains = 0;
2663
- let backfilledActiveRevisionGenerations = 0;
2664
- for (const email of await emailCollection.find({}).toArray()) {
2665
- const reconciliation = email.reconciliation;
2666
- const activeRevision = reconciliation?.activeRevision;
2667
- const desiredGeneration = reconciliation?.desiredGeneration;
2668
- const identitySelector = email._id !== undefined && email._id !== null
2669
- ? { _id: email._id }
2670
- : typeof email.id === 'string' && email.id.trim()
2671
- ? { id: email.id }
2672
- : undefined;
2673
- if (!identitySelector) {
2674
- throw new Error('EmailDomainDoc has no usable identity');
2675
- }
2676
- if (reconciliation?.lifecycleStatus === 'active'
2677
- && activeRevision
2678
- && typeof activeRevision === 'object'
2679
- && Number.isInteger(desiredGeneration)
2680
- && !Object.prototype.hasOwnProperty.call(activeRevision, 'generation')) {
2681
- const result = await emailCollection.updateOne({
2682
- ...identitySelector,
2683
- 'reconciliation.lifecycleStatus': 'active',
2684
- 'reconciliation.desiredGeneration': desiredGeneration,
2685
- 'reconciliation.activeRevision': { $exists: true },
2686
- 'reconciliation.activeRevision.generation': { $exists: false },
2687
- }, { $set: { 'reconciliation.activeRevision.generation': desiredGeneration } });
2688
- if ((result.modifiedCount || 0) > 0) {
2689
- activeRevision.generation = desiredGeneration;
2690
- backfilledActiveRevisionGenerations++;
2691
- }
2692
- }
2693
- if (Array.isArray(email.reconciliation?.providerZoneIds))
2694
- continue;
2695
- const provenance = new Set();
2696
- if (providerZoneIds.has(String(email.linkedDomainId || ''))) {
2697
- provenance.add(String(email.linkedDomainId));
2698
- }
2699
- for (const intent of Array.isArray(email.reconciliation?.intents)
2700
- ? email.reconciliation.intents
2701
- : []) {
2702
- const zoneId = String(intent?.domainId || '');
2703
- if (providerZoneIds.has(zoneId))
2704
- provenance.add(zoneId);
2705
- }
2706
- const ownerId = `domain:${String(email.id || email._id || '')}`;
2707
- for (const record of retainedRecords) {
2708
- const zoneId = String(record.domainId || '');
2709
- if (record.managedBy === 'mail-dns-reconciler'
2710
- && record.managedOwnerId === ownerId
2711
- && providerZoneIds.has(zoneId))
2712
- provenance.add(zoneId);
2713
- }
2714
- await emailCollection.updateOne(identitySelector, { $set: { 'reconciliation.providerZoneIds': [...provenance].sort() } });
2715
- backfilledDomains++;
2716
- }
2717
- ctx.log.log('info', `email-dns-provider-provenance: backfilled ${backfilledDomains} provider provenance set(s) and ${backfilledActiveRevisionGenerations} active revision generation(s), deleted ${deletedStaleProviderMirrors} stale provider mirror(s), normalized ${normalizedProviderIds} other empty provider id(s)`);
2718
- }
2719
- async function migrateCachedEmailRawContentToBlobStorage(ctx, options) {
2720
- const collection = ctx.mongo.collection('CachedEmail');
2721
- let migratedCount = 0;
2722
- while (true) {
2723
- const legacyEmails = await collection
2724
- .find({
2725
- rawContent: { $exists: true },
2726
- rawContentObjectKey: { $exists: false },
2727
- })
2728
- .sort({ acceptedAt: 1, _id: 1 })
2729
- .limit(cachedEmailRawContentMigrationBatchSize)
2730
- .toArray();
2731
- if (legacyEmails.length === 0)
2732
- break;
2733
- const blobStorage = options.legacyRawMessageBlobStorage;
2734
- if (!blobStorage) {
2735
- throw new Error('SmartBucket storage is unavailable for the 17.1.0 CachedEmail rawContent migration');
2736
- }
2737
- for (const legacyEmail of legacyEmails) {
2738
- const id = typeof legacyEmail.id === 'string' ? legacyEmail.id.trim() : '';
2739
- if (!id) {
2740
- throw new Error('Legacy CachedEmail has a missing or malformed id');
2741
- }
2742
- if (typeof legacyEmail.rawContent !== 'string') {
2743
- throw new Error(`Legacy CachedEmail ${id} has invalid inline RFC822 data`);
2744
- }
2745
- const rawMessage = Buffer.from(legacyEmail.rawContent, 'utf8');
2746
- const objectKey = `/email/messages/${id}.eml`;
2747
- await blobStorage.set(objectKey, rawMessage);
2748
- const persistedRawMessage = await blobStorage.get(objectKey);
2749
- if (!persistedRawMessage || !Buffer.from(persistedRawMessage).equals(rawMessage)) {
2750
- throw new Error(`SmartBucket verification failed for legacy CachedEmail ${id}`);
2751
- }
2752
- const identitySelector = legacyEmail._id === undefined
2753
- ? { id }
2754
- : { _id: legacyEmail._id, id };
2755
- const completed = await collection.updateOne({
2756
- ...identitySelector,
2757
- rawContent: legacyEmail.rawContent,
2758
- rawContentObjectKey: { $exists: false },
2759
- }, {
2760
- $set: {
2761
- rawContentObjectKey: objectKey,
2762
- rawContentSize: rawMessage.length,
2763
- _updatedAt: new Date().toISOString(),
2764
- },
2765
- $unset: { rawContent: '' },
2766
- });
2767
- if (completed.modifiedCount !== 1) {
2768
- const current = await collection.findOne(identitySelector);
2769
- const currentPayload = await blobStorage.get(objectKey);
2770
- if (current?.rawContentObjectKey === objectKey
2771
- && current.rawContentSize === rawMessage.length
2772
- && !Object.prototype.hasOwnProperty.call(current, 'rawContent')
2773
- && currentPayload
2774
- && Buffer.from(currentPayload).equals(rawMessage)) {
2775
- continue;
2776
- }
2777
- throw new Error(`Legacy CachedEmail ${id} changed during migration`);
2778
- }
2779
- migratedCount++;
2780
- }
2781
- ctx.log.log('info', `migrate-cached-email-raw-content: completed batch of ${legacyEmails.length} payload(s); ${migratedCount} migrated total`);
2782
- }
2783
- ctx.log.log('info', `migrate-cached-email-raw-content: moved ${migratedCount} payload(s) to SmartBucket`);
2784
- }
2785
- function isMigrationNamespaceMissing(error) {
2786
- const candidate = error;
2787
- return candidate.code === 26 || candidate.codeName === 'NamespaceNotFound';
2788
- }
2789
1314
  async function migrateTestingAccess(ctx) {
2790
1315
  const certificates = ctx.mongo.collection('AcmeCertDoc');
2791
1316
  // One bounded, replayable batch at a time. PEM data is never rewritten.
@@ -2796,14 +1321,14 @@ async function migrateTestingAccess(ctx) {
2796
1321
  for (const certificate of legacy) {
2797
1322
  if (typeof certificate.domainName !== 'string' || !certificate.domainName
2798
1323
  || certificate.domainName !== certificate.domainName.trim())
2799
- throw new Error('Invalid legacy certificate domain');
1324
+ throw new DcRouterMigrationError('Invalid legacy certificate domain');
2800
1325
  const identityKey = `legacy:${certificate.domainName}`;
2801
1326
  if (certificate.identityKey !== undefined && certificate.identityKey !== identityKey) {
2802
- throw new Error('Conflicting legacy certificate identity');
1327
+ throw new DcRouterMigrationError('Conflicting legacy certificate identity');
2803
1328
  }
2804
1329
  const changed = await certificates.updateOne({ _id: certificate._id, kind: { $exists: false } }, { $set: { identityKey, kind: 'legacy' } });
2805
1330
  if (changed.modifiedCount !== 1)
2806
- throw new Error('Certificate changed during identity migration');
1331
+ throw new DcRouterMigrationError('Certificate changed during identity migration');
2807
1332
  }
2808
1333
  }
2809
1334
  await certificates.createIndex({ identityKey: 1 }, { name: 'identityKey_1', unique: true });
@@ -2848,21 +1373,250 @@ async function migrateTestingAccess(ctx) {
2848
1373
  ]);
2849
1374
  ctx.log.log('info', 'testing-access: isolated legacy certificate keys and initialized durable testing indexes');
2850
1375
  }
2851
- async function migrateIpIntelligenceRetention(ctx) {
2852
- // This collection contains rebuildable network-enrichment cache entries,
2853
- // not durable operator state. Resetting it is atomic, bounded, and safe to
2854
- // replay after a crash; preserving legacy rows would make startup depend on
2855
- // materializing or mutating an unbounded collection.
2856
- const collection = ctx.mongo.collection('IpIntelligenceDoc');
2857
- try {
2858
- await collection.drop();
1376
+ // -------------------------------------------- Web Push encryption context (32)
1377
+ /**
1378
+ * Associated data every Web Push envelope was sealed under before interfaces
1379
+ * 32.0.0 removed the shape version from the push payload contract. It is
1380
+ * private to this module on purpose: a superseded computation belongs to the
1381
+ * migration that retires it and must not be reachable from `ts/`.
1382
+ */
1383
+ const legacyWebPushAadShapeVersion = 1;
1384
+ const legacyWebPushEnvelopeVersion = 1;
1385
+ const webPushEncryptionContextChunkSize = 100;
1386
+ function buildLegacyWebPushAad(contextArg) {
1387
+ return Buffer.from(canonicalWebPushJson({
1388
+ schemaVersion: legacyWebPushAadShapeVersion,
1389
+ gatewayClientId: contextArg.gatewayClientId,
1390
+ appInstanceId: contextArg.appInstanceId,
1391
+ bindingId: contextArg.bindingId,
1392
+ documentType: contextArg.documentType,
1393
+ documentId: contextArg.documentId,
1394
+ }), 'utf8');
1395
+ }
1396
+ /**
1397
+ * A sealed envelope is pre-32 exactly when it still declares the shape version
1398
+ * the contract dropped. The discriminator is the stored shape, never a trial
1399
+ * decryption: a failed decryption cannot tell "already resealed" from "wrong
1400
+ * key" and would silently skip readable secrets.
1401
+ */
1402
+ function isLegacyWebPushEnvelope(valueArg) {
1403
+ return valueArg !== null
1404
+ && typeof valueArg === 'object'
1405
+ && !Array.isArray(valueArg)
1406
+ && valueArg.version !== undefined;
1407
+ }
1408
+ function openLegacyWebPushEnvelope(envelopeArg, aadContextArg, keyRingArg) {
1409
+ if (envelopeArg.version !== legacyWebPushEnvelopeVersion
1410
+ || envelopeArg.algorithm !== 'aes-256-gcm') {
1411
+ throw new DcRouterMigrationError('Web Push envelope predates 32.0.0 but states an unknown format');
1412
+ }
1413
+ const key = keyRingArg.keys.get(envelopeArg.keyId);
1414
+ if (!key) {
1415
+ throw new DcRouterMigrationError(`Web Push envelope references key "${envelopeArg.keyId}", which the configured key ring does not hold`);
1416
+ }
1417
+ const decipher = nodeCrypto.createDecipheriv('aes-256-gcm', key, Buffer.from(envelopeArg.nonce, 'base64url'));
1418
+ decipher.setAAD(buildLegacyWebPushAad(aadContextArg));
1419
+ decipher.setAuthTag(Buffer.from(envelopeArg.tag, 'base64url'));
1420
+ return JSON.parse(Buffer.concat([
1421
+ decipher.update(Buffer.from(envelopeArg.ciphertext, 'base64url')),
1422
+ decipher.final(),
1423
+ ]).toString('utf8'));
1424
+ }
1425
+ /**
1426
+ * Reseal one envelope under the 32 associated data with a fresh nonce, then
1427
+ * read it back before the caller is allowed to store it: an envelope that
1428
+ * cannot be opened again is a lost secret, not a migration.
1429
+ */
1430
+ function resealWebPushEnvelope(envelopeArg, aadContextArg, keyRingArg, transformPlaintextArg) {
1431
+ const plaintext = transformPlaintextArg(openLegacyWebPushEnvelope(envelopeArg, aadContextArg, keyRingArg));
1432
+ const resealed = sealWebPushEnvelope(keyRingArg, plaintext, aadContextArg);
1433
+ const verified = openWebPushEnvelope(keyRingArg, resealed, aadContextArg);
1434
+ if (canonicalWebPushJson(verified) !== canonicalWebPushJson(plaintext)) {
1435
+ throw new DcRouterMigrationError('Resealed Web Push envelope did not decrypt to its original plaintext');
1436
+ }
1437
+ return resealed;
1438
+ }
1439
+ /** interfaces 32.0.0 removed `schemaVersion` from the push payload, so the resealed plaintext drops it. */
1440
+ function withoutWebPushPayloadShapeVersion(plaintextArg) {
1441
+ if (plaintextArg === null || typeof plaintextArg !== 'object' || Array.isArray(plaintextArg)) {
1442
+ return plaintextArg;
1443
+ }
1444
+ const payload = { ...plaintextArg };
1445
+ delete payload.schemaVersion;
1446
+ return payload;
1447
+ }
1448
+ function keepWebPushPlaintext(plaintextArg) {
1449
+ return plaintextArg;
1450
+ }
1451
+ async function resealWebPushBindings(collectionArg, keyRingArg, checkpointArg, logArg) {
1452
+ let cursor = (await checkpointArg?.read('bindingCursor')) ?? '';
1453
+ let resealed = 0;
1454
+ for (;;) {
1455
+ const chunk = await collectionArg
1456
+ .find({ id: { $gt: cursor } })
1457
+ .sort({ id: 1 })
1458
+ .limit(webPushEncryptionContextChunkSize)
1459
+ .toArray();
1460
+ if (chunk.length === 0)
1461
+ break;
1462
+ for (const document of chunk) {
1463
+ const owner = {
1464
+ gatewayClientId: String(document.ownerGatewayClientId),
1465
+ appInstanceId: String(document.ownerAppInstanceId),
1466
+ };
1467
+ const vapidKeys = Array.isArray(document.vapidKeys) ? document.vapidKeys : [];
1468
+ const recovery = document.credentialRotationRecovery;
1469
+ const update = {};
1470
+ const nextVapidKeys = vapidKeys.map((vapidKey) => {
1471
+ if (!isLegacyWebPushEnvelope(vapidKey?.privateKeyEnvelope))
1472
+ return vapidKey;
1473
+ return {
1474
+ ...vapidKey,
1475
+ privateKeyEnvelope: resealWebPushEnvelope(vapidKey.privateKeyEnvelope, {
1476
+ ...owner,
1477
+ bindingId: String(document.id),
1478
+ documentType: 'vapid-private-key',
1479
+ documentId: String(vapidKey.id),
1480
+ }, keyRingArg, keepWebPushPlaintext),
1481
+ };
1482
+ });
1483
+ if (nextVapidKeys.some((vapidKey, index) => vapidKey !== vapidKeys[index])) {
1484
+ update.vapidKeys = nextVapidKeys;
1485
+ }
1486
+ if (isLegacyWebPushEnvelope(recovery?.secretEnvelope)) {
1487
+ update.credentialRotationRecovery = {
1488
+ ...recovery,
1489
+ secretEnvelope: resealWebPushEnvelope(recovery.secretEnvelope, {
1490
+ ...owner,
1491
+ bindingId: String(document.id),
1492
+ documentType: 'credential-rotation-recovery',
1493
+ documentId: canonicalWebPushJson({
1494
+ lifecycleGeneration: recovery.lifecycleGeneration,
1495
+ requestedCredentialId: recovery.requestedCredentialId,
1496
+ resultingCredentialId: recovery.resultingCredentialId,
1497
+ }),
1498
+ }, keyRingArg, keepWebPushPlaintext),
1499
+ };
1500
+ }
1501
+ if (Object.keys(update).length > 0) {
1502
+ await collectionArg.updateOne({ _id: document._id }, { $set: update });
1503
+ resealed++;
1504
+ }
1505
+ cursor = String(document.id);
1506
+ }
1507
+ await checkpointArg?.write('bindingCursor', cursor);
2859
1508
  }
2860
- catch (error) {
2861
- if (!isMigrationNamespaceMissing(error))
2862
- throw error;
1509
+ logArg(`resealed ${resealed} binding document(s)`);
1510
+ }
1511
+ /**
1512
+ * Resolve a spool row's owner from its binding. It is read on demand rather
1513
+ * than collected during the binding walk, because that walk resumes from a
1514
+ * cursor and would otherwise hand the spool an owner map missing every binding
1515
+ * an earlier run already passed.
1516
+ */
1517
+ function createWebPushOwnerResolver(bindingCollectionArg) {
1518
+ const owners = new Map();
1519
+ return async (bindingIdArg) => {
1520
+ if (owners.has(bindingIdArg))
1521
+ return owners.get(bindingIdArg);
1522
+ const document = await bindingCollectionArg.findOne({ id: bindingIdArg });
1523
+ const owner = document
1524
+ ? {
1525
+ gatewayClientId: String(document.ownerGatewayClientId),
1526
+ appInstanceId: String(document.ownerAppInstanceId),
1527
+ }
1528
+ : undefined;
1529
+ owners.set(bindingIdArg, owner);
1530
+ return owner;
1531
+ };
1532
+ }
1533
+ async function resealWebPushSpool(collectionArg, resolveOwnerArg, keyRingArg, checkpointArg, logArg) {
1534
+ let cursor = (await checkpointArg?.read('spoolCursor')) ?? '';
1535
+ let resealed = 0;
1536
+ let orphaned = 0;
1537
+ for (;;) {
1538
+ const chunk = await collectionArg
1539
+ .find({ id: { $gt: cursor } })
1540
+ .sort({ id: 1 })
1541
+ .limit(webPushEncryptionContextChunkSize)
1542
+ .toArray();
1543
+ if (chunk.length === 0)
1544
+ break;
1545
+ for (const document of chunk) {
1546
+ cursor = String(document.id);
1547
+ const legacySubscription = isLegacyWebPushEnvelope(document.subscriptionEnvelope);
1548
+ const legacyPayload = isLegacyWebPushEnvelope(document.payloadEnvelope);
1549
+ if (!legacySubscription && !legacyPayload && document.schemaVersion === undefined)
1550
+ continue;
1551
+ const owner = await resolveOwnerArg(String(document.bindingId));
1552
+ if (!owner) {
1553
+ // The owning binding is gone, so no version of dcrouter can rebuild
1554
+ // this row's associated data or deliver it. It is left exactly as it
1555
+ // is rather than rewritten from a guess or deleted.
1556
+ orphaned++;
1557
+ continue;
1558
+ }
1559
+ const aadBase = {
1560
+ ...owner,
1561
+ bindingId: String(document.bindingId),
1562
+ documentId: String(document.id),
1563
+ };
1564
+ const update = {};
1565
+ if (legacySubscription) {
1566
+ update.subscriptionEnvelope = resealWebPushEnvelope(document.subscriptionEnvelope, { ...aadBase, documentType: 'spool-subscription' }, keyRingArg, keepWebPushPlaintext);
1567
+ }
1568
+ if (legacyPayload) {
1569
+ update.payloadEnvelope = resealWebPushEnvelope(document.payloadEnvelope, { ...aadBase, documentType: 'spool-payload' }, keyRingArg, withoutWebPushPayloadShapeVersion);
1570
+ }
1571
+ await collectionArg.updateOne({ _id: document._id }, {
1572
+ ...(Object.keys(update).length > 0 ? { $set: update } : {}),
1573
+ $unset: { schemaVersion: '' },
1574
+ });
1575
+ resealed++;
1576
+ }
1577
+ await checkpointArg?.write('spoolCursor', cursor);
1578
+ }
1579
+ logArg(`resealed ${resealed} spool document(s)`
1580
+ + (orphaned > 0 ? `; left ${orphaned} undeliverable row(s) whose binding no longer exists` : ''));
1581
+ }
1582
+ async function migrateWebPushEncryptionContext(ctx, options) {
1583
+ const bindings = ctx.mongo.collection('WebPushBindingDoc');
1584
+ const spool = ctx.mongo.collection('WebPushSpoolDoc');
1585
+ const hasSealedMaterial = Boolean(await bindings.findOne({}, { projection: { _id: 1 } })
1586
+ || await spool.findOne({}, { projection: { _id: 1 } }));
1587
+ if (!hasSealedMaterial) {
1588
+ ctx.log.log('info', 'webpush-encryption-context: no Web Push documents to reseal');
1589
+ return;
1590
+ }
1591
+ if (!options.webPushMasterKeyRing) {
1592
+ throw new DcRouterMigrationError('webpush-encryption-context: stored Web Push documents have to be resealed under the '
1593
+ + 'interfaces 32 associated data, but DCROUTER_WEB_PUSH_MASTER_KEY_RING is not configured');
1594
+ }
1595
+ const keyRing = parseWebPushKeyRing(options.webPushMasterKeyRing, 'DCROUTER_WEB_PUSH_MASTER_KEY_RING');
1596
+ await resealWebPushBindings(bindings, keyRing, ctx.checkpoint, (message) => ctx.log.log('info', `webpush-encryption-context: ${message}`));
1597
+ await resealWebPushSpool(spool, createWebPushOwnerResolver(bindings), keyRing, ctx.checkpoint, (message) => ctx.log.log('info', `webpush-encryption-context: ${message}`));
1598
+ }
1599
+ // ----------------------------------------- CoreMail peer verifier format (32)
1600
+ /** The verifier contract token CoreMail peers were stored under before interfaces 32.0.0. */
1601
+ const legacyCoreMailVerifierFormat = 'argon2id-v1';
1602
+ async function migrateCoreMailPeerVerifierFormat(ctx) {
1603
+ const collection = ctx.mongo.collection('CoreMailGatewayPeerDoc');
1604
+ const documents = await collection.find({}).sort({ id: 1 }).toArray();
1605
+ let migrated = 0;
1606
+ for (const document of documents) {
1607
+ const credentials = Array.isArray(document.credentials) ? document.credentials : [];
1608
+ if (!credentials.some((credential) => credential?.format === legacyCoreMailVerifierFormat)) {
1609
+ continue;
1610
+ }
1611
+ await collection.updateOne({ _id: document._id }, {
1612
+ $set: {
1613
+ credentials: credentials.map((credential) => (credential?.format === legacyCoreMailVerifierFormat
1614
+ ? { ...credential, format: coreMailVerifierFormat }
1615
+ : credential)),
1616
+ },
1617
+ });
1618
+ migrated++;
2863
1619
  }
2864
- await collection.createIndex({ ipAddress: 1 }, { name: 'ipAddress_1', unique: true });
2865
- await collection.createIndex({ lastSeenAt: -1, _id: -1 }, { name: 'lastSeenAt_-1__id_-1' });
2866
- ctx.log.log('info', 'bound-ip-intelligence-retention: reset rebuildable cache and recreated indexes');
1620
+ ctx.log.log('info', `coremail-peer-verifier-format: rewrote ${migrated} peer record(s)`);
2867
1621
  }
2868
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBQ3RCLDJCQUEyQixFQUMzQix5QkFBeUIsR0FDMUIsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsK0JBQStCLEdBQ2hDLE1BQU0sOENBQThDLENBQUM7QUFDdEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDcEYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUF3QmpGLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0NBQWdDLENBQ3BELEVBQVcsRUFDWCxVQUFxQyxFQUFFO0lBRXZDLDRFQUE0RTtJQUM1RSxPQUFPLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBNEJELE1BQU0sdUJBQXVCLEdBSXhCO0lBQ0g7UUFDRSxJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLFdBQVcsRUFBRSw0RkFBNEY7UUFD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QUssU0FBUyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ0QsSUFBSyxHQUFXLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQUssR0FBVyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSyxHQUFXLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSx5REFBeUQsQ0FBQyxDQUFDO1FBQy9FLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7SUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBSSxHQUFXLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQztJQUV2RCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQ3ZCLEdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFHLEdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsNkJBQTZCLEVBQUUsRUFDNUYsRUFBRSxJQUFJLEVBQUUsQ0FDVCxDQUFDO0lBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDZDQUE2QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDcEgsQ0FBQztBQUVELEtBQUssVUFBVSwyQkFBMkIsQ0FBQyxHQUcxQyxFQUFFLE9BQWtDO0lBQ25DLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDbkUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQztJQUMvQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkIsTUFBTSxHQUFHLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQztJQUU5RSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLHVCQUF1QjtZQUNuQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNsRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxTQUFTO1lBQzFDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxJQUFJLFNBQVM7WUFDbEQsU0FBUyxFQUFFLEdBQUc7WUFDZCxTQUFTLEVBQUUsV0FBVztTQUN2QixDQUFDLENBQUM7UUFDSCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsc0VBQXNFLENBQUMsQ0FBQztRQUM1RixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUF3QixFQUFFLENBQUM7SUFDckMsSUFBSyxHQUFXLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDRCxJQUFLLEdBQVcsQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDdEMsQ0FBQztJQUNELElBQUssR0FBVyxDQUFDLGVBQWUsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsbURBQW1ELENBQUMsQ0FBQztRQUN6RSxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUksR0FBVyxDQUFDLFNBQVMsSUFBSSxXQUFXLENBQUM7SUFFdkQsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUN2QixHQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRyxHQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLEVBQ3RGLEVBQUUsSUFBSSxFQUFFLENBQ1QsQ0FBQztJQUNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSx1Q0FBdUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQzlHLENBQUM7QUFFRCxLQUFLLFVBQVUseUJBQXlCLENBQUMsR0FHeEMsRUFBRSxPQUFrQztJQUNuQyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUM7SUFDL0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sR0FBRyxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7SUFDOUUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUM7SUFFbkQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSx1QkFBdUI7WUFDbkMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDbEQsWUFBWTtZQUNaLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLFNBQVM7WUFDMUMsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLElBQUksU0FBUztZQUNsRCxTQUFTLEVBQUUsR0FBRztZQUNkLFNBQVMsRUFBRSxXQUFXO1NBQ3ZCLENBQUMsQ0FBQztRQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxvRUFBb0UsQ0FBQyxDQUFDO1FBQzFGLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSyxHQUFXLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzVDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxpREFBaUQsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUN2QixHQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRyxHQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLEVBQ3RGO1FBQ0UsSUFBSSxFQUFFO1lBQ0osWUFBWTtZQUNaLFNBQVMsRUFBRSxHQUFHO1lBQ2QsU0FBUyxFQUFHLEdBQVcsQ0FBQyxTQUFTLElBQUksV0FBVztTQUNqRDtLQUNGLENBQ0YsQ0FBQztJQUNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSx3REFBd0QsQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFFRCxLQUFLLFVBQVUsdUNBQXVDLENBQUMsR0FHdEQ7SUFDQyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFVBQVUsQ0FDeEMsRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFDOUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUN6QyxDQUFDO0lBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHFEQUFxRCxNQUFNLENBQUMsYUFBYSxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUNuSSxDQUFDO0FBRUQsS0FBSyxVQUFVLG1EQUFtRCxDQUFDLEdBR2xFLEVBQUUsT0FBa0M7SUFDbkMsTUFBTSx5QkFBeUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUMsTUFBTSx1Q0FBdUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQsS0FBSyxVQUFVLG9DQUFvQyxDQUFDLEdBR25EO0lBQ0MsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUNuRSxNQUFNLEdBQUcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxpRUFBaUUsQ0FBQyxDQUFDO1FBQ3ZGLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUksR0FBVyxDQUFDLFlBQVksQ0FBQztJQUN2QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUUsR0FBVyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RCwrRUFBK0U7SUFDL0UsMkVBQTJFO0lBQzNFLE1BQU0sVUFBVSxHQUFHLElBQUksS0FBSyxTQUFTO1dBQ2hDLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxxQ0FBcUMsSUFBSSxnQkFBZ0IsU0FBUyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDeEcsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQ3ZCLEdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFHLEdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsRUFDdEY7UUFDRSxJQUFJLEVBQUU7WUFDSixZQUFZLEVBQUUsZUFBZTtZQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyQixTQUFTLEVBQUUsV0FBVztTQUN2QjtLQUNGLENBQ0YsQ0FBQztJQUNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSw2REFBNkQsQ0FBQyxDQUFDO0FBQ3JGLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILEtBQUssVUFBVSxpQ0FBaUMsQ0FBQyxHQUdoRDtJQUNDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDbkUsTUFBTSxHQUFHLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQztJQUM5RSxNQUFNLE1BQU0sR0FBSSxHQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQztJQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzNCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxzRkFBc0YsQ0FBQyxDQUFDO1FBQzVHLE9BQU87SUFDVCxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLDZFQUE2RTtJQUM3RSw0RUFBNEU7SUFDNUUsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLEtBQVUsRUFBVyxFQUFFLENBQzVELEtBQUssRUFBRSxJQUFJLEtBQUsscUJBQXFCLElBQUksS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQzdFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsNkJBQTZCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFFdEQsNkVBQTZFO0lBQzdFLHdFQUF3RTtJQUN4RSxNQUFNLDBCQUEwQixHQUFHLFNBQVM7U0FDekMsTUFBTSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksS0FBSyxTQUFTLENBQUM7U0FDekQsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pELElBQUksMEJBQTBCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNULE1BQU0sRUFDTiwyQ0FBMkMsMEJBQTBCLENBQUMsTUFBTSxnRUFBZ0UsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnR0FBZ0csQ0FDbFIsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsMkRBQTJELENBQUMsQ0FBQztRQUNqRixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FDdkIsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUcsR0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSx1QkFBdUIsRUFBRSxFQUN0RjtRQUNFLElBQUksRUFBRTtZQUNKLG9CQUFvQixFQUFFLFNBQVM7WUFDL0IsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsU0FBUyxFQUFHLEdBQVcsQ0FBQyxTQUFTLElBQUksV0FBVztTQUNqRDtLQUNGLENBQ0YsQ0FBQztJQUNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNULE1BQU0sRUFDTixtREFBbUQsWUFBWSxnR0FBZ0csQ0FDaEssQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxLQUFLLFVBQVUsMEJBQTBCLENBQUMsR0FHekM7SUFDQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDM0UsTUFBTSxHQUFHLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sS0FBSyxHQUFJLEdBQVcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztJQUNyRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2hELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxvRkFBb0YsQ0FBQyxDQUFDO1FBQzFHLE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3hDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNsQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFFaEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLFFBQVEsR0FBRyxPQUFRLElBQVksRUFBRSxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBRSxJQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEcsTUFBTSxRQUFRLEdBQUcsT0FBUSxJQUFZLEVBQUUsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUUsSUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNGLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzQixPQUFPLEVBQUUsQ0FBQztZQUNWLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxvRkFBb0YsQ0FBQyxDQUFDO1lBQzFHLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDcEMsdUVBQXVFO1lBQ3ZFLE9BQU8sRUFBRSxDQUFDO1lBQ1YsU0FBUztRQUNYLENBQUM7UUFDRCxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEVBQUUsQ0FBQztZQUNWLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSw4REFBOEQsUUFBUSw0QkFBNEIsQ0FBQyxDQUFDO1lBQ3hILFNBQVM7UUFDWCxDQUFDO1FBQ0QsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixJQUFJLE1BQU0saUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sRUFBRSxDQUFDO1lBQ1YsU0FBUztRQUNYLENBQUM7UUFFRCxNQUFNLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztZQUNoQyxFQUFFLEVBQUUsWUFBWSxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQy9FLFFBQVE7WUFDUixXQUFXLEVBQUUsa0RBQWtELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLHdFQUF3RTtZQUMvSyxPQUFPLEVBQUUsSUFBSTtZQUNiLGtCQUFrQixFQUFFLHVCQUF1QixDQUFDLFFBQVEsQ0FBQztZQUNyRCxXQUFXLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7WUFDM0MsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7WUFDM0QsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUMvQixTQUFTLEVBQUUsR0FBRztZQUNkLFNBQVMsRUFBRSxHQUFHO1lBQ2QsU0FBUyxFQUFFLFdBQVc7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxFQUFFLENBQUM7UUFDWixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsOENBQThDLFFBQVEsZ0dBQWdHLENBQUMsQ0FBQztJQUM5SyxDQUFDO0lBRUQsTUFBTSxrQkFBa0IsQ0FBQyxTQUFTLENBQy9CLEdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFHLEdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsRUFDdEY7UUFDRSxJQUFJLEVBQUU7WUFDSix3QkFBd0IsRUFBRSxFQUFFO1lBQzVCLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JCLFNBQVMsRUFBRyxHQUFXLENBQUMsU0FBUyxJQUFJLFdBQVc7U0FDakQ7S0FDRixDQUNGLENBQUM7SUFDRixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sNkNBQTZDLFNBQVMsYUFBYSxPQUFPLHlEQUF5RCxDQUNwSSxDQUFDO0FBQ0osQ0FBQztBQUVELEtBQUssVUFBVSw2QkFBNkIsQ0FBQyxHQUc1QztJQUNDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixJQUFJLEtBQUssRUFBRSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMvQixJQUFJLFNBQVMsR0FBUSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDO1lBQ0gsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUUsR0FBVyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNqQixDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEtBQUssSUFBSSxDQUFDO1FBQ2pFLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUNsQyxDQUFFLEdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUNwQixHQUFHLENBQUMsQ0FBQyxPQUFlLEVBQUUsRUFBRTtnQkFDdkIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDbkQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3BELENBQUMsQ0FBQztpQkFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQ25CLENBQUMsQ0FBQztRQUNILE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FDeEIsRUFBRSxHQUFHLEVBQUcsR0FBVyxDQUFDLEdBQUcsRUFBRSxFQUN6QjtZQUNFLElBQUksRUFBRTtnQkFDSixTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0JBQ2pELGdCQUFnQjtnQkFDaEIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7YUFDOUU7U0FDRixDQUNGLENBQUM7UUFDRixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsK0NBQStDLE9BQU8sa0JBQWtCLENBQUMsQ0FBQztBQUNoRyxDQUFDO0FBRUQsS0FBSyxVQUFVLHNDQUFzQyxDQUFDLEdBR3JEO0lBQ0MsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNqRSxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUM7SUFDdEIsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLG9CQUFvQixHQUFHLENBQUMsQ0FBQztJQUU3QixNQUFNLGtCQUFrQixHQUFHLENBQUMsU0FBOEIsRUFBRSxhQUFxQixFQUFVLEVBQUU7UUFDM0YsTUFBTSxZQUFZLEdBQUcsQ0FBQyxRQUFpQixFQUFXLEVBQUU7WUFDbEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFBRSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLElBQUksUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3QyxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFtQyxDQUFDO3FCQUN2RSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUNoRCxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBRSxRQUFvQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0YsQ0FBQztZQUNELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsQ0FBQztRQUNGLE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7WUFDeEUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFO1lBQ2hCLFVBQVUsRUFBRSxhQUFhO1lBQ3pCLE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7Z0JBQ3BCLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFO2dCQUNsRCxtQkFBbUIsRUFBRSxTQUFTLENBQUMsbUJBQW1CLElBQUksRUFBRTtnQkFDeEQsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZLElBQUksRUFBRTtnQkFDMUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLEtBQUssS0FBSzthQUNyQztTQUNGLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztJQUVGLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDWixNQUFNLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDdEMsR0FBRyxFQUFFO2dCQUNILEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3hDLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDeEMsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDMUMsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUU7Z0JBQzVCLEVBQUUsd0JBQXdCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ2hELEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFO2dCQUNsQyxFQUFFLG1CQUFtQixFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO2FBQzVDO1NBQ0YsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM5QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE1BQU07UUFDOUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO21CQUNqRSxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQztnQkFDdkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTixNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO21CQUNyRSxNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztnQkFDekMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUM7Z0JBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTixJQUFJLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDO21CQUMvRSxNQUFNLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQztnQkFDL0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTixJQUFJLHdCQUF3QixLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNuQyxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFDbEUsTUFBTSxZQUFZLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUN4QyxPQUFPLEVBQUUsSUFBSTtvQkFDYixhQUFhLEVBQUUsZUFBZTtvQkFDOUIseUJBQXlCLEVBQUUsTUFBTSxDQUFDLEVBQUU7b0JBQ3BDLG1DQUFtQyxFQUFFLGFBQWE7b0JBQ2xELGtDQUFrQyxFQUFFLFFBQVE7b0JBQzVDLDZDQUE2QyxFQUFFLGdCQUFnQjtvQkFDL0QseUNBQXlDLEVBQUUsWUFBWTtpQkFDeEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLHFDQUFxQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzFFLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSwwQkFBMEIsRUFBRSxRQUFRLENBQUM7Z0JBQzdFLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3hFLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLGNBQWMsQ0FBQyxTQUFTLENBQzVCLE1BQU0sQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFDakY7Z0JBQ0UsSUFBSSxFQUFFO29CQUNKLGdCQUFnQjtvQkFDaEIsa0JBQWtCO29CQUNsQix3QkFBd0I7b0JBQ3hCLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSSxJQUFJO2lCQUN4RDthQUNGLENBQ0YsQ0FBQztZQUNGLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sS0FBSyxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQztZQUNqQyxhQUFhLEVBQUUsZUFBZTtZQUM5QixHQUFHLEVBQUU7Z0JBQ0gsRUFBRSx1Q0FBdUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0QsRUFBRSx1Q0FBdUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2FBQ2hFO1NBQ0YsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM5QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE1BQU07UUFDOUIsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUMxQixNQUFNLGVBQWUsR0FBRyxPQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLEVBQUUsS0FBSyxRQUFRO2dCQUN6RSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtnQkFDcEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLE1BQU0sTUFBTSxHQUFHLGVBQWU7Z0JBQzVCLENBQUMsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDVCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0YsTUFBTSxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTtnQkFDbEMsSUFBSSxFQUFFO29CQUNKLHVDQUF1QyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsSUFBSSxDQUFDO29CQUN0RSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ3ZDO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsY0FBYyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE1BQU07Z0JBQUUsb0JBQW9CLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNULG9CQUFvQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQzFDLGdEQUFnRCxlQUFlLGVBQWUsY0FBYyx1QkFBdUIsb0JBQW9CLGtCQUFrQixDQUMxSixDQUFDO0FBQ0osQ0FBQztBQUVELEtBQUssVUFBVSw0QkFBNEIsQ0FBQyxHQUczQztJQUNDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0lBQy9CLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNyRSxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDekUsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUVqRSxNQUFNLHNCQUFzQixHQUFHLENBQzdCLFdBQWdCLEVBQ2hCLGVBQXVCLEVBQ2QsRUFBRTtRQUNYLElBQUksV0FBVyxFQUFFLEdBQUcsS0FBSyxTQUFTLElBQUksV0FBVyxFQUFFLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNoRSxNQUFNLElBQUksS0FBSyxDQUNiLDZCQUE2QixlQUFlLDZCQUE2QixDQUMxRSxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQztJQUN6QixDQUFDLENBQUM7SUFDRixNQUFNLHVCQUF1QixHQUFHLEtBQUssRUFDbkMsYUFBa0IsRUFDbEIsV0FBb0MsRUFDcEMsU0FBa0MsRUFDbEMsZUFBdUIsRUFDUixFQUFFO1FBQ2pCLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLEtBQUssR0FBRyxNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsRCxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO2FBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxNQUFNO1lBQzlCLE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDNUUsU0FBUyxFQUFFO29CQUNULE1BQU0sRUFBRTt3QkFDTixHQUFHLEVBQUUsc0JBQXNCLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQzt3QkFDekQsR0FBRyxXQUFXO3FCQUNmO29CQUNELE1BQU0sRUFBRSxTQUFTO2lCQUNsQjthQUNGLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDekIsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksS0FBSyxDQUNiLDZCQUE2QixlQUFlLDRCQUE0QixDQUN6RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRixNQUFNLHdCQUF3QixHQUFHO1FBQy9CLEdBQUcsRUFBRTtZQUNILEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDM0MsRUFBRSxtQkFBbUIsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1NBQzVDO0tBQ0YsQ0FBQztJQUVGLE1BQU0sdUJBQXVCLENBQzNCLGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIsRUFBRSxJQUFJLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUNwQyxTQUFTLENBQ1YsQ0FBQztJQUNGLE1BQU0sdUJBQXVCLENBQzNCLGlCQUFpQixFQUNqQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFDbkIsRUFBRSxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFDN0IsU0FBUyxDQUNWLENBQUM7SUFDRixNQUFNLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQy9DLFVBQVUsRUFBRTtZQUNWLEdBQUcsRUFBRSxDQUFDO1lBQ04sRUFBRSxFQUFFLENBQUM7WUFDTCxtQkFBbUIsRUFBRSxDQUFDO1NBQ3ZCO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLEtBQUssVUFBVTtRQUN6RSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQztRQUM3QyxDQUFDLENBQUMsYUFBYSxDQUFDO0lBQ2xCLElBQUksS0FBSyxFQUFFLE1BQU0sT0FBTyxJQUFJLHFCQUFxQixFQUFFLENBQUM7UUFDbEQsSUFDRSxPQUFPLE9BQU8sQ0FBQyxFQUFFLEtBQUssUUFBUTtlQUMzQixPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDO2VBQzlCLE9BQU8sQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUU7ZUFDaEMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztlQUNsRCxPQUFPLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUNsQyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSwyQkFBMkIsR0FBRyxLQUFLLEVBQ3ZDLGFBQWtCLEVBQ2xCLGVBQXNDLEVBQ3ZCLEVBQUU7UUFDakIsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtnQkFDL0QsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFO2FBQ3JDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxNQUFNO1lBQzlCLE1BQU0sVUFBVSxHQUtYLEVBQUUsQ0FBQztZQUNSLEtBQUssTUFBTSxRQUFRLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQzdCLElBQ0UsT0FBTyxRQUFRLENBQUMsU0FBUyxLQUFLLFFBQVE7dUJBQ25DLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUM7dUJBQ3RDLFFBQVEsQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFDbkQsQ0FBQztvQkFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHVDQUF1QyxlQUFlLHNCQUFzQixDQUM3RSxDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxPQUFPLENBQzdDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFDMUIsRUFBRSxVQUFVLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUMzQyxDQUFDO2dCQUNGLElBQ0UsQ0FBQyxPQUFPO3VCQUNMLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUM7dUJBQ2xELE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLEVBQ2xDLENBQUM7b0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYixvQ0FBb0MsZUFBZSxzQkFBc0IsQ0FDMUUsQ0FBQztnQkFDSixDQUFDO2dCQUNELFVBQVUsQ0FBQyxJQUFJLENBQUM7b0JBQ2QsU0FBUyxFQUFFO3dCQUNULE1BQU0sRUFBRTs0QkFDTixHQUFHLEVBQUUsc0JBQXNCLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQzs0QkFDdEQsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTOzRCQUM3QixHQUFHLHdCQUF3Qjt5QkFDNUI7d0JBQ0QsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEVBQUU7cUJBQ3ZFO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDN0UsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksS0FBSyxDQUNiLDZCQUE2QixlQUFlLDRCQUE0QixDQUN6RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRixNQUFNLDJCQUEyQixDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sMkJBQTJCLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTVELE1BQU0sMEJBQTBCLEdBQUcsS0FBSyxFQUN0QyxXQUFnQixFQUNoQixlQUFzQyxFQUN2QixFQUFFO1FBQ2pCLElBQ0UsT0FBTyxXQUFXLENBQUMsU0FBUyxLQUFLLFFBQVE7ZUFDdEMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQztlQUN6QyxXQUFXLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO2VBQ3RELENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUM7ZUFDdEQsV0FBVyxDQUFDLG1CQUFtQixHQUFHLENBQUM7ZUFDbkMsQ0FDRCxlQUFlLEtBQUssT0FBTzttQkFDeEIsQ0FDRCxPQUFPLFdBQVcsQ0FBQyxFQUFFLEtBQUssUUFBUTt1QkFDL0IsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQzt1QkFDbEMsV0FBVyxDQUFDLEVBQUUsS0FBSyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUM1QyxDQUNGLEVBQ0QsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLGVBQWUsc0JBQXNCLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxPQUFPLENBQzdDLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFDN0IsRUFBRSxVQUFVLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUMzQyxDQUFDO1FBQ0YsSUFDRSxDQUFDLE9BQU87ZUFDTCxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDO2VBQ2xELFdBQVcsQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQ2hFLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxlQUFlLHNCQUFzQixDQUFDLENBQUM7UUFDN0YsQ0FBQztJQUNILENBQUMsQ0FBQztJQUNGLE1BQU0seUJBQXlCLEdBQUcsS0FBSyxFQUNyQyxhQUFrQixFQUNsQixlQUFzQyxFQUN2QixFQUFFO1FBQ2pCLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ3BDLFVBQVUsRUFBRTtnQkFDVixHQUFHLEVBQUUsQ0FBQztnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxTQUFTLEVBQUUsQ0FBQztnQkFDWixtQkFBbUIsRUFBRSxDQUFDO2FBQ3ZCO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxjQUFjLEdBQUcsT0FBTyxNQUFNLENBQUMsU0FBUyxLQUFLLFVBQVU7WUFDM0QsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUM7WUFDdEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNYLElBQUksS0FBSyxFQUFFLE1BQU0sUUFBUSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sMEJBQTBCLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRixNQUFNLHlCQUF5QixDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0seUJBQXlCLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTFELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxpQkFFMUIsRUFBRSxFQUFFLENBQUMsNkJBQTZCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQzNELENBQUMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQ3ZFLENBQUM7SUFDRixNQUFNLGlCQUFpQixDQUFDLGFBQWEsQ0FDbkMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsQ0FDMUMsQ0FBQztJQUVGLE1BQU0sbUJBQW1CLENBQUMsYUFBYSxDQUNyQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUM1QyxDQUFDO0lBRUYsTUFBTSxlQUFlLENBQUMsYUFBYSxDQUNqQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUN4QyxDQUFDO0lBRUYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ1QsTUFBTSxFQUNOLHlFQUF5RSxDQUMxRSxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sNEJBQTRCLEdBQUcscUNBQXFDLENBQUM7QUFDM0UsTUFBTSxnQ0FBZ0MsR0FBRyxzQ0FBc0MsQ0FBQztBQUNoRixNQUFNLGtDQUFrQyxHQUFHLHVCQUF1QixDQUFDO0FBRW5FLEtBQUssVUFBVSxrQ0FBa0MsQ0FBQyxHQUdqRDtJQUNDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDekMsTUFBTSxhQUFhLEdBQVUsRUFBRSxDQUFDO0lBQ2hDLElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0lBRTdCLE1BQU0sV0FBVyxHQUFHLEtBQUssSUFBSSxFQUFFO1FBQzdCLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUN2QyxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDakMsVUFBVSxFQUFFO1lBQ1YsR0FBRyxFQUFFLENBQUM7WUFDTixzQkFBc0IsRUFBRSxDQUFDO1lBQ3pCLHdCQUF3QixFQUFFLENBQUM7WUFDM0IsZ0JBQWdCLEVBQUUsQ0FBQztTQUNwQjtLQUNGLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQixNQUFNLGNBQWMsR0FBRyxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssVUFBVTtRQUMzRCxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDdkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUVYLElBQUksS0FBSyxFQUFFLE1BQU0sUUFBUSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQzVDLE1BQU0sZ0JBQWdCLEdBQUc7WUFDdkIsUUFBUSxDQUFDLHNCQUFzQjtZQUMvQixRQUFRLENBQUMsd0JBQXdCO1lBQ2pDLFFBQVEsQ0FBQyxnQkFBZ0I7U0FDMUIsQ0FBQztRQUNGLElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDO1lBQUUsU0FBUztRQUUzRSxNQUFNLGVBQWUsR0FBRyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO2VBQ3JGLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUM7ZUFDeEUsa0NBQWtDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sU0FBUyxHQUFHLGVBQWU7WUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsUUFBUSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDdEYsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULE1BQU0sV0FBVyxHQUFHLFNBQVMsS0FBSyxJQUFJLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV4RSxJQUFJLGVBQWUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLGNBQWMsQ0FBQyxHQUFHLENBQUMsU0FBVSxDQUFDLENBQUM7WUFDL0IsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFDRCxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ2pCLFNBQVMsRUFBRTtnQkFDVCxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRTtnQkFDN0IsTUFBTSxFQUFFO29CQUNOLE1BQU0sRUFBRTt3QkFDTixzQkFBc0IsRUFBRSxFQUFFO3dCQUMxQix3QkFBd0IsRUFBRSxFQUFFO3dCQUM1QixnQkFBZ0IsRUFBRSxFQUFFO3FCQUNyQjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxXQUFXO1lBQUUsb0JBQW9CLEVBQUUsQ0FBQzs7WUFDbkMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLGFBQWEsQ0FBQyxNQUFNLElBQUksR0FBRztZQUFFLE1BQU0sV0FBVyxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUNELE1BQU0sV0FBVyxFQUFFLENBQUM7SUFFcEIsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUMxQjtRQUNFLHNCQUFzQixFQUFFLENBQUM7UUFDekIsd0JBQXdCLEVBQUUsQ0FBQztLQUM1QixFQUNEO1FBQ0UsSUFBSSxFQUFFLDRDQUE0QztRQUNsRCxNQUFNLEVBQUUsSUFBSTtRQUNaLE1BQU0sRUFBRSxJQUFJO0tBQ2IsQ0FDRixDQUFDO0lBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ1QsTUFBTSxFQUNOLGlHQUFpRyxvQkFBb0IsZ0JBQWdCLG9CQUFvQiwrQkFBK0IsQ0FDekwsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLEVBQVcsRUFDWCxhQUFxQixFQUNyQixVQUFxQyxFQUFFO0lBRXZDLE1BQU0sRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDdEQsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUMsYUFBYSxFQUFFLHNDQUFzQyxDQUFDLElBQUksQ0FBQztRQUNuRyxDQUFDLENBQUMscUNBQXFDO1FBQ3ZDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDbEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxFQUFFLENBQUMsY0FBYyxDQUFDO1FBQ3RDLGFBQWE7UUFDYixFQUFFLEVBQUUsRUFBUztRQUNiLDBFQUEwRTtRQUMxRSxtQkFBbUI7UUFDbkIsK0VBQStFO1FBQy9FLHFCQUFxQixFQUFFLFFBQVE7UUFDL0IsOEVBQThFO1FBQzlFLFVBQVUsRUFBRSxFQUFFLEdBQUcsTUFBTTtRQUN2QixTQUFTLEVBQUUsRUFBRSxHQUFHLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBR0wsTUFBTSwwQ0FBMEMsR0FBRyxRQUFRLENBQUM7SUFDNUQsTUFBTSw4Q0FBOEMsR0FBRyxRQUFRLENBQUM7SUFFaEUsS0FBSyxVQUFVLG1DQUFtQyxDQUFDLEdBR2xEO1FBQ0MsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckQsTUFBTSxJQUFJLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2pDLEdBQUcsRUFBRTtnQkFDSCxFQUFFLHlCQUF5QixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUNoRCxFQUFFLHVCQUF1QixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUM5QyxFQUFFLG9CQUFvQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUMzQyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRTthQUN2QztTQUNGLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDcEMsTUFBTSxHQUFHLEdBQTRCLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixJQUFJLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDM0QsR0FBRyxDQUFDLDRCQUE0QixDQUFDLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztZQUM5RCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLElBQUksUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN2RCxHQUFHLENBQUMsMEJBQTBCLENBQUMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO1lBQzFELENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdkQsR0FBRyxDQUFDLDZCQUE2QixDQUFDLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUMxRCxDQUFDO1lBQ0QsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUN4QyxHQUFHLENBQUMsb0JBQW9CLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDOUMsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUE0QjtnQkFDdEMsTUFBTSxFQUFFO29CQUNOLHlCQUF5QixFQUFFLEVBQUU7b0JBQzdCLHVCQUF1QixFQUFFLEVBQUU7b0JBQzNCLG9CQUFvQixFQUFFLEVBQUU7aUJBQ3pCO2FBQ0YsQ0FBQztZQUNGLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ3BCLENBQUM7WUFDRCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04scURBQXFELElBQUksQ0FBQyxNQUFNLFdBQVcsQ0FDNUUsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTLHVCQUF1QixDQUFDLE9BQVk7UUFDM0MsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxRQUFRO1lBQ25FLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQy9DLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxNQUFNLGlCQUFpQixHQUFHLE9BQU8sT0FBTyxDQUFDLGlCQUFpQixLQUFLLFFBQVE7WUFDckUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDaEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLE9BQU8sZ0JBQWdCLEtBQUssVUFBVSxJQUFJLGlCQUFpQixLQUFLLFVBQVUsQ0FBQztJQUM3RSxDQUFDO0lBRUQsS0FBSyxVQUFVLGdEQUFnRCxDQUFDLEdBRy9EO1FBQ0MsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFELE1BQU0sUUFBUSxHQUFHLE1BQU0saUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtZQUNuRCxPQUFPLE9BQU8sT0FBTyxDQUFDLEVBQUUsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRLENBQUM7UUFDeEYsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO1lBQ25DLE9BQU8sT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsQ0FBQztRQUM1RixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDdkIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDRGQUE0RixDQUFDLENBQUM7WUFDbEgsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRztZQUNwQixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxpQkFBaUIsRUFBRSxPQUFPLGFBQWEsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRO1NBQzFGLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO1lBQ2xDLG9CQUFvQixFQUFFLGVBQWU7U0FDdEMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFFakIsSUFBSSxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7WUFDL0IsU0FBUyxFQUFFLENBQUM7WUFDWixNQUFNLFFBQVEsR0FBSSxHQUFXLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUM3QyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7Z0JBQzNELENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYztnQkFDekIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQzttQkFDNUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25CLFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxlQUFlLENBQUMsU0FBUyxDQUM1QixHQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRyxHQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFHLEdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFDdEU7Z0JBQ0UsSUFBSSxFQUFFO29CQUNKLHlCQUF5QixFQUFFLENBQUMsYUFBYSxDQUFDO29CQUMxQyx5QkFBeUIsRUFBRSxHQUFHO29CQUM5QixTQUFTLEVBQUUsR0FBRztpQkFDZjtnQkFDRCxNQUFNLEVBQUU7b0JBQ04sZ0JBQWdCLEVBQUUsRUFBRTtpQkFDckI7YUFDRixDQUNGLENBQUM7WUFDRixRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUM7UUFFRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sNkRBQTZELFFBQVEsSUFBSSxTQUFTLFdBQVcsQ0FDOUYsQ0FBQztJQUNKLENBQUM7SUFFQyx3RUFBd0U7SUFDeEUsb0RBQW9EO0lBQ3BELFNBQVM7U0FDTixJQUFJLENBQUMsa0NBQWtDLENBQUM7U0FDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDNUIsV0FBVyxDQUFDLDhEQUE4RCxDQUFDO1NBQzNFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN2RCxJQUFJLENBQUMseUNBQXlDLENBQUM7U0FDL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDM0IsV0FBVyxDQUFDLDJEQUEyRCxDQUFDO1NBQ3hFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDaEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsVUFBVSxDQUN4QyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFDcEIsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FDakMsQ0FBQztRQUNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNULE1BQU0sRUFDTixxREFBcUQsTUFBTSxDQUFDLGFBQWEsWUFBWSxDQUN0RixDQUFDO0lBQ0osQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDLHNDQUFzQyxDQUFDO1NBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQzNCLFdBQVcsQ0FBQywyREFBMkQsQ0FBQztTQUN4RSxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ2hCLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFVBQVUsQ0FDeEMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQ3BCLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQzlCLENBQUM7UUFDRixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sa0RBQWtELE1BQU0sQ0FBQyxhQUFhLFlBQVksQ0FDbkYsQ0FBQztJQUNKLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQztTQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUM1QixXQUFXLENBQUMsMkVBQTJFLENBQUM7U0FDeEYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNoQixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDO1FBRXRCLHlFQUF5RTtRQUN6RSxNQUFNLFdBQVcsR0FBRyxNQUFNLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25GLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN4RCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsbUVBQW1FO1FBQ25FLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsVUFBVSxDQUN0QyxFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUM5QixFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUM1QixDQUFDO1FBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHVCQUF1QixNQUFNLENBQUMsYUFBYSxvQkFBb0IsQ0FBQyxDQUFDO1FBRXJGLHNDQUFzQztRQUN0QyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0YsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0MsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHFDQUFxQyxDQUFDLENBQUM7UUFDN0QsQ0FBQztJQUNILENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxvQ0FBb0MsQ0FBQztTQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUM3QixXQUFXLENBQUMsaUZBQWlGLENBQUM7U0FDOUYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNoQixNQUFNLCtCQUErQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyw0QkFBNEIsQ0FBQztTQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUM3QixXQUFXLENBQUMsbUVBQW1FLENBQUM7U0FDaEYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNoQixNQUFNLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyw2Q0FBNkMsQ0FBQztTQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUM3QixXQUFXLENBQUMsb0VBQW9FLENBQUM7U0FDakYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNoQixNQUFNLHVDQUF1QyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxzQ0FBc0MsQ0FBQztTQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUM3QixXQUFXLENBQUMsZ0VBQWdFLENBQUM7U0FDN0UsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxrREFBa0QsQ0FBQztTQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUM3QixXQUFXLENBQUMsa0ZBQWtGLENBQUM7U0FDL0YsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNoQixNQUFNLDBDQUEwQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyw4Q0FBOEMsQ0FBQztTQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLDRDQUE0QyxDQUFDO1NBQ2hFLFdBQVcsQ0FBQyxxRkFBcUYsQ0FBQztTQUNsRyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUwsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEYsU0FBUzthQUNOLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQzthQUMvQyxJQUFJLENBQUMsNENBQTRDLENBQUMsQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUM7YUFDakcsV0FBVyxDQUFDLDZGQUE2RixDQUFDO2FBQzFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDaEIsTUFBTSxtQ0FBbUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQyxNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSwwQ0FBMEMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pGLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSw4Q0FBOEMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN0RixTQUFTO3FCQUNOLElBQUksQ0FBQyxpREFBaUQsQ0FBQztxQkFDdkQsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUMsRUFBRSxDQUFDLDhDQUE4QyxDQUFDO3FCQUNuRyxXQUFXLENBQUMsMkVBQTJFLENBQUM7cUJBQ3hGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0JBQ2hCLE1BQU0sZ0RBQWdELENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzVELE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDbEQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDhDQUE4QyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3JGLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO3dCQUM1RSxTQUFTOzZCQUNOLElBQUksQ0FBQyw0QkFBNEIsQ0FBQzs2QkFDbEMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUMsRUFBRSxDQUFDLG9DQUFvQyxDQUFDOzZCQUM3RixXQUFXLENBQUMscUZBQXFGLENBQUM7NkJBQ2xHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7NEJBQ2hCLE1BQU0sc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ2xDLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzRCQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3QkFDbEQsQ0FBQyxDQUFDLENBQUM7d0JBQ0wsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLG9DQUFvQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQzNFLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSwyQ0FBMkMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dDQUNuRixTQUFTO3FDQUNOLElBQUksQ0FBQywwREFBMEQsQ0FBQztxQ0FDaEUsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUMsRUFBRSxDQUFDLG1EQUFtRCxDQUFDO3FDQUNsRyxXQUFXLENBQUMsNEVBQTRFLENBQUM7cUNBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0NBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29DQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnQ0FDbEQsQ0FBQyxDQUFDO3FDQUNELElBQUksQ0FBQyw0REFBNEQsQ0FBQztxQ0FDbEUsSUFBSSxDQUFDLG1EQUFtRCxDQUFDLENBQUMsRUFBRSxDQUFDLDJDQUEyQyxDQUFDO3FDQUN6RyxXQUFXLENBQUMsb0ZBQW9GLENBQUM7cUNBQ2pHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0NBQ2hCLE1BQU0sbURBQW1ELENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dDQUMxRSxDQUFDLENBQUMsQ0FBQztnQ0FDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsMkNBQTJDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQ0FDbEYsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDZCQUE2QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7d0NBQ3JFLFNBQVM7NkNBQ04sSUFBSSxDQUFDLDBCQUEwQixDQUFDOzZDQUNoQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUFFLENBQUMsNkJBQTZCLENBQUM7NkNBQ25GLFdBQVcsQ0FBQywwRkFBMEYsQ0FBQzs2Q0FDdkcsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTs0Q0FDaEIsTUFBTSxvQ0FBb0MsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0Q0FDaEQsTUFBTSw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0Q0FDekMsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7NENBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dDQUNsRCxDQUFDLENBQUMsQ0FBQzt3Q0FDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsNkJBQTZCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs0Q0FDcEUsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0RBQzlFLFNBQVM7cURBQ04sSUFBSSxDQUFDLHVFQUF1RSxDQUFDO3FEQUM3RSxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxFQUFFLENBQUMscUNBQXFDLENBQUM7cURBQzdFLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQztxREFDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtvREFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7b0RBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dEQUNsRCxDQUFDLENBQUMsQ0FBQztnREFDTCxTQUFTO3FEQUNOLElBQUksQ0FBQywyQkFBMkIsQ0FBQztxREFDakMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsRUFBRSxDQUFDLHNDQUFzQyxDQUFDO3FEQUN0RixXQUFXLENBQUMsMkRBQTJELENBQUM7cURBQ3hFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0RBQ2hCLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29EQUN4RCxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztvREFDbEUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDZEQUE2RCxDQUFDLENBQUM7Z0RBQ3JGLENBQUMsQ0FBQyxDQUFDO2dEQUNMLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSxzQ0FBc0MsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29EQUM3RSxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsaUNBQWlDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3REFDekUsU0FBUzs2REFDTixJQUFJLENBQUMscUJBQXFCLENBQUM7NkRBQzNCLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQzs2REFDbEYsV0FBVyxDQUFDLDhGQUE4RixDQUFDOzZEQUMzRyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFOzREQUNoQixNQUFNLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDOzREQUNwQyxNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0REFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0RBQ2xELENBQUMsQ0FBQyxDQUFDO3dEQUNMLElBQ0UsYUFBYSxDQUFDLGFBQWEsRUFBRSxzQ0FBc0MsQ0FBQyxJQUFJLENBQUMsRUFDekUsQ0FBQzs0REFDRCxTQUFTO2lFQUNOLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztpRUFDeEMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUMsRUFBRSxDQUFDLHNDQUFzQyxDQUFDO2lFQUNsRixXQUFXLENBQUMsMkZBQTJGLENBQUM7aUVBQ3hHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0VBQ2hCLE1BQU0sNkJBQTZCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dFQUNsRCxNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnRUFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7NERBQ2xELENBQUMsQ0FBQyxDQUFDOzREQUNMLElBQ0UsYUFBYSxDQUFDLGFBQWEsRUFBRSxzQ0FBc0MsQ0FBQyxHQUFHLENBQUMsRUFDeEUsQ0FBQztnRUFDRCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsMENBQTBDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvRUFDbEYsU0FBUzt5RUFDTixJQUFJLENBQUMsd0NBQXdDLENBQUM7eUVBQzlDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyx5Q0FBeUMsQ0FBQzt5RUFDMUYsV0FBVyxDQUFDLG1EQUFtRCxDQUFDO3lFQUNoRSxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO3dFQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3RUFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7b0VBQ2xELENBQUMsQ0FBQzt5RUFDRCxJQUFJLENBQUMsK0JBQStCLENBQUM7eUVBQ3JDLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQywwQ0FBMEMsQ0FBQzt5RUFDOUYsV0FBVyxDQUFDLHNFQUFzRSxDQUFDO3lFQUNuRixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO3dFQUNoQixNQUFNLHlDQUF5QyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3RUFDOUQsTUFBTSxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3RUFDN0MsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0VBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29FQUNsRCxDQUFDLENBQUMsQ0FBQztvRUFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsMENBQTBDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3RUFDakYsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLHVDQUF1QyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NEVBQy9FLFNBQVM7aUZBQ04sSUFBSSxDQUFDLDBEQUEwRCxDQUFDO2lGQUNoRSxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQyxFQUFFLENBQUMsc0NBQXNDLENBQUM7aUZBQzNGLFdBQVcsQ0FBQyx3RUFBd0UsQ0FBQztpRkFDckYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnRkFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0ZBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzRFQUNsRCxDQUFDLENBQUM7aUZBQ0QsSUFBSSxDQUFDLGlDQUFpQyxDQUFDO2lGQUN2QyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxFQUFFLENBQUMsdUNBQXVDLENBQUM7aUZBQ3hGLFdBQVcsQ0FBQywrREFBK0QsQ0FBQztpRkFDNUUsU0FBUyxFQUFFO2lGQUNYLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0ZBQ2hCLE1BQU0sOEJBQThCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0ZBQzFDLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dGQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0RUFDbEQsQ0FBQyxDQUFDLENBQUM7NEVBQ0wsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLHVDQUF1QyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0ZBQzlFLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSx1Q0FBdUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29GQUMvRSxTQUFTO3lGQUNOLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQzt5RkFDMUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUMsRUFBRSxDQUFDLHVDQUF1QyxDQUFDO3lGQUN6RixXQUFXLENBQUMscUVBQXFFLENBQUM7eUZBQ2xGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0ZBQ2hCLE1BQU0sc0NBQXNDLENBQUMsR0FBRyxDQUFDLENBQUM7d0ZBQ2xELE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dGQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvRkFDbEQsQ0FBQyxDQUFDLENBQUM7b0ZBQ0wsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLHVDQUF1QyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0ZBQzlFLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSxzQ0FBc0MsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDOzRGQUM5RSxTQUFTO2lHQUNOLElBQUksQ0FBQyw4REFBOEQsQ0FBQztpR0FDcEUsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUMsRUFBRSxDQUFDLHFDQUFxQyxDQUFDO2lHQUN2RixXQUFXLENBQUMsb0VBQW9FLENBQUM7aUdBQ2pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0dBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dHQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0RkFDbEQsQ0FBQyxDQUFDO2lHQUNELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQztpR0FDdEMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsRUFBRSxDQUFDLHNDQUFzQyxDQUFDO2lHQUN0RixXQUFXLENBQUMsMEZBQTBGLENBQUM7aUdBQ3ZHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0dBQ2hCLE1BQU0sa0NBQWtDLENBQUMsR0FBRyxDQUFDLENBQUM7NEZBQ2hELENBQUMsQ0FBQyxDQUFDOzRGQUNMLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dHQUNyRSxTQUFTO3FHQUNOLElBQUksQ0FBQywwQkFBMEIsQ0FBQztxR0FDaEMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDO3FHQUNwRSxXQUFXLENBQUMsK0VBQStFLENBQUM7cUdBQzVGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0dBQ2hCLE1BQU0sNEJBQTRCLENBQUMsR0FBRyxDQUFDLENBQUM7b0dBQ3hDLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29HQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnR0FDbEQsQ0FBQyxDQUFDLENBQUM7Z0dBQ0wsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0dBQzFFLFNBQVM7eUdBQ04sSUFBSSxDQUFDLGlDQUFpQyxDQUFDO3lHQUN2QyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxFQUFFLENBQUMsa0NBQWtDLENBQUM7eUdBQzlFLFdBQVcsQ0FBQywyRkFBMkYsQ0FBQzt5R0FDeEcsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3R0FDaEIsTUFBTSw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3R0FDeEMsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0dBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29HQUNsRCxDQUFDLENBQUMsQ0FBQztvR0FDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsa0NBQWtDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3R0FDekUsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLGlEQUFpRCxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NEdBQ3pGLFNBQVM7aUhBQ04sSUFBSSxDQUFDLDJDQUEyQyxDQUFDO2lIQUNqRCxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxFQUFFLENBQUMsaURBQWlELENBQUM7aUhBQzlGLFdBQVcsQ0FBQywwRUFBMEUsQ0FBQztpSEFDdkYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnSEFDaEIsTUFBTSwyQ0FBMkMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnSEFDdkQsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0hBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzRHQUNsRCxDQUFDLENBQUMsQ0FBQzs0R0FDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsaURBQWlELENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnSEFDeEYsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0hBQzdFLFNBQVM7eUhBQ04sSUFBSSxDQUFDLG1DQUFtQyxDQUFDO3lIQUN6QyxJQUFJLENBQUMsaURBQWlELENBQUMsQ0FBQyxFQUFFLENBQUMscUNBQXFDLENBQUM7eUhBQ2pHLFdBQVcsQ0FBQyx5RUFBeUUsQ0FBQzt5SEFDdEYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3SEFDaEIsTUFBTSw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3SEFDekMsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0hBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29IQUNsRCxDQUFDLENBQUMsQ0FBQztvSEFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUscUNBQXFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3SEFDNUUsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDJDQUEyQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NEhBQ25GLFNBQVM7aUlBQ04sSUFBSSxDQUFDLHdDQUF3QyxDQUFDO2lJQUM5QyxJQUFJLENBQUMscUNBQXFDLENBQUMsQ0FBQyxFQUFFLENBQUMsMkNBQTJDLENBQUM7aUlBQzNGLFdBQVcsQ0FBQyx1SEFBdUgsQ0FBQztpSUFDcEksRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnSUFDaEIsMkRBQTJEO2dJQUMzRCx5REFBeUQ7Z0lBQ3pELGdEQUFnRDtnSUFDaEQsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0lBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dJQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRIQUMvQyxDQUFDLENBQUMsQ0FBQzs0SEFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsMkNBQTJDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnSUFDbEYsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0lBQ3hFLFNBQVM7eUlBQ04sSUFBSSxDQUFDLGdDQUFnQyxDQUFDO3lJQUN0QyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7eUlBQ3RGLFdBQVcsQ0FBQyxvSUFBb0ksQ0FBQzt5SUFDakosRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3SUFDaEIsdURBQXVEO3dJQUN2RCx1REFBdUQ7d0lBQ3ZELHFEQUFxRDt3SUFDckQsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0lBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dJQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dJQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29JQUN4QyxDQUFDLENBQUMsQ0FBQztvSUFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3SUFDdkUsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NElBQ3hFLFNBQVM7aUpBQ04sSUFBSSxDQUFDLGlDQUFpQyxDQUFDO2lKQUN2QyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7aUpBQzNFLFdBQVcsQ0FBQyxzRUFBc0UsQ0FBQztpSkFDbkYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnSkFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0pBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dKQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dKQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dKQUN0QyxNQUFNLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxDQUFDOzRJQUMxQyxDQUFDLENBQUMsQ0FBQzs0SUFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnSkFDdkUsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0pBQ2xGLFNBQVM7eUpBQ04sSUFBSSxDQUFDLGdDQUFnQyxDQUFDO3lKQUN0QyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUM7eUpBQ3JGLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQzt5SkFDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3SkFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0pBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dKQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dKQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO3dKQUN0QyxNQUFNLGdDQUFnQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29KQUM5QyxDQUFDLENBQUMsQ0FBQztvSkFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsMENBQTBDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3SkFDakYsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDhDQUE4QyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NEpBQ3RGLFNBQVM7aUtBQ04sSUFBSSxDQUFDLDRDQUE0QyxDQUFDO2lLQUNsRCxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQyxFQUFFLENBQUMsOENBQThDLENBQUM7aUtBQ25HLFdBQVcsQ0FBQyxxRkFBcUYsQ0FBQztpS0FDbEcsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnS0FDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0tBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dLQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dLQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dLQUN0QyxNQUFNLHNDQUFzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRKQUNwRCxDQUFDLENBQUMsQ0FBQzs0SkFDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsOENBQThDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnS0FDckYsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0tBQ2xGLFNBQVM7eUtBQ04sSUFBSSxDQUFDLDJFQUEyRSxDQUFDO3lLQUNqRixJQUFJLENBQUMsOENBQThDLENBQUMsQ0FBQyxFQUFFLENBQUMseUNBQXlDLENBQUM7eUtBQ2xHLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQzt5S0FDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3S0FDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0tBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dLQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dLQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29LQUN4QyxDQUFDLENBQUM7eUtBQ0QsSUFBSSxDQUFDLHVDQUF1QyxDQUFDO3lLQUM3QyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUM7eUtBQzlGLFdBQVcsQ0FBQyxrRkFBa0YsQ0FBQzt5S0FDL0YsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3S0FDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0tBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dLQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dLQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO3dLQUN0QyxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29LQUMvQyxDQUFDLENBQUMsQ0FBQztvS0FDTCxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsOENBQThDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3S0FDdEYsU0FBUzs2S0FDTixJQUFJLENBQUMsMENBQTBDLENBQUM7NktBQ2hELElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyw4Q0FBOEMsQ0FBQzs2S0FDbkcsV0FBVyxDQUFDLG1HQUFtRyxDQUFDOzZLQUNoSCxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFOzRLQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0S0FDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7NEtBQ2hELE1BQU0saUNBQWlDLENBQUMsR0FBRyxDQUFDLENBQUM7NEtBQzdDLE1BQU0sMEJBQTBCLENBQUMsR0FBRyxDQUFDLENBQUM7NEtBQ3RDLE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLG1DQUFtQyxDQUFDLENBQUM7d0tBQzlFLENBQUMsQ0FBQyxDQUFDO3dLQUNMLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDOzRLQUNyRSxTQUFTO2lMQUNOLElBQUksQ0FBQyxpREFBaUQsQ0FBQztpTEFDdkQsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDO2lMQUN0RixXQUFXLENBQUMsdUZBQXVGLENBQUM7aUxBQ3BHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0xBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dMQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnTEFDaEQsTUFBTSxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnTEFDN0MsTUFBTSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnTEFDdEMsTUFBTSxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0S0FDbEMsQ0FBQyxDQUFDLENBQUM7d0tBQ1AsQ0FBQzs2S0FBTSxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsOENBQThDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs0S0FDNUYsU0FBUztpTEFDTixJQUFJLENBQUMsNERBQTRELENBQUM7aUxBQ2xFLElBQUksQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7aUxBQ3RFLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQztpTEFDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnTEFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0xBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dMQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dMQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDOzRLQUN4QyxDQUFDLENBQUMsQ0FBQzt3S0FDUCxDQUFDO29LQUNILENBQUM7eUtBQU0sSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDBDQUEwQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0tBQ3hGLFNBQVM7NktBQ04sSUFBSSxDQUFDLHVEQUF1RCxDQUFDOzZLQUM3RCxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDOzZLQUNsRSxXQUFXLENBQUMsNEVBQTRFLENBQUM7NktBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7NEtBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzRLQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0S0FDaEQsTUFBTSxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0S0FDN0MsTUFBTSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3S0FDeEMsQ0FBQyxDQUFDLENBQUM7b0tBQ1AsQ0FBQztnS0FDSCxDQUFDO3FLQUFNLENBQUM7b0tBQ04sU0FBUzt5S0FDTixJQUFJLENBQUMsMkRBQTJELENBQUM7eUtBQ2pFLElBQUksQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7eUtBQ3RFLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQzt5S0FDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3S0FDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0tBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dLQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dLQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29LQUN4QyxDQUFDLENBQUMsQ0FBQztnS0FDUCxDQUFDOzRKQUNILENBQUM7d0pBQ0gsQ0FBQzs2SkFBTSxDQUFDOzRKQUNOLFNBQVM7aUtBQ04sSUFBSSxDQUFDLHdEQUF3RCxDQUFDO2lLQUM5RCxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO2lLQUNsRSxXQUFXLENBQUMsNEVBQTRFLENBQUM7aUtBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0tBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dLQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnS0FDaEQsTUFBTSxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnS0FDN0MsTUFBTSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0SkFDeEMsQ0FBQyxDQUFDLENBQUM7d0pBQ1AsQ0FBQztvSkFDSCxDQUFDO2dKQUNILENBQUM7cUpBQU0sQ0FBQztvSkFDTixTQUFTO3lKQUNOLElBQUksQ0FBQyxrREFBa0QsQ0FBQzt5SkFDeEQsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQzt5SkFDeEQsV0FBVyxDQUFDLDRFQUE0RSxDQUFDO3lKQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO3dKQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3SkFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0pBQ2hELG9EQUFvRDt3SkFDcEQsa0RBQWtEO3dKQUNsRCx3Q0FBd0M7d0pBQ3hDLE1BQU0saUNBQWlDLENBQUMsR0FBRyxDQUFDLENBQUM7d0pBQzdDLE1BQU0sMEJBQTBCLENBQUMsR0FBRyxDQUFDLENBQUM7b0pBQ3hDLENBQUMsQ0FBQyxDQUFDO2dKQUNQLENBQUM7NElBQ0gsQ0FBQzt3SUFDSCxDQUFDOzZJQUFNLENBQUM7NElBQ04sU0FBUztpSkFDTixJQUFJLENBQUMsc0RBQXNELENBQUM7aUpBQzVELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7aUpBQ3hELFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQztpSkFDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnSkFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0pBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dKQUNoRCxNQUFNLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dKQUM3QyxNQUFNLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDOzRJQUN4QyxDQUFDLENBQUMsQ0FBQzt3SUFDUCxDQUFDO29JQUNILENBQUM7Z0lBQ0gsQ0FBQztxSUFBTSxDQUFDO29JQUNOLFNBQVM7eUlBQ04sSUFBSSxDQUFDLHNEQUFzRCxDQUFDO3lJQUM1RCxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO3lJQUNuRSxXQUFXLENBQUMsNEVBQTRFLENBQUM7eUlBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0lBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dJQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3SUFDaEQsa0RBQWtEO3dJQUNsRCxxREFBcUQ7d0lBQ3JELHlEQUF5RDt3SUFDekQsTUFBTSxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvSUFDL0MsQ0FBQyxDQUFDLENBQUM7Z0lBQ1AsQ0FBQzs0SEFDSCxDQUFDO3dIQUNILENBQUM7NkhBQU0sQ0FBQzs0SEFDTixTQUFTO2lJQUNOLElBQUksQ0FBQyxrREFBa0QsQ0FBQztpSUFDeEQsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztpSUFDN0QsV0FBVyxDQUFDLDRFQUE0RSxDQUFDO2lJQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dJQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnSUFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7NEhBQ2xELENBQUMsQ0FBQyxDQUFDO3dIQUNQLENBQUM7b0hBQ0gsQ0FBQztnSEFDSCxDQUFDO3FIQUFNLENBQUM7b0hBQ04sU0FBUzt5SEFDTixJQUFJLENBQUMsOERBQThELENBQUM7eUhBQ3BFLElBQUksQ0FBQyxpREFBaUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7eUhBQ3pFLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQzt5SEFDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3SEFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0hBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29IQUNsRCxDQUFDLENBQUMsQ0FBQztnSEFDUCxDQUFDOzRHQUNILENBQUM7d0dBQ0gsQ0FBQzs2R0FBTSxDQUFDOzRHQUNOLFNBQVM7aUhBQ04sSUFBSSxDQUFDLGdEQUFnRCxDQUFDO2lIQUN0RCxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO2lIQUMxRCxXQUFXLENBQUMsNEVBQTRFLENBQUM7aUhBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0hBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dIQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0R0FDbEQsQ0FBQyxDQUFDLENBQUM7d0dBQ1AsQ0FBQztvR0FDSCxDQUFDO2dHQUNILENBQUM7cUdBQU0sSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0dBQzNFLFNBQVM7eUdBQ04sSUFBSSxDQUFDLGtEQUFrRCxDQUFDO3lHQUN4RCxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO3lHQUNyRCxXQUFXLENBQUMsNEVBQTRFLENBQUM7eUdBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0dBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dHQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvR0FDbEQsQ0FBQyxDQUFDLENBQUM7Z0dBQ1AsQ0FBQzs0RkFDSCxDQUFDO2lHQUFNLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRSxzQ0FBc0MsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dHQUNwRixTQUFTO3FHQUNOLElBQUksQ0FBQyxrREFBa0QsQ0FBQztxR0FDeEQsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztxR0FDOUQsV0FBVyxDQUFDLDRFQUE0RSxDQUFDO3FHQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO29HQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvR0FDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0dBQ2xELENBQUMsQ0FBQyxDQUFDOzRGQUNQLENBQUM7d0ZBQ0gsQ0FBQzs2RkFBTSxDQUFDOzRGQUNOLFNBQVM7aUdBQ04sSUFBSSxDQUFDLDREQUE0RCxDQUFDO2lHQUNsRSxJQUFJLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO2lHQUMvRCxXQUFXLENBQUMsNEVBQTRFLENBQUM7aUdBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0dBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dHQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0RkFDbEQsQ0FBQyxDQUFDLENBQUM7d0ZBQ1AsQ0FBQztvRkFDSCxDQUFDO2dGQUNILENBQUM7cUZBQU0sQ0FBQztvRkFDTixTQUFTO3lGQUNOLElBQUksQ0FBQyxzRUFBc0UsQ0FBQzt5RkFDNUUsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQzt5RkFDL0QsV0FBVyxDQUFDLDRFQUE0RSxDQUFDO3lGQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO3dGQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3RkFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7b0ZBQ2xELENBQUMsQ0FBQyxDQUFDO2dGQUNQLENBQUM7NEVBQ0gsQ0FBQzt3RUFDSCxDQUFDOzZFQUFNLENBQUM7NEVBQ04sU0FBUztpRkFDTixJQUFJLENBQUMsaUVBQWlFLENBQUM7aUZBQ3ZFLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7aUZBQ2xFLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQztpRkFDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnRkFDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0ZBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzRFQUNsRCxDQUFDLENBQUMsQ0FBQzt3RUFDUCxDQUFDO29FQUNILENBQUM7Z0VBQ0gsQ0FBQztxRUFBTSxDQUFDO29FQUNOLFNBQVM7eUVBQ04sSUFBSSxDQUFDLDZEQUE2RCxDQUFDO3lFQUNuRSxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO3lFQUM5RCxXQUFXLENBQUMsNEVBQTRFLENBQUM7eUVBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0VBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dFQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvRUFDbEQsQ0FBQyxDQUFDLENBQUM7Z0VBQ1AsQ0FBQzs0REFDSCxDQUFDO3dEQUNILENBQUM7b0RBQ0gsQ0FBQzt5REFBTSxDQUFDO3dEQUNOLFNBQVM7NkRBQ04sSUFBSSxDQUFDLHNFQUFzRSxDQUFDOzZEQUM1RSxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDOzZEQUM5RCxXQUFXLENBQUMsNEVBQTRFLENBQUM7NkRBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7NERBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzREQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzt3REFDbEQsQ0FBQyxDQUFDLENBQUM7b0RBQ1AsQ0FBQztnREFDSCxDQUFDOzRDQUNILENBQUM7aURBQU0sQ0FBQztnREFDTixTQUFTO3FEQUNOLElBQUksQ0FBQyw0REFBNEQsQ0FBQztxREFDbEUsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztxREFDckQsV0FBVyxDQUFDLDRFQUE0RSxDQUFDO3FEQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO29EQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvREFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0RBQ2xELENBQUMsQ0FBQyxDQUFDOzRDQUNQLENBQUM7d0NBQ0gsQ0FBQztvQ0FDSCxDQUFDO3lDQUFNLENBQUM7d0NBQ04sU0FBUzs2Q0FDTixJQUFJLENBQUMseURBQXlELENBQUM7NkNBQy9ELElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7NkNBQ25FLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQzs2Q0FDekYsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTs0Q0FDaEIsTUFBTSxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7NENBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dDQUNsRCxDQUFDLENBQUMsQ0FBQztvQ0FDUCxDQUFDO2dDQUNILENBQUM7NEJBQ0gsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLFNBQVM7cUNBQ04sSUFBSSxDQUFDLHNDQUFzQyxDQUFDO3FDQUM1QyxJQUFJLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO3FDQUM1RCxXQUFXLENBQUMsNEVBQTRFLENBQUM7cUNBQ3pGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0NBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29DQUNyRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnQ0FDbEQsQ0FBQyxDQUFDLENBQUM7NEJBQ1AsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7eUJBQU0sQ0FBQzt3QkFDTixTQUFTOzZCQUNOLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQzs2QkFDNUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQzs2QkFDdEUsV0FBVyxDQUFDLDRFQUE0RSxDQUFDOzZCQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFOzRCQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQzs0QkFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7d0JBQ2xELENBQUMsQ0FBQyxDQUFDO29CQUNQLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixTQUFTO3FCQUNOLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQztxQkFDNUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztxQkFDbEUsV0FBVyxDQUFDLDRFQUE0RSxDQUFDO3FCQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUNoQixNQUFNLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDckQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2xELENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO1NBQU0sSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLDRDQUE0QyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUYsU0FBUzthQUNOLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQzthQUM1QyxJQUFJLENBQUMsNENBQTRDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO2FBQ3BFLFdBQVcsQ0FBQyw0RUFBNEUsQ0FBQzthQUN6RixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ2hCLE1BQU0sZ0NBQWdDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELE1BQU0sMkJBQTJCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxNQUFNLG9DQUFvQyxHQUFHLFFBQVEsQ0FBQztBQUN0RCxNQUFNLG1EQUFtRCxHQUFHLFFBQVEsQ0FBQztBQUNyRSxNQUFNLDJDQUEyQyxHQUFHLFFBQVEsQ0FBQztBQUM3RCxNQUFNLDZCQUE2QixHQUFHLFFBQVEsQ0FBQztBQUMvQyxNQUFNLHFDQUFxQyxHQUFHLFFBQVEsQ0FBQztBQUN2RCxNQUFNLHNDQUFzQyxHQUFHLFFBQVEsQ0FBQztBQUN4RCxNQUFNLGlDQUFpQyxHQUFHLFFBQVEsQ0FBQztBQUNuRCxNQUFNLHNDQUFzQyxHQUFHLFFBQVEsQ0FBQztBQUN4RCxNQUFNLHlDQUF5QyxHQUFHLFFBQVEsQ0FBQztBQUMzRCxNQUFNLDBDQUEwQyxHQUFHLFFBQVEsQ0FBQztBQUM1RCxNQUFNLHNDQUFzQyxHQUFHLFFBQVEsQ0FBQztBQUN4RCxNQUFNLHVDQUF1QyxHQUFHLFFBQVEsQ0FBQztBQUN6RCxNQUFNLHVDQUF1QyxHQUFHLFFBQVEsQ0FBQztBQUN6RCxNQUFNLHFDQUFxQyxHQUFHLFFBQVEsQ0FBQztBQUN2RCxNQUFNLHNDQUFzQyxHQUFHLFFBQVEsQ0FBQztBQUN4RCxNQUFNLDRCQUE0QixHQUFHLHNDQUFzQyxDQUFDO0FBQzVFLE1BQU0sNkJBQTZCLEdBQUcsUUFBUSxDQUFDO0FBQy9DLE1BQU0saUNBQWlDLEdBQUcsNkJBQTZCLENBQUM7QUFDeEUsTUFBTSxrQ0FBa0MsR0FBRyxRQUFRLENBQUM7QUFDcEQsTUFBTSxpREFBaUQsR0FBRyxRQUFRLENBQUM7QUFDbkUsTUFBTSxxQ0FBcUMsR0FBRyxTQUFTLENBQUM7QUFDeEQsTUFBTSwyQ0FBMkMsR0FBRyxRQUFRLENBQUM7QUFDN0QsTUFBTSxnQ0FBZ0MsR0FBRyxRQUFRLENBQUM7QUFDbEQsTUFBTSxnQ0FBZ0MsR0FBRyxRQUFRLENBQUM7QUFDbEQsTUFBTSwwQ0FBMEMsR0FBRyxRQUFRLENBQUM7QUFDNUQsTUFBTSw4Q0FBOEMsR0FBRyxRQUFRLENBQUM7QUFDaEUsTUFBTSx5Q0FBeUMsR0FBRyxRQUFRLENBQUM7QUFDM0QsTUFBTSwwQ0FBMEMsR0FBRyxRQUFRLENBQUM7QUFDNUQsTUFBTSw4Q0FBOEMsR0FBRyxRQUFRLENBQUM7QUFDaEUsTUFBTSw2QkFBNkIsR0FBRyxRQUFRLENBQUM7QUFDL0MsTUFBTSx1Q0FBdUMsR0FBRyxFQUFFLENBQUM7QUFFbkQsTUFBTSxtQ0FBbUMsR0FBRyxtQ0FBbUMsQ0FBQztBQUNoRixNQUFNLCtCQUErQixHQUFHLHlDQUF5QyxDQUFDO0FBRWxGLFNBQVMsMkNBQTJDLENBQUMsV0FBZ0I7SUFDbkUsSUFBSSxDQUFDLFdBQVcsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQ2xGLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsK0JBQStCLENBQUM7UUFDNUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLHNCQUFzQjtRQUNyRCxlQUFlLEVBQUUsV0FBVyxDQUFDLG9CQUFvQjtLQUNsRCxDQUFDLENBQUM7SUFDSCxNQUFNLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUQsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVELElBQUksV0FBVyxDQUFDLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsV0FBVyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNqRyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxPQUFPO1FBQ0wsRUFBRSxFQUFFLFVBQVU7UUFDZCxzQkFBc0IsRUFBRSxLQUFLLENBQUMsaUJBQWlCO1FBQy9DLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxlQUFlO1FBQzNDLE1BQU07UUFDTixVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7UUFDaEMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTO1FBQ2hDLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUztLQUNqQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsZ0NBQWdDLENBQUMsV0FBZ0I7SUFDeEQsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUMvRSxJQUNFLFdBQVcsQ0FBQyxHQUFHLEtBQUssVUFBVTtXQUMzQixXQUFXLENBQUMsRUFBRSxLQUFLLFVBQVU7V0FDN0IsV0FBVyxDQUFDLEdBQUcsS0FBSyxtQ0FBbUM7V0FDdkQsT0FBTyxXQUFXLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFDeEMsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsSUFBSSxNQUFXLENBQUM7SUFDaEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW9ELEtBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDekMsSUFDRSxDQUFDLE1BQU07V0FDSixPQUFPLE1BQU0sS0FBSyxRQUFRO1dBQzFCLE1BQU0sQ0FBQyxPQUFPLEtBQUssQ0FBQztXQUNwQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUNwQyxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUM7QUFDM0IsQ0FBQztBQUVELEtBQUssVUFBVSxpQ0FBaUMsQ0FBQyxHQUdoRDtJQUNDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN0RSxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDdkUsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUM3RSxNQUFNLGNBQWMsR0FBRyxNQUFNLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sYUFBYSxHQUFHLGNBQWM7UUFDbEMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLGdDQUFnQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEQsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO1FBQ2Ysc0JBQXNCLEVBQUUsUUFBUSxDQUFDLGlCQUFpQjtRQUNsRCxvQkFBb0IsRUFBRSxRQUFRLENBQUMsZUFBZTtRQUM5QyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07UUFDdkIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1FBQy9CLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDeEYsQ0FBQyxDQUFDLENBQUM7SUFDSixNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEcsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwRSxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztJQUM1RCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3hDLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ2pELE1BQU0sVUFBVSxHQUFHLDJDQUEyQyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNsQyxVQUFVLENBQUMsc0JBQXNCO1lBQ2pDLFVBQVUsQ0FBQyxvQkFBb0I7WUFDL0IsVUFBVSxDQUFDLE1BQU07U0FDbEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkUsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ25CLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNyRCxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztnQkFDN0YsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsRyxDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssTUFBTSxlQUFlLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsTUFBTSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDcEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyRSxNQUFNLG1CQUFtQixHQUFHLGtCQUFrQjtTQUMzQyxHQUFHLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUUsQ0FBQywyQ0FBMkMsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNuRixJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsUUFBYSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRixNQUFNLGlCQUFpQixHQUFHLGNBQWM7UUFDdEMsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsbUJBQW1CLENBQUM7SUFDeEIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7UUFDOUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxNQUFNLGdCQUFnQixDQUFDLFdBQVcsQ0FDaEM7UUFDRSxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pCLG9CQUFvQixFQUFFLENBQUM7UUFDdkIsTUFBTSxFQUFFLENBQUM7S0FDVixFQUNEO1FBQ0UsSUFBSSxFQUFFLCtCQUErQjtRQUNyQyxNQUFNLEVBQUUsSUFBSTtLQUNiLENBQ0YsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSywrQkFBK0IsQ0FBQyxDQUFDO0lBQ3RHLElBQ0UsQ0FBQyxVQUFVO1dBQ1IsVUFBVSxDQUFDLE1BQU0sS0FBSyxJQUFJO1dBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbkQsc0JBQXNCLEVBQUUsQ0FBQztZQUN6QixvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxDQUFDO1NBQ1YsQ0FBQyxFQUNGLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkIsTUFBTSxPQUFPLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7WUFDaEQsR0FBRyxFQUFFLFFBQVE7WUFDYixFQUFFLEVBQUUsUUFBUTtZQUNaLEdBQUcsRUFBRSxtQ0FBbUM7WUFDeEMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxLQUFLO1NBQzVCLENBQUMsQ0FBQztRQUNILElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDckYsQ0FBQztJQUNILENBQUM7SUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sbURBQW1ELG1CQUFtQixDQUFDLE1BQU0sMkJBQTJCLENBQ3pHLENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLHNDQUFzQyxDQUFDLEdBR3JEO0lBQ0MsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDeEQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FDNUI7UUFDRSxTQUFTLEVBQUUsU0FBUztRQUNwQixzQkFBc0IsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtLQUNyRCxFQUNELEVBQUUsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxzQkFBc0IsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FDakYsQ0FBQztJQUNGLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNsQixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDbkIsTUFBTSxVQUFVLEdBQVUsRUFBRSxDQUFDO0lBQzdCLE1BQU0sS0FBSyxHQUFHLEtBQUssSUFBbUIsRUFBRTtRQUN0QyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFDcEMsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQztRQUNILElBQUksS0FBSyxFQUFFLE1BQU0sUUFBUSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLFNBQVMsRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDO2dCQUNILE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBQ3BFLE1BQU0sVUFBVSxHQUFHLHlCQUF5QixDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVztvQkFDeEMsQ0FBQyxDQUFDLFVBQVU7b0JBQ1osQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLE1BQU0sU0FBUyxHQUE0QjtvQkFDekMsMEJBQTBCLEVBQUUsV0FBVztpQkFDeEMsQ0FBQztnQkFDRixNQUFNLE1BQU0sR0FBNEIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7Z0JBQzVELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDbEMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7b0JBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7Z0JBQ3BDLENBQUM7Z0JBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQztvQkFDZCxTQUFTLEVBQUU7d0JBQ1QsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUU7d0JBQzdCLE1BQU07cUJBQ1A7aUJBQ0YsQ0FBQyxDQUFDO2dCQUNILFVBQVUsRUFBRSxDQUFDO1lBQ2YsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssU0FBUztvQkFDM0MsQ0FBQyxDQUFDO3dCQUNFLFNBQVMsRUFBRTs0QkFDVCxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRTs0QkFDN0IsTUFBTSxFQUFFO2dDQUNOLElBQUksRUFBRTtvQ0FDSixNQUFNLEVBQUUsVUFBVTtvQ0FDbEIsMEJBQTBCLEVBQUUsU0FBUztpQ0FDdEM7Z0NBQ0QsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTs2QkFDMUI7eUJBQ0Y7cUJBQ0Y7b0JBQ0gsQ0FBQyxDQUFDO3dCQUNFLFNBQVMsRUFBRTs0QkFDVCxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRTs0QkFDN0IsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsMEJBQTBCLEVBQUUsRUFBRSxFQUFFLEVBQUU7eUJBQ3ZEO3FCQUNGLENBQUMsQ0FBQztZQUNULENBQUM7WUFDRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksR0FBRztnQkFBRSxNQUFNLEtBQUssRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFDRCxNQUFNLEtBQUssRUFBRSxDQUFDO0lBQ2hCLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUNELE1BQU0sVUFBVSxDQUFDLFdBQVcsQ0FDMUIsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLDBCQUEwQixFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFDL0QsRUFBRSxJQUFJLEVBQUUsd0RBQXdELEVBQUUsQ0FDbkUsQ0FBQztJQUNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSwwREFBMEQsVUFBVSxJQUFJLFNBQVMsNEJBQTRCLENBQUMsQ0FBQztBQUNySSxDQUFDO0FBRUQsS0FBSyxVQUFVLGdDQUFnQyxDQUFDLEdBRy9DO0lBQ0MsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDeEQsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDMUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHNFQUFzRSxDQUFDLENBQUM7QUFDOUYsQ0FBQztBQUVELEtBQUssVUFBVSw0QkFBNEIsQ0FBQyxHQUczQztJQUNDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM3RSxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFFM0UsTUFBTSxvQkFBb0IsQ0FBQyxhQUFhLENBQUM7UUFDdkM7WUFDRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ2QsSUFBSSxFQUFFLGdDQUFnQztZQUN0QyxNQUFNLEVBQUUsSUFBSTtTQUNiO1FBQ0Q7WUFDRSxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxFQUFFLGdDQUFnQztTQUN2QztRQUNEO1lBQ0UsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDbEMsSUFBSSxFQUFFLHdDQUF3QztTQUMvQztLQUNGLENBQUMsQ0FBQztJQUNILE1BQU0sbUJBQW1CLENBQUMsYUFBYSxDQUFDO1FBQ3RDO1lBQ0UsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNkLElBQUksRUFBRSxnQ0FBZ0M7WUFDdEMsTUFBTSxFQUFFLElBQUk7U0FDYjtRQUNEO1lBQ0UsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRTtZQUN2QixJQUFJLEVBQUUsbUNBQW1DO1lBQ3pDLE1BQU0sRUFBRSxJQUFJO1NBQ2I7S0FDRixDQUFDLENBQUM7SUFFSCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sbUZBQW1GLENBQ3BGLENBQUM7QUFDSixDQUFDO0FBZ0JELEtBQUssVUFBVSxXQUFXLENBQUMsVUFBa0I7SUFDM0MsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7UUFDeEIsSUFBSyxLQUErQixDQUFDLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDcEUsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMseUJBQXlCLENBQUMsUUFBZ0IsRUFBRSxVQUFrQjtJQUNyRSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEQsSUFDRSxjQUFjLEtBQUssWUFBWTtXQUM1QixDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQy9ELENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLDBCQUEwQixDQUN2QyxRQUFnQixFQUNoQixZQUFvQixFQUNwQixTQUFrQixFQUNsQixPQUFtQztJQUVuQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM1RCx5QkFBeUIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDaEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPO0lBQ2xCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEQsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNwQyxNQUFNLDBCQUEwQixDQUM5QixRQUFRLEVBQ1IsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEVBQ2xDLElBQUksRUFDSixPQUFPLENBQ1IsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRywyQkFBMkIsQ0FDNUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDakQsQ0FBQztJQUNGLE1BQU0sU0FBUyxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDYix3QkFBd0IsVUFBVSxZQUFZLFNBQVMsQ0FBQyxRQUFRLFFBQVEsQ0FDekUsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkQsSUFBSSxLQUFhLENBQUM7SUFDbEIsSUFBSSxDQUFDO1FBQ0gsS0FBSyxHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QseUJBQXlCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDWCxHQUFHLEVBQUUsVUFBVTtRQUNmLEtBQUs7UUFDTCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFO0tBQ3ZFLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLCtCQUErQixDQUFDLFFBQWE7SUFDcEQsTUFBTSxhQUFhLEdBQUcsMkJBQTJCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sVUFBVSxHQUFHLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pELElBQ0UsUUFBUSxDQUFDLEdBQUcsS0FBSyxVQUFVO1dBQ3hCLFFBQVEsQ0FBQyxFQUFFLEtBQUssVUFBVTtXQUMxQixRQUFRLENBQUMsR0FBRyxLQUFLLGFBQWE7V0FDOUIsT0FBTyxRQUFRLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFDckMsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQTRELFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFDRCx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FDdkIsTUFBYyxFQUNkLFFBQWdCLEVBQ2hCLGFBQXFCLEVBQ3JCLFlBQW9CO0lBRXBCLElBQUksVUFBZ0MsQ0FBQztJQUNyQyxJQUFJLFNBQStCLENBQUM7SUFDcEMsSUFBSSxDQUFDO1FBQ0gsVUFBVSxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RCxTQUFTLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksS0FBSyxDQUNiLHdCQUF3QixRQUFRLGVBQWUsTUFBTSxLQUFNLEtBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FDckYsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3hFLElBQUksRUFBRSxNQUFNO1FBQ1osTUFBTSxFQUFFLEtBQUs7S0FDZCxDQUFDLENBQUM7SUFDSCxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLElBQUksRUFBRSxNQUFNO1FBQ1osTUFBTSxFQUFFLEtBQUs7S0FDZCxDQUFDLENBQUM7SUFDSCxJQUNFLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxlQUFlLENBQUMsTUFBTTtXQUMvQyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLEVBQ2pFLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxRQUFRLGVBQWUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLG9CQUFvQixFQUFFLGFBQWEsQ0FBQztJQUNsRSxPQUFPO1FBQ0wsTUFBTTtRQUNOLFFBQVE7UUFDUixTQUFTLEVBQUUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDN0MsT0FBTyxFQUFFLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0tBQ2pGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxnQkFBdUI7SUFDL0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBS25CLENBQUM7SUFFTCxLQUFLLE1BQU0sUUFBUSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDeEMsK0JBQStCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pELElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTTtZQUFFLFNBQVM7UUFFaEUsSUFBSSxNQUFjLENBQUM7UUFDbkIsSUFBSSxRQUFnQixDQUFDO1FBQ3JCLElBQUksUUFBZ0IsQ0FBQztRQUNyQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsQ0FBQyxFQUFFLEFBQUQsRUFBRyxNQUFNLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDO1lBQ2xDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDdkIsQ0FBQzthQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxDQUFDLEVBQUUsQUFBRCxFQUFHLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQzlDLENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUztRQUNYLENBQUM7UUFDRCxJQUFJLFFBQVEsS0FBSyxhQUFhLElBQUksUUFBUSxLQUFLLFlBQVk7WUFBRSxTQUFTO1FBRXRFLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QyxNQUFNLFFBQVEsR0FBRyxHQUFHLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQzVELElBQUksUUFBUSxLQUFLLGFBQWE7WUFBRSxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDbEUsSUFBSSxRQUFRLEtBQUssWUFBWTtZQUFFLEtBQUssQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNoRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQXlCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0JBQStCLEtBQUssQ0FBQyxRQUFRLGVBQWUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUMzRSxDQUFDO1FBQ0osQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQ3pCLEtBQUssQ0FBQyxNQUFNLEVBQ1osS0FBSyxDQUFDLFFBQVEsRUFDZCxLQUFLLENBQUMsVUFBVSxFQUNoQixLQUFLLENBQUMsU0FBUyxDQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsS0FBSyxVQUFVLDJCQUEyQixDQUFDLEdBRzFDLEVBQUUsU0FHb0M7SUFDckMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDekQsSUFBSSxPQUFPLFVBQVUsQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDO1lBQ0gsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsTUFBTSxPQUFPLEdBQUksS0FBZSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDL0MsTUFBTSxJQUFJLEdBQUksS0FBMkIsQ0FBQyxJQUFJLENBQUM7WUFDL0MsSUFBSSxJQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFBRSxNQUFNLEtBQUssQ0FBQztRQUM3RSxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixNQUFNLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM3QixJQUNFLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUM7ZUFDN0QsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxFQUM5QyxDQUFDO1lBQ0QsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUN4QixFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQ25CLEVBQUUsTUFBTSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FDckMsQ0FBQztZQUNGLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQzFCLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQ3ZCO1FBQ0UsSUFBSSxFQUFFLDJCQUEyQjtRQUNqQyxNQUFNLEVBQUUsSUFBSTtRQUNaLE1BQU0sRUFBRSxJQUFJO0tBQ2IsQ0FDRixDQUFDO0lBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ1QsTUFBTSxFQUNOLEdBQUcsU0FBUyxpREFBaUQsT0FBTyxvQkFBb0IsQ0FDekYsQ0FBQztBQUNKLENBQUM7QUFFRCxLQUFLLFVBQVUsNkJBQTZCLENBQzFDLEdBR0MsRUFDRCxPQUFrQztJQUVsQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdEUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixDQUFDO0lBQ3JELElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFFakIsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLE1BQU0sUUFBUSxHQUFHLE1BQU0sV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLElBQUksUUFBUSxFQUFFLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM3RixDQUFDO1FBQ0QsSUFBSSxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBK0IsRUFBRSxDQUFDO1FBQ3JELEtBQUssTUFBTSxZQUFZLElBQUk7WUFDekIsWUFBWTtZQUNaLFdBQVc7WUFDWCxlQUFlO1lBQ2YsaUJBQWlCO1lBQ2pCLFVBQVU7U0FDWCxFQUFFLENBQUM7WUFDRixNQUFNLDBCQUEwQixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFDRCxLQUFLLE1BQU0sWUFBWSxJQUFJO1lBQ3pCLDBCQUEwQjtZQUMxQixrQ0FBa0M7U0FDbkMsRUFBRSxDQUFDO1lBQ0YsTUFBTSwwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBRUQsS0FBSyxNQUFNLEtBQUssSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQyxNQUFNLEVBQUUsR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1RCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLCtCQUErQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZFLENBQUM7Z0JBQ0QsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsU0FBUztZQUNYLENBQUM7WUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0saUJBQWlCLENBQUMsU0FBUyxDQUFDO2dCQUNoQyxHQUFHLEVBQUUsRUFBRTtnQkFDUCxFQUFFO2dCQUNGLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztnQkFDZCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0JBQ2xCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsU0FBUyxFQUFFLEdBQUc7YUFDZixDQUFDLENBQUM7WUFDSCxRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFDakQsR0FBRyxFQUFFO1lBQ0gsSUFBSSxFQUFFLGNBQWM7WUFDcEIsR0FBRyxFQUFFLG9CQUFvQjtTQUMxQjtLQUNGLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNiLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUMzQixTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDcEUsQ0FBQztJQUVGLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDaEUsTUFBTSxZQUFZLEdBQUcsTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlELElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztJQUN4QixLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0RixNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLElBQUk7WUFBRSxTQUFTO1FBRXBCLE1BQU0sUUFBUSxHQUE0QixFQUFFLENBQUM7UUFDN0MsSUFBSSxPQUFPLFdBQVcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxLQUFLLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDMUYsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM1QixRQUFRLENBQUMsVUFBVSxHQUFHO2dCQUNwQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLE9BQU8sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTztnQkFDMUQsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN6QixTQUFTLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNyRSxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQztZQUM1RSxDQUFDLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNO1lBQ25DLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksS0FBSyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7WUFDdEYsUUFBUSxDQUFDLGNBQWMsR0FBRztnQkFDeEIsR0FBRyxXQUFXLENBQUMsY0FBYztnQkFDN0IsZUFBZSxFQUFFLFNBQVM7Z0JBQzFCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ2pGLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxNQUFNLENBQ2pDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxLQUFLLHNCQUFzQixDQUN2RDtnQkFDRCxPQUFPLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7YUFDbEMsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sZUFBZSxDQUFDLFNBQVMsQ0FDN0IsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUN4QixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FDbkIsQ0FBQztZQUNGLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUNuRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sc0NBQXNDLFFBQVEscUJBQXFCLFFBQVEsZUFBZSxTQUFTLENBQUMsTUFBTSwyQkFBMkIsZUFBZSxZQUFZLENBQ2pLLENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLHdCQUF3QixDQUFDLEdBR3ZDO0lBQ0MsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNoRSxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM1RCxNQUFNLFNBQVMsR0FBRyxNQUFNLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUM7SUFFMUMsS0FBSyxNQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM1QixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxTQUFTO1FBQ2hDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUYsR0FBRyxDQUFDLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTSxLQUFLLEdBQTRCLEVBQUUsQ0FBQztZQUMxQyxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BFLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JDLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxlQUFlLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLENBQUM7WUFDRCxNQUFNLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDeEQsdUJBQXVCLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDakMsTUFBTSxTQUFTLEdBQUcsT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xGLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsTUFBTSxRQUFRLEdBQTRCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDO1lBQ2xELFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM3QixRQUFRLENBQUMsY0FBYyxHQUFHO2dCQUN4QixlQUFlLEVBQUUsU0FBUztnQkFDMUIsaUJBQWlCLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsTUFBTSxFQUFFLENBQUM7d0JBQ1AsSUFBSSxFQUFFLG1DQUFtQzt3QkFDekMsT0FBTyxFQUFFLDZGQUE2Rjt3QkFDdEcsU0FBUyxFQUFFLElBQUk7cUJBQ2hCLENBQUM7Z0JBQ0YsVUFBVSxFQUFFO29CQUNWLG1CQUFtQixFQUFFLGFBQWE7b0JBQ2xDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGFBQWE7aUJBQ2xGO2dCQUNELE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFO2FBQ3RELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxTQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEMsUUFBUSxDQUFDLFVBQVUsR0FBRztnQkFDcEIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQztnQkFDNUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSTtnQkFDckMsU0FBUztnQkFDVCxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDO2FBQzdDLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxNQUFNLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsTUFBTSxlQUFlLENBQUMsV0FBVyxDQUMvQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFDYixFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQzlDLENBQUM7SUFFRixNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBVSxDQUFDO0lBQzVFLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDdEMsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLElBQUksS0FBSyxFQUFFLE1BQU0sTUFBTSxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUM7UUFDNUMsZ0JBQWdCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO1FBQ3BDLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLHNCQUFzQixDQUFDLEVBQUU7S0FDL0QsQ0FBQyxFQUFFLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUUsTUFBYyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUUsTUFBYyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUUsTUFBYyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFFMUIsSUFBSyxNQUFjLENBQUMsU0FBUyxLQUFLLGdCQUFnQixJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25GLGNBQWMsR0FBRyxtQkFBbUIsSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3BELGdCQUFnQixHQUFHLHdCQUF3QixJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3JFLENBQUM7YUFBTSxJQUFLLE1BQWMsQ0FBQyxTQUFTLEtBQUssc0JBQXNCLEVBQUUsQ0FBQztZQUNoRSxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2xELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxNQUFNLENBQUUsTUFBYyxDQUFDLFFBQVEsQ0FBQztvQkFBRSxPQUFPLEtBQUssQ0FBQztnQkFDcEYsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDekUsT0FBTyxJQUFJLEtBQUssTUFBTTt1QkFDakIsSUFBSSxLQUFLLFVBQVUsTUFBTSxFQUFFO3VCQUMzQixJQUFJLEtBQUssR0FBRyxRQUFRLGVBQWUsTUFBTSxFQUFFO3VCQUMzQyxJQUFJLEtBQUssTUFBTSxNQUFNLEVBQUUsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsY0FBYyxHQUFHLFVBQVUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM5QyxnQkFBZ0IsR0FBRyxlQUFlLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNoRixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUMzRCxTQUFTO1FBQ1gsQ0FBQztRQUNELFdBQVcsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsQyxNQUFNLGFBQWEsQ0FBQyxTQUFTLENBQzNCLEVBQUUsR0FBRyxFQUFHLE1BQWMsQ0FBQyxHQUFHLEVBQUUsRUFDNUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsQ0FDakYsQ0FBQztRQUNGLGNBQWMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQzlELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNULE1BQU0sRUFDTixnQ0FBZ0MsdUJBQXVCLGlDQUFpQyxjQUFjLCtCQUErQixDQUN0SSxDQUFDO0FBQ0osQ0FBQztBQUVELEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxHQUdyQztJQUNDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sSUFBSSxHQUFHLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqRCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0lBQ3BDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLElBQUk7WUFBRSxTQUFTO1FBQ3BCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25CLE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM3QyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsdUNBQXVDLE9BQU8sMEJBQTBCLENBQUMsQ0FBQztBQUNoRyxDQUFDO0FBRUQsS0FBSyxVQUFVLGlDQUFpQyxDQUFDLEdBR2hEO0lBQ0MsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNoRSxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzVELE1BQU0sT0FBTyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzFELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUM3QixPQUFPO1NBQ0osTUFBTSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxLQUFLLFVBQVUsQ0FBQztTQUN0RCxHQUFHLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7U0FDM0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUNuQixDQUFDO0lBQ0YsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3ZELE1BQU0sZUFBZSxHQUFVLEVBQUUsQ0FBQztJQUNsQyxJQUFJLHFCQUFxQixHQUFHLENBQUMsQ0FBQztJQUM5QixJQUFJLDJCQUEyQixHQUFHLENBQUMsQ0FBQztJQUNwQyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksT0FBTyxNQUFNLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbkYsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLElBQUk7Z0JBQ3RFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNyQixDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsRUFBRSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRTtvQkFDakQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7b0JBQ25CLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUVBQWlFLENBQUMsQ0FBQztZQUNyRixDQUFDO1lBRUQsSUFDRSxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVE7bUJBQ3ZCLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsRUFDckQsQ0FBQztnQkFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxTQUFTLENBQUM7b0JBQzNDLEdBQUcsZ0JBQWdCO29CQUNuQixNQUFNLEVBQUUsUUFBUTtvQkFDaEIsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtpQkFDMUMsQ0FBQyxDQUFDO2dCQUNILDJCQUEyQixJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDO2dCQUN4RCxTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sYUFBYSxDQUFDLFNBQVMsQ0FDM0IsRUFBRSxHQUFHLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUNsRSxFQUFFLE1BQU0sRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxFQUFFLENBQ3JDLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztZQUMvQixxQkFBcUIsRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFDRCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLG1DQUFtQyxHQUFHLENBQUMsQ0FBQztJQUM1QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQzdELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDNUMsTUFBTSxjQUFjLEdBQUcsY0FBYyxFQUFFLGNBQWMsQ0FBQztRQUN0RCxNQUFNLGlCQUFpQixHQUFHLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQztRQUM1RCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssSUFBSTtZQUNwRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNwQixDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsRUFBRSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRTtnQkFDL0MsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxJQUNFLGNBQWMsRUFBRSxlQUFlLEtBQUssUUFBUTtlQUN6QyxjQUFjO2VBQ2QsT0FBTyxjQUFjLEtBQUssUUFBUTtlQUNsQyxNQUFNLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO2VBQ25DLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFDdEUsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sZUFBZSxDQUFDLFNBQVMsQ0FDNUM7Z0JBQ0UsR0FBRyxnQkFBZ0I7Z0JBQ25CLGdDQUFnQyxFQUFFLFFBQVE7Z0JBQzFDLGtDQUFrQyxFQUFFLGlCQUFpQjtnQkFDckQsK0JBQStCLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO2dCQUNsRCwwQ0FBMEMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7YUFDL0QsRUFDRCxFQUFFLElBQUksRUFBRSxFQUFFLDBDQUEwQyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsQ0FDNUUsQ0FBQztZQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxjQUFjLENBQUMsVUFBVSxHQUFHLGlCQUFpQixDQUFDO2dCQUM5QyxtQ0FBbUMsRUFBRSxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsZUFBZSxDQUFDO1lBQUUsU0FBUztRQUNuRSxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3JDLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQztZQUMvRCxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPO1lBQzlCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNQLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7Z0JBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsVUFBVSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDaEUsS0FBSyxNQUFNLE1BQU0sSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3QyxJQUNFLE1BQU0sQ0FBQyxTQUFTLEtBQUsscUJBQXFCO21CQUN2QyxNQUFNLENBQUMsY0FBYyxLQUFLLE9BQU87bUJBQ2pDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO2dCQUM5QixVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFDRCxNQUFNLGVBQWUsQ0FBQyxTQUFTLENBQzdCLGdCQUFnQixFQUNoQixFQUFFLElBQUksRUFBRSxFQUFFLGdDQUFnQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQ3ZFLENBQUM7UUFDRixpQkFBaUIsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sNkNBQTZDLGlCQUFpQixtQ0FBbUMsbUNBQW1DLDJDQUEyQywyQkFBMkIseUNBQXlDLHFCQUFxQiw2QkFBNkIsQ0FDdFMsQ0FBQztBQUNKLENBQUM7QUFFRCxLQUFLLFVBQVUseUNBQXlDLENBQ3RELEdBR0MsRUFDRCxPQUFrQztJQUVsQyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4RCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFFdEIsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sWUFBWSxHQUFHLE1BQU0sVUFBVTthQUNsQyxJQUFJLENBQUM7WUFDSixVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO1lBQzdCLG1CQUFtQixFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtTQUN4QyxDQUFDO2FBQ0QsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7YUFDL0IsS0FBSyxDQUFDLHVDQUF1QyxDQUFDO2FBQzlDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxNQUFNO1FBRXJDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQztRQUN4RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FDYixvRkFBb0YsQ0FDckYsQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLE9BQU8sV0FBVyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7WUFDRCxJQUFJLE9BQU8sV0FBVyxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDL0QsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLEVBQUUsTUFBTSxDQUFDO1lBQzlDLE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDN0MsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNqRixNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7WUFFRCxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxHQUFHLEtBQUssU0FBUztnQkFDcEQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUNSLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sU0FBUyxHQUFHLE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FDMUM7Z0JBQ0UsR0FBRyxnQkFBZ0I7Z0JBQ25CLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVTtnQkFDbEMsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO2FBQ3hDLEVBQ0Q7Z0JBQ0UsSUFBSSxFQUFFO29CQUNKLG1CQUFtQixFQUFFLFNBQVM7b0JBQzlCLGNBQWMsRUFBRSxVQUFVLENBQUMsTUFBTTtvQkFDakMsVUFBVSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2lCQUNyQztnQkFDRCxNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFO2FBQzNCLENBQ0YsQ0FBQztZQUNGLElBQUksU0FBUyxDQUFDLGFBQWEsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNELE1BQU0sY0FBYyxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDeEQsSUFDRSxPQUFPLEVBQUUsbUJBQW1CLEtBQUssU0FBUzt1QkFDdkMsT0FBTyxDQUFDLGNBQWMsS0FBSyxVQUFVLENBQUMsTUFBTTt1QkFDNUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQzt1QkFDNUQsY0FBYzt1QkFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFDakQsQ0FBQztvQkFDRCxTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFDRCxhQUFhLEVBQUUsQ0FBQztRQUNsQixDQUFDO1FBRUQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ1QsTUFBTSxFQUNOLHdEQUF3RCxZQUFZLENBQUMsTUFBTSxnQkFBZ0IsYUFBYSxpQkFBaUIsQ0FDMUgsQ0FBQztJQUNKLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVCxNQUFNLEVBQ04sMkNBQTJDLGFBQWEsNEJBQTRCLENBQ3JGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUywyQkFBMkIsQ0FBQyxLQUFjO0lBQ2pELE1BQU0sU0FBUyxHQUFHLEtBQStDLENBQUM7SUFDbEUsT0FBTyxTQUFTLENBQUMsSUFBSSxLQUFLLEVBQUUsSUFBSSxTQUFTLENBQUMsUUFBUSxLQUFLLG1CQUFtQixDQUFDO0FBQzdFLENBQUM7QUFFRCxLQUFLLFVBQVUsb0JBQW9CLENBQUMsR0FHbkM7SUFDQyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxRCx3RUFBd0U7SUFDeEUsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFGLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUFFLE1BQU07UUFDMUIsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNqQyxJQUFJLE9BQU8sV0FBVyxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVTttQkFDcEUsV0FBVyxDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7WUFDcEgsTUFBTSxXQUFXLEdBQUcsVUFBVSxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdkQsSUFBSSxXQUFXLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLENBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNyRixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUM3RixFQUFFLElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLElBQUksT0FBTyxDQUFDLGFBQWEsS0FBSyxDQUFDO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNwRyxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUYsdUVBQXVFO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNELEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7UUFDNUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9GLE1BQU0sWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCO1FBQ3hILHVCQUF1QixFQUFFLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLDBCQUEwQixDQUFDLEVBQUUsQ0FBQztRQUM1RyxNQUFNLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUNELE1BQU0sR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLENBQUMsQ0FBQztJQUNoSSxNQUFNLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUMsYUFBYSxDQUFDO1FBQy9ELEVBQUUsR0FBRyxFQUFFLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1FBQy9ELEVBQUUsR0FBRyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7UUFDbkUsRUFBRSxHQUFHLEVBQUUsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7S0FDaEUsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUNwRSxFQUFFLEdBQUcsRUFBRSxFQUFFLHdCQUF3QixFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7UUFDOUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxxQ0FBcUMsRUFBRTtRQUN6RixFQUFFLEdBQUcsRUFBRSxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxpQ0FBaUMsRUFBRTtRQUN4RixFQUFFLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRTtRQUNwSCxFQUFFLEdBQUcsRUFBRSxFQUFFLGdCQUFnQixFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLCtCQUErQixFQUFFO0tBQy9FLENBQUMsQ0FBQztJQUNILE1BQU0sR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDakUsRUFBRSxHQUFHLEVBQUUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLCtCQUErQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7UUFDcEYsRUFBRSxHQUFHLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSwrQkFBK0IsRUFBRTtRQUNuRixFQUFFLEdBQUcsRUFBRSxFQUFFLG1CQUFtQixFQUFFLENBQUMsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRTtLQUNwRyxDQUFDLENBQUM7SUFDSCxNQUFNLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLDBCQUEwQixDQUFDLENBQUMsV0FBVyxDQUNqRSxFQUFFLHFCQUFxQixFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsOEJBQThCLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sR0FBRyxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxXQUFXLENBQ2pFLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSwyQkFBMkIsRUFBRSxDQUFDLENBQUM7SUFDekUsTUFBTSxHQUFHLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUNqRSxFQUFFLEdBQUcsRUFBRSxFQUFFLHdCQUF3QixFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSw2QkFBNkIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7UUFDekcsRUFBRSxHQUFHLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSw2QkFBNkIsRUFBRTtRQUNqRixFQUFFLEdBQUcsRUFBRSxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRTtRQUNsRixFQUFFLEdBQUcsRUFBRSxFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSx3QkFBd0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsNkJBQTZCLEVBQUU7UUFDbkcsRUFBRSxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7UUFDNUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRTtLQUN2RSxDQUFDLENBQUM7SUFDSCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsMEZBQTBGLENBQUMsQ0FBQztBQUNsSCxDQUFDO0FBRUQsS0FBSyxVQUFVLDhCQUE4QixDQUFDLEdBRzdDO0lBQ0MseUVBQXlFO0lBQ3pFLDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUscURBQXFEO0lBQ3JELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDOUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssQ0FBQztZQUFFLE1BQU0sS0FBSyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQzFCLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUNoQixFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUN0QyxDQUFDO0lBQ0YsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUMxQixFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFDM0IsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsQ0FDakMsQ0FBQztJQUVGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNULE1BQU0sRUFDTixnRkFBZ0YsQ0FDakYsQ0FBQztBQUNKLENBQUMifQ==
1622
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUNMLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLCtCQUErQixHQUNoQyxNQUFNLDhDQUE4QyxDQUFDO0FBQ3RELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pGLE9BQU8sRUFDTCxhQUFhLElBQUksb0JBQW9CLEVBQ3JDLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsbUJBQW1CLEdBQ3BCLE1BQU0seUNBQXlDLENBQUM7QUFNakQsT0FBTyxFQUFFLElBQUksSUFBSSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpFLDZGQUE2RjtBQUM3RixNQUFNLHNCQUFzQixHQUFHLHVCQUF1QixDQUFDLGdDQUFnQyxDQUFDLE1BQU0sQ0FBQztBQUUvRjs7Ozs7O0dBTUc7QUFFSDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxLQUFLO0lBQy9DLFlBQVksVUFBa0IsRUFBRSxVQUFnQztRQUM5RCxLQUFLLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsd0JBQXdCLENBQUM7SUFDdkMsQ0FBQztDQUNGO0FBZ0JELDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsTUFBTSxDQUFD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