@pipeline-builder/pipeline-data 4.1.15 → 4.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/access-control-builder.d.ts +18 -1
- package/lib/api/access-control-builder.js +19 -6
- package/lib/api/crud-service.d.ts +94 -36
- package/lib/api/crud-service.js +188 -166
- package/lib/api/plugin-resolution.d.ts +253 -0
- package/lib/api/plugin-resolution.js +649 -0
- package/lib/api/public-directory.d.ts +281 -0
- package/lib/api/public-directory.js +457 -0
- package/lib/api/query-builders.d.ts +13 -0
- package/lib/api/query-builders.js +74 -9
- package/lib/api/reporting/caches.js +4 -4
- package/lib/api/reporting/dora-scoring.d.ts +3 -3
- package/lib/api/reporting/dora-scoring.js +4 -4
- package/lib/api/reporting/dora.d.ts +6 -6
- package/lib/api/reporting/dora.js +97 -73
- package/lib/api/reporting/plugin-runtime.d.ts +25 -0
- package/lib/api/reporting/plugin-runtime.js +106 -0
- package/lib/api/reporting/query-scope.d.ts +8 -2
- package/lib/api/reporting/query-scope.js +16 -7
- package/lib/api/reporting/retention.d.ts +4 -10
- package/lib/api/reporting/retention.js +8 -11
- package/lib/api/reporting/sql-helpers.d.ts +4 -7
- package/lib/api/reporting/sql-helpers.js +8 -9
- package/lib/api/reporting/types.d.ts +55 -17
- package/lib/api/reporting/types.js +1 -1
- package/lib/api/reporting-service.d.ts +35 -26
- package/lib/api/reporting-service.js +245 -161
- package/lib/api/semver-range.d.ts +73 -0
- package/lib/api/semver-range.js +227 -0
- package/lib/api/soft-delete-sweep.js +8 -20
- package/lib/core/query-filters.d.ts +18 -3
- package/lib/core/query-filters.js +1 -1
- package/lib/database/drizzle-schema.d.ts +7790 -2461
- package/lib/database/drizzle-schema.js +29 -1
- package/lib/database/index.d.ts +4 -2
- package/lib/database/index.js +5 -3
- package/lib/database/pg-result.d.ts +19 -0
- package/lib/database/pg-result.js +32 -0
- package/lib/database/postgres-connection.js +14 -24
- package/lib/database/public-reader.d.ts +14 -0
- package/lib/database/public-reader.js +68 -0
- package/lib/database/retry-strategy.d.ts +3 -5
- package/lib/database/retry-strategy.js +4 -6
- package/lib/database/schema/compliance.d.ts +16 -34
- package/lib/database/schema/compliance.js +4 -4
- package/lib/database/schema/dashboard.js +4 -2
- package/lib/database/schema/ecosystem.d.ts +6586 -0
- package/lib/database/schema/ecosystem.js +709 -0
- package/lib/database/schema/message.d.ts +6 -12
- package/lib/database/schema/message.js +3 -1
- package/lib/database/schema/pipeline.d.ts +79 -5
- package/lib/database/schema/pipeline.js +46 -25
- package/lib/database/schema/plugin.d.ts +587 -3
- package/lib/database/schema/plugin.js +86 -14
- package/lib/database/tenancy.d.ts +6 -7
- package/lib/database/tenancy.js +13 -14
- package/lib/index.d.ts +7 -4
- package/lib/index.js +7 -4
- package/lib/testing/exports.json +146 -0
- package/package.json +44 -7
|
@@ -0,0 +1,709 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { sql } from 'drizzle-orm';
|
|
4
|
+
import { boolean, check, customType, doublePrecision, index, integer, jsonb, pgTable, pgView, primaryKey, smallint, text, timestamp, uniqueIndex, uuid, varchar, } from 'drizzle-orm/pg-core';
|
|
5
|
+
/** Postgres `tsvector`, which drizzle-orm has no native column for. */
|
|
6
|
+
const tsvector = customType({
|
|
7
|
+
dataType() {
|
|
8
|
+
return 'tsvector';
|
|
9
|
+
},
|
|
10
|
+
});
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Enumerations — defined in api-core's wire vocabulary so the frontend shares
|
|
13
|
+
// them; each is mirrored by a CHECK in postgres-init.sql
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
export { PUBLISHER_TIERS, LISTING_STATES, PUBLISH_REQUEST_KINDS, PUBLISH_REQUEST_STATUSES, OPEN_PUBLISH_REQUEST_STATUSES, INSTALL_VERSION_POLICIES, REVIEW_HOLD_REASONS, REVIEW_REPORT_CATEGORIES, SUBMISSION_STATUSES, } from '@pipeline-builder/api-core';
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Ecosystem-global tables
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/**
|
|
20
|
+
* An org's public identity (one per root org). `ownerOrgId` is NULL for the
|
|
21
|
+
* platform-owned `community` publisher anonymous submissions land under.
|
|
22
|
+
*
|
|
23
|
+
* @table publishers
|
|
24
|
+
*/
|
|
25
|
+
export const publisher = pgTable('publishers', {
|
|
26
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
27
|
+
ownerOrgId: varchar('owner_org_id', { length: 255 }).unique(),
|
|
28
|
+
handle: varchar('handle', { length: 39 }).notNull().unique(),
|
|
29
|
+
displayName: varchar('display_name', { length: 255 }).notNull(),
|
|
30
|
+
description: text('description'),
|
|
31
|
+
homepageUrl: varchar('homepage_url', { length: 2048 }),
|
|
32
|
+
tier: varchar('tier', { length: 20 }).$type().default('community').notNull(),
|
|
33
|
+
verifiedAt: timestamp('verified_at', { withTimezone: true }),
|
|
34
|
+
// Verified publisher downgraded below Team keeps the tier until this passes (N29).
|
|
35
|
+
verifiedGraceUntil: timestamp('verified_grace_until', { withTimezone: true }),
|
|
36
|
+
termsVersion: varchar('terms_version', { length: 50 }),
|
|
37
|
+
termsAcceptedAt: timestamp('terms_accepted_at', { withTimezone: true }),
|
|
38
|
+
suspendedAt: timestamp('suspended_at', { withTimezone: true }),
|
|
39
|
+
suspendReason: text('suspend_reason'),
|
|
40
|
+
// W7 roll-ups, written by the stats sweep: run-weighted 30-day success rate
|
|
41
|
+
// and the install-weighted mean health score of its listings (NULL: none).
|
|
42
|
+
successRate30d: doublePrecision('success_rate_30d'),
|
|
43
|
+
healthScore: integer('health_score'),
|
|
44
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
45
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
46
|
+
}, (table) => ({
|
|
47
|
+
handleCheck: check('publishers_handle_check', sql `${table.handle} ~ '^[a-z0-9][a-z0-9-]*$'`),
|
|
48
|
+
tierCheck: check('publishers_tier_check', sql `${table.tier} IN ('official', 'verified', 'community', 'unverified')`),
|
|
49
|
+
}));
|
|
50
|
+
/**
|
|
51
|
+
* A plugin NAME published by a publisher. Reviews, installs, stats and search
|
|
52
|
+
* attach here; the per-version records are {@link pluginListingVersion}.
|
|
53
|
+
* `searchVector` is maintained by a trigger in postgres-init.sql (name A,
|
|
54
|
+
* keywords + category B, summary C, README + description D, config `english`)
|
|
55
|
+
* — never write it from the application.
|
|
56
|
+
*
|
|
57
|
+
* @table plugin_listings
|
|
58
|
+
*/
|
|
59
|
+
export const pluginListing = pgTable('plugin_listings', {
|
|
60
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
61
|
+
publisherId: uuid('publisher_id').notNull().references(() => publisher.id),
|
|
62
|
+
name: varchar('name', { length: 255 }).notNull(),
|
|
63
|
+
category: varchar('category', { length: 50 }).default('unknown').notNull(),
|
|
64
|
+
summary: varchar('summary', { length: 300 }),
|
|
65
|
+
description: text('description'),
|
|
66
|
+
readmeHtml: text('readme_html'),
|
|
67
|
+
license: varchar('license', { length: 64 }),
|
|
68
|
+
homepageUrl: varchar('homepage_url', { length: 2048 }),
|
|
69
|
+
sourceUrl: varchar('source_url', { length: 2048 }),
|
|
70
|
+
icon: jsonb('icon').$type(),
|
|
71
|
+
uploadedIcon: jsonb('uploaded_icon').$type(),
|
|
72
|
+
keywords: jsonb('keywords').$type().default([]).notNull(),
|
|
73
|
+
state: varchar('state', { length: 20 }).$type().default('listed').notNull(),
|
|
74
|
+
// Publisher pause: no new installs; existing installs keep resolving.
|
|
75
|
+
pausedAt: timestamp('paused_at', { withTimezone: true }),
|
|
76
|
+
featured: boolean('featured').default(false).notNull(),
|
|
77
|
+
latestVersion: varchar('latest_version', { length: 50 }),
|
|
78
|
+
searchVector: tsvector('search_vector'),
|
|
79
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
80
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
81
|
+
}, (table) => ({
|
|
82
|
+
publisherNameUnique: uniqueIndex('plugin_listing_publisher_name_unique').on(table.publisherId, table.name),
|
|
83
|
+
stateCategoryIdx: index('plugin_listing_state_category_idx').on(table.state, table.category),
|
|
84
|
+
updatedAtIdx: index('plugin_listing_updated_at_idx').on(table.updatedAt),
|
|
85
|
+
searchVectorIdx: index('plugin_listing_search_vector_idx').using('gin', table.searchVector),
|
|
86
|
+
// pg_trgm: typo-tolerant name matching ("terafrom" -> terraform).
|
|
87
|
+
nameTrgmIdx: index('plugin_listing_name_trgm_idx').using('gin', sql `${table.name} gin_trgm_ops`),
|
|
88
|
+
stateCheck: check('plugin_listings_state_check', sql `${table.state} IN ('listed', 'unmaintained', 'suspended', 'transferred')`),
|
|
89
|
+
}));
|
|
90
|
+
/**
|
|
91
|
+
* A version published to a listing — the copy in the read-only `public/*`
|
|
92
|
+
* namespace. Immutable once written apart from pause / yank /
|
|
93
|
+
* deprecation. `sourcePluginId` is provenance only (no FK: the org row is
|
|
94
|
+
* soft-deleted and purged on its own schedule).
|
|
95
|
+
*
|
|
96
|
+
* @table plugin_listing_versions
|
|
97
|
+
*/
|
|
98
|
+
export const pluginListingVersion = pgTable('plugin_listing_versions', {
|
|
99
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
100
|
+
listingId: uuid('listing_id').notNull().references(() => pluginListing.id, { onDelete: 'cascade' }),
|
|
101
|
+
sourcePluginId: uuid('source_plugin_id'),
|
|
102
|
+
version: varchar('version', { length: 50 }).notNull(),
|
|
103
|
+
imageDigest: varchar('image_digest', { length: 71 }),
|
|
104
|
+
// public/<handle>/<name>
|
|
105
|
+
imageRepository: varchar('image_repository', { length: 512 }),
|
|
106
|
+
specSnapshot: jsonb('spec_snapshot').$type().default({}).notNull(),
|
|
107
|
+
breaking: boolean('breaking').default(false).notNull(),
|
|
108
|
+
pausedAt: timestamp('paused_at', { withTimezone: true }),
|
|
109
|
+
yankedAt: timestamp('yanked_at', { withTimezone: true }),
|
|
110
|
+
yankReason: text('yank_reason'),
|
|
111
|
+
deprecatedAt: timestamp('deprecated_at', { withTimezone: true }),
|
|
112
|
+
deprecationMessage: text('deprecation_message'),
|
|
113
|
+
changelog: text('changelog'),
|
|
114
|
+
vulnCritical: integer('vuln_critical'),
|
|
115
|
+
vulnHigh: integer('vuln_high'),
|
|
116
|
+
scannedAt: timestamp('scanned_at', { withTimezone: true }),
|
|
117
|
+
// The base image's config `created` time, recorded at publish; NULL = unknown.
|
|
118
|
+
baseImageCreatedAt: timestamp('base_image_created_at', { withTimezone: true }),
|
|
119
|
+
// When maintenance collected this long-yanked, unreferenced version's public/* image; NULL = still stored.
|
|
120
|
+
imageCollectedAt: timestamp('image_collected_at', { withTimezone: true }),
|
|
121
|
+
publishedAt: timestamp('published_at', { withTimezone: true }).defaultNow().notNull(),
|
|
122
|
+
publishedBy: text('published_by').notNull(),
|
|
123
|
+
}, (table) => ({
|
|
124
|
+
listingVersionUnique: uniqueIndex('plugin_listing_version_unique').on(table.listingId, table.version),
|
|
125
|
+
// public/* GC guard + digest lookups.
|
|
126
|
+
digestIdx: index('plugin_listing_version_digest_idx').on(table.imageDigest),
|
|
127
|
+
versionCheck: check('plugin_listing_versions_version_check', sql `${table.version} ~ '^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$'`),
|
|
128
|
+
imageDigestCheck: check('plugin_listing_versions_image_digest_check', sql `${table.imageDigest} IS NULL OR ${table.imageDigest} ~ '^sha256:[0-9a-f]{64}$'`),
|
|
129
|
+
}));
|
|
130
|
+
/**
|
|
131
|
+
* Security advisory against a listing's version range.
|
|
132
|
+
*
|
|
133
|
+
* @table plugin_advisories
|
|
134
|
+
*/
|
|
135
|
+
export const pluginAdvisory = pgTable('plugin_advisories', {
|
|
136
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
137
|
+
listingId: uuid('listing_id').notNull().references(() => pluginListing.id),
|
|
138
|
+
publisherId: uuid('publisher_id').notNull().references(() => publisher.id),
|
|
139
|
+
// Semver range of affected versions.
|
|
140
|
+
affectedRange: varchar('affected_range', { length: 255 }).notNull(),
|
|
141
|
+
fixedVersion: varchar('fixed_version', { length: 50 }),
|
|
142
|
+
severity: varchar('severity', { length: 10 }).$type().notNull(),
|
|
143
|
+
summary: varchar('summary', { length: 300 }).notNull(),
|
|
144
|
+
detailsMd: text('details_md'),
|
|
145
|
+
detailsHtml: text('details_html'),
|
|
146
|
+
cveIds: text('cve_ids').array().default([]).notNull(),
|
|
147
|
+
state: varchar('state', { length: 20 }).$type().default('draft').notNull(),
|
|
148
|
+
source: varchar('source', { length: 20 }).$type().notNull(),
|
|
149
|
+
createdBy: text('created_by').notNull(),
|
|
150
|
+
publishedBy: text('published_by'),
|
|
151
|
+
publishedAt: timestamp('published_at', { withTimezone: true }),
|
|
152
|
+
withdrawnAt: timestamp('withdrawn_at', { withTimezone: true }),
|
|
153
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
154
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
155
|
+
}, (table) => ({
|
|
156
|
+
listingStateIdx: index('plugin_advisory_listing_state_idx').on(table.listingId, table.state),
|
|
157
|
+
publisherIdx: index('plugin_advisory_publisher_idx').on(table.publisherId),
|
|
158
|
+
severityCheck: check('plugin_advisories_severity_check', sql `${table.severity} IN ('critical', 'high', 'medium', 'low')`),
|
|
159
|
+
stateCheck: check('plugin_advisories_state_check', sql `${table.state} IN ('draft', 'published', 'withdrawn')`),
|
|
160
|
+
sourceCheck: check('plugin_advisories_source_check', sql `${table.source} IN ('publisher', 'moderator', 'cve_rescan', 'review')`),
|
|
161
|
+
}));
|
|
162
|
+
/**
|
|
163
|
+
* System-org auto-approval rules; enabling or widening one
|
|
164
|
+
* needs a second approver (`pendingChange`).
|
|
165
|
+
*
|
|
166
|
+
* @table ecosystem_auto_approval_rules
|
|
167
|
+
*/
|
|
168
|
+
export const ecosystemAutoApprovalRule = pgTable('ecosystem_auto_approval_rules', {
|
|
169
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
170
|
+
name: varchar('name', { length: 255 }).notNull(),
|
|
171
|
+
enabled: boolean('enabled').default(false).notNull(),
|
|
172
|
+
conditions: jsonb('conditions').$type().default({}).notNull(),
|
|
173
|
+
createdBy: text('created_by').notNull(),
|
|
174
|
+
// Second approver (never the creator).
|
|
175
|
+
approvedBy: text('approved_by'),
|
|
176
|
+
pendingChange: jsonb('pending_change').$type(),
|
|
177
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
178
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
179
|
+
});
|
|
180
|
+
/**
|
|
181
|
+
* The single queue the Ecosystem console works from. `digest` is pinned
|
|
182
|
+
* at submit: approval publishes exactly it, or fails closed. `pluginId`
|
|
183
|
+
* has no FK (the org row is soft-deleted and purged on its own schedule).
|
|
184
|
+
*
|
|
185
|
+
* @table plugin_publish_requests
|
|
186
|
+
*/
|
|
187
|
+
export const pluginPublishRequest = pgTable('plugin_publish_requests', {
|
|
188
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
189
|
+
publisherId: uuid('publisher_id').notNull().references(() => publisher.id),
|
|
190
|
+
listingId: uuid('listing_id').references(() => pluginListing.id),
|
|
191
|
+
pluginId: uuid('plugin_id'),
|
|
192
|
+
version: varchar('version', { length: 50 }),
|
|
193
|
+
digest: varchar('digest', { length: 71 }),
|
|
194
|
+
kind: varchar('kind', { length: 20 }).$type().notNull(),
|
|
195
|
+
securityFixAdvisoryId: uuid('security_fix_advisory_id').references(() => pluginAdvisory.id),
|
|
196
|
+
payload: jsonb('payload').$type().default({}).notNull(),
|
|
197
|
+
status: varchar('status', { length: 30 }).$type().default('pending').notNull(),
|
|
198
|
+
lane: varchar('lane', { length: 10 }).$type().default('standard').notNull(),
|
|
199
|
+
submittedBy: text('submitted_by').notNull(),
|
|
200
|
+
submittedOrgId: varchar('submitted_org_id', { length: 255 }),
|
|
201
|
+
firstApprovedBy: text('first_approved_by'),
|
|
202
|
+
decidedBy: text('decided_by'),
|
|
203
|
+
secondApprovedBy: text('second_approved_by'),
|
|
204
|
+
reason: text('reason'),
|
|
205
|
+
autoRuleId: uuid('auto_rule_id').references(() => ecosystemAutoApprovalRule.id),
|
|
206
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
207
|
+
decidedAt: timestamp('decided_at', { withTimezone: true }),
|
|
208
|
+
}, (table) => ({
|
|
209
|
+
statusCreatedIdx: index('plugin_publish_request_status_created_idx').on(table.status, table.createdAt),
|
|
210
|
+
publisherIdx: index('plugin_publish_request_publisher_idx').on(table.publisherId, table.createdAt),
|
|
211
|
+
// At most ONE open request of a kind per (publisher, listing, version). A
|
|
212
|
+
// new_listing has no listing yet, so the requested name (payload->>'name')
|
|
213
|
+
// stands in; COALESCE because NULLs are DISTINCT in a unique index. Advisory
|
|
214
|
+
// drafts are exempt: a listing can carry several at once (different ranges
|
|
215
|
+
// and CVE sets), each deduplicated by the advisory service. Must match the
|
|
216
|
+
// postgres-init.sql expression index.
|
|
217
|
+
openUnique: uniqueIndex('plugin_publish_request_open_unique')
|
|
218
|
+
.on(table.publisherId, table.kind, sql `coalesce(${table.listingId}::text, ${table.payload}->>'name', '')`, sql `coalesce(${table.version}, '')`)
|
|
219
|
+
.where(sql `status IN ('pending', 'pending_second_approval') AND kind <> 'advisory'`),
|
|
220
|
+
digestCheck: check('plugin_publish_requests_digest_check', sql `${table.digest} IS NULL OR ${table.digest} ~ '^sha256:[0-9a-f]{64}$'`),
|
|
221
|
+
kindCheck: check('plugin_publish_requests_kind_check', sql `${table.kind} IN ('new_listing', 'new_version',
|
|
222
|
+
'listing_update', 'yank', 'unpause', 'transfer', 'claim', 'profile_change', 'advisory', 'verify', 'moderation',
|
|
223
|
+
'submission')`),
|
|
224
|
+
statusCheck: check('plugin_publish_requests_status_check', sql `${table.status} IN ('pending', 'pending_second_approval', 'approved', 'rejected', 'withdrawn')`),
|
|
225
|
+
laneCheck: check('plugin_publish_requests_lane_check', sql `${table.lane} IN ('standard', 'security')`),
|
|
226
|
+
}));
|
|
227
|
+
/**
|
|
228
|
+
* Names held back from handles/listings (Official/Verified reservations,
|
|
229
|
+
* confusables). `publisherId` = the publisher the name is reserved FOR, if any.
|
|
230
|
+
*
|
|
231
|
+
* @table ecosystem_reserved_names
|
|
232
|
+
*/
|
|
233
|
+
export const ecosystemReservedName = pgTable('ecosystem_reserved_names', {
|
|
234
|
+
name: varchar('name', { length: 255 }).primaryKey(),
|
|
235
|
+
reason: text('reason'),
|
|
236
|
+
publisherId: uuid('publisher_id').references(() => publisher.id),
|
|
237
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
238
|
+
});
|
|
239
|
+
/**
|
|
240
|
+
* Instance-wide ecosystem knobs (flags, SLA, thresholds), key/value.
|
|
241
|
+
*
|
|
242
|
+
* @table ecosystem_settings
|
|
243
|
+
*/
|
|
244
|
+
export const ecosystemSetting = pgTable('ecosystem_settings', {
|
|
245
|
+
key: varchar('key', { length: 100 }).primaryKey(),
|
|
246
|
+
value: jsonb('value').$type().notNull(),
|
|
247
|
+
updatedBy: text('updated_by'),
|
|
248
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
249
|
+
});
|
|
250
|
+
/**
|
|
251
|
+
* Curated directory collections ("Featured", "Security scanners", …).
|
|
252
|
+
*
|
|
253
|
+
* @table ecosystem_collections
|
|
254
|
+
*/
|
|
255
|
+
export const ecosystemCollection = pgTable('ecosystem_collections', {
|
|
256
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
257
|
+
slug: varchar('slug', { length: 100 }).notNull().unique(),
|
|
258
|
+
title: varchar('title', { length: 255 }).notNull(),
|
|
259
|
+
description: text('description'),
|
|
260
|
+
listingIds: jsonb('listing_ids').$type().default([]).notNull(),
|
|
261
|
+
position: integer('position').default(0).notNull(),
|
|
262
|
+
updatedBy: text('updated_by'),
|
|
263
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
264
|
+
});
|
|
265
|
+
/**
|
|
266
|
+
* A listing review. `authorOrgId` feeds the integrity rules (no
|
|
267
|
+
* self-review, per-org rate limit, verified use) and is NEVER exposed. GDPR
|
|
268
|
+
* user deletion anonymizes: `authorUserId` and the body go NULL, the rating stays.
|
|
269
|
+
*
|
|
270
|
+
* @table plugin_reviews
|
|
271
|
+
*/
|
|
272
|
+
export const pluginReview = pgTable('plugin_reviews', {
|
|
273
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
274
|
+
listingId: uuid('listing_id').notNull().references(() => pluginListing.id, { onDelete: 'cascade' }),
|
|
275
|
+
version: varchar('version', { length: 50 }),
|
|
276
|
+
rating: smallint('rating').notNull(),
|
|
277
|
+
title: varchar('title', { length: 120 }),
|
|
278
|
+
bodyMd: text('body_md'),
|
|
279
|
+
bodyHtml: text('body_html'),
|
|
280
|
+
authorUserId: text('author_user_id'),
|
|
281
|
+
authorOrgId: varchar('author_org_id', { length: 255 }),
|
|
282
|
+
// The only author field ever shown (snapshot at write time; NULL once anonymized).
|
|
283
|
+
authorDisplayName: varchar('author_display_name', { length: 100 }),
|
|
284
|
+
verifiedUse: boolean('verified_use').default(false).notNull(),
|
|
285
|
+
status: varchar('status', { length: 10 }).$type().default('published').notNull(),
|
|
286
|
+
holdReason: varchar('hold_reason', { length: 20 }).$type(),
|
|
287
|
+
moderationReason: text('moderation_reason'),
|
|
288
|
+
helpfulCount: integer('helpful_count').default(0).notNull(),
|
|
289
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
290
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
291
|
+
}, (table) => ({
|
|
292
|
+
listingAuthorUnique: uniqueIndex('plugin_review_listing_author_unique').on(table.listingId, table.authorUserId),
|
|
293
|
+
listingStatusCreatedIdx: index('plugin_review_listing_status_created_idx')
|
|
294
|
+
.on(table.listingId, table.status, table.createdAt),
|
|
295
|
+
// Per-org daily review cap.
|
|
296
|
+
authorOrgCreatedIdx: index('plugin_review_author_org_created_idx').on(table.authorOrgId, table.createdAt),
|
|
297
|
+
// Moderation queue.
|
|
298
|
+
statusUpdatedIdx: index('plugin_review_status_updated_idx').on(table.status, table.updatedAt),
|
|
299
|
+
ratingCheck: check('plugin_reviews_rating_check', sql `${table.rating} BETWEEN 1 AND 5`),
|
|
300
|
+
statusCheck: check('plugin_reviews_status_check', sql `${table.status} IN ('published', 'held', 'removed')`),
|
|
301
|
+
holdReasonCheck: check('plugin_reviews_hold_reason_check', sql `${table.holdReason} IN ('reports', 'burst', 'filter', 'security', 'moderator')`),
|
|
302
|
+
}));
|
|
303
|
+
/**
|
|
304
|
+
* The one public publisher reply to a review.
|
|
305
|
+
*
|
|
306
|
+
* @table plugin_review_replies
|
|
307
|
+
*/
|
|
308
|
+
export const pluginReviewReply = pgTable('plugin_review_replies', {
|
|
309
|
+
reviewId: uuid('review_id').primaryKey().references(() => pluginReview.id, { onDelete: 'cascade' }),
|
|
310
|
+
publisherId: uuid('publisher_id').notNull().references(() => publisher.id),
|
|
311
|
+
authorUserId: text('author_user_id'),
|
|
312
|
+
bodyMd: text('body_md').notNull(),
|
|
313
|
+
bodyHtml: text('body_html').notNull(),
|
|
314
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
315
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
316
|
+
});
|
|
317
|
+
/**
|
|
318
|
+
* "Report review" — one per reporter per review; N reports auto-hold it.
|
|
319
|
+
*
|
|
320
|
+
* @table plugin_review_reports
|
|
321
|
+
*/
|
|
322
|
+
export const pluginReviewReport = pgTable('plugin_review_reports', {
|
|
323
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
324
|
+
reviewId: uuid('review_id').notNull().references(() => pluginReview.id, { onDelete: 'cascade' }),
|
|
325
|
+
reporterUserId: text('reporter_user_id').notNull(),
|
|
326
|
+
category: varchar('category', { length: 20 }).$type().default('abuse').notNull(),
|
|
327
|
+
reason: text('reason'),
|
|
328
|
+
// Set once a moderator released or removed the review.
|
|
329
|
+
resolvedAt: timestamp('resolved_at', { withTimezone: true }),
|
|
330
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
331
|
+
}, (table) => ({
|
|
332
|
+
reviewReporterUnique: uniqueIndex('plugin_review_report_unique').on(table.reviewId, table.reporterUserId),
|
|
333
|
+
openIdx: index('plugin_review_report_open_idx').on(table.reviewId).where(sql `${table.resolvedAt} IS NULL`),
|
|
334
|
+
categoryCheck: check('plugin_review_reports_category_check', sql `${table.category} IN ('spam', 'abuse', 'off_topic', 'security')`),
|
|
335
|
+
}));
|
|
336
|
+
/**
|
|
337
|
+
* One "helpful" vote per user per review.
|
|
338
|
+
*
|
|
339
|
+
* @table plugin_review_votes
|
|
340
|
+
*/
|
|
341
|
+
export const pluginReviewVote = pgTable('plugin_review_votes', {
|
|
342
|
+
reviewId: uuid('review_id').notNull().references(() => pluginReview.id, { onDelete: 'cascade' }),
|
|
343
|
+
userId: text('user_id').notNull(),
|
|
344
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
345
|
+
}, (table) => ({
|
|
346
|
+
pk: primaryKey({ columns: [table.reviewId, table.userId] }),
|
|
347
|
+
}));
|
|
348
|
+
/**
|
|
349
|
+
* Review edit history: the PRIOR content, appended on every edit.
|
|
350
|
+
*
|
|
351
|
+
* @table plugin_review_history
|
|
352
|
+
*/
|
|
353
|
+
export const pluginReviewHistory = pgTable('plugin_review_history', {
|
|
354
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
355
|
+
reviewId: uuid('review_id').notNull().references(() => pluginReview.id, { onDelete: 'cascade' }),
|
|
356
|
+
version: varchar('version', { length: 50 }),
|
|
357
|
+
rating: smallint('rating').notNull(),
|
|
358
|
+
title: varchar('title', { length: 120 }),
|
|
359
|
+
bodyMd: text('body_md'),
|
|
360
|
+
editedAt: timestamp('edited_at', { withTimezone: true }).defaultNow().notNull(),
|
|
361
|
+
}, (table) => ({
|
|
362
|
+
reviewIdx: index('plugin_review_history_review_idx').on(table.reviewId, table.editedAt),
|
|
363
|
+
ratingCheck: check('plugin_review_history_rating_check', sql `${table.rating} BETWEEN 1 AND 5`),
|
|
364
|
+
}));
|
|
365
|
+
/**
|
|
366
|
+
* Denormalized per-listing stats, recomputed by a job. `activeOrgCount` is
|
|
367
|
+
* public only when >= 5 (the `public_listings` view enforces it).
|
|
368
|
+
*
|
|
369
|
+
* @table plugin_stats
|
|
370
|
+
*/
|
|
371
|
+
export const pluginStats = pgTable('plugin_stats', {
|
|
372
|
+
listingId: uuid('listing_id').primaryKey().references(() => pluginListing.id, { onDelete: 'cascade' }),
|
|
373
|
+
ratingBayes: doublePrecision('rating_bayes'),
|
|
374
|
+
ratingCount: integer('rating_count').default(0).notNull(),
|
|
375
|
+
// Star distribution: { "1": n, …, "5": n }.
|
|
376
|
+
dist: jsonb('dist').$type().default({}).notNull(),
|
|
377
|
+
// "Recent versions" rating over the last two minors.
|
|
378
|
+
recentRating: doublePrecision('recent_rating'),
|
|
379
|
+
installCount: integer('install_count').default(0).notNull(),
|
|
380
|
+
activeOrgCount: integer('active_org_count').default(0).notNull(),
|
|
381
|
+
successRate30d: doublePrecision('success_rate_30d'),
|
|
382
|
+
healthScore: doublePrecision('health_score'),
|
|
383
|
+
// Per-component health scores and weights, for the breakdown panel.
|
|
384
|
+
healthBreakdown: jsonb('health_breakdown').$type(),
|
|
385
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
386
|
+
});
|
|
387
|
+
/**
|
|
388
|
+
* Anonymous public submission. The email is kept hashed (rate limits,
|
|
389
|
+
* claim matching) and encrypted (takedown notices only) and purged at
|
|
390
|
+
* `emailPurgeAfter`. Nothing here is ever listed or resolvable.
|
|
391
|
+
*
|
|
392
|
+
* @table plugin_submissions
|
|
393
|
+
*/
|
|
394
|
+
export const pluginSubmission = pgTable('plugin_submissions', {
|
|
395
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
396
|
+
status: varchar('status', { length: 30 }).$type().default('pending_verification').notNull(),
|
|
397
|
+
emailHash: varchar('email_hash', { length: 64 }),
|
|
398
|
+
emailEnc: text('email_enc'),
|
|
399
|
+
verifyTokenHash: varchar('verify_token_hash', { length: 64 }),
|
|
400
|
+
verifyExpiresAt: timestamp('verify_expires_at', { withTimezone: true }),
|
|
401
|
+
verifiedAt: timestamp('verified_at', { withTimezone: true }),
|
|
402
|
+
// sha256 of the status token (returned by verify and in N1/N3/N4 emails) —
|
|
403
|
+
// the submitter's only read handle on the submission.
|
|
404
|
+
statusTokenHash: varchar('status_token_hash', { length: 64 }),
|
|
405
|
+
name: varchar('name', { length: 255 }).notNull(),
|
|
406
|
+
version: varchar('version', { length: 50 }).notNull(),
|
|
407
|
+
spec: jsonb('spec').$type().default({}).notNull(),
|
|
408
|
+
// The accept-or-edit catalog values + provenance and the Dockerfile,
|
|
409
|
+
// captured at submit so moderation reviews exactly what was submitted.
|
|
410
|
+
catalog: jsonb('catalog').$type().default({ values: {}, sources: {} }).notNull(),
|
|
411
|
+
dockerfile: text('dockerfile'),
|
|
412
|
+
artifactKey: varchar('artifact_key', { length: 1024 }),
|
|
413
|
+
quarantineImageRef: varchar('quarantine_image_ref', { length: 1024 }),
|
|
414
|
+
gateReport: jsonb('gate_report').$type(),
|
|
415
|
+
heuristics: jsonb('heuristics').$type(),
|
|
416
|
+
listingId: uuid('listing_id').references(() => pluginListing.id),
|
|
417
|
+
decidedBy: text('decided_by'),
|
|
418
|
+
reason: text('reason'),
|
|
419
|
+
clientIpHash: varchar('client_ip_hash', { length: 64 }),
|
|
420
|
+
expiresAt: timestamp('expires_at', { withTimezone: true }).notNull(),
|
|
421
|
+
decidedAt: timestamp('decided_at', { withTimezone: true }),
|
|
422
|
+
emailPurgeAfter: timestamp('email_purge_after', { withTimezone: true }),
|
|
423
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
424
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
425
|
+
}, (table) => ({
|
|
426
|
+
statusCreatedIdx: index('plugin_submission_status_created_idx').on(table.status, table.createdAt),
|
|
427
|
+
// Per-email / per-IP daily rate limits.
|
|
428
|
+
emailCreatedIdx: index('plugin_submission_email_created_idx').on(table.emailHash, table.createdAt),
|
|
429
|
+
ipCreatedIdx: index('plugin_submission_ip_created_idx').on(table.clientIpHash, table.createdAt),
|
|
430
|
+
verifyTokenUnique: uniqueIndex('plugin_submission_verify_token_unique')
|
|
431
|
+
.on(table.verifyTokenHash)
|
|
432
|
+
.where(sql `verify_token_hash IS NOT NULL`),
|
|
433
|
+
statusTokenUnique: uniqueIndex('plugin_submission_status_token_unique')
|
|
434
|
+
.on(table.statusTokenHash)
|
|
435
|
+
.where(sql `status_token_hash IS NOT NULL`),
|
|
436
|
+
statusCheck: check('plugin_submissions_status_check', sql `${table.status} IN ('pending_verification',
|
|
437
|
+
'pending_review', 'publishing', 'gate_failed', 'approved', 'rejected', 'expired', 'claimed')`),
|
|
438
|
+
}));
|
|
439
|
+
/**
|
|
440
|
+
* Zero-result directory searches. No user data. `query` is stored normalized;
|
|
441
|
+
* the maintenance sweep folds repeats of one (query, category) into a single
|
|
442
|
+
* row counting `hits`, with `created_at` = the latest one, and prunes rows not
|
|
443
|
+
* seen for 30 days.
|
|
444
|
+
*
|
|
445
|
+
* @table ecosystem_search_misses
|
|
446
|
+
*/
|
|
447
|
+
export const ecosystemSearchMiss = pgTable('ecosystem_search_misses', {
|
|
448
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
449
|
+
query: varchar('query', { length: 200 }).notNull(),
|
|
450
|
+
category: varchar('category', { length: 50 }),
|
|
451
|
+
hits: integer('hits').default(1).notNull(),
|
|
452
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
453
|
+
}, (table) => ({
|
|
454
|
+
createdAtIdx: index('ecosystem_search_miss_created_idx').on(table.createdAt),
|
|
455
|
+
hitsCheck: check('ecosystem_search_misses_hits_check', sql `${table.hits} >= 1`),
|
|
456
|
+
}));
|
|
457
|
+
/**
|
|
458
|
+
* Notification digest/batching queue. Rows sharing a `digestKey` are
|
|
459
|
+
* coalesced into one email at `deliverAfter`.
|
|
460
|
+
*
|
|
461
|
+
* @table ecosystem_notification_queue
|
|
462
|
+
*/
|
|
463
|
+
export const ecosystemNotificationQueue = pgTable('ecosystem_notification_queue', {
|
|
464
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
465
|
+
recipientUserId: text('recipient_user_id'),
|
|
466
|
+
recipientOrgId: varchar('recipient_org_id', { length: 255 }),
|
|
467
|
+
event: varchar('event', { length: 8 }).$type().notNull(),
|
|
468
|
+
digestKey: varchar('digest_key', { length: 255 }),
|
|
469
|
+
payload: jsonb('payload').$type().default({}).notNull(),
|
|
470
|
+
deliverAfter: timestamp('deliver_after', { withTimezone: true }).defaultNow().notNull(),
|
|
471
|
+
deliveredAt: timestamp('delivered_at', { withTimezone: true }),
|
|
472
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
473
|
+
}, (table) => ({
|
|
474
|
+
// The dispatcher's scan: undelivered rows that are due.
|
|
475
|
+
dueIdx: index('ecosystem_notification_due_idx').on(table.deliverAfter).where(sql `delivered_at IS NULL`),
|
|
476
|
+
digestIdx: index('ecosystem_notification_digest_idx').on(table.digestKey).where(sql `delivered_at IS NULL`),
|
|
477
|
+
eventCheck: check('ecosystem_notification_queue_event_check', sql `${table.event} ~ '^N([1-9]|1[0-9]|2[0-9])$'`),
|
|
478
|
+
}));
|
|
479
|
+
// ---------------------------------------------------------------------------
|
|
480
|
+
// Org-scoped tables (org_id + rls_org_* policies + FORCE; in the org cascade)
|
|
481
|
+
// ---------------------------------------------------------------------------
|
|
482
|
+
/**
|
|
483
|
+
* Step manifest: which plugin each (pipeline, stage, action) runs,
|
|
484
|
+
* recorded at synth. Event ingest joins on it to stamp
|
|
485
|
+
* `pipeline_events.plugin_*`. `pluginPublisher` is NULL for an own-org plugin.
|
|
486
|
+
*
|
|
487
|
+
* @table pipeline_step_manifests
|
|
488
|
+
*/
|
|
489
|
+
export const pipelineStepManifest = pgTable('pipeline_step_manifests', {
|
|
490
|
+
pipelineId: uuid('pipeline_id').notNull(),
|
|
491
|
+
orgId: varchar('org_id', { length: 255 }).notNull(),
|
|
492
|
+
stageName: varchar('stage_name', { length: 255 }).notNull(),
|
|
493
|
+
actionName: varchar('action_name', { length: 255 }).notNull(),
|
|
494
|
+
pluginPublisher: varchar('plugin_publisher', { length: 39 }),
|
|
495
|
+
/** The listing publisher's id (NULL for an own-org plugin) — what cross-org stats join on. */
|
|
496
|
+
pluginPublisherId: uuid('plugin_publisher_id'),
|
|
497
|
+
pluginName: varchar('plugin_name', { length: 255 }).notNull(),
|
|
498
|
+
pluginVersion: varchar('plugin_version', { length: 50 }).notNull(),
|
|
499
|
+
imageDigest: varchar('image_digest', { length: 71 }),
|
|
500
|
+
imageRepository: varchar('image_repository', { length: 512 }),
|
|
501
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
502
|
+
}, (table) => ({
|
|
503
|
+
pk: primaryKey({ columns: [table.pipelineId, table.stageName, table.actionName] }),
|
|
504
|
+
orgIdx: index('pipeline_step_manifest_org_idx').on(table.orgId),
|
|
505
|
+
// public/* GC guard: "does any manifest still reference this digest?"
|
|
506
|
+
digestIdx: index('pipeline_step_manifest_digest_idx').on(table.imageDigest),
|
|
507
|
+
pluginIdx: index('pipeline_step_manifest_plugin_idx').on(table.pluginPublisher, table.pluginName),
|
|
508
|
+
pluginPublisherIdIdx: index('pipeline_step_manifest_publisher_id_idx').on(table.pluginPublisherId, table.pluginName),
|
|
509
|
+
}));
|
|
510
|
+
/**
|
|
511
|
+
* An org's install of a listing. Official listings are installed
|
|
512
|
+
* implicitly (virtual — no row); a row is an explicit install or override.
|
|
513
|
+
*
|
|
514
|
+
* @table plugin_installs
|
|
515
|
+
*/
|
|
516
|
+
export const pluginInstall = pgTable('plugin_installs', {
|
|
517
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
518
|
+
orgId: varchar('org_id', { length: 255 }).notNull(),
|
|
519
|
+
listingId: uuid('listing_id').notNull().references(() => pluginListing.id, { onDelete: 'cascade' }),
|
|
520
|
+
versionPolicy: varchar('version_policy', { length: 10 }).$type().default('minor').notNull(),
|
|
521
|
+
pinnedVersion: varchar('pinned_version', { length: 50 }),
|
|
522
|
+
resolvedVersion: varchar('resolved_version', { length: 50 }),
|
|
523
|
+
status: varchar('status', { length: 20 }).$type().default('active').notNull(),
|
|
524
|
+
installedBy: text('installed_by').notNull(),
|
|
525
|
+
approvedBy: text('approved_by'),
|
|
526
|
+
decidedAt: timestamp('decided_at', { withTimezone: true }),
|
|
527
|
+
/** A pending, approval-gated change of this install (upgrade / policy), or null. */
|
|
528
|
+
pendingChange: jsonb('pending_change').$type(),
|
|
529
|
+
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
530
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
531
|
+
}, (table) => ({
|
|
532
|
+
orgListingUnique: uniqueIndex('plugin_install_org_listing_unique').on(table.orgId, table.listingId),
|
|
533
|
+
// "Installing orgs" fan-out for N8/N13/N14/N21/N26.
|
|
534
|
+
listingStatusIdx: index('plugin_install_listing_status_idx').on(table.listingId, table.status),
|
|
535
|
+
versionPolicyCheck: check('plugin_installs_version_policy_check', sql `${table.versionPolicy} IN ('pinned', 'patch', 'minor', 'latest')`),
|
|
536
|
+
statusCheck: check('plugin_installs_status_check', sql `${table.status} IN ('active', 'pending_approval', 'denied')`),
|
|
537
|
+
pinnedCheck: check('plugin_install_pinned_check', sql `${table.versionPolicy} <> 'pinned' OR ${table.pinnedVersion} IS NOT NULL`),
|
|
538
|
+
}));
|
|
539
|
+
/**
|
|
540
|
+
* Org consumption policy. One row per org; absent = the column defaults.
|
|
541
|
+
* None of these safety controls is plan-gated.
|
|
542
|
+
*
|
|
543
|
+
* @table plugin_install_policies
|
|
544
|
+
*/
|
|
545
|
+
export const pluginInstallPolicy = pgTable('plugin_install_policies', {
|
|
546
|
+
orgId: varchar('org_id', { length: 255 }).primaryKey(),
|
|
547
|
+
allowedTiers: text('allowed_tiers').array().$type()
|
|
548
|
+
.default(['official', 'verified']).notNull(),
|
|
549
|
+
requireApprovalTiers: text('require_approval_tiers').array().$type()
|
|
550
|
+
.default(['community', 'unverified']).notNull(),
|
|
551
|
+
secretsAllowedTiers: text('secrets_allowed_tiers').array().$type()
|
|
552
|
+
.default(['official', 'verified']).notNull(),
|
|
553
|
+
blockOnAdvisory: varchar('block_on_advisory', { length: 10 }).$type().default('critical').notNull(),
|
|
554
|
+
officialInstalls: varchar('official_installs', { length: 10 }).$type().default('implicit').notNull(),
|
|
555
|
+
blockedListings: jsonb('blocked_listings').$type().default([]).notNull(),
|
|
556
|
+
updatedBy: text('updated_by'),
|
|
557
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
558
|
+
}, (table) => ({
|
|
559
|
+
blockOnAdvisoryCheck: check('plugin_install_policies_block_on_advisory_check', sql `${table.blockOnAdvisory} IN ('critical', 'high', 'never')`),
|
|
560
|
+
officialInstallsCheck: check('plugin_install_policies_official_installs_check', sql `${table.officialInstalls} IN ('implicit', 'explicit')`),
|
|
561
|
+
tiersCheck: check('plugin_install_policy_tiers_check', sql `
|
|
562
|
+
${table.allowedTiers} <@ ARRAY['official', 'verified', 'community', 'unverified']::TEXT[]
|
|
563
|
+
AND ${table.requireApprovalTiers} <@ ARRAY['official', 'verified', 'community', 'unverified']::TEXT[]
|
|
564
|
+
AND ${table.secretsAllowedTiers} <@ ARRAY['official', 'verified', 'community', 'unverified']::TEXT[]`),
|
|
565
|
+
}));
|
|
566
|
+
/**
|
|
567
|
+
* N21 idempotency: one delivery per (advisory, installing org), so a retried
|
|
568
|
+
* fan-out never notifies an org twice.
|
|
569
|
+
*
|
|
570
|
+
* @table plugin_advisory_deliveries
|
|
571
|
+
*/
|
|
572
|
+
export const pluginAdvisoryDelivery = pgTable('plugin_advisory_deliveries', {
|
|
573
|
+
advisoryId: uuid('advisory_id').notNull().references(() => pluginAdvisory.id, { onDelete: 'cascade' }),
|
|
574
|
+
orgId: varchar('org_id', { length: 255 }).notNull(),
|
|
575
|
+
deliveredAt: timestamp('delivered_at', { withTimezone: true }).defaultNow().notNull(),
|
|
576
|
+
}, (table) => ({
|
|
577
|
+
pk: primaryKey({ columns: [table.advisoryId, table.orgId] }),
|
|
578
|
+
orgIdx: index('plugin_advisory_delivery_org_idx').on(table.orgId),
|
|
579
|
+
}));
|
|
580
|
+
// ---------------------------------------------------------------------------
|
|
581
|
+
// Public read path — views created by postgres-init.sql
|
|
582
|
+
// ---------------------------------------------------------------------------
|
|
583
|
+
/**
|
|
584
|
+
* `public_listings`: listed and unmaintained listings of non-suspended
|
|
585
|
+
* publishers, public columns only, joined with the publisher's handle/name/tier and the stats.
|
|
586
|
+
* Read as `ecosystem_public_reader` (see postgres-init.sql).
|
|
587
|
+
*/
|
|
588
|
+
export const publicListings = pgView('public_listings', {
|
|
589
|
+
id: uuid('id').notNull(),
|
|
590
|
+
publisherHandle: varchar('publisher_handle', { length: 39 }).notNull(),
|
|
591
|
+
publisherDisplayName: varchar('publisher_display_name', { length: 255 }).notNull(),
|
|
592
|
+
publisherTier: varchar('publisher_tier', { length: 20 }).$type().notNull(),
|
|
593
|
+
publisherVerifiedAt: timestamp('publisher_verified_at', { withTimezone: true }),
|
|
594
|
+
name: varchar('name', { length: 255 }).notNull(),
|
|
595
|
+
category: varchar('category', { length: 50 }).notNull(),
|
|
596
|
+
summary: varchar('summary', { length: 300 }),
|
|
597
|
+
description: text('description'),
|
|
598
|
+
readmeHtml: text('readme_html'),
|
|
599
|
+
license: varchar('license', { length: 64 }),
|
|
600
|
+
homepageUrl: varchar('homepage_url', { length: 2048 }),
|
|
601
|
+
sourceUrl: varchar('source_url', { length: 2048 }),
|
|
602
|
+
icon: jsonb('icon').$type(),
|
|
603
|
+
uploadedIcon: jsonb('uploaded_icon').$type(),
|
|
604
|
+
keywords: jsonb('keywords').$type().notNull(),
|
|
605
|
+
featured: boolean('featured').notNull(),
|
|
606
|
+
latestVersion: varchar('latest_version', { length: 50 }),
|
|
607
|
+
pausedAt: timestamp('paused_at', { withTimezone: true }),
|
|
608
|
+
searchVector: tsvector('search_vector'),
|
|
609
|
+
createdAt: timestamp('created_at', { withTimezone: true }).notNull(),
|
|
610
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull(),
|
|
611
|
+
ratingBayes: doublePrecision('rating_bayes'),
|
|
612
|
+
ratingCount: integer('rating_count').notNull(),
|
|
613
|
+
ratingDist: jsonb('rating_dist').$type(),
|
|
614
|
+
recentRating: doublePrecision('recent_rating'),
|
|
615
|
+
installCount: integer('install_count').notNull(),
|
|
616
|
+
// NULL below the 5-org display threshold.
|
|
617
|
+
activeOrgCount: integer('active_org_count'),
|
|
618
|
+
successRate30d: doublePrecision('success_rate_30d'),
|
|
619
|
+
healthScore: doublePrecision('health_score'),
|
|
620
|
+
// 'listed' | 'unmaintained' — unmaintained stays public with a banner.
|
|
621
|
+
state: varchar('state', { length: 20 }).$type().notNull(),
|
|
622
|
+
healthBreakdown: jsonb('health_breakdown').$type(),
|
|
623
|
+
}).existing();
|
|
624
|
+
/**
|
|
625
|
+
* `public_listed_versions`: non-paused versions of listed listings (yanked ones
|
|
626
|
+
* included, flagged), with only the public subset of the frozen spec.
|
|
627
|
+
*/
|
|
628
|
+
export const publicListedVersions = pgView('public_listed_versions', {
|
|
629
|
+
id: uuid('id').notNull(),
|
|
630
|
+
listingId: uuid('listing_id').notNull(),
|
|
631
|
+
publisherHandle: varchar('publisher_handle', { length: 39 }).notNull(),
|
|
632
|
+
name: varchar('name', { length: 255 }).notNull(),
|
|
633
|
+
version: varchar('version', { length: 50 }).notNull(),
|
|
634
|
+
imageDigest: varchar('image_digest', { length: 71 }),
|
|
635
|
+
imageRepository: varchar('image_repository', { length: 512 }),
|
|
636
|
+
breaking: boolean('breaking').notNull(),
|
|
637
|
+
deprecatedAt: timestamp('deprecated_at', { withTimezone: true }),
|
|
638
|
+
changelog: text('changelog'),
|
|
639
|
+
vulnCritical: integer('vuln_critical'),
|
|
640
|
+
vulnHigh: integer('vuln_high'),
|
|
641
|
+
scannedAt: timestamp('scanned_at', { withTimezone: true }),
|
|
642
|
+
publishedAt: timestamp('published_at', { withTimezone: true }).notNull(),
|
|
643
|
+
pluginType: text('plugin_type'),
|
|
644
|
+
computeType: text('compute_type'),
|
|
645
|
+
secrets: jsonb('secrets').$type(),
|
|
646
|
+
requiredMetadata: jsonb('required_metadata').$type(),
|
|
647
|
+
requiredVars: jsonb('required_vars').$type(),
|
|
648
|
+
networkEgress: jsonb('network_egress').$type(),
|
|
649
|
+
runAsRoot: boolean('run_as_root'),
|
|
650
|
+
license: text('license'),
|
|
651
|
+
readmeHtml: text('readme_html'),
|
|
652
|
+
// Yanked versions stay listed (marked); the yank reason isn't public.
|
|
653
|
+
yanked: boolean('yanked').notNull(),
|
|
654
|
+
deprecationMessage: text('deprecation_message'),
|
|
655
|
+
imageSource: text('image_source'),
|
|
656
|
+
baseImageCreatedAt: timestamp('base_image_created_at', { withTimezone: true }),
|
|
657
|
+
}).existing();
|
|
658
|
+
/**
|
|
659
|
+
* `public_advisories`: PUBLISHED advisories on listed listings, public columns
|
|
660
|
+
* only (no publisher/org ids, no author, no drafts or withdrawn rows).
|
|
661
|
+
*/
|
|
662
|
+
export const publicAdvisories = pgView('public_advisories', {
|
|
663
|
+
id: uuid('id').notNull(),
|
|
664
|
+
listingId: uuid('listing_id').notNull(),
|
|
665
|
+
publisherHandle: varchar('publisher_handle', { length: 39 }).notNull(),
|
|
666
|
+
name: varchar('name', { length: 255 }).notNull(),
|
|
667
|
+
severity: varchar('severity', { length: 10 }).$type().notNull(),
|
|
668
|
+
summary: varchar('summary', { length: 300 }).notNull(),
|
|
669
|
+
detailsHtml: text('details_html'),
|
|
670
|
+
cveIds: text('cve_ids').array().notNull(),
|
|
671
|
+
affectedRange: varchar('affected_range', { length: 255 }).notNull(),
|
|
672
|
+
fixedVersion: varchar('fixed_version', { length: 50 }),
|
|
673
|
+
publishedAt: timestamp('published_at', { withTimezone: true }),
|
|
674
|
+
}).existing();
|
|
675
|
+
/**
|
|
676
|
+
* `public_reviews`: PUBLISHED reviews of public (non-paused) listings, public
|
|
677
|
+
* columns only — the author's display name, never a user or org id —
|
|
678
|
+
* with the publisher's reply.
|
|
679
|
+
*/
|
|
680
|
+
export const publicReviews = pgView('public_reviews', {
|
|
681
|
+
id: uuid('id').notNull(),
|
|
682
|
+
listingId: uuid('listing_id').notNull(),
|
|
683
|
+
publisherHandle: varchar('publisher_handle', { length: 39 }).notNull(),
|
|
684
|
+
name: varchar('name', { length: 255 }).notNull(),
|
|
685
|
+
version: varchar('version', { length: 50 }),
|
|
686
|
+
rating: smallint('rating').notNull(),
|
|
687
|
+
title: varchar('title', { length: 120 }),
|
|
688
|
+
bodyHtml: text('body_html'),
|
|
689
|
+
authorDisplayName: varchar('author_display_name', { length: 100 }),
|
|
690
|
+
verifiedUse: boolean('verified_use').notNull(),
|
|
691
|
+
helpfulCount: integer('helpful_count').notNull(),
|
|
692
|
+
edited: boolean('edited').notNull(),
|
|
693
|
+
createdAt: timestamp('created_at', { withTimezone: true }).notNull(),
|
|
694
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull(),
|
|
695
|
+
publisherDisplayName: varchar('publisher_display_name', { length: 255 }).notNull(),
|
|
696
|
+
replyBodyHtml: text('reply_body_html'),
|
|
697
|
+
replyCreatedAt: timestamp('reply_created_at', { withTimezone: true }),
|
|
698
|
+
replyUpdatedAt: timestamp('reply_updated_at', { withTimezone: true }),
|
|
699
|
+
}).existing();
|
|
700
|
+
/** The official publisher's handle (the system org's catalog). */
|
|
701
|
+
export const OFFICIAL_PUBLISHER_HANDLE = 'pipeline-builder';
|
|
702
|
+
/** The platform-owned publisher anonymous submissions land under. */
|
|
703
|
+
export const COMMUNITY_PUBLISHER_HANDLE = 'community';
|
|
704
|
+
/** Fixed ids of the two auto-approval rules postgres-init.sql seeds. */
|
|
705
|
+
export const SEEDED_AUTO_APPROVAL_RULE_IDS = {
|
|
706
|
+
verifiedUpdates: '00000000-0000-4000-8000-00000000a001',
|
|
707
|
+
officialCatalog: '00000000-0000-4000-8000-00000000a002',
|
|
708
|
+
};
|
|
709
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNvc3lzdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3NjaGVtYS9lY29zeXN0ZW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQTZDdEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQy9HLFNBQVMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FDdEMsTUFBTSxxQkFBcUIsQ0FBQztBQU03Qix1RUFBdUU7QUFDdkUsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFtQjtJQUM1QyxRQUFRO1FBQ04sT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztDQUNGLENBQUMsQ0FBQztBQUVILDhFQUE4RTtBQUM5RSw4RUFBOEU7QUFDOUUseURBQXlEO0FBQ3pELDhFQUE4RTtBQUU5RSxPQUFPLEVBQ0wsZUFBZSxFQUNmLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLDZCQUE2QixFQUM3Qix3QkFBd0IsRUFDeEIsbUJBQW1CLEVBQ25CLHdCQUF3QixFQUN4QixtQkFBbUIsR0FpQnBCLE1BQU0sNEJBQTRCLENBQUM7QUFpQ3BDLDhFQUE4RTtBQUM5RSwwQkFBMEI7QUFDMUIsOEVBQThFO0FBRTlFOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxZQUFZLEVBQUU7SUFDN0MsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxhQUFhLEVBQUU7SUFDM0MsVUFBVSxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFB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V0FBVyxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLEVBQUU7SUFDOUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxPQUFPLEVBQUU7SUFDaEQsTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUU7SUFDbkMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUU7SUFDcEUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUU7SUFDcEUsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFO0lBQ2xGLGFBQWEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDdEMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNyRSxjQUFjLEVBQUUsU0FBUyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO0NBQ3RFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUVkLGtFQUFrRTtBQUNsRSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxrQkFBa0IsQ0FBQztBQUM1RCxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsV0FBVyxDQUFDO0FBRXRELHdFQUF3RTtBQUN4RSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRztJQUMzQyxlQUFlLEVBQUUsc0NBQXNDO0lBQ3ZELGVBQWUsRUFBRSxzQ0FBc0M7Q0FDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vL1xuLy8gUGx1Z2luIGVjb3N5c3RlbSB0YWJsZXMgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBNaXJyb3JzIHRoZVxuLy8gXCJQTFVHSU4gRUNPU1lTVEVNXCIgc2VjdGlvbiBvZiBwb3N0Z3Jlcy1pbml0LnNxbCwgd2hpY2ggaXMgYXV0aG9yaXRhdGl2ZSBmb3Jcbi8vIHRoZSB0cmlnZ2VyLW1haW50YWluZWQgYHNlYXJjaF92ZWN0b3JgLCB0aGUgUkxTIHBvbGljaWVzIGFuZCB0aGUgcHVibGljIHZpZXdzLlxuLy9cbi8vIFR3byBraW5kcyBvZiB0YWJsZTpcbi8vICAgKiBFQ09TWVNURU0tR0xPQkFMIOKAlCBwdWJsaXNoZXJzLCBsaXN0aW5ncywgbGlzdGluZyB2ZXJzaW9ucywgdGhlIHB1Ymxpc2hcbi8vICAgICByZXF1ZXN0IHF1ZXVlLCByZXZpZXdzLCBhZHZpc29yaWVzLCBhbm9ueW1vdXMgc3VibWlzc2lvbnMsIOKApiBUaGVcbi8vICAgICBkaXJlY3RvcnkgaXMgaW5zdGFuY2Utd2lkZSwgc28gdGhlc2UgY2FycnkgTk8gYG9yZ19pZGA6IHRoZXkgYXJlIG5vdFxuLy8gICAgIHRlbmFudCBzY29wZWQsIHdyaXRlcyBhcmUgZ2F0ZWQgaW4gdGhlIHNlcnZpY2UgbGF5ZXIgKHN5c3RlbS1vcmctb25seVxuLy8gICAgIGFwcHJvdmFsKSwgYW5kIHRoZWlyIFJMUyBwb2xpY3kgYWRtaXRzIHRoZSBhcHBsaWNhdGlvbiByb2xlIG9ubHkuXG4vLyAgICAgYHB1Ymxpc2hlcnMub3duZXJfb3JnX2lkYCBpcyBkZWxpYmVyYXRlbHkgbm90IG5hbWVkIGBvcmdfaWRgOiBhIHB1Ymxpc2hlclxuLy8gICAgIG91dGxpdmVzIGl0cyBvcmcsIHNvIGl0IG11c3Qgc3RheSBvdXQgb2YgdGhlIG9yZyBjYXNjYWRlLCB3aGljaFxuLy8gICAgIHRyZWF0cyBldmVyeSBgb3JnX2lkYCB0YWJsZSBhcyB0aGUgb3JnJ3MgZGF0YS5cbi8vICAgKiBPUkctU0NPUEVEIOKAlCBwaXBlbGluZV9zdGVwX21hbmlmZXN0cywgcGx1Z2luX2luc3RhbGxzLFxuLy8gICAgIHBsdWdpbl9pbnN0YWxsX3BvbGljaWVzLCBwbHVnaW5fYWR2aXNvcnlfZGVsaXZlcmllczogYG9yZ19pZGAgKyB0aGVcbi8vICAgICBzdGFuZGFyZCBgcmxzX29yZ18qYCBwb2xpY2llcyArIEZPUkNFLCBhbmQgcGFydCBvZiB0aGUgb3JnIGNhc2NhZGUuXG4vL1xuLy8gVGhlIHR3byBgcHVibGljXypgIHZpZXdzIGFyZSBkZWNsYXJlZCB3aXRoIGBwZ1ZpZXcoLi4uKS5leGlzdGluZygpYCAoZHJpenpsZVxuLy8gbmV2ZXIgY3JlYXRlcyB0aGVtOyBwb3N0Z3Jlcy1pbml0LnNxbCBkb2VzKS4gVGhleSBhcmUgd2hhdCB0aGUgYW5vbnltb3VzXG4vLyBkaXJlY3RvcnkgQVBJIHJlYWRzLCBjb25uZWN0ZWQgYXMgYGVjb3N5c3RlbV9wdWJsaWNfcmVhZGVyYCDigJQgdGhlIG9ubHlcbi8vIHJlbGF0aW9ucyB0aGF0IHJvbGUgY2FuIFNFTEVDVC4gVGhleSBhcmUgZXhwb3J0ZWQgZm9yIHR5cGVkIHF1ZXJpZXMgYnV0IGtlcHRcbi8vIG91dCBvZiB0aGUgYWdncmVnYXRlIGBzY2hlbWFgIG9iamVjdCwgd2hpY2ggbGlzdHMgdGFibGVzIG9ubHkuXG4vL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFB1Ymxpc2hlclRpZXIsXG4gIExpc3RpbmdTdGF0ZSxcbiAgUHVibGlzaFJlcXVlc3RLaW5kLFxuICBQdWJsaXNoUmVxdWVzdFN0YXR1cyxcbiAgUHVibGlzaFJlcXVlc3RMYW5lLFxuICBJbnN0YWxsVmVyc2lvblBvbGljeSxcbiAgSW5zdGFsbFN0YXR1cyxcbiAgQmxvY2tPbkFkdmlzb3J5LFxuICBPZmZpY2lhbEluc3RhbGxzLFxuICBSZXZpZXdTdGF0dXMsXG4gIFJldmlld0hvbGRSZWFzb24sXG4gIFJldmlld1JlcG9ydENhdGVnb3J5LFxuICBBZHZpc29yeVNldmVyaXR5LFxuICBBZHZpc29yeVN0YXRlLFxuICBBZHZpc29yeVNvdXJjZSxcbiAgU3VibWlzc2lvblN0YXR1cyxcbn0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHtcbiAgYm9vbGVhbiwgY2hlY2ssIGN1c3RvbVR5cGUsIGRvdWJsZVByZWNpc2lvbiwgaW5kZXgsIGludGVnZXIsIGpzb25iLCBwZ1RhYmxlLCBwZ1ZpZXcsIHByaW1hcnlLZXksIHNtYWxsaW50LCB0ZXh0LFxuICB0aW1lc3RhbXAsIHVuaXF1ZUluZGV4LCB1dWlkLCB2YXJjaGFyLFxufSBmcm9tICdkcml6emxlLW9ybS9wZy1jb3JlJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luSWNvbiwgUGx1Z2luU2VjcmV0LCBQbHVnaW5VcGxvYWRlZEljb24gfSBmcm9tICcuL3BsdWdpbi5qcyc7XG5cbi8qKiBQZXItY29tcG9uZW50IGhlYWx0aCBzY29yZXM7IG1pcnJvcnMgYXBpLWNvcmUncyBgSGVhbHRoQnJlYWtkb3duYC4gKi9cbmV4cG9ydCB0eXBlIEhlYWx0aEJyZWFrZG93biA9IFJlY29yZDxzdHJpbmcsIHsgc2NvcmU6IG51bWJlciB8IG51bGw7IHdlaWdodDogbnVtYmVyIH0+O1xuXG4vKiogUG9zdGdyZXMgYHRzdmVjdG9yYCwgd2hpY2ggZHJpenpsZS1vcm0gaGFzIG5vIG5hdGl2ZSBjb2x1bW4gZm9yLiAqL1xuY29uc3QgdHN2ZWN0b3IgPSBjdXN0b21UeXBlPHsgZGF0YTogc3RyaW5nIH0+KHtcbiAgZGF0YVR5cGUoKSB7XG4gICAgcmV0dXJuICd0c3ZlY3Rvcic7XG4gIH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbnVtZXJhdGlvbnMg4oCUIGRlZmluZWQgaW4gYXBpLWNvcmUncyB3aXJlIHZvY2FidWxhcnkgc28gdGhlIGZyb250ZW5kIHNoYXJlc1xuLy8gdGhlbTsgZWFjaCBpcyBtaXJyb3JlZCBieSBhIENIRUNLIGluIHBvc3RncmVzLWluaXQuc3FsXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IHtcbiAgUFVCTElTSEVSX1RJRVJTLFxuICBMSVNUSU5HX1NUQVRFUyxcbiAgUFVCTElTSF9SRVFVRVNUX0tJTkRTLFxuICBQVUJMSVNIX1JFUVVFU1RfU1RBVFVTRVMsXG4gIE9QRU5fUFVCTElTSF9SRVFVRVNUX1NUQVRVU0VTLFxuICBJTlNUQUxMX1ZFUlNJT05fUE9MSUNJRVMsXG4gIFJFVklFV19IT0xEX1JFQVNPTlMsXG4gIFJFVklFV19SRVBPUlRfQ0FURUdPUklFUyxcbiAgU1VCTUlTU0lPTl9TVEFUVVNFUyxcbiAgdHlwZSBQdWJsaXNoZXJUaWVyLFxuICB0eXBlIExpc3RpbmdTdGF0ZSxcbiAgdHlwZSBQdWJsaXNoUmVxdWVzdEtpbmQsXG4gIHR5cGUgUHVibGlzaFJlcXVlc3RTdGF0dXMsXG4gIHR5cGUgUHVibGlzaFJlcXVlc3RMYW5lLFxuICB0eXBlIEluc3RhbGxWZXJzaW9uUG9saWN5LFxuICB0eXBlIEluc3RhbGxTdGF0dXMsXG4gIHR5cGUgQmxvY2tPbkFkdmlzb3J5LFxuICB0eXBlIE9mZmljaWFsSW5zdGFsbHMsXG4gIHR5cGUgUmV2aWV3U3RhdHVzLFxuICB0eXBlIFJldmlld0hvbGRSZWFzb24sXG4gIHR5cGUgUmV2aWV3UmVwb3J0Q2F0ZWdvcnksXG4gIHR5cGUgQWR2aXNvcnlTZXZlcml0eSxcbiAgdHlwZSBBZHZpc29yeVN0YXRlLFxuICB0eXBlIEFkdmlzb3J5U291cmNlLFxuICB0eXBlIFN1Ym1pc3Npb25TdGF0dXMsXG59IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcblxuLyoqXG4gKiBBIG1lbWJlcidzIHBlbmRpbmcgcmVxdWVzdCB0byBDSEFOR0UgYW4gYWN0aXZlIGluc3RhbGwgKGl0cyB2ZXJzaW9uIG9yXG4gKiB2ZXJzaW9uIHBvbGljeSkgdGhhdCBuZWVkcyBhbiBhcHByb3ZlciDigJQgY3Jvc3NpbmcgYSBtYWpvci9icmVha2luZyB2ZXJzaW9uLFxuICogb3Igd2lkZW5pbmcgdG8gYGxhdGVzdGAsIG9uIGFuIGFwcHJvdmFsLWdhdGVkIHRpZXIuIE9uZSBwZXIgaW5zdGFsbDsgYW5cbiAqIGFwcHJvdmVyIChgcGx1Z2luX2luc3RhbGxzOm1hbmFnZWApIGFwcGxpZXMgb3IgcmVqZWN0cyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YWxsQ2hhbmdlUmVxdWVzdCB7XG4gIC8qKiBUaGUgdmVyc2lvbiB0aGUgaW5zdGFsbCB3b3VsZCBtb3ZlIHRvLiAqL1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBUaGUgdmVyc2lvbiBwb2xpY3kgaXQgd291bGQgbW92ZSB0by4gKi9cbiAgdmVyc2lvblBvbGljeTogSW5zdGFsbFZlcnNpb25Qb2xpY3k7XG4gIHJlcXVlc3RlZEJ5OiBzdHJpbmc7XG4gIC8qKiBJU08gdGltZSBvZiB0aGUgcmVxdWVzdC4gKi9cbiAgcmVxdWVzdGVkQXQ6IHN0cmluZztcbiAgbm90ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKiBBIGAocHVibGlzaGVyLCBuYW1lKWAgYW4gb3JnJ3MgY29uc3VtcHRpb24gcG9saWN5IGJsb2Nrcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmxvY2tlZExpc3RpbmdSZWYge1xuICBwdWJsaXNoZXI6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xufVxuXG4vKiogQW4gYW5vbnltb3VzIHN1Ym1pc3Npb24ncyBhY2NlcHRlZCBjYXRhbG9nIG1ldGFkYXRhIGFuZCBwZXItZmllbGQgcHJvdmVuYW5jZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VibWlzc2lvbkNhdGFsb2cge1xuICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKiogTm90aWZpY2F0aW9uIGV2ZW50IG51bWJlciAoYE4xYCDigKYgYE4yOWApLiAqL1xuZXhwb3J0IHR5cGUgRWNvc3lzdGVtTm90aWZpY2F0aW9uRXZlbnQgPSBgTiR7bnVtYmVyfWA7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRWNvc3lzdGVtLWdsb2JhbCB0YWJsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEFuIG9yZydzIHB1YmxpYyBpZGVudGl0eSAob25lIHBlciByb290IG9yZykuIGBvd25lck9yZ0lkYCBpcyBOVUxMIGZvciB0aGVcbiAqIHBsYXRmb3JtLW93bmVkIGBjb21tdW5pdHlgIHB1Ymxpc2hlciBhbm9ueW1vdXMgc3VibWlzc2lvbnMgbGFuZCB1bmRlci5cbiAqXG4gKiBAdGFibGUgcHVibGlzaGVyc1xuICovXG5leHBvcnQgY29uc3QgcHVibGlzaGVyID0gcGdUYWJsZSgncHVibGlzaGVycycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3duZXJPcmdJZDogdmFyY2hhcignb3duZXJfb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS51bmlxdWUoKSxcbiAgaGFuZGxlOiB2YXJjaGFyKCdoYW5kbGUnLCB7IGxlbmd0aDogMzkgfSkubm90TnVsbCgpLnVuaXF1ZSgpLFxuICBkaXNwbGF5TmFtZTogdmFyY2hhcignZGlzcGxheV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGRlc2NyaXB0aW9uOiB0ZXh0KCdkZXNjcmlwdGlvbicpLFxuICBob21lcGFnZVVybDogdmFyY2hhcignaG9tZXBhZ2VfdXJsJywgeyBsZW5ndGg6IDIwNDggfSksXG4gIHRpZXI6IHZhcmNoYXIoJ3RpZXInLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8UHVibGlzaGVyVGllcj4oKS5kZWZhdWx0KCdjb21tdW5pdHknKS5ub3ROdWxsKCksXG4gIHZlcmlmaWVkQXQ6IHRpbWVzdGFtcCgndmVyaWZpZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgLy8gVmVyaWZpZWQgcHVibGlzaGVyIGRvd25ncmFkZWQgYmVsb3cgVGVhbSBrZWVwcyB0aGUgdGllciB1bnRpbCB0aGlzIHBhc3NlcyAoTjI5KS5cbiAgdmVyaWZpZWRHcmFjZVVudGlsOiB0aW1lc3RhbXAoJ3ZlcmlmaWVkX2dyYWNlX3VudGlsJywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHRlcm1zVmVyc2lvbjogdmFyY2hhcigndGVybXNfdmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KSxcbiAgdGVybXNBY2NlcHRlZEF0OiB0aW1lc3RhbXAoJ3Rlcm1zX2FjY2VwdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHN1c3BlbmRlZEF0OiB0aW1lc3RhbXAoJ3N1c3BlbmRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBzdXNwZW5kUmVhc29uOiB0ZXh0KCdzdXNwZW5kX3JlYXNvbicpLFxuICAvLyBXNyByb2xsLXVwcywgd3JpdHRlbiBieSB0aGUgc3RhdHMgc3dlZXA6IHJ1bi13ZWlnaHRlZCAzMC1kYXkgc3VjY2VzcyByYXRlXG4gIC8vIGFuZCB0aGUgaW5zdGFsbC13ZWlnaHRlZCBtZWFuIGhlYWx0aCBzY29yZSBvZiBpdHMgbGlzdGluZ3MgKE5VTEw6IG5vbmUpLlxuICBzdWNjZXNzUmF0ZTMwZDogZG91YmxlUHJlY2lzaW9uKCdzdWNjZXNzX3JhdGVfMzBkJyksXG4gIGhlYWx0aFNjb3JlOiBpbnRlZ2VyKCdoZWFsdGhfc2NvcmUnKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIGhhbmRsZUNoZWNrOiBjaGVjaygncHVibGlzaGVyc19oYW5kbGVfY2hlY2snLCBzcWxgJHt0YWJsZS5oYW5kbGV9IH4gJ15bYS16MC05XVthLXowLTktXSokJ2ApLFxuICB0aWVyQ2hlY2s6IGNoZWNrKCdwdWJsaXNoZXJzX3RpZXJfY2hlY2snLFxuICAgIHNxbGAke3RhYmxlLnRpZXJ9IElOICgnb2ZmaWNpYWwnLCAndmVyaWZpZWQnLCAnY29tbXVuaXR5JywgJ3VudmVyaWZpZWQnKWApLFxufSkpO1xuXG4vKipcbiAqIEEgcGx1Z2luIE5BTUUgcHVibGlzaGVkIGJ5IGEgcHVibGlzaGVyLiBSZXZpZXdzLCBpbnN0YWxscywgc3RhdHMgYW5kIHNlYXJjaFxuICogYXR0YWNoIGhlcmU7IHRoZSBwZXItdmVyc2lvbiByZWNvcmRzIGFyZSB7QGxpbmsgcGx1Z2luTGlzdGluZ1ZlcnNpb259LlxuICogYHNlYXJjaFZlY3RvcmAgaXMgbWFpbnRhaW5lZCBieSBhIHRyaWdnZXIgaW4gcG9zdGdyZXMtaW5pdC5zcWwgKG5hbWUgQSxcbiAqIGtleXdvcmRzICsgY2F0ZWdvcnkgQiwgc3VtbWFyeSBDLCBSRUFETUUgKyBkZXNjcmlwdGlvbiBELCBjb25maWcgYGVuZ2xpc2hgKVxuICog4oCUIG5ldmVyIHdyaXRlIGl0IGZyb20gdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEB0YWJsZSBwbHVnaW5fbGlzdGluZ3NcbiAqL1xuZXhwb3J0IGNvbnN0IHBsdWdpbkxpc3RpbmcgPSBwZ1RhYmxlKCdwbHVnaW5fbGlzdGluZ3MnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIHB1Ymxpc2hlcklkOiB1dWlkKCdwdWJsaXNoZXJfaWQnKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBwdWJsaXNoZXIuaWQpLFxuICBuYW1lOiB2YXJjaGFyKCduYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGNhdGVnb3J5OiB2YXJjaGFyKCdjYXRlZ29yeScsIHsgbGVuZ3RoOiA1MCB9KS5kZWZhdWx0KCd1bmtub3duJykubm90TnVsbCgpLFxuICBzdW1tYXJ5OiB2YXJjaGFyKCdzdW1tYXJ5JywgeyBsZW5ndGg6IDMwMCB9KSxcbiAgZGVzY3JpcHRpb246IHRleHQoJ2Rlc2NyaXB0aW9uJyksXG4gIHJlYWRtZUh0bWw6IHRleHQoJ3JlYWRtZV9odG1sJyksXG4gIGxpY2Vuc2U6IHZhcmNoYXIoJ2xpY2Vuc2UnLCB7IGxlbmd0aDogNjQgfSksXG4gIGhvbWVwYWdlVXJsOiB2YXJjaGFyKCdob21lcGFnZV91cmwnLCB7IGxlbmd0aDogMjA0OCB9KSxcbiAgc291cmNlVXJsOiB2YXJjaGFyKCdzb3VyY2VfdXJsJywgeyBsZW5ndGg6IDIwNDggfSksXG4gIGljb246IGpzb25iKCdpY29uJykuJHR5cGU8UGx1Z2luSWNvbj4oKSxcbiAgdXBsb2FkZWRJY29uOiBqc29uYigndXBsb2FkZWRfaWNvbicpLiR0eXBlPFBsdWdpblVwbG9hZGVkSWNvbj4oKSxcbiAga2V5d29yZHM6IGpzb25iKCdrZXl3b3JkcycpLiR0eXBlPHN0cmluZ1tdPigpLmRlZmF1bHQoW10pLm5vdE51bGwoKSxcbiAgc3RhdGU6IHZhcmNoYXIoJ3N0YXRlJywgeyBsZW5ndGg6IDIwIH0pLiR0eXBlPExpc3RpbmdTdGF0ZT4oKS5kZWZhdWx0KCdsaXN0ZWQnKS5ub3ROdWxsKCksXG4gIC8vIFB1Ymxpc2hlciBwYXVzZTogbm8gbmV3IGluc3RhbGxzOyBleGlzdGluZyBpbnN0YWxscyBrZWVwIHJlc29sdmluZy5cbiAgcGF1c2VkQXQ6IHRpbWVzdGFtcCgncGF1c2VkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGZlYXR1cmVkOiBib29sZWFuKCdmZWF0dXJlZCcpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcbiAgbGF0ZXN0VmVyc2lvbjogdmFyY2hhcignbGF0ZXN0X3ZlcnNpb24nLCB7IGxlbmd0aDogNTAgfSksXG4gIHNlYXJjaFZlY3RvcjogdHN2ZWN0b3IoJ3NlYXJjaF92ZWN0b3InKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIHB1Ymxpc2hlck5hbWVVbmlxdWU6IHVuaXF1ZUluZGV4KCdwbHVnaW5fbGlzdGluZ19wdWJsaXNoZXJfbmFtZV91bmlxdWUnKS5vbih0YWJsZS5wdWJsaXNoZXJJZCwgdGFibGUubmFtZSksXG4gIHN0YXRlQ2F0ZWdvcnlJZHg6IGluZGV4KCdwbHVnaW5fbGlzdGluZ19zdGF0ZV9jYXRlZ29yeV9pZHgnKS5vbih0YWJsZS5zdGF0ZSwgdGFibGUuY2F0ZWdvcnkpLFxuICB1cGRhdGVkQXRJZHg6IGluZGV4KCdwbHVnaW5fbGlzdGluZ191cGRhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLnVwZGF0ZWRBdCksXG4gIHNlYXJjaFZlY3RvcklkeDogaW5kZXgoJ3BsdWdpbl9saXN0aW5nX3NlYXJjaF92ZWN0b3JfaWR4JykudXNpbmcoJ2dpbicsIHRhYmxlLnNlYXJjaFZlY3RvciksXG4gIC8vIHBnX3RyZ206IHR5cG8tdG9sZXJhbnQgbmFtZSBtYXRjaGluZyAoXCJ0ZXJhZnJvbVwiIC0+IHRlcnJhZm9ybSkuXG4gIG5hbWVUcmdtSWR4OiBpbmRleCgncGx1Z2luX2xpc3RpbmdfbmFtZV90cmdtX2lkeCcpLnVzaW5nKCdnaW4nLCBzcWxgJHt0YWJsZS5uYW1lfSBnaW5fdHJnbV9vcHNgKSxcbiAgc3RhdGVDaGVjazogY2hlY2soJ3BsdWdpbl9saXN0aW5nc19zdGF0ZV9jaGVjaycsXG4gICAgc3FsYCR7dGFibGUuc3RhdGV9IElOICgnbGlzdGVkJywgJ3VubWFpbnRhaW5lZCcsICdzdXNwZW5kZWQnLCAndHJhbnNmZXJyZWQnKWApLFxufSkpO1xuXG4vKipcbiAqIFRoZSBwdWJsaWMsIGZyb3plbiBzdWJzZXQgb2YgYSBwbHVnaW4gcmVjb3JkIGNhcHR1cmVkIGF0IGFwcHJvdmFsLCBzbyBhXG4gKiBsaXN0ZWQgdmVyc2lvbiBrZWVwcyBzeW50aGVzaXppbmcgYWZ0ZXIgdGhlIHB1Ymxpc2hlciBvcmcncyBvd24gYHBsdWdpbnNgXG4gKiByb3cgaXMgZGVsZXRlZCBvciBwdXJnZWQuIE9ubHkgdGhlIGtleXMgdGhlIGBwdWJsaWNfbGlzdGVkX3ZlcnNpb25zYFxuICogdmlldyBwcm9qZWN0cyBhcmUgcHVibGljOyB0aGUgcmVzdCBpcyB2aXNpYmxlIHRvIGluc3RhbGxlcnMnIHN5bnRoIG9ubHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ1ZlcnNpb25TcGVjU25hcHNob3Qge1xuICBwbHVnaW5UeXBlPzogc3RyaW5nO1xuICBjb21wdXRlVHlwZT86IHN0cmluZztcbiAgc2VjcmV0cz86IFBsdWdpblNlY3JldFtdO1xuICByZXF1aXJlZE1ldGFkYXRhPzogc3RyaW5nW107XG4gIHJlcXVpcmVkVmFycz86IHN0cmluZ1tdO1xuICBuZXR3b3JrRWdyZXNzPzogc3RyaW5nW107XG4gIHJ1bkFzUm9vdD86IGJvb2xlYW47XG4gIGxpY2Vuc2U/OiBzdHJpbmc7XG4gIHJlYWRtZUh0bWw/OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8qKlxuICogQSB2ZXJzaW9uIHB1Ymxpc2hlZCB0byBhIGxpc3Rpbmcg4oCUIHRoZSBjb3B5IGluIHRoZSByZWFkLW9ubHkgYHB1YmxpYy8qYFxuICogbmFtZXNwYWNlLiBJbW11dGFibGUgb25jZSB3cml0dGVuIGFwYXJ0IGZyb20gcGF1c2UgLyB5YW5rIC9cbiAqIGRlcHJlY2F0aW9uLiBgc291cmNlUGx1Z2luSWRgIGlzIHByb3ZlbmFuY2Ugb25seSAobm8gRks6IHRoZSBvcmcgcm93IGlzXG4gKiBzb2Z0LWRlbGV0ZWQgYW5kIHB1cmdlZCBvbiBpdHMgb3duIHNjaGVkdWxlKS5cbiAqXG4gKiBAdGFibGUgcGx1Z2luX2xpc3RpbmdfdmVyc2lvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IHBsdWdpbkxpc3RpbmdWZXJzaW9uID0gcGdUYWJsZSgncGx1Z2luX2xpc3RpbmdfdmVyc2lvbnMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIGxpc3RpbmdJZDogdXVpZCgnbGlzdGluZ19pZCcpLm5vdE51bGwoKS5yZWZlcmVuY2VzKCgpID0+IHBsdWdpbkxpc3RpbmcuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgc291cmNlUGx1Z2luSWQ6IHV1aWQoJ3NvdXJjZV9wbHVnaW5faWQnKSxcbiAgdmVyc2lvbjogdmFyY2hhcigndmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KS5ub3ROdWxsKCksXG4gIGltYWdlRGlnZXN0OiB2YXJjaGFyKCdpbWFnZV9kaWdlc3QnLCB7IGxlbmd0aDogNzEgfSksXG4gIC8vIHB1YmxpYy88aGFuZGxlPi88bmFtZT5cbiAgaW1hZ2VSZXBvc2l0b3J5OiB2YXJjaGFyKCdpbWFnZV9yZXBvc2l0b3J5JywgeyBsZW5ndGg6IDUxMiB9KSxcbiAgc3BlY1NuYXBzaG90OiBqc29uYignc3BlY19zbmFwc2hvdCcpLiR0eXBlPExpc3RpbmdWZXJzaW9uU3BlY1NuYXBzaG90PigpLmRlZmF1bHQoe30pLm5vdE51bGwoKSxcbiAgYnJlYWtpbmc6IGJvb2xlYW4oJ2JyZWFraW5nJykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuICBwYXVzZWRBdDogdGltZXN0YW1wKCdwYXVzZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgeWFua2VkQXQ6IHRpbWVzdGFtcCgneWFua2VkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHlhbmtSZWFzb246IHRleHQoJ3lhbmtfcmVhc29uJyksXG4gIGRlcHJlY2F0ZWRBdDogdGltZXN0YW1wKCdkZXByZWNhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlcHJlY2F0aW9uTWVzc2FnZTogdGV4dCgnZGVwcmVjYXRpb25fbWVzc2FnZScpLFxuICBjaGFuZ2Vsb2c6IHRleHQoJ2NoYW5nZWxvZycpLFxuICB2dWxuQ3JpdGljYWw6IGludGVnZXIoJ3Z1bG5fY3JpdGljYWwnKSxcbiAgdnVsbkhpZ2g6IGludGVnZXIoJ3Z1bG5faGlnaCcpLFxuICBzY2FubmVkQXQ6IHRpbWVzdGFtcCgnc2Nhbm5lZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICAvLyBUaGUgYmFzZSBpbWFnZSdzIGNvbmZpZyBgY3JlYXRlZGAgdGltZSwgcmVjb3JkZWQgYXQgcHVibGlzaDsgTlVMTCA9IHVua25vd24uXG4gIGJhc2VJbWFnZUNyZWF0ZWRBdDogdGltZXN0YW1wKCdiYXNlX2ltYWdlX2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgLy8gV2hlbiBtYWludGVuYW5jZSBjb2xsZWN0ZWQgdGhpcyBsb25nLXlhbmtlZCwgdW5yZWZlcmVuY2VkIHZlcnNpb24ncyBwdWJsaWMvKiBpbWFnZTsgTlVMTCA9IHN0aWxsIHN0b3JlZC5cbiAgaW1hZ2VDb2xsZWN0ZWRBdDogdGltZXN0YW1wKCdpbWFnZV9jb2xsZWN0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgcHVibGlzaGVkQXQ6IHRpbWVzdGFtcCgncHVibGlzaGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgcHVibGlzaGVkQnk6IHRleHQoJ3B1Ymxpc2hlZF9ieScpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgbGlzdGluZ1ZlcnNpb25VbmlxdWU6IHVuaXF1ZUluZGV4KCdwbHVnaW5fbGlzdGluZ192ZXJzaW9uX3VuaXF1ZScpLm9uKHRhYmxlLmxpc3RpbmdJZCwgdGFibGUudmVyc2lvbiksXG4gIC8vIHB1YmxpYy8qIEdDIGd1YXJkICsgZGlnZXN0IGxvb2t1cHMuXG4gIGRpZ2VzdElkeDogaW5kZXgoJ3BsdWdpbl9saXN0aW5nX3ZlcnNpb25fZGlnZXN0X2lkeCcpLm9uKHRhYmxlLmltYWdlRGlnZXN0KSxcbiAgdmVyc2lvbkNoZWNrOiBjaGVjaygncGx1Z2luX2xpc3RpbmdfdmVyc2lvbnNfdmVyc2lvbl9jaGVjaycsXG4gICAgc3FsYCR7dGFibGUudmVyc2lvbn0gfiAnXlswLTldK1xcLlswLTldK1xcLlswLTldKygtW2EtekEtWjAtOS4tXSspPyhcXCtbYS16QS1aMC05Li1dKyk/JCdgLFxuICApLFxuICBpbWFnZURpZ2VzdENoZWNrOiBjaGVjaygncGx1Z2luX2xpc3RpbmdfdmVyc2lvbnNfaW1hZ2VfZGlnZXN0X2NoZWNrJyxcbiAgICBzcWxgJHt0YWJsZS5pbWFnZURpZ2VzdH0gSVMgTlVMTCBPUiAke3RhYmxlLmltYWdlRGlnZXN0fSB+ICdec2hhMjU2OlswLTlhLWZdezY0fSQnYCksXG59KSk7XG5cbi8qKlxuICogU2VjdXJpdHkgYWR2aXNvcnkgYWdhaW5zdCBhIGxpc3RpbmcncyB2ZXJzaW9uIHJhbmdlLlxuICpcbiAqIEB0YWJsZSBwbHVnaW5fYWR2aXNvcmllc1xuICovXG5leHBvcnQgY29uc3QgcGx1Z2luQWR2aXNvcnkgPSBwZ1RhYmxlKCdwbHVnaW5fYWR2aXNvcmllcycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgbGlzdGluZ0lkOiB1dWlkKCdsaXN0aW5nX2lkJykubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gcGx1Z2luTGlzdGluZy5pZCksXG4gIHB1Ymxpc2hlcklkOiB1dWlkKCdwdWJsaXNoZXJfaWQnKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBwdWJsaXNoZXIuaWQpLFxuICAvLyBTZW12ZXIgcmFuZ2Ugb2YgYWZmZWN0ZWQgdmVyc2lvbnMuXG4gIGFmZmVjdGVkUmFuZ2U6IHZhcmNoYXIoJ2FmZmVjdGVkX3JhbmdlJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGZpeGVkVmVyc2lvbjogdmFyY2hhcignZml4ZWRfdmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KSxcbiAgc2V2ZXJpdHk6IHZhcmNoYXIoJ3NldmVyaXR5JywgeyBsZW5ndGg6IDEwIH0pLiR0eXBlPEFkdmlzb3J5U2V2ZXJpdHk+KCkubm90TnVsbCgpLFxuICBzdW1tYXJ5OiB2YXJjaGFyKCdzdW1tYXJ5JywgeyBsZW5ndGg6IDMwMCB9KS5ub3ROdWxsKCksXG4gIGRldGFpbHNNZDogdGV4dCgnZGV0YWlsc19tZCcpLFxuICBkZXRhaWxzSHRtbDogdGV4dCgnZGV0YWlsc19odG1sJyksXG4gIGN2ZUlkczogdGV4dCgnY3ZlX2lkcycpLmFycmF5KCkuZGVmYXVsdChbXSkubm90TnVsbCgpLFxuICBzdGF0ZTogdmFyY2hhcignc3RhdGUnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8QWR2aXNvcnlTdGF0ZT4oKS5kZWZhdWx0KCdkcmFmdCcpLm5vdE51bGwoKSxcbiAgc291cmNlOiB2YXJjaGFyKCdzb3VyY2UnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8QWR2aXNvcnlTb3VyY2U+KCkubm90TnVsbCgpLFxuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIHB1Ymxpc2hlZEJ5OiB0ZXh0KCdwdWJsaXNoZWRfYnknKSxcbiAgcHVibGlzaGVkQXQ6IHRpbWVzdGFtcCgncHVibGlzaGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHdpdGhkcmF3bkF0OiB0aW1lc3RhbXAoJ3dpdGhkcmF3bl9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgbGlzdGluZ1N0YXRlSWR4OiBpbmRleCgncGx1Z2luX2Fkdmlzb3J5X2xpc3Rpbmdfc3RhdGVfaWR4Jykub24odGFibGUubGlzdGluZ0lkLCB0YWJsZS5zdGF0ZSksXG4gIHB1Ymxpc2hlcklkeDogaW5kZXgoJ3BsdWdpbl9hZHZpc29yeV9wdWJsaXNoZXJfaWR4Jykub24odGFibGUucHVibGlzaGVySWQpLFxuICBzZXZlcml0eUNoZWNrOiBjaGVjaygncGx1Z2luX2Fkdmlzb3JpZXNfc2V2ZXJpdHlfY2hlY2snLFxuICAgIHNxbGAke3RhYmxlLnNldmVyaXR5fSBJTiAoJ2NyaXRpY2FsJywgJ2hpZ2gnLCAnbWVkaXVtJywgJ2xvdycpYCksXG4gIHN0YXRlQ2hlY2s6IGNoZWNrKCdwbHVnaW5fYWR2aXNvcmllc19zdGF0ZV9jaGVjaycsIHNxbGAke3RhYmxlLnN0YXRlfSBJTiAoJ2RyYWZ0JywgJ3B1Ymxpc2hlZCcsICd3aXRoZHJhd24nKWApLFxuICBzb3VyY2VDaGVjazogY2hlY2soJ3BsdWdpbl9hZHZpc29yaWVzX3NvdXJjZV9jaGVjaycsXG4gICAgc3FsYCR7dGFibGUuc291cmNlfSBJTiAoJ3B1Ymxpc2hlcicsICdtb2RlcmF0b3InLCAnY3ZlX3Jlc2NhbicsICdyZXZpZXcnKWApLFxufSkpO1xuXG4vKipcbiAqIEEgcHJvcG9zZWQgZW5hYmxlIG9yIHdpZGVuaW5nIG9mIGFuIGF1dG8tYXBwcm92YWwgcnVsZSwgd2FpdGluZyBmb3IgYSBTRUNPTkRcbiAqIEVjb3N5c3RlbSBNYW5hZ2VyIChuZXZlciB0aGUgcHJvcG9zZXIpLiBEaXNhYmxpbmcgb3IgZGVsZXRpbmcgYSBydWxlXG4gKiBuYXJyb3dzIGl0IGFuZCBhcHBsaWVzIGF0IG9uY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b0FwcHJvdmFsUnVsZVBlbmRpbmdDaGFuZ2Uge1xuICByZXF1ZXN0ZWRCeTogc3RyaW5nO1xuICByZXF1ZXN0ZWRBdDogc3RyaW5nO1xuICBlbmFibGVkOiBib29sZWFuO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbmRpdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIFN5c3RlbS1vcmcgYXV0by1hcHByb3ZhbCBydWxlczsgZW5hYmxpbmcgb3Igd2lkZW5pbmcgb25lXG4gKiBuZWVkcyBhIHNlY29uZCBhcHByb3ZlciAoYHBlbmRpbmdDaGFuZ2VgKS5cbiAqXG4gKiBAdGFibGUgZWNvc3lzdGVtX2F1dG9fYXBwcm92YWxfcnVsZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGVjb3N5c3RlbUF1dG9BcHByb3ZhbFJ1bGUgPSBwZ1RhYmxlKCdlY29zeXN0ZW1fYXV0b19hcHByb3ZhbF9ydWxlcycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgbmFtZTogdmFyY2hhcignbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBlbmFibGVkOiBib29sZWFuKCdlbmFibGVkJykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuICBjb25kaXRpb25zOiBqc29uYignY29uZGl0aW9ucycpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpLmRlZmF1bHQoe30pLm5vdE51bGwoKSxcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5Jykubm90TnVsbCgpLFxuICAvLyBTZWNvbmQgYXBwcm92ZXIgKG5ldmVyIHRoZSBjcmVhdG9yKS5cbiAgYXBwcm92ZWRCeTogdGV4dCgnYXBwcm92ZWRfYnknKSxcbiAgcGVuZGluZ0NoYW5nZToganNvbmIoJ3BlbmRpbmdfY2hhbmdlJykuJHR5cGU8QXV0b0FwcHJvdmFsUnVsZVBlbmRpbmdDaGFuZ2U+KCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSk7XG5cbi8qKlxuICogVGhlIHNpbmdsZSBxdWV1ZSB0aGUgRWNvc3lzdGVtIGNvbnNvbGUgd29ya3MgZnJvbS4gYGRpZ2VzdGAgaXMgcGlubmVkXG4gKiBhdCBzdWJtaXQ6IGFwcHJvdmFsIHB1Ymxpc2hlcyBleGFjdGx5IGl0LCBvciBmYWlscyBjbG9zZWQuIGBwbHVnaW5JZGBcbiAqIGhhcyBubyBGSyAodGhlIG9yZyByb3cgaXMgc29mdC1kZWxldGVkIGFuZCBwdXJnZWQgb24gaXRzIG93biBzY2hlZHVsZSkuXG4gKlxuICogQHRhYmxlIHBsdWdpbl9wdWJsaXNoX3JlcXVlc3RzXG4gKi9cbmV4cG9ydCBjb25zdCBwbHVnaW5QdWJsaXNoUmVxdWVzdCA9IHBnVGFibGUoJ3BsdWdpbl9wdWJsaXNoX3JlcXVlc3RzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBwdWJsaXNoZXJJZDogdXVpZCgncHVibGlzaGVyX2lkJykubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gcHVibGlzaGVyLmlkKSxcbiAgbGlzdGluZ0lkOiB1dWlkKCdsaXN0aW5nX2lkJykucmVmZXJlbmNlcygoKSA9PiBwbHVnaW5MaXN0aW5nLmlkKSxcbiAgcGx1Z2luSWQ6IHV1aWQoJ3BsdWdpbl9pZCcpLFxuICB2ZXJzaW9uOiB2YXJjaGFyKCd2ZXJzaW9uJywgeyBsZW5ndGg6IDUwIH0pLFxuICBkaWdlc3Q6IHZhcmNoYXIoJ2RpZ2VzdCcsIHsgbGVuZ3RoOiA3MSB9KSxcbiAga2luZDogdmFyY2hhcigna2luZCcsIHsgbGVuZ3RoOiAyMCB9KS4kdHlwZTxQdWJsaXNoUmVxdWVzdEtpbmQ+KCkubm90TnVsbCgpLFxuICBzZWN1cml0eUZpeEFkdmlzb3J5SWQ6IHV1aWQoJ3NlY3VyaXR5X2ZpeF9hZHZpc29yeV9pZCcpLnJlZmVyZW5jZXMoKCkgPT4gcGx1Z2luQWR2aXNvcnkuaWQpLFxuICBwYXlsb2FkOiBqc29uYigncGF5bG9hZCcpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpLmRlZmF1bHQoe30pLm5vdE51bGwoKSxcbiAgc3RhdHVzOiB2YXJjaGFyKCdzdGF0dXMnLCB7IGxlbmd0aDogMzAgfSkuJHR5cGU8UHVibGlzaFJlcXVlc3RTdGF0dXM+KCkuZGVmYXVsdCgncGVuZGluZycpLm5vdE51bGwoKSxcbiAgbGFuZTogdmFyY2hhcignbGFuZScsIHsgbGVuZ3RoOiAxMCB9KS4kdHlwZTxQdWJsaXNoUmVxdWVzdExhbmU+KCkuZGVmYXVsdCgnc3RhbmRhcmQnKS5ub3ROdWxsKCksXG4gIHN1Ym1pdHRlZEJ5OiB0ZXh0KCdzdWJtaXR0ZWRfYnknKS5ub3ROdWxsKCksXG4gIHN1Ym1pdHRlZE9yZ0lkOiB2YXJjaGFyKCdzdWJtaXR0ZWRfb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZmlyc3RBcHByb3ZlZEJ5OiB0ZXh0KCdmaXJzdF9hcHByb3ZlZF9ieScpLFxuICBkZWNpZGVkQnk6IHRleHQoJ2RlY2lkZWRfYnknKSxcbiAgc2Vjb25kQXBwcm92ZWRCeTogdGV4dCgnc2Vjb25kX2FwcHJvdmVkX2J5JyksXG4gIHJlYXNvbjogdGV4dCgncmVhc29uJyksXG4gIGF1dG9SdWxlSWQ6IHV1aWQoJ2F1dG9fcnVsZV9pZCcpLnJlZmVyZW5jZXMoKCkgPT4gZWNvc3lzdGVtQXV0b0FwcHJvdmFsUnVsZS5pZCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgZGVjaWRlZEF0OiB0aW1lc3RhbXAoJ2RlY2lkZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgc3RhdHVzQ3JlYXRlZElkeDogaW5kZXgoJ3BsdWdpbl9wdWJsaXNoX3JlcXVlc3Rfc3RhdHVzX2NyZWF0ZWRfaWR4Jykub24odGFibGUuc3RhdHVzLCB0YWJsZS5jcmVhdGVkQXQpLFxuICBwdWJsaXNoZXJJZHg6IGluZGV4KCdwbHVnaW5fcHVibGlzaF9yZXF1ZXN0X3B1Ymxpc2hlcl9pZHgnKS5vbih0YWJsZS5wdWJsaXNoZXJJZCwgdGFibGUuY3JlYXRlZEF0KSxcbiAgLy8gQXQgbW9zdCBPTkUgb3BlbiByZXF1ZXN0IG9mIGEga2luZCBwZXIgKHB1Ymxpc2hlciwgbGlzdGluZywgdmVyc2lvbikuIEFcbiAgLy8gbmV3X2xpc3RpbmcgaGFzIG5vIGxpc3RpbmcgeWV0LCBzbyB0aGUgcmVxdWVzdGVkIG5hbWUgKHBheWxvYWQtPj4nbmFtZScpXG4gIC8vIHN0YW5kcyBpbjsgQ09BTEVTQ0UgYmVjYXVzZSBOVUxMcyBhcmUgRElTVElOQ1QgaW4gYSB1bmlxdWUgaW5kZXguIEFkdmlzb3J5XG4gIC8vIGRyYWZ0cyBhcmUgZXhlbXB0OiBhIGxpc3RpbmcgY2FuIGNhcnJ5IHNldmVyYWwgYXQgb25jZSAoZGlmZmVyZW50IHJhbmdlc1xuICAvLyBhbmQgQ1ZFIHNldHMpLCBlYWNoIGRlZHVwbGljYXRlZCBieSB0aGUgYWR2aXNvcnkgc2VydmljZS4gTXVzdCBtYXRjaCB0aGVcbiAgLy8gcG9zdGdyZXMtaW5pdC5zcWwgZXhwcmVzc2lvbiBpbmRleC5cbiAgb3BlblVuaXF1ZTogdW5pcXVlSW5kZXgoJ3BsdWdpbl9wdWJsaXNoX3JlcXVlc3Rfb3Blbl91bmlxdWUnKVxuICAgIC5vbihcbiAgICAgIHRhYmxlLnB1Ymxpc2hlcklkLFxuICAgICAgdGFibGUua2luZCxcbiAgICAgIHNxbGBjb2FsZXNjZSgke3RhYmxlLmxpc3RpbmdJZH06OnRleHQsICR7dGFibGUucGF5bG9hZH0tPj4nbmFtZScsICcnKWAsXG4gICAgICBzcWxgY29hbGVzY2UoJHt0YWJsZS52ZXJzaW9ufSwgJycpYCxcbiAgICApXG4gICAgLndoZXJlKHNxbGBzdGF0dXMgSU4gKCdwZW5kaW5nJywgJ3BlbmRpbmdfc2Vjb25kX2FwcHJvdmFsJykgQU5EIGtpbmQgPD4gJ2Fkdmlzb3J5J2ApLFxuICBkaWdlc3RDaGVjazogY2hlY2soJ3BsdWdpbl9wdWJsaXNoX3JlcXVlc3RzX2RpZ2VzdF9jaGVjaycsXG4gICAgc3FsYCR7dGFibGUuZGlnZXN0fSBJUyBOVUxMIE9SICR7dGFibGUuZGlnZXN0fSB+ICdec2hhMjU2OlswLTlhLWZdezY0fSQnYCksXG4gIGtpbmRDaGVjazogY2hlY2soJ3BsdWdpbl9wdWJsaXNoX3JlcXVlc3RzX2tpbmRfY2hlY2snLCBzcWxgJHt0YWJsZS5raW5kfSBJTiAoJ25ld19saXN0aW5nJywgJ25ld192ZXJzaW9uJyxcbiAgICAnbGlzdGluZ191cGRhdGUnLCAneWFuaycsICd1bnBhdXNlJywgJ3RyYW5zZmVyJywgJ2NsYWltJywgJ3Byb2ZpbGVfY2hhbmdlJywgJ2Fkdmlzb3J5JywgJ3ZlcmlmeScsICdtb2RlcmF0aW9uJyxcbiAgICAnc3VibWlzc2lvbicpYCksXG4gIHN0YXR1c0NoZWNrOiBjaGVjaygncGx1Z2luX3B1Ymxpc2hfcmVxdWVzdHNfc3RhdHVzX2NoZWNrJyxcbiAgICBzcWxgJHt0YWJsZS5zdGF0dXN9IElOICgncGVuZGluZycsICdwZW5kaW5nX3NlY29uZF9hcHByb3ZhbCcsICdhcHByb3ZlZCcsICdyZWplY3RlZCcsICd3aXRoZHJhd24nKWApLFxuICBsYW5lQ2hlY2s6IGNoZWNrKCdwbHVnaW5fcHVibGlzaF9yZXF1ZXN0c19sYW5lX2NoZWNrJywgc3FsYCR7dGFibGUubGFuZX0gSU4gKCdzdGFuZGFyZCcsICdzZWN1cml0eScpYCksXG59KSk7XG5cbi8qKlxuICogTmFtZXMgaGVsZCBiYWNrIGZyb20gaGFuZGxlcy9saXN0aW5ncyAoT2ZmaWNpYWwvVmVyaWZpZWQgcmVzZXJ2YXRpb25zLFxuICogY29uZnVzYWJsZXMpLiBgcHVibGlzaGVySWRgID0gdGhlIHB1Ymxpc2hlciB0aGUgbmFtZSBpcyByZXNlcnZlZCBGT1IsIGlmIGFueS5cbiAqXG4gKiBAdGFibGUgZWNvc3lzdGVtX3Jlc2VydmVkX25hbWVzXG4gKi9cbmV4cG9ydCBjb25zdCBlY29zeXN0ZW1SZXNlcnZlZE5hbWUgPSBwZ1RhYmxlKCdlY29zeXN0ZW1fcmVzZXJ2ZWRfbmFtZXMnLCB7XG4gIG5hbWU6IHZhcmNoYXIoJ25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLnByaW1hcnlLZXkoKSxcbiAgcmVhc29uOiB0ZXh0KCdyZWFzb24nKSxcbiAgcHVibGlzaGVySWQ6IHV1aWQoJ3B1Ymxpc2hlcl9pZCcpLnJlZmVyZW5jZXMoKCkgPT4gcHVibGlzaGVyLmlkKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSk7XG5cbi8qKlxuICogSW5zdGFuY2Utd2lkZSBlY29zeXN0ZW0ga25vYnMgKGZsYWdzLCBTTEEsIHRocmVzaG9sZHMpLCBrZXkvdmFsdWUuXG4gKlxuICogQHRhYmxlIGVjb3N5c3RlbV9zZXR0aW5nc1xuICovXG5leHBvcnQgY29uc3QgZWNvc3lzdGVtU2V0dGluZyA9IHBnVGFibGUoJ2Vjb3N5c3RlbV9zZXR0aW5ncycsIHtcbiAga2V5OiB2YXJjaGFyKCdrZXknLCB7IGxlbmd0aDogMTAwIH0pLnByaW1hcnlLZXkoKSxcbiAgdmFsdWU6IGpzb25iKCd2YWx1ZScpLiR0eXBlPHVua25vd24+KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQnk6IHRleHQoJ3VwZGF0ZWRfYnknKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSk7XG5cbi8qKlxuICogQ3VyYXRlZCBkaXJlY3RvcnkgY29sbGVjdGlvbnMgKFwiRmVhdHVyZWRcIiwgXCJTZWN1cml0eSBzY2FubmVyc1wiLCDigKYpLlxuICpcbiAqIEB0YWJsZSBlY29zeXN0ZW1fY29sbGVjdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGVjb3N5c3RlbUNvbGxlY3Rpb24gPSBwZ1RhYmxlKCdlY29zeXN0ZW1fY29sbGVjdGlvbnMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIHNsdWc6IHZhcmNoYXIoJ3NsdWcnLCB7IGxlbmd0aDogMTAwIH0pLm5vdE51bGwoKS51bmlxdWUoKSxcbiAgdGl0bGU6IHZhcmNoYXIoJ3RpdGxlJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGRlc2NyaXB0aW9uOiB0ZXh0KCdkZXNjcmlwdGlvbicpLFxuICBsaXN0aW5nSWRzOiBqc29uYignbGlzdGluZ19pZHMnKS4kdHlwZTxzdHJpbmdbXT4oKS5kZWZhdWx0KFtdKS5ub3ROdWxsKCksXG4gIHBvc2l0aW9uOiBpbnRlZ2VyKCdwb3NpdGlvbicpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICB1cGRhdGVkQnk6IHRleHQoJ3VwZGF0ZWRfYnknKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSk7XG5cbi8qKlxuICogQSBsaXN0aW5nIHJldmlldy4gYGF1dGhvck9yZ0lkYCBmZWVkcyB0aGUgaW50ZWdyaXR5IHJ1bGVzIChub1xuICogc2VsZi1yZXZpZXcsIHBlci1vcmcgcmF0ZSBsaW1pdCwgdmVyaWZpZWQgdXNlKSBhbmQgaXMgTkVWRVIgZXhwb3NlZC4gR0RQUlxuICogdXNlciBkZWxldGlvbiBhbm9ueW1pemVzOiBgYXV0aG9yVXNlcklkYCBhbmQgdGhlIGJvZHkgZ28gTlVMTCwgdGhlIHJhdGluZyBzdGF5cy5cbiAqXG4gKiBAdGFibGUgcGx1Z2luX3Jldmlld3NcbiAqL1xuZXhwb3J0IGNvbnN0IHBsdWdpblJldmlldyA9IHBnVGFibGUoJ3BsdWdpbl9yZXZpZXdzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBsaXN0aW5nSWQ6IHV1aWQoJ2xpc3RpbmdfaWQnKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBwbHVnaW5MaXN0aW5nLmlkLCB7IG9uRGVsZXRlOiAnY2FzY2FkZScgfSksXG4gIHZlcnNpb246IHZhcmNoYXIoJ3ZlcnNpb24nLCB7IGxlbmd0aDogNTAgfSksXG4gIHJhdGluZzogc21hbGxpbnQoJ3JhdGluZycpLm5vdE51bGwoKSxcbiAgdGl0bGU6IHZhcmNoYXIoJ3RpdGxlJywgeyBsZW5ndGg6IDEyMCB9KSxcbiAgYm9keU1kOiB0ZXh0KCdib2R5X21kJyksXG4gIGJvZHlIdG1sOiB0ZXh0KCdib2R5X2h0bWwnKSxcbiAgYXV0aG9yVXNlcklkOiB0ZXh0KCdhdXRob3JfdXNlcl9pZCcpLFxuICBhdXRob3JPcmdJZDogdmFyY2hhcignYXV0aG9yX29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIC8vIFRoZSBvbmx5IGF1dGhvciBmaWVsZCBldmVyIHNob3duIChzbmFwc2hvdCBhdCB3cml0ZSB0aW1lOyBOVUxMIG9uY2UgYW5vbnltaXplZCkuXG4gIGF1dGhvckRpc3BsYXlOYW1lOiB2YXJjaGFyKCdhdXRob3JfZGlzcGxheV9uYW1lJywgeyBsZW5ndGg6IDEwMCB9KSxcbiAgdmVyaWZpZWRVc2U6IGJvb2xlYW4oJ3ZlcmlmaWVkX3VzZScpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcbiAgc3RhdHVzOiB2YXJjaGFyKCdzdGF0dXMnLCB7IGxlbmd0aDogMTAgfSkuJHR5cGU8UmV2aWV3U3RhdHVzPigpLmRlZmF1bHQoJ3B1Ymxpc2hlZCcpLm5vdE51bGwoKSxcbiAgaG9sZFJlYXNvbjogdmFyY2hhcignaG9sZF9yZWFzb24nLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8UmV2aWV3SG9sZFJlYXNvbj4oKSxcbiAgbW9kZXJhdGlvblJlYXNvbjogdGV4dCgnbW9kZXJhdGlvbl9yZWFzb24nKSxcbiAgaGVscGZ1bENvdW50OiBpbnRlZ2VyKCdoZWxwZnVsX2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBsaXN0aW5nQXV0aG9yVW5pcXVlOiB1bmlxdWVJbmRleCgncGx1Z2luX3Jldmlld19saXN0aW5nX2F1dGhvcl91bmlxdWUnKS5vbih0YWJsZS5saXN0aW5nSWQsIHRhYmxlLmF1dGhvclVzZXJJZCksXG4gIGxpc3RpbmdTdGF0dXNDcmVhdGVkSWR4OiBpbmRleCgncGx1Z2luX3Jldmlld19saXN0aW5nX3N0YXR1c19jcmVhdGVkX2lkeCcpXG4gICAgLm9uKHRhYmxlLmxpc3RpbmdJZCwgdGFibGUuc3RhdHVzLCB0YWJsZS5jcmVhdGVkQXQpLFxuICAvLyBQZXItb3JnIGRhaWx5IHJldmlldyBjYXAuXG4gIGF1dGhvck9yZ0NyZWF0ZWRJZHg6IGluZGV4KCdwbHVnaW5fcmV2aWV3X2F1dGhvcl9vcmdfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5hdXRob3JPcmdJZCwgdGFibGUuY3JlYXRlZEF0KSxcbiAgLy8gTW9kZXJhdGlvbiBxdWV1ZS5cbiAgc3RhdHVzVXBkYXRlZElkeDogaW5kZXgoJ3BsdWdpbl9yZXZpZXdfc3RhdHVzX3VwZGF0ZWRfaWR4Jykub24odGFibGUuc3RhdHVzLCB0YWJsZS51cGRhdGVkQXQpLFxuICByYXRpbmdDaGVjazogY2hlY2soJ3BsdWdpbl9yZXZpZXdzX3JhdGluZ19jaGVjaycsIHNxbGAke3RhYmxlLnJhdGluZ30gQkVUV0VFTiAxIEFORCA1YCksXG4gIHN0YXR1c0NoZWNrOiBjaGVjaygncGx1Z2luX3Jldmlld3Nfc3RhdHVzX2NoZWNrJywgc3FsYCR7dGFibGUuc3RhdHVzfSBJTiAoJ3B1Ymxpc2hlZCcsICdoZWxkJywgJ3JlbW92ZWQnKWApLFxuICBob2xkUmVhc29uQ2hlY2s6IGNoZWNrKCdwbHVnaW5fcmV2aWV3c19ob2xkX3JlYXNvbl9jaGVjaycsXG4gICAgc3FsYCR7dGFibGUuaG9sZFJlYXNvbn0gSU4gKCdyZXBvcnRzJywgJ2J1cnN0JywgJ2ZpbHRlcicsICdzZWN1cml0eScsICdtb2RlcmF0b3InKWApLFxufSkpO1xuXG4vKipcbiAqIFRoZSBvbmUgcHVibGljIHB1Ymxpc2hlciByZXBseSB0byBhIHJldmlldy5cbiAqXG4gKiBAdGFibGUgcGx1Z2luX3Jldmlld19yZXBsaWVzXG4gKi9cbmV4cG9ydCBjb25zdCBwbHVnaW5SZXZpZXdSZXBseSA9IHBnVGFibGUoJ3BsdWdpbl9yZXZpZXdfcmVwbGllcycsIHtcbiAgcmV2aWV3SWQ6IHV1aWQoJ3Jldmlld19pZCcpLnByaW1hcnlLZXkoKS5yZWZlcmVuY2VzKCgpID0+IHBsdWdpblJldmlldy5pZCwgeyBvbkRlbGV0ZTogJ2Nhc2NhZGUnIH0pLFxuICBwdWJsaXNoZXJJZDogdXVpZCgncHVibGlzaGVyX2lkJykubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gcHVibGlzaGVyLmlkKSxcbiAgYXV0aG9yVXNlcklkOiB0ZXh0KCdhdXRob3JfdXNlcl9pZCcpLFxuICBib2R5TWQ6IHRleHQoJ2JvZHlfbWQnKS5ub3ROdWxsKCksXG4gIGJvZHlIdG1sOiB0ZXh0KCdib2R5X2h0bWwnKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSk7XG5cbi8qKlxuICogXCJSZXBvcnQgcmV2aWV3XCIg4oCUIG9uZSBwZXIgcmVwb3J0ZXIgcGVyIHJldmlldzsgTiByZXBvcnRzIGF1dG8taG9sZCBpdC5cbiAqXG4gKiBAdGFibGUgcGx1Z2luX3Jldmlld19yZXBvcnRzXG4gKi9cbmV4cG9ydCBjb25zdCBwbHVnaW5SZXZpZXdSZXBvcnQgPSBwZ1RhYmxlKCdwbHVnaW5fcmV2aWV3X3JlcG9ydHMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIHJldmlld0lkOiB1dWlkKCdyZXZpZXdfaWQnKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBwbHVnaW5SZXZpZXcuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgcmVwb3J0ZXJVc2VySWQ6IHRleHQoJ3JlcG9ydGVyX3VzZXJfaWQnKS5ub3ROdWxsKCksXG4gIGNhdGVnb3J5OiB2YXJjaGFyKCdjYXRlZ29yeScsIHsgbGVuZ3RoOiAyMCB9KS4kdHlwZTxSZXZpZXdSZXBvcnRDYXRlZ29yeT4oKS5kZWZhdWx0KCdhYnVzZScpLm5vdE51bGwoKSxcbiAgcmVhc29uOiB0ZXh0KCdyZWFzb24nKSxcbiAgLy8gU2V0IG9uY2UgYSBtb2RlcmF0b3IgcmVsZWFzZWQgb3IgcmVtb3ZlZCB0aGUgcmV2aWV3LlxuICByZXNvbHZlZEF0OiB0aW1lc3RhbXAoJ3Jlc29sdmVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgcmV2aWV3UmVwb3J0ZXJVbmlxdWU6IHVuaXF1ZUluZGV4KCdwbHVnaW5fcmV2aWV3X3JlcG9ydF91bmlxdWUnKS5vbih0YWJsZS5yZXZpZXdJZCwgdGFibGUucmVwb3J0ZXJVc2VySWQpLFxuICBvcGVuSWR4OiBpbmRleCgncGx1Z2luX3Jldmlld19yZXBvcnRfb3Blbl9pZHgnKS5vbih0YWJsZS5yZXZpZXdJZCkud2hlcmUoc3FsYCR7dGFibGUucmVzb2x2ZWRBdH0gSVMgTlVMTGApLFxuICBjYXRlZ29yeUNoZWNrOiBjaGVjaygncGx1Z2luX3Jldmlld19yZXBvcnRzX2NhdGVnb3J5X2NoZWNrJyxcbiAgICBzcWxgJHt0YWJsZS5jYXRlZ29yeX0gSU4gKCdzcGFtJywgJ2FidXNlJywgJ29mZl90b3BpYycsICdzZWN1cml0eScpYCksXG59KSk7XG5cbi8qKlxuICogT25lIFwiaGVscGZ1bFwiIHZvdGUgcGVyIHVzZXIgcGVyIHJldmlldy5cbiAqXG4gKiBAdGFibGUgcGx1Z2luX3Jldmlld192b3Rlc1xuICovXG5leHBvcnQgY29uc3QgcGx1Z2luUmV2aWV3Vm90ZSA9IHBnVGFibGUoJ3BsdWdpbl9yZXZpZXdfdm90ZXMnLCB7XG4gIHJldmlld0lkOiB1dWlkKCdyZXZpZXdfaWQnKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBwbHVnaW5SZXZpZXcuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgdXNlcklkOiB0ZXh0KCd1c2VyX2lkJykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIHBrOiBwcmltYXJ5S2V5KHsgY29sdW1uczogW3RhYmxlLnJldmlld0lkLCB0YWJsZS51c2VySWRdIH0pLFxufSkpO1xuXG4vKipcbiAqIFJldmlldyBlZGl0IGhpc3Rvcnk6IHRoZSBQUklPUiBjb250ZW50LCBhcHBlbmRlZCBvbiBldmVyeSBlZGl0LlxuICpcbiAqIEB0YWJsZSBwbHVnaW5fcmV2aWV3X2hpc3RvcnlcbiAqL1xuZXhwb3J0IGNvbnN0IHBsdWdpblJldmlld0hpc3RvcnkgPSBwZ1RhYmxlKCdwbHVnaW5fcmV2aWV3X2hpc3RvcnknLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIHJldmlld0lkOiB1dWlkKCdyZXZpZXdfaWQnKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBwbHVnaW5SZXZpZXcuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgdmVyc2lvbjogdmFyY2hhcigndmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KSxcbiAgcmF0aW5nOiBzbWFsbGludCgncmF0aW5nJykubm90TnVsbCgpLFxuICB0aXRsZTogdmFyY2hhcigndGl0bGUnLCB7IGxlbmd0aDogMTIwIH0pLFxuICBib2R5TWQ6IHRleHQoJ2JvZHlfbWQnKSxcbiAgZWRpdGVkQXQ6IHRpbWVzdGFtcCgnZWRpdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgcmV2aWV3SWR4OiBpbmRleCgncGx1Z2luX3Jldmlld19oaXN0b3J5X3Jldmlld19pZHgnKS5vbih0YWJsZS5yZXZpZXdJZCwgdGFibGUuZWRpdGVkQXQpLFxuICByYXRpbmdDaGVjazogY2hlY2soJ3BsdWdpbl9yZXZpZXdfaGlzdG9yeV9yYXRpbmdfY2hlY2snLCBzcWxgJHt0YWJsZS5yYXRpbmd9IEJFVFdFRU4gMSBBTkQgNWApLFxufSkpO1xuXG4vKipcbiAqIERlbm9ybWFsaXplZCBwZXItbGlzdGluZyBzdGF0cywgcmVjb21wdXRlZCBieSBhIGpvYi4gYGFjdGl2ZU9yZ0NvdW50YCBpc1xuICogcHVibGljIG9ubHkgd2hlbiA+PSA1ICh0aGUgYHB1YmxpY19saXN0aW5nc2AgdmlldyBlbmZvcmNlcyBpdCkuXG4gKlxuICogQHRhYmxlIHBsdWdpbl9zdGF0c1xuICovXG5leHBvcnQgY29uc3QgcGx1Z2luU3RhdHMgPSBwZ1RhYmxlKCdwbHVnaW5fc3RhdHMnLCB7XG4gIGxpc3RpbmdJZDogdXVpZCgnbGlzdGluZ19pZCcpLnByaW1hcnlLZXkoKS5yZWZlcmVuY2VzKCgpID0+IHBsdWdpbkxpc3RpbmcuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgcmF0aW5nQmF5ZXM6IGRvdWJsZVByZWNpc2lvbigncmF0aW5nX2JheWVzJyksXG4gIHJhdGluZ0NvdW50OiBpbnRlZ2VyKCdyYXRpbmdfY291bnQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgLy8gU3RhciBkaXN0cmlidXRpb246IHsgXCIxXCI6IG4sIOKApiwgXCI1XCI6IG4gfS5cbiAgZGlzdDoganNvbmIoJ2Rpc3QnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PigpLmRlZmF1bHQoe30pLm5vdE51bGwoKSxcbiAgLy8gXCJSZWNlbnQgdmVyc2lvbnNcIiByYXRpbmcgb3ZlciB0aGUgbGFzdCB0d28gbWlub3JzLlxuICByZWNlbnRSYXRpbmc6IGRvdWJsZVByZWNpc2lvbigncmVjZW50X3JhdGluZycpLFxuICBpbnN0YWxsQ291bnQ6IGludGVnZXIoJ2luc3RhbGxfY291bnQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgYWN0aXZlT3JnQ291bnQ6IGludGVnZXIoJ2FjdGl2ZV9vcmdfY291bnQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgc3VjY2Vzc1JhdGUzMGQ6IGRvdWJsZVByZWNpc2lvbignc3VjY2Vzc19yYXRlXzMwZCcpLFxuICBoZWFsdGhTY29yZTogZG91YmxlUHJlY2lzaW9uKCdoZWFsdGhfc2NvcmUnKSxcbiAgLy8gUGVyLWNvbXBvbmVudCBoZWFsdGggc2NvcmVzIGFuZCB3ZWlnaHRzLCBmb3IgdGhlIGJyZWFrZG93biBwYW5lbC5cbiAgaGVhbHRoQnJlYWtkb3duOiBqc29uYignaGVhbHRoX2JyZWFrZG93bicpLiR0eXBlPEhlYWx0aEJyZWFrZG93bj4oKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSk7XG5cbi8qKlxuICogQW5vbnltb3VzIHB1YmxpYyBzdWJtaXNzaW9uLiBUaGUgZW1haWwgaXMga2VwdCBoYXNoZWQgKHJhdGUgbGltaXRzLFxuICogY2xhaW0gbWF0Y2hpbmcpIGFuZCBlbmNyeXB0ZWQgKHRha2Vkb3duIG5vdGljZXMgb25seSkgYW5kIHB1cmdlZCBhdFxuICogYGVtYWlsUHVyZ2VBZnRlcmAuIE5vdGhpbmcgaGVyZSBpcyBldmVyIGxpc3RlZCBvciByZXNvbHZhYmxlLlxuICpcbiAqIEB0YWJsZSBwbHVnaW5fc3VibWlzc2lvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IHBsdWdpblN1Ym1pc3Npb24gPSBwZ1RhYmxlKCdwbHVnaW5fc3VibWlzc2lvbnMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIHN0YXR1czogdmFyY2hhcignc3RhdHVzJywgeyBsZW5ndGg6IDMwIH0pLiR0eXBlPFN1Ym1pc3Npb25TdGF0dXM+KCkuZGVmYXVsdCgncGVuZGluZ192ZXJpZmljYXRpb24nKS5ub3ROdWxsKCksXG4gIGVtYWlsSGFzaDogdmFyY2hhcignZW1haWxfaGFzaCcsIHsgbGVuZ3RoOiA2NCB9KSxcbiAgZW1haWxFbmM6IHRleHQoJ2VtYWlsX2VuYycpLFxuICB2ZXJpZnlUb2tlbkhhc2g6IHZhcmNoYXIoJ3ZlcmlmeV90b2tlbl9oYXNoJywgeyBsZW5ndGg6IDY0IH0pLFxuICB2ZXJpZnlFeHBpcmVzQXQ6IHRpbWVzdGFtcCgndmVyaWZ5X2V4cGlyZXNfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgdmVyaWZpZWRBdDogdGltZXN0YW1wKCd2ZXJpZmllZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICAvLyBzaGEyNTYgb2YgdGhlIHN0YXR1cyB0b2tlbiAocmV0dXJuZWQgYnkgdmVyaWZ5IGFuZCBpbiBOMS9OMy9ONCBlbWFpbHMpIOKAlFxuICAvLyB0aGUgc3VibWl0dGVyJ3Mgb25seSByZWFkIGhhbmRsZSBvbiB0aGUgc3VibWlzc2lvbi5cbiAgc3RhdHVzVG9rZW5IYXNoOiB2YXJjaGFyKCdzdGF0dXNfdG9rZW5faGFzaCcsIHsgbGVuZ3RoOiA2NCB9KSxcbiAgbmFtZTogdmFyY2hhcignbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICB2ZXJzaW9uOiB2YXJjaGFyKCd2ZXJzaW9uJywgeyBsZW5ndGg6IDUwIH0pLm5vdE51bGwoKSxcbiAgc3BlYzoganNvbmIoJ3NwZWMnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKS5kZWZhdWx0KHt9KS5ub3ROdWxsKCksXG4gIC8vIFRoZSBhY2NlcHQtb3ItZWRpdCBjYXRhbG9nIHZhbHVlcyArIHByb3ZlbmFuY2UgYW5kIHRoZSBEb2NrZXJmaWxlLFxuICAvLyBjYXB0dXJlZCBhdCBzdWJtaXQgc28gbW9kZXJhdGlvbiByZXZpZXdzIGV4YWN0bHkgd2hhdCB3YXMgc3VibWl0dGVkLlxuICBjYXRhbG9nOiBqc29uYignY2F0YWxvZycpLiR0eXBlPFN1Ym1pc3Npb25DYXRhbG9nPigpLmRlZmF1bHQoeyB2YWx1ZXM6IHt9LCBzb3VyY2VzOiB7fSB9KS5ub3ROdWxsKCksXG4gIGRvY2tlcmZpbGU6IHRleHQoJ2RvY2tlcmZpbGUnKSxcbiAgYXJ0aWZhY3RLZXk6IHZhcmNoYXIoJ2FydGlmYWN0X2tleScsIHsgbGVuZ3RoOiAxMDI0IH0pLFxuICBxdWFyYW50aW5lSW1hZ2VSZWY6IHZhcmNoYXIoJ3F1YXJhbnRpbmVfaW1hZ2VfcmVmJywgeyBsZW5ndGg6IDEwMjQgfSksXG4gIGdhdGVSZXBvcnQ6IGpzb25iKCdnYXRlX3JlcG9ydCcpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpLFxuICBoZXVyaXN0aWNzOiBqc29uYignaGV1cmlzdGljcycpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpLFxuICBsaXN0aW5nSWQ6IHV1aWQoJ2xpc3RpbmdfaWQnKS5yZWZlcmVuY2VzKCgpID0+IHBsdWdpbkxpc3RpbmcuaWQpLFxuICBkZWNpZGVkQnk6IHRleHQoJ2RlY2lkZWRfYnknKSxcbiAgcmVhc29uOiB0ZXh0KCdyZWFzb24nKSxcbiAgY2xpZW50SXBIYXNoOiB2YXJjaGFyKCdjbGllbnRfaXBfaGFzaCcsIHsgbGVuZ3RoOiA2NCB9KSxcbiAgZXhwaXJlc0F0OiB0aW1lc3RhbXAoJ2V4cGlyZXNfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5ub3ROdWxsKCksXG4gIGRlY2lkZWRBdDogdGltZXN0YW1wKCdkZWNpZGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGVtYWlsUHVyZ2VBZnRlcjogdGltZXN0YW1wKCdlbWFpbF9wdXJnZV9hZnRlcicsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgc3RhdHVzQ3JlYXRlZElkeDogaW5kZXgoJ3BsdWdpbl9zdWJtaXNzaW9uX3N0YXR1c19jcmVhdGVkX2lkeCcpLm9uKHRhYmxlLnN0YXR1cywgdGFibGUuY3JlYXRlZEF0KSxcbiAgLy8gUGVyLWVtYWlsIC8gcGVyLUlQIGRhaWx5IHJhdGUgbGltaXRzLlxuICBlbWFpbENyZWF0ZWRJZHg6IGluZGV4KCdwbHVnaW5fc3VibWlzc2lvbl9lbWFpbF9jcmVhdGVkX2lkeCcpLm9uKHRhYmxlLmVtYWlsSGFzaCwgdGFibGUuY3JlYXRlZEF0KSxcbiAgaXBDcmVhdGVkSWR4OiBpbmRleCgncGx1Z2luX3N1Ym1pc3Npb25faXBfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5jbGllbnRJcEhhc2gsIHRhYmxlLmNyZWF0ZWRBdCksXG4gIHZlcmlmeVRva2VuVW5pcXVlOiB1bmlxdWVJbmRleCgncGx1Z2luX3N1Ym1pc3Npb25fdmVyaWZ5X3Rva2VuX3VuaXF1ZScpXG4gICAgLm9uKHRhYmxlLnZlcmlmeVRva2VuSGFzaClcbiAgICAud2hlcmUoc3FsYHZlcmlmeV90b2tlbl9oYXNoIElTIE5PVCBOVUxMYCksXG4gIHN0YXR1c1Rva2VuVW5pcXVlOiB1bmlxdWVJbmRleCgncGx1Z2luX3N1Ym1pc3Npb25fc3RhdHVzX3Rva2VuX3VuaXF1ZScpXG4gICAgLm9uKHRhYmxlLnN0YXR1c1Rva2VuSGFzaClcbiAgICAud2hlcmUoc3FsYHN0YXR1c190b2tlbl9oYXNoIElTIE5PVCBOVUxMYCksXG4gIHN0YXR1c0NoZWNrOiBjaGVjaygncGx1Z2luX3N1Ym1pc3Npb25zX3N0YXR1c19jaGVjaycsIHNxbGAke3RhYmxlLnN0YXR1c30gSU4gKCdwZW5kaW5nX3ZlcmlmaWNhdGlvbicsXG4gICAgJ3BlbmRpbmdfcmV2aWV3JywgJ3B1Ymxpc2hpbmcnLCAnZ2F0ZV9mYWlsZWQnLCAnYXBwcm92ZWQnLCAncmVqZWN0ZWQnLCAnZXhwaXJlZCcsICdjbGFpbWVkJylgKSxcbn0pKTtcblxuLyoqXG4gKiBaZXJvLXJlc3VsdCBkaXJlY3Rvcnkgc2VhcmNoZXMuIE5vIHVzZXIgZGF0YS4gYHF1ZXJ5YCBpcyBzdG9yZWQgbm9ybWFsaXplZDtcbiAqIHRoZSBtYWludGVuYW5jZSBzd2VlcCBmb2xkcyByZXBlYXRzIG9mIG9uZSAocXVlcnksIGNhdGVnb3J5KSBpbnRvIGEgc2luZ2xlXG4gKiByb3cgY291bnRpbmcgYGhpdHNgLCB3aXRoIGBjcmVhdGVkX2F0YCA9IHRoZSBsYXRlc3Qgb25lLCBhbmQgcHJ1bmVzIHJvd3Mgbm90XG4gKiBzZWVuIGZvciAzMCBkYXlzLlxuICpcbiAqIEB0YWJsZSBlY29zeXN0ZW1fc2VhcmNoX21pc3Nlc1xuICovXG5leHBvcnQgY29uc3QgZWNvc3lzdGVtU2VhcmNoTWlzcyA9IHBnVGFibGUoJ2Vjb3N5c3RlbV9zZWFyY2hfbWlzc2VzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBxdWVyeTogdmFyY2hhcigncXVlcnknLCB7IGxlbmd0aDogMjAwIH0pLm5vdE51bGwoKSxcbiAgY2F0ZWdvcnk6IHZhcmNoYXIoJ2NhdGVnb3J5JywgeyBsZW5ndGg6IDUwIH0pLFxuICBoaXRzOiBpbnRlZ2VyKCdoaXRzJykuZGVmYXVsdCgxKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgY3JlYXRlZEF0SWR4OiBpbmRleCgnZWNvc3lzdGVtX3NlYXJjaF9taXNzX2NyZWF0ZWRfaWR4Jykub24odGFibGUuY3JlYXRlZEF0KSxcbiAgaGl0c0NoZWNrOiBjaGVjaygnZWNvc3lzdGVtX3NlYXJjaF9taXNzZXNfaGl0c19jaGVjaycsIHNxbGAke3RhYmxlLmhpdHN9ID49IDFgKSxcbn0pKTtcblxuLyoqXG4gKiBOb3RpZmljYXRpb24gZGlnZXN0L2JhdGNoaW5nIHF1ZXVlLiBSb3dzIHNoYXJpbmcgYSBgZGlnZXN0S2V5YCBhcmVcbiAqIGNvYWxlc2NlZCBpbnRvIG9uZSBlbWFpbCBhdCBgZGVsaXZlckFmdGVyYC5cbiAqXG4gKiBAdGFibGUgZWNvc3lzdGVtX25vdGlmaWNhdGlvbl9xdWV1ZVxuICovXG5leHBvcnQgY29uc3QgZWNvc3lzdGVtTm90aWZpY2F0aW9uUXVldWUgPSBwZ1RhYmxlKCdlY29zeXN0ZW1fbm90aWZpY2F0aW9uX3F1ZXVlJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICByZWNpcGllbnRVc2VySWQ6IHRleHQoJ3JlY2lwaWVudF91c2VyX2lkJyksXG4gIHJlY2lwaWVudE9yZ0lkOiB2YXJjaGFyKCdyZWNpcGllbnRfb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZXZlbnQ6IHZhcmNoYXIoJ2V2ZW50JywgeyBsZW5ndGg6IDggfSkuJHR5cGU8RWNvc3lzdGVtTm90aWZpY2F0aW9uRXZlbnQ+KCkubm90TnVsbCgpLFxuICBkaWdlc3RLZXk6IHZhcmNoYXIoJ2RpZ2VzdF9rZXknLCB7IGxlbmd0aDogMjU1IH0pLFxuICBwYXlsb2FkOiBqc29uYigncGF5bG9hZCcpLiR0eXBlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpLmRlZmF1bHQoe30pLm5vdE51bGwoKSxcbiAgZGVsaXZlckFmdGVyOiB0aW1lc3RhbXAoJ2RlbGl2ZXJfYWZ0ZXInLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICBkZWxpdmVyZWRBdDogdGltZXN0YW1wKCdkZWxpdmVyZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICAvLyBUaGUgZGlzcGF0Y2hlcidzIHNjYW46IHVuZGVsaXZlcmVkIHJvd3MgdGhhdCBhcmUgZHVlLlxuICBkdWVJZHg6IGluZGV4KCdlY29zeXN0ZW1fbm90aWZpY2F0aW9uX2R1ZV9pZHgnKS5vbih0YWJsZS5kZWxpdmVyQWZ0ZXIpLndoZXJlKHNxbGBkZWxpdmVyZWRfYXQgSVMgTlVMTGApLFxuICBkaWdlc3RJZHg6IGluZGV4KCdlY29zeXN0ZW1fbm90aWZpY2F0aW9uX2RpZ2VzdF9pZHgnKS5vbih0YWJsZS5kaWdlc3RLZXkpLndoZXJlKHNxbGBkZWxpdmVyZWRfYXQgSVMgTlVMTGApLFxuICBldmVudENoZWNrOiBjaGVjaygnZWNvc3lzdGVtX25vdGlmaWNhdGlvbl9xdWV1ZV9ldmVudF9jaGVjaycsIHNxbGAke3RhYmxlLmV2ZW50fSB+ICdeTihbMS05XXwxWzAtOV18MlswLTldKSQnYCksXG59KSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gT3JnLXNjb3BlZCB0YWJsZXMgKG9yZ19pZCArIHJsc19vcmdfKiBwb2xpY2llcyArIEZPUkNFOyBpbiB0aGUgb3JnIGNhc2NhZGUpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBTdGVwIG1hbmlmZXN0OiB3aGljaCBwbHVnaW4gZWFjaCAocGlwZWxpbmUsIHN0YWdlLCBhY3Rpb24pIHJ1bnMsXG4gKiByZWNvcmRlZCBhdCBzeW50aC4gRXZlbnQgaW5nZXN0IGpvaW5zIG9uIGl0IHRvIHN0YW1wXG4gKiBgcGlwZWxpbmVfZXZlbnRzLnBsdWdpbl8qYC4gYHBsdWdpblB1Ymxpc2hlcmAgaXMgTlVMTCBmb3IgYW4gb3duLW9yZyBwbHVnaW4uXG4gKlxuICogQHRhYmxlIHBpcGVsaW5lX3N0ZXBfbWFuaWZlc3RzXG4gKi9cbmV4cG9ydCBjb25zdCBwaXBlbGluZVN0ZXBNYW5pZmVzdCA9IHBnVGFibGUoJ3BpcGVsaW5lX3N0ZXBfbWFuaWZlc3RzJywge1xuICBwaXBlbGluZUlkOiB1dWlkKCdwaXBlbGluZV9pZCcpLm5vdE51bGwoKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBzdGFnZU5hbWU6IHZhcmNoYXIoJ3N0YWdlX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgYWN0aW9uTmFtZTogdmFyY2hhcignYWN0aW9uX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcGx1Z2luUHVibGlzaGVyOiB2YXJjaGFyKCdwbHVnaW5fcHVibGlzaGVyJywgeyBsZW5ndGg6IDM5IH0pLFxuICAvKiogVGhlIGxpc3RpbmcgcHVibGlzaGVyJ3MgaWQgKE5VTEwgZm9yIGFuIG93bi1vcmcgcGx1Z2luKSDigJQgd2hhdCBjcm9zcy1vcmcgc3RhdHMgam9pbiBvbi4gKi9cbiAgcGx1Z2luUHVibGlzaGVySWQ6IHV1aWQoJ3BsdWdpbl9wdWJsaXNoZXJfaWQnKSxcbiAgcGx1Z2luTmFtZTogdmFyY2hhcigncGx1Z2luX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcGx1Z2luVmVyc2lvbjogdmFyY2hhcigncGx1Z2luX3ZlcnNpb24nLCB7IGxlbmd0aDogNTAgfSkubm90TnVsbCgpLFxuICBpbWFnZURpZ2VzdDogdmFyY2hhcignaW1hZ2VfZGlnZXN0JywgeyBsZW5ndGg6IDcxIH0pLFxuICBpbWFnZVJlcG9zaXRvcnk6IHZhcmNoYXIoJ2ltYWdlX3JlcG9zaXRvcnknLCB7IGxlbmd0aDogNTEyIH0pLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIHBrOiBwcmltYXJ5S2V5KHsgY29sdW1uczogW3RhYmxlLnBpcGVsaW5lSWQsIHRhYmxlLnN0YWdlTmFtZSwgdGFibGUuYWN0aW9uTmFtZV0gfSksXG4gIG9yZ0lkeDogaW5kZXgoJ3BpcGVsaW5lX3N0ZXBfbWFuaWZlc3Rfb3JnX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbiAgLy8gcHVibGljLyogR0MgZ3VhcmQ6IFwiZG9lcyBhbnkgbWFuaWZlc3Qgc3RpbGwgcmVmZXJlbmNlIHRoaXMgZGlnZXN0P1wiXG4gIGRpZ2VzdElkeDogaW5kZXgoJ3BpcGVsaW5lX3N0ZXBfbWFuaWZlc3RfZGlnZXN0X2lkeCcpLm9uKHRhYmxlLmltYWdlRGlnZXN0KSxcbiAgcGx1Z2luSWR4OiBpbmRleCgncGlwZWxpbmVfc3RlcF9tYW5pZmVzdF9wbHVnaW5faWR4Jykub24odGFibGUucGx1Z2luUHVibGlzaGVyLCB0YWJsZS5wbHVnaW5OYW1lKSxcbiAgcGx1Z2luUHVibGlzaGVySWRJZHg6IGluZGV4KCdwaXBlbGluZV9zdGVwX21hbmlmZXN0X3B1Ymxpc2hlcl9pZF9pZHgnKS5vbih0YWJsZS5wbHVnaW5QdWJsaXNoZXJJZCwgdGFibGUucGx1Z2luTmFtZSksXG59KSk7XG5cbi8qKlxuICogQW4gb3JnJ3MgaW5zdGFsbCBvZiBhIGxpc3RpbmcuIE9mZmljaWFsIGxpc3RpbmdzIGFyZSBpbnN0YWxsZWRcbiAqIGltcGxpY2l0bHkgKHZpcnR1YWwg4oCUIG5vIHJvdyk7IGEgcm93IGlzIGFuIGV4cGxpY2l0IGluc3RhbGwgb3Igb3ZlcnJpZGUuXG4gKlxuICogQHRhYmxlIHBsdWdpbl9pbnN0YWxsc1xuICovXG5leHBvcnQgY29uc3QgcGx1Z2luSW5zdGFsbCA9IHBnVGFibGUoJ3BsdWdpbl9pbnN0YWxscycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBsaXN0aW5nSWQ6IHV1aWQoJ2xpc3RpbmdfaWQnKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBwbHVnaW5MaXN0aW5nLmlkLCB7IG9uRGVsZXRlOiAnY2FzY2FkZScgfSksXG4gIHZlcnNpb25Qb2xpY3k6IHZhcmNoYXIoJ3ZlcnNpb25fcG9saWN5JywgeyBsZW5ndGg6IDEwIH0pLiR0eXBlPEluc3RhbGxWZXJzaW9uUG9saWN5PigpLmRlZmF1bHQoJ21pbm9yJykubm90TnVsbCgpLFxuICBwaW5uZWRWZXJzaW9uOiB2YXJjaGFyKCdwaW5uZWRfdmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KSxcbiAgcmVzb2x2ZWRWZXJzaW9uOiB2YXJjaGFyKCdyZXNvbHZlZF92ZXJzaW9uJywgeyBsZW5ndGg6IDUwIH0pLFxuICBzdGF0dXM6IHZhcmNoYXIoJ3N0YXR1cycsIHsgbGVuZ3RoOiAyMCB9KS4kdHlwZTxJbnN0YWxsU3RhdHVzPigpLmRlZmF1bHQoJ2FjdGl2ZScpLm5vdE51bGwoKSxcbiAgaW5zdGFsbGVkQnk6IHRleHQoJ2luc3RhbGxlZF9ieScpLm5vdE51bGwoKSxcbiAgYXBwcm92ZWRCeTogdGV4dCgnYXBwcm92ZWRfYnknKSxcbiAgZGVjaWRlZEF0OiB0aW1lc3RhbXAoJ2RlY2lkZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgLyoqIEEgcGVuZGluZywgYXBwcm92YWwtZ2F0ZWQgY2hhbmdlIG9mIHRoaXMgaW5zdGFsbCAodXBncmFkZSAvIHBvbGljeSksIG9yIG51bGwuICovXG4gIHBlbmRpbmdDaGFuZ2U6IGpzb25iKCdwZW5kaW5nX2NoYW5nZScpLiR0eXBlPEluc3RhbGxDaGFuZ2VSZXF1ZXN0PigpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnTGlzdGluZ1VuaXF1ZTogdW5pcXVlSW5kZXgoJ3BsdWdpbl9pbnN0YWxsX29yZ19saXN0aW5nX3VuaXF1ZScpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5saXN0aW5nSWQpLFxuICAvLyBcIkluc3RhbGxpbmcgb3Jnc1wiIGZhbi1vdXQgZm9yIE44L04xMy9OMTQvTjIxL04yNi5cbiAgbGlzdGluZ1N0YXR1c0lkeDogaW5kZXgoJ3BsdWdpbl9pbnN0YWxsX2xpc3Rpbmdfc3RhdHVzX2lkeCcpLm9uKHRhYmxlLmxpc3RpbmdJZCwgdGFibGUuc3RhdHVzKSxcbiAgdmVyc2lvblBvbGljeUNoZWNrOiBjaGVjaygncGx1Z2luX2luc3RhbGxzX3ZlcnNpb25fcG9saWN5X2NoZWNrJyxcbiAgICBzcWxgJHt0YWJsZS52ZXJzaW9uUG9saWN5fSBJTiAoJ3Bpbm5lZCcsICdwYXRjaCcsICdtaW5vcicsICdsYXRlc3QnKWApLFxuICBzdGF0dXNDaGVjazogY2hlY2soJ3BsdWdpbl9pbnN0YWxsc19zdGF0dXNfY2hlY2snLCBzcWxgJHt0YWJsZS5zdGF0dXN9IElOICgnYWN0aXZlJywgJ3BlbmRpbmdfYXBwcm92YWwnLCAnZGVuaWVkJylgKSxcbiAgcGlubmVkQ2hlY2s6IGNoZWNrKCdwbHVnaW5faW5zdGFsbF9waW5uZWRfY2hlY2snLFxuICAgIHNxbGAke3RhYmxlLnZlcnNpb25Qb2xpY3l9IDw+ICdwaW5uZWQnIE9SICR7dGFibGUucGlubmVkVmVyc2lvbn0gSVMgTk9UIE5VTExgKSxcbn0pKTtcblxuLyoqXG4gKiBPcmcgY29uc3VtcHRpb24gcG9saWN5LiBPbmUgcm93IHBlciBvcmc7IGFic2VudCA9IHRoZSBjb2x1bW4gZGVmYXVsdHMuXG4gKiBOb25lIG9mIHRoZXNlIHNhZmV0eSBjb250cm9scyBpcyBwbGFuLWdhdGVkLlxuICpcbiAqIEB0YWJsZSBwbHVnaW5faW5zdGFsbF9wb2xpY2llc1xuICovXG5leHBvcnQgY29uc3QgcGx1Z2luSW5zdGFsbFBvbGljeSA9IHBnVGFibGUoJ3BsdWdpbl9pbnN0YWxsX3BvbGljaWVzJywge1xuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5wcmltYXJ5S2V5KCksXG4gIGFsbG93ZWRUaWVyczogdGV4dCgnYWxsb3dlZF90aWVycycpLmFycmF5KCkuJHR5cGU8UHVibGlzaGVyVGllcltdPigpXG4gICAgLmRlZmF1bHQoWydvZmZpY2lhbCcsICd2ZXJpZmllZCddKS5ub3ROdWxsKCksXG4gIHJlcXVpcmVBcHByb3ZhbFRpZXJzOiB0ZXh0KCdyZXF1aXJlX2FwcHJvdmFsX3RpZXJzJykuYXJyYXkoKS4kdHlwZTxQdWJsaXNoZXJUaWVyW10+KClcbiAgICAuZGVmYXVsdChbJ2NvbW11bml0eScsICd1bnZlcmlmaWVkJ10pLm5vdE51bGwoKSxcbiAgc2VjcmV0c0FsbG93ZWRUaWVyczogdGV4dCgnc2VjcmV0c19hbGxvd2VkX3RpZXJzJykuYXJyYXkoKS4kdHlwZTxQdWJsaXNoZXJUaWVyW10+KClcbiAgICAuZGVmYXVsdChbJ29mZmljaWFsJywgJ3ZlcmlmaWVkJ10pLm5vdE51bGwoKSxcbiAgYmxvY2tPbkFkdmlzb3J5OiB2YXJjaGFyKCdibG9ja19vbl9hZHZpc29yeScsIHsgbGVuZ3RoOiAxMCB9KS4kdHlwZTxCbG9ja09uQWR2aXNvcnk+KCkuZGVmYXVsdCgnY3JpdGljYWwnKS5ub3ROdWxsKCksXG4gIG9mZmljaWFsSW5zdGFsbHM6IHZhcmNoYXIoJ29mZmljaWFsX2luc3RhbGxzJywgeyBsZW5ndGg6IDEwIH0pLiR0eXBlPE9mZmljaWFsSW5zdGFsbHM+KCkuZGVmYXVsdCgnaW1wbGljaXQnKS5ub3ROdWxsKCksXG4gIGJsb2NrZWRMaXN0aW5nczoganNvbmIoJ2Jsb2NrZWRfbGlzdGluZ3MnKS4kdHlwZTxCbG9ja2VkTGlzdGluZ1JlZltdPigpLmRlZmF1bHQoW10pLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5JyksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgYmxvY2tPbkFkdmlzb3J5Q2hlY2s6IGNoZWNrKCdwbHVnaW5faW5zdGFsbF9wb2xpY2llc19ibG9ja19vbl9hZHZpc29yeV9jaGVjaycsXG4gICAgc3FsYCR7dGFibGUuYmxvY2tPbkFkdmlzb3J5fSBJTiAoJ2NyaXRpY2FsJywgJ2hpZ2gnLCAnbmV2ZXInKWApLFxuICBvZmZpY2lhbEluc3RhbGxzQ2hlY2s6IGNoZWNrKCdwbHVnaW5faW5zdGFsbF9wb2xpY2llc19vZmZpY2lhbF9pbnN0YWxsc19jaGVjaycsXG4gICAgc3FsYCR7dGFibGUub2ZmaWNpYWxJbnN0YWxsc30gSU4gKCdpbXBsaWNpdCcsICdleHBsaWNpdCcpYCksXG4gIHRpZXJzQ2hlY2s6IGNoZWNrKCdwbHVnaW5faW5zdGFsbF9wb2xpY3lfdGllcnNfY2hlY2snLCBzcWxgXG4gICAgJHt0YWJsZS5hbGxvd2VkVGllcnN9IDxAIEFSUkFZWydvZmZpY2lhbCcsICd2ZXJpZmllZCcsICdjb21tdW5pdHknLCAndW52ZXJpZmllZCddOjpURVhUW11cbiAgICBBTkQgJHt0YWJsZS5yZXF1aXJlQXBwcm92YWxUaWVyc30gPEAgQVJSQVlbJ29mZmljaWFsJywgJ3ZlcmlmaWVkJywgJ2NvbW11bml0eScsICd1bnZlcmlmaWVkJ106OlRFWFRbXVxuICAgIEFORCAke3RhYmxlLnNlY3JldHNBbGxvd2VkVGllcnN9IDxAIEFSUkFZWydvZmZpY2lhbCcsICd2ZXJpZmllZCcsICdjb21tdW5pdHknLCAndW52ZXJpZmllZCddOjpURVhUW11gKSxcbn0pKTtcblxuLyoqXG4gKiBOMjEgaWRlbXBvdGVuY3k6IG9uZSBkZWxpdmVyeSBwZXIgKGFkdmlzb3J5LCBpbnN0YWxsaW5nIG9yZyksIHNvIGEgcmV0cmllZFxuICogZmFuLW91dCBuZXZlciBub3RpZmllcyBhbiBvcmcgdHdpY2UuXG4gKlxuICogQHRhYmxlIHBsdWdpbl9hZHZpc29yeV9kZWxpdmVyaWVzXG4gKi9cbmV4cG9ydCBjb25zdCBwbHVnaW5BZHZpc29yeURlbGl2ZXJ5ID0gcGdUYWJsZSgncGx1Z2luX2Fkdmlzb3J5X2RlbGl2ZXJpZXMnLCB7XG4gIGFkdmlzb3J5SWQ6IHV1aWQoJ2Fkdmlzb3J5X2lkJykubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gcGx1Z2luQWR2aXNvcnkuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBkZWxpdmVyZWRBdDogdGltZXN0YW1wKCdkZWxpdmVyZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBwazogcHJpbWFyeUtleSh7IGNvbHVtbnM6IFt0YWJsZS5hZHZpc29yeUlkLCB0YWJsZS5vcmdJZF0gfSksXG4gIG9yZ0lkeDogaW5kZXgoJ3BsdWdpbl9hZHZpc29yeV9kZWxpdmVyeV9vcmdfaWR4Jykub24odGFibGUub3JnSWQpLFxufSkpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyByZWFkIHBhdGgg4oCUIHZpZXdzIGNyZWF0ZWQgYnkgcG9zdGdyZXMtaW5pdC5zcWxcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIGBwdWJsaWNfbGlzdGluZ3NgOiBsaXN0ZWQgYW5kIHVubWFpbnRhaW5lZCBsaXN0aW5ncyBvZiBub24tc3VzcGVuZGVkXG4gKiBwdWJsaXNoZXJzLCBwdWJsaWMgY29sdW1ucyBvbmx5LCBqb2luZWQgd2l0aCB0aGUgcHVibGlzaGVyJ3MgaGFuZGxlL25hbWUvdGllciBhbmQgdGhlIHN0YXRzLlxuICogUmVhZCBhcyBgZWNvc3lzdGVtX3B1YmxpY19yZWFkZXJgIChzZWUgcG9zdGdyZXMtaW5pdC5zcWwpLlxuICovXG5leHBvcnQgY29uc3QgcHVibGljTGlzdGluZ3MgPSBwZ1ZpZXcoJ3B1YmxpY19saXN0aW5ncycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykubm90TnVsbCgpLFxuICBwdWJsaXNoZXJIYW5kbGU6IHZhcmNoYXIoJ3B1Ymxpc2hlcl9oYW5kbGUnLCB7IGxlbmd0aDogMzkgfSkubm90TnVsbCgpLFxuICBwdWJsaXNoZXJEaXNwbGF5TmFtZTogdmFyY2hhcigncHVibGlzaGVyX2Rpc3BsYXlfbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBwdWJsaXNoZXJUaWVyOiB2YXJjaGFyKCdwdWJsaXNoZXJfdGllcicsIHsgbGVuZ3RoOiAyMCB9KS4kdHlwZTxQdWJsaXNoZXJUaWVyPigpLm5vdE51bGwoKSxcbiAgcHVibGlzaGVyVmVyaWZpZWRBdDogdGltZXN0YW1wKCdwdWJsaXNoZXJfdmVyaWZpZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgbmFtZTogdmFyY2hhcignbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBjYXRlZ29yeTogdmFyY2hhcignY2F0ZWdvcnknLCB7IGxlbmd0aDogNTAgfSkubm90TnVsbCgpLFxuICBzdW1tYXJ5OiB2YXJjaGFyKCdzdW1tYXJ5JywgeyBsZW5ndGg6IDMwMCB9KSxcbiAgZGVzY3JpcHRpb246IHRleHQoJ2Rlc2NyaXB0aW9uJyksXG4gIHJlYWRtZUh0bWw6IHRleHQoJ3JlYWRtZV9odG1sJyksXG4gIGxpY2Vuc2U6IHZhcmNoYXIoJ2xpY2Vuc2UnLCB7IGxlbmd0aDogNjQgfSksXG4gIGhvbWVwYWdlVXJsOiB2YXJjaGFyKCdob21lcGFnZV91cmwnLCB7IGxlbmd0aDogMjA0OCB9KSxcbiAgc291cmNlVXJsOiB2YXJjaGFyKCdzb3VyY2VfdXJsJywgeyBsZW5ndGg6IDIwNDggfSksXG4gIGljb246IGpzb25iKCdpY29uJykuJHR5cGU8UGx1Z2luSWNvbj4oKSxcbiAgdXBsb2FkZWRJY29uOiBqc29uYigndXBsb2FkZWRfaWNvbicpLiR0eXBlPFBsdWdpblVwbG9hZGVkSWNvbj4oKSxcbiAga2V5d29yZHM6IGpzb25iKCdrZXl3b3JkcycpLiR0eXBlPHN0cmluZ1tdPigpLm5vdE51bGwoKSxcbiAgZmVhdHVyZWQ6IGJvb2xlYW4oJ2ZlYXR1cmVkJykubm90TnVsbCgpLFxuICBsYXRlc3RWZXJzaW9uOiB2YXJjaGFyKCdsYXRlc3RfdmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KSxcbiAgcGF1c2VkQXQ6IHRpbWVzdGFtcCgncGF1c2VkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHNlYXJjaFZlY3RvcjogdHN2ZWN0b3IoJ3NlYXJjaF92ZWN0b3InKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkubm90TnVsbCgpLFxuICByYXRpbmdCYXllczogZG91YmxlUHJlY2lzaW9uKCdyYXRpbmdfYmF5ZXMnKSxcbiAgcmF0aW5nQ291bnQ6IGludGVnZXIoJ3JhdGluZ19jb3VudCcpLm5vdE51bGwoKSxcbiAgcmF0aW5nRGlzdDoganNvbmIoJ3JhdGluZ19kaXN0JykuJHR5cGU8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4oKSxcbiAgcmVjZW50UmF0aW5nOiBkb3VibGVQcmVjaXNpb24oJ3JlY2VudF9yYXRpbmcnKSxcbiAgaW5zdGFsbENvdW50OiBpbnRlZ2VyKCdpbnN0YWxsX2NvdW50Jykubm90TnVsbCgpLFxuICAvLyBOVUxMIGJlbG93IHRoZSA1LW9yZyBkaXNwbGF5IHRocmVzaG9sZC5cbiAgYWN0aXZlT3JnQ291bnQ6IGludGVnZXIoJ2FjdGl2ZV9vcmdfY291bnQnKSxcbiAgc3VjY2Vzc1JhdGUzMGQ6IGRvdWJsZVByZWNpc2lvbignc3VjY2Vzc19yYXRlXzMwZCcpLFxuICBoZWFsdGhTY29yZTogZG91YmxlUHJlY2lzaW9uKCdoZWFsdGhfc2NvcmUnKSxcbiAgLy8gJ2xpc3RlZCcgfCAndW5tYWludGFpbmVkJyDigJQgdW5tYWludGFpbmVkIHN0YXlzIHB1YmxpYyB3aXRoIGEgYmFubmVyLlxuICBzdGF0ZTogdmFyY2hhcignc3RhdGUnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8TGlzdGluZ1N0YXRlPigpLm5vdE51bGwoKSxcbiAgaGVhbHRoQnJlYWtkb3duOiBqc29uYignaGVhbHRoX2JyZWFrZG93bicpLiR0eXBlPEhlYWx0aEJyZWFrZG93bj4oKSxcbn0pLmV4aXN0aW5nKCk7XG5cbi8qKlxuICogYHB1YmxpY19saXN0ZWRfdmVyc2lvbnNgOiBub24tcGF1c2VkIHZlcnNpb25zIG9mIGxpc3RlZCBsaXN0aW5ncyAoeWFua2VkIG9uZXNcbiAqIGluY2x1ZGVkLCBmbGFnZ2VkKSwgd2l0aCBvbmx5IHRoZSBwdWJsaWMgc3Vic2V0IG9mIHRoZSBmcm96ZW4gc3BlYy5cbiAqL1xuZXhwb3J0IGNvbnN0IHB1YmxpY0xpc3RlZFZlcnNpb25zID0gcGdWaWV3KCdwdWJsaWNfbGlzdGVkX3ZlcnNpb25zJywge1xuICBpZDogdXVpZCgnaWQnKS5ub3ROdWxsKCksXG4gIGxpc3RpbmdJZDogdXVpZCgnbGlzdGluZ19pZCcpLm5vdE51bGwoKSxcbiAgcHVibGlzaGVySGFuZGxlOiB2YXJjaGFyKCdwdWJsaXNoZXJfaGFuZGxlJywgeyBsZW5ndGg6IDM5IH0pLm5vdE51bGwoKSxcbiAgbmFtZTogdmFyY2hhcignbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICB2ZXJzaW9uOiB2YXJjaGFyKCd2ZXJzaW9uJywgeyBsZW5ndGg6IDUwIH0pLm5vdE51bGwoKSxcbiAgaW1hZ2VEaWdlc3Q6IHZhcmNoYXIoJ2ltYWdlX2RpZ2VzdCcsIHsgbGVuZ3RoOiA3MSB9KSxcbiAgaW1hZ2VSZXBvc2l0b3J5OiB2YXJjaGFyKCdpbWFnZV9yZXBvc2l0b3J5JywgeyBsZW5ndGg6IDUxMiB9KSxcbiAgYnJlYWtpbmc6IGJvb2xlYW4oJ2JyZWFraW5nJykubm90TnVsbCgpLFxuICBkZXByZWNhdGVkQXQ6IHRpbWVzdGFtcCgnZGVwcmVjYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjaGFuZ2Vsb2c6IHRleHQoJ2NoYW5nZWxvZycpLFxuICB2dWxuQ3JpdGljYWw6IGludGVnZXIoJ3Z1bG5fY3JpdGljYWwnKSxcbiAgdnVsbkhpZ2g6IGludGVnZXIoJ3Z1bG5faGlnaCcpLFxuICBzY2FubmVkQXQ6IHRpbWVzdGFtcCgnc2Nhbm5lZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBwdWJsaXNoZWRBdDogdGltZXN0YW1wKCdwdWJsaXNoZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5ub3ROdWxsKCksXG4gIHBsdWdpblR5cGU6IHRleHQoJ3BsdWdpbl90eXBlJyksXG4gIGNvbXB1dGVUeXBlOiB0ZXh0KCdjb21wdXRlX3R5cGUnKSxcbiAgc2VjcmV0czoganNvbmIoJ3NlY3JldHMnKS4kdHlwZTxQbHVnaW5TZWNyZXRbXT4oKSxcbiAgcmVxdWlyZWRNZXRhZGF0YToganNvbmIoJ3JlcXVpcmVkX21ldGFkYXRhJykuJHR5cGU8c3RyaW5nW10+KCksXG4gIHJlcXVpcmVkVmFyczoganNvbmIoJ3JlcXVpcmVkX3ZhcnMnKS4kdHlwZTxzdHJpbmdbXT4oKSxcbiAgbmV0d29ya0VncmVzczoganNvbmIoJ25ldHdvcmtfZWdyZXNzJykuJHR5cGU8c3RyaW5nW10+KCksXG4gIHJ1bkFzUm9vdDogYm9vbGVhbigncnVuX2FzX3Jvb3QnKSxcbiAgbGljZW5zZTogdGV4dCgnbGljZW5zZScpLFxuICByZWFkbWVIdG1sOiB0ZXh0KCdyZWFkbWVfaHRtbCcpLFxuICAvLyBZYW5rZWQgdmVyc2lvbnMgc3RheSBsaXN0ZWQgKG1hcmtlZCk7IHRoZSB5YW5rIHJlYXNvbiBpc24ndCBwdWJsaWMuXG4gIHlhbmtlZDogYm9vbGVhbigneWFua2VkJykubm90TnVsbCgpLFxuICBkZXByZWNhdGlvbk1lc3NhZ2U6IHRleHQoJ2RlcHJlY2F0aW9uX21lc3NhZ2UnKSxcbiAgaW1hZ2VTb3VyY2U6IHRleHQoJ2ltYWdlX3NvdXJjZScpLFxuICBiYXNlSW1hZ2VDcmVhdGVkQXQ6IHRpbWVzdGFtcCgnYmFzZV9pbWFnZV9jcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG59KS5leGlzdGluZygpO1xuXG4vKipcbiAqIGBwdWJsaWNfYWR2aXNvcmllc2A6IFBVQkxJU0hFRCBhZHZpc29yaWVzIG9uIGxpc3RlZCBsaXN0aW5ncywgcHVibGljIGNvbHVtbnNcbiAqIG9ubHkgKG5vIHB1Ymxpc2hlci9vcmcgaWRzLCBubyBhdXRob3IsIG5vIGRyYWZ0cyBvciB3aXRoZHJhd24gcm93cykuXG4gKi9cbmV4cG9ydCBjb25zdCBwdWJsaWNBZHZpc29yaWVzID0gcGdWaWV3KCdwdWJsaWNfYWR2aXNvcmllcycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykubm90TnVsbCgpLFxuICBsaXN0aW5nSWQ6IHV1aWQoJ2xpc3RpbmdfaWQnKS5ub3ROdWxsKCksXG4gIHB1Ymxpc2hlckhhbmRsZTogdmFyY2hhcigncHVibGlzaGVyX2hhbmRsZScsIHsgbGVuZ3RoOiAzOSB9KS5ub3ROdWxsKCksXG4gIG5hbWU6IHZhcmNoYXIoJ25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgc2V2ZXJpdHk6IHZhcmNoYXIoJ3NldmVyaXR5JywgeyBsZW5ndGg6IDEwIH0pLiR0eXBlPEFkdmlzb3J5U2V2ZXJpdHk+KCkubm90TnVsbCgpLFxuICBzdW1tYXJ5OiB2YXJjaGFyKCdzdW1tYXJ5JywgeyBsZW5ndGg6IDMwMCB9KS5ub3ROdWxsKCksXG4gIGRldGFpbHNIdG1sOiB0ZXh0KCdkZXRhaWxzX2h0bWwnKSxcbiAgY3ZlSWRzOiB0ZXh0KCdjdmVfaWRzJykuYXJyYXkoKS5ub3ROdWxsKCksXG4gIGFmZmVjdGVkUmFuZ2U6IHZhcmNoYXIoJ2FmZmVjdGVkX3JhbmdlJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGZpeGVkVmVyc2lvbjogdmFyY2hhcignZml4ZWRfdmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KSxcbiAgcHVibGlzaGVkQXQ6IHRpbWVzdGFtcCgncHVibGlzaGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG59KS5leGlzdGluZygpO1xuXG4vKipcbiAqIGBwdWJsaWNfcmV2aWV3c2A6IFBVQkxJU0hFRCByZXZpZXdzIG9mIHB1YmxpYyAobm9uLXBhdXNlZCkgbGlzdGluZ3MsIHB1YmxpY1xuICogY29sdW1ucyBvbmx5IOKAlCB0aGUgYXV0aG9yJ3MgZGlzcGxheSBuYW1lLCBuZXZlciBhIHVzZXIgb3Igb3JnIGlkIOKAlFxuICogd2l0aCB0aGUgcHVibGlzaGVyJ3MgcmVwbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBwdWJsaWNSZXZpZXdzID0gcGdWaWV3KCdwdWJsaWNfcmV2aWV3cycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykubm90TnVsbCgpLFxuICBsaXN0aW5nSWQ6IHV1aWQoJ2xpc3RpbmdfaWQnKS5ub3ROdWxsKCksXG4gIHB1Ymxpc2hlckhhbmRsZTogdmFyY2hhcigncHVibGlzaGVyX2hhbmRsZScsIHsgbGVuZ3RoOiAzOSB9KS5ub3ROdWxsKCksXG4gIG5hbWU6IHZhcmNoYXIoJ25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgdmVyc2lvbjogdmFyY2hhcigndmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KSxcbiAgcmF0aW5nOiBzbWFsbGludCgncmF0aW5nJykubm90TnVsbCgpLFxuICB0aXRsZTogdmFyY2hhcigndGl0bGUnLCB7IGxlbmd0aDogMTIwIH0pLFxuICBib2R5SHRtbDogdGV4dCgnYm9keV9odG1sJyksXG4gIGF1dGhvckRpc3BsYXlOYW1lOiB2YXJjaGFyKCdhdXRob3JfZGlzcGxheV9uYW1lJywgeyBsZW5ndGg6IDEwMCB9KSxcbiAgdmVyaWZpZWRVc2U6IGJvb2xlYW4oJ3ZlcmlmaWVkX3VzZScpLm5vdE51bGwoKSxcbiAgaGVscGZ1bENvdW50OiBpbnRlZ2VyKCdoZWxwZnVsX2NvdW50Jykubm90TnVsbCgpLFxuICBlZGl0ZWQ6IGJvb2xlYW4oJ2VkaXRlZCcpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkubm90TnVsbCgpLFxuICBwdWJsaXNoZXJEaXNwbGF5TmFtZTogdmFyY2hhcigncHVibGlzaGVyX2Rpc3BsYXlfbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICByZXBseUJvZHlIdG1sOiB0ZXh0KCdyZXBseV9ib2R5X2h0bWwnKSxcbiAgcmVwbHlDcmVhdGVkQXQ6IHRpbWVzdGFtcCgncmVwbHlfY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICByZXBseVVwZGF0ZWRBdDogdGltZXN0YW1wKCdyZXBseV91cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG59KS5leGlzdGluZygpO1xuXG4vKiogVGhlIG9mZmljaWFsIHB1Ymxpc2hlcidzIGhhbmRsZSAodGhlIHN5c3RlbSBvcmcncyBjYXRhbG9nKS4gKi9cbmV4cG9ydCBjb25zdCBPRkZJQ0lBTF9QVUJMSVNIRVJfSEFORExFID0gJ3BpcGVsaW5lLWJ1aWxkZXInO1xuLyoqIFRoZSBwbGF0Zm9ybS1vd25lZCBwdWJsaXNoZXIgYW5vbnltb3VzIHN1Ym1pc3Npb25zIGxhbmQgdW5kZXIuICovXG5leHBvcnQgY29uc3QgQ09NTVVOSVRZX1BVQkxJU0hFUl9IQU5ETEUgPSAnY29tbXVuaXR5JztcblxuLyoqIEZpeGVkIGlkcyBvZiB0aGUgdHdvIGF1dG8tYXBwcm92YWwgcnVsZXMgcG9zdGdyZXMtaW5pdC5zcWwgc2VlZHMuICovXG5leHBvcnQgY29uc3QgU0VFREVEX0FVVE9fQVBQUk9WQUxfUlVMRV9JRFMgPSB7XG4gIHZlcmlmaWVkVXBkYXRlczogJzAwMDAwMDAwLTAwMDAtNDAwMC04MDAwLTAwMDAwMDAwYTAwMScsXG4gIG9mZmljaWFsQ2F0YWxvZzogJzAwMDAwMDAwLTAwMDAtNDAwMC04MDAwLTAwMDAwMDAwYTAwMicsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgdHlwZXMgcmVwcmVzZW50aW5nIGRhdGFiYXNlIHJvd3NcbiAqL1xuZXhwb3J0IHR5cGUgUHVibGlzaGVyID0gdHlwZW9mIHB1Ymxpc2hlci4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQdWJsaXNoZXJJbnNlcnQgPSB0eXBlb2YgcHVibGlzaGVyLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUGx1Z2luTGlzdGluZyA9IHR5cGVvZiBwbHVnaW5MaXN0aW5nLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBsdWdpbkxpc3RpbmdJbnNlcnQgPSB0eXBlb2YgcGx1Z2luTGlzdGluZy4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBsdWdpbkxpc3RpbmdWZXJzaW9uID0gdHlwZW9mIHBsdWdpbkxpc3RpbmdWZXJzaW9uLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBsdWdpbkxpc3RpbmdWZXJzaW9uSW5zZXJ0ID0gdHlwZW9mIHBsdWdpbkxpc3RpbmdWZXJzaW9uLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUGx1Z2luQWR2aXNvcnkgPSB0eXBlb2YgcGx1Z2luQWR2aXNvcnkuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUGx1Z2luQWR2aXNvcnlJbnNlcnQgPSB0eXBlb2YgcGx1Z2luQWR2aXNvcnkuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBFY29zeXN0ZW1BdXRvQXBwcm92YWxSdWxlID0gdHlwZW9mIGVjb3N5c3RlbUF1dG9BcHByb3ZhbFJ1bGUuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgRWNvc3lzdGVtQXV0b0FwcHJvdmFsUnVsZUluc2VydCA9IHR5cGVvZiBlY29zeXN0ZW1BdXRvQXBwcm92YWxSdWxlLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUGx1Z2luUHVibGlzaFJlcXVlc3QgPSB0eXBlb2YgcGx1Z2luUHVibGlzaFJlcXVlc3QuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUGx1Z2luUHVibGlzaFJlcXVlc3RJbnNlcnQgPSB0eXBlb2YgcGx1Z2luUHVibGlzaFJlcXVlc3QuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBFY29zeXN0ZW1SZXNlcnZlZE5hbWUgPSB0eXBlb2YgZWNvc3lzdGVtUmVzZXJ2ZWROYW1lLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIEVjb3N5c3RlbVJlc2VydmVkTmFtZUluc2VydCA9IHR5cGVvZiBlY29zeXN0ZW1SZXNlcnZlZE5hbWUuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBFY29zeXN0ZW1TZXR0aW5nID0gdHlwZW9mIGVjb3N5c3RlbVNldHRpbmcuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgRWNvc3lzdGVtU2V0dGluZ0luc2VydCA9IHR5cGVvZiBlY29zeXN0ZW1TZXR0aW5nLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgRWNvc3lzdGVtQ29sbGVjdGlvbiA9IHR5cGVvZiBlY29zeXN0ZW1Db2xsZWN0aW9uLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIEVjb3N5c3RlbUNvbGxlY3Rpb25JbnNlcnQgPSB0eXBlb2YgZWNvc3lzdGVtQ29sbGVjdGlvbi4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBsdWdpblJldmlldyA9IHR5cGVvZiBwbHVnaW5SZXZpZXcuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUGx1Z2luUmV2aWV3SW5zZXJ0ID0gdHlwZW9mIHBsdWdpblJldmlldy4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBsdWdpblJldmlld1JlcGx5ID0gdHlwZW9mIHBsdWdpblJldmlld1JlcGx5LiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBsdWdpblJldmlld1JlcGx5SW5zZXJ0ID0gdHlwZW9mIHBsdWdpblJldmlld1JlcGx5LiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUGx1Z2luUmV2aWV3UmVwb3J0ID0gdHlwZW9mIHBsdWdpblJldmlld1JlcG9ydC4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQbHVnaW5SZXZpZXdSZXBvcnRJbnNlcnQgPSB0eXBlb2YgcGx1Z2luUmV2aWV3UmVwb3J0LiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUGx1Z2luUmV2aWV3Vm90ZSA9IHR5cGVvZiBwbHVnaW5SZXZpZXdWb3RlLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBsdWdpblJldmlld1ZvdGVJbnNlcnQgPSB0eXBlb2YgcGx1Z2luUmV2aWV3Vm90ZS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBsdWdpblJldmlld0hpc3RvcnkgPSB0eXBlb2YgcGx1Z2luUmV2aWV3SGlzdG9yeS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQbHVnaW5SZXZpZXdIaXN0b3J5SW5zZXJ0ID0gdHlwZW9mIHBsdWdpblJldmlld0hpc3RvcnkuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBQbHVnaW5TdGF0cyA9IHR5cGVvZiBwbHVnaW5TdGF0cy4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQbHVnaW5TdGF0c0luc2VydCA9IHR5cGVvZiBwbHVnaW5TdGF0cy4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBsdWdpblN1Ym1pc3Npb24gPSB0eXBlb2YgcGx1Z2luU3VibWlzc2lvbi4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQbHVnaW5TdWJtaXNzaW9uSW5zZXJ0ID0gdHlwZW9mIHBsdWdpblN1Ym1pc3Npb24uJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBFY29zeXN0ZW1TZWFyY2hNaXNzID0gdHlwZW9mIGVjb3N5c3RlbVNlYXJjaE1pc3MuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgRWNvc3lzdGVtU2VhcmNoTWlzc0luc2VydCA9IHR5cGVvZiBlY29zeXN0ZW1TZWFyY2hNaXNzLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgRWNvc3lzdGVtTm90aWZpY2F0aW9uID0gdHlwZW9mIGVjb3N5c3RlbU5vdGlmaWNhdGlvblF1ZXVlLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIEVjb3N5c3RlbU5vdGlmaWNhdGlvbkluc2VydCA9IHR5cGVvZiBlY29zeXN0ZW1Ob3RpZmljYXRpb25RdWV1ZS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBpcGVsaW5lU3RlcE1hbmlmZXN0ID0gdHlwZW9mIHBpcGVsaW5lU3RlcE1hbmlmZXN0LiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBpcGVsaW5lU3RlcE1hbmlmZXN0SW5zZXJ0ID0gdHlwZW9mIHBpcGVsaW5lU3RlcE1hbmlmZXN0LiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUGx1Z2luSW5zdGFsbCA9IHR5cGVvZiBwbHVnaW5JbnN0YWxsLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBsdWdpbkluc3RhbGxJbnNlcnQgPSB0eXBlb2YgcGx1Z2luSW5zdGFsbC4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBsdWdpbkluc3RhbGxQb2xpY3kgPSB0eXBlb2YgcGx1Z2luSW5zdGFsbFBvbGljeS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQbHVnaW5JbnN0YWxsUG9saWN5SW5zZXJ0ID0gdHlwZW9mIHBsdWdpbkluc3RhbGxQb2xpY3kuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBQbHVnaW5BZHZpc29yeURlbGl2ZXJ5ID0gdHlwZW9mIHBsdWdpbkFkdmlzb3J5RGVsaXZlcnkuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUGx1Z2luQWR2aXNvcnlEZWxpdmVyeUluc2VydCA9IHR5cGVvZiBwbHVnaW5BZHZpc29yeURlbGl2ZXJ5LiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUHVibGljTGlzdGluZyA9IHR5cGVvZiBwdWJsaWNMaXN0aW5ncy4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQdWJsaWNMaXN0ZWRWZXJzaW9uID0gdHlwZW9mIHB1YmxpY0xpc3RlZFZlcnNpb25zLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFB1YmxpY0Fkdmlzb3J5ID0gdHlwZW9mIHB1YmxpY0Fkdmlzb3JpZXMuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUHVibGljUmV2aWV3ID0gdHlwZW9mIHB1YmxpY1Jldmlld3MuJGluZmVyU2VsZWN0O1xuIl19
|