@pipeline-builder/pipeline-data 4.3.2 → 4.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/lib/api/crud-service.d.ts +7 -0
  2. package/lib/api/crud-service.js +14 -3
  3. package/lib/api/ecosystem-privacy.d.ts +25 -0
  4. package/lib/api/ecosystem-privacy.js +58 -0
  5. package/lib/api/pipeline-step-resolution.d.ts +111 -0
  6. package/lib/api/pipeline-step-resolution.js +163 -0
  7. package/lib/api/plugin-consumption-policy.d.ts +8 -2
  8. package/lib/api/plugin-consumption-policy.js +20 -3
  9. package/lib/api/plugin-resolution.d.ts +26 -9
  10. package/lib/api/plugin-resolution.js +51 -33
  11. package/lib/api/public-directory.js +1 -1
  12. package/lib/api/reporting/analytics-queries.d.ts +6 -4
  13. package/lib/api/reporting/analytics-queries.js +15 -14
  14. package/lib/api/reporting/deploy-rollup.d.ts +2 -0
  15. package/lib/api/reporting/deploy-rollup.js +5 -1
  16. package/lib/api/reporting/failure-classifier.d.ts +2 -6
  17. package/lib/api/reporting/failure-classifier.js +22 -1
  18. package/lib/api/reporting/ingest.js +73 -16
  19. package/lib/api/reporting/plugin-exposure.d.ts +261 -15
  20. package/lib/api/reporting/plugin-exposure.js +423 -38
  21. package/lib/api/reporting/stakeholder/compose.d.ts +1 -1
  22. package/lib/api/reporting/stakeholder/compose.js +30 -1
  23. package/lib/api/reporting/stakeholder/store.d.ts +16 -2
  24. package/lib/api/reporting/stakeholder/store.js +17 -6
  25. package/lib/api/reporting/types.d.ts +80 -1
  26. package/lib/api/reporting/types.js +1 -1
  27. package/lib/api/reporting-service.d.ts +11 -4
  28. package/lib/api/reporting-service.js +106 -43
  29. package/lib/api/soft-delete-sweep.d.ts +8 -18
  30. package/lib/api/soft-delete-sweep.js +35 -5
  31. package/lib/api/support-cases.d.ts +380 -0
  32. package/lib/api/support-cases.js +671 -0
  33. package/lib/api/version-references.d.ts +80 -0
  34. package/lib/api/version-references.js +135 -0
  35. package/lib/core/query-filters.d.ts +3 -3
  36. package/lib/core/query-filters.js +1 -1
  37. package/lib/database/drizzle-schema.d.ts +4858 -2759
  38. package/lib/database/drizzle-schema.js +13 -3
  39. package/lib/database/index.d.ts +1 -1
  40. package/lib/database/index.js +2 -2
  41. package/lib/database/schema/ecosystem.d.ts +53 -0
  42. package/lib/database/schema/ecosystem.js +14 -3
  43. package/lib/database/schema/pipeline.d.ts +38 -0
  44. package/lib/database/schema/pipeline.js +20 -2
  45. package/lib/database/schema/plugin.d.ts +265 -0
  46. package/lib/database/schema/plugin.js +34 -3
  47. package/lib/database/schema/reporting-analytics.d.ts +786 -4
  48. package/lib/database/schema/reporting-analytics.js +111 -5
  49. package/lib/database/schema/support.d.ts +1093 -0
  50. package/lib/database/schema/support.js +323 -0
  51. package/lib/database/tenancy.d.ts +7 -5
  52. package/lib/database/tenancy.js +1 -1
  53. package/lib/index.d.ts +7 -3
  54. package/lib/index.js +11 -3
  55. package/lib/testing/exports.json +57 -0
  56. package/package.json +4 -3
@@ -74,9 +74,12 @@ export const EXPOSURE_SOURCES = ['declared', 'deployed'];
74
74
  * What an org decided about an exposure. `open` until someone looks;
75
75
  * `accepted` is a time-boxed decision with a reason and an owner, never a
76
76
  * permanent mute; `false_positive` is a scanner disagreement worth recording so
77
- * the same finding stops being re-raised as news.
77
+ * the same finding stops being re-raised as news. `fixed` = the pipeline moved
78
+ * to another version of the plugin; `removed` = the step (or the pipeline, or
79
+ * its deploy) is gone — the triage fields are KEPT, so a step re-added before
80
+ * an acceptance's deadline gets the acceptance back.
78
81
  */
79
- export const EXPOSURE_TRIAGE_STATES = ['open', 'accepted', 'false_positive', 'fixed'];
82
+ export const EXPOSURE_TRIAGE_STATES = ['open', 'accepted', 'false_positive', 'fixed', 'removed'];
80
83
  /**
81
84
  * One deployment: an execution that reached an environment.
82
85
  *
@@ -114,6 +117,12 @@ export const doraDeployment = pgTable('dora_deployments', {
114
117
  restoredAt: timestamp('restored_at', { withTimezone: true }),
115
118
  /** How the incident→deploy link was judged. NULL when nothing was correlated. */
116
119
  correlationConfidence: varchar('correlation_confidence', { length: 10 }).$type(),
120
+ /**
121
+ * The EventBridge event id of the deploy STAGE event that last wrote this row,
122
+ * so a DORA number traces back to the exact `pipeline_events` row (and AWS
123
+ * event) behind it. NULL for a deploy from a producer without one.
124
+ */
125
+ sourceEventId: varchar('source_event_id', { length: 128 }),
117
126
  createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
118
127
  updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
119
128
  }, (table) => ({
@@ -186,12 +195,27 @@ export const pipelinePluginResolution = pgTable('pipeline_plugin_resolution', {
186
195
  declaredVersion: varchar('declared_version', { length: 50 }),
187
196
  /** What that resolves to today. NULL when nothing satisfies it. */
188
197
  resolvedVersion: varchar('resolved_version', { length: 50 }),
198
+ /** The resolved record: a `plugins` row id or a listing version id. */
199
+ resolvedPluginId: varchar('resolved_plugin_id', { length: 255 }),
200
+ /**
201
+ * The image digest the resolved version is pinned to. A version string alone
202
+ * cannot say whether a pipeline is on the rebuilt, patched image or the old
203
+ * one — the rescan and the advisory search match on this.
204
+ */
205
+ resolvedDigest: varchar('resolved_digest', { length: 71 }),
189
206
  /** The newest version the org is entitled to install, for the "gap" column. */
190
207
  latestVersion: varchar('latest_version', { length: 50 }),
191
208
  /** `major` / `minor` / `patch` / `none`, from resolved → latest. */
192
209
  versionGap: varchar('version_gap', { length: 10 }),
193
210
  /** False when the resolved version is outside the org's consumption policy. */
194
211
  withinPolicy: boolean('within_policy').default(true).notNull(),
212
+ /**
213
+ * The root org of a TEAM's pipeline (null for a root org's). A team resolves
214
+ * through its root's installs, policy and shared plugins, and the plugin
215
+ * service re-resolving a pipeline after a publish / flag / yank has no request
216
+ * to read the hierarchy from — so the write that knew it records it.
217
+ */
218
+ rootOrgId: varchar('root_org_id', { length: 255 }),
195
219
  computedAt: timestamp('computed_at', { withTimezone: true }).defaultNow().notNull(),
196
220
  }, (table) => ({
197
221
  pk: primaryKey({ columns: [table.pipelineId, table.stageName, table.stepName] }),
@@ -199,6 +223,9 @@ export const pipelinePluginResolution = pgTable('pipeline_plugin_resolution', {
199
223
  pluginIdx: index('pipeline_plugin_resolution_plugin_idx').on(table.pluginPublisher, table.pluginName),
200
224
  // "Which pipelines are behind?" — the outdated section's driving scan.
201
225
  gapIdx: index('pipeline_plugin_resolution_gap_idx').on(table.orgId, table.versionGap),
226
+ // "Which pipelines declare this version / image?" — rescan fan-out, advisory search.
227
+ versionIdx: index('pipeline_plugin_resolution_version_idx')
228
+ .on(table.pluginName, table.resolvedVersion, table.resolvedDigest),
202
229
  }));
203
230
  /**
204
231
  * One pipeline's exposure to one vulnerable plugin version.
@@ -228,6 +255,16 @@ export const pluginVulnExposure = pgTable('plugin_vuln_exposure', {
228
255
  highCount: integer('high_count').default(0).notNull(),
229
256
  /** The findings themselves: CVE id, package, fixed-in version. Capped by the writer. */
230
257
  topFindings: jsonb('top_findings').$type().default([]).notNull(),
258
+ /**
259
+ * EVERY Critical/High finding of the version at its last refresh, as finding
260
+ * keys (`id|package|packageVersion`) — uncapped, unlike `top_findings`, because
261
+ * an acceptance is checked against it: what was accepted must be provable.
262
+ */
263
+ findingKeys: text('finding_keys').array().$type().default([]).notNull(),
264
+ /** The finding keys an `accepted` triage covered, frozen at the decision. */
265
+ acceptedFindingKeys: text('accepted_finding_keys').array().$type().default([]).notNull(),
266
+ /** The acceptance explicitly covered KEV-listed findings (never implied). */
267
+ acceptedKev: boolean('accepted_kev').default(false).notNull(),
231
268
  flaggedAt: timestamp('flagged_at', { withTimezone: true }).defaultNow().notNull(),
232
269
  /** Set when a deploy moved the pipeline onto a version without the findings. */
233
270
  fixedAt: timestamp('fixed_at', { withTimezone: true }),
@@ -240,11 +277,80 @@ export const pluginVulnExposure = pgTable('plugin_vuln_exposure', {
240
277
  updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
241
278
  }, (table) => ({
242
279
  // One live exposure per (pipeline, plugin version, digest, source): a nightly
243
- // rescan refreshes counts rather than opening a new row every night.
280
+ // rescan refreshes counts rather than opening a new row every night, and a
281
+ // version rebuilt on a patched base (same string, new digest) gets its own row.
282
+ // postgres-init.sql creates it NULLS NOT DISTINCT (drizzle's uniqueIndex can't
283
+ // say so) so an image-less version still has exactly one row to refresh.
244
284
  exposureUnique: uniqueIndex('plugin_vuln_exposure_unique')
245
- .on(table.pipelineId, table.pluginName, table.pluginVersion, table.source),
285
+ .on(table.pipelineId, table.pluginName, table.pluginVersion, table.imageDigest, table.source),
246
286
  orgOpenIdx: index('plugin_vuln_exposure_org_open_idx').on(table.orgId, table.triageState)
247
287
  .where(sql `fixed_at IS NULL`),
248
288
  digestIdx: index('plugin_vuln_exposure_digest_idx').on(table.imageDigest),
249
289
  }));
250
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLWFuYWx5dGljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9zY2hlbWEvcmVwb3J0aW5nLWFuYWx5dGljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVqSTs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLENBQVUsQ0FBQztBQUc1Rzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQVUsQ0FBQztBQUcxRTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQVUsQ0FBQztBQUc5Rjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCO0lBQ3pFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYTtJQUNoRixlQUFlLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFLE9BQU87Q0FD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RUFBdUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFO0lBQzNHLG1GQUFtRjtJQUNuRixhQUFhLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2xFLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ25DLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLFNBQVMsRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzFELFNBQVMsRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFO0NBQ2xGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDYiw4RUFBOEU7SUFDOUUscUVBQXFFO0lBQ3JFLGNBQWMsRUFBRSxXQUFXLENBQUMsNkJBQTZCLENBQUM7U0FDdkQsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDNUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUM7U0FDdEYsS0FBSyxDQUFDLEdBQUcsQ0FBQSxrQkFBa0IsQ0FBQztJQUMvQixTQUFTLEVBQUUsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7Q0FDMUUsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgYW5hbHl0aWNzIGxheWVyIGV2ZXJ5IHJlcG9ydCBzZWN0aW9uIGFuZCBkYXNoYm9hcmQgcmVhZHMgaW5zdGVhZCBvZiByYXdcbiAqIGV2ZW50cy5cbiAqXG4gKiBSZXBvcnRpbmcgaGFzIGJlZW4gc2Nhbm5pbmcgYHBpcGVsaW5lX2V2ZW50c2AgZGlyZWN0bHkuIFRoYXQgd29ya2VkIHdoaWxlIHRoZVxuICogb25seSBjb25zdW1lciB3YXMgb25lIGRhc2hib2FyZCBvdmVyIGEgMzAtZGF5IHdpbmRvdywgYW5kIHN0b3BzIHdvcmtpbmcgZm9yXG4gKiB0aGlzIGZlYXR1cmU6IGEgcXVhcnRlcmx5IHJlcG9ydCBvdmVyIGEgOTAtZGF5IHdpbmRvdywgZm9yIGFuIG9yZyB3aXRoIGFcbiAqIHRob3VzYW5kIGV4ZWN1dGlvbnMgYSBkYXksIHJlLWRlcml2ZXMgdGhlIHNhbWUgYWdncmVnYXRlcyBvbiBldmVyeSByZWFkLCBhbmRcbiAqIHRoZSByZXRlbnRpb24gc3dlZXAgdGhlbiBkZWxldGVzIHRoZSByb3dzIHRoZSBudW1iZXJzIGNhbWUgZnJvbS4gVHdvIHRhYmxlcyBmaXhcbiAqIGJvdGggcHJvYmxlbXM6XG4gKlxuICogIC0gYGRvcmFfZGVwbG95bWVudHNgIOKAlCBPTkUgUk9XIFBFUiBERVBMT1ksIHdyaXR0ZW4gYXQgaW5nZXN0LiBMZWFkIHRpbWUgaXNcbiAqICAgIHN0b3JlZCBwZXIgZXhlY3V0aW9uIGhlcmUsIG5ldmVyIHJlY29tcHV0ZWQgcGVyIGV2ZW50LCBiZWNhdXNlIHRoZVxuICogICAgcGVyLWV2ZW50IGZvcm0gZG91YmxlLWNvdW50czogYSBkZXBsb3kgc3RhZ2UgZW1pdHMgYSBTVEFHRSBldmVudCBhbmQgYW5cbiAqICAgIEFDVElPTiBldmVudCwgYW5kIGJvdGggY2FycnkgdGhlIHNhbWUgY29tbWl0IHJhbmdlLlxuICogIC0gYGV4ZWN1dGlvbl9kYWlseV9yb2xsdXBzYCDigJQgb25lIHJvdyBwZXIgb3JnLCBwaXBlbGluZSwgc3RhZ2UgYW5kIGRheS4gRXZlcnlcbiAqICAgIHNlY3Rpb24gdGhhdCBzYXlzIFwicnVuc1wiLCBcInN1Y2Nlc3MgcmF0ZVwiLCBcInA5NVwiIG9yIFwiYnVpbGQgbWludXRlc1wiIHJlYWRzXG4gKiAgICB0aGVzZSwgc28gYSByZXBvcnQgY29zdHMgYSBmZXcgaHVuZHJlZCByb3dzIGluc3RlYWQgb2YgYSBmZXcgaHVuZHJlZFxuICogICAgdGhvdXNhbmQuXG4gKlxuICogQm90aCBhcmUgREVSSVZFRDogdGhleSBjYW4gYmUgcmVidWlsdCBmcm9tIGV2ZW50cyB3aGlsZSB0aGUgZXZlbnRzIGV4aXN0LCBhbmRcbiAqIHRoZXkgb3V0bGl2ZSB0aGVtIGFmdGVyd2FyZHMuIFRoYXQgaXMgdGhlIHBvaW50IOKAlCB0aGV5IGFyZSB0aGUgcmV0YWluZWQgZm9ybS5cbiAqXG4gKiBUaGUgb3RoZXIgdHdvIHRhYmxlcyBoZXJlIGFuc3dlciBcIndoYXQgaXMgYWN0dWFsbHkgcnVubmluZ1wiLCB3aGljaCB0aGUgcmVwb3J0J3NcbiAqIHBsdWdpbiBzZWN0aW9ucyBuZWVkIGFuZCBubyBleGlzdGluZyB0YWJsZSBjYW4gYW5zd2VyOlxuICpcbiAqICAtIGBwaXBlbGluZV9wbHVnaW5fcmVzb2x1dGlvbmAg4oCUIHdoYXQgYSBwaXBlbGluZSdzIERFQ0xBUkVEIHBsdWdpbiB2ZXJzaW9uc1xuICogICAgcmVzb2x2ZSB0bywgcmVjb21wdXRlZCBvbiB3cml0ZSByYXRoZXIgdGhhbiByZXNvbHZlZCBwZXIgcmVhZC5cbiAqICAtIGBwbHVnaW5fdnVsbl9leHBvc3VyZWAg4oCUIHdoaWNoIHBpcGVsaW5lcyBhcmUgZXhwb3NlZCB0byB3aGljaCB2dWxuZXJhYmxlXG4gKiAgICBwbHVnaW4gdmVyc2lvbiwgb3BlbmVkIGJ5IGEgcmVzY2FuIGFuZCBjbG9zZWQgYnkgYSBmaXhpbmcgZGVwbG95LlxuICovXG5cbmltcG9ydCB7IHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGJvb2xlYW4sIGluZGV4LCBpbnRlZ2VyLCBqc29uYiwgcGdUYWJsZSwgcHJpbWFyeUtleSwgdGV4dCwgdGltZXN0YW1wLCB1bmlxdWVJbmRleCwgdmFyY2hhciB9IGZyb20gJ2RyaXp6bGUtb3JtL3BnLWNvcmUnO1xuXG4vKipcbiAqIFdoeSBhIGRlcGxveSdzIGxlYWQgdGltZSBjb3VsZCBub3QgYmUgbWVhc3VyZWQuIFJlY29yZGVkIHJhdGhlciB0aGFuIGxlZnQgTlVMTFxuICogd2l0aCBubyBleHBsYW5hdGlvbiwgYmVjYXVzZSB0aGUgdGhyZWUgY2F1c2VzIG5lZWQgZGlmZmVyZW50IGZpeGVzIGFuZCB0aGVcbiAqIHJlcG9ydCBzaG93cyB0aGUgcmVhc29uOiBubyBTQ00gdG9rZW4gZm9yIHRoZSBzb3VyY2UsIHRoZSBwcm92aWRlciByYXRlLWxpbWl0ZWRcbiAqIHRoZSByYW5nZSB3YWxrLCBvciB0aGUgc291cmNlIHR5cGUgaGFzIG5vIHJhbmdlIEFQSSBhdCBhbGwuXG4gKi9cbmV4cG9ydCBjb25zdCBMRUFEX1RJTUVfR0FQUyA9IFsnbm9fdG9rZW4nLCAncmF0ZV9saW1pdGVkJywgJ3Vuc3VwcG9ydGVkX3NvdXJjZScsICdub19jb21taXRfZGF0YSddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgTGVhZFRpbWVHYXAgPSAodHlwZW9mIExFQURfVElNRV9HQVBTKVtudW1iZXJdO1xuXG4vKipcbiAqIEhvdyBjb25maWRlbnRseSBhbiBpbmNpZGVudCB3YXMgYXR0cmlidXRlZCB0byBhIGRlcGxveS4gU2hvd24gYmVzaWRlIGNoYW5nZVxuICogZmFpbHVyZSByYXRlIGFuZCB0aW1lIHRvIHJlc3RvcmUsIGJlY2F1c2UgXCJ0aGlzIGRlcGxveSBicm9rZSBwcm9kdWN0aW9uXCIgYW5kXG4gKiBcImFuIGluY2lkZW50IG9wZW5lZCBzb21lIGhvdXJzIGFmdGVyIHRoaXMgZGVwbG95XCIgYXJlIGRpZmZlcmVudCBjbGFpbXMgYW5kIGFcbiAqIG1hbmFnZXIgYWN0cyBkaWZmZXJlbnRseSBvbiBlYWNoLlxuICovXG5leHBvcnQgY29uc3QgQ09SUkVMQVRJT05fQ09ORklERU5DRVMgPSBbJ2hpZ2gnLCAnbWVkaXVtJywgJ2xvdyddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQ29ycmVsYXRpb25Db25maWRlbmNlID0gKHR5cGVvZiBDT1JSRUxBVElPTl9DT05GSURFTkNFUylbbnVtYmVyXTtcblxuLyoqXG4gKiBIb3cgYSBwaXBlbGluZSBjYW1lIHRvIGV4aXN0LiBGb3IgdGhlIGFkb3B0aW9uIHNlY3Rpb246IGFuIG9yZyB3aG9zZSBwaXBlbGluZXNcbiAqIGFyZSBhbGwgaGFuZC1idWlsdCBpcyBhIGRpZmZlcmVudCBhZG9wdGlvbiBzdG9yeSBmcm9tIG9uZSB0ZW1wbGF0aW5nIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBQSVBFTElORV9DUkVBVElPTl9TT1VSQ0VTID0gWydtYW51YWwnLCAndGVtcGxhdGUnLCAnYWknLCAnYnVsaycsICdjZGsnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBpcGVsaW5lQ3JlYXRpb25Tb3VyY2UgPSAodHlwZW9mIFBJUEVMSU5FX0NSRUFUSU9OX1NPVVJDRVMpW251bWJlcl07XG5cbi8qKlxuICogV2hhdCBraW5kIG9mIHRoaW5nIGJyb2tlLiBBc3NpZ25lZCBhdCBpbmdlc3QgYnkgdGhlIGNsYXNzaWZpZXJcbiAqIChgYXBpL3JlcG9ydGluZy9zcmMvc2VydmljZXMvZmFpbHVyZS1jbGFzc2lmaWVyLnRzYCksIHdoaWNoIGlzIHJ1bGVzIG92ZXIgdGhlXG4gKiBhY3Rpb24ncyB0eXBlIGFuZCBlcnJvciB0ZXh0IOKAlCBkZWxpYmVyYXRlbHkgZGF0YSwgbm90IGNvZGUsIHNvIHRoZSB0YXhvbm9teSBjYW5cbiAqIGdyb3cgd2l0aG91dCBhIGRlcGxveS5cbiAqXG4gKiBUaGUgY2F0ZWdvcmllcyBvdmVybGFwIHRoZSBwbHVnaW4tYnVpbGQgdGF4b25vbXkgb24gcHVycG9zZTogYSBkZXBlbmRlbmN5XG4gKiBmYWlsdXJlIGlzIGEgZGVwZW5kZW5jeSBmYWlsdXJlIHdoZXRoZXIgaXQgaGFwcGVuZWQgYnVpbGRpbmcgYSBwbHVnaW4gb3JcbiAqIHJ1bm5pbmcgb25lLCBhbmQgdHdvIHZvY2FidWxhcmllcyBmb3IgdGhlIHNhbWUgdGhpbmcgd291bGQgbWFrZSB0aGUgcmVwb3J0IGFuZFxuICogdGhlIGJ1aWxkIHF1ZXVlIGRpc2FncmVlLlxuICovXG5leHBvcnQgY29uc3QgRkFJTFVSRV9DQVRFR09SSUVTID0gW1xuICAnc291cmNlX2NoZWNrb3V0JywgJ2RlcGVuZGVuY3knLCAnYnVpbGQnLCAndW5pdF90ZXN0JywgJ2ludGVncmF0aW9uX3Rlc3QnLFxuICAnc2VjdXJpdHlfc2NhbicsICdpbmZyYXN0cnVjdHVyZScsICdkZXBsb3ltZW50JywgJ2F1dGhlbnRpY2F0aW9uJywgJ3Blcm1pc3Npb25zJyxcbiAgJ2NvbmZpZ3VyYXRpb24nLCAndGltZW91dCcsICdyZXNvdXJjZV9leGhhdXN0aW9uJywgJ2V4dGVybmFsX3NlcnZpY2UnLCAnb3RoZXInLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEZhaWx1cmVDYXRlZ29yeSA9ICh0eXBlb2YgRkFJTFVSRV9DQVRFR09SSUVTKVtudW1iZXJdO1xuXG4vKiogV2hlcmUgYSBwbHVnaW4tdmVyc2lvbiBleHBvc3VyZSB3YXMgb2JzZXJ2ZWQuICovXG5leHBvcnQgY29uc3QgRVhQT1NVUkVfU09VUkNFUyA9IFsnZGVjbGFyZWQnLCAnZGVwbG95ZWQnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEV4cG9zdXJlU291cmNlID0gKHR5cGVvZiBFWFBPU1VSRV9TT1VSQ0VTKVtudW1iZXJdO1xuXG4vKipcbiAqIFdoYXQgYW4gb3JnIGRlY2lkZWQgYWJvdXQgYW4gZXhwb3N1cmUuIGBvcGVuYCB1bnRpbCBzb21lb25lIGxvb2tzO1xuICogYGFjY2VwdGVkYCBpcyBhIHRpbWUtYm94ZWQgZGVjaXNpb24gd2l0aCBhIHJlYXNvbiBhbmQgYW4gb3duZXIsIG5ldmVyIGFcbiAqIHBlcm1hbmVudCBtdXRlOyBgZmFsc2VfcG9zaXRpdmVgIGlzIGEgc2Nhbm5lciBkaXNhZ3JlZW1lbnQgd29ydGggcmVjb3JkaW5nIHNvXG4gKiB0aGUgc2FtZSBmaW5kaW5nIHN0b3BzIGJlaW5nIHJlLXJhaXNlZCBhcyBuZXdzLlxuICovXG5leHBvcnQgY29uc3QgRVhQT1NVUkVfVFJJQUdFX1NUQVRFUyA9IFsnb3BlbicsICdhY2NlcHRlZCcsICdmYWxzZV9wb3NpdGl2ZScsICdmaXhlZCddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRXhwb3N1cmVUcmlhZ2VTdGF0ZSA9ICh0eXBlb2YgRVhQT1NVUkVfVFJJQUdFX1NUQVRFUylbbnVtYmVyXTtcblxuLyoqXG4gKiBPbmUgZGVwbG95bWVudDogYW4gZXhlY3V0aW9uIHRoYXQgcmVhY2hlZCBhbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBXcml0dGVuIGF0IGluZ2VzdCwgb25lIHJvdyBwZXIgKGV4ZWN1dGlvbiwgZW52aXJvbm1lbnQpLiBFdmVyeXRoaW5nIERPUkFcbiAqIHJlcG9ydHMgaXMgaGVyZSwgc28gYC9kb3JhYCwgdGhlIHRyZW5kIGFuZCB0aGUgcmVwb3J0IHNlY3Rpb25zIHN0b3Agc2Nhbm5pbmdcbiAqIHJhdyBldmVudHMg4oCUIGFuZCBrZWVwIHdvcmtpbmcgYWZ0ZXIgdGhlIGV2ZW50cyBhcmUgc3dlcHQuXG4gKlxuICogQHRhYmxlIGRvcmFfZGVwbG95bWVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IGRvcmFEZXBsb3ltZW50ID0gcGdUYWJsZSgnZG9yYV9kZXBsb3ltZW50cycsIHtcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBleGVjdXRpb25JZDogdmFyY2hhcignZXhlY3V0aW9uX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGVudmlyb25tZW50OiB2YXJjaGFyKCdlbnZpcm9ubWVudCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBwaXBlbGluZUlkOiB2YXJjaGFyKCdwaXBlbGluZV9pZCcsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIC8qKiBXaGVuIHRoZSBkZXBsb3kgc3RhZ2UgY29tcGxldGVkLiBUaGUgZGVwbG95J3Mgb3duIHRpbWVzdGFtcCwgbm90IHRoZSBydW4ncy4gKi9cbiAgZGVwbG95ZWRBdDogdGltZXN0YW1wKCdkZXBsb3llZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLm5vdE51bGwoKSxcbiAgc3VjY2VlZGVkOiBib29sZWFuKCdzdWNjZWVkZWQnKS5ub3ROdWxsKCksXG4gIC8qKlxuICAgKiBUaGUgT0xERVNUIHVuc2hpcHBlZCBjb21taXQgaW4gdGhpcyBkZXBsb3kncyByYW5nZS4gTGVhZCB0aW1lIGlzXG4gICAqIGBkZXBsb3llZEF0IC0gZWFybGllc3RDb21taXRBdGAsIGNvbXB1dGVkIG9uY2UgYW5kIHN0b3JlZCwgYmVjYXVzZSB0aGVcbiAgICogcGVyLWV2ZW50IGZvcm0gZG91YmxlLWNvdW50cyBhIGRlcGxveSB0aGF0IGVtaXRzIGJvdGggYSBTVEFHRSBhbmQgYW4gQUNUSU9OXG4gICAqIGV2ZW50IGNhcnJ5aW5nIHRoZSBzYW1lIHJhbmdlLlxuICAgKi9cbiAgZWFybGllc3RDb21taXRBdDogdGltZXN0YW1wKCdlYXJsaWVzdF9jb21taXRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgbGVhZFRpbWVTZWNvbmRzOiBpbnRlZ2VyKCdsZWFkX3RpbWVfc2Vjb25kcycpLFxuICBjb21taXRDb3VudDogaW50ZWdlcignY29tbWl0X2NvdW50JyksXG4gIGNvbW1pdFNoYTogdmFyY2hhcignY29tbWl0X3NoYScsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIC8qKiBXaHkgbGVhZCB0aW1lIGlzIGFic2VudCwgd2hlbiBpdCBpcy4gTlVMTCB3aGVuIGl0IHdhcyBtZWFzdXJlZC4gKi9cbiAgbGVhZFRpbWVHYXA6IHZhcmNoYXIoJ2xlYWRfdGltZV9nYXAnLCB7IGxlbmd0aDogMzAgfSkuJHR5cGU8TGVhZFRpbWVHYXA+KCksXG4gIC8qKlxuICAgKiBQb3N0LWRlcGxveSBvdXRjb21lIG1hcmtlcnMsIGRlbm9ybWFsaXplZCBvbnRvIHRoZSBkZXBsb3kgc28gY2hhbmdlLWZhaWx1cmVcbiAgICogcmF0ZSBhbmQgdGltZS10by1yZXN0b3JlIGFyZSBvbmUgc2NhbiByYXRoZXIgdGhhbiBhIGpvaW4gcGVyIHdpbmRvdy5cbiAgICovXG4gIGZhaWxlZEF0OiB0aW1lc3RhbXAoJ2ZhaWxlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICByZXN0b3JlZEF0OiB0aW1lc3RhbXAoJ3Jlc3RvcmVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIC8qKiBIb3cgdGhlIGluY2lkZW504oaSZGVwbG95IGxpbmsgd2FzIGp1ZGdlZC4gTlVMTCB3aGVuIG5vdGhpbmcgd2FzIGNvcnJlbGF0ZWQuICovXG4gIGNvcnJlbGF0aW9uQ29uZmlkZW5jZTogdmFyY2hhcignY29ycmVsYXRpb25fY29uZmlkZW5jZScsIHsgbGVuZ3RoOiAxMCB9KS4kdHlwZTxDb3JyZWxhdGlvbkNvbmZpZGVuY2U+KCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICAvLyBPbmUgcm93IHBlciBleGVjdXRpb24gcGVyIGVudmlyb25tZW50OiBhIHJlZGVsaXZlcmVkIGV2ZW50IHVwc2VydHMgcmF0aGVyXG4gIC8vIHRoYW4gaW5zZXJ0aW5nIGEgc2Vjb25kIGRlcGxveSAoRXZlbnRCcmlkZ2Ug4oaSIFNRUyBpcyBhdC1sZWFzdC1vbmNlKS5cbiAgcGs6IHByaW1hcnlLZXkoeyBjb2x1bW5zOiBbdGFibGUuZXhlY3V0aW9uSWQsIHRhYmxlLmVudmlyb25tZW50XSB9KSxcbiAgLy8gVGhlIHdpbmRvdyBzY2FuIGV2ZXJ5IERPUkEgcmVhZCBkb2VzLlxuICBvcmdFbnZEZXBsb3llZElkeDogaW5kZXgoJ2RvcmFfZGVwbG95bWVudF9vcmdfZW52X2RlcGxveWVkX2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5lbnZpcm9ubWVudCwgdGFibGUuZGVwbG95ZWRBdCksXG4gIG9yZ0RlcGxveWVkSWR4OiBpbmRleCgnZG9yYV9kZXBsb3ltZW50X29yZ19kZXBsb3llZF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuZGVwbG95ZWRBdCksXG4gIHBpcGVsaW5lSWR4OiBpbmRleCgnZG9yYV9kZXBsb3ltZW50X3BpcGVsaW5lX2lkeCcpLm9uKHRhYmxlLnBpcGVsaW5lSWQsIHRhYmxlLmRlcGxveWVkQXQpLFxuICAvLyBUaGUgcHJvbW90aW9uIHZpZXc6IG9uZSBjb21taXQncyBwYXRoIGFjcm9zcyBlbnZpcm9ubWVudHMuXG4gIGNvbW1pdElkeDogaW5kZXgoJ2RvcmFfZGVwbG95bWVudF9jb21taXRfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmNvbW1pdFNoYSlcbiAgICAud2hlcmUoc3FsYGNvbW1pdF9zaGEgSVMgTk9UIE5VTExgKSxcbn0pKTtcblxuLyoqXG4gKiBQcmUtYWdncmVnYXRlZCBleGVjdXRpb24gY291bnRzIGFuZCB0aW1pbmdzLCBvbmUgcm93IHBlciBvcmcsIHBpcGVsaW5lLCBzdGFnZVxuICogYW5kIFVUQyBkYXkuXG4gKlxuICogUmVidWlsdCBmb3IgYSBkYXkgd2hlbiBsYXRlIGV2ZW50cyBhcnJpdmUsIHNvIHRoZSByb2xsdXAgYW5kIHRoZSBldmVudHMgYWdyZWVcbiAqIHdoaWxlIGJvdGggZXhpc3QuIGBmYWlsdXJlc0J5Q2F0ZWdvcnlgIGlzIGEgSlNPTiBtYXAgcmF0aGVyIHRoYW4gYSBjb2x1bW4gcGVyXG4gKiBjYXRlZ29yeSBiZWNhdXNlIHRoZSB0YXhvbm9teSBncm93cy5cbiAqXG4gKiBAdGFibGUgZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHNcbiAqL1xuZXhwb3J0IGNvbnN0IGV4ZWN1dGlvbkRhaWx5Um9sbHVwID0gcGdUYWJsZSgnZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHMnLCB7XG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgLyoqIFRoZSBVVEMgZGF0ZSB0aGlzIHJvdyBhZ2dyZWdhdGVzLiBSZXBvcnQgcGVyaW9kcyByZS1idWNrZXQgaW4gdGhlIHJlcG9ydCdzXG4gICAqICBvd24gdGltZXpvbmUgYnkgc3VtbWluZyBkYXlzIOKAlCB3aGljaCBpcyB3aHkgdGhlIGdyYWluIGlzIGEgREFZLiAqL1xuICBkYXk6IHRpbWVzdGFtcCgnZGF5JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkubm90TnVsbCgpLFxuICBwaXBlbGluZUlkOiB2YXJjaGFyKCdwaXBlbGluZV9pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICAvKiogYCcnYCBmb3IgdGhlIHBpcGVsaW5lLWxldmVsIHJvdzsgYSBzdGFnZSBuYW1lIGZvciBhIHN0YWdlLWxldmVsIHJvdy4gKi9cbiAgc3RhZ2VOYW1lOiB2YXJjaGFyKCdzdGFnZV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5kZWZhdWx0KCcnKS5ub3ROdWxsKCksXG4gIHJ1bnM6IGludGVnZXIoJ3J1bnMnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgc3VjY2VlZGVkOiBpbnRlZ2VyKCdzdWNjZWVkZWQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgZmFpbGVkOiBpbnRlZ2VyKCdmYWlsZWQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgLyoqIGNhdGVnb3J5IOKGkiBjb3VudC4gRmVlZHMgdGhlIGZhaWx1cmUtYW5hbHlzaXMgc2VjdGlvbi4gKi9cbiAgZmFpbHVyZXNCeUNhdGVnb3J5OiBqc29uYignZmFpbHVyZXNfYnlfY2F0ZWdvcnknKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PigpLmRlZmF1bHQoe30pLm5vdE51bGwoKSxcbiAgcDUwTXM6IGludGVnZXIoJ3A1MF9tcycpLFxuICBwOTBNczogaW50ZWdlcigncDkwX21zJyksXG4gIHA5NU1zOiBpbnRlZ2VyKCdwOTVfbXMnKSxcbiAgLyoqIFN1bW1lZCBleGVjdXRpb24gZHVyYXRpb24sIGluIHNlY29uZHMuIFRoZSByZXNvdXJjZS1jb25zdW1wdGlvbiBzZWN0aW9uJ3NcbiAgICogIG9ubHkgaW5wdXQ7IGRlbGliZXJhdGVseSBOT1QgY29udmVydGVkIHRvIG1vbmV5IGFueXdoZXJlLiAqL1xuICBidWlsZFNlY29uZHM6IGludGVnZXIoJ2J1aWxkX3NlY29uZHMnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgLyoqIFdoZW4gdGhpcyByb3cgd2FzIGxhc3QgcmVidWlsdCwgc28gYSBsYXRlLWV2ZW50IHJlYnVpbGQgaXMgdmlzaWJsZS4gKi9cbiAgY29tcHV0ZWRBdDogdGltZXN0YW1wKCdjb21wdXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIHBrOiBwcmltYXJ5S2V5KHsgY29sdW1uczogW3RhYmxlLm9yZ0lkLCB0YWJsZS5kYXksIHRhYmxlLnBpcGVsaW5lSWQsIHRhYmxlLnN0YWdlTmFtZV0gfSksXG4gIG9yZ0RheUlkeDogaW5kZXgoJ2V4ZWN1dGlvbl9yb2xsdXBfb3JnX2RheV9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuZGF5KSxcbiAgcGlwZWxpbmVEYXlJZHg6IGluZGV4KCdleGVjdXRpb25fcm9sbHVwX3BpcGVsaW5lX2RheV9pZHgnKS5vbih0YWJsZS5waXBlbGluZUlkLCB0YWJsZS5kYXkpLFxufSkpO1xuXG4vKipcbiAqIFdoYXQgYSBwaXBlbGluZSdzIGRlY2xhcmVkIHBsdWdpbiBzdGVwcyByZXNvbHZlIHRvLlxuICpcbiAqIFJlY29tcHV0ZWQgb24gcGlwZWxpbmUgd3JpdGUgYW5kIG9uIHBsdWdpbiBwdWJsaXNoLCByYXRoZXIgdGhhbiByZXNvbHZlZCBhdFxuICogcmVhZCB0aW1lOiB0aGUgb3V0ZGF0ZWQtcGx1Z2luIHNlY3Rpb24gY29tcGFyZXMgXCJpbiB1c2VcIiBhZ2FpbnN0IFwibGF0ZXN0XG4gKiBhdmFpbGFibGVcIiBmb3IgZXZlcnkgc3RlcCBvZiBldmVyeSBwaXBlbGluZSwgYW5kIGRvaW5nIHRoYXQgcmVzb2x1dGlvbiBwZXIgcmVhZFxuICogbWFkZSBpdCBhIHF1ZXJ5IG5vYm9keSBjb3VsZCBhZmZvcmQgdG8gcHV0IGluIGEgcmVwb3J0LlxuICpcbiAqIEB0YWJsZSBwaXBlbGluZV9wbHVnaW5fcmVzb2x1dGlvblxuICovXG5leHBvcnQgY29uc3QgcGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uID0gcGdUYWJsZSgncGlwZWxpbmVfcGx1Z2luX3Jlc29sdXRpb24nLCB7XG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcGlwZWxpbmVJZDogdmFyY2hhcigncGlwZWxpbmVfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgc3RhZ2VOYW1lOiB2YXJjaGFyKCdzdGFnZV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHN0ZXBOYW1lOiB2YXJjaGFyKCdzdGVwX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcGx1Z2luUHVibGlzaGVyOiB2YXJjaGFyKCdwbHVnaW5fcHVibGlzaGVyJywgeyBsZW5ndGg6IDM5IH0pLFxuICBwbHVnaW5OYW1lOiB2YXJjaGFyKCdwbHVnaW5fbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICAvKiogV2hhdCB0aGUgY29uZmlnIGFza2VkIGZvciDigJQgYSByYW5nZSwgYSBwaW4sIG9yIG5vdGhpbmcuICovXG4gIGRlY2xhcmVkVmVyc2lvbjogdmFyY2hhcignZGVjbGFyZWRfdmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KSxcbiAgLyoqIFdoYXQgdGhhdCByZXNvbHZlcyB0byB0b2RheS4gTlVMTCB3aGVuIG5vdGhpbmcgc2F0aXNmaWVzIGl0LiAqL1xuICByZXNvbHZlZFZlcnNpb246IHZhcmNoYXIoJ3Jlc29sdmVkX3ZlcnNpb24nLCB7IGxlbmd0aDogNTAgfSksXG4gIC8qKiBUaGUgbmV3ZXN0IHZlcnNpb24gdGhlIG9yZyBpcyBlbnRpdGxlZCB0byBpbnN0YWxsLCBmb3IgdGhlIFwiZ2FwXCIgY29sdW1uLiAqL1xuICBsYXRlc3RWZXJzaW9uOiB2YXJjaGFyKCdsYXRlc3RfdmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KSxcbiAgLyoqIGBtYWpvcmAgLyBgbWlub3JgIC8gYHBhdGNoYCAvIGBub25lYCwgZnJvbSByZXNvbHZlZCDihpIgbGF0ZXN0LiAqL1xuICB2ZXJzaW9uR2FwOiB2YXJjaGFyKCd2ZXJzaW9uX2dhcCcsIHsgbGVuZ3RoOiAxMCB9KSxcbiAgLyoqIEZhbHNlIHdoZW4gdGhlIHJlc29sdmVkIHZlcnNpb24gaXMgb3V0c2lkZSB0aGUgb3JnJ3MgY29uc3VtcHRpb24gcG9saWN5LiAqL1xuICB3aXRoaW5Qb2xpY3k6IGJvb2xlYW4oJ3dpdGhpbl9wb2xpY3knKS5kZWZhdWx0KHRydWUpLm5vdE51bGwoKSxcbiAgY29tcHV0ZWRBdDogdGltZXN0YW1wKCdjb21wdXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIHBrOiBwcmltYXJ5S2V5KHsgY29sdW1uczogW3RhYmxlLnBpcGVsaW5lSWQsIHRhYmxlLnN0YWdlTmFtZSwgdGFibGUuc3RlcE5hbWVdIH0pLFxuICBvcmdJZHg6IGluZGV4KCdwaXBlbGluZV9wbHVnaW5fcmVzb2x1dGlvbl9vcmdfaWR4Jykub24odGFibGUub3JnSWQpLFxuICBwbHVnaW5JZHg6IGluZGV4KCdwaXBlbGluZV9wbHVnaW5fcmVzb2x1dGlvbl9wbHVnaW5faWR4Jykub24odGFibGUucGx1Z2luUHVibGlzaGVyLCB0YWJsZS5wbHVnaW5OYW1lKSxcbiAgLy8gXCJXaGljaCBwaXBlbGluZXMgYXJlIGJlaGluZD9cIiDigJQgdGhlIG91dGRhdGVkIHNlY3Rpb24ncyBkcml2aW5nIHNjYW4uXG4gIGdhcElkeDogaW5kZXgoJ3BpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uX2dhcF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUudmVyc2lvbkdhcCksXG59KSk7XG5cbi8qKlxuICogT25lIHBpcGVsaW5lJ3MgZXhwb3N1cmUgdG8gb25lIHZ1bG5lcmFibGUgcGx1Z2luIHZlcnNpb24uXG4gKlxuICogT3BlbmVkIGJ5IHRoZSBuaWdodGx5IHJlc2NhbiB3aGVuIGEgdmVyc2lvbiBpbiB1c2UgaGFzIGZpeGFibGUgQ3JpdGljYWwvSGlnaFxuICogZmluZGluZ3MsIGFuZCBDTE9TRUQgYnkgYSBkZXBsb3kgdGhhdCBtb3ZlcyB0aGUgcGlwZWxpbmUgb2ZmIGl0LiBJdCBpcyBhXG4gKiBwZXItcGlwZWxpbmUgcm93IHJhdGhlciB0aGFuIGEgcGVyLXZlcnNpb24gb25lIGJlY2F1c2UgdGhlIHF1ZXN0aW9uIGEgbWFuYWdlclxuICogYXNrcyBpcyBcIndoaWNoIG9mIG91ciBwaXBlbGluZXMgaXMgZXhwb3NlZFwiLCBhbmQgYW5zd2VyaW5nIHRoYXQgZnJvbSBhXG4gKiB2ZXJzaW9uLWxldmVsIHRhYmxlIG1lYW5zIHJlLWRlcml2aW5nIHRoZSBwaXBlbGluZSBzZXQgb24gZXZlcnkgcmVhZC5cbiAqXG4gKiBLZXllZCBieSBJTUFHRSBESUdFU1QsIG5vdCB2ZXJzaW9uIHN0cmluZzogYSB2ZXJzaW9uIHJlYnVpbHQgb24gYSBwYXRjaGVkIGJhc2VcbiAqIGltYWdlIGlzIGEgZGlmZmVyZW50IGFydGlmYWN0IHdpdGggZGlmZmVyZW50IGZpbmRpbmdzLCBhbmQga2V5aW5nIG9uIHRoZSBzdHJpbmdcbiAqIHdvdWxkIHJlcG9ydCB0aGUgb2xkIG9uZSBmb3JldmVyLlxuICpcbiAqIEB0YWJsZSBwbHVnaW5fdnVsbl9leHBvc3VyZVxuICovXG5leHBvcnQgY29uc3QgcGx1Z2luVnVsbkV4cG9zdXJlID0gcGdUYWJsZSgncGx1Z2luX3Z1bG5fZXhwb3N1cmUnLCB7XG4gIGlkOiB2YXJjaGFyKCdpZCcsIHsgbGVuZ3RoOiAyNTUgfSkucHJpbWFyeUtleSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHBpcGVsaW5lSWQ6IHZhcmNoYXIoJ3BpcGVsaW5lX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHBsdWdpblB1Ymxpc2hlcjogdmFyY2hhcigncGx1Z2luX3B1Ymxpc2hlcicsIHsgbGVuZ3RoOiAzOSB9KSxcbiAgcGx1Z2luTmFtZTogdmFyY2hhcigncGx1Z2luX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcGx1Z2luVmVyc2lvbjogdmFyY2hhcigncGx1Z2luX3ZlcnNpb24nLCB7IGxlbmd0aDogNTAgfSkubm90TnVsbCgpLFxuICBpbWFnZURpZ2VzdDogdmFyY2hhcignaW1hZ2VfZGlnZXN0JywgeyBsZW5ndGg6IDcxIH0pLFxuICBzb3VyY2U6IHZhcmNoYXIoJ3NvdXJjZScsIHsgbGVuZ3RoOiAxMCB9KS4kdHlwZTxFeHBvc3VyZVNvdXJjZT4oKS5ub3ROdWxsKCksXG4gIGNyaXRpY2FsQ291bnQ6IGludGVnZXIoJ2NyaXRpY2FsX2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIGhpZ2hDb3VudDogaW50ZWdlcignaGlnaF9jb3VudCcpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICAvKiogVGhlIGZpbmRpbmdzIHRoZW1zZWx2ZXM6IENWRSBpZCwgcGFja2FnZSwgZml4ZWQtaW4gdmVyc2lvbi4gQ2FwcGVkIGJ5IHRoZSB3cml0ZXIuICovXG4gIHRvcEZpbmRpbmdzOiBqc29uYigndG9wX2ZpbmRpbmdzJykuJHR5cGU8QXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PigpLmRlZmF1bHQoW10pLm5vdE51bGwoKSxcbiAgZmxhZ2dlZEF0OiB0aW1lc3RhbXAoJ2ZsYWdnZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICAvKiogU2V0IHdoZW4gYSBkZXBsb3kgbW92ZWQgdGhlIHBpcGVsaW5lIG9udG8gYSB2ZXJzaW9uIHdpdGhvdXQgdGhlIGZpbmRpbmdzLiAqL1xuICBmaXhlZEF0OiB0aW1lc3RhbXAoJ2ZpeGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHRyaWFnZVN0YXRlOiB2YXJjaGFyKCd0cmlhZ2Vfc3RhdGUnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8RXhwb3N1cmVUcmlhZ2VTdGF0ZT4oKS5kZWZhdWx0KCdvcGVuJykubm90TnVsbCgpLFxuICAvKiogQW4gYWNjZXB0YW5jZSBpcyB0aW1lLWJveGVkOiBhIHBlcm1hbmVudCBtdXRlIGlzIGhvdyBhIGZpbmRpbmcgaXMgZm9yZ290dGVuLiAqL1xuICBhY2NlcHRlZFVudGlsOiB0aW1lc3RhbXAoJ2FjY2VwdGVkX3VudGlsJywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHRyaWFnZVJlYXNvbjogdGV4dCgndHJpYWdlX3JlYXNvbicpLFxuICB0cmlhZ2VkQnk6IHRleHQoJ3RyaWFnZWRfYnknKSxcbiAgdHJpYWdlZEF0OiB0aW1lc3RhbXAoJ3RyaWFnZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICAvLyBPbmUgbGl2ZSBleHBvc3VyZSBwZXIgKHBpcGVsaW5lLCBwbHVnaW4gdmVyc2lvbiwgZGlnZXN0LCBzb3VyY2UpOiBhIG5pZ2h0bHlcbiAgLy8gcmVzY2FuIHJlZnJlc2hlcyBjb3VudHMgcmF0aGVyIHRoYW4gb3BlbmluZyBhIG5ldyByb3cgZXZlcnkgbmlnaHQuXG4gIGV4cG9zdXJlVW5pcXVlOiB1bmlxdWVJbmRleCgncGx1Z2luX3Z1bG5fZXhwb3N1cmVfdW5pcXVlJylcbiAgICAub24odGFibGUucGlwZWxpbmVJZCwgdGFibGUucGx1Z2luTmFtZSwgdGFibGUucGx1Z2luVmVyc2lvbiwgdGFibGUuc291cmNlKSxcbiAgb3JnT3BlbklkeDogaW5kZXgoJ3BsdWdpbl92dWxuX2V4cG9zdXJlX29yZ19vcGVuX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS50cmlhZ2VTdGF0ZSlcbiAgICAud2hlcmUoc3FsYGZpeGVkX2F0IElTIE5VTExgKSxcbiAgZGlnZXN0SWR4OiBpbmRleCgncGx1Z2luX3Z1bG5fZXhwb3N1cmVfZGlnZXN0X2lkeCcpLm9uKHRhYmxlLmltYWdlRGlnZXN0KSxcbn0pKTtcblxuZXhwb3J0IHR5cGUgRG9yYURlcGxveW1lbnQgPSB0eXBlb2YgZG9yYURlcGxveW1lbnQuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgRG9yYURlcGxveW1lbnRJbnNlcnQgPSB0eXBlb2YgZG9yYURlcGxveW1lbnQuJGluZmVySW5zZXJ0O1xuZXhwb3J0IHR5cGUgRXhlY3V0aW9uRGFpbHlSb2xsdXAgPSB0eXBlb2YgZXhlY3V0aW9uRGFpbHlSb2xsdXAuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgRXhlY3V0aW9uRGFpbHlSb2xsdXBJbnNlcnQgPSB0eXBlb2YgZXhlY3V0aW9uRGFpbHlSb2xsdXAuJGluZmVySW5zZXJ0O1xuZXhwb3J0IHR5cGUgUGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uID0gdHlwZW9mIHBpcGVsaW5lUGx1Z2luUmVzb2x1dGlvbi4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQaXBlbGluZVBsdWdpblJlc29sdXRpb25JbnNlcnQgPSB0eXBlb2YgcGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uLiRpbmZlckluc2VydDtcbmV4cG9ydCB0eXBlIFBsdWdpblZ1bG5FeHBvc3VyZSA9IHR5cGVvZiBwbHVnaW5WdWxuRXhwb3N1cmUuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUGx1Z2luVnVsbkV4cG9zdXJlSW5zZXJ0ID0gdHlwZW9mIHBsdWdpblZ1bG5FeHBvc3VyZS4kaW5mZXJJbnNlcnQ7XG4iXX0=
290
+ /**
291
+ * The last `/plugins/lookup` outcome per pipeline STEP, when synth (CLI or the
292
+ * CodeBuild Lambda) sends the step's context. The DECLARED side
293
+ * (`pipeline_plugin_resolution`) says what the config resolves to when it was
294
+ * saved; this says what synth was actually told — the version, the image, every
295
+ * warning, and the refusal — which is what a "why did my deploy stop" page needs.
296
+ *
297
+ * @table pipeline_step_lookups
298
+ */
299
+ export const pipelineStepLookup = pgTable('pipeline_step_lookups', {
300
+ orgId: varchar('org_id', { length: 255 }).notNull(),
301
+ pipelineId: varchar('pipeline_id', { length: 255 }).notNull(),
302
+ /** The step's contract label: `synth` or `<stageName>/<alias ?? name>`. */
303
+ stepKey: varchar('step_key', { length: 512 }).notNull(),
304
+ pluginPublisher: varchar('plugin_publisher', { length: 39 }),
305
+ pluginName: varchar('plugin_name', { length: 255 }).notNull(),
306
+ /** What the reference asked for (a range, a pin, or nothing). */
307
+ requestedVersion: varchar('requested_version', { length: 50 }),
308
+ /** NULL when the lookup was refused. */
309
+ resolvedVersion: varchar('resolved_version', { length: 50 }),
310
+ resolvedPluginId: varchar('resolved_plugin_id', { length: 255 }),
311
+ imageDigest: varchar('image_digest', { length: 71 }),
312
+ /** `[{ code, message, severity }]` — every warning the answer carried. */
313
+ warnings: jsonb('warnings').$type().default([]).notNull(),
314
+ /**
315
+ * `{ code, reason, message }` when the lookup was refused — never for
316
+ * vulnerability state (that only grades), but for a deleted / not-installed /
317
+ * policy-blocked plugin or a failed image signature.
318
+ */
319
+ refusal: jsonb('refusal').$type(),
320
+ lookedUpAt: timestamp('looked_up_at', { withTimezone: true }).defaultNow().notNull(),
321
+ }, (table) => ({
322
+ pk: primaryKey({ columns: [table.pipelineId, table.stepKey] }),
323
+ orgIdx: index('pipeline_step_lookups_org_idx').on(table.orgId),
324
+ }));
325
+ /**
326
+ * The latest security-scanner report a pipeline RUN uploaded, per (pipeline,
327
+ * tool, stage) — what the pipeline's own scan steps found in what it builds,
328
+ * next to what the platform's rescan found in the plugin images it runs.
329
+ * Counts are stored so a report section reads them without unpacking findings.
330
+ *
331
+ * @table pipeline_security_reports
332
+ */
333
+ export const pipelineSecurityReport = pgTable('pipeline_security_reports', {
334
+ id: varchar('id', { length: 255 }).primaryKey(),
335
+ orgId: varchar('org_id', { length: 255 }).notNull(),
336
+ pipelineId: varchar('pipeline_id', { length: 255 }).notNull(),
337
+ tool: varchar('tool', { length: 64 }).notNull(),
338
+ format: varchar('format', { length: 16 }).notNull(),
339
+ stage: varchar('stage', { length: 255 }).default('').notNull(),
340
+ executionId: varchar('execution_id', { length: 255 }),
341
+ criticalCount: integer('critical_count').default(0).notNull(),
342
+ highCount: integer('high_count').default(0).notNull(),
343
+ mediumCount: integer('medium_count').default(0).notNull(),
344
+ lowCount: integer('low_count').default(0).notNull(),
345
+ kevCount: integer('kev_count').default(0).notNull(),
346
+ criticalFixable: integer('critical_fixable').default(0).notNull(),
347
+ highFixable: integer('high_fixable').default(0).notNull(),
348
+ findings: jsonb('findings').$type().default([]).notNull(),
349
+ truncated: boolean('truncated').default(false).notNull(),
350
+ submittedBy: text('submitted_by'),
351
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
352
+ }, (table) => ({
353
+ latestUnique: uniqueIndex('pipeline_security_reports_unique').on(table.pipelineId, table.tool, table.stage),
354
+ orgIdx: index('pipeline_security_reports_org_idx').on(table.orgId),
355
+ }));
356
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLWFuYWx5dGljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9zY2hlbWEvcmVwb3J0aW5nLWFuYWx5dGljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVqSTs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLENBQVUsQ0FBQztBQUc1Rzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQVUsQ0FBQztBQUcxRTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQVUsQ0FBQztBQUc5Rjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCO0lBQ3pFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYTtJQUNoRixlQUFlLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFLE9BQU87Q0FD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QUFVLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQzNHLE1BQU0sRUFBRSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztDQUNuRSxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBhbmFseXRpY3MgbGF5ZXIgZXZlcnkgcmVwb3J0IHNlY3Rpb24gYW5kIGRhc2hib2FyZCByZWFkcyBpbnN0ZWFkIG9mIHJhd1xuICogZXZlbnRzLlxuICpcbiAqIFJlcG9ydGluZyBoYXMgYmVlbiBzY2FubmluZyBgcGlwZWxpbmVfZXZlbnRzYCBkaXJlY3RseS4gVGhhdCB3b3JrZWQgd2hpbGUgdGhlXG4gKiBvbmx5IGNvbnN1bWVyIHdhcyBvbmUgZGFzaGJvYXJkIG92ZXIgYSAzMC1kYXkgd2luZG93LCBhbmQgc3RvcHMgd29ya2luZyBmb3JcbiAqIHRoaXMgZmVhdHVyZTogYSBxdWFydGVybHkgcmVwb3J0IG92ZXIgYSA5MC1kYXkgd2luZG93LCBmb3IgYW4gb3JnIHdpdGggYVxuICogdGhvdXNhbmQgZXhlY3V0aW9ucyBhIGRheSwgcmUtZGVyaXZlcyB0aGUgc2FtZSBhZ2dyZWdhdGVzIG9uIGV2ZXJ5IHJlYWQsIGFuZFxuICogdGhlIHJldGVudGlvbiBzd2VlcCB0aGVuIGRlbGV0ZXMgdGhlIHJvd3MgdGhlIG51bWJlcnMgY2FtZSBmcm9tLiBUd28gdGFibGVzIGZpeFxuICogYm90aCBwcm9ibGVtczpcbiAqXG4gKiAgLSBgZG9yYV9kZXBsb3ltZW50c2Ag4oCUIE9ORSBST1cgUEVSIERFUExPWSwgd3JpdHRlbiBhdCBpbmdlc3QuIExlYWQgdGltZSBpc1xuICogICAgc3RvcmVkIHBlciBleGVjdXRpb24gaGVyZSwgbmV2ZXIgcmVjb21wdXRlZCBwZXIgZXZlbnQsIGJlY2F1c2UgdGhlXG4gKiAgICBwZXItZXZlbnQgZm9ybSBkb3VibGUtY291bnRzOiBhIGRlcGxveSBzdGFnZSBlbWl0cyBhIFNUQUdFIGV2ZW50IGFuZCBhblxuICogICAgQUNUSU9OIGV2ZW50LCBhbmQgYm90aCBjYXJyeSB0aGUgc2FtZSBjb21taXQgcmFuZ2UuXG4gKiAgLSBgZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHNgIOKAlCBvbmUgcm93IHBlciBvcmcsIHBpcGVsaW5lLCBzdGFnZSBhbmQgZGF5LiBFdmVyeVxuICogICAgc2VjdGlvbiB0aGF0IHNheXMgXCJydW5zXCIsIFwic3VjY2VzcyByYXRlXCIsIFwicDk1XCIgb3IgXCJidWlsZCBtaW51dGVzXCIgcmVhZHNcbiAqICAgIHRoZXNlLCBzbyBhIHJlcG9ydCBjb3N0cyBhIGZldyBodW5kcmVkIHJvd3MgaW5zdGVhZCBvZiBhIGZldyBodW5kcmVkXG4gKiAgICB0aG91c2FuZC5cbiAqXG4gKiBCb3RoIGFyZSBERVJJVkVEOiB0aGV5IGNhbiBiZSByZWJ1aWx0IGZyb20gZXZlbnRzIHdoaWxlIHRoZSBldmVudHMgZXhpc3QsIGFuZFxuICogdGhleSBvdXRsaXZlIHRoZW0gYWZ0ZXJ3YXJkcy4gVGhhdCBpcyB0aGUgcG9pbnQg4oCUIHRoZXkgYXJlIHRoZSByZXRhaW5lZCBmb3JtLlxuICpcbiAqIFRoZSBvdGhlciB0d28gdGFibGVzIGhlcmUgYW5zd2VyIFwid2hhdCBpcyBhY3R1YWxseSBydW5uaW5nXCIsIHdoaWNoIHRoZSByZXBvcnQnc1xuICogcGx1Z2luIHNlY3Rpb25zIG5lZWQgYW5kIG5vIGV4aXN0aW5nIHRhYmxlIGNhbiBhbnN3ZXI6XG4gKlxuICogIC0gYHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uYCDigJQgd2hhdCBhIHBpcGVsaW5lJ3MgREVDTEFSRUQgcGx1Z2luIHZlcnNpb25zXG4gKiAgICByZXNvbHZlIHRvLCByZWNvbXB1dGVkIG9uIHdyaXRlIHJhdGhlciB0aGFuIHJlc29sdmVkIHBlciByZWFkLlxuICogIC0gYHBsdWdpbl92dWxuX2V4cG9zdXJlYCDigJQgd2hpY2ggcGlwZWxpbmVzIGFyZSBleHBvc2VkIHRvIHdoaWNoIHZ1bG5lcmFibGVcbiAqICAgIHBsdWdpbiB2ZXJzaW9uLCBvcGVuZWQgYnkgYSByZXNjYW4gYW5kIGNsb3NlZCBieSBhIGZpeGluZyBkZXBsb3kuXG4gKi9cblxuaW1wb3J0IHsgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgYm9vbGVhbiwgaW5kZXgsIGludGVnZXIsIGpzb25iLCBwZ1RhYmxlLCBwcmltYXJ5S2V5LCB0ZXh0LCB0aW1lc3RhbXAsIHVuaXF1ZUluZGV4LCB2YXJjaGFyIH0gZnJvbSAnZHJpenpsZS1vcm0vcGctY29yZSc7XG5cbi8qKlxuICogV2h5IGEgZGVwbG95J3MgbGVhZCB0aW1lIGNvdWxkIG5vdCBiZSBtZWFzdXJlZC4gUmVjb3JkZWQgcmF0aGVyIHRoYW4gbGVmdCBOVUxMXG4gKiB3aXRoIG5vIGV4cGxhbmF0aW9uLCBiZWNhdXNlIHRoZSB0aHJlZSBjYXVzZXMgbmVlZCBkaWZmZXJlbnQgZml4ZXMgYW5kIHRoZVxuICogcmVwb3J0IHNob3dzIHRoZSByZWFzb246IG5vIFNDTSB0b2tlbiBmb3IgdGhlIHNvdXJjZSwgdGhlIHByb3ZpZGVyIHJhdGUtbGltaXRlZFxuICogdGhlIHJhbmdlIHdhbGssIG9yIHRoZSBzb3VyY2UgdHlwZSBoYXMgbm8gcmFuZ2UgQVBJIGF0IGFsbC5cbiAqL1xuZXhwb3J0IGNvbnN0IExFQURfVElNRV9HQVBTID0gWydub190b2tlbicsICdyYXRlX2xpbWl0ZWQnLCAndW5zdXBwb3J0ZWRfc291cmNlJywgJ25vX2NvbW1pdF9kYXRhJ10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBMZWFkVGltZUdhcCA9ICh0eXBlb2YgTEVBRF9USU1FX0dBUFMpW251bWJlcl07XG5cbi8qKlxuICogSG93IGNvbmZpZGVudGx5IGFuIGluY2lkZW50IHdhcyBhdHRyaWJ1dGVkIHRvIGEgZGVwbG95LiBTaG93biBiZXNpZGUgY2hhbmdlXG4gKiBmYWlsdXJlIHJhdGUgYW5kIHRpbWUgdG8gcmVzdG9yZSwgYmVjYXVzZSBcInRoaXMgZGVwbG95IGJyb2tlIHByb2R1Y3Rpb25cIiBhbmRcbiAqIFwiYW4gaW5jaWRlbnQgb3BlbmVkIHNvbWUgaG91cnMgYWZ0ZXIgdGhpcyBkZXBsb3lcIiBhcmUgZGlmZmVyZW50IGNsYWltcyBhbmQgYVxuICogbWFuYWdlciBhY3RzIGRpZmZlcmVudGx5IG9uIGVhY2guXG4gKi9cbmV4cG9ydCBjb25zdCBDT1JSRUxBVElPTl9DT05GSURFTkNFUyA9IFsnaGlnaCcsICdtZWRpdW0nLCAnbG93J10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBDb3JyZWxhdGlvbkNvbmZpZGVuY2UgPSAodHlwZW9mIENPUlJFTEFUSU9OX0NPTkZJREVOQ0VTKVtudW1iZXJdO1xuXG4vKipcbiAqIEhvdyBhIHBpcGVsaW5lIGNhbWUgdG8gZXhpc3QuIEZvciB0aGUgYWRvcHRpb24gc2VjdGlvbjogYW4gb3JnIHdob3NlIHBpcGVsaW5lc1xuICogYXJlIGFsbCBoYW5kLWJ1aWx0IGlzIGEgZGlmZmVyZW50IGFkb3B0aW9uIHN0b3J5IGZyb20gb25lIHRlbXBsYXRpbmcgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBJUEVMSU5FX0NSRUFUSU9OX1NPVVJDRVMgPSBbJ21hbnVhbCcsICd0ZW1wbGF0ZScsICdhaScsICdidWxrJywgJ2NkayddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUGlwZWxpbmVDcmVhdGlvblNvdXJjZSA9ICh0eXBlb2YgUElQRUxJTkVfQ1JFQVRJT05fU09VUkNFUylbbnVtYmVyXTtcblxuLyoqXG4gKiBXaGF0IGtpbmQgb2YgdGhpbmcgYnJva2UuIEFzc2lnbmVkIGF0IGluZ2VzdCBieSB0aGUgY2xhc3NpZmllclxuICogKGBhcGkvcmVwb3J0aW5nL3NyYy9zZXJ2aWNlcy9mYWlsdXJlLWNsYXNzaWZpZXIudHNgKSwgd2hpY2ggaXMgcnVsZXMgb3ZlciB0aGVcbiAqIGFjdGlvbidzIHR5cGUgYW5kIGVycm9yIHRleHQg4oCUIGRlbGliZXJhdGVseSBkYXRhLCBub3QgY29kZSwgc28gdGhlIHRheG9ub215IGNhblxuICogZ3JvdyB3aXRob3V0IGEgZGVwbG95LlxuICpcbiAqIFRoZSBjYXRlZ29yaWVzIG92ZXJsYXAgdGhlIHBsdWdpbi1idWlsZCB0YXhvbm9teSBvbiBwdXJwb3NlOiBhIGRlcGVuZGVuY3lcbiAqIGZhaWx1cmUgaXMgYSBkZXBlbmRlbmN5IGZhaWx1cmUgd2hldGhlciBpdCBoYXBwZW5lZCBidWlsZGluZyBhIHBsdWdpbiBvclxuICogcnVubmluZyBvbmUsIGFuZCB0d28gdm9jYWJ1bGFyaWVzIGZvciB0aGUgc2FtZSB0aGluZyB3b3VsZCBtYWtlIHRoZSByZXBvcnQgYW5kXG4gKiB0aGUgYnVpbGQgcXVldWUgZGlzYWdyZWUuXG4gKi9cbmV4cG9ydCBjb25zdCBGQUlMVVJFX0NBVEVHT1JJRVMgPSBbXG4gICdzb3VyY2VfY2hlY2tvdXQnLCAnZGVwZW5kZW5jeScsICdidWlsZCcsICd1bml0X3Rlc3QnLCAnaW50ZWdyYXRpb25fdGVzdCcsXG4gICdzZWN1cml0eV9zY2FuJywgJ2luZnJhc3RydWN0dXJlJywgJ2RlcGxveW1lbnQnLCAnYXV0aGVudGljYXRpb24nLCAncGVybWlzc2lvbnMnLFxuICAnY29uZmlndXJhdGlvbicsICd0aW1lb3V0JywgJ3Jlc291cmNlX2V4aGF1c3Rpb24nLCAnZXh0ZXJuYWxfc2VydmljZScsICdvdGhlcicsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRmFpbHVyZUNhdGVnb3J5ID0gKHR5cGVvZiBGQUlMVVJFX0NBVEVHT1JJRVMpW251bWJlcl07XG5cbi8qKiBXaGVyZSBhIHBsdWdpbi12ZXJzaW9uIGV4cG9zdXJlIHdhcyBvYnNlcnZlZC4gKi9cbmV4cG9ydCBjb25zdCBFWFBPU1VSRV9TT1VSQ0VTID0gWydkZWNsYXJlZCcsICdkZXBsb3llZCddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRXhwb3N1cmVTb3VyY2UgPSAodHlwZW9mIEVYUE9TVVJFX1NPVVJDRVMpW251bWJlcl07XG5cbi8qKlxuICogV2hhdCBhbiBvcmcgZGVjaWRlZCBhYm91dCBhbiBleHBvc3VyZS4gYG9wZW5gIHVudGlsIHNvbWVvbmUgbG9va3M7XG4gKiBgYWNjZXB0ZWRgIGlzIGEgdGltZS1ib3hlZCBkZWNpc2lvbiB3aXRoIGEgcmVhc29uIGFuZCBhbiBvd25lciwgbmV2ZXIgYVxuICogcGVybWFuZW50IG11dGU7IGBmYWxzZV9wb3NpdGl2ZWAgaXMgYSBzY2FubmVyIGRpc2FncmVlbWVudCB3b3J0aCByZWNvcmRpbmcgc29cbiAqIHRoZSBzYW1lIGZpbmRpbmcgc3RvcHMgYmVpbmcgcmUtcmFpc2VkIGFzIG5ld3MuIGBmaXhlZGAgPSB0aGUgcGlwZWxpbmUgbW92ZWRcbiAqIHRvIGFub3RoZXIgdmVyc2lvbiBvZiB0aGUgcGx1Z2luOyBgcmVtb3ZlZGAgPSB0aGUgc3RlcCAob3IgdGhlIHBpcGVsaW5lLCBvclxuICogaXRzIGRlcGxveSkgaXMgZ29uZSDigJQgdGhlIHRyaWFnZSBmaWVsZHMgYXJlIEtFUFQsIHNvIGEgc3RlcCByZS1hZGRlZCBiZWZvcmVcbiAqIGFuIGFjY2VwdGFuY2UncyBkZWFkbGluZSBnZXRzIHRoZSBhY2NlcHRhbmNlIGJhY2suXG4gKi9cbmV4cG9ydCBjb25zdCBFWFBPU1VSRV9UUklBR0VfU1RBVEVTID0gWydvcGVuJywgJ2FjY2VwdGVkJywgJ2ZhbHNlX3Bvc2l0aXZlJywgJ2ZpeGVkJywgJ3JlbW92ZWQnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEV4cG9zdXJlVHJpYWdlU3RhdGUgPSAodHlwZW9mIEVYUE9TVVJFX1RSSUFHRV9TVEFURVMpW251bWJlcl07XG5cbi8qKlxuICogT25lIGRlcGxveW1lbnQ6IGFuIGV4ZWN1dGlvbiB0aGF0IHJlYWNoZWQgYW4gZW52aXJvbm1lbnQuXG4gKlxuICogV3JpdHRlbiBhdCBpbmdlc3QsIG9uZSByb3cgcGVyIChleGVjdXRpb24sIGVudmlyb25tZW50KS4gRXZlcnl0aGluZyBET1JBXG4gKiByZXBvcnRzIGlzIGhlcmUsIHNvIGAvZG9yYWAsIHRoZSB0cmVuZCBhbmQgdGhlIHJlcG9ydCBzZWN0aW9ucyBzdG9wIHNjYW5uaW5nXG4gKiByYXcgZXZlbnRzIOKAlCBhbmQga2VlcCB3b3JraW5nIGFmdGVyIHRoZSBldmVudHMgYXJlIHN3ZXB0LlxuICpcbiAqIEB0YWJsZSBkb3JhX2RlcGxveW1lbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBkb3JhRGVwbG95bWVudCA9IHBnVGFibGUoJ2RvcmFfZGVwbG95bWVudHMnLCB7XG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgZXhlY3V0aW9uSWQ6IHZhcmNoYXIoJ2V4ZWN1dGlvbl9pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBlbnZpcm9ubWVudDogdmFyY2hhcignZW52aXJvbm1lbnQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcGlwZWxpbmVJZDogdmFyY2hhcigncGlwZWxpbmVfaWQnLCB7IGxlbmd0aDogMjU1IH0pLFxuICAvKiogV2hlbiB0aGUgZGVwbG95IHN0YWdlIGNvbXBsZXRlZC4gVGhlIGRlcGxveSdzIG93biB0aW1lc3RhbXAsIG5vdCB0aGUgcnVuJ3MuICovXG4gIGRlcGxveWVkQXQ6IHRpbWVzdGFtcCgnZGVwbG95ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5ub3ROdWxsKCksXG4gIHN1Y2NlZWRlZDogYm9vbGVhbignc3VjY2VlZGVkJykubm90TnVsbCgpLFxuICAvKipcbiAgICogVGhlIE9MREVTVCB1bnNoaXBwZWQgY29tbWl0IGluIHRoaXMgZGVwbG95J3MgcmFuZ2UuIExlYWQgdGltZSBpc1xuICAgKiBgZGVwbG95ZWRBdCAtIGVhcmxpZXN0Q29tbWl0QXRgLCBjb21wdXRlZCBvbmNlIGFuZCBzdG9yZWQsIGJlY2F1c2UgdGhlXG4gICAqIHBlci1ldmVudCBmb3JtIGRvdWJsZS1jb3VudHMgYSBkZXBsb3kgdGhhdCBlbWl0cyBib3RoIGEgU1RBR0UgYW5kIGFuIEFDVElPTlxuICAgKiBldmVudCBjYXJyeWluZyB0aGUgc2FtZSByYW5nZS5cbiAgICovXG4gIGVhcmxpZXN0Q29tbWl0QXQ6IHRpbWVzdGFtcCgnZWFybGllc3RfY29tbWl0X2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGxlYWRUaW1lU2Vjb25kczogaW50ZWdlcignbGVhZF90aW1lX3NlY29uZHMnKSxcbiAgY29tbWl0Q291bnQ6IGludGVnZXIoJ2NvbW1pdF9jb3VudCcpLFxuICBjb21taXRTaGE6IHZhcmNoYXIoJ2NvbW1pdF9zaGEnLCB7IGxlbmd0aDogMjU1IH0pLFxuICAvKiogV2h5IGxlYWQgdGltZSBpcyBhYnNlbnQsIHdoZW4gaXQgaXMuIE5VTEwgd2hlbiBpdCB3YXMgbWVhc3VyZWQuICovXG4gIGxlYWRUaW1lR2FwOiB2YXJjaGFyKCdsZWFkX3RpbWVfZ2FwJywgeyBsZW5ndGg6IDMwIH0pLiR0eXBlPExlYWRUaW1lR2FwPigpLFxuICAvKipcbiAgICogUG9zdC1kZXBsb3kgb3V0Y29tZSBtYXJrZXJzLCBkZW5vcm1hbGl6ZWQgb250byB0aGUgZGVwbG95IHNvIGNoYW5nZS1mYWlsdXJlXG4gICAqIHJhdGUgYW5kIHRpbWUtdG8tcmVzdG9yZSBhcmUgb25lIHNjYW4gcmF0aGVyIHRoYW4gYSBqb2luIHBlciB3aW5kb3cuXG4gICAqL1xuICBmYWlsZWRBdDogdGltZXN0YW1wKCdmYWlsZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgcmVzdG9yZWRBdDogdGltZXN0YW1wKCdyZXN0b3JlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICAvKiogSG93IHRoZSBpbmNpZGVudOKGkmRlcGxveSBsaW5rIHdhcyBqdWRnZWQuIE5VTEwgd2hlbiBub3RoaW5nIHdhcyBjb3JyZWxhdGVkLiAqL1xuICBjb3JyZWxhdGlvbkNvbmZpZGVuY2U6IHZhcmNoYXIoJ2NvcnJlbGF0aW9uX2NvbmZpZGVuY2UnLCB7IGxlbmd0aDogMTAgfSkuJHR5cGU8Q29ycmVsYXRpb25Db25maWRlbmNlPigpLFxuICAvKipcbiAgICogVGhlIEV2ZW50QnJpZGdlIGV2ZW50IGlkIG9mIHRoZSBkZXBsb3kgU1RBR0UgZXZlbnQgdGhhdCBsYXN0IHdyb3RlIHRoaXMgcm93LFxuICAgKiBzbyBhIERPUkEgbnVtYmVyIHRyYWNlcyBiYWNrIHRvIHRoZSBleGFjdCBgcGlwZWxpbmVfZXZlbnRzYCByb3cgKGFuZCBBV1NcbiAgICogZXZlbnQpIGJlaGluZCBpdC4gTlVMTCBmb3IgYSBkZXBsb3kgZnJvbSBhIHByb2R1Y2VyIHdpdGhvdXQgb25lLlxuICAgKi9cbiAgc291cmNlRXZlbnRJZDogdmFyY2hhcignc291cmNlX2V2ZW50X2lkJywgeyBsZW5ndGg6IDEyOCB9KSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIC8vIE9uZSByb3cgcGVyIGV4ZWN1dGlvbiBwZXIgZW52aXJvbm1lbnQ6IGEgcmVkZWxpdmVyZWQgZXZlbnQgdXBzZXJ0cyByYXRoZXJcbiAgLy8gdGhhbiBpbnNlcnRpbmcgYSBzZWNvbmQgZGVwbG95IChFdmVudEJyaWRnZSDihpIgU1FTIGlzIGF0LWxlYXN0LW9uY2UpLlxuICBwazogcHJpbWFyeUtleSh7IGNvbHVtbnM6IFt0YWJsZS5leGVjdXRpb25JZCwgdGFibGUuZW52aXJvbm1lbnRdIH0pLFxuICAvLyBUaGUgd2luZG93IHNjYW4gZXZlcnkgRE9SQSByZWFkIGRvZXMuXG4gIG9yZ0VudkRlcGxveWVkSWR4OiBpbmRleCgnZG9yYV9kZXBsb3ltZW50X29yZ19lbnZfZGVwbG95ZWRfaWR4JylcbiAgICAub24odGFibGUub3JnSWQsIHRhYmxlLmVudmlyb25tZW50LCB0YWJsZS5kZXBsb3llZEF0KSxcbiAgb3JnRGVwbG95ZWRJZHg6IGluZGV4KCdkb3JhX2RlcGxveW1lbnRfb3JnX2RlcGxveWVkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5kZXBsb3llZEF0KSxcbiAgcGlwZWxpbmVJZHg6IGluZGV4KCdkb3JhX2RlcGxveW1lbnRfcGlwZWxpbmVfaWR4Jykub24odGFibGUucGlwZWxpbmVJZCwgdGFibGUuZGVwbG95ZWRBdCksXG4gIC8vIFRoZSBwcm9tb3Rpb24gdmlldzogb25lIGNvbW1pdCdzIHBhdGggYWNyb3NzIGVudmlyb25tZW50cy5cbiAgY29tbWl0SWR4OiBpbmRleCgnZG9yYV9kZXBsb3ltZW50X2NvbW1pdF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY29tbWl0U2hhKVxuICAgIC53aGVyZShzcWxgY29tbWl0X3NoYSBJUyBOT1QgTlVMTGApLFxufSkpO1xuXG4vKipcbiAqIFByZS1hZ2dyZWdhdGVkIGV4ZWN1dGlvbiBjb3VudHMgYW5kIHRpbWluZ3MsIG9uZSByb3cgcGVyIG9yZywgcGlwZWxpbmUsIHN0YWdlXG4gKiBhbmQgVVRDIGRheS5cbiAqXG4gKiBSZWJ1aWx0IGZvciBhIGRheSB3aGVuIGxhdGUgZXZlbnRzIGFycml2ZSwgc28gdGhlIHJvbGx1cCBhbmQgdGhlIGV2ZW50cyBhZ3JlZVxuICogd2hpbGUgYm90aCBleGlzdC4gYGZhaWx1cmVzQnlDYXRlZ29yeWAgaXMgYSBKU09OIG1hcCByYXRoZXIgdGhhbiBhIGNvbHVtbiBwZXJcbiAqIGNhdGVnb3J5IGJlY2F1c2UgdGhlIHRheG9ub215IGdyb3dzLlxuICpcbiAqIEB0YWJsZSBleGVjdXRpb25fZGFpbHlfcm9sbHVwc1xuICovXG5leHBvcnQgY29uc3QgZXhlY3V0aW9uRGFpbHlSb2xsdXAgPSBwZ1RhYmxlKCdleGVjdXRpb25fZGFpbHlfcm9sbHVwcycsIHtcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICAvKiogVGhlIFVUQyBkYXRlIHRoaXMgcm93IGFnZ3JlZ2F0ZXMuIFJlcG9ydCBwZXJpb2RzIHJlLWJ1Y2tldCBpbiB0aGUgcmVwb3J0J3NcbiAgICogIG93biB0aW1lem9uZSBieSBzdW1taW5nIGRheXMg4oCUIHdoaWNoIGlzIHdoeSB0aGUgZ3JhaW4gaXMgYSBEQVkuICovXG4gIGRheTogdGltZXN0YW1wKCdkYXknLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5ub3ROdWxsKCksXG4gIHBpcGVsaW5lSWQ6IHZhcmNoYXIoJ3BpcGVsaW5lX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIC8qKiBgJydgIGZvciB0aGUgcGlwZWxpbmUtbGV2ZWwgcm93OyBhIHN0YWdlIG5hbWUgZm9yIGEgc3RhZ2UtbGV2ZWwgcm93LiAqL1xuICBzdGFnZU5hbWU6IHZhcmNoYXIoJ3N0YWdlX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLmRlZmF1bHQoJycpLm5vdE51bGwoKSxcbiAgcnVuczogaW50ZWdlcigncnVucycpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBzdWNjZWVkZWQ6IGludGVnZXIoJ3N1Y2NlZWRlZCcpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBmYWlsZWQ6IGludGVnZXIoJ2ZhaWxlZCcpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICAvKiogY2F0ZWdvcnkg4oaSIGNvdW50LiBGZWVkcyB0aGUgZmFpbHVyZS1hbmFseXNpcyBzZWN0aW9uLiAqL1xuICBmYWlsdXJlc0J5Q2F0ZWdvcnk6IGpzb25iKCdmYWlsdXJlc19ieV9jYXRlZ29yeScpLiR0eXBlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+KCkuZGVmYXVsdCh7fSkubm90TnVsbCgpLFxuICBwNTBNczogaW50ZWdlcigncDUwX21zJyksXG4gIHA5ME1zOiBpbnRlZ2VyKCdwOTBfbXMnKSxcbiAgcDk1TXM6IGludGVnZXIoJ3A5NV9tcycpLFxuICAvKiogU3VtbWVkIGV4ZWN1dGlvbiBkdXJhdGlvbiwgaW4gc2Vjb25kcy4gVGhlIHJlc291cmNlLWNvbnN1bXB0aW9uIHNlY3Rpb24nc1xuICAgKiAgb25seSBpbnB1dDsgZGVsaWJlcmF0ZWx5IE5PVCBjb252ZXJ0ZWQgdG8gbW9uZXkgYW55d2hlcmUuICovXG4gIGJ1aWxkU2Vjb25kczogaW50ZWdlcignYnVpbGRfc2Vjb25kcycpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICAvKiogV2hlbiB0aGlzIHJvdyB3YXMgbGFzdCByZWJ1aWx0LCBzbyBhIGxhdGUtZXZlbnQgcmVidWlsZCBpcyB2aXNpYmxlLiAqL1xuICBjb21wdXRlZEF0OiB0aW1lc3RhbXAoJ2NvbXB1dGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgcGs6IHByaW1hcnlLZXkoeyBjb2x1bW5zOiBbdGFibGUub3JnSWQsIHRhYmxlLmRheSwgdGFibGUucGlwZWxpbmVJZCwgdGFibGUuc3RhZ2VOYW1lXSB9KSxcbiAgb3JnRGF5SWR4OiBpbmRleCgnZXhlY3V0aW9uX3JvbGx1cF9vcmdfZGF5X2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5kYXkpLFxuICBwaXBlbGluZURheUlkeDogaW5kZXgoJ2V4ZWN1dGlvbl9yb2xsdXBfcGlwZWxpbmVfZGF5X2lkeCcpLm9uKHRhYmxlLnBpcGVsaW5lSWQsIHRhYmxlLmRheSksXG59KSk7XG5cbi8qKlxuICogV2hhdCBhIHBpcGVsaW5lJ3MgZGVjbGFyZWQgcGx1Z2luIHN0ZXBzIHJlc29sdmUgdG8uXG4gKlxuICogUmVjb21wdXRlZCBvbiBwaXBlbGluZSB3cml0ZSBhbmQgb24gcGx1Z2luIHB1Ymxpc2gsIHJhdGhlciB0aGFuIHJlc29sdmVkIGF0XG4gKiByZWFkIHRpbWU6IHRoZSBvdXRkYXRlZC1wbHVnaW4gc2VjdGlvbiBjb21wYXJlcyBcImluIHVzZVwiIGFnYWluc3QgXCJsYXRlc3RcbiAqIGF2YWlsYWJsZVwiIGZvciBldmVyeSBzdGVwIG9mIGV2ZXJ5IHBpcGVsaW5lLCBhbmQgZG9pbmcgdGhhdCByZXNvbHV0aW9uIHBlciByZWFkXG4gKiBtYWRlIGl0IGEgcXVlcnkgbm9ib2R5IGNvdWxkIGFmZm9yZCB0byBwdXQgaW4gYSByZXBvcnQuXG4gKlxuICogQHRhYmxlIHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBwaXBlbGluZVBsdWdpblJlc29sdXRpb24gPSBwZ1RhYmxlKCdwaXBlbGluZV9wbHVnaW5fcmVzb2x1dGlvbicsIHtcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBwaXBlbGluZUlkOiB2YXJjaGFyKCdwaXBlbGluZV9pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBzdGFnZU5hbWU6IHZhcmNoYXIoJ3N0YWdlX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgc3RlcE5hbWU6IHZhcmNoYXIoJ3N0ZXBfbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBwbHVnaW5QdWJsaXNoZXI6IHZhcmNoYXIoJ3BsdWdpbl9wdWJsaXNoZXInLCB7IGxlbmd0aDogMzkgfSksXG4gIHBsdWdpbk5hbWU6IHZhcmNoYXIoJ3BsdWdpbl9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIC8qKiBXaGF0IHRoZSBjb25maWcgYXNrZWQgZm9yIOKAlCBhIHJhbmdlLCBhIHBpbiwgb3Igbm90aGluZy4gKi9cbiAgZGVjbGFyZWRWZXJzaW9uOiB2YXJjaGFyKCdkZWNsYXJlZF92ZXJzaW9uJywgeyBsZW5ndGg6IDUwIH0pLFxuICAvKiogV2hhdCB0aGF0IHJlc29sdmVzIHRvIHRvZGF5LiBOVUxMIHdoZW4gbm90aGluZyBzYXRpc2ZpZXMgaXQuICovXG4gIHJlc29sdmVkVmVyc2lvbjogdmFyY2hhcigncmVzb2x2ZWRfdmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KSxcbiAgLyoqIFRoZSByZXNvbHZlZCByZWNvcmQ6IGEgYHBsdWdpbnNgIHJvdyBpZCBvciBhIGxpc3RpbmcgdmVyc2lvbiBpZC4gKi9cbiAgcmVzb2x2ZWRQbHVnaW5JZDogdmFyY2hhcigncmVzb2x2ZWRfcGx1Z2luX2lkJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBkaWdlc3QgdGhlIHJlc29sdmVkIHZlcnNpb24gaXMgcGlubmVkIHRvLiBBIHZlcnNpb24gc3RyaW5nIGFsb25lXG4gICAqIGNhbm5vdCBzYXkgd2hldGhlciBhIHBpcGVsaW5lIGlzIG9uIHRoZSByZWJ1aWx0LCBwYXRjaGVkIGltYWdlIG9yIHRoZSBvbGRcbiAgICogb25lIOKAlCB0aGUgcmVzY2FuIGFuZCB0aGUgYWR2aXNvcnkgc2VhcmNoIG1hdGNoIG9uIHRoaXMuXG4gICAqL1xuICByZXNvbHZlZERpZ2VzdDogdmFyY2hhcigncmVzb2x2ZWRfZGlnZXN0JywgeyBsZW5ndGg6IDcxIH0pLFxuICAvKiogVGhlIG5ld2VzdCB2ZXJzaW9uIHRoZSBvcmcgaXMgZW50aXRsZWQgdG8gaW5zdGFsbCwgZm9yIHRoZSBcImdhcFwiIGNvbHVtbi4gKi9cbiAgbGF0ZXN0VmVyc2lvbjogdmFyY2hhcignbGF0ZXN0X3ZlcnNpb24nLCB7IGxlbmd0aDogNTAgfSksXG4gIC8qKiBgbWFqb3JgIC8gYG1pbm9yYCAvIGBwYXRjaGAgLyBgbm9uZWAsIGZyb20gcmVzb2x2ZWQg4oaSIGxhdGVzdC4gKi9cbiAgdmVyc2lvbkdhcDogdmFyY2hhcigndmVyc2lvbl9nYXAnLCB7IGxlbmd0aDogMTAgfSksXG4gIC8qKiBGYWxzZSB3aGVuIHRoZSByZXNvbHZlZCB2ZXJzaW9uIGlzIG91dHNpZGUgdGhlIG9yZydzIGNvbnN1bXB0aW9uIHBvbGljeS4gKi9cbiAgd2l0aGluUG9saWN5OiBib29sZWFuKCd3aXRoaW5fcG9saWN5JykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIC8qKlxuICAgKiBUaGUgcm9vdCBvcmcgb2YgYSBURUFNJ3MgcGlwZWxpbmUgKG51bGwgZm9yIGEgcm9vdCBvcmcncykuIEEgdGVhbSByZXNvbHZlc1xuICAgKiB0aHJvdWdoIGl0cyByb290J3MgaW5zdGFsbHMsIHBvbGljeSBhbmQgc2hhcmVkIHBsdWdpbnMsIGFuZCB0aGUgcGx1Z2luXG4gICAqIHNlcnZpY2UgcmUtcmVzb2x2aW5nIGEgcGlwZWxpbmUgYWZ0ZXIgYSBwdWJsaXNoIC8gZmxhZyAvIHlhbmsgaGFzIG5vIHJlcXVlc3RcbiAgICogdG8gcmVhZCB0aGUgaGllcmFyY2h5IGZyb20g4oCUIHNvIHRoZSB3cml0ZSB0aGF0IGtuZXcgaXQgcmVjb3JkcyBpdC5cbiAgICovXG4gIHJvb3RPcmdJZDogdmFyY2hhcigncm9vdF9vcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBjb21wdXRlZEF0OiB0aW1lc3RhbXAoJ2NvbXB1dGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgcGs6IHByaW1hcnlLZXkoeyBjb2x1bW5zOiBbdGFibGUucGlwZWxpbmVJZCwgdGFibGUuc3RhZ2VOYW1lLCB0YWJsZS5zdGVwTmFtZV0gfSksXG4gIG9yZ0lkeDogaW5kZXgoJ3BpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uX29yZ19pZHgnKS5vbih0YWJsZS5vcmdJZCksXG4gIHBsdWdpbklkeDogaW5kZXgoJ3BpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uX3BsdWdpbl9pZHgnKS5vbih0YWJsZS5wbHVnaW5QdWJsaXNoZXIsIHRhYmxlLnBsdWdpbk5hbWUpLFxuICAvLyBcIldoaWNoIHBpcGVsaW5lcyBhcmUgYmVoaW5kP1wiIOKAlCB0aGUgb3V0ZGF0ZWQgc2VjdGlvbidzIGRyaXZpbmcgc2Nhbi5cbiAgZ2FwSWR4OiBpbmRleCgncGlwZWxpbmVfcGx1Z2luX3Jlc29sdXRpb25fZ2FwX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS52ZXJzaW9uR2FwKSxcbiAgLy8gXCJXaGljaCBwaXBlbGluZXMgZGVjbGFyZSB0aGlzIHZlcnNpb24gLyBpbWFnZT9cIiDigJQgcmVzY2FuIGZhbi1vdXQsIGFkdmlzb3J5IHNlYXJjaC5cbiAgdmVyc2lvbklkeDogaW5kZXgoJ3BpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uX3ZlcnNpb25faWR4JylcbiAgICAub24odGFibGUucGx1Z2luTmFtZSwgdGFibGUucmVzb2x2ZWRWZXJzaW9uLCB0YWJsZS5yZXNvbHZlZERpZ2VzdCksXG59KSk7XG5cbi8qKlxuICogT25lIHBpcGVsaW5lJ3MgZXhwb3N1cmUgdG8gb25lIHZ1bG5lcmFibGUgcGx1Z2luIHZlcnNpb24uXG4gKlxuICogT3BlbmVkIGJ5IHRoZSBuaWdodGx5IHJlc2NhbiB3aGVuIGEgdmVyc2lvbiBpbiB1c2UgaGFzIGZpeGFibGUgQ3JpdGljYWwvSGlnaFxuICogZmluZGluZ3MsIGFuZCBDTE9TRUQgYnkgYSBkZXBsb3kgdGhhdCBtb3ZlcyB0aGUgcGlwZWxpbmUgb2ZmIGl0LiBJdCBpcyBhXG4gKiBwZXItcGlwZWxpbmUgcm93IHJhdGhlciB0aGFuIGEgcGVyLXZlcnNpb24gb25lIGJlY2F1c2UgdGhlIHF1ZXN0aW9uIGEgbWFuYWdlclxuICogYXNrcyBpcyBcIndoaWNoIG9mIG91ciBwaXBlbGluZXMgaXMgZXhwb3NlZFwiLCBhbmQgYW5zd2VyaW5nIHRoYXQgZnJvbSBhXG4gKiB2ZXJzaW9uLWxldmVsIHRhYmxlIG1lYW5zIHJlLWRlcml2aW5nIHRoZSBwaXBlbGluZSBzZXQgb24gZXZlcnkgcmVhZC5cbiAqXG4gKiBLZXllZCBieSBJTUFHRSBESUdFU1QsIG5vdCB2ZXJzaW9uIHN0cmluZzogYSB2ZXJzaW9uIHJlYnVpbHQgb24gYSBwYXRjaGVkIGJhc2VcbiAqIGltYWdlIGlzIGEgZGlmZmVyZW50IGFydGlmYWN0IHdpdGggZGlmZmVyZW50IGZpbmRpbmdzLCBhbmQga2V5aW5nIG9uIHRoZSBzdHJpbmdcbiAqIHdvdWxkIHJlcG9ydCB0aGUgb2xkIG9uZSBmb3JldmVyLlxuICpcbiAqIEB0YWJsZSBwbHVnaW5fdnVsbl9leHBvc3VyZVxuICovXG5leHBvcnQgY29uc3QgcGx1Z2luVnVsbkV4cG9zdXJlID0gcGdUYWJsZSgncGx1Z2luX3Z1bG5fZXhwb3N1cmUnLCB7XG4gIGlkOiB2YXJjaGFyKCdpZCcsIHsgbGVuZ3RoOiAyNTUgfSkucHJpbWFyeUtleSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHBpcGVsaW5lSWQ6IHZhcmNoYXIoJ3BpcGVsaW5lX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHBsdWdpblB1Ymxpc2hlcjogdmFyY2hhcigncGx1Z2luX3B1Ymxpc2hlcicsIHsgbGVuZ3RoOiAzOSB9KSxcbiAgcGx1Z2luTmFtZTogdmFyY2hhcigncGx1Z2luX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcGx1Z2luVmVyc2lvbjogdmFyY2hhcigncGx1Z2luX3ZlcnNpb24nLCB7IGxlbmd0aDogNTAgfSkubm90TnVsbCgpLFxuICBpbWFnZURpZ2VzdDogdmFyY2hhcignaW1hZ2VfZGlnZXN0JywgeyBsZW5ndGg6IDcxIH0pLFxuICBzb3VyY2U6IHZhcmNoYXIoJ3NvdXJjZScsIHsgbGVuZ3RoOiAxMCB9KS4kdHlwZTxFeHBvc3VyZVNvdXJjZT4oKS5ub3ROdWxsKCksXG4gIGNyaXRpY2FsQ291bnQ6IGludGVnZXIoJ2NyaXRpY2FsX2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIGhpZ2hDb3VudDogaW50ZWdlcignaGlnaF9jb3VudCcpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICAvKiogVGhlIGZpbmRpbmdzIHRoZW1zZWx2ZXM6IENWRSBpZCwgcGFja2FnZSwgZml4ZWQtaW4gdmVyc2lvbi4gQ2FwcGVkIGJ5IHRoZSB3cml0ZXIuICovXG4gIHRvcEZpbmRpbmdzOiBqc29uYigndG9wX2ZpbmRpbmdzJykuJHR5cGU8QXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PigpLmRlZmF1bHQoW10pLm5vdE51bGwoKSxcbiAgLyoqXG4gICAqIEVWRVJZIENyaXRpY2FsL0hpZ2ggZmluZGluZyBvZiB0aGUgdmVyc2lvbiBhdCBpdHMgbGFzdCByZWZyZXNoLCBhcyBmaW5kaW5nXG4gICAqIGtleXMgKGBpZHxwYWNrYWdlfHBhY2thZ2VWZXJzaW9uYCkg4oCUIHVuY2FwcGVkLCB1bmxpa2UgYHRvcF9maW5kaW5nc2AsIGJlY2F1c2VcbiAgICogYW4gYWNjZXB0YW5jZSBpcyBjaGVja2VkIGFnYWluc3QgaXQ6IHdoYXQgd2FzIGFjY2VwdGVkIG11c3QgYmUgcHJvdmFibGUuXG4gICAqL1xuICBmaW5kaW5nS2V5czogdGV4dCgnZmluZGluZ19rZXlzJykuYXJyYXkoKS4kdHlwZTxzdHJpbmdbXT4oKS5kZWZhdWx0KFtdKS5ub3ROdWxsKCksXG4gIC8qKiBUaGUgZmluZGluZyBrZXlzIGFuIGBhY2NlcHRlZGAgdHJpYWdlIGNvdmVyZWQsIGZyb3plbiBhdCB0aGUgZGVjaXNpb24uICovXG4gIGFjY2VwdGVkRmluZGluZ0tleXM6IHRleHQoJ2FjY2VwdGVkX2ZpbmRpbmdfa2V5cycpLmFycmF5KCkuJHR5cGU8c3RyaW5nW10+KCkuZGVmYXVsdChbXSkubm90TnVsbCgpLFxuICAvKiogVGhlIGFjY2VwdGFuY2UgZXhwbGljaXRseSBjb3ZlcmVkIEtFVi1saXN0ZWQgZmluZGluZ3MgKG5ldmVyIGltcGxpZWQpLiAqL1xuICBhY2NlcHRlZEtldjogYm9vbGVhbignYWNjZXB0ZWRfa2V2JykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuICBmbGFnZ2VkQXQ6IHRpbWVzdGFtcCgnZmxhZ2dlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIC8qKiBTZXQgd2hlbiBhIGRlcGxveSBtb3ZlZCB0aGUgcGlwZWxpbmUgb250byBhIHZlcnNpb24gd2l0aG91dCB0aGUgZmluZGluZ3MuICovXG4gIGZpeGVkQXQ6IHRpbWVzdGFtcCgnZml4ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgdHJpYWdlU3RhdGU6IHZhcmNoYXIoJ3RyaWFnZV9zdGF0ZScsIHsgbGVuZ3RoOiAyMCB9KS4kdHlwZTxFeHBvc3VyZVRyaWFnZVN0YXRlPigpLmRlZmF1bHQoJ29wZW4nKS5ub3ROdWxsKCksXG4gIC8qKiBBbiBhY2NlcHRhbmNlIGlzIHRpbWUtYm94ZWQ6IGEgcGVybWFuZW50IG11dGUgaXMgaG93IGEgZmluZGluZyBpcyBmb3Jnb3R0ZW4uICovXG4gIGFjY2VwdGVkVW50aWw6IHRpbWVzdGFtcCgnYWNjZXB0ZWRfdW50aWwnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgdHJpYWdlUmVhc29uOiB0ZXh0KCd0cmlhZ2VfcmVhc29uJyksXG4gIHRyaWFnZWRCeTogdGV4dCgndHJpYWdlZF9ieScpLFxuICB0cmlhZ2VkQXQ6IHRpbWVzdGFtcCgndHJpYWdlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIC8vIE9uZSBsaXZlIGV4cG9zdXJlIHBlciAocGlwZWxpbmUsIHBsdWdpbiB2ZXJzaW9uLCBkaWdlc3QsIHNvdXJjZSk6IGEgbmlnaHRseVxuICAvLyByZXNjYW4gcmVmcmVzaGVzIGNvdW50cyByYXRoZXIgdGhhbiBvcGVuaW5nIGEgbmV3IHJvdyBldmVyeSBuaWdodCwgYW5kIGFcbiAgLy8gdmVyc2lvbiByZWJ1aWx0IG9uIGEgcGF0Y2hlZCBiYXNlIChzYW1lIHN0cmluZywgbmV3IGRpZ2VzdCkgZ2V0cyBpdHMgb3duIHJvdy5cbiAgLy8gcG9zdGdyZXMtaW5pdC5zcWwgY3JlYXRlcyBpdCBOVUxMUyBOT1QgRElTVElOQ1QgKGRyaXp6bGUncyB1bmlxdWVJbmRleCBjYW4ndFxuICAvLyBzYXkgc28pIHNvIGFuIGltYWdlLWxlc3MgdmVyc2lvbiBzdGlsbCBoYXMgZXhhY3RseSBvbmUgcm93IHRvIHJlZnJlc2guXG4gIGV4cG9zdXJlVW5pcXVlOiB1bmlxdWVJbmRleCgncGx1Z2luX3Z1bG5fZXhwb3N1cmVfdW5pcXVlJylcbiAgICAub24odGFibGUucGlwZWxpbmVJZCwgdGFibGUucGx1Z2luTmFtZSwgdGFibGUucGx1Z2luVmVyc2lvbiwgdGFibGUuaW1hZ2VEaWdlc3QsIHRhYmxlLnNvdXJjZSksXG4gIG9yZ09wZW5JZHg6IGluZGV4KCdwbHVnaW5fdnVsbl9leHBvc3VyZV9vcmdfb3Blbl9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUudHJpYWdlU3RhdGUpXG4gICAgLndoZXJlKHNxbGBmaXhlZF9hdCBJUyBOVUxMYCksXG4gIGRpZ2VzdElkeDogaW5kZXgoJ3BsdWdpbl92dWxuX2V4cG9zdXJlX2RpZ2VzdF9pZHgnKS5vbih0YWJsZS5pbWFnZURpZ2VzdCksXG59KSk7XG5cbi8qKlxuICogVGhlIGxhc3QgYC9wbHVnaW5zL2xvb2t1cGAgb3V0Y29tZSBwZXIgcGlwZWxpbmUgU1RFUCwgd2hlbiBzeW50aCAoQ0xJIG9yIHRoZVxuICogQ29kZUJ1aWxkIExhbWJkYSkgc2VuZHMgdGhlIHN0ZXAncyBjb250ZXh0LiBUaGUgREVDTEFSRUQgc2lkZVxuICogKGBwaXBlbGluZV9wbHVnaW5fcmVzb2x1dGlvbmApIHNheXMgd2hhdCB0aGUgY29uZmlnIHJlc29sdmVzIHRvIHdoZW4gaXQgd2FzXG4gKiBzYXZlZDsgdGhpcyBzYXlzIHdoYXQgc3ludGggd2FzIGFjdHVhbGx5IHRvbGQg4oCUIHRoZSB2ZXJzaW9uLCB0aGUgaW1hZ2UsIGV2ZXJ5XG4gKiB3YXJuaW5nLCBhbmQgdGhlIHJlZnVzYWwg4oCUIHdoaWNoIGlzIHdoYXQgYSBcIndoeSBkaWQgbXkgZGVwbG95IHN0b3BcIiBwYWdlIG5lZWRzLlxuICpcbiAqIEB0YWJsZSBwaXBlbGluZV9zdGVwX2xvb2t1cHNcbiAqL1xuZXhwb3J0IGNvbnN0IHBpcGVsaW5lU3RlcExvb2t1cCA9IHBnVGFibGUoJ3BpcGVsaW5lX3N0ZXBfbG9va3VwcycsIHtcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBwaXBlbGluZUlkOiB2YXJjaGFyKCdwaXBlbGluZV9pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICAvKiogVGhlIHN0ZXAncyBjb250cmFjdCBsYWJlbDogYHN5bnRoYCBvciBgPHN0YWdlTmFtZT4vPGFsaWFzID8/IG5hbWU+YC4gKi9cbiAgc3RlcEtleTogdmFyY2hhcignc3RlcF9rZXknLCB7IGxlbmd0aDogNTEyIH0pLm5vdE51bGwoKSxcbiAgcGx1Z2luUHVibGlzaGVyOiB2YXJjaGFyKCdwbHVnaW5fcHVibGlzaGVyJywgeyBsZW5ndGg6IDM5IH0pLFxuICBwbHVnaW5OYW1lOiB2YXJjaGFyKCdwbHVnaW5fbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICAvKiogV2hhdCB0aGUgcmVmZXJlbmNlIGFza2VkIGZvciAoYSByYW5nZSwgYSBwaW4sIG9yIG5vdGhpbmcpLiAqL1xuICByZXF1ZXN0ZWRWZXJzaW9uOiB2YXJjaGFyKCdyZXF1ZXN0ZWRfdmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KSxcbiAgLyoqIE5VTEwgd2hlbiB0aGUgbG9va3VwIHdhcyByZWZ1c2VkLiAqL1xuICByZXNvbHZlZFZlcnNpb246IHZhcmNoYXIoJ3Jlc29sdmVkX3ZlcnNpb24nLCB7IGxlbmd0aDogNTAgfSksXG4gIHJlc29sdmVkUGx1Z2luSWQ6IHZhcmNoYXIoJ3Jlc29sdmVkX3BsdWdpbl9pZCcsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIGltYWdlRGlnZXN0OiB2YXJjaGFyKCdpbWFnZV9kaWdlc3QnLCB7IGxlbmd0aDogNzEgfSksXG4gIC8qKiBgW3sgY29kZSwgbWVzc2FnZSwgc2V2ZXJpdHkgfV1gIOKAlCBldmVyeSB3YXJuaW5nIHRoZSBhbnN3ZXIgY2FycmllZC4gKi9cbiAgd2FybmluZ3M6IGpzb25iKCd3YXJuaW5ncycpLiR0eXBlPEFycmF5PHsgY29kZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmc7IHNldmVyaXR5Pzogc3RyaW5nIH0+PigpLmRlZmF1bHQoW10pLm5vdE51bGwoKSxcbiAgLyoqXG4gICAqIGB7IGNvZGUsIHJlYXNvbiwgbWVzc2FnZSB9YCB3aGVuIHRoZSBsb29rdXAgd2FzIHJlZnVzZWQg4oCUIG5ldmVyIGZvclxuICAgKiB2dWxuZXJhYmlsaXR5IHN0YXRlICh0aGF0IG9ubHkgZ3JhZGVzKSwgYnV0IGZvciBhIGRlbGV0ZWQgLyBub3QtaW5zdGFsbGVkIC9cbiAgICogcG9saWN5LWJsb2NrZWQgcGx1Z2luIG9yIGEgZmFpbGVkIGltYWdlIHNpZ25hdHVyZS5cbiAgICovXG4gIHJlZnVzYWw6IGpzb25iKCdyZWZ1c2FsJykuJHR5cGU8eyBjb2RlOiBzdHJpbmc7IHJlYXNvbjogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfSB8IG51bGw+KCksXG4gIGxvb2tlZFVwQXQ6IHRpbWVzdGFtcCgnbG9va2VkX3VwX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgcGs6IHByaW1hcnlLZXkoeyBjb2x1bW5zOiBbdGFibGUucGlwZWxpbmVJZCwgdGFibGUuc3RlcEtleV0gfSksXG4gIG9yZ0lkeDogaW5kZXgoJ3BpcGVsaW5lX3N0ZXBfbG9va3Vwc19vcmdfaWR4Jykub24odGFibGUub3JnSWQpLFxufSkpO1xuXG4vKipcbiAqIFRoZSBsYXRlc3Qgc2VjdXJpdHktc2Nhbm5lciByZXBvcnQgYSBwaXBlbGluZSBSVU4gdXBsb2FkZWQsIHBlciAocGlwZWxpbmUsXG4gKiB0b29sLCBzdGFnZSkg4oCUIHdoYXQgdGhlIHBpcGVsaW5lJ3Mgb3duIHNjYW4gc3RlcHMgZm91bmQgaW4gd2hhdCBpdCBidWlsZHMsXG4gKiBuZXh0IHRvIHdoYXQgdGhlIHBsYXRmb3JtJ3MgcmVzY2FuIGZvdW5kIGluIHRoZSBwbHVnaW4gaW1hZ2VzIGl0IHJ1bnMuXG4gKiBDb3VudHMgYXJlIHN0b3JlZCBzbyBhIHJlcG9ydCBzZWN0aW9uIHJlYWRzIHRoZW0gd2l0aG91dCB1bnBhY2tpbmcgZmluZGluZ3MuXG4gKlxuICogQHRhYmxlIHBpcGVsaW5lX3NlY3VyaXR5X3JlcG9ydHNcbiAqL1xuZXhwb3J0IGNvbnN0IHBpcGVsaW5lU2VjdXJpdHlSZXBvcnQgPSBwZ1RhYmxlKCdwaXBlbGluZV9zZWN1cml0eV9yZXBvcnRzJywge1xuICBpZDogdmFyY2hhcignaWQnLCB7IGxlbmd0aDogMjU1IH0pLnByaW1hcnlLZXkoKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBwaXBlbGluZUlkOiB2YXJjaGFyKCdwaXBlbGluZV9pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICB0b29sOiB2YXJjaGFyKCd0b29sJywgeyBsZW5ndGg6IDY0IH0pLm5vdE51bGwoKSxcbiAgZm9ybWF0OiB2YXJjaGFyKCdmb3JtYXQnLCB7IGxlbmd0aDogMTYgfSkubm90TnVsbCgpLFxuICBzdGFnZTogdmFyY2hhcignc3RhZ2UnLCB7IGxlbmd0aDogMjU1IH0pLmRlZmF1bHQoJycpLm5vdE51bGwoKSxcbiAgZXhlY3V0aW9uSWQ6IHZhcmNoYXIoJ2V4ZWN1dGlvbl9pZCcsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIGNyaXRpY2FsQ291bnQ6IGludGVnZXIoJ2NyaXRpY2FsX2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIGhpZ2hDb3VudDogaW50ZWdlcignaGlnaF9jb3VudCcpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBtZWRpdW1Db3VudDogaW50ZWdlcignbWVkaXVtX2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIGxvd0NvdW50OiBpbnRlZ2VyKCdsb3dfY291bnQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAga2V2Q291bnQ6IGludGVnZXIoJ2tldl9jb3VudCcpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBjcml0aWNhbEZpeGFibGU6IGludGVnZXIoJ2NyaXRpY2FsX2ZpeGFibGUnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgaGlnaEZpeGFibGU6IGludGVnZXIoJ2hpZ2hfZml4YWJsZScpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBmaW5kaW5nczoganNvbmIoJ2ZpbmRpbmdzJykuJHR5cGU8QXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PigpLmRlZmF1bHQoW10pLm5vdE51bGwoKSxcbiAgdHJ1bmNhdGVkOiBib29sZWFuKCd0cnVuY2F0ZWQnKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG4gIHN1Ym1pdHRlZEJ5OiB0ZXh0KCdzdWJtaXR0ZWRfYnknKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBsYXRlc3RVbmlxdWU6IHVuaXF1ZUluZGV4KCdwaXBlbGluZV9zZWN1cml0eV9yZXBvcnRzX3VuaXF1ZScpLm9uKHRhYmxlLnBpcGVsaW5lSWQsIHRhYmxlLnRvb2wsIHRhYmxlLnN0YWdlKSxcbiAgb3JnSWR4OiBpbmRleCgncGlwZWxpbmVfc2VjdXJpdHlfcmVwb3J0c19vcmdfaWR4Jykub24odGFibGUub3JnSWQpLFxufSkpO1xuXG5leHBvcnQgdHlwZSBEb3JhRGVwbG95bWVudCA9IHR5cGVvZiBkb3JhRGVwbG95bWVudC4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBEb3JhRGVwbG95bWVudEluc2VydCA9IHR5cGVvZiBkb3JhRGVwbG95bWVudC4kaW5mZXJJbnNlcnQ7XG5leHBvcnQgdHlwZSBFeGVjdXRpb25EYWlseVJvbGx1cCA9IHR5cGVvZiBleGVjdXRpb25EYWlseVJvbGx1cC4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBFeGVjdXRpb25EYWlseVJvbGx1cEluc2VydCA9IHR5cGVvZiBleGVjdXRpb25EYWlseVJvbGx1cC4kaW5mZXJJbnNlcnQ7XG5leHBvcnQgdHlwZSBQaXBlbGluZVBsdWdpblJlc29sdXRpb24gPSB0eXBlb2YgcGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBpcGVsaW5lUGx1Z2luUmVzb2x1dGlvbkluc2VydCA9IHR5cGVvZiBwaXBlbGluZVBsdWdpblJlc29sdXRpb24uJGluZmVySW5zZXJ0O1xuZXhwb3J0IHR5cGUgUGx1Z2luVnVsbkV4cG9zdXJlID0gdHlwZW9mIHBsdWdpblZ1bG5FeHBvc3VyZS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQbHVnaW5WdWxuRXhwb3N1cmVJbnNlcnQgPSB0eXBlb2YgcGx1Z2luVnVsbkV4cG9zdXJlLiRpbmZlckluc2VydDtcbmV4cG9ydCB0eXBlIFBpcGVsaW5lU3RlcExvb2t1cCA9IHR5cGVvZiBwaXBlbGluZVN0ZXBMb29rdXAuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUGlwZWxpbmVTZWN1cml0eVJlcG9ydCA9IHR5cGVvZiBwaXBlbGluZVNlY3VyaXR5UmVwb3J0LiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBpcGVsaW5lU3RlcExvb2t1cEluc2VydCA9IHR5cGVvZiBwaXBlbGluZVN0ZXBMb29rdXAuJGluZmVySW5zZXJ0O1xuIl19