@pipeline-builder/pipeline-data 4.1.21 → 4.1.23
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/crud-service.js +2 -71
- package/lib/api/keyset-cursor.d.ts +38 -0
- package/lib/api/keyset-cursor.js +82 -0
- package/lib/api/plugin-advisories.d.ts +30 -0
- package/lib/api/plugin-advisories.js +89 -0
- package/lib/api/plugin-consumption-policy.d.ts +44 -0
- package/lib/api/plugin-consumption-policy.js +133 -0
- package/lib/api/plugin-resolution.d.ts +2 -54
- package/lib/api/plugin-resolution.js +5 -211
- package/lib/api/public-directory.d.ts +3 -7
- package/lib/api/public-directory.js +2 -2
- package/lib/api/reporting/caches.d.ts +5 -0
- package/lib/api/reporting/caches.js +11 -1
- package/lib/api/reporting/dora-scoring.d.ts +1 -1
- package/lib/api/reporting/dora-scoring.js +2 -2
- package/lib/api/reporting/ingest.d.ts +11 -0
- package/lib/api/reporting/ingest.js +210 -0
- package/lib/api/reporting/retention-sweep.d.ts +17 -0
- package/lib/api/reporting/retention-sweep.js +155 -0
- package/lib/api/reporting/retention.d.ts +1 -1
- package/lib/api/reporting/retention.js +2 -2
- package/lib/api/reporting-service.d.ts +5 -18
- package/lib/api/reporting-service.js +17 -333
- package/lib/database/index.d.ts +2 -2
- package/lib/database/index.js +2 -2
- package/lib/database/retry-strategy.d.ts +0 -6
- package/lib/database/retry-strategy.js +4 -12
- package/lib/database/schema/ecosystem.d.ts +9 -7
- package/lib/database/schema/ecosystem.js +1 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.js +4 -2
- package/lib/testing/exports.json +0 -1
- package/package.json +4 -4
|
@@ -35,128 +35,10 @@
|
|
|
35
35
|
*/
|
|
36
36
|
import { asScanFlag, blockOnNewCritical, vulnBlockedMessage, vulnFlaggedWarning, } from '@pipeline-builder/api-core';
|
|
37
37
|
import { and, eq, inArray } from 'drizzle-orm';
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
allowedTiers: ['official', 'verified'],
|
|
43
|
-
requireApprovalTiers: ['community', 'unverified'],
|
|
44
|
-
secretsAllowedTiers: ['official', 'verified'],
|
|
45
|
-
blockOnAdvisory: 'critical',
|
|
46
|
-
officialInstalls: 'implicit',
|
|
47
|
-
blockedListings: [],
|
|
48
|
-
});
|
|
49
|
-
/** At most this many blocked listings per policy. */
|
|
50
|
-
export const MAX_BLOCKED_LISTINGS = 500;
|
|
51
|
-
const BLOCK_ORDER = ['never', 'critical', 'high'];
|
|
52
|
-
const sortTiers = (tiers) => PUBLISHER_TIERS.filter((t) => new Set(tiers).has(t));
|
|
53
|
-
const listingKey = (r) => `${r.publisher}/${r.name}`;
|
|
54
|
-
function uniqueListings(refs) {
|
|
55
|
-
const seen = new Map();
|
|
56
|
-
for (const r of refs)
|
|
57
|
-
seen.set(listingKey(r), { publisher: r.publisher, name: r.name });
|
|
58
|
-
return [...seen.values()].sort((a, b) => listingKey(a).localeCompare(listingKey(b)));
|
|
59
|
-
}
|
|
60
|
-
/** A stored policy row (or none) as a {@link ConsumptionPolicy}. */
|
|
61
|
-
export function policyOf(row) {
|
|
62
|
-
const d = DEFAULT_CONSUMPTION_POLICY;
|
|
63
|
-
return {
|
|
64
|
-
allowedTiers: sortTiers(row?.allowedTiers ?? d.allowedTiers),
|
|
65
|
-
requireApprovalTiers: sortTiers(row?.requireApprovalTiers ?? d.requireApprovalTiers),
|
|
66
|
-
secretsAllowedTiers: sortTiers(row?.secretsAllowedTiers ?? d.secretsAllowedTiers),
|
|
67
|
-
blockOnAdvisory: row?.blockOnAdvisory ?? d.blockOnAdvisory,
|
|
68
|
-
officialInstalls: row?.officialInstalls ?? d.officialInstalls,
|
|
69
|
-
blockedListings: uniqueListings(row?.blockedListings ?? d.blockedListings),
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* A team's policy under its root org's: each field takes the STRICTER of
|
|
74
|
-
* the two, so a team can narrow what its root allows but never widen it.
|
|
75
|
-
*/
|
|
76
|
-
export function mergeConsumptionPolicies(root, team) {
|
|
77
|
-
const intersect = (a, b) => sortTiers(a.filter((t) => b.includes(t)));
|
|
78
|
-
const union = (a, b) => sortTiers([...a, ...b]);
|
|
79
|
-
const stricterBlock = BLOCK_ORDER.indexOf(root.blockOnAdvisory) >= BLOCK_ORDER.indexOf(team.blockOnAdvisory)
|
|
80
|
-
? root.blockOnAdvisory : team.blockOnAdvisory;
|
|
81
|
-
return {
|
|
82
|
-
allowedTiers: intersect(root.allowedTiers, team.allowedTiers),
|
|
83
|
-
requireApprovalTiers: union(root.requireApprovalTiers, team.requireApprovalTiers),
|
|
84
|
-
secretsAllowedTiers: intersect(root.secretsAllowedTiers, team.secretsAllowedTiers),
|
|
85
|
-
blockOnAdvisory: stricterBlock,
|
|
86
|
-
officialInstalls: root.officialInstalls === 'explicit' || team.officialInstalls === 'explicit' ? 'explicit' : 'implicit',
|
|
87
|
-
blockedListings: uniqueListings([...root.blockedListings, ...team.blockedListings]),
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* The policy an org's resolution runs under. A root org: its own row (or the
|
|
92
|
-
* defaults). A team (`rootOrgId` set): its root's policy, merged with the
|
|
93
|
-
* team's own row when it has one.
|
|
94
|
-
*/
|
|
95
|
-
export function effectiveConsumptionPolicy(rows, orgId, rootOrgId) {
|
|
96
|
-
const own = rows.find((r) => r.orgId === orgId) ?? null;
|
|
97
|
-
if (!rootOrgId || rootOrgId === orgId)
|
|
98
|
-
return policyOf(own);
|
|
99
|
-
const root = policyOf(rows.find((r) => r.orgId === rootOrgId) ?? null);
|
|
100
|
-
return own ? mergeConsumptionPolicies(root, policyOf(own)) : root;
|
|
101
|
-
}
|
|
102
|
-
const HANDLE_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
103
|
-
const NAME_RE = /^[a-z0-9][a-z0-9._-]*$/;
|
|
104
|
-
function tierList(v, field) {
|
|
105
|
-
if (!Array.isArray(v))
|
|
106
|
-
return `${field} must be an array of tiers`;
|
|
107
|
-
const bad = v.filter((t) => !PUBLISHER_TIERS.includes(t));
|
|
108
|
-
if (bad.length)
|
|
109
|
-
return `${field} has unknown tiers: ${bad.map(String).join(', ')}`;
|
|
110
|
-
return sortTiers(v);
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Validate a (partial) policy update over `base`. Returns the full new policy,
|
|
114
|
-
* or an error message. `blockedListings` entries are `{ publisher, name }` or
|
|
115
|
-
* `"publisher/name"`.
|
|
116
|
-
*/
|
|
117
|
-
export function applyPolicyUpdate(base, input) {
|
|
118
|
-
if (!input || typeof input !== 'object' || Array.isArray(input))
|
|
119
|
-
return 'body must be an object';
|
|
120
|
-
const b = input;
|
|
121
|
-
const next = { ...base };
|
|
122
|
-
for (const field of ['allowedTiers', 'requireApprovalTiers', 'secretsAllowedTiers']) {
|
|
123
|
-
if (b[field] === undefined)
|
|
124
|
-
continue;
|
|
125
|
-
const tiers = tierList(b[field], field);
|
|
126
|
-
if (typeof tiers === 'string')
|
|
127
|
-
return tiers;
|
|
128
|
-
next[field] = tiers;
|
|
129
|
-
}
|
|
130
|
-
if (b.blockOnAdvisory !== undefined) {
|
|
131
|
-
if (!BLOCK_ORDER.includes(b.blockOnAdvisory))
|
|
132
|
-
return 'blockOnAdvisory must be critical, high or never';
|
|
133
|
-
next.blockOnAdvisory = b.blockOnAdvisory;
|
|
134
|
-
}
|
|
135
|
-
if (b.officialInstalls !== undefined) {
|
|
136
|
-
if (b.officialInstalls !== 'implicit' && b.officialInstalls !== 'explicit')
|
|
137
|
-
return 'officialInstalls must be implicit or explicit';
|
|
138
|
-
next.officialInstalls = b.officialInstalls;
|
|
139
|
-
}
|
|
140
|
-
if (b.blockedListings !== undefined) {
|
|
141
|
-
if (!Array.isArray(b.blockedListings))
|
|
142
|
-
return 'blockedListings must be an array';
|
|
143
|
-
if (b.blockedListings.length > MAX_BLOCKED_LISTINGS)
|
|
144
|
-
return `at most ${MAX_BLOCKED_LISTINGS} blocked listings`;
|
|
145
|
-
const refs = [];
|
|
146
|
-
for (const raw of b.blockedListings) {
|
|
147
|
-
const ref = typeof raw === 'string'
|
|
148
|
-
? (() => { const [publisher, name, extra] = raw.split('/'); return extra === undefined ? { publisher, name } : null; })()
|
|
149
|
-
: raw && typeof raw === 'object' ? { publisher: raw.publisher, name: raw.name } : null;
|
|
150
|
-
if (!ref || typeof ref.publisher !== 'string' || typeof ref.name !== 'string'
|
|
151
|
-
|| !HANDLE_RE.test(ref.publisher) || !NAME_RE.test(ref.name)) {
|
|
152
|
-
return 'each blocked listing must be { publisher, name } (or "publisher/name")';
|
|
153
|
-
}
|
|
154
|
-
refs.push({ publisher: ref.publisher, name: ref.name });
|
|
155
|
-
}
|
|
156
|
-
next.blockedListings = uniqueListings(refs);
|
|
157
|
-
}
|
|
158
|
-
return next;
|
|
159
|
-
}
|
|
38
|
+
import { advisoriesCovering, blockingAdvisories } from './plugin-advisories.js';
|
|
39
|
+
import { effectiveConsumptionPolicy } from './plugin-consumption-policy.js';
|
|
40
|
+
import { compareSemver, isVersionRange, parseSemver, satisfiesVersionSpec, } from './semver-range.js';
|
|
41
|
+
import { OFFICIAL_PUBLISHER_HANDLE, schema, } from '../database/drizzle-schema.js';
|
|
160
42
|
/** Whether `policy` (or the listing's own state) refuses the listing outright. */
|
|
161
43
|
export function listingBlock(policy, publisher, listing) {
|
|
162
44
|
const ref = `${publisher.handle}/${listing.name}`;
|
|
@@ -177,94 +59,6 @@ export function blockRefusal(block) {
|
|
|
177
59
|
? { code: 'PLUGIN_UNAVAILABLE', reason: 'suspended', message: block.message }
|
|
178
60
|
: { code: 'PLUGIN_BLOCKED_BY_POLICY', reason: block.reason, message: block.message };
|
|
179
61
|
}
|
|
180
|
-
// -----------------------------------------------------------------------------
|
|
181
|
-
// Advisories
|
|
182
|
-
// -----------------------------------------------------------------------------
|
|
183
|
-
/** Severities each `blockOnAdvisory` setting blocks. */
|
|
184
|
-
export const ADVISORY_BLOCK_SEVERITIES = {
|
|
185
|
-
critical: ['critical'],
|
|
186
|
-
high: ['critical', 'high'],
|
|
187
|
-
never: [],
|
|
188
|
-
};
|
|
189
|
-
const COMPARATOR = /^(>=|<=|>|<|=)?\s*v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)$/;
|
|
190
|
-
/** One comparator set (`>=1.0.0 <1.2.3`, `^1.2`, `1.x`, `1.0.0 - 1.2.0`) against `version`. */
|
|
191
|
-
function comparatorSetCovers(set, version) {
|
|
192
|
-
const hyphen = /^(\S+)\s+-\s+(\S+)$/.exec(set);
|
|
193
|
-
if (hyphen)
|
|
194
|
-
return compareSemver(version, hyphen[1]) >= 0 && compareSemver(version, hyphen[2]) <= 0;
|
|
195
|
-
const parts = set.split(/\s+/).filter(Boolean);
|
|
196
|
-
if (parts.length === 1 && parseVersionSpec(parts[0]))
|
|
197
|
-
return satisfiesVersionSpec(version, parts[0]);
|
|
198
|
-
return parts.every((p) => {
|
|
199
|
-
const m = COMPARATOR.exec(p);
|
|
200
|
-
if (!m)
|
|
201
|
-
return false;
|
|
202
|
-
const c = compareSemver(version, m[2]);
|
|
203
|
-
switch (m[1] ?? '=') {
|
|
204
|
-
case '>=': return c >= 0;
|
|
205
|
-
case '<=': return c <= 0;
|
|
206
|
-
case '>': return c > 0;
|
|
207
|
-
case '<': return c < 0;
|
|
208
|
-
default: return c === 0;
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Whether an advisory's `affectedRange` covers `version`: `||`-separated
|
|
214
|
-
* comparator sets, each either the lookup spec forms (`^`, `~`, partial,
|
|
215
|
-
* exact) or space-separated comparators (`>=1.0.0 <1.2.3`) or a hyphen range.
|
|
216
|
-
* `*` covers everything; an unparseable range covers nothing.
|
|
217
|
-
*/
|
|
218
|
-
export function advisoryRangeCovers(range, version) {
|
|
219
|
-
if (!parseSemver(version))
|
|
220
|
-
return false;
|
|
221
|
-
return range.split('||').map((s) => s.trim()).some((set) => set === '*' || (set !== '' && comparatorSetCovers(set, version)));
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Why `range` isn't a usable advisory range (the forms {@link advisoryRangeCovers}
|
|
225
|
-
* understands), or null when it is. An advisory whose range parses as nothing
|
|
226
|
-
* would silently cover nothing, so drafts are refused instead.
|
|
227
|
-
*/
|
|
228
|
-
export function advisoryRangeProblem(range) {
|
|
229
|
-
const trimmed = range.trim();
|
|
230
|
-
if (trimmed === '')
|
|
231
|
-
return 'the affected range is empty';
|
|
232
|
-
if (trimmed.length > 255)
|
|
233
|
-
return 'the affected range is longer than 255 characters';
|
|
234
|
-
for (const set of trimmed.split('||').map((x) => x.trim())) {
|
|
235
|
-
if (set === '*')
|
|
236
|
-
continue;
|
|
237
|
-
if (set === '')
|
|
238
|
-
return 'the affected range has an empty "||" alternative';
|
|
239
|
-
const hyphen = /^(\S+)\s+-\s+(\S+)$/.exec(set);
|
|
240
|
-
if (hyphen) {
|
|
241
|
-
if (!parseSemver(hyphen[1]) || !parseSemver(hyphen[2]))
|
|
242
|
-
return `"${set}" is not a valid hyphen range`;
|
|
243
|
-
continue;
|
|
244
|
-
}
|
|
245
|
-
const parts = set.split(/\s+/).filter(Boolean);
|
|
246
|
-
if (parts.length === 1 && parts[0] !== 'latest' && parseVersionSpec(parts[0]))
|
|
247
|
-
continue;
|
|
248
|
-
const bad = parts.find((x) => !COMPARATOR.test(x));
|
|
249
|
-
if (bad !== undefined)
|
|
250
|
-
return `"${bad}" is not a version, a ^/~ range or a comparator (>=, <=, >, <, =)`;
|
|
251
|
-
}
|
|
252
|
-
return null;
|
|
253
|
-
}
|
|
254
|
-
/** The PUBLISHED advisories whose range covers `version` (any severity), most severe first. */
|
|
255
|
-
export function advisoriesCovering(advisories, version) {
|
|
256
|
-
const rank = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
257
|
-
return advisories
|
|
258
|
-
.filter((a) => a.state === 'published' && advisoryRangeCovers(a.affectedRange, version))
|
|
259
|
-
.sort((a, b) => rank[a.severity] - rank[b.severity]);
|
|
260
|
-
}
|
|
261
|
-
/** The PUBLISHED advisories the policy blocks `version` for. */
|
|
262
|
-
export function blockingAdvisories(advisories, version, policy) {
|
|
263
|
-
const severities = ADVISORY_BLOCK_SEVERITIES[policy.blockOnAdvisory];
|
|
264
|
-
if (severities.length === 0)
|
|
265
|
-
return [];
|
|
266
|
-
return advisories.filter((a) => a.state === 'published' && severities.includes(a.severity) && advisoryRangeCovers(a.affectedRange, version));
|
|
267
|
-
}
|
|
268
62
|
/** The refusal an exact pin to a flagged version gets while blocking (409). */
|
|
269
63
|
function vulnRefusal(ref, v) {
|
|
270
64
|
const flag = asScanFlag(v.scanFlag) ?? { critical: 0, high: 0, maxCritical: 0, findings: [] };
|
|
@@ -677,4 +471,4 @@ export async function resolvableListings(source, scope, filter = {}) {
|
|
|
677
471
|
return (await orgListingStates(source, scope, filter))
|
|
678
472
|
.filter((s) => s.resolved !== null);
|
|
679
473
|
}
|
|
680
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3BsdWdpbi1yZXNvbHV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxFQUNMLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsR0FDdkUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFL0MsT0FBTyxFQUNMLGFBQWEsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixHQUNuRixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsZUFBZSxFQUNmLE1BQU0sR0FhUCxNQUFNLCtCQUErQixDQUFDO0FBZ0J2QywyRUFBMkU7QUFDM0UsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWdDLE1BQU0sQ0FBQyxNQUFNLENBQW9CO0lBQ3RHLFlBQVksRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7SUFDdEMsb0JBQW9CLEVBQUUsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDO0lBQ2pELG1CQUFtQixFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztJQUM3QyxlQUFlLEVBQUUsVUFBVTtJQUMzQixnQkFBZ0IsRUFBRSxVQUFVO0lBQzVCLGVBQWUsRUFBRSxFQUFFO0NBQ3BCLENBQUMsQ0FBQztBQUVILHFEQUFxRDtBQUNyRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFFeEMsTUFBTSxXQUFXLEdBQStCLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUU5RSxNQUFNLFNB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RTtZQUNsQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUNyRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUN6RCxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FDbEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFDNUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUNsRCxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ3pELENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RyxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3SSxlQUFlLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0csZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ2hILENBQUM7QUFDSixDQUFDO0FBb0NEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QixDQUMzQyxNQUF5QixFQUN6QixHQUFxQixFQUNyQixLQUFzQjtJQUV0QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUyxJQUFJLHlCQUF5QixDQUFDO0lBQzFELE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELElBQUksQ0FBQyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDNUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25FLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFMUIsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqSCxNQUFNLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELElBQUksS0FBSztRQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBRWxGLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekUsSUFBSSxNQUFNLElBQUksSUFBSTtRQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBRTVFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDM0MsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNuRCxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMvRyxJQUFJLFNBQVMsSUFBSSxNQUFNO1FBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBRTNGLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDL0IsTUFBTSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2pILE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQzVGLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FPckM7SUFDQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQztJQUNsRSxNQUFNLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xELE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN6RSxNQUFNLGVBQWUsR0FBRyxlQUFlLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRyxNQUFNLFFBQVEsR0FBd0IsRUFBRSxDQUFDO0lBQ3pDLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxjQUFjLEVBQUUsQ0FBQztRQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUcsK0RBQStELEVBQUUsQ0FBQyxDQUFDO0lBQ2xJLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxpQkFBaUIsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDMUssQ0FBQztJQUNELEtBQUssTUFBTSxDQUFDLElBQUksa0JBQWtCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2hFLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDWixJQUFJLEVBQUUsaUJBQWlCO1lBQ3ZCLE9BQU8sRUFBRSxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxxQkFBcUIsQ0FBQyxDQUFDLFFBQVEsdUJBQXVCLENBQUMsQ0FBQyxPQUFPLEVBQUU7a0JBQy9GLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtTQUM5RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pFLElBQUksSUFBSTtRQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4RSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsT0FBTyxFQUFFLEdBQUcsR0FBRyxTQUFTLFNBQVMsQ0FBQyxJQUFJLG9HQUFvRyxFQUFFLENBQUMsQ0FBQztJQUNqTSxDQUFDO0lBQ0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsR0FBb0I7SUFDckQsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUNsRCxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUE0QixDQUFDO0lBQ2xFLE1BQU0sR0FBRyxHQUFHLENBQUksQ0FBVSxFQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFVLEVBQTJCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUE0QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzSSxPQUFPO1FBQ0wsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1FBQ2QsTUFBTSxFQUFFLFNBQVM7UUFDakIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxNQUFNO1FBQzNCLGFBQWEsRUFBRSxTQUFTLENBQUMsSUFBSTtRQUM3QixTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2xCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlO1FBQ3hDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUNsSCxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsSUFBSSxlQUFlO1FBQzNDLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVyxJQUFJLE9BQU87UUFDckMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJO1FBQ3pELE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSTtRQUM3QyxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFJO1FBQ2xDLFFBQVEsRUFBRSxHQUFHLENBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUNqQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUTtRQUN4QyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDekIsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2YsU0FBUyxFQUFFLEVBQUU7UUFDYixlQUFlLEVBQUUsR0FBRyxDQUFTLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFDL0MsUUFBUSxFQUFFLEdBQUcsQ0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ2pDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLElBQUk7UUFDMUIsZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlLElBQUksTUFBTTtRQUM1QyxzQkFBc0IsRUFBRSxDQUFDLENBQUMsc0JBQXNCLElBQUksSUFBSTtRQUN4RCxPQUFPLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNsRCxnQkFBZ0IsRUFBRSxHQUFHLENBQVMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO1FBQ2pELFlBQVksRUFBRSxHQUFHLENBQVMsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUN6QyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDbkMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzNCLGFBQWEsRUFBRSxHQUFHLENBQVMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUMzQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJO1FBQzlCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSTtRQUM3QyxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsV0FBVyxJQUFJLElBQUk7UUFDekQsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFJO1FBQ25ELGdCQUFnQixFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJO1FBQzVDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSTtRQUNwQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtRQUNsQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLG1CQUFtQjtRQUNoRCxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7UUFDeEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYTtRQUNwQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWTtRQUM3RCxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7UUFDbEMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtRQUM5QyxRQUFRLEVBQUUsSUFBSTtRQUNkLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLFVBQVUsRUFBRSxRQUFRO1FBQ3BCLFNBQVMsRUFBRSxJQUFJO1FBQ2YsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDO0FBQ0osQ0FBQztBQWtDRCw4Q0FBOEM7QUFDOUMsTUFBTSxDQUFDLEtBQUssVUFBVSxxQkFBcUIsQ0FBQyxNQUF5QixFQUFFLEtBQXNCO0lBQzNGLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakgsT0FBTyxFQUFFLE1BQU0sRUFBRSwwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNsRyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsTUFBeUIsRUFDekIsS0FBc0IsRUFDdEIsTUFBTSxHQUF5QyxFQUFFLEVBQ2pELEdBQXVCO0lBRXZCLE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxNQUFNLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRSxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0MsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEMsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQztRQUMvQixNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDO0tBQ2xDLENBQUMsQ0FBQztJQUNILE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEQsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDO0lBQ25DLE1BQU0sR0FBRyxHQUFzQixFQUFFLENBQUM7SUFDbEMsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUMzQixNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUztZQUFFLFNBQVM7UUFDekIsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RixNQUFNLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLElBQUksUUFBUSxHQUFnQyxJQUFJLENBQUM7UUFDakQsSUFBSSxPQUFPLEdBQTZCLElBQUksQ0FBQztRQUM3QyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQztnQkFDbEMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTthQUN0SCxDQUFDLENBQUM7WUFDSCxJQUFJLFNBQVMsSUFBSSxNQUFNO2dCQUFFLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDOztnQkFDOUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDaEMsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUM7UUFDckgsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDcEosQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELDRGQUE0RjtBQUM1RixNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxNQUF5QixFQUN6QixLQUFzQixFQUN0QixNQUFNLEdBQXlCLEVBQUU7SUFFakMsT0FBTyxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNuRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQTZELEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQ25HLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBSZXNvbHZpbmcgYSBwbHVnaW4gcmVmZXJlbmNlIHRvIGFuIGVjb3N5c3RlbSBMSVNUSU5HIHZlcnNpb24gdGhyb3VnaCB0aGVcbiAqIG9yZydzIGluc3RhbGwgKGRvY3MvcGx1Z2luLWluc3RhbGxpbmcubWQpLlxuICpcbiAqIE9uZSBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYnkgZXZlcnkgcGxhY2UgdGhhdCBhbnN3ZXJzIFwid2hpY2ggbGlzdGVkIHZlcnNpb25cbiAqIGRvZXMgdGhpcyBvcmcncyByZWZlcmVuY2UgcnVuP1wiOiB0aGUgcGx1Z2luIHNlcnZpY2UncyBgL3BsdWdpbnMvbG9va3VwYCAod2hhdFxuICogc3ludGggcGlucyksIHRoZSBwaXBlbGluZSBzZXJ2aWNlJ3MgY29udHJhY3QgY2hlY2sgYXQgcGlwZWxpbmUgY3JlYXRlLCB0aGUgQUlcbiAqIGdlbmVyYXRvcidzIHBsdWdpbiBsaXN0IGFuZCB0aGUgcGxhY2Vob2xkZXIgZ3VhcmQuIFRoZSBkZWNpc2lvbnMgYXJlIFBVUkVcbiAqIGZ1bmN0aW9ucyBvdmVyIGxvYWRlZCByb3dzOyB0aGUgcm93cyBjb21lIHRocm91Z2ggYSB7QGxpbmsgTGlzdGluZ0RhdGFTb3VyY2V9XG4gKiBzbyBlYWNoIHNlcnZpY2UgY2FuIGxvYWQgdGhlbSBpdHMgb3duIHdheSAoe0BsaW5rIGRyaXp6bGVMaXN0aW5nU291cmNlfSBpcyB0aGVcbiAqIHBsYWluIGRyaXp6bGUgb25lKS5cbiAqXG4gKiBUaGUgbW9kZWw6XG4gKiAgLSBBbiBvcmcgcmVzb2x2ZXMgYSBsaXN0aW5nIG9ubHkgdGhyb3VnaCBhbiBJTlNUQUxMOiBhbiBleHBsaWNpdFxuICogICAgYHBsdWdpbl9pbnN0YWxsc2Agcm93IChpdHMgb3duLCBvciDigJQgZm9yIGEgdGVhbSDigJQgaXRzIHJvb3Qgb3JnJ3MpLCBvclxuICogICAgZm9yIHRoZSBPZmZpY2lhbCBwdWJsaXNoZXIgdGhlIElNUExJQ0lUIGluc3RhbGwgZXZlcnkgb3JnIGhhcyB1bmxlc3MgaXRzXG4gKiAgICBjb25zdW1wdGlvbiBwb2xpY3kgc2F5cyBgb2ZmaWNpYWxJbnN0YWxsczogZXhwbGljaXRgLiBBbiBleHBsaWNpdFxuICogICAgaW5zdGFsbCBvdmVycmlkZXMgdGhlIGltcGxpY2l0IG9uZS5cbiAqICAtIFRoZSBvcmcncyBDT05TVU1QVElPTiBQT0xJQ1kgaXMgYXBwbGllZCBhdCBldmVyeSByZXNvbHV0aW9uOiBhbGxvd2VkXG4gKiAgICB0aWVycywgYmxvY2tlZCBsaXN0aW5ncywgYWR2aXNvcnkgYmxvY2tpbmc7IHNlY3JldHMgYXJlIHdpdGhoZWxkIGZyb20gdGllcnNcbiAqICAgIHRoZSBwb2xpY3kgZG9lc24ndCB0cnVzdCB3aXRoIHRoZW0uIEEgdGVhbSdzIHBvbGljeSBpcyBtZXJnZWQgd2l0aCBpdHMgcm9vdFxuICogICAgb3JnJ3MgYW5kIGNhbiBvbmx5IGJlIHN0cmljdGVyLlxuICogIC0gVmVyc2lvbiBjaG9pY2U6IHRoZSBpbnN0YWxsJ3MgcmFuZ2UgKHBpbm5lZCAvIGB+YCAvIGBeYCAvIG5vbi1icmVha2luZ1xuICogICAgbGF0ZXN0OyBpbXBsaWNpdCA9IHRoZSBsb3dlc3QgbGl2ZSBtYWpvciksIG5hcnJvd2VkIGJ5IHRoZSByZWZlcmVuY2UncyBvd25cbiAqICAgIHZlcnNpb24gc3BlYy4gWWFua2VkIHZlcnNpb25zIG5ldmVyIHJlc29sdmUgZm9yIGEgbGlzdGluZzsgYSBwYXVzZWRcbiAqICAgIHZlcnNpb24gaXMgc2tpcHBlZCB1bmxlc3MgdGhlIGluc3RhbGwgYWxyZWFkeSByZXNvbHZlZCB0byBpdCBvciB0aGVcbiAqICAgIHJlZmVyZW5jZSBwaW5zIGl0IGV4YWN0bHk7IGFkdmlzb3J5LWJsb2NrZWQgdmVyc2lvbnMgYXJlIHNraXBwZWQuXG4gKiAgLSBTY2FuIGZsYWdzOiBhIHZlcnNpb24gdGhlIG5pZ2h0bHkgcmVzY2FuIEZMQUdHRUQgKGZpeGFibGUgQ3JpdGljYWxzXG4gKiAgICBvdmVyIGBQTFVHSU5fVlVMTl9NQVhfQ1JJVElDQUxgKSByZXNvbHZlcyB3aXRoIGEgYFZVTE5fRkxBR0dFRGAgd2FybmluZyDigJRcbiAqICAgIG9yLCB3aXRoIGBQTFVHSU5fQkxPQ0tfT05fTkVXX0NSSVRJQ0FMYCBvbiwgaXMgc2tpcHBlZCBsaWtlIGFuXG4gKiAgICBhZHZpc29yeS1ibG9ja2VkIG9uZSwgYW5kIGFuIGV4YWN0IHBpbiB0byBpdCBpcyByZWZ1c2VkXG4gKiAgICBgUExVR0lOX1ZFUlNJT05fVlVMTl9CTE9DS0VEYC5cbiAqL1xuXG5pbXBvcnQge1xuICBhc1NjYW5GbGFnLCBibG9ja09uTmV3Q3JpdGljYWwsIHZ1bG5CbG9ja2VkTWVzc2FnZSwgdnVsbkZsYWdnZWRXYXJuaW5nLCB0eXBlIFZ1bG5GbGFnZ2VkV2FybmluZyxcbn0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgYW5kLCBlcSwgaW5BcnJheSB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB0eXBlIHsgQ3J1ZFR4IH0gZnJvbSAnLi9jcnVkLXNlcnZpY2UuanMnO1xuaW1wb3J0IHtcbiAgY29tcGFyZVNlbXZlciwgaXNWZXJzaW9uUmFuZ2UsIHBhcnNlU2VtdmVyLCBwYXJzZVZlcnNpb25TcGVjLCBzYXRpc2ZpZXNWZXJzaW9uU3BlYyxcbn0gZnJvbSAnLi9zZW12ZXItcmFuZ2UuanMnO1xuaW1wb3J0IHtcbiAgT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRSxcbiAgUFVCTElTSEVSX1RJRVJTLFxuICBzY2hlbWEsXG4gIHR5cGUgQWR2aXNvcnlTZXZlcml0eSxcbiAgdHlwZSBCbG9ja2VkTGlzdGluZ1JlZixcbiAgdHlwZSBCbG9ja09uQWR2aXNvcnksXG4gIHR5cGUgSW5zdGFsbFZlcnNpb25Qb2xpY3ksXG4gIHR5cGUgT2ZmaWNpYWxJbnN0YWxscyxcbiAgdHlwZSBQbHVnaW5BZHZpc29yeSxcbiAgdHlwZSBQbHVnaW5JbnN0YWxsLFxuICB0eXBlIFBsdWdpbkluc3RhbGxQb2xpY3ksXG4gIHR5cGUgUGx1Z2luTGlzdGluZyxcbiAgdHlwZSBQbHVnaW5MaXN0aW5nVmVyc2lvbixcbiAgdHlwZSBQdWJsaXNoZXIsXG4gIHR5cGUgUHVibGlzaGVyVGllcixcbn0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uc3VtcHRpb24gcG9saWN5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQW4gb3JnJ3MgY29uc3VtcHRpb24gcG9saWN5LCBhcyB0aGUgcmVzb2x2ZXIgYXBwbGllcyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc3VtcHRpb25Qb2xpY3kge1xuICBhbGxvd2VkVGllcnM6IFB1Ymxpc2hlclRpZXJbXTtcbiAgcmVxdWlyZUFwcHJvdmFsVGllcnM6IFB1Ymxpc2hlclRpZXJbXTtcbiAgc2VjcmV0c0FsbG93ZWRUaWVyczogUHVibGlzaGVyVGllcltdO1xuICBibG9ja09uQWR2aXNvcnk6IEJsb2NrT25BZHZpc29yeTtcbiAgb2ZmaWNpYWxJbnN0YWxsczogT2ZmaWNpYWxJbnN0YWxscztcbiAgYmxvY2tlZExpc3RpbmdzOiBCbG9ja2VkTGlzdGluZ1JlZltdO1xufVxuXG4vKiogVGhlIGRlZmF1bHRzIChhbmQgdGhlIGNvbHVtbiBkZWZhdWx0cyBvZiBgcGx1Z2luX2luc3RhbGxfcG9saWNpZXNgKS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPTlNVTVBUSU9OX1BPTElDWTogUmVhZG9ubHk8Q29uc3VtcHRpb25Qb2xpY3k+ID0gT2JqZWN0LmZyZWV6ZTxDb25zdW1wdGlvblBvbGljeT4oe1xuICBhbGxvd2VkVGllcnM6IFsnb2ZmaWNpYWwnLCAndmVyaWZpZWQnXSxcbiAgcmVxdWlyZUFwcHJvdmFsVGllcnM6IFsnY29tbXVuaXR5JywgJ3VudmVyaWZpZWQnXSxcbiAgc2VjcmV0c0FsbG93ZWRUaWVyczogWydvZmZpY2lhbCcsICd2ZXJpZmllZCddLFxuICBibG9ja09uQWR2aXNvcnk6ICdjcml0aWNhbCcsXG4gIG9mZmljaWFsSW5zdGFsbHM6ICdpbXBsaWNpdCcsXG4gIGJsb2NrZWRMaXN0aW5nczogW10sXG59KTtcblxuLyoqIEF0IG1vc3QgdGhpcyBtYW55IGJsb2NrZWQgbGlzdGluZ3MgcGVyIHBvbGljeS4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQkxPQ0tFRF9MSVNUSU5HUyA9IDUwMDtcblxuY29uc3QgQkxPQ0tfT1JERVI6IHJlYWRvbmx5IEJsb2NrT25BZHZpc29yeVtdID0gWyduZXZlcicsICdjcml0aWNhbCcsICdoaWdoJ107XG5cbmNvbnN0IHNvcnRUaWVycyA9ICh0aWVyczogSXRlcmFibGU8UHVibGlzaGVyVGllcj4pOiBQdWJsaXNoZXJUaWVyW10gPT5cbiAgUFVCTElTSEVSX1RJRVJTLmZpbHRlcigodCkgPT4gbmV3IFNldCh0aWVycykuaGFzKHQpKTtcblxuY29uc3QgbGlzdGluZ0tleSA9IChyOiBCbG9ja2VkTGlzdGluZ1JlZik6IHN0cmluZyA9PiBgJHtyLnB1Ymxpc2hlcn0vJHtyLm5hbWV9YDtcblxuZnVuY3Rpb24gdW5pcXVlTGlzdGluZ3MocmVmczogcmVhZG9ubHkgQmxvY2tlZExpc3RpbmdSZWZbXSk6IEJsb2NrZWRMaXN0aW5nUmVmW10ge1xuICBjb25zdCBzZWVuID0gbmV3IE1hcDxzdHJpbmcsIEJsb2NrZWRMaXN0aW5nUmVmPigpO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVmcykgc2Vlbi5zZXQobGlzdGluZ0tleShyKSwgeyBwdWJsaXNoZXI6IHIucHVibGlzaGVyLCBuYW1lOiByLm5hbWUgfSk7XG4gIHJldHVybiBbLi4uc2Vlbi52YWx1ZXMoKV0uc29ydCgoYSwgYikgPT4gbGlzdGluZ0tleShhKS5sb2NhbGVDb21wYXJlKGxpc3RpbmdLZXkoYikpKTtcbn1cblxuLyoqIEEgc3RvcmVkIHBvbGljeSByb3cgKG9yIG5vbmUpIGFzIGEge0BsaW5rIENvbnN1bXB0aW9uUG9saWN5fS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2xpY3lPZihyb3c6IFBhcnRpYWw8UGx1Z2luSW5zdGFsbFBvbGljeT4gfCBudWxsIHwgdW5kZWZpbmVkKTogQ29uc3VtcHRpb25Qb2xpY3kge1xuICBjb25zdCBkID0gREVGQVVMVF9DT05TVU1QVElPTl9QT0xJQ1k7XG4gIHJldHVybiB7XG4gICAgYWxsb3dlZFRpZXJzOiBzb3J0VGllcnMocm93Py5hbGxvd2VkVGllcnMgPz8gZC5hbGxvd2VkVGllcnMpLFxuICAgIHJlcXVpcmVBcHByb3ZhbFRpZXJzOiBzb3J0VGllcnMocm93Py5yZXF1aXJlQXBwcm92YWxUaWVycyA/PyBkLnJlcXVpcmVBcHByb3ZhbFRpZXJzKSxcbiAgICBzZWNyZXRzQWxsb3dlZFRpZXJzOiBzb3J0VGllcnMocm93Py5zZWNyZXRzQWxsb3dlZFRpZXJzID8/IGQuc2VjcmV0c0FsbG93ZWRUaWVycyksXG4gICAgYmxvY2tPbkFkdmlzb3J5OiByb3c/LmJsb2NrT25BZHZpc29yeSA/PyBkLmJsb2NrT25BZHZpc29yeSxcbiAgICBvZmZpY2lhbEluc3RhbGxzOiByb3c/Lm9mZmljaWFsSW5zdGFsbHMgPz8gZC5vZmZpY2lhbEluc3RhbGxzLFxuICAgIGJsb2NrZWRMaXN0aW5nczogdW5pcXVlTGlzdGluZ3Mocm93Py5ibG9ja2VkTGlzdGluZ3MgPz8gZC5ibG9ja2VkTGlzdGluZ3MpLFxuICB9O1xufVxuXG4vKipcbiAqIEEgdGVhbSdzIHBvbGljeSB1bmRlciBpdHMgcm9vdCBvcmcnczogZWFjaCBmaWVsZCB0YWtlcyB0aGUgU1RSSUNURVIgb2ZcbiAqIHRoZSB0d28sIHNvIGEgdGVhbSBjYW4gbmFycm93IHdoYXQgaXRzIHJvb3QgYWxsb3dzIGJ1dCBuZXZlciB3aWRlbiBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ29uc3VtcHRpb25Qb2xpY2llcyhyb290OiBDb25zdW1wdGlvblBvbGljeSwgdGVhbTogQ29uc3VtcHRpb25Qb2xpY3kpOiBDb25zdW1wdGlvblBvbGljeSB7XG4gIGNvbnN0IGludGVyc2VjdCA9IChhOiBQdWJsaXNoZXJUaWVyW10sIGI6IFB1Ymxpc2hlclRpZXJbXSkgPT4gc29ydFRpZXJzKGEuZmlsdGVyKCh0KSA9PiBiLmluY2x1ZGVzKHQpKSk7XG4gIGNvbnN0IHVuaW9uID0gKGE6IFB1Ymxpc2hlclRpZXJbXSwgYjogUHVibGlzaGVyVGllcltdKSA9PiBzb3J0VGllcnMoWy4uLmEsIC4uLmJdKTtcbiAgY29uc3Qgc3RyaWN0ZXJCbG9jayA9IEJMT0NLX09SREVSLmluZGV4T2Yocm9vdC5ibG9ja09uQWR2aXNvcnkpID49IEJMT0NLX09SREVSLmluZGV4T2YodGVhbS5ibG9ja09uQWR2aXNvcnkpXG4gICAgPyByb290LmJsb2NrT25BZHZpc29yeSA6IHRlYW0uYmxvY2tPbkFkdmlzb3J5O1xuICByZXR1cm4ge1xuICAgIGFsbG93ZWRUaWVyczogaW50ZXJzZWN0KHJvb3QuYWxsb3dlZFRpZXJzLCB0ZWFtLmFsbG93ZWRUaWVycyksXG4gICAgcmVxdWlyZUFwcHJvdmFsVGllcnM6IHVuaW9uKHJvb3QucmVxdWlyZUFwcHJvdmFsVGllcnMsIHRlYW0ucmVxdWlyZUFwcHJvdmFsVGllcnMpLFxuICAgIHNlY3JldHNBbGxvd2VkVGllcnM6IGludGVyc2VjdChyb290LnNlY3JldHNBbGxvd2VkVGllcnMsIHRlYW0uc2VjcmV0c0FsbG93ZWRUaWVycyksXG4gICAgYmxvY2tPbkFkdmlzb3J5OiBzdHJpY3RlckJsb2NrLFxuICAgIG9mZmljaWFsSW5zdGFsbHM6IHJvb3Qub2ZmaWNpYWxJbnN0YWxscyA9PT0gJ2V4cGxpY2l0JyB8fCB0ZWFtLm9mZmljaWFsSW5zdGFsbHMgPT09ICdleHBsaWNpdCcgPyAnZXhwbGljaXQnIDogJ2ltcGxpY2l0JyxcbiAgICBibG9ja2VkTGlzdGluZ3M6IHVuaXF1ZUxpc3RpbmdzKFsuLi5yb290LmJsb2NrZWRMaXN0aW5ncywgLi4udGVhbS5ibG9ja2VkTGlzdGluZ3NdKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcG9saWN5IGFuIG9yZydzIHJlc29sdXRpb24gcnVucyB1bmRlci4gQSByb290IG9yZzogaXRzIG93biByb3cgKG9yIHRoZVxuICogZGVmYXVsdHMpLiBBIHRlYW0gKGByb290T3JnSWRgIHNldCk6IGl0cyByb290J3MgcG9saWN5LCBtZXJnZWQgd2l0aCB0aGVcbiAqIHRlYW0ncyBvd24gcm93IHdoZW4gaXQgaGFzIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVmZmVjdGl2ZUNvbnN1bXB0aW9uUG9saWN5KFxuICByb3dzOiBSZWFkb25seUFycmF5PFBhcnRpYWw8UGx1Z2luSW5zdGFsbFBvbGljeT4gJiB7IG9yZ0lkPzogc3RyaW5nIH0+LFxuICBvcmdJZDogc3RyaW5nLFxuICByb290T3JnSWQ/OiBzdHJpbmcsXG4pOiBDb25zdW1wdGlvblBvbGljeSB7XG4gIGNvbnN0IG93biA9IHJvd3MuZmluZCgocikgPT4gci5vcmdJZCA9PT0gb3JnSWQpID8/IG51bGw7XG4gIGlmICghcm9vdE9yZ0lkIHx8IHJvb3RPcmdJZCA9PT0gb3JnSWQpIHJldHVybiBwb2xpY3lPZihvd24pO1xuICBjb25zdCByb290ID0gcG9saWN5T2Yocm93cy5maW5kKChyKSA9PiByLm9yZ0lkID09PSByb290T3JnSWQpID8/IG51bGwpO1xuICByZXR1cm4gb3duID8gbWVyZ2VDb25zdW1wdGlvblBvbGljaWVzKHJvb3QsIHBvbGljeU9mKG93bikpIDogcm9vdDtcbn1cblxuY29uc3QgSEFORExFX1JFID0gL15bYS16MC05XSsoPzotW2EtejAtOV0rKSokLztcbmNvbnN0IE5BTUVfUkUgPSAvXlthLXowLTldW2EtejAtOS5fLV0qJC87XG5cbmZ1bmN0aW9uIHRpZXJMaXN0KHY6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBQdWJsaXNoZXJUaWVyW10gfCBzdHJpbmcge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodikpIHJldHVybiBgJHtmaWVsZH0gbXVzdCBiZSBhbiBhcnJheSBvZiB0aWVyc2A7XG4gIGNvbnN0IGJhZCA9IHYuZmlsdGVyKCh0KSA9PiAhKFBVQkxJU0hFUl9USUVSUyBhcyByZWFkb25seSB1bmtub3duW10pLmluY2x1ZGVzKHQpKTtcbiAgaWYgKGJhZC5sZW5ndGgpIHJldHVybiBgJHtmaWVsZH0gaGFzIHVua25vd24gdGllcnM6ICR7YmFkLm1hcChTdHJpbmcpLmpvaW4oJywgJyl9YDtcbiAgcmV0dXJuIHNvcnRUaWVycyh2IGFzIFB1Ymxpc2hlclRpZXJbXSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSAocGFydGlhbCkgcG9saWN5IHVwZGF0ZSBvdmVyIGBiYXNlYC4gUmV0dXJucyB0aGUgZnVsbCBuZXcgcG9saWN5LFxuICogb3IgYW4gZXJyb3IgbWVzc2FnZS4gYGJsb2NrZWRMaXN0aW5nc2AgZW50cmllcyBhcmUgYHsgcHVibGlzaGVyLCBuYW1lIH1gIG9yXG4gKiBgXCJwdWJsaXNoZXIvbmFtZVwiYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UG9saWN5VXBkYXRlKGJhc2U6IENvbnN1bXB0aW9uUG9saWN5LCBpbnB1dDogdW5rbm93bik6IENvbnN1bXB0aW9uUG9saWN5IHwgc3RyaW5nIHtcbiAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoaW5wdXQpKSByZXR1cm4gJ2JvZHkgbXVzdCBiZSBhbiBvYmplY3QnO1xuICBjb25zdCBiID0gaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG5leHQ6IENvbnN1bXB0aW9uUG9saWN5ID0geyAuLi5iYXNlIH07XG4gIGZvciAoY29uc3QgZmllbGQgb2YgWydhbGxvd2VkVGllcnMnLCAncmVxdWlyZUFwcHJvdmFsVGllcnMnLCAnc2VjcmV0c0FsbG93ZWRUaWVycyddIGFzIGNvbnN0KSB7XG4gICAgaWYgKGJbZmllbGRdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHRpZXJzID0gdGllckxpc3QoYltmaWVsZF0sIGZpZWxkKTtcbiAgICBpZiAodHlwZW9mIHRpZXJzID09PSAnc3RyaW5nJykgcmV0dXJuIHRpZXJzO1xuICAgIG5leHRbZmllbGRdID0gdGllcnM7XG4gIH1cbiAgaWYgKGIuYmxvY2tPbkFkdmlzb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIUJMT0NLX09SREVSLmluY2x1ZGVzKGIuYmxvY2tPbkFkdmlzb3J5IGFzIEJsb2NrT25BZHZpc29yeSkpIHJldHVybiAnYmxvY2tPbkFkdmlzb3J5IG11c3QgYmUgY3JpdGljYWwsIGhpZ2ggb3IgbmV2ZXInO1xuICAgIG5leHQuYmxvY2tPbkFkdmlzb3J5ID0gYi5ibG9ja09uQWR2aXNvcnkgYXMgQmxvY2tPbkFkdmlzb3J5O1xuICB9XG4gIGlmIChiLm9mZmljaWFsSW5zdGFsbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChiLm9mZmljaWFsSW5zdGFsbHMgIT09ICdpbXBsaWNpdCcgJiYgYi5vZmZpY2lhbEluc3RhbGxzICE9PSAnZXhwbGljaXQnKSByZXR1cm4gJ29mZmljaWFsSW5zdGFsbHMgbXVzdCBiZSBpbXBsaWNpdCBvciBleHBsaWNpdCc7XG4gICAgbmV4dC5vZmZpY2lhbEluc3RhbGxzID0gYi5vZmZpY2lhbEluc3RhbGxzO1xuICB9XG4gIGlmIChiLmJsb2NrZWRMaXN0aW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGIuYmxvY2tlZExpc3RpbmdzKSkgcmV0dXJuICdibG9ja2VkTGlzdGluZ3MgbXVzdCBiZSBhbiBhcnJheSc7XG4gICAgaWYgKGIuYmxvY2tlZExpc3RpbmdzLmxlbmd0aCA+IE1BWF9CTE9DS0VEX0xJU1RJTkdTKSByZXR1cm4gYGF0IG1vc3QgJHtNQVhfQkxPQ0tFRF9MSVNUSU5HU30gYmxvY2tlZCBsaXN0aW5nc2A7XG4gICAgY29uc3QgcmVmczogQmxvY2tlZExpc3RpbmdSZWZbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcmF3IG9mIGIuYmxvY2tlZExpc3RpbmdzKSB7XG4gICAgICBjb25zdCByZWYgPSB0eXBlb2YgcmF3ID09PSAnc3RyaW5nJ1xuICAgICAgICA/ICgoKSA9PiB7IGNvbnN0IFtwdWJsaXNoZXIsIG5hbWUsIGV4dHJhXSA9IHJhdy5zcGxpdCgnLycpOyByZXR1cm4gZXh0cmEgPT09IHVuZGVmaW5lZCA/IHsgcHVibGlzaGVyLCBuYW1lIH0gOiBudWxsOyB9KSgpXG4gICAgICAgIDogcmF3ICYmIHR5cGVvZiByYXcgPT09ICdvYmplY3QnID8geyBwdWJsaXNoZXI6IChyYXcgYXMgQmxvY2tlZExpc3RpbmdSZWYpLnB1Ymxpc2hlciwgbmFtZTogKHJhdyBhcyBCbG9ja2VkTGlzdGluZ1JlZikubmFtZSB9IDogbnVsbDtcbiAgICAgIGlmICghcmVmIHx8IHR5cGVvZiByZWYucHVibGlzaGVyICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmVmLm5hbWUgIT09ICdzdHJpbmcnXG4gICAgICAgIHx8ICFIQU5ETEVfUkUudGVzdChyZWYucHVibGlzaGVyKSB8fCAhTkFNRV9SRS50ZXN0KHJlZi5uYW1lKSkge1xuICAgICAgICByZXR1cm4gJ2VhY2ggYmxvY2tlZCBsaXN0aW5nIG11c3QgYmUgeyBwdWJsaXNoZXIsIG5hbWUgfSAob3IgXCJwdWJsaXNoZXIvbmFtZVwiKSc7XG4gICAgICB9XG4gICAgICByZWZzLnB1c2goeyBwdWJsaXNoZXI6IHJlZi5wdWJsaXNoZXIsIG5hbWU6IHJlZi5uYW1lIH0pO1xuICAgIH1cbiAgICBuZXh0LmJsb2NrZWRMaXN0aW5ncyA9IHVuaXF1ZUxpc3RpbmdzKHJlZnMpO1xuICB9XG4gIHJldHVybiBuZXh0O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVmdXNhbHMgYW5kIHdhcm5pbmdzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogV2h5IGEgcmVmZXJlbmNlIGNhbid0IHJlc29sdmU7IGBjb2RlYCBpcyBhbiBhcGktY29yZSBgRXJyb3JDb2RlYCBuYW1lLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHV0aW9uUmVmdXNhbCB7XG4gIGNvZGU6ICdOT1RfRk9VTkQnIHwgJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJyB8ICdQTFVHSU5fQkxPQ0tFRF9CWV9QT0xJQ1knIHwgJ1BMVUdJTl9VTkFWQUlMQUJMRScgfCAnUExVR0lOX1ZFUlNJT05fVlVMTl9CTE9DS0VEJztcbiAgcmVhc29uOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogQSBub24tZmF0YWwgbm90ZSBhIHJlc29sdXRpb24gY2FycmllcyAoc3ludGggcHJpbnRzIGl0cyBgbWVzc2FnZWApLiAqL1xuZXhwb3J0IHR5cGUgUmVzb2x1dGlvbldhcm5pbmcgPVxuICB8IHsgY29kZTogJ1BMVUdJTl9BRFZJU09SWScgfCAnUExVR0lOX0RFUFJFQ0FURUQnIHwgJ1BMVUdJTl9TRUNSRVRTX1dJVEhIRUxEJyB8ICdMSVNUSU5HX1VOTUFJTlRBSU5FRCc7IG1lc3NhZ2U6IHN0cmluZyB9XG4gIHwgVnVsbkZsYWdnZWRXYXJuaW5nO1xuXG4vKiogV2h5IHRoZSBvcmcncyBwb2xpY3kgKG9yIHRoZSBsaXN0aW5nJ3Mgc3RhdGUpIGtlZXBzIGEgbGlzdGluZyBvdXQsIG9yIG51bGwuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RpbmdCbG9jayB7XG4gIHJlYXNvbjogJ3RpZXInIHwgJ2Jsb2NrZWRfbGlzdGluZycgfCAnc3VzcGVuZGVkJztcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKiogV2hldGhlciBgcG9saWN5YCAob3IgdGhlIGxpc3RpbmcncyBvd24gc3RhdGUpIHJlZnVzZXMgdGhlIGxpc3Rpbmcgb3V0cmlnaHQuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdGluZ0Jsb2NrKFxuICBwb2xpY3k6IENvbnN1bXB0aW9uUG9saWN5LFxuICBwdWJsaXNoZXI6IFBpY2s8UHVibGlzaGVyLCAnaGFuZGxlJyB8ICd0aWVyJyB8ICdzdXNwZW5kZWRBdCc+LFxuICBsaXN0aW5nOiBQaWNrPFBsdWdpbkxpc3RpbmcsICduYW1lJyB8ICdzdGF0ZSc+LFxuKTogTGlzdGluZ0Jsb2NrIHwgbnVsbCB7XG4gIGNvbnN0IHJlZiA9IGAke3B1Ymxpc2hlci5oYW5kbGV9LyR7bGlzdGluZy5uYW1lfWA7XG4gIGlmIChwdWJsaXNoZXIuc3VzcGVuZGVkQXQgfHwgbGlzdGluZy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcgfHwgbGlzdGluZy5zdGF0ZSA9PT0gJ3RyYW5zZmVycmVkJykge1xuICAgIHJldHVybiB7IHJlYXNvbjogJ3N1c3BlbmRlZCcsIG1lc3NhZ2U6IGAke3JlZn0gaXMgJHtsaXN0aW5nLnN0YXRlID09PSAndHJhbnNmZXJyZWQnID8gJ3RyYW5zZmVycmVkJyA6ICdzdXNwZW5kZWQnfSBhbmQgbm8gbG9uZ2VyIHJlc29sdmVzLmAgfTtcbiAgfVxuICBpZiAocG9saWN5LmJsb2NrZWRMaXN0aW5ncy5zb21lKChiKSA9PiBiLnB1Ymxpc2hlciA9PT0gcHVibGlzaGVyLmhhbmRsZSAmJiBiLm5hbWUgPT09IGxpc3RpbmcubmFtZSkpIHtcbiAgICByZXR1cm4geyByZWFzb246ICdibG9ja2VkX2xpc3RpbmcnLCBtZXNzYWdlOiBgWW91ciBvcmdhbml6YXRpb24ncyBwbHVnaW4gcG9saWN5IGJsb2NrcyAke3JlZn0uYCB9O1xuICB9XG4gIGlmICghcG9saWN5LmFsbG93ZWRUaWVycy5pbmNsdWRlcyhwdWJsaXNoZXIudGllcikpIHtcbiAgICByZXR1cm4geyByZWFzb246ICd0aWVyJywgbWVzc2FnZTogYFlvdXIgb3JnYW5pemF0aW9uJ3MgcGx1Z2luIHBvbGljeSBkb2Vzbid0IGFsbG93ICR7cHVibGlzaGVyLnRpZXJ9IHBsdWdpbnMgKCR7cmVmfSkuYCB9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogVGhlIHJlZnVzYWwgYSB7QGxpbmsgTGlzdGluZ0Jsb2NrfSBiZWNvbWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrUmVmdXNhbChibG9jazogTGlzdGluZ0Jsb2NrKTogUmVzb2x1dGlvblJlZnVzYWwge1xuICByZXR1cm4gYmxvY2sucmVhc29uID09PSAnc3VzcGVuZGVkJ1xuICAgID8geyBjb2RlOiAnUExVR0lOX1VOQVZBSUxBQkxFJywgcmVhc29uOiAnc3VzcGVuZGVkJywgbWVzc2FnZTogYmxvY2subWVzc2FnZSB9XG4gICAgOiB7IGNvZGU6ICdQTFVHSU5fQkxPQ0tFRF9CWV9QT0xJQ1knLCByZWFzb246IGJsb2NrLnJlYXNvbiwgbWVzc2FnZTogYmxvY2subWVzc2FnZSB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWR2aXNvcmllc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFNldmVyaXRpZXMgZWFjaCBgYmxvY2tPbkFkdmlzb3J5YCBzZXR0aW5nIGJsb2Nrcy4gKi9cbmV4cG9ydCBjb25zdCBBRFZJU09SWV9CTE9DS19TRVZFUklUSUVTOiBSZWFkb25seTxSZWNvcmQ8QmxvY2tPbkFkdmlzb3J5LCByZWFkb25seSBBZHZpc29yeVNldmVyaXR5W10+PiA9IHtcbiAgY3JpdGljYWw6IFsnY3JpdGljYWwnXSxcbiAgaGlnaDogWydjcml0aWNhbCcsICdoaWdoJ10sXG4gIG5ldmVyOiBbXSxcbn07XG5cbmNvbnN0IENPTVBBUkFUT1IgPSAvXig+PXw8PXw+fDx8PSk/XFxzKnY/KFxcZCtcXC5cXGQrXFwuXFxkKyg/Oi1bMC05QS1aYS16Li1dKyk/KD86XFwrWzAtOUEtWmEtei4tXSspPykkLztcblxuLyoqIE9uZSBjb21wYXJhdG9yIHNldCAoYD49MS4wLjAgPDEuMi4zYCwgYF4xLjJgLCBgMS54YCwgYDEuMC4wIC0gMS4yLjBgKSBhZ2FpbnN0IGB2ZXJzaW9uYC4gKi9cbmZ1bmN0aW9uIGNvbXBhcmF0b3JTZXRDb3ZlcnMoc2V0OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBoeXBoZW4gPSAvXihcXFMrKVxccystXFxzKyhcXFMrKSQvLmV4ZWMoc2V0KTtcbiAgaWYgKGh5cGhlbikgcmV0dXJuIGNvbXBhcmVTZW12ZXIodmVyc2lvbiwgaHlwaGVuWzFdISkgPj0gMCAmJiBjb21wYXJlU2VtdmVyKHZlcnNpb24sIGh5cGhlblsyXSEpIDw9IDA7XG4gIGNvbnN0IHBhcnRzID0gc2V0LnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAocGFydHMubGVuZ3RoID09PSAxICYmIHBhcnNlVmVyc2lvblNwZWMocGFydHNbMF0hKSkgcmV0dXJuIHNhdGlzZmllc1ZlcnNpb25TcGVjKHZlcnNpb24sIHBhcnRzWzBdISk7XG4gIHJldHVybiBwYXJ0cy5ldmVyeSgocCkgPT4ge1xuICAgIGNvbnN0IG0gPSBDT01QQVJBVE9SLmV4ZWMocCk7XG4gICAgaWYgKCFtKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgYyA9IGNvbXBhcmVTZW12ZXIodmVyc2lvbiwgbVsyXSEpO1xuICAgIHN3aXRjaCAobVsxXSA/PyAnPScpIHtcbiAgICAgIGNhc2UgJz49JzogcmV0dXJuIGMgPj0gMDtcbiAgICAgIGNhc2UgJzw9JzogcmV0dXJuIGMgPD0gMDtcbiAgICAgIGNhc2UgJz4nOiByZXR1cm4gYyA+IDA7XG4gICAgICBjYXNlICc8JzogcmV0dXJuIGMgPCAwO1xuICAgICAgZGVmYXVsdDogcmV0dXJuIGMgPT09IDA7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIGFkdmlzb3J5J3MgYGFmZmVjdGVkUmFuZ2VgIGNvdmVycyBgdmVyc2lvbmA6IGB8fGAtc2VwYXJhdGVkXG4gKiBjb21wYXJhdG9yIHNldHMsIGVhY2ggZWl0aGVyIHRoZSBsb29rdXAgc3BlYyBmb3JtcyAoYF5gLCBgfmAsIHBhcnRpYWwsXG4gKiBleGFjdCkgb3Igc3BhY2Utc2VwYXJhdGVkIGNvbXBhcmF0b3JzIChgPj0xLjAuMCA8MS4yLjNgKSBvciBhIGh5cGhlbiByYW5nZS5cbiAqIGAqYCBjb3ZlcnMgZXZlcnl0aGluZzsgYW4gdW5wYXJzZWFibGUgcmFuZ2UgY292ZXJzIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZHZpc29yeVJhbmdlQ292ZXJzKHJhbmdlOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIXBhcnNlU2VtdmVyKHZlcnNpb24pKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiByYW5nZS5zcGxpdCgnfHwnKS5tYXAoKHMpID0+IHMudHJpbSgpKS5zb21lKChzZXQpID0+IHNldCA9PT0gJyonIHx8IChzZXQgIT09ICcnICYmIGNvbXBhcmF0b3JTZXRDb3ZlcnMoc2V0LCB2ZXJzaW9uKSkpO1xufVxuXG4vKipcbiAqIFdoeSBgcmFuZ2VgIGlzbid0IGEgdXNhYmxlIGFkdmlzb3J5IHJhbmdlICh0aGUgZm9ybXMge0BsaW5rIGFkdmlzb3J5UmFuZ2VDb3ZlcnN9XG4gKiB1bmRlcnN0YW5kcyksIG9yIG51bGwgd2hlbiBpdCBpcy4gQW4gYWR2aXNvcnkgd2hvc2UgcmFuZ2UgcGFyc2VzIGFzIG5vdGhpbmdcbiAqIHdvdWxkIHNpbGVudGx5IGNvdmVyIG5vdGhpbmcsIHNvIGRyYWZ0cyBhcmUgcmVmdXNlZCBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWR2aXNvcnlSYW5nZVByb2JsZW0ocmFuZ2U6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB0cmltbWVkID0gcmFuZ2UudHJpbSgpO1xuICBpZiAodHJpbW1lZCA9PT0gJycpIHJldHVybiAndGhlIGFmZmVjdGVkIHJhbmdlIGlzIGVtcHR5JztcbiAgaWYgKHRyaW1tZWQubGVuZ3RoID4gMjU1KSByZXR1cm4gJ3RoZSBhZmZlY3RlZCByYW5nZSBpcyBsb25nZXIgdGhhbiAyNTUgY2hhcmFjdGVycyc7XG4gIGZvciAoY29uc3Qgc2V0IG9mIHRyaW1tZWQuc3BsaXQoJ3x8JykubWFwKCh4KSA9PiB4LnRyaW0oKSkpIHtcbiAgICBpZiAoc2V0ID09PSAnKicpIGNvbnRpbnVlO1xuICAgIGlmIChzZXQgPT09ICcnKSByZXR1cm4gJ3RoZSBhZmZlY3RlZCByYW5nZSBoYXMgYW4gZW1wdHkgXCJ8fFwiIGFsdGVybmF0aXZlJztcbiAgICBjb25zdCBoeXBoZW4gPSAvXihcXFMrKVxccystXFxzKyhcXFMrKSQvLmV4ZWMoc2V0KTtcbiAgICBpZiAoaHlwaGVuKSB7XG4gICAgICBpZiAoIXBhcnNlU2VtdmVyKGh5cGhlblsxXSEpIHx8ICFwYXJzZVNlbXZlcihoeXBoZW5bMl0hKSkgcmV0dXJuIGBcIiR7c2V0fVwiIGlzIG5vdCBhIHZhbGlkIGh5cGhlbiByYW5nZWA7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcGFydHMgPSBzZXQuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSAmJiBwYXJ0c1swXSAhPT0gJ2xhdGVzdCcgJiYgcGFyc2VWZXJzaW9uU3BlYyhwYXJ0c1swXSEpKSBjb250aW51ZTtcbiAgICBjb25zdCBiYWQgPSBwYXJ0cy5maW5kKCh4KSA9PiAhQ09NUEFSQVRPUi50ZXN0KHgpKTtcbiAgICBpZiAoYmFkICE9PSB1bmRlZmluZWQpIHJldHVybiBgXCIke2JhZH1cIiBpcyBub3QgYSB2ZXJzaW9uLCBhIF4vfiByYW5nZSBvciBhIGNvbXBhcmF0b3IgKD49LCA8PSwgPiwgPCwgPSlgO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogVGhlIFBVQkxJU0hFRCBhZHZpc29yaWVzIHdob3NlIHJhbmdlIGNvdmVycyBgdmVyc2lvbmAgKGFueSBzZXZlcml0eSksIG1vc3Qgc2V2ZXJlIGZpcnN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkdmlzb3JpZXNDb3ZlcmluZzxBIGV4dGVuZHMgUGljazxQbHVnaW5BZHZpc29yeSwgJ3NldmVyaXR5JyB8ICdzdGF0ZScgfCAnYWZmZWN0ZWRSYW5nZSc+PihcbiAgYWR2aXNvcmllczogcmVhZG9ubHkgQVtdLFxuICB2ZXJzaW9uOiBzdHJpbmcsXG4pOiBBW10ge1xuICBjb25zdCByYW5rOiBSZWNvcmQ8QWR2aXNvcnlTZXZlcml0eSwgbnVtYmVyPiA9IHsgY3JpdGljYWw6IDAsIGhpZ2g6IDEsIG1lZGl1bTogMiwgbG93OiAzIH07XG4gIHJldHVybiBhZHZpc29yaWVzXG4gICAgLmZpbHRlcigoYSkgPT4gYS5zdGF0ZSA9PT0gJ3B1Ymxpc2hlZCcgJiYgYWR2aXNvcnlSYW5nZUNvdmVycyhhLmFmZmVjdGVkUmFuZ2UsIHZlcnNpb24pKVxuICAgIC5zb3J0KChhLCBiKSA9PiByYW5rW2Euc2V2ZXJpdHldIC0gcmFua1tiLnNldmVyaXR5XSk7XG59XG5cbi8qKiBUaGUgUFVCTElTSEVEIGFkdmlzb3JpZXMgdGhlIHBvbGljeSBibG9ja3MgYHZlcnNpb25gIGZvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibG9ja2luZ0Fkdmlzb3JpZXMoXG4gIGFkdmlzb3JpZXM6IHJlYWRvbmx5IFBpY2s8UGx1Z2luQWR2aXNvcnksICdpZCcgfCAnc2V2ZXJpdHknIHwgJ3N0YXRlJyB8ICdhZmZlY3RlZFJhbmdlJyB8ICdmaXhlZFZlcnNpb24nIHwgJ3N1bW1hcnknPltdLFxuICB2ZXJzaW9uOiBzdHJpbmcsXG4gIHBvbGljeTogUGljazxDb25zdW1wdGlvblBvbGljeSwgJ2Jsb2NrT25BZHZpc29yeSc+LFxuKTogQXJyYXk8UGljazxQbHVnaW5BZHZpc29yeSwgJ2lkJyB8ICdzZXZlcml0eScgfCAnc3RhdGUnIHwgJ2FmZmVjdGVkUmFuZ2UnIHwgJ2ZpeGVkVmVyc2lvbicgfCAnc3VtbWFyeSc+PiB7XG4gIGNvbnN0IHNldmVyaXRpZXMgPSBBRFZJU09SWV9CTE9DS19TRVZFUklUSUVTW3BvbGljeS5ibG9ja09uQWR2aXNvcnldO1xuICBpZiAoc2V2ZXJpdGllcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgcmV0dXJuIGFkdmlzb3JpZXMuZmlsdGVyKChhKSA9PiBhLnN0YXRlID09PSAncHVibGlzaGVkJyAmJiBzZXZlcml0aWVzLmluY2x1ZGVzKGEuc2V2ZXJpdHkpICYmIGFkdmlzb3J5UmFuZ2VDb3ZlcnMoYS5hZmZlY3RlZFJhbmdlLCB2ZXJzaW9uKSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnN0YWxscyBhbmQgdmVyc2lvbiBjaG9pY2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBIb3cgdGhlIG9yZyByZWFjaGVzIGEgbGlzdGluZzogYW4gZXhwbGljaXQgaW5zdGFsbCByb3csIG9yIHRoZSBpbXBsaWNpdCBPZmZpY2lhbCBvbmUuICovXG5leHBvcnQgdHlwZSBJbnN0YWxsTW9kZSA9XG4gIHwgeyBraW5kOiAnZXhwbGljaXQnOyBpbnN0YWxsOiBQbHVnaW5JbnN0YWxsOyBpbmhlcml0ZWQ6IGJvb2xlYW4gfVxuICB8IHsga2luZDogJ2ltcGxpY2l0JyB9O1xuXG50eXBlIFZlcnNpb25Sb3cgPSBQaWNrPFBsdWdpbkxpc3RpbmdWZXJzaW9uLCAndmVyc2lvbicgfCAneWFua2VkQXQnIHwgJ3BhdXNlZEF0JyB8ICdicmVha2luZyc+O1xuXG4vKiogVGhlIHJlZnVzYWwgYW4gZXhhY3QgcGluIHRvIGEgZmxhZ2dlZCB2ZXJzaW9uIGdldHMgd2hpbGUgYmxvY2tpbmcgKDQwOSkuICovXG5mdW5jdGlvbiB2dWxuUmVmdXNhbChyZWY6IHN0cmluZywgdjogUGljazxQbHVnaW5MaXN0aW5nVmVyc2lvbiwgJ3ZlcnNpb24nIHwgJ3NjYW5GbGFnJz4pOiBSZXNvbHV0aW9uUmVmdXNhbCB7XG4gIGNvbnN0IGZsYWcgPSBhc1NjYW5GbGFnKHYuc2NhbkZsYWcpID8/IHsgY3JpdGljYWw6IDAsIGhpZ2g6IDAsIG1heENyaXRpY2FsOiAwLCBmaW5kaW5nczogW10gfTtcbiAgY29uc3QgZml4ZWQgPSBbLi4ubmV3IFNldChmbGFnLmZpbmRpbmdzLmZsYXRNYXAoKGYpID0+IGYuZml4ZWRJbikpXTtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiAnUExVR0lOX1ZFUlNJT05fVlVMTl9CTE9DS0VEJyxcbiAgICByZWFzb246ICd2dWxuX2ZsYWdnZWQnLFxuICAgIG1lc3NhZ2U6IHZ1bG5CbG9ja2VkTWVzc2FnZShyZWYsIHYudmVyc2lvbiwgZmxhZyksXG4gICAgZGV0YWlsczogeyB2ZXJzaW9uOiB2LnZlcnNpb24sIGNyaXRpY2FsOiBmbGFnLmNyaXRpY2FsLCBoaWdoOiBmbGFnLmhpZ2gsIGZpbmRpbmdzOiBmbGFnLmZpbmRpbmdzLCAuLi4oZml4ZWQubGVuZ3RoID8geyBmaXhlZFZlcnNpb25zOiBmaXhlZCB9IDoge30pIH0sXG4gIH07XG59XG5cbmNvbnN0IGlzU3RhYmxlID0gKHY6IHN0cmluZyk6IGJvb2xlYW4gPT4gKHBhcnNlU2VtdmVyKHYpPy5wcmVyZWxlYXNlLmxlbmd0aCA/PyAxKSA9PT0gMDtcblxuLyoqXG4gKiBUaGUgaW1wbGljaXQgT2ZmaWNpYWwgaW5zdGFsbCdzIHJhbmdlOiBldmVyeSB2ZXJzaW9uIG9mIHRoZSBMT1dFU1QgbGl2ZVxuICogbWFqb3IgKGA8bWFqb3I+LnhgKSDigJQgcGF0Y2ggYW5kIG1pbm9yIHZlcnNpb25zIGZsb3csIGEgbmV3IG1ham9yIG5ldmVyIGRvZXNcbiAqICh0aGUgb3JnIG1vdmVzIHRvIGl0IHdpdGggYW4gZXhwbGljaXQgaW5zdGFsbCkuIE51bGwgd2hlbiBub3RoaW5nIGlzIGxpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbXBsaWNpdEluc3RhbGxSYW5nZSh2ZXJzaW9uczogcmVhZG9ubHkgVmVyc2lvblJvd1tdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IG1ham9ycyA9IHZlcnNpb25zXG4gICAgLmZpbHRlcigodikgPT4gIXYueWFua2VkQXQgJiYgaXNTdGFibGUodi52ZXJzaW9uKSlcbiAgICAubWFwKCh2KSA9PiBwYXJzZVNlbXZlcih2LnZlcnNpb24pIS5tYWpvcik7XG4gIGlmIChtYWpvcnMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGAke01hdGgubWluKC4uLm1ham9ycyl9LnhgO1xufVxuXG4vKiogV2hldGhlciBhbiBpbnN0YWxsJ3MgdmVyc2lvbiBwb2xpY3kgYWRtaXRzIGB2ZXJzaW9uYCAodGhlIGJhc2VsaW5lIGlzIGBwaW5uZWRWZXJzaW9uYCkuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbEFkbWl0cyhcbiAgaW5zdGFsbDogUGljazxQbHVnaW5JbnN0YWxsLCAndmVyc2lvblBvbGljeScgfCAncGlubmVkVmVyc2lvbic+LFxuICB2ZXJzaW9uOiBzdHJpbmcsXG4gIHZlcnNpb25zOiByZWFkb25seSBWZXJzaW9uUm93W10sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZSA9IGluc3RhbGwucGlubmVkVmVyc2lvbjtcbiAgc3dpdGNoIChpbnN0YWxsLnZlcnNpb25Qb2xpY3kgYXMgSW5zdGFsbFZlcnNpb25Qb2xpY3kpIHtcbiAgICBjYXNlICdwaW5uZWQnOlxuICAgICAgcmV0dXJuIHZlcnNpb24gPT09IGJhc2U7XG4gICAgY2FzZSAncGF0Y2gnOlxuICAgICAgcmV0dXJuIGJhc2UgIT09IG51bGwgJiYgc2F0aXNmaWVzVmVyc2lvblNwZWModmVyc2lvbiwgYH4ke2Jhc2V9YCk7XG4gICAgY2FzZSAnbWlub3InOlxuICAgICAgcmV0dXJuIGJhc2UgIT09IG51bGwgJiYgc2F0aXNmaWVzVmVyc2lvblNwZWModmVyc2lvbiwgYF4ke2Jhc2V9YCk7XG4gICAgY2FzZSAnbGF0ZXN0Jzoge1xuICAgICAgaWYgKCFpc1N0YWJsZSh2ZXJzaW9uKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGJhc2UgPT09IG51bGwpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGNvbXBhcmVTZW12ZXIodmVyc2lvbiwgYmFzZSkgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBOZXZlciBjcm9zcyBhIHZlcnNpb24gdGhlIHB1Ymxpc2hlciBtYXJrZWQgYnJlYWtpbmcuXG4gICAgICByZXR1cm4gIXZlcnNpb25zLnNvbWUoKHYpID0+IHYuYnJlYWtpbmcgJiYgY29tcGFyZVNlbXZlcih2LnZlcnNpb24sIGJhc2UpID4gMCAmJiBjb21wYXJlU2VtdmVyKHYudmVyc2lvbiwgdmVyc2lvbikgPD0gMCk7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIFdoZXRoZXIgYG1vZGVgIGFkbWl0cyBgdmVyc2lvbmAgKHRoZSBpbXBsaWNpdCByYW5nZSBmb3IgYW4gaW1wbGljaXQgaW5zdGFsbCkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZUFkbWl0cyhtb2RlOiBJbnN0YWxsTW9kZSwgdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uczogcmVhZG9ubHkgVmVyc2lvblJvd1tdKTogYm9vbGVhbiB7XG4gIGlmIChtb2RlLmtpbmQgPT09ICdleHBsaWNpdCcpIHJldHVybiBpbnN0YWxsQWRtaXRzKG1vZGUuaW5zdGFsbCwgdmVyc2lvbiwgdmVyc2lvbnMpO1xuICBjb25zdCByYW5nZSA9IGltcGxpY2l0SW5zdGFsbFJhbmdlKHZlcnNpb25zKTtcbiAgcmV0dXJuIHJhbmdlICE9PSBudWxsICYmIHNhdGlzZmllc1ZlcnNpb25TcGVjKHZlcnNpb24sIHJhbmdlKTtcbn1cblxuLyoqIElucHV0IHRvIHtAbGluayBzZWxlY3RMaXN0aW5nVmVyc2lvbn0uICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25DaG9pY2VJbnB1dDxWIGV4dGVuZHMgUGx1Z2luTGlzdGluZ1ZlcnNpb24gPSBQbHVnaW5MaXN0aW5nVmVyc2lvbj4ge1xuICByZWY6IHN0cmluZztcbiAgdmVyc2lvbnM6IHJlYWRvbmx5IFZbXTtcbiAgbW9kZTogSW5zdGFsbE1vZGU7XG4gIC8qKiBUaGUgcmVmZXJlbmNlJ3Mgb3duIHZlcnNpb24gc3BlYyAoYGZpbHRlci52ZXJzaW9uYCkuICovXG4gIHJlcXVlc3RlZD86IHN0cmluZztcbiAgYWR2aXNvcmllczogcmVhZG9ubHkgUGx1Z2luQWR2aXNvcnlbXTtcbiAgcG9saWN5OiBDb25zdW1wdGlvblBvbGljeTtcbiAgLyoqIFNraXAgLyByZWZ1c2UgcmVzY2FuLWZsYWdnZWQgdmVyc2lvbnMgKGRlZmF1bHQ6IGBQTFVHSU5fQkxPQ0tfT05fTkVXX0NSSVRJQ0FMYCkuICovXG4gIGJsb2NrRmxhZ2dlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGljayB0aGUgbGlzdGVkIHZlcnNpb24gYSByZWZlcmVuY2UgcmVzb2x2ZXMgdG8gKHNlZSB0aGUgbW9kdWxlIGRvYyksIG9yXG4gKiB0aGUgcmVmdXNhbCB0aGF0IGV4cGxhaW5zIHdoeSBub25lIGNhbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdExpc3RpbmdWZXJzaW9uPFYgZXh0ZW5kcyBQbHVnaW5MaXN0aW5nVmVyc2lvbj4oaW5wdXQ6IFZlcnNpb25DaG9pY2VJbnB1dDxWPik6IHsgdmVyc2lvbjogViB9IHwgeyByZWZ1c2FsOiBSZXNvbHV0aW9uUmVmdXNhbCB9IHtcbiAgY29uc3QgeyByZWYsIHZlcnNpb25zLCBtb2RlLCByZXF1ZXN0ZWQsIGFkdmlzb3JpZXMsIHBvbGljeSB9ID0gaW5wdXQ7XG4gIGNvbnN0IGJsb2NrRmxhZ2dlZCA9IGlucHV0LmJsb2NrRmxhZ2dlZCA/PyBibG9ja09uTmV3Q3JpdGljYWwoKTtcbiAgY29uc3QgZXhhY3QgPSByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCAmJiAhaXNWZXJzaW9uUmFuZ2UocmVxdWVzdGVkKSA/IHJlcXVlc3RlZC50cmltKCkgOiBudWxsO1xuXG4gIGlmIChleGFjdCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHYgPSB2ZXJzaW9ucy5maW5kKCh4KSA9PiB4LnZlcnNpb24gPT09IGV4YWN0KTtcbiAgICBpZiAoIXYpIHJldHVybiB7IHJlZnVzYWw6IHsgY29kZTogJ05PVF9GT1VORCcsIHJlYXNvbjogJ3ZlcnNpb25fbm90X2ZvdW5kJywgbWVzc2FnZTogYCR7cmVmfSBoYXMgbm8gcHVibGlzaGVkIHZlcnNpb24gJHtleGFjdH0uYCB9IH07XG4gICAgaWYgKHYueWFua2VkQXQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZnVzYWw6IHtcbiAgICAgICAgICBjb2RlOiAnUExVR0lOX1VOQVZBSUxBQkxFJyxcbiAgICAgICAgICByZWFzb246ICd5YW5rZWQnLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke3JlZn1AJHtleGFjdH0gaXMgeWFua2VkJHt2LnlhbmtSZWFzb24gPyBgOiAke3YueWFua1JlYXNvbn1gIDogJyd9LiBNb3ZlIHRvIGEgc3VwcG9ydGVkIHZlcnNpb24uYCxcbiAgICAgICAgICBkZXRhaWxzOiB7IHZlcnNpb246IGV4YWN0IH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAobW9kZS5raW5kID09PSAnZXhwbGljaXQnICYmICFpbnN0YWxsQWRtaXRzKG1vZGUuaW5zdGFsbCwgZXhhY3QsIHZlcnNpb25zKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVmdXNhbDoge1xuICAgICAgICAgIGNvZGU6ICdQTFVHSU5fTk9UX0lOU1RBTExFRCcsXG4gICAgICAgICAgcmVhc29uOiAndmVyc2lvbl9vdXRzaWRlX2luc3RhbGwnLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke3JlZn1AJHtleGFjdH0gaXMgb3V0c2lkZSB5b3VyIGluc3RhbGwgKCR7bW9kZS5pbnN0YWxsLnZlcnNpb25Qb2xpY3l9IGZyb20gJHttb2RlLmluc3RhbGwucGlubmVkVmVyc2lvbn0pLiBVcGdyYWRlIHRoZSBpbnN0YWxsIGZpcnN0LmAsXG4gICAgICAgICAgZGV0YWlsczogeyB2ZXJzaW9uOiBleGFjdCwgdmVyc2lvblBvbGljeTogbW9kZS5pbnN0YWxsLnZlcnNpb25Qb2xpY3ksIHBpbm5lZFZlcnNpb246IG1vZGUuaW5zdGFsbC5waW5uZWRWZXJzaW9uIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBibG9ja2luZyA9IGJsb2NraW5nQWR2aXNvcmllcyhhZHZpc29yaWVzLCBleGFjdCwgcG9saWN5KTtcbiAgICBpZiAoYmxvY2tpbmcubGVuZ3RoKSByZXR1cm4geyByZWZ1c2FsOiBhZHZpc29yeVJlZnVzYWwocmVmLCBleGFjdCwgYmxvY2tpbmcpIH07XG4gICAgaWYgKGJsb2NrRmxhZ2dlZCAmJiB2LnNjYW5GbGFnZ2VkQXQpIHJldHVybiB7IHJlZnVzYWw6IHZ1bG5SZWZ1c2FsKHJlZiwgdikgfTtcbiAgICByZXR1cm4geyB2ZXJzaW9uOiB2IH07XG4gIH1cblxuICBjb25zdCByZXNvbHZlZEJlZm9yZSA9IG1vZGUua2luZCA9PT0gJ2V4cGxpY2l0JyA/IG1vZGUuaW5zdGFsbC5yZXNvbHZlZFZlcnNpb24gOiBudWxsO1xuICAvLyBUaGUgcmFuZ2UgdGhlIElOU1RBTEwgYWxsb3dzLiBGb3IgdGhlIGltcGxpY2l0IGluc3RhbGwgYW4gZXhwbGljaXQgc3BlYyBvblxuICAvLyB0aGUgcmVmZXJlbmNlIHJlcGxhY2VzIHRoZSBpbXBsaWNpdCByYW5nZSAoaXQgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSkuXG4gIGNvbnN0IGFkbWl0dGVkID0gdmVyc2lvbnMuZmlsdGVyKCh2KSA9PiAhdi55YW5rZWRBdFxuICAgICYmIChtb2RlLmtpbmQgPT09ICdleHBsaWNpdCcgPyBpbnN0YWxsQWRtaXRzKG1vZGUuaW5zdGFsbCwgdi52ZXJzaW9uLCB2ZXJzaW9ucylcbiAgICAgIDogcmVxdWVzdGVkICE9PSB1bmRlZmluZWQgfHwgbW9kZUFkbWl0cyhtb2RlLCB2LnZlcnNpb24sIHZlcnNpb25zKSlcbiAgICAmJiAocmVxdWVzdGVkID09PSB1bmRlZmluZWQgfHwgc2F0aXNmaWVzVmVyc2lvblNwZWModi52ZXJzaW9uLCByZXF1ZXN0ZWQpKVxuICAgICYmICghdi5wYXVzZWRBdCB8fCB2LnZlcnNpb24gPT09IHJlc29sdmVkQmVmb3JlKSk7XG4gIGNvbnN0IGFsbG93ZWQgPSBhZG1pdHRlZC5maWx0ZXIoKHYpID0+IGJsb2NraW5nQWR2aXNvcmllcyhhZHZpc29yaWVzLCB2LnZlcnNpb24sIHBvbGljeSkubGVuZ3RoID09PSAwXG4gICAgJiYgIShibG9ja0ZsYWdnZWQgJiYgdi5zY2FuRmxhZ2dlZEF0KSk7XG4gIC8vIFJhbmdlcyBvbmx5IGFkbWl0IHByZXJlbGVhc2VzIHRoZXkgbmFtZSAobnBtIHNlbWFudGljcyksIHNvIHRoZSBoaWdoZXN0XG4gIC8vIGFkbWl0dGVkIHZlcnNpb24gaXMgdGhlIGFuc3dlci5cbiAgY29uc3QgYmVzdCA9IGhpZ2hlc3QoYWxsb3dlZC5tYXAoKHYpID0+IHYudmVyc2lvbikpO1xuICBpZiAoYmVzdCkgcmV0dXJuIHsgdmVyc2lvbjogYWxsb3dlZC5maW5kKCh2KSA9PiB2LnZlcnNpb24gPT09IGJlc3QpISB9O1xuXG4gIGlmIChhZG1pdHRlZC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbmV3ZXN0ID0gaGlnaGVzdChhZG1pdHRlZC5tYXAoKHYpID0+IHYudmVyc2lvbikpITtcbiAgICBjb25zdCBibG9ja2luZyA9IGJsb2NraW5nQWR2aXNvcmllcyhhZHZpc29yaWVzLCBuZXdlc3QsIHBvbGljeSk7XG4gICAgaWYgKGJsb2NraW5nLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgcmVmdXNhbDogdnVsblJlZnVzYWwocmVmLCBhZG1pdHRlZC5maW5kKCh2KSA9PiB2LnZlcnNpb24gPT09IG5ld2VzdCkhKSB9O1xuICAgIHJldHVybiB7IHJlZnVzYWw6IGFkdmlzb3J5UmVmdXNhbChyZWYsIG5ld2VzdCwgYmxvY2tpbmcpIH07XG4gIH1cbiAgaWYgKG1vZGUua2luZCA9PT0gJ2V4cGxpY2l0JyAmJiByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZFxuICAgICYmIHZlcnNpb25zLnNvbWUoKHYpID0+ICF2LnlhbmtlZEF0ICYmIHNhdGlzZmllc1ZlcnNpb25TcGVjKHYudmVyc2lvbiwgcmVxdWVzdGVkKSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmdXNhbDoge1xuICAgICAgICBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLFxuICAgICAgICByZWFzb246ICd2ZXJzaW9uX291dHNpZGVfaW5zdGFsbCcsXG4gICAgICAgIG1lc3NhZ2U6IGBObyB2ZXJzaW9uIG9mICR7cmVmfSBtYXRjaGluZyAke3JlcXVlc3RlZH0gaXMgaW5zaWRlIHlvdXIgaW5zdGFsbCAoJHttb2RlLmluc3RhbGwudmVyc2lvblBvbGljeX0gZnJvbSAke21vZGUuaW5zdGFsbC5waW5uZWRWZXJzaW9ufSkuIFVwZ3JhZGUgdGhlIGluc3RhbGwgZmlyc3QuYCxcbiAgICAgICAgZGV0YWlsczogeyByZXF1ZXN0ZWQsIHZlcnNpb25Qb2xpY3k6IG1vZGUuaW5zdGFsbC52ZXJzaW9uUG9saWN5LCBwaW5uZWRWZXJzaW9uOiBtb2RlLmluc3RhbGwucGlubmVkVmVyc2lvbiB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgcmVmdXNhbDoge1xuICAgICAgY29kZTogJ05PVF9GT1VORCcsXG4gICAgICByZWFzb246ICdub19tYXRjaGluZ192ZXJzaW9uJyxcbiAgICAgIG1lc3NhZ2U6IGBObyByZXNvbHZhYmxlIHZlcnNpb24gb2YgJHtyZWZ9JHtyZXF1ZXN0ZWQgPyBgIG1hdGNoZXMgJHtyZXF1ZXN0ZWR9YCA6ICcnfS5gLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKiBUaGUgaGlnaGVzdCBvZiBgdmVyc2lvbnNgIGJ5IHNlbXZlciAocHJlcmVsZWFzZXMgaW5jbHVkZWQpLiAqL1xuZnVuY3Rpb24gaGlnaGVzdCh2ZXJzaW9uczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHZlcnNpb25zLnJlZHVjZTxzdHJpbmcgfCBudWxsPigoYmVzdCwgdikgPT4gKGJlc3QgPT09IG51bGwgfHwgY29tcGFyZVNlbXZlcih2LCBiZXN0KSA+IDAgPyB2IDogYmVzdCksIG51bGwpO1xufVxuXG5mdW5jdGlvbiBhZHZpc29yeVJlZnVzYWwocmVmOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgYmxvY2tpbmc6IFJlYWRvbmx5QXJyYXk8UGljazxQbHVnaW5BZHZpc29yeSwgJ2lkJyB8ICdzZXZlcml0eScgfCAnZml4ZWRWZXJzaW9uJyB8ICdzdW1tYXJ5Jz4+KTogUmVzb2x1dGlvblJlZnVzYWwge1xuICBjb25zdCBmaXhlZCA9IGJsb2NraW5nLm1hcCgoYSkgPT4gYS5maXhlZFZlcnNpb24pLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+ICEhdik7XG4gIHJldHVybiB7XG4gICAgY29kZTogJ1BMVUdJTl9CTE9DS0VEX0JZX1BPTElDWScsXG4gICAgcmVhc29uOiAnYWR2aXNvcnknLFxuICAgIG1lc3NhZ2U6IGAke3JlZn1AJHt2ZXJzaW9ufSBpcyBibG9ja2VkIGJ5IHlvdXIgb3JnYW5pemF0aW9uJ3MgYWR2aXNvcnkgcG9saWN5OiAke2Jsb2NraW5nLm1hcCgoYSkgPT4gYCR7YS5zZXZlcml0eX0g4oCUICR7YS5zdW1tYXJ5fWApLmpvaW4oJzsgJyl9LmBcbiAgICAgICsgKGZpeGVkLmxlbmd0aCA/IGAgRml4ZWQgaW4gJHtmaXhlZC5qb2luKCcsICcpfS5gIDogJycpLFxuICAgIGRldGFpbHM6IHsgdmVyc2lvbiwgYWR2aXNvcmllczogYmxvY2tpbmcubWFwKChhKSA9PiBhLmlkKSwgLi4uKGZpeGVkLmxlbmd0aCA/IHsgZml4ZWRWZXJzaW9uczogZml4ZWQgfSA6IHt9KSB9LFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlIG9yZydzIGluc3RhbGwgc3RhdGUgZm9yIG9uZSBsaXN0aW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogVGhlIG9yZyAoYW5kLCBmb3IgYSB0ZWFtLCBpdHMgcm9vdCBvcmcpIGEgcmVzb2x1dGlvbiBydW5zIGZvci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x1dGlvblNjb3BlIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgLyoqIFRoZSByb290IG9yZyB3aGVuIHRoZSBjYWxsZXIgaXMgYSB0ZWFtLiAqL1xuICByb290T3JnSWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgb3JnIGlkcyB3aG9zZSBpbnN0YWxscyBhbmQgcG9saWNpZXMgYXBwbHksIG93biBmaXJzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY29wZU9yZ0lkcyhzY29wZTogUmVzb2x1dGlvblNjb3BlKTogc3RyaW5nW10ge1xuICBjb25zdCBvd24gPSBzY29wZS5vcmdJZC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCByb290ID0gc2NvcGUucm9vdE9yZ0lkPy50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gcm9vdCAmJiByb290ICE9PSBvd24gPyBbb3duLCByb290XSA6IFtvd25dO1xufVxuXG4vKipcbiAqIEhvdyB0aGUgb3JnIHJlYWNoZXMgYGxpc3RpbmdgIOKAlCBvciB0aGUgcmVmdXNhbC4gQW4gQUNUSVZFIG93bi1vcmcgcm93IHdpbnMsXG4gKiB0aGVuIHRoZSByb290IG9yZydzIChhIHRlYW0gaW5oZXJpdHMgaXQpOyBmYWlsaW5nIGJvdGgsIHRoZSBpbXBsaWNpdFxuICogT2ZmaWNpYWwgaW5zdGFsbCAodW5sZXNzIHRoZSBwb2xpY3kgaXMgYGV4cGxpY2l0YCk7IG90aGVyd2lzZSB0aGUgb3JnJ3Mgb3duXG4gKiBwZW5kaW5nIC8gZGVuaWVkIHJvdyBleHBsYWlucyB0aGUgcmVmdXNhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxNb2RlRm9yKFxuICBwdWJsaXNoZXI6IFBpY2s8UHVibGlzaGVyLCAnaGFuZGxlJz4sXG4gIGxpc3Rpbmc6IFBpY2s8UGx1Z2luTGlzdGluZywgJ2lkJyB8ICduYW1lJz4sXG4gIGluc3RhbGxzOiByZWFkb25seSBQbHVnaW5JbnN0YWxsW10sXG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3ksXG4gIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGUsXG4pOiBJbnN0YWxsTW9kZSB8IFJlc29sdXRpb25SZWZ1c2FsIHtcbiAgY29uc3QgW293biwgcm9vdF0gPSBzY29wZU9yZ0lkcyhzY29wZSk7XG4gIGNvbnN0IGZvckxpc3RpbmcgPSBpbnN0YWxscy5maWx0ZXIoKGkpID0+IGkubGlzdGluZ0lkID09PSBsaXN0aW5nLmlkKTtcbiAgY29uc3Qgb3duUm93ID0gZm9yTGlzdGluZy5maW5kKChpKSA9PiBpLm9yZ0lkLnRvTG93ZXJDYXNlKCkgPT09IG93bik7XG4gIGNvbnN0IHJvb3RSb3cgPSByb290ID8gZm9yTGlzdGluZy5maW5kKChpKSA9PiBpLm9yZ0lkLnRvTG93ZXJDYXNlKCkgPT09IHJvb3QpIDogdW5kZWZpbmVkO1xuICBpZiAob3duUm93Py5zdGF0dXMgPT09ICdhY3RpdmUnKSByZXR1cm4geyBraW5kOiAnZXhwbGljaXQnLCBpbnN0YWxsOiBvd25Sb3csIGluaGVyaXRlZDogZmFsc2UgfTtcbiAgaWYgKHJvb3RSb3c/LnN0YXR1cyA9PT0gJ2FjdGl2ZScpIHJldHVybiB7IGtpbmQ6ICdleHBsaWNpdCcsIGluc3RhbGw6IHJvb3RSb3csIGluaGVyaXRlZDogdHJ1ZSB9O1xuICBjb25zdCByZWYgPSBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gO1xuICBpZiAocHVibGlzaGVyLmhhbmRsZSA9PT0gT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRSkge1xuICAgIGlmIChwb2xpY3kub2ZmaWNpYWxJbnN0YWxscyA9PT0gJ2ltcGxpY2l0JykgcmV0dXJuIHsga2luZDogJ2ltcGxpY2l0JyB9O1xuICAgIGlmICghb3duUm93KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLFxuICAgICAgICByZWFzb246ICdvZmZpY2lhbF9leHBsaWNpdCcsXG4gICAgICAgIG1lc3NhZ2U6IGBZb3VyIG9yZ2FuaXphdGlvbiBpbnN0YWxscyBPZmZpY2lhbCBwbHVnaW5zIGV4cGxpY2l0bHk7IGluc3RhbGwgJHtyZWZ9IGZpcnN0LmAsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBpZiAob3duUm93Py5zdGF0dXMgPT09ICdwZW5kaW5nX2FwcHJvdmFsJykge1xuICAgIHJldHVybiB7IGNvZGU6ICdQTFVHSU5fTk9UX0lOU1RBTExFRCcsIHJlYXNvbjogJ3BlbmRpbmdfYXBwcm92YWwnLCBtZXNzYWdlOiBgVGhlIGluc3RhbGwgb2YgJHtyZWZ9IGlzIHdhaXRpbmcgZm9yIGFwcHJvdmFsLmAgfTtcbiAgfVxuICBpZiAob3duUm93Py5zdGF0dXMgPT09ICdkZW5pZWQnKSB7XG4gICAgcmV0dXJuIHsgY29kZTogJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJywgcmVhc29uOiAnZGVuaWVkJywgbWVzc2FnZTogYFRoZSBpbnN0YWxsIG9mICR7cmVmfSB3YXMgZGVuaWVkLmAgfTtcbiAgfVxuICByZXR1cm4geyBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLCByZWFzb246ICdub3RfaW5zdGFsbGVkJywgbWVzc2FnZTogYCR7cmVmfSBpcyBub3QgaW5zdGFsbGVkIGluIHlvdXIgb3JnYW5pemF0aW9uLmAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERhdGEgc291cmNlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogVGhlIHJvd3MgdGhlIHJlc29sdmVyIHJlYWRzLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBydW4gd2l0aCBhIHNjb3BlIHRoYXQgY2FuXG4gKiAgcmVhZCB0aGUgZWNvc3lzdGVtIHRhYmxlcyBhbmQgdGhlIG9yZydzIChhbmQgcm9vdCBvcmcncykgaW5zdGFsbCByb3dzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0aW5nRGF0YVNvdXJjZSB7XG4gIHB1Ymxpc2hlckJ5SGFuZGxlKGhhbmRsZTogc3RyaW5nKTogUHJvbWlzZTxQdWJsaXNoZXIgfCBudWxsPjtcbiAgcHVibGlzaGVyc0J5SWRzKGlkczogc3RyaW5nW10pOiBQcm9taXNlPFB1Ymxpc2hlcltdPjtcbiAgbGlzdGluZ0J5TmFtZShwdWJsaXNoZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBsdWdpbkxpc3RpbmcgfCBudWxsPjtcbiAgLyoqIExpc3RlZCAvIHVubWFpbnRhaW5lZCBsaXN0aW5ncyAob3B0aW9uYWxseSBvbmx5IHRoZXNlIGlkcyBvciBuYW1lcykuICovXG4gIGxpdmVMaXN0aW5ncyhmaWx0ZXI/OiB7IGlkcz86IHN0cmluZ1tdOyBuYW1lcz86IHN0cmluZ1tdIH0pOiBQcm9taXNlPFBsdWdpbkxpc3RpbmdbXT47XG4gIHZlcnNpb25zRm9yTGlzdGluZ3MobGlzdGluZ0lkczogc3RyaW5nW10pOiBQcm9taXNlPFBsdWdpbkxpc3RpbmdWZXJzaW9uW10+O1xuICAvKiogUFVCTElTSEVEIGFkdmlzb3JpZXMuICovXG4gIGFkdmlzb3JpZXNGb3JMaXN0aW5ncyhsaXN0aW5nSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luQWR2aXNvcnlbXT47XG4gIGluc3RhbGxzRm9yT3JncyhvcmdJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxQbHVnaW5JbnN0YWxsW10+O1xuICBwb2xpY2llc0Zvck9yZ3Mob3JnSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luSW5zdGFsbFBvbGljeVtdPjtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBMaXN0aW5nRGF0YVNvdXJjZX0gb3ZlciBhIGRyaXp6bGUgdHJhbnNhY3Rpb24uIFRoZSBjYWxsZXIgb3ducyB0aGVcbiAqIHRyYW5zYWN0aW9uJ3Mgc2NvcGU6IGl0IG11c3QgYmUgYWJsZSB0byByZWFkIHRoZSBlY29zeXN0ZW0gdGFibGVzIChhcHAtcm9sZVxuICogUkxTKSBhbmQgdGhlIGluc3RhbGwgcm93cyBvZiB0aGUgb3JnIEFORCBpdHMgcm9vdCBvcmcgKGEgdGVhbSdzIHJlYWRzIG9mIGl0c1xuICogcm9vdCdzIHJvd3MgbmVlZCBhbiBlbGV2YXRlZCBzY29wZSwgbGlrZSBwYXJlbnQtb3JnIHBsdWdpbiByZWFkcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcml6emxlTGlzdGluZ1NvdXJjZSh0eDogQ3J1ZFR4KTogTGlzdGluZ0RhdGFTb3VyY2Uge1xuICBjb25zdCBkYiA9IHR4O1xuICBjb25zdCBQID0gc2NoZW1hLnB1Ymxpc2hlcjtcbiAgY29uc3QgTCA9IHNjaGVtYS5wbHVnaW5MaXN0aW5nO1xuICBjb25zdCBWID0gc2NoZW1hLnBsdWdpbkxpc3RpbmdWZXJzaW9uO1xuICBjb25zdCBBID0gc2NoZW1hLnBsdWdpbkFkdmlzb3J5O1xuICBjb25zdCBJID0gc2NoZW1hLnBsdWdpbkluc3RhbGw7XG4gIGNvbnN0IElQID0gc2NoZW1hLnBsdWdpbkluc3RhbGxQb2xpY3k7XG4gIHJldHVybiB7XG4gICAgcHVibGlzaGVyQnlIYW5kbGU6IGFzeW5jIChoYW5kbGUpID0+ICgoYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShQKS53aGVyZShlcShQLmhhbmRsZSwgaGFuZGxlKSkpIGFzIFB1Ymxpc2hlcltdKVswXSA/PyBudWxsLFxuICAgIHB1Ymxpc2hlcnNCeUlkczogYXN5bmMgKGlkcykgPT4gKGlkcy5sZW5ndGggPyBkYi5zZWxlY3QoKS5mcm9tKFApLndoZXJlKGluQXJyYXkoUC5pZCwgaWRzKSkgOiBbXSksXG4gICAgbGlzdGluZ0J5TmFtZTogYXN5bmMgKHB1Ymxpc2hlcklkLCBuYW1lKSA9PlxuICAgICAgKChhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKEwpLndoZXJlKGFuZChlcShMLnB1Ymxpc2hlcklkLCBwdWJsaXNoZXJJZCksIGVxKEwubmFtZSwgbmFtZSkpKSkgYXMgUGx1Z2luTGlzdGluZ1tdKVswXSA/PyBudWxsLFxuICAgIGxpdmVMaXN0aW5nczogYXN5bmMgKGZpbHRlciA9IHt9KSA9PiB7XG4gICAgICBpZiAoZmlsdGVyLmlkcyAmJiBmaWx0ZXIuaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgaWYgKGZpbHRlci5uYW1lcyAmJiBmaWx0ZXIubmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICByZXR1cm4gZGIuc2VsZWN0KCkuZnJvbShMKS53aGVyZShhbmQoXG4gICAgICAgIGluQXJyYXkoTC5zdGF0ZSwgWydsaXN0ZWQnLCAndW5tYWludGFpbmVkJ10pLFxuICAgICAgICAuLi4oZmlsdGVyLmlkcyA/IFtpbkFycmF5KEwuaWQsIGZpbHRlci5pZHMpXSA6IFtdKSxcbiAgICAgICAgLi4uKGZpbHRlci5uYW1lcyA/IFtpbkFycmF5KEwubmFtZSwgZmlsdGVyLm5hbWVzKV0gOiBbXSksXG4gICAgICApKTtcbiAgICB9LFxuICAgIHZlcnNpb25zRm9yTGlzdGluZ3M6IGFzeW5jIChpZHMpID0+IChpZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShWKS53aGVyZShpbkFycmF5KFYubGlzdGluZ0lkLCBpZHMpKSA6IFtdKSxcbiAgICBhZHZpc29yaWVzRm9yTGlzdGluZ3M6IGFzeW5jIChpZHMpID0+IChpZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShBKS53aGVyZShhbmQoaW5BcnJheShBLmxpc3RpbmdJZCwgaWRzKSwgZXEoQS5zdGF0ZSwgJ3B1Ymxpc2hlZCcpKSkgOiBbXSksXG4gICAgaW5zdGFsbHNGb3JPcmdzOiBhc3luYyAob3JnSWRzKSA9PiAob3JnSWRzLmxlbmd0aCA/IGRiLnNlbGVjdCgpLmZyb20oSSkud2hlcmUoaW5BcnJheShJLm9yZ0lkLCBvcmdJZHMpKSA6IFtdKSxcbiAgICBwb2xpY2llc0Zvck9yZ3M6IGFzeW5jIChvcmdJZHMpID0+IChvcmdJZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShJUCkud2hlcmUoaW5BcnJheShJUC5vcmdJZCwgb3JnSWRzKSkgOiBbXSksXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXNvbHV0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQSBwbHVnaW4gcmVmZXJlbmNlIGFzIHRoZSByZXNvbHZlciByZWFkcyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ1JlZmVyZW5jZSB7XG4gIC8qKiBQdWJsaXNoZXIgaGFuZGxlOyBhYnNlbnQgPSB0aGUgT2ZmaWNpYWwgbGlzdGluZyAodGhlIHVucXVhbGlmaWVkIGZhbGxiYWNrKS4gKi9cbiAgcHVibGlzaGVyPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmVmZXJlbmNlJ3MgYGZpbHRlci52ZXJzaW9uYC4gKi9cbiAgdmVyc2lvbj86IHN0cmluZztcbn1cblxuLyoqIEEgcmVmZXJlbmNlIHRoYXQgcmVzb2x2ZWQgdG8gYSBsaXN0ZWQgdmVyc2lvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ1Jlc29sdmVkIHtcbiAgb2s6IHRydWU7XG4gIHB1Ymxpc2hlcjogUHVibGlzaGVyO1xuICBsaXN0aW5nOiBQbHVnaW5MaXN0aW5nO1xuICB2ZXJzaW9uOiBQbHVnaW5MaXN0aW5nVmVyc2lvbjtcbiAgbW9kZTogSW5zdGFsbE1vZGU7XG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3k7XG4gIC8qKiBUaGUgc3BlYyBkZWNsYXJlcyBzZWNyZXRzIHRoZSBwb2xpY3kgd2l0aGhvbGRzIGZyb20gdGhpcyB0aWVyLiAqL1xuICBzZWNyZXRzV2l0aGhlbGQ6IGJvb2xlYW47XG4gIHdhcm5pbmdzOiBSZXNvbHV0aW9uV2FybmluZ1tdO1xufVxuXG4vKiogQSByZWZlcmVuY2UgdGhhdCBuYW1lZCBhIGxpc3RpbmcgYnV0IGNhbid0IHJlc29sdmUuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RpbmdSZWZ1c2VkIHtcbiAgb2s6IGZhbHNlO1xuICByZWZ1c2FsOiBSZXNvbHV0aW9uUmVmdXNhbDtcbiAgcHVibGlzaGVyPzogUHVibGlzaGVyO1xuICBsaXN0aW5nPzogUGx1Z2luTGlzdGluZztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGByZWZgIHRvIGEgbGlzdGVkIHZlcnNpb24gZm9yIGBzY29wZWAsIG9yIHJlZnVzZS4gTnVsbCB3aGVuIHRoZVxuICogbGlzdGluZyBkb2Vzbid0IGV4aXN0IGF0IGFsbCAoYW4gdW5xdWFsaWZpZWQgcmVmZXJlbmNlIHRoZW4gc2ltcGx5IGhhcyBub1xuICogT2ZmaWNpYWwgZmFsbGJhY2spLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxpc3RpbmdSZWZlcmVuY2UoXG4gIHNvdXJjZTogTGlzdGluZ0RhdGFTb3VyY2UsXG4gIHJlZjogTGlzdGluZ1JlZmVyZW5jZSxcbiAgc2NvcGU6IFJlc29sdXRpb25TY29wZSxcbik6IFByb21pc2U8TGlzdGluZ1Jlc29sdmVkIHwgTGlzdGluZ1JlZnVzZWQgfCBudWxsPiB7XG4gIGNvbnN0IGhhbmRsZSA9IHJlZi5wdWJsaXNoZXIgPz8gT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRTtcbiAgY29uc3QgcHVibGlzaGVyID0gYXdhaXQgc291cmNlLnB1Ymxpc2hlckJ5SGFuZGxlKGhhbmRsZSk7XG4gIGlmICghcHVibGlzaGVyKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbGlzdGluZyA9IGF3YWl0IHNvdXJjZS5saXN0aW5nQnlOYW1lKHB1Ymxpc2hlci5pZCwgcmVmLm5hbWUpO1xuICBpZiAoIWxpc3RpbmcpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG9yZ0lkcyA9IHNjb3BlT3JnSWRzKHNjb3BlKTtcbiAgY29uc3QgW3BvbGljaWVzLCBpbnN0YWxsc10gPSBhd2FpdCBQcm9taXNlLmFsbChbc291cmNlLnBvbGljaWVzRm9yT3JncyhvcmdJZHMpLCBzb3VyY2UuaW5zdGFsbHNGb3JPcmdzKG9yZ0lkcyldKTtcbiAgY29uc3QgcG9saWN5ID0gZWZmZWN0aXZlQ29uc3VtcHRpb25Qb2xpY3kocG9saWNpZXMsIG9yZ0lkc1swXSEsIG9yZ0lkc1sxXSk7XG4gIGNvbnN0IGJsb2NrID0gbGlzdGluZ0Jsb2NrKHBvbGljeSwgcHVibGlzaGVyLCBsaXN0aW5nKTtcbiAgaWYgKGJsb2NrKSByZXR1cm4geyBvazogZmFsc2UsIHJlZnVzYWw6IGJsb2NrUmVmdXNhbChibG9jayksIHB1Ymxpc2hlciwgbGlzdGluZyB9O1xuXG4gIGNvbnN0IG1vZGUgPSBpbnN0YWxsTW9kZUZvcihwdWJsaXNoZXIsIGxpc3RpbmcsIGluc3RhbGxzLCBwb2xpY3ksIHNjb3BlKTtcbiAgaWYgKCdjb2RlJyBpbiBtb2RlKSByZXR1cm4geyBvazogZmFsc2UsIHJlZnVzYWw6IG1vZGUsIHB1Ymxpc2hlciwgbGlzdGluZyB9O1xuXG4gIGNvbnN0IFt2ZXJzaW9ucywgYWR2aXNvcmllc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgc291cmNlLnZlcnNpb25zRm9yTGlzdGluZ3MoW2xpc3RpbmcuaWRdKSxcbiAgICBzb3VyY2UuYWR2aXNvcmllc0Zvckxpc3RpbmdzKFtsaXN0aW5nLmlkXSksXG4gIF0pO1xuICBjb25zdCByZWZfID0gYCR7cHVibGlzaGVyLmhhbmRsZX0vJHtsaXN0aW5nLm5hbWV9YDtcbiAgY29uc3QgY2hvaWNlID0gc2VsZWN0TGlzdGluZ1ZlcnNpb24oeyByZWY6IHJlZl8sIHZlcnNpb25zLCBtb2RlLCByZXF1ZXN0ZWQ6IHJlZi52ZXJzaW9uLCBhZHZpc29yaWVzLCBwb2xpY3kgfSk7XG4gIGlmICgncmVmdXNhbCcgaW4gY2hvaWNlKSByZXR1cm4geyBvazogZmFsc2UsIHJlZnVzYWw6IGNob2ljZS5yZWZ1c2FsLCBwdWJsaXNoZXIsIGxpc3RpbmcgfTtcblxuICBjb25zdCB2ZXJzaW9uID0gY2hvaWNlLnZlcnNpb247XG4gIGNvbnN0IHsgd2FybmluZ3MsIHNlY3JldHNXaXRoaGVsZCB9ID0gbGlzdGVkVmVyc2lvbldhcm5pbmdzKHsgcHVibGlzaGVyLCBsaXN0aW5nLCB2ZXJzaW9uLCBhZHZpc29yaWVzLCBwb2xpY3kgfSk7XG4gIHJldHVybiB7IG9rOiB0cnVlLCBwdWJsaXNoZXIsIGxpc3RpbmcsIHZlcnNpb24sIG1vZGUsIHBvbGljeSwgc2VjcmV0c1dpdGhoZWxkLCB3YXJuaW5ncyB9O1xufVxuXG4vKipcbiAqIFRoZSBub24tZmF0YWwgbm90ZXMgYSByZXNvbHZlZCBsaXN0ZWQgdmVyc2lvbiBjYXJyaWVzIChsb29rdXAgYW5zd2VycyxcbiAqIHN5bnRoIHByaW50cyB0aGVtLCB0aGUgaW5zdGFsbHMgdmlldyBzaG93cyB0aGVtKTogYW4gdW5tYWludGFpbmVkIGxpc3RpbmcsIGFcbiAqIGRlcHJlY2F0ZWQgdmVyc2lvbiwgYSBQVUJMSVNIRUQgYWR2aXNvcnkgY292ZXJpbmcgdGhlIHZlcnNpb24gdGhhdCB0aGUgb3JnJ3NcbiAqIGBibG9ja09uQWR2aXNvcnlgIGRvZXNuJ3QgYmxvY2sgKGEgYmxvY2tpbmcgb25lIHJlZnVzZXMgcmVzb2x1dGlvbiBpbnN0ZWFkKSxcbiAqIGFuZCB3aXRoaGVsZCBzZWNyZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVkVmVyc2lvbldhcm5pbmdzKGlucHV0OiB7XG4gIHB1Ymxpc2hlcjogUGljazxQdWJsaXNoZXIsICdoYW5kbGUnIHwgJ3RpZXInPjtcbiAgbGlzdGluZzogUGljazxQbHVnaW5MaXN0aW5nLCAnbmFtZScgfCAnc3RhdGUnPjtcbiAgdmVyc2lvbjogUGljazxQbHVnaW5MaXN0aW5nVmVyc2lvbiwgJ3ZlcnNpb24nIHwgJ2RlcHJlY2F0ZWRBdCcgfCAnZGVwcmVjYXRpb25NZXNzYWdlJyB8ICdzcGVjU25hcHNob3QnPlxuICAgICYgUGFydGlhbDxQaWNrPFBsdWdpbkxpc3RpbmdWZXJzaW9uLCAnc2NhbkZsYWdnZWRBdCcgfCAnc2NhbkZsYWcnPj47XG4gIGFkdmlzb3JpZXM6IHJlYWRvbmx5IFBpY2s8UGx1Z2luQWR2aXNvcnksICdzZXZlcml0eScgfCAnc3RhdGUnIHwgJ2FmZmVjdGVkUmFuZ2UnIHwgJ2ZpeGVkVmVyc2lvbicgfCAnc3VtbWFyeSc+W107XG4gIHBvbGljeTogUGljazxDb25zdW1wdGlvblBvbGljeSwgJ3NlY3JldHNBbGxvd2VkVGllcnMnPjtcbn0pOiB7IHdhcm5pbmdzOiBSZXNvbHV0aW9uV2FybmluZ1tdOyBzZWNyZXRzV2l0aGhlbGQ6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBsaXN0aW5nLCB2ZXJzaW9uLCBhZHZpc29yaWVzLCBwb2xpY3kgfSA9IGlucHV0O1xuICBjb25zdCByZWYgPSBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gO1xuICBjb25zdCBkZWNsYXJlc1NlY3JldHMgPSAodmVyc2lvbi5zcGVjU25hcHNob3Q/LnNlY3JldHMgPz8gW10pLmxlbmd0aCA+IDA7XG4gIGNvbnN0IHNlY3JldHNXaXRoaGVsZCA9IGRlY2xhcmVzU2VjcmV0cyAmJiAhcG9saWN5LnNlY3JldHNBbGxvd2VkVGllcnMuaW5jbHVkZXMocHVibGlzaGVyLnRpZXIpO1xuICBjb25zdCB3YXJuaW5nczogUmVzb2x1dGlvbldhcm5pbmdbXSA9IFtdO1xuICBpZiAobGlzdGluZy5zdGF0ZSA9PT0gJ3VubWFpbnRhaW5lZCcpIHtcbiAgICB3YXJuaW5ncy5wdXNoKHsgY29kZTogJ0xJU1RJTkdfVU5NQUlOVEFJTkVEJywgbWVzc2FnZTogYCR7cmVmfSBpcyB1bm1haW50YWluZWQ6IGl0IHJlY2VpdmVzIG5vIHVwZGF0ZXMuIFBsYW4gYSByZXBsYWNlbWVudC5gIH0pO1xuICB9XG4gIGlmICh2ZXJzaW9uLmRlcHJlY2F0ZWRBdCkge1xuICAgIHdhcm5pbmdzLnB1c2goeyBjb2RlOiAnUExVR0lOX0RFUFJFQ0FURUQnLCBtZXNzYWdlOiBgJHtyZWZ9QCR7dmVyc2lvbi52ZXJzaW9ufSBpcyBkZXByZWNhdGVkJHt2ZXJzaW9uLmRlcHJlY2F0aW9uTWVzc2FnZSA/IGA6ICR7dmVyc2lvbi5kZXByZWNhdGlvbk1lc3NhZ2V9YCA6ICcnfS5gIH0pO1xuICB9XG4gIGZvciAoY29uc3QgYSBvZiBhZHZpc29yaWVzQ292ZXJpbmcoYWR2aXNvcmllcywgdmVyc2lvbi52ZXJzaW9uKSkge1xuICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgY29kZTogJ1BMVUdJTl9BRFZJU09SWScsXG4gICAgICBtZXNzYWdlOiBgJHtyZWZ9QCR7dmVyc2lvbi52ZXJzaW9ufSBpcyBhZmZlY3RlZCBieSBhICR7YS5zZXZlcml0eX0gc2VjdXJpdHkgYWR2aXNvcnk6ICR7YS5zdW1tYXJ5fWBcbiAgICAgICAgKyBgJHthLmZpeGVkVmVyc2lvbiA/IGAgRml4ZWQgaW4gJHthLmZpeGVkVmVyc2lvbn0uYCA6ICcnfWAsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgZmxhZyA9IHZlcnNpb24uc2NhbkZsYWdnZWRBdCA/IGFzU2NhbkZsYWcodmVyc2lvbi5zY2FuRmxhZykgOiBudWxsO1xuICBpZiAoZmxhZykgd2FybmluZ3MucHVzaCh2dWxuRmxhZ2dlZFdhcm5pbmcocmVmLCB2ZXJzaW9uLnZlcnNpb24sIGZsYWcpKTtcbiAgaWYgKHNlY3JldHNXaXRoaGVsZCkge1xuICAgIHdhcm5pbmdzLnB1c2goeyBjb2RlOiAnUExVR0lOX1NFQ1JFVFNfV0lUSEhFTEQnLCBtZXNzYWdlOiBgJHtyZWZ9IGlzIGEgJHtwdWJsaXNoZXIudGllcn0gcGx1Z2luOyB5b3VyIG9yZ2FuaXphdGlvbidzIHBvbGljeSBnaXZlcyBpdCBubyBzZWNyZXRzLCBzbyBpdHMgZGVjbGFyZWQgc2VjcmV0cyBhcmUgbm90IGluamVjdGVkLmAgfSk7XG4gIH1cbiAgcmV0dXJuIHsgd2FybmluZ3MsIHNlY3JldHNXaXRoaGVsZCB9O1xufVxuXG4vKipcbiAqIFRoZSBwbHVnaW4gcmVjb3JkIGEgcmVzb2x2ZWQgbGlzdGluZyB2ZXJzaW9uIHJ1bnMgYXMg4oCUIHRoZSBzaGFwZSBzeW50aCBhbmRcbiAqIHRoZSBjb250cmFjdCBjaGVjayByZWFkIChhIGBwbHVnaW5zYCByb3cncyBydW4gZmllbGRzKSwgYnVpbHQgZnJvbSB0aGVcbiAqIHZlcnNpb24ncyBmcm96ZW4gc3BlYyBzbmFwc2hvdC4gYGlkYCBpcyB0aGUgTElTVElORyBWRVJTSU9OJ3MgaWQgKHRoZSBzdGVwXG4gKiBtYW5pZmVzdCByZXNvbHZlcyBpdCBiYWNrKSwgYGltYWdlUmVwb3NpdG9yeWAgaXRzIGBwdWJsaWMvKmAgY29weS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlZFBsdWdpblJlY29yZChyZXM6IExpc3RpbmdSZXNvbHZlZCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgeyBwdWJsaXNoZXIsIGxpc3RpbmcsIHZlcnNpb24sIG1vZGUgfSA9IHJlcztcbiAgY29uc3QgcyA9ICh2ZXJzaW9uLnNwZWNTbmFwc2hvdCA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGFyciA9IDxUPih2OiB1bmtub3duKTogVFtdID0+IChBcnJheS5pc0FycmF5KHYpID8gdiBhcyBUW10gOiBbXSk7XG4gIGNvbnN0IG9iaiA9ICh2OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gKHYgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHYpID8gdiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA6IHt9KTtcbiAgcmV0dXJuIHtcbiAgICBpZDogdmVyc2lvbi5pZCxcbiAgICBzb3VyY2U6ICdsaXN0aW5nJyxcbiAgICBwdWJsaXNoZXI6IHB1Ymxpc2hlci5oYW5kbGUsXG4gICAgcHVibGlzaGVyVGllcjogcHVibGlzaGVyLnRpZXIsXG4gICAgbGlzdGluZ0lkOiBsaXN0aW5nLmlkLFxuICAgIGluc3RhbGw6IG1vZGUua2luZCxcbiAgICBuYW1lOiBsaXN0aW5nLm5hbWUsXG4gICAgdmVyc2lvbjogdmVyc2lvbi52ZXJzaW9uLFxuICAgIGltYWdlUmVwb3NpdG9yeTogdmVyc2lvbi5pbWFnZVJlcG9zaXRvcnksXG4gICAgaW1hZ2VEaWdlc3Q6IHZlcnNpb24uaW1hZ2VEaWdlc3QsXG4gICAgYnVpbGRUeXBlOiB0eXBlb2Ygcy5idWlsZFR5cGUgPT09ICdzdHJpbmcnID8gcy5idWlsZFR5cGUgOiAodmVyc2lvbi5pbWFnZURpZ2VzdCA/ICdidWlsZF9pbWFnZScgOiAnbWV0YWRhdGFfb25seScpLFxuICAgIHBsdWdpblR5cGU6IHMucGx1Z2luVHlwZSA/PyAnQ29kZUJ1aWxkU3RlcCcsXG4gICAgY29tcHV0ZVR5cGU6IHMuY29tcHV0ZVR5cGUgPz8gJ1NNQUxMJyxcbiAgICBkZXNjcmlwdGlvbjogcy5kZXNjcmlwdGlvbiA/PyBsaXN0aW5nLmRlc2NyaXB0aW9uID8/IG51bGwsXG4gICAgc3VtbWFyeTogcy5zdW1tYXJ5ID8/IGxpc3Rpbmcuc3VtbWFyeSA/PyBudWxsLFxuICAgIGRpc3BsYXlOYW1lOiBzLmRpc3BsYXlOYW1lID8/IG51bGwsXG4gICAga2V5d29yZHM6IGFycjxzdHJpbmc+KHMua2V5d29yZHMpLFxuICAgIGNhdGVnb3J5OiBzLmNhdGVnb3J5ID8/IGxpc3RpbmcuY2F0ZWdvcnksXG4gICAgbWV0YWRhdGE6IG9iaihzLm1ldGFkYXRhKSxcbiAgICBlbnY6IG9iaihzLmVudiksXG4gICAgYnVpbGRBcmdzOiB7fSxcbiAgICBpbnN0YWxsQ29tbWFuZHM6IGFycjxzdHJpbmc+KHMuaW5zdGFsbENvbW1hbmRzKSxcbiAgICBjb21tYW5kczogYXJyPHN0cmluZz4ocy5jb21tYW5kcyksXG4gICAgdGltZW91dDogcy50aW1lb3V0ID8/IG51bGwsXG4gICAgZmFpbHVyZUJlaGF2aW9yOiBzLmZhaWx1cmVCZWhhdmlvciA/PyAnZmFpbCcsXG4gICAgcHJpbWFyeU91dHB1dERpcmVjdG9yeTogcy5wcmltYXJ5T3V0cHV0RGlyZWN0b3J5ID8/IG51bGwsXG4gICAgc2VjcmV0czogcmVzLnNlY3JldHNXaXRoaGVsZCA/IFtdIDogYXJyKHMuc2VjcmV0cyksXG4gICAgcmVxdWlyZWRNZXRhZGF0YTogYXJyPHN0cmluZz4ocy5yZXF1aXJlZE1ldGFkYXRhKSxcbiAgICByZXF1aXJlZFZhcnM6IGFycjxzdHJpbmc+KHMucmVxdWlyZWRWYXJzKSxcbiAgICBtZXRhZGF0YVR5cGVzOiBvYmoocy5tZXRhZGF0YVR5cGVzKSxcbiAgICB2YXJzVHlwZXM6IG9iaihzLnZhcnNUeXBlcyksXG4gICAgbmV0d29ya0VncmVzczogYXJyPHN0cmluZz4ocy5uZXR3b3JrRWdyZXNzKSxcbiAgICBydW5Bc1Jvb3Q6IHMucnVuQXNSb290ID8/IG51bGwsXG4gICAgbGljZW5zZTogcy5saWNlbnNlID8/IGxpc3RpbmcubGljZW5zZSA/PyBudWxsLFxuICAgIGhvbWVwYWdlVXJsOiBzLmhvbWVwYWdlVXJsID8/IGxpc3RpbmcuaG9tZXBhZ2VVcmwgPz8gbnVsbCxcbiAgICBzb3VyY2VVcmw6IHMuc291cmNlVXJsID8/IGxpc3Rpbmcuc291cmNlVXJsID8/IG51bGwsXG4gICAgZG9jdW1lbnRhdGlvblVybDogcy5kb2N1bWVudGF0aW9uVXJsID8/IG51bGwsXG4gICAgaWNvbjogcy5pY29uID8/IGxpc3RpbmcuaWNvbiA/PyBudWxsLFxuICAgIGNoYW5nZWxvZzogdmVyc2lvbi5jaGFuZ2Vsb2csXG4gICAgYnJlYWtpbmc6IHZlcnNpb24uYnJlYWtpbmcsXG4gICAgdnVsbkNyaXRpY2FsOiB2ZXJzaW9uLnZ1bG5Dcml0aWNhbCxcbiAgICB2dWxuSGlnaDogdmVyc2lvbi52dWxuSGlnaCxcbiAgICB2dWxuQ3JpdGljYWxGaXhhYmxlOiB2ZXJzaW9uLnZ1bG5Dcml0aWNhbEZpeGFibGUsXG4gICAgdnVsbkhpZ2hGaXhhYmxlOiB2ZXJzaW9uLnZ1bG5IaWdoRml4YWJsZSxcbiAgICBzY2FubmVkQXQ6IHZlcnNpb24uc2Nhbm5lZEF0LFxuICAgIHNjYW5GbGFnZ2VkQXQ6IHZlcnNpb24uc2NhbkZsYWdnZWRBdCxcbiAgICBzY2FuRmxhZzogdmVyc2lvbi5zY2FuRmxhZyxcbiAgICBsaWZlY3ljbGU6IHZlcnNpb24uZGVwcmVjYXRlZEF0ID8gJ2RlcHJlY2F0ZWQnIDogJ3Byb2R1Y3Rpb24nLFxuICAgIGRlcHJlY2F0ZWRBdDogdmVyc2lvbi5kZXByZWNhdGVkQXQsXG4gICAgZGVwcmVjYXRpb25NZXNzYWdlOiB2ZXJzaW9uLmRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICB5YW5rZWRBdDogbnVsbCxcbiAgICB5YW5rUmVhc29uOiBudWxsLFxuICAgIHZpc2liaWxpdHk6ICdwdWJsaWMnLFxuICAgIGlzRGVmYXVsdDogdHJ1ZSxcbiAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV2ZXJ5dGhpbmcgYW4gb3JnIGNhbiByZXNvbHZlIChjYXRhbG9nLCBBSSBzZWxlY3Rpb24sIHBsYWNlaG9sZGVyIGd1YXJkKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIE9uZSBsaXN0aW5nIHdpdGggdGhlIG9yZydzIHN0YW5kaW5nIG9uIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdMaXN0aW5nU3RhdGUge1xuICBwdWJsaXNoZXI6IFB1Ymxpc2hlcjtcbiAgbGlzdGluZzogUGx1Z2luTGlzdGluZztcbiAgdmVyc2lvbnM6IFBsdWdpbkxpc3RpbmdWZXJzaW9uW107XG4gIC8qKiBIb3cgdGhlIG9yZyByZWFjaGVzIGl0LCBvciB3aHkgaXQgY2FuJ3QgKG5vdCBpbnN0YWxsZWQsIHBlbmRpbmcsIOKApikuICovXG4gIG1vZGU6IEluc3RhbGxNb2RlIHwgUmVzb2x1dGlvblJlZnVzYWw7XG4gIC8qKiBBIHBvbGljeSAvIHN0YXRlIGJsb2NrICh0aWVyLCBibG9ja2VkIGxpc3RpbmcsIHN1c3BlbmRlZCksIG9yIG51bGwuICovXG4gIGJsb2NrOiBMaXN0aW5nQmxvY2sgfCBudWxsO1xuICAvKiogV2hhdCBhbiBVTlZFUlNJT05FRCByZWZlcmVuY2UgcmVzb2x2ZXMgdG8gcmlnaHQgbm93LCBvciBudWxsLiAqL1xuICByZXNvbHZlZDogUGx1Z2luTGlzdGluZ1ZlcnNpb24gfCBudWxsO1xuICAvKiogV2h5IG5vdGhpbmcgcmVzb2x2ZXMsIHdoZW4gdGhlIG9yZyBkb2VzIHJlYWNoIHRoZSBsaXN0aW5nIChlLmcuIGFuIGFkdmlzb3J5IGJsb2NrKS4gKi9cbiAgcmVmdXNhbDogUmVzb2x1dGlvblJlZnVzYWwgfCBudWxsO1xuICAvKiogVGhlIGxpc3RpbmcncyBQVUJMSVNIRUQgYWR2aXNvcmllcy4gKi9cbiAgYWR2aXNvcmllczogUGx1Z2luQWR2aXNvcnlbXTtcbiAgLyoqIFRoZSBvcmcncyBvd24gaW5zdGFsbCByb3cgZm9yIGl0IChleHBsaWNpdCwgcG9zc2libHkgcGVuZGluZy9kZW5pZWQpLiAqL1xuICBvd25JbnN0YWxsOiBQbHVnaW5JbnN0YWxsIHwgbnVsbDtcbiAgLyoqIFRoZSBvcmcncyBlZmZlY3RpdmUgY29uc3VtcHRpb24gcG9saWN5ICh0aGUgc2FtZSBmb3IgZXZlcnkgbGlzdGluZykuICovXG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3k7XG59XG5cbi8qKiBUaGUgb3JnJ3MgcG9saWN5ICsgaW5zdGFsbCByb3dzIChvd24gYW5kIHJvb3QpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdJbnN0YWxsQ29udGV4dCB7XG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3k7XG4gIGluc3RhbGxzOiBQbHVnaW5JbnN0YWxsW107XG4gIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGU7XG59XG5cbi8qKiBMb2FkIHRoZSBvcmcncyBwb2xpY3kgYW5kIGluc3RhbGwgcm93cy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkT3JnSW5zdGFsbENvbnRleHQoc291cmNlOiBMaXN0aW5nRGF0YVNvdXJjZSwgc2NvcGU6IFJlc29sdXRpb25TY29wZSk6IFByb21pc2U8T3JnSW5zdGFsbENvbnRleHQ+IHtcbiAgY29uc3Qgb3JnSWRzID0gc2NvcGVPcmdJZHMoc2NvcGUpO1xuICBjb25zdCBbcG9saWNpZXMsIGluc3RhbGxzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtzb3VyY2UucG9saWNpZXNGb3JPcmdzKG9yZ0lkcyksIHNvdXJjZS5pbnN0YWxsc0Zvck9yZ3Mob3JnSWRzKV0pO1xuICByZXR1cm4geyBwb2xpY3k6IGVmZmVjdGl2ZUNvbnN1bXB0aW9uUG9saWN5KHBvbGljaWVzLCBvcmdJZHNbMF0hLCBvcmdJZHNbMV0pLCBpbnN0YWxscywgc2NvcGUgfTtcbn1cblxuLyoqXG4gKiBUaGUgb3JnJ3Mgc3RhbmRpbmcgb24gZXZlcnkgbGl2ZSBsaXN0aW5nIChvciBvbmx5IGBmaWx0ZXJgJ3MpLiBVc2VkIGJ5IHRoZVxuICogaW4tYXBwIGNhdGFsb2c7IHtAbGluayByZXNvbHZhYmxlTGlzdGluZ3N9IG5hcnJvd3MgaXQgdG8gd2hhdCByZXNvbHZlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9yZ0xpc3RpbmdTdGF0ZXMoXG4gIHNvdXJjZTogTGlzdGluZ0RhdGFTb3VyY2UsXG4gIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGUsXG4gIGZpbHRlcjogeyBpZHM/OiBzdHJpbmdbXTsgbmFtZXM/OiBzdHJpbmdbXSB9ID0ge30sXG4gIGN0eD86IE9yZ0luc3RhbGxDb250ZXh0LFxuKTogUHJvbWlzZTxPcmdMaXN0aW5nU3RhdGVbXT4ge1xuICBjb25zdCBjb250ZXh0ID0gY3R4ID8/IGF3YWl0IGxvYWRPcmdJbnN0YWxsQ29udGV4dChzb3VyY2UsIHNjb3BlKTtcbiAgY29uc3QgbGl2ZSA9IGF3YWl0IHNvdXJjZS5saXZlTGlzdGluZ3MoZmlsdGVyKTtcbiAgaWYgKGxpdmUubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGNvbnN0IGlkcyA9IGxpdmUubWFwKChsKSA9PiBsLmlkKTtcbiAgY29uc3QgW3B1YnMsIHZlcnNpb25zLCBhZHZpc29yaWVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzb3VyY2UucHVibGlzaGVyc0J5SWRzKFsuLi5uZXcgU2V0KGxpdmUubWFwKChsKSA9PiBsLnB1Ymxpc2hlcklkKSldKSxcbiAgICBzb3VyY2UudmVyc2lvbnNGb3JMaXN0aW5ncyhpZHMpLFxuICAgIHNvdXJjZS5hZHZpc29yaWVzRm9yTGlzdGluZ3MoaWRzKSxcbiAgXSk7XG4gIGNvbnN0IGJ5UHVibGlzaGVyID0gbmV3IE1hcChwdWJzLm1hcCgocCkgPT4gW3AuaWQsIHBdKSk7XG4gIGNvbnN0IG93biA9IHNjb3BlT3JnSWRzKHNjb3BlKVswXSE7XG4gIGNvbnN0IG91dDogT3JnTGlzdGluZ1N0YXRlW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaXN0aW5nIG9mIGxpdmUpIHtcbiAgICBjb25zdCBwdWJsaXNoZXIgPSBieVB1Ymxpc2hlci5nZXQobGlzdGluZy5wdWJsaXNoZXJJZCk7XG4gICAgaWYgKCFwdWJsaXNoZXIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHZzID0gdmVyc2lvbnMuZmlsdGVyKCh2KSA9PiB2Lmxpc3RpbmdJZCA9PT0gbGlzdGluZy5pZCk7XG4gICAgY29uc3QgYmxvY2sgPSBsaXN0aW5nQmxvY2soY29udGV4dC5wb2xpY3ksIHB1Ymxpc2hlciwgbGlzdGluZyk7XG4gICAgY29uc3QgbW9kZSA9IGluc3RhbGxNb2RlRm9yKHB1Ymxpc2hlciwgbGlzdGluZywgY29udGV4dC5pbnN0YWxscywgY29udGV4dC5wb2xpY3ksIHNjb3BlKTtcbiAgICBjb25zdCBsaXN0aW5nQWR2aXNvcmllcyA9IGFkdmlzb3JpZXMuZmlsdGVyKChhKSA9PiBhLmxpc3RpbmdJZCA9PT0gbGlzdGluZy5pZCk7XG4gICAgbGV0IHJlc29sdmVkOiBQbHVnaW5MaXN0aW5nVmVyc2lvbiB8IG51bGwgPSBudWxsO1xuICAgIGxldCByZWZ1c2FsOiBSZXNvbHV0aW9uUmVmdXNhbCB8IG51bGwgPSBudWxsO1xuICAgIGlmICghYmxvY2sgJiYgISgnY29kZScgaW4gbW9kZSkpIHtcbiAgICAgIGNvbnN0IGNob2ljZSA9IHNlbGVjdExpc3RpbmdWZXJzaW9uKHtcbiAgICAgICAgcmVmOiBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gLCB2ZXJzaW9uczogdnMsIG1vZGUsIGFkdmlzb3JpZXM6IGxpc3RpbmdBZHZpc29yaWVzLCBwb2xpY3k6IGNvbnRleHQucG9saWN5LFxuICAgICAgfSk7XG4gICAgICBpZiAoJ3ZlcnNpb24nIGluIGNob2ljZSkgcmVzb2x2ZWQgPSBjaG9pY2UudmVyc2lvbjtcbiAgICAgIGVsc2UgcmVmdXNhbCA9IGNob2ljZS5yZWZ1c2FsO1xuICAgIH1cbiAgICBjb25zdCBvd25JbnN0YWxsID0gY29udGV4dC5pbnN0YWxscy5maW5kKChpKSA9PiBpLmxpc3RpbmdJZCA9PT0gbGlzdGluZy5pZCAmJiBpLm9yZ0lkLnRvTG93ZXJDYXNlKCkgPT09IG93bikgPz8gbnVsbDtcbiAgICBvdXQucHVzaCh7IHB1Ymxpc2hlciwgbGlzdGluZywgdmVyc2lvbnM6IHZzLCBtb2RlLCBibG9jaywgcmVzb2x2ZWQsIHJlZnVzYWwsIGFkdmlzb3JpZXM6IGxpc3RpbmdBZHZpc29yaWVzLCBvd25JbnN0YWxsLCBwb2xpY3k6IGNvbnRleHQucG9saWN5IH0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUaGUgbGlzdGluZ3MgYW4gb3JnJ3MgcmVmZXJlbmNlcyByZXNvbHZlIHRvIG5vdyAoaW5zdGFsbGVkIG9yIGltcGxpY2l0LCBub3QgYmxvY2tlZCkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2YWJsZUxpc3RpbmdzKFxuICBzb3VyY2U6IExpc3RpbmdEYXRhU291cmNlLFxuICBzY29wZTogUmVzb2x1dGlvblNjb3BlLFxuICBmaWx0ZXI6IHsgbmFtZXM/OiBzdHJpbmdbXSB9ID0ge30sXG4pOiBQcm9taXNlPEFycmF5PE9yZ0xpc3RpbmdTdGF0ZSAmIHsgcmVzb2x2ZWQ6IFBsdWdpbkxpc3RpbmdWZXJzaW9uIH0+PiB7XG4gIHJldHVybiAoYXdhaXQgb3JnTGlzdGluZ1N0YXRlcyhzb3VyY2UsIHNjb3BlLCBmaWx0ZXIpKVxuICAgIC5maWx0ZXIoKHMpOiBzIGlzIE9yZ0xpc3RpbmdTdGF0ZSAmIHsgcmVzb2x2ZWQ6IFBsdWdpbkxpc3RpbmdWZXJzaW9uIH0gPT4gcy5yZXNvbHZlZCAhPT0gbnVsbCk7XG59XG4iXX0=
|
|
474
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3BsdWdpbi1yZXNvbHV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxFQUNMLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsR0FDdkUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEYsT0FBTyxFQUFFLDBCQUEwQixFQUEwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3BHLE9BQU8sRUFDTCxhQUFhLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsR0FDakUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLE1BQU0sR0FRUCxNQUFNLCtCQUErQixDQUFDO0FBeUJ2QyxrRkFBa0Y7QUFDbEYsTUFBTSxVQUFVLFlBQVksQ0FDMUIsTUFBeUIsRUFDekIsU0FBNkQsRUFDN0QsT0FBOEM7SUFFOUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsRCxJQUFJLFNBQVMsQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxXQUFXLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxhQUFhLEVBQUUsQ0FBQztRQUM5RixPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsR0FBRyxHQUFHLE9BQU8sT0FBTyxDQUFDLEtBQUssS0FBSyxhQUFhLENB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bnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUmVzb2x2aW5nIGEgcGx1Z2luIHJlZmVyZW5jZSB0byBhbiBlY29zeXN0ZW0gTElTVElORyB2ZXJzaW9uIHRocm91Z2ggdGhlXG4gKiBvcmcncyBpbnN0YWxsIChkb2NzL3BsdWdpbi1pbnN0YWxsaW5nLm1kKS5cbiAqXG4gKiBPbmUgaW1wbGVtZW50YXRpb24gc2hhcmVkIGJ5IGV2ZXJ5IHBsYWNlIHRoYXQgYW5zd2VycyBcIndoaWNoIGxpc3RlZCB2ZXJzaW9uXG4gKiBkb2VzIHRoaXMgb3JnJ3MgcmVmZXJlbmNlIHJ1bj9cIjogdGhlIHBsdWdpbiBzZXJ2aWNlJ3MgYC9wbHVnaW5zL2xvb2t1cGAgKHdoYXRcbiAqIHN5bnRoIHBpbnMpLCB0aGUgcGlwZWxpbmUgc2VydmljZSdzIGNvbnRyYWN0IGNoZWNrIGF0IHBpcGVsaW5lIGNyZWF0ZSwgdGhlIEFJXG4gKiBnZW5lcmF0b3IncyBwbHVnaW4gbGlzdCBhbmQgdGhlIHBsYWNlaG9sZGVyIGd1YXJkLiBUaGUgZGVjaXNpb25zIGFyZSBQVVJFXG4gKiBmdW5jdGlvbnMgb3ZlciBsb2FkZWQgcm93czsgdGhlIHJvd3MgY29tZSB0aHJvdWdoIGEge0BsaW5rIExpc3RpbmdEYXRhU291cmNlfVxuICogc28gZWFjaCBzZXJ2aWNlIGNhbiBsb2FkIHRoZW0gaXRzIG93biB3YXkgKHtAbGluayBkcml6emxlTGlzdGluZ1NvdXJjZX0gaXMgdGhlXG4gKiBwbGFpbiBkcml6emxlIG9uZSkuXG4gKlxuICogVGhlIG1vZGVsOlxuICogIC0gQW4gb3JnIHJlc29sdmVzIGEgbGlzdGluZyBvbmx5IHRocm91Z2ggYW4gSU5TVEFMTDogYW4gZXhwbGljaXRcbiAqICAgIGBwbHVnaW5faW5zdGFsbHNgIHJvdyAoaXRzIG93biwgb3Ig4oCUIGZvciBhIHRlYW0g4oCUIGl0cyByb290IG9yZydzKSwgb3JcbiAqICAgIGZvciB0aGUgT2ZmaWNpYWwgcHVibGlzaGVyIHRoZSBJTVBMSUNJVCBpbnN0YWxsIGV2ZXJ5IG9yZyBoYXMgdW5sZXNzIGl0c1xuICogICAgY29uc3VtcHRpb24gcG9saWN5IHNheXMgYG9mZmljaWFsSW5zdGFsbHM6IGV4cGxpY2l0YC4gQW4gZXhwbGljaXRcbiAqICAgIGluc3RhbGwgb3ZlcnJpZGVzIHRoZSBpbXBsaWNpdCBvbmUuXG4gKiAgLSBUaGUgb3JnJ3MgQ09OU1VNUFRJT04gUE9MSUNZIGlzIGFwcGxpZWQgYXQgZXZlcnkgcmVzb2x1dGlvbjogYWxsb3dlZFxuICogICAgdGllcnMsIGJsb2NrZWQgbGlzdGluZ3MsIGFkdmlzb3J5IGJsb2NraW5nOyBzZWNyZXRzIGFyZSB3aXRoaGVsZCBmcm9tIHRpZXJzXG4gKiAgICB0aGUgcG9saWN5IGRvZXNuJ3QgdHJ1c3Qgd2l0aCB0aGVtLiBBIHRlYW0ncyBwb2xpY3kgaXMgbWVyZ2VkIHdpdGggaXRzIHJvb3RcbiAqICAgIG9yZydzIGFuZCBjYW4gb25seSBiZSBzdHJpY3Rlci5cbiAqICAtIFZlcnNpb24gY2hvaWNlOiB0aGUgaW5zdGFsbCdzIHJhbmdlIChwaW5uZWQgLyBgfmAgLyBgXmAgLyBub24tYnJlYWtpbmdcbiAqICAgIGxhdGVzdDsgaW1wbGljaXQgPSB0aGUgbG93ZXN0IGxpdmUgbWFqb3IpLCBuYXJyb3dlZCBieSB0aGUgcmVmZXJlbmNlJ3Mgb3duXG4gKiAgICB2ZXJzaW9uIHNwZWMuIFlhbmtlZCB2ZXJzaW9ucyBuZXZlciByZXNvbHZlIGZvciBhIGxpc3Rpbmc7IGEgcGF1c2VkXG4gKiAgICB2ZXJzaW9uIGlzIHNraXBwZWQgdW5sZXNzIHRoZSBpbnN0YWxsIGFscmVhZHkgcmVzb2x2ZWQgdG8gaXQgb3IgdGhlXG4gKiAgICByZWZlcmVuY2UgcGlucyBpdCBleGFjdGx5OyBhZHZpc29yeS1ibG9ja2VkIHZlcnNpb25zIGFyZSBza2lwcGVkLlxuICogIC0gU2NhbiBmbGFnczogYSB2ZXJzaW9uIHRoZSBuaWdodGx5IHJlc2NhbiBGTEFHR0VEIChmaXhhYmxlIENyaXRpY2Fsc1xuICogICAgb3ZlciBgUExVR0lOX1ZVTE5fTUFYX0NSSVRJQ0FMYCkgcmVzb2x2ZXMgd2l0aCBhIGBWVUxOX0ZMQUdHRURgIHdhcm5pbmcg4oCUXG4gKiAgICBvciwgd2l0aCBgUExVR0lOX0JMT0NLX09OX05FV19DUklUSUNBTGAgb24sIGlzIHNraXBwZWQgbGlrZSBhblxuICogICAgYWR2aXNvcnktYmxvY2tlZCBvbmUsIGFuZCBhbiBleGFjdCBwaW4gdG8gaXQgaXMgcmVmdXNlZFxuICogICAgYFBMVUdJTl9WRVJTSU9OX1ZVTE5fQkxPQ0tFRGAuXG4gKi9cblxuaW1wb3J0IHtcbiAgYXNTY2FuRmxhZywgYmxvY2tPbk5ld0NyaXRpY2FsLCB2dWxuQmxvY2tlZE1lc3NhZ2UsIHZ1bG5GbGFnZ2VkV2FybmluZywgdHlwZSBWdWxuRmxhZ2dlZFdhcm5pbmcsXG59IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGFuZCwgZXEsIGluQXJyYXkgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IENydWRUeCB9IGZyb20gJy4vY3J1ZC1zZXJ2aWNlLmpzJztcbmltcG9ydCB7IGFkdmlzb3JpZXNDb3ZlcmluZywgYmxvY2tpbmdBZHZpc29yaWVzIH0gZnJvbSAnLi9wbHVnaW4tYWR2aXNvcmllcy5qcyc7XG5pbXBvcnQgeyBlZmZlY3RpdmVDb25zdW1wdGlvblBvbGljeSwgdHlwZSBDb25zdW1wdGlvblBvbGljeSB9IGZyb20gJy4vcGx1Z2luLWNvbnN1bXB0aW9uLXBvbGljeS5qcyc7XG5pbXBvcnQge1xuICBjb21wYXJlU2VtdmVyLCBpc1ZlcnNpb25SYW5nZSwgcGFyc2VTZW12ZXIsIHNhdGlzZmllc1ZlcnNpb25TcGVjLFxufSBmcm9tICcuL3NlbXZlci1yYW5nZS5qcyc7XG5pbXBvcnQge1xuICBPRkZJQ0lBTF9QVUJMSVNIRVJfSEFORExFLFxuICBzY2hlbWEsXG4gIHR5cGUgSW5zdGFsbFZlcnNpb25Qb2xpY3ksXG4gIHR5cGUgUGx1Z2luQWR2aXNvcnksXG4gIHR5cGUgUGx1Z2luSW5zdGFsbCxcbiAgdHlwZSBQbHVnaW5JbnN0YWxsUG9saWN5LFxuICB0eXBlIFBsdWdpbkxpc3RpbmcsXG4gIHR5cGUgUGx1Z2luTGlzdGluZ1ZlcnNpb24sXG4gIHR5cGUgUHVibGlzaGVyLFxufSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZWZ1c2FscyBhbmQgd2FybmluZ3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBXaHkgYSByZWZlcmVuY2UgY2FuJ3QgcmVzb2x2ZTsgYGNvZGVgIGlzIGFuIGFwaS1jb3JlIGBFcnJvckNvZGVgIG5hbWUuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdXRpb25SZWZ1c2FsIHtcbiAgY29kZTogJ05PVF9GT1VORCcgfCAnUExVR0lOX05PVF9JTlNUQUxMRUQnIHwgJ1BMVUdJTl9CTE9DS0VEX0JZX1BPTElDWScgfCAnUExVR0lOX1VOQVZBSUxBQkxFJyB8ICdQTFVHSU5fVkVSU0lPTl9WVUxOX0JMT0NLRUQnO1xuICByZWFzb246IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKiBBIG5vbi1mYXRhbCBub3RlIGEgcmVzb2x1dGlvbiBjYXJyaWVzIChzeW50aCBwcmludHMgaXRzIGBtZXNzYWdlYCkuICovXG5leHBvcnQgdHlwZSBSZXNvbHV0aW9uV2FybmluZyA9XG4gIHwgeyBjb2RlOiAnUExVR0lOX0FEVklTT1JZJyB8ICdQTFVHSU5fREVQUkVDQVRFRCcgfCAnUExVR0lOX1NFQ1JFVFNfV0lUSEhFTEQnIHwgJ0xJU1RJTkdfVU5NQUlOVEFJTkVEJzsgbWVzc2FnZTogc3RyaW5nIH1cbiAgfCBWdWxuRmxhZ2dlZFdhcm5pbmc7XG5cbi8qKiBXaHkgdGhlIG9yZydzIHBvbGljeSAob3IgdGhlIGxpc3RpbmcncyBzdGF0ZSkga2VlcHMgYSBsaXN0aW5nIG91dCwgb3IgbnVsbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ0Jsb2NrIHtcbiAgcmVhc29uOiAndGllcicgfCAnYmxvY2tlZF9saXN0aW5nJyB8ICdzdXNwZW5kZWQnO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKiBXaGV0aGVyIGBwb2xpY3lgIChvciB0aGUgbGlzdGluZydzIG93biBzdGF0ZSkgcmVmdXNlcyB0aGUgbGlzdGluZyBvdXRyaWdodC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0aW5nQmxvY2soXG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3ksXG4gIHB1Ymxpc2hlcjogUGljazxQdWJsaXNoZXIsICdoYW5kbGUnIHwgJ3RpZXInIHwgJ3N1c3BlbmRlZEF0Jz4sXG4gIGxpc3Rpbmc6IFBpY2s8UGx1Z2luTGlzdGluZywgJ25hbWUnIHwgJ3N0YXRlJz4sXG4pOiBMaXN0aW5nQmxvY2sgfCBudWxsIHtcbiAgY29uc3QgcmVmID0gYCR7cHVibGlzaGVyLmhhbmRsZX0vJHtsaXN0aW5nLm5hbWV9YDtcbiAgaWYgKHB1Ymxpc2hlci5zdXNwZW5kZWRBdCB8fCBsaXN0aW5nLnN0YXRlID09PSAnc3VzcGVuZGVkJyB8fCBsaXN0aW5nLnN0YXRlID09PSAndHJhbnNmZXJyZWQnKSB7XG4gICAgcmV0dXJuIHsgcmVhc29uOiAnc3VzcGVuZGVkJywgbWVzc2FnZTogYCR7cmVmfSBpcyAke2xpc3Rpbmcuc3RhdGUgPT09ICd0cmFuc2ZlcnJlZCcgPyAndHJhbnNmZXJyZWQnIDogJ3N1c3BlbmRlZCd9IGFuZCBubyBsb25nZXIgcmVzb2x2ZXMuYCB9O1xuICB9XG4gIGlmIChwb2xpY3kuYmxvY2tlZExpc3RpbmdzLnNvbWUoKGIpID0+IGIucHVibGlzaGVyID09PSBwdWJsaXNoZXIuaGFuZGxlICYmIGIubmFtZSA9PT0gbGlzdGluZy5uYW1lKSkge1xuICAgIHJldHVybiB7IHJlYXNvbjogJ2Jsb2NrZWRfbGlzdGluZycsIG1lc3NhZ2U6IGBZb3VyIG9yZ2FuaXphdGlvbidzIHBsdWdpbiBwb2xpY3kgYmxvY2tzICR7cmVmfS5gIH07XG4gIH1cbiAgaWYgKCFwb2xpY3kuYWxsb3dlZFRpZXJzLmluY2x1ZGVzKHB1Ymxpc2hlci50aWVyKSkge1xuICAgIHJldHVybiB7IHJlYXNvbjogJ3RpZXInLCBtZXNzYWdlOiBgWW91ciBvcmdhbml6YXRpb24ncyBwbHVnaW4gcG9saWN5IGRvZXNuJ3QgYWxsb3cgJHtwdWJsaXNoZXIudGllcn0gcGx1Z2lucyAoJHtyZWZ9KS5gIH07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBUaGUgcmVmdXNhbCBhIHtAbGluayBMaXN0aW5nQmxvY2t9IGJlY29tZXMuICovXG5leHBvcnQgZnVuY3Rpb24gYmxvY2tSZWZ1c2FsKGJsb2NrOiBMaXN0aW5nQmxvY2spOiBSZXNvbHV0aW9uUmVmdXNhbCB7XG4gIHJldHVybiBibG9jay5yZWFzb24gPT09ICdzdXNwZW5kZWQnXG4gICAgPyB7IGNvZGU6ICdQTFVHSU5fVU5BVkFJTEFCTEUnLCByZWFzb246ICdzdXNwZW5kZWQnLCBtZXNzYWdlOiBibG9jay5tZXNzYWdlIH1cbiAgICA6IHsgY29kZTogJ1BMVUdJTl9CTE9DS0VEX0JZX1BPTElDWScsIHJlYXNvbjogYmxvY2sucmVhc29uLCBtZXNzYWdlOiBibG9jay5tZXNzYWdlIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnN0YWxscyBhbmQgdmVyc2lvbiBjaG9pY2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBIb3cgdGhlIG9yZyByZWFjaGVzIGEgbGlzdGluZzogYW4gZXhwbGljaXQgaW5zdGFsbCByb3csIG9yIHRoZSBpbXBsaWNpdCBPZmZpY2lhbCBvbmUuICovXG5leHBvcnQgdHlwZSBJbnN0YWxsTW9kZSA9XG4gIHwgeyBraW5kOiAnZXhwbGljaXQnOyBpbnN0YWxsOiBQbHVnaW5JbnN0YWxsOyBpbmhlcml0ZWQ6IGJvb2xlYW4gfVxuICB8IHsga2luZDogJ2ltcGxpY2l0JyB9O1xuXG50eXBlIFZlcnNpb25Sb3cgPSBQaWNrPFBsdWdpbkxpc3RpbmdWZXJzaW9uLCAndmVyc2lvbicgfCAneWFua2VkQXQnIHwgJ3BhdXNlZEF0JyB8ICdicmVha2luZyc+O1xuXG4vKiogVGhlIHJlZnVzYWwgYW4gZXhhY3QgcGluIHRvIGEgZmxhZ2dlZCB2ZXJzaW9uIGdldHMgd2hpbGUgYmxvY2tpbmcgKDQwOSkuICovXG5mdW5jdGlvbiB2dWxuUmVmdXNhbChyZWY6IHN0cmluZywgdjogUGljazxQbHVnaW5MaXN0aW5nVmVyc2lvbiwgJ3ZlcnNpb24nIHwgJ3NjYW5GbGFnJz4pOiBSZXNvbHV0aW9uUmVmdXNhbCB7XG4gIGNvbnN0IGZsYWcgPSBhc1NjYW5GbGFnKHYuc2NhbkZsYWcpID8/IHsgY3JpdGljYWw6IDAsIGhpZ2g6IDAsIG1heENyaXRpY2FsOiAwLCBmaW5kaW5nczogW10gfTtcbiAgY29uc3QgZml4ZWQgPSBbLi4ubmV3IFNldChmbGFnLmZpbmRpbmdzLmZsYXRNYXAoKGYpID0+IGYuZml4ZWRJbikpXTtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiAnUExVR0lOX1ZFUlNJT05fVlVMTl9CTE9DS0VEJyxcbiAgICByZWFzb246ICd2dWxuX2ZsYWdnZWQnLFxuICAgIG1lc3NhZ2U6IHZ1bG5CbG9ja2VkTWVzc2FnZShyZWYsIHYudmVyc2lvbiwgZmxhZyksXG4gICAgZGV0YWlsczogeyB2ZXJzaW9uOiB2LnZlcnNpb24sIGNyaXRpY2FsOiBmbGFnLmNyaXRpY2FsLCBoaWdoOiBmbGFnLmhpZ2gsIGZpbmRpbmdzOiBmbGFnLmZpbmRpbmdzLCAuLi4oZml4ZWQubGVuZ3RoID8geyBmaXhlZFZlcnNpb25zOiBmaXhlZCB9IDoge30pIH0sXG4gIH07XG59XG5cbmNvbnN0IGlzU3RhYmxlID0gKHY6IHN0cmluZyk6IGJvb2xlYW4gPT4gKHBhcnNlU2VtdmVyKHYpPy5wcmVyZWxlYXNlLmxlbmd0aCA/PyAxKSA9PT0gMDtcblxuLyoqXG4gKiBUaGUgaW1wbGljaXQgT2ZmaWNpYWwgaW5zdGFsbCdzIHJhbmdlOiBldmVyeSB2ZXJzaW9uIG9mIHRoZSBMT1dFU1QgbGl2ZVxuICogbWFqb3IgKGA8bWFqb3I+LnhgKSDigJQgcGF0Y2ggYW5kIG1pbm9yIHZlcnNpb25zIGZsb3csIGEgbmV3IG1ham9yIG5ldmVyIGRvZXNcbiAqICh0aGUgb3JnIG1vdmVzIHRvIGl0IHdpdGggYW4gZXhwbGljaXQgaW5zdGFsbCkuIE51bGwgd2hlbiBub3RoaW5nIGlzIGxpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbXBsaWNpdEluc3RhbGxSYW5nZSh2ZXJzaW9uczogcmVhZG9ubHkgVmVyc2lvblJvd1tdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IG1ham9ycyA9IHZlcnNpb25zXG4gICAgLmZpbHRlcigodikgPT4gIXYueWFua2VkQXQgJiYgaXNTdGFibGUodi52ZXJzaW9uKSlcbiAgICAubWFwKCh2KSA9PiBwYXJzZVNlbXZlcih2LnZlcnNpb24pIS5tYWpvcik7XG4gIGlmIChtYWpvcnMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGAke01hdGgubWluKC4uLm1ham9ycyl9LnhgO1xufVxuXG4vKiogV2hldGhlciBhbiBpbnN0YWxsJ3MgdmVyc2lvbiBwb2xpY3kgYWRtaXRzIGB2ZXJzaW9uYCAodGhlIGJhc2VsaW5lIGlzIGBwaW5uZWRWZXJzaW9uYCkuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbEFkbWl0cyhcbiAgaW5zdGFsbDogUGljazxQbHVnaW5JbnN0YWxsLCAndmVyc2lvblBvbGljeScgfCAncGlubmVkVmVyc2lvbic+LFxuICB2ZXJzaW9uOiBzdHJpbmcsXG4gIHZlcnNpb25zOiByZWFkb25seSBWZXJzaW9uUm93W10sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZSA9IGluc3RhbGwucGlubmVkVmVyc2lvbjtcbiAgc3dpdGNoIChpbnN0YWxsLnZlcnNpb25Qb2xpY3kgYXMgSW5zdGFsbFZlcnNpb25Qb2xpY3kpIHtcbiAgICBjYXNlICdwaW5uZWQnOlxuICAgICAgcmV0dXJuIHZlcnNpb24gPT09IGJhc2U7XG4gICAgY2FzZSAncGF0Y2gnOlxuICAgICAgcmV0dXJuIGJhc2UgIT09IG51bGwgJiYgc2F0aXNmaWVzVmVyc2lvblNwZWModmVyc2lvbiwgYH4ke2Jhc2V9YCk7XG4gICAgY2FzZSAnbWlub3InOlxuICAgICAgcmV0dXJuIGJhc2UgIT09IG51bGwgJiYgc2F0aXNmaWVzVmVyc2lvblNwZWModmVyc2lvbiwgYF4ke2Jhc2V9YCk7XG4gICAgY2FzZSAnbGF0ZXN0Jzoge1xuICAgICAgaWYgKCFpc1N0YWJsZSh2ZXJzaW9uKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGJhc2UgPT09IG51bGwpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGNvbXBhcmVTZW12ZXIodmVyc2lvbiwgYmFzZSkgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBOZXZlciBjcm9zcyBhIHZlcnNpb24gdGhlIHB1Ymxpc2hlciBtYXJrZWQgYnJlYWtpbmcuXG4gICAgICByZXR1cm4gIXZlcnNpb25zLnNvbWUoKHYpID0+IHYuYnJlYWtpbmcgJiYgY29tcGFyZVNlbXZlcih2LnZlcnNpb24sIGJhc2UpID4gMCAmJiBjb21wYXJlU2VtdmVyKHYudmVyc2lvbiwgdmVyc2lvbikgPD0gMCk7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIFdoZXRoZXIgYG1vZGVgIGFkbWl0cyBgdmVyc2lvbmAgKHRoZSBpbXBsaWNpdCByYW5nZSBmb3IgYW4gaW1wbGljaXQgaW5zdGFsbCkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZUFkbWl0cyhtb2RlOiBJbnN0YWxsTW9kZSwgdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uczogcmVhZG9ubHkgVmVyc2lvblJvd1tdKTogYm9vbGVhbiB7XG4gIGlmIChtb2RlLmtpbmQgPT09ICdleHBsaWNpdCcpIHJldHVybiBpbnN0YWxsQWRtaXRzKG1vZGUuaW5zdGFsbCwgdmVyc2lvbiwgdmVyc2lvbnMpO1xuICBjb25zdCByYW5nZSA9IGltcGxpY2l0SW5zdGFsbFJhbmdlKHZlcnNpb25zKTtcbiAgcmV0dXJuIHJhbmdlICE9PSBudWxsICYmIHNhdGlzZmllc1ZlcnNpb25TcGVjKHZlcnNpb24sIHJhbmdlKTtcbn1cblxuLyoqIElucHV0IHRvIHtAbGluayBzZWxlY3RMaXN0aW5nVmVyc2lvbn0uICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25DaG9pY2VJbnB1dDxWIGV4dGVuZHMgUGx1Z2luTGlzdGluZ1ZlcnNpb24gPSBQbHVnaW5MaXN0aW5nVmVyc2lvbj4ge1xuICByZWY6IHN0cmluZztcbiAgdmVyc2lvbnM6IHJlYWRvbmx5IFZbXTtcbiAgbW9kZTogSW5zdGFsbE1vZGU7XG4gIC8qKiBUaGUgcmVmZXJlbmNlJ3Mgb3duIHZlcnNpb24gc3BlYyAoYGZpbHRlci52ZXJzaW9uYCkuICovXG4gIHJlcXVlc3RlZD86IHN0cmluZztcbiAgYWR2aXNvcmllczogcmVhZG9ubHkgUGx1Z2luQWR2aXNvcnlbXTtcbiAgcG9saWN5OiBDb25zdW1wdGlvblBvbGljeTtcbiAgLyoqIFNraXAgLyByZWZ1c2UgcmVzY2FuLWZsYWdnZWQgdmVyc2lvbnMgKGRlZmF1bHQ6IGBQTFVHSU5fQkxPQ0tfT05fTkVXX0NSSVRJQ0FMYCkuICovXG4gIGJsb2NrRmxhZ2dlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGljayB0aGUgbGlzdGVkIHZlcnNpb24gYSByZWZlcmVuY2UgcmVzb2x2ZXMgdG8gKHNlZSB0aGUgbW9kdWxlIGRvYyksIG9yXG4gKiB0aGUgcmVmdXNhbCB0aGF0IGV4cGxhaW5zIHdoeSBub25lIGNhbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdExpc3RpbmdWZXJzaW9uPFYgZXh0ZW5kcyBQbHVnaW5MaXN0aW5nVmVyc2lvbj4oaW5wdXQ6IFZlcnNpb25DaG9pY2VJbnB1dDxWPik6IHsgdmVyc2lvbjogViB9IHwgeyByZWZ1c2FsOiBSZXNvbHV0aW9uUmVmdXNhbCB9IHtcbiAgY29uc3QgeyByZWYsIHZlcnNpb25zLCBtb2RlLCByZXF1ZXN0ZWQsIGFkdmlzb3JpZXMsIHBvbGljeSB9ID0gaW5wdXQ7XG4gIGNvbnN0IGJsb2NrRmxhZ2dlZCA9IGlucHV0LmJsb2NrRmxhZ2dlZCA/PyBibG9ja09uTmV3Q3JpdGljYWwoKTtcbiAgY29uc3QgZXhhY3QgPSByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCAmJiAhaXNWZXJzaW9uUmFuZ2UocmVxdWVzdGVkKSA/IHJlcXVlc3RlZC50cmltKCkgOiBudWxsO1xuXG4gIGlmIChleGFjdCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHYgPSB2ZXJzaW9ucy5maW5kKCh4KSA9PiB4LnZlcnNpb24gPT09IGV4YWN0KTtcbiAgICBpZiAoIXYpIHJldHVybiB7IHJlZnVzYWw6IHsgY29kZTogJ05PVF9GT1VORCcsIHJlYXNvbjogJ3ZlcnNpb25fbm90X2ZvdW5kJywgbWVzc2FnZTogYCR7cmVmfSBoYXMgbm8gcHVibGlzaGVkIHZlcnNpb24gJHtleGFjdH0uYCB9IH07XG4gICAgaWYgKHYueWFua2VkQXQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZnVzYWw6IHtcbiAgICAgICAgICBjb2RlOiAnUExVR0lOX1VOQVZBSUxBQkxFJyxcbiAgICAgICAgICByZWFzb246ICd5YW5rZWQnLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke3JlZn1AJHtleGFjdH0gaXMgeWFua2VkJHt2LnlhbmtSZWFzb24gPyBgOiAke3YueWFua1JlYXNvbn1gIDogJyd9LiBNb3ZlIHRvIGEgc3VwcG9ydGVkIHZlcnNpb24uYCxcbiAgICAgICAgICBkZXRhaWxzOiB7IHZlcnNpb246IGV4YWN0IH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAobW9kZS5raW5kID09PSAnZXhwbGljaXQnICYmICFpbnN0YWxsQWRtaXRzKG1vZGUuaW5zdGFsbCwgZXhhY3QsIHZlcnNpb25zKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVmdXNhbDoge1xuICAgICAgICAgIGNvZGU6ICdQTFVHSU5fTk9UX0lOU1RBTExFRCcsXG4gICAgICAgICAgcmVhc29uOiAndmVyc2lvbl9vdXRzaWRlX2luc3RhbGwnLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke3JlZn1AJHtleGFjdH0gaXMgb3V0c2lkZSB5b3VyIGluc3RhbGwgKCR7bW9kZS5pbnN0YWxsLnZlcnNpb25Qb2xpY3l9IGZyb20gJHttb2RlLmluc3RhbGwucGlubmVkVmVyc2lvbn0pLiBVcGdyYWRlIHRoZSBpbnN0YWxsIGZpcnN0LmAsXG4gICAgICAgICAgZGV0YWlsczogeyB2ZXJzaW9uOiBleGFjdCwgdmVyc2lvblBvbGljeTogbW9kZS5pbnN0YWxsLnZlcnNpb25Qb2xpY3ksIHBpbm5lZFZlcnNpb246IG1vZGUuaW5zdGFsbC5waW5uZWRWZXJzaW9uIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBibG9ja2luZyA9IGJsb2NraW5nQWR2aXNvcmllcyhhZHZpc29yaWVzLCBleGFjdCwgcG9saWN5KTtcbiAgICBpZiAoYmxvY2tpbmcubGVuZ3RoKSByZXR1cm4geyByZWZ1c2FsOiBhZHZpc29yeVJlZnVzYWwocmVmLCBleGFjdCwgYmxvY2tpbmcpIH07XG4gICAgaWYgKGJsb2NrRmxhZ2dlZCAmJiB2LnNjYW5GbGFnZ2VkQXQpIHJldHVybiB7IHJlZnVzYWw6IHZ1bG5SZWZ1c2FsKHJlZiwgdikgfTtcbiAgICByZXR1cm4geyB2ZXJzaW9uOiB2IH07XG4gIH1cblxuICBjb25zdCByZXNvbHZlZEJlZm9yZSA9IG1vZGUua2luZCA9PT0gJ2V4cGxpY2l0JyA/IG1vZGUuaW5zdGFsbC5yZXNvbHZlZFZlcnNpb24gOiBudWxsO1xuICAvLyBUaGUgcmFuZ2UgdGhlIElOU1RBTEwgYWxsb3dzLiBGb3IgdGhlIGltcGxpY2l0IGluc3RhbGwgYW4gZXhwbGljaXQgc3BlYyBvblxuICAvLyB0aGUgcmVmZXJlbmNlIHJlcGxhY2VzIHRoZSBpbXBsaWNpdCByYW5nZSAoaXQgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSkuXG4gIGNvbnN0IGFkbWl0dGVkID0gdmVyc2lvbnMuZmlsdGVyKCh2KSA9PiAhdi55YW5rZWRBdFxuICAgICYmIChtb2RlLmtpbmQgPT09ICdleHBsaWNpdCcgPyBpbnN0YWxsQWRtaXRzKG1vZGUuaW5zdGFsbCwgdi52ZXJzaW9uLCB2ZXJzaW9ucylcbiAgICAgIDogcmVxdWVzdGVkICE9PSB1bmRlZmluZWQgfHwgbW9kZUFkbWl0cyhtb2RlLCB2LnZlcnNpb24sIHZlcnNpb25zKSlcbiAgICAmJiAocmVxdWVzdGVkID09PSB1bmRlZmluZWQgfHwgc2F0aXNmaWVzVmVyc2lvblNwZWModi52ZXJzaW9uLCByZXF1ZXN0ZWQpKVxuICAgICYmICghdi5wYXVzZWRBdCB8fCB2LnZlcnNpb24gPT09IHJlc29sdmVkQmVmb3JlKSk7XG4gIGNvbnN0IGFsbG93ZWQgPSBhZG1pdHRlZC5maWx0ZXIoKHYpID0+IGJsb2NraW5nQWR2aXNvcmllcyhhZHZpc29yaWVzLCB2LnZlcnNpb24sIHBvbGljeSkubGVuZ3RoID09PSAwXG4gICAgJiYgIShibG9ja0ZsYWdnZWQgJiYgdi5zY2FuRmxhZ2dlZEF0KSk7XG4gIC8vIFJhbmdlcyBvbmx5IGFkbWl0IHByZXJlbGVhc2VzIHRoZXkgbmFtZSAobnBtIHNlbWFudGljcyksIHNvIHRoZSBoaWdoZXN0XG4gIC8vIGFkbWl0dGVkIHZlcnNpb24gaXMgdGhlIGFuc3dlci5cbiAgY29uc3QgYmVzdCA9IGhpZ2hlc3QoYWxsb3dlZC5tYXAoKHYpID0+IHYudmVyc2lvbikpO1xuICBpZiAoYmVzdCkgcmV0dXJuIHsgdmVyc2lvbjogYWxsb3dlZC5maW5kKCh2KSA9PiB2LnZlcnNpb24gPT09IGJlc3QpISB9O1xuXG4gIGlmIChhZG1pdHRlZC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbmV3ZXN0ID0gaGlnaGVzdChhZG1pdHRlZC5tYXAoKHYpID0+IHYudmVyc2lvbikpITtcbiAgICBjb25zdCBibG9ja2luZyA9IGJsb2NraW5nQWR2aXNvcmllcyhhZHZpc29yaWVzLCBuZXdlc3QsIHBvbGljeSk7XG4gICAgaWYgKGJsb2NraW5nLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgcmVmdXNhbDogdnVsblJlZnVzYWwocmVmLCBhZG1pdHRlZC5maW5kKCh2KSA9PiB2LnZlcnNpb24gPT09IG5ld2VzdCkhKSB9O1xuICAgIHJldHVybiB7IHJlZnVzYWw6IGFkdmlzb3J5UmVmdXNhbChyZWYsIG5ld2VzdCwgYmxvY2tpbmcpIH07XG4gIH1cbiAgaWYgKG1vZGUua2luZCA9PT0gJ2V4cGxpY2l0JyAmJiByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZFxuICAgICYmIHZlcnNpb25zLnNvbWUoKHYpID0+ICF2LnlhbmtlZEF0ICYmIHNhdGlzZmllc1ZlcnNpb25TcGVjKHYudmVyc2lvbiwgcmVxdWVzdGVkKSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmdXNhbDoge1xuICAgICAgICBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLFxuICAgICAgICByZWFzb246ICd2ZXJzaW9uX291dHNpZGVfaW5zdGFsbCcsXG4gICAgICAgIG1lc3NhZ2U6IGBObyB2ZXJzaW9uIG9mICR7cmVmfSBtYXRjaGluZyAke3JlcXVlc3RlZH0gaXMgaW5zaWRlIHlvdXIgaW5zdGFsbCAoJHttb2RlLmluc3RhbGwudmVyc2lvblBvbGljeX0gZnJvbSAke21vZGUuaW5zdGFsbC5waW5uZWRWZXJzaW9ufSkuIFVwZ3JhZGUgdGhlIGluc3RhbGwgZmlyc3QuYCxcbiAgICAgICAgZGV0YWlsczogeyByZXF1ZXN0ZWQsIHZlcnNpb25Qb2xpY3k6IG1vZGUuaW5zdGFsbC52ZXJzaW9uUG9saWN5LCBwaW5uZWRWZXJzaW9uOiBtb2RlLmluc3RhbGwucGlubmVkVmVyc2lvbiB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgcmVmdXNhbDoge1xuICAgICAgY29kZTogJ05PVF9GT1VORCcsXG4gICAgICByZWFzb246ICdub19tYXRjaGluZ192ZXJzaW9uJyxcbiAgICAgIG1lc3NhZ2U6IGBObyByZXNvbHZhYmxlIHZlcnNpb24gb2YgJHtyZWZ9JHtyZXF1ZXN0ZWQgPyBgIG1hdGNoZXMgJHtyZXF1ZXN0ZWR9YCA6ICcnfS5gLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKiBUaGUgaGlnaGVzdCBvZiBgdmVyc2lvbnNgIGJ5IHNlbXZlciAocHJlcmVsZWFzZXMgaW5jbHVkZWQpLiAqL1xuZnVuY3Rpb24gaGlnaGVzdCh2ZXJzaW9uczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHZlcnNpb25zLnJlZHVjZTxzdHJpbmcgfCBudWxsPigoYmVzdCwgdikgPT4gKGJlc3QgPT09IG51bGwgfHwgY29tcGFyZVNlbXZlcih2LCBiZXN0KSA+IDAgPyB2IDogYmVzdCksIG51bGwpO1xufVxuXG5mdW5jdGlvbiBhZHZpc29yeVJlZnVzYWwocmVmOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgYmxvY2tpbmc6IFJlYWRvbmx5QXJyYXk8UGljazxQbHVnaW5BZHZpc29yeSwgJ2lkJyB8ICdzZXZlcml0eScgfCAnZml4ZWRWZXJzaW9uJyB8ICdzdW1tYXJ5Jz4+KTogUmVzb2x1dGlvblJlZnVzYWwge1xuICBjb25zdCBmaXhlZCA9IGJsb2NraW5nLm1hcCgoYSkgPT4gYS5maXhlZFZlcnNpb24pLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+ICEhdik7XG4gIHJldHVybiB7XG4gICAgY29kZTogJ1BMVUdJTl9CTE9DS0VEX0JZX1BPTElDWScsXG4gICAgcmVhc29uOiAnYWR2aXNvcnknLFxuICAgIG1lc3NhZ2U6IGAke3JlZn1AJHt2ZXJzaW9ufSBpcyBibG9ja2VkIGJ5IHlvdXIgb3JnYW5pemF0aW9uJ3MgYWR2aXNvcnkgcG9saWN5OiAke2Jsb2NraW5nLm1hcCgoYSkgPT4gYCR7YS5zZXZlcml0eX0g4oCUICR7YS5zdW1tYXJ5fWApLmpvaW4oJzsgJyl9LmBcbiAgICAgICsgKGZpeGVkLmxlbmd0aCA/IGAgRml4ZWQgaW4gJHtmaXhlZC5qb2luKCcsICcpfS5gIDogJycpLFxuICAgIGRldGFpbHM6IHsgdmVyc2lvbiwgYWR2aXNvcmllczogYmxvY2tpbmcubWFwKChhKSA9PiBhLmlkKSwgLi4uKGZpeGVkLmxlbmd0aCA/IHsgZml4ZWRWZXJzaW9uczogZml4ZWQgfSA6IHt9KSB9LFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlIG9yZydzIGluc3RhbGwgc3RhdGUgZm9yIG9uZSBsaXN0aW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogVGhlIG9yZyAoYW5kLCBmb3IgYSB0ZWFtLCBpdHMgcm9vdCBvcmcpIGEgcmVzb2x1dGlvbiBydW5zIGZvci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x1dGlvblNjb3BlIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgLyoqIFRoZSByb290IG9yZyB3aGVuIHRoZSBjYWxsZXIgaXMgYSB0ZWFtLiAqL1xuICByb290T3JnSWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgb3JnIGlkcyB3aG9zZSBpbnN0YWxscyBhbmQgcG9saWNpZXMgYXBwbHksIG93biBmaXJzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY29wZU9yZ0lkcyhzY29wZTogUmVzb2x1dGlvblNjb3BlKTogc3RyaW5nW10ge1xuICBjb25zdCBvd24gPSBzY29wZS5vcmdJZC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCByb290ID0gc2NvcGUucm9vdE9yZ0lkPy50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gcm9vdCAmJiByb290ICE9PSBvd24gPyBbb3duLCByb290XSA6IFtvd25dO1xufVxuXG4vKipcbiAqIEhvdyB0aGUgb3JnIHJlYWNoZXMgYGxpc3RpbmdgIOKAlCBvciB0aGUgcmVmdXNhbC4gQW4gQUNUSVZFIG93bi1vcmcgcm93IHdpbnMsXG4gKiB0aGVuIHRoZSByb290IG9yZydzIChhIHRlYW0gaW5oZXJpdHMgaXQpOyBmYWlsaW5nIGJvdGgsIHRoZSBpbXBsaWNpdFxuICogT2ZmaWNpYWwgaW5zdGFsbCAodW5sZXNzIHRoZSBwb2xpY3kgaXMgYGV4cGxpY2l0YCk7IG90aGVyd2lzZSB0aGUgb3JnJ3Mgb3duXG4gKiBwZW5kaW5nIC8gZGVuaWVkIHJvdyBleHBsYWlucyB0aGUgcmVmdXNhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxNb2RlRm9yKFxuICBwdWJsaXNoZXI6IFBpY2s8UHVibGlzaGVyLCAnaGFuZGxlJz4sXG4gIGxpc3Rpbmc6IFBpY2s8UGx1Z2luTGlzdGluZywgJ2lkJyB8ICduYW1lJz4sXG4gIGluc3RhbGxzOiByZWFkb25seSBQbHVnaW5JbnN0YWxsW10sXG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3ksXG4gIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGUsXG4pOiBJbnN0YWxsTW9kZSB8IFJlc29sdXRpb25SZWZ1c2FsIHtcbiAgY29uc3QgW293biwgcm9vdF0gPSBzY29wZU9yZ0lkcyhzY29wZSk7XG4gIGNvbnN0IGZvckxpc3RpbmcgPSBpbnN0YWxscy5maWx0ZXIoKGkpID0+IGkubGlzdGluZ0lkID09PSBsaXN0aW5nLmlkKTtcbiAgY29uc3Qgb3duUm93ID0gZm9yTGlzdGluZy5maW5kKChpKSA9PiBpLm9yZ0lkLnRvTG93ZXJDYXNlKCkgPT09IG93bik7XG4gIGNvbnN0IHJvb3RSb3cgPSByb290ID8gZm9yTGlzdGluZy5maW5kKChpKSA9PiBpLm9yZ0lkLnRvTG93ZXJDYXNlKCkgPT09IHJvb3QpIDogdW5kZWZpbmVkO1xuICBpZiAob3duUm93Py5zdGF0dXMgPT09ICdhY3RpdmUnKSByZXR1cm4geyBraW5kOiAnZXhwbGljaXQnLCBpbnN0YWxsOiBvd25Sb3csIGluaGVyaXRlZDogZmFsc2UgfTtcbiAgaWYgKHJvb3RSb3c/LnN0YXR1cyA9PT0gJ2FjdGl2ZScpIHJldHVybiB7IGtpbmQ6ICdleHBsaWNpdCcsIGluc3RhbGw6IHJvb3RSb3csIGluaGVyaXRlZDogdHJ1ZSB9O1xuICBjb25zdCByZWYgPSBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gO1xuICBpZiAocHVibGlzaGVyLmhhbmRsZSA9PT0gT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRSkge1xuICAgIGlmIChwb2xpY3kub2ZmaWNpYWxJbnN0YWxscyA9PT0gJ2ltcGxpY2l0JykgcmV0dXJuIHsga2luZDogJ2ltcGxpY2l0JyB9O1xuICAgIGlmICghb3duUm93KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLFxuICAgICAgICByZWFzb246ICdvZmZpY2lhbF9leHBsaWNpdCcsXG4gICAgICAgIG1lc3NhZ2U6IGBZb3VyIG9yZ2FuaXphdGlvbiBpbnN0YWxscyBPZmZpY2lhbCBwbHVnaW5zIGV4cGxpY2l0bHk7IGluc3RhbGwgJHtyZWZ9IGZpcnN0LmAsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBpZiAob3duUm93Py5zdGF0dXMgPT09ICdwZW5kaW5nX2FwcHJvdmFsJykge1xuICAgIHJldHVybiB7IGNvZGU6ICdQTFVHSU5fTk9UX0lOU1RBTExFRCcsIHJlYXNvbjogJ3BlbmRpbmdfYXBwcm92YWwnLCBtZXNzYWdlOiBgVGhlIGluc3RhbGwgb2YgJHtyZWZ9IGlzIHdhaXRpbmcgZm9yIGFwcHJvdmFsLmAgfTtcbiAgfVxuICBpZiAob3duUm93Py5zdGF0dXMgPT09ICdkZW5pZWQnKSB7XG4gICAgcmV0dXJuIHsgY29kZTogJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJywgcmVhc29uOiAnZGVuaWVkJywgbWVzc2FnZTogYFRoZSBpbnN0YWxsIG9mICR7cmVmfSB3YXMgZGVuaWVkLmAgfTtcbiAgfVxuICByZXR1cm4geyBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLCByZWFzb246ICdub3RfaW5zdGFsbGVkJywgbWVzc2FnZTogYCR7cmVmfSBpcyBub3QgaW5zdGFsbGVkIGluIHlvdXIgb3JnYW5pemF0aW9uLmAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERhdGEgc291cmNlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogVGhlIHJvd3MgdGhlIHJlc29sdmVyIHJlYWRzLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBydW4gd2l0aCBhIHNjb3BlIHRoYXQgY2FuXG4gKiAgcmVhZCB0aGUgZWNvc3lzdGVtIHRhYmxlcyBhbmQgdGhlIG9yZydzIChhbmQgcm9vdCBvcmcncykgaW5zdGFsbCByb3dzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0aW5nRGF0YVNvdXJjZSB7XG4gIHB1Ymxpc2hlckJ5SGFuZGxlKGhhbmRsZTogc3RyaW5nKTogUHJvbWlzZTxQdWJsaXNoZXIgfCBudWxsPjtcbiAgcHVibGlzaGVyc0J5SWRzKGlkczogc3RyaW5nW10pOiBQcm9taXNlPFB1Ymxpc2hlcltdPjtcbiAgbGlzdGluZ0J5TmFtZShwdWJsaXNoZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBsdWdpbkxpc3RpbmcgfCBudWxsPjtcbiAgLyoqIExpc3RlZCAvIHVubWFpbnRhaW5lZCBsaXN0aW5ncyAob3B0aW9uYWxseSBvbmx5IHRoZXNlIGlkcyBvciBuYW1lcykuICovXG4gIGxpdmVMaXN0aW5ncyhmaWx0ZXI/OiB7IGlkcz86IHN0cmluZ1tdOyBuYW1lcz86IHN0cmluZ1tdIH0pOiBQcm9taXNlPFBsdWdpbkxpc3RpbmdbXT47XG4gIHZlcnNpb25zRm9yTGlzdGluZ3MobGlzdGluZ0lkczogc3RyaW5nW10pOiBQcm9taXNlPFBsdWdpbkxpc3RpbmdWZXJzaW9uW10+O1xuICAvKiogUFVCTElTSEVEIGFkdmlzb3JpZXMuICovXG4gIGFkdmlzb3JpZXNGb3JMaXN0aW5ncyhsaXN0aW5nSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luQWR2aXNvcnlbXT47XG4gIGluc3RhbGxzRm9yT3JncyhvcmdJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxQbHVnaW5JbnN0YWxsW10+O1xuICBwb2xpY2llc0Zvck9yZ3Mob3JnSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luSW5zdGFsbFBvbGljeVtdPjtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBMaXN0aW5nRGF0YVNvdXJjZX0gb3ZlciBhIGRyaXp6bGUgdHJhbnNhY3Rpb24uIFRoZSBjYWxsZXIgb3ducyB0aGVcbiAqIHRyYW5zYWN0aW9uJ3Mgc2NvcGU6IGl0IG11c3QgYmUgYWJsZSB0byByZWFkIHRoZSBlY29zeXN0ZW0gdGFibGVzIChhcHAtcm9sZVxuICogUkxTKSBhbmQgdGhlIGluc3RhbGwgcm93cyBvZiB0aGUgb3JnIEFORCBpdHMgcm9vdCBvcmcgKGEgdGVhbSdzIHJlYWRzIG9mIGl0c1xuICogcm9vdCdzIHJvd3MgbmVlZCBhbiBlbGV2YXRlZCBzY29wZSwgbGlrZSBwYXJlbnQtb3JnIHBsdWdpbiByZWFkcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcml6emxlTGlzdGluZ1NvdXJjZSh0eDogQ3J1ZFR4KTogTGlzdGluZ0RhdGFTb3VyY2Uge1xuICBjb25zdCBkYiA9IHR4O1xuICBjb25zdCBQID0gc2NoZW1hLnB1Ymxpc2hlcjtcbiAgY29uc3QgTCA9IHNjaGVtYS5wbHVnaW5MaXN0aW5nO1xuICBjb25zdCBWID0gc2NoZW1hLnBsdWdpbkxpc3RpbmdWZXJzaW9uO1xuICBjb25zdCBBID0gc2NoZW1hLnBsdWdpbkFkdmlzb3J5O1xuICBjb25zdCBJID0gc2NoZW1hLnBsdWdpbkluc3RhbGw7XG4gIGNvbnN0IElQID0gc2NoZW1hLnBsdWdpbkluc3RhbGxQb2xpY3k7XG4gIHJldHVybiB7XG4gICAgcHVibGlzaGVyQnlIYW5kbGU6IGFzeW5jIChoYW5kbGUpID0+ICgoYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShQKS53aGVyZShlcShQLmhhbmRsZSwgaGFuZGxlKSkpIGFzIFB1Ymxpc2hlcltdKVswXSA/PyBudWxsLFxuICAgIHB1Ymxpc2hlcnNCeUlkczogYXN5bmMgKGlkcykgPT4gKGlkcy5sZW5ndGggPyBkYi5zZWxlY3QoKS5mcm9tKFApLndoZXJlKGluQXJyYXkoUC5pZCwgaWRzKSkgOiBbXSksXG4gICAgbGlzdGluZ0J5TmFtZTogYXN5bmMgKHB1Ymxpc2hlcklkLCBuYW1lKSA9PlxuICAgICAgKChhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKEwpLndoZXJlKGFuZChlcShMLnB1Ymxpc2hlcklkLCBwdWJsaXNoZXJJZCksIGVxKEwubmFtZSwgbmFtZSkpKSkgYXMgUGx1Z2luTGlzdGluZ1tdKVswXSA/PyBudWxsLFxuICAgIGxpdmVMaXN0aW5nczogYXN5bmMgKGZpbHRlciA9IHt9KSA9PiB7XG4gICAgICBpZiAoZmlsdGVyLmlkcyAmJiBmaWx0ZXIuaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgaWYgKGZpbHRlci5uYW1lcyAmJiBmaWx0ZXIubmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICByZXR1cm4gZGIuc2VsZWN0KCkuZnJvbShMKS53aGVyZShhbmQoXG4gICAgICAgIGluQXJyYXkoTC5zdGF0ZSwgWydsaXN0ZWQnLCAndW5tYWludGFpbmVkJ10pLFxuICAgICAgICAuLi4oZmlsdGVyLmlkcyA/IFtpbkFycmF5KEwuaWQsIGZpbHRlci5pZHMpXSA6IFtdKSxcbiAgICAgICAgLi4uKGZpbHRlci5uYW1lcyA/IFtpbkFycmF5KEwubmFtZSwgZmlsdGVyLm5hbWVzKV0gOiBbXSksXG4gICAgICApKTtcbiAgICB9LFxuICAgIHZlcnNpb25zRm9yTGlzdGluZ3M6IGFzeW5jIChpZHMpID0+IChpZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShWKS53aGVyZShpbkFycmF5KFYubGlzdGluZ0lkLCBpZHMpKSA6IFtdKSxcbiAgICBhZHZpc29yaWVzRm9yTGlzdGluZ3M6IGFzeW5jIChpZHMpID0+IChpZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShBKS53aGVyZShhbmQoaW5BcnJheShBLmxpc3RpbmdJZCwgaWRzKSwgZXEoQS5zdGF0ZSwgJ3B1Ymxpc2hlZCcpKSkgOiBbXSksXG4gICAgaW5zdGFsbHNGb3JPcmdzOiBhc3luYyAob3JnSWRzKSA9PiAob3JnSWRzLmxlbmd0aCA/IGRiLnNlbGVjdCgpLmZyb20oSSkud2hlcmUoaW5BcnJheShJLm9yZ0lkLCBvcmdJZHMpKSA6IFtdKSxcbiAgICBwb2xpY2llc0Zvck9yZ3M6IGFzeW5jIChvcmdJZHMpID0+IChvcmdJZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShJUCkud2hlcmUoaW5BcnJheShJUC5vcmdJZCwgb3JnSWRzKSkgOiBbXSksXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXNvbHV0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQSBwbHVnaW4gcmVmZXJlbmNlIGFzIHRoZSByZXNvbHZlciByZWFkcyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ1JlZmVyZW5jZSB7XG4gIC8qKiBQdWJsaXNoZXIgaGFuZGxlOyBhYnNlbnQgPSB0aGUgT2ZmaWNpYWwgbGlzdGluZyAodGhlIHVucXVhbGlmaWVkIGZhbGxiYWNrKS4gKi9cbiAgcHVibGlzaGVyPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmVmZXJlbmNlJ3MgYGZpbHRlci52ZXJzaW9uYC4gKi9cbiAgdmVyc2lvbj86IHN0cmluZztcbn1cblxuLyoqIEEgcmVmZXJlbmNlIHRoYXQgcmVzb2x2ZWQgdG8gYSBsaXN0ZWQgdmVyc2lvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ1Jlc29sdmVkIHtcbiAgb2s6IHRydWU7XG4gIHB1Ymxpc2hlcjogUHVibGlzaGVyO1xuICBsaXN0aW5nOiBQbHVnaW5MaXN0aW5nO1xuICB2ZXJzaW9uOiBQbHVnaW5MaXN0aW5nVmVyc2lvbjtcbiAgbW9kZTogSW5zdGFsbE1vZGU7XG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3k7XG4gIC8qKiBUaGUgc3BlYyBkZWNsYXJlcyBzZWNyZXRzIHRoZSBwb2xpY3kgd2l0aGhvbGRzIGZyb20gdGhpcyB0aWVyLiAqL1xuICBzZWNyZXRzV2l0aGhlbGQ6IGJvb2xlYW47XG4gIHdhcm5pbmdzOiBSZXNvbHV0aW9uV2FybmluZ1tdO1xufVxuXG4vKiogQSByZWZlcmVuY2UgdGhhdCBuYW1lZCBhIGxpc3RpbmcgYnV0IGNhbid0IHJlc29sdmUuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RpbmdSZWZ1c2VkIHtcbiAgb2s6IGZhbHNlO1xuICByZWZ1c2FsOiBSZXNvbHV0aW9uUmVmdXNhbDtcbiAgcHVibGlzaGVyPzogUHVibGlzaGVyO1xuICBsaXN0aW5nPzogUGx1Z2luTGlzdGluZztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGByZWZgIHRvIGEgbGlzdGVkIHZlcnNpb24gZm9yIGBzY29wZWAsIG9yIHJlZnVzZS4gTnVsbCB3aGVuIHRoZVxuICogbGlzdGluZyBkb2Vzbid0IGV4aXN0IGF0IGFsbCAoYW4gdW5xdWFsaWZpZWQgcmVmZXJlbmNlIHRoZW4gc2ltcGx5IGhhcyBub1xuICogT2ZmaWNpYWwgZmFsbGJhY2spLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxpc3RpbmdSZWZlcmVuY2UoXG4gIHNvdXJjZTogTGlzdGluZ0RhdGFTb3VyY2UsXG4gIHJlZjogTGlzdGluZ1JlZmVyZW5jZSxcbiAgc2NvcGU6IFJlc29sdXRpb25TY29wZSxcbik6IFByb21pc2U8TGlzdGluZ1Jlc29sdmVkIHwgTGlzdGluZ1JlZnVzZWQgfCBudWxsPiB7XG4gIGNvbnN0IGhhbmRsZSA9IHJlZi5wdWJsaXNoZXIgPz8gT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRTtcbiAgY29uc3QgcHVibGlzaGVyID0gYXdhaXQgc291cmNlLnB1Ymxpc2hlckJ5SGFuZGxlKGhhbmRsZSk7XG4gIGlmICghcHVibGlzaGVyKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbGlzdGluZyA9IGF3YWl0IHNvdXJjZS5saXN0aW5nQnlOYW1lKHB1Ymxpc2hlci5pZCwgcmVmLm5hbWUpO1xuICBpZiAoIWxpc3RpbmcpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG9yZ0lkcyA9IHNjb3BlT3JnSWRzKHNjb3BlKTtcbiAgY29uc3QgW3BvbGljaWVzLCBpbnN0YWxsc10gPSBhd2FpdCBQcm9taXNlLmFsbChbc291cmNlLnBvbGljaWVzRm9yT3JncyhvcmdJZHMpLCBzb3VyY2UuaW5zdGFsbHNGb3JPcmdzKG9yZ0lkcyldKTtcbiAgY29uc3QgcG9saWN5ID0gZWZmZWN0aXZlQ29uc3VtcHRpb25Qb2xpY3kocG9saWNpZXMsIG9yZ0lkc1swXSEsIG9yZ0lkc1sxXSk7XG4gIGNvbnN0IGJsb2NrID0gbGlzdGluZ0Jsb2NrKHBvbGljeSwgcHVibGlzaGVyLCBsaXN0aW5nKTtcbiAgaWYgKGJsb2NrKSByZXR1cm4geyBvazogZmFsc2UsIHJlZnVzYWw6IGJsb2NrUmVmdXNhbChibG9jayksIHB1Ymxpc2hlciwgbGlzdGluZyB9O1xuXG4gIGNvbnN0IG1vZGUgPSBpbnN0YWxsTW9kZUZvcihwdWJsaXNoZXIsIGxpc3RpbmcsIGluc3RhbGxzLCBwb2xpY3ksIHNjb3BlKTtcbiAgaWYgKCdjb2RlJyBpbiBtb2RlKSByZXR1cm4geyBvazogZmFsc2UsIHJlZnVzYWw6IG1vZGUsIHB1Ymxpc2hlciwgbGlzdGluZyB9O1xuXG4gIGNvbnN0IFt2ZXJzaW9ucywgYWR2aXNvcmllc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgc291cmNlLnZlcnNpb25zRm9yTGlzdGluZ3MoW2xpc3RpbmcuaWRdKSxcbiAgICBzb3VyY2UuYWR2aXNvcmllc0Zvckxpc3RpbmdzKFtsaXN0aW5nLmlkXSksXG4gIF0pO1xuICBjb25zdCByZWZfID0gYCR7cHVibGlzaGVyLmhhbmRsZX0vJHtsaXN0aW5nLm5hbWV9YDtcbiAgY29uc3QgY2hvaWNlID0gc2VsZWN0TGlzdGluZ1ZlcnNpb24oeyByZWY6IHJlZl8sIHZlcnNpb25zLCBtb2RlLCByZXF1ZXN0ZWQ6IHJlZi52ZXJzaW9uLCBhZHZpc29yaWVzLCBwb2xpY3kgfSk7XG4gIGlmICgncmVmdXNhbCcgaW4gY2hvaWNlKSByZXR1cm4geyBvazogZmFsc2UsIHJlZnVzYWw6IGNob2ljZS5yZWZ1c2FsLCBwdWJsaXNoZXIsIGxpc3RpbmcgfTtcblxuICBjb25zdCB2ZXJzaW9uID0gY2hvaWNlLnZlcnNpb247XG4gIGNvbnN0IHsgd2FybmluZ3MsIHNlY3JldHNXaXRoaGVsZCB9ID0gbGlzdGVkVmVyc2lvbldhcm5pbmdzKHsgcHVibGlzaGVyLCBsaXN0aW5nLCB2ZXJzaW9uLCBhZHZpc29yaWVzLCBwb2xpY3kgfSk7XG4gIHJldHVybiB7IG9rOiB0cnVlLCBwdWJsaXNoZXIsIGxpc3RpbmcsIHZlcnNpb24sIG1vZGUsIHBvbGljeSwgc2VjcmV0c1dpdGhoZWxkLCB3YXJuaW5ncyB9O1xufVxuXG4vKipcbiAqIFRoZSBub24tZmF0YWwgbm90ZXMgYSByZXNvbHZlZCBsaXN0ZWQgdmVyc2lvbiBjYXJyaWVzIChsb29rdXAgYW5zd2VycyxcbiAqIHN5bnRoIHByaW50cyB0aGVtLCB0aGUgaW5zdGFsbHMgdmlldyBzaG93cyB0aGVtKTogYW4gdW5tYWludGFpbmVkIGxpc3RpbmcsIGFcbiAqIGRlcHJlY2F0ZWQgdmVyc2lvbiwgYSBQVUJMSVNIRUQgYWR2aXNvcnkgY292ZXJpbmcgdGhlIHZlcnNpb24gdGhhdCB0aGUgb3JnJ3NcbiAqIGBibG9ja09uQWR2aXNvcnlgIGRvZXNuJ3QgYmxvY2sgKGEgYmxvY2tpbmcgb25lIHJlZnVzZXMgcmVzb2x1dGlvbiBpbnN0ZWFkKSxcbiAqIGFuZCB3aXRoaGVsZCBzZWNyZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVkVmVyc2lvbldhcm5pbmdzKGlucHV0OiB7XG4gIHB1Ymxpc2hlcjogUGljazxQdWJsaXNoZXIsICdoYW5kbGUnIHwgJ3RpZXInPjtcbiAgbGlzdGluZzogUGljazxQbHVnaW5MaXN0aW5nLCAnbmFtZScgfCAnc3RhdGUnPjtcbiAgdmVyc2lvbjogUGljazxQbHVnaW5MaXN0aW5nVmVyc2lvbiwgJ3ZlcnNpb24nIHwgJ2RlcHJlY2F0ZWRBdCcgfCAnZGVwcmVjYXRpb25NZXNzYWdlJyB8ICdzcGVjU25hcHNob3QnPlxuICAgICYgUGFydGlhbDxQaWNrPFBsdWdpbkxpc3RpbmdWZXJzaW9uLCAnc2NhbkZsYWdnZWRBdCcgfCAnc2NhbkZsYWcnPj47XG4gIGFkdmlzb3JpZXM6IHJlYWRvbmx5IFBpY2s8UGx1Z2luQWR2aXNvcnksICdzZXZlcml0eScgfCAnc3RhdGUnIHwgJ2FmZmVjdGVkUmFuZ2UnIHwgJ2ZpeGVkVmVyc2lvbicgfCAnc3VtbWFyeSc+W107XG4gIHBvbGljeTogUGljazxDb25zdW1wdGlvblBvbGljeSwgJ3NlY3JldHNBbGxvd2VkVGllcnMnPjtcbn0pOiB7IHdhcm5pbmdzOiBSZXNvbHV0aW9uV2FybmluZ1tdOyBzZWNyZXRzV2l0aGhlbGQ6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBsaXN0aW5nLCB2ZXJzaW9uLCBhZHZpc29yaWVzLCBwb2xpY3kgfSA9IGlucHV0O1xuICBjb25zdCByZWYgPSBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gO1xuICBjb25zdCBkZWNsYXJlc1NlY3JldHMgPSAodmVyc2lvbi5zcGVjU25hcHNob3Q/LnNlY3JldHMgPz8gW10pLmxlbmd0aCA+IDA7XG4gIGNvbnN0IHNlY3JldHNXaXRoaGVsZCA9IGRlY2xhcmVzU2VjcmV0cyAmJiAhcG9saWN5LnNlY3JldHNBbGxvd2VkVGllcnMuaW5jbHVkZXMocHVibGlzaGVyLnRpZXIpO1xuICBjb25zdCB3YXJuaW5nczogUmVzb2x1dGlvbldhcm5pbmdbXSA9IFtdO1xuICBpZiAobGlzdGluZy5zdGF0ZSA9PT0gJ3VubWFpbnRhaW5lZCcpIHtcbiAgICB3YXJuaW5ncy5wdXNoKHsgY29kZTogJ0xJU1RJTkdfVU5NQUlOVEFJTkVEJywgbWVzc2FnZTogYCR7cmVmfSBpcyB1bm1haW50YWluZWQ6IGl0IHJlY2VpdmVzIG5vIHVwZGF0ZXMuIFBsYW4gYSByZXBsYWNlbWVudC5gIH0pO1xuICB9XG4gIGlmICh2ZXJzaW9uLmRlcHJlY2F0ZWRBdCkge1xuICAgIHdhcm5pbmdzLnB1c2goeyBjb2RlOiAnUExVR0lOX0RFUFJFQ0FURUQnLCBtZXNzYWdlOiBgJHtyZWZ9QCR7dmVyc2lvbi52ZXJzaW9ufSBpcyBkZXByZWNhdGVkJHt2ZXJzaW9uLmRlcHJlY2F0aW9uTWVzc2FnZSA/IGA6ICR7dmVyc2lvbi5kZXByZWNhdGlvbk1lc3NhZ2V9YCA6ICcnfS5gIH0pO1xuICB9XG4gIGZvciAoY29uc3QgYSBvZiBhZHZpc29yaWVzQ292ZXJpbmcoYWR2aXNvcmllcywgdmVyc2lvbi52ZXJzaW9uKSkge1xuICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgY29kZTogJ1BMVUdJTl9BRFZJU09SWScsXG4gICAgICBtZXNzYWdlOiBgJHtyZWZ9QCR7dmVyc2lvbi52ZXJzaW9ufSBpcyBhZmZlY3RlZCBieSBhICR7YS5zZXZlcml0eX0gc2VjdXJpdHkgYWR2aXNvcnk6ICR7YS5zdW1tYXJ5fWBcbiAgICAgICAgKyBgJHthLmZpeGVkVmVyc2lvbiA/IGAgRml4ZWQgaW4gJHthLmZpeGVkVmVyc2lvbn0uYCA6ICcnfWAsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgZmxhZyA9IHZlcnNpb24uc2NhbkZsYWdnZWRBdCA/IGFzU2NhbkZsYWcodmVyc2lvbi5zY2FuRmxhZykgOiBudWxsO1xuICBpZiAoZmxhZykgd2FybmluZ3MucHVzaCh2dWxuRmxhZ2dlZFdhcm5pbmcocmVmLCB2ZXJzaW9uLnZlcnNpb24sIGZsYWcpKTtcbiAgaWYgKHNlY3JldHNXaXRoaGVsZCkge1xuICAgIHdhcm5pbmdzLnB1c2goeyBjb2RlOiAnUExVR0lOX1NFQ1JFVFNfV0lUSEhFTEQnLCBtZXNzYWdlOiBgJHtyZWZ9IGlzIGEgJHtwdWJsaXNoZXIudGllcn0gcGx1Z2luOyB5b3VyIG9yZ2FuaXphdGlvbidzIHBvbGljeSBnaXZlcyBpdCBubyBzZWNyZXRzLCBzbyBpdHMgZGVjbGFyZWQgc2VjcmV0cyBhcmUgbm90IGluamVjdGVkLmAgfSk7XG4gIH1cbiAgcmV0dXJuIHsgd2FybmluZ3MsIHNlY3JldHNXaXRoaGVsZCB9O1xufVxuXG4vKipcbiAqIFRoZSBwbHVnaW4gcmVjb3JkIGEgcmVzb2x2ZWQgbGlzdGluZyB2ZXJzaW9uIHJ1bnMgYXMg4oCUIHRoZSBzaGFwZSBzeW50aCBhbmRcbiAqIHRoZSBjb250cmFjdCBjaGVjayByZWFkIChhIGBwbHVnaW5zYCByb3cncyBydW4gZmllbGRzKSwgYnVpbHQgZnJvbSB0aGVcbiAqIHZlcnNpb24ncyBmcm96ZW4gc3BlYyBzbmFwc2hvdC4gYGlkYCBpcyB0aGUgTElTVElORyBWRVJTSU9OJ3MgaWQgKHRoZSBzdGVwXG4gKiBtYW5pZmVzdCByZXNvbHZlcyBpdCBiYWNrKSwgYGltYWdlUmVwb3NpdG9yeWAgaXRzIGBwdWJsaWMvKmAgY29weS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlZFBsdWdpblJlY29yZChyZXM6IExpc3RpbmdSZXNvbHZlZCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgeyBwdWJsaXNoZXIsIGxpc3RpbmcsIHZlcnNpb24sIG1vZGUgfSA9IHJlcztcbiAgY29uc3QgcyA9ICh2ZXJzaW9uLnNwZWNTbmFwc2hvdCA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGFyciA9IDxUPih2OiB1bmtub3duKTogVFtdID0+IChBcnJheS5pc0FycmF5KHYpID8gdiBhcyBUW10gOiBbXSk7XG4gIGNvbnN0IG9iaiA9ICh2OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gKHYgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHYpID8gdiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA6IHt9KTtcbiAgcmV0dXJuIHtcbiAgICBpZDogdmVyc2lvbi5pZCxcbiAgICBzb3VyY2U6ICdsaXN0aW5nJyxcbiAgICBwdWJsaXNoZXI6IHB1Ymxpc2hlci5oYW5kbGUsXG4gICAgcHVibGlzaGVyVGllcjogcHVibGlzaGVyLnRpZXIsXG4gICAgbGlzdGluZ0lkOiBsaXN0aW5nLmlkLFxuICAgIGluc3RhbGw6IG1vZGUua2luZCxcbiAgICBuYW1lOiBsaXN0aW5nLm5hbWUsXG4gICAgdmVyc2lvbjogdmVyc2lvbi52ZXJzaW9uLFxuICAgIGltYWdlUmVwb3NpdG9yeTogdmVyc2lvbi5pbWFnZVJlcG9zaXRvcnksXG4gICAgaW1hZ2VEaWdlc3Q6IHZlcnNpb24uaW1hZ2VEaWdlc3QsXG4gICAgYnVpbGRUeXBlOiB0eXBlb2Ygcy5idWlsZFR5cGUgPT09ICdzdHJpbmcnID8gcy5idWlsZFR5cGUgOiAodmVyc2lvbi5pbWFnZURpZ2VzdCA/ICdidWlsZF9pbWFnZScgOiAnbWV0YWRhdGFfb25seScpLFxuICAgIHBsdWdpblR5cGU6IHMucGx1Z2luVHlwZSA/PyAnQ29kZUJ1aWxkU3RlcCcsXG4gICAgY29tcHV0ZVR5cGU6IHMuY29tcHV0ZVR5cGUgPz8gJ1NNQUxMJyxcbiAgICBkZXNjcmlwdGlvbjogcy5kZXNjcmlwdGlvbiA/PyBsaXN0aW5nLmRlc2NyaXB0aW9uID8/IG51bGwsXG4gICAgc3VtbWFyeTogcy5zdW1tYXJ5ID8/IGxpc3Rpbmcuc3VtbWFyeSA/PyBudWxsLFxuICAgIGRpc3BsYXlOYW1lOiBzLmRpc3BsYXlOYW1lID8/IG51bGwsXG4gICAga2V5d29yZHM6IGFycjxzdHJpbmc+KHMua2V5d29yZHMpLFxuICAgIGNhdGVnb3J5OiBzLmNhdGVnb3J5ID8/IGxpc3RpbmcuY2F0ZWdvcnksXG4gICAgbWV0YWRhdGE6IG9iaihzLm1ldGFkYXRhKSxcbiAgICBlbnY6IG9iaihzLmVudiksXG4gICAgYnVpbGRBcmdzOiB7fSxcbiAgICBpbnN0YWxsQ29tbWFuZHM6IGFycjxzdHJpbmc+KHMuaW5zdGFsbENvbW1hbmRzKSxcbiAgICBjb21tYW5kczogYXJyPHN0cmluZz4ocy5jb21tYW5kcyksXG4gICAgdGltZW91dDogcy50aW1lb3V0ID8/IG51bGwsXG4gICAgZmFpbHVyZUJlaGF2aW9yOiBzLmZhaWx1cmVCZWhhdmlvciA/PyAnZmFpbCcsXG4gICAgcHJpbWFyeU91dHB1dERpcmVjdG9yeTogcy5wcmltYXJ5T3V0cHV0RGlyZWN0b3J5ID8/IG51bGwsXG4gICAgc2VjcmV0czogcmVzLnNlY3JldHNXaXRoaGVsZCA/IFtdIDogYXJyKHMuc2VjcmV0cyksXG4gICAgcmVxdWlyZWRNZXRhZGF0YTogYXJyPHN0cmluZz4ocy5yZXF1aXJlZE1ldGFkYXRhKSxcbiAgICByZXF1aXJlZFZhcnM6IGFycjxzdHJpbmc+KHMucmVxdWlyZWRWYXJzKSxcbiAgICBtZXRhZGF0YVR5cGVzOiBvYmoocy5tZXRhZGF0YVR5cGVzKSxcbiAgICB2YXJzVHlwZXM6IG9iaihzLnZhcnNUeXBlcyksXG4gICAgbmV0d29ya0VncmVzczogYXJyPHN0cmluZz4ocy5uZXR3b3JrRWdyZXNzKSxcbiAgICBydW5Bc1Jvb3Q6IHMucnVuQXNSb290ID8/IG51bGwsXG4gICAgbGljZW5zZTogcy5saWNlbnNlID8/IGxpc3RpbmcubGljZW5zZSA/PyBudWxsLFxuICAgIGhvbWVwYWdlVXJsOiBzLmhvbWVwYWdlVXJsID8/IGxpc3RpbmcuaG9tZXBhZ2VVcmwgPz8gbnVsbCxcbiAgICBzb3VyY2VVcmw6IHMuc291cmNlVXJsID8/IGxpc3Rpbmcuc291cmNlVXJsID8/IG51bGwsXG4gICAgZG9jdW1lbnRhdGlvblVybDogcy5kb2N1bWVudGF0aW9uVXJsID8/IG51bGwsXG4gICAgaWNvbjogcy5pY29uID8/IGxpc3RpbmcuaWNvbiA/PyBudWxsLFxuICAgIGNoYW5nZWxvZzogdmVyc2lvbi5jaGFuZ2Vsb2csXG4gICAgYnJlYWtpbmc6IHZlcnNpb24uYnJlYWtpbmcsXG4gICAgdnVsbkNyaXRpY2FsOiB2ZXJzaW9uLnZ1bG5Dcml0aWNhbCxcbiAgICB2dWxuSGlnaDogdmVyc2lvbi52dWxuSGlnaCxcbiAgICB2dWxuQ3JpdGljYWxGaXhhYmxlOiB2ZXJzaW9uLnZ1bG5Dcml0aWNhbEZpeGFibGUsXG4gICAgdnVsbkhpZ2hGaXhhYmxlOiB2ZXJzaW9uLnZ1bG5IaWdoRml4YWJsZSxcbiAgICBzY2FubmVkQXQ6IHZlcnNpb24uc2Nhbm5lZEF0LFxuICAgIHNjYW5GbGFnZ2VkQXQ6IHZlcnNpb24uc2NhbkZsYWdnZWRBdCxcbiAgICBzY2FuRmxhZzogdmVyc2lvbi5zY2FuRmxhZyxcbiAgICBsaWZlY3ljbGU6IHZlcnNpb24uZGVwcmVjYXRlZEF0ID8gJ2RlcHJlY2F0ZWQnIDogJ3Byb2R1Y3Rpb24nLFxuICAgIGRlcHJlY2F0ZWRBdDogdmVyc2lvbi5kZXByZWNhdGVkQXQsXG4gICAgZGVwcmVjYXRpb25NZXNzYWdlOiB2ZXJzaW9uLmRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICB5YW5rZWRBdDogbnVsbCxcbiAgICB5YW5rUmVhc29uOiBudWxsLFxuICAgIHZpc2liaWxpdHk6ICdwdWJsaWMnLFxuICAgIGlzRGVmYXVsdDogdHJ1ZSxcbiAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV2ZXJ5dGhpbmcgYW4gb3JnIGNhbiByZXNvbHZlIChjYXRhbG9nLCBBSSBzZWxlY3Rpb24sIHBsYWNlaG9sZGVyIGd1YXJkKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIE9uZSBsaXN0aW5nIHdpdGggdGhlIG9yZydzIHN0YW5kaW5nIG9uIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdMaXN0aW5nU3RhdGUge1xuICBwdWJsaXNoZXI6IFB1Ymxpc2hlcjtcbiAgbGlzdGluZzogUGx1Z2luTGlzdGluZztcbiAgdmVyc2lvbnM6IFBsdWdpbkxpc3RpbmdWZXJzaW9uW107XG4gIC8qKiBIb3cgdGhlIG9yZyByZWFjaGVzIGl0LCBvciB3aHkgaXQgY2FuJ3QgKG5vdCBpbnN0YWxsZWQsIHBlbmRpbmcsIOKApikuICovXG4gIG1vZGU6IEluc3RhbGxNb2RlIHwgUmVzb2x1dGlvblJlZnVzYWw7XG4gIC8qKiBBIHBvbGljeSAvIHN0YXRlIGJsb2NrICh0aWVyLCBibG9ja2VkIGxpc3RpbmcsIHN1c3BlbmRlZCksIG9yIG51bGwuICovXG4gIGJsb2NrOiBMaXN0aW5nQmxvY2sgfCBudWxsO1xuICAvKiogV2hhdCBhbiBVTlZFUlNJT05FRCByZWZlcmVuY2UgcmVzb2x2ZXMgdG8gcmlnaHQgbm93LCBvciBudWxsLiAqL1xuICByZXNvbHZlZDogUGx1Z2luTGlzdGluZ1ZlcnNpb24gfCBudWxsO1xuICAvKiogV2h5IG5vdGhpbmcgcmVzb2x2ZXMsIHdoZW4gdGhlIG9yZyBkb2VzIHJlYWNoIHRoZSBsaXN0aW5nIChlLmcuIGFuIGFkdmlzb3J5IGJsb2NrKS4gKi9cbiAgcmVmdXNhbDogUmVzb2x1dGlvblJlZnVzYWwgfCBudWxsO1xuICAvKiogVGhlIGxpc3RpbmcncyBQVUJMSVNIRUQgYWR2aXNvcmllcy4gKi9cbiAgYWR2aXNvcmllczogUGx1Z2luQWR2aXNvcnlbXTtcbiAgLyoqIFRoZSBvcmcncyBvd24gaW5zdGFsbCByb3cgZm9yIGl0IChleHBsaWNpdCwgcG9zc2libHkgcGVuZGluZy9kZW5pZWQpLiAqL1xuICBvd25JbnN0YWxsOiBQbHVnaW5JbnN0YWxsIHwgbnVsbDtcbiAgLyoqIFRoZSBvcmcncyBlZmZlY3RpdmUgY29uc3VtcHRpb24gcG9saWN5ICh0aGUgc2FtZSBmb3IgZXZlcnkgbGlzdGluZykuICovXG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3k7XG59XG5cbi8qKiBUaGUgb3JnJ3MgcG9saWN5ICsgaW5zdGFsbCByb3dzIChvd24gYW5kIHJvb3QpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdJbnN0YWxsQ29udGV4dCB7XG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3k7XG4gIGluc3RhbGxzOiBQbHVnaW5JbnN0YWxsW107XG4gIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGU7XG59XG5cbi8qKiBMb2FkIHRoZSBvcmcncyBwb2xpY3kgYW5kIGluc3RhbGwgcm93cy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkT3JnSW5zdGFsbENvbnRleHQoc291cmNlOiBMaXN0aW5nRGF0YVNvdXJjZSwgc2NvcGU6IFJlc29sdXRpb25TY29wZSk6IFByb21pc2U8T3JnSW5zdGFsbENvbnRleHQ+IHtcbiAgY29uc3Qgb3JnSWRzID0gc2NvcGVPcmdJZHMoc2NvcGUpO1xuICBjb25zdCBbcG9saWNpZXMsIGluc3RhbGxzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtzb3VyY2UucG9saWNpZXNGb3JPcmdzKG9yZ0lkcyksIHNvdXJjZS5pbnN0YWxsc0Zvck9yZ3Mob3JnSWRzKV0pO1xuICByZXR1cm4geyBwb2xpY3k6IGVmZmVjdGl2ZUNvbnN1bXB0aW9uUG9saWN5KHBvbGljaWVzLCBvcmdJZHNbMF0hLCBvcmdJZHNbMV0pLCBpbnN0YWxscywgc2NvcGUgfTtcbn1cblxuLyoqXG4gKiBUaGUgb3JnJ3Mgc3RhbmRpbmcgb24gZXZlcnkgbGl2ZSBsaXN0aW5nIChvciBvbmx5IGBmaWx0ZXJgJ3MpLiBVc2VkIGJ5IHRoZVxuICogaW4tYXBwIGNhdGFsb2c7IHtAbGluayByZXNvbHZhYmxlTGlzdGluZ3N9IG5hcnJvd3MgaXQgdG8gd2hhdCByZXNvbHZlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9yZ0xpc3RpbmdTdGF0ZXMoXG4gIHNvdXJjZTogTGlzdGluZ0RhdGFTb3VyY2UsXG4gIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGUsXG4gIGZpbHRlcjogeyBpZHM/OiBzdHJpbmdbXTsgbmFtZXM/OiBzdHJpbmdbXSB9ID0ge30sXG4gIGN0eD86IE9yZ0luc3RhbGxDb250ZXh0LFxuKTogUHJvbWlzZTxPcmdMaXN0aW5nU3RhdGVbXT4ge1xuICBjb25zdCBjb250ZXh0ID0gY3R4ID8/IGF3YWl0IGxvYWRPcmdJbnN0YWxsQ29udGV4dChzb3VyY2UsIHNjb3BlKTtcbiAgY29uc3QgbGl2ZSA9IGF3YWl0IHNvdXJjZS5saXZlTGlzdGluZ3MoZmlsdGVyKTtcbiAgaWYgKGxpdmUubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGNvbnN0IGlkcyA9IGxpdmUubWFwKChsKSA9PiBsLmlkKTtcbiAgY29uc3QgW3B1YnMsIHZlcnNpb25zLCBhZHZpc29yaWVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzb3VyY2UucHVibGlzaGVyc0J5SWRzKFsuLi5uZXcgU2V0KGxpdmUubWFwKChsKSA9PiBsLnB1Ymxpc2hlcklkKSldKSxcbiAgICBzb3VyY2UudmVyc2lvbnNGb3JMaXN0aW5ncyhpZHMpLFxuICAgIHNvdXJjZS5hZHZpc29yaWVzRm9yTGlzdGluZ3MoaWRzKSxcbiAgXSk7XG4gIGNvbnN0IGJ5UHVibGlzaGVyID0gbmV3IE1hcChwdWJzLm1hcCgocCkgPT4gW3AuaWQsIHBdKSk7XG4gIGNvbnN0IG93biA9IHNjb3BlT3JnSWRzKHNjb3BlKVswXSE7XG4gIGNvbnN0IG91dDogT3JnTGlzdGluZ1N0YXRlW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaXN0aW5nIG9mIGxpdmUpIHtcbiAgICBjb25zdCBwdWJsaXNoZXIgPSBieVB1Ymxpc2hlci5nZXQobGlzdGluZy5wdWJsaXNoZXJJZCk7XG4gICAgaWYgKCFwdWJsaXNoZXIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHZzID0gdmVyc2lvbnMuZmlsdGVyKCh2KSA9PiB2Lmxpc3RpbmdJZCA9PT0gbGlzdGluZy5pZCk7XG4gICAgY29uc3QgYmxvY2sgPSBsaXN0aW5nQmxvY2soY29udGV4dC5wb2xpY3ksIHB1Ymxpc2hlciwgbGlzdGluZyk7XG4gICAgY29uc3QgbW9kZSA9IGluc3RhbGxNb2RlRm9yKHB1Ymxpc2hlciwgbGlzdGluZywgY29udGV4dC5pbnN0YWxscywgY29udGV4dC5wb2xpY3ksIHNjb3BlKTtcbiAgICBjb25zdCBsaXN0aW5nQWR2aXNvcmllcyA9IGFkdmlzb3JpZXMuZmlsdGVyKChhKSA9PiBhLmxpc3RpbmdJZCA9PT0gbGlzdGluZy5pZCk7XG4gICAgbGV0IHJlc29sdmVkOiBQbHVnaW5MaXN0aW5nVmVyc2lvbiB8IG51bGwgPSBudWxsO1xuICAgIGxldCByZWZ1c2FsOiBSZXNvbHV0aW9uUmVmdXNhbCB8IG51bGwgPSBudWxsO1xuICAgIGlmICghYmxvY2sgJiYgISgnY29kZScgaW4gbW9kZSkpIHtcbiAgICAgIGNvbnN0IGNob2ljZSA9IHNlbGVjdExpc3RpbmdWZXJzaW9uKHtcbiAgICAgICAgcmVmOiBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gLCB2ZXJzaW9uczogdnMsIG1vZGUsIGFkdmlzb3JpZXM6IGxpc3RpbmdBZHZpc29yaWVzLCBwb2xpY3k6IGNvbnRleHQucG9saWN5LFxuICAgICAgfSk7XG4gICAgICBpZiAoJ3ZlcnNpb24nIGluIGNob2ljZSkgcmVzb2x2ZWQgPSBjaG9pY2UudmVyc2lvbjtcbiAgICAgIGVsc2UgcmVmdXNhbCA9IGNob2ljZS5yZWZ1c2FsO1xuICAgIH1cbiAgICBjb25zdCBvd25JbnN0YWxsID0gY29udGV4dC5pbnN0YWxscy5maW5kKChpKSA9PiBpLmxpc3RpbmdJZCA9PT0gbGlzdGluZy5pZCAmJiBpLm9yZ0lkLnRvTG93ZXJDYXNlKCkgPT09IG93bikgPz8gbnVsbDtcbiAgICBvdXQucHVzaCh7IHB1Ymxpc2hlciwgbGlzdGluZywgdmVyc2lvbnM6IHZzLCBtb2RlLCBibG9jaywgcmVzb2x2ZWQsIHJlZnVzYWwsIGFkdmlzb3JpZXM6IGxpc3RpbmdBZHZpc29yaWVzLCBvd25JbnN0YWxsLCBwb2xpY3k6IGNvbnRleHQucG9saWN5IH0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUaGUgbGlzdGluZ3MgYW4gb3JnJ3MgcmVmZXJlbmNlcyByZXNvbHZlIHRvIG5vdyAoaW5zdGFsbGVkIG9yIGltcGxpY2l0LCBub3QgYmxvY2tlZCkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2YWJsZUxpc3RpbmdzKFxuICBzb3VyY2U6IExpc3RpbmdEYXRhU291cmNlLFxuICBzY29wZTogUmVzb2x1dGlvblNjb3BlLFxuICBmaWx0ZXI6IHsgbmFtZXM/OiBzdHJpbmdbXSB9ID0ge30sXG4pOiBQcm9taXNlPEFycmF5PE9yZ0xpc3RpbmdTdGF0ZSAmIHsgcmVzb2x2ZWQ6IFBsdWdpbkxpc3RpbmdWZXJzaW9uIH0+PiB7XG4gIHJldHVybiAoYXdhaXQgb3JnTGlzdGluZ1N0YXRlcyhzb3VyY2UsIHNjb3BlLCBmaWx0ZXIpKVxuICAgIC5maWx0ZXIoKHMpOiBzIGlzIE9yZ0xpc3RpbmdTdGF0ZSAmIHsgcmVzb2x2ZWQ6IFBsdWdpbkxpc3RpbmdWZXJzaW9uIH0gPT4gcy5yZXNvbHZlZCAhPT0gbnVsbCk7XG59XG4iXX0=
|