@pipeline-builder/pipeline-data 4.1.13 → 4.1.14
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/query-builders.js +8 -1
- package/lib/api/reporting/dora-scoring.d.ts +4 -2
- package/lib/api/reporting/dora-scoring.js +5 -3
- package/lib/api/reporting/dora.js +30 -6
- package/lib/api/reporting-service.js +19 -5
- package/lib/database/drizzle-schema.d.ts +39 -0
- package/lib/database/schema/plugin.d.ts +45 -0
- package/lib/database/schema/plugin.js +11 -1
- package/package.json +2 -2
|
@@ -43,9 +43,28 @@ export async function getDoraMetrics(orgId, from, to, orgIds, opts = {}) {
|
|
|
43
43
|
const { pipelineId, environment } = opts;
|
|
44
44
|
const pipelineClause = pipelineId ? sql `AND e.pipeline_id = ${pipelineId}` : sql ``;
|
|
45
45
|
const pipelineClauseR = pipelineId ? sql `AND r.pipeline_id = ${pipelineId}` : sql ``;
|
|
46
|
+
// Post-deploy outcomes carry no pipeline id, only the execution that
|
|
47
|
+
// produced them, so a per-pipeline view has to scope them THROUGH the
|
|
48
|
+
// execution. Without it the outcome and MTTR scans read every pipeline in the
|
|
49
|
+
// org: another pipeline's `failed` marker counted against this one's change
|
|
50
|
+
// failure rate (ten clean deploys could drop from elite to high) and its
|
|
51
|
+
// recoveries fed this one's MTTR.
|
|
52
|
+
const outcomePipelineClause = pipelineId
|
|
53
|
+
? sql `AND o.execution_id IN (SELECT pe.execution_id FROM ${schema.pipelineEvent} pe WHERE pe.pipeline_id = ${pipelineId})`
|
|
54
|
+
: sql ``;
|
|
55
|
+
// `envClause` is the STRICT filter (coverage, and the output). The deploy and
|
|
56
|
+
// incident SCANS use the widened `scanEnvClause`/`scanIncidentEnvClause`
|
|
57
|
+
// instead, which always admit production: MTTR is production-only and
|
|
58
|
+
// documented as independent of the environment filter, but incident-sourced
|
|
59
|
+
// MTTR correlates each production incident against production DEPLOY rows.
|
|
60
|
+
// Filtering both scans to `?environment=staging` removed every production
|
|
61
|
+
// incident and every production deploy, so incident recovery silently dropped
|
|
62
|
+
// out of MTTR the moment anyone looked at a non-production environment.
|
|
63
|
+
// `shapeDora` narrows the reported environments back to the requested one.
|
|
46
64
|
const envClause = environment ? sql `AND e.environment = ${environment}` : sql ``;
|
|
65
|
+
const scanEnvClause = environment ? sql `AND e.environment IN (${environment}, ${HEADLINE_ENV})` : sql ``;
|
|
47
66
|
const outcomeEnvClause = environment ? sql `AND o.environment = ${environment}` : sql ``;
|
|
48
|
-
const
|
|
67
|
+
const scanIncidentEnvClause = environment ? sql `AND i.environment IN (${environment}, ${HEADLINE_ENV})` : sql ``;
|
|
49
68
|
// Effective incident-correlation window (per-org override or the global
|
|
50
69
|
// default). Computed here (not just in shapeDora) because the deploy scan
|
|
51
70
|
// needs it for BOTH the correlation look-back lower bound AND the cache key.
|
|
@@ -80,7 +99,7 @@ export async function getDoraMetrics(orgId, from, to, orgIds, opts = {}) {
|
|
|
80
99
|
FROM ${schema.pipelineEvent} e
|
|
81
100
|
JOIN ${schema.pipeline} p ON p.id = e.pipeline_id
|
|
82
101
|
WHERE p.org_id ${pred} AND e.event_type = 'STAGE' AND e.environment IS NOT NULL
|
|
83
|
-
${pipelineClause} ${
|
|
102
|
+
${pipelineClause} ${scanEnvClause}
|
|
84
103
|
AND e.completed_at >= ${lookbackFrom}::timestamptz AND e.completed_at <= ${to}::timestamptz
|
|
85
104
|
GROUP BY e.environment, e.execution_id
|
|
86
105
|
),
|
|
@@ -108,7 +127,7 @@ export async function getDoraMetrics(orgId, from, to, orgIds, opts = {}) {
|
|
|
108
127
|
const outcomeSql = sql `
|
|
109
128
|
SELECT o.environment AS environment, o.outcome AS outcome, o.execution_id AS execution_id
|
|
110
129
|
FROM ${schema.deploymentOutcome} o
|
|
111
|
-
WHERE o.org_id ${pred} ${outcomeEnvClause}
|
|
130
|
+
WHERE o.org_id ${pred} ${outcomeEnvClause} ${outcomePipelineClause}
|
|
112
131
|
AND o.at >= ${from}::timestamptz AND o.at <= ${to}::timestamptz`;
|
|
113
132
|
// (3) MTTR — PRODUCTION-ONLY, independent of the env filter. Every production
|
|
114
133
|
// outcome in-window; for a 'restored' one, correlate to its deploy's
|
|
@@ -125,7 +144,7 @@ export async function getDoraMetrics(orgId, from, to, orgIds, opts = {}) {
|
|
|
125
144
|
WHERE p2.org_id ${pred} AND d.execution_id = o.execution_id
|
|
126
145
|
AND d.event_type = 'STAGE' AND d.environment = ${HEADLINE_ENV})::text AS deployed_at
|
|
127
146
|
FROM ${schema.deploymentOutcome} o
|
|
128
|
-
WHERE o.org_id ${pred} AND o.environment = ${HEADLINE_ENV}
|
|
147
|
+
WHERE o.org_id ${pred} AND o.environment = ${HEADLINE_ENV} ${outcomePipelineClause}
|
|
129
148
|
AND o.at >= ${from}::timestamptz AND o.at <= ${to}::timestamptz`;
|
|
130
149
|
// (5) Incidents opened in-window (per env). Correlated in JS to the most
|
|
131
150
|
// recent successful deploy → automated post-deploy failure (CFR) + real
|
|
@@ -133,7 +152,7 @@ export async function getDoraMetrics(orgId, from, to, orgIds, opts = {}) {
|
|
|
133
152
|
const incidentSql = sql `
|
|
134
153
|
SELECT i.environment AS environment, i.opened_at::text AS opened_at, i.resolved_at::text AS resolved_at
|
|
135
154
|
FROM ${schema.incident} i
|
|
136
|
-
WHERE i.org_id ${pred} ${
|
|
155
|
+
WHERE i.org_id ${pred} ${scanIncidentEnvClause}
|
|
137
156
|
AND i.opened_at >= ${from}::timestamptz AND i.opened_at <= ${to}::timestamptz`;
|
|
138
157
|
// (4) Coverage: registered pipelines vs those that actually deployed in-window.
|
|
139
158
|
const coverageSql = sql `
|
|
@@ -305,6 +324,11 @@ function shapeDora(deployRows, outcomeRows, mttrRows, coverageRow, incidentRows,
|
|
|
305
324
|
for (const [env, set] of postDeployExecsByEnv)
|
|
306
325
|
postDeployByEnv.set(env, set.size);
|
|
307
326
|
const environments = [...envs.entries()]
|
|
327
|
+
// The deploy and incident scans admit PRODUCTION alongside a requested
|
|
328
|
+
// environment so MTTR can correlate production incidents (see
|
|
329
|
+
// `scanEnvClause`). That production row is plumbing for MTTR, not something
|
|
330
|
+
// the caller asked to see — report only the environment that was requested.
|
|
331
|
+
.filter(([environment]) => !filters.environment || environment === filters.environment)
|
|
308
332
|
.map(([environment, a]) => {
|
|
309
333
|
const postDeployFailures = postDeployByEnv.get(environment) ?? 0;
|
|
310
334
|
const rawPerDay = a.deployments / days;
|
|
@@ -498,4 +522,4 @@ export async function getBuildHealth(orgId, pipelineId, from, to, orgIds) {
|
|
|
498
522
|
* INTENTIONALLY SINGLE-ORG (no rollup): plugin inventory is an org-owned
|
|
499
523
|
* asset count, not an execution/build activity report, so a parent's view is
|
|
500
524
|
* its own plugins — teams manage their own inventory. Single `= $org` scope. */
|
|
501
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9yYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL2RvcmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUNMLFlBQVksRUFBRSwwQkFBMEIsRUFBRSwwQkFBMEIsRUFDcEUscUJBQXFCLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQzNGLEtBQUssRUFBRSxNQUFNLEdBQ2QsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsS0FBYSxFQUNiLElBQVksRUFDWixFQUFVLEVBQ1YsTUFBaUIsRUFDakIsSUFBSSxHQUFnQixFQUFFO0lBRXRCLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRCxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQztJQUN6QyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSx1QkFBdUIsVUFBVSxFQUFFLENB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LE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOzs7O1lBSXhELG9CQUFvQjs7ZUFFakIsTUFBTSxDQUFDLGFBQWE7ZUFDcEIsTUFBTSxDQUFDLFFBQVE7eUJBQ0wsSUFBSSx3QkFBd0IsVUFBVTs7Z0NBRS9CLElBQUkscUNBQXFDLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBaUJ0RSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVWLDhFQUE4RTtRQUM5RSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUMzQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUFDLENBQUM7UUFDakUsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQztJQUNuRSxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sU0FBUyxDQUFDLEdBQUcsS0FBSyxpQkFBaUIsVUFBVSxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVELDhDQUE4QztBQUU5Qzs7O2lGQUdpRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIERPUkEgbWV0cmljczogdGhlIGZvdXIgaGVhZGxpbmUgbWVhc3VyZXMsIHRoZWlyIHBlci1lbnZpcm9ubWVudCBicmVha2Rvd24sXG4gKiB0aGUgdHJlbmQgc2VyaWVzLCBhbmQgcGVyLXBpcGVsaW5lIGJ1aWxkIGhlYWx0aC5cbiAqXG4gKiBCeSBmYXIgdGhlIGxhcmdlc3QgZG9tYWluIGluIHRoZSByZXBvcnRpbmcgc2VydmljZSAofjQ5MCBsaW5lcyBvZiBxdWVyeSArXG4gKiBzaGFwaW5nIGFnYWluc3Qgc2l4IHJvdyBzaGFwZXMpLCB3aGljaCBpcyB3aHkgaXQgbGl2ZXMgaW4gaXRzIG93biBtb2R1bGUuXG4gKiBSZXBvcnRpbmdTZXJ2aWNlIGRlbGVnYXRlcyB0byB0aGVzZTsgdGhlIGJhbmRpbmcgdGhyZXNob2xkcyB0aGV5IGFwcGx5IGFyZSBpblxuICogLi9kb3JhLXNjb3JpbmcudHMsIGRlbGliZXJhdGVseSBzZXBhcmF0ZSBzbyB0aGV5IGNhbiBiZSB0ZXN0ZWQgd2l0aG91dCBhIERCLlxuICovXG5cbmltcG9ydCB7IHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7XG4gIEhFQURMSU5FX0VOViwgRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlMsIHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzLFxuICBkb3JhTGV2ZWxGb3JGcmVxdWVuY3ksIGRvcmFMZXZlbEZvckNoYW5nZUZhaWx1cmUsIGRvcmFMZXZlbEZvclJlc3RvcmUsIGRvcmFMZXZlbEZvckxlYWRUaW1lLFxuICByb3VuZCwgbWVkaWFuLFxufSBmcm9tICcuL2RvcmEtc2NvcmluZy5qcyc7XG5pbXBvcnQgeyBvcmdTY29wZSwgcnVuUmVwb3J0IH0gZnJvbSAnLi9xdWVyeS1zY29wZS5qcyc7XG5pbXBvcnQgeyBhc3NlcnRSZXBvcnRJbnRlcnZhbCwgdGVybWluYWxTdGF0dXNSb2xsdXAgfSBmcm9tICcuL3NxbC1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRG9yYU9wdGlvbnMsIERvcmFNZXRyaWNzLCBEb3JhRW52TWV0cmljcywgRG9yYVRyZW5kUG9pbnQsIEJ1aWxkSGVhbHRoLCBCdWlsZEhlYWx0aFN0YWdlLFxuICBEZXBsb3lSb3csIE91dGNvbWVSb3csIE10dHJQYWlyUm93LCBJbmNpZGVudFJvdywgQ292ZXJhZ2VSb3csXG59IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4IH0gZnJvbSAnLi4vLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5pbXBvcnQgeyBkcml6emxlUm93cyB9IGZyb20gJy4uL2NydWQtc2VydmljZS5qcyc7XG5cbi8qKlxuICogMS45IERPUkEgbWV0cmljcyBvdmVyIGEgW2Zyb20sdG9dIGRlcGxveS1jb21wbGV0aW9uIHdpbmRvdywgb3JnLXNjb3BlZCArXG4gKiByb2xsdXAtYXdhcmUuIERFUExPWS1CQVNJUyBPTkxZIOKAlCBldmVyeSBtZXRyaWMgZGVyaXZlcyBmcm9tIHJlYWwgZGVwbG95LXN0YWdlXG4gKiBleGVjdXRpb25zIChgZXZlbnRfdHlwZT0nU1RBR0UnYCB3aXRoIGEgbm9uLW51bGwgYGVudmlyb25tZW50YCwgc2V0IGJ5IHRoZVxuICogZm9yd2FyZGVyIGZvciB0aGUgc3RhZ2VzIGEgdXNlciBkZWNsYXJlZCBpbiBgcGIuZGVwbG95c2ApLiBObyBydW4tYmFzZWRcbiAqIGZhbGxiYWNrOiBhIHBpcGVsaW5lIHdpdGggbm8gZGVwbG95IHN0YWdlIHByb2R1Y2VzIG5vIERPUkEgZGF0YS5cbiAqXG4gKiBGb3VyIHNjb3BlZCBTUUwgc2NhbnMgcnVuIGluc2lkZSBvbmUgdHggKGVhY2ggb3JnLWdhdGVkIGJ5IGBwLm9yZ19pZCAke3ByZWR9YFxuICogLyBgby5vcmdfaWQgJHtwcmVkfWAgc28gYSByb2xsdXAgcGFzc2VzIHRoZSBvcmfihpJ0ZWFtIHN1YnRyZWUgYW5kIGEgZm9yZWlnblxuICogb3JnJ3Mgcm93cyBuZXZlciBlbnRlcik6ICgxKSB0ZXJtaW5hbCBkZXBsb3kgcm93cyBQRVIgKGV4ZWN1dGlvbiwgZW52KSDigJQgb25lXG4gKiBcImRlcGxveW1lbnRcIiA9IG9uZSBleGVjdXRpb24gcmVhY2hpbmcgYW4gZW52IChEMSkg4oCUIOKGkiBERiAvIGRlcGxveS10aW1lIENGUiAvXG4gKiBtZWFzdXJlZCBsZWFkIHRpbWUgKGxlYWQgdGltZSBqb2lucyB0aGUgZXhlY3V0aW9uJ3MgZWFybGllc3QgY29tbWl0LCBEMik7XG4gKiB0aGUgc2NhbiBhbHNvIHJlYWNoZXMgYmFjayBgd2luZG93SG91cnNgIGJlZm9yZSBgZnJvbWAgc28gaW5jaWRlbnRzIG9wZW5lZFxuICogbmVhciB0aGUgd2luZG93IHN0YXJ0IGNhbiBjb3JyZWxhdGUgdG8gYSBqdXN0LXByaW9yIGRlcGxveTsgKDIpIGBkZXBsb3ltZW50X291dGNvbWVzYFxuICogaW4td2luZG93IOKGkiBwb3N0LWRlcGxveSBDRlIgY29tcG9uZW50OyAoMykgcHJvZHVjdGlvbiByZXN0b3JlZC9mYWlsZWRcbiAqIG91dGNvbWVzIGpvaW5lZCB0byB0aGVpciBkZXBsb3kg4oaSIE1UVFI7ICg0KSByZWdpc3RyeSB2cyBkZXBsb3lpbmcg4oaSIGNvdmVyYWdlLlxuICogVGhlIGNyb3NzLXNvdXJjZSBtZWRpYW5zIChsZWFkIHRpbWUsIE1UVFIpIGFyZSBjb21wdXRlZCBpbiBKUyBmcm9tIGNsYW1wZWRcbiAqICjiiaUwKSBkZWx0YXMuXG4gKlxuICogQHBhcmFtIG9wdHMucGlwZWxpbmVJZCAgICByZXN0cmljdCB0byBvbmUgcGlwZWxpbmUgKHBlci1waXBlbGluZSBET1JBKVxuICogQHBhcmFtIG9wdHMuZW52aXJvbm1lbnQgICByZXN0cmljdCB0byBvbmUgZGVwbG95IGVudmlyb25tZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREb3JhTWV0cmljcyhcbiAgb3JnSWQ6IHN0cmluZyxcbiAgZnJvbTogc3RyaW5nLFxuICB0bzogc3RyaW5nLFxuICBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgb3B0czogRG9yYU9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8RG9yYU1ldHJpY3M+IHtcbiAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gIGNvbnN0IHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQgfSA9IG9wdHM7XG4gIGNvbnN0IHBpcGVsaW5lQ2xhdXNlID0gcGlwZWxpbmVJZCA/IHNxbGBBTkQgZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH1gIDogc3FsYGA7XG4gIGNvbnN0IHBpcGVsaW5lQ2xhdXNlUiA9IHBpcGVsaW5lSWQgPyBzcWxgQU5EIHIucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9YCA6IHNxbGBgO1xuICBjb25zdCBlbnZDbGF1c2UgPSBlbnZpcm9ubWVudCA/IHNxbGBBTkQgZS5lbnZpcm9ubWVudCA9ICR7ZW52aXJvbm1lbnR9YCA6IHNxbGBgO1xuICBjb25zdCBvdXRjb21lRW52Q2xhdXNlID0gZW52aXJvbm1lbnQgPyBzcWxgQU5EIG8uZW52aXJvbm1lbnQgPSAke2Vudmlyb25tZW50fWAgOiBzcWxgYDtcbiAgY29uc3QgaW5jaWRlbnRFbnZDbGF1c2UgPSBlbnZpcm9ubWVudCA/IHNxbGBBTkQgaS5lbnZpcm9ubWVudCA9ICR7ZW52aXJvbm1lbnR9YCA6IHNxbGBgO1xuXG4gIC8vIEVmZmVjdGl2ZSBpbmNpZGVudC1jb3JyZWxhdGlvbiB3aW5kb3cgKHBlci1vcmcgb3ZlcnJpZGUgb3IgdGhlIGdsb2JhbFxuICAvLyBkZWZhdWx0KS4gQ29tcHV0ZWQgaGVyZSAobm90IGp1c3QgaW4gc2hhcGVEb3JhKSBiZWNhdXNlIHRoZSBkZXBsb3kgc2NhblxuICAvLyBuZWVkcyBpdCBmb3IgQk9USCB0aGUgY29ycmVsYXRpb24gbG9vay1iYWNrIGxvd2VyIGJvdW5kIEFORCB0aGUgY2FjaGUga2V5LlxuICBjb25zdCBlZmZlY3RpdmVXaW5kb3dIb3VycyA9IHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzKG9wdHMuaW5jaWRlbnRXaW5kb3dIb3Vycyk7XG4gIC8vIENvcnJlbGF0aW9uIGxvb2stYmFjazogaW5jaWRlbnRzIG9wZW5lZCBqdXN0IGluc2lkZSBgZnJvbWAgY2FuIGF0dHJpYnV0ZSB0b1xuICAvLyBhIGRlcGxveSB0aGF0IGNvbXBsZXRlZCB1cCB0byBgd2luZG93SG91cnNgIEJFRk9SRSBgZnJvbWAgKG1pcnJvcnMgdGhlXG4gIC8vIExBVEVSQUwgbG9vay1iYWNrIGluIGxpc3RJbmNpZGVudHMpLiBXaWRlbiB0aGUgZGVwbG95IHNjYW4ncyBsb3dlciBib3VuZCB0b1xuICAvLyBgZnJvbSDiiJIgd2luZG93SG91cnNgOyBERi9DRlIvbGVhZCBzdGlsbCBjb3VudCBvbmx5IHRoZSBpbi1gZnJvbWAuLmB0b2BcbiAgLy8gc3Vic2V0IChmbGFnZ2VkIGJ5IGBpbl93aW5kb3dgKSwgd2hpbGUgY29ycmVsYXRpb24gc2VlcyB0aGUgd2lkZXIgc2V0LlxuICBjb25zdCBmcm9tTXMgPSBEYXRlLnBhcnNlKGZyb20pO1xuICBjb25zdCBsb29rYmFja0Zyb20gPSBOdW1iZXIuaXNGaW5pdGUoZnJvbU1zKVxuICAgID8gbmV3IERhdGUoZnJvbU1zIC0gZWZmZWN0aXZlV2luZG93SG91cnMgKiAzNjAwICogMTAwMCkudG9JU09TdHJpbmcoKVxuICAgIDogZnJvbTtcblxuICAvLyAoMSkgVGVybWluYWwgZGVwbG95IHJvd3M6IFBFUi1FWEVDVVRJT04gKEQxKSwgb25lIHJvdyBwZXIgKGVudmlyb25tZW50LFxuICAvLyBleGVjdXRpb24pIOKAlCBldmVyeSBkZXBsb3kgU1RBR0UgdGFyZ2V0aW5nIHRoYXQgZW52IHdpdGhpbiB0aGUgZXhlY3V0aW9uIGlzXG4gIC8vIHJvbGxlZCB1cCB0byBhIHRlcm1pbmFsIHN0YXR1cyAoRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVEKS4gQSBzaW5nbGVcbiAgLy8gZXhlY3V0aW9uIHdpdGggdHdvIGRlcGxveSBzdGFnZXMgdG8gdGhlIHNhbWUgZW52IGlzIE9ORSBkZXBsb3ltZW50LCBub3QgdHdvLlxuICAvLyBjb21wbGV0ZWRfYXQgPSB0aGUgZGVwbG95J3MgY29tcGxldGlvbiAoTUFYIG92ZXIgaXRzIHN0YWdlcykuIGBjb21taXRfdHNgXG4gIC8vIChEMikgaXMgdGhlIGV4ZWN1dGlvbidzIEVBUkxJRVNUIGNvbW1pdCB0aW1lIGFjcm9zcyBBTEwgaXRzIGV2ZW50cyAoY29tbWl0XG4gIC8vIGVucmljaG1lbnQgcmlkZXMgdGhlIFBJUEVMSU5FL3NvdXJjZSBldmVudCB3aGVyZSBlbnZpcm9ubWVudCBJUyBOVUxMLCBuZXZlclxuICAvLyB0aGUgZGVwbG95IFNUQUdFIHJvdyksIGpvaW5lZCBieSBleGVjdXRpb25faWQuIGBpbl93aW5kb3dgIG1hcmtzIHdoZXRoZXIgdGhlXG4gIC8vIGRlcGxveSBjb21wbGV0ZWQgaW5zaWRlIFtmcm9tLHRvXSAodnMuIGEgbG9vay1iYWNrLW9ubHkgcm93IGtlcHQgc29sZWx5IGZvclxuICAvLyBpbmNpZGVudCBjb3JyZWxhdGlvbikuIGV4ZWN1dGlvbl9pZCBpcyBwcm9qZWN0ZWQgc28gcG9zdC1kZXBsb3kgZmFpbHVyZXNcbiAgLy8gKG1hbnVhbCBvdXRjb21lcyArIGNvcnJlbGF0ZWQgaW5jaWRlbnRzKSBjYW4gZGVkdXAgYWdhaW5zdCB0aGVpciBkZXBsb3kuXG4gIGNvbnN0IGRlcGxveVNxbCA9IHNxbGBcbiAgICAgIFdJVEggZGVwbG95X3N0YWdlcyBBUyAoXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsXG4gICAgICAgICAgZS5leGVjdXRpb25faWQgQVMgZXhlY3V0aW9uX2lkLFxuICAgICAgICAgICR7dGVybWluYWxTdGF0dXNSb2xsdXB9IEFTIHN0YXR1cyxcbiAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEFTIGNvbXBsZXRlZF9hdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmVudmlyb25tZW50IElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtwaXBlbGluZUNsYXVzZX0gJHtlbnZDbGF1c2V9XG4gICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49ICR7bG9va2JhY2tGcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuY29tcGxldGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLmVudmlyb25tZW50LCBlLmV4ZWN1dGlvbl9pZFxuICAgICAgKSxcbiAgICAgIGV4ZWNfY29tbWl0cyBBUyAoXG4gICAgICAgIFNFTEVDVCBjLmV4ZWN1dGlvbl9pZCBBUyBleGVjdXRpb25faWQsIE1JTihjLmNvbW1pdF90aW1lc3RhbXApIEFTIGNvbW1pdF90c1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGNcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gYy5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBjLmNvbW1pdF90aW1lc3RhbXAgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgYy5leGVjdXRpb25faWQgSU4gKFNFTEVDVCBleGVjdXRpb25faWQgRlJPTSBkZXBsb3lfc3RhZ2VzKVxuICAgICAgICBHUk9VUCBCWSBjLmV4ZWN1dGlvbl9pZFxuICAgICAgKVxuICAgICAgU0VMRUNUXG4gICAgICAgIGRzLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50LFxuICAgICAgICBkcy5leGVjdXRpb25faWQgQVMgZXhlY3V0aW9uX2lkLFxuICAgICAgICBkcy5zdGF0dXMgQVMgc3RhdHVzLFxuICAgICAgICBkcy5jb21wbGV0ZWRfYXQ6OnRleHQgQVMgY29tcGxldGVkX2F0LFxuICAgICAgICAoZHMuY29tcGxldGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6KSBBUyBpbl93aW5kb3csXG4gICAgICAgIGVjLmNvbW1pdF90czo6dGV4dCBBUyBjb21taXRfdHNcbiAgICAgIEZST00gZGVwbG95X3N0YWdlcyBkc1xuICAgICAgTEVGVCBKT0lOIGV4ZWNfY29tbWl0cyBlYyBPTiBlYy5leGVjdXRpb25faWQgPSBkcy5leGVjdXRpb25faWRgO1xuXG4gIC8vICgyKSBQb3N0LWRlcGxveSBvdXRjb21lIG1hcmtlcnMgaW4td2luZG93IChwZXIgZW52KS4gUG9zdC1kZXBsb3kgZmFpbHVyZXNcbiAgLy8gKG91dGNvbWU9J2ZhaWxlZCcpIGFkZCB0byB0aGUgQ0ZSIG51bWVyYXRvciB3aXRob3V0IGNoYW5naW5nIGF0dGVtcHRzLlxuICAvLyBleGVjdXRpb25faWQgbGV0cyB0aGUgQ0ZSIGRlZHVwIGEgbWFudWFsIGZhaWx1cmUgYWdhaW5zdCBhbiBpbmNpZGVudCB0aGF0XG4gIC8vIGNvcnJlbGF0ZXMgdG8gdGhlIHNhbWUgZGVwbG95IChubyBkb3VibGUtY291bnQpLlxuICBjb25zdCBvdXRjb21lU3FsID0gc3FsYFxuICAgICAgU0VMRUNUIG8uZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsIG8ub3V0Y29tZSBBUyBvdXRjb21lLCBvLmV4ZWN1dGlvbl9pZCBBUyBleGVjdXRpb25faWRcbiAgICAgIEZST00gJHtzY2hlbWEuZGVwbG95bWVudE91dGNvbWV9IG9cbiAgICAgIFdIRVJFIG8ub3JnX2lkICR7cHJlZH0gJHtvdXRjb21lRW52Q2xhdXNlfVxuICAgICAgICBBTkQgby5hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgby5hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpgO1xuXG4gIC8vICgzKSBNVFRSIOKAlCBQUk9EVUNUSU9OLU9OTFksIGluZGVwZW5kZW50IG9mIHRoZSBlbnYgZmlsdGVyLiBFdmVyeSBwcm9kdWN0aW9uXG4gIC8vIG91dGNvbWUgaW4td2luZG93OyBmb3IgYSAncmVzdG9yZWQnIG9uZSwgY29ycmVsYXRlIHRvIGl0cyBkZXBsb3knc1xuICAvLyBjb21wbGV0aW9uIHZpYSBleGVjdXRpb25faWQgdG8gbWVhc3VyZSByZXN0b3JlZC5hdCDiiJIgZGVwbG95ZWQuY29tcGxldGVkX2F0LlxuICAvLyBleGVjdXRpb25faWQgaXMgcHJvamVjdGVkIHNvIGFuIGluY2lkZW50LXNvdXJjZWQgcmVjb3ZlcnkgZm9yIHRoZSBzYW1lXG4gIC8vIGRlcGxveSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG1hbnVhbCByZXN0b3JlZCBnYXAuXG4gIGNvbnN0IG10dHJTcWwgPSBzcWxgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgby5vdXRjb21lIEFTIG91dGNvbWUsXG4gICAgICAgIG8uZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCxcbiAgICAgICAgby5hdDo6dGV4dCBBUyByZXN0b3JlZF9hdCxcbiAgICAgICAgKFNFTEVDVCBNQVgoZC5jb21wbGV0ZWRfYXQpIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZFxuICAgICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwMiBPTiBwMi5pZCA9IGQucGlwZWxpbmVfaWRcbiAgICAgICAgICAgV0hFUkUgcDIub3JnX2lkICR7cHJlZH0gQU5EIGQuZXhlY3V0aW9uX2lkID0gby5leGVjdXRpb25faWRcbiAgICAgICAgICAgICBBTkQgZC5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZC5lbnZpcm9ubWVudCA9ICR7SEVBRExJTkVfRU5WfSk6OnRleHQgQVMgZGVwbG95ZWRfYXRcbiAgICAgIEZST00gJHtzY2hlbWEuZGVwbG95bWVudE91dGNvbWV9IG9cbiAgICAgIFdIRVJFIG8ub3JnX2lkICR7cHJlZH0gQU5EIG8uZW52aXJvbm1lbnQgPSAke0hFQURMSU5FX0VOVn1cbiAgICAgICAgQU5EIG8uYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIG8uYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6YDtcblxuICAvLyAoNSkgSW5jaWRlbnRzIG9wZW5lZCBpbi13aW5kb3cgKHBlciBlbnYpLiBDb3JyZWxhdGVkIGluIEpTIHRvIHRoZSBtb3N0XG4gIC8vIHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSDihpIgYXV0b21hdGVkIHBvc3QtZGVwbG95IGZhaWx1cmUgKENGUikgKyByZWFsXG4gIC8vIHJlY292ZXJ5IHRpbWUgKHJlc29sdmVkX2F0IOKIkiBvcGVuZWRfYXQpIGZvciBNVFRSIChwcm9kdWN0aW9uKS5cbiAgY29uc3QgaW5jaWRlbnRTcWwgPSBzcWxgXG4gICAgICBTRUxFQ1QgaS5lbnZpcm9ubWVudCBBUyBlbnZpcm9ubWVudCwgaS5vcGVuZWRfYXQ6OnRleHQgQVMgb3BlbmVkX2F0LCBpLnJlc29sdmVkX2F0Ojp0ZXh0IEFTIHJlc29sdmVkX2F0XG4gICAgICBGUk9NICR7c2NoZW1hLmluY2lkZW50fSBpXG4gICAgICBXSEVSRSBpLm9yZ19pZCAke3ByZWR9ICR7aW5jaWRlbnRFbnZDbGF1c2V9XG4gICAgICAgIEFORCBpLm9wZW5lZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgaS5vcGVuZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6YDtcblxuICAvLyAoNCkgQ292ZXJhZ2U6IHJlZ2lzdGVyZWQgcGlwZWxpbmVzIHZzIHRob3NlIHRoYXQgYWN0dWFsbHkgZGVwbG95ZWQgaW4td2luZG93LlxuICBjb25zdCBjb3ZlcmFnZVNxbCA9IHNxbGBcbiAgICAgIFNFTEVDVFxuICAgICAgICAoU0VMRUNUIENPVU5UKCopOjppbnQgRlJPTSAke3NjaGVtYS5waXBlbGluZVJlZ2lzdHJ5fSByXG4gICAgICAgICAgIFdIRVJFIHIub3JnX2lkICR7cHJlZH0gJHtwaXBlbGluZUNsYXVzZVJ9KSBBUyByZWdpc3RlcmVkLFxuICAgICAgICAoU0VMRUNUIENPVU5UKERJU1RJTkNUIGUucGlwZWxpbmVfaWQpOjppbnQgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5lbnZpcm9ubWVudCBJUyBOT1QgTlVMTFxuICAgICAgICAgICAgICR7cGlwZWxpbmVDbGF1c2V9ICR7ZW52Q2xhdXNlfVxuICAgICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5jb21wbGV0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6KSBBUyBkZXBsb3lpbmdgO1xuXG4gIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgLy8gU2NhbiBvcmRlciBpcyBsb2FkLWJlYXJpbmcgZm9yIHRoZSBnZW5lcmF0ZWQtU1FMIHRlc3RzOiAwPWRlcGxveSxcbiAgICAvLyAxPW91dGNvbWVzLCAyPW10dHIsIDM9Y292ZXJhZ2UsIDQ9aW5jaWRlbnRzIChhcHBlbmRlZCBsYXN0IHNvIHRoZVxuICAgIC8vIGVhcmxpZXIgaW5kaWNlcyBzdGF5IHN0YWJsZSkuXG4gICAgY29uc3QgZGVwbG95Um93cyA9IGRyaXp6bGVSb3dzPERlcGxveVJvdz4oKGF3YWl0IHR4LmV4ZWN1dGUoZGVwbG95U3FsKSkucm93cyk7XG4gICAgY29uc3Qgb3V0Y29tZVJvd3MgPSBkcml6emxlUm93czxPdXRjb21lUm93PigoYXdhaXQgdHguZXhlY3V0ZShvdXRjb21lU3FsKSkucm93cyk7XG4gICAgY29uc3QgbXR0clJvd3MgPSBkcml6emxlUm93czxNdHRyUGFpclJvdyAmIHsgb3V0Y29tZTogc3RyaW5nIH0+KChhd2FpdCB0eC5leGVjdXRlKG10dHJTcWwpKS5yb3dzKTtcbiAgICBjb25zdCBjb3ZlcmFnZVJvdyA9IGRyaXp6bGVSb3dzPENvdmVyYWdlUm93PigoYXdhaXQgdHguZXhlY3V0ZShjb3ZlcmFnZVNxbCkpLnJvd3MpWzBdO1xuICAgIGNvbnN0IGluY2lkZW50Um93cyA9IGRyaXp6bGVSb3dzPEluY2lkZW50Um93PigoYXdhaXQgdHguZXhlY3V0ZShpbmNpZGVudFNxbCkpLnJvd3MpO1xuICAgIHJldHVybiBzaGFwZURvcmEoZGVwbG95Um93cywgb3V0Y29tZVJvd3MsIG10dHJSb3dzLCBjb3ZlcmFnZVJvdywgaW5jaWRlbnRSb3dzLCBmcm9tLCB0bywge1xuICAgICAgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQsXG4gICAgfSwgZWZmZWN0aXZlV2luZG93SG91cnMpO1xuICB9KTtcbiAgLy8gQ2FjaGUga2V5IE1VU1QgaW5jbHVkZSB0aGUgZWZmZWN0aXZlIGluY2lkZW50IHdpbmRvdzogdGhlIHNjb3JlY2FyZCByZWFkc1xuICAvLyAvZG9yYSB3aXRoIHRoZSBvcmcncyBkZWZhdWx0IHdpbmRvdyB3aGlsZSBhbiBleHBsaWNpdCAvZG9yYSBjYWxsIG1heSBwYXNzIGFuXG4gIC8vIG92ZXJyaWRlIOKAlCBkaWZmZXJlbnQgd2luZG93cyB5aWVsZCBkaWZmZXJlbnQgQ0ZSL01UVFIsIHNvIHRoZXkgbXVzdCBub3RcbiAgLy8gY29sbGlkZSBvbiB0aGUgc2FtZSBrZXkuXG4gIGNvbnN0IGtleSA9IGAke29yZ0lkfTpkb3JhOiR7ZnJvbX06JHt0b306JHtwaXBlbGluZUlkID8/ICcnfToke2Vudmlyb25tZW50ID8/ICcnfToke2VmZmVjdGl2ZVdpbmRvd0hvdXJzfWA7XG4gIHJldHVybiBydW5SZXBvcnQoa2V5LCBtdWx0aSwgZXhlYyk7XG59XG5cbi8qKlxuICogU2hhcGUgdGhlIHJhdyBET1JBIHNjYW4gcm93cyBpbnRvIHRoZSBwdWJsaWMge0BsaW5rIERvcmFNZXRyaWNzfS4gQnVja2V0cyB0aGVcbiAqIHRlcm1pbmFsIGRlcGxveSByb3dzIGJ5IGVudmlyb25tZW50IChERiAvIGRlcGxveS10aW1lIENGUiAvIG1lYXN1cmVkIGxlYWQpLFxuICogZm9sZHMgaW4gdGhlIHBvc3QtZGVwbG95IGZhaWx1cmUgY291bnRzIChtYW51YWwgb3V0Y29tZXMgKyB3ZWJob29rLWluZ2VzdGVkXG4gKiBpbmNpZGVudHMsIGRlZHVwZWQgYnkgZGVwbG95IGV4ZWN1dGlvbiksIGNvbXB1dGVzIHByb2R1Y3Rpb24gTVRUUiBmcm9tIGJvdGhcbiAqIHNvdXJjZXMgKGluY2lkZW50IGByZXNvbHZlZF9hdCDiiJIgb3BlbmVkX2F0YCB0YWtpbmcgcHJlY2VkZW5jZSBvdmVyIHRoZSBtYW51YWxcbiAqIGByZXN0b3JlZCDiiJIgZGVwbG95ZWRgKSwgYW5kIHJlY29uY2lsZXMgY292ZXJhZ2Ug4oCUIGFsbCBjcm9zcy1zb3VyY2UgbWVkaWFuc1xuICogb3ZlciBkZWx0YXMgY2xhbXBlZCDiiaUwLlxuICpcbiAqIFBoYXNlIDUgaW5jaWRlbnQgY29ycmVsYXRpb246IGVhY2ggaW5jaWRlbnQgaXMgYXR0cmlidXRlZCB0byB0aGUgbW9zdCByZWNlbnRcbiAqIFNVQ0NFU1NGVUwgZGVwbG95IHRvIGl0cyBlbnZpcm9ubWVudCB3aXRoIGBjb21wbGV0ZWRfYXQg4omkIG9wZW5lZF9hdGAgd2l0aGluXG4gKiB7QGxpbmsgRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlN9LiBUaGF0IGRlcGxveSBpcyBhIHBvc3QtZGVwbG95IGZhaWx1cmU7IGFuXG4gKiB1bmNvcnJlbGF0ZWQgaW5jaWRlbnQgKG5vIGVsaWdpYmxlIGRlcGxveSkgY29udHJpYnV0ZXMgbm90aGluZy5cbiAqL1xuZnVuY3Rpb24gc2hhcGVEb3JhKFxuICBkZXBsb3lSb3dzOiBEZXBsb3lSb3dbXSxcbiAgb3V0Y29tZVJvd3M6IE91dGNvbWVSb3dbXSxcbiAgbXR0clJvd3M6IEFycmF5PE10dHJQYWlyUm93ICYgeyBvdXRjb21lOiBzdHJpbmcgfT4sXG4gIGNvdmVyYWdlUm93OiBDb3ZlcmFnZVJvdyB8IHVuZGVmaW5lZCxcbiAgaW5jaWRlbnRSb3dzOiBJbmNpZGVudFJvd1tdLFxuICBmcm9tOiBzdHJpbmcsXG4gIHRvOiBzdHJpbmcsXG4gIGZpbHRlcnM6IHsgcGlwZWxpbmVJZD86IHN0cmluZzsgZW52aXJvbm1lbnQ/OiBzdHJpbmcgfSxcbiAgd2luZG93SG91cnM6IG51bWJlciA9IERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTLFxuKTogRG9yYU1ldHJpY3Mge1xuICAvLyBXaW5kb3cgbGVuZ3RoIGluIGRheXMgKGZsb29yZWQgYXQgMSBzbyBhIHN1Yi1kYXkgd2luZG93IHlpZWxkcyB0aGUgY291bnQgYXNcbiAgLy8gdGhlIHJhdGUsIG5ldmVyIC8wIG9yIGFuIGV4dHJhcG9sYXRpb24pLiBHdWFyZCB1bnBhcnNlYWJsZSBkYXRlcyDihpIgMSBkYXkuXG4gIGNvbnN0IHNwYW5EYXlzID0gKERhdGUucGFyc2UodG8pIC0gRGF0ZS5wYXJzZShmcm9tKSkgLyA4NjQwMDAwMDtcbiAgY29uc3QgZGF5cyA9IE51bWJlci5pc0Zpbml0ZShzcGFuRGF5cykgPyBNYXRoLm1heChzcGFuRGF5cywgMSkgOiAxO1xuICAvLyBXaW5kb3cgZW5kIGluc3RhbnQgZm9yIE1UVFIgcmlnaHQtY2Vuc29yaW5nIChhIHJlc29sdXRpb24gYWZ0ZXIgYHRvYCBpc1xuICAvLyB1bm9ic2VydmVkKS4gK0luZmluaXR5IHdoZW4gYHRvYCBpcyB1bnBhcnNlYWJsZSDih5Igbm8gY2Vuc29yaW5nIChmYWlsLW9wZW4pLlxuICBjb25zdCB0b1BhcnNlZCA9IERhdGUucGFyc2UodG8pO1xuICBjb25zdCB0b01zID0gTnVtYmVyLmlzRmluaXRlKHRvUGFyc2VkKSA/IHRvUGFyc2VkIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXG4gIC8vIFBlci1lbnYgYWNjdW11bGF0b3IuXG4gIGludGVyZmFjZSBBY2Mge1xuICAgIGRlcGxveW1lbnRzOiBudW1iZXI7XG4gICAgZGVwbG95VGltZUZhaWx1cmVzOiBudW1iZXI7XG4gICAgYXR0ZW1wdHM6IG51bWJlcjtcbiAgICBsZWFkR2FwczogbnVtYmVyW107XG4gIH1cbiAgY29uc3QgZW52cyA9IG5ldyBNYXA8c3RyaW5nLCBBY2M+KCk7XG4gIGNvbnN0IGFjY0ZvciA9IChlbnY6IHN0cmluZyk6IEFjYyA9PiB7XG4gICAgbGV0IGEgPSBlbnZzLmdldChlbnYpO1xuICAgIGlmICghYSkgeyBhID0geyBkZXBsb3ltZW50czogMCwgZGVwbG95VGltZUZhaWx1cmVzOiAwLCBhdHRlbXB0czogMCwgbGVhZEdhcHM6IFtdIH07IGVudnMuc2V0KGVudiwgYSk7IH1cbiAgICByZXR1cm4gYTtcbiAgfTtcblxuICAvLyBBIGRlcGxveSByb3cgY291bnRzIHRvd2FyZCBERi9DRlIvbGVhZCBvbmx5IGlmIGl0IGNvbXBsZXRlZCBpbnNpZGUgW2Zyb20sdG9dLlxuICAvLyBMb29rLWJhY2stb25seSByb3dzIChpbl93aW5kb3c9ZmFsc2UsIGtlcHQgZm9yIGluY2lkZW50IGNvcnJlbGF0aW9uKSBhcmVcbiAgLy8gc2tpcHBlZCBoZXJlLiBBYnNlbnQgaW4gYSBmaXh0dXJlIOKHkiBpbi13aW5kb3cgKHVuaXQgdGVzdHMgb21pdCB0aGUgZmxhZykuXG4gIGNvbnN0IGlzSW5XaW5kb3cgPSAocm93OiBEZXBsb3lSb3cpOiBib29sZWFuID0+XG4gICAgcm93LmluX3dpbmRvdyA9PSBudWxsID8gdHJ1ZSA6IChyb3cuaW5fd2luZG93ID09PSB0cnVlIHx8IHJvdy5pbl93aW5kb3cgPT09ICd0Jyk7XG5cbiAgZm9yIChjb25zdCByb3cgb2YgZGVwbG95Um93cykge1xuICAgIGNvbnN0IGVudiA9IHJvdy5lbnZpcm9ubWVudDtcbiAgICBpZiAoIWVudikgY29udGludWU7XG4gICAgaWYgKCFpc0luV2luZG93KHJvdykpIGNvbnRpbnVlOyAvLyBsb29rLWJhY2stb25seSByb3cg4oaSIGNvcnJlbGF0aW9uLCBub3QgREYvQ0ZSXG4gICAgY29uc3QgYSA9IGFjY0ZvcihlbnYpO1xuICAgIGlmIChyb3cuc3RhdHVzID09PSAnU1VDQ0VFREVEJykge1xuICAgICAgYS5kZXBsb3ltZW50cysrO1xuICAgICAgYS5hdHRlbXB0cysrO1xuICAgICAgLy8gTWVhc3VyZWQgbGVhZCB0aW1lOiBkZXBsb3kgY29tcGxldGlvbiDiiJIgZXhlY3V0aW9uJ3MgZWFybGllc3QgY29tbWl0IHRpbWUuXG4gICAgICBpZiAocm93LmNvbW1pdF90cyAhPSBudWxsICYmIHJvdy5jb21wbGV0ZWRfYXQgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBnYXAgPSAoRGF0ZS5wYXJzZShyb3cuY29tcGxldGVkX2F0KSAtIERhdGUucGFyc2Uocm93LmNvbW1pdF90cykpIC8gMTAwMDtcbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShnYXApKSBhLmxlYWRHYXBzLnB1c2goTWF0aC5tYXgoZ2FwLCAwKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyb3cuc3RhdHVzID09PSAnRkFJTEVEJykge1xuICAgICAgYS5kZXBsb3lUaW1lRmFpbHVyZXMrKztcbiAgICAgIGEuYXR0ZW1wdHMrKztcbiAgICB9XG4gIH1cblxuICAvLyBJbmNpZGVudOKGkmRlcGxveSBjb3JyZWxhdGlvbiAoUGhhc2UgNSkuIEluZGV4IHRoZSBTVUNDRVNTRlVMIGRlcGxveXMgcGVyIGVudlxuICAvLyAoZXhlY3V0aW9uIGlkICsgY29tcGxldGlvbiBpbnN0YW50KSwgbmV3ZXN0IGZpcnN0LCBzbyBlYWNoIGluY2lkZW50IGNhbiBiZVxuICAvLyBhdHRyaWJ1dGVkIHRvIHRoZSBtb3N0IHJlY2VudCBkZXBsb3kgdGhhdCBjb21wbGV0ZWQgd2l0aGluIHRoZSB3aW5kb3dcbiAgLy8gYmVmb3JlIGl0IG9wZW5lZC4gVGhhdCBleGVjdXRpb24gaXMgYSBwb3N0LWRlcGxveSBmYWlsdXJlLlxuICBjb25zdCB3aW5kb3dNcyA9IHdpbmRvd0hvdXJzICogMzYwMCAqIDEwMDA7XG4gIGNvbnN0IHN1Y2Nlc3NmdWxCeUVudiA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTx7IGV4ZWM6IHN0cmluZzsgY29tcGxldGVkTXM6IG51bWJlciB9Pj4oKTtcbiAgZm9yIChjb25zdCByb3cgb2YgZGVwbG95Um93cykge1xuICAgIGlmIChyb3cuc3RhdHVzICE9PSAnU1VDQ0VFREVEJyB8fCAhcm93LmVudmlyb25tZW50IHx8IHJvdy5leGVjdXRpb25faWQgPT0gbnVsbCB8fCByb3cuY29tcGxldGVkX2F0ID09IG51bGwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1zID0gRGF0ZS5wYXJzZShyb3cuY29tcGxldGVkX2F0KTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShtcykpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxpc3QgPSBzdWNjZXNzZnVsQnlFbnYuZ2V0KHJvdy5lbnZpcm9ubWVudCkgPz8gW107XG4gICAgbGlzdC5wdXNoKHsgZXhlYzogcm93LmV4ZWN1dGlvbl9pZCwgY29tcGxldGVkTXM6IG1zIH0pO1xuICAgIHN1Y2Nlc3NmdWxCeUVudi5zZXQocm93LmVudmlyb25tZW50LCBsaXN0KTtcbiAgfVxuICBmb3IgKGNvbnN0IGxpc3Qgb2Ygc3VjY2Vzc2Z1bEJ5RW52LnZhbHVlcygpKSBsaXN0LnNvcnQoKGEsIGIpID0+IGIuY29tcGxldGVkTXMgLSBhLmNvbXBsZXRlZE1zKTtcblxuICAvKiogQ29ycmVsYXRlIGFuIGluY2lkZW50IHRvIHRoZSBtb3N0IHJlY2VudCBpbi13aW5kb3cgc3VjY2Vzc2Z1bCBkZXBsb3kgZXhlY3V0aW9uLiAqL1xuICBjb25zdCBjb3JyZWxhdGUgPSAoZW52OiBzdHJpbmcsIG9wZW5lZE1zOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICBjb25zdCBsaXN0ID0gc3VjY2Vzc2Z1bEJ5RW52LmdldChlbnYpO1xuICAgIGlmICghbGlzdCkgcmV0dXJuIG51bGw7XG4gICAgZm9yIChjb25zdCBkIG9mIGxpc3QpIHtcbiAgICAgIGlmIChkLmNvbXBsZXRlZE1zIDw9IG9wZW5lZE1zICYmIG9wZW5lZE1zIC0gZC5jb21wbGV0ZWRNcyA8PSB3aW5kb3dNcykgcmV0dXJuIGQuZXhlYztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgLy8gQ29ycmVsYXRlZCBpbmNpZGVudHMgKGFsbCBlbnZzIOKGkiBDRlI7IHByb2R1Y3Rpb24gc3Vic2V0IOKGkiBNVFRSKS4gRWFjaCBjYXJyaWVzXG4gIC8vIHRoZSBkZXBsb3kgZXhlY3V0aW9uIGl0IGF0dHJpYnV0ZXMgdG8gKyBpdHMgcmVhbCByZWNvdmVyeSBnYXAgKHdoZW4gcmVzb2x2ZWQpLlxuICBpbnRlcmZhY2UgQ29ycmVsYXRlZEluY2lkZW50IHsgZW52aXJvbm1lbnQ6IHN0cmluZzsgZXhlYzogc3RyaW5nOyByZXNvbHZlZEdhcDogbnVtYmVyIHwgbnVsbCB9XG4gIGNvbnN0IGNvcnJlbGF0ZWRJbmNpZGVudHM6IENvcnJlbGF0ZWRJbmNpZGVudFtdID0gW107XG4gIGZvciAoY29uc3QgaW5jIG9mIGluY2lkZW50Um93cykge1xuICAgIGlmICghaW5jLmVudmlyb25tZW50IHx8IGluYy5vcGVuZWRfYXQgPT0gbnVsbCkgY29udGludWU7XG4gICAgY29uc3Qgb3BlbmVkTXMgPSBEYXRlLnBhcnNlKGluYy5vcGVuZWRfYXQpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG9wZW5lZE1zKSkgY29udGludWU7XG4gICAgY29uc3QgZXhlYyA9IGNvcnJlbGF0ZShpbmMuZW52aXJvbm1lbnQsIG9wZW5lZE1zKTtcbiAgICBpZiAoZXhlYyA9PSBudWxsKSBjb250aW51ZTsgLy8gdW5jb3JyZWxhdGVkIOKGkiBub3QgYXR0cmlidXRhYmxlIHRvIGEgZGVwbG95XG4gICAgbGV0IHJlc29sdmVkR2FwOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoaW5jLnJlc29sdmVkX2F0ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkTXMgPSBEYXRlLnBhcnNlKGluYy5yZXNvbHZlZF9hdCk7XG4gICAgICAvLyBSaWdodC1jZW5zb3Jpbmc6IGEgcmVzb2x1dGlvbiBBRlRFUiB0aGUgd2luZG93IGVuZCAoYHRvYCkgaXMgbm90IG9ic2VydmVkXG4gICAgICAvLyB3aXRoaW4gdGhlIHdpbmRvdyDigJQgdHJlYXQgdGhlIGluY2lkZW50IGFzIHN0aWxsIG9wZW4gKGdhcCBzdGF5cyBudWxsKSBzb1xuICAgICAgLy8gTVRUUiBuZXZlciByZWFkcyB1bmJvdW5kZWQgcGFzdCBgdG9gLiBUaGUgaW5jaWRlbnQgc3RpbGwgY291bnRzIHRvd2FyZCB0aGVcbiAgICAgIC8vIGluY2lkZW50IHRvdGFsICh1bnJlc29sdmVkKSwgaXQganVzdCBjb250cmlidXRlcyBubyByZWNvdmVyeSB0aW1lLlxuICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShyZXNvbHZlZE1zKSAmJiByZXNvbHZlZE1zIDw9IHRvTXMpIHtcbiAgICAgICAgY29uc3QgZyA9IChyZXNvbHZlZE1zIC0gb3BlbmVkTXMpIC8gMTAwMDtcbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShnKSkgcmVzb2x2ZWRHYXAgPSBNYXRoLm1heChnLCAwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29ycmVsYXRlZEluY2lkZW50cy5wdXNoKHsgZW52aXJvbm1lbnQ6IGluYy5lbnZpcm9ubWVudCwgZXhlYywgcmVzb2x2ZWRHYXAgfSk7XG4gIH1cblxuICAvLyBQb3N0LWRlcGxveSBmYWlsdXJlcyBwZXIgZW52IOKAlCB0aGUgRElTVElOQ1Qgc2V0IG9mIGRlcGxveSBleGVjdXRpb25zIGZsYWdnZWRcbiAgLy8gYnkgYSBtYW51YWwgYGZhaWxlZGAgb3V0Y29tZSBPUiBhIGNvcnJlbGF0ZWQgaW5jaWRlbnQgKGRlZHVwZWQgYnkgZXhlY3V0aW9uLFxuICAvLyBzbyBhIGRlcGxveSBmbGFnZ2VkIGJ5IGJvdGggY291bnRzIG9uY2UpLiBBIG1hbnVhbCBvdXRjb21lIHdpdGhvdXQgYW5cbiAgLy8gZXhlY3V0aW9uIGlkIChsZWdhY3kvdW5yZXNvbHZhYmxlKSBzdGlsbCBjb3VudHMgdmlhIGEgcGVyLXJvdyBzZW50aW5lbC5cbiAgY29uc3QgcG9zdERlcGxveUV4ZWNzQnlFbnYgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gIGxldCBzZW50aW5lbCA9IDA7XG4gIGNvbnN0IGZsYWdGb3IgPSAoZW52OiBzdHJpbmcpOiBTZXQ8c3RyaW5nPiA9PiB7XG4gICAgbGV0IHMgPSBwb3N0RGVwbG95RXhlY3NCeUVudi5nZXQoZW52KTtcbiAgICBpZiAoIXMpIHsgcyA9IG5ldyBTZXQ8c3RyaW5nPigpOyBwb3N0RGVwbG95RXhlY3NCeUVudi5zZXQoZW52LCBzKTsgfVxuICAgIHJldHVybiBzO1xuICB9O1xuICBmb3IgKGNvbnN0IG8gb2Ygb3V0Y29tZVJvd3MpIHtcbiAgICBpZiAoby5vdXRjb21lICE9PSAnZmFpbGVkJyB8fCAhby5lbnZpcm9ubWVudCkgY29udGludWU7XG4gICAgZmxhZ0ZvcihvLmVudmlyb25tZW50KS5hZGQoby5leGVjdXRpb25faWQgPz8gYG1hbnVhbC0ke3NlbnRpbmVsKyt9YCk7XG4gICAgYWNjRm9yKG8uZW52aXJvbm1lbnQpOyAvLyBlbnN1cmUgZW52IGFwcGVhcnMgZXZlbiB3aXRoIG5vIGRlcGxveSBldmVudHNcbiAgfVxuICBmb3IgKGNvbnN0IGNpIG9mIGNvcnJlbGF0ZWRJbmNpZGVudHMpIHtcbiAgICBmbGFnRm9yKGNpLmVudmlyb25tZW50KS5hZGQoY2kuZXhlYyk7XG4gICAgYWNjRm9yKGNpLmVudmlyb25tZW50KTsgLy8gZW5zdXJlIGVudiBhcHBlYXJzIGV2ZW4gaWYgdGhlIGRlcGxveSBpcyBvdXQtb2Ytd2luZG93XG4gIH1cbiAgY29uc3QgcG9zdERlcGxveUJ5RW52ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbZW52LCBzZXRdIG9mIHBvc3REZXBsb3lFeGVjc0J5RW52KSBwb3N0RGVwbG95QnlFbnYuc2V0KGVudiwgc2V0LnNpemUpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50czogRG9yYUVudk1ldHJpY3NbXSA9IFsuLi5lbnZzLmVudHJpZXMoKV1cbiAgICAubWFwKChbZW52aXJvbm1lbnQsIGFdKSA9PiB7XG4gICAgICBjb25zdCBwb3N0RGVwbG95RmFpbHVyZXMgPSBwb3N0RGVwbG95QnlFbnYuZ2V0KGVudmlyb25tZW50KSA/PyAwO1xuICAgICAgY29uc3QgcmF3UGVyRGF5ID0gYS5kZXBsb3ltZW50cyAvIGRheXM7XG4gICAgICBjb25zdCBudW1lcmF0b3IgPSBhLmRlcGxveVRpbWVGYWlsdXJlcyArIHBvc3REZXBsb3lGYWlsdXJlcztcbiAgICAgIC8vIENsYW1wIHRvIFswLDEwMF06IHBvc3QtZGVwbG95IGZhaWx1cmVzIGNhbiBjb3JyZWxhdGUgdG8gYSBkZXBsb3kgdGhhdFxuICAgICAgLy8gY29tcGxldGVkIGp1c3QgYmVmb3JlIHRoZSB3aW5kb3cgKGtlcHQgZm9yIGNvcnJlbGF0aW9uKSwgc28gdGhlIG51bWVyYXRvclxuICAgICAgLy8gY2FuIHRyYW5zaWVudGx5IGV4Y2VlZCBpbi13aW5kb3cgYXR0ZW1wdHMg4oCUIGEgQ0ZSID4gMTAwJSBpcyBuZXZlciB2YWxpZC5cbiAgICAgIGNvbnN0IHJhd1JhdGUgPSBhLmF0dGVtcHRzID4gMCA/IE1hdGgubWluKDEwMCwgKG51bWVyYXRvciAvIGEuYXR0ZW1wdHMpICogMTAwKSA6IDA7XG4gICAgICBjb25zdCBsdE1lZGlhbiA9IG1lZGlhbihhLmxlYWRHYXBzKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICBkZXBsb3ltZW50RnJlcXVlbmN5OiB7XG4gICAgICAgICAgZGVwbG95bWVudHM6IGEuZGVwbG95bWVudHMsXG4gICAgICAgICAgcGVyRGF5OiByb3VuZChyYXdQZXJEYXksIDIpLFxuICAgICAgICAgIGxldmVsOiBkb3JhTGV2ZWxGb3JGcmVxdWVuY3kocmF3UGVyRGF5LCBhLmRlcGxveW1lbnRzKSxcbiAgICAgICAgfSxcbiAgICAgICAgY2hhbmdlRmFpbHVyZVJhdGU6IHtcbiAgICAgICAgICByYXRlOiByb3VuZChyYXdSYXRlLCAxKSxcbiAgICAgICAgICBkZXBsb3lUaW1lRmFpbHVyZXM6IGEuZGVwbG95VGltZUZhaWx1cmVzLFxuICAgICAgICAgIHBvc3REZXBsb3lGYWlsdXJlcyxcbiAgICAgICAgICBhdHRlbXB0czogYS5hdHRlbXB0cyxcbiAgICAgICAgICBsZXZlbDogZG9yYUxldmVsRm9yQ2hhbmdlRmFpbHVyZShyYXdSYXRlLCBhLmF0dGVtcHRzKSxcbiAgICAgICAgfSxcbiAgICAgICAgbGVhZFRpbWU6IHtcbiAgICAgICAgICBkZXBsb3ltZW50czogYS5sZWFkR2Fwcy5sZW5ndGgsXG4gICAgICAgICAgbWVkaWFuU2Vjb25kczogbHRNZWRpYW4gIT0gbnVsbCA/IHJvdW5kKGx0TWVkaWFuLCAxKSA6IG51bGwsXG4gICAgICAgICAgbGV2ZWw6IGRvcmFMZXZlbEZvckxlYWRUaW1lKGx0TWVkaWFuKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSlcbiAgICAuc29ydCgoeCwgeSkgPT4ge1xuICAgICAgaWYgKHguZW52aXJvbm1lbnQgPT09IEhFQURMSU5FX0VOVikgcmV0dXJuIC0xO1xuICAgICAgaWYgKHkuZW52aXJvbm1lbnQgPT09IEhFQURMSU5FX0VOVikgcmV0dXJuIDE7XG4gICAgICByZXR1cm4geC5lbnZpcm9ubWVudC5sb2NhbGVDb21wYXJlKHkuZW52aXJvbm1lbnQpO1xuICAgIH0pO1xuXG4gIC8vIE1UVFIg4oCUIFBST0RVQ1RJT04tT05MWSwgZnJvbSBCT1RIIHNvdXJjZXMuIEluY2lkZW50cyB0YWtlIHByZWNlZGVuY2U6IGFcbiAgLy8gcHJvZHVjdGlvbiBpbmNpZGVudCBjb3JyZWxhdGVkIHRvIGEgZGVwbG95IGNvbnRyaWJ1dGVzIHRoZSByZWFsIHJlY292ZXJ5XG4gIC8vIChgcmVzb2x2ZWRfYXQg4oiSIG9wZW5lZF9hdGApLCBhbmQgYW55IG1hbnVhbCBvdXRjb21lIG9uIHRoZSBTQU1FIGRlcGxveSBpc1xuICAvLyBza2lwcGVkLiBNYW51YWwgb3V0Y29tZXMgb24gb3RoZXIgZGVwbG95cyBrZWVwIHRoZSBQaGFzZS0yIGJlaGF2aW9yXG4gIC8vIChgZmFpbGVkYCDihpIgYW4gaW5jaWRlbnQ7IGByZXN0b3JlZGAg4oaSIGEgcmVjb3ZlcnkgZ2FwIG9mIGByZXN0b3JlZCDiiJIgZGVwbG95ZWRgKS5cbiAgbGV0IGluY2lkZW50cyA9IDAsIHJlc3RvcmVkID0gMDtcbiAgY29uc3QgbXR0ckdhcHM6IG51bWJlcltdID0gW107XG4gIC8vIEV4ZWN1dGlvbnMgYWxyZWFkeSBhdHRyaWJ1dGVkIHRvIGEgcHJvZHVjdGlvbiBpbmNpZGVudCAocHJlY2VkZW5jZSBndWFyZCkuXG4gIGNvbnN0IGluY2lkZW50RXhlY3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBjaSBvZiBjb3JyZWxhdGVkSW5jaWRlbnRzKSB7XG4gICAgaWYgKGNpLmVudmlyb25tZW50ICE9PSBIRUFETElORV9FTlYpIGNvbnRpbnVlOyAvLyBNVFRSIGlzIHByb2R1Y3Rpb24tb25seVxuICAgIGluY2lkZW50cysrO1xuICAgIGluY2lkZW50RXhlY3MuYWRkKGNpLmV4ZWMpO1xuICAgIGlmIChjaS5yZXNvbHZlZEdhcCAhPSBudWxsKSB7IHJlc3RvcmVkKys7IG10dHJHYXBzLnB1c2goY2kucmVzb2x2ZWRHYXApOyB9XG4gIH1cbiAgZm9yIChjb25zdCBtIG9mIG10dHJSb3dzKSB7XG4gICAgLy8gSW5jaWRlbnQgcHJlY2VkZW5jZTogZG9uJ3QgZG91YmxlLWNvdW50IGEgZGVwbG95IGFscmVhZHkgZmxhZ2dlZCBieSBhbiBpbmNpZGVudC5cbiAgICBpZiAobS5leGVjdXRpb25faWQgIT0gbnVsbCAmJiBpbmNpZGVudEV4ZWNzLmhhcyhtLmV4ZWN1dGlvbl9pZCkpIGNvbnRpbnVlO1xuICAgIGlmIChtLm91dGNvbWUgPT09ICdmYWlsZWQnKSB7IGluY2lkZW50cysrOyBjb250aW51ZTsgfVxuICAgIGlmIChtLm91dGNvbWUgPT09ICdyZXN0b3JlZCcpIHtcbiAgICAgIHJlc3RvcmVkKys7XG4gICAgICBpZiAobS5yZXN0b3JlZF9hdCAhPSBudWxsICYmIG0uZGVwbG95ZWRfYXQgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBnYXAgPSAoRGF0ZS5wYXJzZShtLnJlc3RvcmVkX2F0KSAtIERhdGUucGFyc2UobS5kZXBsb3llZF9hdCkpIC8gMTAwMDtcbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShnYXApKSBtdHRyR2Fwcy5wdXNoKE1hdGgubWF4KGdhcCwgMCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBtdHRyTWVkaWFuID0gbWVkaWFuKG10dHJHYXBzKTtcblxuICBjb25zdCByZWdpc3RlcmVkID0gTnVtYmVyKGNvdmVyYWdlUm93Py5yZWdpc3RlcmVkKSB8fCAwO1xuICBjb25zdCBkZXBsb3lpbmcgPSBOdW1iZXIoY292ZXJhZ2VSb3c/LmRlcGxveWluZykgfHwgMDtcblxuICByZXR1cm4ge1xuICAgIHdpbmRvdzogeyBmcm9tLCB0byB9LFxuICAgIGZpbHRlcnM6IHsgcGlwZWxpbmVJZDogZmlsdGVycy5waXBlbGluZUlkID8/IG51bGwsIGVudmlyb25tZW50OiBmaWx0ZXJzLmVudmlyb25tZW50ID8/IG51bGwgfSxcbiAgICBoZWFkbGluZTogSEVBRExJTkVfRU5WLFxuICAgIGVudmlyb25tZW50cyxcbiAgICBtZWFuVGltZVRvUmVzdG9yZToge1xuICAgICAgaW5jaWRlbnRzLFxuICAgICAgcmVzdG9yZWQsXG4gICAgICBtZWRpYW5TZWNvbmRzOiBtdHRyTWVkaWFuICE9IG51bGwgPyByb3VuZChtdHRyTWVkaWFuLCAxKSA6IG51bGwsXG4gICAgICBsZXZlbDogZG9yYUxldmVsRm9yUmVzdG9yZShtdHRyTWVkaWFuKSxcbiAgICB9LFxuICAgIGNvdmVyYWdlOiB7XG4gICAgICByZWdpc3RlcmVkLFxuICAgICAgZGVwbG95aW5nLFxuICAgICAgd2l0aG91dERlcGxveXM6IE1hdGgubWF4KHJlZ2lzdGVyZWQgLSBkZXBsb3lpbmcsIDApLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogMS45YiBET1JBIHRyZW5kIOKAlCBkZXBsb3ltZW50IGZyZXF1ZW5jeSArIGRlcGxveS10aW1lIGNoYW5nZS1mYWlsdXJlIHJhdGVcbiAqIGJ1Y2tldGVkIGJ5IGBpbnRlcnZhbGAgKGRheS93ZWVrL21vbnRoKSBmb3IgYSBzcGFya2xpbmUuIERlcGxveS1iYXNpcyBsaWtlXG4gKiBnZXREb3JhTWV0cmljczogYnVja2V0cyB0ZXJtaW5hbCBkZXBsb3ktc3RhZ2UgZXhlY3V0aW9ucyBvbiB0aGVpclxuICogYGNvbXBsZXRlZF9hdGAuIFNoYXJlcyB0aGUgb3JnL3JvbGx1cCArIHBpcGVsaW5lSWQvZW52aXJvbm1lbnQgc2NvcGluZy4gTVRUUixcbiAqIGxlYWQgdGltZSwgYW5kIHBvc3QtZGVwbG95IENGUiBhcmUgaW50ZW50aW9uYWxseSBvbWl0dGVkICh0b28gaGVhdnkgdG8gYnVja2V0KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERvcmFUcmVuZChcbiAgb3JnSWQ6IHN0cmluZyxcbiAgaW50ZXJ2YWw6IHN0cmluZyxcbiAgZnJvbTogc3RyaW5nLFxuICB0bzogc3RyaW5nLFxuICBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgb3B0czogRG9yYU9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8RG9yYVRyZW5kUG9pbnRbXT4ge1xuICBhc3NlcnRSZXBvcnRJbnRlcnZhbChpbnRlcnZhbCk7XG4gIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICBjb25zdCB7IHBpcGVsaW5lSWQsIGVudmlyb25tZW50IH0gPSBvcHRzO1xuICBjb25zdCBwaXBlbGluZUNsYXVzZSA9IHBpcGVsaW5lSWQgPyBzcWxgQU5EIGUucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9YCA6IHNxbGBgO1xuICBjb25zdCBlbnZDbGF1c2UgPSBlbnZpcm9ubWVudCA/IHNxbGBBTkQgZS5lbnZpcm9ubWVudCA9ICR7ZW52aXJvbm1lbnR9YCA6IHNxbGBgO1xuICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICBXSVRIIGRlcGxveXMgQVMgKFxuICAgICAgICAtLSBQRVItRVhFQ1VUSU9OIGRlcGxveSB1bml0IChEMSk6IG9uZSByb3cgcGVyIChlbnZpcm9ubWVudCwgZXhlY3V0aW9uKSxcbiAgICAgICAgLS0gZXZlcnkgZGVwbG95IFNUQUdFIHRvIHRoYXQgZW52IHdpdGhpbiB0aGUgZXhlY3V0aW9uIHJvbGxlZCB1cCB0byBhXG4gICAgICAgIC0tIHNpbmdsZSB0ZXJtaW5hbCBzdGF0dXMg4oCUIE5PVCBvbmUgcm93IHBlciBzdGFnZS5cbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHt0ZXJtaW5hbFN0YXR1c1JvbGx1cH0gQVMgc3RhdHVzLFxuICAgICAgICAgIE1BWChlLmNvbXBsZXRlZF9hdCkgQVMgY29tcGxldGVkX2F0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExcbiAgICAgICAgICAke3BpcGVsaW5lQ2xhdXNlfSAke2VudkNsYXVzZX1cbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuY29tcGxldGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLmVudmlyb25tZW50LCBlLmV4ZWN1dGlvbl9pZFxuICAgICAgKVxuICAgICAgU0VMRUNUXG4gICAgICAgIERBVEVfVFJVTkMoJHtpbnRlcnZhbH0sIGNvbXBsZXRlZF9hdCk6OnRleHQgQVMgcGVyaW9kLFxuICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIGRlcGxveW1lbnRzLFxuICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJykpOjppbnQgQVMgdG90YWwsXG4gICAgICAgIC0tIHF1b3RlZCBhbGlhcyBzbyB0aGUgcmF3IHJvdyBrZXkgaXMgZXhhY3RseSB0aGUgRG9yYVRyZW5kUG9pbnQgZmllbGRcbiAgICAgICAgQ09BTEVTQ0UoUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnKSksIDApICogMTAwLCAxKSwgMCk6OmZsb2F0IEFTIFwiY2hhbmdlRmFpbHVyZVBjdFwiXG4gICAgICBGUk9NIGRlcGxveXNcbiAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RG9yYVRyZW5kUG9pbnQ+KHIucm93cykpKTtcbiAgY29uc3Qga2V5ID0gYCR7b3JnSWR9OmRvcmEtdHJlbmQ6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfToke3BpcGVsaW5lSWQgPz8gJyd9OiR7ZW52aXJvbm1lbnQgPz8gJyd9YDtcbiAgcmV0dXJuIHJ1blJlcG9ydChrZXksIG11bHRpLCBleGVjKTtcbn1cblxuLyoqXG4gKiAxLjEwIFBlci1waXBlbGluZSBCVUlMRCBIRUFMVEggKFBoYXNlIDYpIOKAlCBhIHN0YW5kYXJkIChOT1QgYGFkdmFuY2VkX3JlcG9ydGluZ2ApXG4gKiBwZXItc3RhZ2UgYnJlYWtkb3duIGZvciBvbmUgcGlwZWxpbmUgb3ZlciBhIFtmcm9tLHRvXSB3aW5kb3cuIEFnZ3JlZ2F0ZXMgdGhlXG4gKiBleGlzdGluZyBgcGlwZWxpbmVfZXZlbnRzYCBTVEFHRSByb3dzOiBlYWNoIHN0YWdlIGlzIHJvbGxlZCB1cCBwZXIgZXhlY3V0aW9uXG4gKiB0byBhIHRlcm1pbmFsIHN0YXR1cyAoRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVEKSArIGl0cyBtYXggZHVyYXRpb24sIHRoZW5cbiAqIGdyb3VwZWQgcGVyIHN0YWdlIGludG8gcnVuL3N1Y2Nlc3MvZmFpbHVyZSBjb3VudHMsIGEgc3VjY2VzcyByYXRlLCBhbmRcbiAqIGR1cmF0aW9uIHBlcmNlbnRpbGVzIChwNTAvcDkwL3A5OSkuIFRvdGFscyBzdW0gYWNyb3NzIHN0YWdlcy4gT3JnLXNjb3BlZCB2aWFcbiAqIHRoZSBwaXBlbGluZSBqb2luIChgcC5vcmdfaWQgJHtwcmVkfWApICsgcm9sbHVwLWF3YXJlIGxpa2UgdGhlIHNpYmxpbmcgcmVwb3J0cztcbiAqIGEgcGlwZWxpbmVJZCBvd25lZCBieSBhbm90aGVyIG9yZyByZXR1cm5zIGFuIGVtcHR5IGJyZWFrZG93bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1aWxkSGVhbHRoKFxuICBvcmdJZDogc3RyaW5nLFxuICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gIGZyb206IHN0cmluZyxcbiAgdG86IHN0cmluZyxcbiAgb3JnSWRzPzogc3RyaW5nW10sXG4pOiBQcm9taXNlPEJ1aWxkSGVhbHRoPiB7XG4gIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgIGNvbnN0IHJvd3MgPSBkcml6emxlUm93czxCdWlsZEhlYWx0aFN0YWdlPigoYXdhaXQgdHguZXhlY3V0ZShzcWxgXG4gICAgICBXSVRIIHN0YWdlX3J1bnMgQVMgKFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLnN0YWdlX25hbWUgQVMgc3RhZ2UsXG4gICAgICAgICAgJHt0ZXJtaW5hbFN0YXR1c1JvbGx1cH0gQVMgc3RhdHVzLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKSBBUyBkdXJhdGlvbl9tc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfVxuICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YWdlX25hbWUgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGUuc3RhZ2VfbmFtZSwgZS5leGVjdXRpb25faWRcbiAgICAgIClcbiAgICAgIFNFTEVDVFxuICAgICAgICBzdGFnZSxcbiAgICAgICAgQ09VTlQoKik6OmludCBBUyBydW5zLFxuICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2Nlc3NlcyxcbiAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgQ09BTEVTQ0UoUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnU1VDQ0VFREVEJyk6Om51bWVyaWNcbiAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpLCAwKTo6ZmxvYXQgQVMgXCJzdWNjZXNzUmF0ZVwiLFxuICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC41KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGR1cmF0aW9uX21zKTo6aW50IEFTIFwicDUwTXNcIixcbiAgICAgICAgUEVSQ0VOVElMRV9DT05UKDAuOSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBkdXJhdGlvbl9tcyk6OmludCBBUyBcInA5ME1zXCIsXG4gICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjk5KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGR1cmF0aW9uX21zKTo6aW50IEFTIFwicDk5TXNcIlxuICAgICAgRlJPTSBzdGFnZV9ydW5zXG4gICAgICBXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJylcbiAgICAgIEdST1VQIEJZIHN0YWdlXG4gICAgICBPUkRFUiBCWSBydW5zIERFU0MsIHN0YWdlXG4gICAgYCkpLnJvd3MpO1xuXG4gICAgLy8gVG90YWxzIHN1bSBhY3Jvc3Mgc3RhZ2VzICh0b3RhbCBzdGFnZS1ydW5zIC8gc3RhZ2UtZmFpbHVyZXMgaW4gdGhlIHdpbmRvdykuXG4gICAgbGV0IHJ1bnMgPSAwLCBmYWlsdXJlcyA9IDA7XG4gICAgZm9yIChjb25zdCBzIG9mIHJvd3MpIHsgcnVucyArPSBzLnJ1bnM7IGZhaWx1cmVzICs9IHMuZmFpbHVyZXM7IH1cbiAgICBjb25zdCBmYWlsdXJlUmF0ZSA9IHJ1bnMgPiAwID8gcm91bmQoKGZhaWx1cmVzIC8gcnVucykgKiAxMDAsIDEpIDogMDtcbiAgICByZXR1cm4geyBzdGFnZXM6IHJvd3MsIHRvdGFsczogeyBydW5zLCBmYWlsdXJlcywgZmFpbHVyZVJhdGUgfSB9O1xuICB9KTtcbiAgcmV0dXJuIHJ1blJlcG9ydChgJHtvcmdJZH06YnVpbGQtaGVhbHRoOiR7cGlwZWxpbmVJZH06JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbn1cblxuLy8g4pSA4pSAIENhdGVnb3J5IDI6IFBsdWdpbiBJbnZlbnRvcnkgJiBCdWlsZHMg4pSA4pSAXG5cbi8qKiAyLjEgUGx1Z2luIHN1bW1hcnkg4oCUIGNvdW50cyBhbmQgYnJlYWtkb3ducy5cbiAqICBJTlRFTlRJT05BTExZIFNJTkdMRS1PUkcgKG5vIHJvbGx1cCk6IHBsdWdpbiBpbnZlbnRvcnkgaXMgYW4gb3JnLW93bmVkXG4gKiAgYXNzZXQgY291bnQsIG5vdCBhbiBleGVjdXRpb24vYnVpbGQgYWN0aXZpdHkgcmVwb3J0LCBzbyBhIHBhcmVudCdzIHZpZXcgaXNcbiAqICBpdHMgb3duIHBsdWdpbnMg4oCUIHRlYW1zIG1hbmFnZSB0aGVpciBvd24gaW52ZW50b3J5LiBTaW5nbGUgYD0gJG9yZ2Agc2NvcGUuICovXG4iXX0=
|
|
525
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9yYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL2RvcmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUNMLFlBQVksRUFBRSwwQkFBMEIsRUFBRSwwQkFBMEIsRUFDcEUscUJBQXFCLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQzNGLEtBQUssRUFBRSxNQUFNLEdBQ2QsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsS0FBYSxFQUNiLElBQVksRUFDWixFQUFVLEVBQ1YsTUFBaUIsRUFDakIsSUFBSSxHQUFnQixFQUFFO0lBRXRCLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRCxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQztJQUN6QyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSx1QkFBdUIsVUFBVSxFQUFFLENB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QVEsR0FBRyxDQUFDLENBQUM7UUFDM0IsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFBQyxDQUFDO1FBQ2pFLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLFNBQVMsQ0FBQyxHQUFHLEtBQUssaUJBQWlCLFVBQVUsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3JGLENBQUM7QUFFRCw4Q0FBOEM7QUFFOUM7OztpRkFHaUYiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBET1JBIG1ldHJpY3M6IHRoZSBmb3VyIGhlYWRsaW5lIG1lYXN1cmVzLCB0aGVpciBwZXItZW52aXJvbm1lbnQgYnJlYWtkb3duLFxuICogdGhlIHRyZW5kIHNlcmllcywgYW5kIHBlci1waXBlbGluZSBidWlsZCBoZWFsdGguXG4gKlxuICogQnkgZmFyIHRoZSBsYXJnZXN0IGRvbWFpbiBpbiB0aGUgcmVwb3J0aW5nIHNlcnZpY2UgKH40OTAgbGluZXMgb2YgcXVlcnkgK1xuICogc2hhcGluZyBhZ2FpbnN0IHNpeCByb3cgc2hhcGVzKSwgd2hpY2ggaXMgd2h5IGl0IGxpdmVzIGluIGl0cyBvd24gbW9kdWxlLlxuICogUmVwb3J0aW5nU2VydmljZSBkZWxlZ2F0ZXMgdG8gdGhlc2U7IHRoZSBiYW5kaW5nIHRocmVzaG9sZHMgdGhleSBhcHBseSBhcmUgaW5cbiAqIC4vZG9yYS1zY29yaW5nLnRzLCBkZWxpYmVyYXRlbHkgc2VwYXJhdGUgc28gdGhleSBjYW4gYmUgdGVzdGVkIHdpdGhvdXQgYSBEQi5cbiAqL1xuXG5pbXBvcnQgeyBzcWwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQge1xuICBIRUFETElORV9FTlYsIERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTLCByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyxcbiAgZG9yYUxldmVsRm9yRnJlcXVlbmN5LCBkb3JhTGV2ZWxGb3JDaGFuZ2VGYWlsdXJlLCBkb3JhTGV2ZWxGb3JSZXN0b3JlLCBkb3JhTGV2ZWxGb3JMZWFkVGltZSxcbiAgcm91bmQsIG1lZGlhbixcbn0gZnJvbSAnLi9kb3JhLXNjb3JpbmcuanMnO1xuaW1wb3J0IHsgb3JnU2NvcGUsIHJ1blJlcG9ydCB9IGZyb20gJy4vcXVlcnktc2NvcGUuanMnO1xuaW1wb3J0IHsgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwsIHRlcm1pbmFsU3RhdHVzUm9sbHVwIH0gZnJvbSAnLi9zcWwtaGVscGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIERvcmFPcHRpb25zLCBEb3JhTWV0cmljcywgRG9yYUVudk1ldHJpY3MsIERvcmFUcmVuZFBvaW50LCBCdWlsZEhlYWx0aCwgQnVpbGRIZWFsdGhTdGFnZSxcbiAgRGVwbG95Um93LCBPdXRjb21lUm93LCBNdHRyUGFpclJvdywgSW5jaWRlbnRSb3csIENvdmVyYWdlUm93LFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuaW1wb3J0IHsgZHJpenpsZVJvd3MgfSBmcm9tICcuLi9jcnVkLXNlcnZpY2UuanMnO1xuXG4vKipcbiAqIDEuOSBET1JBIG1ldHJpY3Mgb3ZlciBhIFtmcm9tLHRvXSBkZXBsb3ktY29tcGxldGlvbiB3aW5kb3csIG9yZy1zY29wZWQgK1xuICogcm9sbHVwLWF3YXJlLiBERVBMT1ktQkFTSVMgT05MWSDigJQgZXZlcnkgbWV0cmljIGRlcml2ZXMgZnJvbSByZWFsIGRlcGxveS1zdGFnZVxuICogZXhlY3V0aW9ucyAoYGV2ZW50X3R5cGU9J1NUQUdFJ2Agd2l0aCBhIG5vbi1udWxsIGBlbnZpcm9ubWVudGAsIHNldCBieSB0aGVcbiAqIGZvcndhcmRlciBmb3IgdGhlIHN0YWdlcyBhIHVzZXIgZGVjbGFyZWQgaW4gYHBiLmRlcGxveXNgKS4gTm8gcnVuLWJhc2VkXG4gKiBmYWxsYmFjazogYSBwaXBlbGluZSB3aXRoIG5vIGRlcGxveSBzdGFnZSBwcm9kdWNlcyBubyBET1JBIGRhdGEuXG4gKlxuICogRm91ciBzY29wZWQgU1FMIHNjYW5zIHJ1biBpbnNpZGUgb25lIHR4IChlYWNoIG9yZy1nYXRlZCBieSBgcC5vcmdfaWQgJHtwcmVkfWBcbiAqIC8gYG8ub3JnX2lkICR7cHJlZH1gIHNvIGEgcm9sbHVwIHBhc3NlcyB0aGUgb3Jn4oaSdGVhbSBzdWJ0cmVlIGFuZCBhIGZvcmVpZ25cbiAqIG9yZydzIHJvd3MgbmV2ZXIgZW50ZXIpOiAoMSkgdGVybWluYWwgZGVwbG95IHJvd3MgUEVSIChleGVjdXRpb24sIGVudikg4oCUIG9uZVxuICogXCJkZXBsb3ltZW50XCIgPSBvbmUgZXhlY3V0aW9uIHJlYWNoaW5nIGFuIGVudiAoRDEpIOKAlCDihpIgREYgLyBkZXBsb3ktdGltZSBDRlIgL1xuICogbWVhc3VyZWQgbGVhZCB0aW1lIChsZWFkIHRpbWUgam9pbnMgdGhlIGV4ZWN1dGlvbidzIGVhcmxpZXN0IGNvbW1pdCwgRDIpO1xuICogdGhlIHNjYW4gYWxzbyByZWFjaGVzIGJhY2sgYHdpbmRvd0hvdXJzYCBiZWZvcmUgYGZyb21gIHNvIGluY2lkZW50cyBvcGVuZWRcbiAqIG5lYXIgdGhlIHdpbmRvdyBzdGFydCBjYW4gY29ycmVsYXRlIHRvIGEganVzdC1wcmlvciBkZXBsb3k7ICgyKSBgZGVwbG95bWVudF9vdXRjb21lc2BcbiAqIGluLXdpbmRvdyDihpIgcG9zdC1kZXBsb3kgQ0ZSIGNvbXBvbmVudDsgKDMpIHByb2R1Y3Rpb24gcmVzdG9yZWQvZmFpbGVkXG4gKiBvdXRjb21lcyBqb2luZWQgdG8gdGhlaXIgZGVwbG95IOKGkiBNVFRSOyAoNCkgcmVnaXN0cnkgdnMgZGVwbG95aW5nIOKGkiBjb3ZlcmFnZS5cbiAqIFRoZSBjcm9zcy1zb3VyY2UgbWVkaWFucyAobGVhZCB0aW1lLCBNVFRSKSBhcmUgY29tcHV0ZWQgaW4gSlMgZnJvbSBjbGFtcGVkXG4gKiAo4omlMCkgZGVsdGFzLlxuICpcbiAqIEBwYXJhbSBvcHRzLnBpcGVsaW5lSWQgICAgcmVzdHJpY3QgdG8gb25lIHBpcGVsaW5lIChwZXItcGlwZWxpbmUgRE9SQSlcbiAqIEBwYXJhbSBvcHRzLmVudmlyb25tZW50ICAgcmVzdHJpY3QgdG8gb25lIGRlcGxveSBlbnZpcm9ubWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG9yYU1ldHJpY3MoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIGZyb206IHN0cmluZyxcbiAgdG86IHN0cmluZyxcbiAgb3JnSWRzPzogc3RyaW5nW10sXG4gIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPERvcmFNZXRyaWNzPiB7XG4gIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICBjb25zdCB7IHBpcGVsaW5lSWQsIGVudmlyb25tZW50IH0gPSBvcHRzO1xuICBjb25zdCBwaXBlbGluZUNsYXVzZSA9IHBpcGVsaW5lSWQgPyBzcWxgQU5EIGUucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9YCA6IHNxbGBgO1xuICBjb25zdCBwaXBlbGluZUNsYXVzZVIgPSBwaXBlbGluZUlkID8gc3FsYEFORCByLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfWAgOiBzcWxgYDtcbiAgLy8gUG9zdC1kZXBsb3kgb3V0Y29tZXMgY2Fycnkgbm8gcGlwZWxpbmUgaWQsIG9ubHkgdGhlIGV4ZWN1dGlvbiB0aGF0XG4gIC8vIHByb2R1Y2VkIHRoZW0sIHNvIGEgcGVyLXBpcGVsaW5lIHZpZXcgaGFzIHRvIHNjb3BlIHRoZW0gVEhST1VHSCB0aGVcbiAgLy8gZXhlY3V0aW9uLiBXaXRob3V0IGl0IHRoZSBvdXRjb21lIGFuZCBNVFRSIHNjYW5zIHJlYWQgZXZlcnkgcGlwZWxpbmUgaW4gdGhlXG4gIC8vIG9yZzogYW5vdGhlciBwaXBlbGluZSdzIGBmYWlsZWRgIG1hcmtlciBjb3VudGVkIGFnYWluc3QgdGhpcyBvbmUncyBjaGFuZ2VcbiAgLy8gZmFpbHVyZSByYXRlICh0ZW4gY2xlYW4gZGVwbG95cyBjb3VsZCBkcm9wIGZyb20gZWxpdGUgdG8gaGlnaCkgYW5kIGl0c1xuICAvLyByZWNvdmVyaWVzIGZlZCB0aGlzIG9uZSdzIE1UVFIuXG4gIGNvbnN0IG91dGNvbWVQaXBlbGluZUNsYXVzZSA9IHBpcGVsaW5lSWRcbiAgICA/IHNxbGBBTkQgby5leGVjdXRpb25faWQgSU4gKFNFTEVDVCBwZS5leGVjdXRpb25faWQgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBwZSBXSEVSRSBwZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH0pYFxuICAgIDogc3FsYGA7XG4gIC8vIGBlbnZDbGF1c2VgIGlzIHRoZSBTVFJJQ1QgZmlsdGVyIChjb3ZlcmFnZSwgYW5kIHRoZSBvdXRwdXQpLiBUaGUgZGVwbG95IGFuZFxuICAvLyBpbmNpZGVudCBTQ0FOUyB1c2UgdGhlIHdpZGVuZWQgYHNjYW5FbnZDbGF1c2VgL2BzY2FuSW5jaWRlbnRFbnZDbGF1c2VgXG4gIC8vIGluc3RlYWQsIHdoaWNoIGFsd2F5cyBhZG1pdCBwcm9kdWN0aW9uOiBNVFRSIGlzIHByb2R1Y3Rpb24tb25seSBhbmRcbiAgLy8gZG9jdW1lbnRlZCBhcyBpbmRlcGVuZGVudCBvZiB0aGUgZW52aXJvbm1lbnQgZmlsdGVyLCBidXQgaW5jaWRlbnQtc291cmNlZFxuICAvLyBNVFRSIGNvcnJlbGF0ZXMgZWFjaCBwcm9kdWN0aW9uIGluY2lkZW50IGFnYWluc3QgcHJvZHVjdGlvbiBERVBMT1kgcm93cy5cbiAgLy8gRmlsdGVyaW5nIGJvdGggc2NhbnMgdG8gYD9lbnZpcm9ubWVudD1zdGFnaW5nYCByZW1vdmVkIGV2ZXJ5IHByb2R1Y3Rpb25cbiAgLy8gaW5jaWRlbnQgYW5kIGV2ZXJ5IHByb2R1Y3Rpb24gZGVwbG95LCBzbyBpbmNpZGVudCByZWNvdmVyeSBzaWxlbnRseSBkcm9wcGVkXG4gIC8vIG91dCBvZiBNVFRSIHRoZSBtb21lbnQgYW55b25lIGxvb2tlZCBhdCBhIG5vbi1wcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAvLyBgc2hhcGVEb3JhYCBuYXJyb3dzIHRoZSByZXBvcnRlZCBlbnZpcm9ubWVudHMgYmFjayB0byB0aGUgcmVxdWVzdGVkIG9uZS5cbiAgY29uc3QgZW52Q2xhdXNlID0gZW52aXJvbm1lbnQgPyBzcWxgQU5EIGUuZW52aXJvbm1lbnQgPSAke2Vudmlyb25tZW50fWAgOiBzcWxgYDtcbiAgY29uc3Qgc2NhbkVudkNsYXVzZSA9IGVudmlyb25tZW50ID8gc3FsYEFORCBlLmVudmlyb25tZW50IElOICgke2Vudmlyb25tZW50fSwgJHtIRUFETElORV9FTlZ9KWAgOiBzcWxgYDtcbiAgY29uc3Qgb3V0Y29tZUVudkNsYXVzZSA9IGVudmlyb25tZW50ID8gc3FsYEFORCBvLmVudmlyb25tZW50ID0gJHtlbnZpcm9ubWVudH1gIDogc3FsYGA7XG4gIGNvbnN0IHNjYW5JbmNpZGVudEVudkNsYXVzZSA9IGVudmlyb25tZW50ID8gc3FsYEFORCBpLmVudmlyb25tZW50IElOICgke2Vudmlyb25tZW50fSwgJHtIRUFETElORV9FTlZ9KWAgOiBzcWxgYDtcblxuICAvLyBFZmZlY3RpdmUgaW5jaWRlbnQtY29ycmVsYXRpb24gd2luZG93IChwZXItb3JnIG92ZXJyaWRlIG9yIHRoZSBnbG9iYWxcbiAgLy8gZGVmYXVsdCkuIENvbXB1dGVkIGhlcmUgKG5vdCBqdXN0IGluIHNoYXBlRG9yYSkgYmVjYXVzZSB0aGUgZGVwbG95IHNjYW5cbiAgLy8gbmVlZHMgaXQgZm9yIEJPVEggdGhlIGNvcnJlbGF0aW9uIGxvb2stYmFjayBsb3dlciBib3VuZCBBTkQgdGhlIGNhY2hlIGtleS5cbiAgY29uc3QgZWZmZWN0aXZlV2luZG93SG91cnMgPSByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyhvcHRzLmluY2lkZW50V2luZG93SG91cnMpO1xuICAvLyBDb3JyZWxhdGlvbiBsb29rLWJhY2s6IGluY2lkZW50cyBvcGVuZWQganVzdCBpbnNpZGUgYGZyb21gIGNhbiBhdHRyaWJ1dGUgdG9cbiAgLy8gYSBkZXBsb3kgdGhhdCBjb21wbGV0ZWQgdXAgdG8gYHdpbmRvd0hvdXJzYCBCRUZPUkUgYGZyb21gIChtaXJyb3JzIHRoZVxuICAvLyBMQVRFUkFMIGxvb2stYmFjayBpbiBsaXN0SW5jaWRlbnRzKS4gV2lkZW4gdGhlIGRlcGxveSBzY2FuJ3MgbG93ZXIgYm91bmQgdG9cbiAgLy8gYGZyb20g4oiSIHdpbmRvd0hvdXJzYDsgREYvQ0ZSL2xlYWQgc3RpbGwgY291bnQgb25seSB0aGUgaW4tYGZyb21gLi5gdG9gXG4gIC8vIHN1YnNldCAoZmxhZ2dlZCBieSBgaW5fd2luZG93YCksIHdoaWxlIGNvcnJlbGF0aW9uIHNlZXMgdGhlIHdpZGVyIHNldC5cbiAgY29uc3QgZnJvbU1zID0gRGF0ZS5wYXJzZShmcm9tKTtcbiAgY29uc3QgbG9va2JhY2tGcm9tID0gTnVtYmVyLmlzRmluaXRlKGZyb21NcylcbiAgICA/IG5ldyBEYXRlKGZyb21NcyAtIGVmZmVjdGl2ZVdpbmRvd0hvdXJzICogMzYwMCAqIDEwMDApLnRvSVNPU3RyaW5nKClcbiAgICA6IGZyb207XG5cbiAgLy8gKDEpIFRlcm1pbmFsIGRlcGxveSByb3dzOiBQRVItRVhFQ1VUSU9OIChEMSksIG9uZSByb3cgcGVyIChlbnZpcm9ubWVudCxcbiAgLy8gZXhlY3V0aW9uKSDigJQgZXZlcnkgZGVwbG95IFNUQUdFIHRhcmdldGluZyB0aGF0IGVudiB3aXRoaW4gdGhlIGV4ZWN1dGlvbiBpc1xuICAvLyByb2xsZWQgdXAgdG8gYSB0ZXJtaW5hbCBzdGF0dXMgKEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCkuIEEgc2luZ2xlXG4gIC8vIGV4ZWN1dGlvbiB3aXRoIHR3byBkZXBsb3kgc3RhZ2VzIHRvIHRoZSBzYW1lIGVudiBpcyBPTkUgZGVwbG95bWVudCwgbm90IHR3by5cbiAgLy8gY29tcGxldGVkX2F0ID0gdGhlIGRlcGxveSdzIGNvbXBsZXRpb24gKE1BWCBvdmVyIGl0cyBzdGFnZXMpLiBgY29tbWl0X3RzYFxuICAvLyAoRDIpIGlzIHRoZSBleGVjdXRpb24ncyBFQVJMSUVTVCBjb21taXQgdGltZSBhY3Jvc3MgQUxMIGl0cyBldmVudHMgKGNvbW1pdFxuICAvLyBlbnJpY2htZW50IHJpZGVzIHRoZSBQSVBFTElORS9zb3VyY2UgZXZlbnQgd2hlcmUgZW52aXJvbm1lbnQgSVMgTlVMTCwgbmV2ZXJcbiAgLy8gdGhlIGRlcGxveSBTVEFHRSByb3cpLCBqb2luZWQgYnkgZXhlY3V0aW9uX2lkLiBgaW5fd2luZG93YCBtYXJrcyB3aGV0aGVyIHRoZVxuICAvLyBkZXBsb3kgY29tcGxldGVkIGluc2lkZSBbZnJvbSx0b10gKHZzLiBhIGxvb2stYmFjay1vbmx5IHJvdyBrZXB0IHNvbGVseSBmb3JcbiAgLy8gaW5jaWRlbnQgY29ycmVsYXRpb24pLiBleGVjdXRpb25faWQgaXMgcHJvamVjdGVkIHNvIHBvc3QtZGVwbG95IGZhaWx1cmVzXG4gIC8vIChtYW51YWwgb3V0Y29tZXMgKyBjb3JyZWxhdGVkIGluY2lkZW50cykgY2FuIGRlZHVwIGFnYWluc3QgdGhlaXIgZGVwbG95LlxuICBjb25zdCBkZXBsb3lTcWwgPSBzcWxgXG4gICAgICBXSVRIIGRlcGxveV9zdGFnZXMgQVMgKFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50LFxuICAgICAgICAgIGUuZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCxcbiAgICAgICAgICAke3Rlcm1pbmFsU3RhdHVzUm9sbHVwfSBBUyBzdGF0dXMsXG4gICAgICAgICAgTUFYKGUuY29tcGxldGVkX2F0KSBBUyBjb21wbGV0ZWRfYXRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5lbnZpcm9ubWVudCBJUyBOT1QgTlVMTFxuICAgICAgICAgICR7cGlwZWxpbmVDbGF1c2V9ICR7c2NhbkVudkNsYXVzZX1cbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPj0gJHtsb29rYmFja0Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5jb21wbGV0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGUuZW52aXJvbm1lbnQsIGUuZXhlY3V0aW9uX2lkXG4gICAgICApLFxuICAgICAgZXhlY19jb21taXRzIEFTIChcbiAgICAgICAgU0VMRUNUIGMuZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCwgTUlOKGMuY29tbWl0X3RpbWVzdGFtcCkgQVMgY29tbWl0X3RzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gY1xuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBjLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGMuY29tbWl0X3RpbWVzdGFtcCBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBjLmV4ZWN1dGlvbl9pZCBJTiAoU0VMRUNUIGV4ZWN1dGlvbl9pZCBGUk9NIGRlcGxveV9zdGFnZXMpXG4gICAgICAgIEdST1VQIEJZIGMuZXhlY3V0aW9uX2lkXG4gICAgICApXG4gICAgICBTRUxFQ1RcbiAgICAgICAgZHMuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsXG4gICAgICAgIGRzLmV4ZWN1dGlvbl9pZCBBUyBleGVjdXRpb25faWQsXG4gICAgICAgIGRzLnN0YXR1cyBBUyBzdGF0dXMsXG4gICAgICAgIGRzLmNvbXBsZXRlZF9hdDo6dGV4dCBBUyBjb21wbGV0ZWRfYXQsXG4gICAgICAgIChkcy5jb21wbGV0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHopIEFTIGluX3dpbmRvdyxcbiAgICAgICAgZWMuY29tbWl0X3RzOjp0ZXh0IEFTIGNvbW1pdF90c1xuICAgICAgRlJPTSBkZXBsb3lfc3RhZ2VzIGRzXG4gICAgICBMRUZUIEpPSU4gZXhlY19jb21taXRzIGVjIE9OIGVjLmV4ZWN1dGlvbl9pZCA9IGRzLmV4ZWN1dGlvbl9pZGA7XG5cbiAgLy8gKDIpIFBvc3QtZGVwbG95IG91dGNvbWUgbWFya2VycyBpbi13aW5kb3cgKHBlciBlbnYpLiBQb3N0LWRlcGxveSBmYWlsdXJlc1xuICAvLyAob3V0Y29tZT0nZmFpbGVkJykgYWRkIHRvIHRoZSBDRlIgbnVtZXJhdG9yIHdpdGhvdXQgY2hhbmdpbmcgYXR0ZW1wdHMuXG4gIC8vIGV4ZWN1dGlvbl9pZCBsZXRzIHRoZSBDRlIgZGVkdXAgYSBtYW51YWwgZmFpbHVyZSBhZ2FpbnN0IGFuIGluY2lkZW50IHRoYXRcbiAgLy8gY29ycmVsYXRlcyB0byB0aGUgc2FtZSBkZXBsb3kgKG5vIGRvdWJsZS1jb3VudCkuXG4gIGNvbnN0IG91dGNvbWVTcWwgPSBzcWxgXG4gICAgICBTRUxFQ1Qgby5lbnZpcm9ubWVudCBBUyBlbnZpcm9ubWVudCwgby5vdXRjb21lIEFTIG91dGNvbWUsIG8uZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZFxuICAgICAgRlJPTSAke3NjaGVtYS5kZXBsb3ltZW50T3V0Y29tZX0gb1xuICAgICAgV0hFUkUgby5vcmdfaWQgJHtwcmVkfSAke291dGNvbWVFbnZDbGF1c2V9ICR7b3V0Y29tZVBpcGVsaW5lQ2xhdXNlfVxuICAgICAgICBBTkQgby5hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgby5hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpgO1xuXG4gIC8vICgzKSBNVFRSIOKAlCBQUk9EVUNUSU9OLU9OTFksIGluZGVwZW5kZW50IG9mIHRoZSBlbnYgZmlsdGVyLiBFdmVyeSBwcm9kdWN0aW9uXG4gIC8vIG91dGNvbWUgaW4td2luZG93OyBmb3IgYSAncmVzdG9yZWQnIG9uZSwgY29ycmVsYXRlIHRvIGl0cyBkZXBsb3knc1xuICAvLyBjb21wbGV0aW9uIHZpYSBleGVjdXRpb25faWQgdG8gbWVhc3VyZSByZXN0b3JlZC5hdCDiiJIgZGVwbG95ZWQuY29tcGxldGVkX2F0LlxuICAvLyBleGVjdXRpb25faWQgaXMgcHJvamVjdGVkIHNvIGFuIGluY2lkZW50LXNvdXJjZWQgcmVjb3ZlcnkgZm9yIHRoZSBzYW1lXG4gIC8vIGRlcGxveSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG1hbnVhbCByZXN0b3JlZCBnYXAuXG4gIGNvbnN0IG10dHJTcWwgPSBzcWxgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgby5vdXRjb21lIEFTIG91dGNvbWUsXG4gICAgICAgIG8uZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCxcbiAgICAgICAgby5hdDo6dGV4dCBBUyByZXN0b3JlZF9hdCxcbiAgICAgICAgKFNFTEVDVCBNQVgoZC5jb21wbGV0ZWRfYXQpIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZFxuICAgICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwMiBPTiBwMi5pZCA9IGQucGlwZWxpbmVfaWRcbiAgICAgICAgICAgV0hFUkUgcDIub3JnX2lkICR7cHJlZH0gQU5EIGQuZXhlY3V0aW9uX2lkID0gby5leGVjdXRpb25faWRcbiAgICAgICAgICAgICBBTkQgZC5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZC5lbnZpcm9ubWVudCA9ICR7SEVBRExJTkVfRU5WfSk6OnRleHQgQVMgZGVwbG95ZWRfYXRcbiAgICAgIEZST00gJHtzY2hlbWEuZGVwbG95bWVudE91dGNvbWV9IG9cbiAgICAgIFdIRVJFIG8ub3JnX2lkICR7cHJlZH0gQU5EIG8uZW52aXJvbm1lbnQgPSAke0hFQURMSU5FX0VOVn0gJHtvdXRjb21lUGlwZWxpbmVDbGF1c2V9XG4gICAgICAgIEFORCBvLmF0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBvLmF0IDw9ICR7dG99Ojp0aW1lc3RhbXB0emA7XG5cbiAgLy8gKDUpIEluY2lkZW50cyBvcGVuZWQgaW4td2luZG93IChwZXIgZW52KS4gQ29ycmVsYXRlZCBpbiBKUyB0byB0aGUgbW9zdFxuICAvLyByZWNlbnQgc3VjY2Vzc2Z1bCBkZXBsb3kg4oaSIGF1dG9tYXRlZCBwb3N0LWRlcGxveSBmYWlsdXJlIChDRlIpICsgcmVhbFxuICAvLyByZWNvdmVyeSB0aW1lIChyZXNvbHZlZF9hdCDiiJIgb3BlbmVkX2F0KSBmb3IgTVRUUiAocHJvZHVjdGlvbikuXG4gIGNvbnN0IGluY2lkZW50U3FsID0gc3FsYFxuICAgICAgU0VMRUNUIGkuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsIGkub3BlbmVkX2F0Ojp0ZXh0IEFTIG9wZW5lZF9hdCwgaS5yZXNvbHZlZF9hdDo6dGV4dCBBUyByZXNvbHZlZF9hdFxuICAgICAgRlJPTSAke3NjaGVtYS5pbmNpZGVudH0gaVxuICAgICAgV0hFUkUgaS5vcmdfaWQgJHtwcmVkfSAke3NjYW5JbmNpZGVudEVudkNsYXVzZX1cbiAgICAgICAgQU5EIGkub3BlbmVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBpLm9wZW5lZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpgO1xuXG4gIC8vICg0KSBDb3ZlcmFnZTogcmVnaXN0ZXJlZCBwaXBlbGluZXMgdnMgdGhvc2UgdGhhdCBhY3R1YWxseSBkZXBsb3llZCBpbi13aW5kb3cuXG4gIGNvbnN0IGNvdmVyYWdlU3FsID0gc3FsYFxuICAgICAgU0VMRUNUXG4gICAgICAgIChTRUxFQ1QgQ09VTlQoKik6OmludCBGUk9NICR7c2NoZW1hLnBpcGVsaW5lUmVnaXN0cnl9IHJcbiAgICAgICAgICAgV0hFUkUgci5vcmdfaWQgJHtwcmVkfSAke3BpcGVsaW5lQ2xhdXNlUn0pIEFTIHJlZ2lzdGVyZWQsXG4gICAgICAgIChTRUxFQ1QgQ09VTlQoRElTVElOQ1QgZS5waXBlbGluZV9pZCk6OmludCBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmVudmlyb25tZW50IElTIE5PVCBOVUxMXG4gICAgICAgICAgICAgJHtwaXBlbGluZUNsYXVzZX0gJHtlbnZDbGF1c2V9XG4gICAgICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLmNvbXBsZXRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHopIEFTIGRlcGxveWluZ2A7XG5cbiAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAvLyBTY2FuIG9yZGVyIGlzIGxvYWQtYmVhcmluZyBmb3IgdGhlIGdlbmVyYXRlZC1TUUwgdGVzdHM6IDA9ZGVwbG95LFxuICAgIC8vIDE9b3V0Y29tZXMsIDI9bXR0ciwgMz1jb3ZlcmFnZSwgND1pbmNpZGVudHMgKGFwcGVuZGVkIGxhc3Qgc28gdGhlXG4gICAgLy8gZWFybGllciBpbmRpY2VzIHN0YXkgc3RhYmxlKS5cbiAgICBjb25zdCBkZXBsb3lSb3dzID0gZHJpenpsZVJvd3M8RGVwbG95Um93PigoYXdhaXQgdHguZXhlY3V0ZShkZXBsb3lTcWwpKS5yb3dzKTtcbiAgICBjb25zdCBvdXRjb21lUm93cyA9IGRyaXp6bGVSb3dzPE91dGNvbWVSb3c+KChhd2FpdCB0eC5leGVjdXRlKG91dGNvbWVTcWwpKS5yb3dzKTtcbiAgICBjb25zdCBtdHRyUm93cyA9IGRyaXp6bGVSb3dzPE10dHJQYWlyUm93ICYgeyBvdXRjb21lOiBzdHJpbmcgfT4oKGF3YWl0IHR4LmV4ZWN1dGUobXR0clNxbCkpLnJvd3MpO1xuICAgIGNvbnN0IGNvdmVyYWdlUm93ID0gZHJpenpsZVJvd3M8Q292ZXJhZ2VSb3c+KChhd2FpdCB0eC5leGVjdXRlKGNvdmVyYWdlU3FsKSkucm93cylbMF07XG4gICAgY29uc3QgaW5jaWRlbnRSb3dzID0gZHJpenpsZVJvd3M8SW5jaWRlbnRSb3c+KChhd2FpdCB0eC5leGVjdXRlKGluY2lkZW50U3FsKSkucm93cyk7XG4gICAgcmV0dXJuIHNoYXBlRG9yYShkZXBsb3lSb3dzLCBvdXRjb21lUm93cywgbXR0clJvd3MsIGNvdmVyYWdlUm93LCBpbmNpZGVudFJvd3MsIGZyb20sIHRvLCB7XG4gICAgICBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCxcbiAgICB9LCBlZmZlY3RpdmVXaW5kb3dIb3Vycyk7XG4gIH0pO1xuICAvLyBDYWNoZSBrZXkgTVVTVCBpbmNsdWRlIHRoZSBlZmZlY3RpdmUgaW5jaWRlbnQgd2luZG93OiB0aGUgc2NvcmVjYXJkIHJlYWRzXG4gIC8vIC9kb3JhIHdpdGggdGhlIG9yZydzIGRlZmF1bHQgd2luZG93IHdoaWxlIGFuIGV4cGxpY2l0IC9kb3JhIGNhbGwgbWF5IHBhc3MgYW5cbiAgLy8gb3ZlcnJpZGUg4oCUIGRpZmZlcmVudCB3aW5kb3dzIHlpZWxkIGRpZmZlcmVudCBDRlIvTVRUUiwgc28gdGhleSBtdXN0IG5vdFxuICAvLyBjb2xsaWRlIG9uIHRoZSBzYW1lIGtleS5cbiAgY29uc3Qga2V5ID0gYCR7b3JnSWR9OmRvcmE6JHtmcm9tfToke3RvfToke3BpcGVsaW5lSWQgPz8gJyd9OiR7ZW52aXJvbm1lbnQgPz8gJyd9OiR7ZWZmZWN0aXZlV2luZG93SG91cnN9YDtcbiAgcmV0dXJuIHJ1blJlcG9ydChrZXksIG11bHRpLCBleGVjKTtcbn1cblxuLyoqXG4gKiBTaGFwZSB0aGUgcmF3IERPUkEgc2NhbiByb3dzIGludG8gdGhlIHB1YmxpYyB7QGxpbmsgRG9yYU1ldHJpY3N9LiBCdWNrZXRzIHRoZVxuICogdGVybWluYWwgZGVwbG95IHJvd3MgYnkgZW52aXJvbm1lbnQgKERGIC8gZGVwbG95LXRpbWUgQ0ZSIC8gbWVhc3VyZWQgbGVhZCksXG4gKiBmb2xkcyBpbiB0aGUgcG9zdC1kZXBsb3kgZmFpbHVyZSBjb3VudHMgKG1hbnVhbCBvdXRjb21lcyArIHdlYmhvb2staW5nZXN0ZWRcbiAqIGluY2lkZW50cywgZGVkdXBlZCBieSBkZXBsb3kgZXhlY3V0aW9uKSwgY29tcHV0ZXMgcHJvZHVjdGlvbiBNVFRSIGZyb20gYm90aFxuICogc291cmNlcyAoaW5jaWRlbnQgYHJlc29sdmVkX2F0IOKIkiBvcGVuZWRfYXRgIHRha2luZyBwcmVjZWRlbmNlIG92ZXIgdGhlIG1hbnVhbFxuICogYHJlc3RvcmVkIOKIkiBkZXBsb3llZGApLCBhbmQgcmVjb25jaWxlcyBjb3ZlcmFnZSDigJQgYWxsIGNyb3NzLXNvdXJjZSBtZWRpYW5zXG4gKiBvdmVyIGRlbHRhcyBjbGFtcGVkIOKJpTAuXG4gKlxuICogUGhhc2UgNSBpbmNpZGVudCBjb3JyZWxhdGlvbjogZWFjaCBpbmNpZGVudCBpcyBhdHRyaWJ1dGVkIHRvIHRoZSBtb3N0IHJlY2VudFxuICogU1VDQ0VTU0ZVTCBkZXBsb3kgdG8gaXRzIGVudmlyb25tZW50IHdpdGggYGNvbXBsZXRlZF9hdCDiiaQgb3BlbmVkX2F0YCB3aXRoaW5cbiAqIHtAbGluayBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSU30uIFRoYXQgZGVwbG95IGlzIGEgcG9zdC1kZXBsb3kgZmFpbHVyZTsgYW5cbiAqIHVuY29ycmVsYXRlZCBpbmNpZGVudCAobm8gZWxpZ2libGUgZGVwbG95KSBjb250cmlidXRlcyBub3RoaW5nLlxuICovXG5mdW5jdGlvbiBzaGFwZURvcmEoXG4gIGRlcGxveVJvd3M6IERlcGxveVJvd1tdLFxuICBvdXRjb21lUm93czogT3V0Y29tZVJvd1tdLFxuICBtdHRyUm93czogQXJyYXk8TXR0clBhaXJSb3cgJiB7IG91dGNvbWU6IHN0cmluZyB9PixcbiAgY292ZXJhZ2VSb3c6IENvdmVyYWdlUm93IHwgdW5kZWZpbmVkLFxuICBpbmNpZGVudFJvd3M6IEluY2lkZW50Um93W10sXG4gIGZyb206IHN0cmluZyxcbiAgdG86IHN0cmluZyxcbiAgZmlsdGVyczogeyBwaXBlbGluZUlkPzogc3RyaW5nOyBlbnZpcm9ubWVudD86IHN0cmluZyB9LFxuICB3aW5kb3dIb3VyczogbnVtYmVyID0gRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlMsXG4pOiBEb3JhTWV0cmljcyB7XG4gIC8vIFdpbmRvdyBsZW5ndGggaW4gZGF5cyAoZmxvb3JlZCBhdCAxIHNvIGEgc3ViLWRheSB3aW5kb3cgeWllbGRzIHRoZSBjb3VudCBhc1xuICAvLyB0aGUgcmF0ZSwgbmV2ZXIgLzAgb3IgYW4gZXh0cmFwb2xhdGlvbikuIEd1YXJkIHVucGFyc2VhYmxlIGRhdGVzIOKGkiAxIGRheS5cbiAgY29uc3Qgc3BhbkRheXMgPSAoRGF0ZS5wYXJzZSh0bykgLSBEYXRlLnBhcnNlKGZyb20pKSAvIDg2NDAwMDAwO1xuICBjb25zdCBkYXlzID0gTnVtYmVyLmlzRmluaXRlKHNwYW5EYXlzKSA/IE1hdGgubWF4KHNwYW5EYXlzLCAxKSA6IDE7XG4gIC8vIFdpbmRvdyBlbmQgaW5zdGFudCBmb3IgTVRUUiByaWdodC1jZW5zb3JpbmcgKGEgcmVzb2x1dGlvbiBhZnRlciBgdG9gIGlzXG4gIC8vIHVub2JzZXJ2ZWQpLiArSW5maW5pdHkgd2hlbiBgdG9gIGlzIHVucGFyc2VhYmxlIOKHkiBubyBjZW5zb3JpbmcgKGZhaWwtb3BlbikuXG4gIGNvbnN0IHRvUGFyc2VkID0gRGF0ZS5wYXJzZSh0byk7XG4gIGNvbnN0IHRvTXMgPSBOdW1iZXIuaXNGaW5pdGUodG9QYXJzZWQpID8gdG9QYXJzZWQgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5cbiAgLy8gUGVyLWVudiBhY2N1bXVsYXRvci5cbiAgaW50ZXJmYWNlIEFjYyB7XG4gICAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgICBkZXBsb3lUaW1lRmFpbHVyZXM6IG51bWJlcjtcbiAgICBhdHRlbXB0czogbnVtYmVyO1xuICAgIGxlYWRHYXBzOiBudW1iZXJbXTtcbiAgfVxuICBjb25zdCBlbnZzID0gbmV3IE1hcDxzdHJpbmcsIEFjYz4oKTtcbiAgY29uc3QgYWNjRm9yID0gKGVudjogc3RyaW5nKTogQWNjID0+IHtcbiAgICBsZXQgYSA9IGVudnMuZ2V0KGVudik7XG4gICAgaWYgKCFhKSB7IGEgPSB7IGRlcGxveW1lbnRzOiAwLCBkZXBsb3lUaW1lRmFpbHVyZXM6IDAsIGF0dGVtcHRzOiAwLCBsZWFkR2FwczogW10gfTsgZW52cy5zZXQoZW52LCBhKTsgfVxuICAgIHJldHVybiBhO1xuICB9O1xuXG4gIC8vIEEgZGVwbG95IHJvdyBjb3VudHMgdG93YXJkIERGL0NGUi9sZWFkIG9ubHkgaWYgaXQgY29tcGxldGVkIGluc2lkZSBbZnJvbSx0b10uXG4gIC8vIExvb2stYmFjay1vbmx5IHJvd3MgKGluX3dpbmRvdz1mYWxzZSwga2VwdCBmb3IgaW5jaWRlbnQgY29ycmVsYXRpb24pIGFyZVxuICAvLyBza2lwcGVkIGhlcmUuIEFic2VudCBpbiBhIGZpeHR1cmUg4oeSIGluLXdpbmRvdyAodW5pdCB0ZXN0cyBvbWl0IHRoZSBmbGFnKS5cbiAgY29uc3QgaXNJbldpbmRvdyA9IChyb3c6IERlcGxveVJvdyk6IGJvb2xlYW4gPT5cbiAgICByb3cuaW5fd2luZG93ID09IG51bGwgPyB0cnVlIDogKHJvdy5pbl93aW5kb3cgPT09IHRydWUgfHwgcm93LmluX3dpbmRvdyA9PT0gJ3QnKTtcblxuICBmb3IgKGNvbnN0IHJvdyBvZiBkZXBsb3lSb3dzKSB7XG4gICAgY29uc3QgZW52ID0gcm93LmVudmlyb25tZW50O1xuICAgIGlmICghZW52KSBjb250aW51ZTtcbiAgICBpZiAoIWlzSW5XaW5kb3cocm93KSkgY29udGludWU7IC8vIGxvb2stYmFjay1vbmx5IHJvdyDihpIgY29ycmVsYXRpb24sIG5vdCBERi9DRlJcbiAgICBjb25zdCBhID0gYWNjRm9yKGVudik7XG4gICAgaWYgKHJvdy5zdGF0dXMgPT09ICdTVUNDRUVERUQnKSB7XG4gICAgICBhLmRlcGxveW1lbnRzKys7XG4gICAgICBhLmF0dGVtcHRzKys7XG4gICAgICAvLyBNZWFzdXJlZCBsZWFkIHRpbWU6IGRlcGxveSBjb21wbGV0aW9uIOKIkiBleGVjdXRpb24ncyBlYXJsaWVzdCBjb21taXQgdGltZS5cbiAgICAgIGlmIChyb3cuY29tbWl0X3RzICE9IG51bGwgJiYgcm93LmNvbXBsZXRlZF9hdCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGdhcCA9IChEYXRlLnBhcnNlKHJvdy5jb21wbGV0ZWRfYXQpIC0gRGF0ZS5wYXJzZShyb3cuY29tbWl0X3RzKSkgLyAxMDAwO1xuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGdhcCkpIGEubGVhZEdhcHMucHVzaChNYXRoLm1heChnYXAsIDApKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJvdy5zdGF0dXMgPT09ICdGQUlMRUQnKSB7XG4gICAgICBhLmRlcGxveVRpbWVGYWlsdXJlcysrO1xuICAgICAgYS5hdHRlbXB0cysrO1xuICAgIH1cbiAgfVxuXG4gIC8vIEluY2lkZW504oaSZGVwbG95IGNvcnJlbGF0aW9uIChQaGFzZSA1KS4gSW5kZXggdGhlIFNVQ0NFU1NGVUwgZGVwbG95cyBwZXIgZW52XG4gIC8vIChleGVjdXRpb24gaWQgKyBjb21wbGV0aW9uIGluc3RhbnQpLCBuZXdlc3QgZmlyc3QsIHNvIGVhY2ggaW5jaWRlbnQgY2FuIGJlXG4gIC8vIGF0dHJpYnV0ZWQgdG8gdGhlIG1vc3QgcmVjZW50IGRlcGxveSB0aGF0IGNvbXBsZXRlZCB3aXRoaW4gdGhlIHdpbmRvd1xuICAvLyBiZWZvcmUgaXQgb3BlbmVkLiBUaGF0IGV4ZWN1dGlvbiBpcyBhIHBvc3QtZGVwbG95IGZhaWx1cmUuXG4gIGNvbnN0IHdpbmRvd01zID0gd2luZG93SG91cnMgKiAzNjAwICogMTAwMDtcbiAgY29uc3Qgc3VjY2Vzc2Z1bEJ5RW52ID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PHsgZXhlYzogc3RyaW5nOyBjb21wbGV0ZWRNczogbnVtYmVyIH0+PigpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiBkZXBsb3lSb3dzKSB7XG4gICAgaWYgKHJvdy5zdGF0dXMgIT09ICdTVUNDRUVERUQnIHx8ICFyb3cuZW52aXJvbm1lbnQgfHwgcm93LmV4ZWN1dGlvbl9pZCA9PSBudWxsIHx8IHJvdy5jb21wbGV0ZWRfYXQgPT0gbnVsbCkgY29udGludWU7XG4gICAgY29uc3QgbXMgPSBEYXRlLnBhcnNlKHJvdy5jb21wbGV0ZWRfYXQpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG1zKSkgY29udGludWU7XG4gICAgY29uc3QgbGlzdCA9IHN1Y2Nlc3NmdWxCeUVudi5nZXQocm93LmVudmlyb25tZW50KSA/PyBbXTtcbiAgICBsaXN0LnB1c2goeyBleGVjOiByb3cuZXhlY3V0aW9uX2lkLCBjb21wbGV0ZWRNczogbXMgfSk7XG4gICAgc3VjY2Vzc2Z1bEJ5RW52LnNldChyb3cuZW52aXJvbm1lbnQsIGxpc3QpO1xuICB9XG4gIGZvciAoY29uc3QgbGlzdCBvZiBzdWNjZXNzZnVsQnlFbnYudmFsdWVzKCkpIGxpc3Quc29ydCgoYSwgYikgPT4gYi5jb21wbGV0ZWRNcyAtIGEuY29tcGxldGVkTXMpO1xuXG4gIC8qKiBDb3JyZWxhdGUgYW4gaW5jaWRlbnQgdG8gdGhlIG1vc3QgcmVjZW50IGluLXdpbmRvdyBzdWNjZXNzZnVsIGRlcGxveSBleGVjdXRpb24uICovXG4gIGNvbnN0IGNvcnJlbGF0ZSA9IChlbnY6IHN0cmluZywgb3BlbmVkTXM6IG51bWJlcik6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGxpc3QgPSBzdWNjZXNzZnVsQnlFbnYuZ2V0KGVudik7XG4gICAgaWYgKCFsaXN0KSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGNvbnN0IGQgb2YgbGlzdCkge1xuICAgICAgaWYgKGQuY29tcGxldGVkTXMgPD0gb3BlbmVkTXMgJiYgb3BlbmVkTXMgLSBkLmNvbXBsZXRlZE1zIDw9IHdpbmRvd01zKSByZXR1cm4gZC5leGVjO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvLyBDb3JyZWxhdGVkIGluY2lkZW50cyAoYWxsIGVudnMg4oaSIENGUjsgcHJvZHVjdGlvbiBzdWJzZXQg4oaSIE1UVFIpLiBFYWNoIGNhcnJpZXNcbiAgLy8gdGhlIGRlcGxveSBleGVjdXRpb24gaXQgYXR0cmlidXRlcyB0byArIGl0cyByZWFsIHJlY292ZXJ5IGdhcCAod2hlbiByZXNvbHZlZCkuXG4gIGludGVyZmFjZSBDb3JyZWxhdGVkSW5jaWRlbnQgeyBlbnZpcm9ubWVudDogc3RyaW5nOyBleGVjOiBzdHJpbmc7IHJlc29sdmVkR2FwOiBudW1iZXIgfCBudWxsIH1cbiAgY29uc3QgY29ycmVsYXRlZEluY2lkZW50czogQ29ycmVsYXRlZEluY2lkZW50W10gPSBbXTtcbiAgZm9yIChjb25zdCBpbmMgb2YgaW5jaWRlbnRSb3dzKSB7XG4gICAgaWYgKCFpbmMuZW52aXJvbm1lbnQgfHwgaW5jLm9wZW5lZF9hdCA9PSBudWxsKSBjb250aW51ZTtcbiAgICBjb25zdCBvcGVuZWRNcyA9IERhdGUucGFyc2UoaW5jLm9wZW5lZF9hdCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUob3BlbmVkTXMpKSBjb250aW51ZTtcbiAgICBjb25zdCBleGVjID0gY29ycmVsYXRlKGluYy5lbnZpcm9ubWVudCwgb3BlbmVkTXMpO1xuICAgIGlmIChleGVjID09IG51bGwpIGNvbnRpbnVlOyAvLyB1bmNvcnJlbGF0ZWQg4oaSIG5vdCBhdHRyaWJ1dGFibGUgdG8gYSBkZXBsb3lcbiAgICBsZXQgcmVzb2x2ZWRHYXA6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGlmIChpbmMucmVzb2x2ZWRfYXQgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWRNcyA9IERhdGUucGFyc2UoaW5jLnJlc29sdmVkX2F0KTtcbiAgICAgIC8vIFJpZ2h0LWNlbnNvcmluZzogYSByZXNvbHV0aW9uIEFGVEVSIHRoZSB3aW5kb3cgZW5kIChgdG9gKSBpcyBub3Qgb2JzZXJ2ZWRcbiAgICAgIC8vIHdpdGhpbiB0aGUgd2luZG93IOKAlCB0cmVhdCB0aGUgaW5jaWRlbnQgYXMgc3RpbGwgb3BlbiAoZ2FwIHN0YXlzIG51bGwpIHNvXG4gICAgICAvLyBNVFRSIG5ldmVyIHJlYWRzIHVuYm91bmRlZCBwYXN0IGB0b2AuIFRoZSBpbmNpZGVudCBzdGlsbCBjb3VudHMgdG93YXJkIHRoZVxuICAgICAgLy8gaW5jaWRlbnQgdG90YWwgKHVucmVzb2x2ZWQpLCBpdCBqdXN0IGNvbnRyaWJ1dGVzIG5vIHJlY292ZXJ5IHRpbWUuXG4gICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHJlc29sdmVkTXMpICYmIHJlc29sdmVkTXMgPD0gdG9Ncykge1xuICAgICAgICBjb25zdCBnID0gKHJlc29sdmVkTXMgLSBvcGVuZWRNcykgLyAxMDAwO1xuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGcpKSByZXNvbHZlZEdhcCA9IE1hdGgubWF4KGcsIDApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb3JyZWxhdGVkSW5jaWRlbnRzLnB1c2goeyBlbnZpcm9ubWVudDogaW5jLmVudmlyb25tZW50LCBleGVjLCByZXNvbHZlZEdhcCB9KTtcbiAgfVxuXG4gIC8vIFBvc3QtZGVwbG95IGZhaWx1cmVzIHBlciBlbnYg4oCUIHRoZSBESVNUSU5DVCBzZXQgb2YgZGVwbG95IGV4ZWN1dGlvbnMgZmxhZ2dlZFxuICAvLyBieSBhIG1hbnVhbCBgZmFpbGVkYCBvdXRjb21lIE9SIGEgY29ycmVsYXRlZCBpbmNpZGVudCAoZGVkdXBlZCBieSBleGVjdXRpb24sXG4gIC8vIHNvIGEgZGVwbG95IGZsYWdnZWQgYnkgYm90aCBjb3VudHMgb25jZSkuIEEgbWFudWFsIG91dGNvbWUgd2l0aG91dCBhblxuICAvLyBleGVjdXRpb24gaWQgKGxlZ2FjeS91bnJlc29sdmFibGUpIHN0aWxsIGNvdW50cyB2aWEgYSBwZXItcm93IHNlbnRpbmVsLlxuICBjb25zdCBwb3N0RGVwbG95RXhlY3NCeUVudiA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgbGV0IHNlbnRpbmVsID0gMDtcbiAgY29uc3QgZmxhZ0ZvciA9IChlbnY6IHN0cmluZyk6IFNldDxzdHJpbmc+ID0+IHtcbiAgICBsZXQgcyA9IHBvc3REZXBsb3lFeGVjc0J5RW52LmdldChlbnYpO1xuICAgIGlmICghcykgeyBzID0gbmV3IFNldDxzdHJpbmc+KCk7IHBvc3REZXBsb3lFeGVjc0J5RW52LnNldChlbnYsIHMpOyB9XG4gICAgcmV0dXJuIHM7XG4gIH07XG4gIGZvciAoY29uc3QgbyBvZiBvdXRjb21lUm93cykge1xuICAgIGlmIChvLm91dGNvbWUgIT09ICdmYWlsZWQnIHx8ICFvLmVudmlyb25tZW50KSBjb250aW51ZTtcbiAgICBmbGFnRm9yKG8uZW52aXJvbm1lbnQpLmFkZChvLmV4ZWN1dGlvbl9pZCA/PyBgbWFudWFsLSR7c2VudGluZWwrK31gKTtcbiAgICBhY2NGb3Ioby5lbnZpcm9ubWVudCk7IC8vIGVuc3VyZSBlbnYgYXBwZWFycyBldmVuIHdpdGggbm8gZGVwbG95IGV2ZW50c1xuICB9XG4gIGZvciAoY29uc3QgY2kgb2YgY29ycmVsYXRlZEluY2lkZW50cykge1xuICAgIGZsYWdGb3IoY2kuZW52aXJvbm1lbnQpLmFkZChjaS5leGVjKTtcbiAgICBhY2NGb3IoY2kuZW52aXJvbm1lbnQpOyAvLyBlbnN1cmUgZW52IGFwcGVhcnMgZXZlbiBpZiB0aGUgZGVwbG95IGlzIG91dC1vZi13aW5kb3dcbiAgfVxuICBjb25zdCBwb3N0RGVwbG95QnlFbnYgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtlbnYsIHNldF0gb2YgcG9zdERlcGxveUV4ZWNzQnlFbnYpIHBvc3REZXBsb3lCeUVudi5zZXQoZW52LCBzZXQuc2l6ZSk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRzOiBEb3JhRW52TWV0cmljc1tdID0gWy4uLmVudnMuZW50cmllcygpXVxuICAgIC8vIFRoZSBkZXBsb3kgYW5kIGluY2lkZW50IHNjYW5zIGFkbWl0IFBST0RVQ1RJT04gYWxvbmdzaWRlIGEgcmVxdWVzdGVkXG4gICAgLy8gZW52aXJvbm1lbnQgc28gTVRUUiBjYW4gY29ycmVsYXRlIHByb2R1Y3Rpb24gaW5jaWRlbnRzIChzZWVcbiAgICAvLyBgc2NhbkVudkNsYXVzZWApLiBUaGF0IHByb2R1Y3Rpb24gcm93IGlzIHBsdW1iaW5nIGZvciBNVFRSLCBub3Qgc29tZXRoaW5nXG4gICAgLy8gdGhlIGNhbGxlciBhc2tlZCB0byBzZWUg4oCUIHJlcG9ydCBvbmx5IHRoZSBlbnZpcm9ubWVudCB0aGF0IHdhcyByZXF1ZXN0ZWQuXG4gICAgLmZpbHRlcigoW2Vudmlyb25tZW50XSkgPT4gIWZpbHRlcnMuZW52aXJvbm1lbnQgfHwgZW52aXJvbm1lbnQgPT09IGZpbHRlcnMuZW52aXJvbm1lbnQpXG4gICAgLm1hcCgoW2Vudmlyb25tZW50LCBhXSkgPT4ge1xuICAgICAgY29uc3QgcG9zdERlcGxveUZhaWx1cmVzID0gcG9zdERlcGxveUJ5RW52LmdldChlbnZpcm9ubWVudCkgPz8gMDtcbiAgICAgIGNvbnN0IHJhd1BlckRheSA9IGEuZGVwbG95bWVudHMgLyBkYXlzO1xuICAgICAgY29uc3QgbnVtZXJhdG9yID0gYS5kZXBsb3lUaW1lRmFpbHVyZXMgKyBwb3N0RGVwbG95RmFpbHVyZXM7XG4gICAgICAvLyBDbGFtcCB0byBbMCwxMDBdOiBwb3N0LWRlcGxveSBmYWlsdXJlcyBjYW4gY29ycmVsYXRlIHRvIGEgZGVwbG95IHRoYXRcbiAgICAgIC8vIGNvbXBsZXRlZCBqdXN0IGJlZm9yZSB0aGUgd2luZG93IChrZXB0IGZvciBjb3JyZWxhdGlvbiksIHNvIHRoZSBudW1lcmF0b3JcbiAgICAgIC8vIGNhbiB0cmFuc2llbnRseSBleGNlZWQgaW4td2luZG93IGF0dGVtcHRzIOKAlCBhIENGUiA+IDEwMCUgaXMgbmV2ZXIgdmFsaWQuXG4gICAgICBjb25zdCByYXdSYXRlID0gYS5hdHRlbXB0cyA+IDAgPyBNYXRoLm1pbigxMDAsIChudW1lcmF0b3IgLyBhLmF0dGVtcHRzKSAqIDEwMCkgOiAwO1xuICAgICAgY29uc3QgbHRNZWRpYW4gPSBtZWRpYW4oYS5sZWFkR2Fwcyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgZGVwbG95bWVudEZyZXF1ZW5jeToge1xuICAgICAgICAgIGRlcGxveW1lbnRzOiBhLmRlcGxveW1lbnRzLFxuICAgICAgICAgIHBlckRheTogcm91bmQocmF3UGVyRGF5LCAyKSxcbiAgICAgICAgICBsZXZlbDogZG9yYUxldmVsRm9yRnJlcXVlbmN5KHJhd1BlckRheSwgYS5kZXBsb3ltZW50cyksXG4gICAgICAgIH0sXG4gICAgICAgIGNoYW5nZUZhaWx1cmVSYXRlOiB7XG4gICAgICAgICAgcmF0ZTogcm91bmQocmF3UmF0ZSwgMSksXG4gICAgICAgICAgZGVwbG95VGltZUZhaWx1cmVzOiBhLmRlcGxveVRpbWVGYWlsdXJlcyxcbiAgICAgICAgICBwb3N0RGVwbG95RmFpbHVyZXMsXG4gICAgICAgICAgYXR0ZW1wdHM6IGEuYXR0ZW1wdHMsXG4gICAgICAgICAgbGV2ZWw6IGRvcmFMZXZlbEZvckNoYW5nZUZhaWx1cmUocmF3UmF0ZSwgYS5hdHRlbXB0cyksXG4gICAgICAgIH0sXG4gICAgICAgIGxlYWRUaW1lOiB7XG4gICAgICAgICAgZGVwbG95bWVudHM6IGEubGVhZEdhcHMubGVuZ3RoLFxuICAgICAgICAgIG1lZGlhblNlY29uZHM6IGx0TWVkaWFuICE9IG51bGwgPyByb3VuZChsdE1lZGlhbiwgMSkgOiBudWxsLFxuICAgICAgICAgIGxldmVsOiBkb3JhTGV2ZWxGb3JMZWFkVGltZShsdE1lZGlhbiksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pXG4gICAgLnNvcnQoKHgsIHkpID0+IHtcbiAgICAgIGlmICh4LmVudmlyb25tZW50ID09PSBIRUFETElORV9FTlYpIHJldHVybiAtMTtcbiAgICAgIGlmICh5LmVudmlyb25tZW50ID09PSBIRUFETElORV9FTlYpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIHguZW52aXJvbm1lbnQubG9jYWxlQ29tcGFyZSh5LmVudmlyb25tZW50KTtcbiAgICB9KTtcblxuICAvLyBNVFRSIOKAlCBQUk9EVUNUSU9OLU9OTFksIGZyb20gQk9USCBzb3VyY2VzLiBJbmNpZGVudHMgdGFrZSBwcmVjZWRlbmNlOiBhXG4gIC8vIHByb2R1Y3Rpb24gaW5jaWRlbnQgY29ycmVsYXRlZCB0byBhIGRlcGxveSBjb250cmlidXRlcyB0aGUgcmVhbCByZWNvdmVyeVxuICAvLyAoYHJlc29sdmVkX2F0IOKIkiBvcGVuZWRfYXRgKSwgYW5kIGFueSBtYW51YWwgb3V0Y29tZSBvbiB0aGUgU0FNRSBkZXBsb3kgaXNcbiAgLy8gc2tpcHBlZC4gTWFudWFsIG91dGNvbWVzIG9uIG90aGVyIGRlcGxveXMga2VlcCB0aGUgUGhhc2UtMiBiZWhhdmlvclxuICAvLyAoYGZhaWxlZGAg4oaSIGFuIGluY2lkZW50OyBgcmVzdG9yZWRgIOKGkiBhIHJlY292ZXJ5IGdhcCBvZiBgcmVzdG9yZWQg4oiSIGRlcGxveWVkYCkuXG4gIGxldCBpbmNpZGVudHMgPSAwLCByZXN0b3JlZCA9IDA7XG4gIGNvbnN0IG10dHJHYXBzOiBudW1iZXJbXSA9IFtdO1xuICAvLyBFeGVjdXRpb25zIGFscmVhZHkgYXR0cmlidXRlZCB0byBhIHByb2R1Y3Rpb24gaW5jaWRlbnQgKHByZWNlZGVuY2UgZ3VhcmQpLlxuICBjb25zdCBpbmNpZGVudEV4ZWNzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgY2kgb2YgY29ycmVsYXRlZEluY2lkZW50cykge1xuICAgIGlmIChjaS5lbnZpcm9ubWVudCAhPT0gSEVBRExJTkVfRU5WKSBjb250aW51ZTsgLy8gTVRUUiBpcyBwcm9kdWN0aW9uLW9ubHlcbiAgICBpbmNpZGVudHMrKztcbiAgICBpbmNpZGVudEV4ZWNzLmFkZChjaS5leGVjKTtcbiAgICBpZiAoY2kucmVzb2x2ZWRHYXAgIT0gbnVsbCkgeyByZXN0b3JlZCsrOyBtdHRyR2Fwcy5wdXNoKGNpLnJlc29sdmVkR2FwKTsgfVxuICB9XG4gIGZvciAoY29uc3QgbSBvZiBtdHRyUm93cykge1xuICAgIC8vIEluY2lkZW50IHByZWNlZGVuY2U6IGRvbid0IGRvdWJsZS1jb3VudCBhIGRlcGxveSBhbHJlYWR5IGZsYWdnZWQgYnkgYW4gaW5jaWRlbnQuXG4gICAgaWYgKG0uZXhlY3V0aW9uX2lkICE9IG51bGwgJiYgaW5jaWRlbnRFeGVjcy5oYXMobS5leGVjdXRpb25faWQpKSBjb250aW51ZTtcbiAgICBpZiAobS5vdXRjb21lID09PSAnZmFpbGVkJykgeyBpbmNpZGVudHMrKzsgY29udGludWU7IH1cbiAgICBpZiAobS5vdXRjb21lID09PSAncmVzdG9yZWQnKSB7XG4gICAgICByZXN0b3JlZCsrO1xuICAgICAgaWYgKG0ucmVzdG9yZWRfYXQgIT0gbnVsbCAmJiBtLmRlcGxveWVkX2F0ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZ2FwID0gKERhdGUucGFyc2UobS5yZXN0b3JlZF9hdCkgLSBEYXRlLnBhcnNlKG0uZGVwbG95ZWRfYXQpKSAvIDEwMDA7XG4gICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoZ2FwKSkgbXR0ckdhcHMucHVzaChNYXRoLm1heChnYXAsIDApKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbXR0ck1lZGlhbiA9IG1lZGlhbihtdHRyR2Fwcyk7XG5cbiAgY29uc3QgcmVnaXN0ZXJlZCA9IE51bWJlcihjb3ZlcmFnZVJvdz8ucmVnaXN0ZXJlZCkgfHwgMDtcbiAgY29uc3QgZGVwbG95aW5nID0gTnVtYmVyKGNvdmVyYWdlUm93Py5kZXBsb3lpbmcpIHx8IDA7XG5cbiAgcmV0dXJuIHtcbiAgICB3aW5kb3c6IHsgZnJvbSwgdG8gfSxcbiAgICBmaWx0ZXJzOiB7IHBpcGVsaW5lSWQ6IGZpbHRlcnMucGlwZWxpbmVJZCA/PyBudWxsLCBlbnZpcm9ubWVudDogZmlsdGVycy5lbnZpcm9ubWVudCA/PyBudWxsIH0sXG4gICAgaGVhZGxpbmU6IEhFQURMSU5FX0VOVixcbiAgICBlbnZpcm9ubWVudHMsXG4gICAgbWVhblRpbWVUb1Jlc3RvcmU6IHtcbiAgICAgIGluY2lkZW50cyxcbiAgICAgIHJlc3RvcmVkLFxuICAgICAgbWVkaWFuU2Vjb25kczogbXR0ck1lZGlhbiAhPSBudWxsID8gcm91bmQobXR0ck1lZGlhbiwgMSkgOiBudWxsLFxuICAgICAgbGV2ZWw6IGRvcmFMZXZlbEZvclJlc3RvcmUobXR0ck1lZGlhbiksXG4gICAgfSxcbiAgICBjb3ZlcmFnZToge1xuICAgICAgcmVnaXN0ZXJlZCxcbiAgICAgIGRlcGxveWluZyxcbiAgICAgIHdpdGhvdXREZXBsb3lzOiBNYXRoLm1heChyZWdpc3RlcmVkIC0gZGVwbG95aW5nLCAwKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIDEuOWIgRE9SQSB0cmVuZCDigJQgZGVwbG95bWVudCBmcmVxdWVuY3kgKyBkZXBsb3ktdGltZSBjaGFuZ2UtZmFpbHVyZSByYXRlXG4gKiBidWNrZXRlZCBieSBgaW50ZXJ2YWxgIChkYXkvd2Vlay9tb250aCkgZm9yIGEgc3BhcmtsaW5lLiBEZXBsb3ktYmFzaXMgbGlrZVxuICogZ2V0RG9yYU1ldHJpY3M6IGJ1Y2tldHMgdGVybWluYWwgZGVwbG95LXN0YWdlIGV4ZWN1dGlvbnMgb24gdGhlaXJcbiAqIGBjb21wbGV0ZWRfYXRgLiBTaGFyZXMgdGhlIG9yZy9yb2xsdXAgKyBwaXBlbGluZUlkL2Vudmlyb25tZW50IHNjb3BpbmcuIE1UVFIsXG4gKiBsZWFkIHRpbWUsIGFuZCBwb3N0LWRlcGxveSBDRlIgYXJlIGludGVudGlvbmFsbHkgb21pdHRlZCAodG9vIGhlYXZ5IHRvIGJ1Y2tldCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREb3JhVHJlbmQoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIGludGVydmFsOiBzdHJpbmcsXG4gIGZyb206IHN0cmluZyxcbiAgdG86IHN0cmluZyxcbiAgb3JnSWRzPzogc3RyaW5nW10sXG4gIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPERvcmFUcmVuZFBvaW50W10+IHtcbiAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSBvcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgY29uc3QgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCB9ID0gb3B0cztcbiAgY29uc3QgcGlwZWxpbmVDbGF1c2UgPSBwaXBlbGluZUlkID8gc3FsYEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfWAgOiBzcWxgYDtcbiAgY29uc3QgZW52Q2xhdXNlID0gZW52aXJvbm1lbnQgPyBzcWxgQU5EIGUuZW52aXJvbm1lbnQgPSAke2Vudmlyb25tZW50fWAgOiBzcWxgYDtcbiAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgV0lUSCBkZXBsb3lzIEFTIChcbiAgICAgICAgLS0gUEVSLUVYRUNVVElPTiBkZXBsb3kgdW5pdCAoRDEpOiBvbmUgcm93IHBlciAoZW52aXJvbm1lbnQsIGV4ZWN1dGlvbiksXG4gICAgICAgIC0tIGV2ZXJ5IGRlcGxveSBTVEFHRSB0byB0aGF0IGVudiB3aXRoaW4gdGhlIGV4ZWN1dGlvbiByb2xsZWQgdXAgdG8gYVxuICAgICAgICAtLSBzaW5nbGUgdGVybWluYWwgc3RhdHVzIOKAlCBOT1Qgb25lIHJvdyBwZXIgc3RhZ2UuXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7dGVybWluYWxTdGF0dXNSb2xsdXB9IEFTIHN0YXR1cyxcbiAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEFTIGNvbXBsZXRlZF9hdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmVudmlyb25tZW50IElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtwaXBlbGluZUNsYXVzZX0gJHtlbnZDbGF1c2V9XG4gICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLmNvbXBsZXRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5lbnZpcm9ubWVudCwgZS5leGVjdXRpb25faWRcbiAgICAgIClcbiAgICAgIFNFTEVDVFxuICAgICAgICBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCBjb21wbGV0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBkZXBsb3ltZW50cyxcbiAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAtLSBxdW90ZWQgYWxpYXMgc28gdGhlIHJhdyByb3cga2V5IGlzIGV4YWN0bHkgdGhlIERvcmFUcmVuZFBvaW50IGZpZWxkXG4gICAgICAgIENPQUxFU0NFKFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ0ZBSUxFRCcpOjpudW1lcmljXG4gICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJykpLCAwKSAqIDEwMCwgMSksIDApOjpmbG9hdCBBUyBcImNoYW5nZUZhaWx1cmVQY3RcIlxuICAgICAgRlJPTSBkZXBsb3lzXG4gICAgICBHUk9VUCBCWSBwZXJpb2QgT1JERVIgQlkgcGVyaW9kXG4gICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPERvcmFUcmVuZFBvaW50PihyLnJvd3MpKSk7XG4gIGNvbnN0IGtleSA9IGAke29yZ0lkfTpkb3JhLXRyZW5kOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b306JHtwaXBlbGluZUlkID8/ICcnfToke2Vudmlyb25tZW50ID8/ICcnfWA7XG4gIHJldHVybiBydW5SZXBvcnQoa2V5LCBtdWx0aSwgZXhlYyk7XG59XG5cbi8qKlxuICogMS4xMCBQZXItcGlwZWxpbmUgQlVJTEQgSEVBTFRIIChQaGFzZSA2KSDigJQgYSBzdGFuZGFyZCAoTk9UIGBhZHZhbmNlZF9yZXBvcnRpbmdgKVxuICogcGVyLXN0YWdlIGJyZWFrZG93biBmb3Igb25lIHBpcGVsaW5lIG92ZXIgYSBbZnJvbSx0b10gd2luZG93LiBBZ2dyZWdhdGVzIHRoZVxuICogZXhpc3RpbmcgYHBpcGVsaW5lX2V2ZW50c2AgU1RBR0Ugcm93czogZWFjaCBzdGFnZSBpcyByb2xsZWQgdXAgcGVyIGV4ZWN1dGlvblxuICogdG8gYSB0ZXJtaW5hbCBzdGF0dXMgKEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCkgKyBpdHMgbWF4IGR1cmF0aW9uLCB0aGVuXG4gKiBncm91cGVkIHBlciBzdGFnZSBpbnRvIHJ1bi9zdWNjZXNzL2ZhaWx1cmUgY291bnRzLCBhIHN1Y2Nlc3MgcmF0ZSwgYW5kXG4gKiBkdXJhdGlvbiBwZXJjZW50aWxlcyAocDUwL3A5MC9wOTkpLiBUb3RhbHMgc3VtIGFjcm9zcyBzdGFnZXMuIE9yZy1zY29wZWQgdmlhXG4gKiB0aGUgcGlwZWxpbmUgam9pbiAoYHAub3JnX2lkICR7cHJlZH1gKSArIHJvbGx1cC1hd2FyZSBsaWtlIHRoZSBzaWJsaW5nIHJlcG9ydHM7XG4gKiBhIHBpcGVsaW5lSWQgb3duZWQgYnkgYW5vdGhlciBvcmcgcmV0dXJucyBhbiBlbXB0eSBicmVha2Rvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCdWlsZEhlYWx0aChcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcGlwZWxpbmVJZDogc3RyaW5nLFxuICBmcm9tOiBzdHJpbmcsXG4gIHRvOiBzdHJpbmcsXG4gIG9yZ0lkcz86IHN0cmluZ1tdLFxuKTogUHJvbWlzZTxCdWlsZEhlYWx0aD4ge1xuICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSBvcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICBjb25zdCByb3dzID0gZHJpenpsZVJvd3M8QnVpbGRIZWFsdGhTdGFnZT4oKGF3YWl0IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgV0lUSCBzdGFnZV9ydW5zIEFTIChcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lIEFTIHN0YWdlLFxuICAgICAgICAgICR7dGVybWluYWxTdGF0dXNSb2xsdXB9IEFTIHN0YXR1cyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcykgQVMgZHVyYXRpb25fbXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH1cbiAgICAgICAgICBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5zdGFnZV9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLnN0YWdlX25hbWUsIGUuZXhlY3V0aW9uX2lkXG4gICAgICApXG4gICAgICBTRUxFQ1RcbiAgICAgICAgc3RhZ2UsXG4gICAgICAgIENPVU5UKCopOjppbnQgQVMgcnVucyxcbiAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBzdWNjZXNzZXMsXG4gICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbHVyZXMsXG4gICAgICAgIENPQUxFU0NFKFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjpudW1lcmljXG4gICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKSwgMCk6OmZsb2F0IEFTIFwic3VjY2Vzc1JhdGVcIixcbiAgICAgICAgUEVSQ0VOVElMRV9DT05UKDAuNSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBkdXJhdGlvbl9tcyk6OmludCBBUyBcInA1ME1zXCIsXG4gICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjkpIFdJVEhJTiBHUk9VUCAoT1JERVIgQlkgZHVyYXRpb25fbXMpOjppbnQgQVMgXCJwOTBNc1wiLFxuICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC45OSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBkdXJhdGlvbl9tcyk6OmludCBBUyBcInA5OU1zXCJcbiAgICAgIEZST00gc3RhZ2VfcnVuc1xuICAgICAgV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpXG4gICAgICBHUk9VUCBCWSBzdGFnZVxuICAgICAgT1JERVIgQlkgcnVucyBERVNDLCBzdGFnZVxuICAgIGApKS5yb3dzKTtcblxuICAgIC8vIFRvdGFscyBzdW0gYWNyb3NzIHN0YWdlcyAodG90YWwgc3RhZ2UtcnVucyAvIHN0YWdlLWZhaWx1cmVzIGluIHRoZSB3aW5kb3cpLlxuICAgIGxldCBydW5zID0gMCwgZmFpbHVyZXMgPSAwO1xuICAgIGZvciAoY29uc3QgcyBvZiByb3dzKSB7IHJ1bnMgKz0gcy5ydW5zOyBmYWlsdXJlcyArPSBzLmZhaWx1cmVzOyB9XG4gICAgY29uc3QgZmFpbHVyZVJhdGUgPSBydW5zID4gMCA/IHJvdW5kKChmYWlsdXJlcyAvIHJ1bnMpICogMTAwLCAxKSA6IDA7XG4gICAgcmV0dXJuIHsgc3RhZ2VzOiByb3dzLCB0b3RhbHM6IHsgcnVucywgZmFpbHVyZXMsIGZhaWx1cmVSYXRlIH0gfTtcbiAgfSk7XG4gIHJldHVybiBydW5SZXBvcnQoYCR7b3JnSWR9OmJ1aWxkLWhlYWx0aDoke3BpcGVsaW5lSWR9OiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG59XG5cbi8vIOKUgOKUgCBDYXRlZ29yeSAyOiBQbHVnaW4gSW52ZW50b3J5ICYgQnVpbGRzIOKUgOKUgFxuXG4vKiogMi4xIFBsdWdpbiBzdW1tYXJ5IOKAlCBjb3VudHMgYW5kIGJyZWFrZG93bnMuXG4gKiAgSU5URU5USU9OQUxMWSBTSU5HTEUtT1JHIChubyByb2xsdXApOiBwbHVnaW4gaW52ZW50b3J5IGlzIGFuIG9yZy1vd25lZFxuICogIGFzc2V0IGNvdW50LCBub3QgYW4gZXhlY3V0aW9uL2J1aWxkIGFjdGl2aXR5IHJlcG9ydCwgc28gYSBwYXJlbnQncyB2aWV3IGlzXG4gKiAgaXRzIG93biBwbHVnaW5zIOKAlCB0ZWFtcyBtYW5hZ2UgdGhlaXIgb3duIGludmVudG9yeS4gU2luZ2xlIGA9ICRvcmdgIHNjb3BlLiAqL1xuIl19
|