@pipeline-builder/pipeline-data 4.1.23 → 4.1.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/lib/api/alert-destinations.d.ts +17 -0
  2. package/lib/api/alert-destinations.js +36 -0
  3. package/lib/api/reporting/analytics-queries.d.ts +274 -0
  4. package/lib/api/reporting/analytics-queries.js +598 -0
  5. package/lib/api/reporting/daily-rollup.d.ts +41 -0
  6. package/lib/api/reporting/daily-rollup.js +173 -0
  7. package/lib/api/reporting/deploy-rollup.d.ts +78 -0
  8. package/lib/api/reporting/deploy-rollup.js +203 -0
  9. package/lib/api/reporting/dora-scoring.d.ts +14 -0
  10. package/lib/api/reporting/dora-scoring.js +25 -1
  11. package/lib/api/reporting/dora.js +30 -6
  12. package/lib/api/reporting/failure-classifier.d.ts +54 -0
  13. package/lib/api/reporting/failure-classifier.js +179 -0
  14. package/lib/api/reporting/ingest.d.ts +2 -2
  15. package/lib/api/reporting/ingest.js +129 -4
  16. package/lib/api/reporting/last-deploy.d.ts +31 -0
  17. package/lib/api/reporting/last-deploy.js +93 -0
  18. package/lib/api/reporting/needs-attention.d.ts +93 -0
  19. package/lib/api/reporting/needs-attention.js +152 -0
  20. package/lib/api/reporting/plugin-exposure.d.ts +129 -0
  21. package/lib/api/reporting/plugin-exposure.js +312 -0
  22. package/lib/api/reporting/retention-sweep.js +9 -1
  23. package/lib/api/reporting/sql-helpers.d.ts +35 -2
  24. package/lib/api/reporting/sql-helpers.js +39 -1
  25. package/lib/api/reporting/stakeholder/compose.d.ts +115 -0
  26. package/lib/api/reporting/stakeholder/compose.js +234 -0
  27. package/lib/api/reporting/stakeholder/index.d.ts +14 -0
  28. package/lib/api/reporting/stakeholder/index.js +17 -0
  29. package/lib/api/reporting/stakeholder/period.d.ts +102 -0
  30. package/lib/api/reporting/stakeholder/period.js +273 -0
  31. package/lib/api/reporting/stakeholder/report-html.d.ts +93 -0
  32. package/lib/api/reporting/stakeholder/report-html.js +208 -0
  33. package/lib/api/reporting/stakeholder/sections.d.ts +117 -0
  34. package/lib/api/reporting/stakeholder/sections.js +249 -0
  35. package/lib/api/reporting/stakeholder/store.d.ts +450 -0
  36. package/lib/api/reporting/stakeholder/store.js +981 -0
  37. package/lib/api/reporting/stakeholder/templates.d.ts +21 -0
  38. package/lib/api/reporting/stakeholder/templates.js +104 -0
  39. package/lib/api/reporting/types.d.ts +73 -0
  40. package/lib/api/reporting/types.js +1 -1
  41. package/lib/api/reporting-service.d.ts +94 -5
  42. package/lib/api/reporting-service.js +169 -10
  43. package/lib/api/soft-delete-sweep.d.ts +11 -2
  44. package/lib/api/soft-delete-sweep.js +17 -6
  45. package/lib/database/drizzle-schema.d.ts +2263 -385
  46. package/lib/database/drizzle-schema.js +18 -7
  47. package/lib/database/index.d.ts +1 -1
  48. package/lib/database/index.js +4 -2
  49. package/lib/database/schema/compliance.d.ts +0 -682
  50. package/lib/database/schema/compliance.js +6 -66
  51. package/lib/database/schema/ecosystem.d.ts +20 -157
  52. package/lib/database/schema/ecosystem.js +23 -16
  53. package/lib/database/schema/pipeline.d.ts +200 -0
  54. package/lib/database/schema/pipeline.js +100 -1
  55. package/lib/database/schema/plugin.d.ts +20 -1
  56. package/lib/database/schema/plugin.js +13 -1
  57. package/lib/database/schema/reporting-analytics.d.ts +1212 -0
  58. package/lib/database/schema/reporting-analytics.js +250 -0
  59. package/lib/database/schema/reporting-stakeholder.d.ts +1405 -0
  60. package/lib/database/schema/reporting-stakeholder.js +251 -0
  61. package/lib/index.d.ts +10 -1
  62. package/lib/index.js +15 -1
  63. package/lib/testing/exports.json +67 -4
  64. package/package.json +4 -3
@@ -0,0 +1,251 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Stakeholder reports — scheduled, manager-facing summaries a lead developer
5
+ * composes, reviews and publishes.
6
+ *
7
+ * Four tables, and the reason each exists:
8
+ *
9
+ * - `report_definitions` — the saved "what and when". Reporting was entirely
10
+ * on-demand before this: the dashboard picked a from/to and nothing could be
11
+ * saved, scheduled or kept.
12
+ * - `report_runs` — the FROZEN snapshot of one period's output. This is the load
13
+ * bearing table. The retention sweep purges raw `pipeline_events` by tier, so
14
+ * without a snapshot last quarter's report cannot be regenerated once its
15
+ * events are gone — and a manager who read a number on Monday must see the same
16
+ * number on Friday.
17
+ * - `report_share_links` — expiring, revocable read-only links, because the
18
+ * managers a report is for usually have no platform account.
19
+ * - `report_recipients` — per-org delivery addresses, with verification and
20
+ * bounce state. Recipient emails are PII and the org owns the list, not the
21
+ * definition, so one lead's list is reusable and one unsubscribe is honoured
22
+ * everywhere.
23
+ *
24
+ * Every table is org-scoped with RLS + soft-delete, mirroring postgres-init.sql
25
+ * (which is what actually deploys; `schema-reflection.test.ts` keeps the two in
26
+ * lock-step, name for name).
27
+ */
28
+ import { sql } from 'drizzle-orm';
29
+ import { boolean, index, integer, jsonb, pgTable, text, timestamp, uniqueIndex, varchar } from 'drizzle-orm/pg-core';
30
+ /** How often a definition produces a report. */
31
+ export const REPORT_CADENCES = ['weekly', 'monthly', 'quarterly'];
32
+ /** The manager-facing templates. Each is a fixed list of section ids. */
33
+ export const REPORT_TEMPLATES = ['weekly_delivery', 'monthly_health', 'quarterly_review'];
34
+ /**
35
+ * A run's lifecycle. `drafting` → `ready_for_review` → `published`, with `failed`
36
+ * as a terminal side branch. Nothing reaches a manager before `published`, which
37
+ * is what makes the lead's approval the gate.
38
+ */
39
+ export const REPORT_RUN_STATUSES = ['drafting', 'ready_for_review', 'published', 'failed'];
40
+ /**
41
+ * Why a definition stopped running. Recorded rather than inferred, because the
42
+ * three causes need different fixes and the lead sees this string: the add-on
43
+ * lapsed, the owner was deactivated, or the owner lost the permission that let
44
+ * them author it.
45
+ */
46
+ export const REPORT_PAUSE_REASONS = ['entitlement', 'owner_inactive', 'permission_lost'];
47
+ /** What a definition reports on. */
48
+ export const REPORT_SCOPE_KINDS = ['org', 'projects', 'rollup'];
49
+ /**
50
+ * A saved report: what to compute, how often, in whose timezone, and who receives
51
+ * it.
52
+ *
53
+ * @table report_definitions
54
+ */
55
+ export const reportDefinition = pgTable('report_definitions', {
56
+ id: varchar('id', { length: 255 }).primaryKey(),
57
+ orgId: varchar('org_id', { length: 255 }).notNull(),
58
+ /**
59
+ * The lead who owns this definition. Runs re-check THIS user's permissions, not
60
+ * the caller's, because a scheduled run has no caller — so a lead who loses
61
+ * access stops producing reports rather than keeping a standing grant.
62
+ */
63
+ ownerId: text('owner_id').notNull(),
64
+ name: varchar('name', { length: 200 }).notNull(),
65
+ template: varchar('template', { length: 40 }).$type().notNull(),
66
+ /** Section ids, resolved through the section registry at run time. */
67
+ sections: jsonb('sections').$type().default([]).notNull(),
68
+ cadence: varchar('cadence', { length: 20 }).$type().notNull(),
69
+ /** IANA name. Periods are cut in THIS zone, not the database session's. */
70
+ timezone: varchar('timezone', { length: 64 }).default('UTC').notNull(),
71
+ weekStart: varchar('week_start', { length: 10 }).default('monday').notNull(),
72
+ scope: jsonb('scope').$type().notNull(),
73
+ /** Recipient ids from `report_recipients`, not raw addresses. */
74
+ recipients: jsonb('recipients').$type().default([]).notNull(),
75
+ /**
76
+ * Publish without the lead reviewing. Off by default: the whole point of the
77
+ * review step is that the data cannot supply the context a manager needs
78
+ * ("we paused deploys Tuesday for the migration").
79
+ */
80
+ autoSend: boolean('auto_send').default(false).notNull(),
81
+ isActive: boolean('is_active').default(true).notNull(),
82
+ pausedReason: varchar('paused_reason', { length: 30 }).$type(),
83
+ nextRunAt: timestamp('next_run_at', { withTimezone: true }),
84
+ lastRunAt: timestamp('last_run_at', { withTimezone: true }),
85
+ createdBy: text('created_by').notNull(),
86
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
87
+ updatedBy: text('updated_by'),
88
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
89
+ deletedAt: timestamp('deleted_at', { withTimezone: true }),
90
+ deletedBy: text('deleted_by'),
91
+ purgeAfter: timestamp('purge_after', { withTimezone: true }),
92
+ }, (table) => ({
93
+ orgIdx: index('report_definition_org_idx').on(table.orgId).where(sql `deleted_at IS NULL`),
94
+ ownerIdx: index('report_definition_owner_idx').on(table.ownerId).where(sql `deleted_at IS NULL`),
95
+ // Drives the scheduler's claim scan: the due, live, unpaused definitions only.
96
+ dueIdx: index('report_definition_due_idx').on(table.nextRunAt)
97
+ .where(sql `deleted_at IS NULL AND is_active = true`),
98
+ purgeIdx: index('report_definition_purge_idx').on(table.purgeAfter).where(sql `deleted_at IS NOT NULL`),
99
+ }));
100
+ /**
101
+ * One period's frozen output.
102
+ *
103
+ * @table report_runs
104
+ */
105
+ export const reportRun = pgTable('report_runs', {
106
+ id: varchar('id', { length: 255 }).primaryKey(),
107
+ orgId: varchar('org_id', { length: 255 }).notNull(),
108
+ definitionId: varchar('definition_id', { length: 255 }).notNull(),
109
+ /** Inclusive period start, exclusive end — both instants, in UTC. */
110
+ periodStart: timestamp('period_start', { withTimezone: true }).notNull(),
111
+ periodEnd: timestamp('period_end', { withTimezone: true }).notNull(),
112
+ /** Human label in the definition's timezone: `2026-W38`, `2026-08`, `2026-Q3`. */
113
+ periodLabel: varchar('period_label', { length: 20 }).notNull(),
114
+ /**
115
+ * Regenerating a period produces version N+1 and supersedes the old row rather
116
+ * than overwriting it. Late events (the ingest redrives its dead-letter queue
117
+ * hours later) mean a corrected report is normal — and a manager who already
118
+ * read v1 must still be able to see exactly what they read.
119
+ */
120
+ version: integer('version').default(1).notNull(),
121
+ status: varchar('status', { length: 20 }).$type().default('drafting').notNull(),
122
+ /** The computed sections. Survives the raw-event purge — that is the point. */
123
+ snapshot: jsonb('snapshot').$type(),
124
+ /** AI-generated executive summary, from the snapshot's numbers only. */
125
+ aiDraft: text('ai_draft'),
126
+ /** The lead's own words. The context the data cannot supply. */
127
+ leadNotes: text('lead_notes'),
128
+ /**
129
+ * The ASKS: what the lead needs a decision on, from whom, by when.
130
+ *
131
+ * Separate from `leadNotes` because they are the only part of a report with a
132
+ * recipient and a deadline. Buried in a paragraph of narrative, a request for a
133
+ * decision reads as commentary and gets no answer — which is the most common way
134
+ * a status report fails to be worth writing.
135
+ */
136
+ asks: jsonb('asks').$type().default([]).notNull(),
137
+ failureReason: text('failure_reason'),
138
+ /**
139
+ * What happened when this run was DELIVERED: counts per channel, and the notes a lead
140
+ * needs to read ("no outbound email is configured, so 12 recipients were not mailed").
141
+ *
142
+ * On the run rather than in a log, because the question it answers is asked days later
143
+ * and about one specific report: "did the board actually get last month's?" A log line
144
+ * cannot be shown next to the report, and `leadNotes` cannot hold it — that column is
145
+ * frozen at publish, which is exactly when delivery happens.
146
+ */
147
+ delivery: jsonb('delivery').$type(),
148
+ publishedBy: text('published_by'),
149
+ publishedAt: timestamp('published_at', { withTimezone: true }),
150
+ supersededBy: varchar('superseded_by', { length: 255 }),
151
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
152
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
153
+ deletedAt: timestamp('deleted_at', { withTimezone: true }),
154
+ deletedBy: text('deleted_by'),
155
+ purgeAfter: timestamp('purge_after', { withTimezone: true }),
156
+ }, (table) => ({
157
+ // The idempotency key. A retry, a catch-up pass and a manual backfill can all
158
+ // ask for the same period; without this they would each insert a row.
159
+ periodUnique: uniqueIndex('report_run_period_unique')
160
+ .on(table.definitionId, table.periodStart, table.version),
161
+ definitionIdx: index('report_run_definition_idx').on(table.definitionId, table.periodStart)
162
+ .where(sql `deleted_at IS NULL`),
163
+ orgIdx: index('report_run_org_idx').on(table.orgId).where(sql `deleted_at IS NULL`),
164
+ purgeIdx: index('report_run_purge_idx').on(table.purgeAfter).where(sql `deleted_at IS NOT NULL`),
165
+ }));
166
+ /**
167
+ * A read-only, expiring link to one published run.
168
+ *
169
+ * @table report_share_links
170
+ */
171
+ export const reportShareLink = pgTable('report_share_links', {
172
+ id: varchar('id', { length: 255 }).primaryKey(),
173
+ orgId: varchar('org_id', { length: 255 }).notNull(),
174
+ runId: varchar('run_id', { length: 255 }).notNull(),
175
+ /**
176
+ * SHA-256 of the token, never the token. The raw value is shown once, at
177
+ * creation — a stored token is a stored credential for org data that anyone
178
+ * holding the link can read.
179
+ */
180
+ tokenHash: varchar('token_hash', { length: 64 }).notNull(),
181
+ expiresAt: timestamp('expires_at', { withTimezone: true }).notNull(),
182
+ revokedAt: timestamp('revoked_at', { withTimezone: true }),
183
+ revokedBy: text('revoked_by'),
184
+ /** Redact pipeline/project names in the public view — internal names leak intent. */
185
+ redactNames: boolean('redact_names').default(false).notNull(),
186
+ viewCount: integer('view_count').default(0).notNull(),
187
+ lastViewedAt: timestamp('last_viewed_at', { withTimezone: true }),
188
+ createdBy: text('created_by').notNull(),
189
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
190
+ }, (table) => ({
191
+ // The public route's only lookup: by token hash. Unique so a hash collision
192
+ // cannot resolve to two runs.
193
+ tokenUnique: uniqueIndex('report_share_link_token_unique').on(table.tokenHash),
194
+ runIdx: index('report_share_link_run_idx').on(table.runId),
195
+ orgIdx: index('report_share_link_org_idx').on(table.orgId),
196
+ }));
197
+ /**
198
+ * A verified delivery address for one org.
199
+ *
200
+ * @table report_recipients
201
+ */
202
+ export const reportRecipient = pgTable('report_recipients', {
203
+ id: varchar('id', { length: 255 }).primaryKey(),
204
+ orgId: varchar('org_id', { length: 255 }).notNull(),
205
+ email: varchar('email', { length: 320 }).notNull(),
206
+ displayName: varchar('display_name', { length: 200 }),
207
+ /**
208
+ * Set when the recipient confirms by email. Nothing is delivered before this:
209
+ * otherwise a lead could send org data to any address by typing it.
210
+ */
211
+ verifiedAt: timestamp('verified_at', { withTimezone: true }),
212
+ verificationTokenHash: varchar('verification_token_hash', { length: 64 }),
213
+ /** Honoured across every definition — an unsubscribe is per person, not per report. */
214
+ unsubscribedAt: timestamp('unsubscribed_at', { withTimezone: true }),
215
+ /**
216
+ * The recipient's stable unsubscribe nonce, minted once with the row.
217
+ *
218
+ * STORED IN THE CLEAR, unlike every other token in this file, and the difference is
219
+ * what it authorizes. A share-link token grants READ ACCESS to an org's report, so it
220
+ * is only ever kept as a hash; this one authorizes exactly one self-limiting action —
221
+ * "stop emailing this address" — so the worst a database read buys an attacker is the
222
+ * ability to make the product send less mail.
223
+ *
224
+ * It has to be readable because every report email rebuilds the link, and a hash
225
+ * cannot be turned back into the URL. The alternative, a signed URL, would be
226
+ * invalidated by the default EPHEMERAL service key on every restart, silently breaking
227
+ * the unsubscribe link in every report already sitting in a manager's mailbox — which
228
+ * is the one failure here that has a regulator attached to it.
229
+ */
230
+ unsubscribeToken: varchar('unsubscribe_token', { length: 64 }),
231
+ bounceCount: integer('bounce_count').default(0).notNull(),
232
+ lastBounceAt: timestamp('last_bounce_at', { withTimezone: true }),
233
+ /** Set when an admin approved an address outside the allowed domains. */
234
+ approvedBy: text('approved_by'),
235
+ createdBy: text('created_by').notNull(),
236
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
237
+ deletedAt: timestamp('deleted_at', { withTimezone: true }),
238
+ deletedBy: text('deleted_by'),
239
+ purgeAfter: timestamp('purge_after', { withTimezone: true }),
240
+ }, (table) => ({
241
+ // One row per address per org, so re-adding a recipient reuses its verification
242
+ // and unsubscribe state rather than resetting them.
243
+ orgEmailUnique: uniqueIndex('report_recipient_org_email_unique').on(table.orgId, table.email),
244
+ orgIdx: index('report_recipient_org_idx').on(table.orgId).where(sql `deleted_at IS NULL`),
245
+ purgeIdx: index('report_recipient_purge_idx').on(table.purgeAfter).where(sql `deleted_at IS NOT NULL`),
246
+ // The unsubscribe link's only lookup. Unique so one token can never resolve to two
247
+ // addresses.
248
+ unsubTokenUnique: uniqueIndex('report_recipient_unsub_token_unique').on(table.unsubscribeToken)
249
+ .where(sql `unsubscribe_token IS NOT NULL`),
250
+ }));
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXN0YWtlaG9sZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3NjaGVtYS9yZXBvcnRpbmctc3Rha2Vob2xkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVySCxnREFBZ0Q7QUFDaEQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQVUsQ0FBQztBQUczRSx5RUFBeUU7QUFDekUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBVSxDQUFDO0FBR25HOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFHcEc7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBVSxDQUFDO0FBR2xHLG9DQUFvQztBQUNwQyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFVLENBQUM7QUF3QnpFOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixFQUFFO0lB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SyxDQUFDLEtBQUssQ0FBQztJQUM3RixNQUFNLEVBQUUsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFBLG9CQUFvQixDQUFDO0lBQ3hGLFFBQVEsRUFBRSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUEsd0JBQXdCLENBQUM7SUFDckcsbUZBQW1GO0lBQ25GLGFBQWE7SUFDYixnQkFBZ0IsRUFBRSxXQUFXLENBQUMscUNBQXFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1NBQzVGLEtBQUssQ0FBQyxHQUFHLENBQUEsK0JBQStCLENBQUM7Q0FDN0MsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBTdGFrZWhvbGRlciByZXBvcnRzIOKAlCBzY2hlZHVsZWQsIG1hbmFnZXItZmFjaW5nIHN1bW1hcmllcyBhIGxlYWQgZGV2ZWxvcGVyXG4gKiBjb21wb3NlcywgcmV2aWV3cyBhbmQgcHVibGlzaGVzLlxuICpcbiAqIEZvdXIgdGFibGVzLCBhbmQgdGhlIHJlYXNvbiBlYWNoIGV4aXN0czpcbiAqXG4gKiAgLSBgcmVwb3J0X2RlZmluaXRpb25zYCDigJQgdGhlIHNhdmVkIFwid2hhdCBhbmQgd2hlblwiLiBSZXBvcnRpbmcgd2FzIGVudGlyZWx5XG4gKiAgICBvbi1kZW1hbmQgYmVmb3JlIHRoaXM6IHRoZSBkYXNoYm9hcmQgcGlja2VkIGEgZnJvbS90byBhbmQgbm90aGluZyBjb3VsZCBiZVxuICogICAgc2F2ZWQsIHNjaGVkdWxlZCBvciBrZXB0LlxuICogIC0gYHJlcG9ydF9ydW5zYCDigJQgdGhlIEZST1pFTiBzbmFwc2hvdCBvZiBvbmUgcGVyaW9kJ3Mgb3V0cHV0LiBUaGlzIGlzIHRoZSBsb2FkXG4gKiAgICBiZWFyaW5nIHRhYmxlLiBUaGUgcmV0ZW50aW9uIHN3ZWVwIHB1cmdlcyByYXcgYHBpcGVsaW5lX2V2ZW50c2AgYnkgdGllciwgc29cbiAqICAgIHdpdGhvdXQgYSBzbmFwc2hvdCBsYXN0IHF1YXJ0ZXIncyByZXBvcnQgY2Fubm90IGJlIHJlZ2VuZXJhdGVkIG9uY2UgaXRzXG4gKiAgICBldmVudHMgYXJlIGdvbmUg4oCUIGFuZCBhIG1hbmFnZXIgd2hvIHJlYWQgYSBudW1iZXIgb24gTW9uZGF5IG11c3Qgc2VlIHRoZSBzYW1lXG4gKiAgICBudW1iZXIgb24gRnJpZGF5LlxuICogIC0gYHJlcG9ydF9zaGFyZV9saW5rc2Ag4oCUIGV4cGlyaW5nLCByZXZvY2FibGUgcmVhZC1vbmx5IGxpbmtzLCBiZWNhdXNlIHRoZVxuICogICAgbWFuYWdlcnMgYSByZXBvcnQgaXMgZm9yIHVzdWFsbHkgaGF2ZSBubyBwbGF0Zm9ybSBhY2NvdW50LlxuICogIC0gYHJlcG9ydF9yZWNpcGllbnRzYCDigJQgcGVyLW9yZyBkZWxpdmVyeSBhZGRyZXNzZXMsIHdpdGggdmVyaWZpY2F0aW9uIGFuZFxuICogICAgYm91bmNlIHN0YXRlLiBSZWNpcGllbnQgZW1haWxzIGFyZSBQSUkgYW5kIHRoZSBvcmcgb3ducyB0aGUgbGlzdCwgbm90IHRoZVxuICogICAgZGVmaW5pdGlvbiwgc28gb25lIGxlYWQncyBsaXN0IGlzIHJldXNhYmxlIGFuZCBvbmUgdW5zdWJzY3JpYmUgaXMgaG9ub3VyZWRcbiAqICAgIGV2ZXJ5d2hlcmUuXG4gKlxuICogRXZlcnkgdGFibGUgaXMgb3JnLXNjb3BlZCB3aXRoIFJMUyArIHNvZnQtZGVsZXRlLCBtaXJyb3JpbmcgcG9zdGdyZXMtaW5pdC5zcWxcbiAqICh3aGljaCBpcyB3aGF0IGFjdHVhbGx5IGRlcGxveXM7IGBzY2hlbWEtcmVmbGVjdGlvbi50ZXN0LnRzYCBrZWVwcyB0aGUgdHdvIGluXG4gKiBsb2NrLXN0ZXAsIG5hbWUgZm9yIG5hbWUpLlxuICovXG5cbmltcG9ydCB7IHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGJvb2xlYW4sIGluZGV4LCBpbnRlZ2VyLCBqc29uYiwgcGdUYWJsZSwgdGV4dCwgdGltZXN0YW1wLCB1bmlxdWVJbmRleCwgdmFyY2hhciB9IGZyb20gJ2RyaXp6bGUtb3JtL3BnLWNvcmUnO1xuXG4vKiogSG93IG9mdGVuIGEgZGVmaW5pdGlvbiBwcm9kdWNlcyBhIHJlcG9ydC4gKi9cbmV4cG9ydCBjb25zdCBSRVBPUlRfQ0FERU5DRVMgPSBbJ3dlZWtseScsICdtb250aGx5JywgJ3F1YXJ0ZXJseSddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUmVwb3J0Q2FkZW5jZSA9ICh0eXBlb2YgUkVQT1JUX0NBREVOQ0VTKVtudW1iZXJdO1xuXG4vKiogVGhlIG1hbmFnZXItZmFjaW5nIHRlbXBsYXRlcy4gRWFjaCBpcyBhIGZpeGVkIGxpc3Qgb2Ygc2VjdGlvbiBpZHMuICovXG5leHBvcnQgY29uc3QgUkVQT1JUX1RFTVBMQVRFUyA9IFsnd2Vla2x5X2RlbGl2ZXJ5JywgJ21vbnRobHlfaGVhbHRoJywgJ3F1YXJ0ZXJseV9yZXZpZXcnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFJlcG9ydFRlbXBsYXRlID0gKHR5cGVvZiBSRVBPUlRfVEVNUExBVEVTKVtudW1iZXJdO1xuXG4vKipcbiAqIEEgcnVuJ3MgbGlmZWN5Y2xlLiBgZHJhZnRpbmdgIOKGkiBgcmVhZHlfZm9yX3Jldmlld2Ag4oaSIGBwdWJsaXNoZWRgLCB3aXRoIGBmYWlsZWRgXG4gKiBhcyBhIHRlcm1pbmFsIHNpZGUgYnJhbmNoLiBOb3RoaW5nIHJlYWNoZXMgYSBtYW5hZ2VyIGJlZm9yZSBgcHVibGlzaGVkYCwgd2hpY2hcbiAqIGlzIHdoYXQgbWFrZXMgdGhlIGxlYWQncyBhcHByb3ZhbCB0aGUgZ2F0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFUE9SVF9SVU5fU1RBVFVTRVMgPSBbJ2RyYWZ0aW5nJywgJ3JlYWR5X2Zvcl9yZXZpZXcnLCAncHVibGlzaGVkJywgJ2ZhaWxlZCddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUmVwb3J0UnVuU3RhdHVzID0gKHR5cGVvZiBSRVBPUlRfUlVOX1NUQVRVU0VTKVtudW1iZXJdO1xuXG4vKipcbiAqIFdoeSBhIGRlZmluaXRpb24gc3RvcHBlZCBydW5uaW5nLiBSZWNvcmRlZCByYXRoZXIgdGhhbiBpbmZlcnJlZCwgYmVjYXVzZSB0aGVcbiAqIHRocmVlIGNhdXNlcyBuZWVkIGRpZmZlcmVudCBmaXhlcyBhbmQgdGhlIGxlYWQgc2VlcyB0aGlzIHN0cmluZzogdGhlIGFkZC1vblxuICogbGFwc2VkLCB0aGUgb3duZXIgd2FzIGRlYWN0aXZhdGVkLCBvciB0aGUgb3duZXIgbG9zdCB0aGUgcGVybWlzc2lvbiB0aGF0IGxldFxuICogdGhlbSBhdXRob3IgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBSRVBPUlRfUEFVU0VfUkVBU09OUyA9IFsnZW50aXRsZW1lbnQnLCAnb3duZXJfaW5hY3RpdmUnLCAncGVybWlzc2lvbl9sb3N0J10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBSZXBvcnRQYXVzZVJlYXNvbiA9ICh0eXBlb2YgUkVQT1JUX1BBVVNFX1JFQVNPTlMpW251bWJlcl07XG5cbi8qKiBXaGF0IGEgZGVmaW5pdGlvbiByZXBvcnRzIG9uLiAqL1xuZXhwb3J0IGNvbnN0IFJFUE9SVF9TQ09QRV9LSU5EUyA9IFsnb3JnJywgJ3Byb2plY3RzJywgJ3JvbGx1cCddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUmVwb3J0U2NvcGVLaW5kID0gKHR5cGVvZiBSRVBPUlRfU0NPUEVfS0lORFMpW251bWJlcl07XG5cbi8qKlxuICogT25lIHRoaW5nIHRoZSBsZWFkIG5lZWRzIGZyb20gdGhlIHBlb3BsZSByZWFkaW5nIHRoZSByZXBvcnQuXG4gKlxuICogYGRlY2lzaW9uYCBpcyB0aGUgcmVxdWVzdCBpbiBwbGFpbiB3b3JkcywgYGZyb21gIG5hbWVzIHdobyBjYW4gYW5zd2VyIGl0LCBhbmRcbiAqIGBieWAgaXMgd2hlbiBhbiBhbnN3ZXIgc3RvcHMgYmVpbmcgdXNlZnVsLiBBbGwgdGhyZWUgbWF0dGVyOiBhbiBhc2sgd2l0aCBub1xuICogb3duZXIgaXMgYSB3aXNoLCBhbmQgb25lIHdpdGggbm8gZGF0ZSBpcyBuZXZlciB1cmdlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0QXNrIHtcbiAgZGVjaXNpb246IHN0cmluZztcbiAgZnJvbT86IHN0cmluZztcbiAgLyoqIElTTyBkYXRlLiBOb3QgYSB0aW1lc3RhbXAg4oCUIGEgZGVjaXNpb24gZGVhZGxpbmUgaXMgYSBkYXksIG5vdCBhIG1vbWVudC4gKi9cbiAgYnk/OiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgYHNjb3BlYCBKU09OOiB3aGljaCBwaXBlbGluZXMgYSBydW4gY292ZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRTY29wZSB7XG4gIGtpbmQ6IFJlcG9ydFNjb3BlS2luZDtcbiAgLyoqIFByb2plY3QgbmFtZXMsIHdoZW4gYGtpbmQgPT09ICdwcm9qZWN0cydgLiBFbXB0eSBmb3Igb3JnL3JvbGx1cC4gKi9cbiAgcHJvamVjdHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIHNhdmVkIHJlcG9ydDogd2hhdCB0byBjb21wdXRlLCBob3cgb2Z0ZW4sIGluIHdob3NlIHRpbWV6b25lLCBhbmQgd2hvIHJlY2VpdmVzXG4gKiBpdC5cbiAqXG4gKiBAdGFibGUgcmVwb3J0X2RlZmluaXRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCByZXBvcnREZWZpbml0aW9uID0gcGdUYWJsZSgncmVwb3J0X2RlZmluaXRpb25zJywge1xuICBpZDogdmFyY2hhcignaWQnLCB7IGxlbmd0aDogMjU1IH0pLnByaW1hcnlLZXkoKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICAvKipcbiAgICogVGhlIGxlYWQgd2hvIG93bnMgdGhpcyBkZWZpbml0aW9uLiBSdW5zIHJlLWNoZWNrIFRISVMgdXNlcidzIHBlcm1pc3Npb25zLCBub3RcbiAgICogdGhlIGNhbGxlcidzLCBiZWNhdXNlIGEgc2NoZWR1bGVkIHJ1biBoYXMgbm8gY2FsbGVyIOKAlCBzbyBhIGxlYWQgd2hvIGxvc2VzXG4gICAqIGFjY2VzcyBzdG9wcyBwcm9kdWNpbmcgcmVwb3J0cyByYXRoZXIgdGhhbiBrZWVwaW5nIGEgc3RhbmRpbmcgZ3JhbnQuXG4gICAqL1xuICBvd25lcklkOiB0ZXh0KCdvd25lcl9pZCcpLm5vdE51bGwoKSxcbiAgbmFtZTogdmFyY2hhcignbmFtZScsIHsgbGVuZ3RoOiAyMDAgfSkubm90TnVsbCgpLFxuICB0ZW1wbGF0ZTogdmFyY2hhcigndGVtcGxhdGUnLCB7IGxlbmd0aDogNDAgfSkuJHR5cGU8UmVwb3J0VGVtcGxhdGU+KCkubm90TnVsbCgpLFxuICAvKiogU2VjdGlvbiBpZHMsIHJlc29sdmVkIHRocm91Z2ggdGhlIHNlY3Rpb24gcmVnaXN0cnkgYXQgcnVuIHRpbWUuICovXG4gIHNlY3Rpb25zOiBqc29uYignc2VjdGlvbnMnKS4kdHlwZTxzdHJpbmdbXT4oKS5kZWZhdWx0KFtdKS5ub3ROdWxsKCksXG4gIGNhZGVuY2U6IHZhcmNoYXIoJ2NhZGVuY2UnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8UmVwb3J0Q2FkZW5jZT4oKS5ub3ROdWxsKCksXG4gIC8qKiBJQU5BIG5hbWUuIFBlcmlvZHMgYXJlIGN1dCBpbiBUSElTIHpvbmUsIG5vdCB0aGUgZGF0YWJhc2Ugc2Vzc2lvbidzLiAqL1xuICB0aW1lem9uZTogdmFyY2hhcigndGltZXpvbmUnLCB7IGxlbmd0aDogNjQgfSkuZGVmYXVsdCgnVVRDJykubm90TnVsbCgpLFxuICB3ZWVrU3RhcnQ6IHZhcmNoYXIoJ3dlZWtfc3RhcnQnLCB7IGxlbmd0aDogMTAgfSkuZGVmYXVsdCgnbW9uZGF5Jykubm90TnVsbCgpLFxuICBzY29wZToganNvbmIoJ3Njb3BlJykuJHR5cGU8UmVwb3J0U2NvcGU+KCkubm90TnVsbCgpLFxuICAvKiogUmVjaXBpZW50IGlkcyBmcm9tIGByZXBvcnRfcmVjaXBpZW50c2AsIG5vdCByYXcgYWRkcmVzc2VzLiAqL1xuICByZWNpcGllbnRzOiBqc29uYigncmVjaXBpZW50cycpLiR0eXBlPHN0cmluZ1tdPigpLmRlZmF1bHQoW10pLm5vdE51bGwoKSxcbiAgLyoqXG4gICAqIFB1Ymxpc2ggd2l0aG91dCB0aGUgbGVhZCByZXZpZXdpbmcuIE9mZiBieSBkZWZhdWx0OiB0aGUgd2hvbGUgcG9pbnQgb2YgdGhlXG4gICAqIHJldmlldyBzdGVwIGlzIHRoYXQgdGhlIGRhdGEgY2Fubm90IHN1cHBseSB0aGUgY29udGV4dCBhIG1hbmFnZXIgbmVlZHNcbiAgICogKFwid2UgcGF1c2VkIGRlcGxveXMgVHVlc2RheSBmb3IgdGhlIG1pZ3JhdGlvblwiKS5cbiAgICovXG4gIGF1dG9TZW5kOiBib29sZWFuKCdhdXRvX3NlbmQnKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKS5kZWZhdWx0KHRydWUpLm5vdE51bGwoKSxcbiAgcGF1c2VkUmVhc29uOiB2YXJjaGFyKCdwYXVzZWRfcmVhc29uJywgeyBsZW5ndGg6IDMwIH0pLiR0eXBlPFJlcG9ydFBhdXNlUmVhc29uPigpLFxuICBuZXh0UnVuQXQ6IHRpbWVzdGFtcCgnbmV4dF9ydW5fYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgbGFzdFJ1bkF0OiB0aW1lc3RhbXAoJ2xhc3RfcnVuX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNyZWF0ZWRCeTogdGV4dCgnY3JlYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQnk6IHRleHQoJ3VwZGF0ZWRfYnknKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICBkZWxldGVkQXQ6IHRpbWVzdGFtcCgnZGVsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkZWxldGVkQnk6IHRleHQoJ2RlbGV0ZWRfYnknKSxcbiAgcHVyZ2VBZnRlcjogdGltZXN0YW1wKCdwdXJnZV9hZnRlcicsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdJZHg6IGluZGV4KCdyZXBvcnRfZGVmaW5pdGlvbl9vcmdfaWR4Jykub24odGFibGUub3JnSWQpLndoZXJlKHNxbGBkZWxldGVkX2F0IElTIE5VTExgKSxcbiAgb3duZXJJZHg6IGluZGV4KCdyZXBvcnRfZGVmaW5pdGlvbl9vd25lcl9pZHgnKS5vbih0YWJsZS5vd25lcklkKS53aGVyZShzcWxgZGVsZXRlZF9hdCBJUyBOVUxMYCksXG4gIC8vIERyaXZlcyB0aGUgc2NoZWR1bGVyJ3MgY2xhaW0gc2NhbjogdGhlIGR1ZSwgbGl2ZSwgdW5wYXVzZWQgZGVmaW5pdGlvbnMgb25seS5cbiAgZHVlSWR4OiBpbmRleCgncmVwb3J0X2RlZmluaXRpb25fZHVlX2lkeCcpLm9uKHRhYmxlLm5leHRSdW5BdClcbiAgICAud2hlcmUoc3FsYGRlbGV0ZWRfYXQgSVMgTlVMTCBBTkQgaXNfYWN0aXZlID0gdHJ1ZWApLFxuICBwdXJnZUlkeDogaW5kZXgoJ3JlcG9ydF9kZWZpbml0aW9uX3B1cmdlX2lkeCcpLm9uKHRhYmxlLnB1cmdlQWZ0ZXIpLndoZXJlKHNxbGBkZWxldGVkX2F0IElTIE5PVCBOVUxMYCksXG59KSk7XG5cbi8qKlxuICogT25lIHBlcmlvZCdzIGZyb3plbiBvdXRwdXQuXG4gKlxuICogQHRhYmxlIHJlcG9ydF9ydW5zXG4gKi9cbmV4cG9ydCBjb25zdCByZXBvcnRSdW4gPSBwZ1RhYmxlKCdyZXBvcnRfcnVucycsIHtcbiAgaWQ6IHZhcmNoYXIoJ2lkJywgeyBsZW5ndGg6IDI1NSB9KS5wcmltYXJ5S2V5KCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgZGVmaW5pdGlvbklkOiB2YXJjaGFyKCdkZWZpbml0aW9uX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIC8qKiBJbmNsdXNpdmUgcGVyaW9kIHN0YXJ0LCBleGNsdXNpdmUgZW5kIOKAlCBib3RoIGluc3RhbnRzLCBpbiBVVEMuICovXG4gIHBlcmlvZFN0YXJ0OiB0aW1lc3RhbXAoJ3BlcmlvZF9zdGFydCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLm5vdE51bGwoKSxcbiAgcGVyaW9kRW5kOiB0aW1lc3RhbXAoJ3BlcmlvZF9lbmQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5ub3ROdWxsKCksXG4gIC8qKiBIdW1hbiBsYWJlbCBpbiB0aGUgZGVmaW5pdGlvbidzIHRpbWV6b25lOiBgMjAyNi1XMzhgLCBgMjAyNi0wOGAsIGAyMDI2LVEzYC4gKi9cbiAgcGVyaW9kTGFiZWw6IHZhcmNoYXIoJ3BlcmlvZF9sYWJlbCcsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksXG4gIC8qKlxuICAgKiBSZWdlbmVyYXRpbmcgYSBwZXJpb2QgcHJvZHVjZXMgdmVyc2lvbiBOKzEgYW5kIHN1cGVyc2VkZXMgdGhlIG9sZCByb3cgcmF0aGVyXG4gICAqIHRoYW4gb3ZlcndyaXRpbmcgaXQuIExhdGUgZXZlbnRzICh0aGUgaW5nZXN0IHJlZHJpdmVzIGl0cyBkZWFkLWxldHRlciBxdWV1ZVxuICAgKiBob3VycyBsYXRlcikgbWVhbiBhIGNvcnJlY3RlZCByZXBvcnQgaXMgbm9ybWFsIOKAlCBhbmQgYSBtYW5hZ2VyIHdobyBhbHJlYWR5XG4gICAqIHJlYWQgdjEgbXVzdCBzdGlsbCBiZSBhYmxlIHRvIHNlZSBleGFjdGx5IHdoYXQgdGhleSByZWFkLlxuICAgKi9cbiAgdmVyc2lvbjogaW50ZWdlcigndmVyc2lvbicpLmRlZmF1bHQoMSkubm90TnVsbCgpLFxuICBzdGF0dXM6IHZhcmNoYXIoJ3N0YXR1cycsIHsgbGVuZ3RoOiAyMCB9KS4kdHlwZTxSZXBvcnRSdW5TdGF0dXM+KCkuZGVmYXVsdCgnZHJhZnRpbmcnKS5ub3ROdWxsKCksXG4gIC8qKiBUaGUgY29tcHV0ZWQgc2VjdGlvbnMuIFN1cnZpdmVzIHRoZSByYXctZXZlbnQgcHVyZ2Ug4oCUIHRoYXQgaXMgdGhlIHBvaW50LiAqL1xuICBzbmFwc2hvdDoganNvbmIoJ3NuYXBzaG90JykuJHR5cGU8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCksXG4gIC8qKiBBSS1nZW5lcmF0ZWQgZXhlY3V0aXZlIHN1bW1hcnksIGZyb20gdGhlIHNuYXBzaG90J3MgbnVtYmVycyBvbmx5LiAqL1xuICBhaURyYWZ0OiB0ZXh0KCdhaV9kcmFmdCcpLFxuICAvKiogVGhlIGxlYWQncyBvd24gd29yZHMuIFRoZSBjb250ZXh0IHRoZSBkYXRhIGNhbm5vdCBzdXBwbHkuICovXG4gIGxlYWROb3RlczogdGV4dCgnbGVhZF9ub3RlcycpLFxuICAvKipcbiAgICogVGhlIEFTS1M6IHdoYXQgdGhlIGxlYWQgbmVlZHMgYSBkZWNpc2lvbiBvbiwgZnJvbSB3aG9tLCBieSB3aGVuLlxuICAgKlxuICAgKiBTZXBhcmF0ZSBmcm9tIGBsZWFkTm90ZXNgIGJlY2F1c2UgdGhleSBhcmUgdGhlIG9ubHkgcGFydCBvZiBhIHJlcG9ydCB3aXRoIGFcbiAgICogcmVjaXBpZW50IGFuZCBhIGRlYWRsaW5lLiBCdXJpZWQgaW4gYSBwYXJhZ3JhcGggb2YgbmFycmF0aXZlLCBhIHJlcXVlc3QgZm9yIGFcbiAgICogZGVjaXNpb24gcmVhZHMgYXMgY29tbWVudGFyeSBhbmQgZ2V0cyBubyBhbnN3ZXIg4oCUIHdoaWNoIGlzIHRoZSBtb3N0IGNvbW1vbiB3YXlcbiAgICogYSBzdGF0dXMgcmVwb3J0IGZhaWxzIHRvIGJlIHdvcnRoIHdyaXRpbmcuXG4gICAqL1xuICBhc2tzOiBqc29uYignYXNrcycpLiR0eXBlPFJlcG9ydEFza1tdPigpLmRlZmF1bHQoW10pLm5vdE51bGwoKSxcbiAgZmFpbHVyZVJlYXNvbjogdGV4dCgnZmFpbHVyZV9yZWFzb24nKSxcbiAgLyoqXG4gICAqIFdoYXQgaGFwcGVuZWQgd2hlbiB0aGlzIHJ1biB3YXMgREVMSVZFUkVEOiBjb3VudHMgcGVyIGNoYW5uZWwsIGFuZCB0aGUgbm90ZXMgYSBsZWFkXG4gICAqIG5lZWRzIHRvIHJlYWQgKFwibm8gb3V0Ym91bmQgZW1haWwgaXMgY29uZmlndXJlZCwgc28gMTIgcmVjaXBpZW50cyB3ZXJlIG5vdCBtYWlsZWRcIikuXG4gICAqXG4gICAqIE9uIHRoZSBydW4gcmF0aGVyIHRoYW4gaW4gYSBsb2csIGJlY2F1c2UgdGhlIHF1ZXN0aW9uIGl0IGFuc3dlcnMgaXMgYXNrZWQgZGF5cyBsYXRlclxuICAgKiBhbmQgYWJvdXQgb25lIHNwZWNpZmljIHJlcG9ydDogXCJkaWQgdGhlIGJvYXJkIGFjdHVhbGx5IGdldCBsYXN0IG1vbnRoJ3M/XCIgQSBsb2cgbGluZVxuICAgKiBjYW5ub3QgYmUgc2hvd24gbmV4dCB0byB0aGUgcmVwb3J0LCBhbmQgYGxlYWROb3Rlc2AgY2Fubm90IGhvbGQgaXQg4oCUIHRoYXQgY29sdW1uIGlzXG4gICAqIGZyb3plbiBhdCBwdWJsaXNoLCB3aGljaCBpcyBleGFjdGx5IHdoZW4gZGVsaXZlcnkgaGFwcGVucy5cbiAgICovXG4gIGRlbGl2ZXJ5OiBqc29uYignZGVsaXZlcnknKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKSxcbiAgcHVibGlzaGVkQnk6IHRleHQoJ3B1Ymxpc2hlZF9ieScpLFxuICBwdWJsaXNoZWRBdDogdGltZXN0YW1wKCdwdWJsaXNoZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgc3VwZXJzZWRlZEJ5OiB2YXJjaGFyKCdzdXBlcnNlZGVkX2J5JywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxuICBwdXJnZUFmdGVyOiB0aW1lc3RhbXAoJ3B1cmdlX2FmdGVyJywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG59LCAodGFibGUpID0+ICh7XG4gIC8vIFRoZSBpZGVtcG90ZW5jeSBrZXkuIEEgcmV0cnksIGEgY2F0Y2gtdXAgcGFzcyBhbmQgYSBtYW51YWwgYmFja2ZpbGwgY2FuIGFsbFxuICAvLyBhc2sgZm9yIHRoZSBzYW1lIHBlcmlvZDsgd2l0aG91dCB0aGlzIHRoZXkgd291bGQgZWFjaCBpbnNlcnQgYSByb3cuXG4gIHBlcmlvZFVuaXF1ZTogdW5pcXVlSW5kZXgoJ3JlcG9ydF9ydW5fcGVyaW9kX3VuaXF1ZScpXG4gICAgLm9uKHRhYmxlLmRlZmluaXRpb25JZCwgdGFibGUucGVyaW9kU3RhcnQsIHRhYmxlLnZlcnNpb24pLFxuICBkZWZpbml0aW9uSWR4OiBpbmRleCgncmVwb3J0X3J1bl9kZWZpbml0aW9uX2lkeCcpLm9uKHRhYmxlLmRlZmluaXRpb25JZCwgdGFibGUucGVyaW9kU3RhcnQpXG4gICAgLndoZXJlKHNxbGBkZWxldGVkX2F0IElTIE5VTExgKSxcbiAgb3JnSWR4OiBpbmRleCgncmVwb3J0X3J1bl9vcmdfaWR4Jykub24odGFibGUub3JnSWQpLndoZXJlKHNxbGBkZWxldGVkX2F0IElTIE5VTExgKSxcbiAgcHVyZ2VJZHg6IGluZGV4KCdyZXBvcnRfcnVuX3B1cmdlX2lkeCcpLm9uKHRhYmxlLnB1cmdlQWZ0ZXIpLndoZXJlKHNxbGBkZWxldGVkX2F0IElTIE5PVCBOVUxMYCksXG59KSk7XG5cbi8qKlxuICogQSByZWFkLW9ubHksIGV4cGlyaW5nIGxpbmsgdG8gb25lIHB1Ymxpc2hlZCBydW4uXG4gKlxuICogQHRhYmxlIHJlcG9ydF9zaGFyZV9saW5rc1xuICovXG5leHBvcnQgY29uc3QgcmVwb3J0U2hhcmVMaW5rID0gcGdUYWJsZSgncmVwb3J0X3NoYXJlX2xpbmtzJywge1xuICBpZDogdmFyY2hhcignaWQnLCB7IGxlbmd0aDogMjU1IH0pLnByaW1hcnlLZXkoKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBydW5JZDogdmFyY2hhcigncnVuX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIC8qKlxuICAgKiBTSEEtMjU2IG9mIHRoZSB0b2tlbiwgbmV2ZXIgdGhlIHRva2VuLiBUaGUgcmF3IHZhbHVlIGlzIHNob3duIG9uY2UsIGF0XG4gICAqIGNyZWF0aW9uIOKAlCBhIHN0b3JlZCB0b2tlbiBpcyBhIHN0b3JlZCBjcmVkZW50aWFsIGZvciBvcmcgZGF0YSB0aGF0IGFueW9uZVxuICAgKiBob2xkaW5nIHRoZSBsaW5rIGNhbiByZWFkLlxuICAgKi9cbiAgdG9rZW5IYXNoOiB2YXJjaGFyKCd0b2tlbl9oYXNoJywgeyBsZW5ndGg6IDY0IH0pLm5vdE51bGwoKSxcbiAgZXhwaXJlc0F0OiB0aW1lc3RhbXAoJ2V4cGlyZXNfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5ub3ROdWxsKCksXG4gIHJldm9rZWRBdDogdGltZXN0YW1wKCdyZXZva2VkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHJldm9rZWRCeTogdGV4dCgncmV2b2tlZF9ieScpLFxuICAvKiogUmVkYWN0IHBpcGVsaW5lL3Byb2plY3QgbmFtZXMgaW4gdGhlIHB1YmxpYyB2aWV3IOKAlCBpbnRlcm5hbCBuYW1lcyBsZWFrIGludGVudC4gKi9cbiAgcmVkYWN0TmFtZXM6IGJvb2xlYW4oJ3JlZGFjdF9uYW1lcycpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcbiAgdmlld0NvdW50OiBpbnRlZ2VyKCd2aWV3X2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIGxhc3RWaWV3ZWRBdDogdGltZXN0YW1wKCdsYXN0X3ZpZXdlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgLy8gVGhlIHB1YmxpYyByb3V0ZSdzIG9ubHkgbG9va3VwOiBieSB0b2tlbiBoYXNoLiBVbmlxdWUgc28gYSBoYXNoIGNvbGxpc2lvblxuICAvLyBjYW5ub3QgcmVzb2x2ZSB0byB0d28gcnVucy5cbiAgdG9rZW5VbmlxdWU6IHVuaXF1ZUluZGV4KCdyZXBvcnRfc2hhcmVfbGlua190b2tlbl91bmlxdWUnKS5vbih0YWJsZS50b2tlbkhhc2gpLFxuICBydW5JZHg6IGluZGV4KCdyZXBvcnRfc2hhcmVfbGlua19ydW5faWR4Jykub24odGFibGUucnVuSWQpLFxuICBvcmdJZHg6IGluZGV4KCdyZXBvcnRfc2hhcmVfbGlua19vcmdfaWR4Jykub24odGFibGUub3JnSWQpLFxufSkpO1xuXG4vKipcbiAqIEEgdmVyaWZpZWQgZGVsaXZlcnkgYWRkcmVzcyBmb3Igb25lIG9yZy5cbiAqXG4gKiBAdGFibGUgcmVwb3J0X3JlY2lwaWVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlcG9ydFJlY2lwaWVudCA9IHBnVGFibGUoJ3JlcG9ydF9yZWNpcGllbnRzJywge1xuICBpZDogdmFyY2hhcignaWQnLCB7IGxlbmd0aDogMjU1IH0pLnByaW1hcnlLZXkoKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBlbWFpbDogdmFyY2hhcignZW1haWwnLCB7IGxlbmd0aDogMzIwIH0pLm5vdE51bGwoKSxcbiAgZGlzcGxheU5hbWU6IHZhcmNoYXIoJ2Rpc3BsYXlfbmFtZScsIHsgbGVuZ3RoOiAyMDAgfSksXG4gIC8qKlxuICAgKiBTZXQgd2hlbiB0aGUgcmVjaXBpZW50IGNvbmZpcm1zIGJ5IGVtYWlsLiBOb3RoaW5nIGlzIGRlbGl2ZXJlZCBiZWZvcmUgdGhpczpcbiAgICogb3RoZXJ3aXNlIGEgbGVhZCBjb3VsZCBzZW5kIG9yZyBkYXRhIHRvIGFueSBhZGRyZXNzIGJ5IHR5cGluZyBpdC5cbiAgICovXG4gIHZlcmlmaWVkQXQ6IHRpbWVzdGFtcCgndmVyaWZpZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgdmVyaWZpY2F0aW9uVG9rZW5IYXNoOiB2YXJjaGFyKCd2ZXJpZmljYXRpb25fdG9rZW5faGFzaCcsIHsgbGVuZ3RoOiA2NCB9KSxcbiAgLyoqIEhvbm91cmVkIGFjcm9zcyBldmVyeSBkZWZpbml0aW9uIOKAlCBhbiB1bnN1YnNjcmliZSBpcyBwZXIgcGVyc29uLCBub3QgcGVyIHJlcG9ydC4gKi9cbiAgdW5zdWJzY3JpYmVkQXQ6IHRpbWVzdGFtcCgndW5zdWJzY3JpYmVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIC8qKlxuICAgKiBUaGUgcmVjaXBpZW50J3Mgc3RhYmxlIHVuc3Vic2NyaWJlIG5vbmNlLCBtaW50ZWQgb25jZSB3aXRoIHRoZSByb3cuXG4gICAqXG4gICAqIFNUT1JFRCBJTiBUSEUgQ0xFQVIsIHVubGlrZSBldmVyeSBvdGhlciB0b2tlbiBpbiB0aGlzIGZpbGUsIGFuZCB0aGUgZGlmZmVyZW5jZSBpc1xuICAgKiB3aGF0IGl0IGF1dGhvcml6ZXMuIEEgc2hhcmUtbGluayB0b2tlbiBncmFudHMgUkVBRCBBQ0NFU1MgdG8gYW4gb3JnJ3MgcmVwb3J0LCBzbyBpdFxuICAgKiBpcyBvbmx5IGV2ZXIga2VwdCBhcyBhIGhhc2g7IHRoaXMgb25lIGF1dGhvcml6ZXMgZXhhY3RseSBvbmUgc2VsZi1saW1pdGluZyBhY3Rpb24g4oCUXG4gICAqIFwic3RvcCBlbWFpbGluZyB0aGlzIGFkZHJlc3NcIiDigJQgc28gdGhlIHdvcnN0IGEgZGF0YWJhc2UgcmVhZCBidXlzIGFuIGF0dGFja2VyIGlzIHRoZVxuICAgKiBhYmlsaXR5IHRvIG1ha2UgdGhlIHByb2R1Y3Qgc2VuZCBsZXNzIG1haWwuXG4gICAqXG4gICAqIEl0IGhhcyB0byBiZSByZWFkYWJsZSBiZWNhdXNlIGV2ZXJ5IHJlcG9ydCBlbWFpbCByZWJ1aWxkcyB0aGUgbGluaywgYW5kIGEgaGFzaFxuICAgKiBjYW5ub3QgYmUgdHVybmVkIGJhY2sgaW50byB0aGUgVVJMLiBUaGUgYWx0ZXJuYXRpdmUsIGEgc2lnbmVkIFVSTCwgd291bGQgYmVcbiAgICogaW52YWxpZGF0ZWQgYnkgdGhlIGRlZmF1bHQgRVBIRU1FUkFMIHNlcnZpY2Uga2V5IG9uIGV2ZXJ5IHJlc3RhcnQsIHNpbGVudGx5IGJyZWFraW5nXG4gICAqIHRoZSB1bnN1YnNjcmliZSBsaW5rIGluIGV2ZXJ5IHJlcG9ydCBhbHJlYWR5IHNpdHRpbmcgaW4gYSBtYW5hZ2VyJ3MgbWFpbGJveCDigJQgd2hpY2hcbiAgICogaXMgdGhlIG9uZSBmYWlsdXJlIGhlcmUgdGhhdCBoYXMgYSByZWd1bGF0b3IgYXR0YWNoZWQgdG8gaXQuXG4gICAqL1xuICB1bnN1YnNjcmliZVRva2VuOiB2YXJjaGFyKCd1bnN1YnNjcmliZV90b2tlbicsIHsgbGVuZ3RoOiA2NCB9KSxcbiAgYm91bmNlQ291bnQ6IGludGVnZXIoJ2JvdW5jZV9jb3VudCcpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBsYXN0Qm91bmNlQXQ6IHRpbWVzdGFtcCgnbGFzdF9ib3VuY2VfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgLyoqIFNldCB3aGVuIGFuIGFkbWluIGFwcHJvdmVkIGFuIGFkZHJlc3Mgb3V0c2lkZSB0aGUgYWxsb3dlZCBkb21haW5zLiAqL1xuICBhcHByb3ZlZEJ5OiB0ZXh0KCdhcHByb3ZlZF9ieScpLFxuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgZGVsZXRlZEF0OiB0aW1lc3RhbXAoJ2RlbGV0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZGVsZXRlZEJ5OiB0ZXh0KCdkZWxldGVkX2J5JyksXG4gIHB1cmdlQWZ0ZXI6IHRpbWVzdGFtcCgncHVyZ2VfYWZ0ZXInLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgLy8gT25lIHJvdyBwZXIgYWRkcmVzcyBwZXIgb3JnLCBzbyByZS1hZGRpbmcgYSByZWNpcGllbnQgcmV1c2VzIGl0cyB2ZXJpZmljYXRpb25cbiAgLy8gYW5kIHVuc3Vic2NyaWJlIHN0YXRlIHJhdGhlciB0aGFuIHJlc2V0dGluZyB0aGVtLlxuICBvcmdFbWFpbFVuaXF1ZTogdW5pcXVlSW5kZXgoJ3JlcG9ydF9yZWNpcGllbnRfb3JnX2VtYWlsX3VuaXF1ZScpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5lbWFpbCksXG4gIG9yZ0lkeDogaW5kZXgoJ3JlcG9ydF9yZWNpcGllbnRfb3JnX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKS53aGVyZShzcWxgZGVsZXRlZF9hdCBJUyBOVUxMYCksXG4gIHB1cmdlSWR4OiBpbmRleCgncmVwb3J0X3JlY2lwaWVudF9wdXJnZV9pZHgnKS5vbih0YWJsZS5wdXJnZUFmdGVyKS53aGVyZShzcWxgZGVsZXRlZF9hdCBJUyBOT1QgTlVMTGApLFxuICAvLyBUaGUgdW5zdWJzY3JpYmUgbGluaydzIG9ubHkgbG9va3VwLiBVbmlxdWUgc28gb25lIHRva2VuIGNhbiBuZXZlciByZXNvbHZlIHRvIHR3b1xuICAvLyBhZGRyZXNzZXMuXG4gIHVuc3ViVG9rZW5VbmlxdWU6IHVuaXF1ZUluZGV4KCdyZXBvcnRfcmVjaXBpZW50X3Vuc3ViX3Rva2VuX3VuaXF1ZScpLm9uKHRhYmxlLnVuc3Vic2NyaWJlVG9rZW4pXG4gICAgLndoZXJlKHNxbGB1bnN1YnNjcmliZV90b2tlbiBJUyBOT1QgTlVMTGApLFxufSkpO1xuXG5leHBvcnQgdHlwZSBSZXBvcnREZWZpbml0aW9uID0gdHlwZW9mIHJlcG9ydERlZmluaXRpb24uJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUmVwb3J0RGVmaW5pdGlvbkluc2VydCA9IHR5cGVvZiByZXBvcnREZWZpbml0aW9uLiRpbmZlckluc2VydDtcbmV4cG9ydCB0eXBlIFJlcG9ydFJ1biA9IHR5cGVvZiByZXBvcnRSdW4uJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUmVwb3J0UnVuSW5zZXJ0ID0gdHlwZW9mIHJlcG9ydFJ1bi4kaW5mZXJJbnNlcnQ7XG5leHBvcnQgdHlwZSBSZXBvcnRTaGFyZUxpbmsgPSB0eXBlb2YgcmVwb3J0U2hhcmVMaW5rLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFJlcG9ydFNoYXJlTGlua0luc2VydCA9IHR5cGVvZiByZXBvcnRTaGFyZUxpbmsuJGluZmVySW5zZXJ0O1xuZXhwb3J0IHR5cGUgUmVwb3J0UmVjaXBpZW50ID0gdHlwZW9mIHJlcG9ydFJlY2lwaWVudC4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBSZXBvcnRSZWNpcGllbnRJbnNlcnQgPSB0eXBlb2YgcmVwb3J0UmVjaXBpZW50LiRpbmZlckluc2VydDtcbiJdfQ==
package/lib/index.d.ts CHANGED
@@ -29,9 +29,18 @@ export * from './api/viewer-context.js';
29
29
  export * from './api/crud-service.js';
30
30
  export { parseSemver, compareSemverParts, compareSemver, isVersionRange, satisfiesVersionSpec, semverOrderBy, } from './api/semver-range.js';
31
31
  export { normalizeQuery, searchPublicListings, listPublicCategories, getPublicListing, getPublicListedVersion, listPublicReviews, listPublicListingsForSitemap, type DirectoryTrustTier, type DirectorySort, DIRECTORY_SORTS, DIRECTORY_TIERS, type DirectorySearchParams, type ReviewSort, REVIEW_SORTS, type PublicListingRow, } from './api/public-directory.js';
32
+ export { listEnabledAlertDestinations, type NotificationDestination, } from './api/alert-destinations.js';
32
33
  export { policyOf, effectiveConsumptionPolicy, applyPolicyUpdate, type ConsumptionPolicy, DEFAULT_CONSUMPTION_POLICY, } from './api/plugin-consumption-policy.js';
33
34
  export { advisoryRangeCovers, advisoryRangeProblem, advisoriesCovering, blockingAdvisories, } from './api/plugin-advisories.js';
34
35
  export { listingBlock, implicitInstallRange, installAdmits, scopeOrgIds, installModeFor, drizzleListingSource, resolveListingReference, listedVersionWarnings, listedPluginRecord, loadOrgInstallContext, orgListingStates, resolvableListings, type ResolutionRefusal, type ResolutionScope, type ListingDataSource, type ListingResolved, type OrgListingState, } from './api/plugin-resolution.js';
35
36
  export { runSoftDeletePurge, createSoftDeletePurgeScheduler, type PurgeableEntity, } from './api/soft-delete-sweep.js';
36
- export { type BuildHealth, type DoraLevel, type DoraMetrics, type DoraOptions, type DoraTrendPoint, type IncidentListItem, type ReportingSettings, type IncidentTestResult, type IngestMetric, type PluginRuntimeFilter, type PluginRuntimeStats, ReportingService, reportingService, } from './api/reporting-service.js';
37
+ export { type BuildHealth, type DoraLevel, type DoraMetrics, type DoraOptions, type DoraTrendPoint, type IncidentListItem, type ReportingSettings, type IncidentTestResult, type IngestCaller, type IngestMetric, type LastDeployedCommit, } from './api/reporting-service.js';
38
+ export { upsertDeployments, applyDeployOutcome, correlateIncident, isDeployEvent, leadTimeGapOf, type DeployCandidate, } from './api/reporting/deploy-rollup.js';
39
+ export { rebuildDay, runRollupPass, rollupSettleHours, rollupBatchDays, utcDayStart, } from './api/reporting/daily-rollup.js';
40
+ export { classifyFailure, isTeamActionable, FAILURE_CATEGORY_LABELS, } from './api/reporting/failure-classifier.js';
41
+ export { getPipelineBreakdown, getFailureAnalysis, getStagePerformance, getResourceConsumption, getPromotionView, getOutdatedPlugins, getPluginVulnerabilities, getAdoption, type AnalyticsScope, type PipelineBreakdownRow, type FailureCategoryRow, type StagePerformanceRow, type ResourceRow, type PromotionRow, type OutdatedPluginRow, type VulnerabilityRow, type AdoptionSummary, } from './api/reporting/analytics-queries.js';
42
+ export { evaluateNeedsAttention, thresholdsFrom, DEFAULT_THRESHOLDS, type NeedsAttentionThresholds, type AttentionFinding, type AttentionItem, type AttentionInput, type AttentionRuleId, } from './api/reporting/needs-attention.js';
43
+ export { replacePipelineResolution, refreshLatestForPlugin, upsertExposures, closeFixedExposures, openExposures, triageExposure, lapsedAcceptances, versionGap, type ResolvedStep, type ExposureInput, type VersionGap, } from './api/reporting/plugin-exposure.js';
44
+ export { resolvePeriod, resolvePeriodByLabel, rejectUnreportablePeriod, nextPeriodBoundary, completePeriodsSince, registerSection, getSection, allSections, sectionIds, REPORT_TEMPLATE_SPECS, getTemplate, composeSnapshot, LOW_SAMPLE_THRESHOLD, REPORT_FEATURE_SUBSTITUTES, renderReportHtml, reportFileName, trendSentence, type ReportHtmlInput, type ResolvedPeriod, type PeriodRejection, type SectionSpec, type SectionContext, type SectionDataSource, type TemplateSpec, type ReportSnapshot, type ComposedSection, type DataQualityNote, type ComposeOptions, type TrendDirection, StakeholderReportStore, stakeholderReportStore, hashToken, mintToken, DEFAULT_SHARE_LINK_TTL_DAYS, MAX_SHARE_LINK_TTL_DAYS, MAX_BOUNCES, VERIFICATION_TTL_MS, type CreateDefinitionInput, type UpdateDefinitionInput, type MintedShareLink, type ResolvedShareLink, } from './api/reporting/stakeholder/index.js';
45
+ export { type PluginRuntimeFilter, type PluginRuntimeStats, ReportingService, reportingService, } from './api/reporting-service.js';
37
46
  export { type PluginFilter, type PipelineFilter, type PipelineTemplateFilter, type MessageFilter, type CompliancePolicyFilter, type ComplianceRuleFilter, type ComplianceExemptionFilter, type ComplianceAuditFilter, type ComplianceScanFilter, } from './core/query-filters.js';
package/lib/index.js CHANGED
@@ -33,13 +33,27 @@ export * from './api/viewer-context.js';
33
33
  export * from './api/crud-service.js';
34
34
  export { parseSemver, compareSemverParts, compareSemver, isVersionRange, satisfiesVersionSpec, semverOrderBy, } from './api/semver-range.js';
35
35
  export { normalizeQuery, searchPublicListings, listPublicCategories, getPublicListing, getPublicListedVersion, listPublicReviews, listPublicListingsForSitemap, DIRECTORY_SORTS, DIRECTORY_TIERS, REVIEW_SORTS, } from './api/public-directory.js';
36
+ export { listEnabledAlertDestinations, } from './api/alert-destinations.js';
36
37
  export { policyOf, effectiveConsumptionPolicy, applyPolicyUpdate, DEFAULT_CONSUMPTION_POLICY, } from './api/plugin-consumption-policy.js';
37
38
  export { advisoryRangeCovers, advisoryRangeProblem, advisoriesCovering, blockingAdvisories, } from './api/plugin-advisories.js';
38
39
  export { listingBlock, implicitInstallRange, installAdmits, scopeOrgIds, installModeFor, drizzleListingSource, resolveListingReference, listedVersionWarnings, listedPluginRecord, loadOrgInstallContext, orgListingStates, resolvableListings, } from './api/plugin-resolution.js';
39
40
  // `isSoftDeletePurgeEnabled` is the module's own env gate — `runSoftDeletePurge`
40
41
  // and the scheduler already apply it, so callers never ask separately.
41
42
  export { runSoftDeletePurge, createSoftDeletePurgeScheduler, } from './api/soft-delete-sweep.js';
43
+ export {} from './api/reporting-service.js';
44
+ // The reporting ANALYTICS layer: the per-deploy rollup written at ingest, the
45
+ // daily rollup every section reads, and the failure classifier that labels what
46
+ // broke (see the modules' own headers for why each is written rather than derived).
47
+ export { upsertDeployments, applyDeployOutcome, correlateIncident, isDeployEvent, leadTimeGapOf, } from './api/reporting/deploy-rollup.js';
48
+ export { rebuildDay, runRollupPass, rollupSettleHours, rollupBatchDays, utcDayStart, } from './api/reporting/daily-rollup.js';
49
+ export { classifyFailure, isTeamActionable, FAILURE_CATEGORY_LABELS, } from './api/reporting/failure-classifier.js';
50
+ export { getPipelineBreakdown, getFailureAnalysis, getStagePerformance, getResourceConsumption, getPromotionView, getOutdatedPlugins, getPluginVulnerabilities, getAdoption, } from './api/reporting/analytics-queries.js';
51
+ export { evaluateNeedsAttention, thresholdsFrom, DEFAULT_THRESHOLDS, } from './api/reporting/needs-attention.js';
52
+ export { replacePipelineResolution, refreshLatestForPlugin, upsertExposures, closeFixedExposures, openExposures, triageExposure, lapsedAcceptances, versionGap, } from './api/reporting/plugin-exposure.js';
53
+ // The stakeholder-report engine: period resolution, section registry, templates
54
+ // and the composer that freezes a period into a snapshot.
55
+ export { resolvePeriod, resolvePeriodByLabel, rejectUnreportablePeriod, nextPeriodBoundary, completePeriodsSince, registerSection, getSection, allSections, sectionIds, REPORT_TEMPLATE_SPECS, getTemplate, composeSnapshot, LOW_SAMPLE_THRESHOLD, REPORT_FEATURE_SUBSTITUTES, renderReportHtml, reportFileName, trendSentence, StakeholderReportStore, stakeholderReportStore, hashToken, mintToken, DEFAULT_SHARE_LINK_TTL_DAYS, MAX_SHARE_LINK_TTL_DAYS, MAX_BOUNCES, VERIFICATION_TTL_MS, } from './api/reporting/stakeholder/index.js';
42
56
  export { ReportingService, reportingService, } from './api/reporting-service.js';
43
57
  // Filters
44
58
  export {} from './core/query-filters.js';
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxXQUFXO0FBQ1gsY0FBYyxxQkFBcUIsQ0FBQztBQUVwQyw4QkFBOEI7QUFDOUIsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxPQUFPLEVBRUwseUJBQXlCLEdBQzFCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGFBQWEsR0FDZCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQiw0QkFBNEIsRUFHNUIsZUFBZSxFQUNmLGVBQWUsRUFHZixZQUFZLEdBRWIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQ0wsUUFBUSxFQUNSLDBCQUEwQixFQUMxQixpQkFBaUIsRUFFakIsMEJBQTBCLEdBQzNCLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsa0JBQWtCLEVBQ2xCLGtCQUFrQixHQUNuQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLG9CQUFvQixFQUNwQix1QkFBdUIsRUFDdkIscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixHQU1uQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLGlGQUFpRjtBQUNqRix1RUFBdUU7QUFDdkUsT0FBTyxFQUNMLGtCQUFrQixFQUNsQiw4QkFBOEIsR0FFL0IsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBWUwsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLFVBQVU7QUFDVixPQUFPLEVBVU4sTUFBTSx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIEBtb2R1bGUgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YVxuICpcbiAqIERhdGFiYXNlIGxheWVyOiBEcml6emxlIE9STSBzY2hlbWFzLCBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIGFuZCBxdWVyeSBpbmZyYXN0cnVjdHVyZS5cbiAqXG4gKiAqKkRhdGFiYXNlKipcbiAqIC0gZGIg4oCUIHNoYXJlZCBEcml6emxlIGRhdGFiYXNlIGluc3RhbmNlXG4gKiAtIGdldENvbm5lY3Rpb24sIGNsb3NlQ29ubmVjdGlvbiDigJQgUG9zdGdyZVNRTCBjb25uZWN0aW9uIGxpZmVjeWNsZSB3aXRoIHJldHJ5IGxvZ2ljXG4gKiAtIHNjaGVtYSDigJQgRHJpenpsZSB0YWJsZSBkZWZpbml0aW9ucyAocGx1Z2lucywgcGlwZWxpbmVzLCBtZXNzYWdlcywgY29tcGxpYW5jZSwgZXRjLilcbiAqXG4gKiAqKlNlcnZpY2VzKipcbiAqIC0gQ3J1ZFNlcnZpY2Ug4oCUIGdlbmVyaWMgYmFzZSBjbGFzcyBmb3IgbXVsdGktdGVuYW50IENSVUQgd2l0aCBhY2Nlc3MgY29udHJvbCBhbmQgcGFnaW5hdGlvblxuICogLSBSZXBvcnRpbmdTZXJ2aWNlIOKAlCBhZ2dyZWdhdGUgcXVlcnkgYW5kIHJlcG9ydGluZyBiYXNlIGNsYXNzXG4gKlxuICogKipRdWVyeSBCdWlsZGVycyoqXG4gKiAtIGJ1aWxkUGx1Z2luQ29uZGl0aW9ucywgYnVpbGRQaXBlbGluZUNvbmRpdGlvbnMsIGJ1aWxkTWVzc2FnZUNvbmRpdGlvbnMg4oCUIGZpbHRlci10by1TUUwgY29uZGl0aW9uIGJ1aWxkZXJzXG4gKiAtIGJ1aWxkQ29tcGxpYW5jZVBvbGljeUNvbmRpdGlvbnMsIGJ1aWxkQ29tcGxpYW5jZVJ1bGVDb25kaXRpb25zLCBldGMuIOKAlCBjb21wbGlhbmNlIHF1ZXJ5IGJ1aWxkZXJzXG4gKiAtIEFjY2Vzc0NvbnRyb2xCdWlsZGVyIOKAlCByb3ctbGV2ZWwgYWNjZXNzIGNvbnRyb2wgY29uZGl0aW9uIGJ1aWxkZXJcbiAqXG4gKiAqKkZpbHRlcnMqKlxuICogLSBQbHVnaW5GaWx0ZXIsIFBpcGVsaW5lRmlsdGVyLCBNZXNzYWdlRmlsdGVyIOKAlCB0eXBlZCBmaWx0ZXIgaW50ZXJmYWNlc1xuICogLSBDb21wbGlhbmNlUG9saWN5RmlsdGVyLCBDb21wbGlhbmNlUnVsZUZpbHRlciwgZXRjLiDigJQgY29tcGxpYW5jZSBmaWx0ZXIgaW50ZXJmYWNlc1xuICogLSBkcml6emxlUm93cywgZHJpenpsZUNvdW50IOKAlCBEcml6emxlIHJlc3VsdCB0eXBlIGhlbHBlcnNcbiAqL1xuXG4vLyBEYXRhYmFzZVxuZXhwb3J0ICogZnJvbSAnLi9kYXRhYmFzZS9pbmRleC5qcyc7XG5cbi8vIFF1ZXJ5IGJ1aWxkZXJzIGFuZCBzZXJ2aWNlc1xuZXhwb3J0ICogZnJvbSAnLi9hcGkvcXVlcnktYnVpbGRlcnMuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBCYXNlQWNjZXNzRmlsdGVyLFxuICBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyLFxufSBmcm9tICcuL2FwaS9hY2Nlc3MtY29udHJvbC1idWlsZGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpL3ZpZXdlci1jb250ZXh0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpL2NydWQtc2VydmljZS5qcyc7XG5leHBvcnQge1xuICBwYXJzZVNlbXZlcixcbiAgY29tcGFyZVNlbXZlclBhcnRzLFxuICBjb21wYXJlU2VtdmVyLFxuICBpc1ZlcnNpb25SYW5nZSxcbiAgc2F0aXNmaWVzVmVyc2lvblNwZWMsXG4gIHNlbXZlck9yZGVyQnksXG59IGZyb20gJy4vYXBpL3NlbXZlci1yYW5nZS5qcyc7XG5leHBvcnQge1xuICBub3JtYWxpemVRdWVyeSxcbiAgc2VhcmNoUHVibGljTGlzdGluZ3MsXG4gIGxpc3RQdWJsaWNDYXRlZ29yaWVzLFxuICBnZXRQdWJsaWNMaXN0aW5nLFxuICBnZXRQdWJsaWNMaXN0ZWRWZXJzaW9uLFxuICBsaXN0UHVibGljUmV2aWV3cyxcbiAgbGlzdFB1YmxpY0xpc3RpbmdzRm9yU2l0ZW1hcCxcbiAgdHlwZSBEaXJlY3RvcnlUcnVzdFRpZXIsXG4gIHR5cGUgRGlyZWN0b3J5U29ydCxcbiAgRElSRUNUT1JZX1NPUlRTLFxuICBESVJFQ1RPUllfVElFUlMsXG4gIHR5cGUgRGlyZWN0b3J5U2VhcmNoUGFyYW1zLFxuICB0eXBlIFJldmlld1NvcnQsXG4gIFJFVklFV19TT1JUUyxcbiAgdHlwZSBQdWJsaWNMaXN0aW5nUm93LFxufSBmcm9tICcuL2FwaS9wdWJsaWMtZGlyZWN0b3J5LmpzJztcbmV4cG9ydCB7XG4gIHBvbGljeU9mLFxuICBlZmZlY3RpdmVDb25zdW1wdGlvblBvbGljeSxcbiAgYXBwbHlQb2xpY3lVcGRhdGUsXG4gIHR5cGUgQ29uc3VtcHRpb25Qb2xpY3ksXG4gIERFRkFVTFRfQ09OU1VNUFRJT05fUE9MSUNZLFxufSBmcm9tICcuL2FwaS9wbHVnaW4tY29uc3VtcHRpb24tcG9saWN5LmpzJztcbmV4cG9ydCB7XG4gIGFkdmlzb3J5UmFuZ2VDb3ZlcnMsXG4gIGFkdmlzb3J5UmFuZ2VQcm9ibGVtLFxuICBhZHZpc29yaWVzQ292ZXJpbmcsXG4gIGJsb2NraW5nQWR2aXNvcmllcyxcbn0gZnJvbSAnLi9hcGkvcGx1Z2luLWFkdmlzb3JpZXMuanMnO1xuZXhwb3J0IHtcbiAgbGlzdGluZ0Jsb2NrLFxuICBpbXBsaWNpdEluc3RhbGxSYW5nZSxcbiAgaW5zdGFsbEFkbWl0cyxcbiAgc2NvcGVPcmdJZHMsXG4gIGluc3RhbGxNb2RlRm9yLFxuICBkcml6emxlTGlzdGluZ1NvdXJjZSxcbiAgcmVzb2x2ZUxpc3RpbmdSZWZlcmVuY2UsXG4gIGxpc3RlZFZlcnNpb25XYXJuaW5ncyxcbiAgbGlzdGVkUGx1Z2luUmVjb3JkLFxuICBsb2FkT3JnSW5zdGFsbENvbnRleHQsXG4gIG9yZ0xpc3RpbmdTdGF0ZXMsXG4gIHJlc29sdmFibGVMaXN0aW5ncyxcbiAgdHlwZSBSZXNvbHV0aW9uUmVmdXNhbCxcbiAgdHlwZSBSZXNvbHV0aW9uU2NvcGUsXG4gIHR5cGUgTGlzdGluZ0RhdGFTb3VyY2UsXG4gIHR5cGUgTGlzdGluZ1Jlc29sdmVkLFxuICB0eXBlIE9yZ0xpc3RpbmdTdGF0ZSxcbn0gZnJvbSAnLi9hcGkvcGx1Z2luLXJlc29sdXRpb24uanMnO1xuLy8gYGlzU29mdERlbGV0ZVB1cmdlRW5hYmxlZGAgaXMgdGhlIG1vZHVsZSdzIG93biBlbnYgZ2F0ZSDigJQgYHJ1blNvZnREZWxldGVQdXJnZWBcbi8vIGFuZCB0aGUgc2NoZWR1bGVyIGFscmVhZHkgYXBwbHkgaXQsIHNvIGNhbGxlcnMgbmV2ZXIgYXNrIHNlcGFyYXRlbHkuXG5leHBvcnQge1xuICBydW5Tb2Z0RGVsZXRlUHVyZ2UsXG4gIGNyZWF0ZVNvZnREZWxldGVQdXJnZVNjaGVkdWxlcixcbiAgdHlwZSBQdXJnZWFibGVFbnRpdHksXG59IGZyb20gJy4vYXBpL3NvZnQtZGVsZXRlLXN3ZWVwLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgQnVpbGRIZWFsdGgsXG4gIHR5cGUgRG9yYUxldmVsLFxuICB0eXBlIERvcmFNZXRyaWNzLFxuICB0eXBlIERvcmFPcHRpb25zLFxuICB0eXBlIERvcmFUcmVuZFBvaW50LFxuICB0eXBlIEluY2lkZW50TGlzdEl0ZW0sXG4gIHR5cGUgUmVwb3J0aW5nU2V0dGluZ3MsXG4gIHR5cGUgSW5jaWRlbnRUZXN0UmVzdWx0LFxuICB0eXBlIEluZ2VzdE1ldHJpYyxcbiAgdHlwZSBQbHVnaW5SdW50aW1lRmlsdGVyLFxuICB0eXBlIFBsdWdpblJ1bnRpbWVTdGF0cyxcbiAgUmVwb3J0aW5nU2VydmljZSxcbiAgcmVwb3J0aW5nU2VydmljZSxcbn0gZnJvbSAnLi9hcGkvcmVwb3J0aW5nLXNlcnZpY2UuanMnO1xuXG4vLyBGaWx0ZXJzXG5leHBvcnQge1xuICB0eXBlIFBsdWdpbkZpbHRlcixcbiAgdHlwZSBQaXBlbGluZUZpbHRlcixcbiAgdHlwZSBQaXBlbGluZVRlbXBsYXRlRmlsdGVyLFxuICB0eXBlIE1lc3NhZ2VGaWx0ZXIsXG4gIHR5cGUgQ29tcGxpYW5jZVBvbGljeUZpbHRlcixcbiAgdHlwZSBDb21wbGlhbmNlUnVsZUZpbHRlcixcbiAgdHlwZSBDb21wbGlhbmNlRXhlbXB0aW9uRmlsdGVyLFxuICB0eXBlIENvbXBsaWFuY2VBdWRpdEZpbHRlcixcbiAgdHlwZSBDb21wbGlhbmNlU2NhbkZpbHRlcixcbn0gZnJvbSAnLi9jb3JlL3F1ZXJ5LWZpbHRlcnMuanMnO1xuIl19
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxXQUFXO0FBQ1gsY0FBYyxxQkFBcUIsQ0FBQztBQUVwQyw4QkFBOEI7QUFDOUIsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxPQUFPLEVBRUwseUJBQXlCLEdBQzFCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGFBQWEsR0FDZCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQiw0QkFBNEIsRUFHNUIsZUFBZSxFQUNmLGVBQWUsRUFHZixZQUFZLEdBRWIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQ0wsNEJBQTRCLEdBRTdCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUNMLFFBQVEsRUFDUiwwQkFBMEIsRUFDMUIsaUJBQWlCLEVBRWpCLDBCQUEwQixHQUMzQixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixrQkFBa0IsR0FDbkIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixhQUFhLEVBQ2IsV0FBVyxFQUNYLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixrQkFBa0IsR0FNbkIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxpRkFBaUY7QUFDakYsdUVBQXVFO0FBQ3ZFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsOEJBQThCLEdBRS9CLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQVlOLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRixvRkFBb0Y7QUFDcEYsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixhQUFhLEdBRWQsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsVUFBVSxFQUNWLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLFdBQVcsR0FDWixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLHVCQUF1QixHQUN4QixNQUFNLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsV0FBVyxHQVVaLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixjQUFjLEVBQ2Qsa0JBQWtCLEdBTW5CLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixVQUFVLEdBSVgsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1QyxnRkFBZ0Y7QUFDaEYsMERBQTBEO0FBQzFELE9BQU8sRUFDTCxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNYLFVBQVUsRUFDVixxQkFBcUIsRUFDckIsV0FBVyxFQUNYLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsMEJBQTBCLEVBQzFCLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsYUFBYSxFQWFiLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsU0FBUyxFQUNULFNBQVMsRUFDVCwyQkFBMkIsRUFDM0IsdUJBQXVCLEVBQ3ZCLFdBQVcsRUFDWCxtQkFBbUIsR0FLcEIsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5QyxPQUFPLEVBR0wsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLFVBQVU7QUFDVixPQUFPLEVBVU4sTUFBTSx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIEBtb2R1bGUgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YVxuICpcbiAqIERhdGFiYXNlIGxheWVyOiBEcml6emxlIE9STSBzY2hlbWFzLCBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIGFuZCBxdWVyeSBpbmZyYXN0cnVjdHVyZS5cbiAqXG4gKiAqKkRhdGFiYXNlKipcbiAqIC0gZGIg4oCUIHNoYXJlZCBEcml6emxlIGRhdGFiYXNlIGluc3RhbmNlXG4gKiAtIGdldENvbm5lY3Rpb24sIGNsb3NlQ29ubmVjdGlvbiDigJQgUG9zdGdyZVNRTCBjb25uZWN0aW9uIGxpZmVjeWNsZSB3aXRoIHJldHJ5IGxvZ2ljXG4gKiAtIHNjaGVtYSDigJQgRHJpenpsZSB0YWJsZSBkZWZpbml0aW9ucyAocGx1Z2lucywgcGlwZWxpbmVzLCBtZXNzYWdlcywgY29tcGxpYW5jZSwgZXRjLilcbiAqXG4gKiAqKlNlcnZpY2VzKipcbiAqIC0gQ3J1ZFNlcnZpY2Ug4oCUIGdlbmVyaWMgYmFzZSBjbGFzcyBmb3IgbXVsdGktdGVuYW50IENSVUQgd2l0aCBhY2Nlc3MgY29udHJvbCBhbmQgcGFnaW5hdGlvblxuICogLSBSZXBvcnRpbmdTZXJ2aWNlIOKAlCBhZ2dyZWdhdGUgcXVlcnkgYW5kIHJlcG9ydGluZyBiYXNlIGNsYXNzXG4gKlxuICogKipRdWVyeSBCdWlsZGVycyoqXG4gKiAtIGJ1aWxkUGx1Z2luQ29uZGl0aW9ucywgYnVpbGRQaXBlbGluZUNvbmRpdGlvbnMsIGJ1aWxkTWVzc2FnZUNvbmRpdGlvbnMg4oCUIGZpbHRlci10by1TUUwgY29uZGl0aW9uIGJ1aWxkZXJzXG4gKiAtIGJ1aWxkQ29tcGxpYW5jZVBvbGljeUNvbmRpdGlvbnMsIGJ1aWxkQ29tcGxpYW5jZVJ1bGVDb25kaXRpb25zLCBldGMuIOKAlCBjb21wbGlhbmNlIHF1ZXJ5IGJ1aWxkZXJzXG4gKiAtIEFjY2Vzc0NvbnRyb2xCdWlsZGVyIOKAlCByb3ctbGV2ZWwgYWNjZXNzIGNvbnRyb2wgY29uZGl0aW9uIGJ1aWxkZXJcbiAqXG4gKiAqKkZpbHRlcnMqKlxuICogLSBQbHVnaW5GaWx0ZXIsIFBpcGVsaW5lRmlsdGVyLCBNZXNzYWdlRmlsdGVyIOKAlCB0eXBlZCBmaWx0ZXIgaW50ZXJmYWNlc1xuICogLSBDb21wbGlhbmNlUG9saWN5RmlsdGVyLCBDb21wbGlhbmNlUnVsZUZpbHRlciwgZXRjLiDigJQgY29tcGxpYW5jZSBmaWx0ZXIgaW50ZXJmYWNlc1xuICogLSBkcml6emxlUm93cywgZHJpenpsZUNvdW50IOKAlCBEcml6emxlIHJlc3VsdCB0eXBlIGhlbHBlcnNcbiAqL1xuXG4vLyBEYXRhYmFzZVxuZXhwb3J0ICogZnJvbSAnLi9kYXRhYmFzZS9pbmRleC5qcyc7XG5cbi8vIFF1ZXJ5IGJ1aWxkZXJzIGFuZCBzZXJ2aWNlc1xuZXhwb3J0ICogZnJvbSAnLi9hcGkvcXVlcnktYnVpbGRlcnMuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBCYXNlQWNjZXNzRmlsdGVyLFxuICBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyLFxufSBmcm9tICcuL2FwaS9hY2Nlc3MtY29udHJvbC1idWlsZGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpL3ZpZXdlci1jb250ZXh0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpL2NydWQtc2VydmljZS5qcyc7XG5leHBvcnQge1xuICBwYXJzZVNlbXZlcixcbiAgY29tcGFyZVNlbXZlclBhcnRzLFxuICBjb21wYXJlU2VtdmVyLFxuICBpc1ZlcnNpb25SYW5nZSxcbiAgc2F0aXNmaWVzVmVyc2lvblNwZWMsXG4gIHNlbXZlck9yZGVyQnksXG59IGZyb20gJy4vYXBpL3NlbXZlci1yYW5nZS5qcyc7XG5leHBvcnQge1xuICBub3JtYWxpemVRdWVyeSxcbiAgc2VhcmNoUHVibGljTGlzdGluZ3MsXG4gIGxpc3RQdWJsaWNDYXRlZ29yaWVzLFxuICBnZXRQdWJsaWNMaXN0aW5nLFxuICBnZXRQdWJsaWNMaXN0ZWRWZXJzaW9uLFxuICBsaXN0UHVibGljUmV2aWV3cyxcbiAgbGlzdFB1YmxpY0xpc3RpbmdzRm9yU2l0ZW1hcCxcbiAgdHlwZSBEaXJlY3RvcnlUcnVzdFRpZXIsXG4gIHR5cGUgRGlyZWN0b3J5U29ydCxcbiAgRElSRUNUT1JZX1NPUlRTLFxuICBESVJFQ1RPUllfVElFUlMsXG4gIHR5cGUgRGlyZWN0b3J5U2VhcmNoUGFyYW1zLFxuICB0eXBlIFJldmlld1NvcnQsXG4gIFJFVklFV19TT1JUUyxcbiAgdHlwZSBQdWJsaWNMaXN0aW5nUm93LFxufSBmcm9tICcuL2FwaS9wdWJsaWMtZGlyZWN0b3J5LmpzJztcbmV4cG9ydCB7XG4gIGxpc3RFbmFibGVkQWxlcnREZXN0aW5hdGlvbnMsXG4gIHR5cGUgTm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG59IGZyb20gJy4vYXBpL2FsZXJ0LWRlc3RpbmF0aW9ucy5qcyc7XG5leHBvcnQge1xuICBwb2xpY3lPZixcbiAgZWZmZWN0aXZlQ29uc3VtcHRpb25Qb2xpY3ksXG4gIGFwcGx5UG9saWN5VXBkYXRlLFxuICB0eXBlIENvbnN1bXB0aW9uUG9saWN5LFxuICBERUZBVUxUX0NPTlNVTVBUSU9OX1BPTElDWSxcbn0gZnJvbSAnLi9hcGkvcGx1Z2luLWNvbnN1bXB0aW9uLXBvbGljeS5qcyc7XG5leHBvcnQge1xuICBhZHZpc29yeVJhbmdlQ292ZXJzLFxuICBhZHZpc29yeVJhbmdlUHJvYmxlbSxcbiAgYWR2aXNvcmllc0NvdmVyaW5nLFxuICBibG9ja2luZ0Fkdmlzb3JpZXMsXG59IGZyb20gJy4vYXBpL3BsdWdpbi1hZHZpc29yaWVzLmpzJztcbmV4cG9ydCB7XG4gIGxpc3RpbmdCbG9jayxcbiAgaW1wbGljaXRJbnN0YWxsUmFuZ2UsXG4gIGluc3RhbGxBZG1pdHMsXG4gIHNjb3BlT3JnSWRzLFxuICBpbnN0YWxsTW9kZUZvcixcbiAgZHJpenpsZUxpc3RpbmdTb3VyY2UsXG4gIHJlc29sdmVMaXN0aW5nUmVmZXJlbmNlLFxuICBsaXN0ZWRWZXJzaW9uV2FybmluZ3MsXG4gIGxpc3RlZFBsdWdpblJlY29yZCxcbiAgbG9hZE9yZ0luc3RhbGxDb250ZXh0LFxuICBvcmdMaXN0aW5nU3RhdGVzLFxuICByZXNvbHZhYmxlTGlzdGluZ3MsXG4gIHR5cGUgUmVzb2x1dGlvblJlZnVzYWwsXG4gIHR5cGUgUmVzb2x1dGlvblNjb3BlLFxuICB0eXBlIExpc3RpbmdEYXRhU291cmNlLFxuICB0eXBlIExpc3RpbmdSZXNvbHZlZCxcbiAgdHlwZSBPcmdMaXN0aW5nU3RhdGUsXG59IGZyb20gJy4vYXBpL3BsdWdpbi1yZXNvbHV0aW9uLmpzJztcbi8vIGBpc1NvZnREZWxldGVQdXJnZUVuYWJsZWRgIGlzIHRoZSBtb2R1bGUncyBvd24gZW52IGdhdGUg4oCUIGBydW5Tb2Z0RGVsZXRlUHVyZ2VgXG4vLyBhbmQgdGhlIHNjaGVkdWxlciBhbHJlYWR5IGFwcGx5IGl0LCBzbyBjYWxsZXJzIG5ldmVyIGFzayBzZXBhcmF0ZWx5LlxuZXhwb3J0IHtcbiAgcnVuU29mdERlbGV0ZVB1cmdlLFxuICBjcmVhdGVTb2Z0RGVsZXRlUHVyZ2VTY2hlZHVsZXIsXG4gIHR5cGUgUHVyZ2VhYmxlRW50aXR5LFxufSBmcm9tICcuL2FwaS9zb2Z0LWRlbGV0ZS1zd2VlcC5qcyc7XG5leHBvcnQge1xuICB0eXBlIEJ1aWxkSGVhbHRoLFxuICB0eXBlIERvcmFMZXZlbCxcbiAgdHlwZSBEb3JhTWV0cmljcyxcbiAgdHlwZSBEb3JhT3B0aW9ucyxcbiAgdHlwZSBEb3JhVHJlbmRQb2ludCxcbiAgdHlwZSBJbmNpZGVudExpc3RJdGVtLFxuICB0eXBlIFJlcG9ydGluZ1NldHRpbmdzLFxuICB0eXBlIEluY2lkZW50VGVzdFJlc3VsdCxcbiAgdHlwZSBJbmdlc3RDYWxsZXIsXG4gIHR5cGUgSW5nZXN0TWV0cmljLFxuICB0eXBlIExhc3REZXBsb3llZENvbW1pdCxcbn0gZnJvbSAnLi9hcGkvcmVwb3J0aW5nLXNlcnZpY2UuanMnO1xuXG4vLyBUaGUgcmVwb3J0aW5nIEFOQUxZVElDUyBsYXllcjogdGhlIHBlci1kZXBsb3kgcm9sbHVwIHdyaXR0ZW4gYXQgaW5nZXN0LCB0aGVcbi8vIGRhaWx5IHJvbGx1cCBldmVyeSBzZWN0aW9uIHJlYWRzLCBhbmQgdGhlIGZhaWx1cmUgY2xhc3NpZmllciB0aGF0IGxhYmVscyB3aGF0XG4vLyBicm9rZSAoc2VlIHRoZSBtb2R1bGVzJyBvd24gaGVhZGVycyBmb3Igd2h5IGVhY2ggaXMgd3JpdHRlbiByYXRoZXIgdGhhbiBkZXJpdmVkKS5cbmV4cG9ydCB7XG4gIHVwc2VydERlcGxveW1lbnRzLFxuICBhcHBseURlcGxveU91dGNvbWUsXG4gIGNvcnJlbGF0ZUluY2lkZW50LFxuICBpc0RlcGxveUV2ZW50LFxuICBsZWFkVGltZUdhcE9mLFxuICB0eXBlIERlcGxveUNhbmRpZGF0ZSxcbn0gZnJvbSAnLi9hcGkvcmVwb3J0aW5nL2RlcGxveS1yb2xsdXAuanMnO1xuZXhwb3J0IHtcbiAgcmVidWlsZERheSxcbiAgcnVuUm9sbHVwUGFzcyxcbiAgcm9sbHVwU2V0dGxlSG91cnMsXG4gIHJvbGx1cEJhdGNoRGF5cyxcbiAgdXRjRGF5U3RhcnQsXG59IGZyb20gJy4vYXBpL3JlcG9ydGluZy9kYWlseS1yb2xsdXAuanMnO1xuZXhwb3J0IHtcbiAgY2xhc3NpZnlGYWlsdXJlLFxuICBpc1RlYW1BY3Rpb25hYmxlLFxuICBGQUlMVVJFX0NBVEVHT1JZX0xBQkVMUyxcbn0gZnJvbSAnLi9hcGkvcmVwb3J0aW5nL2ZhaWx1cmUtY2xhc3NpZmllci5qcyc7XG5leHBvcnQge1xuICBnZXRQaXBlbGluZUJyZWFrZG93bixcbiAgZ2V0RmFpbHVyZUFuYWx5c2lzLFxuICBnZXRTdGFnZVBlcmZvcm1hbmNlLFxuICBnZXRSZXNvdXJjZUNvbnN1bXB0aW9uLFxuICBnZXRQcm9tb3Rpb25WaWV3LFxuICBnZXRPdXRkYXRlZFBsdWdpbnMsXG4gIGdldFBsdWdpblZ1bG5lcmFiaWxpdGllcyxcbiAgZ2V0QWRvcHRpb24sXG4gIHR5cGUgQW5hbHl0aWNzU2NvcGUsXG4gIHR5cGUgUGlwZWxpbmVCcmVha2Rvd25Sb3csXG4gIHR5cGUgRmFpbHVyZUNhdGVnb3J5Um93LFxuICB0eXBlIFN0YWdlUGVyZm9ybWFuY2VSb3csXG4gIHR5cGUgUmVzb3VyY2VSb3csXG4gIHR5cGUgUHJvbW90aW9uUm93LFxuICB0eXBlIE91dGRhdGVkUGx1Z2luUm93LFxuICB0eXBlIFZ1bG5lcmFiaWxpdHlSb3csXG4gIHR5cGUgQWRvcHRpb25TdW1tYXJ5LFxufSBmcm9tICcuL2FwaS9yZXBvcnRpbmcvYW5hbHl0aWNzLXF1ZXJpZXMuanMnO1xuZXhwb3J0IHtcbiAgZXZhbHVhdGVOZWVkc0F0dGVudGlvbixcbiAgdGhyZXNob2xkc0Zyb20sXG4gIERFRkFVTFRfVEhSRVNIT0xEUyxcbiAgdHlwZSBOZWVkc0F0dGVudGlvblRocmVzaG9sZHMsXG4gIHR5cGUgQXR0ZW50aW9uRmluZGluZyxcbiAgdHlwZSBBdHRlbnRpb25JdGVtLFxuICB0eXBlIEF0dGVudGlvbklucHV0LFxuICB0eXBlIEF0dGVudGlvblJ1bGVJZCxcbn0gZnJvbSAnLi9hcGkvcmVwb3J0aW5nL25lZWRzLWF0dGVudGlvbi5qcyc7XG5leHBvcnQge1xuICByZXBsYWNlUGlwZWxpbmVSZXNvbHV0aW9uLFxuICByZWZyZXNoTGF0ZXN0Rm9yUGx1Z2luLFxuICB1cHNlcnRFeHBvc3VyZXMsXG4gIGNsb3NlRml4ZWRFeHBvc3VyZXMsXG4gIG9wZW5FeHBvc3VyZXMsXG4gIHRyaWFnZUV4cG9zdXJlLFxuICBsYXBzZWRBY2NlcHRhbmNlcyxcbiAgdmVyc2lvbkdhcCxcbiAgdHlwZSBSZXNvbHZlZFN0ZXAsXG4gIHR5cGUgRXhwb3N1cmVJbnB1dCxcbiAgdHlwZSBWZXJzaW9uR2FwLFxufSBmcm9tICcuL2FwaS9yZXBvcnRpbmcvcGx1Z2luLWV4cG9zdXJlLmpzJztcblxuLy8gVGhlIHN0YWtlaG9sZGVyLXJlcG9ydCBlbmdpbmU6IHBlcmlvZCByZXNvbHV0aW9uLCBzZWN0aW9uIHJlZ2lzdHJ5LCB0ZW1wbGF0ZXNcbi8vIGFuZCB0aGUgY29tcG9zZXIgdGhhdCBmcmVlemVzIGEgcGVyaW9kIGludG8gYSBzbmFwc2hvdC5cbmV4cG9ydCB7XG4gIHJlc29sdmVQZXJpb2QsXG4gIHJlc29sdmVQZXJpb2RCeUxhYmVsLFxuICByZWplY3RVbnJlcG9ydGFibGVQZXJpb2QsXG4gIG5leHRQZXJpb2RCb3VuZGFyeSxcbiAgY29tcGxldGVQZXJpb2RzU2luY2UsXG4gIHJlZ2lzdGVyU2VjdGlvbixcbiAgZ2V0U2VjdGlvbixcbiAgYWxsU2VjdGlvbnMsXG4gIHNlY3Rpb25JZHMsXG4gIFJFUE9SVF9URU1QTEFURV9TUEVDUyxcbiAgZ2V0VGVtcGxhdGUsXG4gIGNvbXBvc2VTbmFwc2hvdCxcbiAgTE9XX1NBTVBMRV9USFJFU0hPTEQsXG4gIFJFUE9SVF9GRUFUVVJFX1NVQlNUSVRVVEVTLFxuICByZW5kZXJSZXBvcnRIdG1sLFxuICByZXBvcnRGaWxlTmFtZSxcbiAgdHJlbmRTZW50ZW5jZSxcbiAgdHlwZSBSZXBvcnRIdG1sSW5wdXQsXG4gIHR5cGUgUmVzb2x2ZWRQZXJpb2QsXG4gIHR5cGUgUGVyaW9kUmVqZWN0aW9uLFxuICB0eXBlIFNlY3Rpb25TcGVjLFxuICB0eXBlIFNlY3Rpb25Db250ZXh0LFxuICB0eXBlIFNlY3Rpb25EYXRhU291cmNlLFxuICB0eXBlIFRlbXBsYXRlU3BlYyxcbiAgdHlwZSBSZXBvcnRTbmFwc2hvdCxcbiAgdHlwZSBDb21wb3NlZFNlY3Rpb24sXG4gIHR5cGUgRGF0YVF1YWxpdHlOb3RlLFxuICB0eXBlIENvbXBvc2VPcHRpb25zLFxuICB0eXBlIFRyZW5kRGlyZWN0aW9uLFxuICBTdGFrZWhvbGRlclJlcG9ydFN0b3JlLFxuICBzdGFrZWhvbGRlclJlcG9ydFN0b3JlLFxuICBoYXNoVG9rZW4sXG4gIG1pbnRUb2tlbixcbiAgREVGQVVMVF9TSEFSRV9MSU5LX1RUTF9EQVlTLFxuICBNQVhfU0hBUkVfTElOS19UVExfREFZUyxcbiAgTUFYX0JPVU5DRVMsXG4gIFZFUklGSUNBVElPTl9UVExfTVMsXG4gIHR5cGUgQ3JlYXRlRGVmaW5pdGlvbklucHV0LFxuICB0eXBlIFVwZGF0ZURlZmluaXRpb25JbnB1dCxcbiAgdHlwZSBNaW50ZWRTaGFyZUxpbmssXG4gIHR5cGUgUmVzb2x2ZWRTaGFyZUxpbmssXG59IGZyb20gJy4vYXBpL3JlcG9ydGluZy9zdGFrZWhvbGRlci9pbmRleC5qcyc7XG5leHBvcnQge1xuICB0eXBlIFBsdWdpblJ1bnRpbWVGaWx0ZXIsXG4gIHR5cGUgUGx1Z2luUnVudGltZVN0YXRzLFxuICBSZXBvcnRpbmdTZXJ2aWNlLFxuICByZXBvcnRpbmdTZXJ2aWNlLFxufSBmcm9tICcuL2FwaS9yZXBvcnRpbmctc2VydmljZS5qcyc7XG5cbi8vIEZpbHRlcnNcbmV4cG9ydCB7XG4gIHR5cGUgUGx1Z2luRmlsdGVyLFxuICB0eXBlIFBpcGVsaW5lRmlsdGVyLFxuICB0eXBlIFBpcGVsaW5lVGVtcGxhdGVGaWx0ZXIsXG4gIHR5cGUgTWVzc2FnZUZpbHRlcixcbiAgdHlwZSBDb21wbGlhbmNlUG9saWN5RmlsdGVyLFxuICB0eXBlIENvbXBsaWFuY2VSdWxlRmlsdGVyLFxuICB0eXBlIENvbXBsaWFuY2VFeGVtcHRpb25GaWx0ZXIsXG4gIHR5cGUgQ29tcGxpYW5jZUF1ZGl0RmlsdGVyLFxuICB0eXBlIENvbXBsaWFuY2VTY2FuRmlsdGVyLFxufSBmcm9tICcuL2NvcmUvcXVlcnktZmlsdGVycy5qcyc7XG4iXX0=
@@ -6,6 +6,8 @@
6
6
  "advisoriesCovering": "function",
7
7
  "advisoryRangeCovers": "function",
8
8
  "advisoryRangeProblem": "function",
9
+ "allSections": "function",
10
+ "applyDeployOutcome": "function",
9
11
  "applyPolicyUpdate": "function",
10
12
  "blockingAdvisories": "function",
11
13
  "buildComplianceAuditConditions": "function",
@@ -18,26 +20,28 @@
18
20
  "buildPipelineTemplateConditions": "function",
19
21
  "buildPluginConditions": "function",
20
22
  "buildPublishedRuleCatalogConditions": "function",
23
+ "classifyFailure": "function",
21
24
  "closeConnection": "function",
25
+ "closeFixedExposures": "function",
22
26
  "closePublicReader": "function",
23
27
  "COMMUNITY_PUBLISHER_HANDLE": "value",
24
28
  "compareSemver": "function",
25
29
  "compareSemverParts": "function",
30
+ "completePeriodsSince": "function",
26
31
  "complianceAuditLog": "value",
27
32
  "complianceExemption": "value",
28
33
  "complianceNotificationLog": "value",
29
34
  "complianceNotificationPreference": "value",
30
35
  "compliancePolicy": "value",
31
- "complianceReport": "value",
32
- "complianceReportSchedule": "value",
33
- "complianceRole": "value",
34
36
  "complianceRule": "value",
35
37
  "complianceRuleHistory": "value",
36
38
  "complianceRuleSubscription": "value",
37
39
  "complianceScan": "value",
38
40
  "complianceScanSchedule": "value",
41
+ "composeSnapshot": "function",
39
42
  "Connection": "class",
40
43
  "ConnectionRetryStrategy": "class",
44
+ "correlateIncident": "function",
41
45
  "createSoftDeletePurgeScheduler": "function",
42
46
  "CrudService": "class",
43
47
  "currentViewerUserId": "function",
@@ -45,6 +49,8 @@
45
49
  "dashboardPanel": "value",
46
50
  "db": "value",
47
51
  "DEFAULT_CONSUMPTION_POLICY": "value",
52
+ "DEFAULT_SHARE_LINK_TTL_DAYS": "value",
53
+ "DEFAULT_THRESHOLDS": "value",
48
54
  "deploymentOutcome": "value",
49
55
  "DIRECTORY_SORTS": "value",
50
56
  "DIRECTORY_TIERS": "value",
@@ -53,40 +59,63 @@
53
59
  "drizzleListingSource": "function",
54
60
  "drizzleRows": "function",
55
61
  "ecosystemAutoApprovalRule": "value",
56
- "ecosystemCollection": "value",
57
62
  "ecosystemNotificationQueue": "value",
58
63
  "ecosystemReservedName": "value",
59
64
  "ecosystemSearchMiss": "value",
60
65
  "ecosystemSetting": "value",
61
66
  "effectiveConsumptionPolicy": "function",
67
+ "evaluateNeedsAttention": "function",
62
68
  "executeRows": "function",
69
+ "FAILURE_CATEGORY_LABELS": "value",
70
+ "getAdoption": "function",
63
71
  "getConnection": "function",
72
+ "getFailureAnalysis": "function",
73
+ "getOutdatedPlugins": "function",
74
+ "getPipelineBreakdown": "function",
75
+ "getPluginVulnerabilities": "function",
76
+ "getPromotionView": "function",
64
77
  "getPublicListedVersion": "function",
65
78
  "getPublicListing": "function",
66
79
  "getPublicReaderDb": "function",
80
+ "getResourceConsumption": "function",
81
+ "getSection": "function",
67
82
  "getSslConfig": "function",
83
+ "getStagePerformance": "function",
84
+ "getTemplate": "function",
68
85
  "getTenantContext": "function",
86
+ "hashToken": "function",
69
87
  "implicitInstallRange": "function",
70
88
  "incident": "value",
71
89
  "ingestHealth": "value",
72
90
  "INSTALL_VERSION_POLICIES": "value",
73
91
  "installAdmits": "function",
74
92
  "installModeFor": "function",
93
+ "isDeployEvent": "function",
75
94
  "isPublicReaderConfigured": "function",
95
+ "isTeamActionable": "function",
76
96
  "isUniqueViolation": "function",
77
97
  "isVersionRange": "function",
98
+ "lapsedAcceptances": "function",
99
+ "leadTimeGapOf": "function",
78
100
  "listedPluginRecord": "function",
79
101
  "listedVersionWarnings": "function",
102
+ "listEnabledAlertDestinations": "function",
80
103
  "listingBlock": "function",
81
104
  "listPublicCategories": "function",
82
105
  "listPublicListingsForSitemap": "function",
83
106
  "listPublicReviews": "function",
84
107
  "loadOrgInstallContext": "function",
108
+ "LOW_SAMPLE_THRESHOLD": "value",
109
+ "MAX_BOUNCES": "value",
110
+ "MAX_SHARE_LINK_TTL_DAYS": "value",
85
111
  "message": "value",
86
112
  "messageAttachment": "value",
113
+ "mintToken": "function",
114
+ "nextPeriodBoundary": "function",
87
115
  "normalizeQuery": "function",
88
116
  "OFFICIAL_PUBLISHER_HANDLE": "value",
89
117
  "OPEN_PUBLISH_REQUEST_STATUSES": "value",
118
+ "openExposures": "function",
90
119
  "orgAlertDestination": "value",
91
120
  "orgAlertRule": "value",
92
121
  "orgListingStates": "function",
@@ -121,23 +150,57 @@
121
150
  "publicReviews": "value",
122
151
  "publisher": "value",
123
152
  "PUBLISHER_TIERS": "value",
153
+ "rebuildDay": "function",
154
+ "refreshLatestForPlugin": "function",
155
+ "registerSection": "function",
156
+ "rejectUnreportablePeriod": "function",
157
+ "renderReportHtml": "function",
158
+ "replacePipelineResolution": "function",
159
+ "REPORT_CADENCES": "value",
160
+ "REPORT_FEATURE_SUBSTITUTES": "value",
161
+ "REPORT_PAUSE_REASONS": "value",
162
+ "REPORT_RUN_STATUSES": "value",
163
+ "REPORT_SCOPE_KINDS": "value",
164
+ "REPORT_TEMPLATE_SPECS": "value",
165
+ "REPORT_TEMPLATES": "value",
166
+ "reportDefinition": "value",
167
+ "reportFileName": "function",
124
168
  "reportingService": "value",
125
169
  "ReportingService": "class",
170
+ "reportRecipient": "value",
171
+ "reportRun": "value",
172
+ "reportShareLink": "value",
126
173
  "resolvableListings": "function",
127
174
  "resolveListingReference": "function",
175
+ "resolvePeriod": "function",
176
+ "resolvePeriodByLabel": "function",
128
177
  "resultRows": "function",
129
178
  "REVIEW_REPORT_CATEGORIES": "value",
130
179
  "REVIEW_SORTS": "value",
180
+ "rollupBatchDays": "function",
181
+ "rollupSettleHours": "function",
182
+ "runRollupPass": "function",
131
183
  "runSoftDeletePurge": "function",
132
184
  "runWithTenantContext": "function",
133
185
  "satisfiesVersionSpec": "function",
134
186
  "schema": "value",
135
187
  "scopeOrgIds": "function",
136
188
  "searchPublicListings": "function",
189
+ "sectionIds": "function",
137
190
  "semverOrderBy": "function",
138
191
  "softDeleteRetentionMs": "function",
192
+ "stakeholderReportStore": "value",
193
+ "StakeholderReportStore": "class",
139
194
  "tenantContext": "value",
140
195
  "testConnection": "function",
196
+ "thresholdsFrom": "function",
197
+ "trendSentence": "function",
198
+ "triageExposure": "function",
199
+ "upsertDeployments": "function",
200
+ "upsertExposures": "function",
201
+ "utcDayStart": "function",
202
+ "VERIFICATION_TTL_MS": "value",
203
+ "versionGap": "function",
141
204
  "viewerCacheSegment": "function",
142
205
  "withTenantTx": "function",
143
206
  "withViewerContext": "function"
package/package.json CHANGED
@@ -26,7 +26,7 @@
26
26
  "dependencies": {
27
27
  "drizzle-orm": "0.45.3",
28
28
  "pg": "8.23.0",
29
- "@pipeline-builder/api-core": "4.1.21"
29
+ "@pipeline-builder/api-core": "5.0.0"
30
30
  },
31
31
  "keywords": [
32
32
  "ci-cd",
@@ -66,7 +66,7 @@
66
66
  "cli"
67
67
  ],
68
68
  "engines": {
69
- "node": ">= 24.14.0"
69
+ "node": ">= 24.21.0"
70
70
  },
71
71
  "devEngines": {
72
72
  "packageManager": {
@@ -82,7 +82,7 @@
82
82
  "access": "public",
83
83
  "registry": "https://registry.npmjs.org/"
84
84
  },
85
- "version": "4.1.23",
85
+ "version": "4.1.25",
86
86
  "bugs": {
87
87
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
88
88
  },
@@ -150,6 +150,7 @@
150
150
  "src/**/*.ts",
151
151
  "!src/**/*.d.ts",
152
152
  "!src/testing/**",
153
+ "!src/api/reporting/stakeholder/index.ts",
153
154
  "!src/api/reporting/types.ts",
154
155
  "!src/core/query-filters.ts",
155
156
  "!src/database/index.ts",