@researchdatabox/redbox-core 5.0.3 → 5.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DatastreamService.d.ts +2 -0
- package/dist/DatastreamService.d.ts.map +1 -1
- package/dist/QueueService.d.ts +1 -1
- package/dist/QueueService.d.ts.map +1 -1
- package/dist/RecordWriteOptions.d.ts +21 -0
- package/dist/RecordWriteOptions.d.ts.map +1 -0
- package/dist/RecordWriteOptions.js +17 -0
- package/dist/RecordsService.d.ts +3 -1
- package/dist/RecordsService.d.ts.map +1 -1
- package/dist/StorageService.d.ts +14 -2
- package/dist/StorageService.d.ts.map +1 -1
- package/dist/config/agendaQueue.config.d.ts.map +1 -1
- package/dist/config/agendaQueue.config.js +10 -1
- package/dist/config/i18n.config.d.ts +4 -0
- package/dist/config/i18n.config.d.ts.map +1 -1
- package/dist/config/i18n.config.js +1 -1
- package/dist/configmodels/FigsharePublishing.d.ts +103 -0
- package/dist/configmodels/FigsharePublishing.d.ts.map +1 -1
- package/dist/configmodels/FigsharePublishing.js +36 -2
- package/dist/controllers/RecordAuditController.d.ts.map +1 -1
- package/dist/controllers/RecordAuditController.js +24 -6
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/model/storage/FigshareSyncModel.d.ts +126 -0
- package/dist/model/storage/FigshareSyncModel.d.ts.map +1 -0
- package/dist/model/storage/FigshareSyncModel.js +3 -0
- package/dist/model/storage/RecordAuditModel.d.ts +3 -0
- package/dist/model/storage/RecordAuditModel.d.ts.map +1 -1
- package/dist/model/storage/RecordAuditModel.js +29 -1
- package/dist/model/storage/RecordModel.d.ts +3 -0
- package/dist/model/storage/RecordModel.d.ts.map +1 -1
- package/dist/services/AgendaQueueService.d.ts +1 -1
- package/dist/services/AgendaQueueService.d.ts.map +1 -1
- package/dist/services/AgendaQueueService.js +7 -4
- package/dist/services/FigshareService.d.ts +15 -10
- package/dist/services/FigshareService.d.ts.map +1 -1
- package/dist/services/FigshareService.js +76 -536
- package/dist/services/I18nEntriesService.d.ts +2 -0
- package/dist/services/I18nEntriesService.d.ts.map +1 -1
- package/dist/services/I18nEntriesService.js +40 -5
- package/dist/services/RecordsService.d.ts +5 -1
- package/dist/services/RecordsService.d.ts.map +1 -1
- package/dist/services/RecordsService.js +277 -164
- package/dist/services/StandardDatastreamService.d.ts +5 -0
- package/dist/services/StandardDatastreamService.d.ts.map +1 -1
- package/dist/services/StandardDatastreamService.js +18 -1
- package/dist/services/figshare-v2/admin.d.ts +16 -0
- package/dist/services/figshare-v2/admin.d.ts.map +1 -0
- package/dist/services/figshare-v2/admin.js +283 -0
- package/dist/services/figshare-v2/assets.d.ts +20 -1
- package/dist/services/figshare-v2/assets.d.ts.map +1 -1
- package/dist/services/figshare-v2/assets.js +16 -1
- package/dist/services/figshare-v2/config.d.ts +8 -2
- package/dist/services/figshare-v2/config.d.ts.map +1 -1
- package/dist/services/figshare-v2/config.js +31 -3
- package/dist/services/figshare-v2/execution.d.ts +25 -0
- package/dist/services/figshare-v2/execution.d.ts.map +1 -0
- package/dist/services/figshare-v2/execution.js +49 -0
- package/dist/services/figshare-v2/http.d.ts +6 -1
- package/dist/services/figshare-v2/http.d.ts.map +1 -1
- package/dist/services/figshare-v2/http.js +69 -12
- package/dist/services/figshare-v2/identity.d.ts +12 -0
- package/dist/services/figshare-v2/identity.d.ts.map +1 -0
- package/dist/services/figshare-v2/identity.js +78 -0
- package/dist/services/figshare-v2/managed-assets.d.ts +9 -0
- package/dist/services/figshare-v2/managed-assets.d.ts.map +1 -0
- package/dist/services/figshare-v2/managed-assets.js +229 -0
- package/dist/services/figshare-v2/plan.d.ts.map +1 -1
- package/dist/services/figshare-v2/plan.js +2 -9
- package/dist/services/figshare-v2/source-intent.d.ts +9 -0
- package/dist/services/figshare-v2/source-intent.d.ts.map +1 -0
- package/dist/services/figshare-v2/source-intent.js +93 -0
- package/dist/services/figshare-v2/status.d.ts +4 -0
- package/dist/services/figshare-v2/status.d.ts.map +1 -0
- package/dist/services/figshare-v2/status.js +29 -0
- package/dist/services/figshare-v2/sync-store.d.ts +27 -0
- package/dist/services/figshare-v2/sync-store.d.ts.map +1 -0
- package/dist/services/figshare-v2/sync-store.js +139 -0
- package/dist/services/figshare-v2/types.d.ts +3 -0
- package/dist/services/figshare-v2/types.d.ts.map +1 -1
- package/dist/services/figshare-v2/types.js +1 -1
- package/dist/services/figshare-v2/worker.d.ts +16 -0
- package/dist/services/figshare-v2/worker.d.ts.map +1 -0
- package/dist/services/figshare-v2/worker.js +572 -0
- package/dist/utilities/TranslationHtml.d.ts +3 -0
- package/dist/utilities/TranslationHtml.d.ts.map +1 -0
- package/dist/utilities/TranslationHtml.js +46 -0
- package/dist/waterline-models/FigshareSync.d.ts +41 -0
- package/dist/waterline-models/FigshareSync.d.ts.map +1 -0
- package/dist/waterline-models/FigshareSync.js +168 -0
- package/dist/waterline-models/index.d.ts +2 -0
- package/dist/waterline-models/index.d.ts.map +1 -1
- package/dist/waterline-models/index.js +4 -1
- package/package.json +8 -8
|
@@ -0,0 +1,572 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.contentHash = void 0;
|
|
7
|
+
exports.getSyncStore = getSyncStore;
|
|
8
|
+
exports.projectionPaths = projectionPaths;
|
|
9
|
+
exports.importRecordIntent = importRecordIntent;
|
|
10
|
+
exports.dispatchFigshare = dispatchFigshare;
|
|
11
|
+
exports.runFigshareWorker = runFigshareWorker;
|
|
12
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
13
|
+
const node_crypto_1 = require("node:crypto");
|
|
14
|
+
const types_1 = require("./types");
|
|
15
|
+
const FigsharePublishing_1 = require("../../configmodels/FigsharePublishing");
|
|
16
|
+
const config_1 = require("./config");
|
|
17
|
+
const sync_store_1 = require("./sync-store");
|
|
18
|
+
const execution_1 = require("./execution");
|
|
19
|
+
const identity_1 = require("./identity");
|
|
20
|
+
const source_intent_1 = require("./source-intent");
|
|
21
|
+
const http_1 = require("./http");
|
|
22
|
+
const runtime_1 = require("./runtime");
|
|
23
|
+
const embargo_1 = require("./embargo");
|
|
24
|
+
const managed_assets_1 = require("./managed-assets");
|
|
25
|
+
const audit_1 = require("./audit");
|
|
26
|
+
const context_1 = require("./context");
|
|
27
|
+
const IntegrationAuditModel_1 = require("../../model/storage/IntegrationAuditModel");
|
|
28
|
+
const RecordWriteOptions_1 = require("../../RecordWriteOptions");
|
|
29
|
+
const contentHash = (value) => {
|
|
30
|
+
const canonical = (v) => Array.isArray(v) ? v.map(canonical) : v && typeof v === 'object'
|
|
31
|
+
? Object.fromEntries(Object.entries(v).sort(([a], [b]) => a.localeCompare(b)).map(([k, x]) => [k, canonical(x)])) : v;
|
|
32
|
+
return (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(canonical(value))).digest('hex');
|
|
33
|
+
};
|
|
34
|
+
exports.contentHash = contentHash;
|
|
35
|
+
function getSyncStore() {
|
|
36
|
+
const manager = FigshareSync.getDatastore().manager;
|
|
37
|
+
return new sync_store_1.FigshareSyncStore(manager);
|
|
38
|
+
}
|
|
39
|
+
function projectionPaths(config) {
|
|
40
|
+
return [...new Set([config.record.articleIdPath, config.record.statusPath, config.record.errorPath, config.record.syncStatePath,
|
|
41
|
+
config.record.dataLocationsPath, config.record.allFilesUploadedPath, config.writeBack.articleId, ...config.writeBack.articleUrls,
|
|
42
|
+
...config.writeBack.extraFields.map(f => f.targetPath)].filter((p) => !!p))];
|
|
43
|
+
}
|
|
44
|
+
/** Source import never acknowledges before durable state exists. Queue delivery is disposable. */
|
|
45
|
+
async function importRecordIntent(store, record) {
|
|
46
|
+
const intent = record.figshareSyncIntent;
|
|
47
|
+
if (!intent?.pending || intent.readiness !== 'ready')
|
|
48
|
+
return;
|
|
49
|
+
const storage = RecordsService.getFigshareIntentStorage();
|
|
50
|
+
if (!storage.acknowledgeFigshareIntent)
|
|
51
|
+
throw new Error('Storage adapter cannot acknowledge Figshare intent');
|
|
52
|
+
await store.importSource(record.redboxOid, record.metaMetadata.brandId, intent);
|
|
53
|
+
await storage.acknowledgeFigshareIntent(record.redboxOid, intent.generation);
|
|
54
|
+
}
|
|
55
|
+
const PAUSED_DISPATCH_BACKOFF_MS = 5 * 60 * 1000;
|
|
56
|
+
// Failed saves abandon their intent explicitly, so only saves interrupted by a process stop reach this
|
|
57
|
+
// threshold. It is set well beyond any synchronous post-save hook, so live saves are never promoted early.
|
|
58
|
+
const STALE_INITIALISING_MS = 60 * 60 * 1000;
|
|
59
|
+
async function dispatchFigshare() {
|
|
60
|
+
const storage = RecordsService.getFigshareIntentStorage();
|
|
61
|
+
if (!storage.pendingFigshareIntents)
|
|
62
|
+
return;
|
|
63
|
+
const store = getSyncStore();
|
|
64
|
+
await store.ensureIndexes();
|
|
65
|
+
if (storage.recoverStaleFigshareIntents) {
|
|
66
|
+
const recovered = await storage.recoverStaleFigshareIntents(new Date(Date.now() - STALE_INITIALISING_MS).toISOString());
|
|
67
|
+
if (recovered)
|
|
68
|
+
sails.log.warn(`Recovered ${recovered} Figshare intent(s) left initialising by an interrupted save`);
|
|
69
|
+
}
|
|
70
|
+
let afterOid = '';
|
|
71
|
+
while (true) {
|
|
72
|
+
const page = await storage.pendingFigshareIntents(100, afterOid);
|
|
73
|
+
for (const record of page) {
|
|
74
|
+
try {
|
|
75
|
+
const config = (0, config_1.resolveFigsharePublishingConfig)(record, { requireToken: false });
|
|
76
|
+
if (config?.processing?.enabled && !config.processingError)
|
|
77
|
+
await importRecordIntent(store, record);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
sails.log.error(`Figshare intent import failed for ${record.redboxOid}; pending work is retained`, error);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (page.length < 100)
|
|
84
|
+
break;
|
|
85
|
+
afterOid = page[page.length - 1].redboxOid;
|
|
86
|
+
}
|
|
87
|
+
// Exclude rows already visited this run before the page limit, so paging continues past paused records
|
|
88
|
+
// even if a dispatch cooldown expires mid-run.
|
|
89
|
+
const seen = new Set();
|
|
90
|
+
while (true) {
|
|
91
|
+
const page = await store.due(100, seen);
|
|
92
|
+
if (!page.length)
|
|
93
|
+
break;
|
|
94
|
+
for (const due of page) {
|
|
95
|
+
seen.add(due.oid);
|
|
96
|
+
if (!await store.dispatchClaim(due.oid))
|
|
97
|
+
continue;
|
|
98
|
+
try {
|
|
99
|
+
const fresh = await RecordsService.getMeta(due.oid);
|
|
100
|
+
const freshConfig = fresh && (0, config_1.resolveFigsharePublishingConfig)(fresh, { requireToken: false });
|
|
101
|
+
// Paused or misconfigured brands back off: the worker would return without consuming the due work.
|
|
102
|
+
if (fresh && (!freshConfig?.processing?.enabled || freshConfig.processingError)) {
|
|
103
|
+
await store.dispatchClaim(due.oid, PAUSED_DISPATCH_BACKOFF_MS, true);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
await AgendaQueueService.now('Figshare-SyncRecord', { oid: due.oid, brandId: due.brandId });
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
sails.log.error('Figshare delivery failed; durable work remains due', error);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function runFigshareWorker(service, job, store = getSyncStore()) {
|
|
115
|
+
const { oid, brandId } = job.attrs?.data ?? {};
|
|
116
|
+
if (!oid || !brandId)
|
|
117
|
+
return;
|
|
118
|
+
let record = await RecordsService.getMeta(oid);
|
|
119
|
+
if (!record) {
|
|
120
|
+
const existing = await store.get(oid);
|
|
121
|
+
if (existing)
|
|
122
|
+
await store.change(oid, s => { s.status = 'cancelled'; for (const work of Object.values(s.work))
|
|
123
|
+
work.dueAt = null; });
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (record.metaMetadata.brandId !== brandId)
|
|
127
|
+
throw new execution_1.FigshareRepairRequired('Queue brand does not match the fresh record');
|
|
128
|
+
const config = (0, config_1.resolveFigsharePublishingConfig)(record, { requireToken: false });
|
|
129
|
+
if (!config?.processing?.enabled || config.processingError)
|
|
130
|
+
return;
|
|
131
|
+
const settings = { ...FigsharePublishing_1.DEFAULT_FIGSHARE_PROCESSING, ...config.processing };
|
|
132
|
+
if (settings.heartbeatMs <= 0 || settings.leaseMs < settings.heartbeatMs * 3)
|
|
133
|
+
throw new Error('Figshare lease must cover at least three heartbeat intervals');
|
|
134
|
+
await store.ensureIndexes();
|
|
135
|
+
await importRecordIntent(store, record);
|
|
136
|
+
const owner = (0, node_crypto_1.randomUUID)();
|
|
137
|
+
const claimed = await store.claim(oid, brandId, owner, settings.leaseMs);
|
|
138
|
+
if (!claimed)
|
|
139
|
+
return;
|
|
140
|
+
let state = claimed;
|
|
141
|
+
const startedWork = lodash_1.default.cloneDeep(state.work);
|
|
142
|
+
const due = (k) => startedWork[k].dueAt != null && startedWork[k].dueAt <= Date.now();
|
|
143
|
+
// Attribute errors in the initial account/article reads to the work being polled.
|
|
144
|
+
let kind = due('sync') ? 'sync' : due('cleanup') ? 'cleanup' : 'observe';
|
|
145
|
+
const abort = new AbortController();
|
|
146
|
+
let heartbeatBusy = false;
|
|
147
|
+
const heartbeat = setInterval(() => {
|
|
148
|
+
if (heartbeatBusy)
|
|
149
|
+
return;
|
|
150
|
+
heartbeatBusy = true;
|
|
151
|
+
void (async () => {
|
|
152
|
+
await store.renew(oid, owner, settings.leaseMs);
|
|
153
|
+
if (job.touch)
|
|
154
|
+
await job.touch();
|
|
155
|
+
})().catch(() => abort.abort()).finally(() => { heartbeatBusy = false; });
|
|
156
|
+
}, settings.heartbeatMs);
|
|
157
|
+
heartbeat.unref();
|
|
158
|
+
const checkpoint = async (fn) => {
|
|
159
|
+
if (abort.signal.aborted)
|
|
160
|
+
throw new sync_store_1.FigshareLeaseLost();
|
|
161
|
+
state = await store.change(oid, fn, owner);
|
|
162
|
+
return state;
|
|
163
|
+
};
|
|
164
|
+
const finish = async (k) => checkpoint(s => {
|
|
165
|
+
const w = s.work[k];
|
|
166
|
+
w.processed = Math.max(w.processed, startedWork[k].requested);
|
|
167
|
+
if (w.requested === startedWork[k].requested)
|
|
168
|
+
w.dueAt = null;
|
|
169
|
+
});
|
|
170
|
+
const wait = async (reason) => checkpoint(s => {
|
|
171
|
+
s.status = 'waiting';
|
|
172
|
+
s.waitingReason = reason;
|
|
173
|
+
// Readiness is an expected wait, not a failed attempt. Clear recovered polling
|
|
174
|
+
// errors, while retaining a genuine terminal failure of unfinished source sync.
|
|
175
|
+
const unresolvedSyncFailure = s.error?.terminal && (!s.error.kind || s.error.kind === 'sync')
|
|
176
|
+
&& s.work.sync.requested > s.work.sync.processed;
|
|
177
|
+
if (!unresolvedSyncFailure && (!s.error?.kind || s.error.kind === kind))
|
|
178
|
+
delete s.error;
|
|
179
|
+
if (s.work[kind].requested === startedWork[kind].requested)
|
|
180
|
+
s.work[kind].dueAt = Date.now() + settings.observationMs;
|
|
181
|
+
});
|
|
182
|
+
const rawClient = config.runtime.mode === 'fixture' ? (0, http_1.makeFixtureClient)(config) : (0, http_1.makeLiveClient)(config, (0, context_1.createRunContext)(record, config, owner, 'worker'));
|
|
183
|
+
let article;
|
|
184
|
+
let metadataChanged = false;
|
|
185
|
+
const sourceGeneration = record.figshareSyncIntent?.generation ?? 0;
|
|
186
|
+
const eligible = async (policies, current) => {
|
|
187
|
+
const brand = BrandingService.getBrandById(brandId);
|
|
188
|
+
if (!brand)
|
|
189
|
+
return false;
|
|
190
|
+
const recordType = await RecordTypesService.get(brand, current.metaMetadata.type).toPromise();
|
|
191
|
+
return (0, source_intent_1.currentExecutionEligible)(recordType, policies, oid, current);
|
|
192
|
+
};
|
|
193
|
+
const assertCurrent = async () => {
|
|
194
|
+
await store.assertOwner(oid, owner);
|
|
195
|
+
if (abort.signal.aborted)
|
|
196
|
+
throw new sync_store_1.FigshareLeaseLost();
|
|
197
|
+
const fresh = await RecordsService.getMeta(oid);
|
|
198
|
+
if (!fresh || fresh.metaMetadata.brandId !== brandId)
|
|
199
|
+
throw new execution_1.FigshareWaiting('record_changed');
|
|
200
|
+
const latestConfig = (0, config_1.resolveFigsharePublishingConfig)(fresh, { requireToken: false });
|
|
201
|
+
if (!latestConfig?.processing?.enabled || latestConfig.processingError || (0, exports.contentHash)(latestConfig) !== (0, exports.contentHash)(config))
|
|
202
|
+
throw new execution_1.FigshareWaiting('configuration_changed');
|
|
203
|
+
if (fresh.figshareSyncIntent?.readiness === 'initialising' || (fresh.figshareSyncIntent?.generation ?? 0) !== sourceGeneration)
|
|
204
|
+
throw new execution_1.FigshareWaiting('newer_save');
|
|
205
|
+
if (kind === 'sync' && !await eligible(startedWork.sync.policies, fresh))
|
|
206
|
+
throw new execution_1.FigshareWaiting('eligibility');
|
|
207
|
+
return fresh;
|
|
208
|
+
};
|
|
209
|
+
const execution = {
|
|
210
|
+
signal: abort.signal,
|
|
211
|
+
async guard(operation) {
|
|
212
|
+
await assertCurrent();
|
|
213
|
+
if (kind !== 'sync' && operation !== 'read')
|
|
214
|
+
throw new Error('Observation or cleanup intent cannot authorise remote mutation');
|
|
215
|
+
if (state.binding?.articleId) {
|
|
216
|
+
const current = await rawClient.getArticle(state.binding.articleId);
|
|
217
|
+
if ((0, runtime_1.isCurationLocked)(config, current))
|
|
218
|
+
throw new execution_1.FigshareWaiting('curation');
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
async metadata(id, payload, send) {
|
|
222
|
+
const current = await rawClient.getArticle(id);
|
|
223
|
+
const hash = (0, exports.contentHash)(payload);
|
|
224
|
+
// Compare only managed fields, preserving remote fields not mapped by ReDBox.
|
|
225
|
+
const remoteFields = {};
|
|
226
|
+
for (const key of Object.keys(payload)) {
|
|
227
|
+
if (key === 'custom_fields') {
|
|
228
|
+
const remote = Array.isArray(current.custom_fields)
|
|
229
|
+
? Object.fromEntries(current.custom_fields.map(f => [f.name, f.value]))
|
|
230
|
+
: current.custom_fields ?? {};
|
|
231
|
+
remoteFields[key] = Object.fromEntries(Object.keys(payload.custom_fields ?? {}).map(k => [k, remote[k]]));
|
|
232
|
+
}
|
|
233
|
+
else if (key === 'defined_type' && typeof payload[key] === 'string')
|
|
234
|
+
remoteFields[key] = current.defined_type_name ?? current[key];
|
|
235
|
+
else if (key === 'categories' && Array.isArray(current[key]))
|
|
236
|
+
remoteFields[key] = current[key].map(value => typeof value === 'object' && value ? value.id : value);
|
|
237
|
+
else if (key === 'authors' && Array.isArray(current[key]))
|
|
238
|
+
remoteFields[key] = current[key].map(value => typeof value === 'object' && value ? { id: value.id } : value);
|
|
239
|
+
else
|
|
240
|
+
remoteFields[key] = current[key];
|
|
241
|
+
}
|
|
242
|
+
if ((0, exports.contentHash)(remoteFields) === hash) {
|
|
243
|
+
await checkpoint(s => { s.checkpoints.metadata = hash; });
|
|
244
|
+
return current;
|
|
245
|
+
}
|
|
246
|
+
metadataChanged = true;
|
|
247
|
+
const outgoing = { ...payload };
|
|
248
|
+
if (payload.custom_fields) {
|
|
249
|
+
const remote = Array.isArray(current.custom_fields)
|
|
250
|
+
? Object.fromEntries(current.custom_fields.map(f => [f.name, f.value]))
|
|
251
|
+
: current.custom_fields ?? {};
|
|
252
|
+
outgoing.custom_fields = { ...remote, ...payload.custom_fields };
|
|
253
|
+
}
|
|
254
|
+
const result = await send(outgoing);
|
|
255
|
+
await checkpoint(s => { s.checkpoints.metadata = hash; });
|
|
256
|
+
return { ...result, id };
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
const recovery = (fn) => execution_1.figshareExecution.run({ ...execution, binding: state.create?.binding ?? state.binding, recovery: true }, fn);
|
|
260
|
+
try {
|
|
261
|
+
await execution_1.figshareExecution.run(execution, async () => {
|
|
262
|
+
if (config.runtime.mode !== 'fixture' && !config.connection.token)
|
|
263
|
+
throw new execution_1.FigshareRepairRequired('Configure a Figshare API token before enabling processing');
|
|
264
|
+
const brand = BrandingService.getBrandById(brandId);
|
|
265
|
+
if (!brand)
|
|
266
|
+
throw new execution_1.FigshareRepairRequired('Record brand cannot be resolved');
|
|
267
|
+
const username = settings.serviceUsername || config.workflow.transitionJob.username;
|
|
268
|
+
const userType = settings.serviceUserType || config.workflow.transitionJob.userType;
|
|
269
|
+
if (!username || !userType)
|
|
270
|
+
throw new execution_1.FigshareRepairRequired('Configure a per-brand Figshare local service identity');
|
|
271
|
+
const user = await UsersService.getUserWithUsername(username).toPromise();
|
|
272
|
+
if (!user || user.type !== userType || user.disabled === true)
|
|
273
|
+
throw new execution_1.FigshareRepairRequired('Configured Figshare local service user is unavailable');
|
|
274
|
+
if (!await RecordsService.hasEditAccess(brand, user, (user.roles ?? []).map(role => ({ ...role })), record))
|
|
275
|
+
throw new execution_1.FigshareRepairRequired('Figshare service user does not have record edit access');
|
|
276
|
+
if (!rawClient.getAccount)
|
|
277
|
+
throw new execution_1.FigshareRepairRequired('Figshare client cannot verify authenticated account');
|
|
278
|
+
const account = await rawClient.getAccount();
|
|
279
|
+
const accountId = String(account.id);
|
|
280
|
+
if (!/^\d+$/.test(accountId))
|
|
281
|
+
throw new execution_1.FigshareRepairRequired('Authenticated account response has no valid account ID');
|
|
282
|
+
if (state.binding && (state.binding.namespace !== (0, identity_1.apiNamespace)(config) || state.binding.accountId !== accountId))
|
|
283
|
+
throw new execution_1.FigshareRepairRequired('Figshare API environment or token account changed');
|
|
284
|
+
execution.binding = state.binding;
|
|
285
|
+
if (state.binding?.articleId) {
|
|
286
|
+
article = await rawClient.getArticle(state.binding.articleId);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
const legacyId = String((0, types_1.getRecordField)(record, config.record.articleIdPath) ?? '');
|
|
290
|
+
if (legacyId) {
|
|
291
|
+
const lookup = RecordsService.getFigshareIntentStorage().findFigshareArticleRecords;
|
|
292
|
+
if (!lookup)
|
|
293
|
+
throw new execution_1.FigshareRepairRequired('Storage adapter cannot verify legacy binding uniqueness');
|
|
294
|
+
const matching = await lookup.call(RecordsService.getFigshareIntentStorage(), config.record.articleIdPath, legacyId);
|
|
295
|
+
if (matching.some(other => other.redboxOid !== oid && (0, config_1.resolveFigsharePublishingConfig)(other)?.connection.baseUrl.replace(/\/+$/, '') === (0, identity_1.apiNamespace)(config)))
|
|
296
|
+
throw new execution_1.FigshareRepairRequired('Duplicate legacy article bindings require repair before mutation');
|
|
297
|
+
article = await rawClient.getArticle(legacyId);
|
|
298
|
+
const binding = { namespace: (0, identity_1.apiNamespace)(config), accountId, ownerId: String(article.account_id ?? accountId), articleId: String(article.id) };
|
|
299
|
+
await checkpoint(s => { s.binding = binding; s.namespace = binding.namespace; s.articleId = binding.articleId; });
|
|
300
|
+
execution.binding = binding;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
const project = async () => {
|
|
304
|
+
if (!state.binding?.articleId)
|
|
305
|
+
return;
|
|
306
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
307
|
+
const fresh = await RecordsService.getMeta(oid);
|
|
308
|
+
const fields = {
|
|
309
|
+
[config.record.articleIdPath]: state.binding.articleId,
|
|
310
|
+
[config.writeBack.articleId]: state.binding.articleId,
|
|
311
|
+
[config.record.statusPath]: state.status,
|
|
312
|
+
[config.record.errorPath]: state.error?.message ?? ''
|
|
313
|
+
};
|
|
314
|
+
for (const path of config.writeBack.articleUrls)
|
|
315
|
+
fields[path] = article?.url_public_html ?? article?.url_private_html ?? `${config.connection.frontEndUrl}/articles/${state.binding.articleId}`;
|
|
316
|
+
for (const binding of config.writeBack.extraFields) {
|
|
317
|
+
const source = binding.from === 'article' ? article : binding.from === 'publishResult' ? state.publish : undefined;
|
|
318
|
+
const value = lodash_1.default.get(source, binding.sourcePath);
|
|
319
|
+
if (value !== undefined)
|
|
320
|
+
fields[binding.targetPath] = value;
|
|
321
|
+
}
|
|
322
|
+
await store.assertOwner(oid, owner);
|
|
323
|
+
if ((await RecordsService.setRecordFields(oid, fields, fresh.recordVersion ?? 0, projectionPaths(config), user)).updated)
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
throw new execution_1.FigshareWaiting('record_changed');
|
|
327
|
+
};
|
|
328
|
+
if (due('sync')) {
|
|
329
|
+
kind = 'sync';
|
|
330
|
+
await assertCurrent();
|
|
331
|
+
if (!state.audit || state.auditClosed) {
|
|
332
|
+
const audit = (0, audit_1.startFigshareAudit)(oid, IntegrationAuditModel_1.IntegrationAuditAction.syncRecordWithFigshare, (0, context_1.createRunContext)(record, config, owner, 'worker'), {
|
|
333
|
+
sourceGeneration, requestedBy: startedWork.sync.requestedBy, requests: startedWork.sync.requested - startedWork.sync.processed
|
|
334
|
+
});
|
|
335
|
+
await checkpoint(s => { s.audit = audit; s.auditClosed = false; });
|
|
336
|
+
}
|
|
337
|
+
if (!state.binding?.articleId) {
|
|
338
|
+
if (state.create) {
|
|
339
|
+
const recovered = await recovery(() => (0, identity_1.recoverCreate)(rawClient, state.create));
|
|
340
|
+
if (!recovered)
|
|
341
|
+
throw new execution_1.FigshareRepairRequired('Uncertain create has no unique visible token match; do not create again. Reconcile, then run abandon-create if no article exists');
|
|
342
|
+
const binding = { ...state.create.binding, articleId: String(recovered.id) };
|
|
343
|
+
await checkpoint(s => { s.binding = binding; s.namespace = binding.namespace; s.articleId = binding.articleId; s.create.verifiedId = binding.articleId; });
|
|
344
|
+
execution.binding = binding;
|
|
345
|
+
article = recovered;
|
|
346
|
+
if (state.create.error && startedWork.sync.requested <= (state.createRequest ?? startedWork.sync.requested))
|
|
347
|
+
throw new Error(state.create.error);
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
if ((state.waitingReason === 'uncertain_legacy_create' || (0, types_1.getRecordField)(record, config.record.syncStatePath)) && !state.create)
|
|
351
|
+
throw new execution_1.FigshareRepairRequired('Legacy synchronisation evidence without an article ID requires migration review');
|
|
352
|
+
const ownerId = config.impersonation?.operations.create === 'owner' ? await (0, identity_1.resolveCreationOwner)(rawClient, config, record, accountId) : accountId;
|
|
353
|
+
const binding = { namespace: (0, identity_1.apiNamespace)(config), accountId, ownerId };
|
|
354
|
+
const operation = (0, identity_1.newCreateOperation)(binding);
|
|
355
|
+
await checkpoint(s => { s.binding = binding; s.create = operation; s.createGeneration = sourceGeneration; s.createRequest = startedWork.sync.requested; });
|
|
356
|
+
execution.binding = binding;
|
|
357
|
+
try {
|
|
358
|
+
const response = await (0, execution_1.workerClient)(rawClient).createArticle({ title: (0, identity_1.provisionalTitle)(operation.token) });
|
|
359
|
+
if (response.id == null)
|
|
360
|
+
throw new Error('Create response did not contain an article identity');
|
|
361
|
+
article = await recovery(() => rawClient.getArticle(String(response.id)));
|
|
362
|
+
if (article.title !== (0, identity_1.provisionalTitle)(operation.token))
|
|
363
|
+
throw new execution_1.FigshareRepairRequired('Create response did not verify the operation token');
|
|
364
|
+
const id = String(article.id);
|
|
365
|
+
await checkpoint(s => { s.binding.articleId = id; s.namespace = binding.namespace; s.articleId = id; s.create.verifiedId = id; s.create.outcome = 'confirmed'; });
|
|
366
|
+
execution.binding = state.binding;
|
|
367
|
+
}
|
|
368
|
+
catch (error) {
|
|
369
|
+
// Only the transport guard raises a wait here, and it refuses before sending, so nothing was created.
|
|
370
|
+
if (error instanceof execution_1.FigshareWaiting) {
|
|
371
|
+
await checkpoint(s => { delete s.create; delete s.createGeneration; delete s.createRequest; delete s.binding; });
|
|
372
|
+
throw error;
|
|
373
|
+
}
|
|
374
|
+
await checkpoint(s => { s.create.outcome = error instanceof http_1.FigshareHttpError && error.statusCode ? 'failed' : 'uncertain'; s.create.error = error instanceof Error ? error.message : String(error); });
|
|
375
|
+
const recovered = await recovery(() => (0, identity_1.recoverCreate)(rawClient, state.create));
|
|
376
|
+
if (recovered) {
|
|
377
|
+
const id = String(recovered.id);
|
|
378
|
+
await checkpoint(s => { s.binding.articleId = id; s.namespace = binding.namespace; s.articleId = id; s.create.verifiedId = id; });
|
|
379
|
+
article = recovered;
|
|
380
|
+
await project();
|
|
381
|
+
}
|
|
382
|
+
throw error;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
await project(); // durable identity precedes replacement of the provisional title
|
|
386
|
+
}
|
|
387
|
+
const id = state.binding.articleId;
|
|
388
|
+
article = await rawClient.getArticle(id);
|
|
389
|
+
if (state.publish && state.publish.outcome !== 'observed') {
|
|
390
|
+
if ((0, identity_1.observedPublished)(article) && Number(article.version ?? 0) > state.publish.previousVersion) {
|
|
391
|
+
await checkpoint(s => { s.publish.outcome = 'observed'; });
|
|
392
|
+
}
|
|
393
|
+
else if ((0, runtime_1.isCurationLocked)(config, article)) {
|
|
394
|
+
throw new execution_1.FigshareWaiting('curation');
|
|
395
|
+
}
|
|
396
|
+
else if (startedWork.sync.sourceGeneration > state.publish.generation) {
|
|
397
|
+
// The read confirms the earlier request did not publish. A newer eligible source save supersedes it,
|
|
398
|
+
// e.g. after a curator returns the article for changes, so its content syncs and publication is requested again.
|
|
399
|
+
await checkpoint(s => { delete s.publish; });
|
|
400
|
+
}
|
|
401
|
+
else if (state.publish.outcome === 'submitted' || state.publish.outcome === 'uncertain') {
|
|
402
|
+
throw new execution_1.FigshareRepairRequired('Publication outcome is uncertain; confirm the article in Figshare, then run reset-publish');
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
throw new execution_1.FigshareWaiting('publication_confirmation');
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
if ((0, runtime_1.isCurationLocked)(config, article))
|
|
409
|
+
throw new execution_1.FigshareWaiting('curation');
|
|
410
|
+
const pendingFiles = (await (0, runtime_1.listArticleFiles)(rawClient, id)).filter(f => String(f.status).toLowerCase() === 'created');
|
|
411
|
+
if (pendingFiles.length) {
|
|
412
|
+
if (!pendingFiles.every(file => state.receipts.some(r => r.fileId === String(file.id) && r.resumeApproved))) {
|
|
413
|
+
// An interrupted managed upload needs an operator decision; any other pending file belongs to another uploader.
|
|
414
|
+
if (state.receipts.some(r => ['initialising', 'uploading'].includes(r.state) && !r.resumeApproved)) {
|
|
415
|
+
throw new execution_1.FigshareRepairRequired('Interrupted Figshare upload requires bind-file or resume-upload');
|
|
416
|
+
}
|
|
417
|
+
throw new execution_1.FigshareWaiting('uploads');
|
|
418
|
+
}
|
|
419
|
+
await (0, managed_assets_1.mirrorManagedAssets)(service.makeClient(config, record, owner, 'resume-upload'), config, record, id, state, checkpoint);
|
|
420
|
+
}
|
|
421
|
+
(0, types_1.setRecordField)(record, config.record.articleIdPath, id);
|
|
422
|
+
const previousAssets = state.checkpoints.assets;
|
|
423
|
+
await service.syncMetadata(record, { action: 'update', articleId: id, sameJob: true, syncState: { status: 'syncing', correlationId: owner } });
|
|
424
|
+
const client = service.makeClient(config, record, owner, 'worker');
|
|
425
|
+
await (0, managed_assets_1.mirrorManagedAssets)(client, config, record, id, state, checkpoint);
|
|
426
|
+
const assetsChanged = previousAssets !== state.checkpoints.assets;
|
|
427
|
+
await (0, embargo_1.syncEmbargoPhase)(client, config, record, id);
|
|
428
|
+
await checkpoint(s => { s.checkpoints.embargo = (0, exports.contentHash)(config.embargo.mode === 'none' ? null : record.metadata); });
|
|
429
|
+
await assertCurrent();
|
|
430
|
+
article = await rawClient.getArticle(id);
|
|
431
|
+
const publishHash = (0, exports.contentHash)(state.checkpoints);
|
|
432
|
+
const needsPublish = !(0, identity_1.observedPublished)(article) || (metadataChanged && config.article.republishOnMetadataChange) || (assetsChanged && config.article.republishOnAssetChange);
|
|
433
|
+
if (needsPublish && state.publish?.hash !== publishHash && config.article.publishMode !== 'manual') {
|
|
434
|
+
await checkpoint(s => { s.publish = { generation: sourceGeneration, hash: publishHash, previousVersion: Number(article.version ?? 0), outcome: 'submitted', submittedAt: new Date().toISOString() }; });
|
|
435
|
+
try {
|
|
436
|
+
await client.publishArticle(id);
|
|
437
|
+
await checkpoint(s => { s.publish.outcome = 'accepted'; });
|
|
438
|
+
}
|
|
439
|
+
catch (error) {
|
|
440
|
+
const body = error instanceof http_1.FigshareHttpError ? error.responseBody : undefined;
|
|
441
|
+
const rejected = error instanceof http_1.FigshareHttpError && error.statusCode === 400
|
|
442
|
+
&& body?.code === 'BadRequest' && typeof body.message === 'string'
|
|
443
|
+
&& body.message.startsWith('Missing mandatory value:');
|
|
444
|
+
await checkpoint(s => { s.publish.outcome = rejected ? 'rejected' : 'uncertain'; });
|
|
445
|
+
throw error;
|
|
446
|
+
}
|
|
447
|
+
// Immediate publication is visible now; a curated article still reads private and waits for review.
|
|
448
|
+
article = await rawClient.getArticle(id);
|
|
449
|
+
}
|
|
450
|
+
await finish('sync');
|
|
451
|
+
await checkpoint(s => {
|
|
452
|
+
s.status = (0, identity_1.observedPublished)(article) ? 'synced' : 'waiting';
|
|
453
|
+
delete s.error;
|
|
454
|
+
s.waitingReason = (0, identity_1.observedPublished)(article) ? undefined : config.article.publishMode === 'manual' ? 'manual_publication' : 'review';
|
|
455
|
+
s.work.observe.requested++;
|
|
456
|
+
s.work.observe.dueAt = Date.now() + settings.observationMs;
|
|
457
|
+
if (s.receipts.some(r => r.kind === 'hosted' && r.desired)) {
|
|
458
|
+
s.work.cleanup.requested++;
|
|
459
|
+
s.work.cleanup.dueAt = s.work.cleanup.dueAt ?? Date.now() + settings.cleanupMs;
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
if (!state.auditClosed) {
|
|
463
|
+
(0, audit_1.completeFigshareAudit)(state.audit, { message: 'Figshare content synchronised; publication is observed separately.', responseSummary: { articleId: id, sourceGeneration, requests: startedWork.sync.requested } });
|
|
464
|
+
await checkpoint(s => { s.auditClosed = true; });
|
|
465
|
+
}
|
|
466
|
+
await project();
|
|
467
|
+
}
|
|
468
|
+
if (!state.binding?.articleId) {
|
|
469
|
+
if (due('cleanup'))
|
|
470
|
+
await finish('cleanup');
|
|
471
|
+
if (due('observe'))
|
|
472
|
+
await finish('observe');
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
const id = state.binding.articleId;
|
|
476
|
+
article = await rawClient.getArticle(id);
|
|
477
|
+
await checkpoint(s => { s.publication = (0, identity_1.observedPublished)(article) ? 'published' : s.publish ? 'pending' : 'private'; s.embargoed = article.is_embargoed === true; s.observedAt = new Date().toISOString(); });
|
|
478
|
+
if (due('cleanup')) {
|
|
479
|
+
kind = 'cleanup';
|
|
480
|
+
if (startedWork.cleanup.policies.length && !await eligible(startedWork.cleanup.policies, record))
|
|
481
|
+
throw new execution_1.FigshareWaiting('cleanup_eligibility');
|
|
482
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
483
|
+
record = await RecordsService.getMeta(oid);
|
|
484
|
+
const entries = await (0, managed_assets_1.cleanupProjection)(rawClient, config, record, article, state);
|
|
485
|
+
await store.assertOwner(oid, owner);
|
|
486
|
+
const fields = { [config.record.dataLocationsPath]: entries };
|
|
487
|
+
if (config.record.allFilesUploadedPath)
|
|
488
|
+
fields[config.record.allFilesUploadedPath] = 'yes';
|
|
489
|
+
if ((await RecordsService.setRecordFields(oid, fields, record.recordVersion ?? 0, projectionPaths(config), user)).updated) {
|
|
490
|
+
await finish('cleanup');
|
|
491
|
+
break;
|
|
492
|
+
}
|
|
493
|
+
if (attempt === 2)
|
|
494
|
+
throw new execution_1.FigshareWaiting('record_changed');
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
if (due('observe')) {
|
|
498
|
+
kind = 'observe';
|
|
499
|
+
if (!(0, identity_1.observedPublished)(article))
|
|
500
|
+
throw new execution_1.FigshareWaiting(config.article.publishMode === 'manual' ? 'manual_publication' : 'review');
|
|
501
|
+
if (state.publish && state.publish.outcome !== 'observed') {
|
|
502
|
+
if (Number(article.version ?? 0) <= state.publish.previousVersion)
|
|
503
|
+
throw new execution_1.FigshareWaiting('publication_confirmation');
|
|
504
|
+
await checkpoint(s => { s.publish.outcome = 'observed'; });
|
|
505
|
+
}
|
|
506
|
+
const publicationKey = `${id}:${article.version ?? article.published_date}`;
|
|
507
|
+
if (state.publicationAuditKey !== publicationKey) {
|
|
508
|
+
// Persist the marker first: recurring observation must not produce another event.
|
|
509
|
+
await checkpoint(s => { s.publicationAuditKey = publicationKey; });
|
|
510
|
+
const publicationAudit = (0, audit_1.startFigshareAudit)(oid, IntegrationAuditModel_1.IntegrationAuditAction.publishAfterUploadFilesJob, (0, context_1.createRunContext)(record, config, owner, 'observation'), { articleId: id });
|
|
511
|
+
(0, audit_1.completeFigshareAudit)(publicationAudit, { message: 'Figshare publication confirmed.', responseSummary: { articleId: id, version: article.version, publication: 'published' } });
|
|
512
|
+
}
|
|
513
|
+
record = await RecordsService.getMeta(oid);
|
|
514
|
+
// An abandoned intent carries no work; only an unimported live save is newer content.
|
|
515
|
+
const newerSource = record.figshareSyncIntent?.pending && record.figshareSyncIntent.readiness !== 'abandoned';
|
|
516
|
+
if (newerSource || state.work.sync.requested > state.work.sync.processed)
|
|
517
|
+
throw new execution_1.FigshareWaiting('newer_sync');
|
|
518
|
+
if (state.receipts.some(r => !['available', 'removed'].includes(r.state)))
|
|
519
|
+
throw new execution_1.FigshareWaiting('uploads');
|
|
520
|
+
const transition = config.workflow.transitionJob;
|
|
521
|
+
if (transition.enabled && record.workflow.stage !== transition.targetStep && article[transition.figshareTargetFieldKey] === transition.figshareTargetFieldValue) {
|
|
522
|
+
// Current business eligibility is still required even though the source actor is not used again.
|
|
523
|
+
if (!await eligible(state.work.sync.policies, record))
|
|
524
|
+
throw new execution_1.FigshareWaiting('workflow_eligibility');
|
|
525
|
+
const recordType = await RecordTypesService.get(brand, record.metaMetadata.type).toPromise();
|
|
526
|
+
if (!recordType)
|
|
527
|
+
throw new execution_1.FigshareRepairRequired("Workflow record type is missing");
|
|
528
|
+
const step = await WorkflowStepsService.get(recordType, transition.targetStep).toPromise();
|
|
529
|
+
await store.assertOwner(oid, owner);
|
|
530
|
+
const result = await RecordsService.updateMeta(brand, oid, record, user, true, true, step, record.metadata, { expectedVersion: record.recordVersion ?? 0, maintenance: true });
|
|
531
|
+
if (!result.isSuccessful())
|
|
532
|
+
throw new execution_1.FigshareRepairRequired('Workflow hooks failed; inspect partial transition before resuming');
|
|
533
|
+
}
|
|
534
|
+
await finish('observe');
|
|
535
|
+
await checkpoint(s => { s.status = 'synced'; delete s.waitingReason; });
|
|
536
|
+
await project();
|
|
537
|
+
}
|
|
538
|
+
if (state.status === 'running')
|
|
539
|
+
await checkpoint(s => { s.status = s.nextActionAt == null ? 'synced' : 'waiting'; });
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
catch (error) {
|
|
543
|
+
if (error instanceof sync_store_1.FigshareLeaseLost || abort.signal.aborted)
|
|
544
|
+
return;
|
|
545
|
+
if (error instanceof execution_1.FigshareWaiting || error instanceof RecordWriteOptions_1.RecordWriteConflict) {
|
|
546
|
+
await wait(error instanceof execution_1.FigshareWaiting ? error.reason : 'record_changed');
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
550
|
+
const category = error instanceof execution_1.FigshareRepairRequired ? 'repair' : error instanceof http_1.FigshareHttpError ? `http:${error.statusCode ?? 'transport'}` : 'configuration_or_operation';
|
|
551
|
+
await checkpoint(s => {
|
|
552
|
+
const previous = s.error?.category === category && (!s.error.kind || s.error.kind === kind) ? s.error : undefined;
|
|
553
|
+
const count = (previous?.count ?? 0) + 1;
|
|
554
|
+
const terminal = category === 'repair' || (error instanceof http_1.FigshareHttpError && error.statusCode != null && error.statusCode >= 400 && error.statusCode < 500 && ![408, 429].includes(error.statusCode)) || count >= settings.maxAttempts;
|
|
555
|
+
s.error = { kind, category, message, count, firstAt: previous?.firstAt ?? new Date().toISOString(), lastAt: new Date().toISOString(), terminal };
|
|
556
|
+
s.status = terminal ? category === 'repair' ? 'repair_required' : 'failed' : 'retrying';
|
|
557
|
+
if (s.work[kind].requested === startedWork[kind].requested)
|
|
558
|
+
s.work[kind].dueAt = terminal ? null : Date.now() + settings.retryBaseMs * 2 ** (count - 1);
|
|
559
|
+
});
|
|
560
|
+
if (state.error?.terminal && !state.auditClosed && state.audit) {
|
|
561
|
+
(0, audit_1.failFigshareAudit)(state.audit, new Error(message), { message, responseSummary: { articleId: state.binding?.articleId, attempts: state.error.count, category } });
|
|
562
|
+
await checkpoint(s => { s.auditClosed = true; });
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
finally {
|
|
567
|
+
clearInterval(heartbeat);
|
|
568
|
+
abort.abort();
|
|
569
|
+
await store.release(oid, owner);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2ZpZ3NoYXJlLXYyL3dvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUE4QkEsb0NBR0M7QUFDRCwwQ0FJQztBQUdELGdEQU9DO0FBT0QsNENBNkNDO0FBRUQsOENBaVhDO0FBdmRELG9EQUF1QjtBQUN2Qiw2Q0FBcUQ7QUFJckQsbUNBQXlEO0FBQ3pELDhFQUE0RztBQUM1RyxxQ0FBc0c7QUFDdEcsNkNBQW9FO0FBQ3BFLDJDQUErSDtBQUMvSCx5Q0FBd0k7QUFDeEksbURBQTJEO0FBQzNELGlDQUFtRztBQUNuRyx1Q0FBK0Q7QUFDL0QsdUNBQTZDO0FBQzdDLHFEQUEwRTtBQUMxRSxtQ0FBdUY7QUFDdkYsdUNBQTZDO0FBQzdDLHFGQUFtRjtBQUNuRixpRUFBK0Q7QUFNeEQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFjLEVBQVUsRUFBRTtJQUNwRCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQVUsRUFBVyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFDekcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEgsT0FBTyxJQUFBLHdCQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckYsQ0FBQyxDQUFDO0FBSlcsUUFBQSxXQUFXLGVBSXRCO0FBQ0YsU0FBZ0IsWUFBWTtJQUMxQixNQUFNLE9BQU8sR0FBTyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ3hELE9BQU8sSUFBSSw4QkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBQ0QsU0FBZ0IsZUFBZSxDQUFDLE1BQTRDO0lBQzFFLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhO1lBQzdILE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVztZQUNoSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5RixDQUFDO0FBRUQsa0dBQWtHO0FBQzNGLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxLQUF3QixFQUFFLE1BQW1CO0lBQ3BGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztJQUN6QyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLE9BQU87UUFBRSxPQUFPO0lBQzdELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQzFELElBQUksQ0FBQyxPQUFPLENBQUMseUJBQXlCO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQzlHLE1BQU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hGLE1BQU0sT0FBTyxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRCxNQUFNLDBCQUEwQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2pELHVHQUF1RztBQUN2RywyR0FBMkc7QUFDM0csTUFBTSxxQkFBcUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV0QyxLQUFLLFVBQVUsZ0JBQWdCO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQzFELElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCO1FBQUUsT0FBTztJQUM1QyxNQUFNLEtBQUssR0FBRyxZQUFZLEVBQUUsQ0FBQztJQUM3QixNQUFNLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM1QixJQUFJLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sU0FBUyxHQUFHLE1BQU0sT0FBTyxDQUFDLDJCQUEyQixDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDeEgsSUFBSSxTQUFTO1lBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxTQUFTLDhEQUE4RCxDQUFDLENBQUM7SUFDdEgsQ0FBQztJQUNELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNsQixPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLElBQUEsd0NBQStCLEVBQUMsTUFBTSxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ2hGLElBQUksTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZTtvQkFBRSxNQUFNLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN0RyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsTUFBTSxDQUFDLFNBQVMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUcsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRztZQUFFLE1BQU07UUFDN0IsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsdUdBQXVHO0lBQ3ZHLCtDQUErQztJQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU07UUFDeEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUztZQUNsRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEQsTUFBTSxXQUFXLEdBQUcsS0FBSyxJQUFJLElBQUEsd0NBQStCLEVBQUMsS0FBSyxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQzdGLG1HQUFtRztnQkFDbkcsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxJQUFJLFdBQVcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO29CQUNoRixNQUFNLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDckUsU0FBUztnQkFDWCxDQUFDO2dCQUNELE1BQU0sa0JBQWtCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzlGLENBQUM7WUFDRCxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLG9EQUFvRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQUMsQ0FBQztRQUNqRyxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFTSxLQUFLLFVBQVUsaUJBQWlCLENBQUMsT0FBOEIsRUFBRSxHQUFnQixFQUFFLEtBQUssR0FBRyxZQUFZLEVBQUU7SUFDOUcsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7SUFDL0MsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPO0lBQzdCLElBQUksTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsSUFBSSxRQUFRO1lBQUUsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNySSxPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEtBQUssT0FBTztRQUFFLE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQzdILE1BQU0sTUFBTSxHQUFHLElBQUEsd0NBQStCLEVBQUMsTUFBTSxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDaEYsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxJQUFJLE1BQU0sQ0FBQyxlQUFlO1FBQUUsT0FBTztJQUNuRSxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsZ0RBQTJCLEVBQUUsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDMUUsSUFBSSxRQUFRLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztJQUM5SixNQUFNLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM1QixNQUFNLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4QyxNQUFNLEtBQUssR0FBRyxJQUFBLHdCQUFVLEdBQUUsQ0FBQztJQUMzQixNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pFLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTztJQUNyQixJQUFJLEtBQUssR0FBc0IsT0FBTyxDQUFDO0lBQ3ZDLE1BQU0sV0FBVyxHQUFHLGdCQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQXFCLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzNHLGtGQUFrRjtJQUNsRixJQUFJLElBQUksR0FBdUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDN0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUNwQyxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDMUIsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNqQyxJQUFJLGFBQWE7WUFBRSxPQUFPO1FBQzFCLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDckIsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2YsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELElBQUksR0FBRyxDQUFDLEtBQUs7Z0JBQUUsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pCLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNsQixNQUFNLFVBQVUsR0FBRyxLQUFLLEVBQUUsRUFBa0MsRUFBRSxFQUFFO1FBQzlELElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQUUsTUFBTSxJQUFJLDhCQUFpQixFQUFFLENBQUM7UUFDeEQsS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQUMsT0FBTyxLQUFLLENBQUM7SUFDM0QsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUFFLENBQXFCLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM3RCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQy9ELENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3BELENBQUMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQUMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDL0MsK0VBQStFO1FBQy9FLGdGQUFnRjtRQUNoRixNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUM7ZUFDeEYsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNuRCxJQUFJLENBQUMscUJBQXFCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN4RixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTO1lBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDdkgsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUEsd0JBQWlCLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEscUJBQWMsRUFBQyxNQUFNLEVBQUUsSUFBQSwwQkFBZ0IsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzVKLElBQUksT0FBb0MsQ0FBQztJQUN6QyxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDNUIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxJQUFJLENBQUMsQ0FBQztJQUNwRSxNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQUUsUUFBdUQsRUFBRSxPQUFvQixFQUFFLEVBQUU7UUFDdkcsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3pCLE1BQU0sVUFBVSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlGLE9BQU8sSUFBQSx3Q0FBd0IsRUFBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUM7SUFDRixNQUFNLGFBQWEsR0FBRyxLQUFLLElBQUksRUFBRTtRQUMvQixNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQUUsTUFBTSxJQUFJLDhCQUFpQixFQUFFLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLEtBQUssT0FBTztZQUFFLE1BQU0sSUFBSSwyQkFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEcsTUFBTSxZQUFZLEdBQUcsSUFBQSx3Q0FBK0IsRUFBQyxLQUFLLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxPQUFPLElBQUksWUFBWSxDQUFDLGVBQWUsSUFBSSxJQUFBLG1CQUFXLEVBQUMsWUFBWSxDQUFDLEtBQUssSUFBQSxtQkFBVyxFQUFDLE1BQU0sQ0FBQztZQUFFLE1BQU0sSUFBSSwyQkFBZSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDaEwsSUFBSSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxLQUFLLGNBQWMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLElBQUksQ0FBQyxDQUFDLEtBQUssZ0JBQWdCO1lBQUUsTUFBTSxJQUFJLDJCQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEssSUFBSSxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUMsTUFBTSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDO1lBQUUsTUFBTSxJQUFJLDJCQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbkgsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7SUFDRixNQUFNLFNBQVMsR0FBc0I7UUFDbkMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQ3BCLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBNEI7WUFDdEMsTUFBTSxhQUFhLEVBQUUsQ0FBQztZQUN0QixJQUFJLElBQUksS0FBSyxNQUFNLElBQUksU0FBUyxLQUFLLE1BQU07Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1lBQy9ILElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3BFLElBQUksSUFBQSwwQkFBZ0IsRUFBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO29CQUFFLE1BQU0sSUFBSSwyQkFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9FLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUk7WUFDOUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sSUFBSSxHQUFHLElBQUEsbUJBQVcsRUFBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyw4RUFBOEU7WUFDOUUsTUFBTSxZQUFZLEdBQTRCLEVBQUUsQ0FBQztZQUNqRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxHQUFHLEtBQUssZUFBZSxFQUFFLENBQUM7b0JBQzVCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQzt3QkFDakQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUUsT0FBTyxDQUFDLGFBQXlELENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNwSCxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQXdDLElBQUksRUFBRSxDQUFDO29CQUMzRCxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1RyxDQUFDO3FCQUFNLElBQUksR0FBRyxLQUFLLGNBQWMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRO29CQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNoSSxJQUFJLEdBQUcsS0FBSyxZQUFZLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDOUosSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBQ25LLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUNELElBQUksSUFBQSxtQkFBVyxFQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUFDLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsT0FBTyxPQUFPLENBQUM7WUFBQyxDQUFDO1lBQ3RILGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDdkIsTUFBTSxRQUFRLEdBQTJCLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztZQUN4RCxJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO29CQUNqRCxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBRSxPQUFPLENBQUMsYUFBeUQsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ3BILENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBd0MsSUFBSSxFQUFFLENBQUM7Z0JBQzNELFFBQVEsQ0FBQyxhQUFhLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuRSxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEMsTUFBTSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRCxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDM0IsQ0FBQztLQUNGLENBQUM7SUFDRixNQUFNLFFBQVEsR0FBRyxDQUFJLEVBQW9CLEVBQUUsRUFBRSxDQUFDLDZCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzSixJQUFJLENBQUM7UUFDSCxNQUFNLDZCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEQsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUs7Z0JBQUUsTUFBTSxJQUFJLGtDQUFzQixDQUFDLDJEQUEyRCxDQUFDLENBQUM7WUFDakssTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsS0FBSztnQkFBRSxNQUFNLElBQUksa0NBQXNCLENBQUMsaUNBQWlDLENBQUMsQ0FBQztZQUNoRixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsZUFBZSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztZQUNwRixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsZUFBZSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztZQUNwRixJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsUUFBUTtnQkFBRSxNQUFNLElBQUksa0NBQXNCLENBQUMsdURBQXVELENBQUMsQ0FBQztZQUN0SCxNQUFNLElBQUksR0FBRyxNQUFNLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxRSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSTtnQkFBRSxNQUFNLElBQUksa0NBQXNCLENBQUMsdURBQXVELENBQUMsQ0FBQztZQUN6SixJQUFJLENBQUMsTUFBTSxjQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUM7Z0JBQUUsTUFBTSxJQUFJLGtDQUFzQixDQUFDLHdEQUF3RCxDQUFDLENBQUM7WUFDeE0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVO2dCQUFFLE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1lBQ25ILE1BQU0sT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUFFLE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1lBQ3pILElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLElBQUEsdUJBQVksRUFBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7Z0JBQUUsTUFBTSxJQUFJLGtDQUFzQixDQUFDLG1EQUFtRCxDQUFDLENBQUM7WUFDeE0sU0FBUyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ2xDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBQSxzQkFBYyxFQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRixJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNiLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLDBCQUEwQixDQUFDO29CQUNwRixJQUFJLENBQUMsTUFBTTt3QkFBRSxNQUFNLElBQUksa0NBQXNCLENBQUMseURBQXlELENBQUMsQ0FBQztvQkFDekcsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUNySCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxLQUFLLEdBQUcsSUFBSSxJQUFBLHdDQUErQixFQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFBLHVCQUFZLEVBQUMsTUFBTSxDQUFDLENBQUM7d0JBQUUsTUFBTSxJQUFJLGtDQUFzQixDQUFDLGtFQUFrRSxDQUFDLENBQUM7b0JBQ3JRLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQy9DLE1BQU0sT0FBTyxHQUFvQixFQUFFLFNBQVMsRUFBRSxJQUFBLHVCQUFZLEVBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUNqSyxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xILFNBQVMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUM5QixDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLEtBQUssSUFBSSxFQUFFO2dCQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTO29CQUFFLE9BQU87Z0JBQ3RDLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztvQkFDN0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNoRCxNQUFNLE1BQU0sR0FBNEI7d0JBQ3RDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVM7d0JBQ3RELENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVM7d0JBQ3JELENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTTt3QkFDeEMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLEVBQUU7cUJBQ3RELENBQUM7b0JBQ0YsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVc7d0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxlQUFlLElBQUksT0FBTyxFQUFFLGdCQUFnQixJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLGFBQWEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDaE0sS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUNuRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO3dCQUNuSCxNQUFNLEtBQUssR0FBWSxnQkFBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUN6RCxJQUFJLEtBQUssS0FBSyxTQUFTOzRCQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUM5RCxDQUFDO29CQUNELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxNQUFNLGNBQWMsQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRSxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPO3dCQUFFLE9BQU87Z0JBQ25JLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLDJCQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM5QyxDQUFDLENBQUM7WUFDRixJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNoQixJQUFJLEdBQUcsTUFBTSxDQUFDO2dCQUNkLE1BQU0sYUFBYSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBQSwwQkFBa0IsRUFBQyxHQUFHLEVBQUUsOENBQXNCLENBQUMsc0JBQXNCLEVBQUUsSUFBQSwwQkFBZ0IsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRTt3QkFDdEksZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVM7cUJBQy9ILENBQUMsQ0FBQztvQkFDSCxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckUsQ0FBQztnQkFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztvQkFDOUIsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ2pCLE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsd0JBQWEsRUFBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE1BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQ2hGLElBQUksQ0FBQyxTQUFTOzRCQUFFLE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQyxrSUFBa0ksQ0FBQyxDQUFDO3dCQUNyTCxNQUFNLE9BQU8sR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzt3QkFDN0UsTUFBTSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDNUosU0FBUyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7d0JBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQzt3QkFDakQsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7NEJBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNuSixDQUFDO3lCQUFNLENBQUM7d0JBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEtBQUsseUJBQXlCLElBQUksSUFBQSxzQkFBYyxFQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTs0QkFBRSxNQUFNLElBQUksa0NBQXNCLENBQUMsaUZBQWlGLENBQUMsQ0FBQzt3QkFDclAsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFBLCtCQUFvQixFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7d0JBQ25KLE1BQU0sT0FBTyxHQUFvQixFQUFFLFNBQVMsRUFBRSxJQUFBLHVCQUFZLEVBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO3dCQUN6RixNQUFNLFNBQVMsR0FBRyxJQUFBLDZCQUFrQixFQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUM5QyxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzNKLFNBQVMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO3dCQUM1QixJQUFJLENBQUM7NEJBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLHdCQUFZLEVBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUEsMkJBQWdCLEVBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDM0csSUFBSSxRQUFRLENBQUMsRUFBRSxJQUFJLElBQUk7Z0NBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDOzRCQUNoRyxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDMUUsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUEsMkJBQWdCLEVBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztnQ0FBRSxNQUFNLElBQUksa0NBQXNCLENBQUMsb0RBQW9ELENBQUMsQ0FBQzs0QkFDaEosTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDOUIsTUFBTSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBUSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFPLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNySyxTQUFTLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7d0JBQ3BDLENBQUM7d0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzs0QkFDZixzR0FBc0c7NEJBQ3RHLElBQUksS0FBSyxZQUFZLDJCQUFlLEVBQUUsQ0FBQztnQ0FDckMsTUFBTSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNqSCxNQUFNLEtBQUssQ0FBQzs0QkFDZCxDQUFDOzRCQUNELE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU8sQ0FBQyxPQUFPLEdBQUcsS0FBSyxZQUFZLHdCQUFpQixJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQzFNLE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsd0JBQWEsRUFBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE1BQU8sQ0FBQyxDQUFDLENBQUM7NEJBQ2hGLElBQUksU0FBUyxFQUFFLENBQUM7Z0NBQ2QsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQ0FDaEMsTUFBTSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBUSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNwSSxPQUFPLEdBQUcsU0FBUyxDQUFDO2dDQUFDLE1BQU0sT0FBTyxFQUFFLENBQUM7NEJBQ3ZDLENBQUM7NEJBQ0QsTUFBTSxLQUFLLENBQUM7d0JBQ2QsQ0FBQztvQkFDSCxDQUFDO29CQUNELE1BQU0sT0FBTyxFQUFFLENBQUMsQ0FBQyxpRUFBaUU7Z0JBQ3BGLENBQUM7Z0JBQ0QsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQVEsQ0FBQyxTQUFVLENBQUM7Z0JBQ3JDLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3pDLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDMUQsSUFBSSxJQUFBLDRCQUFpQixFQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7d0JBQy9GLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQVEsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzlELENBQUM7eUJBQU0sSUFBSSxJQUFBLDBCQUFnQixFQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO3dCQUM3QyxNQUFNLElBQUksMkJBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDeEMsQ0FBQzt5QkFBTSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDeEUscUdBQXFHO3dCQUNyRyxpSEFBaUg7d0JBQ2pILE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9DLENBQUM7eUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxXQUFXLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7d0JBQzFGLE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQywyRkFBMkYsQ0FBQyxDQUFDO29CQUNoSSxDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxJQUFJLDJCQUFlLENBQUMsMEJBQTBCLENBQUMsQ0FBQztvQkFDeEQsQ0FBQztnQkFDSCxDQUFDO2dCQUNELElBQUksSUFBQSwwQkFBZ0IsRUFBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO29CQUFFLE1BQU0sSUFBSSwyQkFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM3RSxNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sSUFBQSwwQkFBZ0IsRUFBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDO2dCQUN2SCxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUM1RyxnSEFBZ0g7d0JBQ2hILElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7NEJBQ25HLE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO3dCQUN0RyxDQUFDO3dCQUNELE1BQU0sSUFBSSwyQkFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUN2QyxDQUFDO29CQUNELE1BQU0sSUFBQSxvQ0FBbUIsRUFBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDL0gsQ0FBQztnQkFDRCxJQUFBLHNCQUFjLEVBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztnQkFDaEQsTUFBTSxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDL0ksTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDbkUsTUFBTSxJQUFBLG9DQUFtQixFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ3pFLE1BQU0sYUFBYSxHQUFHLGNBQWMsS0FBSyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztnQkFDbEUsTUFBTSxJQUFBLDBCQUFnQixFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRCxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLElBQUEsbUJBQVcsRUFBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pILE1BQU0sYUFBYSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sV0FBVyxHQUFHLElBQUEsbUJBQVcsRUFBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ25ELE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBQSw0QkFBaUIsRUFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUM5SyxJQUFJLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ25HLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sR0FBRyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsT0FBUSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDek0sSUFBSSxDQUFDO3dCQUNILE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDaEMsTUFBTSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBUSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDOUQsQ0FBQztvQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO3dCQUNmLE1BQU0sSUFBSSxHQUFHLEtBQUssWUFBWSx3QkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQWlFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzt3QkFDdEksTUFBTSxRQUFRLEdBQUcsS0FBSyxZQUFZLHdCQUFpQixJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssR0FBRzsrQkFDMUUsSUFBSSxFQUFFLElBQUksS0FBSyxZQUFZLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFFBQVE7K0JBQy9ELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLDBCQUEwQixDQUFDLENBQUM7d0JBQ3pELE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQVEsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNyRixNQUFNLEtBQUssQ0FBQztvQkFDZCxDQUFDO29CQUNELG9HQUFvRztvQkFDcEcsT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDM0MsQ0FBQztnQkFDRCxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckIsTUFBTSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ25CLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBQSw0QkFBaUIsRUFBQyxPQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUM5RSxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUEsNEJBQWlCLEVBQUMsT0FBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO29CQUN0SSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7b0JBQ3ZGLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt3QkFDM0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztvQkFDN0csQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUN2QixJQUFBLDZCQUFxQixFQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsb0VBQW9FLEVBQUUsZUFBZSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ2xOLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkQsQ0FBQztnQkFDRCxNQUFNLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLENBQUM7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDO29CQUFFLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUM7b0JBQUUsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzVDLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDbkMsT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QyxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLEdBQUcsSUFBQSw0QkFBaUIsRUFBQyxPQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsT0FBUSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqTixJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUNuQixJQUFJLEdBQUcsU0FBUyxDQUFDO2dCQUNqQixJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztvQkFBRSxNQUFNLElBQUksMkJBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNuSixLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7b0JBQzdDLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzNDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSxrQ0FBaUIsRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ25GLE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3BDLE1BQU0sTUFBTSxHQUE0QixFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDO29CQUN2RixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQW9CO3dCQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUMzRixJQUFJLENBQUMsTUFBTSxjQUFjLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQUMsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQUMsTUFBTTtvQkFBQyxDQUFDO29CQUM5SixJQUFJLE9BQU8sS0FBSyxDQUFDO3dCQUFFLE1BQU0sSUFBSSwyQkFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2pFLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxHQUFHLFNBQVMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLElBQUEsNEJBQWlCLEVBQUMsT0FBTyxDQUFDO29CQUFFLE1BQU0sSUFBSSwyQkFBZSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0SSxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQzFELElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlO3dCQUFFLE1BQU0sSUFBSSwyQkFBZSxDQUFDLDBCQUEwQixDQUFDLENBQUM7b0JBQ3pILE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQVEsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlELENBQUM7Z0JBQ0QsTUFBTSxjQUFjLEdBQUcsR0FBRyxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzVFLElBQUksS0FBSyxDQUFDLG1CQUFtQixLQUFLLGNBQWMsRUFBRSxDQUFDO29CQUNqRCxrRkFBa0Y7b0JBQ2xGLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNuRSxNQUFNLGdCQUFnQixHQUFHLElBQUEsMEJBQWtCLEVBQUMsR0FBRyxFQUFFLDhDQUFzQixDQUFDLDBCQUEwQixFQUFFLElBQUEsMEJBQWdCLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDL0ssSUFBQSw2QkFBcUIsRUFBQyxnQkFBZ0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxlQUFlLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2xMLENBQUM7Z0JBQ0QsTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0Msc0ZBQXNGO2dCQUN0RixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEtBQUssV0FBVyxDQUFDO2dCQUM5RyxJQUFJLFdBQVcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztvQkFBRSxNQUFNLElBQUksMkJBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDbEgsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFBRSxNQUFNLElBQUksMkJBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDaEgsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7Z0JBQ2pELElBQUksVUFBVSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsS0FBSyxVQUFVLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztvQkFDaEssaUdBQWlHO29CQUNqRyxJQUFJLENBQUMsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQzt3QkFBRSxNQUFNLElBQUksMkJBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO29CQUN6RyxNQUFNLFVBQVUsR0FBRyxNQUFNLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDN0YsSUFBSSxDQUFDLFVBQVU7d0JBQUUsTUFBTSxJQUFJLGtDQUFzQixDQUFDLGlDQUFpQyxDQUFDLENBQUM7b0JBQ3JGLE1BQU0sSUFBSSxHQUFHLE1BQU0sb0JBQW9CLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzNGLE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDL0ssSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUU7d0JBQUUsTUFBTSxJQUFJLGtDQUFzQixDQUFDLG1FQUFtRSxDQUFDLENBQUM7Z0JBQ3BJLENBQUM7Z0JBQ0QsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3hCLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEUsTUFBTSxPQUFPLEVBQUUsQ0FBQztZQUNsQixDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVM7Z0JBQUUsTUFBTSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLEtBQUssWUFBWSw4QkFBaUIsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ3ZFLElBQUksS0FBSyxZQUFZLDJCQUFlLElBQUksS0FBSyxZQUFZLHdDQUFtQixFQUFFLENBQUM7WUFDN0UsTUFBTSxJQUFJLENBQUMsS0FBSyxZQUFZLDJCQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakYsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkUsTUFBTSxRQUFRLEdBQUcsS0FBSyxZQUFZLGtDQUFzQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssWUFBWSx3QkFBaUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQztZQUNwTCxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDbkIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNsSCxNQUFNLEtBQUssR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QyxNQUFNLFFBQVEsR0FBRyxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxZQUFZLHdCQUFpQixJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxVQUFVLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDO2dCQUMzTyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0JBQ2pKLENBQUMsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7Z0JBQ3hGLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVM7b0JBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxSixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDL0QsSUFBQSx5QkFBaUIsRUFBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNqSyxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO1lBQVMsQ0FBQztRQUNULGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUFDLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDM0UsQ0FBQztBQUNILENBQUMifQ==
|