@pipeline-builder/pipeline-manager 3.4.88 → 3.4.89

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.
@@ -0,0 +1,9 @@
1
+ import type { TargetSpec } from './targets.js';
2
+ export interface PortCheck {
3
+ readonly service: string;
4
+ readonly port: number;
5
+ readonly available: boolean;
6
+ }
7
+ /** Probe every host port a target binds; returns one PortCheck per port. */
8
+ export declare function checkHostPorts(spec: TargetSpec): Promise<PortCheck[]>;
9
+ //# sourceMappingURL=ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/agent/ports.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAwBD,4EAA4E;AAC5E,wBAAsB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAI3E"}
@@ -0,0 +1,35 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Host-port pre-flight. Local (Docker-published) and minikube (kubectl
5
+ * port-forward) deploys bind fixed ports on the operator's machine; if one is
6
+ * already taken, the container/forward fails to bind — and for the gateway that
7
+ * surfaces as a silent "/health never reachable" hang. We probe the ports up
8
+ * front so provision can stop with a clear summary instead of failing mid-deploy.
9
+ */
10
+ import net from 'net';
11
+ /** Try to bind <host>:<port>; true if free, false on EADDRINUSE/EACCES. */
12
+ function canBind(port, host) {
13
+ return new Promise((resolve) => {
14
+ const srv = net.createServer();
15
+ srv.once('error', () => resolve(false));
16
+ srv.once('listening', () => srv.close(() => resolve(true)));
17
+ srv.listen(port, host);
18
+ });
19
+ }
20
+ /**
21
+ * Is `port` free? Probes BOTH interfaces the deploy paths bind: `0.0.0.0` (Docker
22
+ * publishes `0.0.0.0:<port>`) and `127.0.0.1` (kubectl port-forward, Docker Desktop
23
+ * localhost). A holder on either makes the matching bind fail, so requiring both to
24
+ * succeed catches the real conflict (e.g. macOS AirPlay on 5000) without
25
+ * SO_REUSEADDR false-negatives.
26
+ */
27
+ async function isPortFree(port) {
28
+ const [allIfaces, loopback] = await Promise.all([canBind(port, '0.0.0.0'), canBind(port, '127.0.0.1')]);
29
+ return allIfaces && loopback;
30
+ }
31
+ /** Probe every host port a target binds; returns one PortCheck per port. */
32
+ export async function checkHostPorts(spec) {
33
+ return Promise.all(spec.hostPorts.map(async ({ service, port }) => ({ service, port, available: await isPortFree(port) })));
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWdlbnQvcG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7O0dBTUc7QUFFSCxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFTdEIsMkVBQTJFO0FBQzNFLFNBQVMsT0FBTyxDQUFDLElBQVksRUFBRSxJQUFZO0lBQ3pDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM3QixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDL0IsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDeEMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILEtBQUssVUFBVSxVQUFVLENBQUMsSUFBWTtJQUNwQyxNQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEcsT0FBTyxTQUFTLElBQUksUUFBUSxDQUFDO0FBQy9CLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsSUFBZ0I7SUFDbkQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDeEcsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBIb3N0LXBvcnQgcHJlLWZsaWdodC4gTG9jYWwgKERvY2tlci1wdWJsaXNoZWQpIGFuZCBtaW5pa3ViZSAoa3ViZWN0bFxuICogcG9ydC1mb3J3YXJkKSBkZXBsb3lzIGJpbmQgZml4ZWQgcG9ydHMgb24gdGhlIG9wZXJhdG9yJ3MgbWFjaGluZTsgaWYgb25lIGlzXG4gKiBhbHJlYWR5IHRha2VuLCB0aGUgY29udGFpbmVyL2ZvcndhcmQgZmFpbHMgdG8gYmluZCDigJQgYW5kIGZvciB0aGUgZ2F0ZXdheSB0aGF0XG4gKiBzdXJmYWNlcyBhcyBhIHNpbGVudCBcIi9oZWFsdGggbmV2ZXIgcmVhY2hhYmxlXCIgaGFuZy4gV2UgcHJvYmUgdGhlIHBvcnRzIHVwXG4gKiBmcm9udCBzbyBwcm92aXNpb24gY2FuIHN0b3Agd2l0aCBhIGNsZWFyIHN1bW1hcnkgaW5zdGVhZCBvZiBmYWlsaW5nIG1pZC1kZXBsb3kuXG4gKi9cblxuaW1wb3J0IG5ldCBmcm9tICduZXQnO1xuaW1wb3J0IHR5cGUgeyBUYXJnZXRTcGVjIH0gZnJvbSAnLi90YXJnZXRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQb3J0Q2hlY2sge1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgYXZhaWxhYmxlOiBib29sZWFuO1xufVxuXG4vKiogVHJ5IHRvIGJpbmQgPGhvc3Q+Ojxwb3J0PjsgdHJ1ZSBpZiBmcmVlLCBmYWxzZSBvbiBFQUREUklOVVNFL0VBQ0NFUy4gKi9cbmZ1bmN0aW9uIGNhbkJpbmQocG9ydDogbnVtYmVyLCBob3N0OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc3J2ID0gbmV0LmNyZWF0ZVNlcnZlcigpO1xuICAgIHNydi5vbmNlKCdlcnJvcicsICgpID0+IHJlc29sdmUoZmFsc2UpKTtcbiAgICBzcnYub25jZSgnbGlzdGVuaW5nJywgKCkgPT4gc3J2LmNsb3NlKCgpID0+IHJlc29sdmUodHJ1ZSkpKTtcbiAgICBzcnYubGlzdGVuKHBvcnQsIGhvc3QpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJcyBgcG9ydGAgZnJlZT8gUHJvYmVzIEJPVEggaW50ZXJmYWNlcyB0aGUgZGVwbG95IHBhdGhzIGJpbmQ6IGAwLjAuMC4wYCAoRG9ja2VyXG4gKiBwdWJsaXNoZXMgYDAuMC4wLjA6PHBvcnQ+YCkgYW5kIGAxMjcuMC4wLjFgIChrdWJlY3RsIHBvcnQtZm9yd2FyZCwgRG9ja2VyIERlc2t0b3BcbiAqIGxvY2FsaG9zdCkuIEEgaG9sZGVyIG9uIGVpdGhlciBtYWtlcyB0aGUgbWF0Y2hpbmcgYmluZCBmYWlsLCBzbyByZXF1aXJpbmcgYm90aCB0b1xuICogc3VjY2VlZCBjYXRjaGVzIHRoZSByZWFsIGNvbmZsaWN0IChlLmcuIG1hY09TIEFpclBsYXkgb24gNTAwMCkgd2l0aG91dFxuICogU09fUkVVU0VBRERSIGZhbHNlLW5lZ2F0aXZlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNQb3J0RnJlZShwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgW2FsbElmYWNlcywgbG9vcGJhY2tdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2NhbkJpbmQocG9ydCwgJzAuMC4wLjAnKSwgY2FuQmluZChwb3J0LCAnMTI3LjAuMC4xJyldKTtcbiAgcmV0dXJuIGFsbElmYWNlcyAmJiBsb29wYmFjaztcbn1cblxuLyoqIFByb2JlIGV2ZXJ5IGhvc3QgcG9ydCBhIHRhcmdldCBiaW5kczsgcmV0dXJucyBvbmUgUG9ydENoZWNrIHBlciBwb3J0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrSG9zdFBvcnRzKHNwZWM6IFRhcmdldFNwZWMpOiBQcm9taXNlPFBvcnRDaGVja1tdPiB7XG4gIHJldHVybiBQcm9taXNlLmFsbChcbiAgICBzcGVjLmhvc3RQb3J0cy5tYXAoYXN5bmMgKHsgc2VydmljZSwgcG9ydCB9KSA9PiAoeyBzZXJ2aWNlLCBwb3J0LCBhdmFpbGFibGU6IGF3YWl0IGlzUG9ydEZyZWUocG9ydCkgfSkpLFxuICApO1xufVxuIl19
@@ -47,6 +47,16 @@ export interface TargetSpec {
47
47
  readonly deploys: string;
48
48
  /** What a teardown of this target destroys — shown before a (gated) teardown. */
49
49
  readonly destroys: string;
50
+ /**
51
+ * Host ports the deploy binds (Docker-published for local, kubectl port-forwards
52
+ * for minikube). Checked up front — a conflict means a container/forward can't
53
+ * bind and silently fails. Mirror deploy/<target>'s compose/setup.sh. Empty for
54
+ * remote targets (ec2/fargate bind nothing on the operator's machine).
55
+ */
56
+ readonly hostPorts: readonly {
57
+ service: string;
58
+ port: number;
59
+ }[];
50
60
  }
51
61
  export declare const TARGETS: Readonly<Record<TargetId, TargetSpec>>;
52
62
  export declare const TARGET_IDS: readonly TargetId[];
@@ -1 +1 @@
1
- {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../../src/agent/targets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../../src/agent/targets.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,15 @@ export const TARGETS = {
34
34
  bestFor: 'Development',
35
35
  deploys: 'the platform as a Docker Compose stack — an nginx TLS proxy, the API services (platform, plugin, pipeline, message, reporting, compliance, quota, billing, image-registry), the frontend, and postgres + mongo + redis. First run pulls the ghcr.io images and generates a local TLS cert (a few minutes).',
36
36
  destroys: 'stops all containers — data under deploy/local/data persists on disk (delete it manually for a clean slate)',
37
+ // Mirrors the published ports in deploy/local/docker-compose.yml.
38
+ hostPorts: [
39
+ { service: 'nginx — HTTPS gateway (UI/API)', port: 8443 },
40
+ { service: 'nginx — HTTP redirect', port: 8080 },
41
+ { service: 'pgAdmin (Postgres UI)', port: 5480 },
42
+ { service: 'Mongo Express (Mongo UI)', port: 27081 },
43
+ { service: 'Docker registry', port: 5000 },
44
+ { service: 'Jaeger (tracing UI)', port: 16686 },
45
+ ],
37
46
  },
38
47
  minikube: {
39
48
  id: 'minikube',
@@ -48,6 +57,12 @@ export const TARGETS = {
48
57
  bestFor: 'Local Kubernetes',
49
58
  deploys: 'the platform onto a local Minikube cluster — the same services as Kubernetes Deployments/Services behind an ingress, plus in-cluster postgres + mongo + redis. First run pulls images, builds the cluster, and generates a TLS cert (several minutes).',
50
59
  destroys: 'stops the minikube stack — persistent volumes (PVC data) remain until the cluster is deleted',
60
+ // Mirrors the kubectl port-forwards started in deploy/minikube/bin/setup.sh.
61
+ hostPorts: [
62
+ { service: 'nginx — HTTPS gateway (UI/API)', port: 8443 },
63
+ { service: 'Mongo Express (Mongo UI)', port: 8081 },
64
+ { service: 'pgAdmin (Postgres UI)', port: 5480 },
65
+ ],
51
66
  },
52
67
  ec2: {
53
68
  id: 'ec2',
@@ -62,6 +77,7 @@ export const TARGETS = {
62
77
  bestFor: 'Dev / staging',
63
78
  deploys: 'the platform on a single EC2 instance via CloudFormation — a VPC, the instance (running the Minikube stack), an ALB, a Route 53 record + ACM cert for the domain, and (by default) SES email. The instance pulls images on first boot.',
64
79
  destroys: 'DELETES the CloudFormation stack: the VPC, EC2 instance, and its EBS data volume (databases, registry, plugin builds). Irreversible.',
80
+ hostPorts: [], // remote (AWS) — binds nothing on the operator's machine
65
81
  },
66
82
  fargate: {
67
83
  id: 'fargate',
@@ -76,6 +92,7 @@ export const TARGETS = {
76
92
  bestFor: 'Production',
77
93
  deploys: 'the platform on serverless ECS Fargate via 6 CloudFormation stacks — a VPC, an ALB, the ECS services, EFS-backed databases + registry, Route 53 + ACM for the domain, and (by default) SES email. Secrets are generated into Secrets Manager first.',
78
94
  destroys: 'DELETES all pb-* CloudFormation stacks: EFS data, databases, and registry. Secrets Manager entries are NOT auto-deleted. Irreversible.',
95
+ hostPorts: [], // remote (AWS) — binds nothing on the operator's machine
79
96
  },
80
97
  };
81
98
  export const TARGET_IDS = ['local', 'minikube', 'ec2', 'fargate'];
@@ -181,4 +198,4 @@ export function teardownCommand(target, opts = {}) {
181
198
  }
182
199
  }
183
200
  }
184
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZ2VudC90YXJnZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUF3RHRDLCtFQUErRTtBQUUvRSxNQUFNLE1BQU0sR0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsdURBQXVELEVBQUUsQ0FBQztBQUNsSSxNQUFNLFdBQVcsR0FBYyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSw2REFBNkQsRUFBRSxDQUFDO0FBQzNKLE1BQU0sVUFBVSxHQUFjLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxzRUFBc0UsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUssTUFBTSxNQUFNLEdBQWMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ3ZGLE1BQU0sV0FBVyxHQUFjLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSw2REFBNkQsRUFBRSxDQUFDO0FBQ3RKLE1BQU0sUUFBUSxHQUFjLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxnRkFBZ0YsRUFBRSxDQUFDO0FBQ2hLLE1BQU0sYUFBYSxHQUFjLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSx3Q0FBd0MsRUFBRSxDQUFDO0FBRXZJLDhFQUE4RTtBQUM5RSxrRkFBa0Y7QUFDbEYsb0JBQW9CO0FBQ3BCLE1BQU0sS0FBSyxHQUF5QjtJQUNsQyxFQUFFLElBQUks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QUFJLENBQUMsU0FBUyxJQUFJLGlCQUFpQixDQUFDO1lBQ2xELE9BQU87Z0JBQ0wsT0FBTyxFQUNMLGdEQUFnRCxLQUFLLGFBQWEsTUFBTSxNQUFNO29CQUM5RSw4REFBOEQsS0FBSyxhQUFhLE1BQU0sRUFBRTtnQkFDMUYsV0FBVyxFQUFFLElBQUk7YUFDbEIsQ0FBQztRQUNKLENBQUM7UUFDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDZixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLHNCQUFzQixDQUFDO1lBQ3hELE9BQU87Z0JBQ0wsT0FBTyxFQUNMLGdFQUFnRSxNQUFNLGFBQWEsTUFBTSxFQUFFO29CQUMzRixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxXQUFXLEVBQUUsSUFBSTthQUNsQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogRGV0ZXJtaW5pc3RpYyByZWdpc3RyeSBvZiBwbGF0Zm9ybSBkZXBsb3kgdGFyZ2V0cyDigJQgdGhlIHNvdXJjZSBvZiB0cnV0aCB0aGVcbiAqIGBwcm92aXNpb25gIGFkdmlzb3IgdXNlcyB0byBhc3NlbWJsZSB0aGUgRVhBQ1QgZGVwbG95IGNvbW1hbmQuIFRoZSBhZ2VudCBpcyBhXG4gKiB0aGluIHdyYXBwZXIgb3ZlciB0aGUgZXhpc3RpbmcgZGVwbG95IHNjcmlwdHM7IGl0IG5ldmVyIHJlaW1wbGVtZW50c1xuICogZGVwbG95bWVudCwgb25seSB2YWxpZGF0ZXMgaW5wdXRzIGFuZCBhc3NlbWJsZXMgdGhlIGNvbW1hbmQgdG8gcnVuLlxuICpcbiAqIEtlZXAgdGhpcyBpbiBsb2NrLXN0ZXAgd2l0aCB0aGUgZmxhZ3MgdGhlIHNjcmlwdHMgYWNjZXB0IOKAlCBldmVyeSB0YXJnZXQnc1xuICogb3BlcmF0b3IgZW50cnlwb2ludCBpcyBgYmluL3NldHVwLnNoYCAoZGVwbG95Lzx0YXJnZXQ+L2Jpbi9zZXR1cC5zaCkuXG4gKi9cblxuZXhwb3J0IHR5cGUgVGFyZ2V0SWQgPSAnbG9jYWwnIHwgJ21pbmlrdWJlJyB8ICdlYzInIHwgJ2ZhcmdhdGUnO1xuXG4vKiogQSBzaW5nbGUgaW5wdXQgdGhlIHVuZGVybHlpbmcgZGVwbG95IHNjcmlwdCBhY2NlcHRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnB1dFNwZWMge1xuICAvKiogRmxhZyBuYW1lIHBhc3NlZCB0byB0aGUgc2NyaXB0ICh3aXRob3V0IHRoZSBsZWFkaW5nIGAtLWApLiAqL1xuICByZWFkb25seSBmbGFnOiBzdHJpbmc7XG4gIC8qKiBLZXkgb24gdGhlIHByb3Zpc2lvbiBwYXJhbXMgb2JqZWN0LiAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uIOKAlCBzaG93biB3aGVuIGEgcmVxdWlyZWQgaW5wdXQgaXMgbWlzc2luZy4gKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqIFNlY3JldCDigJQgbmV2ZXIgcHJpbnRlZCBpbiB0aGUgYXNzZW1ibGVkIGNvbW1hbmQgKG1hc2tlZCBhcyBgKioqYCkuICovXG4gIHJlYWRvbmx5IHNlY3JldD86IGJvb2xlYW47XG4gIC8qKiBCb29sZWFuIGZsYWcgd2l0aCBubyB2YWx1ZSAoZS5nLiBgLS1lbWFpbGApLiAqL1xuICByZWFkb25seSBib29sZWFuPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYXJnZXRTcGVjIHtcbiAgcmVhZG9ubHkgaWQ6IFRhcmdldElkO1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuICAvKiogRGlyZWN0b3J5IHRoZSBlbnRyeXBvaW50IHJ1bnMgZnJvbSAocmVsYXRpdmUgdG8gcmVwbyByb290KS4gKi9cbiAgcmVhZG9ubHkgZGlyOiBzdHJpbmc7XG4gIC8qKiBFbnRyeXBvaW50IHNjcmlwdCAocmVsYXRpdmUgdG8gYGRpcmApLiAqL1xuICByZWFkb25seSBlbnRyeXBvaW50OiBzdHJpbmc7XG4gIC8qKiBJbnB1dHMgdGhlIHNjcmlwdCBSRVFVSVJFUyDigJQgdGhlIGFkdmlzb3IgcmVwb3J0cyBhbnkgdGhhdCBhcmUgbWlzc2luZy4gKi9cbiAgcmVhZG9ubHkgcmVxdWlyZWQ6IHJlYWRvbmx5IElucHV0U3BlY1tdO1xuICAvKiogT3B0aW9uYWwgaW5wdXRzLCBwYXNzZWQgdGhyb3VnaCBvbmx5IHdoZW4gcHJvdmlkZWQuICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsOiByZWFkb25seSBJbnB1dFNwZWNbXTtcbiAgLyoqXG4gICAqIFJlcG8gZm9sZGVyKHMpIHRoaXMgdGFyZ2V0J3MgZGVwbG95IG5lZWRzLCBmb3IgYSBzcGFyc2UgYC0tcmVwb2AgYm9vdHN0cmFwLlxuICAgKiBDb21iaW5lZCB3aXRoIENPTU1PTl9TUEFSU0VfUEFUSFMgYW5kIGFueSBzZWxlY3RlZCBsb2FkIHN0ZXBzJyBwYXRocy5cbiAgICovXG4gIHJlYWRvbmx5IHNwYXJzZVBhdGhzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIFBvc3QtZGVwbG95IHN0ZXAgdG8gc3VyZmFjZSAocmVnaXN0ZXJzIGFkbWluICsgbG9hZHMgcGx1Z2lucykuICovXG4gIHJlYWRvbmx5IHBvc3REZXBsb3k/OiBzdHJpbmc7XG4gIC8qKiBSb3VnaCBtb250aGx5IGNvc3QgKGZyb20gZG9jcykuICovXG4gIHJlYWRvbmx5IGNvc3Q6IHN0cmluZztcbiAgLyoqIE9uZS1saW5lIFwiYmVzdCBmb3JcIi4gKi9cbiAgcmVhZG9ubHkgYmVzdEZvcjogc3RyaW5nO1xuICAvKiogV2hhdCB0aGUgZGVwbG95IGNyZWF0ZXMg4oCUIHNob3duIHdoZW4gZGVwbG95aW5nIHNvIFwiRGVwbG95aW5nXCIgaXNuJ3Qgb3BhcXVlLiAqL1xuICByZWFkb25seSBkZXBsb3lzOiBzdHJpbmc7XG4gIC8qKiBXaGF0IGEgdGVhcmRvd24gb2YgdGhpcyB0YXJnZXQgZGVzdHJveXMg4oCUIHNob3duIGJlZm9yZSBhIChnYXRlZCkgdGVhcmRvd24uICovXG4gIHJlYWRvbmx5IGRlc3Ryb3lzOiBzdHJpbmc7XG59XG5cbi8vIC0tLSBTaGFyZWQgaW5wdXQgc3BlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgRE9NQUlOOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdkb21haW4nLCBrZXk6ICdkb21haW4nLCBkZXNjcmlwdGlvbjogJ0Z1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZSAoQUxCIEFDTSBjZXJ0ICsgU0VTIERLSU0pJyB9O1xuY29uc3QgSE9TVEVEX1pPTkU6IElucHV0U3BlYyA9IHsgZmxhZzogJ2hvc3RlZC16b25lLWlkJywga2V5OiAnaG9zdGVkWm9uZUlkJywgZGVzY3JpcHRpb246ICdQdWJsaWMgUm91dGUgNTMgaG9zdGVkIHpvbmUgSUQgYXV0aG9yaXRhdGl2ZSBmb3IgdGhlIGRvbWFpbicgfTtcbmNvbnN0IEdIQ1JfVE9LRU46IElucHV0U3BlYyA9IHsgZmxhZzogJ2doY3ItdG9rZW4nLCBrZXk6ICdnaGNyVG9rZW4nLCBkZXNjcmlwdGlvbjogJ0dpdEh1YiBQQVQgd2l0aCByZWFkOnBhY2thZ2VzIChhdm9pZHMgZ2hjci5pbyBhbm9ueW1vdXMgcmF0ZSBsaW1pdHMpJywgc2VjcmV0OiB0cnVlIH07XG5jb25zdCBSRUdJT046IElucHV0U3BlYyA9IHsgZmxhZzogJ3JlZ2lvbicsIGtleTogJ3JlZ2lvbicsIGRlc2NyaXB0aW9uOiAnQVdTIHJlZ2lvbicgfTtcbmNvbnN0IERFUExPWV9NT0RFOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdkZXBsb3ktbW9kZScsIGtleTogJ2RlcGxveU1vZGUnLCBkZXNjcmlwdGlvbjogJ3B1YmxpYyAoaW50ZXJuZXQtZmFjaW5nIEFMQikgb3IgcHJpdmF0ZSAoaW50ZXJuYWwsIGRlZmF1bHQpJyB9O1xuY29uc3QgS0VZX1BBSVI6IElucHV0U3BlYyA9IHsgZmxhZzogJ2tleS1wYWlyJywga2V5OiAna2V5UGFpcicsIGRlc2NyaXB0aW9uOiAnRUMyIGtleSBwYWlyIGluIHRoZSByZWdpb24gKGJyZWFrLWdsYXNzIHNlcmlhbCBjb25zb2xlOyByb3V0aW5lIGFjY2VzcyBpcyBTU00pJyB9O1xuY29uc3QgSU5TVEFOQ0VfVFlQRTogSW5wdXRTcGVjID0geyBmbGFnOiAnaW5zdGFuY2UtdHlwZScsIGtleTogJ2luc3RhbmNlVHlwZScsIGRlc2NyaXB0aW9uOiAnRUMyIGluc3RhbmNlIHR5cGUgKGRlZmF1bHQgdDMuMnhsYXJnZSknIH07XG5cbi8vIFNFUyAvIGVtYWlsIGZhbWlseSDigJQgc2hhcmVkIGJ5IGVjMiArIGZhcmdhdGUuIFNFUyBpcyBwcm92aXNpb25lZCBCWSBERUZBVUxUXG4vLyBvbiBBV1MgZGVwbG95czsgYC0tbm8tZW1haWxgIGlzIHRoZSBvcHQtb3V0IChgLS1lbWFpbGAgaXMgYSBoYXJtbGVzcyBuby1vcCBrZXB0XG4vLyBmb3IgYmFjay1jb21wYXQpLlxuY29uc3QgRU1BSUw6IHJlYWRvbmx5IElucHV0U3BlY1tdID0gW1xuICB7IGZsYWc6ICdlbWFpbCcsIGtleTogJ2VtYWlsJywgZGVzY3JpcHRpb246ICdFbmFibGUgU0VTIHRyYW5zYWN0aW9uYWwgZW1haWwgKG9uIGJ5IGRlZmF1bHQgZm9yIEFXUyknLCBib29sZWFuOiB0cnVlIH0sXG4gIHsgZmxhZzogJ25vLWVtYWlsJywga2V5OiAnbm9FbWFpbCcsIGRlc2NyaXB0aW9uOiAnU2tpcCBTRVMgKHRyYW5zYWN0aW9uYWwgZW1haWwgaXMgcHJvdmlzaW9uZWQgYnkgZGVmYXVsdCknLCBib29sZWFuOiB0cnVlIH0sXG4gIHsgZmxhZzogJ2VtYWlsLWZyb20nLCBrZXk6ICdlbWFpbEZyb20nLCBkZXNjcmlwdGlvbjogJ0Zyb20gYWRkcmVzcyAoZGVmYXVsdCBub3JlcGx5QDxkb21haW4+KScgfSxcbiAgeyBmbGFnOiAnZW1haWwtZnJvbS1uYW1lJywga2V5OiAnZW1haWxGcm9tTmFtZScsIGRlc2NyaXB0aW9uOiAnRGlzcGxheSBuYW1lIG9uIG91dGJvdW5kIGVtYWlsJyB9LFxuICB7IGZsYWc6ICdhbGVydC1lbWFpbCcsIGtleTogJ2FsZXJ0RW1haWwnLCBkZXNjcmlwdGlvbjogJ1N1YnNjcmliZSBhbiBhZGRyZXNzIHRvIHRoZSBib3VuY2UvY29tcGxhaW50IFNOUyB0b3BpYycgfSxcbiAgeyBmbGFnOiAnbm8tY3JlYXRlLXNlcy1pZGVudGl0eScsIGtleTogJ25vQ3JlYXRlU2VzSWRlbnRpdHknLCBkZXNjcmlwdGlvbjogJ1NraXAgU0VTIGlkZW50aXR5IGNyZWF0aW9uIChkb21haW4gYWxyZWFkeSB2ZXJpZmllZCknLCBib29sZWFuOiB0cnVlIH0sXG5dO1xuXG4vLyAtLS0gVGFyZ2V0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBUQVJHRVRTOiBSZWFkb25seTxSZWNvcmQ8VGFyZ2V0SWQsIFRhcmdldFNwZWM+PiA9IHtcbiAgbG9jYWw6IHtcbiAgICBpZDogJ2xvY2FsJyxcbiAgICBsYWJlbDogJ0xvY2FsIChEb2NrZXIgQ29tcG9zZSknLFxuICAgIGRpcjogJ2RlcGxveS9sb2NhbCcsXG4gICAgZW50cnlwb2ludDogJ2Jpbi9zZXR1cC5zaCcsXG4gICAgc3BhcnNlUGF0aHM6IFsnZGVwbG95L2xvY2FsJ10sXG4gICAgcmVxdWlyZWQ6IFtdLFxuICAgIG9wdGlvbmFsOiBbXSxcbiAgICBwb3N0RGVwbG95OiAnLi9kZXBsb3kvYmluL2luaXQtcGxhdGZvcm0uc2ggbG9jYWwnLFxuICAgIGNvc3Q6ICdGcmVlJyxcbiAgICBiZXN0Rm9yOiAnRGV2ZWxvcG1lbnQnLFxuICAgIGRlcGxveXM6ICd0aGUgcGxhdGZvcm0gYXMgYSBEb2NrZXIgQ29tcG9zZSBzdGFjayDigJQgYW4gbmdpbnggVExTIHByb3h5LCB0aGUgQVBJIHNlcnZpY2VzIChwbGF0Zm9ybSwgcGx1Z2luLCBwaXBlbGluZSwgbWVzc2FnZSwgcmVwb3J0aW5nLCBjb21wbGlhbmNlLCBxdW90YSwgYmlsbGluZywgaW1hZ2UtcmVnaXN0cnkpLCB0aGUgZnJvbnRlbmQsIGFuZCBwb3N0Z3JlcyArIG1vbmdvICsgcmVkaXMuIEZpcnN0IHJ1biBwdWxscyB0aGUgZ2hjci5pbyBpbWFnZXMgYW5kIGdlbmVyYXRlcyBhIGxvY2FsIFRMUyBjZXJ0IChhIGZldyBtaW51dGVzKS4nLFxuICAgIGRlc3Ryb3lzOiAnc3RvcHMgYWxsIGNvbnRhaW5lcnMg4oCUIGRhdGEgdW5kZXIgZGVwbG95L2xvY2FsL2RhdGEgcGVyc2lzdHMgb24gZGlzayAoZGVsZXRlIGl0IG1hbnVhbGx5IGZvciBhIGNsZWFuIHNsYXRlKScsXG4gIH0sXG4gIG1pbmlrdWJlOiB7XG4gICAgaWQ6ICdtaW5pa3ViZScsXG4gICAgbGFiZWw6ICdNaW5pa3ViZSAobG9jYWwgS3ViZXJuZXRlcyknLFxuICAgIGRpcjogJ2RlcGxveS9taW5pa3ViZScsXG4gICAgZW50cnlwb2ludDogJ2Jpbi9zZXR1cC5zaCcsXG4gICAgc3BhcnNlUGF0aHM6IFsnZGVwbG95L21pbmlrdWJlJ10sXG4gICAgcmVxdWlyZWQ6IFtdLFxuICAgIG9wdGlvbmFsOiBbXSxcbiAgICBwb3N0RGVwbG95OiAnLi9kZXBsb3kvYmluL2luaXQtcGxhdGZvcm0uc2ggbWluaWt1YmUnLFxuICAgIGNvc3Q6ICdGcmVlJyxcbiAgICBiZXN0Rm9yOiAnTG9jYWwgS3ViZXJuZXRlcycsXG4gICAgZGVwbG95czogJ3RoZSBwbGF0Zm9ybSBvbnRvIGEgbG9jYWwgTWluaWt1YmUgY2x1c3RlciDigJQgdGhlIHNhbWUgc2VydmljZXMgYXMgS3ViZXJuZXRlcyBEZXBsb3ltZW50cy9TZXJ2aWNlcyBiZWhpbmQgYW4gaW5ncmVzcywgcGx1cyBpbi1jbHVzdGVyIHBvc3RncmVzICsgbW9uZ28gKyByZWRpcy4gRmlyc3QgcnVuIHB1bGxzIGltYWdlcywgYnVpbGRzIHRoZSBjbHVzdGVyLCBhbmQgZ2VuZXJhdGVzIGEgVExTIGNlcnQgKHNldmVyYWwgbWludXRlcykuJyxcbiAgICBkZXN0cm95czogJ3N0b3BzIHRoZSBtaW5pa3ViZSBzdGFjayDigJQgcGVyc2lzdGVudCB2b2x1bWVzIChQVkMgZGF0YSkgcmVtYWluIHVudGlsIHRoZSBjbHVzdGVyIGlzIGRlbGV0ZWQnLFxuICB9LFxuICBlYzI6IHtcbiAgICBpZDogJ2VjMicsXG4gICAgbGFiZWw6ICdBV1MgRUMyIChzaW5nbGUgTWluaWt1YmUgaW5zdGFuY2UgYmVoaW5kIGFuIEFMQiknLFxuICAgIGRpcjogJ2RlcGxveS9hd3MvZWMyJyxcbiAgICBlbnRyeXBvaW50OiAnYmluL3NldHVwLnNoJyxcbiAgICBzcGFyc2VQYXRoczogWydkZXBsb3kvYXdzL2VjMiddLFxuICAgIHJlcXVpcmVkOiBbS0VZX1BBSVIsIERPTUFJTiwgSE9TVEVEX1pPTkVdLFxuICAgIG9wdGlvbmFsOiBbUkVHSU9OLCBERVBMT1lfTU9ERSwgR0hDUl9UT0tFTiwgSU5TVEFOQ0VfVFlQRSwgLi4uRU1BSUxdLFxuICAgIHBvc3REZXBsb3k6ICcuL2RlcGxveS9iaW4vaW5pdC1wbGF0Zm9ybS5zaCBlYzIgICMgZnJvbSBpbnNpZGUgdGhlIFZQQyAoU1NNKScsXG4gICAgY29zdDogJ34kMTQwLTI2NS9tbycsXG4gICAgYmVzdEZvcjogJ0RldiAvIHN0YWdpbmcnLFxuICAgIGRlcGxveXM6ICd0aGUgcGxhdGZvcm0gb24gYSBzaW5nbGUgRUMyIGluc3RhbmNlIHZpYSBDbG91ZEZvcm1hdGlvbiDigJQgYSBWUEMsIHRoZSBpbnN0YW5jZSAocnVubmluZyB0aGUgTWluaWt1YmUgc3RhY2spLCBhbiBBTEIsIGEgUm91dGUgNTMgcmVjb3JkICsgQUNNIGNlcnQgZm9yIHRoZSBkb21haW4sIGFuZCAoYnkgZGVmYXVsdCkgU0VTIGVtYWlsLiBUaGUgaW5zdGFuY2UgcHVsbHMgaW1hZ2VzIG9uIGZpcnN0IGJvb3QuJyxcbiAgICBkZXN0cm95czogJ0RFTEVURVMgdGhlIENsb3VkRm9ybWF0aW9uIHN0YWNrOiB0aGUgVlBDLCBFQzIgaW5zdGFuY2UsIGFuZCBpdHMgRUJTIGRhdGEgdm9sdW1lIChkYXRhYmFzZXMsIHJlZ2lzdHJ5LCBwbHVnaW4gYnVpbGRzKS4gSXJyZXZlcnNpYmxlLicsXG4gIH0sXG4gIGZhcmdhdGU6IHtcbiAgICBpZDogJ2ZhcmdhdGUnLFxuICAgIGxhYmVsOiAnQVdTIEZhcmdhdGUgKHNlcnZlcmxlc3MgRUNTLCA2IENsb3VkRm9ybWF0aW9uIHN0YWNrcyknLFxuICAgIGRpcjogJ2RlcGxveS9hd3MvZmFyZ2F0ZScsXG4gICAgZW50cnlwb2ludDogJ2Jpbi9zZXR1cC5zaCcsXG4gICAgc3BhcnNlUGF0aHM6IFsnZGVwbG95L2F3cy9mYXJnYXRlJ10sXG4gICAgcmVxdWlyZWQ6IFtET01BSU4sIEhPU1RFRF9aT05FXSxcbiAgICBvcHRpb25hbDogW1JFR0lPTiwgREVQTE9ZX01PREUsIEdIQ1JfVE9LRU4sIC4uLkVNQUlMXSxcbiAgICBwb3N0RGVwbG95OiAnLi9kZXBsb3kvYmluL2luaXQtcGxhdGZvcm0uc2ggZmFyZ2F0ZSAgIyBmcm9tIGEgVlBDLWF0dGFjaGVkIGhvc3QnLFxuICAgIGNvc3Q6ICd+JDEwMC0zMDAvbW8nLFxuICAgIGJlc3RGb3I6ICdQcm9kdWN0aW9uJyxcbiAgICBkZXBsb3lzOiAndGhlIHBsYXRmb3JtIG9uIHNlcnZlcmxlc3MgRUNTIEZhcmdhdGUgdmlhIDYgQ2xvdWRGb3JtYXRpb24gc3RhY2tzIOKAlCBhIFZQQywgYW4gQUxCLCB0aGUgRUNTIHNlcnZpY2VzLCBFRlMtYmFja2VkIGRhdGFiYXNlcyArIHJlZ2lzdHJ5LCBSb3V0ZSA1MyArIEFDTSBmb3IgdGhlIGRvbWFpbiwgYW5kIChieSBkZWZhdWx0KSBTRVMgZW1haWwuIFNlY3JldHMgYXJlIGdlbmVyYXRlZCBpbnRvIFNlY3JldHMgTWFuYWdlciBmaXJzdC4nLFxuICAgIGRlc3Ryb3lzOiAnREVMRVRFUyBhbGwgcGItKiBDbG91ZEZvcm1hdGlvbiBzdGFja3M6IEVGUyBkYXRhLCBkYXRhYmFzZXMsIGFuZCByZWdpc3RyeS4gU2VjcmV0cyBNYW5hZ2VyIGVudHJpZXMgYXJlIE5PVCBhdXRvLWRlbGV0ZWQuIElycmV2ZXJzaWJsZS4nLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IFRBUkdFVF9JRFM6IHJlYWRvbmx5IFRhcmdldElkW10gPSBbJ2xvY2FsJywgJ21pbmlrdWJlJywgJ2VjMicsICdmYXJnYXRlJ107XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RhcmdldElkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVGFyZ2V0SWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAoVEFSR0VUX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vLyAtLS0gU3BhcnNlIGJvb3RzdHJhcCBwYXRocyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRm9sZGVycyBldmVyeSBgLS1yZXBvYCBib290c3RyYXAgbmVlZHMgcmVnYXJkbGVzcyBvZiB0YXJnZXQ6IHRoZSBvcmNoZXN0cmF0aW9uXG4gKiBzY3JpcHRzLiBFYWNoIHRhcmdldCdzIHNldHVwLnNoICsgaW5pdC1wbGF0Zm9ybS5zaCBsaXZlIGluIC8gZHJpdmUgdGhlc2UuXG4gKiBEZWxpYmVyYXRlbHkgbWluaW1hbCDigJQgaGVhdmllciBmb2xkZXJzIChwbHVnaW5zL2NvbXBsaWFuY2Uvc2FtcGxlcykgYXJlIHB1bGxlZFxuICogaW4gb25seSB3aGVuIHRoZWlyIHBvc3QtaW5zdGFsbCBvcHRpb24gaXMgc2VsZWN0ZWQgKHNlZSBMT0FEX1NURVBTKS5cbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1PTl9TUEFSU0VfUEFUSFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gWydkZXBsb3kvYmluJ107XG5cbi8qKlxuICogT3B0LWluIHBvc3QtaW5zdGFsbCBsb2FkIHN0ZXBzLiBFYWNoIG1hcHMgYSBwcm92aXNpb24gYC0td2l0aC0qYCBmbGFnIHRvIHRoZVxuICogaW5pdC1wbGF0Zm9ybSBlbnYgdmFyIHRoYXQgZW5hYmxlcyBpdCBBTkQgdGhlIHJlcG8gZm9sZGVyKHMpIGl0IHJlYWRzIOKAlCBzbyB0aGVcbiAqIHNwYXJzZSBjaGVja291dCBncm93cyBleGFjdGx5IHdpdGggdGhlIHNlbGVjdGVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBMT0FEX1NURVBTID0gW1xuICAvLyBUaGUgcGx1Z2luIGJ1aWxkIHJlYWRzIGRlcGxveS9wbHVnaW5zL19iYXNlIEFORCBkZXBsb3kvY29kZWJ1aWxkL2Jvb3RzdHJhcC5cbiAgeyBpZDogJ3BsdWdpbnMnLCBmbGFnOiAnd2l0aFBsdWdpbnMnLCBlbnY6ICdMT0FEX1BMVUdJTlMnLCBwYXRoczogWydkZXBsb3kvcGx1Z2lucycsICdkZXBsb3kvY29kZWJ1aWxkJ10gfSxcbiAgeyBpZDogJ2NvbXBsaWFuY2UnLCBmbGFnOiAnd2l0aENvbXBsaWFuY2UnLCBlbnY6ICdMT0FEX0NPTVBMSUFOQ0UnLCBwYXRoczogWydkZXBsb3kvY29tcGxpYW5jZSddIH0sXG4gIHsgaWQ6ICdzYW1wbGVzJywgZmxhZzogJ3dpdGhTYW1wbGVzJywgZW52OiAnTE9BRF9QSVBFTElORVMnLCBwYXRoczogWydkZXBsb3kvc2FtcGxlcyddIH0sXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBMb2FkU3RlcElkID0gKHR5cGVvZiBMT0FEX1NURVBTKVtudW1iZXJdWydpZCddO1xuXG4vKipcbiAqIFRoZSBkZS1kdXBsaWNhdGVkIHNldCBvZiBzcGFyc2UgcGF0aHMgZm9yIGEgdGFyZ2V0IHBsdXMgdGhlIGVuYWJsZWQgbG9hZFxuICogc3RlcHM6IGNvbW1vbiBiYXNlIOKIqiB0YXJnZXQgZm9sZGVyKHMpIOKIqiBlYWNoIGVuYWJsZWQgc3RlcCdzIGZvbGRlcihzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVBhdGhzRm9yKHRhcmdldDogVGFyZ2V0SWQsIGVuYWJsZWRMb2FkSWRzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oQ09NTU9OX1NQQVJTRV9QQVRIUyk7XG4gIGZvciAoY29uc3QgcCBvZiBUQVJHRVRTW3RhcmdldF0uc3BhcnNlUGF0aHMpIHBhdGhzLmFkZChwKTtcbiAgZm9yIChjb25zdCBzdGVwIG9mIExPQURfU1RFUFMpIHtcbiAgICBpZiAoZW5hYmxlZExvYWRJZHMuaW5jbHVkZXMoc3RlcC5pZCkpIGZvciAoY29uc3QgcCBvZiBzdGVwLnBhdGhzKSBwYXRocy5hZGQocCk7XG4gIH1cbiAgcmV0dXJuIFsuLi5wYXRoc107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZW1ibGVSZXN1bHQge1xuICAvKiogVGhlIGV4YWN0IGNvbW1hbmQgdG8gcnVuIOKAlCBzZWNyZXRzIG1hc2tlZCBhcyBgKioqYC4gKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICAvKiogUmVxdWlyZWQgaW5wdXRzIHRoYXQgd2VyZSBub3Qgc3VwcGxpZWQuICovXG4gIHJlYWRvbmx5IG1pc3Npbmc6IHJlYWRvbmx5IElucHV0U3BlY1tdO1xufVxuXG4vKipcbiAqIEFzc2VtYmxlIHRoZSBkZXBsb3kgY29tbWFuZCBmb3IgYSB0YXJnZXQgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1zLiBQdXJlIGFuZFxuICogZGV0ZXJtaW5pc3RpYyDigJQgbm8gc2hlbGwsIG5vIExMTS4gTWlzc2luZyByZXF1aXJlZCBpbnB1dHMgYXJlIHJlcG9ydGVkIChuZXZlclxuICogZ3Vlc3NlZCkuIEJ5IGRlZmF1bHQgc2VjcmV0cyBhcmUgbWFza2VkIChgKioqYCkgZm9yIERJU1BMQVk7IHBhc3MgYG1hc2s6IGZhbHNlYFxuICogdG8gYnVpbGQgdGhlIHJlYWwgY29tbWFuZCBmb3IgRVhFQ1VUSU9OIOKAlCB0aGF0IHN0cmluZyBtdXN0IG5ldmVyIGJlIGxvZ2dlZCBvclxuICogc2hvd24gdG8gdGhlIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVDb21tYW5kKFxuICB0YXJnZXQ6IFRhcmdldFNwZWMsXG4gIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdHM6IHsgbWFzaz86IGJvb2xlYW4gfSA9IHt9LFxuKTogQXNzZW1ibGVSZXN1bHQge1xuICBjb25zdCBtYXNrID0gb3B0cy5tYXNrID8/IHRydWU7XG4gIGNvbnN0IHByb3ZpZGVkID0gKHNwZWM6IElucHV0U3BlYyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHYgPSBwYXJhbXNbc3BlYy5rZXldO1xuICAgIHJldHVybiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gJycgJiYgdiAhPT0gZmFsc2U7XG4gIH07XG5cbiAgY29uc3QgbWlzc2luZyA9IHRhcmdldC5yZXF1aXJlZC5maWx0ZXIoKHNwZWMpID0+ICFwcm92aWRlZChzcGVjKSk7XG5cbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW2BjZCAke3RhcmdldC5kaXJ9ICYmIGJhc2ggJHt0YXJnZXQuZW50cnlwb2ludH1gXTtcbiAgZm9yIChjb25zdCBzcGVjIG9mIFsuLi50YXJnZXQucmVxdWlyZWQsIC4uLnRhcmdldC5vcHRpb25hbF0pIHtcbiAgICBpZiAoIXByb3ZpZGVkKHNwZWMpKSBjb250aW51ZTtcbiAgICBpZiAoc3BlYy5ib29sZWFuKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAtLSR7c3BlYy5mbGFnfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gc3BlYy5zZWNyZXQgJiYgbWFzayA/ICcqKionIDogU3RyaW5nKHBhcmFtc1tzcGVjLmtleV0pO1xuICAgIHBhcnRzLnB1c2goYC0tJHtzcGVjLmZsYWd9ICR7dmFsdWV9YCk7XG4gIH1cblxuICByZXR1cm4geyBjb21tYW5kOiBwYXJ0cy5qb2luKCcgXFxcXFxcbiAgJyksIG1pc3NpbmcgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZWFyZG93blJlc3VsdCB7XG4gIC8qKiBUaGUgZXhhY3QgdGVhcmRvd24gY29tbWFuZCB0byBydW4uICovXG4gIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgdGhpcyB0ZWFyZG93biBpcnJldmVyc2libHkgZGVzdHJveXMgZGF0YSAoQVdTIHRhcmdldHMpLiAqL1xuICByZWFkb25seSBkZXN0cnVjdGl2ZTogYm9vbGVhbjtcbn1cblxuLyoqIENsb3VkRm9ybWF0aW9uIHN0YWNrIG5hbWUgdGhlIEVDMiBzZXR1cC5zaCBkZWZhdWx0cyB0by4gKi9cbmNvbnN0IERFRkFVTFRfRUMyX1NUQUNLID0gJ3BpcGVsaW5lLWJ1aWxkZXInO1xuLyoqIFN0YWNrIHByZWZpeCB0aGUgRmFyZ2F0ZSB0ZWFyZG93bi5zaCBkZWZhdWx0cyB0by4gKi9cbmNvbnN0IERFRkFVTFRfRkFSR0FURV9QUkVGSVggPSAncGInO1xuXG4vKipcbiAqIEFzc2VtYmxlIHRoZSB0ZWFyZG93biBjb21tYW5kIGZvciBhIHRhcmdldC4gUHVyZSBhbmQgZGV0ZXJtaW5pc3RpYyDigJQgbWlycm9yc1xuICogYGFzc2VtYmxlQ29tbWFuZGAgZm9yIHRoZSBkZXN0cm95IHBhdGguIGxvY2FsL21pbmlrdWJlIFNUT1AgdGhlIHN0YWNrXG4gKiAobm9uLWRlc3RydWN0aXZlIOKAlCBvbi1kaXNrIC8gUFZDIGRhdGEgc3Vydml2ZXMpOyBlYzIvZmFyZ2F0ZSBERUxFVEUgdGhlaXJcbiAqIENsb3VkRm9ybWF0aW9uIHN0YWNrcyBhbmQgYXJlIGlycmV2ZXJzaWJsZS4gRm9yIEZhcmdhdGUsIGBhc3N1bWVZZXNgIGZvcndhcmRzXG4gKiB0aGUgbmF0aXZlIHNjcmlwdCdzIG93biBgLS15ZXNgICh0aGUgYWdlbnQgcnVucyBpdHMgb3duIHR5cGVkIGNvbmZpcm1hdGlvblxuICogZmlyc3QsIHNvIHRoZSBzY3JpcHQgbXVzdCBub3QgYWxzbyBibG9jayBvbiBzdGRpbik7IEVDMiBgZGVsZXRlLXN0YWNrYCBoYXMgbm9cbiAqIG5hdGl2ZSBwcm9tcHQsIHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoZSBhZ2VudCBnYXRlIGlzIG1hbmRhdG9yeSB0aGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlYXJkb3duQ29tbWFuZChcbiAgdGFyZ2V0OiBUYXJnZXRJZCxcbiAgb3B0czogeyBzdGFja05hbWU/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZzsgYXNzdW1lWWVzPzogYm9vbGVhbiB9ID0ge30sXG4pOiBUZWFyZG93blJlc3VsdCB7XG4gIGNvbnN0IHJlZ2lvbiA9IG9wdHMucmVnaW9uIHx8IHByb2Nlc3MuZW52LkFXU19SRUdJT04gfHwgJ3VzLWVhc3QtMSc7XG4gIHN3aXRjaCAodGFyZ2V0KSB7XG4gICAgY2FzZSAnbG9jYWwnOlxuICAgICAgcmV0dXJuIHsgY29tbWFuZDogJ2NkIGRlcGxveS9sb2NhbCAmJiBiYXNoIGJpbi9zaHV0ZG93bi5zaCcsIGRlc3RydWN0aXZlOiBmYWxzZSB9O1xuICAgIGNhc2UgJ21pbmlrdWJlJzpcbiAgICAgIHJldHVybiB7IGNvbW1hbmQ6ICdjZCBkZXBsb3kvbWluaWt1YmUgJiYgYmFzaCBiaW4vc2h1dGRvd24uc2gnLCBkZXN0cnVjdGl2ZTogZmFsc2UgfTtcbiAgICBjYXNlICdlYzInOiB7XG4gICAgICBjb25zdCBzdGFjayA9IG9wdHMuc3RhY2tOYW1lIHx8IERFRkFVTFRfRUMyX1NUQUNLO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZDpcbiAgICAgICAgICBgYXdzIGNsb3VkZm9ybWF0aW9uIGRlbGV0ZS1zdGFjayAtLXN0YWNrLW5hbWUgJHtzdGFja30gLS1yZWdpb24gJHtyZWdpb259ICYmIGAgK1xuICAgICAgICAgIGBhd3MgY2xvdWRmb3JtYXRpb24gd2FpdCBzdGFjay1kZWxldGUtY29tcGxldGUgLS1zdGFjay1uYW1lICR7c3RhY2t9IC0tcmVnaW9uICR7cmVnaW9ufWAsXG4gICAgICAgIGRlc3RydWN0aXZlOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnZmFyZ2F0ZSc6IHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IG9wdHMuc3RhY2tOYW1lIHx8IERFRkFVTFRfRkFSR0FURV9QUkVGSVg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kOlxuICAgICAgICAgIGBjZCBkZXBsb3kvYXdzL2ZhcmdhdGUgJiYgYmFzaCBiaW4vdGVhcmRvd24uc2ggLS1zdGFjay1wcmVmaXggJHtwcmVmaXh9IC0tcmVnaW9uICR7cmVnaW9ufWAgK1xuICAgICAgICAgIChvcHRzLmFzc3VtZVllcyA/ICcgLS15ZXMnIDogJycpLFxuICAgICAgICBkZXN0cnVjdGl2ZTogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG4iXX0=
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZ2VudC90YXJnZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUErRHRDLCtFQUErRTtBQUUvRSxNQUFNLE1BQU0sR0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsdURBQXVELEVBQUUsQ0FBQztBQUNsSSxNQUFNLFdBQVcsR0FBYyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSw2REFBNkQsRUFBRSxDQUFDO0FBQzNKLE1BQU0sVUFBVSxHQUFjLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxzRUFBc0UsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUssTUFBTSxNQUFNLEdBQWMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ3ZGLE1BQU0sV0FBVyxHQUFjLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSw2REFBNkQsRUFBRSxDQUFDO0FBQ3RKLE1BQU0sUUFBUSxHQUFjLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxnRkFBZ0YsRUFBRSxDQUFDO0FBQ2hLLE1BQU0sYUFBYSxHQUFjLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSx3Q0FBd0MsRUFBRSxDQUFDO0FBRXZJLDhFQUE4RTtBQUM5RSxrRkFBa0Y7QUFDbEYsb0JBQW9CO0FBQ3BCLE1BQU0sS0FBSyxHQUF5QjtJQUNsQyxFQUFFLElBQUks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TSxFQUFFO29CQUMzRixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxXQUFXLEVBQUUsSUFBSTthQUNsQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogRGV0ZXJtaW5pc3RpYyByZWdpc3RyeSBvZiBwbGF0Zm9ybSBkZXBsb3kgdGFyZ2V0cyDigJQgdGhlIHNvdXJjZSBvZiB0cnV0aCB0aGVcbiAqIGBwcm92aXNpb25gIGFkdmlzb3IgdXNlcyB0byBhc3NlbWJsZSB0aGUgRVhBQ1QgZGVwbG95IGNvbW1hbmQuIFRoZSBhZ2VudCBpcyBhXG4gKiB0aGluIHdyYXBwZXIgb3ZlciB0aGUgZXhpc3RpbmcgZGVwbG95IHNjcmlwdHM7IGl0IG5ldmVyIHJlaW1wbGVtZW50c1xuICogZGVwbG95bWVudCwgb25seSB2YWxpZGF0ZXMgaW5wdXRzIGFuZCBhc3NlbWJsZXMgdGhlIGNvbW1hbmQgdG8gcnVuLlxuICpcbiAqIEtlZXAgdGhpcyBpbiBsb2NrLXN0ZXAgd2l0aCB0aGUgZmxhZ3MgdGhlIHNjcmlwdHMgYWNjZXB0IOKAlCBldmVyeSB0YXJnZXQnc1xuICogb3BlcmF0b3IgZW50cnlwb2ludCBpcyBgYmluL3NldHVwLnNoYCAoZGVwbG95Lzx0YXJnZXQ+L2Jpbi9zZXR1cC5zaCkuXG4gKi9cblxuZXhwb3J0IHR5cGUgVGFyZ2V0SWQgPSAnbG9jYWwnIHwgJ21pbmlrdWJlJyB8ICdlYzInIHwgJ2ZhcmdhdGUnO1xuXG4vKiogQSBzaW5nbGUgaW5wdXQgdGhlIHVuZGVybHlpbmcgZGVwbG95IHNjcmlwdCBhY2NlcHRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnB1dFNwZWMge1xuICAvKiogRmxhZyBuYW1lIHBhc3NlZCB0byB0aGUgc2NyaXB0ICh3aXRob3V0IHRoZSBsZWFkaW5nIGAtLWApLiAqL1xuICByZWFkb25seSBmbGFnOiBzdHJpbmc7XG4gIC8qKiBLZXkgb24gdGhlIHByb3Zpc2lvbiBwYXJhbXMgb2JqZWN0LiAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uIOKAlCBzaG93biB3aGVuIGEgcmVxdWlyZWQgaW5wdXQgaXMgbWlzc2luZy4gKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqIFNlY3JldCDigJQgbmV2ZXIgcHJpbnRlZCBpbiB0aGUgYXNzZW1ibGVkIGNvbW1hbmQgKG1hc2tlZCBhcyBgKioqYCkuICovXG4gIHJlYWRvbmx5IHNlY3JldD86IGJvb2xlYW47XG4gIC8qKiBCb29sZWFuIGZsYWcgd2l0aCBubyB2YWx1ZSAoZS5nLiBgLS1lbWFpbGApLiAqL1xuICByZWFkb25seSBib29sZWFuPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYXJnZXRTcGVjIHtcbiAgcmVhZG9ubHkgaWQ6IFRhcmdldElkO1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuICAvKiogRGlyZWN0b3J5IHRoZSBlbnRyeXBvaW50IHJ1bnMgZnJvbSAocmVsYXRpdmUgdG8gcmVwbyByb290KS4gKi9cbiAgcmVhZG9ubHkgZGlyOiBzdHJpbmc7XG4gIC8qKiBFbnRyeXBvaW50IHNjcmlwdCAocmVsYXRpdmUgdG8gYGRpcmApLiAqL1xuICByZWFkb25seSBlbnRyeXBvaW50OiBzdHJpbmc7XG4gIC8qKiBJbnB1dHMgdGhlIHNjcmlwdCBSRVFVSVJFUyDigJQgdGhlIGFkdmlzb3IgcmVwb3J0cyBhbnkgdGhhdCBhcmUgbWlzc2luZy4gKi9cbiAgcmVhZG9ubHkgcmVxdWlyZWQ6IHJlYWRvbmx5IElucHV0U3BlY1tdO1xuICAvKiogT3B0aW9uYWwgaW5wdXRzLCBwYXNzZWQgdGhyb3VnaCBvbmx5IHdoZW4gcHJvdmlkZWQuICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsOiByZWFkb25seSBJbnB1dFNwZWNbXTtcbiAgLyoqXG4gICAqIFJlcG8gZm9sZGVyKHMpIHRoaXMgdGFyZ2V0J3MgZGVwbG95IG5lZWRzLCBmb3IgYSBzcGFyc2UgYC0tcmVwb2AgYm9vdHN0cmFwLlxuICAgKiBDb21iaW5lZCB3aXRoIENPTU1PTl9TUEFSU0VfUEFUSFMgYW5kIGFueSBzZWxlY3RlZCBsb2FkIHN0ZXBzJyBwYXRocy5cbiAgICovXG4gIHJlYWRvbmx5IHNwYXJzZVBhdGhzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIFBvc3QtZGVwbG95IHN0ZXAgdG8gc3VyZmFjZSAocmVnaXN0ZXJzIGFkbWluICsgbG9hZHMgcGx1Z2lucykuICovXG4gIHJlYWRvbmx5IHBvc3REZXBsb3k/OiBzdHJpbmc7XG4gIC8qKiBSb3VnaCBtb250aGx5IGNvc3QgKGZyb20gZG9jcykuICovXG4gIHJlYWRvbmx5IGNvc3Q6IHN0cmluZztcbiAgLyoqIE9uZS1saW5lIFwiYmVzdCBmb3JcIi4gKi9cbiAgcmVhZG9ubHkgYmVzdEZvcjogc3RyaW5nO1xuICAvKiogV2hhdCB0aGUgZGVwbG95IGNyZWF0ZXMg4oCUIHNob3duIHdoZW4gZGVwbG95aW5nIHNvIFwiRGVwbG95aW5nXCIgaXNuJ3Qgb3BhcXVlLiAqL1xuICByZWFkb25seSBkZXBsb3lzOiBzdHJpbmc7XG4gIC8qKiBXaGF0IGEgdGVhcmRvd24gb2YgdGhpcyB0YXJnZXQgZGVzdHJveXMg4oCUIHNob3duIGJlZm9yZSBhIChnYXRlZCkgdGVhcmRvd24uICovXG4gIHJlYWRvbmx5IGRlc3Ryb3lzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIb3N0IHBvcnRzIHRoZSBkZXBsb3kgYmluZHMgKERvY2tlci1wdWJsaXNoZWQgZm9yIGxvY2FsLCBrdWJlY3RsIHBvcnQtZm9yd2FyZHNcbiAgICogZm9yIG1pbmlrdWJlKS4gQ2hlY2tlZCB1cCBmcm9udCDigJQgYSBjb25mbGljdCBtZWFucyBhIGNvbnRhaW5lci9mb3J3YXJkIGNhbid0XG4gICAqIGJpbmQgYW5kIHNpbGVudGx5IGZhaWxzLiBNaXJyb3IgZGVwbG95Lzx0YXJnZXQ+J3MgY29tcG9zZS9zZXR1cC5zaC4gRW1wdHkgZm9yXG4gICAqIHJlbW90ZSB0YXJnZXRzIChlYzIvZmFyZ2F0ZSBiaW5kIG5vdGhpbmcgb24gdGhlIG9wZXJhdG9yJ3MgbWFjaGluZSkuXG4gICAqL1xuICByZWFkb25seSBob3N0UG9ydHM6IHJlYWRvbmx5IHsgc2VydmljZTogc3RyaW5nOyBwb3J0OiBudW1iZXIgfVtdO1xufVxuXG4vLyAtLS0gU2hhcmVkIGlucHV0IHNwZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IERPTUFJTjogSW5wdXRTcGVjID0geyBmbGFnOiAnZG9tYWluJywga2V5OiAnZG9tYWluJywgZGVzY3JpcHRpb246ICdGdWxseS1xdWFsaWZpZWQgZG9tYWluIG5hbWUgKEFMQiBBQ00gY2VydCArIFNFUyBES0lNKScgfTtcbmNvbnN0IEhPU1RFRF9aT05FOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdob3N0ZWQtem9uZS1pZCcsIGtleTogJ2hvc3RlZFpvbmVJZCcsIGRlc2NyaXB0aW9uOiAnUHVibGljIFJvdXRlIDUzIGhvc3RlZCB6b25lIElEIGF1dGhvcml0YXRpdmUgZm9yIHRoZSBkb21haW4nIH07XG5jb25zdCBHSENSX1RPS0VOOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdnaGNyLXRva2VuJywga2V5OiAnZ2hjclRva2VuJywgZGVzY3JpcHRpb246ICdHaXRIdWIgUEFUIHdpdGggcmVhZDpwYWNrYWdlcyAoYXZvaWRzIGdoY3IuaW8gYW5vbnltb3VzIHJhdGUgbGltaXRzKScsIHNlY3JldDogdHJ1ZSB9O1xuY29uc3QgUkVHSU9OOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdyZWdpb24nLCBrZXk6ICdyZWdpb24nLCBkZXNjcmlwdGlvbjogJ0FXUyByZWdpb24nIH07XG5jb25zdCBERVBMT1lfTU9ERTogSW5wdXRTcGVjID0geyBmbGFnOiAnZGVwbG95LW1vZGUnLCBrZXk6ICdkZXBsb3lNb2RlJywgZGVzY3JpcHRpb246ICdwdWJsaWMgKGludGVybmV0LWZhY2luZyBBTEIpIG9yIHByaXZhdGUgKGludGVybmFsLCBkZWZhdWx0KScgfTtcbmNvbnN0IEtFWV9QQUlSOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdrZXktcGFpcicsIGtleTogJ2tleVBhaXInLCBkZXNjcmlwdGlvbjogJ0VDMiBrZXkgcGFpciBpbiB0aGUgcmVnaW9uIChicmVhay1nbGFzcyBzZXJpYWwgY29uc29sZTsgcm91dGluZSBhY2Nlc3MgaXMgU1NNKScgfTtcbmNvbnN0IElOU1RBTkNFX1RZUEU6IElucHV0U3BlYyA9IHsgZmxhZzogJ2luc3RhbmNlLXR5cGUnLCBrZXk6ICdpbnN0YW5jZVR5cGUnLCBkZXNjcmlwdGlvbjogJ0VDMiBpbnN0YW5jZSB0eXBlIChkZWZhdWx0IHQzLjJ4bGFyZ2UpJyB9O1xuXG4vLyBTRVMgLyBlbWFpbCBmYW1pbHkg4oCUIHNoYXJlZCBieSBlYzIgKyBmYXJnYXRlLiBTRVMgaXMgcHJvdmlzaW9uZWQgQlkgREVGQVVMVFxuLy8gb24gQVdTIGRlcGxveXM7IGAtLW5vLWVtYWlsYCBpcyB0aGUgb3B0LW91dCAoYC0tZW1haWxgIGlzIGEgaGFybWxlc3Mgbm8tb3Aga2VwdFxuLy8gZm9yIGJhY2stY29tcGF0KS5cbmNvbnN0IEVNQUlMOiByZWFkb25seSBJbnB1dFNwZWNbXSA9IFtcbiAgeyBmbGFnOiAnZW1haWwnLCBrZXk6ICdlbWFpbCcsIGRlc2NyaXB0aW9uOiAnRW5hYmxlIFNFUyB0cmFuc2FjdGlvbmFsIGVtYWlsIChvbiBieSBkZWZhdWx0IGZvciBBV1MpJywgYm9vbGVhbjogdHJ1ZSB9LFxuICB7IGZsYWc6ICduby1lbWFpbCcsIGtleTogJ25vRW1haWwnLCBkZXNjcmlwdGlvbjogJ1NraXAgU0VTICh0cmFuc2FjdGlvbmFsIGVtYWlsIGlzIHByb3Zpc2lvbmVkIGJ5IGRlZmF1bHQpJywgYm9vbGVhbjogdHJ1ZSB9LFxuICB7IGZsYWc6ICdlbWFpbC1mcm9tJywga2V5OiAnZW1haWxGcm9tJywgZGVzY3JpcHRpb246ICdGcm9tIGFkZHJlc3MgKGRlZmF1bHQgbm9yZXBseUA8ZG9tYWluPiknIH0sXG4gIHsgZmxhZzogJ2VtYWlsLWZyb20tbmFtZScsIGtleTogJ2VtYWlsRnJvbU5hbWUnLCBkZXNjcmlwdGlvbjogJ0Rpc3BsYXkgbmFtZSBvbiBvdXRib3VuZCBlbWFpbCcgfSxcbiAgeyBmbGFnOiAnYWxlcnQtZW1haWwnLCBrZXk6ICdhbGVydEVtYWlsJywgZGVzY3JpcHRpb246ICdTdWJzY3JpYmUgYW4gYWRkcmVzcyB0byB0aGUgYm91bmNlL2NvbXBsYWludCBTTlMgdG9waWMnIH0sXG4gIHsgZmxhZzogJ25vLWNyZWF0ZS1zZXMtaWRlbnRpdHknLCBrZXk6ICdub0NyZWF0ZVNlc0lkZW50aXR5JywgZGVzY3JpcHRpb246ICdTa2lwIFNFUyBpZGVudGl0eSBjcmVhdGlvbiAoZG9tYWluIGFscmVhZHkgdmVyaWZpZWQpJywgYm9vbGVhbjogdHJ1ZSB9LFxuXTtcblxuLy8gLS0tIFRhcmdldHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgVEFSR0VUUzogUmVhZG9ubHk8UmVjb3JkPFRhcmdldElkLCBUYXJnZXRTcGVjPj4gPSB7XG4gIGxvY2FsOiB7XG4gICAgaWQ6ICdsb2NhbCcsXG4gICAgbGFiZWw6ICdMb2NhbCAoRG9ja2VyIENvbXBvc2UpJyxcbiAgICBkaXI6ICdkZXBsb3kvbG9jYWwnLFxuICAgIGVudHJ5cG9pbnQ6ICdiaW4vc2V0dXAuc2gnLFxuICAgIHNwYXJzZVBhdGhzOiBbJ2RlcGxveS9sb2NhbCddLFxuICAgIHJlcXVpcmVkOiBbXSxcbiAgICBvcHRpb25hbDogW10sXG4gICAgcG9zdERlcGxveTogJy4vZGVwbG95L2Jpbi9pbml0LXBsYXRmb3JtLnNoIGxvY2FsJyxcbiAgICBjb3N0OiAnRnJlZScsXG4gICAgYmVzdEZvcjogJ0RldmVsb3BtZW50JyxcbiAgICBkZXBsb3lzOiAndGhlIHBsYXRmb3JtIGFzIGEgRG9ja2VyIENvbXBvc2Ugc3RhY2sg4oCUIGFuIG5naW54IFRMUyBwcm94eSwgdGhlIEFQSSBzZXJ2aWNlcyAocGxhdGZvcm0sIHBsdWdpbiwgcGlwZWxpbmUsIG1lc3NhZ2UsIHJlcG9ydGluZywgY29tcGxpYW5jZSwgcXVvdGEsIGJpbGxpbmcsIGltYWdlLXJlZ2lzdHJ5KSwgdGhlIGZyb250ZW5kLCBhbmQgcG9zdGdyZXMgKyBtb25nbyArIHJlZGlzLiBGaXJzdCBydW4gcHVsbHMgdGhlIGdoY3IuaW8gaW1hZ2VzIGFuZCBnZW5lcmF0ZXMgYSBsb2NhbCBUTFMgY2VydCAoYSBmZXcgbWludXRlcykuJyxcbiAgICBkZXN0cm95czogJ3N0b3BzIGFsbCBjb250YWluZXJzIOKAlCBkYXRhIHVuZGVyIGRlcGxveS9sb2NhbC9kYXRhIHBlcnNpc3RzIG9uIGRpc2sgKGRlbGV0ZSBpdCBtYW51YWxseSBmb3IgYSBjbGVhbiBzbGF0ZSknLFxuICAgIC8vIE1pcnJvcnMgdGhlIHB1Ymxpc2hlZCBwb3J0cyBpbiBkZXBsb3kvbG9jYWwvZG9ja2VyLWNvbXBvc2UueW1sLlxuICAgIGhvc3RQb3J0czogW1xuICAgICAgeyBzZXJ2aWNlOiAnbmdpbngg4oCUIEhUVFBTIGdhdGV3YXkgKFVJL0FQSSknLCBwb3J0OiA4NDQzIH0sXG4gICAgICB7IHNlcnZpY2U6ICduZ2lueCDigJQgSFRUUCByZWRpcmVjdCcsIHBvcnQ6IDgwODAgfSxcbiAgICAgIHsgc2VydmljZTogJ3BnQWRtaW4gKFBvc3RncmVzIFVJKScsIHBvcnQ6IDU0ODAgfSxcbiAgICAgIHsgc2VydmljZTogJ01vbmdvIEV4cHJlc3MgKE1vbmdvIFVJKScsIHBvcnQ6IDI3MDgxIH0sXG4gICAgICB7IHNlcnZpY2U6ICdEb2NrZXIgcmVnaXN0cnknLCBwb3J0OiA1MDAwIH0sXG4gICAgICB7IHNlcnZpY2U6ICdKYWVnZXIgKHRyYWNpbmcgVUkpJywgcG9ydDogMTY2ODYgfSxcbiAgICBdLFxuICB9LFxuICBtaW5pa3ViZToge1xuICAgIGlkOiAnbWluaWt1YmUnLFxuICAgIGxhYmVsOiAnTWluaWt1YmUgKGxvY2FsIEt1YmVybmV0ZXMpJyxcbiAgICBkaXI6ICdkZXBsb3kvbWluaWt1YmUnLFxuICAgIGVudHJ5cG9pbnQ6ICdiaW4vc2V0dXAuc2gnLFxuICAgIHNwYXJzZVBhdGhzOiBbJ2RlcGxveS9taW5pa3ViZSddLFxuICAgIHJlcXVpcmVkOiBbXSxcbiAgICBvcHRpb25hbDogW10sXG4gICAgcG9zdERlcGxveTogJy4vZGVwbG95L2Jpbi9pbml0LXBsYXRmb3JtLnNoIG1pbmlrdWJlJyxcbiAgICBjb3N0OiAnRnJlZScsXG4gICAgYmVzdEZvcjogJ0xvY2FsIEt1YmVybmV0ZXMnLFxuICAgIGRlcGxveXM6ICd0aGUgcGxhdGZvcm0gb250byBhIGxvY2FsIE1pbmlrdWJlIGNsdXN0ZXIg4oCUIHRoZSBzYW1lIHNlcnZpY2VzIGFzIEt1YmVybmV0ZXMgRGVwbG95bWVudHMvU2VydmljZXMgYmVoaW5kIGFuIGluZ3Jlc3MsIHBsdXMgaW4tY2x1c3RlciBwb3N0Z3JlcyArIG1vbmdvICsgcmVkaXMuIEZpcnN0IHJ1biBwdWxscyBpbWFnZXMsIGJ1aWxkcyB0aGUgY2x1c3RlciwgYW5kIGdlbmVyYXRlcyBhIFRMUyBjZXJ0IChzZXZlcmFsIG1pbnV0ZXMpLicsXG4gICAgZGVzdHJveXM6ICdzdG9wcyB0aGUgbWluaWt1YmUgc3RhY2sg4oCUIHBlcnNpc3RlbnQgdm9sdW1lcyAoUFZDIGRhdGEpIHJlbWFpbiB1bnRpbCB0aGUgY2x1c3RlciBpcyBkZWxldGVkJyxcbiAgICAvLyBNaXJyb3JzIHRoZSBrdWJlY3RsIHBvcnQtZm9yd2FyZHMgc3RhcnRlZCBpbiBkZXBsb3kvbWluaWt1YmUvYmluL3NldHVwLnNoLlxuICAgIGhvc3RQb3J0czogW1xuICAgICAgeyBzZXJ2aWNlOiAnbmdpbngg4oCUIEhUVFBTIGdhdGV3YXkgKFVJL0FQSSknLCBwb3J0OiA4NDQzIH0sXG4gICAgICB7IHNlcnZpY2U6ICdNb25nbyBFeHByZXNzIChNb25nbyBVSSknLCBwb3J0OiA4MDgxIH0sXG4gICAgICB7IHNlcnZpY2U6ICdwZ0FkbWluIChQb3N0Z3JlcyBVSSknLCBwb3J0OiA1NDgwIH0sXG4gICAgXSxcbiAgfSxcbiAgZWMyOiB7XG4gICAgaWQ6ICdlYzInLFxuICAgIGxhYmVsOiAnQVdTIEVDMiAoc2luZ2xlIE1pbmlrdWJlIGluc3RhbmNlIGJlaGluZCBhbiBBTEIpJyxcbiAgICBkaXI6ICdkZXBsb3kvYXdzL2VjMicsXG4gICAgZW50cnlwb2ludDogJ2Jpbi9zZXR1cC5zaCcsXG4gICAgc3BhcnNlUGF0aHM6IFsnZGVwbG95L2F3cy9lYzInXSxcbiAgICByZXF1aXJlZDogW0tFWV9QQUlSLCBET01BSU4sIEhPU1RFRF9aT05FXSxcbiAgICBvcHRpb25hbDogW1JFR0lPTiwgREVQTE9ZX01PREUsIEdIQ1JfVE9LRU4sIElOU1RBTkNFX1RZUEUsIC4uLkVNQUlMXSxcbiAgICBwb3N0RGVwbG95OiAnLi9kZXBsb3kvYmluL2luaXQtcGxhdGZvcm0uc2ggZWMyICAjIGZyb20gaW5zaWRlIHRoZSBWUEMgKFNTTSknLFxuICAgIGNvc3Q6ICd+JDE0MC0yNjUvbW8nLFxuICAgIGJlc3RGb3I6ICdEZXYgLyBzdGFnaW5nJyxcbiAgICBkZXBsb3lzOiAndGhlIHBsYXRmb3JtIG9uIGEgc2luZ2xlIEVDMiBpbnN0YW5jZSB2aWEgQ2xvdWRGb3JtYXRpb24g4oCUIGEgVlBDLCB0aGUgaW5zdGFuY2UgKHJ1bm5pbmcgdGhlIE1pbmlrdWJlIHN0YWNrKSwgYW4gQUxCLCBhIFJvdXRlIDUzIHJlY29yZCArIEFDTSBjZXJ0IGZvciB0aGUgZG9tYWluLCBhbmQgKGJ5IGRlZmF1bHQpIFNFUyBlbWFpbC4gVGhlIGluc3RhbmNlIHB1bGxzIGltYWdlcyBvbiBmaXJzdCBib290LicsXG4gICAgZGVzdHJveXM6ICdERUxFVEVTIHRoZSBDbG91ZEZvcm1hdGlvbiBzdGFjazogdGhlIFZQQywgRUMyIGluc3RhbmNlLCBhbmQgaXRzIEVCUyBkYXRhIHZvbHVtZSAoZGF0YWJhc2VzLCByZWdpc3RyeSwgcGx1Z2luIGJ1aWxkcykuIElycmV2ZXJzaWJsZS4nLFxuICAgIGhvc3RQb3J0czogW10sIC8vIHJlbW90ZSAoQVdTKSDigJQgYmluZHMgbm90aGluZyBvbiB0aGUgb3BlcmF0b3IncyBtYWNoaW5lXG4gIH0sXG4gIGZhcmdhdGU6IHtcbiAgICBpZDogJ2ZhcmdhdGUnLFxuICAgIGxhYmVsOiAnQVdTIEZhcmdhdGUgKHNlcnZlcmxlc3MgRUNTLCA2IENsb3VkRm9ybWF0aW9uIHN0YWNrcyknLFxuICAgIGRpcjogJ2RlcGxveS9hd3MvZmFyZ2F0ZScsXG4gICAgZW50cnlwb2ludDogJ2Jpbi9zZXR1cC5zaCcsXG4gICAgc3BhcnNlUGF0aHM6IFsnZGVwbG95L2F3cy9mYXJnYXRlJ10sXG4gICAgcmVxdWlyZWQ6IFtET01BSU4sIEhPU1RFRF9aT05FXSxcbiAgICBvcHRpb25hbDogW1JFR0lPTiwgREVQTE9ZX01PREUsIEdIQ1JfVE9LRU4sIC4uLkVNQUlMXSxcbiAgICBwb3N0RGVwbG95OiAnLi9kZXBsb3kvYmluL2luaXQtcGxhdGZvcm0uc2ggZmFyZ2F0ZSAgIyBmcm9tIGEgVlBDLWF0dGFjaGVkIGhvc3QnLFxuICAgIGNvc3Q6ICd+JDEwMC0zMDAvbW8nLFxuICAgIGJlc3RGb3I6ICdQcm9kdWN0aW9uJyxcbiAgICBkZXBsb3lzOiAndGhlIHBsYXRmb3JtIG9uIHNlcnZlcmxlc3MgRUNTIEZhcmdhdGUgdmlhIDYgQ2xvdWRGb3JtYXRpb24gc3RhY2tzIOKAlCBhIFZQQywgYW4gQUxCLCB0aGUgRUNTIHNlcnZpY2VzLCBFRlMtYmFja2VkIGRhdGFiYXNlcyArIHJlZ2lzdHJ5LCBSb3V0ZSA1MyArIEFDTSBmb3IgdGhlIGRvbWFpbiwgYW5kIChieSBkZWZhdWx0KSBTRVMgZW1haWwuIFNlY3JldHMgYXJlIGdlbmVyYXRlZCBpbnRvIFNlY3JldHMgTWFuYWdlciBmaXJzdC4nLFxuICAgIGRlc3Ryb3lzOiAnREVMRVRFUyBhbGwgcGItKiBDbG91ZEZvcm1hdGlvbiBzdGFja3M6IEVGUyBkYXRhLCBkYXRhYmFzZXMsIGFuZCByZWdpc3RyeS4gU2VjcmV0cyBNYW5hZ2VyIGVudHJpZXMgYXJlIE5PVCBhdXRvLWRlbGV0ZWQuIElycmV2ZXJzaWJsZS4nLFxuICAgIGhvc3RQb3J0czogW10sIC8vIHJlbW90ZSAoQVdTKSDigJQgYmluZHMgbm90aGluZyBvbiB0aGUgb3BlcmF0b3IncyBtYWNoaW5lXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgVEFSR0VUX0lEUzogcmVhZG9ubHkgVGFyZ2V0SWRbXSA9IFsnbG9jYWwnLCAnbWluaWt1YmUnLCAnZWMyJywgJ2ZhcmdhdGUnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFyZ2V0SWQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUYXJnZXRJZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIChUQVJHRVRfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSk7XG59XG5cbi8vIC0tLSBTcGFyc2UgYm9vdHN0cmFwIHBhdGhzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBGb2xkZXJzIGV2ZXJ5IGAtLXJlcG9gIGJvb3RzdHJhcCBuZWVkcyByZWdhcmRsZXNzIG9mIHRhcmdldDogdGhlIG9yY2hlc3RyYXRpb25cbiAqIHNjcmlwdHMuIEVhY2ggdGFyZ2V0J3Mgc2V0dXAuc2ggKyBpbml0LXBsYXRmb3JtLnNoIGxpdmUgaW4gLyBkcml2ZSB0aGVzZS5cbiAqIERlbGliZXJhdGVseSBtaW5pbWFsIOKAlCBoZWF2aWVyIGZvbGRlcnMgKHBsdWdpbnMvY29tcGxpYW5jZS9zYW1wbGVzKSBhcmUgcHVsbGVkXG4gKiBpbiBvbmx5IHdoZW4gdGhlaXIgcG9zdC1pbnN0YWxsIG9wdGlvbiBpcyBzZWxlY3RlZCAoc2VlIExPQURfU1RFUFMpLlxuICovXG5leHBvcnQgY29uc3QgQ09NTU9OX1NQQVJTRV9QQVRIUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbJ2RlcGxveS9iaW4nXTtcblxuLyoqXG4gKiBPcHQtaW4gcG9zdC1pbnN0YWxsIGxvYWQgc3RlcHMuIEVhY2ggbWFwcyBhIHByb3Zpc2lvbiBgLS13aXRoLSpgIGZsYWcgdG8gdGhlXG4gKiBpbml0LXBsYXRmb3JtIGVudiB2YXIgdGhhdCBlbmFibGVzIGl0IEFORCB0aGUgcmVwbyBmb2xkZXIocykgaXQgcmVhZHMg4oCUIHNvIHRoZVxuICogc3BhcnNlIGNoZWNrb3V0IGdyb3dzIGV4YWN0bHkgd2l0aCB0aGUgc2VsZWN0ZWQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IExPQURfU1RFUFMgPSBbXG4gIC8vIFRoZSBwbHVnaW4gYnVpbGQgcmVhZHMgZGVwbG95L3BsdWdpbnMvX2Jhc2UgQU5EIGRlcGxveS9jb2RlYnVpbGQvYm9vdHN0cmFwLlxuICB7IGlkOiAncGx1Z2lucycsIGZsYWc6ICd3aXRoUGx1Z2lucycsIGVudjogJ0xPQURfUExVR0lOUycsIHBhdGhzOiBbJ2RlcGxveS9wbHVnaW5zJywgJ2RlcGxveS9jb2RlYnVpbGQnXSB9LFxuICB7IGlkOiAnY29tcGxpYW5jZScsIGZsYWc6ICd3aXRoQ29tcGxpYW5jZScsIGVudjogJ0xPQURfQ09NUExJQU5DRScsIHBhdGhzOiBbJ2RlcGxveS9jb21wbGlhbmNlJ10gfSxcbiAgeyBpZDogJ3NhbXBsZXMnLCBmbGFnOiAnd2l0aFNhbXBsZXMnLCBlbnY6ICdMT0FEX1BJUEVMSU5FUycsIHBhdGhzOiBbJ2RlcGxveS9zYW1wbGVzJ10gfSxcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIExvYWRTdGVwSWQgPSAodHlwZW9mIExPQURfU1RFUFMpW251bWJlcl1bJ2lkJ107XG5cbi8qKlxuICogVGhlIGRlLWR1cGxpY2F0ZWQgc2V0IG9mIHNwYXJzZSBwYXRocyBmb3IgYSB0YXJnZXQgcGx1cyB0aGUgZW5hYmxlZCBsb2FkXG4gKiBzdGVwczogY29tbW9uIGJhc2Ug4oiqIHRhcmdldCBmb2xkZXIocykg4oiqIGVhY2ggZW5hYmxlZCBzdGVwJ3MgZm9sZGVyKHMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlUGF0aHNGb3IodGFyZ2V0OiBUYXJnZXRJZCwgZW5hYmxlZExvYWRJZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihDT01NT05fU1BBUlNFX1BBVEhTKTtcbiAgZm9yIChjb25zdCBwIG9mIFRBUkdFVFNbdGFyZ2V0XS5zcGFyc2VQYXRocykgcGF0aHMuYWRkKHApO1xuICBmb3IgKGNvbnN0IHN0ZXAgb2YgTE9BRF9TVEVQUykge1xuICAgIGlmIChlbmFibGVkTG9hZElkcy5pbmNsdWRlcyhzdGVwLmlkKSkgZm9yIChjb25zdCBwIG9mIHN0ZXAucGF0aHMpIHBhdGhzLmFkZChwKTtcbiAgfVxuICByZXR1cm4gWy4uLnBhdGhzXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3NlbWJsZVJlc3VsdCB7XG4gIC8qKiBUaGUgZXhhY3QgY29tbWFuZCB0byBydW4g4oCUIHNlY3JldHMgbWFza2VkIGFzIGAqKipgLiAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG4gIC8qKiBSZXF1aXJlZCBpbnB1dHMgdGhhdCB3ZXJlIG5vdCBzdXBwbGllZC4gKi9cbiAgcmVhZG9ubHkgbWlzc2luZzogcmVhZG9ubHkgSW5wdXRTcGVjW107XG59XG5cbi8qKlxuICogQXNzZW1ibGUgdGhlIGRlcGxveSBjb21tYW5kIGZvciBhIHRhcmdldCBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbXMuIFB1cmUgYW5kXG4gKiBkZXRlcm1pbmlzdGljIOKAlCBubyBzaGVsbCwgbm8gTExNLiBNaXNzaW5nIHJlcXVpcmVkIGlucHV0cyBhcmUgcmVwb3J0ZWQgKG5ldmVyXG4gKiBndWVzc2VkKS4gQnkgZGVmYXVsdCBzZWNyZXRzIGFyZSBtYXNrZWQgKGAqKipgKSBmb3IgRElTUExBWTsgcGFzcyBgbWFzazogZmFsc2VgXG4gKiB0byBidWlsZCB0aGUgcmVhbCBjb21tYW5kIGZvciBFWEVDVVRJT04g4oCUIHRoYXQgc3RyaW5nIG11c3QgbmV2ZXIgYmUgbG9nZ2VkIG9yXG4gKiBzaG93biB0byB0aGUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZUNvbW1hbmQoXG4gIHRhcmdldDogVGFyZ2V0U3BlYyxcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0czogeyBtYXNrPzogYm9vbGVhbiB9ID0ge30sXG4pOiBBc3NlbWJsZVJlc3VsdCB7XG4gIGNvbnN0IG1hc2sgPSBvcHRzLm1hc2sgPz8gdHJ1ZTtcbiAgY29uc3QgcHJvdmlkZWQgPSAoc3BlYzogSW5wdXRTcGVjKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgdiA9IHBhcmFtc1tzcGVjLmtleV07XG4gICAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSAnJyAmJiB2ICE9PSBmYWxzZTtcbiAgfTtcblxuICBjb25zdCBtaXNzaW5nID0gdGFyZ2V0LnJlcXVpcmVkLmZpbHRlcigoc3BlYykgPT4gIXByb3ZpZGVkKHNwZWMpKTtcblxuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbYGNkICR7dGFyZ2V0LmRpcn0gJiYgYmFzaCAke3RhcmdldC5lbnRyeXBvaW50fWBdO1xuICBmb3IgKGNvbnN0IHNwZWMgb2YgWy4uLnRhcmdldC5yZXF1aXJlZCwgLi4udGFyZ2V0Lm9wdGlvbmFsXSkge1xuICAgIGlmICghcHJvdmlkZWQoc3BlYykpIGNvbnRpbnVlO1xuICAgIGlmIChzcGVjLmJvb2xlYW4pIHtcbiAgICAgIHBhcnRzLnB1c2goYC0tJHtzcGVjLmZsYWd9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBzcGVjLnNlY3JldCAmJiBtYXNrID8gJyoqKicgOiBTdHJpbmcocGFyYW1zW3NwZWMua2V5XSk7XG4gICAgcGFydHMucHVzaChgLS0ke3NwZWMuZmxhZ30gJHt2YWx1ZX1gKTtcbiAgfVxuXG4gIHJldHVybiB7IGNvbW1hbmQ6IHBhcnRzLmpvaW4oJyBcXFxcXFxuICAnKSwgbWlzc2luZyB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlYXJkb3duUmVzdWx0IHtcbiAgLyoqIFRoZSBleGFjdCB0ZWFyZG93biBjb21tYW5kIHRvIHJ1bi4gKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGlzIHRlYXJkb3duIGlycmV2ZXJzaWJseSBkZXN0cm95cyBkYXRhIChBV1MgdGFyZ2V0cykuICovXG4gIHJlYWRvbmx5IGRlc3RydWN0aXZlOiBib29sZWFuO1xufVxuXG4vKiogQ2xvdWRGb3JtYXRpb24gc3RhY2sgbmFtZSB0aGUgRUMyIHNldHVwLnNoIGRlZmF1bHRzIHRvLiAqL1xuY29uc3QgREVGQVVMVF9FQzJfU1RBQ0sgPSAncGlwZWxpbmUtYnVpbGRlcic7XG4vKiogU3RhY2sgcHJlZml4IHRoZSBGYXJnYXRlIHRlYXJkb3duLnNoIGRlZmF1bHRzIHRvLiAqL1xuY29uc3QgREVGQVVMVF9GQVJHQVRFX1BSRUZJWCA9ICdwYic7XG5cbi8qKlxuICogQXNzZW1ibGUgdGhlIHRlYXJkb3duIGNvbW1hbmQgZm9yIGEgdGFyZ2V0LiBQdXJlIGFuZCBkZXRlcm1pbmlzdGljIOKAlCBtaXJyb3JzXG4gKiBgYXNzZW1ibGVDb21tYW5kYCBmb3IgdGhlIGRlc3Ryb3kgcGF0aC4gbG9jYWwvbWluaWt1YmUgU1RPUCB0aGUgc3RhY2tcbiAqIChub24tZGVzdHJ1Y3RpdmUg4oCUIG9uLWRpc2sgLyBQVkMgZGF0YSBzdXJ2aXZlcyk7IGVjMi9mYXJnYXRlIERFTEVURSB0aGVpclxuICogQ2xvdWRGb3JtYXRpb24gc3RhY2tzIGFuZCBhcmUgaXJyZXZlcnNpYmxlLiBGb3IgRmFyZ2F0ZSwgYGFzc3VtZVllc2AgZm9yd2FyZHNcbiAqIHRoZSBuYXRpdmUgc2NyaXB0J3Mgb3duIGAtLXllc2AgKHRoZSBhZ2VudCBydW5zIGl0cyBvd24gdHlwZWQgY29uZmlybWF0aW9uXG4gKiBmaXJzdCwgc28gdGhlIHNjcmlwdCBtdXN0IG5vdCBhbHNvIGJsb2NrIG9uIHN0ZGluKTsgRUMyIGBkZWxldGUtc3RhY2tgIGhhcyBub1xuICogbmF0aXZlIHByb21wdCwgd2hpY2ggaXMgZXhhY3RseSB3aHkgdGhlIGFnZW50IGdhdGUgaXMgbWFuZGF0b3J5IHRoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVhcmRvd25Db21tYW5kKFxuICB0YXJnZXQ6IFRhcmdldElkLFxuICBvcHRzOiB7IHN0YWNrTmFtZT86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nOyBhc3N1bWVZZXM/OiBib29sZWFuIH0gPSB7fSxcbik6IFRlYXJkb3duUmVzdWx0IHtcbiAgY29uc3QgcmVnaW9uID0gb3B0cy5yZWdpb24gfHwgcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB8fCAndXMtZWFzdC0xJztcbiAgc3dpdGNoICh0YXJnZXQpIHtcbiAgICBjYXNlICdsb2NhbCc6XG4gICAgICByZXR1cm4geyBjb21tYW5kOiAnY2QgZGVwbG95L2xvY2FsICYmIGJhc2ggYmluL3NodXRkb3duLnNoJywgZGVzdHJ1Y3RpdmU6IGZhbHNlIH07XG4gICAgY2FzZSAnbWluaWt1YmUnOlxuICAgICAgcmV0dXJuIHsgY29tbWFuZDogJ2NkIGRlcGxveS9taW5pa3ViZSAmJiBiYXNoIGJpbi9zaHV0ZG93bi5zaCcsIGRlc3RydWN0aXZlOiBmYWxzZSB9O1xuICAgIGNhc2UgJ2VjMic6IHtcbiAgICAgIGNvbnN0IHN0YWNrID0gb3B0cy5zdGFja05hbWUgfHwgREVGQVVMVF9FQzJfU1RBQ0s7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kOlxuICAgICAgICAgIGBhd3MgY2xvdWRmb3JtYXRpb24gZGVsZXRlLXN0YWNrIC0tc3RhY2stbmFtZSAke3N0YWNrfSAtLXJlZ2lvbiAke3JlZ2lvbn0gJiYgYCArXG4gICAgICAgICAgYGF3cyBjbG91ZGZvcm1hdGlvbiB3YWl0IHN0YWNrLWRlbGV0ZS1jb21wbGV0ZSAtLXN0YWNrLW5hbWUgJHtzdGFja30gLS1yZWdpb24gJHtyZWdpb259YCxcbiAgICAgICAgZGVzdHJ1Y3RpdmU6IHRydWUsXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdmYXJnYXRlJzoge1xuICAgICAgY29uc3QgcHJlZml4ID0gb3B0cy5zdGFja05hbWUgfHwgREVGQVVMVF9GQVJHQVRFX1BSRUZJWDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmQ6XG4gICAgICAgICAgYGNkIGRlcGxveS9hd3MvZmFyZ2F0ZSAmJiBiYXNoIGJpbi90ZWFyZG93bi5zaCAtLXN0YWNrLXByZWZpeCAke3ByZWZpeH0gLS1yZWdpb24gJHtyZWdpb259YCArXG4gICAgICAgICAgKG9wdHMuYXNzdW1lWWVzID8gJyAtLXllcycgOiAnJyksXG4gICAgICAgIGRlc3RydWN0aXZlOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../src/commands/provision.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqEpC;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsgBhD"}
1
+ {"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../src/commands/provision.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsEpC;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2hBhD"}
@@ -8,6 +8,7 @@ import { diagnoseFailure, isAiConfigured, parseGoal } from '../agent/ai.js';
8
8
  import { bootstrapCommand, resolveBootstrap } from '../agent/bootstrap.js';
9
9
  import { entrypointExists, executionBlocked, runScript } from '../agent/executor.js';
10
10
  import { deriveHealthUrl, waitHealthy, ensureMinikubeGateway } from '../agent/health.js';
11
+ import { checkHostPorts } from '../agent/ports.js';
11
12
  import { resolvePostSteps } from '../agent/post-steps.js';
12
13
  import { checkPrereqs, gitAvailable, gitSupportsSparseCheckout, prereqsSatisfied } from '../agent/prereqs.js';
13
14
  import { TOOLS_DIR, fetchTool, isFetchable, withToolsOnPath } from '../agent/tools.js';
@@ -322,6 +323,28 @@ export function provision(program) {
322
323
  for (const s of skippedSteps)
323
324
  printWarning(`skipped ${s.id}: ${s.reason}`);
324
325
  }
326
+ // 5b. Host-port pre-flight (local/minikube only). The deploy binds fixed host
327
+ // ports (Docker publish / kubectl port-forward); if one is taken, a container
328
+ // or forward fails to bind mid-deploy — and for the gateway that surfaces as a
329
+ // silent "/health never reachable" hang. Stop NOW with a summary instead of
330
+ // failing halfway. Remote targets (ec2/fargate) bind nothing locally → skipped.
331
+ if (spec.hostPorts.length > 0) {
332
+ const portChecks = await checkHostPorts(spec);
333
+ const taken = portChecks.filter((c) => !c.available);
334
+ printSection('Port availability');
335
+ for (const c of portChecks)
336
+ printInfo(`${c.available ? '✓' : '✗'} ${String(c.port).padEnd(5)} — ${c.service}`);
337
+ if (taken.length > 0) {
338
+ printError(`\n${taken.length} required port(s) already in use — the deploy can't bind them and would fail mid-way. Free them and re-run:`);
339
+ for (const c of taken)
340
+ printInfo(` • port ${c.port} (${c.service}) — find the holder: lsof -i :${c.port}`);
341
+ if (taken.some((c) => c.port === 5000)) {
342
+ printInfo(' Note: on macOS, port 5000 is usually AirPlay Receiver — System Settings → General → AirDrop & Handoff → AirPlay Receiver (off).');
343
+ }
344
+ process.exitCode = 1;
345
+ return;
346
+ }
347
+ }
325
348
  // 6. Any missing required prereq that's a single static binary (e.g. yq)
326
349
  // can be fetched into the tools cache instead of a system install — no
327
350
  // brew/apt. Offer it, then re-check (the cache dir is already on PATH).
@@ -595,4 +618,4 @@ export function provision(program) {
595
618
  }
596
619
  });
597
620
  }
598
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3Byb3Zpc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzlDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxRQUFRLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckYsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlHLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RixPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JFLE9BQU8sRUFDTCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFVBQVUsRUFDVixjQUFjLEVBQ2QsT0FBTyxFQUNQLFVBQVUsRUFDVixlQUFlLEdBR2hCLE1B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QztxQkFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQy9CLFNBQVMsQ0FBQywyRUFBMkUsQ0FBQyxDQUFDO2dCQUN6RixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFO2dCQUN0QyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUs7Z0JBQzNCLElBQUksRUFBRSxJQUFJO2dCQUNWLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFO2FBQy9DLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSAnbm9kZTpyZWFkbGluZS9wcm9taXNlcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGRpYWdub3NlRmFpbHVyZSwgaXNBaUNvbmZpZ3VyZWQsIHBhcnNlR29hbCB9IGZyb20gJy4uL2FnZW50L2FpLmpzJztcbmltcG9ydCB7IGJvb3RzdHJhcENvbW1hbmQsIHJlc29sdmVCb290c3RyYXAgfSBmcm9tICcuLi9hZ2VudC9ib290c3RyYXAuanMnO1xuaW1wb3J0IHsgZW50cnlwb2ludEV4aXN0cywgZXhlY3V0aW9uQmxvY2tlZCwgcnVuU2NyaXB0IH0gZnJvbSAnLi4vYWdlbnQvZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgZGVyaXZlSGVhbHRoVXJsLCB3YWl0SGVhbHRoeSwgZW5zdXJlTWluaWt1YmVHYXRld2F5IH0gZnJvbSAnLi4vYWdlbnQvaGVhbHRoLmpzJztcbmltcG9ydCB7IHJlc29sdmVQb3N0U3RlcHMgfSBmcm9tICcuLi9hZ2VudC9wb3N0LXN0ZXBzLmpzJztcbmltcG9ydCB7IGNoZWNrUHJlcmVxcywgZ2l0QXZhaWxhYmxlLCBnaXRTdXBwb3J0c1NwYXJzZUNoZWNrb3V0LCBwcmVyZXFzU2F0aXNmaWVkIH0gZnJvbSAnLi4vYWdlbnQvcHJlcmVxcy5qcyc7XG5pbXBvcnQgeyBUT09MU19ESVIsIGZldGNoVG9vbCwgaXNGZXRjaGFibGUsIHdpdGhUb29sc09uUGF0aCB9IGZyb20gJy4uL2FnZW50L3Rvb2xzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUVudkZpbGUsIGVudkZpbGVNaXNzaW5nIH0gZnJvbSAnLi4vYWdlbnQvZW52LWZpbGUuanMnO1xuaW1wb3J0IHtcbiAgYXNzZW1ibGVDb21tYW5kLFxuICBpc1RhcmdldElkLFxuICBMT0FEX1NURVBTLFxuICBzcGFyc2VQYXRoc0ZvcixcbiAgVEFSR0VUUyxcbiAgVEFSR0VUX0lEUyxcbiAgdGVhcmRvd25Db21tYW5kLFxuICB0eXBlIFRhcmdldElkLFxuICB0eXBlIFRhcmdldFNwZWMsXG59IGZyb20gJy4uL2FnZW50L3RhcmdldHMuanMnO1xuaW1wb3J0IHsgbWF0Y2hJc3N1ZXMsIHNlc1Bvc3REZXBsb3lHdWlkYW5jZSB9IGZyb20gJy4uL2FnZW50L3Ryb3VibGVzaG9vdC5qcyc7XG5pbXBvcnQgeyBwcmludENvbW1hbmRIZWFkZXIgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRTZWN0aW9uLCBwcmludEtleVZhbHVlLCBwcmludEluZm8sIHByaW50V2FybmluZywgcHJpbnRFcnJvciwgcHJpbnRTdWNjZXNzIH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LXV0aWxzLmpzJztcblxuLyoqXG4gKiBSZWFkIG9uZSBsaW5lIG9mIHRyaW1tZWQgaW5wdXQgZnJvbSB0aGUgdGVybWluYWwsIG93bmluZyB0aGUgcmVhZGxpbmVcbiAqIGxpZmVjeWNsZS4gVXNlZCBkaXJlY3RseSBmb3IgdGhlIGRlc3RydWN0aXZlIHRlYXJkb3duIGdhdGUgKGEgeS9OIGlzIHRvbyBlYXN5XG4gKiB0byBmYXQtZmluZ2VyLCBzbyB3ZSByZXF1aXJlIHRoZSBvcGVyYXRvciB0byBUWVBFIHRoZSB0YXJnZXQgaWQgYmFjayksIGFuZCBhc1xuICogdGhlIGJhc2lzIGZvciBgY29uZmlybWAuIERlbGliZXJhdGVseSBoYXMgbm8gYXV0by1hY2NlcHQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzayhxdWVzdGlvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UoeyBpbnB1dDogcHJvY2Vzcy5zdGRpbiwgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCB9KTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGF3YWl0IHJsLnF1ZXN0aW9uKHF1ZXN0aW9uKSkudHJpbSgpO1xuICB9IGZpbmFsbHkge1xuICAgIHJsLmNsb3NlKCk7XG4gIH1cbn1cblxuLyoqIEludGVyYWN0aXZlIHkvTiBjb25maXJtYXRpb247IGF1dG8tdHJ1ZSB3aGVuIGBhdXRvWWVzYCAodGhlIGAtLXllc2AgZmxhZykuICovXG5hc3luYyBmdW5jdGlvbiBjb25maXJtKHF1ZXN0aW9uOiBzdHJpbmcsIGF1dG9ZZXM6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGF1dG9ZZXMpIHJldHVybiB0cnVlO1xuICBjb25zdCBhbnN3ZXIgPSAoYXdhaXQgYXNrKGAke3F1ZXN0aW9ufSBbeS9OXSBgKSkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIGFuc3dlciA9PT0gJ3knIHx8IGFuc3dlciA9PT0gJ3llcyc7XG59XG5cbi8qKiBDb21tYW5kZXIgY29sbGVjdG9yOiBhY2N1bXVsYXRlIHJlcGVhdGVkIGAtLXBvc3Qtc3RlcGAgdmFsdWVzIGluIG9yZGVyLiAqL1xuZnVuY3Rpb24gY29sbGVjdFN0ZXAodmFsdWU6IHN0cmluZywgYWNjOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5hY2MsIHZhbHVlXTtcbn1cblxuLyoqXG4gKiBSZWRhY3Qgc2VjcmV0IHBhcmFtIHZhbHVlcyAoZS5nLiB0aGUgZ2hjciB0b2tlbikgZnJvbSBjYXB0dXJlZCBkZXBsb3kgb3V0cHV0XG4gKiBiZWZvcmUgaXQgaXMgc2VudCB0byB0aGUgTExNIGZvciBkaWFnbm9zaXMuIFRoZSBkZXBsb3kgcnVucyB3aXRoIHNlY3JldHNcbiAqIHVubWFza2VkLCBzbyBhbHRob3VnaCB0aGUgY3VycmVudCBzY3JpcHRzIGRvbid0IGVjaG8gdGhlbSwgdGhpcyBrZWVwcyBhIGZ1dHVyZVxuICogc2NyaXB0J3Mgc3RyYXkgZWNobyAob3IgYSB2ZXJib3NlIHN1Yi10b29sKSBmcm9tIGNyb3NzaW5nIHRoZSB0aGlyZC1wYXJ0eS1MTE1cbiAqIGJvdW5kYXJ5LlxuICovXG5mdW5jdGlvbiByZWRhY3RTZWNyZXRzKHRleHQ6IHN0cmluZywgc3BlYzogVGFyZ2V0U3BlYywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB7XG4gIGxldCBvdXQgPSB0ZXh0O1xuICBmb3IgKGNvbnN0IGlucHV0IG9mIFsuLi5zcGVjLnJlcXVpcmVkLCAuLi5zcGVjLm9wdGlvbmFsXSkge1xuICAgIGlmICghaW5wdXQuc2VjcmV0KSBjb250aW51ZTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtc1tpbnB1dC5rZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+PSA0KSBvdXQgPSBvdXQuc3BsaXQodmFsdWUpLmpvaW4oJyoqKicpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBgcHJvdmlzaW9uYCBjb21tYW5kIOKAlCBhbiBBSS1hc3Npc3RlZCBpbnN0YWxsZXIgZm9yIHRoZSBQaXBlbGluZVxuICogQnVpbGRlciBQTEFURk9STSAobG9jYWwvbWluaWt1YmUvRUMyL0ZhcmdhdGUpLiBJdCBwcmludHMgdGhlIGFzc2VtYmxlZCBwbGFuXG4gKiAocHJlcmVxIGNoZWNrcywgTkwtZ29hbCBwYXJzaW5nLCBjb21tYW5kIGFzc2VtYmx5KSBhbmQgdGhlbiBERVBMT1lTLCBnYXRlZCBieVxuICogY29uZmlybWF0aW9uIHByb21wdHMgKGAtLXllc2AgdG8gYXV0by1hY2NlcHQ7IGAtLWpzb25gIGlzIHRoZSBvbmx5IG5vbi1leGVjdXRpbmdcbiAqIG1vZGUsIHByaW50aW5nIHRoZSBwbGFuIGZvciB0b29saW5nKS4gV2l0aCBgLS1yZXBvYCBpdCBjYW4gYm9vdHN0cmFwIGEgZnJlc2hcbiAqIG1hY2hpbmUgYnkgc3BhcnNlbHkgY2xvbmluZyBvbmx5IHRoZSBkZXBsb3kgZm9sZGVycyB0aGUgc2VsZWN0ZWQgdGFyZ2V0ICtcbiAqIG9wdGlvbnMgbmVlZCwgdGhlbiBydW5zIHBvc3QtaW5zdGFsbCBzdGVwcyAocmVnaXN0ZXIgYWRtaW4sIG9wdC1pbiBsb2FkcyxcbiAqIHNtb2tlIHRlc3QsIGN1c3RvbSBjb21tYW5kcykuIGAtLXRlYXJkb3duYCByZW1vdmVzIGEgZGVwbG95bWVudCBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSBwcm9ncmFtIC0gVGhlIHJvb3QgQ29tbWFuZGVyIHByb2dyYW0gaW5zdGFuY2UgdG8gYXR0YWNoIHRoZSBjb21tYW5kIHRvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlzaW9uKHByb2dyYW06IENvbW1hbmQpOiB2b2lkIHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKCdwcm92aXNpb24nKVxuICAgIC5kZXNjcmlwdGlvbignQUktYXNzaXN0ZWQgaW5zdGFsbGVyIGZvciB0aGUgcGxhdGZvcm0gKGxvY2FsL21pbmlrdWJlL0VDMi9GYXJnYXRlKTogZGVwbG95cyBpdCAoZ2F0ZWQgYnkgY29uZmlybWF0aW9uIHByb21wdHMpLCBvciAtLXRlYXJkb3duIHRvIHJlbW92ZScpXG4gICAgLm9wdGlvbignLXQsIC0tdGFyZ2V0IDx0YXJnZXQ+JywgYERlcGxveSB0YXJnZXQ6ICR7VEFSR0VUX0lEUy5qb2luKCcgfCAnKX1gKVxuICAgIC5vcHRpb24oJy1wLCAtLXByb21wdCA8dGV4dD4nLCAnTmF0dXJhbC1sYW5ndWFnZSBnb2FsIChwYXJzZWQgaW50byBwYXJhbXMgd2hlbiBhbiBBSSBrZXkgaXMgc2V0KScpXG4gICAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbiAoRUMyL0ZhcmdhdGUpJylcbiAgICAub3B0aW9uKCctLWRvbWFpbiA8ZG9tYWluPicsICdGdWxseS1xdWFsaWZpZWQgZG9tYWluIG5hbWUgKEVDMi9GYXJnYXRlKScpXG4gICAgLm9wdGlvbignLS1ob3N0ZWQtem9uZS1pZCA8aWQ+JywgJ1B1YmxpYyBSb3V0ZSA1MyBob3N0ZWQgem9uZSBJRCAoRUMyL0ZhcmdhdGUpJylcbiAgICAub3B0aW9uKCctLWRlcGxveS1tb2RlIDxtb2RlPicsICdwdWJsaWMgfCBwcml2YXRlIChFQzIvRmFyZ2F0ZSknKVxuICAgIC5vcHRpb24oJy0ta2V5LXBhaXIgPG5hbWU+JywgJ0VDMiBrZXkgcGFpciAoRUMyKScpXG4gICAgLm9wdGlvbignLS1pbnN0YW5jZS10eXBlIDx0eXBlPicsICdFQzIgaW5zdGFuY2UgdHlwZSAoRUMyKScpXG4gICAgLm9wdGlvbignLS1naGNyLXRva2VuIDx0b2tlbj4nLCAnR2l0SHViIFBBVCAocmVhZDpwYWNrYWdlcykg4oCUIG1hc2tlZCBpbiBvdXRwdXQnKVxuICAgIC5vcHRpb24oJy0tZW1haWwnLCAnRW5hYmxlIFNFUyB0cmFuc2FjdGlvbmFsIGVtYWlsIChvbiBieSBkZWZhdWx0IGZvciBBV1MpJylcbiAgICAub3B0aW9uKCctLW5vLWVtYWlsJywgJ1NraXAgU0VTICh0cmFuc2FjdGlvbmFsIGVtYWlsIGlzIHByb3Zpc2lvbmVkIGJ5IGRlZmF1bHQgb24gQVdTKScpXG4gICAgLm9wdGlvbignLS1lbWFpbC1mcm9tIDxhZGRyPicsICdTRVMgRnJvbSBhZGRyZXNzJylcbiAgICAub3B0aW9uKCctLWVtYWlsLWZyb20tbmFtZSA8bmFtZT4nLCAnU0VTIEZyb20gZGlzcGxheSBuYW1lJylcbiAgICAub3B0aW9uKCctLWFsZXJ0LWVtYWlsIDxhZGRyPicsICdTdWJzY3JpYmUgYW4gYWRkcmVzcyB0byB0aGUgYm91bmNlL2NvbXBsYWludCBTTlMgdG9waWMnKVxuICAgIC5vcHRpb24oJy0tc2tpcC1zZXMtaWRlbnRpdHknLCAnU2tpcCBTRVMgaWRlbnRpdHkgY3JlYXRpb24gKGRvbWFpbiBhbHJlYWR5IHZlcmlmaWVkKScpXG4gICAgLm9wdGlvbignLS1haS1wcm92aWRlciA8cHJvdmlkZXI+JywgJ0FJIHByb3ZpZGVyIChhbnRocm9waWN8b3BlbmFpfGdvb2dsZXx4YWl8YmVkcm9jayknKVxuICAgIC5vcHRpb24oJy0tbW9kZWwgPG1vZGVsPicsICdBSSBtb2RlbCBpZCcpXG4gICAgLm9wdGlvbignLS1kaWFnbm9zZSA8ZmlsZT4nLCAnRGlhZ25vc2UgYSBDbG91ZEZvcm1hdGlvbi9kZXBsb3kgZmFpbHVyZSBmcm9tIGEgZmlsZSAobmVlZHMgYW4gQUkga2V5KScpXG4gICAgLm9wdGlvbignLXksIC0teWVzJywgJ0F1dG8tYWNjZXB0IGFsbCBjb25maXJtYXRpb24gcHJvbXB0cyAoZm9yIENJIC8gbm9uLWludGVyYWN0aXZlKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tcmV0cmllcyA8bj4nLCAnQXV0by1maXggKyByZXRyeSBhdHRlbXB0cyBhZnRlciBhIGZhaWx1cmUgKGRlcGxveSBzY3JpcHRzIGFyZSBpZGVtcG90ZW50KScsICcxJylcbiAgICAub3B0aW9uKCctLXRlYXJkb3duJywgJ1RlYXIgZG93biBhbiBleGlzdGluZyBkZXBsb3ltZW50IGluc3RlYWQgb2YgY3JlYXRpbmcgb25lIChnYXRlZDsgQVdTIHRhcmdldHMgcmVxdWlyZSBhIHR5cGVkIGNvbmZpcm1hdGlvbiknLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXN0YWNrLW5hbWUgPG5hbWU+JywgJ1N0YWNrIG5hbWUgKEVDMikgLyBzdGFjayBwcmVmaXggKEZhcmdhdGUpIHRvIHRlYXIgZG93biDigJQgZGVmYXVsdHMgdG8gdGhlIGRlcGxveSBkZWZhdWx0JylcbiAgICAub3B0aW9uKCctLWZvcmNlJywgJ1NraXAgdGhlIHRlYXJkb3duIHR5cGVkLWNvbmZpcm1hdGlvbiAoREFOR0VST1VTIOKAlCBmb3IgQ0kvYXV0b21hdGlvbiBvbmx5KScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tbm8taW5pdCcsICdTa2lwIHRoZSBwb3N0LWRlcGxveSByZWdpc3Rlci9pbml0LXBsYXRmb3JtIHN0ZXAnKVxuICAgIC8vIEJvb3RzdHJhcCAoc3BhcnNlIGNsb25lKSDigJQgcHJvdmlzaW9uIGEgZnJlc2ggbWFjaGluZSBpbiBvbmUgY29tbWFuZC5cbiAgICAub3B0aW9uKCctLXJlcG8gW3VybF0nLCAnQm9vdHN0cmFwOiBnaXQtY2xvbmUgdGhlIHBsYXRmb3JtIHJlcG8gZmlyc3QgKHNwYXJzZSDigJQgb25seSB0aGUgbmVlZGVkIGRlcGxveSBmb2xkZXJzKSwgdGhlbiBydW4gZnJvbSBpdCAobm8gdmFsdWUgPSB0aGUgdXBzdHJlYW0gZGVmYXVsdCknKVxuICAgIC5vcHRpb24oJy0tcmVmIDxyZWY+JywgJ0dpdCBicmFuY2gvdGFnIHRvIGNoZWNrIG91dCB3aGVuIGJvb3RzdHJhcHBpbmcgKGRlZmF1bHQ6IG1haW4pJylcbiAgICAub3B0aW9uKCctLXdvcmtkaXIgPGRpcj4nLCAnRGlyZWN0b3J5IHRvIGNsb25lIGludG8gLyBydW4gZnJvbSB3aGVuIGJvb3RzdHJhcHBpbmcgKGRlZmF1bHQ6IHBpcGVsaW5lLWJ1aWxkZXIpJylcbiAgICAvLyBQb3N0LWluc3RhbGwgbG9hZHMg4oCUIGVhY2ggb3B0LWluIHN0ZXAgYWxzbyBhZGRzIGl0cyBkZXBsb3kgZm9sZGVyIHRvIHRoZSBzcGFyc2UgY2xvbmUuXG4gICAgLm9wdGlvbignLS13aXRoLXBsdWdpbnMnLCAnUG9zdC1pbnN0YWxsOiBidWlsZCArIGxvYWQgcGx1Z2lucyAoYWRkcyBkZXBsb3kvcGx1Z2lucywgZGVwbG95L2NvZGVidWlsZCknLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXdpdGgtY29tcGxpYW5jZScsICdQb3N0LWluc3RhbGw6IGxvYWQgc2FtcGxlIGNvbXBsaWFuY2UgcnVsZXMvcG9saWNpZXMgKGFkZHMgZGVwbG95L2NvbXBsaWFuY2UpJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS13aXRoLXNhbXBsZXMnLCAnUG9zdC1pbnN0YWxsOiBsb2FkIHNhbXBsZSBwaXBlbGluZXMgKGFkZHMgZGVwbG95L3NhbXBsZXMpJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS13aXRoLWFsbCcsICdQb3N0LWluc3RhbGw6IHBsdWdpbnMgKyBjb21wbGlhbmNlICsgc2FtcGxlcycsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tYnVpbGQtYm9vdHN0cmFwJywgJ0J1aWxkICsgcHVibGlzaCB0aGUgQ29kZUJ1aWxkIGJvb3RzdHJhcCBpbWFnZSBkdXJpbmcgcmVnaXN0ZXIgKGFkZHMgZGVwbG95L2NvZGVidWlsZCknLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXdpdGgtc21va2UtdGVzdCcsICdQb3N0LWluc3RhbGw6IHJlYWQtb25seSBBUEkgcmVhY2hhYmlsaXR5IGNoZWNrJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS13aXRoLWV2ZW50cycsICdQb3N0LWluc3RhbGwgKEFXUyk6IGV2ZW50IGluZ2VzdGlvbiBidW5kbGUg4oCUIHN0b3JlLXRva2VuIChKV1Qg4oaSIFNlY3JldHMgTWFuYWdlcikgdGhlbiBzZXR1cC1ldmVudHMgKEV2ZW50QnJpZGdlL0xhbWJkYSknLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXBvc3Qtc3RlcCA8Y21kPicsICdSdW4gYW4gZXh0cmEgY29tbWFuZCBhZnRlciB0aGUgbG9hZHMgKHJlcGVhdGFibGUsIGluIG9yZGVyKScsIGNvbGxlY3RTdGVwLCBbXSlcbiAgICAub3B0aW9uKCctLWFkbWluLWVtYWlsIDxhZGRyPicsICdBZG1pbiBlbWFpbCBmb3Igbm9uLWludGVyYWN0aXZlIHJlZ2lzdGVyIChzZXRzIFBMQVRGT1JNX0lERU5USUZJRVIpJylcbiAgICAub3B0aW9uKCctLWFkbWluLXBhc3N3b3JkIDxwdz4nLCAnQWRtaW4gcGFzc3dvcmQgZm9yIG5vbi1pbnRlcmFjdGl2ZSByZWdpc3RlciAoc2V0cyBQTEFURk9STV9QQVNTV09SRCknKVxuICAgIC5vcHRpb24oJy0tanNvbicsICdQcmludCB0aGUgcGxhbiBhcyBKU09OIGFuZCBleGl0IFdJVEhPVVQgcnVubmluZyAodGhlIG9ubHkgbm9uLWV4ZWN1dGluZyBtb2RlIOKAlCBmb3IgdG9vbGluZy9DSSBpbnNwZWN0aW9uKScsIGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdQcm92aXNpb24nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gMS4gQXNzZW1ibGUgcGFyYW1zIGZyb20gZXhwbGljaXQgZmxhZ3MgKGZsYWdzIGFsd2F5cyB3aW4gb3ZlciBOTCBwYXJzZSkuXG4gICAgICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgICBkb21haW46IG9wdGlvbnMuZG9tYWluLFxuICAgICAgICAgIGhvc3RlZFpvbmVJZDogb3B0aW9ucy5ob3N0ZWRab25lSWQsXG4gICAgICAgICAgZGVwbG95TW9kZTogb3B0aW9ucy5kZXBsb3lNb2RlLFxuICAgICAgICAgIGtleVBhaXI6IG9wdGlvbnMua2V5UGFpcixcbiAgICAgICAgICBpbnN0YW5jZVR5cGU6IG9wdGlvbnMuaW5zdGFuY2VUeXBlLFxuICAgICAgICAgIGdoY3JUb2tlbjogb3B0aW9ucy5naGNyVG9rZW4sXG4gICAgICAgICAgLy8gQ29tbWFuZGVyIHRyaS1zdGF0ZXMgYGVtYWlsYDogdW5kZWZpbmVkIChuZWl0aGVyKSwgdHJ1ZSAoLS1lbWFpbCksXG4gICAgICAgICAgLy8gZmFsc2UgKC0tbm8tZW1haWwpLiBTRVMgaXMgb24gYnkgZGVmYXVsdCwgc28gb25seSAtLW5vLWVtYWlsIGlzXG4gICAgICAgICAgLy8gbG9hZC1iZWFyaW5nIChpdCBlbWl0cyBgLS1uby1lbWFpbGAgaW50byB0aGUgZGVwbG95IGNvbW1hbmQpLlxuICAgICAgICAgIGVtYWlsOiBvcHRpb25zLmVtYWlsID09PSB0cnVlLFxuICAgICAgICAgIG5vRW1haWw6IG9wdGlvbnMuZW1haWwgPT09IGZhbHNlLFxuICAgICAgICAgIGVtYWlsRnJvbTogb3B0aW9ucy5lbWFpbEZyb20sXG4gICAgICAgICAgZW1haWxGcm9tTmFtZTogb3B0aW9ucy5lbWFpbEZyb21OYW1lLFxuICAgICAgICAgIGFsZXJ0RW1haWw6IG9wdGlvbnMuYWxlcnRFbWFpbCxcbiAgICAgICAgICBub0NyZWF0ZVNlc0lkZW50aXR5OiBvcHRpb25zLnNraXBTZXNJZGVudGl0eSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYWlPcHRzID0geyBwcm92aWRlcjogb3B0aW9ucy5haVByb3ZpZGVyLCBtb2RlbDogb3B0aW9ucy5tb2RlbCB9O1xuXG4gICAgICAgIC8vIEJvb3RzdHJhcCAoc3BhcnNlIGNsb25lKSArIHBvc3QtaW5zdGFsbCBzZWxlY3Rpb25zLlxuICAgICAgICBjb25zdCB3YW50Qm9vdHN0cmFwID0gb3B0aW9ucy5yZXBvICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5yZXBvICE9PSBmYWxzZTtcbiAgICAgICAgY29uc3Qgd2l0aEFsbCA9IG9wdGlvbnMud2l0aEFsbCA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3QgYW55TG9hZEZsYWcgPSB3aXRoQWxsIHx8IExPQURfU1RFUFMuc29tZSgocykgPT4gb3B0aW9uc1tzLmZsYWddID09PSB0cnVlKTtcbiAgICAgICAgbGV0IGVuYWJsZWRMb2FkSWRzID0gTE9BRF9TVEVQUy5maWx0ZXIoKHMpID0+IHdpdGhBbGwgfHwgb3B0aW9uc1tzLmZsYWddID09PSB0cnVlKS5tYXAoKHMpID0+IHMuaWQpO1xuICAgICAgICAvLyBXaXRoIG5vIC0td2l0aC0qIGZsYWdzLCBhbiBpbnRlcmFjdGl2ZSBydW4gb2ZmZXJzIGVhY2ggbG9hZCDigJQgYnV0IEFGVEVSIHRoZVxuICAgICAgICAvLyBjbG9uZSwgc28gdGhlIHF1ZXN0aW9ucyBjb21lIG9uY2UgeW91J3ZlIGFncmVlZCB0byBwcm9jZWVkIChub3QgdXAgZnJvbnQpLlxuICAgICAgICAvLyBFYWNoIHBpY2tlZCBsb2FkJ3MgZm9sZGVyIGlzIHRoZW4gZmV0Y2hlZCB2aWEgYW4gYWRkaXRpdmUgc3BhcnNlIHJlLXN5bmMuXG4gICAgICAgIC8vIEZsYWdzIC8gLS15ZXMgLyAtLWpzb24gLyBub24taW50ZXJhY3RpdmUgc2hlbGxzIHNraXAgdGhlIHByb21wdHMuXG4gICAgICAgIGNvbnN0IHdpbGxQcm9tcHRMb2FkcyA9ICFvcHRpb25zLnllcyAmJiAhb3B0aW9ucy5qc29uICYmIEJvb2xlYW4ocHJvY2Vzcy5zdGRpbi5pc1RUWSkgJiYgIWFueUxvYWRGbGFnO1xuICAgICAgICBjb25zdCBwb3N0U3RlcEZsYWdzID0ge1xuICAgICAgICAgIGluaXQ6IG9wdGlvbnMuaW5pdCAhPT0gZmFsc2UsXG4gICAgICAgICAgYnVpbGRCb290c3RyYXA6IG9wdGlvbnMuYnVpbGRCb290c3RyYXAgPT09IHRydWUgfHwgZW5hYmxlZExvYWRJZHMuaW5jbHVkZXMoJ3BsdWdpbnMnKSxcbiAgICAgICAgICBzbW9rZVRlc3Q6IG9wdGlvbnMud2l0aFNtb2tlVGVzdCA9PT0gdHJ1ZSxcbiAgICAgICAgICBldmVudHM6IG9wdGlvbnMud2l0aEV2ZW50cyA9PT0gdHJ1ZSxcbiAgICAgICAgICBzdGVwczogKG9wdGlvbnMucG9zdFN0ZXAgPz8gW10pIGFzIHN0cmluZ1tdLFxuICAgICAgICB9O1xuICAgICAgICAvLyBBZG1pbiBjcmVkZW50aWFscyBmb3J3YXJkZWQgYXMgZW52IHNvIHJlZ2lzdGVyIHJ1bnMgbm9uLWludGVyYWN0aXZlbHkuXG4gICAgICAgIGNvbnN0IGFkbWluRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5hZG1pbkVtYWlsID09PSAnc3RyaW5nJykgYWRtaW5FbnYuUExBVEZPUk1fSURFTlRJRklFUiA9IG9wdGlvbnMuYWRtaW5FbWFpbDtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmFkbWluUGFzc3dvcmQgPT09ICdzdHJpbmcnKSBhZG1pbkVudi5QTEFURk9STV9QQVNTV09SRCA9IG9wdGlvbnMuYWRtaW5QYXNzd29yZDtcblxuICAgICAgICAvLyAyLiBPcHRpb25hbGx5IHBhcnNlIGEgbmF0dXJhbC1sYW5ndWFnZSBnb2FsIHRvIGZpbGwgYW55IEdBUFMgKGJlc3QtZWZmb3J0KS5cbiAgICAgICAgbGV0IHRhcmdldDogVGFyZ2V0SWQgfCB1bmRlZmluZWQgPSBpc1RhcmdldElkKG9wdGlvbnMudGFyZ2V0KSA/IG9wdGlvbnMudGFyZ2V0IDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAob3B0aW9ucy5wcm9tcHQpIHtcbiAgICAgICAgICBpZiAoaXNBaUNvbmZpZ3VyZWQoYWlPcHRzKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gYXdhaXQgcGFyc2VHb2FsKG9wdGlvbnMucHJvbXB0LCBhaU9wdHMpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgICBpZiAoIXRhcmdldCAmJiBpc1RhcmdldElkKHBhcnNlZC50YXJnZXQpKSB0YXJnZXQgPSBwYXJzZWQudGFyZ2V0O1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGsgIT09ICd0YXJnZXQnICYmIHBhcmFtc1trXSA9PT0gdW5kZWZpbmVkICYmIHYgIT09IHVuZGVmaW5lZCkgcGFyYW1zW2tdID0gdjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoJ0EgLS1wcm9tcHQgd2FzIGdpdmVuIGJ1dCBubyBBSSBrZXkgaXMgc2V0IOKAlCBpZ25vcmluZyBpdCBhbmQgdXNpbmcgZmxhZ3Mgb25seS4gU2V0IEFOVEhST1BJQ19BUElfS0VZIChvciAtLWFpLXByb3ZpZGVyICsgaXRzIGtleSkuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gT3B0aW9uYWwgZmFpbHVyZSBkaWFnbm9zaXMgKGluZGVwZW5kZW50IG9mIGEgZGVwbG95IHBsYW4pLlxuICAgICAgICBpZiAob3B0aW9ucy5kaWFnbm9zZSkge1xuICAgICAgICAgIGxldCBmYWlsdXJlVGV4dDogc3RyaW5nO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmYWlsdXJlVGV4dCA9IHJlYWRGaWxlU3luYyhvcHRpb25zLmRpYWdub3NlLCAndXRmLTgnKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHByaW50RXJyb3IoYENhbm5vdCByZWFkIC0tZGlhZ25vc2UgZmlsZTogJHtvcHRpb25zLmRpYWdub3NlfWApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGRpYWdub3NpcyA9IGlzQWlDb25maWd1cmVkKGFpT3B0cykgPyBhd2FpdCBkaWFnbm9zZUZhaWx1cmUoZmFpbHVyZVRleHQsIGFpT3B0cykgOiBudWxsO1xuICAgICAgICAgIC8vIFdpdGggLS1qc29uLCB0aGUgZGlhZ25vc2lzIElTIHRoZSBtYWNoaW5lLXJlYWRhYmxlIG91dHB1dCDigJQgZW1pdCBpdFxuICAgICAgICAgIC8vIGFsb25lIChkb24ndCBhbHNvIHByaW50IHRleHQsIHdoaWNoIHdvdWxkIGNvcnJ1cHQgdGhlIEpTT04gc3RyZWFtKS5cbiAgICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IHRydWUsIGV4ZWN1dGlvbklkLCBkaWFnbm9zaXMgfSwgbnVsbCwgMikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGlhZ25vc2lzKSB7XG4gICAgICAgICAgICBwcmludFNlY3Rpb24oJ0ZhaWx1cmUgZGlhZ25vc2lzJyk7XG4gICAgICAgICAgICBwcmludEluZm8oZGlhZ25vc2lzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKCdEaWFnbm9zaXMgdW5hdmFpbGFibGUgKG5vIEFJIGtleSBjb25maWd1cmVkIG9yIHRoZSBtb2RlbCBjb3VsZCBub3QgYmUgcmVhY2hlZCkuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LiBOZWVkIGEgdGFyZ2V0IHRvIGFzc2VtYmxlIGEgcGxhbi5cbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICBwcmludEVycm9yKGBObyB0YXJnZXQgc3BlY2lmaWVkLiBQYXNzIC0tdGFyZ2V0IDwke1RBUkdFVF9JRFMuam9pbignfCcpfT4gb3IgZGVzY3JpYmUgdGhlIGdvYWwgd2l0aCAtLXByb21wdC5gKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGVjID0gVEFSR0VUU1t0YXJnZXRdO1xuICAgICAgICBsZXQgY3dkID0gcHJvY2Vzcy5jd2QoKTtcblxuICAgICAgICAvLyA0Yi4gVGVhcmRvd24gbW9kZSDigJQgdGhlIGRlc3Ryb3kgY291bnRlcnBhcnQgb2YgcHJvdmlzaW9uaW5nLiBHYXRlZCBoYXJkZXJcbiAgICAgICAgLy8gdGhhbiBkZXBsb3k6IEFXUyB0YXJnZXRzIGFyZSBpcnJldmVyc2libGUsIHNvIHdlIHJlcXVpcmUgdGhlIG9wZXJhdG9yIHRvXG4gICAgICAgIC8vIFRZUEUgdGhlIHRhcmdldCBpZCAoLS1mb3JjZSBieXBhc3NlcyBmb3IgQ0k7IC0teWVzIGFsb25lIGRvZXMgTk9UKS5cbiAgICAgICAgaWYgKG9wdGlvbnMudGVhcmRvd24pIHtcbiAgICAgICAgICBjb25zdCB7IGNvbW1hbmQ6IGRvd25Db21tYW5kLCBkZXN0cnVjdGl2ZSB9ID0gdGVhcmRvd25Db21tYW5kKHRhcmdldCwge1xuICAgICAgICAgICAgc3RhY2tOYW1lOiBvcHRpb25zLnN0YWNrTmFtZSxcbiAgICAgICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgICAgICAvLyBPdXIgdHlwZWQgZ2F0ZSBJUyB0aGUgY29uZmlybWF0aW9uIOKAlCBmb3J3YXJkIC0teWVzIHNvIHRoZSBuYXRpdmVcbiAgICAgICAgICAgIC8vIHNjcmlwdCAoRmFyZ2F0ZSkgZG9lc24ndCBhbHNvIGJsb2NrIG9uIHN0ZGluIHdlJ3JlIGluaGVyaXRpbmcuXG4gICAgICAgICAgICBhc3N1bWVZZXM6IHRydWUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IHRydWUsIGV4ZWN1dGlvbklkLCB0YXJnZXQsIHRlYXJkb3duOiB0cnVlLCBkZXN0cnVjdGl2ZSwgZGVzdHJveXM6IHNwZWMuZGVzdHJveXMsIGNvbW1hbmQ6IGRvd25Db21tYW5kIH0sIG51bGwsIDIpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwcmludFNlY3Rpb24oYFRlYXJkb3duIHBsYW4g4oCUICR7c3BlYy5sYWJlbH1gKTtcbiAgICAgICAgICBwcmludEtleVZhbHVlKHsgJ1RhcmdldCc6IHRhcmdldCwgJ0Rlc3Ryb3lzJzogc3BlYy5kZXN0cm95cywgJ1N0b3BzIGNvc3QnOiBzcGVjLmNvc3QgfSk7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdDb21tYW5kIHRvIHJ1bicpO1xuICAgICAgICAgIHByaW50SW5mbyhkb3duQ29tbWFuZCk7XG5cbiAgICAgICAgICBpZiAoZGVzdHJ1Y3RpdmUgJiYgIW9wdGlvbnMuZm9yY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXNrKGBcXG5UaGlzIGlzIElSUkVWRVJTSUJMRS4gVHlwZSBcIiR7dGFyZ2V0fVwiIHRvIGNvbmZpcm0gdGVhcmRvd246IGApO1xuICAgICAgICAgICAgaWYgKHRva2VuICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgcHJpbnRXYXJuaW5nKCdUaGF0IGRpZG5cXCd0IG1hdGNoLCBzbyBub3RoaW5nIHdhcyBkZXN0cm95ZWQg4oCUIHlvdSBoYXZlIHRvIHR5cGUgdGhlIGV4YWN0IHRhcmdldCBpZCB0byBjb25maXJtLicpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICghZGVzdHJ1Y3RpdmUgJiYgIW9wdGlvbnMuZm9yY2UgJiYgIShhd2FpdCBjb25maXJtKCdcXG5Qcm9jZWVkIHdpdGggdGVhcmRvd24gKHN0b3BzIHRoZSBzdGFjazsgb24tZGlzayBkYXRhIHBlcnNpc3RzKT8nLCBvcHRpb25zLnllcykpKSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoJ05vIHByb2JsZW0g4oCUIG5vdGhpbmcgd2FzIGNoYW5nZWQuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdUZWFyaW5nIGRvd24nKTtcbiAgICAgICAgICBjb25zdCB7IGNvZGU6IGRvd25Db2RlIH0gPSBhd2FpdCBydW5TY3JpcHQoZG93bkNvbW1hbmQsIGN3ZCwgeyBjYXB0dXJlOiBmYWxzZSB9KTtcbiAgICAgICAgICBpZiAoZG93bkNvZGUgIT09IDApIHtcbiAgICAgICAgICAgIHByaW50RXJyb3IoYFxcblRlYXJkb3duIGZhaWxlZCAoZXhpdCAke2Rvd25Db2RlfSkuIEluc3BlY3QgdGhlIHN0YWNrL2NvbnRhaW5lcnMgYW5kIHJldHJ5LmApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHByaW50U3VjY2VzcygnVGVhcmRvd24gY29tcGxldGUuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBwcmV2aW91c2x5LWZldGNoZWQgc2luZ2xlLWJpbmFyeSB0b29scyAoZS5nLiB5cSkgdmlzaWJsZSB0byB0aGVcbiAgICAgICAgLy8gcHJlcmVxIGNoZWNrcyArIHRoZSBkZXBsb3kg4oCUIHRoZXkgbGl2ZSBpbiB0aGUgdG9vbHMgY2FjaGUsIG5vdCBvbiB0aGVcbiAgICAgICAgLy8gc3lzdGVtIFBBVEguIChCb3RoIGBoYXMoKWAgYW5kIHRoZSBkZXBsb3kncyBgYmFzaCAtbGNgIGluaGVyaXQgdGhpcy4pXG4gICAgICAgIHdpdGhUb29sc09uUGF0aCgpO1xuICAgICAgICBsZXQgcHJlcmVxcyA9IGNoZWNrUHJlcmVxcyh0YXJnZXQsIHsgYm9vdHN0cmFwOiB3YW50Qm9vdHN0cmFwLCB3aXRoUGx1Z2luczogd2lsbFByb21wdExvYWRzIHx8IGVuYWJsZWRMb2FkSWRzLmluY2x1ZGVzKCdwbHVnaW5zJykgfSk7XG4gICAgICAgIGNvbnN0IHsgY29tbWFuZCwgbWlzc2luZyB9ID0gYXNzZW1ibGVDb21tYW5kKHNwZWMsIHBhcmFtcyk7XG4gICAgICAgIGNvbnN0IHVybCA9IGRlcml2ZUhlYWx0aFVybCh0YXJnZXQsIHBhcmFtcyk7XG5cbiAgICAgICAgLy8gU3BhcnNlIGJvb3RzdHJhcCBjbG9uZSBjb21tYW5kIChjb21tb24gYmFzZSArIHRhcmdldCArIHNlbGVjdGVkIGxvYWRzKS5cbiAgICAgICAgLy8gSW50ZXJhY3RpdmUgbG9hZHMgYXJlIGNob3NlbiBBRlRFUiB0aGUgY2xvbmUsIHNvIHRoZSBjbG9uZSBzdGF5cyBtaW5pbWFsIOKAlFxuICAgICAgICAvLyBlYWNoIHBpY2tlZCBsb2FkJ3MgZm9sZGVyIGlzIGZldGNoZWQgdGhlbiB2aWEgYW4gYWRkaXRpdmUgc3BhcnNlIHJlLXN5bmMuXG4gICAgICAgIGNvbnN0IHNwYXJzZVBhdGhzID0gc3BhcnNlUGF0aHNGb3IodGFyZ2V0LCBlbmFibGVkTG9hZElkcyk7XG4gICAgICAgIGNvbnN0IGJvb3RzdHJhcCA9IHJlc29sdmVCb290c3RyYXAoXG4gICAgICAgICAgeyByZXBvOiB0eXBlb2Ygb3B0aW9ucy5yZXBvID09PSAnc3RyaW5nJyA/IG9wdGlvbnMucmVwbyA6IHVuZGVmaW5lZCwgcmVmOiBvcHRpb25zLnJlZiwgd29ya2Rpcjogb3B0aW9ucy53b3JrZGlyLCBmdWxsOiAhZ2l0U3VwcG9ydHNTcGFyc2VDaGVja291dCgpIH0sXG4gICAgICAgICAgc3BhcnNlUGF0aHMsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGJvb3RzdHJhcENtZCA9IHdhbnRCb290c3RyYXAgPyBib290c3RyYXBDb21tYW5kKGJvb3RzdHJhcCkgOiBudWxsO1xuXG4gICAgICAgIC8vIFJlc29sdmUgcG9zdC1pbnN0YWxsIHN0ZXBzIChyZWdpc3RlciDihpIgc21va2Ug4oaSIGV2ZW50cyDihpIgY3VzdG9tKS4gUmUtcmVzb2x2ZWRcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIHBvc3QtY2xvbmUgbG9hZCBwcm9tcHRzIChzZWUgYmVsb3cpIHdoZW4gdGhvc2UgcnVuIGludGVyYWN0aXZlbHkuXG4gICAgICAgIGxldCB7IHN0ZXBzOiBwb3N0U3RlcHMsIHNraXBwZWQ6IHNraXBwZWRTdGVwcyB9ID0gcmVzb2x2ZVBvc3RTdGVwcyh7XG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICByZWdpb246IHR5cGVvZiBwYXJhbXMucmVnaW9uID09PSAnc3RyaW5nJyA/IHBhcmFtcy5yZWdpb24gOiB1bmRlZmluZWQsXG4gICAgICAgICAgZW5hYmxlZExvYWRJZHMsXG4gICAgICAgICAgLi4ucG9zdFN0ZXBGbGFncyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHByZXJlcXMsXG4gICAgICAgICAgICBwcmVyZXFzU2F0aXNmaWVkOiBwcmVyZXFzU2F0aXNmaWVkKHByZXJlcXMpLFxuICAgICAgICAgICAgbWlzc2luZ0lucHV0czogbWlzc2luZy5tYXAoKG0pID0+ICh7IGZsYWc6IG0uZmxhZywgZGVzY3JpcHRpb246IG0uZGVzY3JpcHRpb24gfSkpLFxuICAgICAgICAgICAgYm9vdHN0cmFwOiBib290c3RyYXBDbWQsXG4gICAgICAgICAgICBzcGFyc2VQYXRoczogd2FudEJvb3RzdHJhcCA/IHNwYXJzZVBhdGhzIDogbnVsbCxcbiAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICBwb3N0U3RlcHM6IHBvc3RTdGVwcy5tYXAoKHMpID0+ICh7IGlkOiBzLmlkLCBsYWJlbDogcy5sYWJlbCwgY29tbWFuZDogcy5jb21tYW5kIH0pKSxcbiAgICAgICAgICAgIHNraXBwZWRQb3N0U3RlcHM6IHNraXBwZWRTdGVwcyxcbiAgICAgICAgICB9LCBudWxsLCAyKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gUHJpbnQgdGhlIHBsYW4gKHNob3duIGJlZm9yZSB0aGUgZ2F0ZWQgZXhlY3V0aW9uIGJlbG93KS5cbiAgICAgICAgcHJpbnRTZWN0aW9uKGBQcm92aXNpb24gcGxhbiDigJQgJHtzcGVjLmxhYmVsfWApO1xuICAgICAgICBwcmludEtleVZhbHVlKHsgJ1RhcmdldCc6IHRhcmdldCwgJ0Jlc3QgZm9yJzogc3BlYy5iZXN0Rm9yLCAnQ29zdCc6IHNwZWMuY29zdCB9KTtcblxuICAgICAgICBwcmludFNlY3Rpb24oJ1ByZXJlcXVpc2l0ZXMnKTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHByZXJlcXMpIHByaW50SW5mbyhgJHtjLm9rID8gJ+KckycgOiAn4pyXJ30gJHtjLm5hbWV9IOKAlCAke2MuZGV0YWlsfWApO1xuICAgICAgICBpZiAoIXByZXJlcXNTYXRpc2ZpZWQocHJlcmVxcykpIHByaW50V2FybmluZygnUmVzb2x2ZSB0aGUgZmFpbGluZyBwcmVyZXF1aXNpdGVzIGFib3ZlIGJlZm9yZSBkZXBsb3lpbmcuJyk7XG5cbiAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHByaW50U2VjdGlvbignTWlzc2luZyByZXF1aXJlZCBpbnB1dHMnKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG0gb2YgbWlzc2luZykgcHJpbnRJbmZvKGAgIC0tJHttLmZsYWd9ICAoJHttLmRlc2NyaXB0aW9ufSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib290c3RyYXBDbWQpIHtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ0Jvb3RzdHJhcCAoc3BhcnNlIGdpdCBjbG9uZSwgcnVucyBmaXJzdCknKTtcbiAgICAgICAgICBwcmludEluZm8oYENsb25lICR7Ym9vdHN0cmFwLnJlcG99IEAgJHtib290c3RyYXAucmVmfSDihpIgJHtib290c3RyYXAud29ya2Rpcn07IGZvbGRlcnM6ICR7c3BhcnNlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICAgICAgICBwcmludEluZm8oYm9vdHN0cmFwQ21kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50U2VjdGlvbignQ29tbWFuZCB0byBydW4nKTtcbiAgICAgICAgcHJpbnRJbmZvKGNvbW1hbmQpO1xuXG4gICAgICAgIGlmIChwb3N0U3RlcHMubGVuZ3RoID4gMCB8fCBza2lwcGVkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHByaW50U2VjdGlvbignUG9zdC1pbnN0YWxsIHN0ZXBzJyk7XG4gICAgICAgICAgZm9yIChjb25zdCBzIG9mIHBvc3RTdGVwcykgcHJpbnRJbmZvKGDigKIgJHtzLmxhYmVsfVxcbiAgICAke3MuY29tbWFuZH1gKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2tpcHBlZFN0ZXBzKSBwcmludFdhcm5pbmcoYHNraXBwZWQgJHtzLmlkfTogJHtzLnJlYXNvbn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDYuIEFueSBtaXNzaW5nIHJlcXVpcmVkIHByZXJlcSB0aGF0J3MgYSBzaW5nbGUgc3RhdGljIGJpbmFyeSAoZS5nLiB5cSlcbiAgICAgICAgLy8gY2FuIGJlIGZldGNoZWQgaW50byB0aGUgdG9vbHMgY2FjaGUgaW5zdGVhZCBvZiBhIHN5c3RlbSBpbnN0YWxsIOKAlCBub1xuICAgICAgICAvLyBicmV3L2FwdC4gT2ZmZXIgaXQsIHRoZW4gcmUtY2hlY2sgKHRoZSBjYWNoZSBkaXIgaXMgYWxyZWFkeSBvbiBQQVRIKS5cbiAgICAgICAgY29uc3QgZmV0Y2hhYmxlID0gcHJlcmVxcy5maWx0ZXIoKGMpID0+ICFjLm9rICYmIGMucmVxdWlyZWQgJiYgaXNGZXRjaGFibGUoYy5uYW1lKSk7XG4gICAgICAgIGlmIChmZXRjaGFibGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IG5hbWVzID0gZmV0Y2hhYmxlLm1hcCgoYykgPT4gYy5uYW1lKS5qb2luKCcsICcpO1xuICAgICAgICAgIGlmIChhd2FpdCBjb25maXJtKGBcXG4ke25hbWVzfSBub3QgaW5zdGFsbGVkIOKAlCBmZXRjaCB0aGUgb2ZmaWNpYWwgc3RhdGljIGJpbmFyeSBpbnRvICR7VE9PTFNfRElSfSAobm8gc3lzdGVtIGluc3RhbGwpP2AsIG9wdGlvbnMueWVzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGZldGNoYWJsZSkge1xuICAgICAgICAgICAgICBwcmludEluZm8oYEZldGNoaW5nICR7Yy5uYW1lfeKApmApO1xuICAgICAgICAgICAgICBpZiAoIWZldGNoVG9vbChjLm5hbWUpKSBwcmludFdhcm5pbmcoYENvdWxkbid0IGZldGNoICR7Yy5uYW1lfSDigJQgaW5zdGFsbCBpdCBtYW51YWxseSBhbmQgcmUtcnVuLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJlcmVxcyA9IGNoZWNrUHJlcmVxcyh0YXJnZXQsIHsgYm9vdHN0cmFwOiB3YW50Qm9vdHN0cmFwLCB3aXRoUGx1Z2luczogd2lsbFByb21wdExvYWRzIHx8IGVuYWJsZWRMb2FkSWRzLmluY2x1ZGVzKCdwbHVnaW5zJykgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gN2IuIEdhdGVkIGV4ZWN1dGlvbi4gQ2hlY2sgcHJlcmVxcyAvIHJlcXVpcmVkIGlucHV0cyBmaXJzdCDigJQgdGhpcyBhbHNvXG4gICAgICAgIC8vIGNhdGNoZXMgYSBtaXNzaW5nIGBnaXRgIHdoZW4gYm9vdHN0cmFwcGluZy5cbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IGV4ZWN1dGlvbkJsb2NrZWQocHJlcmVxcywgbWlzc2luZyk7XG4gICAgICAgIGlmIChibG9ja2VkKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcihgQ2FuJ3Qgc3RhcnQganVzdCB5ZXQg4oCUICR7YmxvY2tlZH0uIFJlc29sdmUgdGhhdCBhbmQgcmUtcnVuLmApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDdhLiBTcGFyc2UtY2xvbmUgdGhlIHBsYXRmb3JtIHJlcG8sIHJlcG9pbnQgY3dkLCBhbmQgdmVyaWZ5IHRoZSB0cmVlLlxuICAgICAgICAvLyBTaGFyZWQgYnkgYC0tcmVwb2AgKGJlbG93KSBhbmQgdGhlIGludGVyYWN0aXZlIG9mZmVyIGluIDdiLiBSZXR1cm5zXG4gICAgICAgIC8vIGZhbHNlIChhbmQgc2V0cyBleGl0Q29kZSkgb24gZmFpbHVyZSDigJQgd2l0aCBhIGZyaWVuZGx5IG1lc3NhZ2UuXG4gICAgICAgIC8vIGBib290c3RyYXBwZWRgIHJlY29yZHMgd2hldGhlciB3ZSBjcmVhdGVkIHRoZSBjbG9uZSAodnMuIHJ1bm5pbmcgaW5zaWRlIGFuXG4gICAgICAgIC8vIGV4aXN0aW5nIGNoZWNrb3V0KSDigJQgb25seSB0aGVuIGNhbiB3ZSBhZGRpdGl2ZWx5IHNwYXJzZS1mZXRjaCBsb2FkIGZvbGRlcnMuXG4gICAgICAgIGxldCBib290c3RyYXBwZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgYm9vdHN0cmFwQ2xvbmUgPSBhc3luYyAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgICAgY29uc3QgY21kID0gYm9vdHN0cmFwQ29tbWFuZChib290c3RyYXApO1xuICAgICAgICAgIHByaW50U2VjdGlvbignQm9vdHN0cmFwJyk7XG4gICAgICAgICAgcHJpbnRJbmZvKGNtZCk7XG4gICAgICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCBydW5TY3JpcHQoY21kLCBjd2QsIHsgY2FwdHVyZTogZmFsc2UgfSk7XG4gICAgICAgICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgICAgICAgIHByaW50RXJyb3IoYFxcblRoZSBjbG9uZSBkaWRuJ3QgZmluaXNoIChleGl0ICR7Y29kZX0pLiBEb3VibGUtY2hlY2sgdGhlIHJlcG8gVVJMIC8gcmVmIChvciB5b3VyIG5ldHdvcmspIGFuZCBnaXZlIGl0IGFub3RoZXIgZ28uYCk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3dkID0gcGF0aC5yZXNvbHZlKGN3ZCwgYm9vdHN0cmFwLndvcmtkaXIpO1xuICAgICAgICAgIGJvb3RzdHJhcHBlZCA9IHRydWU7XG4gICAgICAgICAgcHJpbnRTdWNjZXNzKGBSZXBvIGlzIHJlYWR5IOKAlCBjb250aW51aW5nIGZyb20gJHtjd2R9YCk7XG4gICAgICAgICAgY29uc3QgYWJzZW50ID0gc3BhcnNlUGF0aHMuZmlsdGVyKChwKSA9PiAhZXhpc3RzU3luYyhwYXRoLmpvaW4oY3dkLCBwKSkpO1xuICAgICAgICAgIGlmIChhYnNlbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcHJpbnRFcnJvcihgXFxuVGhlIHNwYXJzZSBjbG9uZSBpcyBtaXNzaW5nICR7YWJzZW50LmpvaW4oJywgJyl9IOKAlCB0aGF0IHJlZiBtYXkgbm90IGhhdmUgdGhvc2UgZm9sZGVycy4gVHJ5IGEgZGlmZmVyZW50IC0tcmVmLmApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGAtLXJlcG9gOiBjbG9uZSB1cCBmcm9udCAobXVzdCBwcmVjZWRlIHRoZSBlbnRyeXBvaW50IGNoZWNrKS5cbiAgICAgICAgaWYgKGJvb3RzdHJhcENtZCkge1xuICAgICAgICAgIHByaW50SW5mbyhgXFxuQm9vdHN0cmFwIOKGkiBjbG9uZSAke2Jvb3RzdHJhcC5yZXBvfSBAICR7Ym9vdHN0cmFwLnJlZn0gaW50byAke2Jvb3RzdHJhcC53b3JrZGlyfSAoc3BhcnNlKS5gKTtcbiAgICAgICAgICBpZiAoIShhd2FpdCBjb25maXJtKCdHbyBhaGVhZCB3aXRoIHRoZSBjbG9uZT8nLCBvcHRpb25zLnllcykpKSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoJ05vIHByb2JsZW0g4oCUIG5vdGhpbmcgd2FzIGNoYW5nZWQuIFJlLXJ1biB3aGVuZXZlciB5b3VcXCdyZSByZWFkeS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEoYXdhaXQgYm9vdHN0cmFwQ2xvbmUoKSkpIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDdiLiBUaGUgZGVwbG95IGVudHJ5cG9pbnQgbXVzdCBleGlzdCByZWxhdGl2ZSB0byBjd2QuIElmIGl0IGRvZXNuJ3QgYW5kXG4gICAgICAgIC8vIHdlIGhhdmVuJ3QgYm9vdHN0cmFwcGVkLCBncmFjZWZ1bGx5IE9GRkVSIHRvIGNsb25lIChpbnRlcmFjdGl2ZSBvbmx5KSxcbiAgICAgICAgLy8gc28gYSBmcmVzaCBtYWNoaW5lIGNhbiBwcm9jZWVkIHdpdGhvdXQgcmUtcnVubmluZyB3aXRoIC0tcmVwby5cbiAgICAgICAgaWYgKCFlbnRyeXBvaW50RXhpc3RzKHNwZWMsIGN3ZCkpIHtcbiAgICAgICAgICBjb25zdCBpbnRlcmFjdGl2ZSA9IEJvb2xlYW4ocHJvY2Vzcy5zdGRpbi5pc1RUWSkgJiYgIW9wdGlvbnMueWVzO1xuICAgICAgICAgIGlmICghYm9vdHN0cmFwQ21kICYmIGludGVyYWN0aXZlICYmIGdpdEF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICBwcmludEluZm8oYFxcbkxvb2tzIGxpa2UgeW91J3JlIG5vdCBpbnNpZGUgYSBwaXBlbGluZS1idWlsZGVyIGNoZWNrb3V0LCBzbyB0aGUgJHtzcGVjLmxhYmVsfSBkZXBsb3kgc2NyaXB0cyBhcmVuJ3QgaGVyZSB5ZXQuYCk7XG4gICAgICAgICAgICBpZiAoYXdhaXQgY29uZmlybShgV2FudCBtZSB0byBzcGFyc2UtY2xvbmUgdGhlbSBpbnRvICR7Ym9vdHN0cmFwLndvcmtkaXJ9IGFuZCBrZWVwIGdvaW5nP2AsIGZhbHNlKSkge1xuICAgICAgICAgICAgICBpZiAoIShhd2FpdCBib290c3RyYXBDbG9uZSgpKSkgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWVudHJ5cG9pbnRFeGlzdHMoc3BlYywgY3dkKSkge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKGBcXG5JIGNvdWxkbid0IGZpbmQgJHtzcGVjLmRpcn0vJHtzcGVjLmVudHJ5cG9pbnR9IGZyb20gJHtjd2R9LmApO1xuICAgICAgICAgICAgcHJpbnRJbmZvKCdUd28gZWFzeSB3YXlzIGZvcndhcmQ6Jyk7XG4gICAgICAgICAgICBwcmludEluZm8oJyAg4oCiIGNkIGludG8geW91ciBwaXBlbGluZS1idWlsZGVyIGNoZWNrb3V0IGFuZCByZS1ydW4sIG9yJyk7XG4gICAgICAgICAgICBwcmludEluZm8oYCAg4oCiIGFkZCAtLXJlcG8gYW5kIEknbGwgYm9vdHN0cmFwIGEgZnJlc2ggc3BhcnNlIGNsb25lIGZvciB5b3Uke2dpdEF2YWlsYWJsZSgpID8gJy4nIDogJyAob25jZSBnaXQgaXMgaW5zdGFsbGVkKS4nfWApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0LWluIGxvYWRzIOKAlCBvZmZlcmVkIEFGVEVSIHRoZSBjbG9uZSAoc28gd2Ugb25seSBhc2sgb25jZSB5b3UndmUgYWdyZWVkXG4gICAgICAgIC8vIHRvIHByb2NlZWQpLiBUaGUgY2xvbmUgcHJlLXN0YWdlZCBldmVyeSBsb2FkIGZvbGRlciwgc28gZWFjaCBjaG9pY2UgaXMgcmVhZHlcbiAgICAgICAgLy8gd2l0aG91dCBhIHJlLXN5bmM7IHJlLXJlc29sdmUgdGhlIHBvc3QtaW5zdGFsbCBzdGVwcyB3aXRoIHRoZSBzZWxlY3Rpb25zLlxuICAgICAgICBpZiAod2lsbFByb21wdExvYWRzKSB7XG4gICAgICAgICAgY29uc3QgcHJvbXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIHBsdWdpbnM6ICdMb2FkIHBsdWdpbnM/IChidWlsZHMgdGhlIHBsdWdpbiBpbWFnZXMgbG9jYWxseSDigJQgdGhlIHNsb3cgb25lKScsXG4gICAgICAgICAgICBzYW1wbGVzOiAnTG9hZCBzYW1wbGUgcGlwZWxpbmVzPycsXG4gICAgICAgICAgICBjb21wbGlhbmNlOiAnTG9hZCBjb21wbGlhbmNlIHJ1bGVzPycsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ09wdGlvbmFsIHBvc3QtaW5zdGFsbCBsb2FkcycpO1xuICAgICAgICAgIGNvbnN0IGNob3NlbjogdHlwZW9mIGVuYWJsZWRMb2FkSWRzID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBzIG9mIExPQURfU1RFUFMpIHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBjb25maXJtKHByb21wdHNbcy5pZF0gPz8gYExvYWQgJHtzLmlkfT9gLCBmYWxzZSkpIGNob3Nlbi5wdXNoKHMuaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbmFibGVkTG9hZElkcyA9IGNob3NlbjtcbiAgICAgICAgICAvLyBBZGRpdGl2ZSBzcGFyc2UgcmUtc3luYzogbWF0ZXJpYWxpemUgT05MWSB0aGUgcGlja2VkIGxvYWRzJyBmb2xkZXJzIGluXG4gICAgICAgICAgLy8gdGhlIGNsb25lICh0aGUgcGFydGlhbCBjbG9uZSBmZXRjaGVzIHRoZWlyIGJsb2JzIG9uIGRlbWFuZCkuIE9ubHkgd2hlbiB3ZVxuICAgICAgICAgIC8vIGNyZWF0ZWQgdGhlIGNsb25lIOKAlCBhIG5vcm1hbCBjaGVja291dCBhbHJlYWR5IGhhcyBldmVyeSBmb2xkZXIuXG4gICAgICAgICAgaWYgKGJvb3RzdHJhcHBlZCkge1xuICAgICAgICAgICAgY29uc3QgYWJzZW50ID0gc3BhcnNlUGF0aHNGb3IodGFyZ2V0LCBlbmFibGVkTG9hZElkcykuZmlsdGVyKChwKSA9PiAhZXhpc3RzU3luYyhwYXRoLmpvaW4oY3dkLCBwKSkpO1xuICAgICAgICAgICAgaWYgKGFic2VudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHByaW50U2VjdGlvbignRmV0Y2hpbmcgc2VsZWN0ZWQgbG9hZCBmb2xkZXJzJyk7XG4gICAgICAgICAgICAgIGNvbnN0IGFkZENtZCA9IGBnaXQgc3BhcnNlLWNoZWNrb3V0IGFkZCAke2Fic2VudC5tYXAoKHApID0+IGAnJHtwfSdgKS5qb2luKCcgJyl9ICYmIGdpdCBjaGVja291dCAnJHtib290c3RyYXAucmVmfSdgO1xuICAgICAgICAgICAgICBwcmludEluZm8oYWRkQ21kKTtcbiAgICAgICAgICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCBydW5TY3JpcHQoYWRkQ21kLCBjd2QsIHsgY2FwdHVyZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgcHJpbnRXYXJuaW5nKGBDb3VsZG4ndCBmZXRjaCAke2Fic2VudC5qb2luKCcsICcpfSDigJQgdGhlIG1hdGNoaW5nIGxvYWQgc3RlcChzKSBtYXkgZmFpbC4gUmUtcnVuIHdpdGggLS1yZXBvIHRvIHJlZnJlc2ggdGhlIGNsb25lLmApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgICh7IHN0ZXBzOiBwb3N0U3RlcHMsIHNraXBwZWQ6IHNraXBwZWRTdGVwcyB9ID0gcmVzb2x2ZVBvc3RTdGVwcyh7XG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICByZWdpb246IHR5cGVvZiBwYXJhbXMucmVnaW9uID09PSAnc3RyaW5nJyA/IHBhcmFtcy5yZWdpb24gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlbmFibGVkTG9hZElkcyxcbiAgICAgICAgICAgIC4uLnBvc3RTdGVwRmxhZ3MsXG4gICAgICAgICAgICBidWlsZEJvb3RzdHJhcDogcG9zdFN0ZXBGbGFncy5idWlsZEJvb3RzdHJhcCB8fCBlbmFibGVkTG9hZElkcy5pbmNsdWRlcygncGx1Z2lucycpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb2NhbC9taW5pa3ViZSdzIHNldHVwLnNoIFJFUVVJUkVTIGEgYC5lbnZgIGFuZCBhYm9ydHMgd2l0aG91dCBpdCDigJQgY3JlYXRlXG4gICAgICAgIC8vIGl0IGZyb20gLmVudi5leGFtcGxlIHdpdGggZ2VuZXJhdGVkIHNlY3JldHMgc28gdGhlIGRlcGxveSBpcyBub24taW50ZXJhY3RpdmUuXG4gICAgICAgIC8vIGVjMi9mYXJnYXRlIGFsc28gc2hpcCBhIGAuZW52LmV4YW1wbGVgLCBidXQgdGhlaXIgc2V0dXAuc2ggbmV2ZXIgcmVhZHMgYVxuICAgICAgICAvLyBsb2NhbCBgLmVudmAgKHRoZSBpbnN0YW5jZSBoYW5kbGVzIGl0cyBvd247IEZhcmdhdGUgdXNlcyBTZWNyZXRzIE1hbmFnZXIgdmlhXG4gICAgICAgIC8vIGluaXQtc2VjcmV0cy5zaCksIHNvIHdlIG11c3QgTk9UIGdlbmVyYXRlIG9uZSBmb3IgdGhlbS5cbiAgICAgICAgaWYgKCh0YXJnZXQgPT09ICdsb2NhbCcgfHwgdGFyZ2V0ID09PSAnbWluaWt1YmUnKSAmJiBlbnZGaWxlTWlzc2luZyhjd2QsIHNwZWMuZGlyKSkge1xuICAgICAgICAgIGlmIChhd2FpdCBjb25maXJtKGBcXG4ke3NwZWMuZGlyfS8uZW52IG5vdCBmb3VuZCDigJQgY3JlYXRlIGl0IGZyb20gLmVudi5leGFtcGxlIChnZW5lcmF0ZXMgc2VjcmV0czsgZWRpdCBsYXRlciBmb3Igb3B0aW9uYWwgaW50ZWdyYXRpb25zIGxpa2UgT0F1dGgpP2AsIG9wdGlvbnMueWVzKSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IGNyZWF0ZUVudkZpbGUoY3dkLCBzcGVjLmRpcik7XG4gICAgICAgICAgICBwcmludFN1Y2Nlc3MoYENyZWF0ZWQgJHtzcGVjLmRpcn0vLmVudiDigJQgJHtufSBzZWNyZXQocykgZ2VuZXJhdGVkLmApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoJ0NvbnRpbnVpbmcgd2l0aG91dCAuZW52IOKAlCBzZXR1cC5zaCB3aWxsIGFib3J0IGlmIGl0IHN0YXlzIG1pc3NpbmcuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghKGF3YWl0IGNvbmZpcm0oJ1xcblByb2NlZWQgd2l0aCB0aGlzIGRlcGxveT8nLCBvcHRpb25zLnllcykpKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKCdObyBwcm9ibGVtIOKAlCBub3RoaW5nIHdhcyBjaGFuZ2VkLicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDdjLiBSdW4gdGhlIGRlcGxveSBvdXQtb2YtbG9vcCAocmVhbCBjb21tYW5kLCBzZWNyZXRzIHVubWFza2VkLCBzdHJlYW1lZCArXG4gICAgICAgIC8vIGNhcHR1cmVkKSwgd2l0aCBhIGJvdW5kZWQgYXV0by1maXggKyByZXRyeSBsb29wIOKAlCB0aGUgZGVwbG95IHNjcmlwdHMgYXJlXG4gICAgICAgIC8vIGlkZW1wb3RlbnQsIHNvIGEgZml4ZWQgcmUtcnVuIHJlc3VtZXMgcmF0aGVyIHRoYW4gc3RhcnRpbmcgb3Zlci5cbiAgICAgICAgY29uc3QgbWF4QXR0ZW1wdHMgPSAxICsgTWF0aC5tYXgoMCwgcGFyc2VJbnQob3B0aW9ucy5yZXRyaWVzLCAxMCkgfHwgMCk7XG4gICAgICAgIGxldCBydW5QYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gcGFyYW1zO1xuICAgICAgICBsZXQgc3VjY2VlZGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICAgICAgICBjb25zdCByZWFsQ29tbWFuZCA9IGFzc2VtYmxlQ29tbWFuZChzcGVjLCBydW5QYXJhbXMsIHsgbWFzazogZmFsc2UgfSkuY29tbWFuZDtcbiAgICAgICAgICBwcmludFNlY3Rpb24oYXR0ZW1wdCA9PT0gMSA/ICdEZXBsb3lpbmcnIDogYERlcGxveWluZyDigJQgcmV0cnkgJHthdHRlbXB0IC0gMX1gKTtcbiAgICAgICAgICBpZiAoYXR0ZW1wdCA9PT0gMSkge1xuICAgICAgICAgICAgcHJpbnRJbmZvKGBEZXBsb3lpbmcgJHtzcGVjLmxhYmVsfSDihpIgJHt1cmx9YCk7XG4gICAgICAgICAgICBwcmludEluZm8oc3BlYy5kZXBsb3lzKTtcbiAgICAgICAgICAgIHByaW50SW5mbygnU3RyZWFtaW5nIHRoZSBkZXBsb3kgYmVsb3cg4oCUIGZpcnN0IHJ1biBpcyB0aGUgc2xvdyBvbmUgKGltYWdlIHB1bGxzICsgY2VydCBnZW5lcmF0aW9uKS4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCB0YWlsIH0gPSBhd2FpdCBydW5TY3JpcHQocmVhbENvbW1hbmQsIGN3ZCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgICAgIGlmIChjb2RlID09PSAwKSB7IHN1Y2NlZWRlZCA9IHRydWU7IGJyZWFrOyB9XG5cbiAgICAgICAgICBwcmludEVycm9yKGBcXG5EZXBsb3kgZmFpbGVkIChleGl0ICR7Y29kZX0pLmApO1xuICAgICAgICAgIGNvbnN0IGlzc3VlcyA9IG1hdGNoSXNzdWVzKHRhaWwpO1xuICAgICAgICAgIGlmIChpc3N1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcHJpbnRTZWN0aW9uKCdMaWtlbHkgY2F1c2UnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBpc3N1ZXMpIHByaW50SW5mbyhg4oCiICR7aS5jYXVzZX1cXG4gIOKGkiAke2kuc3VnZ2VzdGlvbn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzQWlDb25maWd1cmVkKGFpT3B0cykpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWdub3NpcyA9IGF3YWl0IGRpYWdub3NlRmFpbHVyZShyZWRhY3RTZWNyZXRzKHRhaWwsIHNwZWMsIHJ1blBhcmFtcyksIGFpT3B0cyk7XG4gICAgICAgICAgICBpZiAoZGlhZ25vc2lzKSB7IHByaW50U2VjdGlvbignRGlhZ25vc2lzJyk7IHByaW50SW5mbyhkaWFnbm9zaXMpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhdHRlbXB0ID49IG1heEF0dGVtcHRzKSBicmVhaztcblxuICAgICAgICAgIC8vIEF1dG8tZml4OiBhIHJldHJ5YWJsZSBpc3N1ZSB3aXRoIGEgcGFyYW0gd2UgaGF2ZW4ndCBhbHJlYWR5IGFwcGxpZWQuXG4gICAgICAgICAgY29uc3QgZml4ID0gaXNzdWVzLmZpbmQoKGkpID0+IGkucmV0cnlhYmxlICYmIGkucGFyYW1GaXggJiYgcnVuUGFyYW1zW2kucGFyYW1GaXgua2V5XSAhPT0gaS5wYXJhbUZpeC52YWx1ZSk7XG4gICAgICAgICAgaWYgKGZpeD8ucGFyYW1GaXggJiYgYXdhaXQgY29uZmlybShgXFxuQXBwbHkgZml4IGFuZCByZXRyeSDigJQgJHtmaXguc3VnZ2VzdGlvbn1gLCBvcHRpb25zLnllcykpIHtcbiAgICAgICAgICAgIHJ1blBhcmFtcyA9IHsgLi4ucnVuUGFyYW1zLCBbZml4LnBhcmFtRml4LmtleV06IGZpeC5wYXJhbUZpeC52YWx1ZSB9O1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJldHJ5YWJsZSBidXQgbm8gcGFyYW0gY2hhbmdlIChlLmcuIEFDTSBETlMgcHJvcGFnYXRpb24pIOKAlCBvZmZlciBhIHBsYWluIHJlLXJ1bi5cbiAgICAgICAgICBpZiAoIWZpeCAmJiBpc3N1ZXMuc29tZSgoaSkgPT4gaS5yZXRyeWFibGUpICYmIGF3YWl0IGNvbmZpcm0oJ1xcblJldHJ5IHRoZSBkZXBsb3kgKGl0IGlzIGlkZW1wb3RlbnQgYW5kIHdpbGwgcmVzdW1lKT8nLCBvcHRpb25zLnllcykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN1Y2NlZWRlZCkgeyBwcm9jZXNzLmV4aXRDb2RlID0gMTsgcmV0dXJuOyB9XG4gICAgICAgIHByaW50U3VjY2VzcygnRGVwbG95IGNvbW1hbmQgY29tcGxldGVkLicpO1xuXG4gICAgICAgIC8vIDdkLiBTRVMgcG9zdC1kZXBsb3kgZ3VpZGFuY2UgKGFzeW5jIERLSU0gKyBzYW5kYm94ICsgYm91bmNlIHRvcGljKS5cbiAgICAgICAgLy8gU0VTIGlzIHByb3Zpc2lvbmVkIEJZIERFRkFVTFQgb24gQVdTIGRlcGxveXMsIHNvIHN1cmZhY2UgdGhlIGd1aWRhbmNlXG4gICAgICAgIC8vIGZvciBlYzIvZmFyZ2F0ZSB1bmxlc3MgdGhlIG9wZXJhdG9yIG9wdGVkIG91dCB3aXRoIC0tbm8tZW1haWwuXG4gICAgICAgIGNvbnN0IHNlc1Byb3Zpc2lvbmVkID0gKHRhcmdldCA9PT0gJ2VjMicgfHwgdGFyZ2V0ID09PSAnZmFyZ2F0ZScpICYmIHJ1blBhcmFtcy5ub0VtYWlsICE9PSB0cnVlO1xuICAgICAgICBpZiAoc2VzUHJvdmlzaW9uZWQpIHtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ1NFUyDigJQgbmV4dCBzdGVwcycpO1xuICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBzZXNQb3N0RGVwbG95R3VpZGFuY2UoKSkgcHJpbnRJbmZvKGDigKIgJHtsaW5lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gN2UuIFZlcmlmeSBoZWFsdGggKENSRUFURV9DT01QTEVURSAhPSBzZXJ2aW5nKS5cbiAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgIHByaW50U2VjdGlvbignVmVyaWZ5aW5nIGhlYWx0aCcpO1xuICAgICAgICAgIC8vIE1pbmlrdWJlIHJlYWNoZXMgdGhlIGdhdGV3YXkgdmlhIGEga3ViZWN0bCBwb3J0LWZvcndhcmQgdGhhdCBzZXR1cC5zaFxuICAgICAgICAgIC8vIGJhY2tncm91bmRzIGFuZCB0aGF0IGNhbiBkaWUvZmFpbCB0byBiaW5kIOKAlCAocmUpc3RhcnQgaXQgYmVmb3JlIHBvbGxpbmdcbiAgICAgICAgICAvLyBzbyB3ZSBkb24ndCBzaXQgYXQgdGhlIGdhdGUgb24gYSBkZWFkIGZvcndhcmQgd2hpbGUgdGhlIHBvZHMgYXJlIGZpbmUuXG4gICAgICAgICAgaWYgKHRhcmdldCA9PT0gJ21pbmlrdWJlJykge1xuICAgICAgICAgICAgYXdhaXQgZW5zdXJlTWluaWt1YmVHYXRld2F5KHVybCwgeyBvbkluZm86IChtKSA9PiBwcmludEluZm8obSkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByaW50SW5mbyhgUG9sbGluZyAke3VybH0vaGVhbHRoIOKApmApO1xuICAgICAgICAgIGNvbnN0IGhlYWx0aCA9IGF3YWl0IHdhaXRIZWFsdGh5KHVybCwgeyBvblRpY2s6IChtKSA9PiBwcmludEluZm8obSkgfSk7XG4gICAgICAgICAgKGhlYWx0aC5oZWFsdGh5ID8gcHJpbnRTdWNjZXNzIDogcHJpbnRXYXJuaW5nKShgJHtoZWFsdGgudXJsfSDigJQgJHtoZWFsdGguZGV0YWlsfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gN2YuIFBvc3QtaW5zdGFsbCBzdGVwcyAocmVnaXN0ZXIgKyBvcHQtaW4gbG9hZHMsIHNtb2tlIHRlc3QsIGV2ZW50cywgY3VzdG9tKS5cbiAgICAgICAgLy8gcmVnaXN0ZXIgcnVucyBpbml0LXBsYXRmb3JtOyBmb3IgRUMyL0ZhcmdhdGUgaXQgbXVzdCBydW4gZnJvbSBpbnNpZGUgdGhlXG4gICAgICAgIC8vIFZQQywgc28gd2Ugc3VyZmFjZSB0aGUgY29tbWFuZCB0aGVyZSBpbnN0ZWFkIG9mIGV4ZWN1dGluZyBpdCBsb2NhbGx5LlxuICAgICAgICBpZiAocG9zdFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2tpcHBlZFN0ZXBzKSBwcmludFdhcm5pbmcoYFNraXBwZWQgcG9zdC1zdGVwICR7cy5pZH06ICR7cy5yZWFzb259YCk7XG4gICAgICAgICAgY29uc3QgaXNSZW1vdGVSZWdpc3RlciA9IChpZDogc3RyaW5nKTogYm9vbGVhbiA9PiBpZCA9PT0gJ3JlZ2lzdGVyJyAmJiAodGFyZ2V0ID09PSAnZWMyJyB8fCB0YXJnZXQgPT09ICdmYXJnYXRlJyk7XG4gICAgICAgICAgY29uc3QgcnVubmFibGUgPSBwb3N0U3RlcHMuZmlsdGVyKChzKSA9PiAhaXNSZW1vdGVSZWdpc3RlcihzLmlkKSk7XG4gICAgICAgICAgZm9yIChjb25zdCBzIG9mIHBvc3RTdGVwcykge1xuICAgICAgICAgICAgaWYgKGlzUmVtb3RlUmVnaXN0ZXIocy5pZCkpIHtcbiAgICAgICAgICAgICAgcHJpbnRJbmZvKCdcXG5OZXh0IChydW4gZnJvbSBpbnNpZGUgdGhlIFZQQyk6IHJlZ2lzdGVyIGFkbWluICsgbG9hZCBwbHVnaW5zIOKAlCcpO1xuICAgICAgICAgICAgICBwcmludEluZm8oYCAgJHtzLmNvbW1hbmR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChydW5uYWJsZS5sZW5ndGggPiAwICYmIGF3YWl0IGNvbmZpcm0oYFxcblJ1biAke3J1bm5hYmxlLmxlbmd0aH0gcG9zdC1pbnN0YWxsIHN0ZXAocykgbm93P2AsIG9wdGlvbnMueWVzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIHJ1bm5hYmxlKSB7XG4gICAgICAgICAgICAgIHByaW50U2VjdGlvbihgUG9zdC1zdGVwOiAke3MubGFiZWx9YCk7XG4gICAgICAgICAgICAgIC8vIFN0ZXBzIHRoYXQgbG9nIGludG8gdGhlIHBsYXRmb3JtIChyZWdpc3RlciArIHN0b3JlLXRva2VuKSBuZWVkIHRoZVxuICAgICAgICAgICAgICAvLyBhZG1pbiBjcmVkcyAoUExBVEZPUk1fSURFTlRJRklFUiAvIFBMQVRGT1JNX1BBU1NXT1JEKSBvbiB0b3Agb2YgdGhlaXJcbiAgICAgICAgICAgICAgLy8gb3duIHN0ZXAgZW52LiBzZXR1cC1ldmVudHMgZG9lcyBOT1QgbG9nIGluIOKAlCBpdCByZWFkcyBQTEFURk9STV9TRUNSRVRfTkFNRSxcbiAgICAgICAgICAgICAgLy8gQVdTIGNyZWRzLCBhbmQgdGhlIHJlZ2lvbiBmcm9tIHRoZSBBV1MgZW52aXJvbm1lbnQg4oCUIHNvIGl0J3MgZXhjbHVkZWQuXG4gICAgICAgICAgICAgIGNvbnN0IG5lZWRzQ3JlZHMgPSBzLmlkID09PSAncmVnaXN0ZXInIHx8IHMuaWQgPT09ICdzdG9yZS10b2tlbic7XG4gICAgICAgICAgICAgIGNvbnN0IGVudiA9IG5lZWRzQ3JlZHMgPyB7IC4uLnMuZW52LCAuLi5hZG1pbkVudiB9IDogcy5lbnY7XG4gICAgICAgICAgICAgIC8vIFRoZXNlIHN0ZXBzIChwbHVnaW4vc2FtcGxlL2NvbXBsaWFuY2UgbG9hZHMsIHNtb2tlLCBldmVudHMpIGFyZSBub2lzeVxuICAgICAgICAgICAgICAvLyBhbmQgbm9uLWludGVyYWN0aXZlLCBzbyBydW4gdGhlbSBRVUlFVExZIOKAlCBjYXB0dXJlIHRoZSBvdXRwdXQgYW5kIG9ubHlcbiAgICAgICAgICAgICAgLy8gc3VyZmFjZSBpdCBvbiBmYWlsdXJlLiBUaGUgZXhjZXB0aW9uIGlzIGEgcmVnaXN0ZXIgd2l0aCBubyBhZG1pbiBjcmVkczpcbiAgICAgICAgICAgICAgLy8gaW5pdC1wbGF0Zm9ybS5zaCBwcm9tcHRzIGZvciB0aGVtLCBzbyBpdCBtdXN0IHN0cmVhbSB0byB0aGUgdGVybWluYWwuXG4gICAgICAgICAgICAgIGNvbnN0IGludGVyYWN0aXZlUmVnaXN0ZXIgPSBzLmlkID09PSAncmVnaXN0ZXInICYmICFhZG1pbkVudi5QTEFURk9STV9JREVOVElGSUVSO1xuICAgICAgICAgICAgICBjb25zdCBxdWlldCA9ICFpbnRlcmFjdGl2ZVJlZ2lzdGVyO1xuICAgICAgICAgICAgICBpZiAocXVpZXQpIHByaW50SW5mbyhgJHtzLmNvbW1hbmR9XFxuICDigKZydW5uaW5nIChvdXRwdXQgc2hvd24gb25seSBpZiBpdCBmYWlscylgKTtcbiAgICAgICAgICAgICAgZWxzZSBwcmludEluZm8ocy5jb21tYW5kKTtcbiAgICAgICAgICAgICAgY29uc3QgeyBjb2RlLCB0YWlsIH0gPSBhd2FpdCBydW5TY3JpcHQocy5jb21tYW5kLCBjd2QsIHsgcXVpZXQsIGNhcHR1cmU6IGZhbHNlLCBlbnYgfSk7XG4gICAgICAgICAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHF1aWV0ICYmIHRhaWwpIHsgcHJpbnRFcnJvcignXFxuLS0tIGxhc3Qgb3V0cHV0IC0tLScpOyBwcmludEluZm8odGFpbCk7IH1cbiAgICAgICAgICAgICAgICBwcmludEVycm9yKGBcXG5Qb3N0LXN0ZXAgJyR7cy5pZH0nIGZhaWxlZCAoZXhpdCAke2NvZGV9KS4gVGhlIHBsYXRmb3JtIGlzIGRlcGxveWVkOyBmaXggYW5kIHJlLXJ1biB0aGUgc3RlcCBtYW51YWxseS5gKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwcmludFN1Y2Nlc3MoYCR7cy5pZH0g4pyTYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChydW5uYWJsZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwcmludEluZm8oJ1xcblNraXBwZWQgcG9zdC1pbnN0YWxsIHN0ZXBzLiBSdW4gdGhlIGNvbW1hbmRzIGFib3ZlIG1hbnVhbGx5IHdoZW4gcmVhZHkuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHsgY29tbWFuZDogJ3Byb3Zpc2lvbicsIGV4ZWN1dGlvbklkIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xufVxuIl19
621
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3Byb3Zpc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzlDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxRQUFRLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckYsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixVQUFVLEVBQ1Ys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QUFNO3dCQUNSLENBQUM7d0JBQ0QsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQzVCLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQy9CLFNBQVMsQ0FBQywyRUFBMkUsQ0FBQyxDQUFDO2dCQUN6RixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFO2dCQUN0QyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUs7Z0JBQzNCLElBQUksRUFBRSxJQUFJO2dCQUNWLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFO2FBQy9DLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSAnbm9kZTpyZWFkbGluZS9wcm9taXNlcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGRpYWdub3NlRmFpbHVyZSwgaXNBaUNvbmZpZ3VyZWQsIHBhcnNlR29hbCB9IGZyb20gJy4uL2FnZW50L2FpLmpzJztcbmltcG9ydCB7IGJvb3RzdHJhcENvbW1hbmQsIHJlc29sdmVCb290c3RyYXAgfSBmcm9tICcuLi9hZ2VudC9ib290c3RyYXAuanMnO1xuaW1wb3J0IHsgZW50cnlwb2ludEV4aXN0cywgZXhlY3V0aW9uQmxvY2tlZCwgcnVuU2NyaXB0IH0gZnJvbSAnLi4vYWdlbnQvZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgZGVyaXZlSGVhbHRoVXJsLCB3YWl0SGVhbHRoeSwgZW5zdXJlTWluaWt1YmVHYXRld2F5IH0gZnJvbSAnLi4vYWdlbnQvaGVhbHRoLmpzJztcbmltcG9ydCB7IGNoZWNrSG9zdFBvcnRzIH0gZnJvbSAnLi4vYWdlbnQvcG9ydHMuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVBvc3RTdGVwcyB9IGZyb20gJy4uL2FnZW50L3Bvc3Qtc3RlcHMuanMnO1xuaW1wb3J0IHsgY2hlY2tQcmVyZXFzLCBnaXRBdmFpbGFibGUsIGdpdFN1cHBvcnRzU3BhcnNlQ2hlY2tvdXQsIHByZXJlcXNTYXRpc2ZpZWQgfSBmcm9tICcuLi9hZ2VudC9wcmVyZXFzLmpzJztcbmltcG9ydCB7IFRPT0xTX0RJUiwgZmV0Y2hUb29sLCBpc0ZldGNoYWJsZSwgd2l0aFRvb2xzT25QYXRoIH0gZnJvbSAnLi4vYWdlbnQvdG9vbHMuanMnO1xuaW1wb3J0IHsgY3JlYXRlRW52RmlsZSwgZW52RmlsZU1pc3NpbmcgfSBmcm9tICcuLi9hZ2VudC9lbnYtZmlsZS5qcyc7XG5pbXBvcnQge1xuICBhc3NlbWJsZUNvbW1hbmQsXG4gIGlzVGFyZ2V0SWQsXG4gIExPQURfU1RFUFMsXG4gIHNwYXJzZVBhdGhzRm9yLFxuICBUQVJHRVRTLFxuICBUQVJHRVRfSURTLFxuICB0ZWFyZG93bkNvbW1hbmQsXG4gIHR5cGUgVGFyZ2V0SWQsXG4gIHR5cGUgVGFyZ2V0U3BlYyxcbn0gZnJvbSAnLi4vYWdlbnQvdGFyZ2V0cy5qcyc7XG5pbXBvcnQgeyBtYXRjaElzc3Vlcywgc2VzUG9zdERlcGxveUd1aWRhbmNlIH0gZnJvbSAnLi4vYWdlbnQvdHJvdWJsZXNob290LmpzJztcbmltcG9ydCB7IHByaW50Q29tbWFuZEhlYWRlciB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludFNlY3Rpb24sIHByaW50S2V5VmFsdWUsIHByaW50SW5mbywgcHJpbnRXYXJuaW5nLCBwcmludEVycm9yLCBwcmludFN1Y2Nlc3MgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuXG4vKipcbiAqIFJlYWQgb25lIGxpbmUgb2YgdHJpbW1lZCBpbnB1dCBmcm9tIHRoZSB0ZXJtaW5hbCwgb3duaW5nIHRoZSByZWFkbGluZVxuICogbGlmZWN5Y2xlLiBVc2VkIGRpcmVjdGx5IGZvciB0aGUgZGVzdHJ1Y3RpdmUgdGVhcmRvd24gZ2F0ZSAoYSB5L04gaXMgdG9vIGVhc3lcbiAqIHRvIGZhdC1maW5nZXIsIHNvIHdlIHJlcXVpcmUgdGhlIG9wZXJhdG9yIHRvIFRZUEUgdGhlIHRhcmdldCBpZCBiYWNrKSwgYW5kIGFzXG4gKiB0aGUgYmFzaXMgZm9yIGBjb25maXJtYC4gRGVsaWJlcmF0ZWx5IGhhcyBubyBhdXRvLWFjY2VwdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXNrKHF1ZXN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7IGlucHV0OiBwcm9jZXNzLnN0ZGluLCBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0IH0pO1xuICB0cnkge1xuICAgIHJldHVybiAoYXdhaXQgcmwucXVlc3Rpb24ocXVlc3Rpb24pKS50cmltKCk7XG4gIH0gZmluYWxseSB7XG4gICAgcmwuY2xvc2UoKTtcbiAgfVxufVxuXG4vKiogSW50ZXJhY3RpdmUgeS9OIGNvbmZpcm1hdGlvbjsgYXV0by10cnVlIHdoZW4gYGF1dG9ZZXNgICh0aGUgYC0teWVzYCBmbGFnKS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbmZpcm0ocXVlc3Rpb246IHN0cmluZywgYXV0b1llczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoYXV0b1llcykgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGFuc3dlciA9IChhd2FpdCBhc2soYCR7cXVlc3Rpb259IFt5L05dIGApKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gYW5zd2VyID09PSAneScgfHwgYW5zd2VyID09PSAneWVzJztcbn1cblxuLyoqIENvbW1hbmRlciBjb2xsZWN0b3I6IGFjY3VtdWxhdGUgcmVwZWF0ZWQgYC0tcG9zdC1zdGVwYCB2YWx1ZXMgaW4gb3JkZXIuICovXG5mdW5jdGlvbiBjb2xsZWN0U3RlcCh2YWx1ZTogc3RyaW5nLCBhY2M6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmFjYywgdmFsdWVdO1xufVxuXG4vKipcbiAqIFJlZGFjdCBzZWNyZXQgcGFyYW0gdmFsdWVzIChlLmcuIHRoZSBnaGNyIHRva2VuKSBmcm9tIGNhcHR1cmVkIGRlcGxveSBvdXRwdXRcbiAqIGJlZm9yZSBpdCBpcyBzZW50IHRvIHRoZSBMTE0gZm9yIGRpYWdub3Npcy4gVGhlIGRlcGxveSBydW5zIHdpdGggc2VjcmV0c1xuICogdW5tYXNrZWQsIHNvIGFsdGhvdWdoIHRoZSBjdXJyZW50IHNjcmlwdHMgZG9uJ3QgZWNobyB0aGVtLCB0aGlzIGtlZXBzIGEgZnV0dXJlXG4gKiBzY3JpcHQncyBzdHJheSBlY2hvIChvciBhIHZlcmJvc2Ugc3ViLXRvb2wpIGZyb20gY3Jvc3NpbmcgdGhlIHRoaXJkLXBhcnR5LUxMTVxuICogYm91bmRhcnkuXG4gKi9cbmZ1bmN0aW9uIHJlZGFjdFNlY3JldHModGV4dDogc3RyaW5nLCBzcGVjOiBUYXJnZXRTcGVjLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgbGV0IG91dCA9IHRleHQ7XG4gIGZvciAoY29uc3QgaW5wdXQgb2YgWy4uLnNwZWMucmVxdWlyZWQsIC4uLnNwZWMub3B0aW9uYWxdKSB7XG4gICAgaWYgKCFpbnB1dC5zZWNyZXQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zW2lucHV0LmtleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID49IDQpIG91dCA9IG91dC5zcGxpdCh2YWx1ZSkuam9pbignKioqJyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBwcm92aXNpb25gIGNvbW1hbmQg4oCUIGFuIEFJLWFzc2lzdGVkIGluc3RhbGxlciBmb3IgdGhlIFBpcGVsaW5lXG4gKiBCdWlsZGVyIFBMQVRGT1JNIChsb2NhbC9taW5pa3ViZS9FQzIvRmFyZ2F0ZSkuIEl0IHByaW50cyB0aGUgYXNzZW1ibGVkIHBsYW5cbiAqIChwcmVyZXEgY2hlY2tzLCBOTC1nb2FsIHBhcnNpbmcsIGNvbW1hbmQgYXNzZW1ibHkpIGFuZCB0aGVuIERFUExPWVMsIGdhdGVkIGJ5XG4gKiBjb25maXJtYXRpb24gcHJvbXB0cyAoYC0teWVzYCB0byBhdXRvLWFjY2VwdDsgYC0tanNvbmAgaXMgdGhlIG9ubHkgbm9uLWV4ZWN1dGluZ1xuICogbW9kZSwgcHJpbnRpbmcgdGhlIHBsYW4gZm9yIHRvb2xpbmcpLiBXaXRoIGAtLXJlcG9gIGl0IGNhbiBib290c3RyYXAgYSBmcmVzaFxuICogbWFjaGluZSBieSBzcGFyc2VseSBjbG9uaW5nIG9ubHkgdGhlIGRlcGxveSBmb2xkZXJzIHRoZSBzZWxlY3RlZCB0YXJnZXQgK1xuICogb3B0aW9ucyBuZWVkLCB0aGVuIHJ1bnMgcG9zdC1pbnN0YWxsIHN0ZXBzIChyZWdpc3RlciBhZG1pbiwgb3B0LWluIGxvYWRzLFxuICogc21va2UgdGVzdCwgY3VzdG9tIGNvbW1hbmRzKS4gYC0tdGVhcmRvd25gIHJlbW92ZXMgYSBkZXBsb3ltZW50IGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHByb2dyYW0gLSBUaGUgcm9vdCBDb21tYW5kZXIgcHJvZ3JhbSBpbnN0YW5jZSB0byBhdHRhY2ggdGhlIGNvbW1hbmQgdG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aXNpb24ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ3Byb3Zpc2lvbicpXG4gICAgLmRlc2NyaXB0aW9uKCdBSS1hc3Npc3RlZCBpbnN0YWxsZXIgZm9yIHRoZSBwbGF0Zm9ybSAobG9jYWwvbWluaWt1YmUvRUMyL0ZhcmdhdGUpOiBkZXBsb3lzIGl0IChnYXRlZCBieSBjb25maXJtYXRpb24gcHJvbXB0cyksIG9yIC0tdGVhcmRvd24gdG8gcmVtb3ZlJylcbiAgICAub3B0aW9uKCctdCwgLS10YXJnZXQgPHRhcmdldD4nLCBgRGVwbG95IHRhcmdldDogJHtUQVJHRVRfSURTLmpvaW4oJyB8ICcpfWApXG4gICAgLm9wdGlvbignLXAsIC0tcHJvbXB0IDx0ZXh0PicsICdOYXR1cmFsLWxhbmd1YWdlIGdvYWwgKHBhcnNlZCBpbnRvIHBhcmFtcyB3aGVuIGFuIEFJIGtleSBpcyBzZXQpJylcbiAgICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uIChFQzIvRmFyZ2F0ZSknKVxuICAgIC5vcHRpb24oJy0tZG9tYWluIDxkb21haW4+JywgJ0Z1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZSAoRUMyL0ZhcmdhdGUpJylcbiAgICAub3B0aW9uKCctLWhvc3RlZC16b25lLWlkIDxpZD4nLCAnUHVibGljIFJvdXRlIDUzIGhvc3RlZCB6b25lIElEIChFQzIvRmFyZ2F0ZSknKVxuICAgIC5vcHRpb24oJy0tZGVwbG95LW1vZGUgPG1vZGU+JywgJ3B1YmxpYyB8IHByaXZhdGUgKEVDMi9GYXJnYXRlKScpXG4gICAgLm9wdGlvbignLS1rZXktcGFpciA8bmFtZT4nLCAnRUMyIGtleSBwYWlyIChFQzIpJylcbiAgICAub3B0aW9uKCctLWluc3RhbmNlLXR5cGUgPHR5cGU+JywgJ0VDMiBpbnN0YW5jZSB0eXBlIChFQzIpJylcbiAgICAub3B0aW9uKCctLWdoY3ItdG9rZW4gPHRva2VuPicsICdHaXRIdWIgUEFUIChyZWFkOnBhY2thZ2VzKSDigJQgbWFza2VkIGluIG91dHB1dCcpXG4gICAgLm9wdGlvbignLS1lbWFpbCcsICdFbmFibGUgU0VTIHRyYW5zYWN0aW9uYWwgZW1haWwgKG9uIGJ5IGRlZmF1bHQgZm9yIEFXUyknKVxuICAgIC5vcHRpb24oJy0tbm8tZW1haWwnLCAnU2tpcCBTRVMgKHRyYW5zYWN0aW9uYWwgZW1haWwgaXMgcHJvdmlzaW9uZWQgYnkgZGVmYXVsdCBvbiBBV1MpJylcbiAgICAub3B0aW9uKCctLWVtYWlsLWZyb20gPGFkZHI+JywgJ1NFUyBGcm9tIGFkZHJlc3MnKVxuICAgIC5vcHRpb24oJy0tZW1haWwtZnJvbS1uYW1lIDxuYW1lPicsICdTRVMgRnJvbSBkaXNwbGF5IG5hbWUnKVxuICAgIC5vcHRpb24oJy0tYWxlcnQtZW1haWwgPGFkZHI+JywgJ1N1YnNjcmliZSBhbiBhZGRyZXNzIHRvIHRoZSBib3VuY2UvY29tcGxhaW50IFNOUyB0b3BpYycpXG4gICAgLm9wdGlvbignLS1za2lwLXNlcy1pZGVudGl0eScsICdTa2lwIFNFUyBpZGVudGl0eSBjcmVhdGlvbiAoZG9tYWluIGFscmVhZHkgdmVyaWZpZWQpJylcbiAgICAub3B0aW9uKCctLWFpLXByb3ZpZGVyIDxwcm92aWRlcj4nLCAnQUkgcHJvdmlkZXIgKGFudGhyb3BpY3xvcGVuYWl8Z29vZ2xlfHhhaXxiZWRyb2NrKScpXG4gICAgLm9wdGlvbignLS1tb2RlbCA8bW9kZWw+JywgJ0FJIG1vZGVsIGlkJylcbiAgICAub3B0aW9uKCctLWRpYWdub3NlIDxmaWxlPicsICdEaWFnbm9zZSBhIENsb3VkRm9ybWF0aW9uL2RlcGxveSBmYWlsdXJlIGZyb20gYSBmaWxlIChuZWVkcyBhbiBBSSBrZXkpJylcbiAgICAub3B0aW9uKCcteSwgLS15ZXMnLCAnQXV0by1hY2NlcHQgYWxsIGNvbmZpcm1hdGlvbiBwcm9tcHRzIChmb3IgQ0kgLyBub24taW50ZXJhY3RpdmUpJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1yZXRyaWVzIDxuPicsICdBdXRvLWZpeCArIHJldHJ5IGF0dGVtcHRzIGFmdGVyIGEgZmFpbHVyZSAoZGVwbG95IHNjcmlwdHMgYXJlIGlkZW1wb3RlbnQpJywgJzEnKVxuICAgIC5vcHRpb24oJy0tdGVhcmRvd24nLCAnVGVhciBkb3duIGFuIGV4aXN0aW5nIGRlcGxveW1lbnQgaW5zdGVhZCBvZiBjcmVhdGluZyBvbmUgKGdhdGVkOyBBV1MgdGFyZ2V0cyByZXF1aXJlIGEgdHlwZWQgY29uZmlybWF0aW9uKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tc3RhY2stbmFtZSA8bmFtZT4nLCAnU3RhY2sgbmFtZSAoRUMyKSAvIHN0YWNrIHByZWZpeCAoRmFyZ2F0ZSkgdG8gdGVhciBkb3duIOKAlCBkZWZhdWx0cyB0byB0aGUgZGVwbG95IGRlZmF1bHQnKVxuICAgIC5vcHRpb24oJy0tZm9yY2UnLCAnU2tpcCB0aGUgdGVhcmRvd24gdHlwZWQtY29uZmlybWF0aW9uIChEQU5HRVJPVVMg4oCUIGZvciBDSS9hdXRvbWF0aW9uIG9ubHkpJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1uby1pbml0JywgJ1NraXAgdGhlIHBvc3QtZGVwbG95IHJlZ2lzdGVyL2luaXQtcGxhdGZvcm0gc3RlcCcpXG4gICAgLy8gQm9vdHN0cmFwIChzcGFyc2UgY2xvbmUpIOKAlCBwcm92aXNpb24gYSBmcmVzaCBtYWNoaW5lIGluIG9uZSBjb21tYW5kLlxuICAgIC5vcHRpb24oJy0tcmVwbyBbdXJsXScsICdCb290c3RyYXA6IGdpdC1jbG9uZSB0aGUgcGxhdGZvcm0gcmVwbyBmaXJzdCAoc3BhcnNlIOKAlCBvbmx5IHRoZSBuZWVkZWQgZGVwbG95IGZvbGRlcnMpLCB0aGVuIHJ1biBmcm9tIGl0IChubyB2YWx1ZSA9IHRoZSB1cHN0cmVhbSBkZWZhdWx0KScpXG4gICAgLm9wdGlvbignLS1yZWYgPHJlZj4nLCAnR2l0IGJyYW5jaC90YWcgdG8gY2hlY2sgb3V0IHdoZW4gYm9vdHN0cmFwcGluZyAoZGVmYXVsdDogbWFpbiknKVxuICAgIC5vcHRpb24oJy0td29ya2RpciA8ZGlyPicsICdEaXJlY3RvcnkgdG8gY2xvbmUgaW50byAvIHJ1biBmcm9tIHdoZW4gYm9vdHN0cmFwcGluZyAoZGVmYXVsdDogcGlwZWxpbmUtYnVpbGRlciknKVxuICAgIC8vIFBvc3QtaW5zdGFsbCBsb2FkcyDigJQgZWFjaCBvcHQtaW4gc3RlcCBhbHNvIGFkZHMgaXRzIGRlcGxveSBmb2xkZXIgdG8gdGhlIHNwYXJzZSBjbG9uZS5cbiAgICAub3B0aW9uKCctLXdpdGgtcGx1Z2lucycsICdQb3N0LWluc3RhbGw6IGJ1aWxkICsgbG9hZCBwbHVnaW5zIChhZGRzIGRlcGxveS9wbHVnaW5zLCBkZXBsb3kvY29kZWJ1aWxkKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0td2l0aC1jb21wbGlhbmNlJywgJ1Bvc3QtaW5zdGFsbDogbG9hZCBzYW1wbGUgY29tcGxpYW5jZSBydWxlcy9wb2xpY2llcyAoYWRkcyBkZXBsb3kvY29tcGxpYW5jZSknLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXdpdGgtc2FtcGxlcycsICdQb3N0LWluc3RhbGw6IGxvYWQgc2FtcGxlIHBpcGVsaW5lcyAoYWRkcyBkZXBsb3kvc2FtcGxlcyknLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXdpdGgtYWxsJywgJ1Bvc3QtaW5zdGFsbDogcGx1Z2lucyArIGNvbXBsaWFuY2UgKyBzYW1wbGVzJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1idWlsZC1ib290c3RyYXAnLCAnQnVpbGQgKyBwdWJsaXNoIHRoZSBDb2RlQnVpbGQgYm9vdHN0cmFwIGltYWdlIGR1cmluZyByZWdpc3RlciAoYWRkcyBkZXBsb3kvY29kZWJ1aWxkKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0td2l0aC1zbW9rZS10ZXN0JywgJ1Bvc3QtaW5zdGFsbDogcmVhZC1vbmx5IEFQSSByZWFjaGFiaWxpdHkgY2hlY2snLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXdpdGgtZXZlbnRzJywgJ1Bvc3QtaW5zdGFsbCAoQVdTKTogZXZlbnQgaW5nZXN0aW9uIGJ1bmRsZSDigJQgc3RvcmUtdG9rZW4gKEpXVCDihpIgU2VjcmV0cyBNYW5hZ2VyKSB0aGVuIHNldHVwLWV2ZW50cyAoRXZlbnRCcmlkZ2UvTGFtYmRhKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tcG9zdC1zdGVwIDxjbWQ+JywgJ1J1biBhbiBleHRyYSBjb21tYW5kIGFmdGVyIHRoZSBsb2FkcyAocmVwZWF0YWJsZSwgaW4gb3JkZXIpJywgY29sbGVjdFN0ZXAsIFtdKVxuICAgIC5vcHRpb24oJy0tYWRtaW4tZW1haWwgPGFkZHI+JywgJ0FkbWluIGVtYWlsIGZvciBub24taW50ZXJhY3RpdmUgcmVnaXN0ZXIgKHNldHMgUExBVEZPUk1fSURFTlRJRklFUiknKVxuICAgIC5vcHRpb24oJy0tYWRtaW4tcGFzc3dvcmQgPHB3PicsICdBZG1pbiBwYXNzd29yZCBmb3Igbm9uLWludGVyYWN0aXZlIHJlZ2lzdGVyIChzZXRzIFBMQVRGT1JNX1BBU1NXT1JEKScpXG4gICAgLm9wdGlvbignLS1qc29uJywgJ1ByaW50IHRoZSBwbGFuIGFzIEpTT04gYW5kIGV4aXQgV0lUSE9VVCBydW5uaW5nICh0aGUgb25seSBub24tZXhlY3V0aW5nIG1vZGUg4oCUIGZvciB0b29saW5nL0NJIGluc3BlY3Rpb24pJywgZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ1Byb3Zpc2lvbicpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyAxLiBBc3NlbWJsZSBwYXJhbXMgZnJvbSBleHBsaWNpdCBmbGFncyAoZmxhZ3MgYWx3YXlzIHdpbiBvdmVyIE5MIHBhcnNlKS5cbiAgICAgICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgICByZWdpb246IG9wdGlvbnMucmVnaW9uLFxuICAgICAgICAgIGRvbWFpbjogb3B0aW9ucy5kb21haW4sXG4gICAgICAgICAgaG9zdGVkWm9uZUlkOiBvcHRpb25zLmhvc3RlZFpvbmVJZCxcbiAgICAgICAgICBkZXBsb3lNb2RlOiBvcHRpb25zLmRlcGxveU1vZGUsXG4gICAgICAgICAga2V5UGFpcjogb3B0aW9ucy5rZXlQYWlyLFxuICAgICAgICAgIGluc3RhbmNlVHlwZTogb3B0aW9ucy5pbnN0YW5jZVR5cGUsXG4gICAgICAgICAgZ2hjclRva2VuOiBvcHRpb25zLmdoY3JUb2tlbixcbiAgICAgICAgICAvLyBDb21tYW5kZXIgdHJpLXN0YXRlcyBgZW1haWxgOiB1bmRlZmluZWQgKG5laXRoZXIpLCB0cnVlICgtLWVtYWlsKSxcbiAgICAgICAgICAvLyBmYWxzZSAoLS1uby1lbWFpbCkuIFNFUyBpcyBvbiBieSBkZWZhdWx0LCBzbyBvbmx5IC0tbm8tZW1haWwgaXNcbiAgICAgICAgICAvLyBsb2FkLWJlYXJpbmcgKGl0IGVtaXRzIGAtLW5vLWVtYWlsYCBpbnRvIHRoZSBkZXBsb3kgY29tbWFuZCkuXG4gICAgICAgICAgZW1haWw6IG9wdGlvbnMuZW1haWwgPT09IHRydWUsXG4gICAgICAgICAgbm9FbWFpbDogb3B0aW9ucy5lbWFpbCA9PT0gZmFsc2UsXG4gICAgICAgICAgZW1haWxGcm9tOiBvcHRpb25zLmVtYWlsRnJvbSxcbiAgICAgICAgICBlbWFpbEZyb21OYW1lOiBvcHRpb25zLmVtYWlsRnJvbU5hbWUsXG4gICAgICAgICAgYWxlcnRFbWFpbDogb3B0aW9ucy5hbGVydEVtYWlsLFxuICAgICAgICAgIG5vQ3JlYXRlU2VzSWRlbnRpdHk6IG9wdGlvbnMuc2tpcFNlc0lkZW50aXR5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBhaU9wdHMgPSB7IHByb3ZpZGVyOiBvcHRpb25zLmFpUHJvdmlkZXIsIG1vZGVsOiBvcHRpb25zLm1vZGVsIH07XG5cbiAgICAgICAgLy8gQm9vdHN0cmFwIChzcGFyc2UgY2xvbmUpICsgcG9zdC1pbnN0YWxsIHNlbGVjdGlvbnMuXG4gICAgICAgIGNvbnN0IHdhbnRCb290c3RyYXAgPSBvcHRpb25zLnJlcG8gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnJlcG8gIT09IGZhbHNlO1xuICAgICAgICBjb25zdCB3aXRoQWxsID0gb3B0aW9ucy53aXRoQWxsID09PSB0cnVlO1xuICAgICAgICBjb25zdCBhbnlMb2FkRmxhZyA9IHdpdGhBbGwgfHwgTE9BRF9TVEVQUy5zb21lKChzKSA9PiBvcHRpb25zW3MuZmxhZ10gPT09IHRydWUpO1xuICAgICAgICBsZXQgZW5hYmxlZExvYWRJZHMgPSBMT0FEX1NURVBTLmZpbHRlcigocykgPT4gd2l0aEFsbCB8fCBvcHRpb25zW3MuZmxhZ10gPT09IHRydWUpLm1hcCgocykgPT4gcy5pZCk7XG4gICAgICAgIC8vIFdpdGggbm8gLS13aXRoLSogZmxhZ3MsIGFuIGludGVyYWN0aXZlIHJ1biBvZmZlcnMgZWFjaCBsb2FkIOKAlCBidXQgQUZURVIgdGhlXG4gICAgICAgIC8vIGNsb25lLCBzbyB0aGUgcXVlc3Rpb25zIGNvbWUgb25jZSB5b3UndmUgYWdyZWVkIHRvIHByb2NlZWQgKG5vdCB1cCBmcm9udCkuXG4gICAgICAgIC8vIEVhY2ggcGlja2VkIGxvYWQncyBmb2xkZXIgaXMgdGhlbiBmZXRjaGVkIHZpYSBhbiBhZGRpdGl2ZSBzcGFyc2UgcmUtc3luYy5cbiAgICAgICAgLy8gRmxhZ3MgLyAtLXllcyAvIC0tanNvbiAvIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbHMgc2tpcCB0aGUgcHJvbXB0cy5cbiAgICAgICAgY29uc3Qgd2lsbFByb21wdExvYWRzID0gIW9wdGlvbnMueWVzICYmICFvcHRpb25zLmpzb24gJiYgQm9vbGVhbihwcm9jZXNzLnN0ZGluLmlzVFRZKSAmJiAhYW55TG9hZEZsYWc7XG4gICAgICAgIGNvbnN0IHBvc3RTdGVwRmxhZ3MgPSB7XG4gICAgICAgICAgaW5pdDogb3B0aW9ucy5pbml0ICE9PSBmYWxzZSxcbiAgICAgICAgICBidWlsZEJvb3RzdHJhcDogb3B0aW9ucy5idWlsZEJvb3RzdHJhcCA9PT0gdHJ1ZSB8fCBlbmFibGVkTG9hZElkcy5pbmNsdWRlcygncGx1Z2lucycpLFxuICAgICAgICAgIHNtb2tlVGVzdDogb3B0aW9ucy53aXRoU21va2VUZXN0ID09PSB0cnVlLFxuICAgICAgICAgIGV2ZW50czogb3B0aW9ucy53aXRoRXZlbnRzID09PSB0cnVlLFxuICAgICAgICAgIHN0ZXBzOiAob3B0aW9ucy5wb3N0U3RlcCA/PyBbXSkgYXMgc3RyaW5nW10sXG4gICAgICAgIH07XG4gICAgICAgIC8vIEFkbWluIGNyZWRlbnRpYWxzIGZvcndhcmRlZCBhcyBlbnYgc28gcmVnaXN0ZXIgcnVucyBub24taW50ZXJhY3RpdmVseS5cbiAgICAgICAgY29uc3QgYWRtaW5FbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmFkbWluRW1haWwgPT09ICdzdHJpbmcnKSBhZG1pbkVudi5QTEFURk9STV9JREVOVElGSUVSID0gb3B0aW9ucy5hZG1pbkVtYWlsO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYWRtaW5QYXNzd29yZCA9PT0gJ3N0cmluZycpIGFkbWluRW52LlBMQVRGT1JNX1BBU1NXT1JEID0gb3B0aW9ucy5hZG1pblBhc3N3b3JkO1xuXG4gICAgICAgIC8vIDIuIE9wdGlvbmFsbHkgcGFyc2UgYSBuYXR1cmFsLWxhbmd1YWdlIGdvYWwgdG8gZmlsbCBhbnkgR0FQUyAoYmVzdC1lZmZvcnQpLlxuICAgICAgICBsZXQgdGFyZ2V0OiBUYXJnZXRJZCB8IHVuZGVmaW5lZCA9IGlzVGFyZ2V0SWQob3B0aW9ucy50YXJnZXQpID8gb3B0aW9ucy50YXJnZXQgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChvcHRpb25zLnByb21wdCkge1xuICAgICAgICAgIGlmIChpc0FpQ29uZmlndXJlZChhaU9wdHMpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBhd2FpdCBwYXJzZUdvYWwob3B0aW9ucy5wcm9tcHQsIGFpT3B0cyk7XG4gICAgICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICAgIGlmICghdGFyZ2V0ICYmIGlzVGFyZ2V0SWQocGFyc2VkLnRhcmdldCkpIHRhcmdldCA9IHBhcnNlZC50YXJnZXQ7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoayAhPT0gJ3RhcmdldCcgJiYgcGFyYW1zW2tdID09PSB1bmRlZmluZWQgJiYgdiAhPT0gdW5kZWZpbmVkKSBwYXJhbXNba10gPSB2O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZygnQSAtLXByb21wdCB3YXMgZ2l2ZW4gYnV0IG5vIEFJIGtleSBpcyBzZXQg4oCUIGlnbm9yaW5nIGl0IGFuZCB1c2luZyBmbGFncyBvbmx5LiBTZXQgQU5USFJPUElDX0FQSV9LRVkgKG9yIC0tYWktcHJvdmlkZXIgKyBpdHMga2V5KS4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBPcHRpb25hbCBmYWlsdXJlIGRpYWdub3NpcyAoaW5kZXBlbmRlbnQgb2YgYSBkZXBsb3kgcGxhbikuXG4gICAgICAgIGlmIChvcHRpb25zLmRpYWdub3NlKSB7XG4gICAgICAgICAgbGV0IGZhaWx1cmVUZXh0OiBzdHJpbmc7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZhaWx1cmVUZXh0ID0gcmVhZEZpbGVTeW5jKG9wdGlvbnMuZGlhZ25vc2UsICd1dGYtOCcpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcHJpbnRFcnJvcihgQ2Fubm90IHJlYWQgLS1kaWFnbm9zZSBmaWxlOiAke29wdGlvbnMuZGlhZ25vc2V9YCk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGlhZ25vc2lzID0gaXNBaUNvbmZpZ3VyZWQoYWlPcHRzKSA/IGF3YWl0IGRpYWdub3NlRmFpbHVyZShmYWlsdXJlVGV4dCwgYWlPcHRzKSA6IG51bGw7XG4gICAgICAgICAgLy8gV2l0aCAtLWpzb24sIHRoZSBkaWFnbm9zaXMgSVMgdGhlIG1hY2hpbmUtcmVhZGFibGUgb3V0cHV0IOKAlCBlbWl0IGl0XG4gICAgICAgICAgLy8gYWxvbmUgKGRvbid0IGFsc28gcHJpbnQgdGV4dCwgd2hpY2ggd291bGQgY29ycnVwdCB0aGUgSlNPTiBzdHJlYW0pLlxuICAgICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZXhlY3V0aW9uSWQsIGRpYWdub3NpcyB9LCBudWxsLCAyKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkaWFnbm9zaXMpIHtcbiAgICAgICAgICAgIHByaW50U2VjdGlvbignRmFpbHVyZSBkaWFnbm9zaXMnKTtcbiAgICAgICAgICAgIHByaW50SW5mbyhkaWFnbm9zaXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoJ0RpYWdub3NpcyB1bmF2YWlsYWJsZSAobm8gQUkga2V5IGNvbmZpZ3VyZWQgb3IgdGhlIG1vZGVsIGNvdWxkIG5vdCBiZSByZWFjaGVkKS4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuIE5lZWQgYSB0YXJnZXQgdG8gYXNzZW1ibGUgYSBwbGFuLlxuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgIHByaW50RXJyb3IoYE5vIHRhcmdldCBzcGVjaWZpZWQuIFBhc3MgLS10YXJnZXQgPCR7VEFSR0VUX0lEUy5qb2luKCd8Jyl9PiBvciBkZXNjcmliZSB0aGUgZ29hbCB3aXRoIC0tcHJvbXB0LmApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWMgPSBUQVJHRVRTW3RhcmdldF07XG4gICAgICAgIGxldCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgICAgIC8vIDRiLiBUZWFyZG93biBtb2RlIOKAlCB0aGUgZGVzdHJveSBjb3VudGVycGFydCBvZiBwcm92aXNpb25pbmcuIEdhdGVkIGhhcmRlclxuICAgICAgICAvLyB0aGFuIGRlcGxveTogQVdTIHRhcmdldHMgYXJlIGlycmV2ZXJzaWJsZSwgc28gd2UgcmVxdWlyZSB0aGUgb3BlcmF0b3IgdG9cbiAgICAgICAgLy8gVFlQRSB0aGUgdGFyZ2V0IGlkICgtLWZvcmNlIGJ5cGFzc2VzIGZvciBDSTsgLS15ZXMgYWxvbmUgZG9lcyBOT1QpLlxuICAgICAgICBpZiAob3B0aW9ucy50ZWFyZG93bikge1xuICAgICAgICAgIGNvbnN0IHsgY29tbWFuZDogZG93bkNvbW1hbmQsIGRlc3RydWN0aXZlIH0gPSB0ZWFyZG93bkNvbW1hbmQodGFyZ2V0LCB7XG4gICAgICAgICAgICBzdGFja05hbWU6IG9wdGlvbnMuc3RhY2tOYW1lLFxuICAgICAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgICAgIC8vIE91ciB0eXBlZCBnYXRlIElTIHRoZSBjb25maXJtYXRpb24g4oCUIGZvcndhcmQgLS15ZXMgc28gdGhlIG5hdGl2ZVxuICAgICAgICAgICAgLy8gc2NyaXB0IChGYXJnYXRlKSBkb2Vzbid0IGFsc28gYmxvY2sgb24gc3RkaW4gd2UncmUgaW5oZXJpdGluZy5cbiAgICAgICAgICAgIGFzc3VtZVllczogdHJ1ZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZXhlY3V0aW9uSWQsIHRhcmdldCwgdGVhcmRvd246IHRydWUsIGRlc3RydWN0aXZlLCBkZXN0cm95czogc3BlYy5kZXN0cm95cywgY29tbWFuZDogZG93bkNvbW1hbmQgfSwgbnVsbCwgMikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHByaW50U2VjdGlvbihgVGVhcmRvd24gcGxhbiDigJQgJHtzcGVjLmxhYmVsfWApO1xuICAgICAgICAgIHByaW50S2V5VmFsdWUoeyAnVGFyZ2V0JzogdGFyZ2V0LCAnRGVzdHJveXMnOiBzcGVjLmRlc3Ryb3lzLCAnU3RvcHMgY29zdCc6IHNwZWMuY29zdCB9KTtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ0NvbW1hbmQgdG8gcnVuJyk7XG4gICAgICAgICAgcHJpbnRJbmZvKGRvd25Db21tYW5kKTtcblxuICAgICAgICAgIGlmIChkZXN0cnVjdGl2ZSAmJiAhb3B0aW9ucy5mb3JjZSkge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhc2soYFxcblRoaXMgaXMgSVJSRVZFUlNJQkxFLiBUeXBlIFwiJHt0YXJnZXR9XCIgdG8gY29uZmlybSB0ZWFyZG93bjogYCk7XG4gICAgICAgICAgICBpZiAodG9rZW4gIT09IHRhcmdldCkge1xuICAgICAgICAgICAgICBwcmludFdhcm5pbmcoJ1RoYXQgZGlkblxcJ3QgbWF0Y2gsIHNvIG5vdGhpbmcgd2FzIGRlc3Ryb3llZCDigJQgeW91IGhhdmUgdG8gdHlwZSB0aGUgZXhhY3QgdGFyZ2V0IGlkIHRvIGNvbmZpcm0uJyk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCFkZXN0cnVjdGl2ZSAmJiAhb3B0aW9ucy5mb3JjZSAmJiAhKGF3YWl0IGNvbmZpcm0oJ1xcblByb2NlZWQgd2l0aCB0ZWFyZG93biAoc3RvcHMgdGhlIHN0YWNrOyBvbi1kaXNrIGRhdGEgcGVyc2lzdHMpPycsIG9wdGlvbnMueWVzKSkpIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZygnTm8gcHJvYmxlbSDigJQgbm90aGluZyB3YXMgY2hhbmdlZC4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwcmludFNlY3Rpb24oJ1RlYXJpbmcgZG93bicpO1xuICAgICAgICAgIGNvbnN0IHsgY29kZTogZG93bkNvZGUgfSA9IGF3YWl0IHJ1blNjcmlwdChkb3duQ29tbWFuZCwgY3dkLCB7IGNhcHR1cmU6IGZhbHNlIH0pO1xuICAgICAgICAgIGlmIChkb3duQ29kZSAhPT0gMCkge1xuICAgICAgICAgICAgcHJpbnRFcnJvcihgXFxuVGVhcmRvd24gZmFpbGVkIChleGl0ICR7ZG93bkNvZGV9KS4gSW5zcGVjdCB0aGUgc3RhY2svY29udGFpbmVycyBhbmQgcmV0cnkuYCk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJpbnRTdWNjZXNzKCdUZWFyZG93biBjb21wbGV0ZS4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHByZXZpb3VzbHktZmV0Y2hlZCBzaW5nbGUtYmluYXJ5IHRvb2xzIChlLmcuIHlxKSB2aXNpYmxlIHRvIHRoZVxuICAgICAgICAvLyBwcmVyZXEgY2hlY2tzICsgdGhlIGRlcGxveSDigJQgdGhleSBsaXZlIGluIHRoZSB0b29scyBjYWNoZSwgbm90IG9uIHRoZVxuICAgICAgICAvLyBzeXN0ZW0gUEFUSC4gKEJvdGggYGhhcygpYCBhbmQgdGhlIGRlcGxveSdzIGBiYXNoIC1sY2AgaW5oZXJpdCB0aGlzLilcbiAgICAgICAgd2l0aFRvb2xzT25QYXRoKCk7XG4gICAgICAgIGxldCBwcmVyZXFzID0gY2hlY2tQcmVyZXFzKHRhcmdldCwgeyBib290c3RyYXA6IHdhbnRCb290c3RyYXAsIHdpdGhQbHVnaW5zOiB3aWxsUHJvbXB0TG9hZHMgfHwgZW5hYmxlZExvYWRJZHMuaW5jbHVkZXMoJ3BsdWdpbnMnKSB9KTtcbiAgICAgICAgY29uc3QgeyBjb21tYW5kLCBtaXNzaW5nIH0gPSBhc3NlbWJsZUNvbW1hbmQoc3BlYywgcGFyYW1zKTtcbiAgICAgICAgY29uc3QgdXJsID0gZGVyaXZlSGVhbHRoVXJsKHRhcmdldCwgcGFyYW1zKTtcblxuICAgICAgICAvLyBTcGFyc2UgYm9vdHN0cmFwIGNsb25lIGNvbW1hbmQgKGNvbW1vbiBiYXNlICsgdGFyZ2V0ICsgc2VsZWN0ZWQgbG9hZHMpLlxuICAgICAgICAvLyBJbnRlcmFjdGl2ZSBsb2FkcyBhcmUgY2hvc2VuIEFGVEVSIHRoZSBjbG9uZSwgc28gdGhlIGNsb25lIHN0YXlzIG1pbmltYWwg4oCUXG4gICAgICAgIC8vIGVhY2ggcGlja2VkIGxvYWQncyBmb2xkZXIgaXMgZmV0Y2hlZCB0aGVuIHZpYSBhbiBhZGRpdGl2ZSBzcGFyc2UgcmUtc3luYy5cbiAgICAgICAgY29uc3Qgc3BhcnNlUGF0aHMgPSBzcGFyc2VQYXRoc0Zvcih0YXJnZXQsIGVuYWJsZWRMb2FkSWRzKTtcbiAgICAgICAgY29uc3QgYm9vdHN0cmFwID0gcmVzb2x2ZUJvb3RzdHJhcChcbiAgICAgICAgICB7IHJlcG86IHR5cGVvZiBvcHRpb25zLnJlcG8gPT09ICdzdHJpbmcnID8gb3B0aW9ucy5yZXBvIDogdW5kZWZpbmVkLCByZWY6IG9wdGlvbnMucmVmLCB3b3JrZGlyOiBvcHRpb25zLndvcmtkaXIsIGZ1bGw6ICFnaXRTdXBwb3J0c1NwYXJzZUNoZWNrb3V0KCkgfSxcbiAgICAgICAgICBzcGFyc2VQYXRocyxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYm9vdHN0cmFwQ21kID0gd2FudEJvb3RzdHJhcCA/IGJvb3RzdHJhcENvbW1hbmQoYm9vdHN0cmFwKSA6IG51bGw7XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBwb3N0LWluc3RhbGwgc3RlcHMgKHJlZ2lzdGVyIOKGkiBzbW9rZSDihpIgZXZlbnRzIOKGkiBjdXN0b20pLiBSZS1yZXNvbHZlZFxuICAgICAgICAvLyBhZnRlciB0aGUgcG9zdC1jbG9uZSBsb2FkIHByb21wdHMgKHNlZSBiZWxvdykgd2hlbiB0aG9zZSBydW4gaW50ZXJhY3RpdmVseS5cbiAgICAgICAgbGV0IHsgc3RlcHM6IHBvc3RTdGVwcywgc2tpcHBlZDogc2tpcHBlZFN0ZXBzIH0gPSByZXNvbHZlUG9zdFN0ZXBzKHtcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHJlZ2lvbjogdHlwZW9mIHBhcmFtcy5yZWdpb24gPT09ICdzdHJpbmcnID8gcGFyYW1zLnJlZ2lvbiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbmFibGVkTG9hZElkcyxcbiAgICAgICAgICAuLi5wb3N0U3RlcEZsYWdzLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgcHJlcmVxcyxcbiAgICAgICAgICAgIHByZXJlcXNTYXRpc2ZpZWQ6IHByZXJlcXNTYXRpc2ZpZWQocHJlcmVxcyksXG4gICAgICAgICAgICBtaXNzaW5nSW5wdXRzOiBtaXNzaW5nLm1hcCgobSkgPT4gKHsgZmxhZzogbS5mbGFnLCBkZXNjcmlwdGlvbjogbS5kZXNjcmlwdGlvbiB9KSksXG4gICAgICAgICAgICBib290c3RyYXA6IGJvb3RzdHJhcENtZCxcbiAgICAgICAgICAgIHNwYXJzZVBhdGhzOiB3YW50Qm9vdHN0cmFwID8gc3BhcnNlUGF0aHMgOiBudWxsLFxuICAgICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICAgIHBvc3RTdGVwczogcG9zdFN0ZXBzLm1hcCgocykgPT4gKHsgaWQ6IHMuaWQsIGxhYmVsOiBzLmxhYmVsLCBjb21tYW5kOiBzLmNvbW1hbmQgfSkpLFxuICAgICAgICAgICAgc2tpcHBlZFBvc3RTdGVwczogc2tpcHBlZFN0ZXBzLFxuICAgICAgICAgIH0sIG51bGwsIDIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyA1LiBQcmludCB0aGUgcGxhbiAoc2hvd24gYmVmb3JlIHRoZSBnYXRlZCBleGVjdXRpb24gYmVsb3cpLlxuICAgICAgICBwcmludFNlY3Rpb24oYFByb3Zpc2lvbiBwbGFuIOKAlCAke3NwZWMubGFiZWx9YCk7XG4gICAgICAgIHByaW50S2V5VmFsdWUoeyAnVGFyZ2V0JzogdGFyZ2V0LCAnQmVzdCBmb3InOiBzcGVjLmJlc3RGb3IsICdDb3N0Jzogc3BlYy5jb3N0IH0pO1xuXG4gICAgICAgIHByaW50U2VjdGlvbignUHJlcmVxdWlzaXRlcycpO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgcHJlcmVxcykgcHJpbnRJbmZvKGAke2Mub2sgPyAn4pyTJyA6ICfinJcnfSAke2MubmFtZX0g4oCUICR7Yy5kZXRhaWx9YCk7XG4gICAgICAgIGlmICghcHJlcmVxc1NhdGlzZmllZChwcmVyZXFzKSkgcHJpbnRXYXJuaW5nKCdSZXNvbHZlIHRoZSBmYWlsaW5nIHByZXJlcXVpc2l0ZXMgYWJvdmUgYmVmb3JlIGRlcGxveWluZy4nKTtcblxuICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIGlucHV0cycpO1xuICAgICAgICAgIGZvciAoY29uc3QgbSBvZiBtaXNzaW5nKSBwcmludEluZm8oYCAgLS0ke20uZmxhZ30gICgke20uZGVzY3JpcHRpb259KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJvb3RzdHJhcENtZCkge1xuICAgICAgICAgIHByaW50U2VjdGlvbignQm9vdHN0cmFwIChzcGFyc2UgZ2l0IGNsb25lLCBydW5zIGZpcnN0KScpO1xuICAgICAgICAgIHByaW50SW5mbyhgQ2xvbmUgJHtib290c3RyYXAucmVwb30gQCAke2Jvb3RzdHJhcC5yZWZ9IOKGkiAke2Jvb3RzdHJhcC53b3JrZGlyfTsgZm9sZGVyczogJHtzcGFyc2VQYXRocy5qb2luKCcsICcpfWApO1xuICAgICAgICAgIHByaW50SW5mbyhib290c3RyYXBDbWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRTZWN0aW9uKCdDb21tYW5kIHRvIHJ1bicpO1xuICAgICAgICBwcmludEluZm8oY29tbWFuZCk7XG5cbiAgICAgICAgaWYgKHBvc3RTdGVwcy5sZW5ndGggPiAwIHx8IHNraXBwZWRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdQb3N0LWluc3RhbGwgc3RlcHMnKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHMgb2YgcG9zdFN0ZXBzKSBwcmludEluZm8oYOKAoiAke3MubGFiZWx9XFxuICAgICR7cy5jb21tYW5kfWApO1xuICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBza2lwcGVkU3RlcHMpIHByaW50V2FybmluZyhgc2tpcHBlZCAke3MuaWR9OiAke3MucmVhc29ufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNWIuIEhvc3QtcG9ydCBwcmUtZmxpZ2h0IChsb2NhbC9taW5pa3ViZSBvbmx5KS4gVGhlIGRlcGxveSBiaW5kcyBmaXhlZCBob3N0XG4gICAgICAgIC8vIHBvcnRzIChEb2NrZXIgcHVibGlzaCAvIGt1YmVjdGwgcG9ydC1mb3J3YXJkKTsgaWYgb25lIGlzIHRha2VuLCBhIGNvbnRhaW5lclxuICAgICAgICAvLyBvciBmb3J3YXJkIGZhaWxzIHRvIGJpbmQgbWlkLWRlcGxveSDigJQgYW5kIGZvciB0aGUgZ2F0ZXdheSB0aGF0IHN1cmZhY2VzIGFzIGFcbiAgICAgICAgLy8gc2lsZW50IFwiL2hlYWx0aCBuZXZlciByZWFjaGFibGVcIiBoYW5nLiBTdG9wIE5PVyB3aXRoIGEgc3VtbWFyeSBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIGZhaWxpbmcgaGFsZndheS4gUmVtb3RlIHRhcmdldHMgKGVjMi9mYXJnYXRlKSBiaW5kIG5vdGhpbmcgbG9jYWxseSDihpIgc2tpcHBlZC5cbiAgICAgICAgaWYgKHNwZWMuaG9zdFBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBwb3J0Q2hlY2tzID0gYXdhaXQgY2hlY2tIb3N0UG9ydHMoc3BlYyk7XG4gICAgICAgICAgY29uc3QgdGFrZW4gPSBwb3J0Q2hlY2tzLmZpbHRlcigoYykgPT4gIWMuYXZhaWxhYmxlKTtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ1BvcnQgYXZhaWxhYmlsaXR5Jyk7XG4gICAgICAgICAgZm9yIChjb25zdCBjIG9mIHBvcnRDaGVja3MpIHByaW50SW5mbyhgJHtjLmF2YWlsYWJsZSA/ICfinJMnIDogJ+Kclyd9ICR7U3RyaW5nKGMucG9ydCkucGFkRW5kKDUpfSDigJQgJHtjLnNlcnZpY2V9YCk7XG4gICAgICAgICAgaWYgKHRha2VuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByaW50RXJyb3IoYFxcbiR7dGFrZW4ubGVuZ3RofSByZXF1aXJlZCBwb3J0KHMpIGFscmVhZHkgaW4gdXNlIOKAlCB0aGUgZGVwbG95IGNhbid0IGJpbmQgdGhlbSBhbmQgd291bGQgZmFpbCBtaWQtd2F5LiBGcmVlIHRoZW0gYW5kIHJlLXJ1bjpgKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiB0YWtlbikgcHJpbnRJbmZvKGAgIOKAoiBwb3J0ICR7Yy5wb3J0fSAoJHtjLnNlcnZpY2V9KSDigJQgZmluZCB0aGUgaG9sZGVyOiAgbHNvZiAtaSA6JHtjLnBvcnR9YCk7XG4gICAgICAgICAgICBpZiAodGFrZW4uc29tZSgoYykgPT4gYy5wb3J0ID09PSA1MDAwKSkge1xuICAgICAgICAgICAgICBwcmludEluZm8oJyAgTm90ZTogb24gbWFjT1MsIHBvcnQgNTAwMCBpcyB1c3VhbGx5IEFpclBsYXkgUmVjZWl2ZXIg4oCUIFN5c3RlbSBTZXR0aW5ncyDihpIgR2VuZXJhbCDihpIgQWlyRHJvcCAmIEhhbmRvZmYg4oaSIEFpclBsYXkgUmVjZWl2ZXIgKG9mZikuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyA2LiBBbnkgbWlzc2luZyByZXF1aXJlZCBwcmVyZXEgdGhhdCdzIGEgc2luZ2xlIHN0YXRpYyBiaW5hcnkgKGUuZy4geXEpXG4gICAgICAgIC8vIGNhbiBiZSBmZXRjaGVkIGludG8gdGhlIHRvb2xzIGNhY2hlIGluc3RlYWQgb2YgYSBzeXN0ZW0gaW5zdGFsbCDigJQgbm9cbiAgICAgICAgLy8gYnJldy9hcHQuIE9mZmVyIGl0LCB0aGVuIHJlLWNoZWNrICh0aGUgY2FjaGUgZGlyIGlzIGFscmVhZHkgb24gUEFUSCkuXG4gICAgICAgIGNvbnN0IGZldGNoYWJsZSA9IHByZXJlcXMuZmlsdGVyKChjKSA9PiAhYy5vayAmJiBjLnJlcXVpcmVkICYmIGlzRmV0Y2hhYmxlKGMubmFtZSkpO1xuICAgICAgICBpZiAoZmV0Y2hhYmxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBuYW1lcyA9IGZldGNoYWJsZS5tYXAoKGMpID0+IGMubmFtZSkuam9pbignLCAnKTtcbiAgICAgICAgICBpZiAoYXdhaXQgY29uZmlybShgXFxuJHtuYW1lc30gbm90IGluc3RhbGxlZCDigJQgZmV0Y2ggdGhlIG9mZmljaWFsIHN0YXRpYyBiaW5hcnkgaW50byAke1RPT0xTX0RJUn0gKG5vIHN5c3RlbSBpbnN0YWxsKT9gLCBvcHRpb25zLnllcykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBmZXRjaGFibGUpIHtcbiAgICAgICAgICAgICAgcHJpbnRJbmZvKGBGZXRjaGluZyAke2MubmFtZX3igKZgKTtcbiAgICAgICAgICAgICAgaWYgKCFmZXRjaFRvb2woYy5uYW1lKSkgcHJpbnRXYXJuaW5nKGBDb3VsZG4ndCBmZXRjaCAke2MubmFtZX0g4oCUIGluc3RhbGwgaXQgbWFudWFsbHkgYW5kIHJlLXJ1bi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXJlcXMgPSBjaGVja1ByZXJlcXModGFyZ2V0LCB7IGJvb3RzdHJhcDogd2FudEJvb3RzdHJhcCwgd2l0aFBsdWdpbnM6IHdpbGxQcm9tcHRMb2FkcyB8fCBlbmFibGVkTG9hZElkcy5pbmNsdWRlcygncGx1Z2lucycpIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDdiLiBHYXRlZCBleGVjdXRpb24uIENoZWNrIHByZXJlcXMgLyByZXF1aXJlZCBpbnB1dHMgZmlyc3Qg4oCUIHRoaXMgYWxzb1xuICAgICAgICAvLyBjYXRjaGVzIGEgbWlzc2luZyBgZ2l0YCB3aGVuIGJvb3RzdHJhcHBpbmcuXG4gICAgICAgIGNvbnN0IGJsb2NrZWQgPSBleGVjdXRpb25CbG9ja2VkKHByZXJlcXMsIG1pc3NpbmcpO1xuICAgICAgICBpZiAoYmxvY2tlZCkge1xuICAgICAgICAgIHByaW50RXJyb3IoYENhbid0IHN0YXJ0IGp1c3QgeWV0IOKAlCAke2Jsb2NrZWR9LiBSZXNvbHZlIHRoYXQgYW5kIHJlLXJ1bi5gKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyA3YS4gU3BhcnNlLWNsb25lIHRoZSBwbGF0Zm9ybSByZXBvLCByZXBvaW50IGN3ZCwgYW5kIHZlcmlmeSB0aGUgdHJlZS5cbiAgICAgICAgLy8gU2hhcmVkIGJ5IGAtLXJlcG9gIChiZWxvdykgYW5kIHRoZSBpbnRlcmFjdGl2ZSBvZmZlciBpbiA3Yi4gUmV0dXJuc1xuICAgICAgICAvLyBmYWxzZSAoYW5kIHNldHMgZXhpdENvZGUpIG9uIGZhaWx1cmUg4oCUIHdpdGggYSBmcmllbmRseSBtZXNzYWdlLlxuICAgICAgICAvLyBgYm9vdHN0cmFwcGVkYCByZWNvcmRzIHdoZXRoZXIgd2UgY3JlYXRlZCB0aGUgY2xvbmUgKHZzLiBydW5uaW5nIGluc2lkZSBhblxuICAgICAgICAvLyBleGlzdGluZyBjaGVja291dCkg4oCUIG9ubHkgdGhlbiBjYW4gd2UgYWRkaXRpdmVseSBzcGFyc2UtZmV0Y2ggbG9hZCBmb2xkZXJzLlxuICAgICAgICBsZXQgYm9vdHN0cmFwcGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGJvb3RzdHJhcENsb25lID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICAgIGNvbnN0IGNtZCA9IGJvb3RzdHJhcENvbW1hbmQoYm9vdHN0cmFwKTtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ0Jvb3RzdHJhcCcpO1xuICAgICAgICAgIHByaW50SW5mbyhjbWQpO1xuICAgICAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgcnVuU2NyaXB0KGNtZCwgY3dkLCB7IGNhcHR1cmU6IGZhbHNlIH0pO1xuICAgICAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgICAgICBwcmludEVycm9yKGBcXG5UaGUgY2xvbmUgZGlkbid0IGZpbmlzaCAoZXhpdCAke2NvZGV9KS4gRG91YmxlLWNoZWNrIHRoZSByZXBvIFVSTCAvIHJlZiAob3IgeW91ciBuZXR3b3JrKSBhbmQgZ2l2ZSBpdCBhbm90aGVyIGdvLmApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN3ZCA9IHBhdGgucmVzb2x2ZShjd2QsIGJvb3RzdHJhcC53b3JrZGlyKTtcbiAgICAgICAgICBib290c3RyYXBwZWQgPSB0cnVlO1xuICAgICAgICAgIHByaW50U3VjY2VzcyhgUmVwbyBpcyByZWFkeSDigJQgY29udGludWluZyBmcm9tICR7Y3dkfWApO1xuICAgICAgICAgIGNvbnN0IGFic2VudCA9IHNwYXJzZVBhdGhzLmZpbHRlcigocCkgPT4gIWV4aXN0c1N5bmMocGF0aC5qb2luKGN3ZCwgcCkpKTtcbiAgICAgICAgICBpZiAoYWJzZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByaW50RXJyb3IoYFxcblRoZSBzcGFyc2UgY2xvbmUgaXMgbWlzc2luZyAke2Fic2VudC5qb2luKCcsICcpfSDigJQgdGhhdCByZWYgbWF5IG5vdCBoYXZlIHRob3NlIGZvbGRlcnMuIFRyeSBhIGRpZmZlcmVudCAtLXJlZi5gKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBgLS1yZXBvYDogY2xvbmUgdXAgZnJvbnQgKG11c3QgcHJlY2VkZSB0aGUgZW50cnlwb2ludCBjaGVjaykuXG4gICAgICAgIGlmIChib290c3RyYXBDbWQpIHtcbiAgICAgICAgICBwcmludEluZm8oYFxcbkJvb3RzdHJhcCDihpIgY2xvbmUgJHtib290c3RyYXAucmVwb30gQCAke2Jvb3RzdHJhcC5yZWZ9IGludG8gJHtib290c3RyYXAud29ya2Rpcn0gKHNwYXJzZSkuYCk7XG4gICAgICAgICAgaWYgKCEoYXdhaXQgY29uZmlybSgnR28gYWhlYWQgd2l0aCB0aGUgY2xvbmU/Jywgb3B0aW9ucy55ZXMpKSkge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKCdObyBwcm9ibGVtIOKAlCBub3RoaW5nIHdhcyBjaGFuZ2VkLiBSZS1ydW4gd2hlbmV2ZXIgeW91XFwncmUgcmVhZHkuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghKGF3YWl0IGJvb3RzdHJhcENsb25lKCkpKSByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyA3Yi4gVGhlIGRlcGxveSBlbnRyeXBvaW50IG11c3QgZXhpc3QgcmVsYXRpdmUgdG8gY3dkLiBJZiBpdCBkb2Vzbid0IGFuZFxuICAgICAgICAvLyB3ZSBoYXZlbid0IGJvb3RzdHJhcHBlZCwgZ3JhY2VmdWxseSBPRkZFUiB0byBjbG9uZSAoaW50ZXJhY3RpdmUgb25seSksXG4gICAgICAgIC8vIHNvIGEgZnJlc2ggbWFjaGluZSBjYW4gcHJvY2VlZCB3aXRob3V0IHJlLXJ1bm5pbmcgd2l0aCAtLXJlcG8uXG4gICAgICAgIGlmICghZW50cnlwb2ludEV4aXN0cyhzcGVjLCBjd2QpKSB7XG4gICAgICAgICAgY29uc3QgaW50ZXJhY3RpdmUgPSBCb29sZWFuKHByb2Nlc3Muc3RkaW4uaXNUVFkpICYmICFvcHRpb25zLnllcztcbiAgICAgICAgICBpZiAoIWJvb3RzdHJhcENtZCAmJiBpbnRlcmFjdGl2ZSAmJiBnaXRBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgcHJpbnRJbmZvKGBcXG5Mb29rcyBsaWtlIHlvdSdyZSBub3QgaW5zaWRlIGEgcGlwZWxpbmUtYnVpbGRlciBjaGVja291dCwgc28gdGhlICR7c3BlYy5sYWJlbH0gZGVwbG95IHNjcmlwdHMgYXJlbid0IGhlcmUgeWV0LmApO1xuICAgICAgICAgICAgaWYgKGF3YWl0IGNvbmZpcm0oYFdhbnQgbWUgdG8gc3BhcnNlLWNsb25lIHRoZW0gaW50byAke2Jvb3RzdHJhcC53b3JrZGlyfSBhbmQga2VlcCBnb2luZz9gLCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgaWYgKCEoYXdhaXQgYm9vdHN0cmFwQ2xvbmUoKSkpIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFlbnRyeXBvaW50RXhpc3RzKHNwZWMsIGN3ZCkpIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZyhgXFxuSSBjb3VsZG4ndCBmaW5kICR7c3BlYy5kaXJ9LyR7c3BlYy5lbnRyeXBvaW50fSBmcm9tICR7Y3dkfS5gKTtcbiAgICAgICAgICAgIHByaW50SW5mbygnVHdvIGVhc3kgd2F5cyBmb3J3YXJkOicpO1xuICAgICAgICAgICAgcHJpbnRJbmZvKCcgIOKAoiBjZCBpbnRvIHlvdXIgcGlwZWxpbmUtYnVpbGRlciBjaGVja291dCBhbmQgcmUtcnVuLCBvcicpO1xuICAgICAgICAgICAgcHJpbnRJbmZvKGAgIOKAoiBhZGQgLS1yZXBvIGFuZCBJJ2xsIGJvb3RzdHJhcCBhIGZyZXNoIHNwYXJzZSBjbG9uZSBmb3IgeW91JHtnaXRBdmFpbGFibGUoKSA/ICcuJyA6ICcgKG9uY2UgZ2l0IGlzIGluc3RhbGxlZCkuJ31gKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdC1pbiBsb2FkcyDigJQgb2ZmZXJlZCBBRlRFUiB0aGUgY2xvbmUgKHNvIHdlIG9ubHkgYXNrIG9uY2UgeW91J3ZlIGFncmVlZFxuICAgICAgICAvLyB0byBwcm9jZWVkKS4gVGhlIGNsb25lIHByZS1zdGFnZWQgZXZlcnkgbG9hZCBmb2xkZXIsIHNvIGVhY2ggY2hvaWNlIGlzIHJlYWR5XG4gICAgICAgIC8vIHdpdGhvdXQgYSByZS1zeW5jOyByZS1yZXNvbHZlIHRoZSBwb3N0LWluc3RhbGwgc3RlcHMgd2l0aCB0aGUgc2VsZWN0aW9ucy5cbiAgICAgICAgaWYgKHdpbGxQcm9tcHRMb2Fkcykge1xuICAgICAgICAgIGNvbnN0IHByb21wdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICBwbHVnaW5zOiAnTG9hZCBwbHVnaW5zPyAoYnVpbGRzIHRoZSBwbHVnaW4gaW1hZ2VzIGxvY2FsbHkg4oCUIHRoZSBzbG93IG9uZSknLFxuICAgICAgICAgICAgc2FtcGxlczogJ0xvYWQgc2FtcGxlIHBpcGVsaW5lcz8nLFxuICAgICAgICAgICAgY29tcGxpYW5jZTogJ0xvYWQgY29tcGxpYW5jZSBydWxlcz8nLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdPcHRpb25hbCBwb3N0LWluc3RhbGwgbG9hZHMnKTtcbiAgICAgICAgICBjb25zdCBjaG9zZW46IHR5cGVvZiBlbmFibGVkTG9hZElkcyA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBMT0FEX1NURVBTKSB7XG4gICAgICAgICAgICBpZiAoYXdhaXQgY29uZmlybShwcm9tcHRzW3MuaWRdID8/IGBMb2FkICR7cy5pZH0/YCwgZmFsc2UpKSBjaG9zZW4ucHVzaChzLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW5hYmxlZExvYWRJZHMgPSBjaG9zZW47XG4gICAgICAgICAgLy8gQWRkaXRpdmUgc3BhcnNlIHJlLXN5bmM6IG1hdGVyaWFsaXplIE9OTFkgdGhlIHBpY2tlZCBsb2FkcycgZm9sZGVycyBpblxuICAgICAgICAgIC8vIHRoZSBjbG9uZSAodGhlIHBhcnRpYWwgY2xvbmUgZmV0Y2hlcyB0aGVpciBibG9icyBvbiBkZW1hbmQpLiBPbmx5IHdoZW4gd2VcbiAgICAgICAgICAvLyBjcmVhdGVkIHRoZSBjbG9uZSDigJQgYSBub3JtYWwgY2hlY2tvdXQgYWxyZWFkeSBoYXMgZXZlcnkgZm9sZGVyLlxuICAgICAgICAgIGlmIChib290c3RyYXBwZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFic2VudCA9IHNwYXJzZVBhdGhzRm9yKHRhcmdldCwgZW5hYmxlZExvYWRJZHMpLmZpbHRlcigocCkgPT4gIWV4aXN0c1N5bmMocGF0aC5qb2luKGN3ZCwgcCkpKTtcbiAgICAgICAgICAgIGlmIChhYnNlbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBwcmludFNlY3Rpb24oJ0ZldGNoaW5nIHNlbGVjdGVkIGxvYWQgZm9sZGVycycpO1xuICAgICAgICAgICAgICBjb25zdCBhZGRDbWQgPSBgZ2l0IHNwYXJzZS1jaGVja291dCBhZGQgJHthYnNlbnQubWFwKChwKSA9PiBgJyR7cH0nYCkuam9pbignICcpfSAmJiBnaXQgY2hlY2tvdXQgJyR7Ym9vdHN0cmFwLnJlZn0nYDtcbiAgICAgICAgICAgICAgcHJpbnRJbmZvKGFkZENtZCk7XG4gICAgICAgICAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgcnVuU2NyaXB0KGFkZENtZCwgY3dkLCB7IGNhcHR1cmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHByaW50V2FybmluZyhgQ291bGRuJ3QgZmV0Y2ggJHthYnNlbnQuam9pbignLCAnKX0g4oCUIHRoZSBtYXRjaGluZyBsb2FkIHN0ZXAocykgbWF5IGZhaWwuIFJlLXJ1biB3aXRoIC0tcmVwbyB0byByZWZyZXNoIHRoZSBjbG9uZS5gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAoeyBzdGVwczogcG9zdFN0ZXBzLCBza2lwcGVkOiBza2lwcGVkU3RlcHMgfSA9IHJlc29sdmVQb3N0U3RlcHMoe1xuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgcmVnaW9uOiB0eXBlb2YgcGFyYW1zLnJlZ2lvbiA9PT0gJ3N0cmluZycgPyBwYXJhbXMucmVnaW9uIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZW5hYmxlZExvYWRJZHMsXG4gICAgICAgICAgICAuLi5wb3N0U3RlcEZsYWdzLFxuICAgICAgICAgICAgYnVpbGRCb290c3RyYXA6IHBvc3RTdGVwRmxhZ3MuYnVpbGRCb290c3RyYXAgfHwgZW5hYmxlZExvYWRJZHMuaW5jbHVkZXMoJ3BsdWdpbnMnKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9jYWwvbWluaWt1YmUncyBzZXR1cC5zaCBSRVFVSVJFUyBhIGAuZW52YCBhbmQgYWJvcnRzIHdpdGhvdXQgaXQg4oCUIGNyZWF0ZVxuICAgICAgICAvLyBpdCBmcm9tIC5lbnYuZXhhbXBsZSB3aXRoIGdlbmVyYXRlZCBzZWNyZXRzIHNvIHRoZSBkZXBsb3kgaXMgbm9uLWludGVyYWN0aXZlLlxuICAgICAgICAvLyBlYzIvZmFyZ2F0ZSBhbHNvIHNoaXAgYSBgLmVudi5leGFtcGxlYCwgYnV0IHRoZWlyIHNldHVwLnNoIG5ldmVyIHJlYWRzIGFcbiAgICAgICAgLy8gbG9jYWwgYC5lbnZgICh0aGUgaW5zdGFuY2UgaGFuZGxlcyBpdHMgb3duOyBGYXJnYXRlIHVzZXMgU2VjcmV0cyBNYW5hZ2VyIHZpYVxuICAgICAgICAvLyBpbml0LXNlY3JldHMuc2gpLCBzbyB3ZSBtdXN0IE5PVCBnZW5lcmF0ZSBvbmUgZm9yIHRoZW0uXG4gICAgICAgIGlmICgodGFyZ2V0ID09PSAnbG9jYWwnIHx8IHRhcmdldCA9PT0gJ21pbmlrdWJlJykgJiYgZW52RmlsZU1pc3NpbmcoY3dkLCBzcGVjLmRpcikpIHtcbiAgICAgICAgICBpZiAoYXdhaXQgY29uZmlybShgXFxuJHtzcGVjLmRpcn0vLmVudiBub3QgZm91bmQg4oCUIGNyZWF0ZSBpdCBmcm9tIC5lbnYuZXhhbXBsZSAoZ2VuZXJhdGVzIHNlY3JldHM7IGVkaXQgbGF0ZXIgZm9yIG9wdGlvbmFsIGludGVncmF0aW9ucyBsaWtlIE9BdXRoKT9gLCBvcHRpb25zLnllcykpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBjcmVhdGVFbnZGaWxlKGN3ZCwgc3BlYy5kaXIpO1xuICAgICAgICAgICAgcHJpbnRTdWNjZXNzKGBDcmVhdGVkICR7c3BlYy5kaXJ9Ly5lbnYg4oCUICR7bn0gc2VjcmV0KHMpIGdlbmVyYXRlZC5gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKCdDb250aW51aW5nIHdpdGhvdXQgLmVudiDigJQgc2V0dXAuc2ggd2lsbCBhYm9ydCBpZiBpdCBzdGF5cyBtaXNzaW5nLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIShhd2FpdCBjb25maXJtKCdcXG5Qcm9jZWVkIHdpdGggdGhpcyBkZXBsb3k/Jywgb3B0aW9ucy55ZXMpKSkge1xuICAgICAgICAgIHByaW50V2FybmluZygnTm8gcHJvYmxlbSDigJQgbm90aGluZyB3YXMgY2hhbmdlZC4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyA3Yy4gUnVuIHRoZSBkZXBsb3kgb3V0LW9mLWxvb3AgKHJlYWwgY29tbWFuZCwgc2VjcmV0cyB1bm1hc2tlZCwgc3RyZWFtZWQgK1xuICAgICAgICAvLyBjYXB0dXJlZCksIHdpdGggYSBib3VuZGVkIGF1dG8tZml4ICsgcmV0cnkgbG9vcCDigJQgdGhlIGRlcGxveSBzY3JpcHRzIGFyZVxuICAgICAgICAvLyBpZGVtcG90ZW50LCBzbyBhIGZpeGVkIHJlLXJ1biByZXN1bWVzIHJhdGhlciB0aGFuIHN0YXJ0aW5nIG92ZXIuXG4gICAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gMSArIE1hdGgubWF4KDAsIHBhcnNlSW50KG9wdGlvbnMucmV0cmllcywgMTApIHx8IDApO1xuICAgICAgICBsZXQgcnVuUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHBhcmFtcztcbiAgICAgICAgbGV0IHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7XG4gICAgICAgICAgY29uc3QgcmVhbENvbW1hbmQgPSBhc3NlbWJsZUNvbW1hbmQoc3BlYywgcnVuUGFyYW1zLCB7IG1hc2s6IGZhbHNlIH0pLmNvbW1hbmQ7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKGF0dGVtcHQgPT09IDEgPyAnRGVwbG95aW5nJyA6IGBEZXBsb3lpbmcg4oCUIHJldHJ5ICR7YXR0ZW1wdCAtIDF9YCk7XG4gICAgICAgICAgaWYgKGF0dGVtcHQgPT09IDEpIHtcbiAgICAgICAgICAgIHByaW50SW5mbyhgRGVwbG95aW5nICR7c3BlYy5sYWJlbH0g4oaSICR7dXJsfWApO1xuICAgICAgICAgICAgcHJpbnRJbmZvKHNwZWMuZGVwbG95cyk7XG4gICAgICAgICAgICBwcmludEluZm8oJ1N0cmVhbWluZyB0aGUgZGVwbG95IGJlbG93IOKAlCBmaXJzdCBydW4gaXMgdGhlIHNsb3cgb25lIChpbWFnZSBwdWxscyArIGNlcnQgZ2VuZXJhdGlvbikuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHsgY29kZSwgdGFpbCB9ID0gYXdhaXQgcnVuU2NyaXB0KHJlYWxDb21tYW5kLCBjd2QsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICAgICAgICBpZiAoY29kZSA9PT0gMCkgeyBzdWNjZWVkZWQgPSB0cnVlOyBicmVhazsgfVxuXG4gICAgICAgICAgcHJpbnRFcnJvcihgXFxuRGVwbG95IGZhaWxlZCAoZXhpdCAke2NvZGV9KS5gKTtcbiAgICAgICAgICBjb25zdCBpc3N1ZXMgPSBtYXRjaElzc3Vlcyh0YWlsKTtcbiAgICAgICAgICBpZiAoaXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByaW50U2VjdGlvbignTGlrZWx5IGNhdXNlJyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaXNzdWVzKSBwcmludEluZm8oYOKAoiAke2kuY2F1c2V9XFxuICDihpIgJHtpLnN1Z2dlc3Rpb259YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0FpQ29uZmlndXJlZChhaU9wdHMpKSB7XG4gICAgICAgICAgICBjb25zdCBkaWFnbm9zaXMgPSBhd2FpdCBkaWFnbm9zZUZhaWx1cmUocmVkYWN0U2VjcmV0cyh0YWlsLCBzcGVjLCBydW5QYXJhbXMpLCBhaU9wdHMpO1xuICAgICAgICAgICAgaWYgKGRpYWdub3NpcykgeyBwcmludFNlY3Rpb24oJ0RpYWdub3NpcycpOyBwcmludEluZm8oZGlhZ25vc2lzKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYXR0ZW1wdCA+PSBtYXhBdHRlbXB0cykgYnJlYWs7XG5cbiAgICAgICAgICAvLyBBdXRvLWZpeDogYSByZXRyeWFibGUgaXNzdWUgd2l0aCBhIHBhcmFtIHdlIGhhdmVuJ3QgYWxyZWFkeSBhcHBsaWVkLlxuICAgICAgICAgIGNvbnN0IGZpeCA9IGlzc3Vlcy5maW5kKChpKSA9PiBpLnJldHJ5YWJsZSAmJiBpLnBhcmFtRml4ICYmIHJ1blBhcmFtc1tpLnBhcmFtRml4LmtleV0gIT09IGkucGFyYW1GaXgudmFsdWUpO1xuICAgICAgICAgIGlmIChmaXg/LnBhcmFtRml4ICYmIGF3YWl0IGNvbmZpcm0oYFxcbkFwcGx5IGZpeCBhbmQgcmV0cnkg4oCUICR7Zml4LnN1Z2dlc3Rpb259YCwgb3B0aW9ucy55ZXMpKSB7XG4gICAgICAgICAgICBydW5QYXJhbXMgPSB7IC4uLnJ1blBhcmFtcywgW2ZpeC5wYXJhbUZpeC5rZXldOiBmaXgucGFyYW1GaXgudmFsdWUgfTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBSZXRyeWFibGUgYnV0IG5vIHBhcmFtIGNoYW5nZSAoZS5nLiBBQ00gRE5TIHByb3BhZ2F0aW9uKSDigJQgb2ZmZXIgYSBwbGFpbiByZS1ydW4uXG4gICAgICAgICAgaWYgKCFmaXggJiYgaXNzdWVzLnNvbWUoKGkpID0+IGkucmV0cnlhYmxlKSAmJiBhd2FpdCBjb25maXJtKCdcXG5SZXRyeSB0aGUgZGVwbG95IChpdCBpcyBpZGVtcG90ZW50IGFuZCB3aWxsIHJlc3VtZSk/Jywgb3B0aW9ucy55ZXMpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdWNjZWVkZWQpIHsgcHJvY2Vzcy5leGl0Q29kZSA9IDE7IHJldHVybjsgfVxuICAgICAgICBwcmludFN1Y2Nlc3MoJ0RlcGxveSBjb21tYW5kIGNvbXBsZXRlZC4nKTtcblxuICAgICAgICAvLyA3ZC4gU0VTIHBvc3QtZGVwbG95IGd1aWRhbmNlIChhc3luYyBES0lNICsgc2FuZGJveCArIGJvdW5jZSB0b3BpYykuXG4gICAgICAgIC8vIFNFUyBpcyBwcm92aXNpb25lZCBCWSBERUZBVUxUIG9uIEFXUyBkZXBsb3lzLCBzbyBzdXJmYWNlIHRoZSBndWlkYW5jZVxuICAgICAgICAvLyBmb3IgZWMyL2ZhcmdhdGUgdW5sZXNzIHRoZSBvcGVyYXRvciBvcHRlZCBvdXQgd2l0aCAtLW5vLWVtYWlsLlxuICAgICAgICBjb25zdCBzZXNQcm92aXNpb25lZCA9ICh0YXJnZXQgPT09ICdlYzInIHx8IHRhcmdldCA9PT0gJ2ZhcmdhdGUnKSAmJiBydW5QYXJhbXMubm9FbWFpbCAhPT0gdHJ1ZTtcbiAgICAgICAgaWYgKHNlc1Byb3Zpc2lvbmVkKSB7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdTRVMg4oCUIG5leHQgc3RlcHMnKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygc2VzUG9zdERlcGxveUd1aWRhbmNlKCkpIHByaW50SW5mbyhg4oCiICR7bGluZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDdlLiBWZXJpZnkgaGVhbHRoIChDUkVBVEVfQ09NUExFVEUgIT0gc2VydmluZykuXG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ1ZlcmlmeWluZyBoZWFsdGgnKTtcbiAgICAgICAgICAvLyBNaW5pa3ViZSByZWFjaGVzIHRoZSBnYXRld2F5IHZpYSBhIGt1YmVjdGwgcG9ydC1mb3J3YXJkIHRoYXQgc2V0dXAuc2hcbiAgICAgICAgICAvLyBiYWNrZ3JvdW5kcyBhbmQgdGhhdCBjYW4gZGllL2ZhaWwgdG8gYmluZCDigJQgKHJlKXN0YXJ0IGl0IGJlZm9yZSBwb2xsaW5nXG4gICAgICAgICAgLy8gc28gd2UgZG9uJ3Qgc2l0IGF0IHRoZSBnYXRlIG9uIGEgZGVhZCBmb3J3YXJkIHdoaWxlIHRoZSBwb2RzIGFyZSBmaW5lLlxuICAgICAgICAgIGlmICh0YXJnZXQgPT09ICdtaW5pa3ViZScpIHtcbiAgICAgICAgICAgIGF3YWl0IGVuc3VyZU1pbmlrdWJlR2F0ZXdheSh1cmwsIHsgb25JbmZvOiAobSkgPT4gcHJpbnRJbmZvKG0pIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmludEluZm8oYFBvbGxpbmcgJHt1cmx9L2hlYWx0aCDigKZgKTtcbiAgICAgICAgICBjb25zdCBoZWFsdGggPSBhd2FpdCB3YWl0SGVhbHRoeSh1cmwsIHsgb25UaWNrOiAobSkgPT4gcHJpbnRJbmZvKG0pIH0pO1xuICAgICAgICAgIChoZWFsdGguaGVhbHRoeSA/IHByaW50U3VjY2VzcyA6IHByaW50V2FybmluZykoYCR7aGVhbHRoLnVybH0g4oCUICR7aGVhbHRoLmRldGFpbH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDdmLiBQb3N0LWluc3RhbGwgc3RlcHMgKHJlZ2lzdGVyICsgb3B0LWluIGxvYWRzLCBzbW9rZSB0ZXN0LCBldmVudHMsIGN1c3RvbSkuXG4gICAgICAgIC8vIHJlZ2lzdGVyIHJ1bnMgaW5pdC1wbGF0Zm9ybTsgZm9yIEVDMi9GYXJnYXRlIGl0IG11c3QgcnVuIGZyb20gaW5zaWRlIHRoZVxuICAgICAgICAvLyBWUEMsIHNvIHdlIHN1cmZhY2UgdGhlIGNvbW1hbmQgdGhlcmUgaW5zdGVhZCBvZiBleGVjdXRpbmcgaXQgbG9jYWxseS5cbiAgICAgICAgaWYgKHBvc3RTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzIG9mIHNraXBwZWRTdGVwcykgcHJpbnRXYXJuaW5nKGBTa2lwcGVkIHBvc3Qtc3RlcCAke3MuaWR9OiAke3MucmVhc29ufWApO1xuICAgICAgICAgIGNvbnN0IGlzUmVtb3RlUmVnaXN0ZXIgPSAoaWQ6IHN0cmluZyk6IGJvb2xlYW4gPT4gaWQgPT09ICdyZWdpc3RlcicgJiYgKHRhcmdldCA9PT0gJ2VjMicgfHwgdGFyZ2V0ID09PSAnZmFyZ2F0ZScpO1xuICAgICAgICAgIGNvbnN0IHJ1bm5hYmxlID0gcG9zdFN0ZXBzLmZpbHRlcigocykgPT4gIWlzUmVtb3RlUmVnaXN0ZXIocy5pZCkpO1xuICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBwb3N0U3RlcHMpIHtcbiAgICAgICAgICAgIGlmIChpc1JlbW90ZVJlZ2lzdGVyKHMuaWQpKSB7XG4gICAgICAgICAgICAgIHByaW50SW5mbygnXFxuTmV4dCAocnVuIGZyb20gaW5zaWRlIHRoZSBWUEMpOiByZWdpc3RlciBhZG1pbiArIGxvYWQgcGx1Z2lucyDigJQnKTtcbiAgICAgICAgICAgICAgcHJpbnRJbmZvKGAgICR7cy5jb21tYW5kfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocnVubmFibGUubGVuZ3RoID4gMCAmJiBhd2FpdCBjb25maXJtKGBcXG5SdW4gJHtydW5uYWJsZS5sZW5ndGh9IHBvc3QtaW5zdGFsbCBzdGVwKHMpIG5vdz9gLCBvcHRpb25zLnllcykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBydW5uYWJsZSkge1xuICAgICAgICAgICAgICBwcmludFNlY3Rpb24oYFBvc3Qtc3RlcDogJHtzLmxhYmVsfWApO1xuICAgICAgICAgICAgICAvLyBTdGVwcyB0aGF0IGxvZyBpbnRvIHRoZSBwbGF0Zm9ybSAocmVnaXN0ZXIgKyBzdG9yZS10b2tlbikgbmVlZCB0aGVcbiAgICAgICAgICAgICAgLy8gYWRtaW4gY3JlZHMgKFBMQVRGT1JNX0lERU5USUZJRVIgLyBQTEFURk9STV9QQVNTV09SRCkgb24gdG9wIG9mIHRoZWlyXG4gICAgICAgICAgICAgIC8vIG93biBzdGVwIGVudi4gc2V0dXAtZXZlbnRzIGRvZXMgTk9UIGxvZyBpbiDigJQgaXQgcmVhZHMgUExBVEZPUk1fU0VDUkVUX05BTUUsXG4gICAgICAgICAgICAgIC8vIEFXUyBjcmVkcywgYW5kIHRoZSByZWdpb24gZnJvbSB0aGUgQVdTIGVudmlyb25tZW50IOKAlCBzbyBpdCdzIGV4Y2x1ZGVkLlxuICAgICAgICAgICAgICBjb25zdCBuZWVkc0NyZWRzID0gcy5pZCA9PT0gJ3JlZ2lzdGVyJyB8fCBzLmlkID09PSAnc3RvcmUtdG9rZW4nO1xuICAgICAgICAgICAgICBjb25zdCBlbnYgPSBuZWVkc0NyZWRzID8geyAuLi5zLmVudiwgLi4uYWRtaW5FbnYgfSA6IHMuZW52O1xuICAgICAgICAgICAgICAvLyBUaGVzZSBzdGVwcyAocGx1Z2luL3NhbXBsZS9jb21wbGlhbmNlIGxvYWRzLCBzbW9rZSwgZXZlbnRzKSBhcmUgbm9pc3lcbiAgICAgICAgICAgICAgLy8gYW5kIG5vbi1pbnRlcmFjdGl2ZSwgc28gcnVuIHRoZW0gUVVJRVRMWSDigJQgY2FwdHVyZSB0aGUgb3V0cHV0IGFuZCBvbmx5XG4gICAgICAgICAgICAgIC8vIHN1cmZhY2UgaXQgb24gZmFpbHVyZS4gVGhlIGV4Y2VwdGlvbiBpcyBhIHJlZ2lzdGVyIHdpdGggbm8gYWRtaW4gY3JlZHM6XG4gICAgICAgICAgICAgIC8vIGluaXQtcGxhdGZvcm0uc2ggcHJvbXB0cyBmb3IgdGhlbSwgc28gaXQgbXVzdCBzdHJlYW0gdG8gdGhlIHRlcm1pbmFsLlxuICAgICAgICAgICAgICBjb25zdCBpbnRlcmFjdGl2ZVJlZ2lzdGVyID0gcy5pZCA9PT0gJ3JlZ2lzdGVyJyAmJiAhYWRtaW5FbnYuUExBVEZPUk1fSURFTlRJRklFUjtcbiAgICAgICAgICAgICAgY29uc3QgcXVpZXQgPSAhaW50ZXJhY3RpdmVSZWdpc3RlcjtcbiAgICAgICAgICAgICAgaWYgKHF1aWV0KSBwcmludEluZm8oYCR7cy5jb21tYW5kfVxcbiAg4oCmcnVubmluZyAob3V0cHV0IHNob3duIG9ubHkgaWYgaXQgZmFpbHMpYCk7XG4gICAgICAgICAgICAgIGVsc2UgcHJpbnRJbmZvKHMuY29tbWFuZCk7XG4gICAgICAgICAgICAgIGNvbnN0IHsgY29kZSwgdGFpbCB9ID0gYXdhaXQgcnVuU2NyaXB0KHMuY29tbWFuZCwgY3dkLCB7IHF1aWV0LCBjYXB0dXJlOiBmYWxzZSwgZW52IH0pO1xuICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChxdWlldCAmJiB0YWlsKSB7IHByaW50RXJyb3IoJ1xcbi0tLSBsYXN0IG91dHB1dCAtLS0nKTsgcHJpbnRJbmZvKHRhaWwpOyB9XG4gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihgXFxuUG9zdC1zdGVwICcke3MuaWR9JyBmYWlsZWQgKGV4aXQgJHtjb2RlfSkuIFRoZSBwbGF0Zm9ybSBpcyBkZXBsb3llZDsgZml4IGFuZCByZS1ydW4gdGhlIHN0ZXAgbWFudWFsbHkuYCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcHJpbnRTdWNjZXNzKGAke3MuaWR9IOKck2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAocnVubmFibGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcHJpbnRJbmZvKCdcXG5Ta2lwcGVkIHBvc3QtaW5zdGFsbCBzdGVwcy4gUnVuIHRoZSBjb21tYW5kcyBhYm92ZSBtYW51YWxseSB3aGVuIHJlYWR5LicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7IGNvbW1hbmQ6ICdwcm92aXNpb24nLCBleGVjdXRpb25JZCB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -41,8 +41,8 @@
41
41
  "typescript": "6.0.3",
42
42
  "yaml": "2.9.0",
43
43
  "zod": "4.4.3",
44
- "@pipeline-builder/ai-core": "3.4.70",
45
- "@pipeline-builder/pipeline-core": "3.4.77"
44
+ "@pipeline-builder/pipeline-core": "3.4.77",
45
+ "@pipeline-builder/ai-core": "3.4.70"
46
46
  },
47
47
  "keywords": [
48
48
  "aws",
@@ -85,7 +85,7 @@
85
85
  "access": "public",
86
86
  "registry": "https://registry.npmjs.org/"
87
87
  },
88
- "version": "3.4.88",
88
+ "version": "3.4.89",
89
89
  "bugs": {
90
90
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
91
91
  },