@pipeline-builder/pipeline-data 3.4.55 → 3.4.57

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.
@@ -50,7 +50,13 @@ class ReportingService {
50
50
  // org>` could only write events for that org; bypass via sysadmin is
51
51
  // the right gate for this server-internal cross-tenant endpoint. See
52
52
  // api/reporting/src/routes/event-ingest.ts for the wrapper.
53
- return (0, tenancy_1.withTenantTx)(async (tx) => {
53
+ // Run insert inside the tx, but COLLECT affected orgs and invalidate
54
+ // caches AFTER the tx resolves. Keeping invalidation inside the tx held
55
+ // the pg locks open for the duration of the cache round-trips (Redis or
56
+ // in-memory invalidations are unrelated to the tx but still serialized
57
+ // its commit). Cache TTL is 2-5 min so fire-and-forget post-commit is
58
+ // an acceptable trade for tighter lock windows.
59
+ const { inserted, skipped, unregisteredArns, affectedOrgs } = await (0, tenancy_1.withTenantTx)(async (tx) => {
54
60
  // Batch-resolve all unique ARNs in one query
55
61
  const uniqueArns = [...new Set(events.map(e => e.pipelineArn))];
56
62
  const registryRows = await tx
@@ -64,13 +70,13 @@ class ReportingService {
64
70
  const arnMap = new Map(registryRows.map(r => [r.pipelineArn, r]));
65
71
  // Build insert batch (skip unregistered ARNs)
66
72
  const rows = [];
67
- let skipped = 0;
68
- const unregisteredArns = [];
73
+ let skippedLocal = 0;
74
+ const unregisteredArnsLocal = [];
69
75
  for (const event of events) {
70
76
  const registry = arnMap.get(event.pipelineArn);
71
77
  if (!registry) {
72
- skipped++;
73
- unregisteredArns.push(event.pipelineArn);
78
+ skippedLocal++;
79
+ unregisteredArnsLocal.push(event.pipelineArn);
74
80
  continue;
75
81
  }
76
82
  rows.push({
@@ -91,16 +97,22 @@ class ReportingService {
91
97
  }
92
98
  if (rows.length > 0) {
93
99
  await tx.insert(drizzle_schema_1.schema.pipelineEvent).values(rows);
94
- // Per-org cache invalidation runs outside the tx (Redis, not Postgres).
95
- // `Promise.all` so the caller doesn't return before invalidation
96
- // completes, otherwise dashboards can serve stale data right after ingest.
97
- const affectedOrgs = [...new Set(rows.map(r => r.orgId))];
98
- await Promise.all(affectedOrgs.map((org) => this.invalidateOrg(org).catch((err) => {
99
- logger.warn('Reporting cache invalidation failed', { orgId: org, error: (0, api_core_1.errorMessage)(err) });
100
- })));
101
100
  }
102
- return { inserted: rows.length, skipped, unregisteredArns };
101
+ return {
102
+ inserted: rows.length,
103
+ skipped: skippedLocal,
104
+ unregisteredArns: unregisteredArnsLocal,
105
+ affectedOrgs: [...new Set(rows.map(r => r.orgId))],
106
+ };
103
107
  });
108
+ // Post-commit cache invalidation. Fire-and-forget with logging — TTL is
109
+ // short enough that a missed invalidation self-heals.
110
+ if (affectedOrgs.length > 0) {
111
+ void Promise.all(affectedOrgs.map((org) => this.invalidateOrg(org).catch((err) => {
112
+ logger.warn('Reporting cache invalidation failed', { orgId: org, error: (0, api_core_1.errorMessage)(err) });
113
+ })));
114
+ }
115
+ return { inserted, skipped, unregisteredArns };
104
116
  }
105
117
  // ── Category 1: Pipeline Execution & Performance ──
106
118
  /** 1.1 Execution count per pipeline with status breakdown. */
@@ -264,7 +276,20 @@ class ReportingService {
264
276
  ORDER BY version_count DESC
265
277
  `).then(r => (0, crud_service_1.drizzleRows)(r.rows))));
266
278
  }
267
- /** 2.4 Build success rate over time. */
279
+ /**
280
+ * 2.4 Build success rate over time.
281
+ *
282
+ * STATUS CASING NOTE: This query filters by `event_source = 'plugin-build'`
283
+ * and uses lowercase status values (`'completed'`, `'failed'`), while
284
+ * `getSuccessRate` (1.2) filters by `event_type = 'PIPELINE'` with
285
+ * uppercase AWS-style statuses (`'SUCCEEDED'`, `'FAILED'`, `'CANCELED'`).
286
+ * The casing drift is intentional and tracks the producer:
287
+ * - `plugin-build` events come from our own build pipeline (lowercase)
288
+ * - `PIPELINE` events come from AWS CodePipeline (uppercase)
289
+ * The ingest Zod schema at api/reporting/src/routes/event-ingest.ts
290
+ * SHOULD enum these per-eventSource so we catch drift at ingest rather
291
+ * than silently producing zero rows here. See findings N71.
292
+ */
268
293
  async getBuildSuccessRate(orgId, interval, from, to) {
269
294
  return timeseriesCache.getOrSet(`${orgId}:build-success:${interval}:${from}:${to}`, () => (0, tenancy_1.withTenantTx)((tx) => tx.execute((0, drizzle_orm_1.sql) `
270
295
  SELECT
@@ -313,4 +338,4 @@ class ReportingService {
313
338
  }
314
339
  exports.ReportingService = ReportingService;
315
340
  exports.reportingService = new ReportingService();
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOzs7QUFFdEMseURBQThHO0FBQzlHLDZDQUEyQztBQUMzQyxpREFBNkM7QUFDN0MsK0RBQW9EO0FBQ3BELGlEQUFtRDtBQUVuRCxNQUFNLE1BQU0sR0FBRyxJQUFBLHVCQUFZLEVBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsSUFBQSw2QkFBa0IsRUFBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEgsTUFBTSxlQUFlLEdBQUcsSUFBQSw2QkFBa0IsRUFBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFrSXpILDJEQUEyRDtBQUUzRDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxnQkFBZ0I7SUFFM0IsMEVBQTBFO0lBQzFFLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBYTtRQUMvQixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDaEIsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUM7WUFDOUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUM7U0FDaEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFxQjtRQUN0Qyx1RUFBdUU7UUFDdkUsc0VBQXNFO1FBQ3RFLDJFQUEyRTtRQUMzRSxzRUFBc0U7UUFDdEUscUVBQXFFO1FBQ3JFLHFFQUFx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SSxJQUFJLEVBQUUsSUFBSSxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FDckYsSUFBQSxzQkFBWSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUEsaUJBQUcsRUFBQTs7Ozs7O2VBTTFCLHVCQUFNLENBQUMsYUFBYTsyQkFDUixLQUFLO2dDQUNBLElBQUkscUNBQXFDLEVBQUU7OztnQkFHM0QsS0FBSztPQUNkLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFBLDBCQUFXLEVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDakQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQS9VRCw0Q0ErVUM7QUFFWSxRQUFBLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVDYWNoZVNlcnZpY2UsIGNyZWF0ZUxvZ2dlciwgZXJyb3JNZXNzYWdlLCBoYXNoQWNjb3VudEluQXJuIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgaW5BcnJheSwgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgZHJpenpsZVJvd3MgfSBmcm9tICcuL2NydWQtc2VydmljZSc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYSc7XG5pbXBvcnQgeyB3aXRoVGVuYW50VHggfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5JztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXBvcnRpbmctc2VydmljZScpO1xuXG4vKipcbiAqIENhY2hlIGZvciByZXBvcnRpbmcgYWdncmVnYXRpb25zLiBUd28gdGllcnM6XG4gKiAtIEludmVudG9yeSBxdWVyaWVzIChwbHVnaW4gc3VtbWFyeS9kaXN0cmlidXRpb24vdmVyc2lvbnMpOiA1IG1pbiBUVEwg4oCUIGNoYW5nZXMgb24gcGx1Z2luIENSVURcbiAqIC0gRXhlY3V0aW9uL2J1aWxkIHF1ZXJpZXMgd2l0aCBkYXRlIHJhbmdlczogMiBtaW4gVFRMIOKAlCBuZXcgZXZlbnRzIGFycml2ZSBjb250aW51b3VzbHlcbiAqL1xuY29uc3QgaW52ZW50b3J5Q2FjaGUgPSBjcmVhdGVDYWNoZVNlcnZpY2UoJ3JlcG9ydDppbnY6JywgcGFyc2VJbnQocHJvY2Vzcy5lbnYuQ0FDSEVfVFRMX1JFUE9SVF9JTlZFTlRPUlkgfHwgJzMwMCcsIDEwKSk7XG5jb25zdCB0aW1lc2VyaWVzQ2FjaGUgPSBjcmVhdGVDYWNoZVNlcnZpY2UoJ3JlcG9ydDp0czonLCBwYXJzZUludChwcm9jZXNzLmVudi5DQUNIRV9UVExfUkVQT1JUX1RJTUVTRVJJRVMgfHwgJzEyMCcsIDEwKSk7XG5cbi8vIOKUgOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIEV4ZWN1dGlvbkNvdW50IHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0b3RhbDogbnVtYmVyO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIGZpcnN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBsYXN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgVGltZVNlcmllc0VudHJ5IHtcbiAgcGVyaW9kOiBzdHJpbmc7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY2FuY2VsZWQ6IG51bWJlcjtcbiAgc3VjY2Vzc1BjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRHVyYXRpb25TdGF0cyB7XG4gIGlkOiBzdHJpbmc7XG4gIHByb2plY3Q6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBhdmdNczogbnVtYmVyO1xuICBtaW5NczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xuICBwOTVNczogbnVtYmVyO1xuICBleGVjdXRpb25zOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTdGFnZUZhaWx1cmUge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU3RhZ2VCb3R0bGVuZWNrIHtcbiAgaWQ6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEFjdGlvbkZhaWx1cmUge1xuICBhY3Rpb25OYW1lOiBzdHJpbmc7XG4gIGZhaWx1cmVzOiBudW1iZXI7XG4gIHRvdGFsOiBudW1iZXI7XG4gIGZhaWx1cmVQY3Q6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEVycm9yRW50cnkge1xuICBlcnJvclBhdHRlcm46IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgYWZmZWN0ZWRQaXBlbGluZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpblN1bW1hcnkge1xuICB0b3RhbDogbnVtYmVyO1xuICBhY3RpdmU6IG51bWJlcjtcbiAgaW5hY3RpdmU6IG51bWJlcjtcbiAgcHVibGljOiBudW1iZXI7XG4gIHByaXZhdGU6IG51bWJlcjtcbiAgdW5pcXVlTmFtZXM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uIHtcbiAgcGx1Z2luVHlwZTogc3RyaW5nO1xuICBjb21wdXRlVHlwZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVmVyc2lvbkNvdW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uQ291bnQ6IG51bWJlcjtcbiAgbGF0ZXN0VmVyc2lvbjogc3RyaW5nO1xuICBoYXNEZWZhdWx0OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRUaW1lU2VyaWVzRW50cnkge1xuICBwZXJpb2Q6IHN0cmluZztcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBzdWNjZXNzUGN0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBCdWlsZER1cmF0aW9uIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBhdmdNczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xuICBidWlsZHM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkRmFpbHVyZSB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XG4gIG9jY3VycmVuY2VzOiBudW1iZXI7XG4gIGxhc3RTZWVuOiBzdHJpbmc7XG59XG5cbi8qKiBFdmVudCBwYXlsb2FkIGFjY2VwdGVkIGJ5IGBSZXBvcnRpbmdTZXJ2aWNlLmluZ2VzdEV2ZW50c2AuIE1pcnJvcnMgdGhlIHJvdXRlJ3MgWm9kIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RFdmVudCB7XG4gIHBpcGVsaW5lQXJuOiBzdHJpbmc7XG4gIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB8ICdjb2RlYnVpbGQnIHwgJ3BsdWdpbi1idWlsZCc7XG4gIGV2ZW50VHlwZTogJ1BJUEVMSU5FJyB8ICdTVEFHRScgfCAnQUNUSU9OJyB8ICdCVUlMRCc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBleGVjdXRpb25JZD86IHN0cmluZztcbiAgc3RhZ2VOYW1lPzogc3RyaW5nO1xuICBhY3Rpb25OYW1lPzogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG4gIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICBkdXJhdGlvbk1zPzogbnVtYmVyO1xuICBkZXRhaWw/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENvdW50cyArIHRoZSAocG9zc2libHkgdHJ1bmNhdGVkKSBsaXN0IG9mIHVucmVnaXN0ZXJlZCBBUk5zIHRoZSBjYWxsZXIgY2FuIGxvZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0UmVzdWx0IHtcbiAgaW5zZXJ0ZWQ6IG51bWJlcjtcbiAgc2tpcHBlZDogbnVtYmVyO1xuICB1bnJlZ2lzdGVyZWRBcm5zOiBzdHJpbmdbXTtcbn1cblxuLy8g4pSA4pSA4pSAIFNlcnZpY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUmVhZC1vbmx5IHJlcG9ydGluZyBzZXJ2aWNlIGZvciBwaXBlbGluZSBleGVjdXRpb24gYW5kIHBsdWdpbiBpbnZlbnRvcnkgYWdncmVnYXRpb25zLlxuICogRG9lcyBub3QgZXh0ZW5kIENydWRTZXJ2aWNlIOKAlCByZXBvcnRzIGFyZSBhZ2dyZWdhdGUgcXVlcmllcywgbm90IGVudGl0eSBDUlVELlxuICpcbiAqIEFsbCBxdWVyaWVzIGFyZSBjYWNoZWQgaW4tbWVtb3J5IHRvIGF2b2lkIHJlcGVhdGVkIGV4cGVuc2l2ZSBTUUwgYWdncmVnYXRpb25zOlxuICogLSBJbnZlbnRvcnkgcXVlcmllcyAocGx1Z2luIHN1bW1hcnkvZGlzdHJpYnV0aW9uL3ZlcnNpb25zKTogNSBtaW4gVFRMXG4gKiAtIFRpbWVzZXJpZXMgcXVlcmllcyAoZXhlY3V0aW9uL2J1aWxkIG1ldHJpY3Mgd2l0aCBkYXRlIHJhbmdlcyk6IDIgbWluIFRUTFxuICovXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nU2VydmljZSB7XG5cbiAgLyoqIEludmFsaWRhdGUgYWxsIGNhY2hlZCByZXBvcnRzIGZvciBhbiBvcmcgKGNhbGwgYWZ0ZXIgZXZlbnQgaW5nZXN0KS4gKi9cbiAgYXN5bmMgaW52YWxpZGF0ZU9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgaW52ZW50b3J5Q2FjaGUuaW52YWxpZGF0ZVBhdHRlcm4oYCR7b3JnSWR9OipgKSxcbiAgICAgIHRpbWVzZXJpZXNDYWNoZS5pbnZhbGlkYXRlUGF0dGVybihgJHtvcmdJZH06KmApLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgaW5jb21pbmcgZXZlbnRzIGFnYWluc3QgdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBiYXRjaC1pbnNlcnQgdGhlXG4gICAqIG1hdGNoZWQgb25lcywgYW5kIGludmFsaWRhdGUgcmVwb3J0aW5nIGNhY2hlcyBmb3IgYWZmZWN0ZWQgb3Jncy5cbiAgICogRXZlbnRzIGZvciB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgQVJOcyBhcmUgZHJvcHBlZCAoYW5kIGxvZ2dlZCBhdCBXQVJOXG4gICAqIHdpdGggc2FtcGxlIEFSTnMgc28gYW4gb3BlcmF0b3IgY2FuIHNlZSB3aGVuIEV2ZW50QnJpZGdlIGlzIGRlbGl2ZXJpbmdcbiAgICogZXZlbnRzIGZvciBwaXBlbGluZXMgdGhhdCBoYXZlbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0KS5cbiAgICpcbiAgICogUmV0dXJucyBjb3VudHMgKyBhIHNhbXBsZSBvZiB1bnJlZ2lzdGVyZWQgQVJOcyBmb3Igb2JzZXJ2YWJpbGl0eS5cbiAgICovXG4gIGFzeW5jIGluZ2VzdEV2ZW50cyhldmVudHM6IEluZ2VzdEV2ZW50W10pOiBQcm9taXNlPEluZ2VzdFJlc3VsdD4ge1xuICAgIC8vIE11bHRpLW9yZyBiYXRjaCBpbnNlcnQ6IHRoZSBjYWxsZXIgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgb3JncyB2aWEgdGhlXG4gICAgLy8gcGlwZWxpbmUtcmVnaXN0cnkgbG9va3VwIGJlbG93LCBzbyB0aGUgcm91dGUgbGF5ZXIgTVVTVCBlc3RhYmxpc2ggYVxuICAgIC8vIGBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCAuLi4pYCBzY29wZSBiZWZvcmUgY2FsbGluZ1xuICAgIC8vIHRoaXMgbWV0aG9kLiBVbmRlciBGT1JDRSdkIFJMUywgYSBzaW5nbGUgdHggd2l0aCBgYXBwLm9yZ19pZCA9IDxvbmVcbiAgICAvLyBvcmc+YCBjb3VsZCBvbmx5IHdyaXRlIGV2ZW50cyBmb3IgdGhhdCBvcmc7IGJ5cGFzcyB2aWEgc3lzYWRtaW4gaXNcbiAgICAvLyB0aGUgcmlnaHQgZ2F0ZSBmb3IgdGhpcyBzZXJ2ZXItaW50ZXJuYWwgY3Jvc3MtdGVuYW50IGVuZHBvaW50LiBTZWVcbiAgICAvLyBhcGkvcmVwb3J0aW5nL3NyYy9yb3V0ZXMvZXZlbnQtaW5nZXN0LnRzIGZvciB0aGUgd3JhcHBlci5cbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgLy8gQmF0Y2gtcmVzb2x2ZSBhbGwgdW5pcXVlIEFSTnMgaW4gb25lIHF1ZXJ5XG4gICAgICBjb25zdCB1bmlxdWVBcm5zID0gWy4uLm5ldyBTZXQoZXZlbnRzLm1hcChlID0+IGUucGlwZWxpbmVBcm4pKV07XG4gICAgICBjb25zdCByZWdpc3RyeVJvd3MgPSBhd2FpdCB0eFxuICAgICAgICAuc2VsZWN0KHtcbiAgICAgICAgICBwaXBlbGluZUlkOiBzY2hlbWEucGlwZWxpbmVSZWdpc3RyeS5waXBlbGluZUlkLFxuICAgICAgICAgIG9yZ0lkOiBzY2hlbWEucGlwZWxpbmVSZWdpc3RyeS5vcmdJZCxcbiAgICAgICAgICBwaXBlbGluZUFybjogc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkucGlwZWxpbmVBcm4sXG4gICAgICAgIH0pXG4gICAgICAgIC5mcm9tKHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5KVxuICAgICAgICAud2hlcmUoaW5BcnJheShzY2hlbWEucGlwZWxpbmVSZWdpc3RyeS5waXBlbGluZUFybiwgdW5pcXVlQXJucykpO1xuXG4gICAgICBjb25zdCBhcm5NYXAgPSBuZXcgTWFwKHJlZ2lzdHJ5Um93cy5tYXAociA9PiBbci5waXBlbGluZUFybiwgcl0pKTtcblxuICAgICAgLy8gQnVpbGQgaW5zZXJ0IGJhdGNoIChza2lwIHVucmVnaXN0ZXJlZCBBUk5zKVxuICAgICAgY29uc3Qgcm93czogQXJyYXk8dHlwZW9mIHNjaGVtYS5waXBlbGluZUV2ZW50LiRpbmZlckluc2VydD4gPSBbXTtcbiAgICAgIGxldCBza2lwcGVkID0gMDtcbiAgICAgIGNvbnN0IHVucmVnaXN0ZXJlZEFybnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gYXJuTWFwLmdldChldmVudC5waXBlbGluZUFybik7XG4gICAgICAgIGlmICghcmVnaXN0cnkpIHtcbiAgICAgICAgICBza2lwcGVkKys7XG4gICAgICAgICAgdW5yZWdpc3RlcmVkQXJucy5wdXNoKGV2ZW50LnBpcGVsaW5lQXJuKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgcGlwZWxpbmVJZDogcmVnaXN0cnkucGlwZWxpbmVJZCxcbiAgICAgICAgICBvcmdJZDogcmVnaXN0cnkub3JnSWQsXG4gICAgICAgICAgZXZlbnRTb3VyY2U6IGV2ZW50LmV2ZW50U291cmNlLFxuICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICAgIHN0YXR1czogZXZlbnQuc3RhdHVzLFxuICAgICAgICAgIHBpcGVsaW5lQXJuOiBoYXNoQWNjb3VudEluQXJuKGV2ZW50LnBpcGVsaW5lQXJuKSxcbiAgICAgICAgICBleGVjdXRpb25JZDogZXZlbnQuZXhlY3V0aW9uSWQsXG4gICAgICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICAgICAgYWN0aW9uTmFtZTogZXZlbnQuYWN0aW9uTmFtZSxcbiAgICAgICAgICBzdGFydGVkQXQ6IGV2ZW50LnN0YXJ0ZWRBdCA/IG5ldyBEYXRlKGV2ZW50LnN0YXJ0ZWRBdCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29tcGxldGVkQXQ6IGV2ZW50LmNvbXBsZXRlZEF0ID8gbmV3IERhdGUoZXZlbnQuY29tcGxldGVkQXQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGR1cmF0aW9uTXM6IGV2ZW50LmR1cmF0aW9uTXMsXG4gICAgICAgICAgZGV0YWlsOiBldmVudC5kZXRhaWwsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAocm93cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHR4Lmluc2VydChzY2hlbWEucGlwZWxpbmVFdmVudCkudmFsdWVzKHJvd3MpO1xuXG4gICAgICAgIC8vIFBlci1vcmcgY2FjaGUgaW52YWxpZGF0aW9uIHJ1bnMgb3V0c2lkZSB0aGUgdHggKFJlZGlzLCBub3QgUG9zdGdyZXMpLlxuICAgICAgICAvLyBgUHJvbWlzZS5hbGxgIHNvIHRoZSBjYWxsZXIgZG9lc24ndCByZXR1cm4gYmVmb3JlIGludmFsaWRhdGlvblxuICAgICAgICAvLyBjb21wbGV0ZXMsIG90aGVyd2lzZSBkYXNoYm9hcmRzIGNhbiBzZXJ2ZSBzdGFsZSBkYXRhIHJpZ2h0IGFmdGVyIGluZ2VzdC5cbiAgICAgICAgY29uc3QgYWZmZWN0ZWRPcmdzID0gWy4uLm5ldyBTZXQocm93cy5tYXAociA9PiByLm9yZ0lkKSldO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChhZmZlY3RlZE9yZ3MubWFwKChvcmcpID0+XG4gICAgICAgICAgdGhpcy5pbnZhbGlkYXRlT3JnKG9yZykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1JlcG9ydGluZyBjYWNoZSBpbnZhbGlkYXRpb24gZmFpbGVkJywgeyBvcmdJZDogb3JnLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBpbnNlcnRlZDogcm93cy5sZW5ndGgsIHNraXBwZWQsIHVucmVnaXN0ZXJlZEFybnMgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAxOiBQaXBlbGluZSBFeGVjdXRpb24gJiBQZXJmb3JtYW5jZSDilIDilIBcblxuICAvKiogMS4xIEV4ZWN1dGlvbiBjb3VudCBwZXIgcGlwZWxpbmUgd2l0aCBzdGF0dXMgYnJlYWtkb3duLiAqL1xuICBhc3luYyBnZXRFeGVjdXRpb25Db3VudChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxFeGVjdXRpb25Db3VudFtdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06ZXhlYy1jb3VudGAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5wcm9qZWN0LCBwLm9yZ2FuaXphdGlvbiwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGZpcnN0X2V4ZWN1dGlvbixcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X2V4ZWN1dGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lfSBwXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZSBPTiBlLnBpcGVsaW5lX2lkID0gcC5pZFxuICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyAhPSAnU1RBUlRFRCdcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgPSAke29yZ0lkfSBBTkQgcC5pc19hY3RpdmUgPSB0cnVlXG4gICAgICAgIEdST1VQIEJZIHAuaWRcbiAgICAgICAgT1JERVIgQlkgdG90YWwgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEV4ZWN1dGlvbkNvdW50PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAxLjIgU3VjY2VzcyByYXRlIG92ZXIgdGltZSBmb3IgYW4gb3JnLiAqL1xuICBhc3luYyBnZXRTdWNjZXNzUmF0ZShvcmdJZDogc3RyaW5nLCBpbnRlcnZhbDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiBQcm9taXNlPFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06c3VjY2Vzcy1yYXRlOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b31gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIERBVEVfVFJVTkMoJHtpbnRlcnZhbH0sIGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgcGVyaW9kLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0NBTkNFTEVEJyk6OmludCBBUyBjYW5jZWxlZCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBzdWNjZXNzX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcpXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwZXJpb2QgT1JERVIgQlkgcGVyaW9kXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VGltZVNlcmllc0VudHJ5PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAxLjMgQXZlcmFnZSBkdXJhdGlvbiBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldEF2ZXJhZ2VEdXJhdGlvbihvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiBQcm9taXNlPER1cmF0aW9uU3RhdHNbXT4ge1xuICAgIHJldHVybiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OmF2Zy1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnByb2plY3QsIHAucGlwZWxpbmVfbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUlOKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWluX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC45NSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBlLmR1cmF0aW9uX21zKTo6aW50IEFTIHA5NV9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGV4ZWN1dGlvbnNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcC5pZCBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPER1cmF0aW9uU3RhdHM+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDEuNSBTdGFnZSBmYWlsdXJlIGhlYXRtYXAg4oCUIHdoaWNoIHN0YWdlcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldFN0YWdlRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKTogUHJvbWlzZTxTdGFnZUZhaWx1cmVbXT4ge1xuICAgIHJldHVybiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnN0YWdlLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuc3RhZ2VfbmFtZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbHVyZXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBmYWlsdXJlX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YWdlX25hbWUgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBmYWlsdXJlcyBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8U3RhZ2VGYWlsdXJlPihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAxLjYgU3RhZ2UgYm90dGxlbmVja3Mg4oCUIHNsb3dlc3Qgc3RhZ2VzIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0U3RhZ2VCb3R0bGVuZWNrcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiBQcm9taXNlPFN0YWdlQm90dGxlbmVja1tdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06c3RhZ2UtYm90dGxlbmVja3M6JHtmcm9tfToke3RvfWAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5waXBlbGluZV9uYW1lLCBlLnN0YWdlX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwLmlkLCBlLnN0YWdlX25hbWUgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUJvdHRsZW5lY2s+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDEuNyBBY3Rpb24gZmFpbHVyZSByYXRlIOKAlCB3aGljaCBwbHVnaW4gc3RlcHMgZmFpbCBtb3N0LiAqL1xuICBhc3luYyBnZXRBY3Rpb25GYWlsdXJlcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiBQcm9taXNlPEFjdGlvbkZhaWx1cmVbXT4ge1xuICAgIHJldHVybiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OmFjdGlvbi1mYWlsdXJlczoke2Zyb219OiR7dG99YCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmFjdGlvbl9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLmFjdGlvbl9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLmFjdGlvbl9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxBY3Rpb25GYWlsdXJlPihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAxLjggRXJyb3IgY2F0ZWdvcml6YXRpb24g4oCUIGdyb3VwIGZhaWx1cmUgbWVzc2FnZXMuICovXG4gIGFzeW5jIGdldEVycm9ycyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCk6IFByb21pc2U8RXJyb3JFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06ZXJyb3JzOiR7ZnJvbX06JHt0b306JHtsaW1pdH1gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIFNVQlNUUklORyhlLmVycm9yX21lc3NhZ2UgRlJPTSAxIEZPUiAyMDApIEFTIGVycm9yX3BhdHRlcm4sXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBvY2N1cnJlbmNlcyxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCBlLnBpcGVsaW5lX2lkKTo6aW50IEFTIGFmZmVjdGVkX3BpcGVsaW5lcyxcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X3NlZW5cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJyBBTkQgZS5lcnJvcl9tZXNzYWdlIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlcnJvcl9wYXR0ZXJuIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxFcnJvckVudHJ5PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAyOiBQbHVnaW4gSW52ZW50b3J5ICYgQnVpbGRzIOKUgOKUgFxuXG4gIC8qKiAyLjEgUGx1Z2luIHN1bW1hcnkg4oCUIGNvdW50cyBhbmQgYnJlYWtkb3ducy4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luU3VtbWFyeShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW5TdW1tYXJ5PiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tc3VtbWFyeWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgTk9UICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgaW5hY3RpdmUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4uYWNjZXNzTW9kaWZpZXJ9ID0gJ3B1YmxpYycpOjppbnQgQVMgcHVibGljLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLmFjY2Vzc01vZGlmaWVyfSA9ICdwcml2YXRlJyk6OmludCBBUyBwcml2YXRlLFxuICAgICAgICAgIENPVU5UKERJU1RJTkNUICR7c2NoZW1hLnBsdWdpbi5uYW1lfSk6OmludCBBUyB1bmlxdWVfbmFtZXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfVxuICAgICAgYCkpO1xuICAgICAgcmV0dXJuIChkcml6emxlUm93czxQbHVnaW5TdW1tYXJ5Pihyb3dzLnJvd3MpWzBdIHx8IHsgdG90YWw6IDAsIGFjdGl2ZTogMCwgaW5hY3RpdmU6IDAsIHB1YmxpYzogMCwgcHJpdmF0ZTogMCwgdW5pcXVlTmFtZXM6IDAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogMi4yIFR5cGUgJiBjb21wdXRlIGRpc3RyaWJ1dGlvbi4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luRGlzdHJpYnV0aW9uKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uW10+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi1kaXN0cmlidXRpb25gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSBBUyBwbHVnaW5fdHlwZSxcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4uY29tcHV0ZVR5cGV9IEFTIGNvbXB1dGVfdHlwZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGNvdW50XG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH0gQU5EICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0gPSB0cnVlXG4gICAgICAgIEdST1VQIEJZICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSwgJHtzY2hlbWEucGx1Z2luLmNvbXB1dGVUeXBlfVxuICAgICAgICBPUkRFUiBCWSBjb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VHlwZUNvbXB1dGVEaXN0cmlidXRpb24+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDIuMyBWZXJzaW9uIGNvdW50cyBwZXIgcGx1Z2luIG5hbWUuICovXG4gIGFzeW5jIGdldFBsdWdpblZlcnNpb25zKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFZlcnNpb25Db3VudFtdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tdmVyc2lvbnNgLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5uYW1lfSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHZlcnNpb25fY291bnQsXG4gICAgICAgICAgTUFYKCR7c2NoZW1hLnBsdWdpbi52ZXJzaW9ufSkgQVMgbGF0ZXN0X3ZlcnNpb24sXG4gICAgICAgICAgYm9vbF9vcigke3NjaGVtYS5wbHVnaW4uaXNEZWZhdWx0fSkgQVMgaGFzX2RlZmF1bHRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfSBBTkQgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgJHtzY2hlbWEucGx1Z2luLm5hbWV9XG4gICAgICAgIE9SREVSIEJZIHZlcnNpb25fY291bnQgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFZlcnNpb25Db3VudD4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogMi40IEJ1aWxkIHN1Y2Nlc3MgcmF0ZSBvdmVyIHRpbWUuICovXG4gIGFzeW5jIGdldEJ1aWxkU3VjY2Vzc1JhdGUob3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKTogUHJvbWlzZTxCdWlsZFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06YnVpbGQtc3VjY2Vzczoke2ludGVydmFsfToke2Zyb219OiR7dG99YCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCBlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2NvbXBsZXRlZCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnZmFpbGVkJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgc3VjY2Vzc19wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdjb21wbGV0ZWQnLCAnZmFpbGVkJylcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxCdWlsZFRpbWVTZXJpZXNFbnRyeT4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogMi41IEJ1aWxkIGR1cmF0aW9uIHBlciBwbHVnaW4uICovXG4gIGFzeW5jIGdldEJ1aWxkRHVyYXRpb24ob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKTogUHJvbWlzZTxCdWlsZER1cmF0aW9uW10+IHtcbiAgICByZXR1cm4gdGltZXNlcmllc0NhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpidWlsZC1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmRldGFpbC0+PidwbHVnaW5OYW1lJyBBUyBwbHVnaW5fbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgYnVpbGRzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEJ1aWxkRHVyYXRpb24+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDIuNiBCdWlsZCBmYWlsdXJlcyDigJQgdG9wIGVycm9yIG1lc3NhZ2VzLiAqL1xuICBhc3luYyBnZXRCdWlsZEZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDIwKTogUHJvbWlzZTxCdWlsZEZhaWx1cmVbXT4ge1xuICAgIHJldHVybiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OmJ1aWxkLWZhaWx1cmVzOiR7ZnJvbX06JHt0b306JHtsaW1pdH1gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIGUuZXJyb3JfbWVzc2FnZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5zdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcGx1Z2luX25hbWUsIGUuZXJyb3JfbWVzc2FnZVxuICAgICAgICBPUkRFUiBCWSBvY2N1cnJlbmNlcyBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8QnVpbGRGYWlsdXJlPihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVwb3J0aW5nU2VydmljZSA9IG5ldyBSZXBvcnRpbmdTZXJ2aWNlKCk7XG4iXX0=
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOzs7QUFFdEMseURBQThHO0FBQzlHLDZDQUEyQztBQUMzQyxpREFBNkM7QUFDN0MsK0RBQW9EO0FBQ3BELGlEQUFtRDtBQUVuRCxNQUFNLE1BQU0sR0FBRyxJQUFBLHVCQUFZLEVBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsSUFBQSw2QkFBa0IsRUFBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEgsTUFBTSxlQUFlLEdBQUcsSUFBQSw2QkFBa0IsRUFBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFrSXpILDJEQUEyRDtBQUUzRDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxnQkFBZ0I7SUFFM0IsMEVBQTBFO0lBQzFFLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBYTtRQUMvQixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDaEIsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUM7WUFDOUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUM7U0FDaEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFxQjtRQUN0Qyx1RUFBdUU7UUFDdkUsc0VBQXNFO1FBQ3RFLDJFQUEyRTtRQUMzRSxzRUFBc0U7UUFDdEUscUVBQXFFO1FBQ3JFLHFFQUFx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RUFBRTs7T0FFcEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUEsMEJBQVcsRUFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDbEQsQ0FBQztJQUNKLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQWEsRUFBRSxJQUFZLEVBQUUsRUFBVSxFQUFFLFFBQWdCLEVBQUU7UUFDaEYsT0FBTyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsSUFBSSxJQUFJLEVBQUUsSUFBSSxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FDckYsSUFBQSxzQkFBWSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUEsaUJBQUcsRUFBQTs7Ozs7O2VBTTFCLHVCQUFNLENBQUMsYUFBYTsyQkFDUixLQUFLO2dDQUNBLElBQUkscUNBQXFDLEVBQUU7OztnQkFHM0QsS0FBSztPQUNkLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFBLDBCQUFXLEVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDakQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXpXRCw0Q0F5V0M7QUFFWSxRQUFBLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVDYWNoZVNlcnZpY2UsIGNyZWF0ZUxvZ2dlciwgZXJyb3JNZXNzYWdlLCBoYXNoQWNjb3VudEluQXJuIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgaW5BcnJheSwgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgZHJpenpsZVJvd3MgfSBmcm9tICcuL2NydWQtc2VydmljZSc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYSc7XG5pbXBvcnQgeyB3aXRoVGVuYW50VHggfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5JztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXBvcnRpbmctc2VydmljZScpO1xuXG4vKipcbiAqIENhY2hlIGZvciByZXBvcnRpbmcgYWdncmVnYXRpb25zLiBUd28gdGllcnM6XG4gKiAtIEludmVudG9yeSBxdWVyaWVzIChwbHVnaW4gc3VtbWFyeS9kaXN0cmlidXRpb24vdmVyc2lvbnMpOiA1IG1pbiBUVEwg4oCUIGNoYW5nZXMgb24gcGx1Z2luIENSVURcbiAqIC0gRXhlY3V0aW9uL2J1aWxkIHF1ZXJpZXMgd2l0aCBkYXRlIHJhbmdlczogMiBtaW4gVFRMIOKAlCBuZXcgZXZlbnRzIGFycml2ZSBjb250aW51b3VzbHlcbiAqL1xuY29uc3QgaW52ZW50b3J5Q2FjaGUgPSBjcmVhdGVDYWNoZVNlcnZpY2UoJ3JlcG9ydDppbnY6JywgcGFyc2VJbnQocHJvY2Vzcy5lbnYuQ0FDSEVfVFRMX1JFUE9SVF9JTlZFTlRPUlkgfHwgJzMwMCcsIDEwKSk7XG5jb25zdCB0aW1lc2VyaWVzQ2FjaGUgPSBjcmVhdGVDYWNoZVNlcnZpY2UoJ3JlcG9ydDp0czonLCBwYXJzZUludChwcm9jZXNzLmVudi5DQUNIRV9UVExfUkVQT1JUX1RJTUVTRVJJRVMgfHwgJzEyMCcsIDEwKSk7XG5cbi8vIOKUgOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIEV4ZWN1dGlvbkNvdW50IHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0b3RhbDogbnVtYmVyO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIGZpcnN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBsYXN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgVGltZVNlcmllc0VudHJ5IHtcbiAgcGVyaW9kOiBzdHJpbmc7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY2FuY2VsZWQ6IG51bWJlcjtcbiAgc3VjY2Vzc1BjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRHVyYXRpb25TdGF0cyB7XG4gIGlkOiBzdHJpbmc7XG4gIHByb2plY3Q6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBhdmdNczogbnVtYmVyO1xuICBtaW5NczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xuICBwOTVNczogbnVtYmVyO1xuICBleGVjdXRpb25zOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTdGFnZUZhaWx1cmUge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU3RhZ2VCb3R0bGVuZWNrIHtcbiAgaWQ6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEFjdGlvbkZhaWx1cmUge1xuICBhY3Rpb25OYW1lOiBzdHJpbmc7XG4gIGZhaWx1cmVzOiBudW1iZXI7XG4gIHRvdGFsOiBudW1iZXI7XG4gIGZhaWx1cmVQY3Q6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEVycm9yRW50cnkge1xuICBlcnJvclBhdHRlcm46IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgYWZmZWN0ZWRQaXBlbGluZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpblN1bW1hcnkge1xuICB0b3RhbDogbnVtYmVyO1xuICBhY3RpdmU6IG51bWJlcjtcbiAgaW5hY3RpdmU6IG51bWJlcjtcbiAgcHVibGljOiBudW1iZXI7XG4gIHByaXZhdGU6IG51bWJlcjtcbiAgdW5pcXVlTmFtZXM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uIHtcbiAgcGx1Z2luVHlwZTogc3RyaW5nO1xuICBjb21wdXRlVHlwZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVmVyc2lvbkNvdW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uQ291bnQ6IG51bWJlcjtcbiAgbGF0ZXN0VmVyc2lvbjogc3RyaW5nO1xuICBoYXNEZWZhdWx0OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRUaW1lU2VyaWVzRW50cnkge1xuICBwZXJpb2Q6IHN0cmluZztcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBzdWNjZXNzUGN0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBCdWlsZER1cmF0aW9uIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBhdmdNczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xuICBidWlsZHM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkRmFpbHVyZSB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XG4gIG9jY3VycmVuY2VzOiBudW1iZXI7XG4gIGxhc3RTZWVuOiBzdHJpbmc7XG59XG5cbi8qKiBFdmVudCBwYXlsb2FkIGFjY2VwdGVkIGJ5IGBSZXBvcnRpbmdTZXJ2aWNlLmluZ2VzdEV2ZW50c2AuIE1pcnJvcnMgdGhlIHJvdXRlJ3MgWm9kIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RFdmVudCB7XG4gIHBpcGVsaW5lQXJuOiBzdHJpbmc7XG4gIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB8ICdjb2RlYnVpbGQnIHwgJ3BsdWdpbi1idWlsZCc7XG4gIGV2ZW50VHlwZTogJ1BJUEVMSU5FJyB8ICdTVEFHRScgfCAnQUNUSU9OJyB8ICdCVUlMRCc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBleGVjdXRpb25JZD86IHN0cmluZztcbiAgc3RhZ2VOYW1lPzogc3RyaW5nO1xuICBhY3Rpb25OYW1lPzogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG4gIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICBkdXJhdGlvbk1zPzogbnVtYmVyO1xuICBkZXRhaWw/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENvdW50cyArIHRoZSAocG9zc2libHkgdHJ1bmNhdGVkKSBsaXN0IG9mIHVucmVnaXN0ZXJlZCBBUk5zIHRoZSBjYWxsZXIgY2FuIGxvZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0UmVzdWx0IHtcbiAgaW5zZXJ0ZWQ6IG51bWJlcjtcbiAgc2tpcHBlZDogbnVtYmVyO1xuICB1bnJlZ2lzdGVyZWRBcm5zOiBzdHJpbmdbXTtcbn1cblxuLy8g4pSA4pSA4pSAIFNlcnZpY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUmVhZC1vbmx5IHJlcG9ydGluZyBzZXJ2aWNlIGZvciBwaXBlbGluZSBleGVjdXRpb24gYW5kIHBsdWdpbiBpbnZlbnRvcnkgYWdncmVnYXRpb25zLlxuICogRG9lcyBub3QgZXh0ZW5kIENydWRTZXJ2aWNlIOKAlCByZXBvcnRzIGFyZSBhZ2dyZWdhdGUgcXVlcmllcywgbm90IGVudGl0eSBDUlVELlxuICpcbiAqIEFsbCBxdWVyaWVzIGFyZSBjYWNoZWQgaW4tbWVtb3J5IHRvIGF2b2lkIHJlcGVhdGVkIGV4cGVuc2l2ZSBTUUwgYWdncmVnYXRpb25zOlxuICogLSBJbnZlbnRvcnkgcXVlcmllcyAocGx1Z2luIHN1bW1hcnkvZGlzdHJpYnV0aW9uL3ZlcnNpb25zKTogNSBtaW4gVFRMXG4gKiAtIFRpbWVzZXJpZXMgcXVlcmllcyAoZXhlY3V0aW9uL2J1aWxkIG1ldHJpY3Mgd2l0aCBkYXRlIHJhbmdlcyk6IDIgbWluIFRUTFxuICovXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nU2VydmljZSB7XG5cbiAgLyoqIEludmFsaWRhdGUgYWxsIGNhY2hlZCByZXBvcnRzIGZvciBhbiBvcmcgKGNhbGwgYWZ0ZXIgZXZlbnQgaW5nZXN0KS4gKi9cbiAgYXN5bmMgaW52YWxpZGF0ZU9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgaW52ZW50b3J5Q2FjaGUuaW52YWxpZGF0ZVBhdHRlcm4oYCR7b3JnSWR9OipgKSxcbiAgICAgIHRpbWVzZXJpZXNDYWNoZS5pbnZhbGlkYXRlUGF0dGVybihgJHtvcmdJZH06KmApLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgaW5jb21pbmcgZXZlbnRzIGFnYWluc3QgdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBiYXRjaC1pbnNlcnQgdGhlXG4gICAqIG1hdGNoZWQgb25lcywgYW5kIGludmFsaWRhdGUgcmVwb3J0aW5nIGNhY2hlcyBmb3IgYWZmZWN0ZWQgb3Jncy5cbiAgICogRXZlbnRzIGZvciB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgQVJOcyBhcmUgZHJvcHBlZCAoYW5kIGxvZ2dlZCBhdCBXQVJOXG4gICAqIHdpdGggc2FtcGxlIEFSTnMgc28gYW4gb3BlcmF0b3IgY2FuIHNlZSB3aGVuIEV2ZW50QnJpZGdlIGlzIGRlbGl2ZXJpbmdcbiAgICogZXZlbnRzIGZvciBwaXBlbGluZXMgdGhhdCBoYXZlbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0KS5cbiAgICpcbiAgICogUmV0dXJucyBjb3VudHMgKyBhIHNhbXBsZSBvZiB1bnJlZ2lzdGVyZWQgQVJOcyBmb3Igb2JzZXJ2YWJpbGl0eS5cbiAgICovXG4gIGFzeW5jIGluZ2VzdEV2ZW50cyhldmVudHM6IEluZ2VzdEV2ZW50W10pOiBQcm9taXNlPEluZ2VzdFJlc3VsdD4ge1xuICAgIC8vIE11bHRpLW9yZyBiYXRjaCBpbnNlcnQ6IHRoZSBjYWxsZXIgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgb3JncyB2aWEgdGhlXG4gICAgLy8gcGlwZWxpbmUtcmVnaXN0cnkgbG9va3VwIGJlbG93LCBzbyB0aGUgcm91dGUgbGF5ZXIgTVVTVCBlc3RhYmxpc2ggYVxuICAgIC8vIGBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCAuLi4pYCBzY29wZSBiZWZvcmUgY2FsbGluZ1xuICAgIC8vIHRoaXMgbWV0aG9kLiBVbmRlciBGT1JDRSdkIFJMUywgYSBzaW5nbGUgdHggd2l0aCBgYXBwLm9yZ19pZCA9IDxvbmVcbiAgICAvLyBvcmc+YCBjb3VsZCBvbmx5IHdyaXRlIGV2ZW50cyBmb3IgdGhhdCBvcmc7IGJ5cGFzcyB2aWEgc3lzYWRtaW4gaXNcbiAgICAvLyB0aGUgcmlnaHQgZ2F0ZSBmb3IgdGhpcyBzZXJ2ZXItaW50ZXJuYWwgY3Jvc3MtdGVuYW50IGVuZHBvaW50LiBTZWVcbiAgICAvLyBhcGkvcmVwb3J0aW5nL3NyYy9yb3V0ZXMvZXZlbnQtaW5nZXN0LnRzIGZvciB0aGUgd3JhcHBlci5cbiAgICAvLyBSdW4gaW5zZXJ0IGluc2lkZSB0aGUgdHgsIGJ1dCBDT0xMRUNUIGFmZmVjdGVkIG9yZ3MgYW5kIGludmFsaWRhdGVcbiAgICAvLyBjYWNoZXMgQUZURVIgdGhlIHR4IHJlc29sdmVzLiBLZWVwaW5nIGludmFsaWRhdGlvbiBpbnNpZGUgdGhlIHR4IGhlbGRcbiAgICAvLyB0aGUgcGcgbG9ja3Mgb3BlbiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjYWNoZSByb3VuZC10cmlwcyAoUmVkaXMgb3JcbiAgICAvLyBpbi1tZW1vcnkgaW52YWxpZGF0aW9ucyBhcmUgdW5yZWxhdGVkIHRvIHRoZSB0eCBidXQgc3RpbGwgc2VyaWFsaXplZFxuICAgIC8vIGl0cyBjb21taXQpLiBDYWNoZSBUVEwgaXMgMi01IG1pbiBzbyBmaXJlLWFuZC1mb3JnZXQgcG9zdC1jb21taXQgaXNcbiAgICAvLyBhbiBhY2NlcHRhYmxlIHRyYWRlIGZvciB0aWdodGVyIGxvY2sgd2luZG93cy5cbiAgICBjb25zdCB7IGluc2VydGVkLCBza2lwcGVkLCB1bnJlZ2lzdGVyZWRBcm5zLCBhZmZlY3RlZE9yZ3MgfSA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIC8vIEJhdGNoLXJlc29sdmUgYWxsIHVuaXF1ZSBBUk5zIGluIG9uZSBxdWVyeVxuICAgICAgY29uc3QgdW5pcXVlQXJucyA9IFsuLi5uZXcgU2V0KGV2ZW50cy5tYXAoZSA9PiBlLnBpcGVsaW5lQXJuKSldO1xuICAgICAgY29uc3QgcmVnaXN0cnlSb3dzID0gYXdhaXQgdHhcbiAgICAgICAgLnNlbGVjdCh7XG4gICAgICAgICAgcGlwZWxpbmVJZDogc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkucGlwZWxpbmVJZCxcbiAgICAgICAgICBvcmdJZDogc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkub3JnSWQsXG4gICAgICAgICAgcGlwZWxpbmVBcm46IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5LnBpcGVsaW5lQXJuLFxuICAgICAgICB9KVxuICAgICAgICAuZnJvbShzY2hlbWEucGlwZWxpbmVSZWdpc3RyeSlcbiAgICAgICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkucGlwZWxpbmVBcm4sIHVuaXF1ZUFybnMpKTtcblxuICAgICAgY29uc3QgYXJuTWFwID0gbmV3IE1hcChyZWdpc3RyeVJvd3MubWFwKHIgPT4gW3IucGlwZWxpbmVBcm4sIHJdKSk7XG5cbiAgICAgIC8vIEJ1aWxkIGluc2VydCBiYXRjaCAoc2tpcCB1bnJlZ2lzdGVyZWQgQVJOcylcbiAgICAgIGNvbnN0IHJvd3M6IEFycmF5PHR5cGVvZiBzY2hlbWEucGlwZWxpbmVFdmVudC4kaW5mZXJJbnNlcnQ+ID0gW107XG4gICAgICBsZXQgc2tpcHBlZExvY2FsID0gMDtcbiAgICAgIGNvbnN0IHVucmVnaXN0ZXJlZEFybnNMb2NhbDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgICAgY29uc3QgcmVnaXN0cnkgPSBhcm5NYXAuZ2V0KGV2ZW50LnBpcGVsaW5lQXJuKTtcbiAgICAgICAgaWYgKCFyZWdpc3RyeSkge1xuICAgICAgICAgIHNraXBwZWRMb2NhbCsrO1xuICAgICAgICAgIHVucmVnaXN0ZXJlZEFybnNMb2NhbC5wdXNoKGV2ZW50LnBpcGVsaW5lQXJuKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgcGlwZWxpbmVJZDogcmVnaXN0cnkucGlwZWxpbmVJZCxcbiAgICAgICAgICBvcmdJZDogcmVnaXN0cnkub3JnSWQsXG4gICAgICAgICAgZXZlbnRTb3VyY2U6IGV2ZW50LmV2ZW50U291cmNlLFxuICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICAgIHN0YXR1czogZXZlbnQuc3RhdHVzLFxuICAgICAgICAgIHBpcGVsaW5lQXJuOiBoYXNoQWNjb3VudEluQXJuKGV2ZW50LnBpcGVsaW5lQXJuKSxcbiAgICAgICAgICBleGVjdXRpb25JZDogZXZlbnQuZXhlY3V0aW9uSWQsXG4gICAgICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICAgICAgYWN0aW9uTmFtZTogZXZlbnQuYWN0aW9uTmFtZSxcbiAgICAgICAgICBzdGFydGVkQXQ6IGV2ZW50LnN0YXJ0ZWRBdCA/IG5ldyBEYXRlKGV2ZW50LnN0YXJ0ZWRBdCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29tcGxldGVkQXQ6IGV2ZW50LmNvbXBsZXRlZEF0ID8gbmV3IERhdGUoZXZlbnQuY29tcGxldGVkQXQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGR1cmF0aW9uTXM6IGV2ZW50LmR1cmF0aW9uTXMsXG4gICAgICAgICAgZGV0YWlsOiBldmVudC5kZXRhaWwsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAocm93cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHR4Lmluc2VydChzY2hlbWEucGlwZWxpbmVFdmVudCkudmFsdWVzKHJvd3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbnNlcnRlZDogcm93cy5sZW5ndGgsXG4gICAgICAgIHNraXBwZWQ6IHNraXBwZWRMb2NhbCxcbiAgICAgICAgdW5yZWdpc3RlcmVkQXJuczogdW5yZWdpc3RlcmVkQXJuc0xvY2FsLFxuICAgICAgICBhZmZlY3RlZE9yZ3M6IFsuLi5uZXcgU2V0KHJvd3MubWFwKHIgPT4gci5vcmdJZCkpXSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBQb3N0LWNvbW1pdCBjYWNoZSBpbnZhbGlkYXRpb24uIEZpcmUtYW5kLWZvcmdldCB3aXRoIGxvZ2dpbmcg4oCUIFRUTCBpc1xuICAgIC8vIHNob3J0IGVub3VnaCB0aGF0IGEgbWlzc2VkIGludmFsaWRhdGlvbiBzZWxmLWhlYWxzLlxuICAgIGlmIChhZmZlY3RlZE9yZ3MubGVuZ3RoID4gMCkge1xuICAgICAgdm9pZCBQcm9taXNlLmFsbChhZmZlY3RlZE9yZ3MubWFwKChvcmcpID0+XG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZU9yZyhvcmcpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkOiBvcmcsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgICAgfSksXG4gICAgICApKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBpbnNlcnRlZCwgc2tpcHBlZCwgdW5yZWdpc3RlcmVkQXJucyB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIENhdGVnb3J5IDE6IFBpcGVsaW5lIEV4ZWN1dGlvbiAmIFBlcmZvcm1hbmNlIOKUgOKUgFxuXG4gIC8qKiAxLjEgRXhlY3V0aW9uIGNvdW50IHBlciBwaXBlbGluZSB3aXRoIHN0YXR1cyBicmVha2Rvd24uICovXG4gIGFzeW5jIGdldEV4ZWN1dGlvbkNvdW50KG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPEV4ZWN1dGlvbkNvdW50W10+IHtcbiAgICByZXR1cm4gdGltZXNlcmllc0NhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpleGVjLWNvdW50YCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnByb2plY3QsIHAub3JnYW5pemF0aW9uLCBwLnBpcGVsaW5lX25hbWUsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdDQU5DRUxFRCcpOjppbnQgQVMgY2FuY2VsZWQsXG4gICAgICAgICAgTUlOKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgZmlyc3RfZXhlY3V0aW9uLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3RfZXhlY3V0aW9uXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmV9IHBcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlIE9OIGUucGlwZWxpbmVfaWQgPSBwLmlkXG4gICAgICAgICAgQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzICE9ICdTVEFSVEVEJ1xuICAgICAgICBXSEVSRSBwLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBwLmlzX2FjdGl2ZSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgcC5pZFxuICAgICAgICBPUkRFUiBCWSB0b3RhbCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RXhlY3V0aW9uQ291bnQ+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDEuMiBTdWNjZXNzIHJhdGUgb3ZlciB0aW1lIGZvciBhbiBvcmcuICovXG4gIGFzeW5jIGdldFN1Y2Nlc3NSYXRlKG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IFByb21pc2U8VGltZVNlcmllc0VudHJ5W10+IHtcbiAgICByZXR1cm4gdGltZXNlcmllc0NhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpzdWNjZXNzLXJhdGU6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfWAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgREFURV9UUlVOQygke2ludGVydmFsfSwgZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORSdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJylcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUaW1lU2VyaWVzRW50cnk+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDEuMyBBdmVyYWdlIGR1cmF0aW9uIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0QXZlcmFnZUR1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IFByb21pc2U8RHVyYXRpb25TdGF0c1tdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06YXZnLWR1cmF0aW9uOiR7ZnJvbX06JHt0b31gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucHJvamVjdCwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNSU4oZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtaW5fbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zLFxuICAgICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjk1KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGUuZHVyYXRpb25fbXMpOjppbnQgQVMgcDk1X21zLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgZXhlY3V0aW9uc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwLmlkIE9SREVSIEJZIGF2Z19tcyBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RHVyYXRpb25TdGF0cz4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogMS41IFN0YWdlIGZhaWx1cmUgaGVhdG1hcCDigJQgd2hpY2ggc3RhZ2VzIGZhaWwgbW9zdC4gKi9cbiAgYXN5bmMgZ2V0U3RhZ2VGYWlsdXJlcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiBQcm9taXNlPFN0YWdlRmFpbHVyZVtdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06c3RhZ2UtZmFpbHVyZXM6JHtmcm9tfToke3RvfWAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhZ2VfbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5zdGFnZV9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUZhaWx1cmU+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDEuNiBTdGFnZSBib3R0bGVuZWNrcyDigJQgc2xvd2VzdCBzdGFnZXMgcGVyIHBpcGVsaW5lLiAqL1xuICBhc3luYyBnZXRTdGFnZUJvdHRsZW5lY2tzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IFByb21pc2U8U3RhZ2VCb3R0bGVuZWNrW10+IHtcbiAgICByZXR1cm4gdGltZXNlcmllc0NhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpzdGFnZS1ib3R0bGVuZWNrczoke2Zyb219OiR7dG99YCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnBpcGVsaW5lX25hbWUsIGUuc3RhZ2VfbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHAuaWQsIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFN0YWdlQm90dGxlbmVjaz4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogMS43IEFjdGlvbiBmYWlsdXJlIHJhdGUg4oCUIHdoaWNoIHBsdWdpbiBzdGVwcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldEFjdGlvbkZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IFByb21pc2U8QWN0aW9uRmFpbHVyZVtdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06YWN0aW9uLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuYWN0aW9uX25hbWUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWx1cmVzLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgZmFpbHVyZV9wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5ldmVudF90eXBlID0gJ0FDVElPTicgQU5EIGUuYWN0aW9uX25hbWUgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGUuYWN0aW9uX25hbWUgT1JERVIgQlkgZmFpbHVyZXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEFjdGlvbkZhaWx1cmU+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDEuOCBFcnJvciBjYXRlZ29yaXphdGlvbiDigJQgZ3JvdXAgZmFpbHVyZSBtZXNzYWdlcy4gKi9cbiAgYXN5bmMgZ2V0RXJyb3JzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDIwKTogUHJvbWlzZTxFcnJvckVudHJ5W10+IHtcbiAgICByZXR1cm4gdGltZXNlcmllc0NhY2hlLmdldE9yU2V0KGAke29yZ0lkfTplcnJvcnM6JHtmcm9tfToke3RvfToke2xpbWl0fWAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgU1VCU1RSSU5HKGUuZXJyb3JfbWVzc2FnZSBGUk9NIDEgRk9SIDIwMCkgQVMgZXJyb3JfcGF0dGVybixcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIENPVU5UKERJU1RJTkNUIGUucGlwZWxpbmVfaWQpOjppbnQgQVMgYWZmZWN0ZWRfcGlwZWxpbmVzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnIEFORCBlLmVycm9yX21lc3NhZ2UgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGVycm9yX3BhdHRlcm4gT1JERVIgQlkgb2NjdXJyZW5jZXMgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEVycm9yRW50cnk+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLy8g4pSA4pSAIENhdGVnb3J5IDI6IFBsdWdpbiBJbnZlbnRvcnkgJiBCdWlsZHMg4pSA4pSAXG5cbiAgLyoqIDIuMSBQbHVnaW4gc3VtbWFyeSDigJQgY291bnRzIGFuZCBicmVha2Rvd25zLiAqL1xuICBhc3luYyBnZXRQbHVnaW5TdW1tYXJ5KG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFBsdWdpblN1bW1hcnk+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi1zdW1tYXJ5YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSk6OmludCBBUyBhY3RpdmUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBOT1QgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSk6OmludCBBUyBpbmFjdGl2ZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5hY2Nlc3NNb2RpZmllcn0gPSAncHVibGljJyk6OmludCBBUyBwdWJsaWMsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4uYWNjZXNzTW9kaWZpZXJ9ID0gJ3ByaXZhdGUnKTo6aW50IEFTIHByaXZhdGUsXG4gICAgICAgICAgQ09VTlQoRElTVElOQ1QgJHtzY2hlbWEucGx1Z2luLm5hbWV9KTo6aW50IEFTIHVuaXF1ZV9uYW1lc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9XG4gICAgICBgKSk7XG4gICAgICByZXR1cm4gKGRyaXp6bGVSb3dzPFBsdWdpblN1bW1hcnk+KHJvd3Mucm93cylbMF0gfHwgeyB0b3RhbDogMCwgYWN0aXZlOiAwLCBpbmFjdGl2ZTogMCwgcHVibGljOiAwLCBwcml2YXRlOiAwLCB1bmlxdWVOYW1lczogMCB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiAyLjIgVHlwZSAmIGNvbXB1dGUgZGlzdHJpYnV0aW9uLiAqL1xuICBhc3luYyBnZXRQbHVnaW5EaXN0cmlidXRpb24ob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8VHlwZUNvbXB1dGVEaXN0cmlidXRpb25bXT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLWRpc3RyaWJ1dGlvbmAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLnBsdWdpblR5cGV9IEFTIHBsdWdpbl90eXBlLFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5jb21wdXRlVHlwZX0gQVMgY29tcHV0ZV90eXBlLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgY291bnRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfSBBTkQgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgJHtzY2hlbWEucGx1Z2luLnBsdWdpblR5cGV9LCAke3NjaGVtYS5wbHVnaW4uY29tcHV0ZVR5cGV9XG4gICAgICAgIE9SREVSIEJZIGNvdW50IERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbj4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogMi4zIFZlcnNpb24gY291bnRzIHBlciBwbHVnaW4gbmFtZS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luVmVyc2lvbnMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8VmVyc2lvbkNvdW50W10+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi12ZXJzaW9uc2AsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLm5hbWV9LFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdmVyc2lvbl9jb3VudCxcbiAgICAgICAgICBNQVgoJHtzY2hlbWEucGx1Z2luLnZlcnNpb259KSBBUyBsYXRlc3RfdmVyc2lvbixcbiAgICAgICAgICBib29sX29yKCR7c2NoZW1hLnBsdWdpbi5pc0RlZmF1bHR9KSBBUyBoYXNfZGVmYXVsdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9IEFORCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9ID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSAke3NjaGVtYS5wbHVnaW4ubmFtZX1cbiAgICAgICAgT1JERVIgQlkgdmVyc2lvbl9jb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VmVyc2lvbkNvdW50PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAyLjQgQnVpbGQgc3VjY2VzcyByYXRlIG92ZXIgdGltZS5cbiAgICpcbiAgICogU1RBVFVTIENBU0lORyBOT1RFOiBUaGlzIHF1ZXJ5IGZpbHRlcnMgYnkgYGV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnYFxuICAgKiBhbmQgdXNlcyBsb3dlcmNhc2Ugc3RhdHVzIHZhbHVlcyAoYCdjb21wbGV0ZWQnYCwgYCdmYWlsZWQnYCksIHdoaWxlXG4gICAqIGBnZXRTdWNjZXNzUmF0ZWAgKDEuMikgZmlsdGVycyBieSBgZXZlbnRfdHlwZSA9ICdQSVBFTElORSdgIHdpdGhcbiAgICogdXBwZXJjYXNlIEFXUy1zdHlsZSBzdGF0dXNlcyAoYCdTVUNDRUVERUQnYCwgYCdGQUlMRUQnYCwgYCdDQU5DRUxFRCdgKS5cbiAgICogVGhlIGNhc2luZyBkcmlmdCBpcyBpbnRlbnRpb25hbCBhbmQgdHJhY2tzIHRoZSBwcm9kdWNlcjpcbiAgICogICAtIGBwbHVnaW4tYnVpbGRgIGV2ZW50cyBjb21lIGZyb20gb3VyIG93biBidWlsZCBwaXBlbGluZSAobG93ZXJjYXNlKVxuICAgKiAgIC0gYFBJUEVMSU5FYCBldmVudHMgY29tZSBmcm9tIEFXUyBDb2RlUGlwZWxpbmUgKHVwcGVyY2FzZSlcbiAgICogVGhlIGluZ2VzdCBab2Qgc2NoZW1hIGF0IGFwaS9yZXBvcnRpbmcvc3JjL3JvdXRlcy9ldmVudC1pbmdlc3QudHNcbiAgICogU0hPVUxEIGVudW0gdGhlc2UgcGVyLWV2ZW50U291cmNlIHNvIHdlIGNhdGNoIGRyaWZ0IGF0IGluZ2VzdCByYXRoZXJcbiAgICogdGhhbiBzaWxlbnRseSBwcm9kdWNpbmcgemVybyByb3dzIGhlcmUuIFNlZSBmaW5kaW5ncyBONzEuXG4gICAqL1xuICBhc3luYyBnZXRCdWlsZFN1Y2Nlc3NSYXRlKG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IFByb21pc2U8QnVpbGRUaW1lU2VyaWVzRW50cnlbXT4ge1xuICAgIHJldHVybiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OmJ1aWxkLXN1Y2Nlc3M6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfWAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgREFURV9UUlVOQygke2ludGVydmFsfSwgZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2ZhaWxlZCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnY29tcGxldGVkJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnY29tcGxldGVkJywgJ2ZhaWxlZCcpXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwZXJpb2QgT1JERVIgQlkgcGVyaW9kXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8QnVpbGRUaW1lU2VyaWVzRW50cnk+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDIuNSBCdWlsZCBkdXJhdGlvbiBwZXIgcGx1Z2luLiAqL1xuICBhc3luYyBnZXRCdWlsZER1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IFByb21pc2U8QnVpbGREdXJhdGlvbltdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06YnVpbGQtZHVyYXRpb246JHtmcm9tfToke3RvfWAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5kZXRhaWwtPj4ncGx1Z2luTmFtZScgQVMgcGx1Z2luX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGJ1aWxkc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcGx1Z2luX25hbWUgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxCdWlsZER1cmF0aW9uPihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAyLjYgQnVpbGQgZmFpbHVyZXMg4oCUIHRvcCBlcnJvciBtZXNzYWdlcy4gKi9cbiAgYXN5bmMgZ2V0QnVpbGRGYWlsdXJlcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCk6IFByb21pc2U8QnVpbGRGYWlsdXJlW10+IHtcbiAgICByZXR1cm4gdGltZXNlcmllc0NhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpidWlsZC1mYWlsdXJlczoke2Zyb219OiR7dG99OiR7bGltaXR9YCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmRldGFpbC0+PidwbHVnaW5OYW1lJyBBUyBwbHVnaW5fbmFtZSxcbiAgICAgICAgICBlLmVycm9yX21lc3NhZ2UsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBvY2N1cnJlbmNlcyxcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X3NlZW5cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCcgQU5EIGUuc3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBsdWdpbl9uYW1lLCBlLmVycm9yX21lc3NhZ2VcbiAgICAgICAgT1JERVIgQlkgb2NjdXJyZW5jZXMgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEJ1aWxkRmFpbHVyZT4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlcG9ydGluZ1NlcnZpY2UgPSBuZXcgUmVwb3J0aW5nU2VydmljZSgpO1xuIl19
@@ -155,6 +155,16 @@ export interface MessageFilter extends CommonFilter {
155
155
  * exactly; pass null to match channel IS NULL (org-to-org messages).
156
156
  */
157
157
  readonly channel?: string | null;
158
+ /**
159
+ * Filter by read state for the requesting org.
160
+ * Implemented as a JSONB key-existence check against `messages.read_by`
161
+ * (a `{ [orgId]: isoTimestamp }` map), using the orgId passed to
162
+ * `buildMessageConditions`.
163
+ * - true → only messages the org has read (orgId key exists in read_by)
164
+ * - false → only messages the org has NOT read
165
+ * - undefined → no read-state filter
166
+ */
167
+ readonly isRead?: boolean;
158
168
  }
159
169
  /**
160
170
  * Filter for compliance policies.
@@ -23,4 +23,4 @@ function validateMessageFilter(filter) {
23
23
  }
24
24
  return { valid: errors.length === 0, errors };
25
25
  }
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZmlsdGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3F1ZXJ5LWZpbHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBc1F0QyxzREFvQkM7QUF4QkQ7OztHQUdHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsTUFBOEI7SUFJbEUsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBRTVCLElBQUksTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUN6RixNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixNQUFNLENBQUMsV0FBVyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQy9FLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLE1BQU0sQ0FBQyxRQUFRLDBDQUEwQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3JHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbEcsTUFBTSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQWNjZXNzTW9kaWZpZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5cbi8qKlxuICogQmFzZSBmaWx0ZXIgaW50ZXJmYWNlIGNvbnRhaW5pbmcgY29tbW9uIGZpbHRlciBwcm9wZXJ0aWVzIHNoYXJlZCBhY3Jvc3MgYWxsIGVudGl0eSB0eXBlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmlsdGVyOiBDb21tb25GaWx0ZXIgPSB7XG4gKiAgIGlkOiAnMTIzJyxcbiAqICAgb3JnSWQ6ICdteS1vcmcnLFxuICogICBhY2Nlc3NNb2RpZmllcjogQWNjZXNzTW9kaWZpZXIuUFVCTElDLFxuICogICBpc0RlZmF1bHQ6IHRydWUsXG4gKiAgIGlzQWN0aXZlOiB0cnVlXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uRmlsdGVyIHtcbiAgLyoqXG4gICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW50aXR5XG4gICAqIENhbiBiZSBhIHNpbmdsZSBJRCBvciBhcnJheSBvZiBJRHMgZm9yIGJhdGNoIGZpbHRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKipcbiAgICogT3JnYW5pemF0aW9uIGlkZW50aWZpZXIgdG8gZmlsdGVyIGVudGl0aWVzIGJ5IG9yZ2FuaXphdGlvblxuICAgKiBDYW4gYmUgYSBzaW5nbGUgb3JnIElEIG9yIGFycmF5IGZvciBtdWx0aS1vcmcgZmlsdGVyaW5nXG4gICAqL1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBY2Nlc3MgbW9kaWZpZXIgdG8gZmlsdGVyIGJ5IHZpc2liaWxpdHkvcGVybWlzc2lvbnNcbiAgICogVXNlIEFjY2Vzc01vZGlmaWVyIGVudW0gZm9yIHR5cGUgc2FmZXR5XG4gICAqIEBzZWUgQWNjZXNzTW9kaWZpZXJcbiAgICovXG4gIHJlYWRvbmx5IGFjY2Vzc01vZGlmaWVyPzogQWNjZXNzTW9kaWZpZXIgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBkZWZhdWx0IHN0YXR1c1xuICAgKiAtIHRydWU6IE9ubHkgZGVmYXVsdCBlbnRpdGllc1xuICAgKiAtIGZhbHNlOiBPbmx5IG5vbi1kZWZhdWx0IGVudGl0aWVzXG4gICAqIC0gdW5kZWZpbmVkOiBBbGwgZW50aXRpZXNcbiAgICovXG4gIHJlYWRvbmx5IGlzRGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhY3RpdmUvaW5hY3RpdmUgc3RhdHVzXG4gICAqIC0gdHJ1ZTogT25seSBhY3RpdmUgZW50aXRpZXNcbiAgICogLSBmYWxzZTogT25seSBpbmFjdGl2ZSBlbnRpdGllc1xuICAgKiAtIHVuZGVmaW5lZDogQWxsIGVudGl0aWVzXG4gICAqL1xuICByZWFkb25seSBpc0FjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiByZXN1bHRzIHRvIHJldHVyblxuICAgKiBAbWluaW11bSAxXG4gICAqIEBtYXhpbXVtIDEwMDBcbiAgICovXG4gIHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcmVzdWx0cyB0byBza2lwIChmb3IgcGFnaW5hdGlvbilcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTb3J0IGZpZWxkIGFuZCBkaXJlY3Rpb25cbiAgICogQGV4YW1wbGUgXCJuYW1lOmFzY1wiLCBcImNyZWF0ZWRBdDpkZXNjXCJcbiAgICovXG4gIHJlYWRvbmx5IHNvcnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsdGVyIGludGVyZmFjZSBmb3IgcGx1Z2luLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gKiBFeHRlbmRzIENvbW1vbkZpbHRlciB0byBpbmNsdWRlIHBsdWdpbi1yZWxhdGVkIGZpbHRlciBvcHRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmaWx0ZXI6IFBsdWdpbkZpbHRlciA9IHtcbiAqICAgbmFtZTogJ25vZGVqcy1idWlsZCcsXG4gKiAgIHZlcnNpb246ICcxLjAuMCcsXG4gKiAgIGlzQWN0aXZlOiB0cnVlXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRmlsdGVyIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHtcbiAgLyoqXG4gICAqIFBsdWdpbiBuYW1lIHRvIGZpbHRlciBieVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUGx1Z2luIHZlcnNpb24gdG8gZmlsdGVyIGJ5XG4gICAqIFN1cHBvcnRzIHNlbWFudGljIHZlcnNpb25pbmdcbiAgICogQGV4YW1wbGUgXCIxLjAuMFwiLCBcIl4yLjAuMFwiLCBcIn4xLjIuM1wiXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZXl3b3JkIHRvIHNlYXJjaCB3aXRoaW4gdGhlIGtleXdvcmRzIEpTT05CIGFycmF5IChjYXNlLWluc2Vuc2l0aXZlIGNvbnRhaW5zKVxuICAgKi9cbiAgcmVhZG9ubHkga2V5d29yZD86IHN0cmluZztcblxuICAvKipcbiAgICogUGx1Z2luIGNhdGVnb3J5IHRvIGZpbHRlciBieVxuICAgKiBAZXhhbXBsZSBcImxhbmd1YWdlXCIsIFwic2VjdXJpdHlcIiwgXCJ0ZXN0aW5nXCJcbiAgICovXG4gIHJlYWRvbmx5IGNhdGVnb3J5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEZpbHRlciBpbnRlcmZhY2UgZm9yIHBpcGVsaW5lLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gKiBFeHRlbmRzIENvbW1vbkZpbHRlciB0byBpbmNsdWRlIHBpcGVsaW5lLXJlbGF0ZWQgZmlsdGVyIG9wdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZpbHRlcjogUGlwZWxpbmVGaWx0ZXIgPSB7XG4gKiAgIHByb2plY3Q6ICdteS1hcHAnLFxuICogICBvcmdhbml6YXRpb246ICdteS1vcmcnLFxuICogICBwaXBlbGluZU5hbWU6ICdteS1waXBlbGluZScsXG4gKiAgIGlzQWN0aXZlOiB0cnVlXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVGaWx0ZXIgZXh0ZW5kcyBDb21tb25GaWx0ZXIge1xuICAvKipcbiAgICogUHJvamVjdCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9yZ2FuaXphdGlvbiBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUGlwZWxpbmUgbmFtZSB0byBmaWx0ZXIgYnlcbiAgICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogS2V5d29yZCB0byBzZWFyY2ggd2l0aGluIHRoZSBrZXl3b3JkcyBKU09OQiBhcnJheSAoY2FzZS1pbnNlbnNpdGl2ZSBjb250YWlucylcbiAgICovXG4gIHJlYWRvbmx5IGtleXdvcmQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsdGVyIGludGVyZmFjZSBmb3IgbWVzc2FnZS1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICogRXh0ZW5kcyBDb21tb25GaWx0ZXIgdG8gaW5jbHVkZSBtZXNzYWdlLXJlbGF0ZWQgZmlsdGVyIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUZpbHRlciBleHRlbmRzIENvbW1vbkZpbHRlciB7XG4gIC8qKlxuICAgKiBUaHJlYWQgSUQgdG8gZmlsdGVyIGJ5IChmb3IgZmV0Y2hpbmcgdGhyZWFkIHJlcGxpZXMpLlxuICAgKiBQYXNzIGBudWxsYCB0byBmaWx0ZXIgZm9yIHJvb3QgbWVzc2FnZXMgb25seSAodGhyZWFkSWQgSVMgTlVMTCkuXG4gICAqL1xuICByZWFkb25seSB0aHJlYWRJZD86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFJlY2lwaWVudCBvcmdhbml6YXRpb24gSUQgdG8gZmlsdGVyIGJ5XG4gICAqIFVzZSAnKicgZm9yIGJyb2FkY2FzdCBhbm5vdW5jZW1lbnRzXG4gICAqL1xuICByZWFkb25seSByZWNpcGllbnRPcmdJZD86IHN0cmluZztcblxuICAvKipcbiAgICogTWVzc2FnZSB0eXBlIGZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZVR5cGU/OiAnYW5ub3VuY2VtZW50JyB8ICdjb252ZXJzYXRpb24nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgcHJpb3JpdHkgbGV2ZWxcbiAgICovXG4gIHJlYWRvbmx5IHByaW9yaXR5PzogJ25vcm1hbCcgfCAnaGlnaCcgfCAndXJnZW50JztcblxuICAvKipcbiAgICogQ2hhbm5lbC9pbmJveC1idWNrZXQgZmlsdGVyIChlLmcuICdzdXBwb3J0JywgJ2hlbHAnKS4gTWF0Y2hlcyByb3dzXG4gICAqIGV4YWN0bHk7IHBhc3MgbnVsbCB0byBtYXRjaCBjaGFubmVsIElTIE5VTEwgKG9yZy10by1vcmcgbWVzc2FnZXMpLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbXBsaWFuY2UgRmlsdGVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZpbHRlciBmb3IgY29tcGxpYW5jZSBwb2xpY2llcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGlhbmNlUG9saWN5RmlsdGVyIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHtcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgaXNUZW1wbGF0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRmlsdGVyIGZvciBjb21wbGlhbmNlIHJ1bGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsaWFuY2VSdWxlRmlsdGVyIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHtcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcG9saWN5SWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhcmdldD86ICdwbHVnaW4nIHwgJ3BpcGVsaW5lJztcbiAgcmVhZG9ubHkgZmllbGQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNldmVyaXR5PzogJ3dhcm5pbmcnIHwgJ2Vycm9yJyB8ICdjcml0aWNhbCc7XG4gIHJlYWRvbmx5IHNjb3BlPzogJ29yZycgfCAncHVibGlzaGVkJztcbiAgcmVhZG9ubHkgdGFnPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEZpbHRlciBmb3IgY29tcGxpYW5jZSBydWxlIHN1YnNjcmlwdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZVJ1bGVTdWJzY3JpcHRpb25GaWx0ZXIge1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZUlkPzogc3RyaW5nO1xuICByZWFkb25seSBpc0FjdGl2ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xuICByZWFkb25seSBvZmZzZXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRmlsdGVyIGZvciBjb21wbGlhbmNlIGV4ZW1wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZUV4ZW1wdGlvbkZpbHRlciB7XG4gIHJlYWRvbmx5IG9yZ0lkPzogc3RyaW5nO1xuICByZWFkb25seSBydWxlSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudGl0eVR5cGU/OiAncGx1Z2luJyB8ICdwaXBlbGluZSc7XG4gIHJlYWRvbmx5IGVudGl0eUlkPzogc3RyaW5nO1xuICByZWFkb25seSBzdGF0dXM/OiAncGVuZGluZycgfCAnYXBwcm92ZWQnIHwgJ3JlamVjdGVkJyB8ICdleHBpcmVkJztcbiAgcmVhZG9ubHkgbGltaXQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9mZnNldD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgZm9yIGNvbXBsaWFuY2UgYXVkaXQgbG9nIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZUF1ZGl0RmlsdGVyIHtcbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhcmdldD86ICdwbHVnaW4nIHwgJ3BpcGVsaW5lJztcbiAgcmVhZG9ubHkgYWN0aW9uPzogc3RyaW5nO1xuICByZWFkb25seSByZXN1bHQ/OiAncGFzcycgfCAnd2FybicgfCAnYmxvY2snO1xuICByZWFkb25seSBzY2FuSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRhdGVGcm9tPzogc3RyaW5nO1xuICByZWFkb25seSBkYXRlVG8/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xuICByZWFkb25seSBvZmZzZXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRmlsdGVyIGZvciBjb21wbGlhbmNlIHNjYW5zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsaWFuY2VTY2FuRmlsdGVyIHtcbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhcmdldD86ICdwbHVnaW4nIHwgJ3BpcGVsaW5lJyB8ICdhbGwnO1xuICByZWFkb25seSBzdGF0dXM/OiAncGVuZGluZycgfCAncnVubmluZycgfCAnY29tcGxldGVkJyB8ICdmYWlsZWQnIHwgJ2NhbmNlbGxlZCc7XG4gIHJlYWRvbmx5IHRyaWdnZXJlZEJ5PzogJ21hbnVhbCcgfCAnc2NoZWR1bGVkJyB8ICdydWxlLWNoYW5nZScgfCAncnVsZS1kcnktcnVuJztcbiAgcmVhZG9ubHkgbGltaXQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9mZnNldD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgbWVzc2FnZSBmaWx0ZXIgcHJvcGVydGllcy5cbiAqIFJldHVybnMgYSByZXN1bHQgb2JqZWN0IHdpdGggYHZhbGlkYCBmbGFnIGFuZCBgZXJyb3JzYCBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWVzc2FnZUZpbHRlcihmaWx0ZXI6IFBhcnRpYWw8TWVzc2FnZUZpbHRlcj4pOiB7XG4gIHZhbGlkOiBib29sZWFuO1xuICBlcnJvcnM6IHN0cmluZ1tdO1xufSB7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoZmlsdGVyLm1lc3NhZ2VUeXBlICYmICFbJ2Fubm91bmNlbWVudCcsICdjb252ZXJzYXRpb24nXS5pbmNsdWRlcyhmaWx0ZXIubWVzc2FnZVR5cGUpKSB7XG4gICAgZXJyb3JzLnB1c2goYEludmFsaWQgbWVzc2FnZVR5cGU6IFwiJHtmaWx0ZXIubWVzc2FnZVR5cGV9XCIuIE11c3QgYmUgXCJhbm5vdW5jZW1lbnRcIiBvciBcImNvbnZlcnNhdGlvblwiYCk7XG4gIH1cbiAgaWYgKGZpbHRlci5wcmlvcml0eSAmJiAhWydub3JtYWwnLCAnaGlnaCcsICd1cmdlbnQnXS5pbmNsdWRlcyhmaWx0ZXIucHJpb3JpdHkpKSB7XG4gICAgZXJyb3JzLnB1c2goYEludmFsaWQgcHJpb3JpdHk6IFwiJHtmaWx0ZXIucHJpb3JpdHl9XCIuIE11c3QgYmUgXCJub3JtYWxcIiwgXCJoaWdoXCIsIG9yIFwidXJnZW50XCJgKTtcbiAgfVxuICBpZiAoZmlsdGVyLnRocmVhZElkICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyLnRocmVhZElkICE9PSBudWxsICYmIHR5cGVvZiBmaWx0ZXIudGhyZWFkSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgZXJyb3JzLnB1c2goJ3RocmVhZElkIG11c3QgYmUgYSBzdHJpbmcgVVVJRCBvciBudWxsJyk7XG4gIH1cbiAgaWYgKGZpbHRlci5jaGFubmVsICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyLmNoYW5uZWwgIT09IG51bGwgJiYgdHlwZW9mIGZpbHRlci5jaGFubmVsICE9PSAnc3RyaW5nJykge1xuICAgIGVycm9ycy5wdXNoKCdjaGFubmVsIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbCcpO1xuICB9XG5cbiAgcmV0dXJuIHsgdmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsIGVycm9ycyB9O1xufVxuIl19
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZmlsdGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3F1ZXJ5LWZpbHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBaVJ0QyxzREFvQkM7QUF4QkQ7OztHQUdHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsTUFBOEI7SUFJbEUsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBRTVCLElBQUksTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUN6RixNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixNQUFNLENBQUMsV0FBVyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQy9FLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLE1BQU0sQ0FBQyxRQUFRLDBDQUEwQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3JHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbEcsTUFBTSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQWNjZXNzTW9kaWZpZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5cbi8qKlxuICogQmFzZSBmaWx0ZXIgaW50ZXJmYWNlIGNvbnRhaW5pbmcgY29tbW9uIGZpbHRlciBwcm9wZXJ0aWVzIHNoYXJlZCBhY3Jvc3MgYWxsIGVudGl0eSB0eXBlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmlsdGVyOiBDb21tb25GaWx0ZXIgPSB7XG4gKiAgIGlkOiAnMTIzJyxcbiAqICAgb3JnSWQ6ICdteS1vcmcnLFxuICogICBhY2Nlc3NNb2RpZmllcjogQWNjZXNzTW9kaWZpZXIuUFVCTElDLFxuICogICBpc0RlZmF1bHQ6IHRydWUsXG4gKiAgIGlzQWN0aXZlOiB0cnVlXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uRmlsdGVyIHtcbiAgLyoqXG4gICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW50aXR5XG4gICAqIENhbiBiZSBhIHNpbmdsZSBJRCBvciBhcnJheSBvZiBJRHMgZm9yIGJhdGNoIGZpbHRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKipcbiAgICogT3JnYW5pemF0aW9uIGlkZW50aWZpZXIgdG8gZmlsdGVyIGVudGl0aWVzIGJ5IG9yZ2FuaXphdGlvblxuICAgKiBDYW4gYmUgYSBzaW5nbGUgb3JnIElEIG9yIGFycmF5IGZvciBtdWx0aS1vcmcgZmlsdGVyaW5nXG4gICAqL1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBY2Nlc3MgbW9kaWZpZXIgdG8gZmlsdGVyIGJ5IHZpc2liaWxpdHkvcGVybWlzc2lvbnNcbiAgICogVXNlIEFjY2Vzc01vZGlmaWVyIGVudW0gZm9yIHR5cGUgc2FmZXR5XG4gICAqIEBzZWUgQWNjZXNzTW9kaWZpZXJcbiAgICovXG4gIHJlYWRvbmx5IGFjY2Vzc01vZGlmaWVyPzogQWNjZXNzTW9kaWZpZXIgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBkZWZhdWx0IHN0YXR1c1xuICAgKiAtIHRydWU6IE9ubHkgZGVmYXVsdCBlbnRpdGllc1xuICAgKiAtIGZhbHNlOiBPbmx5IG5vbi1kZWZhdWx0IGVudGl0aWVzXG4gICAqIC0gdW5kZWZpbmVkOiBBbGwgZW50aXRpZXNcbiAgICovXG4gIHJlYWRvbmx5IGlzRGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhY3RpdmUvaW5hY3RpdmUgc3RhdHVzXG4gICAqIC0gdHJ1ZTogT25seSBhY3RpdmUgZW50aXRpZXNcbiAgICogLSBmYWxzZTogT25seSBpbmFjdGl2ZSBlbnRpdGllc1xuICAgKiAtIHVuZGVmaW5lZDogQWxsIGVudGl0aWVzXG4gICAqL1xuICByZWFkb25seSBpc0FjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiByZXN1bHRzIHRvIHJldHVyblxuICAgKiBAbWluaW11bSAxXG4gICAqIEBtYXhpbXVtIDEwMDBcbiAgICovXG4gIHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcmVzdWx0cyB0byBza2lwIChmb3IgcGFnaW5hdGlvbilcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTb3J0IGZpZWxkIGFuZCBkaXJlY3Rpb25cbiAgICogQGV4YW1wbGUgXCJuYW1lOmFzY1wiLCBcImNyZWF0ZWRBdDpkZXNjXCJcbiAgICovXG4gIHJlYWRvbmx5IHNvcnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsdGVyIGludGVyZmFjZSBmb3IgcGx1Z2luLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gKiBFeHRlbmRzIENvbW1vbkZpbHRlciB0byBpbmNsdWRlIHBsdWdpbi1yZWxhdGVkIGZpbHRlciBvcHRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmaWx0ZXI6IFBsdWdpbkZpbHRlciA9IHtcbiAqICAgbmFtZTogJ25vZGVqcy1idWlsZCcsXG4gKiAgIHZlcnNpb246ICcxLjAuMCcsXG4gKiAgIGlzQWN0aXZlOiB0cnVlXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRmlsdGVyIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHtcbiAgLyoqXG4gICAqIFBsdWdpbiBuYW1lIHRvIGZpbHRlciBieVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUGx1Z2luIHZlcnNpb24gdG8gZmlsdGVyIGJ5XG4gICAqIFN1cHBvcnRzIHNlbWFudGljIHZlcnNpb25pbmdcbiAgICogQGV4YW1wbGUgXCIxLjAuMFwiLCBcIl4yLjAuMFwiLCBcIn4xLjIuM1wiXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZXl3b3JkIHRvIHNlYXJjaCB3aXRoaW4gdGhlIGtleXdvcmRzIEpTT05CIGFycmF5IChjYXNlLWluc2Vuc2l0aXZlIGNvbnRhaW5zKVxuICAgKi9cbiAgcmVhZG9ubHkga2V5d29yZD86IHN0cmluZztcblxuICAvKipcbiAgICogUGx1Z2luIGNhdGVnb3J5IHRvIGZpbHRlciBieVxuICAgKiBAZXhhbXBsZSBcImxhbmd1YWdlXCIsIFwic2VjdXJpdHlcIiwgXCJ0ZXN0aW5nXCJcbiAgICovXG4gIHJlYWRvbmx5IGNhdGVnb3J5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEZpbHRlciBpbnRlcmZhY2UgZm9yIHBpcGVsaW5lLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gKiBFeHRlbmRzIENvbW1vbkZpbHRlciB0byBpbmNsdWRlIHBpcGVsaW5lLXJlbGF0ZWQgZmlsdGVyIG9wdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZpbHRlcjogUGlwZWxpbmVGaWx0ZXIgPSB7XG4gKiAgIHByb2plY3Q6ICdteS1hcHAnLFxuICogICBvcmdhbml6YXRpb246ICdteS1vcmcnLFxuICogICBwaXBlbGluZU5hbWU6ICdteS1waXBlbGluZScsXG4gKiAgIGlzQWN0aXZlOiB0cnVlXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVGaWx0ZXIgZXh0ZW5kcyBDb21tb25GaWx0ZXIge1xuICAvKipcbiAgICogUHJvamVjdCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9yZ2FuaXphdGlvbiBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUGlwZWxpbmUgbmFtZSB0byBmaWx0ZXIgYnlcbiAgICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogS2V5d29yZCB0byBzZWFyY2ggd2l0aGluIHRoZSBrZXl3b3JkcyBKU09OQiBhcnJheSAoY2FzZS1pbnNlbnNpdGl2ZSBjb250YWlucylcbiAgICovXG4gIHJlYWRvbmx5IGtleXdvcmQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsdGVyIGludGVyZmFjZSBmb3IgbWVzc2FnZS1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICogRXh0ZW5kcyBDb21tb25GaWx0ZXIgdG8gaW5jbHVkZSBtZXNzYWdlLXJlbGF0ZWQgZmlsdGVyIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUZpbHRlciBleHRlbmRzIENvbW1vbkZpbHRlciB7XG4gIC8qKlxuICAgKiBUaHJlYWQgSUQgdG8gZmlsdGVyIGJ5IChmb3IgZmV0Y2hpbmcgdGhyZWFkIHJlcGxpZXMpLlxuICAgKiBQYXNzIGBudWxsYCB0byBmaWx0ZXIgZm9yIHJvb3QgbWVzc2FnZXMgb25seSAodGhyZWFkSWQgSVMgTlVMTCkuXG4gICAqL1xuICByZWFkb25seSB0aHJlYWRJZD86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFJlY2lwaWVudCBvcmdhbml6YXRpb24gSUQgdG8gZmlsdGVyIGJ5XG4gICAqIFVzZSAnKicgZm9yIGJyb2FkY2FzdCBhbm5vdW5jZW1lbnRzXG4gICAqL1xuICByZWFkb25seSByZWNpcGllbnRPcmdJZD86IHN0cmluZztcblxuICAvKipcbiAgICogTWVzc2FnZSB0eXBlIGZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZVR5cGU/OiAnYW5ub3VuY2VtZW50JyB8ICdjb252ZXJzYXRpb24nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgcHJpb3JpdHkgbGV2ZWxcbiAgICovXG4gIHJlYWRvbmx5IHByaW9yaXR5PzogJ25vcm1hbCcgfCAnaGlnaCcgfCAndXJnZW50JztcblxuICAvKipcbiAgICogQ2hhbm5lbC9pbmJveC1idWNrZXQgZmlsdGVyIChlLmcuICdzdXBwb3J0JywgJ2hlbHAnKS4gTWF0Y2hlcyByb3dzXG4gICAqIGV4YWN0bHk7IHBhc3MgbnVsbCB0byBtYXRjaCBjaGFubmVsIElTIE5VTEwgKG9yZy10by1vcmcgbWVzc2FnZXMpLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbD86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSByZWFkIHN0YXRlIGZvciB0aGUgcmVxdWVzdGluZyBvcmcuXG4gICAqIEltcGxlbWVudGVkIGFzIGEgSlNPTkIga2V5LWV4aXN0ZW5jZSBjaGVjayBhZ2FpbnN0IGBtZXNzYWdlcy5yZWFkX2J5YFxuICAgKiAoYSBgeyBbb3JnSWRdOiBpc29UaW1lc3RhbXAgfWAgbWFwKSwgdXNpbmcgdGhlIG9yZ0lkIHBhc3NlZCB0b1xuICAgKiBgYnVpbGRNZXNzYWdlQ29uZGl0aW9uc2AuXG4gICAqIC0gdHJ1ZSAg4oaSIG9ubHkgbWVzc2FnZXMgdGhlIG9yZyBoYXMgcmVhZCAob3JnSWQga2V5IGV4aXN0cyBpbiByZWFkX2J5KVxuICAgKiAtIGZhbHNlIOKGkiBvbmx5IG1lc3NhZ2VzIHRoZSBvcmcgaGFzIE5PVCByZWFkXG4gICAqIC0gdW5kZWZpbmVkIOKGkiBubyByZWFkLXN0YXRlIGZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgaXNSZWFkPzogYm9vbGVhbjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29tcGxpYW5jZSBGaWx0ZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRmlsdGVyIGZvciBjb21wbGlhbmNlIHBvbGljaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsaWFuY2VQb2xpY3lGaWx0ZXIgZXh0ZW5kcyBDb21tb25GaWx0ZXIge1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBpc1RlbXBsYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgZm9yIGNvbXBsaWFuY2UgcnVsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZVJ1bGVGaWx0ZXIgZXh0ZW5kcyBDb21tb25GaWx0ZXIge1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBwb2xpY3lJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgdGFyZ2V0PzogJ3BsdWdpbicgfCAncGlwZWxpbmUnO1xuICByZWFkb25seSBmaWVsZD86IHN0cmluZztcbiAgcmVhZG9ubHkgc2V2ZXJpdHk/OiAnd2FybmluZycgfCAnZXJyb3InIHwgJ2NyaXRpY2FsJztcbiAgcmVhZG9ubHkgc2NvcGU/OiAnb3JnJyB8ICdwdWJsaXNoZWQnO1xuICByZWFkb25seSB0YWc/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsdGVyIGZvciBjb21wbGlhbmNlIHJ1bGUgc3Vic2NyaXB0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbkZpbHRlciB7XG4gIHJlYWRvbmx5IG9yZ0lkPzogc3RyaW5nO1xuICByZWFkb25seSBydWxlSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlzQWN0aXZlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbGltaXQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9mZnNldD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgZm9yIGNvbXBsaWFuY2UgZXhlbXB0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGlhbmNlRXhlbXB0aW9uRmlsdGVyIHtcbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bGVJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZW50aXR5VHlwZT86ICdwbHVnaW4nIHwgJ3BpcGVsaW5lJztcbiAgcmVhZG9ubHkgZW50aXR5SWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXR1cz86ICdwZW5kaW5nJyB8ICdhcHByb3ZlZCcgfCAncmVqZWN0ZWQnIHwgJ2V4cGlyZWQnO1xuICByZWFkb25seSBsaW1pdD86IG51bWJlcjtcbiAgcmVhZG9ubHkgb2Zmc2V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZpbHRlciBmb3IgY29tcGxpYW5jZSBhdWRpdCBsb2cgZW50cmllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGlhbmNlQXVkaXRGaWx0ZXIge1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgdGFyZ2V0PzogJ3BsdWdpbicgfCAncGlwZWxpbmUnO1xuICByZWFkb25seSBhY3Rpb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc3VsdD86ICdwYXNzJyB8ICd3YXJuJyB8ICdibG9jayc7XG4gIHJlYWRvbmx5IHNjYW5JZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZGF0ZUZyb20/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRhdGVUbz86IHN0cmluZztcbiAgcmVhZG9ubHkgbGltaXQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9mZnNldD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgZm9yIGNvbXBsaWFuY2Ugc2NhbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZVNjYW5GaWx0ZXIge1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgdGFyZ2V0PzogJ3BsdWdpbicgfCAncGlwZWxpbmUnIHwgJ2FsbCc7XG4gIHJlYWRvbmx5IHN0YXR1cz86ICdwZW5kaW5nJyB8ICdydW5uaW5nJyB8ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCcgfCAnY2FuY2VsbGVkJztcbiAgcmVhZG9ubHkgdHJpZ2dlcmVkQnk/OiAnbWFudWFsJyB8ICdzY2hlZHVsZWQnIHwgJ3J1bGUtY2hhbmdlJyB8ICdydWxlLWRyeS1ydW4nO1xuICByZWFkb25seSBsaW1pdD86IG51bWJlcjtcbiAgcmVhZG9ubHkgb2Zmc2V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBtZXNzYWdlIGZpbHRlciBwcm9wZXJ0aWVzLlxuICogUmV0dXJucyBhIHJlc3VsdCBvYmplY3Qgd2l0aCBgdmFsaWRgIGZsYWcgYW5kIGBlcnJvcnNgIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNZXNzYWdlRmlsdGVyKGZpbHRlcjogUGFydGlhbDxNZXNzYWdlRmlsdGVyPik6IHtcbiAgdmFsaWQ6IGJvb2xlYW47XG4gIGVycm9yczogc3RyaW5nW107XG59IHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChmaWx0ZXIubWVzc2FnZVR5cGUgJiYgIVsnYW5ub3VuY2VtZW50JywgJ2NvbnZlcnNhdGlvbiddLmluY2x1ZGVzKGZpbHRlci5tZXNzYWdlVHlwZSkpIHtcbiAgICBlcnJvcnMucHVzaChgSW52YWxpZCBtZXNzYWdlVHlwZTogXCIke2ZpbHRlci5tZXNzYWdlVHlwZX1cIi4gTXVzdCBiZSBcImFubm91bmNlbWVudFwiIG9yIFwiY29udmVyc2F0aW9uXCJgKTtcbiAgfVxuICBpZiAoZmlsdGVyLnByaW9yaXR5ICYmICFbJ25vcm1hbCcsICdoaWdoJywgJ3VyZ2VudCddLmluY2x1ZGVzKGZpbHRlci5wcmlvcml0eSkpIHtcbiAgICBlcnJvcnMucHVzaChgSW52YWxpZCBwcmlvcml0eTogXCIke2ZpbHRlci5wcmlvcml0eX1cIi4gTXVzdCBiZSBcIm5vcm1hbFwiLCBcImhpZ2hcIiwgb3IgXCJ1cmdlbnRcImApO1xuICB9XG4gIGlmIChmaWx0ZXIudGhyZWFkSWQgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIudGhyZWFkSWQgIT09IG51bGwgJiYgdHlwZW9mIGZpbHRlci50aHJlYWRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICBlcnJvcnMucHVzaCgndGhyZWFkSWQgbXVzdCBiZSBhIHN0cmluZyBVVUlEIG9yIG51bGwnKTtcbiAgfVxuICBpZiAoZmlsdGVyLmNoYW5uZWwgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIuY2hhbm5lbCAhPT0gbnVsbCAmJiB0eXBlb2YgZmlsdGVyLmNoYW5uZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgZXJyb3JzLnB1c2goJ2NoYW5uZWwgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsJyk7XG4gIH1cblxuICByZXR1cm4geyB2YWxpZDogZXJyb3JzLmxlbmd0aCA9PT0gMCwgZXJyb3JzIH07XG59XG4iXX0=
@@ -3739,6 +3739,23 @@ export declare const complianceScan: import("drizzle-orm/pg-core").PgTableWithCo
3739
3739
  identity: undefined;
3740
3740
  generated: undefined;
3741
3741
  }, {}, {}>;
3742
+ truncated: import("drizzle-orm/pg-core").PgColumn<{
3743
+ name: "truncated";
3744
+ tableName: "compliance_scans";
3745
+ dataType: "boolean";
3746
+ columnType: "PgBoolean";
3747
+ data: boolean;
3748
+ driverParam: boolean;
3749
+ notNull: true;
3750
+ hasDefault: true;
3751
+ isPrimaryKey: false;
3752
+ isAutoincrement: false;
3753
+ hasRuntimeDefault: false;
3754
+ enumValues: undefined;
3755
+ baseColumn: never;
3756
+ identity: undefined;
3757
+ generated: undefined;
3758
+ }, {}, {}>;
3742
3759
  startedAt: import("drizzle-orm/pg-core").PgColumn<{
3743
3760
  name: "started_at";
3744
3761
  tableName: "compliance_scans";
@@ -10608,6 +10625,23 @@ export declare const schema: {
10608
10625
  identity: undefined;
10609
10626
  generated: undefined;
10610
10627
  }, {}, {}>;
10628
+ truncated: import("drizzle-orm/pg-core").PgColumn<{
10629
+ name: "truncated";
10630
+ tableName: "compliance_scans";
10631
+ dataType: "boolean";
10632
+ columnType: "PgBoolean";
10633
+ data: boolean;
10634
+ driverParam: boolean;
10635
+ notNull: true;
10636
+ hasDefault: true;
10637
+ isPrimaryKey: false;
10638
+ isAutoincrement: false;
10639
+ hasRuntimeDefault: false;
10640
+ enumValues: undefined;
10641
+ baseColumn: never;
10642
+ identity: undefined;
10643
+ generated: undefined;
10644
+ }, {}, {}>;
10611
10645
  startedAt: import("drizzle-orm/pg-core").PgColumn<{
10612
10646
  name: "started_at";
10613
10647
  tableName: "compliance_scans";