@bluedynamics/cdk8s-plone 0.1.42 → 0.1.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +26 -25
- package/API.md +6 -2
- package/README.md +3 -3
- package/documentation/sources/conf.py +55 -29
- package/documentation/sources/explanation/architecture.md +14 -16
- package/documentation/sources/explanation/cdk8s-workflow.md +66 -0
- package/documentation/sources/explanation/index.md +1 -27
- package/documentation/sources/how-to/backup-and-restore.md +107 -0
- package/documentation/sources/how-to/configure-env-and-secrets.md +184 -0
- package/documentation/sources/how-to/configure-ingress-tls.md +108 -0
- package/documentation/sources/how-to/configure-security-context.md +0 -5
- package/documentation/sources/how-to/deploy-blicca.md +8 -8
- package/documentation/sources/how-to/{deploy-production-volto.md → deploy-volto.md} +20 -25
- package/documentation/sources/how-to/deploy-with-httpcache.md +224 -0
- package/documentation/sources/how-to/deploy-with-vinyl-cache.md +0 -5
- package/documentation/sources/how-to/enable-prometheus-monitoring.md +4 -5
- package/documentation/sources/how-to/index.md +15 -8
- package/documentation/sources/how-to/scale-and-high-availability.md +122 -0
- package/documentation/sources/how-to/schedule-pods.md +0 -5
- package/documentation/sources/how-to/troubleshooting.md +113 -0
- package/documentation/sources/how-to/upgrade-and-rollout.md +89 -0
- package/documentation/sources/index.md +3 -11
- package/documentation/sources/reference/api/index.md +6 -4
- package/documentation/sources/reference/configuration-options.md +85 -516
- package/documentation/sources/reference/index.md +16 -43
- package/documentation/sources/tutorials/01-quick-start.md +1 -1
- package/documentation/sources/tutorials/index.md +7 -11
- package/examples/blicca/.env.example +3 -2
- package/examples/blicca/README.md +21 -24
- package/examples/blicca/__snapshots__/main.test.ts.snap +138 -345
- package/examples/blicca/main.test.ts +7 -0
- package/examples/blicca/main.ts +8 -7
- package/examples/blicca/postgres.plain.ts +115 -0
- package/examples/blicca/tsconfig.json +33 -0
- package/examples/{production-volto → volto}/.env.example +3 -2
- package/examples/{production-volto → volto}/README.md +20 -23
- package/examples/{production-volto → volto}/__snapshots__/main.test.ts.snap +139 -345
- package/examples/{production-volto → volto}/main.test.ts +7 -0
- package/examples/{production-volto → volto}/main.ts +8 -7
- package/examples/{production-volto → volto}/package.json +1 -1
- package/examples/volto/postgres.plain.ts +115 -0
- package/examples/volto/tsconfig.json +33 -0
- package/lib/deployment.js +36 -3
- package/lib/httpcache.js +42 -6
- package/lib/imports/k8s.js +1075 -1073
- package/lib/imports/monitoring.coreos.com.js +10 -8
- package/lib/imports/vinyl.bluedynamics.eu.d.ts +4011 -53
- package/lib/imports/vinyl.bluedynamics.eu.js +1791 -159
- package/lib/pdb.js +35 -2
- package/lib/plone.js +54 -5
- package/lib/service.js +44 -2
- package/lib/vinylcache.d.ts +3 -1
- package/lib/vinylcache.js +43 -6
- package/package.json +10 -12
- package/documentation/sources/_static/brand-theme.css +0 -685
- package/documentation/sources/_static/custom-icons.css +0 -123
- package/documentation/sources/_static/fonts/hack/Hack-Regular.woff2 +0 -0
- package/documentation/sources/_static/fonts/orbitron/Orbitron-Black.woff2 +0 -11
- package/documentation/sources/_static/fonts/orbitron/Orbitron-Bold.woff2 +0 -11
- package/documentation/sources/_static/fonts/orbitron/Orbitron-Regular.woff2 +0 -0
- package/documentation/sources/_static/fonts/rajdhani/Rajdhani-Bold.woff2 +0 -11
- package/documentation/sources/_static/fonts/rajdhani/Rajdhani-Medium.woff2 +0 -11
- package/documentation/sources/_static/fonts/rajdhani/Rajdhani-Regular.woff2 +0 -11
- package/documentation/sources/_static/fonts/rajdhani/Rajdhani-SemiBold.woff2 +0 -11
- package/documentation/sources/_static/kup6s-icon-explanation.svg +0 -32
- package/documentation/sources/_static/kup6s-icon-howto.svg +0 -34
- package/documentation/sources/_static/kup6s-icon-reference.svg +0 -34
- package/documentation/sources/_static/kup6s-icon-tutorials.svg +0 -30
- package/documentation/sources/_static/logo-fix.js +0 -12
- package/documentation/sources/reference/api/.gitkeep +0 -1
- package/examples/blicca/postgres.bitnami.ts +0 -49
- package/examples/production-volto/postgres.bitnami.ts +0 -49
- /package/documentation/sources/_static/{kup6s-icon-plone.svg → logo.svg} +0 -0
- /package/examples/{production-volto → volto}/cdk8s.yaml +0 -0
- /package/examples/{production-volto → volto}/config/varnish.tpl.vcl +0 -0
- /package/examples/{production-volto → volto}/ingress.ts +0 -0
- /package/examples/{production-volto → volto}/jest.config.js +0 -0
- /package/examples/{production-volto → volto}/postgres.cloudnativepg.ts +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.VinylCacheSpecBackendsDirectorShardHealthy = exports.VinylCacheSpecBackendsDirectorShardBy = exports.VinylCacheSpecDirectorShardHealthy = exports.VinylCacheSpecDirectorShardBy = exports.VinylCacheSpecClusterPeerRoutingType = exports.VinylCacheSpecBackendsDirectorType = exports.VinylCacheSpecStorageType = exports.VinylCacheSpecStorageSize = exports.VinylCacheSpecServiceType = exports.VinylCacheSpecResourcesRequests = exports.VinylCacheSpecResourcesLimits = exports.VinylCacheSpecDirectorType = exports.VinylCache = void 0;
|
|
3
|
+
exports.VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsResourceFieldRefDivisor = exports.VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesRequests = exports.VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesLimits = exports.VinylCacheSpecPodVolumesDownwardApiItemsResourceFieldRefDivisor = exports.VinylCacheSpecVolumeClaimTemplatesSpecResourcesRequests = exports.VinylCacheSpecVolumeClaimTemplatesSpecResourcesLimits = exports.VinylCacheSpecPodVolumesEmptyDirSizeLimit = exports.VinylCacheSpecMonitoringExporterResourcesRequests = exports.VinylCacheSpecMonitoringExporterResourcesLimits = exports.VinylCacheSpecBackendsDirectorShardHealthy = exports.VinylCacheSpecBackendsDirectorShardBy = exports.VinylCacheSpecVolumeClaimTemplatesStatusCapacity = exports.VinylCacheSpecVolumeClaimTemplatesStatusAllocatedResources = exports.VinylCacheSpecDirectorShardHealthy = exports.VinylCacheSpecDirectorShardBy = exports.VinylCacheSpecClusterPeerRoutingType = exports.VinylCacheSpecBackendsDirectorType = exports.VinylCacheSpecStorageType = exports.VinylCacheSpecStorageSize = exports.VinylCacheSpecServiceType = exports.VinylCacheSpecResourcesRequests = exports.VinylCacheSpecResourcesLimits = exports.VinylCacheSpecDirectorType = exports.VinylCache = void 0;
|
|
4
4
|
exports.toJson_VinylCacheProps = toJson_VinylCacheProps;
|
|
5
5
|
exports.toJson_VinylCacheSpec = toJson_VinylCacheSpec;
|
|
6
6
|
exports.toJson_VinylCacheSpecBackends = toJson_VinylCacheSpecBackends;
|
|
@@ -16,6 +16,7 @@ exports.toJson_VinylCacheSpecRetry = toJson_VinylCacheSpecRetry;
|
|
|
16
16
|
exports.toJson_VinylCacheSpecService = toJson_VinylCacheSpecService;
|
|
17
17
|
exports.toJson_VinylCacheSpecStorage = toJson_VinylCacheSpecStorage;
|
|
18
18
|
exports.toJson_VinylCacheSpecVcl = toJson_VinylCacheSpecVcl;
|
|
19
|
+
exports.toJson_VinylCacheSpecVolumeClaimTemplates = toJson_VinylCacheSpecVolumeClaimTemplates;
|
|
19
20
|
exports.toJson_VinylCacheSpecBackendsConnectionParameters = toJson_VinylCacheSpecBackendsConnectionParameters;
|
|
20
21
|
exports.toJson_VinylCacheSpecBackendsDirector = toJson_VinylCacheSpecBackendsDirector;
|
|
21
22
|
exports.toJson_VinylCacheSpecBackendsProbe = toJson_VinylCacheSpecBackendsProbe;
|
|
@@ -26,23 +27,81 @@ exports.toJson_VinylCacheSpecDirectorShard = toJson_VinylCacheSpecDirectorShard;
|
|
|
26
27
|
exports.toJson_VinylCacheSpecInvalidationBan = toJson_VinylCacheSpecInvalidationBan;
|
|
27
28
|
exports.toJson_VinylCacheSpecInvalidationPurge = toJson_VinylCacheSpecInvalidationPurge;
|
|
28
29
|
exports.toJson_VinylCacheSpecInvalidationXkey = toJson_VinylCacheSpecInvalidationXkey;
|
|
30
|
+
exports.toJson_VinylCacheSpecMonitoringExporter = toJson_VinylCacheSpecMonitoringExporter;
|
|
29
31
|
exports.toJson_VinylCacheSpecMonitoringPrometheusRules = toJson_VinylCacheSpecMonitoringPrometheusRules;
|
|
30
32
|
exports.toJson_VinylCacheSpecMonitoringServiceMonitor = toJson_VinylCacheSpecMonitoringServiceMonitor;
|
|
31
33
|
exports.toJson_VinylCacheSpecPodAffinity = toJson_VinylCacheSpecPodAffinity;
|
|
32
34
|
exports.toJson_VinylCacheSpecPodTolerations = toJson_VinylCacheSpecPodTolerations;
|
|
35
|
+
exports.toJson_VinylCacheSpecPodVolumeMounts = toJson_VinylCacheSpecPodVolumeMounts;
|
|
36
|
+
exports.toJson_VinylCacheSpecPodVolumes = toJson_VinylCacheSpecPodVolumes;
|
|
33
37
|
exports.toJson_VinylCacheSpecResourcesClaims = toJson_VinylCacheSpecResourcesClaims;
|
|
34
38
|
exports.toJson_VinylCacheSpecVclSnippets = toJson_VinylCacheSpecVclSnippets;
|
|
39
|
+
exports.toJson_VinylCacheSpecVolumeClaimTemplatesSpec = toJson_VinylCacheSpecVolumeClaimTemplatesSpec;
|
|
40
|
+
exports.toJson_VinylCacheSpecVolumeClaimTemplatesStatus = toJson_VinylCacheSpecVolumeClaimTemplatesStatus;
|
|
35
41
|
exports.toJson_VinylCacheSpecBackendsDirectorHash = toJson_VinylCacheSpecBackendsDirectorHash;
|
|
36
42
|
exports.toJson_VinylCacheSpecBackendsDirectorShard = toJson_VinylCacheSpecBackendsDirectorShard;
|
|
43
|
+
exports.toJson_VinylCacheSpecMonitoringExporterImage = toJson_VinylCacheSpecMonitoringExporterImage;
|
|
44
|
+
exports.toJson_VinylCacheSpecMonitoringExporterResources = toJson_VinylCacheSpecMonitoringExporterResources;
|
|
37
45
|
exports.toJson_VinylCacheSpecPodAffinityNodeAffinity = toJson_VinylCacheSpecPodAffinityNodeAffinity;
|
|
38
46
|
exports.toJson_VinylCacheSpecPodAffinityPodAffinity = toJson_VinylCacheSpecPodAffinityPodAffinity;
|
|
39
47
|
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinity = toJson_VinylCacheSpecPodAffinityPodAntiAffinity;
|
|
48
|
+
exports.toJson_VinylCacheSpecPodVolumesAwsElasticBlockStore = toJson_VinylCacheSpecPodVolumesAwsElasticBlockStore;
|
|
49
|
+
exports.toJson_VinylCacheSpecPodVolumesAzureDisk = toJson_VinylCacheSpecPodVolumesAzureDisk;
|
|
50
|
+
exports.toJson_VinylCacheSpecPodVolumesAzureFile = toJson_VinylCacheSpecPodVolumesAzureFile;
|
|
51
|
+
exports.toJson_VinylCacheSpecPodVolumesCephfs = toJson_VinylCacheSpecPodVolumesCephfs;
|
|
52
|
+
exports.toJson_VinylCacheSpecPodVolumesCinder = toJson_VinylCacheSpecPodVolumesCinder;
|
|
53
|
+
exports.toJson_VinylCacheSpecPodVolumesConfigMap = toJson_VinylCacheSpecPodVolumesConfigMap;
|
|
54
|
+
exports.toJson_VinylCacheSpecPodVolumesCsi = toJson_VinylCacheSpecPodVolumesCsi;
|
|
55
|
+
exports.toJson_VinylCacheSpecPodVolumesDownwardApi = toJson_VinylCacheSpecPodVolumesDownwardApi;
|
|
56
|
+
exports.toJson_VinylCacheSpecPodVolumesEmptyDir = toJson_VinylCacheSpecPodVolumesEmptyDir;
|
|
57
|
+
exports.toJson_VinylCacheSpecPodVolumesEphemeral = toJson_VinylCacheSpecPodVolumesEphemeral;
|
|
58
|
+
exports.toJson_VinylCacheSpecPodVolumesFc = toJson_VinylCacheSpecPodVolumesFc;
|
|
59
|
+
exports.toJson_VinylCacheSpecPodVolumesFlexVolume = toJson_VinylCacheSpecPodVolumesFlexVolume;
|
|
60
|
+
exports.toJson_VinylCacheSpecPodVolumesFlocker = toJson_VinylCacheSpecPodVolumesFlocker;
|
|
61
|
+
exports.toJson_VinylCacheSpecPodVolumesGcePersistentDisk = toJson_VinylCacheSpecPodVolumesGcePersistentDisk;
|
|
62
|
+
exports.toJson_VinylCacheSpecPodVolumesGitRepo = toJson_VinylCacheSpecPodVolumesGitRepo;
|
|
63
|
+
exports.toJson_VinylCacheSpecPodVolumesGlusterfs = toJson_VinylCacheSpecPodVolumesGlusterfs;
|
|
64
|
+
exports.toJson_VinylCacheSpecPodVolumesHostPath = toJson_VinylCacheSpecPodVolumesHostPath;
|
|
65
|
+
exports.toJson_VinylCacheSpecPodVolumesImage = toJson_VinylCacheSpecPodVolumesImage;
|
|
66
|
+
exports.toJson_VinylCacheSpecPodVolumesIscsi = toJson_VinylCacheSpecPodVolumesIscsi;
|
|
67
|
+
exports.toJson_VinylCacheSpecPodVolumesNfs = toJson_VinylCacheSpecPodVolumesNfs;
|
|
68
|
+
exports.toJson_VinylCacheSpecPodVolumesPersistentVolumeClaim = toJson_VinylCacheSpecPodVolumesPersistentVolumeClaim;
|
|
69
|
+
exports.toJson_VinylCacheSpecPodVolumesPhotonPersistentDisk = toJson_VinylCacheSpecPodVolumesPhotonPersistentDisk;
|
|
70
|
+
exports.toJson_VinylCacheSpecPodVolumesPortworxVolume = toJson_VinylCacheSpecPodVolumesPortworxVolume;
|
|
71
|
+
exports.toJson_VinylCacheSpecPodVolumesProjected = toJson_VinylCacheSpecPodVolumesProjected;
|
|
72
|
+
exports.toJson_VinylCacheSpecPodVolumesQuobyte = toJson_VinylCacheSpecPodVolumesQuobyte;
|
|
73
|
+
exports.toJson_VinylCacheSpecPodVolumesRbd = toJson_VinylCacheSpecPodVolumesRbd;
|
|
74
|
+
exports.toJson_VinylCacheSpecPodVolumesScaleIo = toJson_VinylCacheSpecPodVolumesScaleIo;
|
|
75
|
+
exports.toJson_VinylCacheSpecPodVolumesSecret = toJson_VinylCacheSpecPodVolumesSecret;
|
|
76
|
+
exports.toJson_VinylCacheSpecPodVolumesStorageos = toJson_VinylCacheSpecPodVolumesStorageos;
|
|
77
|
+
exports.toJson_VinylCacheSpecPodVolumesVsphereVolume = toJson_VinylCacheSpecPodVolumesVsphereVolume;
|
|
78
|
+
exports.toJson_VinylCacheSpecVolumeClaimTemplatesSpecDataSource = toJson_VinylCacheSpecVolumeClaimTemplatesSpecDataSource;
|
|
79
|
+
exports.toJson_VinylCacheSpecVolumeClaimTemplatesSpecDataSourceRef = toJson_VinylCacheSpecVolumeClaimTemplatesSpecDataSourceRef;
|
|
80
|
+
exports.toJson_VinylCacheSpecVolumeClaimTemplatesSpecResources = toJson_VinylCacheSpecVolumeClaimTemplatesSpecResources;
|
|
81
|
+
exports.toJson_VinylCacheSpecVolumeClaimTemplatesSpecSelector = toJson_VinylCacheSpecVolumeClaimTemplatesSpecSelector;
|
|
82
|
+
exports.toJson_VinylCacheSpecVolumeClaimTemplatesStatusConditions = toJson_VinylCacheSpecVolumeClaimTemplatesStatusConditions;
|
|
83
|
+
exports.toJson_VinylCacheSpecVolumeClaimTemplatesStatusModifyVolumeStatus = toJson_VinylCacheSpecVolumeClaimTemplatesStatusModifyVolumeStatus;
|
|
84
|
+
exports.toJson_VinylCacheSpecMonitoringExporterResourcesClaims = toJson_VinylCacheSpecMonitoringExporterResourcesClaims;
|
|
40
85
|
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution;
|
|
41
86
|
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution;
|
|
42
87
|
exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution;
|
|
43
88
|
exports.toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution;
|
|
44
89
|
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution;
|
|
45
90
|
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution;
|
|
91
|
+
exports.toJson_VinylCacheSpecPodVolumesCephfsSecretRef = toJson_VinylCacheSpecPodVolumesCephfsSecretRef;
|
|
92
|
+
exports.toJson_VinylCacheSpecPodVolumesCinderSecretRef = toJson_VinylCacheSpecPodVolumesCinderSecretRef;
|
|
93
|
+
exports.toJson_VinylCacheSpecPodVolumesConfigMapItems = toJson_VinylCacheSpecPodVolumesConfigMapItems;
|
|
94
|
+
exports.toJson_VinylCacheSpecPodVolumesCsiNodePublishSecretRef = toJson_VinylCacheSpecPodVolumesCsiNodePublishSecretRef;
|
|
95
|
+
exports.toJson_VinylCacheSpecPodVolumesDownwardApiItems = toJson_VinylCacheSpecPodVolumesDownwardApiItems;
|
|
96
|
+
exports.toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplate = toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplate;
|
|
97
|
+
exports.toJson_VinylCacheSpecPodVolumesFlexVolumeSecretRef = toJson_VinylCacheSpecPodVolumesFlexVolumeSecretRef;
|
|
98
|
+
exports.toJson_VinylCacheSpecPodVolumesIscsiSecretRef = toJson_VinylCacheSpecPodVolumesIscsiSecretRef;
|
|
99
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSources = toJson_VinylCacheSpecPodVolumesProjectedSources;
|
|
100
|
+
exports.toJson_VinylCacheSpecPodVolumesRbdSecretRef = toJson_VinylCacheSpecPodVolumesRbdSecretRef;
|
|
101
|
+
exports.toJson_VinylCacheSpecPodVolumesScaleIoSecretRef = toJson_VinylCacheSpecPodVolumesScaleIoSecretRef;
|
|
102
|
+
exports.toJson_VinylCacheSpecPodVolumesSecretItems = toJson_VinylCacheSpecPodVolumesSecretItems;
|
|
103
|
+
exports.toJson_VinylCacheSpecPodVolumesStorageosSecretRef = toJson_VinylCacheSpecPodVolumesStorageosSecretRef;
|
|
104
|
+
exports.toJson_VinylCacheSpecVolumeClaimTemplatesSpecSelectorMatchExpressions = toJson_VinylCacheSpecVolumeClaimTemplatesSpecSelectorMatchExpressions;
|
|
46
105
|
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference = toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference;
|
|
47
106
|
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms = toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms;
|
|
48
107
|
exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm;
|
|
@@ -51,6 +110,15 @@ exports.toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnor
|
|
|
51
110
|
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm;
|
|
52
111
|
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector;
|
|
53
112
|
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector;
|
|
113
|
+
exports.toJson_VinylCacheSpecPodVolumesDownwardApiItemsFieldRef = toJson_VinylCacheSpecPodVolumesDownwardApiItemsFieldRef;
|
|
114
|
+
exports.toJson_VinylCacheSpecPodVolumesDownwardApiItemsResourceFieldRef = toJson_VinylCacheSpecPodVolumesDownwardApiItemsResourceFieldRef;
|
|
115
|
+
exports.toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpec = toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpec;
|
|
116
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundle = toJson_VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundle;
|
|
117
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSourcesConfigMap = toJson_VinylCacheSpecPodVolumesProjectedSourcesConfigMap;
|
|
118
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApi = toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApi;
|
|
119
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSourcesPodCertificate = toJson_VinylCacheSpecPodVolumesProjectedSourcesPodCertificate;
|
|
120
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSourcesSecret = toJson_VinylCacheSpecPodVolumesProjectedSourcesSecret;
|
|
121
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSourcesServiceAccountToken = toJson_VinylCacheSpecPodVolumesProjectedSourcesServiceAccountToken;
|
|
54
122
|
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions = toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions;
|
|
55
123
|
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields = toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields;
|
|
56
124
|
exports.toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions = toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions;
|
|
@@ -63,10 +131,22 @@ exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringScheduling
|
|
|
63
131
|
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector;
|
|
64
132
|
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions;
|
|
65
133
|
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions;
|
|
134
|
+
exports.toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecDataSource = toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecDataSource;
|
|
135
|
+
exports.toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecDataSourceRef = toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecDataSourceRef;
|
|
136
|
+
exports.toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResources = toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResources;
|
|
137
|
+
exports.toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecSelector = toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecSelector;
|
|
138
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundleLabelSelector = toJson_VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundleLabelSelector;
|
|
139
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSourcesConfigMapItems = toJson_VinylCacheSpecPodVolumesProjectedSourcesConfigMapItems;
|
|
140
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItems = toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItems;
|
|
141
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSourcesSecretItems = toJson_VinylCacheSpecPodVolumesProjectedSourcesSecretItems;
|
|
66
142
|
exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions;
|
|
67
143
|
exports.toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions;
|
|
68
144
|
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions;
|
|
69
145
|
exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions = toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions;
|
|
146
|
+
exports.toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecSelectorMatchExpressions = toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecSelectorMatchExpressions;
|
|
147
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundleLabelSelectorMatchExpressions = toJson_VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundleLabelSelectorMatchExpressions;
|
|
148
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsFieldRef = toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsFieldRef;
|
|
149
|
+
exports.toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsResourceFieldRef = toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsResourceFieldRef;
|
|
70
150
|
// generated by cdk8s
|
|
71
151
|
const cdk8s_1 = require("cdk8s");
|
|
72
152
|
/**
|
|
@@ -77,6 +157,13 @@ clustering, and cache invalidation strategy.
|
|
|
77
157
|
* @schema VinylCache
|
|
78
158
|
*/
|
|
79
159
|
class VinylCache extends cdk8s_1.ApiObject {
|
|
160
|
+
/**
|
|
161
|
+
* Returns the apiVersion and kind for "VinylCache"
|
|
162
|
+
*/
|
|
163
|
+
static GVK = {
|
|
164
|
+
apiVersion: 'vinyl.bluedynamics.eu/v1alpha1',
|
|
165
|
+
kind: 'VinylCache',
|
|
166
|
+
};
|
|
80
167
|
/**
|
|
81
168
|
* Renders a Kubernetes manifest for "VinylCache".
|
|
82
169
|
*
|
|
@@ -114,13 +201,6 @@ class VinylCache extends cdk8s_1.ApiObject {
|
|
|
114
201
|
}
|
|
115
202
|
}
|
|
116
203
|
exports.VinylCache = VinylCache;
|
|
117
|
-
/**
|
|
118
|
-
* Returns the apiVersion and kind for "VinylCache"
|
|
119
|
-
*/
|
|
120
|
-
VinylCache.GVK = {
|
|
121
|
-
apiVersion: 'vinyl.bluedynamics.eu/v1alpha1',
|
|
122
|
-
kind: 'VinylCache',
|
|
123
|
-
};
|
|
124
204
|
/**
|
|
125
205
|
* Converts an object of type 'VinylCacheProps' to JSON representation.
|
|
126
206
|
*/
|
|
@@ -161,6 +241,7 @@ function toJson_VinylCacheSpec(obj) {
|
|
|
161
241
|
'storage': obj.storage?.map(y => toJson_VinylCacheSpecStorage(y)),
|
|
162
242
|
'varnishParameters': ((obj.varnishParameters) === undefined) ? undefined : (Object.entries(obj.varnishParameters).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
163
243
|
'vcl': toJson_VinylCacheSpecVcl(obj.vcl),
|
|
244
|
+
'volumeClaimTemplates': obj.volumeClaimTemplates?.map(y => toJson_VinylCacheSpecVolumeClaimTemplates(y)),
|
|
164
245
|
};
|
|
165
246
|
// filter undefined values
|
|
166
247
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
@@ -256,6 +337,7 @@ function toJson_VinylCacheSpecMonitoring(obj) {
|
|
|
256
337
|
}
|
|
257
338
|
const result = {
|
|
258
339
|
'enabled': obj.enabled,
|
|
340
|
+
'exporter': toJson_VinylCacheSpecMonitoringExporter(obj.exporter),
|
|
259
341
|
'prometheusRules': toJson_VinylCacheSpecMonitoringPrometheusRules(obj.prometheusRules),
|
|
260
342
|
'serviceMonitor': toJson_VinylCacheSpecMonitoringServiceMonitor(obj.serviceMonitor),
|
|
261
343
|
};
|
|
@@ -277,6 +359,8 @@ function toJson_VinylCacheSpecPod(obj) {
|
|
|
277
359
|
'nodeSelector': ((obj.nodeSelector) === undefined) ? undefined : (Object.entries(obj.nodeSelector).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
278
360
|
'priorityClassName': obj.priorityClassName,
|
|
279
361
|
'tolerations': obj.tolerations?.map(y => toJson_VinylCacheSpecPodTolerations(y)),
|
|
362
|
+
'volumeMounts': obj.volumeMounts?.map(y => toJson_VinylCacheSpecPodVolumeMounts(y)),
|
|
363
|
+
'volumes': obj.volumes?.map(y => toJson_VinylCacheSpecPodVolumes(y)),
|
|
280
364
|
};
|
|
281
365
|
// filter undefined values
|
|
282
366
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
@@ -375,6 +459,24 @@ function toJson_VinylCacheSpecVcl(obj) {
|
|
|
375
459
|
// filter undefined values
|
|
376
460
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
377
461
|
}
|
|
462
|
+
/**
|
|
463
|
+
* Converts an object of type 'VinylCacheSpecVolumeClaimTemplates' to JSON representation.
|
|
464
|
+
*/
|
|
465
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
466
|
+
function toJson_VinylCacheSpecVolumeClaimTemplates(obj) {
|
|
467
|
+
if (obj === undefined) {
|
|
468
|
+
return undefined;
|
|
469
|
+
}
|
|
470
|
+
const result = {
|
|
471
|
+
'apiVersion': obj.apiVersion,
|
|
472
|
+
'kind': obj.kind,
|
|
473
|
+
'metadata': obj.metadata,
|
|
474
|
+
'spec': toJson_VinylCacheSpecVolumeClaimTemplatesSpec(obj.spec),
|
|
475
|
+
'status': toJson_VinylCacheSpecVolumeClaimTemplatesStatus(obj.status),
|
|
476
|
+
};
|
|
477
|
+
// filter undefined values
|
|
478
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
479
|
+
}
|
|
378
480
|
/**
|
|
379
481
|
* Converts an object of type 'VinylCacheSpecBackendsConnectionParameters' to JSON representation.
|
|
380
482
|
*/
|
|
@@ -557,6 +659,23 @@ function toJson_VinylCacheSpecInvalidationXkey(obj) {
|
|
|
557
659
|
// filter undefined values
|
|
558
660
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
559
661
|
}
|
|
662
|
+
/**
|
|
663
|
+
* Converts an object of type 'VinylCacheSpecMonitoringExporter' to JSON representation.
|
|
664
|
+
*/
|
|
665
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
666
|
+
function toJson_VinylCacheSpecMonitoringExporter(obj) {
|
|
667
|
+
if (obj === undefined) {
|
|
668
|
+
return undefined;
|
|
669
|
+
}
|
|
670
|
+
const result = {
|
|
671
|
+
'enabled': obj.enabled,
|
|
672
|
+
'image': toJson_VinylCacheSpecMonitoringExporterImage(obj.image),
|
|
673
|
+
'port': obj.port,
|
|
674
|
+
'resources': toJson_VinylCacheSpecMonitoringExporterResources(obj.resources),
|
|
675
|
+
};
|
|
676
|
+
// filter undefined values
|
|
677
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
678
|
+
}
|
|
560
679
|
/**
|
|
561
680
|
* Converts an object of type 'VinylCacheSpecMonitoringPrometheusRules' to JSON representation.
|
|
562
681
|
*/
|
|
@@ -620,6 +739,70 @@ function toJson_VinylCacheSpecPodTolerations(obj) {
|
|
|
620
739
|
// filter undefined values
|
|
621
740
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
622
741
|
}
|
|
742
|
+
/**
|
|
743
|
+
* Converts an object of type 'VinylCacheSpecPodVolumeMounts' to JSON representation.
|
|
744
|
+
*/
|
|
745
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
746
|
+
function toJson_VinylCacheSpecPodVolumeMounts(obj) {
|
|
747
|
+
if (obj === undefined) {
|
|
748
|
+
return undefined;
|
|
749
|
+
}
|
|
750
|
+
const result = {
|
|
751
|
+
'mountPath': obj.mountPath,
|
|
752
|
+
'mountPropagation': obj.mountPropagation,
|
|
753
|
+
'name': obj.name,
|
|
754
|
+
'readOnly': obj.readOnly,
|
|
755
|
+
'recursiveReadOnly': obj.recursiveReadOnly,
|
|
756
|
+
'subPath': obj.subPath,
|
|
757
|
+
'subPathExpr': obj.subPathExpr,
|
|
758
|
+
};
|
|
759
|
+
// filter undefined values
|
|
760
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
761
|
+
}
|
|
762
|
+
/**
|
|
763
|
+
* Converts an object of type 'VinylCacheSpecPodVolumes' to JSON representation.
|
|
764
|
+
*/
|
|
765
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
766
|
+
function toJson_VinylCacheSpecPodVolumes(obj) {
|
|
767
|
+
if (obj === undefined) {
|
|
768
|
+
return undefined;
|
|
769
|
+
}
|
|
770
|
+
const result = {
|
|
771
|
+
'awsElasticBlockStore': toJson_VinylCacheSpecPodVolumesAwsElasticBlockStore(obj.awsElasticBlockStore),
|
|
772
|
+
'azureDisk': toJson_VinylCacheSpecPodVolumesAzureDisk(obj.azureDisk),
|
|
773
|
+
'azureFile': toJson_VinylCacheSpecPodVolumesAzureFile(obj.azureFile),
|
|
774
|
+
'cephfs': toJson_VinylCacheSpecPodVolumesCephfs(obj.cephfs),
|
|
775
|
+
'cinder': toJson_VinylCacheSpecPodVolumesCinder(obj.cinder),
|
|
776
|
+
'configMap': toJson_VinylCacheSpecPodVolumesConfigMap(obj.configMap),
|
|
777
|
+
'csi': toJson_VinylCacheSpecPodVolumesCsi(obj.csi),
|
|
778
|
+
'downwardAPI': toJson_VinylCacheSpecPodVolumesDownwardApi(obj.downwardApi),
|
|
779
|
+
'emptyDir': toJson_VinylCacheSpecPodVolumesEmptyDir(obj.emptyDir),
|
|
780
|
+
'ephemeral': toJson_VinylCacheSpecPodVolumesEphemeral(obj.ephemeral),
|
|
781
|
+
'fc': toJson_VinylCacheSpecPodVolumesFc(obj.fc),
|
|
782
|
+
'flexVolume': toJson_VinylCacheSpecPodVolumesFlexVolume(obj.flexVolume),
|
|
783
|
+
'flocker': toJson_VinylCacheSpecPodVolumesFlocker(obj.flocker),
|
|
784
|
+
'gcePersistentDisk': toJson_VinylCacheSpecPodVolumesGcePersistentDisk(obj.gcePersistentDisk),
|
|
785
|
+
'gitRepo': toJson_VinylCacheSpecPodVolumesGitRepo(obj.gitRepo),
|
|
786
|
+
'glusterfs': toJson_VinylCacheSpecPodVolumesGlusterfs(obj.glusterfs),
|
|
787
|
+
'hostPath': toJson_VinylCacheSpecPodVolumesHostPath(obj.hostPath),
|
|
788
|
+
'image': toJson_VinylCacheSpecPodVolumesImage(obj.image),
|
|
789
|
+
'iscsi': toJson_VinylCacheSpecPodVolumesIscsi(obj.iscsi),
|
|
790
|
+
'name': obj.name,
|
|
791
|
+
'nfs': toJson_VinylCacheSpecPodVolumesNfs(obj.nfs),
|
|
792
|
+
'persistentVolumeClaim': toJson_VinylCacheSpecPodVolumesPersistentVolumeClaim(obj.persistentVolumeClaim),
|
|
793
|
+
'photonPersistentDisk': toJson_VinylCacheSpecPodVolumesPhotonPersistentDisk(obj.photonPersistentDisk),
|
|
794
|
+
'portworxVolume': toJson_VinylCacheSpecPodVolumesPortworxVolume(obj.portworxVolume),
|
|
795
|
+
'projected': toJson_VinylCacheSpecPodVolumesProjected(obj.projected),
|
|
796
|
+
'quobyte': toJson_VinylCacheSpecPodVolumesQuobyte(obj.quobyte),
|
|
797
|
+
'rbd': toJson_VinylCacheSpecPodVolumesRbd(obj.rbd),
|
|
798
|
+
'scaleIO': toJson_VinylCacheSpecPodVolumesScaleIo(obj.scaleIo),
|
|
799
|
+
'secret': toJson_VinylCacheSpecPodVolumesSecret(obj.secret),
|
|
800
|
+
'storageos': toJson_VinylCacheSpecPodVolumesStorageos(obj.storageos),
|
|
801
|
+
'vsphereVolume': toJson_VinylCacheSpecPodVolumesVsphereVolume(obj.vsphereVolume),
|
|
802
|
+
};
|
|
803
|
+
// filter undefined values
|
|
804
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
805
|
+
}
|
|
623
806
|
/**
|
|
624
807
|
* Converts an object of type 'VinylCacheSpecResourcesClaims' to JSON representation.
|
|
625
808
|
*/
|
|
@@ -640,6 +823,7 @@ function toJson_VinylCacheSpecResourcesClaims(obj) {
|
|
|
640
823
|
* @schema VinylCacheSpecResourcesLimits
|
|
641
824
|
*/
|
|
642
825
|
class VinylCacheSpecResourcesLimits {
|
|
826
|
+
value;
|
|
643
827
|
static fromNumber(value) {
|
|
644
828
|
return new VinylCacheSpecResourcesLimits(value);
|
|
645
829
|
}
|
|
@@ -655,6 +839,7 @@ exports.VinylCacheSpecResourcesLimits = VinylCacheSpecResourcesLimits;
|
|
|
655
839
|
* @schema VinylCacheSpecResourcesRequests
|
|
656
840
|
*/
|
|
657
841
|
class VinylCacheSpecResourcesRequests {
|
|
842
|
+
value;
|
|
658
843
|
static fromNumber(value) {
|
|
659
844
|
return new VinylCacheSpecResourcesRequests(value);
|
|
660
845
|
}
|
|
@@ -687,6 +872,7 @@ var VinylCacheSpecServiceType;
|
|
|
687
872
|
* @schema VinylCacheSpecStorageSize
|
|
688
873
|
*/
|
|
689
874
|
class VinylCacheSpecStorageSize {
|
|
875
|
+
value;
|
|
690
876
|
static fromNumber(value) {
|
|
691
877
|
return new VinylCacheSpecStorageSize(value);
|
|
692
878
|
}
|
|
@@ -739,6 +925,49 @@ function toJson_VinylCacheSpecVclSnippets(obj) {
|
|
|
739
925
|
// filter undefined values
|
|
740
926
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
741
927
|
}
|
|
928
|
+
/**
|
|
929
|
+
* Converts an object of type 'VinylCacheSpecVolumeClaimTemplatesSpec' to JSON representation.
|
|
930
|
+
*/
|
|
931
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
932
|
+
function toJson_VinylCacheSpecVolumeClaimTemplatesSpec(obj) {
|
|
933
|
+
if (obj === undefined) {
|
|
934
|
+
return undefined;
|
|
935
|
+
}
|
|
936
|
+
const result = {
|
|
937
|
+
'accessModes': obj.accessModes?.map(y => y),
|
|
938
|
+
'dataSource': toJson_VinylCacheSpecVolumeClaimTemplatesSpecDataSource(obj.dataSource),
|
|
939
|
+
'dataSourceRef': toJson_VinylCacheSpecVolumeClaimTemplatesSpecDataSourceRef(obj.dataSourceRef),
|
|
940
|
+
'resources': toJson_VinylCacheSpecVolumeClaimTemplatesSpecResources(obj.resources),
|
|
941
|
+
'selector': toJson_VinylCacheSpecVolumeClaimTemplatesSpecSelector(obj.selector),
|
|
942
|
+
'storageClassName': obj.storageClassName,
|
|
943
|
+
'volumeAttributesClassName': obj.volumeAttributesClassName,
|
|
944
|
+
'volumeMode': obj.volumeMode,
|
|
945
|
+
'volumeName': obj.volumeName,
|
|
946
|
+
};
|
|
947
|
+
// filter undefined values
|
|
948
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
949
|
+
}
|
|
950
|
+
/**
|
|
951
|
+
* Converts an object of type 'VinylCacheSpecVolumeClaimTemplatesStatus' to JSON representation.
|
|
952
|
+
*/
|
|
953
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
954
|
+
function toJson_VinylCacheSpecVolumeClaimTemplatesStatus(obj) {
|
|
955
|
+
if (obj === undefined) {
|
|
956
|
+
return undefined;
|
|
957
|
+
}
|
|
958
|
+
const result = {
|
|
959
|
+
'accessModes': obj.accessModes?.map(y => y),
|
|
960
|
+
'allocatedResourceStatuses': ((obj.allocatedResourceStatuses) === undefined) ? undefined : (Object.entries(obj.allocatedResourceStatuses).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
961
|
+
'allocatedResources': ((obj.allocatedResources) === undefined) ? undefined : (Object.entries(obj.allocatedResources).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.value }), {})),
|
|
962
|
+
'capacity': ((obj.capacity) === undefined) ? undefined : (Object.entries(obj.capacity).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.value }), {})),
|
|
963
|
+
'conditions': obj.conditions?.map(y => toJson_VinylCacheSpecVolumeClaimTemplatesStatusConditions(y)),
|
|
964
|
+
'currentVolumeAttributesClassName': obj.currentVolumeAttributesClassName,
|
|
965
|
+
'modifyVolumeStatus': toJson_VinylCacheSpecVolumeClaimTemplatesStatusModifyVolumeStatus(obj.modifyVolumeStatus),
|
|
966
|
+
'phase': obj.phase,
|
|
967
|
+
};
|
|
968
|
+
// filter undefined values
|
|
969
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
970
|
+
}
|
|
742
971
|
/**
|
|
743
972
|
* Converts an object of type 'VinylCacheSpecBackendsDirectorHash' to JSON representation.
|
|
744
973
|
*/
|
|
@@ -829,6 +1058,37 @@ var VinylCacheSpecDirectorShardHealthy;
|
|
|
829
1058
|
/** ALL */
|
|
830
1059
|
VinylCacheSpecDirectorShardHealthy["ALL"] = "ALL";
|
|
831
1060
|
})(VinylCacheSpecDirectorShardHealthy || (exports.VinylCacheSpecDirectorShardHealthy = VinylCacheSpecDirectorShardHealthy = {}));
|
|
1061
|
+
/**
|
|
1062
|
+
* Converts an object of type 'VinylCacheSpecMonitoringExporterImage' to JSON representation.
|
|
1063
|
+
*/
|
|
1064
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1065
|
+
function toJson_VinylCacheSpecMonitoringExporterImage(obj) {
|
|
1066
|
+
if (obj === undefined) {
|
|
1067
|
+
return undefined;
|
|
1068
|
+
}
|
|
1069
|
+
const result = {
|
|
1070
|
+
'repository': obj.repository,
|
|
1071
|
+
'tag': obj.tag,
|
|
1072
|
+
};
|
|
1073
|
+
// filter undefined values
|
|
1074
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1075
|
+
}
|
|
1076
|
+
/**
|
|
1077
|
+
* Converts an object of type 'VinylCacheSpecMonitoringExporterResources' to JSON representation.
|
|
1078
|
+
*/
|
|
1079
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1080
|
+
function toJson_VinylCacheSpecMonitoringExporterResources(obj) {
|
|
1081
|
+
if (obj === undefined) {
|
|
1082
|
+
return undefined;
|
|
1083
|
+
}
|
|
1084
|
+
const result = {
|
|
1085
|
+
'claims': obj.claims?.map(y => toJson_VinylCacheSpecMonitoringExporterResourcesClaims(y)),
|
|
1086
|
+
'limits': ((obj.limits) === undefined) ? undefined : (Object.entries(obj.limits).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.value }), {})),
|
|
1087
|
+
'requests': ((obj.requests) === undefined) ? undefined : (Object.entries(obj.requests).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.value }), {})),
|
|
1088
|
+
};
|
|
1089
|
+
// filter undefined values
|
|
1090
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1091
|
+
}
|
|
832
1092
|
/**
|
|
833
1093
|
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinity' to JSON representation.
|
|
834
1094
|
*/
|
|
@@ -874,427 +1134,1539 @@ function toJson_VinylCacheSpecPodAffinityPodAntiAffinity(obj) {
|
|
|
874
1134
|
// filter undefined values
|
|
875
1135
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
876
1136
|
}
|
|
877
|
-
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
878
|
-
/**
|
|
879
|
-
* by determines what value is hashed for shard selection. "HASH" uses the Varnish
|
|
880
|
-
* hash (default); "URL" uses the request URL.
|
|
881
|
-
*
|
|
882
|
-
* @schema VinylCacheSpecBackendsDirectorShardBy
|
|
883
|
-
*/
|
|
884
|
-
var VinylCacheSpecBackendsDirectorShardBy;
|
|
885
|
-
(function (VinylCacheSpecBackendsDirectorShardBy) {
|
|
886
|
-
/** HASH */
|
|
887
|
-
VinylCacheSpecBackendsDirectorShardBy["HASH"] = "HASH";
|
|
888
|
-
/** URL */
|
|
889
|
-
VinylCacheSpecBackendsDirectorShardBy["URL"] = "URL";
|
|
890
|
-
})(VinylCacheSpecBackendsDirectorShardBy || (exports.VinylCacheSpecBackendsDirectorShardBy = VinylCacheSpecBackendsDirectorShardBy = {}));
|
|
891
|
-
/**
|
|
892
|
-
* healthy controls which backends the director considers when selecting a shard.
|
|
893
|
-
* "CHOSEN" (default) only considers the chosen backend healthy; "ALL" requires all
|
|
894
|
-
* backends to be healthy.
|
|
895
|
-
*
|
|
896
|
-
* @schema VinylCacheSpecBackendsDirectorShardHealthy
|
|
897
|
-
*/
|
|
898
|
-
var VinylCacheSpecBackendsDirectorShardHealthy;
|
|
899
|
-
(function (VinylCacheSpecBackendsDirectorShardHealthy) {
|
|
900
|
-
/** CHOSEN */
|
|
901
|
-
VinylCacheSpecBackendsDirectorShardHealthy["CHOSEN"] = "CHOSEN";
|
|
902
|
-
/** ALL */
|
|
903
|
-
VinylCacheSpecBackendsDirectorShardHealthy["ALL"] = "ALL";
|
|
904
|
-
})(VinylCacheSpecBackendsDirectorShardHealthy || (exports.VinylCacheSpecBackendsDirectorShardHealthy = VinylCacheSpecBackendsDirectorShardHealthy = {}));
|
|
905
1137
|
/**
|
|
906
|
-
* Converts an object of type '
|
|
1138
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesAwsElasticBlockStore' to JSON representation.
|
|
907
1139
|
*/
|
|
908
1140
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
909
|
-
function
|
|
1141
|
+
function toJson_VinylCacheSpecPodVolumesAwsElasticBlockStore(obj) {
|
|
910
1142
|
if (obj === undefined) {
|
|
911
1143
|
return undefined;
|
|
912
1144
|
}
|
|
913
1145
|
const result = {
|
|
914
|
-
'
|
|
915
|
-
'
|
|
1146
|
+
'fsType': obj.fsType,
|
|
1147
|
+
'partition': obj.partition,
|
|
1148
|
+
'readOnly': obj.readOnly,
|
|
1149
|
+
'volumeID': obj.volumeId,
|
|
916
1150
|
};
|
|
917
1151
|
// filter undefined values
|
|
918
1152
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
919
1153
|
}
|
|
920
1154
|
/**
|
|
921
|
-
* Converts an object of type '
|
|
1155
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesAzureDisk' to JSON representation.
|
|
922
1156
|
*/
|
|
923
1157
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
924
|
-
function
|
|
1158
|
+
function toJson_VinylCacheSpecPodVolumesAzureDisk(obj) {
|
|
925
1159
|
if (obj === undefined) {
|
|
926
1160
|
return undefined;
|
|
927
1161
|
}
|
|
928
1162
|
const result = {
|
|
929
|
-
'
|
|
1163
|
+
'cachingMode': obj.cachingMode,
|
|
1164
|
+
'diskName': obj.diskName,
|
|
1165
|
+
'diskURI': obj.diskUri,
|
|
1166
|
+
'fsType': obj.fsType,
|
|
1167
|
+
'kind': obj.kind,
|
|
1168
|
+
'readOnly': obj.readOnly,
|
|
930
1169
|
};
|
|
931
1170
|
// filter undefined values
|
|
932
1171
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
933
1172
|
}
|
|
934
1173
|
/**
|
|
935
|
-
* Converts an object of type '
|
|
1174
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesAzureFile' to JSON representation.
|
|
936
1175
|
*/
|
|
937
1176
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
938
|
-
function
|
|
1177
|
+
function toJson_VinylCacheSpecPodVolumesAzureFile(obj) {
|
|
939
1178
|
if (obj === undefined) {
|
|
940
1179
|
return undefined;
|
|
941
1180
|
}
|
|
942
1181
|
const result = {
|
|
943
|
-
'
|
|
944
|
-
'
|
|
1182
|
+
'readOnly': obj.readOnly,
|
|
1183
|
+
'secretName': obj.secretName,
|
|
1184
|
+
'shareName': obj.shareName,
|
|
945
1185
|
};
|
|
946
1186
|
// filter undefined values
|
|
947
1187
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
948
1188
|
}
|
|
949
1189
|
/**
|
|
950
|
-
* Converts an object of type '
|
|
1190
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesCephfs' to JSON representation.
|
|
951
1191
|
*/
|
|
952
1192
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
953
|
-
function
|
|
1193
|
+
function toJson_VinylCacheSpecPodVolumesCephfs(obj) {
|
|
954
1194
|
if (obj === undefined) {
|
|
955
1195
|
return undefined;
|
|
956
1196
|
}
|
|
957
1197
|
const result = {
|
|
958
|
-
'
|
|
959
|
-
'
|
|
960
|
-
'
|
|
961
|
-
'
|
|
962
|
-
'
|
|
963
|
-
'
|
|
1198
|
+
'monitors': obj.monitors?.map(y => y),
|
|
1199
|
+
'path': obj.path,
|
|
1200
|
+
'readOnly': obj.readOnly,
|
|
1201
|
+
'secretFile': obj.secretFile,
|
|
1202
|
+
'secretRef': toJson_VinylCacheSpecPodVolumesCephfsSecretRef(obj.secretRef),
|
|
1203
|
+
'user': obj.user,
|
|
964
1204
|
};
|
|
965
1205
|
// filter undefined values
|
|
966
1206
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
967
1207
|
}
|
|
968
1208
|
/**
|
|
969
|
-
* Converts an object of type '
|
|
1209
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesCinder' to JSON representation.
|
|
970
1210
|
*/
|
|
971
1211
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
972
|
-
function
|
|
1212
|
+
function toJson_VinylCacheSpecPodVolumesCinder(obj) {
|
|
973
1213
|
if (obj === undefined) {
|
|
974
1214
|
return undefined;
|
|
975
1215
|
}
|
|
976
1216
|
const result = {
|
|
977
|
-
'
|
|
978
|
-
'
|
|
1217
|
+
'fsType': obj.fsType,
|
|
1218
|
+
'readOnly': obj.readOnly,
|
|
1219
|
+
'secretRef': toJson_VinylCacheSpecPodVolumesCinderSecretRef(obj.secretRef),
|
|
1220
|
+
'volumeID': obj.volumeId,
|
|
979
1221
|
};
|
|
980
1222
|
// filter undefined values
|
|
981
1223
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
982
1224
|
}
|
|
983
1225
|
/**
|
|
984
|
-
* Converts an object of type '
|
|
1226
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesConfigMap' to JSON representation.
|
|
985
1227
|
*/
|
|
986
1228
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
987
|
-
function
|
|
1229
|
+
function toJson_VinylCacheSpecPodVolumesConfigMap(obj) {
|
|
988
1230
|
if (obj === undefined) {
|
|
989
1231
|
return undefined;
|
|
990
1232
|
}
|
|
991
1233
|
const result = {
|
|
992
|
-
'
|
|
993
|
-
'
|
|
994
|
-
'
|
|
995
|
-
'
|
|
996
|
-
'namespaces': obj.namespaces?.map(y => y),
|
|
997
|
-
'topologyKey': obj.topologyKey,
|
|
1234
|
+
'defaultMode': obj.defaultMode,
|
|
1235
|
+
'items': obj.items?.map(y => toJson_VinylCacheSpecPodVolumesConfigMapItems(y)),
|
|
1236
|
+
'name': obj.name,
|
|
1237
|
+
'optional': obj.optional,
|
|
998
1238
|
};
|
|
999
1239
|
// filter undefined values
|
|
1000
1240
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1001
1241
|
}
|
|
1002
1242
|
/**
|
|
1003
|
-
* Converts an object of type '
|
|
1243
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesCsi' to JSON representation.
|
|
1004
1244
|
*/
|
|
1005
1245
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1006
|
-
function
|
|
1246
|
+
function toJson_VinylCacheSpecPodVolumesCsi(obj) {
|
|
1007
1247
|
if (obj === undefined) {
|
|
1008
1248
|
return undefined;
|
|
1009
1249
|
}
|
|
1010
1250
|
const result = {
|
|
1011
|
-
'
|
|
1012
|
-
'
|
|
1251
|
+
'driver': obj.driver,
|
|
1252
|
+
'fsType': obj.fsType,
|
|
1253
|
+
'nodePublishSecretRef': toJson_VinylCacheSpecPodVolumesCsiNodePublishSecretRef(obj.nodePublishSecretRef),
|
|
1254
|
+
'readOnly': obj.readOnly,
|
|
1255
|
+
'volumeAttributes': ((obj.volumeAttributes) === undefined) ? undefined : (Object.entries(obj.volumeAttributes).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
1013
1256
|
};
|
|
1014
1257
|
// filter undefined values
|
|
1015
1258
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1016
1259
|
}
|
|
1017
1260
|
/**
|
|
1018
|
-
* Converts an object of type '
|
|
1261
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesDownwardApi' to JSON representation.
|
|
1019
1262
|
*/
|
|
1020
1263
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1021
|
-
function
|
|
1264
|
+
function toJson_VinylCacheSpecPodVolumesDownwardApi(obj) {
|
|
1022
1265
|
if (obj === undefined) {
|
|
1023
1266
|
return undefined;
|
|
1024
1267
|
}
|
|
1025
1268
|
const result = {
|
|
1026
|
-
'
|
|
1027
|
-
'
|
|
1269
|
+
'defaultMode': obj.defaultMode,
|
|
1270
|
+
'items': obj.items?.map(y => toJson_VinylCacheSpecPodVolumesDownwardApiItems(y)),
|
|
1028
1271
|
};
|
|
1029
1272
|
// filter undefined values
|
|
1030
1273
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1031
1274
|
}
|
|
1032
1275
|
/**
|
|
1033
|
-
* Converts an object of type '
|
|
1276
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesEmptyDir' to JSON representation.
|
|
1034
1277
|
*/
|
|
1035
1278
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1036
|
-
function
|
|
1279
|
+
function toJson_VinylCacheSpecPodVolumesEmptyDir(obj) {
|
|
1037
1280
|
if (obj === undefined) {
|
|
1038
1281
|
return undefined;
|
|
1039
1282
|
}
|
|
1040
1283
|
const result = {
|
|
1041
|
-
'
|
|
1042
|
-
'
|
|
1043
|
-
'mismatchLabelKeys': obj.mismatchLabelKeys?.map(y => y),
|
|
1044
|
-
'namespaceSelector': toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector(obj.namespaceSelector),
|
|
1045
|
-
'namespaces': obj.namespaces?.map(y => y),
|
|
1046
|
-
'topologyKey': obj.topologyKey,
|
|
1284
|
+
'medium': obj.medium,
|
|
1285
|
+
'sizeLimit': obj.sizeLimit?.value,
|
|
1047
1286
|
};
|
|
1048
1287
|
// filter undefined values
|
|
1049
1288
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1050
1289
|
}
|
|
1051
1290
|
/**
|
|
1052
|
-
* Converts an object of type '
|
|
1291
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesEphemeral' to JSON representation.
|
|
1053
1292
|
*/
|
|
1054
1293
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1055
|
-
function
|
|
1294
|
+
function toJson_VinylCacheSpecPodVolumesEphemeral(obj) {
|
|
1056
1295
|
if (obj === undefined) {
|
|
1057
1296
|
return undefined;
|
|
1058
1297
|
}
|
|
1059
1298
|
const result = {
|
|
1060
|
-
'
|
|
1061
|
-
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
1299
|
+
'volumeClaimTemplate': toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplate(obj.volumeClaimTemplate),
|
|
1062
1300
|
};
|
|
1063
1301
|
// filter undefined values
|
|
1064
1302
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1065
1303
|
}
|
|
1066
1304
|
/**
|
|
1067
|
-
* Converts an object of type '
|
|
1305
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesFc' to JSON representation.
|
|
1068
1306
|
*/
|
|
1069
1307
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1070
|
-
function
|
|
1308
|
+
function toJson_VinylCacheSpecPodVolumesFc(obj) {
|
|
1071
1309
|
if (obj === undefined) {
|
|
1072
1310
|
return undefined;
|
|
1073
1311
|
}
|
|
1074
1312
|
const result = {
|
|
1075
|
-
'
|
|
1076
|
-
'
|
|
1313
|
+
'fsType': obj.fsType,
|
|
1314
|
+
'lun': obj.lun,
|
|
1315
|
+
'readOnly': obj.readOnly,
|
|
1316
|
+
'targetWWNs': obj.targetWwNs?.map(y => y),
|
|
1317
|
+
'wwids': obj.wwids?.map(y => y),
|
|
1077
1318
|
};
|
|
1078
1319
|
// filter undefined values
|
|
1079
1320
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1080
1321
|
}
|
|
1081
1322
|
/**
|
|
1082
|
-
* Converts an object of type '
|
|
1323
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesFlexVolume' to JSON representation.
|
|
1083
1324
|
*/
|
|
1084
1325
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1085
|
-
function
|
|
1326
|
+
function toJson_VinylCacheSpecPodVolumesFlexVolume(obj) {
|
|
1086
1327
|
if (obj === undefined) {
|
|
1087
1328
|
return undefined;
|
|
1088
1329
|
}
|
|
1089
1330
|
const result = {
|
|
1090
|
-
'
|
|
1091
|
-
'
|
|
1092
|
-
'
|
|
1093
|
-
'
|
|
1094
|
-
'
|
|
1095
|
-
'topologyKey': obj.topologyKey,
|
|
1331
|
+
'driver': obj.driver,
|
|
1332
|
+
'fsType': obj.fsType,
|
|
1333
|
+
'options': ((obj.options) === undefined) ? undefined : (Object.entries(obj.options).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
1334
|
+
'readOnly': obj.readOnly,
|
|
1335
|
+
'secretRef': toJson_VinylCacheSpecPodVolumesFlexVolumeSecretRef(obj.secretRef),
|
|
1096
1336
|
};
|
|
1097
1337
|
// filter undefined values
|
|
1098
1338
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1099
1339
|
}
|
|
1100
1340
|
/**
|
|
1101
|
-
* Converts an object of type '
|
|
1341
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesFlocker' to JSON representation.
|
|
1102
1342
|
*/
|
|
1103
1343
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1104
|
-
function
|
|
1344
|
+
function toJson_VinylCacheSpecPodVolumesFlocker(obj) {
|
|
1105
1345
|
if (obj === undefined) {
|
|
1106
1346
|
return undefined;
|
|
1107
1347
|
}
|
|
1108
1348
|
const result = {
|
|
1109
|
-
'
|
|
1110
|
-
'
|
|
1349
|
+
'datasetName': obj.datasetName,
|
|
1350
|
+
'datasetUUID': obj.datasetUuid,
|
|
1111
1351
|
};
|
|
1112
1352
|
// filter undefined values
|
|
1113
1353
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1114
1354
|
}
|
|
1115
1355
|
/**
|
|
1116
|
-
* Converts an object of type '
|
|
1356
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesGcePersistentDisk' to JSON representation.
|
|
1117
1357
|
*/
|
|
1118
1358
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1119
|
-
function
|
|
1359
|
+
function toJson_VinylCacheSpecPodVolumesGcePersistentDisk(obj) {
|
|
1120
1360
|
if (obj === undefined) {
|
|
1121
1361
|
return undefined;
|
|
1122
1362
|
}
|
|
1123
1363
|
const result = {
|
|
1124
|
-
'
|
|
1125
|
-
'
|
|
1364
|
+
'fsType': obj.fsType,
|
|
1365
|
+
'partition': obj.partition,
|
|
1366
|
+
'pdName': obj.pdName,
|
|
1367
|
+
'readOnly': obj.readOnly,
|
|
1126
1368
|
};
|
|
1127
1369
|
// filter undefined values
|
|
1128
1370
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1129
1371
|
}
|
|
1130
1372
|
/**
|
|
1131
|
-
* Converts an object of type '
|
|
1373
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesGitRepo' to JSON representation.
|
|
1132
1374
|
*/
|
|
1133
1375
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1134
|
-
function
|
|
1376
|
+
function toJson_VinylCacheSpecPodVolumesGitRepo(obj) {
|
|
1135
1377
|
if (obj === undefined) {
|
|
1136
1378
|
return undefined;
|
|
1137
1379
|
}
|
|
1138
1380
|
const result = {
|
|
1139
|
-
'
|
|
1140
|
-
'
|
|
1141
|
-
'
|
|
1381
|
+
'directory': obj.directory,
|
|
1382
|
+
'repository': obj.repository,
|
|
1383
|
+
'revision': obj.revision,
|
|
1142
1384
|
};
|
|
1143
1385
|
// filter undefined values
|
|
1144
1386
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1145
1387
|
}
|
|
1146
1388
|
/**
|
|
1147
|
-
* Converts an object of type '
|
|
1389
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesGlusterfs' to JSON representation.
|
|
1148
1390
|
*/
|
|
1149
1391
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1150
|
-
function
|
|
1392
|
+
function toJson_VinylCacheSpecPodVolumesGlusterfs(obj) {
|
|
1151
1393
|
if (obj === undefined) {
|
|
1152
1394
|
return undefined;
|
|
1153
1395
|
}
|
|
1154
1396
|
const result = {
|
|
1155
|
-
'
|
|
1156
|
-
'
|
|
1157
|
-
'
|
|
1397
|
+
'endpoints': obj.endpoints,
|
|
1398
|
+
'path': obj.path,
|
|
1399
|
+
'readOnly': obj.readOnly,
|
|
1158
1400
|
};
|
|
1159
1401
|
// filter undefined values
|
|
1160
1402
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1161
1403
|
}
|
|
1162
1404
|
/**
|
|
1163
|
-
* Converts an object of type '
|
|
1405
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesHostPath' to JSON representation.
|
|
1164
1406
|
*/
|
|
1165
1407
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1166
|
-
function
|
|
1408
|
+
function toJson_VinylCacheSpecPodVolumesHostPath(obj) {
|
|
1167
1409
|
if (obj === undefined) {
|
|
1168
1410
|
return undefined;
|
|
1169
1411
|
}
|
|
1170
1412
|
const result = {
|
|
1171
|
-
'
|
|
1172
|
-
'
|
|
1173
|
-
'values': obj.values?.map(y => y),
|
|
1413
|
+
'path': obj.path,
|
|
1414
|
+
'type': obj.type,
|
|
1174
1415
|
};
|
|
1175
1416
|
// filter undefined values
|
|
1176
1417
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1177
1418
|
}
|
|
1178
1419
|
/**
|
|
1179
|
-
* Converts an object of type '
|
|
1420
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesImage' to JSON representation.
|
|
1180
1421
|
*/
|
|
1181
1422
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1182
|
-
function
|
|
1423
|
+
function toJson_VinylCacheSpecPodVolumesImage(obj) {
|
|
1183
1424
|
if (obj === undefined) {
|
|
1184
1425
|
return undefined;
|
|
1185
1426
|
}
|
|
1186
1427
|
const result = {
|
|
1187
|
-
'
|
|
1188
|
-
'
|
|
1189
|
-
'values': obj.values?.map(y => y),
|
|
1428
|
+
'pullPolicy': obj.pullPolicy,
|
|
1429
|
+
'reference': obj.reference,
|
|
1190
1430
|
};
|
|
1191
1431
|
// filter undefined values
|
|
1192
1432
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1193
1433
|
}
|
|
1194
1434
|
/**
|
|
1195
|
-
* Converts an object of type '
|
|
1435
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesIscsi' to JSON representation.
|
|
1196
1436
|
*/
|
|
1197
1437
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1198
|
-
function
|
|
1438
|
+
function toJson_VinylCacheSpecPodVolumesIscsi(obj) {
|
|
1199
1439
|
if (obj === undefined) {
|
|
1200
1440
|
return undefined;
|
|
1201
1441
|
}
|
|
1202
1442
|
const result = {
|
|
1203
|
-
'
|
|
1204
|
-
'
|
|
1443
|
+
'chapAuthDiscovery': obj.chapAuthDiscovery,
|
|
1444
|
+
'chapAuthSession': obj.chapAuthSession,
|
|
1445
|
+
'fsType': obj.fsType,
|
|
1446
|
+
'initiatorName': obj.initiatorName,
|
|
1447
|
+
'iqn': obj.iqn,
|
|
1448
|
+
'iscsiInterface': obj.iscsiInterface,
|
|
1449
|
+
'lun': obj.lun,
|
|
1450
|
+
'portals': obj.portals?.map(y => y),
|
|
1451
|
+
'readOnly': obj.readOnly,
|
|
1452
|
+
'secretRef': toJson_VinylCacheSpecPodVolumesIscsiSecretRef(obj.secretRef),
|
|
1453
|
+
'targetPortal': obj.targetPortal,
|
|
1205
1454
|
};
|
|
1206
1455
|
// filter undefined values
|
|
1207
1456
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1208
1457
|
}
|
|
1209
1458
|
/**
|
|
1210
|
-
* Converts an object of type '
|
|
1459
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesNfs' to JSON representation.
|
|
1211
1460
|
*/
|
|
1212
1461
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1213
|
-
function
|
|
1462
|
+
function toJson_VinylCacheSpecPodVolumesNfs(obj) {
|
|
1214
1463
|
if (obj === undefined) {
|
|
1215
1464
|
return undefined;
|
|
1216
1465
|
}
|
|
1217
1466
|
const result = {
|
|
1218
|
-
'
|
|
1219
|
-
'
|
|
1467
|
+
'path': obj.path,
|
|
1468
|
+
'readOnly': obj.readOnly,
|
|
1469
|
+
'server': obj.server,
|
|
1220
1470
|
};
|
|
1221
1471
|
// filter undefined values
|
|
1222
1472
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1223
1473
|
}
|
|
1224
1474
|
/**
|
|
1225
|
-
* Converts an object of type '
|
|
1475
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesPersistentVolumeClaim' to JSON representation.
|
|
1226
1476
|
*/
|
|
1227
1477
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1228
|
-
function
|
|
1478
|
+
function toJson_VinylCacheSpecPodVolumesPersistentVolumeClaim(obj) {
|
|
1229
1479
|
if (obj === undefined) {
|
|
1230
1480
|
return undefined;
|
|
1231
1481
|
}
|
|
1232
1482
|
const result = {
|
|
1233
|
-
'
|
|
1234
|
-
'
|
|
1235
|
-
'values': obj.values?.map(y => y),
|
|
1483
|
+
'claimName': obj.claimName,
|
|
1484
|
+
'readOnly': obj.readOnly,
|
|
1236
1485
|
};
|
|
1237
1486
|
// filter undefined values
|
|
1238
1487
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1239
1488
|
}
|
|
1240
1489
|
/**
|
|
1241
|
-
* Converts an object of type '
|
|
1490
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesPhotonPersistentDisk' to JSON representation.
|
|
1242
1491
|
*/
|
|
1243
1492
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1244
|
-
function
|
|
1493
|
+
function toJson_VinylCacheSpecPodVolumesPhotonPersistentDisk(obj) {
|
|
1245
1494
|
if (obj === undefined) {
|
|
1246
1495
|
return undefined;
|
|
1247
1496
|
}
|
|
1248
1497
|
const result = {
|
|
1249
|
-
'
|
|
1250
|
-
'
|
|
1251
|
-
'values': obj.values?.map(y => y),
|
|
1498
|
+
'fsType': obj.fsType,
|
|
1499
|
+
'pdID': obj.pdId,
|
|
1252
1500
|
};
|
|
1253
1501
|
// filter undefined values
|
|
1254
1502
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1255
1503
|
}
|
|
1256
1504
|
/**
|
|
1257
|
-
* Converts an object of type '
|
|
1505
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesPortworxVolume' to JSON representation.
|
|
1258
1506
|
*/
|
|
1259
1507
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1260
|
-
function
|
|
1508
|
+
function toJson_VinylCacheSpecPodVolumesPortworxVolume(obj) {
|
|
1261
1509
|
if (obj === undefined) {
|
|
1262
1510
|
return undefined;
|
|
1263
1511
|
}
|
|
1264
1512
|
const result = {
|
|
1265
|
-
'
|
|
1266
|
-
'
|
|
1513
|
+
'fsType': obj.fsType,
|
|
1514
|
+
'readOnly': obj.readOnly,
|
|
1515
|
+
'volumeID': obj.volumeId,
|
|
1267
1516
|
};
|
|
1268
1517
|
// filter undefined values
|
|
1269
1518
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1270
1519
|
}
|
|
1271
1520
|
/**
|
|
1272
|
-
* Converts an object of type '
|
|
1521
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjected' to JSON representation.
|
|
1273
1522
|
*/
|
|
1274
1523
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1275
|
-
function
|
|
1524
|
+
function toJson_VinylCacheSpecPodVolumesProjected(obj) {
|
|
1276
1525
|
if (obj === undefined) {
|
|
1277
1526
|
return undefined;
|
|
1278
1527
|
}
|
|
1279
1528
|
const result = {
|
|
1280
|
-
'
|
|
1281
|
-
'
|
|
1529
|
+
'defaultMode': obj.defaultMode,
|
|
1530
|
+
'sources': obj.sources?.map(y => toJson_VinylCacheSpecPodVolumesProjectedSources(y)),
|
|
1282
1531
|
};
|
|
1283
1532
|
// filter undefined values
|
|
1284
1533
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1285
1534
|
}
|
|
1286
1535
|
/**
|
|
1287
|
-
* Converts an object of type '
|
|
1536
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesQuobyte' to JSON representation.
|
|
1288
1537
|
*/
|
|
1289
1538
|
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1290
|
-
function
|
|
1539
|
+
function toJson_VinylCacheSpecPodVolumesQuobyte(obj) {
|
|
1291
1540
|
if (obj === undefined) {
|
|
1292
1541
|
return undefined;
|
|
1293
1542
|
}
|
|
1294
1543
|
const result = {
|
|
1295
|
-
'
|
|
1296
|
-
'
|
|
1297
|
-
'
|
|
1544
|
+
'group': obj.group,
|
|
1545
|
+
'readOnly': obj.readOnly,
|
|
1546
|
+
'registry': obj.registry,
|
|
1547
|
+
'tenant': obj.tenant,
|
|
1548
|
+
'user': obj.user,
|
|
1549
|
+
'volume': obj.volume,
|
|
1550
|
+
};
|
|
1551
|
+
// filter undefined values
|
|
1552
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1553
|
+
}
|
|
1554
|
+
/**
|
|
1555
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesRbd' to JSON representation.
|
|
1556
|
+
*/
|
|
1557
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1558
|
+
function toJson_VinylCacheSpecPodVolumesRbd(obj) {
|
|
1559
|
+
if (obj === undefined) {
|
|
1560
|
+
return undefined;
|
|
1561
|
+
}
|
|
1562
|
+
const result = {
|
|
1563
|
+
'fsType': obj.fsType,
|
|
1564
|
+
'image': obj.image,
|
|
1565
|
+
'keyring': obj.keyring,
|
|
1566
|
+
'monitors': obj.monitors?.map(y => y),
|
|
1567
|
+
'pool': obj.pool,
|
|
1568
|
+
'readOnly': obj.readOnly,
|
|
1569
|
+
'secretRef': toJson_VinylCacheSpecPodVolumesRbdSecretRef(obj.secretRef),
|
|
1570
|
+
'user': obj.user,
|
|
1571
|
+
};
|
|
1572
|
+
// filter undefined values
|
|
1573
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1574
|
+
}
|
|
1575
|
+
/**
|
|
1576
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesScaleIo' to JSON representation.
|
|
1577
|
+
*/
|
|
1578
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1579
|
+
function toJson_VinylCacheSpecPodVolumesScaleIo(obj) {
|
|
1580
|
+
if (obj === undefined) {
|
|
1581
|
+
return undefined;
|
|
1582
|
+
}
|
|
1583
|
+
const result = {
|
|
1584
|
+
'fsType': obj.fsType,
|
|
1585
|
+
'gateway': obj.gateway,
|
|
1586
|
+
'protectionDomain': obj.protectionDomain,
|
|
1587
|
+
'readOnly': obj.readOnly,
|
|
1588
|
+
'secretRef': toJson_VinylCacheSpecPodVolumesScaleIoSecretRef(obj.secretRef),
|
|
1589
|
+
'sslEnabled': obj.sslEnabled,
|
|
1590
|
+
'storageMode': obj.storageMode,
|
|
1591
|
+
'storagePool': obj.storagePool,
|
|
1592
|
+
'system': obj.system,
|
|
1593
|
+
'volumeName': obj.volumeName,
|
|
1594
|
+
};
|
|
1595
|
+
// filter undefined values
|
|
1596
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1597
|
+
}
|
|
1598
|
+
/**
|
|
1599
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesSecret' to JSON representation.
|
|
1600
|
+
*/
|
|
1601
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1602
|
+
function toJson_VinylCacheSpecPodVolumesSecret(obj) {
|
|
1603
|
+
if (obj === undefined) {
|
|
1604
|
+
return undefined;
|
|
1605
|
+
}
|
|
1606
|
+
const result = {
|
|
1607
|
+
'defaultMode': obj.defaultMode,
|
|
1608
|
+
'items': obj.items?.map(y => toJson_VinylCacheSpecPodVolumesSecretItems(y)),
|
|
1609
|
+
'optional': obj.optional,
|
|
1610
|
+
'secretName': obj.secretName,
|
|
1611
|
+
};
|
|
1612
|
+
// filter undefined values
|
|
1613
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1614
|
+
}
|
|
1615
|
+
/**
|
|
1616
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesStorageos' to JSON representation.
|
|
1617
|
+
*/
|
|
1618
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1619
|
+
function toJson_VinylCacheSpecPodVolumesStorageos(obj) {
|
|
1620
|
+
if (obj === undefined) {
|
|
1621
|
+
return undefined;
|
|
1622
|
+
}
|
|
1623
|
+
const result = {
|
|
1624
|
+
'fsType': obj.fsType,
|
|
1625
|
+
'readOnly': obj.readOnly,
|
|
1626
|
+
'secretRef': toJson_VinylCacheSpecPodVolumesStorageosSecretRef(obj.secretRef),
|
|
1627
|
+
'volumeName': obj.volumeName,
|
|
1628
|
+
'volumeNamespace': obj.volumeNamespace,
|
|
1629
|
+
};
|
|
1630
|
+
// filter undefined values
|
|
1631
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1632
|
+
}
|
|
1633
|
+
/**
|
|
1634
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesVsphereVolume' to JSON representation.
|
|
1635
|
+
*/
|
|
1636
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1637
|
+
function toJson_VinylCacheSpecPodVolumesVsphereVolume(obj) {
|
|
1638
|
+
if (obj === undefined) {
|
|
1639
|
+
return undefined;
|
|
1640
|
+
}
|
|
1641
|
+
const result = {
|
|
1642
|
+
'fsType': obj.fsType,
|
|
1643
|
+
'storagePolicyID': obj.storagePolicyId,
|
|
1644
|
+
'storagePolicyName': obj.storagePolicyName,
|
|
1645
|
+
'volumePath': obj.volumePath,
|
|
1646
|
+
};
|
|
1647
|
+
// filter undefined values
|
|
1648
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1649
|
+
}
|
|
1650
|
+
/**
|
|
1651
|
+
* Converts an object of type 'VinylCacheSpecVolumeClaimTemplatesSpecDataSource' to JSON representation.
|
|
1652
|
+
*/
|
|
1653
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1654
|
+
function toJson_VinylCacheSpecVolumeClaimTemplatesSpecDataSource(obj) {
|
|
1655
|
+
if (obj === undefined) {
|
|
1656
|
+
return undefined;
|
|
1657
|
+
}
|
|
1658
|
+
const result = {
|
|
1659
|
+
'apiGroup': obj.apiGroup,
|
|
1660
|
+
'kind': obj.kind,
|
|
1661
|
+
'name': obj.name,
|
|
1662
|
+
};
|
|
1663
|
+
// filter undefined values
|
|
1664
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1665
|
+
}
|
|
1666
|
+
/**
|
|
1667
|
+
* Converts an object of type 'VinylCacheSpecVolumeClaimTemplatesSpecDataSourceRef' to JSON representation.
|
|
1668
|
+
*/
|
|
1669
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1670
|
+
function toJson_VinylCacheSpecVolumeClaimTemplatesSpecDataSourceRef(obj) {
|
|
1671
|
+
if (obj === undefined) {
|
|
1672
|
+
return undefined;
|
|
1673
|
+
}
|
|
1674
|
+
const result = {
|
|
1675
|
+
'apiGroup': obj.apiGroup,
|
|
1676
|
+
'kind': obj.kind,
|
|
1677
|
+
'name': obj.name,
|
|
1678
|
+
'namespace': obj.namespace,
|
|
1679
|
+
};
|
|
1680
|
+
// filter undefined values
|
|
1681
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1682
|
+
}
|
|
1683
|
+
/**
|
|
1684
|
+
* Converts an object of type 'VinylCacheSpecVolumeClaimTemplatesSpecResources' to JSON representation.
|
|
1685
|
+
*/
|
|
1686
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1687
|
+
function toJson_VinylCacheSpecVolumeClaimTemplatesSpecResources(obj) {
|
|
1688
|
+
if (obj === undefined) {
|
|
1689
|
+
return undefined;
|
|
1690
|
+
}
|
|
1691
|
+
const result = {
|
|
1692
|
+
'limits': ((obj.limits) === undefined) ? undefined : (Object.entries(obj.limits).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.value }), {})),
|
|
1693
|
+
'requests': ((obj.requests) === undefined) ? undefined : (Object.entries(obj.requests).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.value }), {})),
|
|
1694
|
+
};
|
|
1695
|
+
// filter undefined values
|
|
1696
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1697
|
+
}
|
|
1698
|
+
/**
|
|
1699
|
+
* Converts an object of type 'VinylCacheSpecVolumeClaimTemplatesSpecSelector' to JSON representation.
|
|
1700
|
+
*/
|
|
1701
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1702
|
+
function toJson_VinylCacheSpecVolumeClaimTemplatesSpecSelector(obj) {
|
|
1703
|
+
if (obj === undefined) {
|
|
1704
|
+
return undefined;
|
|
1705
|
+
}
|
|
1706
|
+
const result = {
|
|
1707
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecVolumeClaimTemplatesSpecSelectorMatchExpressions(y)),
|
|
1708
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
1709
|
+
};
|
|
1710
|
+
// filter undefined values
|
|
1711
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1712
|
+
}
|
|
1713
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1714
|
+
/**
|
|
1715
|
+
* @schema VinylCacheSpecVolumeClaimTemplatesStatusAllocatedResources
|
|
1716
|
+
*/
|
|
1717
|
+
class VinylCacheSpecVolumeClaimTemplatesStatusAllocatedResources {
|
|
1718
|
+
value;
|
|
1719
|
+
static fromNumber(value) {
|
|
1720
|
+
return new VinylCacheSpecVolumeClaimTemplatesStatusAllocatedResources(value);
|
|
1721
|
+
}
|
|
1722
|
+
static fromString(value) {
|
|
1723
|
+
return new VinylCacheSpecVolumeClaimTemplatesStatusAllocatedResources(value);
|
|
1724
|
+
}
|
|
1725
|
+
constructor(value) {
|
|
1726
|
+
this.value = value;
|
|
1727
|
+
}
|
|
1728
|
+
}
|
|
1729
|
+
exports.VinylCacheSpecVolumeClaimTemplatesStatusAllocatedResources = VinylCacheSpecVolumeClaimTemplatesStatusAllocatedResources;
|
|
1730
|
+
/**
|
|
1731
|
+
* @schema VinylCacheSpecVolumeClaimTemplatesStatusCapacity
|
|
1732
|
+
*/
|
|
1733
|
+
class VinylCacheSpecVolumeClaimTemplatesStatusCapacity {
|
|
1734
|
+
value;
|
|
1735
|
+
static fromNumber(value) {
|
|
1736
|
+
return new VinylCacheSpecVolumeClaimTemplatesStatusCapacity(value);
|
|
1737
|
+
}
|
|
1738
|
+
static fromString(value) {
|
|
1739
|
+
return new VinylCacheSpecVolumeClaimTemplatesStatusCapacity(value);
|
|
1740
|
+
}
|
|
1741
|
+
constructor(value) {
|
|
1742
|
+
this.value = value;
|
|
1743
|
+
}
|
|
1744
|
+
}
|
|
1745
|
+
exports.VinylCacheSpecVolumeClaimTemplatesStatusCapacity = VinylCacheSpecVolumeClaimTemplatesStatusCapacity;
|
|
1746
|
+
/**
|
|
1747
|
+
* Converts an object of type 'VinylCacheSpecVolumeClaimTemplatesStatusConditions' to JSON representation.
|
|
1748
|
+
*/
|
|
1749
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1750
|
+
function toJson_VinylCacheSpecVolumeClaimTemplatesStatusConditions(obj) {
|
|
1751
|
+
if (obj === undefined) {
|
|
1752
|
+
return undefined;
|
|
1753
|
+
}
|
|
1754
|
+
const result = {
|
|
1755
|
+
'lastProbeTime': obj.lastProbeTime?.toISOString(),
|
|
1756
|
+
'lastTransitionTime': obj.lastTransitionTime?.toISOString(),
|
|
1757
|
+
'message': obj.message,
|
|
1758
|
+
'reason': obj.reason,
|
|
1759
|
+
'status': obj.status,
|
|
1760
|
+
'type': obj.type,
|
|
1761
|
+
};
|
|
1762
|
+
// filter undefined values
|
|
1763
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1764
|
+
}
|
|
1765
|
+
/**
|
|
1766
|
+
* Converts an object of type 'VinylCacheSpecVolumeClaimTemplatesStatusModifyVolumeStatus' to JSON representation.
|
|
1767
|
+
*/
|
|
1768
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1769
|
+
function toJson_VinylCacheSpecVolumeClaimTemplatesStatusModifyVolumeStatus(obj) {
|
|
1770
|
+
if (obj === undefined) {
|
|
1771
|
+
return undefined;
|
|
1772
|
+
}
|
|
1773
|
+
const result = {
|
|
1774
|
+
'status': obj.status,
|
|
1775
|
+
'targetVolumeAttributesClassName': obj.targetVolumeAttributesClassName,
|
|
1776
|
+
};
|
|
1777
|
+
// filter undefined values
|
|
1778
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1779
|
+
}
|
|
1780
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1781
|
+
/**
|
|
1782
|
+
* by determines what value is hashed for shard selection. "HASH" uses the Varnish
|
|
1783
|
+
* hash (default); "URL" uses the request URL.
|
|
1784
|
+
*
|
|
1785
|
+
* @schema VinylCacheSpecBackendsDirectorShardBy
|
|
1786
|
+
*/
|
|
1787
|
+
var VinylCacheSpecBackendsDirectorShardBy;
|
|
1788
|
+
(function (VinylCacheSpecBackendsDirectorShardBy) {
|
|
1789
|
+
/** HASH */
|
|
1790
|
+
VinylCacheSpecBackendsDirectorShardBy["HASH"] = "HASH";
|
|
1791
|
+
/** URL */
|
|
1792
|
+
VinylCacheSpecBackendsDirectorShardBy["URL"] = "URL";
|
|
1793
|
+
})(VinylCacheSpecBackendsDirectorShardBy || (exports.VinylCacheSpecBackendsDirectorShardBy = VinylCacheSpecBackendsDirectorShardBy = {}));
|
|
1794
|
+
/**
|
|
1795
|
+
* healthy controls which backends the director considers when selecting a shard.
|
|
1796
|
+
* "CHOSEN" (default) only considers the chosen backend healthy; "ALL" requires all
|
|
1797
|
+
* backends to be healthy.
|
|
1798
|
+
*
|
|
1799
|
+
* @schema VinylCacheSpecBackendsDirectorShardHealthy
|
|
1800
|
+
*/
|
|
1801
|
+
var VinylCacheSpecBackendsDirectorShardHealthy;
|
|
1802
|
+
(function (VinylCacheSpecBackendsDirectorShardHealthy) {
|
|
1803
|
+
/** CHOSEN */
|
|
1804
|
+
VinylCacheSpecBackendsDirectorShardHealthy["CHOSEN"] = "CHOSEN";
|
|
1805
|
+
/** ALL */
|
|
1806
|
+
VinylCacheSpecBackendsDirectorShardHealthy["ALL"] = "ALL";
|
|
1807
|
+
})(VinylCacheSpecBackendsDirectorShardHealthy || (exports.VinylCacheSpecBackendsDirectorShardHealthy = VinylCacheSpecBackendsDirectorShardHealthy = {}));
|
|
1808
|
+
/**
|
|
1809
|
+
* Converts an object of type 'VinylCacheSpecMonitoringExporterResourcesClaims' to JSON representation.
|
|
1810
|
+
*/
|
|
1811
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1812
|
+
function toJson_VinylCacheSpecMonitoringExporterResourcesClaims(obj) {
|
|
1813
|
+
if (obj === undefined) {
|
|
1814
|
+
return undefined;
|
|
1815
|
+
}
|
|
1816
|
+
const result = {
|
|
1817
|
+
'name': obj.name,
|
|
1818
|
+
'request': obj.request,
|
|
1819
|
+
};
|
|
1820
|
+
// filter undefined values
|
|
1821
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1822
|
+
}
|
|
1823
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1824
|
+
/**
|
|
1825
|
+
* @schema VinylCacheSpecMonitoringExporterResourcesLimits
|
|
1826
|
+
*/
|
|
1827
|
+
class VinylCacheSpecMonitoringExporterResourcesLimits {
|
|
1828
|
+
value;
|
|
1829
|
+
static fromNumber(value) {
|
|
1830
|
+
return new VinylCacheSpecMonitoringExporterResourcesLimits(value);
|
|
1831
|
+
}
|
|
1832
|
+
static fromString(value) {
|
|
1833
|
+
return new VinylCacheSpecMonitoringExporterResourcesLimits(value);
|
|
1834
|
+
}
|
|
1835
|
+
constructor(value) {
|
|
1836
|
+
this.value = value;
|
|
1837
|
+
}
|
|
1838
|
+
}
|
|
1839
|
+
exports.VinylCacheSpecMonitoringExporterResourcesLimits = VinylCacheSpecMonitoringExporterResourcesLimits;
|
|
1840
|
+
/**
|
|
1841
|
+
* @schema VinylCacheSpecMonitoringExporterResourcesRequests
|
|
1842
|
+
*/
|
|
1843
|
+
class VinylCacheSpecMonitoringExporterResourcesRequests {
|
|
1844
|
+
value;
|
|
1845
|
+
static fromNumber(value) {
|
|
1846
|
+
return new VinylCacheSpecMonitoringExporterResourcesRequests(value);
|
|
1847
|
+
}
|
|
1848
|
+
static fromString(value) {
|
|
1849
|
+
return new VinylCacheSpecMonitoringExporterResourcesRequests(value);
|
|
1850
|
+
}
|
|
1851
|
+
constructor(value) {
|
|
1852
|
+
this.value = value;
|
|
1853
|
+
}
|
|
1854
|
+
}
|
|
1855
|
+
exports.VinylCacheSpecMonitoringExporterResourcesRequests = VinylCacheSpecMonitoringExporterResourcesRequests;
|
|
1856
|
+
/**
|
|
1857
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution' to JSON representation.
|
|
1858
|
+
*/
|
|
1859
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1860
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution(obj) {
|
|
1861
|
+
if (obj === undefined) {
|
|
1862
|
+
return undefined;
|
|
1863
|
+
}
|
|
1864
|
+
const result = {
|
|
1865
|
+
'preference': toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference(obj.preference),
|
|
1866
|
+
'weight': obj.weight,
|
|
1867
|
+
};
|
|
1868
|
+
// filter undefined values
|
|
1869
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1870
|
+
}
|
|
1871
|
+
/**
|
|
1872
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution' to JSON representation.
|
|
1873
|
+
*/
|
|
1874
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1875
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecution(obj) {
|
|
1876
|
+
if (obj === undefined) {
|
|
1877
|
+
return undefined;
|
|
1878
|
+
}
|
|
1879
|
+
const result = {
|
|
1880
|
+
'nodeSelectorTerms': obj.nodeSelectorTerms?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms(y)),
|
|
1881
|
+
};
|
|
1882
|
+
// filter undefined values
|
|
1883
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1884
|
+
}
|
|
1885
|
+
/**
|
|
1886
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution' to JSON representation.
|
|
1887
|
+
*/
|
|
1888
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1889
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecution(obj) {
|
|
1890
|
+
if (obj === undefined) {
|
|
1891
|
+
return undefined;
|
|
1892
|
+
}
|
|
1893
|
+
const result = {
|
|
1894
|
+
'podAffinityTerm': toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm(obj.podAffinityTerm),
|
|
1895
|
+
'weight': obj.weight,
|
|
1896
|
+
};
|
|
1897
|
+
// filter undefined values
|
|
1898
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1899
|
+
}
|
|
1900
|
+
/**
|
|
1901
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution' to JSON representation.
|
|
1902
|
+
*/
|
|
1903
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1904
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecution(obj) {
|
|
1905
|
+
if (obj === undefined) {
|
|
1906
|
+
return undefined;
|
|
1907
|
+
}
|
|
1908
|
+
const result = {
|
|
1909
|
+
'labelSelector': toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector(obj.labelSelector),
|
|
1910
|
+
'matchLabelKeys': obj.matchLabelKeys?.map(y => y),
|
|
1911
|
+
'mismatchLabelKeys': obj.mismatchLabelKeys?.map(y => y),
|
|
1912
|
+
'namespaceSelector': toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector(obj.namespaceSelector),
|
|
1913
|
+
'namespaces': obj.namespaces?.map(y => y),
|
|
1914
|
+
'topologyKey': obj.topologyKey,
|
|
1915
|
+
};
|
|
1916
|
+
// filter undefined values
|
|
1917
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1918
|
+
}
|
|
1919
|
+
/**
|
|
1920
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution' to JSON representation.
|
|
1921
|
+
*/
|
|
1922
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1923
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecution(obj) {
|
|
1924
|
+
if (obj === undefined) {
|
|
1925
|
+
return undefined;
|
|
1926
|
+
}
|
|
1927
|
+
const result = {
|
|
1928
|
+
'podAffinityTerm': toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm(obj.podAffinityTerm),
|
|
1929
|
+
'weight': obj.weight,
|
|
1930
|
+
};
|
|
1931
|
+
// filter undefined values
|
|
1932
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1933
|
+
}
|
|
1934
|
+
/**
|
|
1935
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution' to JSON representation.
|
|
1936
|
+
*/
|
|
1937
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1938
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecution(obj) {
|
|
1939
|
+
if (obj === undefined) {
|
|
1940
|
+
return undefined;
|
|
1941
|
+
}
|
|
1942
|
+
const result = {
|
|
1943
|
+
'labelSelector': toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector(obj.labelSelector),
|
|
1944
|
+
'matchLabelKeys': obj.matchLabelKeys?.map(y => y),
|
|
1945
|
+
'mismatchLabelKeys': obj.mismatchLabelKeys?.map(y => y),
|
|
1946
|
+
'namespaceSelector': toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector(obj.namespaceSelector),
|
|
1947
|
+
'namespaces': obj.namespaces?.map(y => y),
|
|
1948
|
+
'topologyKey': obj.topologyKey,
|
|
1949
|
+
};
|
|
1950
|
+
// filter undefined values
|
|
1951
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1952
|
+
}
|
|
1953
|
+
/**
|
|
1954
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesCephfsSecretRef' to JSON representation.
|
|
1955
|
+
*/
|
|
1956
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1957
|
+
function toJson_VinylCacheSpecPodVolumesCephfsSecretRef(obj) {
|
|
1958
|
+
if (obj === undefined) {
|
|
1959
|
+
return undefined;
|
|
1960
|
+
}
|
|
1961
|
+
const result = {
|
|
1962
|
+
'name': obj.name,
|
|
1963
|
+
};
|
|
1964
|
+
// filter undefined values
|
|
1965
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1966
|
+
}
|
|
1967
|
+
/**
|
|
1968
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesCinderSecretRef' to JSON representation.
|
|
1969
|
+
*/
|
|
1970
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1971
|
+
function toJson_VinylCacheSpecPodVolumesCinderSecretRef(obj) {
|
|
1972
|
+
if (obj === undefined) {
|
|
1973
|
+
return undefined;
|
|
1974
|
+
}
|
|
1975
|
+
const result = {
|
|
1976
|
+
'name': obj.name,
|
|
1977
|
+
};
|
|
1978
|
+
// filter undefined values
|
|
1979
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1980
|
+
}
|
|
1981
|
+
/**
|
|
1982
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesConfigMapItems' to JSON representation.
|
|
1983
|
+
*/
|
|
1984
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1985
|
+
function toJson_VinylCacheSpecPodVolumesConfigMapItems(obj) {
|
|
1986
|
+
if (obj === undefined) {
|
|
1987
|
+
return undefined;
|
|
1988
|
+
}
|
|
1989
|
+
const result = {
|
|
1990
|
+
'key': obj.key,
|
|
1991
|
+
'mode': obj.mode,
|
|
1992
|
+
'path': obj.path,
|
|
1993
|
+
};
|
|
1994
|
+
// filter undefined values
|
|
1995
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1996
|
+
}
|
|
1997
|
+
/**
|
|
1998
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesCsiNodePublishSecretRef' to JSON representation.
|
|
1999
|
+
*/
|
|
2000
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2001
|
+
function toJson_VinylCacheSpecPodVolumesCsiNodePublishSecretRef(obj) {
|
|
2002
|
+
if (obj === undefined) {
|
|
2003
|
+
return undefined;
|
|
2004
|
+
}
|
|
2005
|
+
const result = {
|
|
2006
|
+
'name': obj.name,
|
|
2007
|
+
};
|
|
2008
|
+
// filter undefined values
|
|
2009
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2010
|
+
}
|
|
2011
|
+
/**
|
|
2012
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesDownwardApiItems' to JSON representation.
|
|
2013
|
+
*/
|
|
2014
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2015
|
+
function toJson_VinylCacheSpecPodVolumesDownwardApiItems(obj) {
|
|
2016
|
+
if (obj === undefined) {
|
|
2017
|
+
return undefined;
|
|
2018
|
+
}
|
|
2019
|
+
const result = {
|
|
2020
|
+
'fieldRef': toJson_VinylCacheSpecPodVolumesDownwardApiItemsFieldRef(obj.fieldRef),
|
|
2021
|
+
'mode': obj.mode,
|
|
2022
|
+
'path': obj.path,
|
|
2023
|
+
'resourceFieldRef': toJson_VinylCacheSpecPodVolumesDownwardApiItemsResourceFieldRef(obj.resourceFieldRef),
|
|
2024
|
+
};
|
|
2025
|
+
// filter undefined values
|
|
2026
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2027
|
+
}
|
|
2028
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2029
|
+
/**
|
|
2030
|
+
* sizeLimit is the total amount of local storage required for this EmptyDir volume.
|
|
2031
|
+
* The size limit is also applicable for memory medium.
|
|
2032
|
+
* The maximum usage on memory medium EmptyDir would be the minimum value between
|
|
2033
|
+
* the SizeLimit specified here and the sum of memory limits of all containers in a pod.
|
|
2034
|
+
* The default is nil which means that the limit is undefined.
|
|
2035
|
+
* More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir
|
|
2036
|
+
*
|
|
2037
|
+
* @schema VinylCacheSpecPodVolumesEmptyDirSizeLimit
|
|
2038
|
+
*/
|
|
2039
|
+
class VinylCacheSpecPodVolumesEmptyDirSizeLimit {
|
|
2040
|
+
value;
|
|
2041
|
+
static fromNumber(value) {
|
|
2042
|
+
return new VinylCacheSpecPodVolumesEmptyDirSizeLimit(value);
|
|
2043
|
+
}
|
|
2044
|
+
static fromString(value) {
|
|
2045
|
+
return new VinylCacheSpecPodVolumesEmptyDirSizeLimit(value);
|
|
2046
|
+
}
|
|
2047
|
+
constructor(value) {
|
|
2048
|
+
this.value = value;
|
|
2049
|
+
}
|
|
2050
|
+
}
|
|
2051
|
+
exports.VinylCacheSpecPodVolumesEmptyDirSizeLimit = VinylCacheSpecPodVolumesEmptyDirSizeLimit;
|
|
2052
|
+
/**
|
|
2053
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplate' to JSON representation.
|
|
2054
|
+
*/
|
|
2055
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2056
|
+
function toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplate(obj) {
|
|
2057
|
+
if (obj === undefined) {
|
|
2058
|
+
return undefined;
|
|
2059
|
+
}
|
|
2060
|
+
const result = {
|
|
2061
|
+
'metadata': obj.metadata,
|
|
2062
|
+
'spec': toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpec(obj.spec),
|
|
2063
|
+
};
|
|
2064
|
+
// filter undefined values
|
|
2065
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2066
|
+
}
|
|
2067
|
+
/**
|
|
2068
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesFlexVolumeSecretRef' to JSON representation.
|
|
2069
|
+
*/
|
|
2070
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2071
|
+
function toJson_VinylCacheSpecPodVolumesFlexVolumeSecretRef(obj) {
|
|
2072
|
+
if (obj === undefined) {
|
|
2073
|
+
return undefined;
|
|
2074
|
+
}
|
|
2075
|
+
const result = {
|
|
2076
|
+
'name': obj.name,
|
|
2077
|
+
};
|
|
2078
|
+
// filter undefined values
|
|
2079
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2080
|
+
}
|
|
2081
|
+
/**
|
|
2082
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesIscsiSecretRef' to JSON representation.
|
|
2083
|
+
*/
|
|
2084
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2085
|
+
function toJson_VinylCacheSpecPodVolumesIscsiSecretRef(obj) {
|
|
2086
|
+
if (obj === undefined) {
|
|
2087
|
+
return undefined;
|
|
2088
|
+
}
|
|
2089
|
+
const result = {
|
|
2090
|
+
'name': obj.name,
|
|
2091
|
+
};
|
|
2092
|
+
// filter undefined values
|
|
2093
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2094
|
+
}
|
|
2095
|
+
/**
|
|
2096
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSources' to JSON representation.
|
|
2097
|
+
*/
|
|
2098
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2099
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSources(obj) {
|
|
2100
|
+
if (obj === undefined) {
|
|
2101
|
+
return undefined;
|
|
2102
|
+
}
|
|
2103
|
+
const result = {
|
|
2104
|
+
'clusterTrustBundle': toJson_VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundle(obj.clusterTrustBundle),
|
|
2105
|
+
'configMap': toJson_VinylCacheSpecPodVolumesProjectedSourcesConfigMap(obj.configMap),
|
|
2106
|
+
'downwardAPI': toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApi(obj.downwardApi),
|
|
2107
|
+
'podCertificate': toJson_VinylCacheSpecPodVolumesProjectedSourcesPodCertificate(obj.podCertificate),
|
|
2108
|
+
'secret': toJson_VinylCacheSpecPodVolumesProjectedSourcesSecret(obj.secret),
|
|
2109
|
+
'serviceAccountToken': toJson_VinylCacheSpecPodVolumesProjectedSourcesServiceAccountToken(obj.serviceAccountToken),
|
|
2110
|
+
};
|
|
2111
|
+
// filter undefined values
|
|
2112
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2113
|
+
}
|
|
2114
|
+
/**
|
|
2115
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesRbdSecretRef' to JSON representation.
|
|
2116
|
+
*/
|
|
2117
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2118
|
+
function toJson_VinylCacheSpecPodVolumesRbdSecretRef(obj) {
|
|
2119
|
+
if (obj === undefined) {
|
|
2120
|
+
return undefined;
|
|
2121
|
+
}
|
|
2122
|
+
const result = {
|
|
2123
|
+
'name': obj.name,
|
|
2124
|
+
};
|
|
2125
|
+
// filter undefined values
|
|
2126
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2127
|
+
}
|
|
2128
|
+
/**
|
|
2129
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesScaleIoSecretRef' to JSON representation.
|
|
2130
|
+
*/
|
|
2131
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2132
|
+
function toJson_VinylCacheSpecPodVolumesScaleIoSecretRef(obj) {
|
|
2133
|
+
if (obj === undefined) {
|
|
2134
|
+
return undefined;
|
|
2135
|
+
}
|
|
2136
|
+
const result = {
|
|
2137
|
+
'name': obj.name,
|
|
2138
|
+
};
|
|
2139
|
+
// filter undefined values
|
|
2140
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2141
|
+
}
|
|
2142
|
+
/**
|
|
2143
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesSecretItems' to JSON representation.
|
|
2144
|
+
*/
|
|
2145
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2146
|
+
function toJson_VinylCacheSpecPodVolumesSecretItems(obj) {
|
|
2147
|
+
if (obj === undefined) {
|
|
2148
|
+
return undefined;
|
|
2149
|
+
}
|
|
2150
|
+
const result = {
|
|
2151
|
+
'key': obj.key,
|
|
2152
|
+
'mode': obj.mode,
|
|
2153
|
+
'path': obj.path,
|
|
2154
|
+
};
|
|
2155
|
+
// filter undefined values
|
|
2156
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2157
|
+
}
|
|
2158
|
+
/**
|
|
2159
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesStorageosSecretRef' to JSON representation.
|
|
2160
|
+
*/
|
|
2161
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2162
|
+
function toJson_VinylCacheSpecPodVolumesStorageosSecretRef(obj) {
|
|
2163
|
+
if (obj === undefined) {
|
|
2164
|
+
return undefined;
|
|
2165
|
+
}
|
|
2166
|
+
const result = {
|
|
2167
|
+
'name': obj.name,
|
|
2168
|
+
};
|
|
2169
|
+
// filter undefined values
|
|
2170
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2171
|
+
}
|
|
2172
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2173
|
+
/**
|
|
2174
|
+
* @schema VinylCacheSpecVolumeClaimTemplatesSpecResourcesLimits
|
|
2175
|
+
*/
|
|
2176
|
+
class VinylCacheSpecVolumeClaimTemplatesSpecResourcesLimits {
|
|
2177
|
+
value;
|
|
2178
|
+
static fromNumber(value) {
|
|
2179
|
+
return new VinylCacheSpecVolumeClaimTemplatesSpecResourcesLimits(value);
|
|
2180
|
+
}
|
|
2181
|
+
static fromString(value) {
|
|
2182
|
+
return new VinylCacheSpecVolumeClaimTemplatesSpecResourcesLimits(value);
|
|
2183
|
+
}
|
|
2184
|
+
constructor(value) {
|
|
2185
|
+
this.value = value;
|
|
2186
|
+
}
|
|
2187
|
+
}
|
|
2188
|
+
exports.VinylCacheSpecVolumeClaimTemplatesSpecResourcesLimits = VinylCacheSpecVolumeClaimTemplatesSpecResourcesLimits;
|
|
2189
|
+
/**
|
|
2190
|
+
* @schema VinylCacheSpecVolumeClaimTemplatesSpecResourcesRequests
|
|
2191
|
+
*/
|
|
2192
|
+
class VinylCacheSpecVolumeClaimTemplatesSpecResourcesRequests {
|
|
2193
|
+
value;
|
|
2194
|
+
static fromNumber(value) {
|
|
2195
|
+
return new VinylCacheSpecVolumeClaimTemplatesSpecResourcesRequests(value);
|
|
2196
|
+
}
|
|
2197
|
+
static fromString(value) {
|
|
2198
|
+
return new VinylCacheSpecVolumeClaimTemplatesSpecResourcesRequests(value);
|
|
2199
|
+
}
|
|
2200
|
+
constructor(value) {
|
|
2201
|
+
this.value = value;
|
|
2202
|
+
}
|
|
2203
|
+
}
|
|
2204
|
+
exports.VinylCacheSpecVolumeClaimTemplatesSpecResourcesRequests = VinylCacheSpecVolumeClaimTemplatesSpecResourcesRequests;
|
|
2205
|
+
/**
|
|
2206
|
+
* Converts an object of type 'VinylCacheSpecVolumeClaimTemplatesSpecSelectorMatchExpressions' to JSON representation.
|
|
2207
|
+
*/
|
|
2208
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2209
|
+
function toJson_VinylCacheSpecVolumeClaimTemplatesSpecSelectorMatchExpressions(obj) {
|
|
2210
|
+
if (obj === undefined) {
|
|
2211
|
+
return undefined;
|
|
2212
|
+
}
|
|
2213
|
+
const result = {
|
|
2214
|
+
'key': obj.key,
|
|
2215
|
+
'operator': obj.operator,
|
|
2216
|
+
'values': obj.values?.map(y => y),
|
|
2217
|
+
};
|
|
2218
|
+
// filter undefined values
|
|
2219
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2220
|
+
}
|
|
2221
|
+
/**
|
|
2222
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference' to JSON representation.
|
|
2223
|
+
*/
|
|
2224
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2225
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreference(obj) {
|
|
2226
|
+
if (obj === undefined) {
|
|
2227
|
+
return undefined;
|
|
2228
|
+
}
|
|
2229
|
+
const result = {
|
|
2230
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions(y)),
|
|
2231
|
+
'matchFields': obj.matchFields?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields(y)),
|
|
2232
|
+
};
|
|
2233
|
+
// filter undefined values
|
|
2234
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2235
|
+
}
|
|
2236
|
+
/**
|
|
2237
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms' to JSON representation.
|
|
2238
|
+
*/
|
|
2239
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2240
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTerms(obj) {
|
|
2241
|
+
if (obj === undefined) {
|
|
2242
|
+
return undefined;
|
|
2243
|
+
}
|
|
2244
|
+
const result = {
|
|
2245
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions(y)),
|
|
2246
|
+
'matchFields': obj.matchFields?.map(y => toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields(y)),
|
|
2247
|
+
};
|
|
2248
|
+
// filter undefined values
|
|
2249
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2250
|
+
}
|
|
2251
|
+
/**
|
|
2252
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm' to JSON representation.
|
|
2253
|
+
*/
|
|
2254
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2255
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm(obj) {
|
|
2256
|
+
if (obj === undefined) {
|
|
2257
|
+
return undefined;
|
|
2258
|
+
}
|
|
2259
|
+
const result = {
|
|
2260
|
+
'labelSelector': toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector(obj.labelSelector),
|
|
2261
|
+
'matchLabelKeys': obj.matchLabelKeys?.map(y => y),
|
|
2262
|
+
'mismatchLabelKeys': obj.mismatchLabelKeys?.map(y => y),
|
|
2263
|
+
'namespaceSelector': toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector(obj.namespaceSelector),
|
|
2264
|
+
'namespaces': obj.namespaces?.map(y => y),
|
|
2265
|
+
'topologyKey': obj.topologyKey,
|
|
2266
|
+
};
|
|
2267
|
+
// filter undefined values
|
|
2268
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2269
|
+
}
|
|
2270
|
+
/**
|
|
2271
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector' to JSON representation.
|
|
2272
|
+
*/
|
|
2273
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2274
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector(obj) {
|
|
2275
|
+
if (obj === undefined) {
|
|
2276
|
+
return undefined;
|
|
2277
|
+
}
|
|
2278
|
+
const result = {
|
|
2279
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions(y)),
|
|
2280
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
2281
|
+
};
|
|
2282
|
+
// filter undefined values
|
|
2283
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2284
|
+
}
|
|
2285
|
+
/**
|
|
2286
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector' to JSON representation.
|
|
2287
|
+
*/
|
|
2288
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2289
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector(obj) {
|
|
2290
|
+
if (obj === undefined) {
|
|
2291
|
+
return undefined;
|
|
2292
|
+
}
|
|
2293
|
+
const result = {
|
|
2294
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions(y)),
|
|
2295
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
2296
|
+
};
|
|
2297
|
+
// filter undefined values
|
|
2298
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2299
|
+
}
|
|
2300
|
+
/**
|
|
2301
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm' to JSON representation.
|
|
2302
|
+
*/
|
|
2303
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2304
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTerm(obj) {
|
|
2305
|
+
if (obj === undefined) {
|
|
2306
|
+
return undefined;
|
|
2307
|
+
}
|
|
2308
|
+
const result = {
|
|
2309
|
+
'labelSelector': toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector(obj.labelSelector),
|
|
2310
|
+
'matchLabelKeys': obj.matchLabelKeys?.map(y => y),
|
|
2311
|
+
'mismatchLabelKeys': obj.mismatchLabelKeys?.map(y => y),
|
|
2312
|
+
'namespaceSelector': toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector(obj.namespaceSelector),
|
|
2313
|
+
'namespaces': obj.namespaces?.map(y => y),
|
|
2314
|
+
'topologyKey': obj.topologyKey,
|
|
2315
|
+
};
|
|
2316
|
+
// filter undefined values
|
|
2317
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2318
|
+
}
|
|
2319
|
+
/**
|
|
2320
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector' to JSON representation.
|
|
2321
|
+
*/
|
|
2322
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2323
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelector(obj) {
|
|
2324
|
+
if (obj === undefined) {
|
|
2325
|
+
return undefined;
|
|
2326
|
+
}
|
|
2327
|
+
const result = {
|
|
2328
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions(y)),
|
|
2329
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
2330
|
+
};
|
|
2331
|
+
// filter undefined values
|
|
2332
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2333
|
+
}
|
|
2334
|
+
/**
|
|
2335
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector' to JSON representation.
|
|
2336
|
+
*/
|
|
2337
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2338
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelector(obj) {
|
|
2339
|
+
if (obj === undefined) {
|
|
2340
|
+
return undefined;
|
|
2341
|
+
}
|
|
2342
|
+
const result = {
|
|
2343
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions(y)),
|
|
2344
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
2345
|
+
};
|
|
2346
|
+
// filter undefined values
|
|
2347
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2348
|
+
}
|
|
2349
|
+
/**
|
|
2350
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesDownwardApiItemsFieldRef' to JSON representation.
|
|
2351
|
+
*/
|
|
2352
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2353
|
+
function toJson_VinylCacheSpecPodVolumesDownwardApiItemsFieldRef(obj) {
|
|
2354
|
+
if (obj === undefined) {
|
|
2355
|
+
return undefined;
|
|
2356
|
+
}
|
|
2357
|
+
const result = {
|
|
2358
|
+
'apiVersion': obj.apiVersion,
|
|
2359
|
+
'fieldPath': obj.fieldPath,
|
|
2360
|
+
};
|
|
2361
|
+
// filter undefined values
|
|
2362
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2363
|
+
}
|
|
2364
|
+
/**
|
|
2365
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesDownwardApiItemsResourceFieldRef' to JSON representation.
|
|
2366
|
+
*/
|
|
2367
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2368
|
+
function toJson_VinylCacheSpecPodVolumesDownwardApiItemsResourceFieldRef(obj) {
|
|
2369
|
+
if (obj === undefined) {
|
|
2370
|
+
return undefined;
|
|
2371
|
+
}
|
|
2372
|
+
const result = {
|
|
2373
|
+
'containerName': obj.containerName,
|
|
2374
|
+
'divisor': obj.divisor?.value,
|
|
2375
|
+
'resource': obj.resource,
|
|
2376
|
+
};
|
|
2377
|
+
// filter undefined values
|
|
2378
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2379
|
+
}
|
|
2380
|
+
/**
|
|
2381
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpec' to JSON representation.
|
|
2382
|
+
*/
|
|
2383
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2384
|
+
function toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpec(obj) {
|
|
2385
|
+
if (obj === undefined) {
|
|
2386
|
+
return undefined;
|
|
2387
|
+
}
|
|
2388
|
+
const result = {
|
|
2389
|
+
'accessModes': obj.accessModes?.map(y => y),
|
|
2390
|
+
'dataSource': toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecDataSource(obj.dataSource),
|
|
2391
|
+
'dataSourceRef': toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecDataSourceRef(obj.dataSourceRef),
|
|
2392
|
+
'resources': toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResources(obj.resources),
|
|
2393
|
+
'selector': toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecSelector(obj.selector),
|
|
2394
|
+
'storageClassName': obj.storageClassName,
|
|
2395
|
+
'volumeAttributesClassName': obj.volumeAttributesClassName,
|
|
2396
|
+
'volumeMode': obj.volumeMode,
|
|
2397
|
+
'volumeName': obj.volumeName,
|
|
2398
|
+
};
|
|
2399
|
+
// filter undefined values
|
|
2400
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2401
|
+
}
|
|
2402
|
+
/**
|
|
2403
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundle' to JSON representation.
|
|
2404
|
+
*/
|
|
2405
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2406
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundle(obj) {
|
|
2407
|
+
if (obj === undefined) {
|
|
2408
|
+
return undefined;
|
|
2409
|
+
}
|
|
2410
|
+
const result = {
|
|
2411
|
+
'labelSelector': toJson_VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundleLabelSelector(obj.labelSelector),
|
|
2412
|
+
'name': obj.name,
|
|
2413
|
+
'optional': obj.optional,
|
|
2414
|
+
'path': obj.path,
|
|
2415
|
+
'signerName': obj.signerName,
|
|
2416
|
+
};
|
|
2417
|
+
// filter undefined values
|
|
2418
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2419
|
+
}
|
|
2420
|
+
/**
|
|
2421
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSourcesConfigMap' to JSON representation.
|
|
2422
|
+
*/
|
|
2423
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2424
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSourcesConfigMap(obj) {
|
|
2425
|
+
if (obj === undefined) {
|
|
2426
|
+
return undefined;
|
|
2427
|
+
}
|
|
2428
|
+
const result = {
|
|
2429
|
+
'items': obj.items?.map(y => toJson_VinylCacheSpecPodVolumesProjectedSourcesConfigMapItems(y)),
|
|
2430
|
+
'name': obj.name,
|
|
2431
|
+
'optional': obj.optional,
|
|
2432
|
+
};
|
|
2433
|
+
// filter undefined values
|
|
2434
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2435
|
+
}
|
|
2436
|
+
/**
|
|
2437
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSourcesDownwardApi' to JSON representation.
|
|
2438
|
+
*/
|
|
2439
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2440
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApi(obj) {
|
|
2441
|
+
if (obj === undefined) {
|
|
2442
|
+
return undefined;
|
|
2443
|
+
}
|
|
2444
|
+
const result = {
|
|
2445
|
+
'items': obj.items?.map(y => toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItems(y)),
|
|
2446
|
+
};
|
|
2447
|
+
// filter undefined values
|
|
2448
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2449
|
+
}
|
|
2450
|
+
/**
|
|
2451
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSourcesPodCertificate' to JSON representation.
|
|
2452
|
+
*/
|
|
2453
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2454
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSourcesPodCertificate(obj) {
|
|
2455
|
+
if (obj === undefined) {
|
|
2456
|
+
return undefined;
|
|
2457
|
+
}
|
|
2458
|
+
const result = {
|
|
2459
|
+
'certificateChainPath': obj.certificateChainPath,
|
|
2460
|
+
'credentialBundlePath': obj.credentialBundlePath,
|
|
2461
|
+
'keyPath': obj.keyPath,
|
|
2462
|
+
'keyType': obj.keyType,
|
|
2463
|
+
'maxExpirationSeconds': obj.maxExpirationSeconds,
|
|
2464
|
+
'signerName': obj.signerName,
|
|
2465
|
+
'userAnnotations': ((obj.userAnnotations) === undefined) ? undefined : (Object.entries(obj.userAnnotations).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
2466
|
+
};
|
|
2467
|
+
// filter undefined values
|
|
2468
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2469
|
+
}
|
|
2470
|
+
/**
|
|
2471
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSourcesSecret' to JSON representation.
|
|
2472
|
+
*/
|
|
2473
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2474
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSourcesSecret(obj) {
|
|
2475
|
+
if (obj === undefined) {
|
|
2476
|
+
return undefined;
|
|
2477
|
+
}
|
|
2478
|
+
const result = {
|
|
2479
|
+
'items': obj.items?.map(y => toJson_VinylCacheSpecPodVolumesProjectedSourcesSecretItems(y)),
|
|
2480
|
+
'name': obj.name,
|
|
2481
|
+
'optional': obj.optional,
|
|
2482
|
+
};
|
|
2483
|
+
// filter undefined values
|
|
2484
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2485
|
+
}
|
|
2486
|
+
/**
|
|
2487
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSourcesServiceAccountToken' to JSON representation.
|
|
2488
|
+
*/
|
|
2489
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2490
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSourcesServiceAccountToken(obj) {
|
|
2491
|
+
if (obj === undefined) {
|
|
2492
|
+
return undefined;
|
|
2493
|
+
}
|
|
2494
|
+
const result = {
|
|
2495
|
+
'audience': obj.audience,
|
|
2496
|
+
'expirationSeconds': obj.expirationSeconds,
|
|
2497
|
+
'path': obj.path,
|
|
2498
|
+
};
|
|
2499
|
+
// filter undefined values
|
|
2500
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2501
|
+
}
|
|
2502
|
+
/**
|
|
2503
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions' to JSON representation.
|
|
2504
|
+
*/
|
|
2505
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2506
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchExpressions(obj) {
|
|
2507
|
+
if (obj === undefined) {
|
|
2508
|
+
return undefined;
|
|
2509
|
+
}
|
|
2510
|
+
const result = {
|
|
2511
|
+
'key': obj.key,
|
|
2512
|
+
'operator': obj.operator,
|
|
2513
|
+
'values': obj.values?.map(y => y),
|
|
2514
|
+
};
|
|
2515
|
+
// filter undefined values
|
|
2516
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2517
|
+
}
|
|
2518
|
+
/**
|
|
2519
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields' to JSON representation.
|
|
2520
|
+
*/
|
|
2521
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2522
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecutionPreferenceMatchFields(obj) {
|
|
2523
|
+
if (obj === undefined) {
|
|
2524
|
+
return undefined;
|
|
2525
|
+
}
|
|
2526
|
+
const result = {
|
|
2527
|
+
'key': obj.key,
|
|
2528
|
+
'operator': obj.operator,
|
|
2529
|
+
'values': obj.values?.map(y => y),
|
|
2530
|
+
};
|
|
2531
|
+
// filter undefined values
|
|
2532
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2533
|
+
}
|
|
2534
|
+
/**
|
|
2535
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions' to JSON representation.
|
|
2536
|
+
*/
|
|
2537
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2538
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchExpressions(obj) {
|
|
2539
|
+
if (obj === undefined) {
|
|
2540
|
+
return undefined;
|
|
2541
|
+
}
|
|
2542
|
+
const result = {
|
|
2543
|
+
'key': obj.key,
|
|
2544
|
+
'operator': obj.operator,
|
|
2545
|
+
'values': obj.values?.map(y => y),
|
|
2546
|
+
};
|
|
2547
|
+
// filter undefined values
|
|
2548
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2549
|
+
}
|
|
2550
|
+
/**
|
|
2551
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields' to JSON representation.
|
|
2552
|
+
*/
|
|
2553
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2554
|
+
function toJson_VinylCacheSpecPodAffinityNodeAffinityRequiredDuringSchedulingIgnoredDuringExecutionNodeSelectorTermsMatchFields(obj) {
|
|
2555
|
+
if (obj === undefined) {
|
|
2556
|
+
return undefined;
|
|
2557
|
+
}
|
|
2558
|
+
const result = {
|
|
2559
|
+
'key': obj.key,
|
|
2560
|
+
'operator': obj.operator,
|
|
2561
|
+
'values': obj.values?.map(y => y),
|
|
2562
|
+
};
|
|
2563
|
+
// filter undefined values
|
|
2564
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2565
|
+
}
|
|
2566
|
+
/**
|
|
2567
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector' to JSON representation.
|
|
2568
|
+
*/
|
|
2569
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2570
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector(obj) {
|
|
2571
|
+
if (obj === undefined) {
|
|
2572
|
+
return undefined;
|
|
2573
|
+
}
|
|
2574
|
+
const result = {
|
|
2575
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions(y)),
|
|
2576
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
2577
|
+
};
|
|
2578
|
+
// filter undefined values
|
|
2579
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2580
|
+
}
|
|
2581
|
+
/**
|
|
2582
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector' to JSON representation.
|
|
2583
|
+
*/
|
|
2584
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2585
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector(obj) {
|
|
2586
|
+
if (obj === undefined) {
|
|
2587
|
+
return undefined;
|
|
2588
|
+
}
|
|
2589
|
+
const result = {
|
|
2590
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions(y)),
|
|
2591
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
2592
|
+
};
|
|
2593
|
+
// filter undefined values
|
|
2594
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2595
|
+
}
|
|
2596
|
+
/**
|
|
2597
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions' to JSON representation.
|
|
2598
|
+
*/
|
|
2599
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2600
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions(obj) {
|
|
2601
|
+
if (obj === undefined) {
|
|
2602
|
+
return undefined;
|
|
2603
|
+
}
|
|
2604
|
+
const result = {
|
|
2605
|
+
'key': obj.key,
|
|
2606
|
+
'operator': obj.operator,
|
|
2607
|
+
'values': obj.values?.map(y => y),
|
|
2608
|
+
};
|
|
2609
|
+
// filter undefined values
|
|
2610
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2611
|
+
}
|
|
2612
|
+
/**
|
|
2613
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions' to JSON representation.
|
|
2614
|
+
*/
|
|
2615
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2616
|
+
function toJson_VinylCacheSpecPodAffinityPodAffinityRequiredDuringSchedulingIgnoredDuringExecutionNamespaceSelectorMatchExpressions(obj) {
|
|
2617
|
+
if (obj === undefined) {
|
|
2618
|
+
return undefined;
|
|
2619
|
+
}
|
|
2620
|
+
const result = {
|
|
2621
|
+
'key': obj.key,
|
|
2622
|
+
'operator': obj.operator,
|
|
2623
|
+
'values': obj.values?.map(y => y),
|
|
2624
|
+
};
|
|
2625
|
+
// filter undefined values
|
|
2626
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2627
|
+
}
|
|
2628
|
+
/**
|
|
2629
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector' to JSON representation.
|
|
2630
|
+
*/
|
|
2631
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2632
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelector(obj) {
|
|
2633
|
+
if (obj === undefined) {
|
|
2634
|
+
return undefined;
|
|
2635
|
+
}
|
|
2636
|
+
const result = {
|
|
2637
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions(y)),
|
|
2638
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
2639
|
+
};
|
|
2640
|
+
// filter undefined values
|
|
2641
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2642
|
+
}
|
|
2643
|
+
/**
|
|
2644
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector' to JSON representation.
|
|
2645
|
+
*/
|
|
2646
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2647
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelector(obj) {
|
|
2648
|
+
if (obj === undefined) {
|
|
2649
|
+
return undefined;
|
|
2650
|
+
}
|
|
2651
|
+
const result = {
|
|
2652
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermNamespaceSelectorMatchExpressions(y)),
|
|
2653
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
2654
|
+
};
|
|
2655
|
+
// filter undefined values
|
|
2656
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2657
|
+
}
|
|
2658
|
+
/**
|
|
2659
|
+
* Converts an object of type 'VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions' to JSON representation.
|
|
2660
|
+
*/
|
|
2661
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2662
|
+
function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringSchedulingIgnoredDuringExecutionLabelSelectorMatchExpressions(obj) {
|
|
2663
|
+
if (obj === undefined) {
|
|
2664
|
+
return undefined;
|
|
2665
|
+
}
|
|
2666
|
+
const result = {
|
|
2667
|
+
'key': obj.key,
|
|
2668
|
+
'operator': obj.operator,
|
|
2669
|
+
'values': obj.values?.map(y => y),
|
|
1298
2670
|
};
|
|
1299
2671
|
// filter undefined values
|
|
1300
2672
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
@@ -1315,6 +2687,152 @@ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityRequiredDuringScheduling
|
|
|
1315
2687
|
// filter undefined values
|
|
1316
2688
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1317
2689
|
}
|
|
2690
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2691
|
+
/**
|
|
2692
|
+
* Specifies the output format of the exposed resources, defaults to "1"
|
|
2693
|
+
*
|
|
2694
|
+
* @schema VinylCacheSpecPodVolumesDownwardApiItemsResourceFieldRefDivisor
|
|
2695
|
+
*/
|
|
2696
|
+
class VinylCacheSpecPodVolumesDownwardApiItemsResourceFieldRefDivisor {
|
|
2697
|
+
value;
|
|
2698
|
+
static fromNumber(value) {
|
|
2699
|
+
return new VinylCacheSpecPodVolumesDownwardApiItemsResourceFieldRefDivisor(value);
|
|
2700
|
+
}
|
|
2701
|
+
static fromString(value) {
|
|
2702
|
+
return new VinylCacheSpecPodVolumesDownwardApiItemsResourceFieldRefDivisor(value);
|
|
2703
|
+
}
|
|
2704
|
+
constructor(value) {
|
|
2705
|
+
this.value = value;
|
|
2706
|
+
}
|
|
2707
|
+
}
|
|
2708
|
+
exports.VinylCacheSpecPodVolumesDownwardApiItemsResourceFieldRefDivisor = VinylCacheSpecPodVolumesDownwardApiItemsResourceFieldRefDivisor;
|
|
2709
|
+
/**
|
|
2710
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecDataSource' to JSON representation.
|
|
2711
|
+
*/
|
|
2712
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2713
|
+
function toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecDataSource(obj) {
|
|
2714
|
+
if (obj === undefined) {
|
|
2715
|
+
return undefined;
|
|
2716
|
+
}
|
|
2717
|
+
const result = {
|
|
2718
|
+
'apiGroup': obj.apiGroup,
|
|
2719
|
+
'kind': obj.kind,
|
|
2720
|
+
'name': obj.name,
|
|
2721
|
+
};
|
|
2722
|
+
// filter undefined values
|
|
2723
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2724
|
+
}
|
|
2725
|
+
/**
|
|
2726
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecDataSourceRef' to JSON representation.
|
|
2727
|
+
*/
|
|
2728
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2729
|
+
function toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecDataSourceRef(obj) {
|
|
2730
|
+
if (obj === undefined) {
|
|
2731
|
+
return undefined;
|
|
2732
|
+
}
|
|
2733
|
+
const result = {
|
|
2734
|
+
'apiGroup': obj.apiGroup,
|
|
2735
|
+
'kind': obj.kind,
|
|
2736
|
+
'name': obj.name,
|
|
2737
|
+
'namespace': obj.namespace,
|
|
2738
|
+
};
|
|
2739
|
+
// filter undefined values
|
|
2740
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2741
|
+
}
|
|
2742
|
+
/**
|
|
2743
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResources' to JSON representation.
|
|
2744
|
+
*/
|
|
2745
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2746
|
+
function toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResources(obj) {
|
|
2747
|
+
if (obj === undefined) {
|
|
2748
|
+
return undefined;
|
|
2749
|
+
}
|
|
2750
|
+
const result = {
|
|
2751
|
+
'limits': ((obj.limits) === undefined) ? undefined : (Object.entries(obj.limits).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.value }), {})),
|
|
2752
|
+
'requests': ((obj.requests) === undefined) ? undefined : (Object.entries(obj.requests).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1]?.value }), {})),
|
|
2753
|
+
};
|
|
2754
|
+
// filter undefined values
|
|
2755
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2756
|
+
}
|
|
2757
|
+
/**
|
|
2758
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecSelector' to JSON representation.
|
|
2759
|
+
*/
|
|
2760
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2761
|
+
function toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecSelector(obj) {
|
|
2762
|
+
if (obj === undefined) {
|
|
2763
|
+
return undefined;
|
|
2764
|
+
}
|
|
2765
|
+
const result = {
|
|
2766
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecSelectorMatchExpressions(y)),
|
|
2767
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
2768
|
+
};
|
|
2769
|
+
// filter undefined values
|
|
2770
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2771
|
+
}
|
|
2772
|
+
/**
|
|
2773
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundleLabelSelector' to JSON representation.
|
|
2774
|
+
*/
|
|
2775
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2776
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundleLabelSelector(obj) {
|
|
2777
|
+
if (obj === undefined) {
|
|
2778
|
+
return undefined;
|
|
2779
|
+
}
|
|
2780
|
+
const result = {
|
|
2781
|
+
'matchExpressions': obj.matchExpressions?.map(y => toJson_VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundleLabelSelectorMatchExpressions(y)),
|
|
2782
|
+
'matchLabels': ((obj.matchLabels) === undefined) ? undefined : (Object.entries(obj.matchLabels).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
|
|
2783
|
+
};
|
|
2784
|
+
// filter undefined values
|
|
2785
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2786
|
+
}
|
|
2787
|
+
/**
|
|
2788
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSourcesConfigMapItems' to JSON representation.
|
|
2789
|
+
*/
|
|
2790
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2791
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSourcesConfigMapItems(obj) {
|
|
2792
|
+
if (obj === undefined) {
|
|
2793
|
+
return undefined;
|
|
2794
|
+
}
|
|
2795
|
+
const result = {
|
|
2796
|
+
'key': obj.key,
|
|
2797
|
+
'mode': obj.mode,
|
|
2798
|
+
'path': obj.path,
|
|
2799
|
+
};
|
|
2800
|
+
// filter undefined values
|
|
2801
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2802
|
+
}
|
|
2803
|
+
/**
|
|
2804
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItems' to JSON representation.
|
|
2805
|
+
*/
|
|
2806
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2807
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItems(obj) {
|
|
2808
|
+
if (obj === undefined) {
|
|
2809
|
+
return undefined;
|
|
2810
|
+
}
|
|
2811
|
+
const result = {
|
|
2812
|
+
'fieldRef': toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsFieldRef(obj.fieldRef),
|
|
2813
|
+
'mode': obj.mode,
|
|
2814
|
+
'path': obj.path,
|
|
2815
|
+
'resourceFieldRef': toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsResourceFieldRef(obj.resourceFieldRef),
|
|
2816
|
+
};
|
|
2817
|
+
// filter undefined values
|
|
2818
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2819
|
+
}
|
|
2820
|
+
/**
|
|
2821
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSourcesSecretItems' to JSON representation.
|
|
2822
|
+
*/
|
|
2823
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2824
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSourcesSecretItems(obj) {
|
|
2825
|
+
if (obj === undefined) {
|
|
2826
|
+
return undefined;
|
|
2827
|
+
}
|
|
2828
|
+
const result = {
|
|
2829
|
+
'key': obj.key,
|
|
2830
|
+
'mode': obj.mode,
|
|
2831
|
+
'path': obj.path,
|
|
2832
|
+
};
|
|
2833
|
+
// filter undefined values
|
|
2834
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2835
|
+
}
|
|
1318
2836
|
/**
|
|
1319
2837
|
* Converts an object of type 'VinylCacheSpecPodAffinityPodAffinityPreferredDuringSchedulingIgnoredDuringExecutionPodAffinityTermLabelSelectorMatchExpressions' to JSON representation.
|
|
1320
2838
|
*/
|
|
@@ -1380,4 +2898,118 @@ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulin
|
|
|
1380
2898
|
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
1381
2899
|
}
|
|
1382
2900
|
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
1383
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlueWwuYmx1ZWR5bmFtaWNzLmV1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydHMvdmlueWwuYmx1ZWR5bmFtaWNzLmV1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNGQSx3REFRQztBQWtJRCxzREFzQkM7QUFrRUQsc0VBYUM7QUE0QkQsb0VBUUM7QUF1QkQsc0VBT0M7QUFxQ0Qsc0VBU0M7QUFtQ0QsOEVBU0M7QUFtQ0QsMEVBU0M7QUF3REQsNERBWUM7QUE0QkQsZ0ZBUUM7QUE2Q0Qsd0VBU0M7QUFvQ0QsZ0VBU0M7QUE0QkQsb0VBUUM7QUE0Q0Qsb0VBVUM7QUE4QkQsNERBUUM7QUFrREQsOEdBV0M7QUF3Q0Qsc0ZBU0M7QUEwREQsZ0ZBWUM7QUFxQkQsMEZBT0M7QUFxQkQsMEZBT0M7QUFxQkQsOEVBT0M7QUFzREQsZ0ZBV0M7QUF1REQsb0ZBU0M7QUFxQ0Qsd0ZBU0M7QUFtQ0Qsc0ZBU0M7QUFxQkQsd0dBT0M7QUE2QkQsc0dBUUM7QUFtQ0QsNEVBU0M7QUE2REQsa0ZBV0M7QUFnQ0Qsb0ZBUUM7QUFnTUQsNEVBcUJDO0FBcUJELDhGQU9DO0FBc0RELGdHQVdDO0FBaUdELG9HQVFDO0FBMENELGtHQVFDO0FBMENELDBHQVFDO0FBd0RELGtNQVFDO0FBeUJELGdNQU9DO0FBNkJELGdNQVFDO0FBdUZELDhMQVlDO0FBNkJELHdNQVFDO0FBdUZELHNNQVlDO0FBNEJELHNOQVFDO0FBOEJELGtPQVFDO0FBa0ZELDhOQVlDO0FBK0JELHdOQVFDO0FBa0NELGdPQVFDO0FBa0ZELHNPQVlDO0FBK0JELGdPQVFDO0FBa0NELHdPQVFDO0FBeUNELHNQQVNDO0FBeUNELDRPQVNDO0FBeUNELGtRQVNDO0FBeUNELHdQQVNDO0FBK0JELHdQQVFDO0FBa0NELGdRQVFDO0FBd0NELHdQQVNDO0FBd0NELGdRQVNDO0FBK0JELGdRQVFDO0FBa0NELHdRQVFDO0FBd0NELGdRQVNDO0FBd0NELHdRQVNDO0FBd0NELHdS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QUM7QUFvREQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0Isd0JBQXdCLENBQUMsR0FBa0M7SUFDekUsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixVQUFVLEVBQUUsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUMxRCxhQUFhLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUssUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNKLGNBQWMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3SyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsaUJBQWlCO1FBQzFDLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2pGLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQXdCRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQixrQ0FBa0MsQ0FBQyxHQUE0QztJQUM3RixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztRQUN0QixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUk7S0FDakIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBeUNEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDhCQUE4QixDQUFDLEdBQXdDO0lBQ3JGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkUsUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsSyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ3pLLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQWdDRDs7R0FFRztBQUNI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QyxRQUFRO1FBQ3hCLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNsQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFDRCxvRkFBb0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZW5lcmF0ZWQgYnkgY2RrOHNcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBpT2JqZWN0TWV0YWRhdGEsIEdyb3VwVmVyc2lvbktpbmQgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuXG4vKipcbiAqIFZpbnlsQ2FjaGUgaXMgdGhlIFNjaGVtYSBmb3IgdGhlIHZpbnlsY2FjaGVzIEFQSS5cbkl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIFZhcm5pc2ggY2FjaGUgY2x1c3RlcjogcmVwbGljYXMsIGJhY2tlbmRzLCBWQ0wgY29uZmlndXJhdGlvbixcbmNsdXN0ZXJpbmcsIGFuZCBjYWNoZSBpbnZhbGlkYXRpb24gc3RyYXRlZ3kuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlIGV4dGVuZHMgQXBpT2JqZWN0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFwaVZlcnNpb24gYW5kIGtpbmQgZm9yIFwiVmlueWxDYWNoZVwiXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdWSzogR3JvdXBWZXJzaW9uS2luZCA9IHtcbiAgICBhcGlWZXJzaW9uOiAndmlueWwuYmx1ZWR5bmFtaWNzLmV1L3YxYWxwaGExJyxcbiAgICBraW5kOiAnVmlueWxDYWNoZScsXG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIEt1YmVybmV0ZXMgbWFuaWZlc3QgZm9yIFwiVmlueWxDYWNoZVwiLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGlubGluZSByZXNvdXJjZSBtYW5pZmVzdHMgaW5zaWRlIG90aGVyIG9iamVjdHMgKGUuZy4gYXMgdGVtcGxhdGVzKS5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIGluaXRpYWxpemF0aW9uIHByb3BzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1hbmlmZXN0KHByb3BzOiBWaW55bENhY2hlUHJvcHMgPSB7fSk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLlZpbnlsQ2FjaGUuR1ZLLFxuICAgICAgLi4udG9Kc29uX1ZpbnlsQ2FjaGVQcm9wcyhwcm9wcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgXCJWaW55bENhY2hlXCIgQVBJIG9iamVjdFxuICAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIG9iamVjdFxuICAgKiBAcGFyYW0gaWQgYSBzY29wZS1sb2NhbCBuYW1lIGZvciB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSBwcm9wcyBpbml0aWFsaXphdGlvbiBwcm9wc1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWaW55bENhY2hlUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4uVmlueWxDYWNoZS5HVkssXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBvYmplY3QgdG8gS3ViZXJuZXRlcyBKU09OLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHRvSnNvbigpOiBhbnkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gc3VwZXIudG9Kc29uKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uVmlueWxDYWNoZS5HVkssXG4gICAgICAuLi50b0pzb25fVmlueWxDYWNoZVByb3BzKHJlc29sdmVkKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVmlueWxDYWNoZSBpcyB0aGUgU2NoZW1hIGZvciB0aGUgdmlueWxjYWNoZXMgQVBJLlxuICogSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgVmFybmlzaCBjYWNoZSBjbHVzdGVyOiByZXBsaWNhcywgYmFja2VuZHMsIFZDTCBjb25maWd1cmF0aW9uLFxuICogY2x1c3RlcmluZywgYW5kIGNhY2hlIGludmFsaWRhdGlvbiBzdHJhdGVneS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlUHJvcHMge1xuICAvKipcbiAgICogQHNjaGVtYSBWaW55bENhY2hlI21ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IEFwaU9iamVjdE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBzcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgdGhlIFZpbnlsQ2FjaGUgY2x1c3Rlci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlI3NwZWNcbiAgICovXG4gIHJlYWRvbmx5IHNwZWM/OiBWaW55bENhY2hlU3BlYztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVByb3BzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVQcm9wcyhvYmo6IFZpbnlsQ2FjaGVQcm9wcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21ldGFkYXRhJzogb2JqLm1ldGFkYXRhLFxuICAgICdzcGVjJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjKG9iai5zcGVjKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNwZWMgZGVmaW5lcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiB0aGUgVmlueWxDYWNoZSBjbHVzdGVyLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlYyB7XG4gIC8qKlxuICAgKiBiYWNrZW5kcyBkZWZpbmVzIHRoZSB1cHN0cmVhbSBzZXJ2aWNlcyBWYXJuaXNoIHdpbGwgcHJveHkgdG8uXG4gICAqIEF0IGxlYXN0IG9uZSBiYWNrZW5kIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2JhY2tlbmRzXG4gICAqL1xuICByZWFkb25seSBiYWNrZW5kczogVmlueWxDYWNoZVNwZWNCYWNrZW5kc1tdO1xuXG4gIC8qKlxuICAgKiBjbHVzdGVyIGNvbmZpZ3VyZXMgVmFybmlzaCBjbHVzdGVyaW5nIGJldHdlZW4gcG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNjbHVzdGVyXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyPzogVmlueWxDYWNoZVNwZWNDbHVzdGVyO1xuXG4gIC8qKlxuICAgKiBkZWJvdW5jZSBjb25maWd1cmVzIGEgZ3JhY2UgcGVyaW9kIGJlZm9yZSBhcHBseWluZyBlbmRwb2ludCBjaGFuZ2VzIHRvIFZhcm5pc2gsXG4gICAqIHByZXZlbnRpbmcgdGh1bmRlcmluZy1oZXJkIG9uIHJhcGlkIGVuZHBvaW50IGNodXJuLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2RlYm91bmNlXG4gICAqL1xuICByZWFkb25seSBkZWJvdW5jZT86IFZpbnlsQ2FjaGVTcGVjRGVib3VuY2U7XG5cbiAgLyoqXG4gICAqIGRpcmVjdG9yIGNvbmZpZ3VyZXMgaG93IFZhcm5pc2ggZGlzdHJpYnV0ZXMgcmVxdWVzdHMgYWNyb3NzIGJhY2tlbmQgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2RpcmVjdG9yXG4gICAqL1xuICByZWFkb25seSBkaXJlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3I7XG5cbiAgLyoqXG4gICAqIGltYWdlIGlzIHRoZSBjb250YWluZXIgaW1hZ2UgZm9yIHRoZSBWYXJuaXNoIHBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjaW1hZ2VcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGludmFsaWRhdGlvbiBjb25maWd1cmVzIGNhY2hlIGludmFsaWRhdGlvbiBtZXRob2RzIChQVVJHRSwgQkFOLCB4a2V5KS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNpbnZhbGlkYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGludmFsaWRhdGlvbj86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uO1xuXG4gIC8qKlxuICAgKiBtb25pdG9yaW5nIGNvbmZpZ3VyZXMgUHJvbWV0aGV1cyBtZXRyaWNzIGFuZCBhbGVydGluZyBydWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNtb25pdG9yaW5nXG4gICAqL1xuICByZWFkb25seSBtb25pdG9yaW5nPzogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nO1xuXG4gIC8qKlxuICAgKiBwb2QgY29uZmlndXJlcyBwb2QtbGV2ZWwgc2NoZWR1bGluZyBhbmQgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjcG9kXG4gICAqL1xuICByZWFkb25seSBwb2Q/OiBWaW55bENhY2hlU3BlY1BvZDtcblxuICAvKipcbiAgICogcHJveHlQcm90b2NvbCBlbmFibGVzIFBST1hZIHByb3RvY29sIG9uIGEgZGVkaWNhdGVkIHBvcnQgZm9yIHBhc3NpbmcgY2xpZW50IElQLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3Byb3h5UHJvdG9jb2xcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5UHJvdG9jb2w/OiBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2w7XG5cbiAgLyoqXG4gICAqIHJlcGxpY2FzIGlzIHRoZSBkZXNpcmVkIG51bWJlciBvZiBWYXJuaXNoIHBvZHMgaW4gdGhlIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjcmVwbGljYXNcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHJlc291cmNlcyBzZXRzIENQVSBhbmQgbWVtb3J5IHJlcXVlc3RzL2xpbWl0cyBmb3IgdGhlIFZhcm5pc2ggY29udGFpbmVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3Jlc291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VzPzogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXM7XG5cbiAgLyoqXG4gICAqIHJldHJ5IGNvbmZpZ3VyZXMgcmV0cnkgYmVoYXZpb3VyIHdoZW4gVkNMIHVwZGF0ZXMgZmFpbCB0byBhcHBseS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNyZXRyeVxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnk/OiBWaW55bENhY2hlU3BlY1JldHJ5O1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlIGNvbmZpZ3VyZXMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSBjcmVhdGVkIGZvciB0cmFmZmljIGluZ3Jlc3MuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjc2VydmljZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZT86IFZpbnlsQ2FjaGVTcGVjU2VydmljZTtcblxuICAvKipcbiAgICogc3RvcmFnZSBjb25maWd1cmVzIG9uZSBvciBtb3JlIFZhcm5pc2ggc3RvcmFnZSBiYWNrZW5kcyAobWFsbG9jIG9yIGZpbGUpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3N0b3JhZ2VcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2U/OiBWaW55bENhY2hlU3BlY1N0b3JhZ2VbXTtcblxuICAvKipcbiAgICogdmFybmlzaFBhcmFtZXRlcnMgYXJlIHJ1bnRpbWUgcGFyYW1ldGVycyBwYXNzZWQgdG8gdmFybmlzaGQgdmlhIC1wIGZsYWdzLlxuICAgKiBDZXJ0YWluIHNlY3VyaXR5LXNlbnNpdGl2ZSBwYXJhbWV0ZXJzIGFyZSBibG9ja2VkIGJ5IHRoZSBhZG1pc3Npb24gd2ViaG9vay5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyN2YXJuaXNoUGFyYW1ldGVyc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFybmlzaFBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiB2Y2wgY29uZmlndXJlcyBWQ0wgZ2VuZXJhdGlvbjogc25pcHBldHMgaW5qZWN0ZWQgaW50byBnZW5lcmF0ZWQgVkNMIHN1YnJvdXRpbmVzLFxuICAgKiBvciBhIGZ1bGwgVkNMIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3ZjbFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsPzogVmlueWxDYWNoZVNwZWNWY2w7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjKG9iajogVmlueWxDYWNoZVNwZWMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiYWNrZW5kcyc6IG9iai5iYWNrZW5kcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHMoeSkpLFxuICAgICdjbHVzdGVyJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlcihvYmouY2x1c3RlciksXG4gICAgJ2RlYm91bmNlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGVib3VuY2Uob2JqLmRlYm91bmNlKSxcbiAgICAnZGlyZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvcihvYmouZGlyZWN0b3IpLFxuICAgICdpbWFnZSc6IG9iai5pbWFnZSxcbiAgICAnaW52YWxpZGF0aW9uJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uKG9iai5pbnZhbGlkYXRpb24pLFxuICAgICdtb25pdG9yaW5nJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyhvYmoubW9uaXRvcmluZyksXG4gICAgJ3BvZCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZChvYmoucG9kKSxcbiAgICAncHJveHlQcm90b2NvbCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wob2JqLnByb3h5UHJvdG9jb2wpLFxuICAgICdyZXBsaWNhcyc6IG9iai5yZXBsaWNhcyxcbiAgICAncmVzb3VyY2VzJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzKG9iai5yZXNvdXJjZXMpLFxuICAgICdyZXRyeSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1JldHJ5KG9iai5yZXRyeSksXG4gICAgJ3NlcnZpY2UnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNTZXJ2aWNlKG9iai5zZXJ2aWNlKSxcbiAgICAnc3RvcmFnZSc6IG9iai5zdG9yYWdlPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNTdG9yYWdlKHkpKSxcbiAgICAndmFybmlzaFBhcmFtZXRlcnMnOiAoKG9iai52YXJuaXNoUGFyYW1ldGVycykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLnZhcm5pc2hQYXJhbWV0ZXJzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAndmNsJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVmNsKG9iai52Y2wpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQmFja2VuZFNwZWMgZGVzY3JpYmVzIGFuIHVwc3RyZWFtIEt1YmVybmV0ZXMgc2VydmljZSB1c2VkIGFzIGEgVmFybmlzaCBiYWNrZW5kLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMge1xuICAvKipcbiAgICogY29ubmVjdGlvblBhcmFtZXRlcnMgY29uZmlndXJlcyBiYWNrZW5kIGNvbm5lY3Rpb24gcG9vbCB0aW1lb3V0cyBhbmQgbGltaXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjY29ubmVjdGlvblBhcmFtZXRlcnNcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25QYXJhbWV0ZXJzPzogVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzO1xuXG4gIC8qKlxuICAgKiBkaXJlY3RvciBvdmVycmlkZXMgdGhlIGNsdXN0ZXItd2lkZSBkaXJlY3RvciBmb3IgdGhpcyBiYWNrZW5kIG9ubHkuXG4gICAqIElmIG5pbCwgYSBzaGFyZCBkaXJlY3RvciB3aXRoIGRlZmF1bHRzIGlzIGdlbmVyYXRlZCwgZ3JvdXBpbmcgYWxsIHJlc29sdmVkXG4gICAqIHBlci1wb2QgYmFja2VuZHMgZm9yIHRoaXMgc2VydmljZVJlZi4gVXNlIFwicm91bmRfcm9iaW5cIiBvciBcInJhbmRvbVwiIGlmXG4gICAqIGNvbnNpc3RlbnQgaGFzaGluZyBpcyB1bmRlc2lyYWJsZSAoZS5nLiBzdGF0ZWxlc3MgYmFja2VuZHMpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjZGlyZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IGRpcmVjdG9yPzogVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yO1xuXG4gIC8qKlxuICAgKiBuYW1lIGlzIHRoZSBWQ0wgaWRlbnRpZmllciBmb3IgdGhpcyBiYWNrZW5kLiBNdXN0IG1hdGNoIF5bYS16QS1aXVthLXpBLVowLTlfXSokLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBwb3J0IG92ZXJyaWRlcyB0aGUgc2VydmljZSBwb3J0IHVzZWQgZm9yIHRoaXMgYmFja2VuZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3BvcnRcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHByb2JlIGNvbmZpZ3VyZXMgdGhlIFZhcm5pc2ggYmFja2VuZCBoZWFsdGggcHJvYmUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kcyNwcm9iZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmU/OiBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmU7XG5cbiAgLyoqXG4gICAqIHNlcnZpY2VSZWYgcmVmZXJlbmNlcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIGluIHRoZSBzYW1lIG5hbWVzcGFjZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3NlcnZpY2VSZWZcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VSZWY6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmO1xuXG4gIC8qKlxuICAgKiB3ZWlnaHQgaXMgdGhlIHJlbGF0aXZlIHdlaWdodCBmb3IgdGhlIGRpcmVjdG9yLiAwIG1lYW5zIHN0YW5kYnkgKGZhbGxiYWNrIGRpcmVjdG9yKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3dlaWdodFxuICAgKi9cbiAgcmVhZG9ubHkgd2VpZ2h0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHMob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29ubmVjdGlvblBhcmFtZXRlcnMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzKG9iai5jb25uZWN0aW9uUGFyYW1ldGVycyksXG4gICAgJ2RpcmVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvcihvYmouZGlyZWN0b3IpLFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ3BvcnQnOiBvYmoucG9ydCxcbiAgICAncHJvYmUnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlKG9iai5wcm9iZSksXG4gICAgJ3NlcnZpY2VSZWYnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWYob2JqLnNlcnZpY2VSZWYpLFxuICAgICd3ZWlnaHQnOiBvYmoud2VpZ2h0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY2x1c3RlciBjb25maWd1cmVzIFZhcm5pc2ggY2x1c3RlcmluZyBiZXR3ZWVuIHBvZHMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0NsdXN0ZXIge1xuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgaW50ZXItcG9kIGNsdXN0ZXJpbmcgdmlhIGEgc2hhcmQgZGlyZWN0b3IuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNDbHVzdGVyI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBwZWVyUm91dGluZyBjb25maWd1cmVzIGhvdyByZXF1ZXN0cyBhcmUgcm91dGVkIGJldHdlZW4gVmFybmlzaCBwZWVycy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXIjcGVlclJvdXRpbmdcbiAgICovXG4gIHJlYWRvbmx5IHBlZXJSb3V0aW5nPzogVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0NsdXN0ZXIob2JqOiBWaW55bENhY2hlU3BlY0NsdXN0ZXIgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ3BlZXJSb3V0aW5nJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nKG9iai5wZWVyUm91dGluZyksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBkZWJvdW5jZSBjb25maWd1cmVzIGEgZ3JhY2UgcGVyaW9kIGJlZm9yZSBhcHBseWluZyBlbmRwb2ludCBjaGFuZ2VzIHRvIFZhcm5pc2gsXG4gKiBwcmV2ZW50aW5nIHRodW5kZXJpbmctaGVyZCBvbiByYXBpZCBlbmRwb2ludCBjaHVybi5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGVib3VuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0RlYm91bmNlIHtcbiAgLyoqXG4gICAqIGR1cmF0aW9uIGlzIHRoZSB0aW1lIHRvIHdhaXQgYWZ0ZXIgdGhlIGxhc3QgZW5kcG9pbnQgY2hhbmdlIGJlZm9yZSBwdXNoaW5nIGEgVkNMIHVwZGF0ZS5cbiAgICogVGhpcyBwcmV2ZW50cyB0aHVuZGVyaW5nLWhlcmQgb24gcmFwaWQgZW5kcG9pbnQgY2h1cm4uIERlZmF1bHQ6IDFzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGVib3VuY2UjZHVyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0RlYm91bmNlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGVib3VuY2Uob2JqOiBWaW55bENhY2hlU3BlY0RlYm91bmNlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZHVyYXRpb24nOiBvYmouZHVyYXRpb24sXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBkaXJlY3RvciBjb25maWd1cmVzIGhvdyBWYXJuaXNoIGRpc3RyaWJ1dGVzIHJlcXVlc3RzIGFjcm9zcyBiYWNrZW5kIGVuZHBvaW50cy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0RpcmVjdG9yIHtcbiAgLyoqXG4gICAqIGhhc2ggY29uZmlndXJlcyB0aGUgaGFzaCBkaXJlY3Rvci4gT25seSB1c2VkIHdoZW4gdHlwZSBpcyBcImhhc2hcIi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yI2hhc2hcbiAgICovXG4gIHJlYWRvbmx5IGhhc2g/OiBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaDtcblxuICAvKipcbiAgICogc2hhcmQgY29uZmlndXJlcyB0aGUgc2hhcmQgZGlyZWN0b3IgKGNvbnNpc3RlbnQtaGFzaCkuIE9ubHkgdXNlZCB3aGVuIHR5cGUgaXMgXCJzaGFyZFwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3Ijc2hhcmRcbiAgICovXG4gIHJlYWRvbmx5IHNoYXJkPzogVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkO1xuXG4gIC8qKlxuICAgKiB0eXBlIHNlbGVjdHMgdGhlIFZhcm5pc2ggZGlyZWN0b3IgYWxnb3JpdGhtLlxuICAgKiBcInNoYXJkXCIgKGRlZmF1bHQpIHByb3ZpZGVzIGNvbnNpc3RlbnQgaGFzaGluZzsgXCJyb3VuZF9yb2JpblwiLCBcInJhbmRvbVwiLCBhbmQgXCJoYXNoXCJcbiAgICogYXJlIGFsc28gc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3IjdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JUeXBlO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0RpcmVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY0RpcmVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnaGFzaCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaChvYmouaGFzaCksXG4gICAgJ3NoYXJkJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZChvYmouc2hhcmQpLFxuICAgICd0eXBlJzogb2JqLnR5cGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBpbnZhbGlkYXRpb24gY29uZmlndXJlcyBjYWNoZSBpbnZhbGlkYXRpb24gbWV0aG9kcyAoUFVSR0UsIEJBTiwgeGtleSkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uIHtcbiAgLyoqXG4gICAqIGJhbiBjb25maWd1cmVzIEJBTi1iYXNlZCBjYWNoZSBpbnZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb24jYmFuXG4gICAqL1xuICByZWFkb25seSBiYW4/OiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhbjtcblxuICAvKipcbiAgICogcHVyZ2UgY29uZmlndXJlcyBIVFRQIFBVUkdFLWJhc2VkIGNhY2hlIGludmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbiNwdXJnZVxuICAgKi9cbiAgcmVhZG9ubHkgcHVyZ2U/OiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlO1xuXG4gIC8qKlxuICAgKiB4a2V5IGNvbmZpZ3VyZXMgeGtleS1iYXNlZCBzdXJyb2dhdGUga2V5IGludmFsaWRhdGlvbiAocmVxdWlyZXMgdm1vZF94a2V5KS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbiN4a2V5XG4gICAqL1xuICByZWFkb25seSB4a2V5PzogVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYmFuJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuKG9iai5iYW4pLFxuICAgICdwdXJnZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlKG9iai5wdXJnZSksXG4gICAgJ3hrZXknOiB0b0pzb25fVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5KG9iai54a2V5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIG1vbml0b3JpbmcgY29uZmlndXJlcyBQcm9tZXRoZXVzIG1ldHJpY3MgYW5kIGFsZXJ0aW5nIHJ1bGVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nIHtcbiAgLyoqXG4gICAqIGVuYWJsZWQgYWN0aXZhdGVzIFByb21ldGhldXMgbWV0cmljcyBzY3JhcGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmcjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHByb21ldGhldXNSdWxlcyBjb25maWd1cmVzIFByb21ldGhldXNSdWxlIG9iamVjdHMgZm9yIGFsZXJ0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyNwcm9tZXRoZXVzUnVsZXNcbiAgICovXG4gIHJlYWRvbmx5IHByb21ldGhldXNSdWxlcz86IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcztcblxuICAvKipcbiAgICogc2VydmljZU1vbml0b3IgY29uZmlndXJlcyBhIFNlcnZpY2VNb25pdG9yIGZvciBQcm9tZXRoZXVzIE9wZXJhdG9yIHNjcmFwaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyNzZXJ2aWNlTW9uaXRvclxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU1vbml0b3I/OiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyhvYmo6IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncHJvbWV0aGV1c1J1bGVzJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcyhvYmoucHJvbWV0aGV1c1J1bGVzKSxcbiAgICAnc2VydmljZU1vbml0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3Iob2JqLnNlcnZpY2VNb25pdG9yKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHBvZCBjb25maWd1cmVzIHBvZC1sZXZlbCBzY2hlZHVsaW5nIGFuZCBtZXRhZGF0YS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2Qge1xuICAvKipcbiAgICogYWZmaW5pdHkgY29uZmlndXJlcyBwb2QgYWZmaW5pdHkgYW5kIGFudGktYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZCNhZmZpbml0eVxuICAgKi9cbiAgcmVhZG9ubHkgYWZmaW5pdHk/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5O1xuXG4gIC8qKlxuICAgKiBhbm5vdGF0aW9ucyBhcmUgYWRkZWQgdG8gZWFjaCBWYXJuaXNoIHBvZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZCNhbm5vdGF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYW5ub3RhdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBsYWJlbHMgYXJlIGFkZGVkIHRvIGVhY2ggVmFybmlzaCBwb2QgKG1lcmdlZCB3aXRoIG9wZXJhdG9yLW1hbmFnZWQgbGFiZWxzKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZCNsYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IGxhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIG5vZGVTZWxlY3RvciBjb25zdHJhaW5zIHBvZHMgdG8gbm9kZXMgbWF0Y2hpbmcgYWxsIHNwZWNpZmllZCBsYWJlbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2Qjbm9kZVNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBub2RlU2VsZWN0b3I/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBwcmlvcml0eUNsYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgUHJpb3JpdHlDbGFzcyBmb3IgVmFybmlzaCBwb2RzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI3ByaW9yaXR5Q2xhc3NOYW1lXG4gICAqL1xuICByZWFkb25seSBwcmlvcml0eUNsYXNzTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogdG9sZXJhdGlvbnMgYWxsb3cgcG9kcyB0byBiZSBzY2hlZHVsZWQgb24gdGFpbnRlZCBub2Rlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZCN0b2xlcmF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgdG9sZXJhdGlvbnM/OiBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kKG9iajogVmlueWxDYWNoZVNwZWNQb2QgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhZmZpbml0eSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5KG9iai5hZmZpbml0eSksXG4gICAgJ2Fubm90YXRpb25zJzogKChvYmouYW5ub3RhdGlvbnMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5hbm5vdGF0aW9ucykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ2xhYmVscyc6ICgob2JqLmxhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmxhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ25vZGVTZWxlY3Rvcic6ICgob2JqLm5vZGVTZWxlY3RvcikgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm5vZGVTZWxlY3RvcikucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ3ByaW9yaXR5Q2xhc3NOYW1lJzogb2JqLnByaW9yaXR5Q2xhc3NOYW1lLFxuICAgICd0b2xlcmF0aW9ucyc6IG9iai50b2xlcmF0aW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcHJveHlQcm90b2NvbCBlbmFibGVzIFBST1hZIHByb3RvY29sIG9uIGEgZGVkaWNhdGVkIHBvcnQgZm9yIHBhc3NpbmcgY2xpZW50IElQLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sIHtcbiAgLyoqXG4gICAqIGVuYWJsZWQgYWN0aXZhdGVzIFBST1hZIHByb3RvY29sIHN1cHBvcnQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBwb3J0IGlzIHRoZSBwb3J0IG9uIHdoaWNoIFBST1hZIHByb3RvY29sIGNvbm5lY3Rpb25zIGFyZSBhY2NlcHRlZC4gRGVmYXVsdDogODA4MS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wjcG9ydFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUHJveHlQcm90b2NvbChvYmo6IFZpbnlsQ2FjaGVTcGVjUHJveHlQcm90b2NvbCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncG9ydCc6IG9iai5wb3J0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcmVzb3VyY2VzIHNldHMgQ1BVIGFuZCBtZW1vcnkgcmVxdWVzdHMvbGltaXRzIGZvciB0aGUgVmFybmlzaCBjb250YWluZXIuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzIHtcbiAgLyoqXG4gICAqIENsYWltcyBsaXN0cyB0aGUgbmFtZXMgb2YgcmVzb3VyY2VzLCBkZWZpbmVkIGluIHNwZWMucmVzb3VyY2VDbGFpbXMsXG4gICAqIHRoYXQgYXJlIHVzZWQgYnkgdGhpcyBjb250YWluZXIuXG4gICAqXG4gICAqIFRoaXMgZmllbGQgZGVwZW5kcyBvbiB0aGVcbiAgICogRHluYW1pY1Jlc291cmNlQWxsb2NhdGlvbiBmZWF0dXJlIGdhdGUuXG4gICAqXG4gICAqIFRoaXMgZmllbGQgaXMgaW1tdXRhYmxlLiBJdCBjYW4gb25seSBiZSBzZXQgZm9yIGNvbnRhaW5lcnMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMjY2xhaW1zXG4gICAqL1xuICByZWFkb25seSBjbGFpbXM/OiBWaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltc1tdO1xuXG4gIC8qKlxuICAgKiBMaW1pdHMgZGVzY3JpYmVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBjb21wdXRlIHJlc291cmNlcyBhbGxvd2VkLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL2NvbmZpZ3VyYXRpb24vbWFuYWdlLXJlc291cmNlcy1jb250YWluZXJzL1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzI2xpbWl0c1xuICAgKi9cbiAgcmVhZG9ubHkgbGltaXRzPzogeyBba2V5OiBzdHJpbmddOiBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyB9O1xuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBkZXNjcmliZXMgdGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbXB1dGUgcmVzb3VyY2VzIHJlcXVpcmVkLlxuICAgKiBJZiBSZXF1ZXN0cyBpcyBvbWl0dGVkIGZvciBhIGNvbnRhaW5lciwgaXQgZGVmYXVsdHMgdG8gTGltaXRzIGlmIHRoYXQgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQsXG4gICAqIG90aGVyd2lzZSB0byBhbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHZhbHVlLiBSZXF1ZXN0cyBjYW5ub3QgZXhjZWVkIExpbWl0cy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9jb25maWd1cmF0aW9uL21hbmFnZS1yZXNvdXJjZXMtY29udGFpbmVycy9cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlcyNyZXF1ZXN0c1xuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdHM/OiB7IFtrZXk6IHN0cmluZ106IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzUmVxdWVzdHMgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMob2JqOiBWaW55bENhY2hlU3BlY1Jlc291cmNlcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2NsYWltcyc6IG9iai5jbGFpbXM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltcyh5KSksXG4gICAgJ2xpbWl0cyc6ICgob2JqLmxpbWl0cykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmxpbWl0cykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0/LnZhbHVlIH0pLCB7fSkpLFxuICAgICdyZXF1ZXN0cyc6ICgob2JqLnJlcXVlc3RzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoucmVxdWVzdHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdPy52YWx1ZSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHJldHJ5IGNvbmZpZ3VyZXMgcmV0cnkgYmVoYXZpb3VyIHdoZW4gVkNMIHVwZGF0ZXMgZmFpbCB0byBhcHBseS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmV0cnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1JldHJ5IHtcbiAgLyoqXG4gICAqIGJhY2tvZmZCYXNlIGlzIHRoZSBpbml0aWFsIGJhY2tvZmYgZHVyYXRpb24gYmV0d2VlbiByZXRyeSBhdHRlbXB0cy4gRGVmYXVsdDogNXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXRyeSNiYWNrb2ZmQmFzZVxuICAgKi9cbiAgcmVhZG9ubHkgYmFja29mZkJhc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGJhY2tvZmZNYXggaXMgdGhlIG1heGltdW0gYmFja29mZiBkdXJhdGlvbiAoZXhwb25lbnRpYWwgYmFja29mZiBjYXApLiBEZWZhdWx0OiA1bS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1JldHJ5I2JhY2tvZmZNYXhcbiAgICovXG4gIHJlYWRvbmx5IGJhY2tvZmZNYXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG1heEF0dGVtcHRzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBWQ0wgcHVzaCBhdHRlbXB0cyBiZWZvcmUgdGhlIG9wZXJhdG9yXG4gICAqIHRyYW5zaXRpb25zIHRvIEVycm9yIHBoYXNlLiBEZWZhdWx0OiAzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmV0cnkjbWF4QXR0ZW1wdHNcbiAgICovXG4gIHJlYWRvbmx5IG1heEF0dGVtcHRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1JldHJ5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmV0cnkob2JqOiBWaW55bENhY2hlU3BlY1JldHJ5IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYmFja29mZkJhc2UnOiBvYmouYmFja29mZkJhc2UsXG4gICAgJ2JhY2tvZmZNYXgnOiBvYmouYmFja29mZk1heCxcbiAgICAnbWF4QXR0ZW1wdHMnOiBvYmoubWF4QXR0ZW1wdHMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZXJ2aWNlIGNvbmZpZ3VyZXMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSBjcmVhdGVkIGZvciB0cmFmZmljIGluZ3Jlc3MuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1NlcnZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1NlcnZpY2Uge1xuICAvKipcbiAgICogYW5ub3RhdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBTZXJ2aWNlIG9iamVjdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1NlcnZpY2UjYW5ub3RhdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGFubm90YXRpb25zPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogdHlwZSBzZXRzIHRoZSBLdWJlcm5ldGVzIFNlcnZpY2UgdHlwZSAoQ2x1c3RlcklQLCBOb2RlUG9ydCwgTG9hZEJhbGFuY2VyKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1NlcnZpY2UjdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IFZpbnlsQ2FjaGVTcGVjU2VydmljZVR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjU2VydmljZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1NlcnZpY2Uob2JqOiBWaW55bENhY2hlU3BlY1NlcnZpY2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbm5vdGF0aW9ucyc6ICgob2JqLmFubm90YXRpb25zKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmouYW5ub3RhdGlvbnMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICAgICd0eXBlJzogb2JqLnR5cGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTdG9yYWdlU3BlYyBjb25maWd1cmVzIGEgVmFybmlzaCBzdG9yYWdlIGJhY2tlbmQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1N0b3JhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1N0b3JhZ2Uge1xuICAvKipcbiAgICogbmFtZSBpcyB0aGUgaW50ZXJuYWwgc3RvcmFnZSBpZGVudGlmaWVyIHVzZWQgaW4gdmFybmlzaGQgLXMgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZSNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHBhdGggaXMgdGhlIGZpbGVzeXN0ZW0gcGF0aCBmb3IgZmlsZS10eXBlIHN0b3JhZ2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlI3BhdGhcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNpemUgaXMgdGhlIHN0b3JhZ2UgYWxsb2NhdGlvbiBhcyBhIEt1YmVybmV0ZXMgcmVzb3VyY2UgcXVhbnRpdHkgKGUuZy4gXCIxR2lcIikuXG4gICAqIFRoZSBvcGVyYXRvciBjb252ZXJ0cyB0byBieXRlcyBmb3IgdmFybmlzaGQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlI3NpemVcbiAgICovXG4gIHJlYWRvbmx5IHNpemU/OiBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplO1xuXG4gIC8qKlxuICAgKiB0eXBlIGlzIHRoZSBzdG9yYWdlIGJhY2tlbmQgdHlwZS4gT25seSBcIm1hbGxvY1wiIGFuZCBcImZpbGVcIiBhcmUgcGVybWl0dGVkLlxuICAgKiBcInBlcnNpc3RlbnRcIiwgXCJ1bWVtXCIsIGFuZCBcImRlZmF1bHRcIiBhcmUgcmVqZWN0ZWQgYnkgdGhlIGFkbWlzc2lvbiB3ZWJob29rLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZSN0eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBWaW55bENhY2hlU3BlY1N0b3JhZ2VUeXBlO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1N0b3JhZ2UnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNTdG9yYWdlKG9iajogVmlueWxDYWNoZVNwZWNTdG9yYWdlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdwYXRoJzogb2JqLnBhdGgsXG4gICAgJ3NpemUnOiBvYmouc2l6ZT8udmFsdWUsXG4gICAgJ3R5cGUnOiBvYmoudHlwZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHZjbCBjb25maWd1cmVzIFZDTCBnZW5lcmF0aW9uOiBzbmlwcGV0cyBpbmplY3RlZCBpbnRvIGdlbmVyYXRlZCBWQ0wgc3Vicm91dGluZXMsXG4gKiBvciBhIGZ1bGwgVkNMIG92ZXJyaWRlLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1ZjbCB7XG4gIC8qKlxuICAgKiBmdWxsT3ZlcnJpZGUgcmVwbGFjZXMgdGhlIGVudGlyZSBnZW5lcmF0ZWQgVkNMIHdpdGggYSBjdXN0b20gVkNMIHN0cmluZy5cbiAgICogVXNlIHdpdGggY2F1dGlvbiDigJQgdGhpcyBkaXNhYmxlcyBhbGwgc3RydWN0dXJlZCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsI2Z1bGxPdmVycmlkZVxuICAgKi9cbiAgcmVhZG9ubHkgZnVsbE92ZXJyaWRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBzbmlwcGV0cyBwcm92aWRlcyBWQ0wgY29kZSBpbmplY3RlZCBpbnRvIGVhY2ggZ2VuZXJhdGVkIHN1YnJvdXRpbmUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2wjc25pcHBldHNcbiAgICovXG4gIHJlYWRvbmx5IHNuaXBwZXRzPzogVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNWY2wnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNWY2wob2JqOiBWaW55bENhY2hlU3BlY1ZjbCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Z1bGxPdmVycmlkZSc6IG9iai5mdWxsT3ZlcnJpZGUsXG4gICAgJ3NuaXBwZXRzJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMob2JqLnNuaXBwZXRzKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNvbm5lY3Rpb25QYXJhbWV0ZXJzIGNvbmZpZ3VyZXMgYmFja2VuZCBjb25uZWN0aW9uIHBvb2wgdGltZW91dHMgYW5kIGxpbWl0cy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyB7XG4gIC8qKlxuICAgKiBiZXR3ZWVuQnl0ZXNUaW1lb3V0IGlzIHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIGJ5dGVzIG9mIHRoZSByZXNwb25zZSBib2R5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyNiZXR3ZWVuQnl0ZXNUaW1lb3V0XG4gICAqL1xuICByZWFkb25seSBiZXR3ZWVuQnl0ZXNUaW1lb3V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBjb25uZWN0VGltZW91dCBpcyB0aGUgbWF4aW11bSB0aW1lIHRvIGVzdGFibGlzaCBhIFRDUCBjb25uZWN0aW9uIHRvIHRoZSBiYWNrZW5kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyNjb25uZWN0VGltZW91dFxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdFRpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGZpcnN0Qnl0ZVRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGZvciB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVzcG9uc2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI2ZpcnN0Qnl0ZVRpbWVvdXRcbiAgICovXG4gIHJlYWRvbmx5IGZpcnN0Qnl0ZVRpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGlkbGVUaW1lb3V0IGlzIHRoZSBtYXhpbXVtIHRpbWUgYW4gaWRsZSBjb25uZWN0aW9uIG1heSBiZSByZXVzZWQuIFNob3VsZCBiZSBsZXNzXG4gICAqIHRoYW4gdGhlIGJhY2tlbmQncyBrZWVwLWFsaXZlIHRpbWVvdXQgdG8gYXZvaWQgNTAzIHJhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyNpZGxlVGltZW91dFxuICAgKi9cbiAgcmVhZG9ubHkgaWRsZVRpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG1heENvbm5lY3Rpb25zIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGNvbm5lY3Rpb25zIHRvIHRoZSBiYWNrZW5kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyNtYXhDb25uZWN0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q29ubmVjdGlvbnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzQ29ubmVjdGlvblBhcmFtZXRlcnMob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzQ29ubmVjdGlvblBhcmFtZXRlcnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiZXR3ZWVuQnl0ZXNUaW1lb3V0Jzogb2JqLmJldHdlZW5CeXRlc1RpbWVvdXQsXG4gICAgJ2Nvbm5lY3RUaW1lb3V0Jzogb2JqLmNvbm5lY3RUaW1lb3V0LFxuICAgICdmaXJzdEJ5dGVUaW1lb3V0Jzogb2JqLmZpcnN0Qnl0ZVRpbWVvdXQsXG4gICAgJ2lkbGVUaW1lb3V0Jzogb2JqLmlkbGVUaW1lb3V0LFxuICAgICdtYXhDb25uZWN0aW9ucyc6IG9iai5tYXhDb25uZWN0aW9ucyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGRpcmVjdG9yIG92ZXJyaWRlcyB0aGUgY2x1c3Rlci13aWRlIGRpcmVjdG9yIGZvciB0aGlzIGJhY2tlbmQgb25seS5cbiAqIElmIG5pbCwgYSBzaGFyZCBkaXJlY3RvciB3aXRoIGRlZmF1bHRzIGlzIGdlbmVyYXRlZCwgZ3JvdXBpbmcgYWxsIHJlc29sdmVkXG4gKiBwZXItcG9kIGJhY2tlbmRzIGZvciB0aGlzIHNlcnZpY2VSZWYuIFVzZSBcInJvdW5kX3JvYmluXCIgb3IgXCJyYW5kb21cIiBpZlxuICogY29uc2lzdGVudCBoYXNoaW5nIGlzIHVuZGVzaXJhYmxlIChlLmcuIHN0YXRlbGVzcyBiYWNrZW5kcykuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3Ige1xuICAvKipcbiAgICogaGFzaCBjb25maWd1cmVzIHRoZSBoYXNoIGRpcmVjdG9yLiBPbmx5IHVzZWQgd2hlbiB0eXBlIGlzIFwiaGFzaFwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvciNoYXNoXG4gICAqL1xuICByZWFkb25seSBoYXNoPzogVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9ySGFzaDtcblxuICAvKipcbiAgICogc2hhcmQgY29uZmlndXJlcyB0aGUgc2hhcmQgZGlyZWN0b3IgKGNvbnNpc3RlbnQtaGFzaCkuIE9ubHkgdXNlZCB3aGVuIHR5cGUgaXMgXCJzaGFyZFwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvciNzaGFyZFxuICAgKi9cbiAgcmVhZG9ubHkgc2hhcmQ/OiBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZDtcblxuICAvKipcbiAgICogdHlwZSBzZWxlY3RzIHRoZSBWYXJuaXNoIGRpcmVjdG9yIGFsZ29yaXRobS5cbiAgICogXCJzaGFyZFwiIChkZWZhdWx0KSBwcm92aWRlcyBjb25zaXN0ZW50IGhhc2hpbmc7IFwicm91bmRfcm9iaW5cIiwgXCJyYW5kb21cIiwgYW5kIFwiaGFzaFwiXG4gICAqIGFyZSBhbHNvIHN1cHBvcnRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3IjdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoYXNoJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3Rvckhhc2gob2JqLmhhc2gpLFxuICAgICdzaGFyZCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZChvYmouc2hhcmQpLFxuICAgICd0eXBlJzogb2JqLnR5cGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwcm9iZSBjb25maWd1cmVzIHRoZSBWYXJuaXNoIGJhY2tlbmQgaGVhbHRoIHByb2JlLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlIHtcbiAgLyoqXG4gICAqIGV4cGVjdGVkUmVzcG9uc2UgaXMgdGhlIGV4cGVjdGVkIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuIERlZmF1bHRzIHRvIDIwMC5cbiAgICpcbiAgICogQGRlZmF1bHQgMjAwLlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSNleHBlY3RlZFJlc3BvbnNlXG4gICAqL1xuICByZWFkb25seSBleHBlY3RlZFJlc3BvbnNlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBpbnRlcnZhbCBpcyBob3cgb2Z0ZW4gdG8gcHJvYmUgdGhlIGJhY2tlbmQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlI2ludGVydmFsXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbD86IHN0cmluZztcblxuICAvKipcbiAgICogdGhyZXNob2xkIGlzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBzdWNjZXNzZnVsIHByb2JlcyB3aXRoaW4gdGhlIHdpbmRvdyBmb3IgdGhlIGJhY2tlbmRcbiAgICogdG8gYmUgY29uc2lkZXJlZCBoZWFsdGh5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSN0aHJlc2hvbGRcbiAgICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogdGltZW91dCBpcyB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGEgcHJvYmUgcmVzcG9uc2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlI3RpbWVvdXRcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHVybCBpcyB0aGUgVVJMIHRvIHByb2JlLiBJZiBlbXB0eSwgdGhlIGJhY2tlbmQncyByb290IHBhdGggaXMgdXNlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUjdXJsXG4gICAqL1xuICByZWFkb25seSB1cmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHdpbmRvdyBpcyB0aGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IHByb2JlcyB0byBjb25zaWRlciBmb3IgdGhyZXNob2xkIGV2YWx1YXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlI3dpbmRvd1xuICAgKi9cbiAgcmVhZG9ubHkgd2luZG93PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlKG9iajogVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZXhwZWN0ZWRSZXNwb25zZSc6IG9iai5leHBlY3RlZFJlc3BvbnNlLFxuICAgICdpbnRlcnZhbCc6IG9iai5pbnRlcnZhbCxcbiAgICAndGhyZXNob2xkJzogb2JqLnRocmVzaG9sZCxcbiAgICAndGltZW91dCc6IG9iai50aW1lb3V0LFxuICAgICd1cmwnOiBvYmoudXJsLFxuICAgICd3aW5kb3cnOiBvYmoud2luZG93LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogc2VydmljZVJlZiByZWZlcmVuY2VzIHRoZSBLdWJlcm5ldGVzIFNlcnZpY2UgaW4gdGhlIHNhbWUgbmFtZXNwYWNlLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZiB7XG4gIC8qKlxuICAgKiBuYW1lIGlzIHRoZSBLdWJlcm5ldGVzIFNlcnZpY2UgbmFtZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZiNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmKG9iajogVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWYgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwZWVyUm91dGluZyBjb25maWd1cmVzIGhvdyByZXF1ZXN0cyBhcmUgcm91dGVkIGJldHdlZW4gVmFybmlzaCBwZWVycy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmcge1xuICAvKipcbiAgICogdHlwZSBpcyB0aGUgcm91dGluZyBzdHJhdGVneSBiZXR3ZWVuIFZhcm5pc2ggcG9kcy4gT25seSBcInNoYXJkXCIgaXMgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nI3R5cGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZ1R5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nKG9iajogVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmcgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICd0eXBlJzogb2JqLnR5cGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBoYXNoIGNvbmZpZ3VyZXMgdGhlIGhhc2ggZGlyZWN0b3IuIE9ubHkgdXNlZCB3aGVuIHR5cGUgaXMgXCJoYXNoXCIuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoIHtcbiAgLyoqXG4gICAqIGhlYWRlciBpcyB0aGUgcmVxdWVzdCBoZWFkZXIgbmFtZSB1c2VkIGFzIHRoZSBoYXNoIGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaCNoZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2gnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2gob2JqOiBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2hlYWRlcic6IG9iai5oZWFkZXIsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzaGFyZCBjb25maWd1cmVzIHRoZSBzaGFyZCBkaXJlY3RvciAoY29uc2lzdGVudC1oYXNoKS4gT25seSB1c2VkIHdoZW4gdHlwZSBpcyBcInNoYXJkXCIuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQge1xuICAvKipcbiAgICogYnkgZGV0ZXJtaW5lcyB3aGF0IHZhbHVlIGlzIGhhc2hlZCBmb3Igc2hhcmQgc2VsZWN0aW9uLiBcIkhBU0hcIiB1c2VzIHRoZSBWYXJuaXNoXG4gICAqIGhhc2ggKGRlZmF1bHQpOyBcIlVSTFwiIHVzZXMgdGhlIHJlcXVlc3QgVVJMLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZCNieVxuICAgKi9cbiAgcmVhZG9ubHkgYnk/OiBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmRCeTtcblxuICAvKipcbiAgICogaGVhbHRoeSBjb250cm9scyB3aGljaCBiYWNrZW5kcyB0aGUgZGlyZWN0b3IgY29uc2lkZXJzIHdoZW4gc2VsZWN0aW5nIGEgc2hhcmQuXG4gICAqIFwiQ0hPU0VOXCIgKGRlZmF1bHQpIG9ubHkgY29uc2lkZXJzIHRoZSBjaG9zZW4gYmFja2VuZCBoZWFsdGh5OyBcIkFMTFwiIHJlcXVpcmVzIGFsbFxuICAgKiBiYWNrZW5kcyB0byBiZSBoZWFsdGh5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZCNoZWFsdGh5XG4gICAqL1xuICByZWFkb25seSBoZWFsdGh5PzogVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkSGVhbHRoeTtcblxuICAvKipcbiAgICogcmFtcHVwIGlzIHRoZSB0aW1lIGFmdGVyIGFkZGluZyBhIGJhY2tlbmQgYmVmb3JlIGl0IHJlY2VpdmVzIGl0cyBmdWxsIHNoYXJlIG9mIHRyYWZmaWMsXG4gICAqIHByZXZlbnRpbmcgdGh1bmRlcmluZy1oZXJkLiBEZWZhdWx0OiAzMHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkI3JhbXB1cFxuICAgKi9cbiAgcmVhZG9ubHkgcmFtcHVwPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiByZXBsaWNhcyBpcyB0aGUgbnVtYmVyIG9mIEtldGFtYSByZXBsaWNhcyBwZXIgYmFja2VuZCBpbiB0aGUgaGFzaCByaW5nLiBEZWZhdWx0OiA2Ny5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQjcmVwbGljYXNcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiB3YXJtdXAgaXMgdGhlIHByb3BvcnRpb24gb2YgcmVxdWVzdHMgKDAuMOKAkzEuMCkgc2VudCB0byB0aGUgYWx0ZXJuYXRpdmUgYmFja2VuZFxuICAgKiB0byBwcmUtcG9wdWxhdGUgaXRzIGNhY2hlLiBEZWZhdWx0OiAwLjEuIE11c3QgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQjd2FybXVwXG4gICAqL1xuICByZWFkb25seSB3YXJtdXA/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQob2JqOiBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdieSc6IG9iai5ieSxcbiAgICAnaGVhbHRoeSc6IG9iai5oZWFsdGh5LFxuICAgICdyYW1wdXAnOiBvYmoucmFtcHVwLFxuICAgICdyZXBsaWNhcyc6IG9iai5yZXBsaWNhcyxcbiAgICAnd2FybXVwJzogb2JqLndhcm11cCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHR5cGUgc2VsZWN0cyB0aGUgVmFybmlzaCBkaXJlY3RvciBhbGdvcml0aG0uXG4gKiBcInNoYXJkXCIgKGRlZmF1bHQpIHByb3ZpZGVzIGNvbnNpc3RlbnQgaGFzaGluZzsgXCJyb3VuZF9yb2JpblwiLCBcInJhbmRvbVwiLCBhbmQgXCJoYXNoXCJcbiAqIGFyZSBhbHNvIHN1cHBvcnRlZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JUeXBlXG4gKi9cbmV4cG9ydCBlbnVtIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JUeXBlIHtcbiAgLyoqIHNoYXJkICovXG4gIFNIQVJEID0gXCJzaGFyZFwiLFxuICAvKiogcm91bmRfcm9iaW4gKi9cbiAgUk9VTkRfVU5ERVJTQ09SRV9ST0JJTiA9IFwicm91bmRfcm9iaW5cIixcbiAgLyoqIHJhbmRvbSAqL1xuICBSQU5ET00gPSBcInJhbmRvbVwiLFxuICAvKiogaGFzaCAqL1xuICBIQVNIID0gXCJoYXNoXCIsXG4gIC8qKiBmYWxsYmFjayAqL1xuICBGQUxMQkFDSyA9IFwiZmFsbGJhY2tcIixcbn1cblxuLyoqXG4gKiBiYW4gY29uZmlndXJlcyBCQU4tYmFzZWQgY2FjaGUgaW52YWxpZGF0aW9uLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhbiB7XG4gIC8qKlxuICAgKiBhbGxvd2VkU291cmNlcyBpcyBhIGxpc3Qgb2YgQ0lEUiByYW5nZXMgcGVybWl0dGVkIHRvIHNlbmQgQkFOIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuI2FsbG93ZWRTb3VyY2VzXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkU291cmNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBlbmFibGVkIGFjdGl2YXRlcyB0aGUgQkFOIGludmFsaWRhdGlvbiBoYW5kbGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiByYXRlTGltaXRQZXJNaW51dGUgbGltaXRzIEJBTiByZXF1ZXN0cyBwZXIgbWludXRlLiAwIG1lYW5zIG5vIGxpbWl0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuI3JhdGVMaW1pdFBlck1pbnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmF0ZUxpbWl0UGVyTWludXRlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhbihvYmo6IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWxsb3dlZFNvdXJjZXMnOiBvYmouYWxsb3dlZFNvdXJjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ3JhdGVMaW1pdFBlck1pbnV0ZSc6IG9iai5yYXRlTGltaXRQZXJNaW51dGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwdXJnZSBjb25maWd1cmVzIEhUVFAgUFVSR0UtYmFzZWQgY2FjaGUgaW52YWxpZGF0aW9uLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2Uge1xuICAvKipcbiAgICogYWxsb3dlZFNvdXJjZXMgaXMgYSBsaXN0IG9mIENJRFIgcmFuZ2VzIHBlcm1pdHRlZCB0byBzZW5kIFBVUkdFIHJlcXVlc3RzLlxuICAgKiBJZiBlbXB0eSwgbm8gc291cmNlIHJlc3RyaWN0aW9uIGlzIGFwcGxpZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZSNhbGxvd2VkU291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZFNvdXJjZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgdGhlIFBVUkdFIGludmFsaWRhdGlvbiBoYW5kbGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2UjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHNvZnQgZW5hYmxlcyBzb2Z0IHB1cmdlcywgd2hpY2ggbWFyayBvYmplY3RzIGFzIGV4cGlyZWQgcmF0aGVyIHRoYW4gcmVtb3ZpbmcgdGhlbS5cbiAgICogVGhpcyBhbGxvd3MgVmFybmlzaCB0byBzZXJ2ZSBzdGFsZSBjb250ZW50IHdoaWxlIHJldmFsaWRhdGluZy4gRGVmYXVsdDogdHJ1ZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlI3NvZnRcbiAgICovXG4gIHJlYWRvbmx5IHNvZnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2Uob2JqOiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWxsb3dlZFNvdXJjZXMnOiBvYmouYWxsb3dlZFNvdXJjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ3NvZnQnOiBvYmouc29mdCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHhrZXkgY29uZmlndXJlcyB4a2V5LWJhc2VkIHN1cnJvZ2F0ZSBrZXkgaW52YWxpZGF0aW9uIChyZXF1aXJlcyB2bW9kX3hrZXkpLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5IHtcbiAgLyoqXG4gICAqIGFsbG93ZWRTb3VyY2VzIGlzIGEgbGlzdCBvZiBDSURSIHJhbmdlcyBwZXJtaXR0ZWQgdG8gc2VuZCB4a2V5IGludmFsaWRhdGlvbiByZXF1ZXN0cy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkjYWxsb3dlZFNvdXJjZXNcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRTb3VyY2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIGVuYWJsZWQgYWN0aXZhdGVzIHhrZXktYmFzZWQgaW52YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleSNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogc29mdFB1cmdlIGVuYWJsZXMgc29mdCBwdXJnaW5nIHZpYSB4a2V5LiBEZWZhdWx0OiB0cnVlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleSNzb2Z0UHVyZ2VcbiAgICovXG4gIHJlYWRvbmx5IHNvZnRQdXJnZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkob2JqOiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbGxvd2VkU291cmNlcyc6IG9iai5hbGxvd2VkU291cmNlcz8ubWFwKHkgPT4geSksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnc29mdFB1cmdlJzogb2JqLnNvZnRQdXJnZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHByb21ldGhldXNSdWxlcyBjb25maWd1cmVzIFByb21ldGhldXNSdWxlIG9iamVjdHMgZm9yIGFsZXJ0aW5nLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzIHtcbiAgLyoqXG4gICAqIGVuYWJsZWQgY3JlYXRlcyBhIFByb21ldGhldXNSdWxlIHdpdGggZGVmYXVsdCBhbGVydGluZyBydWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXMjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXMob2JqOiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZXJ2aWNlTW9uaXRvciBjb25maWd1cmVzIGEgU2VydmljZU1vbml0b3IgZm9yIFByb21ldGhldXMgT3BlcmF0b3Igc2NyYXBpbmcuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yIHtcbiAgLyoqXG4gICAqIGVuYWJsZWQgY3JlYXRlcyBhIFNlcnZpY2VNb25pdG9yIHRhcmdldGluZyB0aGUgVmFybmlzaCBtZXRyaWNzIGVuZHBvaW50LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBpbnRlcnZhbCBpcyB0aGUgc2NyYXBlIGludGVydmFsIChlLmcuIFwiMzBzXCIpLiBEZWZhdWx0cyB0byB0aGUgUHJvbWV0aGV1cyBnbG9iYWwgaW50ZXJ2YWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBQcm9tZXRoZXVzIGdsb2JhbCBpbnRlcnZhbC5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvciNpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yKG9iajogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2ludGVydmFsJzogb2JqLmludGVydmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYWZmaW5pdHkgY29uZmlndXJlcyBwb2QgYWZmaW5pdHkgYW5kIGFudGktYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5IHtcbiAgLyoqXG4gICAqIERlc2NyaWJlcyBub2RlIGFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgZm9yIHRoZSBwb2QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eSNub2RlQWZmaW5pdHlcbiAgICovXG4gIHJlYWRvbmx5IG5vZGVBZmZpbml0eT86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHk7XG5cbiAgLyoqXG4gICAqIERlc2NyaWJlcyBwb2QgYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcyAoZS5nLiBjby1sb2NhdGUgdGhpcyBwb2QgaW4gdGhlIHNhbWUgbm9kZSwgem9uZSwgZXRjLiBhcyBzb21lIG90aGVyIHBvZChzKSkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eSNwb2RBZmZpbml0eVxuICAgKi9cbiAgcmVhZG9ubHkgcG9kQWZmaW5pdHk/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHk7XG5cbiAgLyoqXG4gICAqIERlc2NyaWJlcyBwb2QgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzIChlLmcuIGF2b2lkIHB1dHRpbmcgdGhpcyBwb2QgaW4gdGhlIHNhbWUgbm9kZSwgem9uZSwgZXRjLiBhcyBzb21lIG90aGVyIHBvZChzKSkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eSNwb2RBbnRpQWZmaW5pdHlcbiAgICovXG4gIHJlYWRvbmx5IHBvZEFudGlBZmZpbml0eT86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdub2RlQWZmaW5pdHknOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eShvYmoubm9kZUFmZmluaXR5KSxcbiAgICAncG9kQWZmaW5pdHknOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5KG9iai5wb2RBZmZpbml0eSksXG4gICAgJ3BvZEFudGlBZmZpbml0eSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5KG9iai5wb2RBbnRpQWZmaW5pdHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogVGhlIHBvZCB0aGlzIFRvbGVyYXRpb24gaXMgYXR0YWNoZWQgdG8gdG9sZXJhdGVzIGFueSB0YWludCB0aGF0IG1hdGNoZXNcbiAqIHRoZSB0cmlwbGUgPGtleSx2YWx1ZSxlZmZlY3Q+IHVzaW5nIHRoZSBtYXRjaGluZyBvcGVyYXRvciA8b3BlcmF0b3I+LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMge1xuICAvKipcbiAgICogRWZmZWN0IGluZGljYXRlcyB0aGUgdGFpbnQgZWZmZWN0IHRvIG1hdGNoLiBFbXB0eSBtZWFucyBtYXRjaCBhbGwgdGFpbnQgZWZmZWN0cy5cbiAgICogV2hlbiBzcGVjaWZpZWQsIGFsbG93ZWQgdmFsdWVzIGFyZSBOb1NjaGVkdWxlLCBQcmVmZXJOb1NjaGVkdWxlIGFuZCBOb0V4ZWN1dGUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyNlZmZlY3RcbiAgICovXG4gIHJlYWRvbmx5IGVmZmVjdD86IHN0cmluZztcblxuICAvKipcbiAgICogS2V5IGlzIHRoZSB0YWludCBrZXkgdGhhdCB0aGUgdG9sZXJhdGlvbiBhcHBsaWVzIHRvLiBFbXB0eSBtZWFucyBtYXRjaCBhbGwgdGFpbnQga2V5cy5cbiAgICogSWYgdGhlIGtleSBpcyBlbXB0eSwgb3BlcmF0b3IgbXVzdCBiZSBFeGlzdHM7IHRoaXMgY29tYmluYXRpb24gbWVhbnMgdG8gbWF0Y2ggYWxsIHZhbHVlcyBhbmQgYWxsIGtleXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleT86IHN0cmluZztcblxuICAvKipcbiAgICogT3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byB0aGUgdmFsdWUuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgRXhpc3RzLCBFcXVhbCwgTHQsIGFuZCBHdC4gRGVmYXVsdHMgdG8gRXF1YWwuXG4gICAqIEV4aXN0cyBpcyBlcXVpdmFsZW50IHRvIHdpbGRjYXJkIGZvciB2YWx1ZSwgc28gdGhhdCBhIHBvZCBjYW5cbiAgICogdG9sZXJhdGUgYWxsIHRhaW50cyBvZiBhIHBhcnRpY3VsYXIgY2F0ZWdvcnkuXG4gICAqIEx0IGFuZCBHdCBwZXJmb3JtIG51bWVyaWMgY29tcGFyaXNvbnMgKHJlcXVpcmVzIGZlYXR1cmUgZ2F0ZSBUYWludFRvbGVyYXRpb25Db21wYXJpc29uT3BlcmF0b3JzKS5cbiAgICpcbiAgICogQGRlZmF1bHQgRXF1YWwuXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvbGVyYXRpb25TZWNvbmRzIHJlcHJlc2VudHMgdGhlIHBlcmlvZCBvZiB0aW1lIHRoZSB0b2xlcmF0aW9uICh3aGljaCBtdXN0IGJlXG4gICAqIG9mIGVmZmVjdCBOb0V4ZWN1dGUsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIGlnbm9yZWQpIHRvbGVyYXRlcyB0aGUgdGFpbnQuIEJ5IGRlZmF1bHQsXG4gICAqIGl0IGlzIG5vdCBzZXQsIHdoaWNoIG1lYW5zIHRvbGVyYXRlIHRoZSB0YWludCBmb3JldmVyIChkbyBub3QgZXZpY3QpLiBaZXJvIGFuZFxuICAgKiBuZWdhdGl2ZSB2YWx1ZXMgd2lsbCBiZSB0cmVhdGVkIGFzIDAgKGV2aWN0IGltbWVkaWF0ZWx5KSBieSB0aGUgc3lzdGVtLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMjdG9sZXJhdGlvblNlY29uZHNcbiAgICovXG4gIHJlYWRvbmx5IHRvbGVyYXRpb25TZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBWYWx1ZSBpcyB0aGUgdGFpbnQgdmFsdWUgdGhlIHRvbGVyYXRpb24gbWF0Y2hlcyB0by5cbiAgICogSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cywgdGhlIHZhbHVlIHNob3VsZCBiZSBlbXB0eSwgb3RoZXJ3aXNlIGp1c3QgYSByZWd1bGFyIHN0cmluZy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zI3ZhbHVlXG4gICAqL1xuICByZWFkb25seSB2YWx1ZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VmZmVjdCc6IG9iai5lZmZlY3QsXG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd0b2xlcmF0aW9uU2Vjb25kcyc6IG9iai50b2xlcmF0aW9uU2Vjb25kcyxcbiAgICAndmFsdWUnOiBvYmoudmFsdWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBSZXNvdXJjZUNsYWltIHJlZmVyZW5jZXMgb25lIGVudHJ5IGluIFBvZFNwZWMuUmVzb3VyY2VDbGFpbXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zIHtcbiAgLyoqXG4gICAqIE5hbWUgbXVzdCBtYXRjaCB0aGUgbmFtZSBvZiBvbmUgZW50cnkgaW4gcG9kLnNwZWMucmVzb3VyY2VDbGFpbXMgb2ZcbiAgICogdGhlIFBvZCB3aGVyZSB0aGlzIGZpZWxkIGlzIHVzZWQuIEl0IG1ha2VzIHRoYXQgcmVzb3VyY2UgYXZhaWxhYmxlXG4gICAqIGluc2lkZSBhIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltcyNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgaXMgdGhlIG5hbWUgY2hvc2VuIGZvciBhIHJlcXVlc3QgaW4gdGhlIHJlZmVyZW5jZWQgY2xhaW0uXG4gICAqIElmIGVtcHR5LCBldmVyeXRoaW5nIGZyb20gdGhlIGNsYWltIGlzIG1hZGUgYXZhaWxhYmxlLCBvdGhlcndpc2VcbiAgICogb25seSB0aGUgcmVzdWx0IG9mIHRoaXMgcmVxdWVzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltcyNyZXF1ZXN0XG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdyZXF1ZXN0Jzogb2JqLnJlcXVlc3QsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzTGltaXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyB7XG4gIHB1YmxpYyBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZTogbnVtYmVyKTogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNMaW1pdHMge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNMaW1pdHModmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNMaW1pdHMge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNMaW1pdHModmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgfVxufVxuXG4vKipcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0c1xuICovXG5leHBvcnQgY2xhc3MgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB7XG4gIHB1YmxpYyBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZTogbnVtYmVyKTogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGZyb21TdHJpbmcodmFsdWU6IHN0cmluZyk6IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzUmVxdWVzdHMge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICB9XG59XG5cbi8qKlxuICogdHlwZSBzZXRzIHRoZSBLdWJlcm5ldGVzIFNlcnZpY2UgdHlwZSAoQ2x1c3RlcklQLCBOb2RlUG9ydCwgTG9hZEJhbGFuY2VyKS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZVR5cGVcbiAqL1xuZXhwb3J0IGVudW0gVmlueWxDYWNoZVNwZWNTZXJ2aWNlVHlwZSB7XG4gIC8qKiBDbHVzdGVySVAgKi9cbiAgQ0xVU1RFUl9JUCA9IFwiQ2x1c3RlcklQXCIsXG4gIC8qKiBOb2RlUG9ydCAqL1xuICBOT0RFX1BPUlQgPSBcIk5vZGVQb3J0XCIsXG4gIC8qKiBMb2FkQmFsYW5jZXIgKi9cbiAgTE9BRF9CQUxBTkNFUiA9IFwiTG9hZEJhbGFuY2VyXCIsXG59XG5cbi8qKlxuICogc2l6ZSBpcyB0aGUgc3RvcmFnZSBhbGxvY2F0aW9uIGFzIGEgS3ViZXJuZXRlcyByZXNvdXJjZSBxdWFudGl0eSAoZS5nLiBcIjFHaVwiKS5cbiAqIFRoZSBvcGVyYXRvciBjb252ZXJ0cyB0byBieXRlcyBmb3IgdmFybmlzaGQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemUodmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogVmlueWxDYWNoZVNwZWNTdG9yYWdlU2l6ZSB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiB0eXBlIGlzIHRoZSBzdG9yYWdlIGJhY2tlbmQgdHlwZS4gT25seSBcIm1hbGxvY1wiIGFuZCBcImZpbGVcIiBhcmUgcGVybWl0dGVkLlxuICogXCJwZXJzaXN0ZW50XCIsIFwidW1lbVwiLCBhbmQgXCJkZWZhdWx0XCIgYXJlIHJlamVjdGVkIGJ5IHRoZSBhZG1pc3Npb24gd2ViaG9vay5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVR5cGVcbiAqL1xuZXhwb3J0IGVudW0gVmlueWxDYWNoZVNwZWNTdG9yYWdlVHlwZSB7XG4gIC8qKiBtYWxsb2MgKi9cbiAgTUFMTE9DID0gXCJtYWxsb2NcIixcbiAgLyoqIGZpbGUgKi9cbiAgRklMRSA9IFwiZmlsZVwiLFxufVxuXG4vKipcbiAqIHNuaXBwZXRzIHByb3ZpZGVzIFZDTCBjb2RlIGluamVjdGVkIGludG8gZWFjaCBnZW5lcmF0ZWQgc3Vicm91dGluZS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzIHtcbiAgLyoqXG4gICAqIGhlYWRlciBpcyBpbnNlcnRlZCBhdCB0aGUgdG9wIG9mIHRoZSBWQ0wgZmlsZSwgYmVmb3JlIGFueSBzdWJyb3V0aW5lcy5cbiAgICogVXNlIGZvciBpbXBvcnQgc3RhdGVtZW50cyBhbmQgZ2xvYmFsIGRlY2xhcmF0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI2hlYWRlclxuICAgKi9cbiAgcmVhZG9ubHkgaGVhZGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xCYWNrZW5kRXJyb3IgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfYmFja2VuZF9lcnJvci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEJhY2tlbmRFcnJvclxuICAgKi9cbiAgcmVhZG9ubHkgdmNsQmFja2VuZEVycm9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xCYWNrZW5kRmV0Y2ggaXMgaW5zZXJ0ZWQgaW50byB2Y2xfYmFja2VuZF9mZXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEJhY2tlbmRGZXRjaFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsQmFja2VuZEZldGNoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xCYWNrZW5kUmVzcG9uc2UgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfYmFja2VuZF9yZXNwb25zZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEJhY2tlbmRSZXNwb25zZVxuICAgKi9cbiAgcmVhZG9ubHkgdmNsQmFja2VuZFJlc3BvbnNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xEZWxpdmVyIGlzIGluc2VydGVkIGludG8gdmNsX2RlbGl2ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xEZWxpdmVyXG4gICAqL1xuICByZWFkb25seSB2Y2xEZWxpdmVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xGaW5pIGlzIGluc2VydGVkIGludG8gdmNsX2ZpbmkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xGaW5pXG4gICAqL1xuICByZWFkb25seSB2Y2xGaW5pPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xIYXNoIGlzIGluc2VydGVkIGludG8gdmNsX2hhc2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xIYXNoXG4gICAqL1xuICByZWFkb25seSB2Y2xIYXNoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xIaXQgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfaGl0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsSGl0XG4gICAqL1xuICByZWFkb25seSB2Y2xIaXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEluaXQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgdmNsX2luaXQgc3Vicm91dGluZSBhZnRlciBkaXJlY3RvciBpbml0aWFsaXNhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEluaXRcbiAgICovXG4gIHJlYWRvbmx5IHZjbEluaXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbE1pc3MgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfbWlzcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbE1pc3NcbiAgICovXG4gIHJlYWRvbmx5IHZjbE1pc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbFBhc3MgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfcGFzcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbFBhc3NcbiAgICovXG4gIHJlYWRvbmx5IHZjbFBhc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbFBpcGUgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfcGlwZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbFBpcGVcbiAgICovXG4gIHJlYWRvbmx5IHZjbFBpcGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbFB1cmdlIGlzIGluc2VydGVkIGludG8gdmNsX3B1cmdlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsUHVyZ2VcbiAgICovXG4gIHJlYWRvbmx5IHZjbFB1cmdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xSZWN2IGlzIGluc2VydGVkIGludG8gdmNsX3JlY3YgYWZ0ZXIgZ2VuZXJhdGVkIHJvdXRpbmcgbG9naWMsIGJlZm9yZSByZXR1cm4oKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbFJlY3ZcbiAgICovXG4gIHJlYWRvbmx5IHZjbFJlY3Y/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbFN5bnRoIGlzIGluc2VydGVkIGludG8gdmNsX3N5bnRoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsU3ludGhcbiAgICovXG4gIHJlYWRvbmx5IHZjbFN5bnRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMob2JqOiBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnaGVhZGVyJzogb2JqLmhlYWRlcixcbiAgICAndmNsQmFja2VuZEVycm9yJzogb2JqLnZjbEJhY2tlbmRFcnJvcixcbiAgICAndmNsQmFja2VuZEZldGNoJzogb2JqLnZjbEJhY2tlbmRGZXRjaCxcbiAgICAndmNsQmFja2VuZFJlc3BvbnNlJzogb2JqLnZjbEJhY2tlbmRSZXNwb25zZSxcbiAgICAndmNsRGVsaXZlcic6IG9iai52Y2xEZWxpdmVyLFxuICAgICd2Y2xGaW5pJzogb2JqLnZjbEZpbmksXG4gICAgJ3ZjbEhhc2gnOiBvYmoudmNsSGFzaCxcbiAgICAndmNsSGl0Jzogb2JqLnZjbEhpdCxcbiAgICAndmNsSW5pdCc6IG9iai52Y2xJbml0LFxuICAgICd2Y2xNaXNzJzogb2JqLnZjbE1pc3MsXG4gICAgJ3ZjbFBhc3MnOiBvYmoudmNsUGFzcyxcbiAgICAndmNsUGlwZSc6IG9iai52Y2xQaXBlLFxuICAgICd2Y2xQdXJnZSc6IG9iai52Y2xQdXJnZSxcbiAgICAndmNsUmVjdic6IG9iai52Y2xSZWN2LFxuICAgICd2Y2xTeW50aCc6IG9iai52Y2xTeW50aCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGhhc2ggY29uZmlndXJlcyB0aGUgaGFzaCBkaXJlY3Rvci4gT25seSB1c2VkIHdoZW4gdHlwZSBpcyBcImhhc2hcIi5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3Rvckhhc2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JIYXNoIHtcbiAgLyoqXG4gICAqIGhlYWRlciBpcyB0aGUgcmVxdWVzdCBoZWFkZXIgbmFtZSB1c2VkIGFzIHRoZSBoYXNoIGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JIYXNoI2hlYWRlclxuICAgKi9cbiAgcmVhZG9ubHkgaGVhZGVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JIYXNoJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3Rvckhhc2gob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JIYXNoIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnaGVhZGVyJzogb2JqLmhlYWRlcixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNoYXJkIGNvbmZpZ3VyZXMgdGhlIHNoYXJkIGRpcmVjdG9yIChjb25zaXN0ZW50LWhhc2gpLiBPbmx5IHVzZWQgd2hlbiB0eXBlIGlzIFwic2hhcmRcIi5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmQge1xuICAvKipcbiAgICogYnkgZGV0ZXJtaW5lcyB3aGF0IHZhbHVlIGlzIGhhc2hlZCBmb3Igc2hhcmQgc2VsZWN0aW9uLiBcIkhBU0hcIiB1c2VzIHRoZSBWYXJuaXNoXG4gICAqIGhhc2ggKGRlZmF1bHQpOyBcIlVSTFwiIHVzZXMgdGhlIHJlcXVlc3QgVVJMLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkI2J5XG4gICAqL1xuICByZWFkb25seSBieT86IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkQnk7XG5cbiAgLyoqXG4gICAqIGhlYWx0aHkgY29udHJvbHMgd2hpY2ggYmFja2VuZHMgdGhlIGRpcmVjdG9yIGNvbnNpZGVycyB3aGVuIHNlbGVjdGluZyBhIHNoYXJkLlxuICAgKiBcIkNIT1NFTlwiIChkZWZhdWx0KSBvbmx5IGNvbnNpZGVycyB0aGUgY2hvc2VuIGJhY2tlbmQgaGVhbHRoeTsgXCJBTExcIiByZXF1aXJlcyBhbGxcbiAgICogYmFja2VuZHMgdG8gYmUgaGVhbHRoeS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZCNoZWFsdGh5XG4gICAqL1xuICByZWFkb25seSBoZWFsdGh5PzogVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmRIZWFsdGh5O1xuXG4gIC8qKlxuICAgKiByYW1wdXAgaXMgdGhlIHRpbWUgYWZ0ZXIgYWRkaW5nIGEgYmFja2VuZCBiZWZvcmUgaXQgcmVjZWl2ZXMgaXRzIGZ1bGwgc2hhcmUgb2YgdHJhZmZpYyxcbiAgICogcHJldmVudGluZyB0aHVuZGVyaW5nLWhlcmQuIERlZmF1bHQ6IDMwcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZCNyYW1wdXBcbiAgICovXG4gIHJlYWRvbmx5IHJhbXB1cD86IHN0cmluZztcblxuICAvKipcbiAgICogcmVwbGljYXMgaXMgdGhlIG51bWJlciBvZiBLZXRhbWEgcmVwbGljYXMgcGVyIGJhY2tlbmQgaW4gdGhlIGhhc2ggcmluZy4gRGVmYXVsdDogNjcuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmQjcmVwbGljYXNcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiB3YXJtdXAgaXMgdGhlIHByb3BvcnRpb24gb2YgcmVxdWVzdHMgKDAuMOKAkzEuMCkgc2VudCB0byB0aGUgYWx0ZXJuYXRpdmUgYmFja2VuZFxuICAgKiB0byBwcmUtcG9wdWxhdGUgaXRzIGNhY2hlLiBEZWZhdWx0OiAwLjEuIE11c3QgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZCN3YXJtdXBcbiAgICovXG4gIHJlYWRvbmx5IHdhcm11cD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmQob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2J5Jzogb2JqLmJ5LFxuICAgICdoZWFsdGh5Jzogb2JqLmhlYWx0aHksXG4gICAgJ3JhbXB1cCc6IG9iai5yYW1wdXAsXG4gICAgJ3JlcGxpY2FzJzogb2JqLnJlcGxpY2FzLFxuICAgICd3YXJtdXAnOiBvYmoud2FybXVwLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogdHlwZSBzZWxlY3RzIHRoZSBWYXJuaXNoIGRpcmVjdG9yIGFsZ29yaXRobS5cbiAqIFwic2hhcmRcIiAoZGVmYXVsdCkgcHJvdmlkZXMgY29uc2lzdGVudCBoYXNoaW5nOyBcInJvdW5kX3JvYmluXCIsIFwicmFuZG9tXCIsIGFuZCBcImhhc2hcIlxuICogYXJlIGFsc28gc3VwcG9ydGVkLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yVHlwZVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JUeXBlIHtcbiAgLyoqIHNoYXJkICovXG4gIFNIQVJEID0gXCJzaGFyZFwiLFxuICAvKiogcm91bmRfcm9iaW4gKi9cbiAgUk9VTkRfVU5ERVJTQ09SRV9ST0JJTiA9IFwicm91bmRfcm9iaW5cIixcbiAgLyoqIHJhbmRvbSAqL1xuICBSQU5ET00gPSBcInJhbmRvbVwiLFxuICAvKiogaGFzaCAqL1xuICBIQVNIID0gXCJoYXNoXCIsXG4gIC8qKiBmYWxsYmFjayAqL1xuICBGQUxMQkFDSyA9IFwiZmFsbGJhY2tcIixcbn1cblxuLyoqXG4gKiB0eXBlIGlzIHRoZSByb3V0aW5nIHN0cmF0ZWd5IGJldHdlZW4gVmFybmlzaCBwb2RzLiBPbmx5IFwic2hhcmRcIiBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZ1R5cGVcbiAqL1xuZXhwb3J0IGVudW0gVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmdUeXBlIHtcbiAgLyoqIHNoYXJkICovXG4gIFNIQVJEID0gXCJzaGFyZFwiLFxufVxuXG4vKipcbiAqIGJ5IGRldGVybWluZXMgd2hhdCB2YWx1ZSBpcyBoYXNoZWQgZm9yIHNoYXJkIHNlbGVjdGlvbi4gXCJIQVNIXCIgdXNlcyB0aGUgVmFybmlzaFxuICogaGFzaCAoZGVmYXVsdCk7IFwiVVJMXCIgdXNlcyB0aGUgcmVxdWVzdCBVUkwuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmRCeVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmRCeSB7XG4gIC8qKiBIQVNIICovXG4gIEhBU0ggPSBcIkhBU0hcIixcbiAgLyoqIFVSTCAqL1xuICBVUkwgPSBcIlVSTFwiLFxufVxuXG4vKipcbiAqIGhlYWx0aHkgY29udHJvbHMgd2hpY2ggYmFja2VuZHMgdGhlIGRpcmVjdG9yIGNvbnNpZGVycyB3aGVuIHNlbGVjdGluZyBhIHNoYXJkLlxuICogXCJDSE9TRU5cIiAoZGVmYXVsdCkgb25seSBjb25zaWRlcnMgdGhlIGNob3NlbiBiYWNrZW5kIGhlYWx0aHk7IFwiQUxMXCIgcmVxdWlyZXMgYWxsXG4gKiBiYWNrZW5kcyB0byBiZSBoZWFsdGh5LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkSGVhbHRoeVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmRIZWFsdGh5IHtcbiAgLyoqIENIT1NFTiAqL1xuICBDSE9TRU4gPSBcIkNIT1NFTlwiLFxuICAvKiogQUxMICovXG4gIEFMTCA9IFwiQUxMXCIsXG59XG5cbi8qKlxuICogRGVzY3JpYmVzIG5vZGUgYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcyBmb3IgdGhlIHBvZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBzY2hlZHVsZXIgd2lsbCBwcmVmZXIgdG8gc2NoZWR1bGUgcG9kcyB0byBub2RlcyB0aGF0IHNhdGlzZnlcbiAgICogdGhlIGFmZmluaXR5IGV4cHJlc3Npb25zIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkLCBidXQgaXQgbWF5IGNob29zZVxuICAgKiBhIG5vZGUgdGhhdCB2aW9sYXRlcyBvbmUgb3IgbW9yZSBvZiB0aGUgZXhwcmVzc2lvbnMuIFRoZSBub2RlIHRoYXQgaXNcbiAgICogbW9zdCBwcmVmZXJyZWQgaXMgdGhlIG9uZSB3aXRoIHRoZSBncmVhdGVzdCBzdW0gb2Ygd2VpZ2h0cywgaS5lLlxuICAgKiBmb3IgZWFjaCBub2RlIHRoYXQgbWVldHMgYWxsIG9mIHRoZSBzY2hlZHVsaW5nIHJlcXVpcmVtZW50cyAocmVzb3VyY2VcbiAgICogcmVxdWVzdCwgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nIGFmZmluaXR5IGV4cHJlc3Npb25zLCBldGMuKSxcbiAgICogY29tcHV0ZSBhIHN1bSBieSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZWxlbWVudHMgb2YgdGhpcyBmaWVsZCBhbmQgYWRkaW5nXG4gICAqIFwid2VpZ2h0XCIgdG8gdGhlIHN1bSBpZiB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoRXhwcmVzc2lvbnM7IHRoZVxuICAgKiBub2RlKHMpIHdpdGggdGhlIGhpZ2hlc3Qgc3VtIGFyZSB0aGUgbW9zdCBwcmVmZXJyZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eSNwcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25bXTtcblxuICAvKipcbiAgICogSWYgdGhlIGFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBhcmUgbm90IG1ldCBhdFxuICAgKiBzY2hlZHVsaW5nIHRpbWUsIHRoZSBwb2Qgd2lsbCBub3QgYmUgc2NoZWR1bGVkIG9udG8gdGhlIG5vZGUuXG4gICAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gICAqIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHBvZCBleGVjdXRpb24gKGUuZy4gZHVlIHRvIGFuIHVwZGF0ZSksIHRoZSBzeXN0ZW1cbiAgICogbWF5IG9yIG1heSBub3QgdHJ5IHRvIGV2ZW50dWFsbHkgZXZpY3QgdGhlIHBvZCBmcm9tIGl0cyBub2RlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHkjcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHkob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nOiBvYmoucHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24oeSkpLFxuICAgICdyZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iai5yZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIERlc2NyaWJlcyBwb2QgYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcyAoZS5nLiBjby1sb2NhdGUgdGhpcyBwb2QgaW4gdGhlIHNhbWUgbm9kZSwgem9uZSwgZXRjLiBhcyBzb21lIG90aGVyIHBvZChzKSkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHkge1xuICAvKipcbiAgICogVGhlIHNjaGVkdWxlciB3aWxsIHByZWZlciB0byBzY2hlZHVsZSBwb2RzIHRvIG5vZGVzIHRoYXQgc2F0aXNmeVxuICAgKiB0aGUgYWZmaW5pdHkgZXhwcmVzc2lvbnMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQsIGJ1dCBpdCBtYXkgY2hvb3NlXG4gICAqIGEgbm9kZSB0aGF0IHZpb2xhdGVzIG9uZSBvciBtb3JlIG9mIHRoZSBleHByZXNzaW9ucy4gVGhlIG5vZGUgdGhhdCBpc1xuICAgKiBtb3N0IHByZWZlcnJlZCBpcyB0aGUgb25lIHdpdGggdGhlIGdyZWF0ZXN0IHN1bSBvZiB3ZWlnaHRzLCBpLmUuXG4gICAqIGZvciBlYWNoIG5vZGUgdGhhdCBtZWV0cyBhbGwgb2YgdGhlIHNjaGVkdWxpbmcgcmVxdWlyZW1lbnRzIChyZXNvdXJjZVxuICAgKiByZXF1ZXN0LCByZXF1aXJlZER1cmluZ1NjaGVkdWxpbmcgYWZmaW5pdHkgZXhwcmVzc2lvbnMsIGV0Yy4pLFxuICAgKiBjb21wdXRlIGEgc3VtIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBlbGVtZW50cyBvZiB0aGlzIGZpZWxkIGFuZCBhZGRpbmdcbiAgICogXCJ3ZWlnaHRcIiB0byB0aGUgc3VtIGlmIHRoZSBub2RlIGhhcyBwb2RzIHdoaWNoIG1hdGNoZXMgdGhlIGNvcnJlc3BvbmRpbmcgcG9kQWZmaW5pdHlUZXJtOyB0aGVcbiAgICogbm9kZShzKSB3aXRoIHRoZSBoaWdoZXN0IHN1bSBhcmUgdGhlIG1vc3QgcHJlZmVycmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eSNwcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbltdO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgYWZmaW5pdHkgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkIGFyZSBub3QgbWV0IGF0XG4gICAqIHNjaGVkdWxpbmcgdGltZSwgdGhlIHBvZCB3aWxsIG5vdCBiZSBzY2hlZHVsZWQgb250byB0aGUgbm9kZS5cbiAgICogSWYgdGhlIGFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBjZWFzZSB0byBiZSBtZXRcbiAgICogYXQgc29tZSBwb2ludCBkdXJpbmcgcG9kIGV4ZWN1dGlvbiAoZS5nLiBkdWUgdG8gYSBwb2QgbGFiZWwgdXBkYXRlKSwgdGhlXG4gICAqIHN5c3RlbSBtYXkgb3IgbWF5IG5vdCB0cnkgdG8gZXZlbnR1YWxseSBldmljdCB0aGUgcG9kIGZyb20gaXRzIG5vZGUuXG4gICAqIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzLCB0aGUgbGlzdHMgb2Ygbm9kZXMgY29ycmVzcG9uZGluZyB0byBlYWNoXG4gICAqIHBvZEFmZmluaXR5VGVybSBhcmUgaW50ZXJzZWN0ZWQsIGkuZS4gYWxsIHRlcm1zIG11c3QgYmUgc2F0aXNmaWVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eSNyZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbltdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5KG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nOiBvYmoucHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbih5KSksXG4gICAgJ3JlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nOiBvYmoucmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24oeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogRGVzY3JpYmVzIHBvZCBhbnRpLWFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgKGUuZy4gYXZvaWQgcHV0dGluZyB0aGlzIHBvZCBpbiB0aGUgc2FtZSBub2RlLCB6b25lLCBldGMuIGFzIHNvbWUgb3RoZXIgcG9kKHMpKS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBzY2hlZHVsZXIgd2lsbCBwcmVmZXIgdG8gc2NoZWR1bGUgcG9kcyB0byBub2RlcyB0aGF0IHNhdGlzZnlcbiAgICogdGhlIGFudGktYWZmaW5pdHkgZXhwcmVzc2lvbnMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQsIGJ1dCBpdCBtYXkgY2hvb3NlXG4gICAqIGEgbm9kZSB0aGF0IHZpb2xhdGVzIG9uZSBvciBtb3JlIG9mIHRoZSBleHByZXNzaW9ucy4gVGhlIG5vZGUgdGhhdCBpc1xuICAgKiBtb3N0IHByZWZlcnJlZCBpcyB0aGUgb25lIHdpdGggdGhlIGdyZWF0ZXN0IHN1bSBvZiB3ZWlnaHRzLCBpLmUuXG4gICAqIGZvciBlYWNoIG5vZGUgdGhhdCBtZWV0cyBhbGwgb2YgdGhlIHNjaGVkdWxpbmcgcmVxdWlyZW1lbnRzIChyZXNvdXJjZVxuICAgKiByZXF1ZXN0LCByZXF1aXJlZER1cmluZ1NjaGVkdWxpbmcgYW50aS1hZmZpbml0eSBleHByZXNzaW9ucywgZXRjLiksXG4gICAqIGNvbXB1dGUgYSBzdW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGVsZW1lbnRzIG9mIHRoaXMgZmllbGQgYW5kIHN1YnRyYWN0aW5nXG4gICAqIFwid2VpZ2h0XCIgZnJvbSB0aGUgc3VtIGlmIHRoZSBub2RlIGhhcyBwb2RzIHdoaWNoIG1hdGNoZXMgdGhlIGNvcnJlc3BvbmRpbmcgcG9kQWZmaW5pdHlUZXJtOyB0aGVcbiAgICogbm9kZShzKSB3aXRoIHRoZSBoaWdoZXN0IHN1bSBhcmUgdGhlIG1vc3QgcHJlZmVycmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHkjcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uW107XG5cbiAgLyoqXG4gICAqIElmIHRoZSBhbnRpLWFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBhcmUgbm90IG1ldCBhdFxuICAgKiBzY2hlZHVsaW5nIHRpbWUsIHRoZSBwb2Qgd2lsbCBub3QgYmUgc2NoZWR1bGVkIG9udG8gdGhlIG5vZGUuXG4gICAqIElmIHRoZSBhbnRpLWFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBjZWFzZSB0byBiZSBtZXRcbiAgICogYXQgc29tZSBwb2ludCBkdXJpbmcgcG9kIGV4ZWN1dGlvbiAoZS5nLiBkdWUgdG8gYSBwb2QgbGFiZWwgdXBkYXRlKSwgdGhlXG4gICAqIHN5c3RlbSBtYXkgb3IgbWF5IG5vdCB0cnkgdG8gZXZlbnR1YWxseSBldmljdCB0aGUgcG9kIGZyb20gaXRzIG5vZGUuXG4gICAqIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzLCB0aGUgbGlzdHMgb2Ygbm9kZXMgY29ycmVzcG9uZGluZyB0byBlYWNoXG4gICAqIHBvZEFmZmluaXR5VGVybSBhcmUgaW50ZXJzZWN0ZWQsIGkuZS4gYWxsIHRlcm1zIG11c3QgYmUgc2F0aXNmaWVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHkjcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbic6IG9iai5wcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbih5KSksXG4gICAgJ3JlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nOiBvYmoucmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGJ5IGRldGVybWluZXMgd2hhdCB2YWx1ZSBpcyBoYXNoZWQgZm9yIHNoYXJkIHNlbGVjdGlvbi4gXCJIQVNIXCIgdXNlcyB0aGUgVmFybmlzaFxuICogaGFzaCAoZGVmYXVsdCk7IFwiVVJMXCIgdXNlcyB0aGUgcmVxdWVzdCBVUkwuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZEJ5XG4gKi9cbmV4cG9ydCBlbnVtIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkQnkge1xuICAvKiogSEFTSCAqL1xuICBIQVNIID0gXCJIQVNIXCIsXG4gIC8qKiBVUkwgKi9cbiAgVVJMID0gXCJVUkxcIixcbn1cblxuLyoqXG4gKiBoZWFsdGh5IGNvbnRyb2xzIHdoaWNoIGJhY2tlbmRzIHRoZSBkaXJlY3RvciBjb25zaWRlcnMgd2hlbiBzZWxlY3RpbmcgYSBzaGFyZC5cbiAqIFwiQ0hPU0VOXCIgKGRlZmF1bHQpIG9ubHkgY29uc2lkZXJzIHRoZSBjaG9zZW4gYmFja2VuZCBoZWFsdGh5OyBcIkFMTFwiIHJlcXVpcmVzIGFsbFxuICogYmFja2VuZHMgdG8gYmUgaGVhbHRoeS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkSGVhbHRoeVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZEhlYWx0aHkge1xuICAvKiogQ0hPU0VOICovXG4gIENIT1NFTiA9IFwiQ0hPU0VOXCIsXG4gIC8qKiBBTEwgKi9cbiAgQUxMID0gXCJBTExcIixcbn1cblxuLyoqXG4gKiBBbiBlbXB0eSBwcmVmZXJyZWQgc2NoZWR1bGluZyB0ZXJtIG1hdGNoZXMgYWxsIG9iamVjdHMgd2l0aCBpbXBsaWNpdCB3ZWlnaHQgMFxuICogKGkuZS4gaXQncyBhIG5vLW9wKS4gQSBudWxsIHByZWZlcnJlZCBzY2hlZHVsaW5nIHRlcm0gbWF0Y2hlcyBubyBvYmplY3RzIChpLmUuIGlzIGFsc28gYSBuby1vcCkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogQSBub2RlIHNlbGVjdG9yIHRlcm0sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3ByZWZlcmVuY2VcbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcmVuY2U6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdlaWdodCBhc3NvY2lhdGVkIHdpdGggbWF0Y2hpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZVNlbGVjdG9yVGVybSwgaW4gdGhlIHJhbmdlIDEtMTAwLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiN3ZWlnaHRcbiAgICovXG4gIHJlYWRvbmx5IHdlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZmVyZW5jZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlKG9iai5wcmVmZXJlbmNlKSxcbiAgICAnd2VpZ2h0Jzogb2JqLndlaWdodCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgYXJlIG5vdCBtZXQgYXRcbiAqIHNjaGVkdWxpbmcgdGltZSwgdGhlIHBvZCB3aWxsIG5vdCBiZSBzY2hlZHVsZWQgb250byB0aGUgbm9kZS5cbiAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gKiBhdCBzb21lIHBvaW50IGR1cmluZyBwb2QgZXhlY3V0aW9uIChlLmcuIGR1ZSB0byBhbiB1cGRhdGUpLCB0aGUgc3lzdGVtXG4gKiBtYXkgb3IgbWF5IG5vdCB0cnkgdG8gZXZlbnR1YWxseSBldmljdCB0aGUgcG9kIGZyb20gaXRzIG5vZGUuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHtcbiAgLyoqXG4gICAqIFJlcXVpcmVkLiBBIGxpc3Qgb2Ygbm9kZSBzZWxlY3RvciB0ZXJtcy4gVGhlIHRlcm1zIGFyZSBPUmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI25vZGVTZWxlY3RvclRlcm1zXG4gICAqL1xuICByZWFkb25seSBub2RlU2VsZWN0b3JUZXJtczogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbm9kZVNlbGVjdG9yVGVybXMnOiBvYmoubm9kZVNlbGVjdG9yVGVybXM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRoZSB3ZWlnaHRzIG9mIGFsbCBvZiB0aGUgbWF0Y2hlZCBXZWlnaHRlZFBvZEFmZmluaXR5VGVybSBmaWVsZHMgYXJlIGFkZGVkIHBlci1ub2RlIHRvIGZpbmQgdGhlIG1vc3QgcHJlZmVycmVkIG5vZGUocylcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogUmVxdWlyZWQuIEEgcG9kIGFmZmluaXR5IHRlcm0sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jcG9kQWZmaW5pdHlUZXJtXG4gICAqL1xuICByZWFkb25seSBwb2RBZmZpbml0eVRlcm06IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtO1xuXG4gIC8qKlxuICAgKiB3ZWlnaHQgYXNzb2NpYXRlZCB3aXRoIG1hdGNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybSxcbiAgICogaW4gdGhlIHJhbmdlIDEtMTAwLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3dlaWdodFxuICAgKi9cbiAgcmVhZG9ubHkgd2VpZ2h0OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwb2RBZmZpbml0eVRlcm0nOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqLnBvZEFmZmluaXR5VGVybSksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIGEgc2V0IG9mIHBvZHMgKG5hbWVseSB0aG9zZSBtYXRjaGluZyB0aGUgbGFiZWxTZWxlY3RvclxuICogcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZShzKSkgdGhhdCB0aGlzIHBvZCBzaG91bGQgYmVcbiAqIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCxcbiAqIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZSB3aG9zZSB2YWx1ZSBvZlxuICogdGhlIGxhYmVsIHdpdGgga2V5IDx0b3BvbG9neUtleT4gbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoXG4gKiBhIHBvZCBvZiB0aGUgc2V0IG9mIHBvZHMgaXMgcnVubmluZ1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogQSBsYWJlbCBxdWVyeSBvdmVyIGEgc2V0IG9mIHJlc291cmNlcywgaW4gdGhpcyBjYXNlIHBvZHMuXG4gICAqIElmIGl0J3MgbnVsbCwgdGhpcyBQb2RBZmZpbml0eVRlcm0gbWF0Y2hlcyB3aXRoIG5vIFBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIE1hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1pc21hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IG5vdGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtaXNtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWlzbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBuYW1lc3BhY2VzIHNwZWNpZmllcyBhIHN0YXRpYyBsaXN0IG9mIG5hbWVzcGFjZSBuYW1lcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gICAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBzZWxlY3RlZCBieSBuYW1lc3BhY2VTZWxlY3Rvci5cbiAgICogbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgYW5kIG51bGwgbmFtZXNwYWNlU2VsZWN0b3IgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jdG9wb2xvZ3lLZXlcbiAgICovXG4gIHJlYWRvbmx5IHRvcG9sb2d5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsYWJlbFNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yKG9iai5sYWJlbFNlbGVjdG9yKSxcbiAgICAnbWF0Y2hMYWJlbEtleXMnOiBvYmoubWF0Y2hMYWJlbEtleXM/Lm1hcCh5ID0+IHkpLFxuICAgICdtaXNtYXRjaExhYmVsS2V5cyc6IG9iai5taXNtYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ25hbWVzcGFjZVNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRoZSB3ZWlnaHRzIG9mIGFsbCBvZiB0aGUgbWF0Y2hlZCBXZWlnaHRlZFBvZEFmZmluaXR5VGVybSBmaWVsZHMgYXJlIGFkZGVkIHBlci1ub2RlIHRvIGZpbmQgdGhlIG1vc3QgcHJlZmVycmVkIG5vZGUocylcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBSZXF1aXJlZC4gQSBwb2QgYWZmaW5pdHkgdGVybSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHdlaWdodC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jcG9kQWZmaW5pdHlUZXJtXG4gICAqL1xuICByZWFkb25seSBwb2RBZmZpbml0eVRlcm06IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybTtcblxuICAvKipcbiAgICogd2VpZ2h0IGFzc29jaWF0ZWQgd2l0aCBtYXRjaGluZyB0aGUgY29ycmVzcG9uZGluZyBwb2RBZmZpbml0eVRlcm0sXG4gICAqIGluIHRoZSByYW5nZSAxLTEwMC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jd2VpZ2h0XG4gICAqL1xuICByZWFkb25seSB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3BvZEFmZmluaXR5VGVybSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqLnBvZEFmZmluaXR5VGVybSksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIGEgc2V0IG9mIHBvZHMgKG5hbWVseSB0aG9zZSBtYXRjaGluZyB0aGUgbGFiZWxTZWxlY3RvclxuICogcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZShzKSkgdGhhdCB0aGlzIHBvZCBzaG91bGQgYmVcbiAqIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCxcbiAqIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZSB3aG9zZSB2YWx1ZSBvZlxuICogdGhlIGxhYmVsIHdpdGgga2V5IDx0b3BvbG9neUtleT4gbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoXG4gKiBhIHBvZCBvZiB0aGUgc2V0IG9mIHBvZHMgaXMgcnVubmluZ1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBNYXRjaExhYmVsS2V5cyBpcyBhIHNldCBvZiBwb2QgbGFiZWwga2V5cyB0byBzZWxlY3Qgd2hpY2ggcG9kcyB3aWxsXG4gICAqIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIGtleXMgYXJlIHVzZWQgdG8gbG9va3VwIHZhbHVlcyBmcm9tIHRoZVxuICAgKiBpbmNvbWluZyBwb2QgbGFiZWxzLCB0aG9zZSBrZXktdmFsdWUgbGFiZWxzIGFyZSBtZXJnZWQgd2l0aCBgbGFiZWxTZWxlY3RvcmAgYXMgYGtleSBpbiAodmFsdWUpYFxuICAgKiB0byBzZWxlY3QgdGhlIGdyb3VwIG9mIGV4aXN0aW5nIHBvZHMgd2hpY2ggcG9kcyB3aWxsIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgKiBmb3IgdGhlIGluY29taW5nIHBvZCdzIHBvZCAoYW50aSkgYWZmaW5pdHkuIEtleXMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgaW5jb21pbmdcbiAgICogcG9kIGxhYmVscyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBUaGUgc2FtZSBrZXkgaXMgZm9yYmlkZGVuIHRvIGV4aXN0IGluIGJvdGggbWF0Y2hMYWJlbEtleXMgYW5kIGxhYmVsU2VsZWN0b3IuXG4gICAqIEFsc28sIG1hdGNoTGFiZWxLZXlzIGNhbm5vdCBiZSBzZXQgd2hlbiBsYWJlbFNlbGVjdG9yIGlzbid0IHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI25hbWVzcGFjZVNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3RvcG9sb2d5S2V5XG4gICAqL1xuICByZWFkb25seSB0b3BvbG9neUtleTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbGFiZWxTZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbm9kZSBzZWxlY3RvciB0ZXJtLCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgd2VpZ2h0LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2Uge1xuICAvKipcbiAgICogQSBsaXN0IG9mIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnRzIGJ5IG5vZGUncyBsYWJlbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZU1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnRzIGJ5IG5vZGUncyBmaWVsZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSNtYXRjaEZpZWxkc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hGaWVsZHM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHNbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hGaWVsZHMnOiBvYmoubWF0Y2hGaWVsZHM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBudWxsIG9yIGVtcHR5IG5vZGUgc2VsZWN0b3IgdGVybSBtYXRjaGVzIG5vIG9iamVjdHMuIFRoZSByZXF1aXJlbWVudHMgb2ZcbiAqIHRoZW0gYXJlIEFORGVkLlxuICogVGhlIFRvcG9sb2d5U2VsZWN0b3JUZXJtIHR5cGUgaW1wbGVtZW50cyBhIHN1YnNldCBvZiB0aGUgTm9kZVNlbGVjdG9yVGVybS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50cyBieSBub2RlJ3MgbGFiZWxzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50cyBieSBub2RlJ3MgZmllbGRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMjbWF0Y2hGaWVsZHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRmllbGRzPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoRmllbGRzJzogb2JqLm1hdGNoRmllbGRzPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFJlcXVpcmVkLiBBIHBvZCBhZmZpbml0eSB0ZXJtLCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgd2VpZ2h0LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBNYXRjaExhYmVsS2V5cyBpcyBhIHNldCBvZiBwb2QgbGFiZWwga2V5cyB0byBzZWxlY3Qgd2hpY2ggcG9kcyB3aWxsXG4gICAqIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIGtleXMgYXJlIHVzZWQgdG8gbG9va3VwIHZhbHVlcyBmcm9tIHRoZVxuICAgKiBpbmNvbWluZyBwb2QgbGFiZWxzLCB0aG9zZSBrZXktdmFsdWUgbGFiZWxzIGFyZSBtZXJnZWQgd2l0aCBgbGFiZWxTZWxlY3RvcmAgYXMgYGtleSBpbiAodmFsdWUpYFxuICAgKiB0byBzZWxlY3QgdGhlIGdyb3VwIG9mIGV4aXN0aW5nIHBvZHMgd2hpY2ggcG9kcyB3aWxsIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgKiBmb3IgdGhlIGluY29taW5nIHBvZCdzIHBvZCAoYW50aSkgYWZmaW5pdHkuIEtleXMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgaW5jb21pbmdcbiAgICogcG9kIGxhYmVscyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBUaGUgc2FtZSBrZXkgaXMgZm9yYmlkZGVuIHRvIGV4aXN0IGluIGJvdGggbWF0Y2hMYWJlbEtleXMgYW5kIGxhYmVsU2VsZWN0b3IuXG4gICAqIEFsc28sIG1hdGNoTGFiZWxLZXlzIGNhbm5vdCBiZSBzZXQgd2hlbiBsYWJlbFNlbGVjdG9yIGlzbid0IHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI25hbWVzcGFjZVNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI3RvcG9sb2d5S2V5XG4gICAqL1xuICByZWFkb25seSB0b3BvbG9neUtleTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbGFiZWxTZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIG1hdGNoTGFiZWxzIGlzIGEgbWFwIG9mIHtrZXksdmFsdWV9IHBhaXJzLiBBIHNpbmdsZSB7a2V5LHZhbHVlfSBpbiB0aGUgbWF0Y2hMYWJlbHNcbiAgICogbWFwIGlzIGVxdWl2YWxlbnQgdG8gYW4gZWxlbWVudCBvZiBtYXRjaEV4cHJlc3Npb25zLCB3aG9zZSBrZXkgZmllbGQgaXMgXCJrZXlcIiwgdGhlXG4gICAqIG9wZXJhdG9yIGlzIFwiSW5cIiwgYW5kIHRoZSB2YWx1ZXMgYXJyYXkgY29udGFpbnMgb25seSBcInZhbHVlXCIuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIG1hdGNoTGFiZWxzIGlzIGEgbWFwIG9mIHtrZXksdmFsdWV9IHBhaXJzLiBBIHNpbmdsZSB7a2V5LHZhbHVlfSBpbiB0aGUgbWF0Y2hMYWJlbHNcbiAgICogbWFwIGlzIGVxdWl2YWxlbnQgdG8gYW4gZWxlbWVudCBvZiBtYXRjaEV4cHJlc3Npb25zLCB3aG9zZSBrZXkgZmllbGQgaXMgXCJrZXlcIiwgdGhlXG4gICAqIG9wZXJhdG9yIGlzIFwiSW5cIiwgYW5kIHRoZSB2YWx1ZXMgYXJyYXkgY29udGFpbnMgb25seSBcInZhbHVlXCIuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBSZXF1aXJlZC4gQSBwb2QgYWZmaW5pdHkgdGVybSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHdlaWdodC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbGFiZWxTZWxlY3RvclxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIE1hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI21pc21hdGNoTGFiZWxLZXlzXG4gICAqL1xuICByZWFkb25seSBtaXNtYXRjaExhYmVsS2V5cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgc2VsZWN0ZWQgYnkgdGhpcyBmaWVsZFxuICAgKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICAgKiBudWxsIHNlbGVjdG9yIGFuZCBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqIEFuIGVtcHR5IHNlbGVjdG9yICh7fSkgbWF0Y2hlcyBhbGwgbmFtZXNwYWNlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI25hbWVzcGFjZXNcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhpcyBwb2Qgc2hvdWxkIGJlIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCB0aGUgcG9kcyBtYXRjaGluZ1xuICAgKiB0aGUgbGFiZWxTZWxlY3RvciBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZXMsIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZVxuICAgKiB3aG9zZSB2YWx1ZSBvZiB0aGUgbGFiZWwgd2l0aCBrZXkgdG9wb2xvZ3lLZXkgbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoIGFueSBvZiB0aGVcbiAgICogc2VsZWN0ZWQgcG9kcyBpcyBydW5uaW5nLlxuICAgKiBFbXB0eSB0b3BvbG9neUtleSBpcyBub3QgYWxsb3dlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jdG9wb2xvZ3lLZXlcbiAgICovXG4gIHJlYWRvbmx5IHRvcG9sb2d5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsYWJlbFNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3Iob2JqLm5hbWVzcGFjZVNlbGVjdG9yKSxcbiAgICAnbmFtZXNwYWNlcyc6IG9iai5uYW1lc3BhY2VzPy5tYXAoeSA9PiB5KSxcbiAgICAndG9wb2xvZ3lLZXknOiBvYmoudG9wb2xvZ3lLZXksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAqIElmIGl0J3MgbnVsbCwgdGhpcyBQb2RBZmZpbml0eVRlcm0gbWF0Y2hlcyB3aXRoIG5vIFBvZHMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogbWF0Y2hMYWJlbHMgaXMgYSBtYXAgb2Yge2tleSx2YWx1ZX0gcGFpcnMuIEEgc2luZ2xlIHtrZXksdmFsdWV9IGluIHRoZSBtYXRjaExhYmVsc1xuICAgKiBtYXAgaXMgZXF1aXZhbGVudCB0byBhbiBlbGVtZW50IG9mIG1hdGNoRXhwcmVzc2lvbnMsIHdob3NlIGtleSBmaWVsZCBpcyBcImtleVwiLCB0aGVcbiAgICogb3BlcmF0b3IgaXMgXCJJblwiLCBhbmQgdGhlIHZhbHVlcyBhcnJheSBjb250YWlucyBvbmx5IFwidmFsdWVcIi4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgc2VsZWN0ZWQgYnkgdGhpcyBmaWVsZFxuICogYW5kIHRoZSBvbmVzIGxpc3RlZCBpbiB0aGUgbmFtZXNwYWNlcyBmaWVsZC5cbiAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAqIEFuIGVtcHR5IHNlbGVjdG9yICh7fSkgbWF0Y2hlcyBhbGwgbmFtZXNwYWNlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogbWF0Y2hMYWJlbHMgaXMgYSBtYXAgb2Yge2tleSx2YWx1ZX0gcGFpcnMuIEEgc2luZ2xlIHtrZXksdmFsdWV9IGluIHRoZSBtYXRjaExhYmVsc1xuICAgKiBtYXAgaXMgZXF1aXZhbGVudCB0byBhbiBlbGVtZW50IG9mIG1hdGNoRXhwcmVzc2lvbnMsIHdob3NlIGtleSBmaWVsZCBpcyBcImtleVwiLCB0aGVcbiAgICogb3BlcmF0b3IgaXMgXCJJblwiLCBhbmQgdGhlIHZhbHVlcyBhcnJheSBjb250YWlucyBvbmx5IFwidmFsdWVcIi4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3JcbiAqIHRoYXQgcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIFRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cywgRG9lc05vdEV4aXN0LiBHdCwgYW5kIEx0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBHdCBvciBMdCwgdGhlIHZhbHVlc1xuICAgKiBhcnJheSBtdXN0IGhhdmUgYSBzaW5nbGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyLlxuICAgKiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpYyBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3JcbiAqIHRoYXQgcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cywgRG9lc05vdEV4aXN0LiBHdCwgYW5kIEx0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gSWYgdGhlIG9wZXJhdG9yIGlzIEluIG9yIE5vdEluLFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzIG9yIERvZXNOb3RFeGlzdCxcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIGVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgR3Qgb3IgTHQsIHRoZSB2YWx1ZXNcbiAgICogYXJyYXkgbXVzdCBoYXZlIGEgc2luZ2xlIGVsZW1lbnQsIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlci5cbiAgICogVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWMgbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZU1hdGNoRmllbGRzI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvclxuICogdGhhdCByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzLCBEb2VzTm90RXhpc3QuIEd0LCBhbmQgTHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEd0IG9yIEx0LCB0aGUgdmFsdWVzXG4gICAqIGFycmF5IG11c3QgaGF2ZSBhIHNpbmdsZSBlbGVtZW50LCB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuIGludGVnZXIuXG4gICAqIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvclxuICogdGhhdCByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyB7XG4gIC8qKlxuICAgKiBUaGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzLCBEb2VzTm90RXhpc3QuIEd0LCBhbmQgTHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBHdCBvciBMdCwgdGhlIHZhbHVlc1xuICAgKiBhcnJheSBtdXN0IGhhdmUgYSBzaW5nbGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyLlxuICAgKiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpYyBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zTWF0Y2hGaWVsZHMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBtYXRjaEV4cHJlc3Npb25zIGlzIGEgbGlzdCBvZiBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudHMuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3IjbWF0Y2hMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3IgdGhhdFxuICogcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogb3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byBhIHNldCBvZiB2YWx1ZXMuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgSW4sIE5vdEluLCBFeGlzdHMgYW5kIERvZXNOb3RFeGlzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIGEgc2V0IG9mIHJlc291cmNlcywgaW4gdGhpcyBjYXNlIHBvZHMuXG4gKiBJZiBpdCdzIG51bGwsIHRoaXMgUG9kQWZmaW5pdHlUZXJtIG1hdGNoZXMgd2l0aCBubyBQb2RzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIHNlbGVjdGVkIGJ5IHRoaXMgZmllbGRcbiAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gKiBudWxsIHNlbGVjdG9yIGFuZCBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gKiBBbiBlbXB0eSBzZWxlY3RvciAoe30pIG1hdGNoZXMgYWxsIG5hbWVzcGFjZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2YWx1ZXMgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gSWYgdGhlIG9wZXJhdG9yIGlzIEluIG9yIE5vdEluLFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzIG9yIERvZXNOb3RFeGlzdCxcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIGVtcHR5LiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpY1xuICAgKiBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3IgdGhhdFxuICogcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogb3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byBhIHNldCBvZiB2YWx1ZXMuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgSW4sIE5vdEluLCBFeGlzdHMgYW5kIERvZXNOb3RFeGlzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuIl19
|
|
2901
|
+
/**
|
|
2902
|
+
* @schema VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesLimits
|
|
2903
|
+
*/
|
|
2904
|
+
class VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesLimits {
|
|
2905
|
+
value;
|
|
2906
|
+
static fromNumber(value) {
|
|
2907
|
+
return new VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesLimits(value);
|
|
2908
|
+
}
|
|
2909
|
+
static fromString(value) {
|
|
2910
|
+
return new VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesLimits(value);
|
|
2911
|
+
}
|
|
2912
|
+
constructor(value) {
|
|
2913
|
+
this.value = value;
|
|
2914
|
+
}
|
|
2915
|
+
}
|
|
2916
|
+
exports.VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesLimits = VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesLimits;
|
|
2917
|
+
/**
|
|
2918
|
+
* @schema VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesRequests
|
|
2919
|
+
*/
|
|
2920
|
+
class VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesRequests {
|
|
2921
|
+
value;
|
|
2922
|
+
static fromNumber(value) {
|
|
2923
|
+
return new VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesRequests(value);
|
|
2924
|
+
}
|
|
2925
|
+
static fromString(value) {
|
|
2926
|
+
return new VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesRequests(value);
|
|
2927
|
+
}
|
|
2928
|
+
constructor(value) {
|
|
2929
|
+
this.value = value;
|
|
2930
|
+
}
|
|
2931
|
+
}
|
|
2932
|
+
exports.VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesRequests = VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecResourcesRequests;
|
|
2933
|
+
/**
|
|
2934
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecSelectorMatchExpressions' to JSON representation.
|
|
2935
|
+
*/
|
|
2936
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2937
|
+
function toJson_VinylCacheSpecPodVolumesEphemeralVolumeClaimTemplateSpecSelectorMatchExpressions(obj) {
|
|
2938
|
+
if (obj === undefined) {
|
|
2939
|
+
return undefined;
|
|
2940
|
+
}
|
|
2941
|
+
const result = {
|
|
2942
|
+
'key': obj.key,
|
|
2943
|
+
'operator': obj.operator,
|
|
2944
|
+
'values': obj.values?.map(y => y),
|
|
2945
|
+
};
|
|
2946
|
+
// filter undefined values
|
|
2947
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2948
|
+
}
|
|
2949
|
+
/**
|
|
2950
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundleLabelSelectorMatchExpressions' to JSON representation.
|
|
2951
|
+
*/
|
|
2952
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2953
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSourcesClusterTrustBundleLabelSelectorMatchExpressions(obj) {
|
|
2954
|
+
if (obj === undefined) {
|
|
2955
|
+
return undefined;
|
|
2956
|
+
}
|
|
2957
|
+
const result = {
|
|
2958
|
+
'key': obj.key,
|
|
2959
|
+
'operator': obj.operator,
|
|
2960
|
+
'values': obj.values?.map(y => y),
|
|
2961
|
+
};
|
|
2962
|
+
// filter undefined values
|
|
2963
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2964
|
+
}
|
|
2965
|
+
/**
|
|
2966
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsFieldRef' to JSON representation.
|
|
2967
|
+
*/
|
|
2968
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2969
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsFieldRef(obj) {
|
|
2970
|
+
if (obj === undefined) {
|
|
2971
|
+
return undefined;
|
|
2972
|
+
}
|
|
2973
|
+
const result = {
|
|
2974
|
+
'apiVersion': obj.apiVersion,
|
|
2975
|
+
'fieldPath': obj.fieldPath,
|
|
2976
|
+
};
|
|
2977
|
+
// filter undefined values
|
|
2978
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2979
|
+
}
|
|
2980
|
+
/**
|
|
2981
|
+
* Converts an object of type 'VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsResourceFieldRef' to JSON representation.
|
|
2982
|
+
*/
|
|
2983
|
+
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2984
|
+
function toJson_VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsResourceFieldRef(obj) {
|
|
2985
|
+
if (obj === undefined) {
|
|
2986
|
+
return undefined;
|
|
2987
|
+
}
|
|
2988
|
+
const result = {
|
|
2989
|
+
'containerName': obj.containerName,
|
|
2990
|
+
'divisor': obj.divisor?.value,
|
|
2991
|
+
'resource': obj.resource,
|
|
2992
|
+
};
|
|
2993
|
+
// filter undefined values
|
|
2994
|
+
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
|
|
2995
|
+
}
|
|
2996
|
+
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
|
|
2997
|
+
/**
|
|
2998
|
+
* Specifies the output format of the exposed resources, defaults to "1"
|
|
2999
|
+
*
|
|
3000
|
+
* @schema VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsResourceFieldRefDivisor
|
|
3001
|
+
*/
|
|
3002
|
+
class VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsResourceFieldRefDivisor {
|
|
3003
|
+
value;
|
|
3004
|
+
static fromNumber(value) {
|
|
3005
|
+
return new VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsResourceFieldRefDivisor(value);
|
|
3006
|
+
}
|
|
3007
|
+
static fromString(value) {
|
|
3008
|
+
return new VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsResourceFieldRefDivisor(value);
|
|
3009
|
+
}
|
|
3010
|
+
constructor(value) {
|
|
3011
|
+
this.value = value;
|
|
3012
|
+
}
|
|
3013
|
+
}
|
|
3014
|
+
exports.VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsResourceFieldRefDivisor = VinylCacheSpecPodVolumesProjectedSourcesDownwardApiItemsResourceFieldRefDivisor;
|
|
3015
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlueWwuYmx1ZWR5bmFtaWNzLmV1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydHMvdmlueWwuYmx1ZWR5bmFtaWNzLmV1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNGQSx3REFRQztBQThJRCxzREF1QkM7QUFrRUQsc0VBYUM7QUE0QkQsb0VBUUM7QUF1QkQsc0VBT0M7QUFxQ0Qsc0VBU0M7QUFtQ0QsOEVBU0M7QUEyQ0QsMEVBVUM7QUFnRkQsNERBY0M7QUE0QkQsZ0ZBUUM7QUE2Q0Qsd0VBU0M7QUFvQ0QsZ0VBU0M7QUE0QkQsb0VBUUM7QUE0Q0Qsb0VBVUM7QUE4QkQsNERBUUM7QUE0REQsOEZBV0M7QUFrREQsOEdBV0M7QUF3Q0Qsc0ZBU0M7QUEwREQsZ0ZBWUM7QUFxQkQsMEZBT0M7QUFxQkQsMEZBT0M7QUFxQkQsOEVBT0M7QUFzREQsZ0ZBV0M7QUF1REQsb0ZBU0M7QUFxQ0Qsd0ZBU0M7QUFtQ0Qsc0ZBU0M7QUE4Q0QsMEZBVUM7QUFxQkQsd0dBT0M7QUE2QkQsc0dBUUM7QUFtQ0QsNEVBU0M7QUE2REQsa0ZBV0M7QUE0RkQsb0ZBYUM7QUF5VEQsMEVBcUNDO0FBZ0NELG9GQVFDO0FBZ01ELDRFQXFCQztBQTJIRCxzR0FlQztBQStIRCwwR0FjQztBQXFCRCw4RkFPQztBQXNERCxnR0FXQztBQW1GRCxvR0FRQztBQTZDRCw0R0FTQztBQXdDRCxvR0FRQztBQTBDRCxrR0FRQztBQTBDRCwwR0FRQztBQXNERCxrSEFVQztBQThERCw0RkFZQztBQXNDRCw0RkFTQztBQWdFRCxzRkFZQztBQW9ERCxzRkFVQztBQTJERCw0RkFVQztBQTJERCxnRkFXQztBQW9DRCxnR0FRQztBQXFDRCwwRkFRQztBQWdFRCw0RkFPQztBQXNERCw4RUFXQztBQTBERCw4RkFXQztBQThCRCx3RkFRQztBQXlERCw0R0FVQztBQXlDRCx3RkFTQztBQXdDRCw0RkFTQztBQXFDRCwwRkFRQztBQW1ERCxvRkFRQztBQXdHRCxvRkFpQkM7QUF5Q0QsZ0ZBU0M7QUFnQ0Qsb0hBUUM7QUErQkQsa0hBUUM7QUF5Q0Qsc0dBU0M7QUFrQ0QsNEZBUUM7QUFrRUQsd0ZBWUM7QUE0RkQsZ0ZBY0M7QUErRkQsd0ZBZ0JDO0FBeURELHNGQVVDO0FBNERELDRGQVdDO0FBOENELG9HQVVDO0FBNENELDBIQVNDO0FBb0VELGdJQVVDO0FBb0NELHdIQVFDO0FBOEJELHNIQVFDO0FBeUZELDhIQVlDO0FBc0NELDhJQVFDO0FBMkRELHdIQVFDO0FBeURELGtNQVFDO0FBeUJELGdNQU9DO0FBNkJELGdNQVFDO0FBdUZELDhMQVlDO0FBNkJELHdNQVFDO0FBdUZELHNNQVlDO0FBMEJELHdHQU9DO0FBMEJELHdHQU9DO0FBMkNELHNHQVNDO0FBNkJELHdIQU9DO0FBZ0RELDBHQVVDO0FBMEVELGtJQVFDO0FBNkJELGdIQU9DO0FBeUJELHNHQU9DO0FBc0dELDBHQVlDO0FBNkJELGtHQU9DO0FBMEJELDBHQU9DO0FBMkNELGdHQVNDO0FBMEJELDhHQU9DO0FBb0VELHNKQVNDO0FBNEJELHNOQVFDO0FBOEJELGtPQVFDO0FBa0ZELDhOQVlDO0FBK0JELHdOQVFDO0FBa0NELGdPQVFDO0FBa0ZELHNPQVlDO0FBK0JELGdPQVFDO0FBa0NELHdPQVFDO0FBNEJELDBIQVFDO0FBb0NELDBJQVNDO0FBNkhELDBJQWVDO0FBdUVELDhJQVdDO0FBNkNELDRIQVNDO0FBcUJELGdJQU9DO0FBbUpELHNJQWFDO0FBNkNELHNIQVNDO0FBNkNELGdKQVNDO0FBeUNELHNQQVNDO0FBeUNELDRPQVNDO0FBeUNELGtRQVNDO0FBeUNELHdQQVNDO0FBK0JELHdQQVFDO0FBa0NELGdRQVFDO0FBd0NELHdQQVNDO0FBd0NELGdRQVNDO0FBK0JELGdRQVFDO0FBa0NELHdRQVFDO0FBd0NELGdRQVNDO0FBd0NELHdRQVNDO0FBNERELDhKQVNDO0FBb0VELG9LQVVDO0FBb0NELDRKQVFDO0FBOEJELDBKQVFDO0FBaUNELHdLQVFDO0FBMkNELHNJQVNDO0FBZ0RELDBJQVVDO0FBMkNE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QUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUE0RUQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0Isd0JBQXdCLENBQUMsR0FBa0M7SUFDekUsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixVQUFVLEVBQUUsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUMxRCxhQUFhLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUssUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxD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LG9CQUFvQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdE0sVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4SyxZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyx5REFBeUQsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRyxrQ0FBa0MsRUFBRSxHQUFHLENBQUMsZ0NBQWdD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LEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLHNEQUFzRCxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEssVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFD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Q0FBQyxhQUFhO1FBQ2xDLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUs7UUFDN0IsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRO0tBQ3pCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQUNELG9GQUFvRjtBQUVwRjs7OztHQUlHO0FBQ0gsTUFBYSwrRUFBK0U7SUFPdEQ7SUFON0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sSUFBSSwrRUFBK0UsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBQ00sTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sSUFBSSwrRUFBK0UsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBQ0QsWUFBb0MsS0FBc0I7UUFBdEIsVUFBSyxHQUFMLEtBQUssQ0FBaUI7SUFDMUQsQ0FBQztDQUNGO0FBVEQsMEtBU0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZW5lcmF0ZWQgYnkgY2RrOHNcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBpT2JqZWN0TWV0YWRhdGEsIEdyb3VwVmVyc2lvbktpbmQgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuXG4vKipcbiAqIFZpbnlsQ2FjaGUgaXMgdGhlIFNjaGVtYSBmb3IgdGhlIHZpbnlsY2FjaGVzIEFQSS5cbkl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIFZhcm5pc2ggY2FjaGUgY2x1c3RlcjogcmVwbGljYXMsIGJhY2tlbmRzLCBWQ0wgY29uZmlndXJhdGlvbixcbmNsdXN0ZXJpbmcsIGFuZCBjYWNoZSBpbnZhbGlkYXRpb24gc3RyYXRlZ3kuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlIGV4dGVuZHMgQXBpT2JqZWN0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFwaVZlcnNpb24gYW5kIGtpbmQgZm9yIFwiVmlueWxDYWNoZVwiXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdWSzogR3JvdXBWZXJzaW9uS2luZCA9IHtcbiAgICBhcGlWZXJzaW9uOiAndmlueWwuYmx1ZWR5bmFtaWNzLmV1L3YxYWxwaGExJyxcbiAgICBraW5kOiAnVmlueWxDYWNoZScsXG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIEt1YmVybmV0ZXMgbWFuaWZlc3QgZm9yIFwiVmlueWxDYWNoZVwiLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGlubGluZSByZXNvdXJjZSBtYW5pZmVzdHMgaW5zaWRlIG90aGVyIG9iamVjdHMgKGUuZy4gYXMgdGVtcGxhdGVzKS5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIGluaXRpYWxpemF0aW9uIHByb3BzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1hbmlmZXN0KHByb3BzOiBWaW55bENhY2hlUHJvcHMgPSB7fSk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLlZpbnlsQ2FjaGUuR1ZLLFxuICAgICAgLi4udG9Kc29uX1ZpbnlsQ2FjaGVQcm9wcyhwcm9wcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgXCJWaW55bENhY2hlXCIgQVBJIG9iamVjdFxuICAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIG9iamVjdFxuICAgKiBAcGFyYW0gaWQgYSBzY29wZS1sb2NhbCBuYW1lIGZvciB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSBwcm9wcyBpbml0aWFsaXphdGlvbiBwcm9wc1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWaW55bENhY2hlUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4uVmlueWxDYWNoZS5HVkssXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBvYmplY3QgdG8gS3ViZXJuZXRlcyBKU09OLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHRvSnNvbigpOiBhbnkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gc3VwZXIudG9Kc29uKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uVmlueWxDYWNoZS5HVkssXG4gICAgICAuLi50b0pzb25fVmlueWxDYWNoZVByb3BzKHJlc29sdmVkKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVmlueWxDYWNoZSBpcyB0aGUgU2NoZW1hIGZvciB0aGUgdmlueWxjYWNoZXMgQVBJLlxuICogSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgVmFybmlzaCBjYWNoZSBjbHVzdGVyOiByZXBsaWNhcywgYmFja2VuZHMsIFZDTCBjb25maWd1cmF0aW9uLFxuICogY2x1c3RlcmluZywgYW5kIGNhY2hlIGludmFsaWRhdGlvbiBzdHJhdGVneS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlUHJvcHMge1xuICAvKipcbiAgICogQHNjaGVtYSBWaW55bENhY2hlI21ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IEFwaU9iamVjdE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBzcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgdGhlIFZpbnlsQ2FjaGUgY2x1c3Rlci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlI3NwZWNcbiAgICovXG4gIHJlYWRvbmx5IHNwZWM/OiBWaW55bENhY2hlU3BlYztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVByb3BzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVQcm9wcyhvYmo6IFZpbnlsQ2FjaGVQcm9wcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21ldGFkYXRhJzogb2JqLm1ldGFkYXRhLFxuICAgICdzcGVjJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjKG9iai5zcGVjKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNwZWMgZGVmaW5lcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiB0aGUgVmlueWxDYWNoZSBjbHVzdGVyLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlYyB7XG4gIC8qKlxuICAgKiBiYWNrZW5kcyBkZWZpbmVzIHRoZSB1cHN0cmVhbSBzZXJ2aWNlcyBWYXJuaXNoIHdpbGwgcHJveHkgdG8uXG4gICAqIEF0IGxlYXN0IG9uZSBiYWNrZW5kIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2JhY2tlbmRzXG4gICAqL1xuICByZWFkb25seSBiYWNrZW5kczogVmlueWxDYWNoZVNwZWNCYWNrZW5kc1tdO1xuXG4gIC8qKlxuICAgKiBjbHVzdGVyIGNvbmZpZ3VyZXMgVmFybmlzaCBjbHVzdGVyaW5nIGJldHdlZW4gcG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNjbHVzdGVyXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyPzogVmlueWxDYWNoZVNwZWNDbHVzdGVyO1xuXG4gIC8qKlxuICAgKiBkZWJvdW5jZSBjb25maWd1cmVzIGEgZ3JhY2UgcGVyaW9kIGJlZm9yZSBhcHBseWluZyBlbmRwb2ludCBjaGFuZ2VzIHRvIFZhcm5pc2gsXG4gICAqIHByZXZlbnRpbmcgdGh1bmRlcmluZy1oZXJkIG9uIHJhcGlkIGVuZHBvaW50IGNodXJuLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2RlYm91bmNlXG4gICAqL1xuICByZWFkb25seSBkZWJvdW5jZT86IFZpbnlsQ2FjaGVTcGVjRGVib3VuY2U7XG5cbiAgLyoqXG4gICAqIGRpcmVjdG9yIGNvbmZpZ3VyZXMgaG93IFZhcm5pc2ggZGlzdHJpYnV0ZXMgcmVxdWVzdHMgYWNyb3NzIGJhY2tlbmQgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2RpcmVjdG9yXG4gICAqL1xuICByZWFkb25seSBkaXJlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3I7XG5cbiAgLyoqXG4gICAqIGltYWdlIGlzIHRoZSBjb250YWluZXIgaW1hZ2UgZm9yIHRoZSBWYXJuaXNoIHBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjaW1hZ2VcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGludmFsaWRhdGlvbiBjb25maWd1cmVzIGNhY2hlIGludmFsaWRhdGlvbiBtZXRob2RzIChQVVJHRSwgQkFOLCB4a2V5KS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNpbnZhbGlkYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGludmFsaWRhdGlvbj86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uO1xuXG4gIC8qKlxuICAgKiBtb25pdG9yaW5nIGNvbmZpZ3VyZXMgUHJvbWV0aGV1cyBtZXRyaWNzIGFuZCBhbGVydGluZyBydWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNtb25pdG9yaW5nXG4gICAqL1xuICByZWFkb25seSBtb25pdG9yaW5nPzogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nO1xuXG4gIC8qKlxuICAgKiBwb2QgY29uZmlndXJlcyBwb2QtbGV2ZWwgc2NoZWR1bGluZyBhbmQgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjcG9kXG4gICAqL1xuICByZWFkb25seSBwb2Q/OiBWaW55bENhY2hlU3BlY1BvZDtcblxuICAvKipcbiAgICogcHJveHlQcm90b2NvbCBlbmFibGVzIFBST1hZIHByb3RvY29sIG9uIGEgZGVkaWNhdGVkIHBvcnQgZm9yIHBhc3NpbmcgY2xpZW50IElQLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3Byb3h5UHJvdG9jb2xcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5UHJvdG9jb2w/OiBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2w7XG5cbiAgLyoqXG4gICAqIHJlcGxpY2FzIGlzIHRoZSBkZXNpcmVkIG51bWJlciBvZiBWYXJuaXNoIHBvZHMgaW4gdGhlIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjcmVwbGljYXNcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHJlc291cmNlcyBzZXRzIENQVSBhbmQgbWVtb3J5IHJlcXVlc3RzL2xpbWl0cyBmb3IgdGhlIFZhcm5pc2ggY29udGFpbmVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3Jlc291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VzPzogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXM7XG5cbiAgLyoqXG4gICAqIHJldHJ5IGNvbmZpZ3VyZXMgcmV0cnkgYmVoYXZpb3VyIHdoZW4gVkNMIHVwZGF0ZXMgZmFpbCB0byBhcHBseS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNyZXRyeVxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnk/OiBWaW55bENhY2hlU3BlY1JldHJ5O1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlIGNvbmZpZ3VyZXMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSBjcmVhdGVkIGZvciB0cmFmZmljIGluZ3Jlc3MuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjc2VydmljZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZT86IFZpbnlsQ2FjaGVTcGVjU2VydmljZTtcblxuICAvKipcbiAgICogc3RvcmFnZSBjb25maWd1cmVzIG9uZSBvciBtb3JlIFZhcm5pc2ggc3RvcmFnZSBiYWNrZW5kcyAobWFsbG9jIG9yIGZpbGUpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3N0b3JhZ2VcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2U/OiBWaW55bENhY2hlU3BlY1N0b3JhZ2VbXTtcblxuICAvKipcbiAgICogdmFybmlzaFBhcmFtZXRlcnMgYXJlIHJ1bnRpbWUgcGFyYW1ldGVycyBwYXNzZWQgdG8gdmFybmlzaGQgdmlhIC1wIGZsYWdzLlxuICAgKiBDZXJ0YWluIHNlY3VyaXR5LXNlbnNpdGl2ZSBwYXJhbWV0ZXJzIGFyZSBibG9ja2VkIGJ5IHRoZSBhZG1pc3Npb24gd2ViaG9vay5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyN2YXJuaXNoUGFyYW1ldGVyc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFybmlzaFBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiB2Y2wgY29uZmlndXJlcyBWQ0wgZ2VuZXJhdGlvbjogc25pcHBldHMgaW5qZWN0ZWQgaW50byBnZW5lcmF0ZWQgVkNMIHN1YnJvdXRpbmVzLFxuICAgKiBvciBhIGZ1bGwgVkNMIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3ZjbFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsPzogVmlueWxDYWNoZVNwZWNWY2w7XG5cbiAgLyoqXG4gICAqIHZvbHVtZUNsYWltVGVtcGxhdGVzIGFyZSBhcHBlbmRlZCB2ZXJiYXRpbSB0byB0aGUgZ2VuZXJhdGVkIFN0YXRlZnVsU2V0J3NcbiAgICogc3BlYy52b2x1bWVDbGFpbVRlbXBsYXRlcy4gRWFjaCB0ZW1wbGF0ZSB5aWVsZHMgb25lIFBWQyBwZXIgcmVwbGljYVxuICAgKiAobmFtZWQgPGNsYWltPi08c3RhdGVmdWxzZXQ+LTxvcmQ+KSB0aGF0IHBlcnNpc3RzIGFjcm9zcyBwb2QgcmVzdGFydHNcbiAgICogZm9yIHRoYXQgcmVwbGljYS4gVXNlZnVsIGZvciBwZXItcmVwbGljYSBTU0QtYmFja2VkIGZpbGUgc3RvcmFnZS5cbiAgICogUmVmZXJlbmNlIHRoZSBjbGFpbSBuYW1lIGZyb20gc3BlYy5wb2Qudm9sdW1lTW91bnRzOyByZWZlcmVuY2UgdGhlXG4gICAqIHJlc3VsdGluZyBtb3VudFBhdGggZnJvbSBzcGVjLnN0b3JhZ2VbXS5wYXRoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3ZvbHVtZUNsYWltVGVtcGxhdGVzXG4gICAqL1xuICByZWFkb25seSB2b2x1bWVDbGFpbVRlbXBsYXRlcz86IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWMob2JqOiBWaW55bENhY2hlU3BlYyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2JhY2tlbmRzJzogb2JqLmJhY2tlbmRzPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kcyh5KSksXG4gICAgJ2NsdXN0ZXInOiB0b0pzb25fVmlueWxDYWNoZVNwZWNDbHVzdGVyKG9iai5jbHVzdGVyKSxcbiAgICAnZGVib3VuY2UnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNEZWJvdW5jZShvYmouZGVib3VuY2UpLFxuICAgICdkaXJlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY0RpcmVjdG9yKG9iai5kaXJlY3RvciksXG4gICAgJ2ltYWdlJzogb2JqLmltYWdlLFxuICAgICdpbnZhbGlkYXRpb24nOiB0b0pzb25fVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb24ob2JqLmludmFsaWRhdGlvbiksXG4gICAgJ21vbml0b3JpbmcnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nKG9iai5tb25pdG9yaW5nKSxcbiAgICAncG9kJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kKG9iai5wb2QpLFxuICAgICdwcm94eVByb3RvY29sJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUHJveHlQcm90b2NvbChvYmoucHJveHlQcm90b2NvbCksXG4gICAgJ3JlcGxpY2FzJzogb2JqLnJlcGxpY2FzLFxuICAgICdyZXNvdXJjZXMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMob2JqLnJlc291cmNlcyksXG4gICAgJ3JldHJ5JzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmV0cnkob2JqLnJldHJ5KSxcbiAgICAnc2VydmljZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1NlcnZpY2Uob2JqLnNlcnZpY2UpLFxuICAgICdzdG9yYWdlJzogb2JqLnN0b3JhZ2U/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1N0b3JhZ2UoeSkpLFxuICAgICd2YXJuaXNoUGFyYW1ldGVycyc6ICgob2JqLnZhcm5pc2hQYXJhbWV0ZXJzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoudmFybmlzaFBhcmFtZXRlcnMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICAgICd2Y2wnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNWY2wob2JqLnZjbCksXG4gICAgJ3ZvbHVtZUNsYWltVGVtcGxhdGVzJzogb2JqLnZvbHVtZUNsYWltVGVtcGxhdGVzPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlcyh5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBCYWNrZW5kU3BlYyBkZXNjcmliZXMgYW4gdXBzdHJlYW0gS3ViZXJuZXRlcyBzZXJ2aWNlIHVzZWQgYXMgYSBWYXJuaXNoIGJhY2tlbmQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNCYWNrZW5kcyB7XG4gIC8qKlxuICAgKiBjb25uZWN0aW9uUGFyYW1ldGVycyBjb25maWd1cmVzIGJhY2tlbmQgY29ubmVjdGlvbiBwb29sIHRpbWVvdXRzIGFuZCBsaW1pdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kcyNjb25uZWN0aW9uUGFyYW1ldGVyc1xuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvblBhcmFtZXRlcnM/OiBWaW55bENhY2hlU3BlY0JhY2tlbmRzQ29ubmVjdGlvblBhcmFtZXRlcnM7XG5cbiAgLyoqXG4gICAqIGRpcmVjdG9yIG92ZXJyaWRlcyB0aGUgY2x1c3Rlci13aWRlIGRpcmVjdG9yIGZvciB0aGlzIGJhY2tlbmQgb25seS5cbiAgICogSWYgbmlsLCBhIHNoYXJkIGRpcmVjdG9yIHdpdGggZGVmYXVsdHMgaXMgZ2VuZXJhdGVkLCBncm91cGluZyBhbGwgcmVzb2x2ZWRcbiAgICogcGVyLXBvZCBiYWNrZW5kcyBmb3IgdGhpcyBzZXJ2aWNlUmVmLiBVc2UgXCJyb3VuZF9yb2JpblwiIG9yIFwicmFuZG9tXCIgaWZcbiAgICogY29uc2lzdGVudCBoYXNoaW5nIGlzIHVuZGVzaXJhYmxlIChlLmcuIHN0YXRlbGVzcyBiYWNrZW5kcykuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kcyNkaXJlY3RvclxuICAgKi9cbiAgcmVhZG9ubHkgZGlyZWN0b3I/OiBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWUgaXMgdGhlIFZDTCBpZGVudGlmaWVyIGZvciB0aGlzIGJhY2tlbmQuIE11c3QgbWF0Y2ggXlthLXpBLVpdW2EtekEtWjAtOV9dKiQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kcyNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHBvcnQgb3ZlcnJpZGVzIHRoZSBzZXJ2aWNlIHBvcnQgdXNlZCBmb3IgdGhpcyBiYWNrZW5kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjcG9ydFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogcHJvYmUgY29uZmlndXJlcyB0aGUgVmFybmlzaCBiYWNrZW5kIGhlYWx0aCBwcm9iZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3Byb2JlXG4gICAqL1xuICByZWFkb25seSBwcm9iZT86IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZTtcblxuICAvKipcbiAgICogc2VydmljZVJlZiByZWZlcmVuY2VzIHRoZSBLdWJlcm5ldGVzIFNlcnZpY2UgaW4gdGhlIHNhbWUgbmFtZXNwYWNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjc2VydmljZVJlZlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZVJlZjogVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWY7XG5cbiAgLyoqXG4gICAqIHdlaWdodCBpcyB0aGUgcmVsYXRpdmUgd2VpZ2h0IGZvciB0aGUgZGlyZWN0b3IuIDAgbWVhbnMgc3RhbmRieSAoZmFsbGJhY2sgZGlyZWN0b3IpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjd2VpZ2h0XG4gICAqL1xuICByZWFkb25seSB3ZWlnaHQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kcyhvYmo6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb25uZWN0aW9uUGFyYW1ldGVycyc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzQ29ubmVjdGlvblBhcmFtZXRlcnMob2JqLmNvbm5lY3Rpb25QYXJhbWV0ZXJzKSxcbiAgICAnZGlyZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yKG9iai5kaXJlY3RvciksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAncG9ydCc6IG9iai5wb3J0LFxuICAgICdwcm9iZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUob2JqLnByb2JlKSxcbiAgICAnc2VydmljZVJlZic6IHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZihvYmouc2VydmljZVJlZiksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBjbHVzdGVyIGNvbmZpZ3VyZXMgVmFybmlzaCBjbHVzdGVyaW5nIGJldHdlZW4gcG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlciB7XG4gIC8qKlxuICAgKiBlbmFibGVkIGFjdGl2YXRlcyBpbnRlci1wb2QgY2x1c3RlcmluZyB2aWEgYSBzaGFyZCBkaXJlY3Rvci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXIjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHBlZXJSb3V0aW5nIGNvbmZpZ3VyZXMgaG93IHJlcXVlc3RzIGFyZSByb3V0ZWQgYmV0d2VlbiBWYXJuaXNoIHBlZXJzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlciNwZWVyUm91dGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgcGVlclJvdXRpbmc/OiBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNDbHVzdGVyJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlcihvYmo6IFZpbnlsQ2FjaGVTcGVjQ2x1c3RlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncGVlclJvdXRpbmcnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmcob2JqLnBlZXJSb3V0aW5nKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGRlYm91bmNlIGNvbmZpZ3VyZXMgYSBncmFjZSBwZXJpb2QgYmVmb3JlIGFwcGx5aW5nIGVuZHBvaW50IGNoYW5nZXMgdG8gVmFybmlzaCxcbiAqIHByZXZlbnRpbmcgdGh1bmRlcmluZy1oZXJkIG9uIHJhcGlkIGVuZHBvaW50IGNodXJuLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEZWJvdW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjRGVib3VuY2Uge1xuICAvKipcbiAgICogZHVyYXRpb24gaXMgdGhlIHRpbWUgdG8gd2FpdCBhZnRlciB0aGUgbGFzdCBlbmRwb2ludCBjaGFuZ2UgYmVmb3JlIHB1c2hpbmcgYSBWQ0wgdXBkYXRlLlxuICAgKiBUaGlzIHByZXZlbnRzIHRodW5kZXJpbmctaGVyZCBvbiByYXBpZCBlbmRwb2ludCBjaHVybi4gRGVmYXVsdDogMXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEZWJvdW5jZSNkdXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZHVyYXRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGVib3VuY2UnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEZWJvdW5jZShvYmo6IFZpbnlsQ2FjaGVTcGVjRGVib3VuY2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkdXJhdGlvbic6IG9iai5kdXJhdGlvbixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGRpcmVjdG9yIGNvbmZpZ3VyZXMgaG93IFZhcm5pc2ggZGlzdHJpYnV0ZXMgcmVxdWVzdHMgYWNyb3NzIGJhY2tlbmQgZW5kcG9pbnRzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3Ige1xuICAvKipcbiAgICogaGFzaCBjb25maWd1cmVzIHRoZSBoYXNoIGRpcmVjdG9yLiBPbmx5IHVzZWQgd2hlbiB0eXBlIGlzIFwiaGFzaFwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3IjaGFzaFxuICAgKi9cbiAgcmVhZG9ubHkgaGFzaD86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoO1xuXG4gIC8qKlxuICAgKiBzaGFyZCBjb25maWd1cmVzIHRoZSBzaGFyZCBkaXJlY3RvciAoY29uc2lzdGVudC1oYXNoKS4gT25seSB1c2VkIHdoZW4gdHlwZSBpcyBcInNoYXJkXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvciNzaGFyZFxuICAgKi9cbiAgcmVhZG9ubHkgc2hhcmQ/OiBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQ7XG5cbiAgLyoqXG4gICAqIHR5cGUgc2VsZWN0cyB0aGUgVmFybmlzaCBkaXJlY3RvciBhbGdvcml0aG0uXG4gICAqIFwic2hhcmRcIiAoZGVmYXVsdCkgcHJvdmlkZXMgY29uc2lzdGVudCBoYXNoaW5nOyBcInJvdW5kX3JvYmluXCIsIFwicmFuZG9tXCIsIGFuZCBcImhhc2hcIlxuICAgKiBhcmUgYWxzbyBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvciN0eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogVmlueWxDYWNoZVNwZWNEaXJlY3RvclR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoYXNoJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoKG9iai5oYXNoKSxcbiAgICAnc2hhcmQnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkKG9iai5zaGFyZCksXG4gICAgJ3R5cGUnOiBvYmoudHlwZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGludmFsaWRhdGlvbiBjb25maWd1cmVzIGNhY2hlIGludmFsaWRhdGlvbiBtZXRob2RzIChQVVJHRSwgQkFOLCB4a2V5KS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb24ge1xuICAvKipcbiAgICogYmFuIGNvbmZpZ3VyZXMgQkFOLWJhc2VkIGNhY2hlIGludmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbiNiYW5cbiAgICovXG4gIHJlYWRvbmx5IGJhbj86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuO1xuXG4gIC8qKlxuICAgKiBwdXJnZSBjb25maWd1cmVzIEhUVFAgUFVSR0UtYmFzZWQgY2FjaGUgaW52YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uI3B1cmdlXG4gICAqL1xuICByZWFkb25seSBwdXJnZT86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2U7XG5cbiAgLyoqXG4gICAqIHhrZXkgY29uZmlndXJlcyB4a2V5LWJhc2VkIHN1cnJvZ2F0ZSBrZXkgaW52YWxpZGF0aW9uIChyZXF1aXJlcyB2bW9kX3hrZXkpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uI3hrZXlcbiAgICovXG4gIHJlYWRvbmx5IHhrZXk/OiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uKG9iajogVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiYW4nOiB0b0pzb25fVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4ob2JqLmJhbiksXG4gICAgJ3B1cmdlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2Uob2JqLnB1cmdlKSxcbiAgICAneGtleSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkob2JqLnhrZXkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogbW9uaXRvcmluZyBjb25maWd1cmVzIFByb21ldGhldXMgbWV0cmljcyBhbmQgYWxlcnRpbmcgcnVsZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY01vbml0b3Jpbmcge1xuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgUHJvbWV0aGV1cyBtZXRyaWNzIHNjcmFwaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogZXhwb3J0ZXIgY29uZmlndXJlcyB0aGUgcHJvbWV0aGV1c192YXJuaXNoX2V4cG9ydGVyIHNpZGVjYXIgdGhhdCBleHBvc2VzXG4gICAqIG5hdGl2ZSB2YXJuaXNoXyogbWV0cmljcyAoY2FjaGUgaGl0L21pc3MsIGJhY2tlbmQgaGVhbHRoKSBmcm9tIHZhcm5pc2hzdGF0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyNleHBvcnRlclxuICAgKi9cbiAgcmVhZG9ubHkgZXhwb3J0ZXI/OiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlcjtcblxuICAvKipcbiAgICogcHJvbWV0aGV1c1J1bGVzIGNvbmZpZ3VyZXMgUHJvbWV0aGV1c1J1bGUgb2JqZWN0cyBmb3IgYWxlcnRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nI3Byb21ldGhldXNSdWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgcHJvbWV0aGV1c1J1bGVzPzogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzO1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlTW9uaXRvciBjb25maWd1cmVzIGEgU2VydmljZU1vbml0b3IgZm9yIFByb21ldGhldXMgT3BlcmF0b3Igc2NyYXBpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nI3NlcnZpY2VNb25pdG9yXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTW9uaXRvcj86IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY01vbml0b3JpbmcnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nKG9iajogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdleHBvcnRlcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlcihvYmouZXhwb3J0ZXIpLFxuICAgICdwcm9tZXRoZXVzUnVsZXMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzKG9iai5wcm9tZXRoZXVzUnVsZXMpLFxuICAgICdzZXJ2aWNlTW9uaXRvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvcihvYmouc2VydmljZU1vbml0b3IpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcG9kIGNvbmZpZ3VyZXMgcG9kLWxldmVsIHNjaGVkdWxpbmcgYW5kIG1ldGFkYXRhLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZCB7XG4gIC8qKlxuICAgKiBhZmZpbml0eSBjb25maWd1cmVzIHBvZCBhZmZpbml0eSBhbmQgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI2FmZmluaXR5XG4gICAqL1xuICByZWFkb25seSBhZmZpbml0eT86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHk7XG5cbiAgLyoqXG4gICAqIGFubm90YXRpb25zIGFyZSBhZGRlZCB0byBlYWNoIFZhcm5pc2ggcG9kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI2Fubm90YXRpb25zXG4gICAqL1xuICByZWFkb25seSBhbm5vdGF0aW9ucz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIGxhYmVscyBhcmUgYWRkZWQgdG8gZWFjaCBWYXJuaXNoIHBvZCAobWVyZ2VkIHdpdGggb3BlcmF0b3ItbWFuYWdlZCBsYWJlbHMpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI2xhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogbm9kZVNlbGVjdG9yIGNvbnN0cmFpbnMgcG9kcyB0byBub2RlcyBtYXRjaGluZyBhbGwgc3BlY2lmaWVkIGxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZCNub2RlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5vZGVTZWxlY3Rvcj86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIHByaW9yaXR5Q2xhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBQcmlvcml0eUNsYXNzIGZvciBWYXJuaXNoIHBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2QjcHJpb3JpdHlDbGFzc05hbWVcbiAgICovXG4gIHJlYWRvbmx5IHByaW9yaXR5Q2xhc3NOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB0b2xlcmF0aW9ucyBhbGxvdyBwb2RzIHRvIGJlIHNjaGVkdWxlZCBvbiB0YWludGVkIG5vZGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI3RvbGVyYXRpb25zXG4gICAqL1xuICByZWFkb25seSB0b2xlcmF0aW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnNbXTtcblxuICAvKipcbiAgICogdm9sdW1lTW91bnRzIGFyZSBhZGRpdGlvbmFsIG1vdW50cyBhcHBlbmRlZCB0byB0aGUgdmFybmlzaCBjb250YWluZXIuXG4gICAqIEVhY2ggZW50cnkgbXVzdCByZWZlcmVuY2UgYSBuYW1lIHByZXNlbnQgaW4gc3BlYy5wb2Qudm9sdW1lcyBvclxuICAgKiBzcGVjLnZvbHVtZUNsYWltVGVtcGxhdGVzLiBSZXNlcnZlZCBtb3VudCBwYXRocyAoL3J1bi92aW55bCxcbiAgICogL2V0Yy92YXJuaXNoL3NlY3JldCwgL3Zhci9saWIvdmFybmlzaCwgL3RtcCwgL2V0Yy92YXJuaXNoL2RlZmF1bHQudmNsKVxuICAgKiBhcmUgcmVqZWN0ZWQgYnkgdGhlIGFkbWlzc2lvbiB3ZWJob29rLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI3ZvbHVtZU1vdW50c1xuICAgKi9cbiAgcmVhZG9ubHkgdm9sdW1lTW91bnRzPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVNb3VudHNbXTtcblxuICAvKipcbiAgICogdm9sdW1lcyBhcmUgYWRkaXRpb25hbCBwb2QtbGV2ZWwgdm9sdW1lcyBhcHBlbmRlZCB0byB0aGUgb3BlcmF0b3ItbWFuYWdlZFxuICAgKiBkZWZhdWx0cyAoYWdlbnQtdG9rZW4sIHZhcm5pc2gtc2VjcmV0LCB2YXJuaXNoLXdvcmtkaXIsIHZhcm5pc2gtdG1wLFxuICAgKiBib290c3RyYXAtdmNsKS4gVXNlIHRvIGJhY2sgc3BlYy5zdG9yYWdlW10ucGF0aCB3aXRoIGEgUFZDLCBhbiBFbXB0eURpclxuICAgKiB3aXRoIHNpemVMaW1pdCwgb3IgYW55IFZvbHVtZVNvdXJjZSBzdXBwb3J0ZWQgYnkgS3ViZXJuZXRlcy4gUmVzZXJ2ZWRcbiAgICogbmFtZXMgY29sbGlkZSB3aXRoIG9wZXJhdG9yLW1hbmFnZWQgdm9sdW1lcyBhbmQgYXJlIHJlamVjdGVkIGJ5IHRoZVxuICAgKiBhZG1pc3Npb24gd2ViaG9vay4gVm9sdW1lIG5hbWVzIG11c3QgYWxzbyBiZSB1bmlxdWUgYWNyb3NzIHZvbHVtZXMgYW5kXG4gICAqIHZvbHVtZUNsYWltVGVtcGxhdGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI3ZvbHVtZXNcbiAgICovXG4gIHJlYWRvbmx5IHZvbHVtZXM/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2QnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2Qob2JqOiBWaW55bENhY2hlU3BlY1BvZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FmZmluaXR5JzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHkob2JqLmFmZmluaXR5KSxcbiAgICAnYW5ub3RhdGlvbnMnOiAoKG9iai5hbm5vdGF0aW9ucykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmFubm90YXRpb25zKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnbGFiZWxzJzogKChvYmoubGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnbm9kZVNlbGVjdG9yJzogKChvYmoubm9kZVNlbGVjdG9yKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubm9kZVNlbGVjdG9yKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAncHJpb3JpdHlDbGFzc05hbWUnOiBvYmoucHJpb3JpdHlDbGFzc05hbWUsXG4gICAgJ3RvbGVyYXRpb25zJzogb2JqLnRvbGVyYXRpb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyh5KSksXG4gICAgJ3ZvbHVtZU1vdW50cyc6IG9iai52b2x1bWVNb3VudHM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZU1vdW50cyh5KSksXG4gICAgJ3ZvbHVtZXMnOiBvYmoudm9sdW1lcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lcyh5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwcm94eVByb3RvY29sIGVuYWJsZXMgUFJPWFkgcHJvdG9jb2wgb24gYSBkZWRpY2F0ZWQgcG9ydCBmb3IgcGFzc2luZyBjbGllbnQgSVAuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2xcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wge1xuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgUFJPWFkgcHJvdG9jb2wgc3VwcG9ydC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHBvcnQgaXMgdGhlIHBvcnQgb24gd2hpY2ggUFJPWFkgcHJvdG9jb2wgY29ubmVjdGlvbnMgYXJlIGFjY2VwdGVkLiBEZWZhdWx0OiA4MDgxLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUHJveHlQcm90b2NvbCNwb3J0XG4gICAqL1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sKG9iajogVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdwb3J0Jzogb2JqLnBvcnQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiByZXNvdXJjZXMgc2V0cyBDUFUgYW5kIG1lbW9yeSByZXF1ZXN0cy9saW1pdHMgZm9yIHRoZSBWYXJuaXNoIGNvbnRhaW5lci5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMge1xuICAvKipcbiAgICogQ2xhaW1zIGxpc3RzIHRoZSBuYW1lcyBvZiByZXNvdXJjZXMsIGRlZmluZWQgaW4gc3BlYy5yZXNvdXJjZUNsYWltcyxcbiAgICogdGhhdCBhcmUgdXNlZCBieSB0aGlzIGNvbnRhaW5lci5cbiAgICpcbiAgICogVGhpcyBmaWVsZCBkZXBlbmRzIG9uIHRoZVxuICAgKiBEeW5hbWljUmVzb3VyY2VBbGxvY2F0aW9uIGZlYXR1cmUgZ2F0ZS5cbiAgICpcbiAgICogVGhpcyBmaWVsZCBpcyBpbW11dGFibGUuIEl0IGNhbiBvbmx5IGJlIHNldCBmb3IgY29udGFpbmVycy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlcyNjbGFpbXNcbiAgICovXG4gIHJlYWRvbmx5IGNsYWltcz86IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zW107XG5cbiAgLyoqXG4gICAqIExpbWl0cyBkZXNjcmliZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGNvbXB1dGUgcmVzb3VyY2VzIGFsbG93ZWQuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvY29uZmlndXJhdGlvbi9tYW5hZ2UtcmVzb3VyY2VzLWNvbnRhaW5lcnMvXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMjbGltaXRzXG4gICAqL1xuICByZWFkb25seSBsaW1pdHM/OiB7IFtrZXk6IHN0cmluZ106IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzTGltaXRzIH07XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIGRlc2NyaWJlcyB0aGUgbWluaW11bSBhbW91bnQgb2YgY29tcHV0ZSByZXNvdXJjZXMgcmVxdWlyZWQuXG4gICAqIElmIFJlcXVlc3RzIGlzIG9taXR0ZWQgZm9yIGEgY29udGFpbmVyLCBpdCBkZWZhdWx0cyB0byBMaW1pdHMgaWYgdGhhdCBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCxcbiAgICogb3RoZXJ3aXNlIHRvIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdmFsdWUuIFJlcXVlc3RzIGNhbm5vdCBleGNlZWQgTGltaXRzLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL2NvbmZpZ3VyYXRpb24vbWFuYWdlLXJlc291cmNlcy1jb250YWluZXJzL1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzI3JlcXVlc3RzXG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0cz86IHsgW2tleTogc3RyaW5nXTogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1Jlc291cmNlcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1Jlc291cmNlcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2xhaW1zJzogb2JqLmNsYWltcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zKHkpKSxcbiAgICAnbGltaXRzJzogKChvYmoubGltaXRzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubGltaXRzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXT8udmFsdWUgfSksIHt9KSksXG4gICAgJ3JlcXVlc3RzJzogKChvYmoucmVxdWVzdHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5yZXF1ZXN0cykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0/LnZhbHVlIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcmV0cnkgY29uZmlndXJlcyByZXRyeSBiZWhhdmlvdXIgd2hlbiBWQ0wgdXBkYXRlcyBmYWlsIHRvIGFwcGx5LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXRyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUmV0cnkge1xuICAvKipcbiAgICogYmFja29mZkJhc2UgaXMgdGhlIGluaXRpYWwgYmFja29mZiBkdXJhdGlvbiBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzLiBEZWZhdWx0OiA1cy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1JldHJ5I2JhY2tvZmZCYXNlXG4gICAqL1xuICByZWFkb25seSBiYWNrb2ZmQmFzZT86IHN0cmluZztcblxuICAvKipcbiAgICogYmFja29mZk1heCBpcyB0aGUgbWF4aW11bSBiYWNrb2ZmIGR1cmF0aW9uIChleHBvbmVudGlhbCBiYWNrb2ZmIGNhcCkuIERlZmF1bHQ6IDVtLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmV0cnkjYmFja29mZk1heFxuICAgKi9cbiAgcmVhZG9ubHkgYmFja29mZk1heD86IHN0cmluZztcblxuICAvKipcbiAgICogbWF4QXR0ZW1wdHMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIFZDTCBwdXNoIGF0dGVtcHRzIGJlZm9yZSB0aGUgb3BlcmF0b3JcbiAgICogdHJhbnNpdGlvbnMgdG8gRXJyb3IgcGhhc2UuIERlZmF1bHQ6IDMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXRyeSNtYXhBdHRlbXB0c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4QXR0ZW1wdHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUmV0cnknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNSZXRyeShvYmo6IFZpbnlsQ2FjaGVTcGVjUmV0cnkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiYWNrb2ZmQmFzZSc6IG9iai5iYWNrb2ZmQmFzZSxcbiAgICAnYmFja29mZk1heCc6IG9iai5iYWNrb2ZmTWF4LFxuICAgICdtYXhBdHRlbXB0cyc6IG9iai5tYXhBdHRlbXB0cyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlcnZpY2UgY29uZmlndXJlcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIGNyZWF0ZWQgZm9yIHRyYWZmaWMgaW5ncmVzcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjU2VydmljZSB7XG4gIC8qKlxuICAgKiBhbm5vdGF0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIFNlcnZpY2Ugb2JqZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZSNhbm5vdGF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYW5ub3RhdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiB0eXBlIHNldHMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSB0eXBlIChDbHVzdGVySVAsIE5vZGVQb3J0LCBMb2FkQmFsYW5jZXIpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZSN0eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogVmlueWxDYWNoZVNwZWNTZXJ2aWNlVHlwZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNTZXJ2aWNlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjU2VydmljZShvYmo6IFZpbnlsQ2FjaGVTcGVjU2VydmljZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Fubm90YXRpb25zJzogKChvYmouYW5ub3RhdGlvbnMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5hbm5vdGF0aW9ucykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ3R5cGUnOiBvYmoudHlwZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFN0b3JhZ2VTcGVjIGNvbmZpZ3VyZXMgYSBWYXJuaXNoIHN0b3JhZ2UgYmFja2VuZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZSB7XG4gIC8qKlxuICAgKiBuYW1lIGlzIHRoZSBpbnRlcm5hbCBzdG9yYWdlIGlkZW50aWZpZXIgdXNlZCBpbiB2YXJuaXNoZCAtcyBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogcGF0aCBpcyB0aGUgZmlsZXN5c3RlbSBwYXRoIGZvciBmaWxlLXR5cGUgc3RvcmFnZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1N0b3JhZ2UjcGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogc2l6ZSBpcyB0aGUgc3RvcmFnZSBhbGxvY2F0aW9uIGFzIGEgS3ViZXJuZXRlcyByZXNvdXJjZSBxdWFudGl0eSAoZS5nLiBcIjFHaVwiKS5cbiAgICogVGhlIG9wZXJhdG9yIGNvbnZlcnRzIHRvIGJ5dGVzIGZvciB2YXJuaXNoZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1N0b3JhZ2Ujc2l6ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2l6ZT86IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemU7XG5cbiAgLyoqXG4gICAqIHR5cGUgaXMgdGhlIHN0b3JhZ2UgYmFja2VuZCB0eXBlLiBPbmx5IFwibWFsbG9jXCIgYW5kIFwiZmlsZVwiIGFyZSBwZXJtaXR0ZWQuXG4gICAqIFwicGVyc2lzdGVudFwiLCBcInVtZW1cIiwgYW5kIFwiZGVmYXVsdFwiIGFyZSByZWplY3RlZCBieSB0aGUgYWRtaXNzaW9uIHdlYmhvb2suXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlI3R5cGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjU3RvcmFnZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1N0b3JhZ2Uob2JqOiBWaW55bENhY2hlU3BlY1N0b3JhZ2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ3BhdGgnOiBvYmoucGF0aCxcbiAgICAnc2l6ZSc6IG9iai5zaXplPy52YWx1ZSxcbiAgICAndHlwZSc6IG9iai50eXBlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogdmNsIGNvbmZpZ3VyZXMgVkNMIGdlbmVyYXRpb246IHNuaXBwZXRzIGluamVjdGVkIGludG8gZ2VuZXJhdGVkIFZDTCBzdWJyb3V0aW5lcyxcbiAqIG9yIGEgZnVsbCBWQ0wgb3ZlcnJpZGUuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjVmNsIHtcbiAgLyoqXG4gICAqIGZ1bGxPdmVycmlkZSByZXBsYWNlcyB0aGUgZW50aXJlIGdlbmVyYXRlZCBWQ0wgd2l0aCBhIGN1c3RvbSBWQ0wgc3RyaW5nLlxuICAgKiBVc2Ugd2l0aCBjYXV0aW9uIOKAlCB0aGlzIGRpc2FibGVzIGFsbCBzdHJ1Y3R1cmVkIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2wjZnVsbE92ZXJyaWRlXG4gICAqL1xuICByZWFkb25seSBmdWxsT3ZlcnJpZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNuaXBwZXRzIHByb3ZpZGVzIFZDTCBjb2RlIGluamVjdGVkIGludG8gZWFjaCBnZW5lcmF0ZWQgc3Vicm91dGluZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbCNzbmlwcGV0c1xuICAgKi9cbiAgcmVhZG9ubHkgc25pcHBldHM/OiBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1ZjbCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1ZjbChvYmo6IFZpbnlsQ2FjaGVTcGVjVmNsIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZnVsbE92ZXJyaWRlJzogb2JqLmZ1bGxPdmVycmlkZSxcbiAgICAnc25pcHBldHMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyhvYmouc25pcHBldHMpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogUGVyc2lzdGVudFZvbHVtZUNsYWltIGlzIGEgdXNlcidzIHJlcXVlc3QgZm9yIGFuZCBjbGFpbSB0byBhIHBlcnNpc3RlbnQgdm9sdW1lXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlcyB7XG4gIC8qKlxuICAgKiBBUElWZXJzaW9uIGRlZmluZXMgdGhlIHZlcnNpb25lZCBzY2hlbWEgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuXG4gICAqIFNlcnZlcnMgc2hvdWxkIGNvbnZlcnQgcmVjb2duaXplZCBzY2hlbWFzIHRvIHRoZSBsYXRlc3QgaW50ZXJuYWwgdmFsdWUsIGFuZFxuICAgKiBtYXkgcmVqZWN0IHVucmVjb2duaXplZCB2YWx1ZXMuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9naXQuazhzLmlvL2NvbW11bml0eS9jb250cmlidXRvcnMvZGV2ZWwvc2lnLWFyY2hpdGVjdHVyZS9hcGktY29udmVudGlvbnMubWQjcmVzb3VyY2VzXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlcyNhcGlWZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBhcGlWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLaW5kIGlzIGEgc3RyaW5nIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgUkVTVCByZXNvdXJjZSB0aGlzIG9iamVjdCByZXByZXNlbnRzLlxuICAgKiBTZXJ2ZXJzIG1heSBpbmZlciB0aGlzIGZyb20gdGhlIGVuZHBvaW50IHRoZSBjbGllbnQgc3VibWl0cyByZXF1ZXN0cyB0by5cbiAgICogQ2Fubm90IGJlIHVwZGF0ZWQuXG4gICAqIEluIENhbWVsQ2FzZS5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2dpdC5rOHMuaW8vY29tbXVuaXR5L2NvbnRyaWJ1dG9ycy9kZXZlbC9zaWctYXJjaGl0ZWN0dXJlL2FwaS1jb252ZW50aW9ucy5tZCN0eXBlcy1raW5kc1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXMja2luZFxuICAgKi9cbiAgcmVhZG9ubHkga2luZD86IHN0cmluZztcblxuICAvKipcbiAgICogU3RhbmRhcmQgb2JqZWN0J3MgbWV0YWRhdGEuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9naXQuazhzLmlvL2NvbW11bml0eS9jb250cmlidXRvcnMvZGV2ZWwvc2lnLWFyY2hpdGVjdHVyZS9hcGktY29udmVudGlvbnMubWQjbWV0YWRhdGFcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzI21ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IGFueTtcblxuICAvKipcbiAgICogc3BlYyBkZWZpbmVzIHRoZSBkZXNpcmVkIGNoYXJhY3RlcmlzdGljcyBvZiBhIHZvbHVtZSByZXF1ZXN0ZWQgYnkgYSBwb2QgYXV0aG9yLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2UvcGVyc2lzdGVudC12b2x1bWVzI3BlcnNpc3RlbnR2b2x1bWVjbGFpbXNcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzI3NwZWNcbiAgICovXG4gIHJlYWRvbmx5IHNwZWM/OiBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlYztcblxuICAvKipcbiAgICogc3RhdHVzIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgaW5mb3JtYXRpb24vc3RhdHVzIG9mIGEgcGVyc2lzdGVudCB2b2x1bWUgY2xhaW0uXG4gICAqIFJlYWQtb25seS5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3BlcnNpc3RlbnQtdm9sdW1lcyNwZXJzaXN0ZW50dm9sdW1lY2xhaW1zXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlcyNzdGF0dXNcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXM7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlcyhvYmo6IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhcGlWZXJzaW9uJzogb2JqLmFwaVZlcnNpb24sXG4gICAgJ2tpbmQnOiBvYmoua2luZCxcbiAgICAnbWV0YWRhdGEnOiBvYmoubWV0YWRhdGEsXG4gICAgJ3NwZWMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWMob2JqLnNwZWMpLFxuICAgICdzdGF0dXMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1cyhvYmouc3RhdHVzKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNvbm5lY3Rpb25QYXJhbWV0ZXJzIGNvbmZpZ3VyZXMgYmFja2VuZCBjb25uZWN0aW9uIHBvb2wgdGltZW91dHMgYW5kIGxpbWl0cy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyB7XG4gIC8qKlxuICAgKiBiZXR3ZWVuQnl0ZXNUaW1lb3V0IGlzIHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIGJ5dGVzIG9mIHRoZSByZXNwb25zZSBib2R5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyNiZXR3ZWVuQnl0ZXNUaW1lb3V0XG4gICAqL1xuICByZWFkb25seSBiZXR3ZWVuQnl0ZXNUaW1lb3V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBjb25uZWN0VGltZW91dCBpcyB0aGUgbWF4aW11bSB0aW1lIHRvIGVzdGFibGlzaCBhIFRDUCBjb25uZWN0aW9uIHRvIHRoZSBiYWNrZW5kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyNjb25uZWN0VGltZW91dFxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdFRpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGZpcnN0Qnl0ZVRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGZvciB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVzcG9uc2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI2ZpcnN0Qnl0ZVRpbWVvdXRcbiAgICovXG4gIHJlYWRvbmx5IGZpcnN0Qnl0ZVRpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGlkbGVUaW1lb3V0IGlzIHRoZSBtYXhpbXVtIHRpbWUgYW4gaWRsZSBjb25uZWN0aW9uIG1heSBiZSByZXVzZWQuIFNob3VsZCBiZSBsZXNzXG4gICAqIHRoYW4gdGhlIGJhY2tlbmQncyBrZWVwLWFsaXZlIHRpbWVvdXQgdG8gYXZvaWQgNTAzIHJhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyNpZGxlVGltZW91dFxuICAgKi9cbiAgcmVhZG9ubHkgaWRsZVRpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG1heENvbm5lY3Rpb25zIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGNvbm5lY3Rpb25zIHRvIHRoZSBiYWNrZW5kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyNtYXhDb25uZWN0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q29ubmVjdGlvbnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzQ29ubmVjdGlvblBhcmFtZXRlcnMob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzQ29ubmVjdGlvblBhcmFtZXRlcnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiZXR3ZWVuQnl0ZXNUaW1lb3V0Jzogb2JqLmJldHdlZW5CeXRlc1RpbWVvdXQsXG4gICAgJ2Nvbm5lY3RUaW1lb3V0Jzogb2JqLmNvbm5lY3RUaW1lb3V0LFxuICAgICdmaXJzdEJ5dGVUaW1lb3V0Jzogb2JqLmZpcnN0Qnl0ZVRpbWVvdXQsXG4gICAgJ2lkbGVUaW1lb3V0Jzogb2JqLmlkbGVUaW1lb3V0LFxuICAgICdtYXhDb25uZWN0aW9ucyc6IG9iai5tYXhDb25uZWN0aW9ucyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGRpcmVjdG9yIG92ZXJyaWRlcyB0aGUgY2x1c3Rlci13aWRlIGRpcmVjdG9yIGZvciB0aGlzIGJhY2tlbmQgb25seS5cbiAqIElmIG5pbCwgYSBzaGFyZCBkaXJlY3RvciB3aXRoIGRlZmF1bHRzIGlzIGdlbmVyYXRlZCwgZ3JvdXBpbmcgYWxsIHJlc29sdmVkXG4gKiBwZXItcG9kIGJhY2tlbmRzIGZvciB0aGlzIHNlcnZpY2VSZWYuIFVzZSBcInJvdW5kX3JvYmluXCIgb3IgXCJyYW5kb21cIiBpZlxuICogY29uc2lzdGVudCBoYXNoaW5nIGlzIHVuZGVzaXJhYmxlIChlLmcuIHN0YXRlbGVzcyBiYWNrZW5kcykuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3Ige1xuICAvKipcbiAgICogaGFzaCBjb25maWd1cmVzIHRoZSBoYXNoIGRpcmVjdG9yLiBPbmx5IHVzZWQgd2hlbiB0eXBlIGlzIFwiaGFzaFwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvciNoYXNoXG4gICAqL1xuICByZWFkb25seSBoYXNoPzogVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9ySGFzaDtcblxuICAvKipcbiAgICogc2hhcmQgY29uZmlndXJlcyB0aGUgc2hhcmQgZGlyZWN0b3IgKGNvbnNpc3RlbnQtaGFzaCkuIE9ubHkgdXNlZCB3aGVuIHR5cGUgaXMgXCJzaGFyZFwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvciNzaGFyZFxuICAgKi9cbiAgcmVhZG9ubHkgc2hhcmQ/OiBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZDtcblxuICAvKipcbiAgICogdHlwZSBzZWxlY3RzIHRoZSBWYXJuaXNoIGRpcmVjdG9yIGFsZ29yaXRobS5cbiAgICogXCJzaGFyZFwiIChkZWZhdWx0KSBwcm92aWRlcyBjb25zaXN0ZW50IGhhc2hpbmc7IFwicm91bmRfcm9iaW5cIiwgXCJyYW5kb21cIiwgYW5kIFwiaGFzaFwiXG4gICAqIGFyZSBhbHNvIHN1cHBvcnRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3IjdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoYXNoJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3Rvckhhc2gob2JqLmhhc2gpLFxuICAgICdzaGFyZCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZChvYmouc2hhcmQpLFxuICAgICd0eXBlJzogb2JqLnR5cGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwcm9iZSBjb25maWd1cmVzIHRoZSBWYXJuaXNoIGJhY2tlbmQgaGVhbHRoIHByb2JlLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlIHtcbiAgLyoqXG4gICAqIGV4cGVjdGVkUmVzcG9uc2UgaXMgdGhlIGV4cGVjdGVkIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuIERlZmF1bHRzIHRvIDIwMC5cbiAgICpcbiAgICogQGRlZmF1bHQgMjAwLlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSNleHBlY3RlZFJlc3BvbnNlXG4gICAqL1xuICByZWFkb25seSBleHBlY3RlZFJlc3BvbnNlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBpbnRlcnZhbCBpcyBob3cgb2Z0ZW4gdG8gcHJvYmUgdGhlIGJhY2tlbmQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlI2ludGVydmFsXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbD86IHN0cmluZztcblxuICAvKipcbiAgICogdGhyZXNob2xkIGlzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBzdWNjZXNzZnVsIHByb2JlcyB3aXRoaW4gdGhlIHdpbmRvdyBmb3IgdGhlIGJhY2tlbmRcbiAgICogdG8gYmUgY29uc2lkZXJlZCBoZWFsdGh5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSN0aHJlc2hvbGRcbiAgICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogdGltZW91dCBpcyB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGEgcHJvYmUgcmVzcG9uc2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlI3RpbWVvdXRcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHVybCBpcyB0aGUgVVJMIHRvIHByb2JlLiBJZiBlbXB0eSwgdGhlIGJhY2tlbmQncyByb290IHBhdGggaXMgdXNlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUjdXJsXG4gICAqL1xuICByZWFkb25seSB1cmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHdpbmRvdyBpcyB0aGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IHByb2JlcyB0byBjb25zaWRlciBmb3IgdGhyZXNob2xkIGV2YWx1YXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlI3dpbmRvd1xuICAgKi9cbiAgcmVhZG9ubHkgd2luZG93PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlKG9iajogVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZXhwZWN0ZWRSZXNwb25zZSc6IG9iai5leHBlY3RlZFJlc3BvbnNlLFxuICAgICdpbnRlcnZhbCc6IG9iai5pbnRlcnZhbCxcbiAgICAndGhyZXNob2xkJzogb2JqLnRocmVzaG9sZCxcbiAgICAndGltZW91dCc6IG9iai50aW1lb3V0LFxuICAgICd1cmwnOiBvYmoudXJsLFxuICAgICd3aW5kb3cnOiBvYmoud2luZG93LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogc2VydmljZVJlZiByZWZlcmVuY2VzIHRoZSBLdWJlcm5ldGVzIFNlcnZpY2UgaW4gdGhlIHNhbWUgbmFtZXNwYWNlLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZiB7XG4gIC8qKlxuICAgKiBuYW1lIGlzIHRoZSBLdWJlcm5ldGVzIFNlcnZpY2UgbmFtZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZiNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmKG9iajogVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWYgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwZWVyUm91dGluZyBjb25maWd1cmVzIGhvdyByZXF1ZXN0cyBhcmUgcm91dGVkIGJldHdlZW4gVmFybmlzaCBwZWVycy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmcge1xuICAvKipcbiAgICogdHlwZSBpcyB0aGUgcm91dGluZyBzdHJhdGVneSBiZXR3ZWVuIFZhcm5pc2ggcG9kcy4gT25seSBcInNoYXJkXCIgaXMgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nI3R5cGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZ1R5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nKG9iajogVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmcgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICd0eXBlJzogb2JqLnR5cGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBoYXNoIGNvbmZpZ3VyZXMgdGhlIGhhc2ggZGlyZWN0b3IuIE9ubHkgdXNlZCB3aGVuIHR5cGUgaXMgXCJoYXNoXCIuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoIHtcbiAgLyoqXG4gICAqIGhlYWRlciBpcyB0aGUgcmVxdWVzdCBoZWFkZXIgbmFtZSB1c2VkIGFzIHRoZSBoYXNoIGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaCNoZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2gnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2gob2JqOiBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2hlYWRlcic6IG9iai5oZWFkZXIsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzaGFyZCBjb25maWd1cmVzIHRoZSBzaGFyZCBkaXJlY3RvciAoY29uc2lzdGVudC1oYXNoKS4gT25seSB1c2VkIHdoZW4gdHlwZSBpcyBcInNoYXJkXCIuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQge1xuICAvKipcbiAgICogYnkgZGV0ZXJtaW5lcyB3aGF0IHZhbHVlIGlzIGhhc2hlZCBmb3Igc2hhcmQgc2VsZWN0aW9uLiBcIkhBU0hcIiB1c2VzIHRoZSBWYXJuaXNoXG4gICAqIGhhc2ggKGRlZmF1bHQpOyBcIlVSTFwiIHVzZXMgdGhlIHJlcXVlc3QgVVJMLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZCNieVxuICAgKi9cbiAgcmVhZG9ubHkgYnk/OiBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmRCeTtcblxuICAvKipcbiAgICogaGVhbHRoeSBjb250cm9scyB3aGljaCBiYWNrZW5kcyB0aGUgZGlyZWN0b3IgY29uc2lkZXJzIHdoZW4gc2VsZWN0aW5nIGEgc2hhcmQuXG4gICAqIFwiQ0hPU0VOXCIgKGRlZmF1bHQpIG9ubHkgY29uc2lkZXJzIHRoZSBjaG9zZW4gYmFja2VuZCBoZWFsdGh5OyBcIkFMTFwiIHJlcXVpcmVzIGFsbFxuICAgKiBiYWNrZW5kcyB0byBiZSBoZWFsdGh5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZCNoZWFsdGh5XG4gICAqL1xuICByZWFkb25seSBoZWFsdGh5PzogVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkSGVhbHRoeTtcblxuICAvKipcbiAgICogcmFtcHVwIGlzIHRoZSB0aW1lIGFmdGVyIGFkZGluZyBhIGJhY2tlbmQgYmVmb3JlIGl0IHJlY2VpdmVzIGl0cyBmdWxsIHNoYXJlIG9mIHRyYWZmaWMsXG4gICAqIHByZXZlbnRpbmcgdGh1bmRlcmluZy1oZXJkLiBEZWZhdWx0OiAzMHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkI3JhbXB1cFxuICAgKi9cbiAgcmVhZG9ubHkgcmFtcHVwPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiByZXBsaWNhcyBpcyB0aGUgbnVtYmVyIG9mIEtldGFtYSByZXBsaWNhcyBwZXIgYmFja2VuZCBpbiB0aGUgaGFzaCByaW5nLiBEZWZhdWx0OiA2Ny5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQjcmVwbGljYXNcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiB3YXJtdXAgaXMgdGhlIHByb3BvcnRpb24gb2YgcmVxdWVzdHMgKDAuMOKAkzEuMCkgc2VudCB0byB0aGUgYWx0ZXJuYXRpdmUgYmFja2VuZFxuICAgKiB0byBwcmUtcG9wdWxhdGUgaXRzIGNhY2hlLiBEZWZhdWx0OiAwLjEuIE11c3QgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQjd2FybXVwXG4gICAqL1xuICByZWFkb25seSB3YXJtdXA/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQob2JqOiBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdieSc6IG9iai5ieSxcbiAgICAnaGVhbHRoeSc6IG9iai5oZWFsdGh5LFxuICAgICdyYW1wdXAnOiBvYmoucmFtcHVwLFxuICAgICdyZXBsaWNhcyc6IG9iai5yZXBsaWNhcyxcbiAgICAnd2FybXVwJzogb2JqLndhcm11cCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHR5cGUgc2VsZWN0cyB0aGUgVmFybmlzaCBkaXJlY3RvciBhbGdvcml0aG0uXG4gKiBcInNoYXJkXCIgKGRlZmF1bHQpIHByb3ZpZGVzIGNvbnNpc3RlbnQgaGFzaGluZzsgXCJyb3VuZF9yb2JpblwiLCBcInJhbmRvbVwiLCBhbmQgXCJoYXNoXCJcbiAqIGFyZSBhbHNvIHN1cHBvcnRlZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JUeXBlXG4gKi9cbmV4cG9ydCBlbnVtIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JUeXBlIHtcbiAgLyoqIHNoYXJkICovXG4gIFNIQVJEID0gXCJzaGFyZFwiLFxuICAvKiogcm91bmRfcm9iaW4gKi9cbiAgUk9VTkRfVU5ERVJTQ09SRV9ST0JJTiA9IFwicm91bmRfcm9iaW5cIixcbiAgLyoqIHJhbmRvbSAqL1xuICBSQU5ET00gPSBcInJhbmRvbVwiLFxuICAvKiogaGFzaCAqL1xuICBIQVNIID0gXCJoYXNoXCIsXG4gIC8qKiBmYWxsYmFjayAqL1xuICBGQUxMQkFDSyA9IFwiZmFsbGJhY2tcIixcbn1cblxuLyoqXG4gKiBiYW4gY29uZmlndXJlcyBCQU4tYmFzZWQgY2FjaGUgaW52YWxpZGF0aW9uLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhbiB7XG4gIC8qKlxuICAgKiBhbGxvd2VkU291cmNlcyBpcyBhIGxpc3Qgb2YgQ0lEUiByYW5nZXMgcGVybWl0dGVkIHRvIHNlbmQgQkFOIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuI2FsbG93ZWRTb3VyY2VzXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkU291cmNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBlbmFibGVkIGFjdGl2YXRlcyB0aGUgQkFOIGludmFsaWRhdGlvbiBoYW5kbGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiByYXRlTGltaXRQZXJNaW51dGUgbGltaXRzIEJBTiByZXF1ZXN0cyBwZXIgbWludXRlLiAwIG1lYW5zIG5vIGxpbWl0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuI3JhdGVMaW1pdFBlck1pbnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmF0ZUxpbWl0UGVyTWludXRlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhbihvYmo6IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWxsb3dlZFNvdXJjZXMnOiBvYmouYWxsb3dlZFNvdXJjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ3JhdGVMaW1pdFBlck1pbnV0ZSc6IG9iai5yYXRlTGltaXRQZXJNaW51dGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwdXJnZSBjb25maWd1cmVzIEhUVFAgUFVSR0UtYmFzZWQgY2FjaGUgaW52YWxpZGF0aW9uLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2Uge1xuICAvKipcbiAgICogYWxsb3dlZFNvdXJjZXMgaXMgYSBsaXN0IG9mIENJRFIgcmFuZ2VzIHBlcm1pdHRlZCB0byBzZW5kIFBVUkdFIHJlcXVlc3RzLlxuICAgKiBJZiBlbXB0eSwgbm8gc291cmNlIHJlc3RyaWN0aW9uIGlzIGFwcGxpZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZSNhbGxvd2VkU291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZFNvdXJjZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgdGhlIFBVUkdFIGludmFsaWRhdGlvbiBoYW5kbGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2UjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHNvZnQgZW5hYmxlcyBzb2Z0IHB1cmdlcywgd2hpY2ggbWFyayBvYmplY3RzIGFzIGV4cGlyZWQgcmF0aGVyIHRoYW4gcmVtb3ZpbmcgdGhlbS5cbiAgICogVGhpcyBhbGxvd3MgVmFybmlzaCB0byBzZXJ2ZSBzdGFsZSBjb250ZW50IHdoaWxlIHJldmFsaWRhdGluZy4gRGVmYXVsdDogdHJ1ZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlI3NvZnRcbiAgICovXG4gIHJlYWRvbmx5IHNvZnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2Uob2JqOiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWxsb3dlZFNvdXJjZXMnOiBvYmouYWxsb3dlZFNvdXJjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ3NvZnQnOiBvYmouc29mdCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHhrZXkgY29uZmlndXJlcyB4a2V5LWJhc2VkIHN1cnJvZ2F0ZSBrZXkgaW52YWxpZGF0aW9uIChyZXF1aXJlcyB2bW9kX3hrZXkpLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5IHtcbiAgLyoqXG4gICAqIGFsbG93ZWRTb3VyY2VzIGlzIGEgbGlzdCBvZiBDSURSIHJhbmdlcyBwZXJtaXR0ZWQgdG8gc2VuZCB4a2V5IGludmFsaWRhdGlvbiByZXF1ZXN0cy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkjYWxsb3dlZFNvdXJjZXNcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRTb3VyY2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIGVuYWJsZWQgYWN0aXZhdGVzIHhrZXktYmFzZWQgaW52YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleSNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogc29mdFB1cmdlIGVuYWJsZXMgc29mdCBwdXJnaW5nIHZpYSB4a2V5LiBEZWZhdWx0OiB0cnVlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleSNzb2Z0UHVyZ2VcbiAgICovXG4gIHJlYWRvbmx5IHNvZnRQdXJnZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkob2JqOiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbGxvd2VkU291cmNlcyc6IG9iai5hbGxvd2VkU291cmNlcz8ubWFwKHkgPT4geSksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnc29mdFB1cmdlJzogb2JqLnNvZnRQdXJnZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGV4cG9ydGVyIGNvbmZpZ3VyZXMgdGhlIHByb21ldGhldXNfdmFybmlzaF9leHBvcnRlciBzaWRlY2FyIHRoYXQgZXhwb3Nlc1xuICogbmF0aXZlIHZhcm5pc2hfKiBtZXRyaWNzIChjYWNoZSBoaXQvbWlzcywgYmFja2VuZCBoZWFsdGgpIGZyb20gdmFybmlzaHN0YXQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVyIHtcbiAgLyoqXG4gICAqIGVuYWJsZWQgYWRkcyBhIHByb21ldGhldXNfdmFybmlzaF9leHBvcnRlciBzaWRlY2FyIHRvIGVhY2ggVmFybmlzaCBwb2QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXIjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGltYWdlIG92ZXJyaWRlcyB0aGUgZXhwb3J0ZXIgaW1hZ2UuIERlZmF1bHRzIHRvXG4gICAqIGdoY3IuaW8vYmx1ZWR5bmFtaWNzL3Zhcm5pc2gtZXhwb3J0ZXI6MS42LjEuXG4gICAqXG4gICAqIEBkZWZhdWx0IGdoY3IuaW8vYmx1ZWR5bmFtaWNzL3Zhcm5pc2gtZXhwb3J0ZXI6MS42LjEuXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXIjaW1hZ2VcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlPzogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXJJbWFnZTtcblxuICAvKipcbiAgICogcG9ydCBpcyB0aGUgY29udGFpbmVyIHBvcnQgdGhlIGV4cG9ydGVyIGxpc3RlbnMgb24uIERlZmF1bHRzIHRvIDkxMzEuXG4gICAqXG4gICAqIEBkZWZhdWx0IDkxMzEuXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXIjcG9ydFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogcmVzb3VyY2VzIHNldHMgdGhlIGV4cG9ydGVyIGNvbnRhaW5lciByZXNvdXJjZSByZXF1aXJlbWVudHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXIjcmVzb3VyY2VzXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZXM/OiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlclJlc291cmNlcztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXInIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXIob2JqOiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnaW1hZ2UnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXJJbWFnZShvYmouaW1hZ2UpLFxuICAgICdwb3J0Jzogb2JqLnBvcnQsXG4gICAgJ3Jlc291cmNlcyc6IHRvSnNvbl9WaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlclJlc291cmNlcyhvYmoucmVzb3VyY2VzKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHByb21ldGhldXNSdWxlcyBjb25maWd1cmVzIFByb21ldGhldXNSdWxlIG9iamVjdHMgZm9yIGFsZXJ0aW5nLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzIHtcbiAgLyoqXG4gICAqIGVuYWJsZWQgY3JlYXRlcyBhIFByb21ldGhldXNSdWxlIHdpdGggZGVmYXVsdCBhbGVydGluZyBydWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXMjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXMob2JqOiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZXJ2aWNlTW9uaXRvciBjb25maWd1cmVzIGEgU2VydmljZU1vbml0b3IgZm9yIFByb21ldGhldXMgT3BlcmF0b3Igc2NyYXBpbmcuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yIHtcbiAgLyoqXG4gICAqIGVuYWJsZWQgY3JlYXRlcyBhIFNlcnZpY2VNb25pdG9yIHRhcmdldGluZyB0aGUgVmFybmlzaCBtZXRyaWNzIGVuZHBvaW50LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBpbnRlcnZhbCBpcyB0aGUgc2NyYXBlIGludGVydmFsIChlLmcuIFwiMzBzXCIpLiBEZWZhdWx0cyB0byB0aGUgUHJvbWV0aGV1cyBnbG9iYWwgaW50ZXJ2YWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBQcm9tZXRoZXVzIGdsb2JhbCBpbnRlcnZhbC5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvciNpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yKG9iajogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2ludGVydmFsJzogb2JqLmludGVydmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYWZmaW5pdHkgY29uZmlndXJlcyBwb2QgYWZmaW5pdHkgYW5kIGFudGktYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5IHtcbiAgLyoqXG4gICAqIERlc2NyaWJlcyBub2RlIGFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgZm9yIHRoZSBwb2QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eSNub2RlQWZmaW5pdHlcbiAgICovXG4gIHJlYWRvbmx5IG5vZGVBZmZpbml0eT86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHk7XG5cbiAgLyoqXG4gICAqIERlc2NyaWJlcyBwb2QgYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcyAoZS5nLiBjby1sb2NhdGUgdGhpcyBwb2QgaW4gdGhlIHNhbWUgbm9kZSwgem9uZSwgZXRjLiBhcyBzb21lIG90aGVyIHBvZChzKSkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eSNwb2RBZmZpbml0eVxuICAgKi9cbiAgcmVhZG9ubHkgcG9kQWZmaW5pdHk/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHk7XG5cbiAgLyoqXG4gICAqIERlc2NyaWJlcyBwb2QgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzIChlLmcuIGF2b2lkIHB1dHRpbmcgdGhpcyBwb2QgaW4gdGhlIHNhbWUgbm9kZSwgem9uZSwgZXRjLiBhcyBzb21lIG90aGVyIHBvZChzKSkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eSNwb2RBbnRpQWZmaW5pdHlcbiAgICovXG4gIHJlYWRvbmx5IHBvZEFudGlBZmZpbml0eT86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdub2RlQWZmaW5pdHknOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eShvYmoubm9kZUFmZmluaXR5KSxcbiAgICAncG9kQWZmaW5pdHknOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5KG9iai5wb2RBZmZpbml0eSksXG4gICAgJ3BvZEFudGlBZmZpbml0eSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5KG9iai5wb2RBbnRpQWZmaW5pdHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogVGhlIHBvZCB0aGlzIFRvbGVyYXRpb24gaXMgYXR0YWNoZWQgdG8gdG9sZXJhdGVzIGFueSB0YWludCB0aGF0IG1hdGNoZXNcbiAqIHRoZSB0cmlwbGUgPGtleSx2YWx1ZSxlZmZlY3Q+IHVzaW5nIHRoZSBtYXRjaGluZyBvcGVyYXRvciA8b3BlcmF0b3I+LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMge1xuICAvKipcbiAgICogRWZmZWN0IGluZGljYXRlcyB0aGUgdGFpbnQgZWZmZWN0IHRvIG1hdGNoLiBFbXB0eSBtZWFucyBtYXRjaCBhbGwgdGFpbnQgZWZmZWN0cy5cbiAgICogV2hlbiBzcGVjaWZpZWQsIGFsbG93ZWQgdmFsdWVzIGFyZSBOb1NjaGVkdWxlLCBQcmVmZXJOb1NjaGVkdWxlIGFuZCBOb0V4ZWN1dGUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyNlZmZlY3RcbiAgICovXG4gIHJlYWRvbmx5IGVmZmVjdD86IHN0cmluZztcblxuICAvKipcbiAgICogS2V5IGlzIHRoZSB0YWludCBrZXkgdGhhdCB0aGUgdG9sZXJhdGlvbiBhcHBsaWVzIHRvLiBFbXB0eSBtZWFucyBtYXRjaCBhbGwgdGFpbnQga2V5cy5cbiAgICogSWYgdGhlIGtleSBpcyBlbXB0eSwgb3BlcmF0b3IgbXVzdCBiZSBFeGlzdHM7IHRoaXMgY29tYmluYXRpb24gbWVhbnMgdG8gbWF0Y2ggYWxsIHZhbHVlcyBhbmQgYWxsIGtleXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleT86IHN0cmluZztcblxuICAvKipcbiAgICogT3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byB0aGUgdmFsdWUuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgRXhpc3RzLCBFcXVhbCwgTHQsIGFuZCBHdC4gRGVmYXVsdHMgdG8gRXF1YWwuXG4gICAqIEV4aXN0cyBpcyBlcXVpdmFsZW50IHRvIHdpbGRjYXJkIGZvciB2YWx1ZSwgc28gdGhhdCBhIHBvZCBjYW5cbiAgICogdG9sZXJhdGUgYWxsIHRhaW50cyBvZiBhIHBhcnRpY3VsYXIgY2F0ZWdvcnkuXG4gICAqIEx0IGFuZCBHdCBwZXJmb3JtIG51bWVyaWMgY29tcGFyaXNvbnMgKHJlcXVpcmVzIGZlYXR1cmUgZ2F0ZSBUYWludFRvbGVyYXRpb25Db21wYXJpc29uT3BlcmF0b3JzKS5cbiAgICpcbiAgICogQGRlZmF1bHQgRXF1YWwuXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvbGVyYXRpb25TZWNvbmRzIHJlcHJlc2VudHMgdGhlIHBlcmlvZCBvZiB0aW1lIHRoZSB0b2xlcmF0aW9uICh3aGljaCBtdXN0IGJlXG4gICAqIG9mIGVmZmVjdCBOb0V4ZWN1dGUsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIGlnbm9yZWQpIHRvbGVyYXRlcyB0aGUgdGFpbnQuIEJ5IGRlZmF1bHQsXG4gICAqIGl0IGlzIG5vdCBzZXQsIHdoaWNoIG1lYW5zIHRvbGVyYXRlIHRoZSB0YWludCBmb3JldmVyIChkbyBub3QgZXZpY3QpLiBaZXJvIGFuZFxuICAgKiBuZWdhdGl2ZSB2YWx1ZXMgd2lsbCBiZSB0cmVhdGVkIGFzIDAgKGV2aWN0IGltbWVkaWF0ZWx5KSBieSB0aGUgc3lzdGVtLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMjdG9sZXJhdGlvblNlY29uZHNcbiAgICovXG4gIHJlYWRvbmx5IHRvbGVyYXRpb25TZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBWYWx1ZSBpcyB0aGUgdGFpbnQgdmFsdWUgdGhlIHRvbGVyYXRpb24gbWF0Y2hlcyB0by5cbiAgICogSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cywgdGhlIHZhbHVlIHNob3VsZCBiZSBlbXB0eSwgb3RoZXJ3aXNlIGp1c3QgYSByZWd1bGFyIHN0cmluZy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zI3ZhbHVlXG4gICAqL1xuICByZWFkb25seSB2YWx1ZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VmZmVjdCc6IG9iai5lZmZlY3QsXG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd0b2xlcmF0aW9uU2Vjb25kcyc6IG9iai50b2xlcmF0aW9uU2Vjb25kcyxcbiAgICAndmFsdWUnOiBvYmoudmFsdWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBWb2x1bWVNb3VudCBkZXNjcmliZXMgYSBtb3VudGluZyBvZiBhIFZvbHVtZSB3aXRoaW4gYSBjb250YWluZXIuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZU1vdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lTW91bnRzIHtcbiAgLyoqXG4gICAqIFBhdGggd2l0aGluIHRoZSBjb250YWluZXIgYXQgd2hpY2ggdGhlIHZvbHVtZSBzaG91bGQgYmUgbW91bnRlZC4gIE11c3RcbiAgICogbm90IGNvbnRhaW4gJzonLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lTW91bnRzI21vdW50UGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgbW91bnRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG1vdW50UHJvcGFnYXRpb24gZGV0ZXJtaW5lcyBob3cgbW91bnRzIGFyZSBwcm9wYWdhdGVkIGZyb20gdGhlIGhvc3RcbiAgICogdG8gY29udGFpbmVyIGFuZCB0aGUgb3RoZXIgd2F5IGFyb3VuZC5cbiAgICogV2hlbiBub3Qgc2V0LCBNb3VudFByb3BhZ2F0aW9uTm9uZSBpcyB1c2VkLlxuICAgKiBUaGlzIGZpZWxkIGlzIGJldGEgaW4gMS4xMC5cbiAgICogV2hlbiBSZWN1cnNpdmVSZWFkT25seSBpcyBzZXQgdG8gSWZQb3NzaWJsZSBvciB0byBFbmFibGVkLCBNb3VudFByb3BhZ2F0aW9uIG11c3QgYmUgTm9uZSBvciB1bnNwZWNpZmllZFxuICAgKiAod2hpY2ggZGVmYXVsdHMgdG8gTm9uZSkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVNb3VudHMjbW91bnRQcm9wYWdhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbW91bnRQcm9wYWdhdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhpcyBtdXN0IG1hdGNoIHRoZSBOYW1lIG9mIGEgVm9sdW1lLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lTW91bnRzI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogTW91bnRlZCByZWFkLW9ubHkgaWYgdHJ1ZSwgcmVhZC13cml0ZSBvdGhlcndpc2UgKGZhbHNlIG9yIHVuc3BlY2lmaWVkKS5cbiAgICogRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlLlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lTW91bnRzI3JlYWRPbmx5XG4gICAqL1xuICByZWFkb25seSByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZVJlYWRPbmx5IHNwZWNpZmllcyB3aGV0aGVyIHJlYWQtb25seSBtb3VudHMgc2hvdWxkIGJlIGhhbmRsZWRcbiAgICogcmVjdXJzaXZlbHkuXG4gICAqXG4gICAqIElmIFJlYWRPbmx5IGlzIGZhbHNlLCB0aGlzIGZpZWxkIGhhcyBubyBtZWFuaW5nIGFuZCBtdXN0IGJlIHVuc3BlY2lmaWVkLlxuICAgKlxuICAgKiBJZiBSZWFkT25seSBpcyB0cnVlLCBhbmQgdGhpcyBmaWVsZCBpcyBzZXQgdG8gRGlzYWJsZWQsIHRoZSBtb3VudCBpcyBub3QgbWFkZVxuICAgKiByZWN1cnNpdmVseSByZWFkLW9ubHkuICBJZiB0aGlzIGZpZWxkIGlzIHNldCB0byBJZlBvc3NpYmxlLCB0aGUgbW91bnQgaXMgbWFkZVxuICAgKiByZWN1cnNpdmVseSByZWFkLW9ubHksIGlmIGl0IGlzIHN1cHBvcnRlZCBieSB0aGUgY29udGFpbmVyIHJ1bnRpbWUuICBJZiB0aGlzXG4gICAqIGZpZWxkIGlzIHNldCB0byBFbmFibGVkLCB0aGUgbW91bnQgaXMgbWFkZSByZWN1cnNpdmVseSByZWFkLW9ubHkgaWYgaXQgaXNcbiAgICogc3VwcG9ydGVkIGJ5IHRoZSBjb250YWluZXIgcnVudGltZSwgb3RoZXJ3aXNlIHRoZSBwb2Qgd2lsbCBub3QgYmUgc3RhcnRlZCBhbmRcbiAgICogYW4gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQgdG8gaW5kaWNhdGUgdGhlIHJlYXNvbi5cbiAgICpcbiAgICogSWYgdGhpcyBmaWVsZCBpcyBzZXQgdG8gSWZQb3NzaWJsZSBvciBFbmFibGVkLCBNb3VudFByb3BhZ2F0aW9uIG11c3QgYmUgc2V0IHRvXG4gICAqIE5vbmUgKG9yIGJlIHVuc3BlY2lmaWVkLCB3aGljaCBkZWZhdWx0cyB0byBOb25lKS5cbiAgICpcbiAgICogSWYgdGhpcyBmaWVsZCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyB0cmVhdGVkIGFzIGFuIGVxdWl2YWxlbnQgb2YgRGlzYWJsZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVNb3VudHMjcmVjdXJzaXZlUmVhZE9ubHlcbiAgICovXG4gIHJlYWRvbmx5IHJlY3Vyc2l2ZVJlYWRPbmx5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHdpdGhpbiB0aGUgdm9sdW1lIGZyb20gd2hpY2ggdGhlIGNvbnRhaW5lcidzIHZvbHVtZSBzaG91bGQgYmUgbW91bnRlZC5cbiAgICogRGVmYXVsdHMgdG8gXCJcIiAodm9sdW1lJ3Mgcm9vdCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IHZvbHVtZSdzIHJvb3QpLlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lTW91bnRzI3N1YlBhdGhcbiAgICovXG4gIHJlYWRvbmx5IHN1YlBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4cGFuZGVkIHBhdGggd2l0aGluIHRoZSB2b2x1bWUgZnJvbSB3aGljaCB0aGUgY29udGFpbmVyJ3Mgdm9sdW1lIHNob3VsZCBiZSBtb3VudGVkLlxuICAgKiBCZWhhdmVzIHNpbWlsYXJseSB0byBTdWJQYXRoIGJ1dCBlbnZpcm9ubWVudCB2YXJpYWJsZSByZWZlcmVuY2VzICQoVkFSX05BTUUpIGFyZSBleHBhbmRlZCB1c2luZyB0aGUgY29udGFpbmVyJ3MgZW52aXJvbm1lbnQuXG4gICAqIERlZmF1bHRzIHRvIFwiXCIgKHZvbHVtZSdzIHJvb3QpLlxuICAgKiBTdWJQYXRoRXhwciBhbmQgU3ViUGF0aCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB2b2x1bWUncyByb290KS5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZU1vdW50cyNzdWJQYXRoRXhwclxuICAgKi9cbiAgcmVhZG9ubHkgc3ViUGF0aEV4cHI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lTW91bnRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lTW91bnRzKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVNb3VudHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtb3VudFBhdGgnOiBvYmoubW91bnRQYXRoLFxuICAgICdtb3VudFByb3BhZ2F0aW9uJzogb2JqLm1vdW50UHJvcGFnYXRpb24sXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAncmVhZE9ubHknOiBvYmoucmVhZE9ubHksXG4gICAgJ3JlY3Vyc2l2ZVJlYWRPbmx5Jzogb2JqLnJlY3Vyc2l2ZVJlYWRPbmx5LFxuICAgICdzdWJQYXRoJzogb2JqLnN1YlBhdGgsXG4gICAgJ3N1YlBhdGhFeHByJzogb2JqLnN1YlBhdGhFeHByLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogVm9sdW1lIHJlcHJlc2VudHMgYSBuYW1lZCB2b2x1bWUgaW4gYSBwb2QgdGhhdCBtYXkgYmUgYWNjZXNzZWQgYnkgYW55IGNvbnRhaW5lciBpbiB0aGUgcG9kLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzIHtcbiAgLyoqXG4gICAqIGF3c0VsYXN0aWNCbG9ja1N0b3JlIHJlcHJlc2VudHMgYW4gQVdTIERpc2sgcmVzb3VyY2UgdGhhdCBpcyBhdHRhY2hlZCB0byBhXG4gICAqIGt1YmVsZXQncyBob3N0IG1hY2hpbmUgYW5kIHRoZW4gZXhwb3NlZCB0byB0aGUgcG9kLlxuICAgKiBEZXByZWNhdGVkOiBBV1NFbGFzdGljQmxvY2tTdG9yZSBpcyBkZXByZWNhdGVkLiBBbGwgb3BlcmF0aW9ucyBmb3IgdGhlIGluLXRyZWVcbiAgICogYXdzRWxhc3RpY0Jsb2NrU3RvcmUgdHlwZSBhcmUgcmVkaXJlY3RlZCB0byB0aGUgZWJzLmNzaS5hd3MuY29tIENTSSBkcml2ZXIuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS92b2x1bWVzI2F3c2VsYXN0aWNibG9ja3N0b3JlXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzI2F3c0VsYXN0aWNCbG9ja1N0b3JlXG4gICAqL1xuICByZWFkb25seSBhd3NFbGFzdGljQmxvY2tTdG9yZT86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0F3c0VsYXN0aWNCbG9ja1N0b3JlO1xuXG4gIC8qKlxuICAgKiBhenVyZURpc2sgcmVwcmVzZW50cyBhbiBBenVyZSBEYXRhIERpc2sgbW91bnQgb24gdGhlIGhvc3QgYW5kIGJpbmQgbW91bnQgdG8gdGhlIHBvZC5cbiAgICogRGVwcmVjYXRlZDogQXp1cmVEaXNrIGlzIGRlcHJlY2F0ZWQuIEFsbCBvcGVyYXRpb25zIGZvciB0aGUgaW4tdHJlZSBhenVyZURpc2sgdHlwZVxuICAgKiBhcmUgcmVkaXJlY3RlZCB0byB0aGUgZGlzay5jc2kuYXp1cmUuY29tIENTSSBkcml2ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzI2F6dXJlRGlza1xuICAgKi9cbiAgcmVhZG9ubHkgYXp1cmVEaXNrPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXp1cmVEaXNrO1xuXG4gIC8qKlxuICAgKiBhenVyZUZpbGUgcmVwcmVzZW50cyBhbiBBenVyZSBGaWxlIFNlcnZpY2UgbW91bnQgb24gdGhlIGhvc3QgYW5kIGJpbmQgbW91bnQgdG8gdGhlIHBvZC5cbiAgICogRGVwcmVjYXRlZDogQXp1cmVGaWxlIGlzIGRlcHJlY2F0ZWQuIEFsbCBvcGVyYXRpb25zIGZvciB0aGUgaW4tdHJlZSBhenVyZUZpbGUgdHlwZVxuICAgKiBhcmUgcmVkaXJlY3RlZCB0byB0aGUgZmlsZS5jc2kuYXp1cmUuY29tIENTSSBkcml2ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzI2F6dXJlRmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgYXp1cmVGaWxlPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXp1cmVGaWxlO1xuXG4gIC8qKlxuICAgKiBjZXBoRlMgcmVwcmVzZW50cyBhIENlcGggRlMgbW91bnQgb24gdGhlIGhvc3QgdGhhdCBzaGFyZXMgYSBwb2QncyBsaWZldGltZS5cbiAgICogRGVwcmVjYXRlZDogQ2VwaEZTIGlzIGRlcHJlY2F0ZWQgYW5kIHRoZSBpbi10cmVlIGNlcGhmcyB0eXBlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzI2NlcGhmc1xuICAgKi9cbiAgcmVhZG9ubHkgY2VwaGZzPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2VwaGZzO1xuXG4gIC8qKlxuICAgKiBjaW5kZXIgcmVwcmVzZW50cyBhIGNpbmRlciB2b2x1bWUgYXR0YWNoZWQgYW5kIG1vdW50ZWQgb24ga3ViZWxldHMgaG9zdCBtYWNoaW5lLlxuICAgKiBEZXByZWNhdGVkOiBDaW5kZXIgaXMgZGVwcmVjYXRlZC4gQWxsIG9wZXJhdGlvbnMgZm9yIHRoZSBpbi10cmVlIGNpbmRlciB0eXBlXG4gICAqIGFyZSByZWRpcmVjdGVkIHRvIHRoZSBjaW5kZXIuY3NpLm9wZW5zdGFjay5vcmcgQ1NJIGRyaXZlci5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2V4YW1wbGVzLms4cy5pby9teXNxbC1jaW5kZXItcGQvUkVBRE1FLm1kXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzI2NpbmRlclxuICAgKi9cbiAgcmVhZG9ubHkgY2luZGVyPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2luZGVyO1xuXG4gIC8qKlxuICAgKiBjb25maWdNYXAgcmVwcmVzZW50cyBhIGNvbmZpZ01hcCB0aGF0IHNob3VsZCBwb3B1bGF0ZSB0aGlzIHZvbHVtZVxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lcyNjb25maWdNYXBcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ01hcD86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NvbmZpZ01hcDtcblxuICAvKipcbiAgICogY3NpIChDb250YWluZXIgU3RvcmFnZSBJbnRlcmZhY2UpIHJlcHJlc2VudHMgZXBoZW1lcmFsIHN0b3JhZ2UgdGhhdCBpcyBoYW5kbGVkIGJ5IGNlcnRhaW4gZXh0ZXJuYWwgQ1NJIGRyaXZlcnMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzI2NzaVxuICAgKi9cbiAgcmVhZG9ubHkgY3NpPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ3NpO1xuXG4gIC8qKlxuICAgKiBkb3dud2FyZEFQSSByZXByZXNlbnRzIGRvd253YXJkIEFQSSBhYm91dCB0aGUgcG9kIHRoYXQgc2hvdWxkIHBvcHVsYXRlIHRoaXMgdm9sdW1lXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzI2Rvd253YXJkQVBJXG4gICAqL1xuICByZWFkb25seSBkb3dud2FyZEFwaT86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpO1xuXG4gIC8qKlxuICAgKiBlbXB0eURpciByZXByZXNlbnRzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHNoYXJlcyBhIHBvZCdzIGxpZmV0aW1lLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcyNlbXB0eWRpclxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lcyNlbXB0eURpclxuICAgKi9cbiAgcmVhZG9ubHkgZW1wdHlEaXI/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFbXB0eURpcjtcblxuICAvKipcbiAgICogZXBoZW1lcmFsIHJlcHJlc2VudHMgYSB2b2x1bWUgdGhhdCBpcyBoYW5kbGVkIGJ5IGEgY2x1c3RlciBzdG9yYWdlIGRyaXZlci5cbiAgICogVGhlIHZvbHVtZSdzIGxpZmVjeWNsZSBpcyB0aWVkIHRvIHRoZSBwb2QgdGhhdCBkZWZpbmVzIGl0IC0gaXQgd2lsbCBiZSBjcmVhdGVkIGJlZm9yZSB0aGUgcG9kIHN0YXJ0cyxcbiAgICogYW5kIGRlbGV0ZWQgd2hlbiB0aGUgcG9kIGlzIHJlbW92ZWQuXG4gICAqXG4gICAqIFVzZSB0aGlzIGlmOlxuICAgKiBhKSB0aGUgdm9sdW1lIGlzIG9ubHkgbmVlZGVkIHdoaWxlIHRoZSBwb2QgcnVucyxcbiAgICogYikgZmVhdHVyZXMgb2Ygbm9ybWFsIHZvbHVtZXMgbGlrZSByZXN0b3JpbmcgZnJvbSBzbmFwc2hvdCBvciBjYXBhY2l0eVxuICAgKiB0cmFja2luZyBhcmUgbmVlZGVkLFxuICAgKiBjKSB0aGUgc3RvcmFnZSBkcml2ZXIgaXMgc3BlY2lmaWVkIHRocm91Z2ggYSBzdG9yYWdlIGNsYXNzLCBhbmRcbiAgICogZCkgdGhlIHN0b3JhZ2UgZHJpdmVyIHN1cHBvcnRzIGR5bmFtaWMgdm9sdW1lIHByb3Zpc2lvbmluZyB0aHJvdWdoXG4gICAqIGEgUGVyc2lzdGVudFZvbHVtZUNsYWltIChzZWUgRXBoZW1lcmFsVm9sdW1lU291cmNlIGZvciBtb3JlXG4gICAqIGluZm9ybWF0aW9uIG9uIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhpcyB2b2x1bWUgdHlwZVxuICAgKiBhbmQgUGVyc2lzdGVudFZvbHVtZUNsYWltKS5cbiAgICpcbiAgICogVXNlIFBlcnNpc3RlbnRWb2x1bWVDbGFpbSBvciBvbmUgb2YgdGhlIHZlbmRvci1zcGVjaWZpY1xuICAgKiBBUElzIGZvciB2b2x1bWVzIHRoYXQgcGVyc2lzdCBmb3IgbG9uZ2VyIHRoYW4gdGhlIGxpZmVjeWNsZVxuICAgKiBvZiBhbiBpbmRpdmlkdWFsIHBvZC5cbiAgICpcbiAgICogVXNlIENTSSBmb3IgbGlnaHQtd2VpZ2h0IGxvY2FsIGVwaGVtZXJhbCB2b2x1bWVzIGlmIHRoZSBDU0kgZHJpdmVyIGlzIG1lYW50IHRvXG4gICAqIGJlIHVzZWQgdGhhdCB3YXkgLSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGRyaXZlciBmb3JcbiAgICogbW9yZSBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQSBwb2QgY2FuIHVzZSBib3RoIHR5cGVzIG9mIGVwaGVtZXJhbCB2b2x1bWVzIGFuZFxuICAgKiBwZXJzaXN0ZW50IHZvbHVtZXMgYXQgdGhlIHNhbWUgdGltZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXMjZXBoZW1lcmFsXG4gICAqL1xuICByZWFkb25seSBlcGhlbWVyYWw/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWw7XG5cbiAgLyoqXG4gICAqIGZjIHJlcHJlc2VudHMgYSBGaWJyZSBDaGFubmVsIHJlc291cmNlIHRoYXQgaXMgYXR0YWNoZWQgdG8gYSBrdWJlbGV0J3MgaG9zdCBtYWNoaW5lIGFuZCB0aGVuIGV4cG9zZWQgdG8gdGhlIHBvZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXMjZmNcbiAgICovXG4gIHJlYWRvbmx5IGZjPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmM7XG5cbiAgLyoqXG4gICAqIGZsZXhWb2x1bWUgcmVwcmVzZW50cyBhIGdlbmVyaWMgdm9sdW1lIHJlc291cmNlIHRoYXQgaXNcbiAgICogcHJvdmlzaW9uZWQvYXR0YWNoZWQgdXNpbmcgYW4gZXhlYyBiYXNlZCBwbHVnaW4uXG4gICAqIERlcHJlY2F0ZWQ6IEZsZXhWb2x1bWUgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgdXNpbmcgYSBDU0lEcml2ZXIgaW5zdGVhZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXMjZmxleFZvbHVtZVxuICAgKi9cbiAgcmVhZG9ubHkgZmxleFZvbHVtZT86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ZsZXhWb2x1bWU7XG5cbiAgLyoqXG4gICAqIGZsb2NrZXIgcmVwcmVzZW50cyBhIEZsb2NrZXIgdm9sdW1lIGF0dGFjaGVkIHRvIGEga3ViZWxldCdzIGhvc3QgbWFjaGluZS4gVGhpcyBkZXBlbmRzIG9uIHRoZSBGbG9ja2VyIGNvbnRyb2wgc2VydmljZSBiZWluZyBydW5uaW5nLlxuICAgKiBEZXByZWNhdGVkOiBGbG9ja2VyIGlzIGRlcHJlY2F0ZWQgYW5kIHRoZSBpbi10cmVlIGZsb2NrZXIgdHlwZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lcyNmbG9ja2VyXG4gICAqL1xuICByZWFkb25seSBmbG9ja2VyPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmxvY2tlcjtcblxuICAvKipcbiAgICogZ2NlUGVyc2lzdGVudERpc2sgcmVwcmVzZW50cyBhIEdDRSBEaXNrIHJlc291cmNlIHRoYXQgaXMgYXR0YWNoZWQgdG8gYVxuICAgKiBrdWJlbGV0J3MgaG9zdCBtYWNoaW5lIGFuZCB0aGVuIGV4cG9zZWQgdG8gdGhlIHBvZC5cbiAgICogRGVwcmVjYXRlZDogR0NFUGVyc2lzdGVudERpc2sgaXMgZGVwcmVjYXRlZC4gQWxsIG9wZXJhdGlvbnMgZm9yIHRoZSBpbi10cmVlXG4gICAqIGdjZVBlcnNpc3RlbnREaXNrIHR5cGUgYXJlIHJlZGlyZWN0ZWQgdG8gdGhlIHBkLmNzaS5zdG9yYWdlLmdrZS5pbyBDU0kgZHJpdmVyLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcyNnY2VwZXJzaXN0ZW50ZGlza1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lcyNnY2VQZXJzaXN0ZW50RGlza1xuICAgKi9cbiAgcmVhZG9ubHkgZ2NlUGVyc2lzdGVudERpc2s/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNHY2VQZXJzaXN0ZW50RGlzaztcblxuICAvKipcbiAgICogZ2l0UmVwbyByZXByZXNlbnRzIGEgZ2l0IHJlcG9zaXRvcnkgYXQgYSBwYXJ0aWN1bGFyIHJldmlzaW9uLlxuICAgKiBEZXByZWNhdGVkOiBHaXRSZXBvIGlzIGRlcHJlY2F0ZWQuIFRvIHByb3Zpc2lvbiBhIGNvbnRhaW5lciB3aXRoIGEgZ2l0IHJlcG8sIG1vdW50IGFuXG4gICAqIEVtcHR5RGlyIGludG8gYW4gSW5pdENvbnRhaW5lciB0aGF0IGNsb25lcyB0aGUgcmVwbyB1c2luZyBnaXQsIHRoZW4gbW91bnQgdGhlIEVtcHR5RGlyXG4gICAqIGludG8gdGhlIFBvZCdzIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXMjZ2l0UmVwb1xuICAgKi9cbiAgcmVhZG9ubHkgZ2l0UmVwbz86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0dpdFJlcG87XG5cbiAgLyoqXG4gICAqIGdsdXN0ZXJmcyByZXByZXNlbnRzIGEgR2x1c3RlcmZzIG1vdW50IG9uIHRoZSBob3N0IHRoYXQgc2hhcmVzIGEgcG9kJ3MgbGlmZXRpbWUuXG4gICAqIERlcHJlY2F0ZWQ6IEdsdXN0ZXJmcyBpcyBkZXByZWNhdGVkIGFuZCB0aGUgaW4tdHJlZSBnbHVzdGVyZnMgdHlwZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lcyNnbHVzdGVyZnNcbiAgICovXG4gIHJlYWRvbmx5IGdsdXN0ZXJmcz86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0dsdXN0ZXJmcztcblxuICAvKipcbiAgICogaG9zdFBhdGggcmVwcmVzZW50cyBhIHByZS1leGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSBvbiB0aGUgaG9zdFxuICAgKiBtYWNoaW5lIHRoYXQgaXMgZGlyZWN0bHkgZXhwb3NlZCB0byB0aGUgY29udGFpbmVyLiBUaGlzIGlzIGdlbmVyYWxseVxuICAgKiB1c2VkIGZvciBzeXN0ZW0gYWdlbnRzIG9yIG90aGVyIHByaXZpbGVnZWQgdGhpbmdzIHRoYXQgYXJlIGFsbG93ZWRcbiAgICogdG8gc2VlIHRoZSBob3N0IG1hY2hpbmUuIE1vc3QgY29udGFpbmVycyB3aWxsIE5PVCBuZWVkIHRoaXMuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS92b2x1bWVzI2hvc3RwYXRoXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzI2hvc3RQYXRoXG4gICAqL1xuICByZWFkb25seSBob3N0UGF0aD86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0hvc3RQYXRoO1xuXG4gIC8qKlxuICAgKiBpbWFnZSByZXByZXNlbnRzIGFuIE9DSSBvYmplY3QgKGEgY29udGFpbmVyIGltYWdlIG9yIGFydGlmYWN0KSBwdWxsZWQgYW5kIG1vdW50ZWQgb24gdGhlIGt1YmVsZXQncyBob3N0IG1hY2hpbmUuXG4gICAqIFRoZSB2b2x1bWUgaXMgcmVzb2x2ZWQgYXQgcG9kIHN0YXJ0dXAgZGVwZW5kaW5nIG9uIHdoaWNoIFB1bGxQb2xpY3kgdmFsdWUgaXMgcHJvdmlkZWQ6XG4gICAqXG4gICAqIC0gQWx3YXlzOiB0aGUga3ViZWxldCBhbHdheXMgYXR0ZW1wdHMgdG8gcHVsbCB0aGUgcmVmZXJlbmNlLiBDb250YWluZXIgY3JlYXRpb24gd2lsbCBmYWlsIElmIHRoZSBwdWxsIGZhaWxzLlxuICAgKiAtIE5ldmVyOiB0aGUga3ViZWxldCBuZXZlciBwdWxscyB0aGUgcmVmZXJlbmNlIGFuZCBvbmx5IHVzZXMgYSBsb2NhbCBpbWFnZSBvciBhcnRpZmFjdC4gQ29udGFpbmVyIGNyZWF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgcmVmZXJlbmNlIGlzbid0IHByZXNlbnQuXG4gICAqIC0gSWZOb3RQcmVzZW50OiB0aGUga3ViZWxldCBwdWxscyBpZiB0aGUgcmVmZXJlbmNlIGlzbid0IGFscmVhZHkgcHJlc2VudCBvbiBkaXNrLiBDb250YWluZXIgY3JlYXRpb24gd2lsbCBmYWlsIGlmIHRoZSByZWZlcmVuY2UgaXNuJ3QgcHJlc2VudCBhbmQgdGhlIHB1bGwgZmFpbHMuXG4gICAqXG4gICAqIFRoZSB2b2x1bWUgZ2V0cyByZS1yZXNvbHZlZCBpZiB0aGUgcG9kIGdldHMgZGVsZXRlZCBhbmQgcmVjcmVhdGVkLCB3aGljaCBtZWFucyB0aGF0IG5ldyByZW1vdGUgY29udGVudCB3aWxsIGJlY29tZSBhdmFpbGFibGUgb24gcG9kIHJlY3JlYXRpb24uXG4gICAqIEEgZmFpbHVyZSB0byByZXNvbHZlIG9yIHB1bGwgdGhlIGltYWdlIGR1cmluZyBwb2Qgc3RhcnR1cCB3aWxsIGJsb2NrIGNvbnRhaW5lcnMgZnJvbSBzdGFydGluZyBhbmQgbWF5IGFkZCBzaWduaWZpY2FudCBsYXRlbmN5LiBGYWlsdXJlcyB3aWxsIGJlIHJldHJpZWQgdXNpbmcgbm9ybWFsIHZvbHVtZSBiYWNrb2ZmIGFuZCB3aWxsIGJlIHJlcG9ydGVkIG9uIHRoZSBwb2QgcmVhc29uIGFuZCBtZXNzYWdlLlxuICAgKiBUaGUgdHlwZXMgb2Ygb2JqZWN0cyB0aGF0IG1heSBiZSBtb3VudGVkIGJ5IHRoaXMgdm9sdW1lIGFyZSBkZWZpbmVkIGJ5IHRoZSBjb250YWluZXIgcnVudGltZSBpbXBsZW1lbnRhdGlvbiBvbiBhIGhvc3QgbWFjaGluZSBhbmQgYXQgbWluaW11bSBtdXN0IGluY2x1ZGUgYWxsIHZhbGlkIHR5cGVzIHN1cHBvcnRlZCBieSB0aGUgY29udGFpbmVyIGltYWdlIGZpZWxkLlxuICAgKiBUaGUgT0NJIG9iamVjdCBnZXRzIG1vdW50ZWQgaW4gYSBzaW5nbGUgZGlyZWN0b3J5IChzcGVjLmNvbnRhaW5lcnNbKl0udm9sdW1lTW91bnRzLm1vdW50UGF0aCkgYnkgbWVyZ2luZyB0aGUgbWFuaWZlc3QgbGF5ZXJzIGluIHRoZSBzYW1lIHdheSBhcyBmb3IgY29udGFpbmVyIGltYWdlcy5cbiAgICogVGhlIHZvbHVtZSB3aWxsIGJlIG1vdW50ZWQgcmVhZC1vbmx5IChybykgYW5kIG5vbi1leGVjdXRhYmxlIGZpbGVzIChub2V4ZWMpLlxuICAgKiBTdWIgcGF0aCBtb3VudHMgZm9yIGNvbnRhaW5lcnMgYXJlIG5vdCBzdXBwb3J0ZWQgKHNwZWMuY29udGFpbmVyc1sqXS52b2x1bWVNb3VudHMuc3VicGF0aCkgYmVmb3JlIDEuMzMuXG4gICAqIFRoZSBmaWVsZCBzcGVjLnNlY3VyaXR5Q29udGV4dC5mc0dyb3VwQ2hhbmdlUG9saWN5IGhhcyBubyBlZmZlY3Qgb24gdGhpcyB2b2x1bWUgdHlwZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXMjaW1hZ2VcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSW1hZ2U7XG5cbiAgLyoqXG4gICAqIGlzY3NpIHJlcHJlc2VudHMgYW4gSVNDU0kgRGlzayByZXNvdXJjZSB0aGF0IGlzIGF0dGFjaGVkIHRvIGFcbiAgICoga3ViZWxldCdzIGhvc3QgbWFjaGluZSBhbmQgdGhlbiBleHBvc2VkIHRvIHRoZSBwb2QuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS92b2x1bWVzLyNpc2NzaVxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lcyNpc2NzaVxuICAgKi9cbiAgcmVhZG9ubHkgaXNjc2k/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNJc2NzaTtcblxuICAvKipcbiAgICogbmFtZSBvZiB0aGUgdm9sdW1lLlxuICAgKiBNdXN0IGJlIGEgRE5TX0xBQkVMIGFuZCB1bmlxdWUgd2l0aGluIHRoZSBwb2QuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogbmZzIHJlcHJlc2VudHMgYW4gTkZTIG1vdW50IG9uIHRoZSBob3N0IHRoYXQgc2hhcmVzIGEgcG9kJ3MgbGlmZXRpbWVcbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjbmZzXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzI25mc1xuICAgKi9cbiAgcmVhZG9ubHkgbmZzPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzTmZzO1xuXG4gIC8qKlxuICAgKiBwZXJzaXN0ZW50Vm9sdW1lQ2xhaW1Wb2x1bWVTb3VyY2UgcmVwcmVzZW50cyBhIHJlZmVyZW5jZSB0byBhXG4gICAqIFBlcnNpc3RlbnRWb2x1bWVDbGFpbSBpbiB0aGUgc2FtZSBuYW1lc3BhY2UuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS9wZXJzaXN0ZW50LXZvbHVtZXMjcGVyc2lzdGVudHZvbHVtZWNsYWltc1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lcyNwZXJzaXN0ZW50Vm9sdW1lQ2xhaW1cbiAgICovXG4gIHJlYWRvbmx5IHBlcnNpc3RlbnRWb2x1bWVDbGFpbT86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1BlcnNpc3RlbnRWb2x1bWVDbGFpbTtcblxuICAvKipcbiAgICogcGhvdG9uUGVyc2lzdGVudERpc2sgcmVwcmVzZW50cyBhIFBob3RvbkNvbnRyb2xsZXIgcGVyc2lzdGVudCBkaXNrIGF0dGFjaGVkIGFuZCBtb3VudGVkIG9uIGt1YmVsZXRzIGhvc3QgbWFjaGluZS5cbiAgICogRGVwcmVjYXRlZDogUGhvdG9uUGVyc2lzdGVudERpc2sgaXMgZGVwcmVjYXRlZCBhbmQgdGhlIGluLXRyZWUgcGhvdG9uUGVyc2lzdGVudERpc2sgdHlwZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lcyNwaG90b25QZXJzaXN0ZW50RGlza1xuICAgKi9cbiAgcmVhZG9ubHkgcGhvdG9uUGVyc2lzdGVudERpc2s/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQaG90b25QZXJzaXN0ZW50RGlzaztcblxuICAvKipcbiAgICogcG9ydHdvcnhWb2x1bWUgcmVwcmVzZW50cyBhIHBvcnR3b3J4IHZvbHVtZSBhdHRhY2hlZCBhbmQgbW91bnRlZCBvbiBrdWJlbGV0cyBob3N0IG1hY2hpbmUuXG4gICAqIERlcHJlY2F0ZWQ6IFBvcnR3b3J4Vm9sdW1lIGlzIGRlcHJlY2F0ZWQuIEFsbCBvcGVyYXRpb25zIGZvciB0aGUgaW4tdHJlZSBwb3J0d29yeFZvbHVtZSB0eXBlXG4gICAqIGFyZSByZWRpcmVjdGVkIHRvIHRoZSBweGQucG9ydHdvcnguY29tIENTSSBkcml2ZXIgd2hlbiB0aGUgQ1NJTWlncmF0aW9uUG9ydHdvcnggZmVhdHVyZS1nYXRlXG4gICAqIGlzIG9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lcyNwb3J0d29yeFZvbHVtZVxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydHdvcnhWb2x1bWU/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQb3J0d29yeFZvbHVtZTtcblxuICAvKipcbiAgICogcHJvamVjdGVkIGl0ZW1zIGZvciBhbGwgaW4gb25lIHJlc291cmNlcyBzZWNyZXRzLCBjb25maWdtYXBzLCBhbmQgZG93bndhcmQgQVBJXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzI3Byb2plY3RlZFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdGVkPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkO1xuXG4gIC8qKlxuICAgKiBxdW9ieXRlIHJlcHJlc2VudHMgYSBRdW9ieXRlIG1vdW50IG9uIHRoZSBob3N0IHRoYXQgc2hhcmVzIGEgcG9kJ3MgbGlmZXRpbWUuXG4gICAqIERlcHJlY2F0ZWQ6IFF1b2J5dGUgaXMgZGVwcmVjYXRlZCBhbmQgdGhlIGluLXRyZWUgcXVvYnl0ZSB0eXBlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzI3F1b2J5dGVcbiAgICovXG4gIHJlYWRvbmx5IHF1b2J5dGU/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNRdW9ieXRlO1xuXG4gIC8qKlxuICAgKiByYmQgcmVwcmVzZW50cyBhIFJhZG9zIEJsb2NrIERldmljZSBtb3VudCBvbiB0aGUgaG9zdCB0aGF0IHNoYXJlcyBhIHBvZCdzIGxpZmV0aW1lLlxuICAgKiBEZXByZWNhdGVkOiBSQkQgaXMgZGVwcmVjYXRlZCBhbmQgdGhlIGluLXRyZWUgcmJkIHR5cGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXMjcmJkXG4gICAqL1xuICByZWFkb25seSByYmQ/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNSYmQ7XG5cbiAgLyoqXG4gICAqIHNjYWxlSU8gcmVwcmVzZW50cyBhIFNjYWxlSU8gcGVyc2lzdGVudCB2b2x1bWUgYXR0YWNoZWQgYW5kIG1vdW50ZWQgb24gS3ViZXJuZXRlcyBub2Rlcy5cbiAgICogRGVwcmVjYXRlZDogU2NhbGVJTyBpcyBkZXByZWNhdGVkIGFuZCB0aGUgaW4tdHJlZSBzY2FsZUlPIHR5cGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXMjc2NhbGVJT1xuICAgKi9cbiAgcmVhZG9ubHkgc2NhbGVJbz86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1NjYWxlSW87XG5cbiAgLyoqXG4gICAqIHNlY3JldCByZXByZXNlbnRzIGEgc2VjcmV0IHRoYXQgc2hvdWxkIHBvcHVsYXRlIHRoaXMgdm9sdW1lLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcyNzZWNyZXRcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXMjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIHN0b3JhZ2VPUyByZXByZXNlbnRzIGEgU3RvcmFnZU9TIHZvbHVtZSBhdHRhY2hlZCBhbmQgbW91bnRlZCBvbiBLdWJlcm5ldGVzIG5vZGVzLlxuICAgKiBEZXByZWNhdGVkOiBTdG9yYWdlT1MgaXMgZGVwcmVjYXRlZCBhbmQgdGhlIGluLXRyZWUgc3RvcmFnZW9zIHR5cGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXMjc3RvcmFnZW9zXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlb3M/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTdG9yYWdlb3M7XG5cbiAgLyoqXG4gICAqIHZzcGhlcmVWb2x1bWUgcmVwcmVzZW50cyBhIHZTcGhlcmUgdm9sdW1lIGF0dGFjaGVkIGFuZCBtb3VudGVkIG9uIGt1YmVsZXRzIGhvc3QgbWFjaGluZS5cbiAgICogRGVwcmVjYXRlZDogVnNwaGVyZVZvbHVtZSBpcyBkZXByZWNhdGVkLiBBbGwgb3BlcmF0aW9ucyBmb3IgdGhlIGluLXRyZWUgdnNwaGVyZVZvbHVtZSB0eXBlXG4gICAqIGFyZSByZWRpcmVjdGVkIHRvIHRoZSBjc2kudnNwaGVyZS52bXdhcmUuY29tIENTSSBkcml2ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzI3ZzcGhlcmVWb2x1bWVcbiAgICovXG4gIHJlYWRvbmx5IHZzcGhlcmVWb2x1bWU/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNWc3BoZXJlVm9sdW1lO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXdzRWxhc3RpY0Jsb2NrU3RvcmUnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXdzRWxhc3RpY0Jsb2NrU3RvcmUob2JqLmF3c0VsYXN0aWNCbG9ja1N0b3JlKSxcbiAgICAnYXp1cmVEaXNrJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0F6dXJlRGlzayhvYmouYXp1cmVEaXNrKSxcbiAgICAnYXp1cmVGaWxlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0F6dXJlRmlsZShvYmouYXp1cmVGaWxlKSxcbiAgICAnY2VwaGZzJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NlcGhmcyhvYmouY2VwaGZzKSxcbiAgICAnY2luZGVyJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NpbmRlcihvYmouY2luZGVyKSxcbiAgICAnY29uZmlnTWFwJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NvbmZpZ01hcChvYmouY29uZmlnTWFwKSxcbiAgICAnY3NpJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NzaShvYmouY3NpKSxcbiAgICAnZG93bndhcmRBUEknOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGkob2JqLmRvd253YXJkQXBpKSxcbiAgICAnZW1wdHlEaXInOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRW1wdHlEaXIob2JqLmVtcHR5RGlyKSxcbiAgICAnZXBoZW1lcmFsJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbChvYmouZXBoZW1lcmFsKSxcbiAgICAnZmMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmMob2JqLmZjKSxcbiAgICAnZmxleFZvbHVtZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNGbGV4Vm9sdW1lKG9iai5mbGV4Vm9sdW1lKSxcbiAgICAnZmxvY2tlcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNGbG9ja2VyKG9iai5mbG9ja2VyKSxcbiAgICAnZ2NlUGVyc2lzdGVudERpc2snOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzR2NlUGVyc2lzdGVudERpc2sob2JqLmdjZVBlcnNpc3RlbnREaXNrKSxcbiAgICAnZ2l0UmVwbyc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNHaXRSZXBvKG9iai5naXRSZXBvKSxcbiAgICAnZ2x1c3RlcmZzJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0dsdXN0ZXJmcyhvYmouZ2x1c3RlcmZzKSxcbiAgICAnaG9zdFBhdGgnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSG9zdFBhdGgob2JqLmhvc3RQYXRoKSxcbiAgICAnaW1hZ2UnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSW1hZ2Uob2JqLmltYWdlKSxcbiAgICAnaXNjc2knOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSXNjc2kob2JqLmlzY3NpKSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICduZnMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzTmZzKG9iai5uZnMpLFxuICAgICdwZXJzaXN0ZW50Vm9sdW1lQ2xhaW0nOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUGVyc2lzdGVudFZvbHVtZUNsYWltKG9iai5wZXJzaXN0ZW50Vm9sdW1lQ2xhaW0pLFxuICAgICdwaG90b25QZXJzaXN0ZW50RGlzayc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQaG90b25QZXJzaXN0ZW50RGlzayhvYmoucGhvdG9uUGVyc2lzdGVudERpc2spLFxuICAgICdwb3J0d29yeFZvbHVtZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQb3J0d29yeFZvbHVtZShvYmoucG9ydHdvcnhWb2x1bWUpLFxuICAgICdwcm9qZWN0ZWQnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkKG9iai5wcm9qZWN0ZWQpLFxuICAgICdxdW9ieXRlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1F1b2J5dGUob2JqLnF1b2J5dGUpLFxuICAgICdyYmQnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUmJkKG9iai5yYmQpLFxuICAgICdzY2FsZUlPJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1NjYWxlSW8ob2JqLnNjYWxlSW8pLFxuICAgICdzZWNyZXQnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2VjcmV0KG9iai5zZWNyZXQpLFxuICAgICdzdG9yYWdlb3MnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU3RvcmFnZW9zKG9iai5zdG9yYWdlb3MpLFxuICAgICd2c3BoZXJlVm9sdW1lJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1ZzcGhlcmVWb2x1bWUob2JqLnZzcGhlcmVWb2x1bWUpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogUmVzb3VyY2VDbGFpbSByZWZlcmVuY2VzIG9uZSBlbnRyeSBpbiBQb2RTcGVjLlJlc291cmNlQ2xhaW1zLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNDbGFpbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltcyB7XG4gIC8qKlxuICAgKiBOYW1lIG11c3QgbWF0Y2ggdGhlIG5hbWUgb2Ygb25lIGVudHJ5IGluIHBvZC5zcGVjLnJlc291cmNlQ2xhaW1zIG9mXG4gICAqIHRoZSBQb2Qgd2hlcmUgdGhpcyBmaWVsZCBpcyB1c2VkLiBJdCBtYWtlcyB0aGF0IHJlc291cmNlIGF2YWlsYWJsZVxuICAgKiBpbnNpZGUgYSBjb250YWluZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNDbGFpbXMjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGlzIHRoZSBuYW1lIGNob3NlbiBmb3IgYSByZXF1ZXN0IGluIHRoZSByZWZlcmVuY2VkIGNsYWltLlxuICAgKiBJZiBlbXB0eSwgZXZlcnl0aGluZyBmcm9tIHRoZSBjbGFpbSBpcyBtYWRlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlXG4gICAqIG9ubHkgdGhlIHJlc3VsdCBvZiB0aGlzIHJlcXVlc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNDbGFpbXMjcmVxdWVzdFxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNDbGFpbXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNDbGFpbXMob2JqOiBWaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAncmVxdWVzdCc6IG9iai5yZXF1ZXN0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0c1xuICovXG5leHBvcnQgY2xhc3MgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNMaW1pdHMge1xuICBwdWJsaWMgc3RhdGljIGZyb21OdW1iZXIodmFsdWU6IG51bWJlcik6IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzTGltaXRzIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzTGltaXRzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGZyb21TdHJpbmcodmFsdWU6IHN0cmluZyk6IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzTGltaXRzIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzTGltaXRzKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzUmVxdWVzdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzUmVxdWVzdHMge1xuICBwdWJsaWMgc3RhdGljIGZyb21OdW1iZXIodmFsdWU6IG51bWJlcik6IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzUmVxdWVzdHMge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzUmVxdWVzdHModmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgfVxufVxuXG4vKipcbiAqIHR5cGUgc2V0cyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIHR5cGUgKENsdXN0ZXJJUCwgTm9kZVBvcnQsIExvYWRCYWxhbmNlcikuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1NlcnZpY2VUeXBlXG4gKi9cbmV4cG9ydCBlbnVtIFZpbnlsQ2FjaGVTcGVjU2VydmljZVR5cGUge1xuICAvKiogQ2x1c3RlcklQICovXG4gIENMVVNURVJfSVAgPSBcIkNsdXN0ZXJJUFwiLFxuICAvKiogTm9kZVBvcnQgKi9cbiAgTk9ERV9QT1JUID0gXCJOb2RlUG9ydFwiLFxuICAvKiogTG9hZEJhbGFuY2VyICovXG4gIExPQURfQkFMQU5DRVIgPSBcIkxvYWRCYWxhbmNlclwiLFxufVxuXG4vKipcbiAqIHNpemUgaXMgdGhlIHN0b3JhZ2UgYWxsb2NhdGlvbiBhcyBhIEt1YmVybmV0ZXMgcmVzb3VyY2UgcXVhbnRpdHkgKGUuZy4gXCIxR2lcIikuXG4gKiBUaGUgb3BlcmF0b3IgY29udmVydHMgdG8gYnl0ZXMgZm9yIHZhcm5pc2hkLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlU2l6ZVxuICovXG5leHBvcnQgY2xhc3MgVmlueWxDYWNoZVNwZWNTdG9yYWdlU2l6ZSB7XG4gIHB1YmxpYyBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZTogbnVtYmVyKTogVmlueWxDYWNoZVNwZWNTdG9yYWdlU2l6ZSB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGZyb21TdHJpbmcodmFsdWU6IHN0cmluZyk6IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemUge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNTdG9yYWdlU2l6ZSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICB9XG59XG5cbi8qKlxuICogdHlwZSBpcyB0aGUgc3RvcmFnZSBiYWNrZW5kIHR5cGUuIE9ubHkgXCJtYWxsb2NcIiBhbmQgXCJmaWxlXCIgYXJlIHBlcm1pdHRlZC5cbiAqIFwicGVyc2lzdGVudFwiLCBcInVtZW1cIiwgYW5kIFwiZGVmYXVsdFwiIGFyZSByZWplY3RlZCBieSB0aGUgYWRtaXNzaW9uIHdlYmhvb2suXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1N0b3JhZ2VUeXBlXG4gKi9cbmV4cG9ydCBlbnVtIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVR5cGUge1xuICAvKiogbWFsbG9jICovXG4gIE1BTExPQyA9IFwibWFsbG9jXCIsXG4gIC8qKiBmaWxlICovXG4gIEZJTEUgPSBcImZpbGVcIixcbn1cblxuLyoqXG4gKiBzbmlwcGV0cyBwcm92aWRlcyBWQ0wgY29kZSBpbmplY3RlZCBpbnRvIGVhY2ggZ2VuZXJhdGVkIHN1YnJvdXRpbmUuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyB7XG4gIC8qKlxuICAgKiBoZWFkZXIgaXMgaW5zZXJ0ZWQgYXQgdGhlIHRvcCBvZiB0aGUgVkNMIGZpbGUsIGJlZm9yZSBhbnkgc3Vicm91dGluZXMuXG4gICAqIFVzZSBmb3IgaW1wb3J0IHN0YXRlbWVudHMgYW5kIGdsb2JhbCBkZWNsYXJhdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyNoZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlcj86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsQmFja2VuZEVycm9yIGlzIGluc2VydGVkIGludG8gdmNsX2JhY2tlbmRfZXJyb3IuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xCYWNrZW5kRXJyb3JcbiAgICovXG4gIHJlYWRvbmx5IHZjbEJhY2tlbmRFcnJvcj86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsQmFja2VuZEZldGNoIGlzIGluc2VydGVkIGludG8gdmNsX2JhY2tlbmRfZmV0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xCYWNrZW5kRmV0Y2hcbiAgICovXG4gIHJlYWRvbmx5IHZjbEJhY2tlbmRGZXRjaD86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsQmFja2VuZFJlc3BvbnNlIGlzIGluc2VydGVkIGludG8gdmNsX2JhY2tlbmRfcmVzcG9uc2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xCYWNrZW5kUmVzcG9uc2VcbiAgICovXG4gIHJlYWRvbmx5IHZjbEJhY2tlbmRSZXNwb25zZT86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsRGVsaXZlciBpcyBpbnNlcnRlZCBpbnRvIHZjbF9kZWxpdmVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsRGVsaXZlclxuICAgKi9cbiAgcmVhZG9ubHkgdmNsRGVsaXZlcj86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsRmluaSBpcyBpbnNlcnRlZCBpbnRvIHZjbF9maW5pLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsRmluaVxuICAgKi9cbiAgcmVhZG9ubHkgdmNsRmluaT86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsSGFzaCBpcyBpbnNlcnRlZCBpbnRvIHZjbF9oYXNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsSGFzaFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsSGFzaD86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsSGl0IGlzIGluc2VydGVkIGludG8gdmNsX2hpdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEhpdFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsSGl0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xJbml0IGlzIGluc2VydGVkIGludG8gdGhlIHZjbF9pbml0IHN1YnJvdXRpbmUgYWZ0ZXIgZGlyZWN0b3IgaW5pdGlhbGlzYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xJbml0XG4gICAqL1xuICByZWFkb25seSB2Y2xJbml0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xNaXNzIGlzIGluc2VydGVkIGludG8gdmNsX21pc3MuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xNaXNzXG4gICAqL1xuICByZWFkb25seSB2Y2xNaXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xQYXNzIGlzIGluc2VydGVkIGludG8gdmNsX3Bhc3MuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xQYXNzXG4gICAqL1xuICByZWFkb25seSB2Y2xQYXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xQaXBlIGlzIGluc2VydGVkIGludG8gdmNsX3BpcGUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xQaXBlXG4gICAqL1xuICByZWFkb25seSB2Y2xQaXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xQdXJnZSBpcyBpbnNlcnRlZCBpbnRvIHZjbF9wdXJnZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbFB1cmdlXG4gICAqL1xuICByZWFkb25seSB2Y2xQdXJnZT86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsUmVjdiBpcyBpbnNlcnRlZCBpbnRvIHZjbF9yZWN2IGFmdGVyIGdlbmVyYXRlZCByb3V0aW5nIGxvZ2ljLCBiZWZvcmUgcmV0dXJuKCkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xSZWN2XG4gICAqL1xuICByZWFkb25seSB2Y2xSZWN2Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xTeW50aCBpcyBpbnNlcnRlZCBpbnRvIHZjbF9zeW50aC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbFN5bnRoXG4gICAqL1xuICByZWFkb25seSB2Y2xTeW50aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzKG9iajogVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2hlYWRlcic6IG9iai5oZWFkZXIsXG4gICAgJ3ZjbEJhY2tlbmRFcnJvcic6IG9iai52Y2xCYWNrZW5kRXJyb3IsXG4gICAgJ3ZjbEJhY2tlbmRGZXRjaCc6IG9iai52Y2xCYWNrZW5kRmV0Y2gsXG4gICAgJ3ZjbEJhY2tlbmRSZXNwb25zZSc6IG9iai52Y2xCYWNrZW5kUmVzcG9uc2UsXG4gICAgJ3ZjbERlbGl2ZXInOiBvYmoudmNsRGVsaXZlcixcbiAgICAndmNsRmluaSc6IG9iai52Y2xGaW5pLFxuICAgICd2Y2xIYXNoJzogb2JqLnZjbEhhc2gsXG4gICAgJ3ZjbEhpdCc6IG9iai52Y2xIaXQsXG4gICAgJ3ZjbEluaXQnOiBvYmoudmNsSW5pdCxcbiAgICAndmNsTWlzcyc6IG9iai52Y2xNaXNzLFxuICAgICd2Y2xQYXNzJzogb2JqLnZjbFBhc3MsXG4gICAgJ3ZjbFBpcGUnOiBvYmoudmNsUGlwZSxcbiAgICAndmNsUHVyZ2UnOiBvYmoudmNsUHVyZ2UsXG4gICAgJ3ZjbFJlY3YnOiBvYmoudmNsUmVjdixcbiAgICAndmNsU3ludGgnOiBvYmoudmNsU3ludGgsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgY2hhcmFjdGVyaXN0aWNzIG9mIGEgdm9sdW1lIHJlcXVlc3RlZCBieSBhIHBvZCBhdXRob3IuXG4gKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2UvcGVyc2lzdGVudC12b2x1bWVzI3BlcnNpc3RlbnR2b2x1bWVjbGFpbXNcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWMge1xuICAvKipcbiAgICogYWNjZXNzTW9kZXMgY29udGFpbnMgdGhlIGRlc2lyZWQgYWNjZXNzIG1vZGVzIHRoZSB2b2x1bWUgc2hvdWxkIGhhdmUuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS9wZXJzaXN0ZW50LXZvbHVtZXMjYWNjZXNzLW1vZGVzLTFcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlYyNhY2Nlc3NNb2Rlc1xuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzTW9kZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogZGF0YVNvdXJjZSBmaWVsZCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGVpdGhlcjpcbiAgICogKiBBbiBleGlzdGluZyBWb2x1bWVTbmFwc2hvdCBvYmplY3QgKHNuYXBzaG90LnN0b3JhZ2UuazhzLmlvL1ZvbHVtZVNuYXBzaG90KVxuICAgKiAqIEFuIGV4aXN0aW5nIFBWQyAoUGVyc2lzdGVudFZvbHVtZUNsYWltKVxuICAgKiBJZiB0aGUgcHJvdmlzaW9uZXIgb3IgYW4gZXh0ZXJuYWwgY29udHJvbGxlciBjYW4gc3VwcG9ydCB0aGUgc3BlY2lmaWVkIGRhdGEgc291cmNlLFxuICAgKiBpdCB3aWxsIGNyZWF0ZSBhIG5ldyB2b2x1bWUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZGF0YSBzb3VyY2UuXG4gICAqIFdoZW4gdGhlIEFueVZvbHVtZURhdGFTb3VyY2UgZmVhdHVyZSBnYXRlIGlzIGVuYWJsZWQsIGRhdGFTb3VyY2UgY29udGVudHMgd2lsbCBiZSBjb3BpZWQgdG8gZGF0YVNvdXJjZVJlZixcbiAgICogYW5kIGRhdGFTb3VyY2VSZWYgY29udGVudHMgd2lsbCBiZSBjb3BpZWQgdG8gZGF0YVNvdXJjZSB3aGVuIGRhdGFTb3VyY2VSZWYubmFtZXNwYWNlIGlzIG5vdCBzcGVjaWZpZWQuXG4gICAqIElmIHRoZSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLCB0aGVuIGRhdGFTb3VyY2VSZWYgd2lsbCBub3QgYmUgY29waWVkIHRvIGRhdGFTb3VyY2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWMjZGF0YVNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YVNvdXJjZT86IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjRGF0YVNvdXJjZTtcblxuICAvKipcbiAgICogZGF0YVNvdXJjZVJlZiBzcGVjaWZpZXMgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHBvcHVsYXRlIHRoZSB2b2x1bWUgd2l0aCBkYXRhLCBpZiBhIG5vbi1lbXB0eVxuICAgKiB2b2x1bWUgaXMgZGVzaXJlZC4gVGhpcyBtYXkgYmUgYW55IG9iamVjdCBmcm9tIGEgbm9uLWVtcHR5IEFQSSBncm91cCAobm9uXG4gICAqIGNvcmUgb2JqZWN0KSBvciBhIFBlcnNpc3RlbnRWb2x1bWVDbGFpbSBvYmplY3QuXG4gICAqIFdoZW4gdGhpcyBmaWVsZCBpcyBzcGVjaWZpZWQsIHZvbHVtZSBiaW5kaW5nIHdpbGwgb25seSBzdWNjZWVkIGlmIHRoZSB0eXBlIG9mXG4gICAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG1hdGNoZXMgc29tZSBpbnN0YWxsZWQgdm9sdW1lIHBvcHVsYXRvciBvciBkeW5hbWljXG4gICAqIHByb3Zpc2lvbmVyLlxuICAgKiBUaGlzIGZpZWxkIHdpbGwgcmVwbGFjZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZGF0YVNvdXJjZSBmaWVsZCBhbmQgYXMgc3VjaFxuICAgKiBpZiBib3RoIGZpZWxkcyBhcmUgbm9uLWVtcHR5LCB0aGV5IG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZS4gRm9yIGJhY2t3YXJkc1xuICAgKiBjb21wYXRpYmlsaXR5LCB3aGVuIG5hbWVzcGFjZSBpc24ndCBzcGVjaWZpZWQgaW4gZGF0YVNvdXJjZVJlZixcbiAgICogYm90aCBmaWVsZHMgKGRhdGFTb3VyY2UgYW5kIGRhdGFTb3VyY2VSZWYpIHdpbGwgYmUgc2V0IHRvIHRoZSBzYW1lXG4gICAqIHZhbHVlIGF1dG9tYXRpY2FsbHkgaWYgb25lIG9mIHRoZW0gaXMgZW1wdHkgYW5kIHRoZSBvdGhlciBpcyBub24tZW1wdHkuXG4gICAqIFdoZW4gbmFtZXNwYWNlIGlzIHNwZWNpZmllZCBpbiBkYXRhU291cmNlUmVmLFxuICAgKiBkYXRhU291cmNlIGlzbid0IHNldCB0byB0aGUgc2FtZSB2YWx1ZSBhbmQgbXVzdCBiZSBlbXB0eS5cbiAgICogVGhlcmUgYXJlIHRocmVlIGltcG9ydGFudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGRhdGFTb3VyY2UgYW5kIGRhdGFTb3VyY2VSZWY6XG4gICAqICogV2hpbGUgZGF0YVNvdXJjZSBvbmx5IGFsbG93cyB0d28gc3BlY2lmaWMgdHlwZXMgb2Ygb2JqZWN0cywgZGF0YVNvdXJjZVJlZlxuICAgKiBhbGxvd3MgYW55IG5vbi1jb3JlIG9iamVjdCwgYXMgd2VsbCBhcyBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0gb2JqZWN0cy5cbiAgICogKiBXaGlsZSBkYXRhU291cmNlIGlnbm9yZXMgZGlzYWxsb3dlZCB2YWx1ZXMgKGRyb3BwaW5nIHRoZW0pLCBkYXRhU291cmNlUmVmXG4gICAqIHByZXNlcnZlcyBhbGwgdmFsdWVzLCBhbmQgZ2VuZXJhdGVzIGFuIGVycm9yIGlmIGEgZGlzYWxsb3dlZCB2YWx1ZSBpc1xuICAgKiBzcGVjaWZpZWQuXG4gICAqICogV2hpbGUgZGF0YVNvdXJjZSBvbmx5IGFsbG93cyBsb2NhbCBvYmplY3RzLCBkYXRhU291cmNlUmVmIGFsbG93cyBvYmplY3RzXG4gICAqIGluIGFueSBuYW1lc3BhY2VzLlxuICAgKiAoQmV0YSkgVXNpbmcgdGhpcyBmaWVsZCByZXF1aXJlcyB0aGUgQW55Vm9sdW1lRGF0YVNvdXJjZSBmZWF0dXJlIGdhdGUgdG8gYmUgZW5hYmxlZC5cbiAgICogKEFscGhhKSBVc2luZyB0aGUgbmFtZXNwYWNlIGZpZWxkIG9mIGRhdGFTb3VyY2VSZWYgcmVxdWlyZXMgdGhlIENyb3NzTmFtZXNwYWNlVm9sdW1lRGF0YVNvdXJjZSBmZWF0dXJlIGdhdGUgdG8gYmUgZW5hYmxlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlYyNkYXRhU291cmNlUmVmXG4gICAqL1xuICByZWFkb25seSBkYXRhU291cmNlUmVmPzogVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNEYXRhU291cmNlUmVmO1xuXG4gIC8qKlxuICAgKiByZXNvdXJjZXMgcmVwcmVzZW50cyB0aGUgbWluaW11bSByZXNvdXJjZXMgdGhlIHZvbHVtZSBzaG91bGQgaGF2ZS5cbiAgICogVXNlcnMgYXJlIGFsbG93ZWQgdG8gc3BlY2lmeSByZXNvdXJjZSByZXF1aXJlbWVudHNcbiAgICogdGhhdCBhcmUgbG93ZXIgdGhhbiBwcmV2aW91cyB2YWx1ZSBidXQgbXVzdCBzdGlsbCBiZSBoaWdoZXIgdGhhbiBjYXBhY2l0eSByZWNvcmRlZCBpbiB0aGVcbiAgICogc3RhdHVzIGZpZWxkIG9mIHRoZSBjbGFpbS5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3BlcnNpc3RlbnQtdm9sdW1lcyNyZXNvdXJjZXNcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlYyNyZXNvdXJjZXNcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlcz86IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjUmVzb3VyY2VzO1xuXG4gIC8qKlxuICAgKiBzZWxlY3RvciBpcyBhIGxhYmVsIHF1ZXJ5IG92ZXIgdm9sdW1lcyB0byBjb25zaWRlciBmb3IgYmluZGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlYyNzZWxlY3RvclxuICAgKi9cbiAgcmVhZG9ubHkgc2VsZWN0b3I/OiBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY1NlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBzdG9yYWdlQ2xhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBTdG9yYWdlQ2xhc3MgcmVxdWlyZWQgYnkgdGhlIGNsYWltLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2UvcGVyc2lzdGVudC12b2x1bWVzI2NsYXNzLTFcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlYyNzdG9yYWdlQ2xhc3NOYW1lXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlQ2xhc3NOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2b2x1bWVBdHRyaWJ1dGVzQ2xhc3NOYW1lIG1heSBiZSB1c2VkIHRvIHNldCB0aGUgVm9sdW1lQXR0cmlidXRlc0NsYXNzIHVzZWQgYnkgdGhpcyBjbGFpbS5cbiAgICogSWYgc3BlY2lmaWVkLCB0aGUgQ1NJIGRyaXZlciB3aWxsIGNyZWF0ZSBvciB1cGRhdGUgdGhlIHZvbHVtZSB3aXRoIHRoZSBhdHRyaWJ1dGVzIGRlZmluZWRcbiAgICogaW4gdGhlIGNvcnJlc3BvbmRpbmcgVm9sdW1lQXR0cmlidXRlc0NsYXNzLiBUaGlzIGhhcyBhIGRpZmZlcmVudCBwdXJwb3NlIHRoYW4gc3RvcmFnZUNsYXNzTmFtZSxcbiAgICogaXQgY2FuIGJlIGNoYW5nZWQgYWZ0ZXIgdGhlIGNsYWltIGlzIGNyZWF0ZWQuIEFuIGVtcHR5IHN0cmluZyBvciBuaWwgdmFsdWUgaW5kaWNhdGVzIHRoYXQgbm9cbiAgICogVm9sdW1lQXR0cmlidXRlc0NsYXNzIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgY2xhaW0uIElmIHRoZSBjbGFpbSBlbnRlcnMgYW4gSW5mZWFzaWJsZSBlcnJvciBzdGF0ZSxcbiAgICogdGhpcyBmaWVsZCBjYW4gYmUgcmVzZXQgdG8gaXRzIHByZXZpb3VzIHZhbHVlIChpbmNsdWRpbmcgbmlsKSB0byBjYW5jZWwgdGhlIG1vZGlmaWNhdGlvbi5cbiAgICogSWYgdGhlIHJlc291cmNlIHJlZmVycmVkIHRvIGJ5IHZvbHVtZUF0dHJpYnV0ZXNDbGFzcyBkb2VzIG5vdCBleGlzdCwgdGhpcyBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0gd2lsbCBiZVxuICAgKiBzZXQgdG8gYSBQZW5kaW5nIHN0YXRlLCBhcyByZWZsZWN0ZWQgYnkgdGhlIG1vZGlmeVZvbHVtZVN0YXR1cyBmaWVsZCwgdW50aWwgc3VjaCBhcyBhIHJlc291cmNlXG4gICAqIGV4aXN0cy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZS1hdHRyaWJ1dGVzLWNsYXNzZXMvXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWMjdm9sdW1lQXR0cmlidXRlc0NsYXNzTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgdm9sdW1lQXR0cmlidXRlc0NsYXNzTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogdm9sdW1lTW9kZSBkZWZpbmVzIHdoYXQgdHlwZSBvZiB2b2x1bWUgaXMgcmVxdWlyZWQgYnkgdGhlIGNsYWltLlxuICAgKiBWYWx1ZSBvZiBGaWxlc3lzdGVtIGlzIGltcGxpZWQgd2hlbiBub3QgaW5jbHVkZWQgaW4gY2xhaW0gc3BlYy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlYyN2b2x1bWVNb2RlXG4gICAqL1xuICByZWFkb25seSB2b2x1bWVNb2RlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2b2x1bWVOYW1lIGlzIHRoZSBiaW5kaW5nIHJlZmVyZW5jZSB0byB0aGUgUGVyc2lzdGVudFZvbHVtZSBiYWNraW5nIHRoaXMgY2xhaW0uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWMjdm9sdW1lTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgdm9sdW1lTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWMob2JqOiBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlYyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FjY2Vzc01vZGVzJzogb2JqLmFjY2Vzc01vZGVzPy5tYXAoeSA9PiB5KSxcbiAgICAnZGF0YVNvdXJjZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY0RhdGFTb3VyY2Uob2JqLmRhdGFTb3VyY2UpLFxuICAgICdkYXRhU291cmNlUmVmJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjRGF0YVNvdXJjZVJlZihvYmouZGF0YVNvdXJjZVJlZiksXG4gICAgJ3Jlc291cmNlcyc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY1Jlc291cmNlcyhvYmoucmVzb3VyY2VzKSxcbiAgICAnc2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNTZWxlY3RvcihvYmouc2VsZWN0b3IpLFxuICAgICdzdG9yYWdlQ2xhc3NOYW1lJzogb2JqLnN0b3JhZ2VDbGFzc05hbWUsXG4gICAgJ3ZvbHVtZUF0dHJpYnV0ZXNDbGFzc05hbWUnOiBvYmoudm9sdW1lQXR0cmlidXRlc0NsYXNzTmFtZSxcbiAgICAndm9sdW1lTW9kZSc6IG9iai52b2x1bWVNb2RlLFxuICAgICd2b2x1bWVOYW1lJzogb2JqLnZvbHVtZU5hbWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzdGF0dXMgcmVwcmVzZW50cyB0aGUgY3VycmVudCBpbmZvcm1hdGlvbi9zdGF0dXMgb2YgYSBwZXJzaXN0ZW50IHZvbHVtZSBjbGFpbS5cbiAqIFJlYWQtb25seS5cbiAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS9wZXJzaXN0ZW50LXZvbHVtZXMjcGVyc2lzdGVudHZvbHVtZWNsYWltc1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXMge1xuICAvKipcbiAgICogYWNjZXNzTW9kZXMgY29udGFpbnMgdGhlIGFjdHVhbCBhY2Nlc3MgbW9kZXMgdGhlIHZvbHVtZSBiYWNraW5nIHRoZSBQVkMgaGFzLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2UvcGVyc2lzdGVudC12b2x1bWVzI2FjY2Vzcy1tb2Rlcy0xXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1cyNhY2Nlc3NNb2Rlc1xuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzTW9kZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogYWxsb2NhdGVkUmVzb3VyY2VTdGF0dXNlcyBzdG9yZXMgc3RhdHVzIG9mIHJlc291cmNlIGJlaW5nIHJlc2l6ZWQgZm9yIHRoZSBnaXZlbiBQVkMuXG4gICAqIEtleSBuYW1lcyBmb2xsb3cgc3RhbmRhcmQgS3ViZXJuZXRlcyBsYWJlbCBzeW50YXguIFZhbGlkIHZhbHVlcyBhcmUgZWl0aGVyOlxuICAgKiAqIFVuLXByZWZpeGVkIGtleXM6XG4gICAqIC0gc3RvcmFnZSAtIHRoZSBjYXBhY2l0eSBvZiB0aGUgdm9sdW1lLlxuICAgKiAqIEN1c3RvbSByZXNvdXJjZXMgbXVzdCB1c2UgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBwcmVmaXhlZCBuYW1lcyBzdWNoIGFzIFwiZXhhbXBsZS5jb20vbXktY3VzdG9tLXJlc291cmNlXCJcbiAgICogQXBhcnQgZnJvbSBhYm92ZSB2YWx1ZXMgLSBrZXlzIHRoYXQgYXJlIHVucHJlZml4ZWQgb3IgaGF2ZSBrdWJlcm5ldGVzLmlvIHByZWZpeCBhcmUgY29uc2lkZXJlZFxuICAgKiByZXNlcnZlZCBhbmQgaGVuY2UgbWF5IG5vdCBiZSB1c2VkLlxuICAgKlxuICAgKiBDbGFpbVJlc291cmNlU3RhdHVzIGNhbiBiZSBpbiBhbnkgb2YgZm9sbG93aW5nIHN0YXRlczpcbiAgICogLSBDb250cm9sbGVyUmVzaXplSW5Qcm9ncmVzczpcbiAgICogU3RhdGUgc2V0IHdoZW4gcmVzaXplIGNvbnRyb2xsZXIgc3RhcnRzIHJlc2l6aW5nIHRoZSB2b2x1bWUgaW4gY29udHJvbC1wbGFuZS5cbiAgICogLSBDb250cm9sbGVyUmVzaXplRmFpbGVkOlxuICAgKiBTdGF0ZSBzZXQgd2hlbiByZXNpemUgaGFzIGZhaWxlZCBpbiByZXNpemUgY29udHJvbGxlciB3aXRoIGEgdGVybWluYWwgZXJyb3IuXG4gICAqIC0gTm9kZVJlc2l6ZVBlbmRpbmc6XG4gICAqIFN0YXRlIHNldCB3aGVuIHJlc2l6ZSBjb250cm9sbGVyIGhhcyBmaW5pc2hlZCByZXNpemluZyB0aGUgdm9sdW1lIGJ1dCBmdXJ0aGVyIHJlc2l6aW5nIG9mXG4gICAqIHZvbHVtZSBpcyBuZWVkZWQgb24gdGhlIG5vZGUuXG4gICAqIC0gTm9kZVJlc2l6ZUluUHJvZ3Jlc3M6XG4gICAqIFN0YXRlIHNldCB3aGVuIGt1YmVsZXQgc3RhcnRzIHJlc2l6aW5nIHRoZSB2b2x1bWUuXG4gICAqIC0gTm9kZVJlc2l6ZUZhaWxlZDpcbiAgICogU3RhdGUgc2V0IHdoZW4gcmVzaXppbmcgaGFzIGZhaWxlZCBpbiBrdWJlbGV0IHdpdGggYSB0ZXJtaW5hbCBlcnJvci4gVHJhbnNpZW50IGVycm9ycyBkb24ndCBzZXRcbiAgICogTm9kZVJlc2l6ZUZhaWxlZC5cbiAgICogRm9yIGV4YW1wbGU6IGlmIGV4cGFuZGluZyBhIFBWQyBmb3IgbW9yZSBjYXBhY2l0eSAtIHRoaXMgZmllbGQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0YXRlczpcbiAgICogLSBwdmMuc3RhdHVzLmFsbG9jYXRlZFJlc291cmNlU3RhdHVzWydzdG9yYWdlJ10gPSBcIkNvbnRyb2xsZXJSZXNpemVJblByb2dyZXNzXCJcbiAgICogLSBwdmMuc3RhdHVzLmFsbG9jYXRlZFJlc291cmNlU3RhdHVzWydzdG9yYWdlJ10gPSBcIkNvbnRyb2xsZXJSZXNpemVGYWlsZWRcIlxuICAgKiAtIHB2Yy5zdGF0dXMuYWxsb2NhdGVkUmVzb3VyY2VTdGF0dXNbJ3N0b3JhZ2UnXSA9IFwiTm9kZVJlc2l6ZVBlbmRpbmdcIlxuICAgKiAtIHB2Yy5zdGF0dXMuYWxsb2NhdGVkUmVzb3VyY2VTdGF0dXNbJ3N0b3JhZ2UnXSA9IFwiTm9kZVJlc2l6ZUluUHJvZ3Jlc3NcIlxuICAgKiAtIHB2Yy5zdGF0dXMuYWxsb2NhdGVkUmVzb3VyY2VTdGF0dXNbJ3N0b3JhZ2UnXSA9IFwiTm9kZVJlc2l6ZUZhaWxlZFwiXG4gICAqIFdoZW4gdGhpcyBmaWVsZCBpcyBub3Qgc2V0LCBpdCBtZWFucyB0aGF0IG5vIHJlc2l6ZSBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MgZm9yIHRoZSBnaXZlbiBQVkMuXG4gICAqXG4gICAqIEEgY29udHJvbGxlciB0aGF0IHJlY2VpdmVzIFBWQyB1cGRhdGUgd2l0aCBwcmV2aW91c2x5IHVua25vd24gcmVzb3VyY2VOYW1lIG9yIENsYWltUmVzb3VyY2VTdGF0dXNcbiAgICogc2hvdWxkIGlnbm9yZSB0aGUgdXBkYXRlIGZvciB0aGUgcHVycG9zZSBpdCB3YXMgZGVzaWduZWQuIEZvciBleGFtcGxlIC0gYSBjb250cm9sbGVyIHRoYXRcbiAgICogb25seSBpcyByZXNwb25zaWJsZSBmb3IgcmVzaXppbmcgY2FwYWNpdHkgb2YgdGhlIHZvbHVtZSwgc2hvdWxkIGlnbm9yZSBQVkMgdXBkYXRlcyB0aGF0IGNoYW5nZSBvdGhlciB2YWxpZFxuICAgKiByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIFBWQy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzI2FsbG9jYXRlZFJlc291cmNlU3RhdHVzZXNcbiAgICovXG4gIHJlYWRvbmx5IGFsbG9jYXRlZFJlc291cmNlU3RhdHVzZXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBhbGxvY2F0ZWRSZXNvdXJjZXMgdHJhY2tzIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkIHRvIGEgUFZDIGluY2x1ZGluZyBpdHMgY2FwYWNpdHkuXG4gICAqIEtleSBuYW1lcyBmb2xsb3cgc3RhbmRhcmQgS3ViZXJuZXRlcyBsYWJlbCBzeW50YXguIFZhbGlkIHZhbHVlcyBhcmUgZWl0aGVyOlxuICAgKiAqIFVuLXByZWZpeGVkIGtleXM6XG4gICAqIC0gc3RvcmFnZSAtIHRoZSBjYXBhY2l0eSBvZiB0aGUgdm9sdW1lLlxuICAgKiAqIEN1c3RvbSByZXNvdXJjZXMgbXVzdCB1c2UgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBwcmVmaXhlZCBuYW1lcyBzdWNoIGFzIFwiZXhhbXBsZS5jb20vbXktY3VzdG9tLXJlc291cmNlXCJcbiAgICogQXBhcnQgZnJvbSBhYm92ZSB2YWx1ZXMgLSBrZXlzIHRoYXQgYXJlIHVucHJlZml4ZWQgb3IgaGF2ZSBrdWJlcm5ldGVzLmlvIHByZWZpeCBhcmUgY29uc2lkZXJlZFxuICAgKiByZXNlcnZlZCBhbmQgaGVuY2UgbWF5IG5vdCBiZSB1c2VkLlxuICAgKlxuICAgKiBDYXBhY2l0eSByZXBvcnRlZCBoZXJlIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgYWN0dWFsIGNhcGFjaXR5IHdoZW4gYSB2b2x1bWUgZXhwYW5zaW9uIG9wZXJhdGlvblxuICAgKiBpcyByZXF1ZXN0ZWQuXG4gICAqIEZvciBzdG9yYWdlIHF1b3RhLCB0aGUgbGFyZ2VyIHZhbHVlIGZyb20gYWxsb2NhdGVkUmVzb3VyY2VzIGFuZCBQVkMuc3BlYy5yZXNvdXJjZXMgaXMgdXNlZC5cbiAgICogSWYgYWxsb2NhdGVkUmVzb3VyY2VzIGlzIG5vdCBzZXQsIFBWQy5zcGVjLnJlc291cmNlcyBhbG9uZSBpcyB1c2VkIGZvciBxdW90YSBjYWxjdWxhdGlvbi5cbiAgICogSWYgYSB2b2x1bWUgZXhwYW5zaW9uIGNhcGFjaXR5IHJlcXVlc3QgaXMgbG93ZXJlZCwgYWxsb2NhdGVkUmVzb3VyY2VzIGlzIG9ubHlcbiAgICogbG93ZXJlZCBpZiB0aGVyZSBhcmUgbm8gZXhwYW5zaW9uIG9wZXJhdGlvbnMgaW4gcHJvZ3Jlc3MgYW5kIGlmIHRoZSBhY3R1YWwgdm9sdW1lIGNhcGFjaXR5XG4gICAqIGlzIGVxdWFsIG9yIGxvd2VyIHRoYW4gdGhlIHJlcXVlc3RlZCBjYXBhY2l0eS5cbiAgICpcbiAgICogQSBjb250cm9sbGVyIHRoYXQgcmVjZWl2ZXMgUFZDIHVwZGF0ZSB3aXRoIHByZXZpb3VzbHkgdW5rbm93biByZXNvdXJjZU5hbWVcbiAgICogc2hvdWxkIGlnbm9yZSB0aGUgdXBkYXRlIGZvciB0aGUgcHVycG9zZSBpdCB3YXMgZGVzaWduZWQuIEZvciBleGFtcGxlIC0gYSBjb250cm9sbGVyIHRoYXRcbiAgICogb25seSBpcyByZXNwb25zaWJsZSBmb3IgcmVzaXppbmcgY2FwYWNpdHkgb2YgdGhlIHZvbHVtZSwgc2hvdWxkIGlnbm9yZSBQVkMgdXBkYXRlcyB0aGF0IGNoYW5nZSBvdGhlciB2YWxpZFxuICAgKiByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIFBWQy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzI2FsbG9jYXRlZFJlc291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgYWxsb2NhdGVkUmVzb3VyY2VzPzogeyBba2V5OiBzdHJpbmddOiBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzQWxsb2NhdGVkUmVzb3VyY2VzIH07XG5cbiAgLyoqXG4gICAqIGNhcGFjaXR5IHJlcHJlc2VudHMgdGhlIGFjdHVhbCByZXNvdXJjZXMgb2YgdGhlIHVuZGVybHlpbmcgdm9sdW1lLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXMjY2FwYWNpdHlcbiAgICovXG4gIHJlYWRvbmx5IGNhcGFjaXR5PzogeyBba2V5OiBzdHJpbmddOiBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzQ2FwYWNpdHkgfTtcblxuICAvKipcbiAgICogY29uZGl0aW9ucyBpcyB0aGUgY3VycmVudCBDb25kaXRpb24gb2YgcGVyc2lzdGVudCB2b2x1bWUgY2xhaW0uIElmIHVuZGVybHlpbmcgcGVyc2lzdGVudCB2b2x1bWUgaXMgYmVpbmdcbiAgICogcmVzaXplZCB0aGVuIHRoZSBDb25kaXRpb24gd2lsbCBiZSBzZXQgdG8gJ1Jlc2l6aW5nJy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzI2NvbmRpdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGNvbmRpdGlvbnM/OiBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzQ29uZGl0aW9uc1tdO1xuXG4gIC8qKlxuICAgKiBjdXJyZW50Vm9sdW1lQXR0cmlidXRlc0NsYXNzTmFtZSBpcyB0aGUgY3VycmVudCBuYW1lIG9mIHRoZSBWb2x1bWVBdHRyaWJ1dGVzQ2xhc3MgdGhlIFBWQyBpcyB1c2luZy5cbiAgICogV2hlbiB1bnNldCwgdGhlcmUgaXMgbm8gVm9sdW1lQXR0cmlidXRlQ2xhc3MgYXBwbGllZCB0byB0aGlzIFBlcnNpc3RlbnRWb2x1bWVDbGFpbVxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXMjY3VycmVudFZvbHVtZUF0dHJpYnV0ZXNDbGFzc05hbWVcbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRWb2x1bWVBdHRyaWJ1dGVzQ2xhc3NOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNb2RpZnlWb2x1bWVTdGF0dXMgcmVwcmVzZW50cyB0aGUgc3RhdHVzIG9iamVjdCBvZiBDb250cm9sbGVyTW9kaWZ5Vm9sdW1lIG9wZXJhdGlvbi5cbiAgICogV2hlbiB0aGlzIGlzIHVuc2V0LCB0aGVyZSBpcyBubyBNb2RpZnlWb2x1bWUgb3BlcmF0aW9uIGJlaW5nIGF0dGVtcHRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzI21vZGlmeVZvbHVtZVN0YXR1c1xuICAgKi9cbiAgcmVhZG9ubHkgbW9kaWZ5Vm9sdW1lU3RhdHVzPzogVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1c01vZGlmeVZvbHVtZVN0YXR1cztcblxuICAvKipcbiAgICogcGhhc2UgcmVwcmVzZW50cyB0aGUgY3VycmVudCBwaGFzZSBvZiBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1cyNwaGFzZVxuICAgKi9cbiAgcmVhZG9ubHkgcGhhc2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1cyhvYmo6IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhY2Nlc3NNb2Rlcyc6IG9iai5hY2Nlc3NNb2Rlcz8ubWFwKHkgPT4geSksXG4gICAgJ2FsbG9jYXRlZFJlc291cmNlU3RhdHVzZXMnOiAoKG9iai5hbGxvY2F0ZWRSZXNvdXJjZVN0YXR1c2VzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmouYWxsb2NhdGVkUmVzb3VyY2VTdGF0dXNlcykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ2FsbG9jYXRlZFJlc291cmNlcyc6ICgob2JqLmFsbG9jYXRlZFJlc291cmNlcykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmFsbG9jYXRlZFJlc291cmNlcykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0/LnZhbHVlIH0pLCB7fSkpLFxuICAgICdjYXBhY2l0eSc6ICgob2JqLmNhcGFjaXR5KSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmouY2FwYWNpdHkpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdPy52YWx1ZSB9KSwge30pKSxcbiAgICAnY29uZGl0aW9ucyc6IG9iai5jb25kaXRpb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1c0NvbmRpdGlvbnMoeSkpLFxuICAgICdjdXJyZW50Vm9sdW1lQXR0cmlidXRlc0NsYXNzTmFtZSc6IG9iai5jdXJyZW50Vm9sdW1lQXR0cmlidXRlc0NsYXNzTmFtZSxcbiAgICAnbW9kaWZ5Vm9sdW1lU3RhdHVzJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXNNb2RpZnlWb2x1bWVTdGF0dXMob2JqLm1vZGlmeVZvbHVtZVN0YXR1cyksXG4gICAgJ3BoYXNlJzogb2JqLnBoYXNlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogaGFzaCBjb25maWd1cmVzIHRoZSBoYXNoIGRpcmVjdG9yLiBPbmx5IHVzZWQgd2hlbiB0eXBlIGlzIFwiaGFzaFwiLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9ySGFzaFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3Rvckhhc2gge1xuICAvKipcbiAgICogaGVhZGVyIGlzIHRoZSByZXF1ZXN0IGhlYWRlciBuYW1lIHVzZWQgYXMgdGhlIGhhc2gga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3Rvckhhc2gjaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBoZWFkZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3Rvckhhc2gnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9ySGFzaChvYmo6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3Rvckhhc2ggfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoZWFkZXInOiBvYmouaGVhZGVyLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogc2hhcmQgY29uZmlndXJlcyB0aGUgc2hhcmQgZGlyZWN0b3IgKGNvbnNpc3RlbnQtaGFzaCkuIE9ubHkgdXNlZCB3aGVuIHR5cGUgaXMgXCJzaGFyZFwiLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZCB7XG4gIC8qKlxuICAgKiBieSBkZXRlcm1pbmVzIHdoYXQgdmFsdWUgaXMgaGFzaGVkIGZvciBzaGFyZCBzZWxlY3Rpb24uIFwiSEFTSFwiIHVzZXMgdGhlIFZhcm5pc2hcbiAgICogaGFzaCAoZGVmYXVsdCk7IFwiVVJMXCIgdXNlcyB0aGUgcmVxdWVzdCBVUkwuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmQjYnlcbiAgICovXG4gIHJlYWRvbmx5IGJ5PzogVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmRCeTtcblxuICAvKipcbiAgICogaGVhbHRoeSBjb250cm9scyB3aGljaCBiYWNrZW5kcyB0aGUgZGlyZWN0b3IgY29uc2lkZXJzIHdoZW4gc2VsZWN0aW5nIGEgc2hhcmQuXG4gICAqIFwiQ0hPU0VOXCIgKGRlZmF1bHQpIG9ubHkgY29uc2lkZXJzIHRoZSBjaG9zZW4gYmFja2VuZCBoZWFsdGh5OyBcIkFMTFwiIHJlcXVpcmVzIGFsbFxuICAgKiBiYWNrZW5kcyB0byBiZSBoZWFsdGh5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkI2hlYWx0aHlcbiAgICovXG4gIHJlYWRvbmx5IGhlYWx0aHk/OiBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZEhlYWx0aHk7XG5cbiAgLyoqXG4gICAqIHJhbXB1cCBpcyB0aGUgdGltZSBhZnRlciBhZGRpbmcgYSBiYWNrZW5kIGJlZm9yZSBpdCByZWNlaXZlcyBpdHMgZnVsbCBzaGFyZSBvZiB0cmFmZmljLFxuICAgKiBwcmV2ZW50aW5nIHRodW5kZXJpbmctaGVyZC4gRGVmYXVsdDogMzBzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkI3JhbXB1cFxuICAgKi9cbiAgcmVhZG9ubHkgcmFtcHVwPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiByZXBsaWNhcyBpcyB0aGUgbnVtYmVyIG9mIEtldGFtYSByZXBsaWNhcyBwZXIgYmFja2VuZCBpbiB0aGUgaGFzaCByaW5nLiBEZWZhdWx0OiA2Ny5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZCNyZXBsaWNhc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVwbGljYXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHdhcm11cCBpcyB0aGUgcHJvcG9ydGlvbiBvZiByZXF1ZXN0cyAoMC4w4oCTMS4wKSBzZW50IHRvIHRoZSBhbHRlcm5hdGl2ZSBiYWNrZW5kXG4gICAqIHRvIHByZS1wb3B1bGF0ZSBpdHMgY2FjaGUuIERlZmF1bHQ6IDAuMS4gTXVzdCBiZSBiZXR3ZWVuIDAuMCBhbmQgMS4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkI3dhcm11cFxuICAgKi9cbiAgcmVhZG9ubHkgd2FybXVwPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZChvYmo6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYnknOiBvYmouYnksXG4gICAgJ2hlYWx0aHknOiBvYmouaGVhbHRoeSxcbiAgICAncmFtcHVwJzogb2JqLnJhbXB1cCxcbiAgICAncmVwbGljYXMnOiBvYmoucmVwbGljYXMsXG4gICAgJ3dhcm11cCc6IG9iai53YXJtdXAsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiB0eXBlIHNlbGVjdHMgdGhlIFZhcm5pc2ggZGlyZWN0b3IgYWxnb3JpdGhtLlxuICogXCJzaGFyZFwiIChkZWZhdWx0KSBwcm92aWRlcyBjb25zaXN0ZW50IGhhc2hpbmc7IFwicm91bmRfcm9iaW5cIiwgXCJyYW5kb21cIiwgYW5kIFwiaGFzaFwiXG4gKiBhcmUgYWxzbyBzdXBwb3J0ZWQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JUeXBlXG4gKi9cbmV4cG9ydCBlbnVtIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclR5cGUge1xuICAvKiogc2hhcmQgKi9cbiAgU0hBUkQgPSBcInNoYXJkXCIsXG4gIC8qKiByb3VuZF9yb2JpbiAqL1xuICBST1VORF9VTkRFUlNDT1JFX1JPQklOID0gXCJyb3VuZF9yb2JpblwiLFxuICAvKiogcmFuZG9tICovXG4gIFJBTkRPTSA9IFwicmFuZG9tXCIsXG4gIC8qKiBoYXNoICovXG4gIEhBU0ggPSBcImhhc2hcIixcbiAgLyoqIGZhbGxiYWNrICovXG4gIEZBTExCQUNLID0gXCJmYWxsYmFja1wiLFxufVxuXG4vKipcbiAqIHR5cGUgaXMgdGhlIHJvdXRpbmcgc3RyYXRlZ3kgYmV0d2VlbiBWYXJuaXNoIHBvZHMuIE9ubHkgXCJzaGFyZFwiIGlzIHN1cHBvcnRlZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nVHlwZVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZ1R5cGUge1xuICAvKiogc2hhcmQgKi9cbiAgU0hBUkQgPSBcInNoYXJkXCIsXG59XG5cbi8qKlxuICogYnkgZGV0ZXJtaW5lcyB3aGF0IHZhbHVlIGlzIGhhc2hlZCBmb3Igc2hhcmQgc2VsZWN0aW9uLiBcIkhBU0hcIiB1c2VzIHRoZSBWYXJuaXNoXG4gKiBoYXNoIChkZWZhdWx0KTsgXCJVUkxcIiB1c2VzIHRoZSByZXF1ZXN0IFVSTC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZEJ5XG4gKi9cbmV4cG9ydCBlbnVtIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZEJ5IHtcbiAgLyoqIEhBU0ggKi9cbiAgSEFTSCA9IFwiSEFTSFwiLFxuICAvKiogVVJMICovXG4gIFVSTCA9IFwiVVJMXCIsXG59XG5cbi8qKlxuICogaGVhbHRoeSBjb250cm9scyB3aGljaCBiYWNrZW5kcyB0aGUgZGlyZWN0b3IgY29uc2lkZXJzIHdoZW4gc2VsZWN0aW5nIGEgc2hhcmQuXG4gKiBcIkNIT1NFTlwiIChkZWZhdWx0KSBvbmx5IGNvbnNpZGVycyB0aGUgY2hvc2VuIGJhY2tlbmQgaGVhbHRoeTsgXCJBTExcIiByZXF1aXJlcyBhbGxcbiAqIGJhY2tlbmRzIHRvIGJlIGhlYWx0aHkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmRIZWFsdGh5XG4gKi9cbmV4cG9ydCBlbnVtIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZEhlYWx0aHkge1xuICAvKiogQ0hPU0VOICovXG4gIENIT1NFTiA9IFwiQ0hPU0VOXCIsXG4gIC8qKiBBTEwgKi9cbiAgQUxMID0gXCJBTExcIixcbn1cblxuLyoqXG4gKiBpbWFnZSBvdmVycmlkZXMgdGhlIGV4cG9ydGVyIGltYWdlLiBEZWZhdWx0cyB0b1xuICogZ2hjci5pby9ibHVlZHluYW1pY3MvdmFybmlzaC1leHBvcnRlcjoxLjYuMS5cbiAqXG4gKiBAZGVmYXVsdCBnaGNyLmlvL2JsdWVkeW5hbWljcy92YXJuaXNoLWV4cG9ydGVyOjEuNi4xLlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlckltYWdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXJJbWFnZSB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVySW1hZ2UjcmVwb3NpdG9yeVxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlckltYWdlI3RhZ1xuICAgKi9cbiAgcmVhZG9ubHkgdGFnPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlckltYWdlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVySW1hZ2Uob2JqOiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlckltYWdlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncmVwb3NpdG9yeSc6IG9iai5yZXBvc2l0b3J5LFxuICAgICd0YWcnOiBvYmoudGFnLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcmVzb3VyY2VzIHNldHMgdGhlIGV4cG9ydGVyIGNvbnRhaW5lciByZXNvdXJjZSByZXF1aXJlbWVudHMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlclJlc291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVyUmVzb3VyY2VzIHtcbiAgLyoqXG4gICAqIENsYWltcyBsaXN0cyB0aGUgbmFtZXMgb2YgcmVzb3VyY2VzLCBkZWZpbmVkIGluIHNwZWMucmVzb3VyY2VDbGFpbXMsXG4gICAqIHRoYXQgYXJlIHVzZWQgYnkgdGhpcyBjb250YWluZXIuXG4gICAqXG4gICAqIFRoaXMgZmllbGQgZGVwZW5kcyBvbiB0aGVcbiAgICogRHluYW1pY1Jlc291cmNlQWxsb2NhdGlvbiBmZWF0dXJlIGdhdGUuXG4gICAqXG4gICAqIFRoaXMgZmllbGQgaXMgaW1tdXRhYmxlLiBJdCBjYW4gb25seSBiZSBzZXQgZm9yIGNvbnRhaW5lcnMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXJSZXNvdXJjZXMjY2xhaW1zXG4gICAqL1xuICByZWFkb25seSBjbGFpbXM/OiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlclJlc291cmNlc0NsYWltc1tdO1xuXG4gIC8qKlxuICAgKiBMaW1pdHMgZGVzY3JpYmVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBjb21wdXRlIHJlc291cmNlcyBhbGxvd2VkLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL2NvbmZpZ3VyYXRpb24vbWFuYWdlLXJlc291cmNlcy1jb250YWluZXJzL1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVyUmVzb3VyY2VzI2xpbWl0c1xuICAgKi9cbiAgcmVhZG9ubHkgbGltaXRzPzogeyBba2V5OiBzdHJpbmddOiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlclJlc291cmNlc0xpbWl0cyB9O1xuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBkZXNjcmliZXMgdGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbXB1dGUgcmVzb3VyY2VzIHJlcXVpcmVkLlxuICAgKiBJZiBSZXF1ZXN0cyBpcyBvbWl0dGVkIGZvciBhIGNvbnRhaW5lciwgaXQgZGVmYXVsdHMgdG8gTGltaXRzIGlmIHRoYXQgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQsXG4gICAqIG90aGVyd2lzZSB0byBhbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHZhbHVlLiBSZXF1ZXN0cyBjYW5ub3QgZXhjZWVkIExpbWl0cy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9jb25maWd1cmF0aW9uL21hbmFnZS1yZXNvdXJjZXMtY29udGFpbmVycy9cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlclJlc291cmNlcyNyZXF1ZXN0c1xuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdHM/OiB7IFtrZXk6IHN0cmluZ106IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVyUmVzb3VyY2VzUmVxdWVzdHMgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXJSZXNvdXJjZXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXJSZXNvdXJjZXMob2JqOiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlclJlc291cmNlcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2NsYWltcyc6IG9iai5jbGFpbXM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlclJlc291cmNlc0NsYWltcyh5KSksXG4gICAgJ2xpbWl0cyc6ICgob2JqLmxpbWl0cykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmxpbWl0cykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0/LnZhbHVlIH0pLCB7fSkpLFxuICAgICdyZXF1ZXN0cyc6ICgob2JqLnJlcXVlc3RzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoucmVxdWVzdHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdPy52YWx1ZSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIERlc2NyaWJlcyBub2RlIGFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgZm9yIHRoZSBwb2QuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eSB7XG4gIC8qKlxuICAgKiBUaGUgc2NoZWR1bGVyIHdpbGwgcHJlZmVyIHRvIHNjaGVkdWxlIHBvZHMgdG8gbm9kZXMgdGhhdCBzYXRpc2Z5XG4gICAqIHRoZSBhZmZpbml0eSBleHByZXNzaW9ucyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCwgYnV0IGl0IG1heSBjaG9vc2VcbiAgICogYSBub2RlIHRoYXQgdmlvbGF0ZXMgb25lIG9yIG1vcmUgb2YgdGhlIGV4cHJlc3Npb25zLiBUaGUgbm9kZSB0aGF0IGlzXG4gICAqIG1vc3QgcHJlZmVycmVkIGlzIHRoZSBvbmUgd2l0aCB0aGUgZ3JlYXRlc3Qgc3VtIG9mIHdlaWdodHMsIGkuZS5cbiAgICogZm9yIGVhY2ggbm9kZSB0aGF0IG1lZXRzIGFsbCBvZiB0aGUgc2NoZWR1bGluZyByZXF1aXJlbWVudHMgKHJlc291cmNlXG4gICAqIHJlcXVlc3QsIHJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZyBhZmZpbml0eSBleHByZXNzaW9ucywgZXRjLiksXG4gICAqIGNvbXB1dGUgYSBzdW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGVsZW1lbnRzIG9mIHRoaXMgZmllbGQgYW5kIGFkZGluZ1xuICAgKiBcIndlaWdodFwiIHRvIHRoZSBzdW0gaWYgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29ycmVzcG9uZGluZyBtYXRjaEV4cHJlc3Npb25zOyB0aGVcbiAgICogbm9kZShzKSB3aXRoIHRoZSBoaWdoZXN0IHN1bSBhcmUgdGhlIG1vc3QgcHJlZmVycmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHkjcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uW107XG5cbiAgLyoqXG4gICAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgYXJlIG5vdCBtZXQgYXRcbiAgICogc2NoZWR1bGluZyB0aW1lLCB0aGUgcG9kIHdpbGwgbm90IGJlIHNjaGVkdWxlZCBvbnRvIHRoZSBub2RlLlxuICAgKiBJZiB0aGUgYWZmaW5pdHkgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkIGNlYXNlIHRvIGJlIG1ldFxuICAgKiBhdCBzb21lIHBvaW50IGR1cmluZyBwb2QgZXhlY3V0aW9uIChlLmcuIGR1ZSB0byBhbiB1cGRhdGUpLCB0aGUgc3lzdGVtXG4gICAqIG1heSBvciBtYXkgbm90IHRyeSB0byBldmVudHVhbGx5IGV2aWN0IHRoZSBwb2QgZnJvbSBpdHMgbm9kZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5I3JlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5KG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKHkpKSxcbiAgICAncmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmoucmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZXNjcmliZXMgcG9kIGFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgKGUuZy4gY28tbG9jYXRlIHRoaXMgcG9kIGluIHRoZSBzYW1lIG5vZGUsIHpvbmUsIGV0Yy4gYXMgc29tZSBvdGhlciBwb2QocykpLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBzY2hlZHVsZXIgd2lsbCBwcmVmZXIgdG8gc2NoZWR1bGUgcG9kcyB0byBub2RlcyB0aGF0IHNhdGlzZnlcbiAgICogdGhlIGFmZmluaXR5IGV4cHJlc3Npb25zIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkLCBidXQgaXQgbWF5IGNob29zZVxuICAgKiBhIG5vZGUgdGhhdCB2aW9sYXRlcyBvbmUgb3IgbW9yZSBvZiB0aGUgZXhwcmVzc2lvbnMuIFRoZSBub2RlIHRoYXQgaXNcbiAgICogbW9zdCBwcmVmZXJyZWQgaXMgdGhlIG9uZSB3aXRoIHRoZSBncmVhdGVzdCBzdW0gb2Ygd2VpZ2h0cywgaS5lLlxuICAgKiBmb3IgZWFjaCBub2RlIHRoYXQgbWVldHMgYWxsIG9mIHRoZSBzY2hlZHVsaW5nIHJlcXVpcmVtZW50cyAocmVzb3VyY2VcbiAgICogcmVxdWVzdCwgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nIGFmZmluaXR5IGV4cHJlc3Npb25zLCBldGMuKSxcbiAgICogY29tcHV0ZSBhIHN1bSBieSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZWxlbWVudHMgb2YgdGhpcyBmaWVsZCBhbmQgYWRkaW5nXG4gICAqIFwid2VpZ2h0XCIgdG8gdGhlIHN1bSBpZiB0aGUgbm9kZSBoYXMgcG9kcyB3aGljaCBtYXRjaGVzIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybTsgdGhlXG4gICAqIG5vZGUocykgd2l0aCB0aGUgaGlnaGVzdCBzdW0gYXJlIHRoZSBtb3N0IHByZWZlcnJlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHkjcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25bXTtcblxuICAvKipcbiAgICogSWYgdGhlIGFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBhcmUgbm90IG1ldCBhdFxuICAgKiBzY2hlZHVsaW5nIHRpbWUsIHRoZSBwb2Qgd2lsbCBub3QgYmUgc2NoZWR1bGVkIG9udG8gdGhlIG5vZGUuXG4gICAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gICAqIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHBvZCBleGVjdXRpb24gKGUuZy4gZHVlIHRvIGEgcG9kIGxhYmVsIHVwZGF0ZSksIHRoZVxuICAgKiBzeXN0ZW0gbWF5IG9yIG1heSBub3QgdHJ5IHRvIGV2ZW50dWFsbHkgZXZpY3QgdGhlIHBvZCBmcm9tIGl0cyBub2RlLlxuICAgKiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cywgdGhlIGxpc3RzIG9mIG5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaFxuICAgKiBwb2RBZmZpbml0eVRlcm0gYXJlIGludGVyc2VjdGVkLCBpLmUuIGFsbCB0ZXJtcyBtdXN0IGJlIHNhdGlzZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHkjcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25bXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24oeSkpLFxuICAgICdyZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIERlc2NyaWJlcyBwb2QgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzIChlLmcuIGF2b2lkIHB1dHRpbmcgdGhpcyBwb2QgaW4gdGhlIHNhbWUgbm9kZSwgem9uZSwgZXRjLiBhcyBzb21lIG90aGVyIHBvZChzKSkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eSB7XG4gIC8qKlxuICAgKiBUaGUgc2NoZWR1bGVyIHdpbGwgcHJlZmVyIHRvIHNjaGVkdWxlIHBvZHMgdG8gbm9kZXMgdGhhdCBzYXRpc2Z5XG4gICAqIHRoZSBhbnRpLWFmZmluaXR5IGV4cHJlc3Npb25zIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkLCBidXQgaXQgbWF5IGNob29zZVxuICAgKiBhIG5vZGUgdGhhdCB2aW9sYXRlcyBvbmUgb3IgbW9yZSBvZiB0aGUgZXhwcmVzc2lvbnMuIFRoZSBub2RlIHRoYXQgaXNcbiAgICogbW9zdCBwcmVmZXJyZWQgaXMgdGhlIG9uZSB3aXRoIHRoZSBncmVhdGVzdCBzdW0gb2Ygd2VpZ2h0cywgaS5lLlxuICAgKiBmb3IgZWFjaCBub2RlIHRoYXQgbWVldHMgYWxsIG9mIHRoZSBzY2hlZHVsaW5nIHJlcXVpcmVtZW50cyAocmVzb3VyY2VcbiAgICogcmVxdWVzdCwgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nIGFudGktYWZmaW5pdHkgZXhwcmVzc2lvbnMsIGV0Yy4pLFxuICAgKiBjb21wdXRlIGEgc3VtIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBlbGVtZW50cyBvZiB0aGlzIGZpZWxkIGFuZCBzdWJ0cmFjdGluZ1xuICAgKiBcIndlaWdodFwiIGZyb20gdGhlIHN1bSBpZiB0aGUgbm9kZSBoYXMgcG9kcyB3aGljaCBtYXRjaGVzIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybTsgdGhlXG4gICAqIG5vZGUocykgd2l0aCB0aGUgaGlnaGVzdCBzdW0gYXJlIHRoZSBtb3N0IHByZWZlcnJlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5I3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gICAqL1xuICByZWFkb25seSBwcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbltdO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgYW50aS1hZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgYXJlIG5vdCBtZXQgYXRcbiAgICogc2NoZWR1bGluZyB0aW1lLCB0aGUgcG9kIHdpbGwgbm90IGJlIHNjaGVkdWxlZCBvbnRvIHRoZSBub2RlLlxuICAgKiBJZiB0aGUgYW50aS1hZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gICAqIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHBvZCBleGVjdXRpb24gKGUuZy4gZHVlIHRvIGEgcG9kIGxhYmVsIHVwZGF0ZSksIHRoZVxuICAgKiBzeXN0ZW0gbWF5IG9yIG1heSBub3QgdHJ5IHRvIGV2ZW50dWFsbHkgZXZpY3QgdGhlIHBvZCBmcm9tIGl0cyBub2RlLlxuICAgKiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cywgdGhlIGxpc3RzIG9mIG5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaFxuICAgKiBwb2RBZmZpbml0eVRlcm0gYXJlIGludGVyc2VjdGVkLCBpLmUuIGFsbCB0ZXJtcyBtdXN0IGJlIHNhdGlzZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5I3JlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbltdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHkob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nOiBvYmoucHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24oeSkpLFxuICAgICdyZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbih5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBhd3NFbGFzdGljQmxvY2tTdG9yZSByZXByZXNlbnRzIGFuIEFXUyBEaXNrIHJlc291cmNlIHRoYXQgaXMgYXR0YWNoZWQgdG8gYVxuICoga3ViZWxldCdzIGhvc3QgbWFjaGluZSBhbmQgdGhlbiBleHBvc2VkIHRvIHRoZSBwb2QuXG4gKiBEZXByZWNhdGVkOiBBV1NFbGFzdGljQmxvY2tTdG9yZSBpcyBkZXByZWNhdGVkLiBBbGwgb3BlcmF0aW9ucyBmb3IgdGhlIGluLXRyZWVcbiAqIGF3c0VsYXN0aWNCbG9ja1N0b3JlIHR5cGUgYXJlIHJlZGlyZWN0ZWQgdG8gdGhlIGVicy5jc2kuYXdzLmNvbSBDU0kgZHJpdmVyLlxuICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjYXdzZWxhc3RpY2Jsb2Nrc3RvcmVcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0F3c0VsYXN0aWNCbG9ja1N0b3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXdzRWxhc3RpY0Jsb2NrU3RvcmUge1xuICAvKipcbiAgICogZnNUeXBlIGlzIHRoZSBmaWxlc3lzdGVtIHR5cGUgb2YgdGhlIHZvbHVtZSB0aGF0IHlvdSB3YW50IHRvIG1vdW50LlxuICAgKiBUaXA6IEVuc3VyZSB0aGF0IHRoZSBmaWxlc3lzdGVtIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0uXG4gICAqIEV4YW1wbGVzOiBcImV4dDRcIiwgXCJ4ZnNcIiwgXCJudGZzXCIuIEltcGxpY2l0bHkgaW5mZXJyZWQgdG8gYmUgXCJleHQ0XCIgaWYgdW5zcGVjaWZpZWQuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS92b2x1bWVzI2F3c2VsYXN0aWNibG9ja3N0b3JlXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXdzRWxhc3RpY0Jsb2NrU3RvcmUjZnNUeXBlXG4gICAqL1xuICByZWFkb25seSBmc1R5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHBhcnRpdGlvbiBpcyB0aGUgcGFydGl0aW9uIGluIHRoZSB2b2x1bWUgdGhhdCB5b3Ugd2FudCB0byBtb3VudC5cbiAgICogSWYgb21pdHRlZCwgdGhlIGRlZmF1bHQgaXMgdG8gbW91bnQgYnkgdm9sdW1lIG5hbWUuXG4gICAqIEV4YW1wbGVzOiBGb3Igdm9sdW1lIC9kZXYvc2RhMSwgeW91IHNwZWNpZnkgdGhlIHBhcnRpdGlvbiBhcyBcIjFcIi5cbiAgICogU2ltaWxhcmx5LCB0aGUgdm9sdW1lIHBhcnRpdGlvbiBmb3IgL2Rldi9zZGEgaXMgXCIwXCIgKG9yIHlvdSBjYW4gbGVhdmUgdGhlIHByb3BlcnR5IGVtcHR5KS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNBd3NFbGFzdGljQmxvY2tTdG9yZSNwYXJ0aXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogcmVhZE9ubHkgdmFsdWUgdHJ1ZSB3aWxsIGZvcmNlIHRoZSByZWFkT25seSBzZXR0aW5nIGluIFZvbHVtZU1vdW50cy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjYXdzZWxhc3RpY2Jsb2Nrc3RvcmVcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNBd3NFbGFzdGljQmxvY2tTdG9yZSNyZWFkT25seVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiB2b2x1bWVJRCBpcyB1bmlxdWUgSUQgb2YgdGhlIHBlcnNpc3RlbnQgZGlzayByZXNvdXJjZSBpbiBBV1MgKEFtYXpvbiBFQlMgdm9sdW1lKS5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjYXdzZWxhc3RpY2Jsb2Nrc3RvcmVcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNBd3NFbGFzdGljQmxvY2tTdG9yZSN2b2x1bWVJRFxuICAgKi9cbiAgcmVhZG9ubHkgdm9sdW1lSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXdzRWxhc3RpY0Jsb2NrU3RvcmUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXdzRWxhc3RpY0Jsb2NrU3RvcmUob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNBd3NFbGFzdGljQmxvY2tTdG9yZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2ZzVHlwZSc6IG9iai5mc1R5cGUsXG4gICAgJ3BhcnRpdGlvbic6IG9iai5wYXJ0aXRpb24sXG4gICAgJ3JlYWRPbmx5Jzogb2JqLnJlYWRPbmx5LFxuICAgICd2b2x1bWVJRCc6IG9iai52b2x1bWVJZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGF6dXJlRGlzayByZXByZXNlbnRzIGFuIEF6dXJlIERhdGEgRGlzayBtb3VudCBvbiB0aGUgaG9zdCBhbmQgYmluZCBtb3VudCB0byB0aGUgcG9kLlxuICogRGVwcmVjYXRlZDogQXp1cmVEaXNrIGlzIGRlcHJlY2F0ZWQuIEFsbCBvcGVyYXRpb25zIGZvciB0aGUgaW4tdHJlZSBhenVyZURpc2sgdHlwZVxuICogYXJlIHJlZGlyZWN0ZWQgdG8gdGhlIGRpc2suY3NpLmF6dXJlLmNvbSBDU0kgZHJpdmVyLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXp1cmVEaXNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXp1cmVEaXNrIHtcbiAgLyoqXG4gICAqIGNhY2hpbmdNb2RlIGlzIHRoZSBIb3N0IENhY2hpbmcgbW9kZTogTm9uZSwgUmVhZCBPbmx5LCBSZWFkIFdyaXRlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0F6dXJlRGlzayNjYWNoaW5nTW9kZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGluZ01vZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGRpc2tOYW1lIGlzIHRoZSBOYW1lIG9mIHRoZSBkYXRhIGRpc2sgaW4gdGhlIGJsb2Igc3RvcmFnZVxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0F6dXJlRGlzayNkaXNrTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgZGlza05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogZGlza1VSSSBpcyB0aGUgVVJJIG9mIGRhdGEgZGlzayBpbiB0aGUgYmxvYiBzdG9yYWdlXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXp1cmVEaXNrI2Rpc2tVUklcbiAgICovXG4gIHJlYWRvbmx5IGRpc2tVcmk6IHN0cmluZztcblxuICAvKipcbiAgICogZnNUeXBlIGlzIEZpbGVzeXN0ZW0gdHlwZSB0byBtb3VudC5cbiAgICogTXVzdCBiZSBhIGZpbGVzeXN0ZW0gdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbS5cbiAgICogRXguIFwiZXh0NFwiLCBcInhmc1wiLCBcIm50ZnNcIi4gSW1wbGljaXRseSBpbmZlcnJlZCB0byBiZSBcImV4dDRcIiBpZiB1bnNwZWNpZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNBenVyZURpc2sjZnNUeXBlXG4gICAqL1xuICByZWFkb25seSBmc1R5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGtpbmQgZXhwZWN0ZWQgdmFsdWVzIGFyZSBTaGFyZWQ6IG11bHRpcGxlIGJsb2IgZGlza3MgcGVyIHN0b3JhZ2UgYWNjb3VudCAgRGVkaWNhdGVkOiBzaW5nbGUgYmxvYiBkaXNrIHBlciBzdG9yYWdlIGFjY291bnQgIE1hbmFnZWQ6IGF6dXJlIG1hbmFnZWQgZGF0YSBkaXNrIChvbmx5IGluIG1hbmFnZWQgYXZhaWxhYmlsaXR5IHNldCkuIGRlZmF1bHRzIHRvIHNoYXJlZFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0F6dXJlRGlzayNraW5kXG4gICAqL1xuICByZWFkb25seSBraW5kPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiByZWFkT25seSBEZWZhdWx0cyB0byBmYWxzZSAocmVhZC93cml0ZSkuIFJlYWRPbmx5IGhlcmUgd2lsbCBmb3JjZVxuICAgKiB0aGUgUmVhZE9ubHkgc2V0dGluZyBpbiBWb2x1bWVNb3VudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlIChyZWFkL3dyaXRlKS4gUmVhZE9ubHkgaGVyZSB3aWxsIGZvcmNlXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXp1cmVEaXNrI3JlYWRPbmx5XG4gICAqL1xuICByZWFkb25seSByZWFkT25seT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0F6dXJlRGlzaycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNBenVyZURpc2sob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNBenVyZURpc2sgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjYWNoaW5nTW9kZSc6IG9iai5jYWNoaW5nTW9kZSxcbiAgICAnZGlza05hbWUnOiBvYmouZGlza05hbWUsXG4gICAgJ2Rpc2tVUkknOiBvYmouZGlza1VyaSxcbiAgICAnZnNUeXBlJzogb2JqLmZzVHlwZSxcbiAgICAna2luZCc6IG9iai5raW5kLFxuICAgICdyZWFkT25seSc6IG9iai5yZWFkT25seSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGF6dXJlRmlsZSByZXByZXNlbnRzIGFuIEF6dXJlIEZpbGUgU2VydmljZSBtb3VudCBvbiB0aGUgaG9zdCBhbmQgYmluZCBtb3VudCB0byB0aGUgcG9kLlxuICogRGVwcmVjYXRlZDogQXp1cmVGaWxlIGlzIGRlcHJlY2F0ZWQuIEFsbCBvcGVyYXRpb25zIGZvciB0aGUgaW4tdHJlZSBhenVyZUZpbGUgdHlwZVxuICogYXJlIHJlZGlyZWN0ZWQgdG8gdGhlIGZpbGUuY3NpLmF6dXJlLmNvbSBDU0kgZHJpdmVyLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXp1cmVGaWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXp1cmVGaWxlIHtcbiAgLyoqXG4gICAqIHJlYWRPbmx5IGRlZmF1bHRzIHRvIGZhbHNlIChyZWFkL3dyaXRlKS4gUmVhZE9ubHkgaGVyZSB3aWxsIGZvcmNlXG4gICAqIHRoZSBSZWFkT25seSBzZXR0aW5nIGluIFZvbHVtZU1vdW50cy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNBenVyZUZpbGUjcmVhZE9ubHlcbiAgICovXG4gIHJlYWRvbmx5IHJlYWRPbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogc2VjcmV0TmFtZSBpcyB0aGUgIG5hbWUgb2Ygc2VjcmV0IHRoYXQgY29udGFpbnMgQXp1cmUgU3RvcmFnZSBBY2NvdW50IE5hbWUgYW5kIEtleVxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0F6dXJlRmlsZSNzZWNyZXROYW1lXG4gICAqL1xuICByZWFkb25seSBzZWNyZXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNoYXJlTmFtZSBpcyB0aGUgYXp1cmUgc2hhcmUgTmFtZVxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0F6dXJlRmlsZSNzaGFyZU5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHNoYXJlTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNBenVyZUZpbGUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXp1cmVGaWxlKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQXp1cmVGaWxlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncmVhZE9ubHknOiBvYmoucmVhZE9ubHksXG4gICAgJ3NlY3JldE5hbWUnOiBvYmouc2VjcmV0TmFtZSxcbiAgICAnc2hhcmVOYW1lJzogb2JqLnNoYXJlTmFtZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNlcGhGUyByZXByZXNlbnRzIGEgQ2VwaCBGUyBtb3VudCBvbiB0aGUgaG9zdCB0aGF0IHNoYXJlcyBhIHBvZCdzIGxpZmV0aW1lLlxuICogRGVwcmVjYXRlZDogQ2VwaEZTIGlzIGRlcHJlY2F0ZWQgYW5kIHRoZSBpbi10cmVlIGNlcGhmcyB0eXBlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDZXBoZnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDZXBoZnMge1xuICAvKipcbiAgICogbW9uaXRvcnMgaXMgUmVxdWlyZWQ6IE1vbml0b3JzIGlzIGEgY29sbGVjdGlvbiBvZiBDZXBoIG1vbml0b3JzXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9leGFtcGxlcy5rOHMuaW8vdm9sdW1lcy9jZXBoZnMvUkVBRE1FLm1kI2hvdy10by11c2UtaXRcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDZXBoZnMjbW9uaXRvcnNcbiAgICovXG4gIHJlYWRvbmx5IG1vbml0b3JzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogcGF0aCBpcyBPcHRpb25hbDogVXNlZCBhcyB0aGUgbW91bnRlZCByb290LCByYXRoZXIgdGhhbiB0aGUgZnVsbCBDZXBoIHRyZWUsIGRlZmF1bHQgaXMgL1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NlcGhmcyNwYXRoXG4gICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiByZWFkT25seSBpcyBPcHRpb25hbDogRGVmYXVsdHMgdG8gZmFsc2UgKHJlYWQvd3JpdGUpLiBSZWFkT25seSBoZXJlIHdpbGwgZm9yY2VcbiAgICogdGhlIFJlYWRPbmx5IHNldHRpbmcgaW4gVm9sdW1lTW91bnRzLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8vZXhhbXBsZXMuazhzLmlvL3ZvbHVtZXMvY2VwaGZzL1JFQURNRS5tZCNob3ctdG8tdXNlLWl0XG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlIChyZWFkL3dyaXRlKS4gUmVhZE9ubHkgaGVyZSB3aWxsIGZvcmNlXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2VwaGZzI3JlYWRPbmx5XG4gICAqL1xuICByZWFkb25seSByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHNlY3JldEZpbGUgaXMgT3B0aW9uYWw6IFNlY3JldEZpbGUgaXMgdGhlIHBhdGggdG8ga2V5IHJpbmcgZm9yIFVzZXIsIGRlZmF1bHQgaXMgL2V0Yy9jZXBoL3VzZXIuc2VjcmV0XG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9leGFtcGxlcy5rOHMuaW8vdm9sdW1lcy9jZXBoZnMvUkVBRE1FLm1kI2hvdy10by11c2UtaXRcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDZXBoZnMjc2VjcmV0RmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0RmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogc2VjcmV0UmVmIGlzIE9wdGlvbmFsOiBTZWNyZXRSZWYgaXMgcmVmZXJlbmNlIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBzZWNyZXQgZm9yIFVzZXIsIGRlZmF1bHQgaXMgZW1wdHkuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9leGFtcGxlcy5rOHMuaW8vdm9sdW1lcy9jZXBoZnMvUkVBRE1FLm1kI2hvdy10by11c2UtaXRcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDZXBoZnMjc2VjcmV0UmVmXG4gICAqL1xuICByZWFkb25seSBzZWNyZXRSZWY/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDZXBoZnNTZWNyZXRSZWY7XG5cbiAgLyoqXG4gICAqIHVzZXIgaXMgb3B0aW9uYWw6IFVzZXIgaXMgdGhlIHJhZG9zIHVzZXIgbmFtZSwgZGVmYXVsdCBpcyBhZG1pblxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8vZXhhbXBsZXMuazhzLmlvL3ZvbHVtZXMvY2VwaGZzL1JFQURNRS5tZCNob3ctdG8tdXNlLWl0XG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2VwaGZzI3VzZXJcbiAgICovXG4gIHJlYWRvbmx5IHVzZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NlcGhmcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDZXBoZnMob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDZXBoZnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtb25pdG9ycyc6IG9iai5tb25pdG9ycz8ubWFwKHkgPT4geSksXG4gICAgJ3BhdGgnOiBvYmoucGF0aCxcbiAgICAncmVhZE9ubHknOiBvYmoucmVhZE9ubHksXG4gICAgJ3NlY3JldEZpbGUnOiBvYmouc2VjcmV0RmlsZSxcbiAgICAnc2VjcmV0UmVmJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NlcGhmc1NlY3JldFJlZihvYmouc2VjcmV0UmVmKSxcbiAgICAndXNlcic6IG9iai51c2VyLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY2luZGVyIHJlcHJlc2VudHMgYSBjaW5kZXIgdm9sdW1lIGF0dGFjaGVkIGFuZCBtb3VudGVkIG9uIGt1YmVsZXRzIGhvc3QgbWFjaGluZS5cbiAqIERlcHJlY2F0ZWQ6IENpbmRlciBpcyBkZXByZWNhdGVkLiBBbGwgb3BlcmF0aW9ucyBmb3IgdGhlIGluLXRyZWUgY2luZGVyIHR5cGVcbiAqIGFyZSByZWRpcmVjdGVkIHRvIHRoZSBjaW5kZXIuY3NpLm9wZW5zdGFjay5vcmcgQ1NJIGRyaXZlci5cbiAqIE1vcmUgaW5mbzogaHR0cHM6Ly9leGFtcGxlcy5rOHMuaW8vbXlzcWwtY2luZGVyLXBkL1JFQURNRS5tZFxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2luZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2luZGVyIHtcbiAgLyoqXG4gICAqIGZzVHlwZSBpcyB0aGUgZmlsZXN5c3RlbSB0eXBlIHRvIG1vdW50LlxuICAgKiBNdXN0IGJlIGEgZmlsZXN5c3RlbSB0eXBlIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtLlxuICAgKiBFeGFtcGxlczogXCJleHQ0XCIsIFwieGZzXCIsIFwibnRmc1wiLiBJbXBsaWNpdGx5IGluZmVycmVkIHRvIGJlIFwiZXh0NFwiIGlmIHVuc3BlY2lmaWVkLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8vZXhhbXBsZXMuazhzLmlvL215c3FsLWNpbmRlci1wZC9SRUFETUUubWRcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDaW5kZXIjZnNUeXBlXG4gICAqL1xuICByZWFkb25seSBmc1R5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHJlYWRPbmx5IGRlZmF1bHRzIHRvIGZhbHNlIChyZWFkL3dyaXRlKS4gUmVhZE9ubHkgaGVyZSB3aWxsIGZvcmNlXG4gICAqIHRoZSBSZWFkT25seSBzZXR0aW5nIGluIFZvbHVtZU1vdW50cy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2V4YW1wbGVzLms4cy5pby9teXNxbC1jaW5kZXItcGQvUkVBRE1FLm1kXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2luZGVyI3JlYWRPbmx5XG4gICAqL1xuICByZWFkb25seSByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHNlY3JldFJlZiBpcyBvcHRpb25hbDogcG9pbnRzIHRvIGEgc2VjcmV0IG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlcnMgdXNlZCB0byBjb25uZWN0XG4gICAqIHRvIE9wZW5TdGFjay5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDaW5kZXIjc2VjcmV0UmVmXG4gICAqL1xuICByZWFkb25seSBzZWNyZXRSZWY/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDaW5kZXJTZWNyZXRSZWY7XG5cbiAgLyoqXG4gICAqIHZvbHVtZUlEIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHZvbHVtZSBpbiBjaW5kZXIuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9leGFtcGxlcy5rOHMuaW8vbXlzcWwtY2luZGVyLXBkL1JFQURNRS5tZFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NpbmRlciN2b2x1bWVJRFxuICAgKi9cbiAgcmVhZG9ubHkgdm9sdW1lSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2luZGVyJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NpbmRlcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NpbmRlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2ZzVHlwZSc6IG9iai5mc1R5cGUsXG4gICAgJ3JlYWRPbmx5Jzogb2JqLnJlYWRPbmx5LFxuICAgICdzZWNyZXRSZWYnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2luZGVyU2VjcmV0UmVmKG9iai5zZWNyZXRSZWYpLFxuICAgICd2b2x1bWVJRCc6IG9iai52b2x1bWVJZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNvbmZpZ01hcCByZXByZXNlbnRzIGEgY29uZmlnTWFwIHRoYXQgc2hvdWxkIHBvcHVsYXRlIHRoaXMgdm9sdW1lXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDb25maWdNYXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDb25maWdNYXAge1xuICAvKipcbiAgICogZGVmYXVsdE1vZGUgaXMgb3B0aW9uYWw6IG1vZGUgYml0cyB1c2VkIHRvIHNldCBwZXJtaXNzaW9ucyBvbiBjcmVhdGVkIGZpbGVzIGJ5IGRlZmF1bHQuXG4gICAqIE11c3QgYmUgYW4gb2N0YWwgdmFsdWUgYmV0d2VlbiAwMDAwIGFuZCAwNzc3IG9yIGEgZGVjaW1hbCB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDUxMS5cbiAgICogWUFNTCBhY2NlcHRzIGJvdGggb2N0YWwgYW5kIGRlY2ltYWwgdmFsdWVzLCBKU09OIHJlcXVpcmVzIGRlY2ltYWwgdmFsdWVzIGZvciBtb2RlIGJpdHMuXG4gICAqIERlZmF1bHRzIHRvIDA2NDQuXG4gICAqIERpcmVjdG9yaWVzIHdpdGhpbiB0aGUgcGF0aCBhcmUgbm90IGFmZmVjdGVkIGJ5IHRoaXMgc2V0dGluZy5cbiAgICogVGhpcyBtaWdodCBiZSBpbiBjb25mbGljdCB3aXRoIG90aGVyIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGZpbGVcbiAgICogbW9kZSwgbGlrZSBmc0dyb3VwLCBhbmQgdGhlIHJlc3VsdCBjYW4gYmUgb3RoZXIgbW9kZSBiaXRzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgMDY0NC5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDb25maWdNYXAjZGVmYXVsdE1vZGVcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRNb2RlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBpdGVtcyBpZiB1bnNwZWNpZmllZCwgZWFjaCBrZXktdmFsdWUgcGFpciBpbiB0aGUgRGF0YSBmaWVsZCBvZiB0aGUgcmVmZXJlbmNlZFxuICAgKiBDb25maWdNYXAgd2lsbCBiZSBwcm9qZWN0ZWQgaW50byB0aGUgdm9sdW1lIGFzIGEgZmlsZSB3aG9zZSBuYW1lIGlzIHRoZVxuICAgKiBrZXkgYW5kIGNvbnRlbnQgaXMgdGhlIHZhbHVlLiBJZiBzcGVjaWZpZWQsIHRoZSBsaXN0ZWQga2V5cyB3aWxsIGJlXG4gICAqIHByb2plY3RlZCBpbnRvIHRoZSBzcGVjaWZpZWQgcGF0aHMsIGFuZCB1bmxpc3RlZCBrZXlzIHdpbGwgbm90IGJlXG4gICAqIHByZXNlbnQuIElmIGEga2V5IGlzIHNwZWNpZmllZCB3aGljaCBpcyBub3QgcHJlc2VudCBpbiB0aGUgQ29uZmlnTWFwLFxuICAgKiB0aGUgdm9sdW1lIHNldHVwIHdpbGwgZXJyb3IgdW5sZXNzIGl0IGlzIG1hcmtlZCBvcHRpb25hbC4gUGF0aHMgbXVzdCBiZVxuICAgKiByZWxhdGl2ZSBhbmQgbWF5IG5vdCBjb250YWluIHRoZSAnLi4nIHBhdGggb3Igc3RhcnQgd2l0aCAnLi4nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NvbmZpZ01hcCNpdGVtc1xuICAgKi9cbiAgcmVhZG9ubHkgaXRlbXM/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDb25maWdNYXBJdGVtc1tdO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDb25maWdNYXAjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogb3B0aW9uYWwgc3BlY2lmeSB3aGV0aGVyIHRoZSBDb25maWdNYXAgb3IgaXRzIGtleXMgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ29uZmlnTWFwI29wdGlvbmFsXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NvbmZpZ01hcCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDb25maWdNYXAob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDb25maWdNYXAgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkZWZhdWx0TW9kZSc6IG9iai5kZWZhdWx0TW9kZSxcbiAgICAnaXRlbXMnOiBvYmouaXRlbXM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDb25maWdNYXBJdGVtcyh5KSksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBjc2kgKENvbnRhaW5lciBTdG9yYWdlIEludGVyZmFjZSkgcmVwcmVzZW50cyBlcGhlbWVyYWwgc3RvcmFnZSB0aGF0IGlzIGhhbmRsZWQgYnkgY2VydGFpbiBleHRlcm5hbCBDU0kgZHJpdmVycy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NzaVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NzaSB7XG4gIC8qKlxuICAgKiBkcml2ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIENTSSBkcml2ZXIgdGhhdCBoYW5kbGVzIHRoaXMgdm9sdW1lLlxuICAgKiBDb25zdWx0IHdpdGggeW91ciBhZG1pbiBmb3IgdGhlIGNvcnJlY3QgbmFtZSBhcyByZWdpc3RlcmVkIGluIHRoZSBjbHVzdGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NzaSNkcml2ZXJcbiAgICovXG4gIHJlYWRvbmx5IGRyaXZlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBmc1R5cGUgdG8gbW91bnQuIEV4LiBcImV4dDRcIiwgXCJ4ZnNcIiwgXCJudGZzXCIuXG4gICAqIElmIG5vdCBwcm92aWRlZCwgdGhlIGVtcHR5IHZhbHVlIGlzIHBhc3NlZCB0byB0aGUgYXNzb2NpYXRlZCBDU0kgZHJpdmVyXG4gICAqIHdoaWNoIHdpbGwgZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGZpbGVzeXN0ZW0gdG8gYXBwbHkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ3NpI2ZzVHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgZnNUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBub2RlUHVibGlzaFNlY3JldFJlZiBpcyBhIHJlZmVyZW5jZSB0byB0aGUgc2VjcmV0IG9iamVjdCBjb250YWluaW5nXG4gICAqIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiB0byBwYXNzIHRvIHRoZSBDU0kgZHJpdmVyIHRvIGNvbXBsZXRlIHRoZSBDU0lcbiAgICogTm9kZVB1Ymxpc2hWb2x1bWUgYW5kIE5vZGVVbnB1Ymxpc2hWb2x1bWUgY2FsbHMuXG4gICAqIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGFuZCAgbWF5IGJlIGVtcHR5IGlmIG5vIHNlY3JldCBpcyByZXF1aXJlZC4gSWYgdGhlXG4gICAqIHNlY3JldCBvYmplY3QgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBzZWNyZXQsIGFsbCBzZWNyZXQgcmVmZXJlbmNlcyBhcmUgcGFzc2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NzaSNub2RlUHVibGlzaFNlY3JldFJlZlxuICAgKi9cbiAgcmVhZG9ubHkgbm9kZVB1Ymxpc2hTZWNyZXRSZWY/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDc2lOb2RlUHVibGlzaFNlY3JldFJlZjtcblxuICAvKipcbiAgICogcmVhZE9ubHkgc3BlY2lmaWVzIGEgcmVhZC1vbmx5IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB2b2x1bWUuXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlIChyZWFkL3dyaXRlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UgKHJlYWQvd3JpdGUpLlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NzaSNyZWFkT25seVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiB2b2x1bWVBdHRyaWJ1dGVzIHN0b3JlcyBkcml2ZXItc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIENTSVxuICAgKiBkcml2ZXIuIENvbnN1bHQgeW91ciBkcml2ZXIncyBkb2N1bWVudGF0aW9uIGZvciBzdXBwb3J0ZWQgdmFsdWVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NzaSN2b2x1bWVBdHRyaWJ1dGVzXG4gICAqL1xuICByZWFkb25seSB2b2x1bWVBdHRyaWJ1dGVzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ3NpJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NzaShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NzaSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2RyaXZlcic6IG9iai5kcml2ZXIsXG4gICAgJ2ZzVHlwZSc6IG9iai5mc1R5cGUsXG4gICAgJ25vZGVQdWJsaXNoU2VjcmV0UmVmJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NzaU5vZGVQdWJsaXNoU2VjcmV0UmVmKG9iai5ub2RlUHVibGlzaFNlY3JldFJlZiksXG4gICAgJ3JlYWRPbmx5Jzogb2JqLnJlYWRPbmx5LFxuICAgICd2b2x1bWVBdHRyaWJ1dGVzJzogKChvYmoudm9sdW1lQXR0cmlidXRlcykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLnZvbHVtZUF0dHJpYnV0ZXMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogZG93bndhcmRBUEkgcmVwcmVzZW50cyBkb3dud2FyZCBBUEkgYWJvdXQgdGhlIHBvZCB0aGF0IHNob3VsZCBwb3B1bGF0ZSB0aGlzIHZvbHVtZVxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNEb3dud2FyZEFwaSB7XG4gIC8qKlxuICAgKiBPcHRpb25hbDogbW9kZSBiaXRzIHRvIHVzZSBvbiBjcmVhdGVkIGZpbGVzIGJ5IGRlZmF1bHQuIE11c3QgYmUgYVxuICAgKiBPcHRpb25hbDogbW9kZSBiaXRzIHVzZWQgdG8gc2V0IHBlcm1pc3Npb25zIG9uIGNyZWF0ZWQgZmlsZXMgYnkgZGVmYXVsdC5cbiAgICogTXVzdCBiZSBhbiBvY3RhbCB2YWx1ZSBiZXR3ZWVuIDAwMDAgYW5kIDA3Nzcgb3IgYSBkZWNpbWFsIHZhbHVlIGJldHdlZW4gMCBhbmQgNTExLlxuICAgKiBZQU1MIGFjY2VwdHMgYm90aCBvY3RhbCBhbmQgZGVjaW1hbCB2YWx1ZXMsIEpTT04gcmVxdWlyZXMgZGVjaW1hbCB2YWx1ZXMgZm9yIG1vZGUgYml0cy5cbiAgICogRGVmYXVsdHMgdG8gMDY0NC5cbiAgICogRGlyZWN0b3JpZXMgd2l0aGluIHRoZSBwYXRoIGFyZSBub3QgYWZmZWN0ZWQgYnkgdGhpcyBzZXR0aW5nLlxuICAgKiBUaGlzIG1pZ2h0IGJlIGluIGNvbmZsaWN0IHdpdGggb3RoZXIgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgZmlsZVxuICAgKiBtb2RlLCBsaWtlIGZzR3JvdXAsIGFuZCB0aGUgcmVzdWx0IGNhbiBiZSBvdGhlciBtb2RlIGJpdHMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAwNjQ0LlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpI2RlZmF1bHRNb2RlXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0TW9kZT86IG51bWJlcjtcblxuICAvKipcbiAgICogSXRlbXMgaXMgYSBsaXN0IG9mIGRvd253YXJkIEFQSSB2b2x1bWUgZmlsZVxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpI2l0ZW1zXG4gICAqL1xuICByZWFkb25seSBpdGVtcz86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXNbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGkob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNEb3dud2FyZEFwaSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2RlZmF1bHRNb2RlJzogb2JqLmRlZmF1bHRNb2RlLFxuICAgICdpdGVtcyc6IG9iai5pdGVtcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogZW1wdHlEaXIgcmVwcmVzZW50cyBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCBzaGFyZXMgYSBwb2QncyBsaWZldGltZS5cbiAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS92b2x1bWVzI2VtcHR5ZGlyXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFbXB0eURpclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VtcHR5RGlyIHtcbiAgLyoqXG4gICAqIG1lZGl1bSByZXByZXNlbnRzIHdoYXQgdHlwZSBvZiBzdG9yYWdlIG1lZGl1bSBzaG91bGQgYmFjayB0aGlzIGRpcmVjdG9yeS5cbiAgICogVGhlIGRlZmF1bHQgaXMgXCJcIiB3aGljaCBtZWFucyB0byB1c2UgdGhlIG5vZGUncyBkZWZhdWx0IG1lZGl1bS5cbiAgICogTXVzdCBiZSBhbiBlbXB0eSBzdHJpbmcgKGRlZmF1bHQpIG9yIE1lbW9yeS5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjZW1wdHlkaXJcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFbXB0eURpciNtZWRpdW1cbiAgICovXG4gIHJlYWRvbmx5IG1lZGl1bT86IHN0cmluZztcblxuICAvKipcbiAgICogc2l6ZUxpbWl0IGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgbG9jYWwgc3RvcmFnZSByZXF1aXJlZCBmb3IgdGhpcyBFbXB0eURpciB2b2x1bWUuXG4gICAqIFRoZSBzaXplIGxpbWl0IGlzIGFsc28gYXBwbGljYWJsZSBmb3IgbWVtb3J5IG1lZGl1bS5cbiAgICogVGhlIG1heGltdW0gdXNhZ2Ugb24gbWVtb3J5IG1lZGl1bSBFbXB0eURpciB3b3VsZCBiZSB0aGUgbWluaW11bSB2YWx1ZSBiZXR3ZWVuXG4gICAqIHRoZSBTaXplTGltaXQgc3BlY2lmaWVkIGhlcmUgYW5kIHRoZSBzdW0gb2YgbWVtb3J5IGxpbWl0cyBvZiBhbGwgY29udGFpbmVycyBpbiBhIHBvZC5cbiAgICogVGhlIGRlZmF1bHQgaXMgbmlsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGxpbWl0IGlzIHVuZGVmaW5lZC5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjZW1wdHlkaXJcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFbXB0eURpciNzaXplTGltaXRcbiAgICovXG4gIHJlYWRvbmx5IHNpemVMaW1pdD86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VtcHR5RGlyU2l6ZUxpbWl0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFbXB0eURpcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFbXB0eURpcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VtcHR5RGlyIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWVkaXVtJzogb2JqLm1lZGl1bSxcbiAgICAnc2l6ZUxpbWl0Jzogb2JqLnNpemVMaW1pdD8udmFsdWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBlcGhlbWVyYWwgcmVwcmVzZW50cyBhIHZvbHVtZSB0aGF0IGlzIGhhbmRsZWQgYnkgYSBjbHVzdGVyIHN0b3JhZ2UgZHJpdmVyLlxuICogVGhlIHZvbHVtZSdzIGxpZmVjeWNsZSBpcyB0aWVkIHRvIHRoZSBwb2QgdGhhdCBkZWZpbmVzIGl0IC0gaXQgd2lsbCBiZSBjcmVhdGVkIGJlZm9yZSB0aGUgcG9kIHN0YXJ0cyxcbiAqIGFuZCBkZWxldGVkIHdoZW4gdGhlIHBvZCBpcyByZW1vdmVkLlxuICpcbiAqIFVzZSB0aGlzIGlmOlxuICogYSkgdGhlIHZvbHVtZSBpcyBvbmx5IG5lZWRlZCB3aGlsZSB0aGUgcG9kIHJ1bnMsXG4gKiBiKSBmZWF0dXJlcyBvZiBub3JtYWwgdm9sdW1lcyBsaWtlIHJlc3RvcmluZyBmcm9tIHNuYXBzaG90IG9yIGNhcGFjaXR5XG4gKiB0cmFja2luZyBhcmUgbmVlZGVkLFxuICogYykgdGhlIHN0b3JhZ2UgZHJpdmVyIGlzIHNwZWNpZmllZCB0aHJvdWdoIGEgc3RvcmFnZSBjbGFzcywgYW5kXG4gKiBkKSB0aGUgc3RvcmFnZSBkcml2ZXIgc3VwcG9ydHMgZHluYW1pYyB2b2x1bWUgcHJvdmlzaW9uaW5nIHRocm91Z2hcbiAqIGEgUGVyc2lzdGVudFZvbHVtZUNsYWltIChzZWUgRXBoZW1lcmFsVm9sdW1lU291cmNlIGZvciBtb3JlXG4gKiBpbmZvcm1hdGlvbiBvbiB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoaXMgdm9sdW1lIHR5cGVcbiAqIGFuZCBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0pLlxuICpcbiAqIFVzZSBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0gb3Igb25lIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWNcbiAqIEFQSXMgZm9yIHZvbHVtZXMgdGhhdCBwZXJzaXN0IGZvciBsb25nZXIgdGhhbiB0aGUgbGlmZWN5Y2xlXG4gKiBvZiBhbiBpbmRpdmlkdWFsIHBvZC5cbiAqXG4gKiBVc2UgQ1NJIGZvciBsaWdodC13ZWlnaHQgbG9jYWwgZXBoZW1lcmFsIHZvbHVtZXMgaWYgdGhlIENTSSBkcml2ZXIgaXMgbWVhbnQgdG9cbiAqIGJlIHVzZWQgdGhhdCB3YXkgLSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGRyaXZlciBmb3JcbiAqIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQSBwb2QgY2FuIHVzZSBib3RoIHR5cGVzIG9mIGVwaGVtZXJhbCB2b2x1bWVzIGFuZFxuICogcGVyc2lzdGVudCB2b2x1bWVzIGF0IHRoZSBzYW1lIHRpbWUuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWwge1xuICAvKipcbiAgICogV2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIHN0YW5kLWFsb25lIFBWQyB0byBwcm92aXNpb24gdGhlIHZvbHVtZS5cbiAgICogVGhlIHBvZCBpbiB3aGljaCB0aGlzIEVwaGVtZXJhbFZvbHVtZVNvdXJjZSBpcyBlbWJlZGRlZCB3aWxsIGJlIHRoZVxuICAgKiBvd25lciBvZiB0aGUgUFZDLCBpLmUuIHRoZSBQVkMgd2lsbCBiZSBkZWxldGVkIHRvZ2V0aGVyIHdpdGggdGhlXG4gICAqIHBvZC4gIFRoZSBuYW1lIG9mIHRoZSBQVkMgd2lsbCBiZSBgPHBvZCBuYW1lPi08dm9sdW1lIG5hbWU+YCB3aGVyZVxuICAgKiBgPHZvbHVtZSBuYW1lPmAgaXMgdGhlIG5hbWUgZnJvbSB0aGUgYFBvZFNwZWMuVm9sdW1lc2AgYXJyYXlcbiAgICogZW50cnkuIFBvZCB2YWxpZGF0aW9uIHdpbGwgcmVqZWN0IHRoZSBwb2QgaWYgdGhlIGNvbmNhdGVuYXRlZCBuYW1lXG4gICAqIGlzIG5vdCB2YWxpZCBmb3IgYSBQVkMgKGZvciBleGFtcGxlLCB0b28gbG9uZykuXG4gICAqXG4gICAqIEFuIGV4aXN0aW5nIFBWQyB3aXRoIHRoYXQgbmFtZSB0aGF0IGlzIG5vdCBvd25lZCBieSB0aGUgcG9kXG4gICAqIHdpbGwgKm5vdCogYmUgdXNlZCBmb3IgdGhlIHBvZCB0byBhdm9pZCB1c2luZyBhbiB1bnJlbGF0ZWRcbiAgICogdm9sdW1lIGJ5IG1pc3Rha2UuIFN0YXJ0aW5nIHRoZSBwb2QgaXMgdGhlbiBibG9ja2VkIHVudGlsXG4gICAqIHRoZSB1bnJlbGF0ZWQgUFZDIGlzIHJlbW92ZWQuIElmIHN1Y2ggYSBwcmUtY3JlYXRlZCBQVkMgaXNcbiAgICogbWVhbnQgdG8gYmUgdXNlZCBieSB0aGUgcG9kLCB0aGUgUFZDIGhhcyB0byB1cGRhdGVkIHdpdGggYW5cbiAgICogb3duZXIgcmVmZXJlbmNlIHRvIHRoZSBwb2Qgb25jZSB0aGUgcG9kIGV4aXN0cy4gTm9ybWFsbHlcbiAgICogdGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSwgYnV0IGl0IG1heSBiZSB1c2VmdWwgd2hlblxuICAgKiBtYW51YWxseSByZWNvbnN0cnVjdGluZyBhIGJyb2tlbiBjbHVzdGVyLlxuICAgKlxuICAgKiBUaGlzIGZpZWxkIGlzIHJlYWQtb25seSBhbmQgbm8gY2hhbmdlcyB3aWxsIGJlIG1hZGUgYnkgS3ViZXJuZXRlc1xuICAgKiB0byB0aGUgUFZDIGFmdGVyIGl0IGhhcyBiZWVuIGNyZWF0ZWQuXG4gICAqXG4gICAqIFJlcXVpcmVkLCBtdXN0IG5vdCBiZSBuaWwuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsI3ZvbHVtZUNsYWltVGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IHZvbHVtZUNsYWltVGVtcGxhdGU/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWwnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAndm9sdW1lQ2xhaW1UZW1wbGF0ZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlKG9iai52b2x1bWVDbGFpbVRlbXBsYXRlKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGZjIHJlcHJlc2VudHMgYSBGaWJyZSBDaGFubmVsIHJlc291cmNlIHRoYXQgaXMgYXR0YWNoZWQgdG8gYSBrdWJlbGV0J3MgaG9zdCBtYWNoaW5lIGFuZCB0aGVuIGV4cG9zZWQgdG8gdGhlIHBvZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ZjXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmMge1xuICAvKipcbiAgICogZnNUeXBlIGlzIHRoZSBmaWxlc3lzdGVtIHR5cGUgdG8gbW91bnQuXG4gICAqIE11c3QgYmUgYSBmaWxlc3lzdGVtIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0uXG4gICAqIEV4LiBcImV4dDRcIiwgXCJ4ZnNcIiwgXCJudGZzXCIuIEltcGxpY2l0bHkgaW5mZXJyZWQgdG8gYmUgXCJleHQ0XCIgaWYgdW5zcGVjaWZpZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmMjZnNUeXBlXG4gICAqL1xuICByZWFkb25seSBmc1R5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGx1biBpcyBPcHRpb25hbDogRkMgdGFyZ2V0IGx1biBudW1iZXJcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNGYyNsdW5cbiAgICovXG4gIHJlYWRvbmx5IGx1bj86IG51bWJlcjtcblxuICAvKipcbiAgICogcmVhZE9ubHkgaXMgT3B0aW9uYWw6IERlZmF1bHRzIHRvIGZhbHNlIChyZWFkL3dyaXRlKS4gUmVhZE9ubHkgaGVyZSB3aWxsIGZvcmNlXG4gICAqIHRoZSBSZWFkT25seSBzZXR0aW5nIGluIFZvbHVtZU1vdW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UgKHJlYWQvd3JpdGUpLiBSZWFkT25seSBoZXJlIHdpbGwgZm9yY2VcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNGYyNyZWFkT25seVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiB0YXJnZXRXV05zIGlzIE9wdGlvbmFsOiBGQyB0YXJnZXQgd29ybGR3aWRlIG5hbWVzIChXV05zKVxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ZjI3RhcmdldFdXTnNcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFd3TnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogd3dpZHMgT3B0aW9uYWw6IEZDIHZvbHVtZSB3b3JsZCB3aWRlIGlkZW50aWZpZXJzICh3d2lkcylcbiAgICogRWl0aGVyIHd3aWRzIG9yIGNvbWJpbmF0aW9uIG9mIHRhcmdldFdXTnMgYW5kIGx1biBtdXN0IGJlIHNldCwgYnV0IG5vdCBib3RoIHNpbXVsdGFuZW91c2x5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ZjI3d3aWRzXG4gICAqL1xuICByZWFkb25seSB3d2lkcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNGYycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNGYyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ZjIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZnNUeXBlJzogb2JqLmZzVHlwZSxcbiAgICAnbHVuJzogb2JqLmx1bixcbiAgICAncmVhZE9ubHknOiBvYmoucmVhZE9ubHksXG4gICAgJ3RhcmdldFdXTnMnOiBvYmoudGFyZ2V0V3dOcz8ubWFwKHkgPT4geSksXG4gICAgJ3d3aWRzJzogb2JqLnd3aWRzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGZsZXhWb2x1bWUgcmVwcmVzZW50cyBhIGdlbmVyaWMgdm9sdW1lIHJlc291cmNlIHRoYXQgaXNcbiAqIHByb3Zpc2lvbmVkL2F0dGFjaGVkIHVzaW5nIGFuIGV4ZWMgYmFzZWQgcGx1Z2luLlxuICogRGVwcmVjYXRlZDogRmxleFZvbHVtZSBpcyBkZXByZWNhdGVkLiBDb25zaWRlciB1c2luZyBhIENTSURyaXZlciBpbnN0ZWFkLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmxleFZvbHVtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ZsZXhWb2x1bWUge1xuICAvKipcbiAgICogZHJpdmVyIGlzIHRoZSBuYW1lIG9mIHRoZSBkcml2ZXIgdG8gdXNlIGZvciB0aGlzIHZvbHVtZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNGbGV4Vm9sdW1lI2RyaXZlclxuICAgKi9cbiAgcmVhZG9ubHkgZHJpdmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGZzVHlwZSBpcyB0aGUgZmlsZXN5c3RlbSB0eXBlIHRvIG1vdW50LlxuICAgKiBNdXN0IGJlIGEgZmlsZXN5c3RlbSB0eXBlIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtLlxuICAgKiBFeC4gXCJleHQ0XCIsIFwieGZzXCIsIFwibnRmc1wiLiBUaGUgZGVmYXVsdCBmaWxlc3lzdGVtIGRlcGVuZHMgb24gRmxleFZvbHVtZSBzY3JpcHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmxleFZvbHVtZSNmc1R5cGVcbiAgICovXG4gIHJlYWRvbmx5IGZzVHlwZT86IHN0cmluZztcblxuICAvKipcbiAgICogb3B0aW9ucyBpcyBPcHRpb25hbDogdGhpcyBmaWVsZCBob2xkcyBleHRyYSBjb21tYW5kIG9wdGlvbnMgaWYgYW55LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ZsZXhWb2x1bWUjb3B0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9ucz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIHJlYWRPbmx5IGlzIE9wdGlvbmFsOiBkZWZhdWx0cyB0byBmYWxzZSAocmVhZC93cml0ZSkuIFJlYWRPbmx5IGhlcmUgd2lsbCBmb3JjZVxuICAgKiB0aGUgUmVhZE9ubHkgc2V0dGluZyBpbiBWb2x1bWVNb3VudHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmxleFZvbHVtZSNyZWFkT25seVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBzZWNyZXRSZWYgaXMgT3B0aW9uYWw6IHNlY3JldFJlZiBpcyByZWZlcmVuY2UgdG8gdGhlIHNlY3JldCBvYmplY3QgY29udGFpbmluZ1xuICAgKiBzZW5zaXRpdmUgaW5mb3JtYXRpb24gdG8gcGFzcyB0byB0aGUgcGx1Z2luIHNjcmlwdHMuIFRoaXMgbWF5IGJlXG4gICAqIGVtcHR5IGlmIG5vIHNlY3JldCBvYmplY3QgaXMgc3BlY2lmaWVkLiBJZiB0aGUgc2VjcmV0IG9iamVjdFxuICAgKiBjb250YWlucyBtb3JlIHRoYW4gb25lIHNlY3JldCwgYWxsIHNlY3JldHMgYXJlIHBhc3NlZCB0byB0aGUgcGx1Z2luXG4gICAqIHNjcmlwdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmxleFZvbHVtZSNzZWNyZXRSZWZcbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldFJlZj86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ZsZXhWb2x1bWVTZWNyZXRSZWY7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ZsZXhWb2x1bWUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmxleFZvbHVtZShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ZsZXhWb2x1bWUgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkcml2ZXInOiBvYmouZHJpdmVyLFxuICAgICdmc1R5cGUnOiBvYmouZnNUeXBlLFxuICAgICdvcHRpb25zJzogKChvYmoub3B0aW9ucykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm9wdGlvbnMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICAgICdyZWFkT25seSc6IG9iai5yZWFkT25seSxcbiAgICAnc2VjcmV0UmVmJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ZsZXhWb2x1bWVTZWNyZXRSZWYob2JqLnNlY3JldFJlZiksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBmbG9ja2VyIHJlcHJlc2VudHMgYSBGbG9ja2VyIHZvbHVtZSBhdHRhY2hlZCB0byBhIGt1YmVsZXQncyBob3N0IG1hY2hpbmUuIFRoaXMgZGVwZW5kcyBvbiB0aGUgRmxvY2tlciBjb250cm9sIHNlcnZpY2UgYmVpbmcgcnVubmluZy5cbiAqIERlcHJlY2F0ZWQ6IEZsb2NrZXIgaXMgZGVwcmVjYXRlZCBhbmQgdGhlIGluLXRyZWUgZmxvY2tlciB0eXBlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNGbG9ja2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmxvY2tlciB7XG4gIC8qKlxuICAgKiBkYXRhc2V0TmFtZSBpcyBOYW1lIG9mIHRoZSBkYXRhc2V0IHN0b3JlZCBhcyBtZXRhZGF0YSAtPiBuYW1lIG9uIHRoZSBkYXRhc2V0IGZvciBGbG9ja2VyXG4gICAqIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGRlcHJlY2F0ZWRcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNGbG9ja2VyI2RhdGFzZXROYW1lXG4gICAqL1xuICByZWFkb25seSBkYXRhc2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogZGF0YXNldFVVSUQgaXMgdGhlIFVVSUQgb2YgdGhlIGRhdGFzZXQuIFRoaXMgaXMgdW5pcXVlIGlkZW50aWZpZXIgb2YgYSBGbG9ja2VyIGRhdGFzZXRcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNGbG9ja2VyI2RhdGFzZXRVVUlEXG4gICAqL1xuICByZWFkb25seSBkYXRhc2V0VXVpZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmxvY2tlcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNGbG9ja2VyKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmxvY2tlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2RhdGFzZXROYW1lJzogb2JqLmRhdGFzZXROYW1lLFxuICAgICdkYXRhc2V0VVVJRCc6IG9iai5kYXRhc2V0VXVpZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGdjZVBlcnNpc3RlbnREaXNrIHJlcHJlc2VudHMgYSBHQ0UgRGlzayByZXNvdXJjZSB0aGF0IGlzIGF0dGFjaGVkIHRvIGFcbiAqIGt1YmVsZXQncyBob3N0IG1hY2hpbmUgYW5kIHRoZW4gZXhwb3NlZCB0byB0aGUgcG9kLlxuICogRGVwcmVjYXRlZDogR0NFUGVyc2lzdGVudERpc2sgaXMgZGVwcmVjYXRlZC4gQWxsIG9wZXJhdGlvbnMgZm9yIHRoZSBpbi10cmVlXG4gKiBnY2VQZXJzaXN0ZW50RGlzayB0eXBlIGFyZSByZWRpcmVjdGVkIHRvIHRoZSBwZC5jc2kuc3RvcmFnZS5na2UuaW8gQ1NJIGRyaXZlci5cbiAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS92b2x1bWVzI2djZXBlcnNpc3RlbnRkaXNrXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNHY2VQZXJzaXN0ZW50RGlza1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0djZVBlcnNpc3RlbnREaXNrIHtcbiAgLyoqXG4gICAqIGZzVHlwZSBpcyBmaWxlc3lzdGVtIHR5cGUgb2YgdGhlIHZvbHVtZSB0aGF0IHlvdSB3YW50IHRvIG1vdW50LlxuICAgKiBUaXA6IEVuc3VyZSB0aGF0IHRoZSBmaWxlc3lzdGVtIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0uXG4gICAqIEV4YW1wbGVzOiBcImV4dDRcIiwgXCJ4ZnNcIiwgXCJudGZzXCIuIEltcGxpY2l0bHkgaW5mZXJyZWQgdG8gYmUgXCJleHQ0XCIgaWYgdW5zcGVjaWZpZWQuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS92b2x1bWVzI2djZXBlcnNpc3RlbnRkaXNrXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzR2NlUGVyc2lzdGVudERpc2sjZnNUeXBlXG4gICAqL1xuICByZWFkb25seSBmc1R5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHBhcnRpdGlvbiBpcyB0aGUgcGFydGl0aW9uIGluIHRoZSB2b2x1bWUgdGhhdCB5b3Ugd2FudCB0byBtb3VudC5cbiAgICogSWYgb21pdHRlZCwgdGhlIGRlZmF1bHQgaXMgdG8gbW91bnQgYnkgdm9sdW1lIG5hbWUuXG4gICAqIEV4YW1wbGVzOiBGb3Igdm9sdW1lIC9kZXYvc2RhMSwgeW91IHNwZWNpZnkgdGhlIHBhcnRpdGlvbiBhcyBcIjFcIi5cbiAgICogU2ltaWxhcmx5LCB0aGUgdm9sdW1lIHBhcnRpdGlvbiBmb3IgL2Rldi9zZGEgaXMgXCIwXCIgKG9yIHlvdSBjYW4gbGVhdmUgdGhlIHByb3BlcnR5IGVtcHR5KS5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjZ2NlcGVyc2lzdGVudGRpc2tcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNHY2VQZXJzaXN0ZW50RGlzayNwYXJ0aXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogcGROYW1lIGlzIHVuaXF1ZSBuYW1lIG9mIHRoZSBQRCByZXNvdXJjZSBpbiBHQ0UuIFVzZWQgdG8gaWRlbnRpZnkgdGhlIGRpc2sgaW4gR0NFLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcyNnY2VwZXJzaXN0ZW50ZGlza1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0djZVBlcnNpc3RlbnREaXNrI3BkTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgcGROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHJlYWRPbmx5IGhlcmUgd2lsbCBmb3JjZSB0aGUgUmVhZE9ubHkgc2V0dGluZyBpbiBWb2x1bWVNb3VudHMuXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcyNnY2VwZXJzaXN0ZW50ZGlza1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZS5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNHY2VQZXJzaXN0ZW50RGlzayNyZWFkT25seVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNHY2VQZXJzaXN0ZW50RGlzaycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNHY2VQZXJzaXN0ZW50RGlzayhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0djZVBlcnNpc3RlbnREaXNrIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZnNUeXBlJzogb2JqLmZzVHlwZSxcbiAgICAncGFydGl0aW9uJzogb2JqLnBhcnRpdGlvbixcbiAgICAncGROYW1lJzogb2JqLnBkTmFtZSxcbiAgICAncmVhZE9ubHknOiBvYmoucmVhZE9ubHksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBnaXRSZXBvIHJlcHJlc2VudHMgYSBnaXQgcmVwb3NpdG9yeSBhdCBhIHBhcnRpY3VsYXIgcmV2aXNpb24uXG4gKiBEZXByZWNhdGVkOiBHaXRSZXBvIGlzIGRlcHJlY2F0ZWQuIFRvIHByb3Zpc2lvbiBhIGNvbnRhaW5lciB3aXRoIGEgZ2l0IHJlcG8sIG1vdW50IGFuXG4gKiBFbXB0eURpciBpbnRvIGFuIEluaXRDb250YWluZXIgdGhhdCBjbG9uZXMgdGhlIHJlcG8gdXNpbmcgZ2l0LCB0aGVuIG1vdW50IHRoZSBFbXB0eURpclxuICogaW50byB0aGUgUG9kJ3MgY29udGFpbmVyLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzR2l0UmVwb1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0dpdFJlcG8ge1xuICAvKipcbiAgICogZGlyZWN0b3J5IGlzIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG5hbWUuXG4gICAqIE11c3Qgbm90IGNvbnRhaW4gb3Igc3RhcnQgd2l0aCAnLi4nLiAgSWYgJy4nIGlzIHN1cHBsaWVkLCB0aGUgdm9sdW1lIGRpcmVjdG9yeSB3aWxsIGJlIHRoZVxuICAgKiBnaXQgcmVwb3NpdG9yeS4gIE90aGVyd2lzZSwgaWYgc3BlY2lmaWVkLCB0aGUgdm9sdW1lIHdpbGwgY29udGFpbiB0aGUgZ2l0IHJlcG9zaXRvcnkgaW5cbiAgICogdGhlIHN1YmRpcmVjdG9yeSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0dpdFJlcG8jZGlyZWN0b3J5XG4gICAqL1xuICByZWFkb25seSBkaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHJlcG9zaXRvcnkgaXMgdGhlIFVSTFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0dpdFJlcG8jcmVwb3NpdG9yeVxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiByZXZpc2lvbiBpcyB0aGUgY29tbWl0IGhhc2ggZm9yIHRoZSBzcGVjaWZpZWQgcmV2aXNpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzR2l0UmVwbyNyZXZpc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgcmV2aXNpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0dpdFJlcG8nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzR2l0UmVwbyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0dpdFJlcG8gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkaXJlY3RvcnknOiBvYmouZGlyZWN0b3J5LFxuICAgICdyZXBvc2l0b3J5Jzogb2JqLnJlcG9zaXRvcnksXG4gICAgJ3JldmlzaW9uJzogb2JqLnJldmlzaW9uLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogZ2x1c3RlcmZzIHJlcHJlc2VudHMgYSBHbHVzdGVyZnMgbW91bnQgb24gdGhlIGhvc3QgdGhhdCBzaGFyZXMgYSBwb2QncyBsaWZldGltZS5cbiAqIERlcHJlY2F0ZWQ6IEdsdXN0ZXJmcyBpcyBkZXByZWNhdGVkIGFuZCB0aGUgaW4tdHJlZSBnbHVzdGVyZnMgdHlwZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzR2x1c3RlcmZzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzR2x1c3RlcmZzIHtcbiAgLyoqXG4gICAqIGVuZHBvaW50cyBpcyB0aGUgZW5kcG9pbnQgbmFtZSB0aGF0IGRldGFpbHMgR2x1c3RlcmZzIHRvcG9sb2d5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0dsdXN0ZXJmcyNlbmRwb2ludHNcbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50czogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBwYXRoIGlzIHRoZSBHbHVzdGVyZnMgdm9sdW1lIHBhdGguXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9leGFtcGxlcy5rOHMuaW8vdm9sdW1lcy9nbHVzdGVyZnMvUkVBRE1FLm1kI2NyZWF0ZS1hLXBvZFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0dsdXN0ZXJmcyNwYXRoXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHJlYWRPbmx5IGhlcmUgd2lsbCBmb3JjZSB0aGUgR2x1c3RlcmZzIHZvbHVtZSB0byBiZSBtb3VudGVkIHdpdGggcmVhZC1vbmx5IHBlcm1pc3Npb25zLlxuICAgKiBEZWZhdWx0cyB0byBmYWxzZS5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2V4YW1wbGVzLms4cy5pby92b2x1bWVzL2dsdXN0ZXJmcy9SRUFETUUubWQjY3JlYXRlLWEtcG9kXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlLlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0dsdXN0ZXJmcyNyZWFkT25seVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNHbHVzdGVyZnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzR2x1c3RlcmZzKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzR2x1c3RlcmZzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5kcG9pbnRzJzogb2JqLmVuZHBvaW50cyxcbiAgICAncGF0aCc6IG9iai5wYXRoLFxuICAgICdyZWFkT25seSc6IG9iai5yZWFkT25seSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGhvc3RQYXRoIHJlcHJlc2VudHMgYSBwcmUtZXhpc3RpbmcgZmlsZSBvciBkaXJlY3Rvcnkgb24gdGhlIGhvc3RcbiAqIG1hY2hpbmUgdGhhdCBpcyBkaXJlY3RseSBleHBvc2VkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgaXMgZ2VuZXJhbGx5XG4gKiB1c2VkIGZvciBzeXN0ZW0gYWdlbnRzIG9yIG90aGVyIHByaXZpbGVnZWQgdGhpbmdzIHRoYXQgYXJlIGFsbG93ZWRcbiAqIHRvIHNlZSB0aGUgaG9zdCBtYWNoaW5lLiBNb3N0IGNvbnRhaW5lcnMgd2lsbCBOT1QgbmVlZCB0aGlzLlxuICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjaG9zdHBhdGhcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0hvc3RQYXRoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSG9zdFBhdGgge1xuICAvKipcbiAgICogcGF0aCBvZiB0aGUgZGlyZWN0b3J5IG9uIHRoZSBob3N0LlxuICAgKiBJZiB0aGUgcGF0aCBpcyBhIHN5bWxpbmssIGl0IHdpbGwgZm9sbG93IHRoZSBsaW5rIHRvIHRoZSByZWFsIHBhdGguXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS92b2x1bWVzI2hvc3RwYXRoXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSG9zdFBhdGgjcGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB0eXBlIGZvciBIb3N0UGF0aCBWb2x1bWVcbiAgICogRGVmYXVsdHMgdG8gXCJcIlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcyNob3N0cGF0aFxuICAgKlxuICAgKiBAZGVmYXVsdCBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcyNob3N0cGF0aFxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0hvc3RQYXRoI3R5cGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0hvc3RQYXRoJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0hvc3RQYXRoKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSG9zdFBhdGggfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwYXRoJzogb2JqLnBhdGgsXG4gICAgJ3R5cGUnOiBvYmoudHlwZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGltYWdlIHJlcHJlc2VudHMgYW4gT0NJIG9iamVjdCAoYSBjb250YWluZXIgaW1hZ2Ugb3IgYXJ0aWZhY3QpIHB1bGxlZCBhbmQgbW91bnRlZCBvbiB0aGUga3ViZWxldCdzIGhvc3QgbWFjaGluZS5cbiAqIFRoZSB2b2x1bWUgaXMgcmVzb2x2ZWQgYXQgcG9kIHN0YXJ0dXAgZGVwZW5kaW5nIG9uIHdoaWNoIFB1bGxQb2xpY3kgdmFsdWUgaXMgcHJvdmlkZWQ6XG4gKlxuICogLSBBbHdheXM6IHRoZSBrdWJlbGV0IGFsd2F5cyBhdHRlbXB0cyB0byBwdWxsIHRoZSByZWZlcmVuY2UuIENvbnRhaW5lciBjcmVhdGlvbiB3aWxsIGZhaWwgSWYgdGhlIHB1bGwgZmFpbHMuXG4gKiAtIE5ldmVyOiB0aGUga3ViZWxldCBuZXZlciBwdWxscyB0aGUgcmVmZXJlbmNlIGFuZCBvbmx5IHVzZXMgYSBsb2NhbCBpbWFnZSBvciBhcnRpZmFjdC4gQ29udGFpbmVyIGNyZWF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgcmVmZXJlbmNlIGlzbid0IHByZXNlbnQuXG4gKiAtIElmTm90UHJlc2VudDogdGhlIGt1YmVsZXQgcHVsbHMgaWYgdGhlIHJlZmVyZW5jZSBpc24ndCBhbHJlYWR5IHByZXNlbnQgb24gZGlzay4gQ29udGFpbmVyIGNyZWF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgcmVmZXJlbmNlIGlzbid0IHByZXNlbnQgYW5kIHRoZSBwdWxsIGZhaWxzLlxuICpcbiAqIFRoZSB2b2x1bWUgZ2V0cyByZS1yZXNvbHZlZCBpZiB0aGUgcG9kIGdldHMgZGVsZXRlZCBhbmQgcmVjcmVhdGVkLCB3aGljaCBtZWFucyB0aGF0IG5ldyByZW1vdGUgY29udGVudCB3aWxsIGJlY29tZSBhdmFpbGFibGUgb24gcG9kIHJlY3JlYXRpb24uXG4gKiBBIGZhaWx1cmUgdG8gcmVzb2x2ZSBvciBwdWxsIHRoZSBpbWFnZSBkdXJpbmcgcG9kIHN0YXJ0dXAgd2lsbCBibG9jayBjb250YWluZXJzIGZyb20gc3RhcnRpbmcgYW5kIG1heSBhZGQgc2lnbmlmaWNhbnQgbGF0ZW5jeS4gRmFpbHVyZXMgd2lsbCBiZSByZXRyaWVkIHVzaW5nIG5vcm1hbCB2b2x1bWUgYmFja29mZiBhbmQgd2lsbCBiZSByZXBvcnRlZCBvbiB0aGUgcG9kIHJlYXNvbiBhbmQgbWVzc2FnZS5cbiAqIFRoZSB0eXBlcyBvZiBvYmplY3RzIHRoYXQgbWF5IGJlIG1vdW50ZWQgYnkgdGhpcyB2b2x1bWUgYXJlIGRlZmluZWQgYnkgdGhlIGNvbnRhaW5lciBydW50aW1lIGltcGxlbWVudGF0aW9uIG9uIGEgaG9zdCBtYWNoaW5lIGFuZCBhdCBtaW5pbXVtIG11c3QgaW5jbHVkZSBhbGwgdmFsaWQgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoZSBjb250YWluZXIgaW1hZ2UgZmllbGQuXG4gKiBUaGUgT0NJIG9iamVjdCBnZXRzIG1vdW50ZWQgaW4gYSBzaW5nbGUgZGlyZWN0b3J5IChzcGVjLmNvbnRhaW5lcnNbKl0udm9sdW1lTW91bnRzLm1vdW50UGF0aCkgYnkgbWVyZ2luZyB0aGUgbWFuaWZlc3QgbGF5ZXJzIGluIHRoZSBzYW1lIHdheSBhcyBmb3IgY29udGFpbmVyIGltYWdlcy5cbiAqIFRoZSB2b2x1bWUgd2lsbCBiZSBtb3VudGVkIHJlYWQtb25seSAocm8pIGFuZCBub24tZXhlY3V0YWJsZSBmaWxlcyAobm9leGVjKS5cbiAqIFN1YiBwYXRoIG1vdW50cyBmb3IgY29udGFpbmVycyBhcmUgbm90IHN1cHBvcnRlZCAoc3BlYy5jb250YWluZXJzWypdLnZvbHVtZU1vdW50cy5zdWJwYXRoKSBiZWZvcmUgMS4zMy5cbiAqIFRoZSBmaWVsZCBzcGVjLnNlY3VyaXR5Q29udGV4dC5mc0dyb3VwQ2hhbmdlUG9saWN5IGhhcyBubyBlZmZlY3Qgb24gdGhpcyB2b2x1bWUgdHlwZS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ltYWdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSW1hZ2Uge1xuICAvKipcbiAgICogUG9saWN5IGZvciBwdWxsaW5nIE9DSSBvYmplY3RzLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICAgKiBBbHdheXM6IHRoZSBrdWJlbGV0IGFsd2F5cyBhdHRlbXB0cyB0byBwdWxsIHRoZSByZWZlcmVuY2UuIENvbnRhaW5lciBjcmVhdGlvbiB3aWxsIGZhaWwgSWYgdGhlIHB1bGwgZmFpbHMuXG4gICAqIE5ldmVyOiB0aGUga3ViZWxldCBuZXZlciBwdWxscyB0aGUgcmVmZXJlbmNlIGFuZCBvbmx5IHVzZXMgYSBsb2NhbCBpbWFnZSBvciBhcnRpZmFjdC4gQ29udGFpbmVyIGNyZWF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgcmVmZXJlbmNlIGlzbid0IHByZXNlbnQuXG4gICAqIElmTm90UHJlc2VudDogdGhlIGt1YmVsZXQgcHVsbHMgaWYgdGhlIHJlZmVyZW5jZSBpc24ndCBhbHJlYWR5IHByZXNlbnQgb24gZGlzay4gQ29udGFpbmVyIGNyZWF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgcmVmZXJlbmNlIGlzbid0IHByZXNlbnQgYW5kIHRoZSBwdWxsIGZhaWxzLlxuICAgKiBEZWZhdWx0cyB0byBBbHdheXMgaWYgOmxhdGVzdCB0YWcgaXMgc3BlY2lmaWVkLCBvciBJZk5vdFByZXNlbnQgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBbHdheXMgaWYgOmxhdGVzdCB0YWcgaXMgc3BlY2lmaWVkLCBvciBJZk5vdFByZXNlbnQgb3RoZXJ3aXNlLlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ltYWdlI3B1bGxQb2xpY3lcbiAgICovXG4gIHJlYWRvbmx5IHB1bGxQb2xpY3k/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcXVpcmVkOiBJbWFnZSBvciBhcnRpZmFjdCByZWZlcmVuY2UgdG8gYmUgdXNlZC5cbiAgICogQmVoYXZlcyBpbiB0aGUgc2FtZSB3YXkgYXMgcG9kLnNwZWMuY29udGFpbmVyc1sqXS5pbWFnZS5cbiAgICogUHVsbCBzZWNyZXRzIHdpbGwgYmUgYXNzZW1ibGVkIGluIHRoZSBzYW1lIHdheSBhcyBmb3IgdGhlIGNvbnRhaW5lciBpbWFnZSBieSBsb29raW5nIHVwIG5vZGUgY3JlZGVudGlhbHMsIFNBIGltYWdlIHB1bGwgc2VjcmV0cywgYW5kIHBvZCBzcGVjIGltYWdlIHB1bGwgc2VjcmV0cy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9jb250YWluZXJzL2ltYWdlc1xuICAgKiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsIHRvIGFsbG93IGhpZ2hlciBsZXZlbCBjb25maWcgbWFuYWdlbWVudCB0byBkZWZhdWx0IG9yIG92ZXJyaWRlXG4gICAqIGNvbnRhaW5lciBpbWFnZXMgaW4gd29ya2xvYWQgY29udHJvbGxlcnMgbGlrZSBEZXBsb3ltZW50cyBhbmQgU3RhdGVmdWxTZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ltYWdlI3JlZmVyZW5jZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNJbWFnZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNJbWFnZShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ltYWdlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHVsbFBvbGljeSc6IG9iai5wdWxsUG9saWN5LFxuICAgICdyZWZlcmVuY2UnOiBvYmoucmVmZXJlbmNlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogaXNjc2kgcmVwcmVzZW50cyBhbiBJU0NTSSBEaXNrIHJlc291cmNlIHRoYXQgaXMgYXR0YWNoZWQgdG8gYVxuICoga3ViZWxldCdzIGhvc3QgbWFjaGluZSBhbmQgdGhlbiBleHBvc2VkIHRvIHRoZSBwb2QuXG4gKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcy8jaXNjc2lcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0lzY3NpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSXNjc2kge1xuICAvKipcbiAgICogY2hhcEF1dGhEaXNjb3ZlcnkgZGVmaW5lcyB3aGV0aGVyIHN1cHBvcnQgaVNDU0kgRGlzY292ZXJ5IENIQVAgYXV0aGVudGljYXRpb25cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNJc2NzaSNjaGFwQXV0aERpc2NvdmVyeVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhcEF1dGhEaXNjb3Zlcnk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBjaGFwQXV0aFNlc3Npb24gZGVmaW5lcyB3aGV0aGVyIHN1cHBvcnQgaVNDU0kgU2Vzc2lvbiBDSEFQIGF1dGhlbnRpY2F0aW9uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSXNjc2kjY2hhcEF1dGhTZXNzaW9uXG4gICAqL1xuICByZWFkb25seSBjaGFwQXV0aFNlc3Npb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBmc1R5cGUgaXMgdGhlIGZpbGVzeXN0ZW0gdHlwZSBvZiB0aGUgdm9sdW1lIHRoYXQgeW91IHdhbnQgdG8gbW91bnQuXG4gICAqIFRpcDogRW5zdXJlIHRoYXQgdGhlIGZpbGVzeXN0ZW0gdHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbS5cbiAgICogRXhhbXBsZXM6IFwiZXh0NFwiLCBcInhmc1wiLCBcIm50ZnNcIi4gSW1wbGljaXRseSBpbmZlcnJlZCB0byBiZSBcImV4dDRcIiBpZiB1bnNwZWNpZmllZC5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjaXNjc2lcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNJc2NzaSNmc1R5cGVcbiAgICovXG4gIHJlYWRvbmx5IGZzVHlwZT86IHN0cmluZztcblxuICAvKipcbiAgICogaW5pdGlhdG9yTmFtZSBpcyB0aGUgY3VzdG9tIGlTQ1NJIEluaXRpYXRvciBOYW1lLlxuICAgKiBJZiBpbml0aWF0b3JOYW1lIGlzIHNwZWNpZmllZCB3aXRoIGlzY3NpSW50ZXJmYWNlIHNpbXVsdGFuZW91c2x5LCBuZXcgaVNDU0kgaW50ZXJmYWNlXG4gICAqIDx0YXJnZXQgcG9ydGFsPjo8dm9sdW1lIG5hbWU+IHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhlIGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSXNjc2kjaW5pdGlhdG9yTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhdG9yTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogaXFuIGlzIHRoZSB0YXJnZXQgaVNDU0kgUXVhbGlmaWVkIE5hbWUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSXNjc2kjaXFuXG4gICAqL1xuICByZWFkb25seSBpcW46IHN0cmluZztcblxuICAvKipcbiAgICogaXNjc2lJbnRlcmZhY2UgaXMgdGhlIGludGVyZmFjZSBOYW1lIHRoYXQgdXNlcyBhbiBpU0NTSSB0cmFuc3BvcnQuXG4gICAqIERlZmF1bHRzIHRvICdkZWZhdWx0JyAodGNwKS5cbiAgICpcbiAgICogQGRlZmF1bHQgZGVmYXVsdCcgKHRjcCkuXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSXNjc2kjaXNjc2lJbnRlcmZhY2VcbiAgICovXG4gIHJlYWRvbmx5IGlzY3NpSW50ZXJmYWNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBsdW4gcmVwcmVzZW50cyBpU0NTSSBUYXJnZXQgTHVuIG51bWJlci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNJc2NzaSNsdW5cbiAgICovXG4gIHJlYWRvbmx5IGx1bjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBwb3J0YWxzIGlzIHRoZSBpU0NTSSBUYXJnZXQgUG9ydGFsIExpc3QuIFRoZSBwb3J0YWwgaXMgZWl0aGVyIGFuIElQIG9yIGlwX2FkZHI6cG9ydCBpZiB0aGUgcG9ydFxuICAgKiBpcyBvdGhlciB0aGFuIGRlZmF1bHQgKHR5cGljYWxseSBUQ1AgcG9ydHMgODYwIGFuZCAzMjYwKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNJc2NzaSNwb3J0YWxzXG4gICAqL1xuICByZWFkb25seSBwb3J0YWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIHJlYWRPbmx5IGhlcmUgd2lsbCBmb3JjZSB0aGUgUmVhZE9ubHkgc2V0dGluZyBpbiBWb2x1bWVNb3VudHMuXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZS5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNJc2NzaSNyZWFkT25seVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBzZWNyZXRSZWYgaXMgdGhlIENIQVAgU2VjcmV0IGZvciBpU0NTSSB0YXJnZXQgYW5kIGluaXRpYXRvciBhdXRoZW50aWNhdGlvblxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0lzY3NpI3NlY3JldFJlZlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0UmVmPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSXNjc2lTZWNyZXRSZWY7XG5cbiAgLyoqXG4gICAqIHRhcmdldFBvcnRhbCBpcyBpU0NTSSBUYXJnZXQgUG9ydGFsLiBUaGUgUG9ydGFsIGlzIGVpdGhlciBhbiBJUCBvciBpcF9hZGRyOnBvcnQgaWYgdGhlIHBvcnRcbiAgICogaXMgb3RoZXIgdGhhbiBkZWZhdWx0ICh0eXBpY2FsbHkgVENQIHBvcnRzIDg2MCBhbmQgMzI2MCkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSXNjc2kjdGFyZ2V0UG9ydGFsXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQb3J0YWw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSXNjc2knIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSXNjc2kob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNJc2NzaSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2NoYXBBdXRoRGlzY292ZXJ5Jzogb2JqLmNoYXBBdXRoRGlzY292ZXJ5LFxuICAgICdjaGFwQXV0aFNlc3Npb24nOiBvYmouY2hhcEF1dGhTZXNzaW9uLFxuICAgICdmc1R5cGUnOiBvYmouZnNUeXBlLFxuICAgICdpbml0aWF0b3JOYW1lJzogb2JqLmluaXRpYXRvck5hbWUsXG4gICAgJ2lxbic6IG9iai5pcW4sXG4gICAgJ2lzY3NpSW50ZXJmYWNlJzogb2JqLmlzY3NpSW50ZXJmYWNlLFxuICAgICdsdW4nOiBvYmoubHVuLFxuICAgICdwb3J0YWxzJzogb2JqLnBvcnRhbHM/Lm1hcCh5ID0+IHkpLFxuICAgICdyZWFkT25seSc6IG9iai5yZWFkT25seSxcbiAgICAnc2VjcmV0UmVmJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0lzY3NpU2VjcmV0UmVmKG9iai5zZWNyZXRSZWYpLFxuICAgICd0YXJnZXRQb3J0YWwnOiBvYmoudGFyZ2V0UG9ydGFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogbmZzIHJlcHJlc2VudHMgYW4gTkZTIG1vdW50IG9uIHRoZSBob3N0IHRoYXQgc2hhcmVzIGEgcG9kJ3MgbGlmZXRpbWVcbiAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS92b2x1bWVzI25mc1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzTmZzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzTmZzIHtcbiAgLyoqXG4gICAqIHBhdGggdGhhdCBpcyBleHBvcnRlZCBieSB0aGUgTkZTIHNlcnZlci5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjbmZzXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzTmZzI3BhdGhcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogcmVhZE9ubHkgaGVyZSB3aWxsIGZvcmNlIHRoZSBORlMgZXhwb3J0IHRvIGJlIG1vdW50ZWQgd2l0aCByZWFkLW9ubHkgcGVybWlzc2lvbnMuXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcyNuZnNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UuXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzTmZzI3JlYWRPbmx5XG4gICAqL1xuICByZWFkb25seSByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHNlcnZlciBpcyB0aGUgaG9zdG5hbWUgb3IgSVAgYWRkcmVzcyBvZiB0aGUgTkZTIHNlcnZlci5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjbmZzXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzTmZzI3NlcnZlclxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc05mcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNOZnMob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNOZnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwYXRoJzogb2JqLnBhdGgsXG4gICAgJ3JlYWRPbmx5Jzogb2JqLnJlYWRPbmx5LFxuICAgICdzZXJ2ZXInOiBvYmouc2VydmVyLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcGVyc2lzdGVudFZvbHVtZUNsYWltVm9sdW1lU291cmNlIHJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYVxuICogUGVyc2lzdGVudFZvbHVtZUNsYWltIGluIHRoZSBzYW1lIG5hbWVzcGFjZS5cbiAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS9wZXJzaXN0ZW50LXZvbHVtZXMjcGVyc2lzdGVudHZvbHVtZWNsYWltc1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUGVyc2lzdGVudFZvbHVtZUNsYWltXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUGVyc2lzdGVudFZvbHVtZUNsYWltIHtcbiAgLyoqXG4gICAqIGNsYWltTmFtZSBpcyB0aGUgbmFtZSBvZiBhIFBlcnNpc3RlbnRWb2x1bWVDbGFpbSBpbiB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIHBvZCB1c2luZyB0aGlzIHZvbHVtZS5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3BlcnNpc3RlbnQtdm9sdW1lcyNwZXJzaXN0ZW50dm9sdW1lY2xhaW1zXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUGVyc2lzdGVudFZvbHVtZUNsYWltI2NsYWltTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xhaW1OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHJlYWRPbmx5IFdpbGwgZm9yY2UgdGhlIFJlYWRPbmx5IHNldHRpbmcgaW4gVm9sdW1lTW91bnRzLlxuICAgKiBEZWZhdWx0IGZhbHNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1BlcnNpc3RlbnRWb2x1bWVDbGFpbSNyZWFkT25seVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUGVyc2lzdGVudFZvbHVtZUNsYWltKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUGVyc2lzdGVudFZvbHVtZUNsYWltIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2xhaW1OYW1lJzogb2JqLmNsYWltTmFtZSxcbiAgICAncmVhZE9ubHknOiBvYmoucmVhZE9ubHksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwaG90b25QZXJzaXN0ZW50RGlzayByZXByZXNlbnRzIGEgUGhvdG9uQ29udHJvbGxlciBwZXJzaXN0ZW50IGRpc2sgYXR0YWNoZWQgYW5kIG1vdW50ZWQgb24ga3ViZWxldHMgaG9zdCBtYWNoaW5lLlxuICogRGVwcmVjYXRlZDogUGhvdG9uUGVyc2lzdGVudERpc2sgaXMgZGVwcmVjYXRlZCBhbmQgdGhlIGluLXRyZWUgcGhvdG9uUGVyc2lzdGVudERpc2sgdHlwZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUGhvdG9uUGVyc2lzdGVudERpc2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQaG90b25QZXJzaXN0ZW50RGlzayB7XG4gIC8qKlxuICAgKiBmc1R5cGUgaXMgdGhlIGZpbGVzeXN0ZW0gdHlwZSB0byBtb3VudC5cbiAgICogTXVzdCBiZSBhIGZpbGVzeXN0ZW0gdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbS5cbiAgICogRXguIFwiZXh0NFwiLCBcInhmc1wiLCBcIm50ZnNcIi4gSW1wbGljaXRseSBpbmZlcnJlZCB0byBiZSBcImV4dDRcIiBpZiB1bnNwZWNpZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQaG90b25QZXJzaXN0ZW50RGlzayNmc1R5cGVcbiAgICovXG4gIHJlYWRvbmx5IGZzVHlwZT86IHN0cmluZztcblxuICAvKipcbiAgICogcGRJRCBpcyB0aGUgSUQgdGhhdCBpZGVudGlmaWVzIFBob3RvbiBDb250cm9sbGVyIHBlcnNpc3RlbnQgZGlza1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Bob3RvblBlcnNpc3RlbnREaXNrI3BkSURcbiAgICovXG4gIHJlYWRvbmx5IHBkSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUGhvdG9uUGVyc2lzdGVudERpc2snIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUGhvdG9uUGVyc2lzdGVudERpc2sob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQaG90b25QZXJzaXN0ZW50RGlzayB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2ZzVHlwZSc6IG9iai5mc1R5cGUsXG4gICAgJ3BkSUQnOiBvYmoucGRJZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHBvcnR3b3J4Vm9sdW1lIHJlcHJlc2VudHMgYSBwb3J0d29yeCB2b2x1bWUgYXR0YWNoZWQgYW5kIG1vdW50ZWQgb24ga3ViZWxldHMgaG9zdCBtYWNoaW5lLlxuICogRGVwcmVjYXRlZDogUG9ydHdvcnhWb2x1bWUgaXMgZGVwcmVjYXRlZC4gQWxsIG9wZXJhdGlvbnMgZm9yIHRoZSBpbi10cmVlIHBvcnR3b3J4Vm9sdW1lIHR5cGVcbiAqIGFyZSByZWRpcmVjdGVkIHRvIHRoZSBweGQucG9ydHdvcnguY29tIENTSSBkcml2ZXIgd2hlbiB0aGUgQ1NJTWlncmF0aW9uUG9ydHdvcnggZmVhdHVyZS1nYXRlXG4gKiBpcyBvbi5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1BvcnR3b3J4Vm9sdW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUG9ydHdvcnhWb2x1bWUge1xuICAvKipcbiAgICogZlNUeXBlIHJlcHJlc2VudHMgdGhlIGZpbGVzeXN0ZW0gdHlwZSB0byBtb3VudFxuICAgKiBNdXN0IGJlIGEgZmlsZXN5c3RlbSB0eXBlIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtLlxuICAgKiBFeC4gXCJleHQ0XCIsIFwieGZzXCIuIEltcGxpY2l0bHkgaW5mZXJyZWQgdG8gYmUgXCJleHQ0XCIgaWYgdW5zcGVjaWZpZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUG9ydHdvcnhWb2x1bWUjZnNUeXBlXG4gICAqL1xuICByZWFkb25seSBmc1R5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHJlYWRPbmx5IGRlZmF1bHRzIHRvIGZhbHNlIChyZWFkL3dyaXRlKS4gUmVhZE9ubHkgaGVyZSB3aWxsIGZvcmNlXG4gICAqIHRoZSBSZWFkT25seSBzZXR0aW5nIGluIFZvbHVtZU1vdW50cy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQb3J0d29yeFZvbHVtZSNyZWFkT25seVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiB2b2x1bWVJRCB1bmlxdWVseSBpZGVudGlmaWVzIGEgUG9ydHdvcnggdm9sdW1lXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUG9ydHdvcnhWb2x1bWUjdm9sdW1lSURcbiAgICovXG4gIHJlYWRvbmx5IHZvbHVtZUlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1BvcnR3b3J4Vm9sdW1lJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1BvcnR3b3J4Vm9sdW1lKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUG9ydHdvcnhWb2x1bWUgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdmc1R5cGUnOiBvYmouZnNUeXBlLFxuICAgICdyZWFkT25seSc6IG9iai5yZWFkT25seSxcbiAgICAndm9sdW1lSUQnOiBvYmoudm9sdW1lSWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwcm9qZWN0ZWQgaXRlbXMgZm9yIGFsbCBpbiBvbmUgcmVzb3VyY2VzIHNlY3JldHMsIGNvbmZpZ21hcHMsIGFuZCBkb3dud2FyZCBBUElcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZCB7XG4gIC8qKlxuICAgKiBkZWZhdWx0TW9kZSBhcmUgdGhlIG1vZGUgYml0cyB1c2VkIHRvIHNldCBwZXJtaXNzaW9ucyBvbiBjcmVhdGVkIGZpbGVzIGJ5IGRlZmF1bHQuXG4gICAqIE11c3QgYmUgYW4gb2N0YWwgdmFsdWUgYmV0d2VlbiAwMDAwIGFuZCAwNzc3IG9yIGEgZGVjaW1hbCB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDUxMS5cbiAgICogWUFNTCBhY2NlcHRzIGJvdGggb2N0YWwgYW5kIGRlY2ltYWwgdmFsdWVzLCBKU09OIHJlcXVpcmVzIGRlY2ltYWwgdmFsdWVzIGZvciBtb2RlIGJpdHMuXG4gICAqIERpcmVjdG9yaWVzIHdpdGhpbiB0aGUgcGF0aCBhcmUgbm90IGFmZmVjdGVkIGJ5IHRoaXMgc2V0dGluZy5cbiAgICogVGhpcyBtaWdodCBiZSBpbiBjb25mbGljdCB3aXRoIG90aGVyIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGZpbGVcbiAgICogbW9kZSwgbGlrZSBmc0dyb3VwLCBhbmQgdGhlIHJlc3VsdCBjYW4gYmUgb3RoZXIgbW9kZSBiaXRzIHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWQjZGVmYXVsdE1vZGVcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRNb2RlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBzb3VyY2VzIGlzIHRoZSBsaXN0IG9mIHZvbHVtZSBwcm9qZWN0aW9ucy4gRWFjaCBlbnRyeSBpbiB0aGlzIGxpc3RcbiAgICogaGFuZGxlcyBvbmUgc291cmNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZCNzb3VyY2VzXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VzPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZGVmYXVsdE1vZGUnOiBvYmouZGVmYXVsdE1vZGUsXG4gICAgJ3NvdXJjZXMnOiBvYmouc291cmNlcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcXVvYnl0ZSByZXByZXNlbnRzIGEgUXVvYnl0ZSBtb3VudCBvbiB0aGUgaG9zdCB0aGF0IHNoYXJlcyBhIHBvZCdzIGxpZmV0aW1lLlxuICogRGVwcmVjYXRlZDogUXVvYnl0ZSBpcyBkZXByZWNhdGVkIGFuZCB0aGUgaW4tdHJlZSBxdW9ieXRlIHR5cGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1F1b2J5dGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNRdW9ieXRlIHtcbiAgLyoqXG4gICAqIGdyb3VwIHRvIG1hcCB2b2x1bWUgYWNjZXNzIHRvXG4gICAqIERlZmF1bHQgaXMgbm8gZ3JvdXBcbiAgICpcbiAgICogQGRlZmF1bHQgbm8gZ3JvdXBcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNRdW9ieXRlI2dyb3VwXG4gICAqL1xuICByZWFkb25seSBncm91cD86IHN0cmluZztcblxuICAvKipcbiAgICogcmVhZE9ubHkgaGVyZSB3aWxsIGZvcmNlIHRoZSBRdW9ieXRlIHZvbHVtZSB0byBiZSBtb3VudGVkIHdpdGggcmVhZC1vbmx5IHBlcm1pc3Npb25zLlxuICAgKiBEZWZhdWx0cyB0byBmYWxzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UuXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUXVvYnl0ZSNyZWFkT25seVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiByZWdpc3RyeSByZXByZXNlbnRzIGEgc2luZ2xlIG9yIG11bHRpcGxlIFF1b2J5dGUgUmVnaXN0cnkgc2VydmljZXNcbiAgICogc3BlY2lmaWVkIGFzIGEgc3RyaW5nIGFzIGhvc3Q6cG9ydCBwYWlyIChtdWx0aXBsZSBlbnRyaWVzIGFyZSBzZXBhcmF0ZWQgd2l0aCBjb21tYXMpXG4gICAqIHdoaWNoIGFjdHMgYXMgdGhlIGNlbnRyYWwgcmVnaXN0cnkgZm9yIHZvbHVtZXNcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNRdW9ieXRlI3JlZ2lzdHJ5XG4gICAqL1xuICByZWFkb25seSByZWdpc3RyeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB0ZW5hbnQgb3duaW5nIHRoZSBnaXZlbiBRdW9ieXRlIHZvbHVtZSBpbiB0aGUgQmFja2VuZFxuICAgKiBVc2VkIHdpdGggZHluYW1pY2FsbHkgcHJvdmlzaW9uZWQgUXVvYnl0ZSB2b2x1bWVzLCB2YWx1ZSBpcyBzZXQgYnkgdGhlIHBsdWdpblxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1F1b2J5dGUjdGVuYW50XG4gICAqL1xuICByZWFkb25seSB0ZW5hbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHVzZXIgdG8gbWFwIHZvbHVtZSBhY2Nlc3MgdG9cbiAgICogRGVmYXVsdHMgdG8gc2VyaXZjZWFjY291bnQgdXNlclxuICAgKlxuICAgKiBAZGVmYXVsdCBzZXJpdmNlYWNjb3VudCB1c2VyXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUXVvYnl0ZSN1c2VyXG4gICAqL1xuICByZWFkb25seSB1c2VyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2b2x1bWUgaXMgYSBzdHJpbmcgdGhhdCByZWZlcmVuY2VzIGFuIGFscmVhZHkgY3JlYXRlZCBRdW9ieXRlIHZvbHVtZSBieSBuYW1lLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1F1b2J5dGUjdm9sdW1lXG4gICAqL1xuICByZWFkb25seSB2b2x1bWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUXVvYnl0ZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNRdW9ieXRlKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUXVvYnl0ZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2dyb3VwJzogb2JqLmdyb3VwLFxuICAgICdyZWFkT25seSc6IG9iai5yZWFkT25seSxcbiAgICAncmVnaXN0cnknOiBvYmoucmVnaXN0cnksXG4gICAgJ3RlbmFudCc6IG9iai50ZW5hbnQsXG4gICAgJ3VzZXInOiBvYmoudXNlcixcbiAgICAndm9sdW1lJzogb2JqLnZvbHVtZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHJiZCByZXByZXNlbnRzIGEgUmFkb3MgQmxvY2sgRGV2aWNlIG1vdW50IG9uIHRoZSBob3N0IHRoYXQgc2hhcmVzIGEgcG9kJ3MgbGlmZXRpbWUuXG4gKiBEZXByZWNhdGVkOiBSQkQgaXMgZGVwcmVjYXRlZCBhbmQgdGhlIGluLXRyZWUgcmJkIHR5cGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1JiZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1JiZCB7XG4gIC8qKlxuICAgKiBmc1R5cGUgaXMgdGhlIGZpbGVzeXN0ZW0gdHlwZSBvZiB0aGUgdm9sdW1lIHRoYXQgeW91IHdhbnQgdG8gbW91bnQuXG4gICAqIFRpcDogRW5zdXJlIHRoYXQgdGhlIGZpbGVzeXN0ZW0gdHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbS5cbiAgICogRXhhbXBsZXM6IFwiZXh0NFwiLCBcInhmc1wiLCBcIm50ZnNcIi4gSW1wbGljaXRseSBpbmZlcnJlZCB0byBiZSBcImV4dDRcIiBpZiB1bnNwZWNpZmllZC5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjcmJkXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUmJkI2ZzVHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgZnNUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBpbWFnZSBpcyB0aGUgcmFkb3MgaW1hZ2UgbmFtZS5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2V4YW1wbGVzLms4cy5pby92b2x1bWVzL3JiZC9SRUFETUUubWQjaG93LXRvLXVzZS1pdFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1JiZCNpbWFnZVxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2U6IHN0cmluZztcblxuICAvKipcbiAgICoga2V5cmluZyBpcyB0aGUgcGF0aCB0byBrZXkgcmluZyBmb3IgUkJEVXNlci5cbiAgICogRGVmYXVsdCBpcyAvZXRjL2NlcGgva2V5cmluZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2V4YW1wbGVzLms4cy5pby92b2x1bWVzL3JiZC9SRUFETUUubWQjaG93LXRvLXVzZS1pdFxuICAgKlxuICAgKiBAZGVmYXVsdCBldGMvY2VwaC9rZXlyaW5nLlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1JiZCNrZXlyaW5nXG4gICAqL1xuICByZWFkb25seSBrZXlyaW5nPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBtb25pdG9ycyBpcyBhIGNvbGxlY3Rpb24gb2YgQ2VwaCBtb25pdG9ycy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2V4YW1wbGVzLms4cy5pby92b2x1bWVzL3JiZC9SRUFETUUubWQjaG93LXRvLXVzZS1pdFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1JiZCNtb25pdG9yc1xuICAgKi9cbiAgcmVhZG9ubHkgbW9uaXRvcnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBwb29sIGlzIHRoZSByYWRvcyBwb29sIG5hbWUuXG4gICAqIERlZmF1bHQgaXMgcmJkLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8vZXhhbXBsZXMuazhzLmlvL3ZvbHVtZXMvcmJkL1JFQURNRS5tZCNob3ctdG8tdXNlLWl0XG4gICAqXG4gICAqIEBkZWZhdWx0IHJiZC5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNSYmQjcG9vbFxuICAgKi9cbiAgcmVhZG9ubHkgcG9vbD86IHN0cmluZztcblxuICAvKipcbiAgICogcmVhZE9ubHkgaGVyZSB3aWxsIGZvcmNlIHRoZSBSZWFkT25seSBzZXR0aW5nIGluIFZvbHVtZU1vdW50cy5cbiAgICogRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9leGFtcGxlcy5rOHMuaW8vdm9sdW1lcy9yYmQvUkVBRE1FLm1kI2hvdy10by11c2UtaXRcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UuXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUmJkI3JlYWRPbmx5XG4gICAqL1xuICByZWFkb25seSByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHNlY3JldFJlZiBpcyBuYW1lIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBzZWNyZXQgZm9yIFJCRFVzZXIuIElmIHByb3ZpZGVkXG4gICAqIG92ZXJyaWRlcyBrZXlyaW5nLlxuICAgKiBEZWZhdWx0IGlzIG5pbC5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2V4YW1wbGVzLms4cy5pby92b2x1bWVzL3JiZC9SRUFETUUubWQjaG93LXRvLXVzZS1pdFxuICAgKlxuICAgKiBAZGVmYXVsdCBuaWwuXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUmJkI3NlY3JldFJlZlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0UmVmPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUmJkU2VjcmV0UmVmO1xuXG4gIC8qKlxuICAgKiB1c2VyIGlzIHRoZSByYWRvcyB1c2VyIG5hbWUuXG4gICAqIERlZmF1bHQgaXMgYWRtaW4uXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9leGFtcGxlcy5rOHMuaW8vdm9sdW1lcy9yYmQvUkVBRE1FLm1kI2hvdy10by11c2UtaXRcbiAgICpcbiAgICogQGRlZmF1bHQgYWRtaW4uXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUmJkI3VzZXJcbiAgICovXG4gIHJlYWRvbmx5IHVzZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1JiZCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNSYmQob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNSYmQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdmc1R5cGUnOiBvYmouZnNUeXBlLFxuICAgICdpbWFnZSc6IG9iai5pbWFnZSxcbiAgICAna2V5cmluZyc6IG9iai5rZXlyaW5nLFxuICAgICdtb25pdG9ycyc6IG9iai5tb25pdG9ycz8ubWFwKHkgPT4geSksXG4gICAgJ3Bvb2wnOiBvYmoucG9vbCxcbiAgICAncmVhZE9ubHknOiBvYmoucmVhZE9ubHksXG4gICAgJ3NlY3JldFJlZic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNSYmRTZWNyZXRSZWYob2JqLnNlY3JldFJlZiksXG4gICAgJ3VzZXInOiBvYmoudXNlcixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNjYWxlSU8gcmVwcmVzZW50cyBhIFNjYWxlSU8gcGVyc2lzdGVudCB2b2x1bWUgYXR0YWNoZWQgYW5kIG1vdW50ZWQgb24gS3ViZXJuZXRlcyBub2Rlcy5cbiAqIERlcHJlY2F0ZWQ6IFNjYWxlSU8gaXMgZGVwcmVjYXRlZCBhbmQgdGhlIGluLXRyZWUgc2NhbGVJTyB0eXBlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTY2FsZUlvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2NhbGVJbyB7XG4gIC8qKlxuICAgKiBmc1R5cGUgaXMgdGhlIGZpbGVzeXN0ZW0gdHlwZSB0byBtb3VudC5cbiAgICogTXVzdCBiZSBhIGZpbGVzeXN0ZW0gdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbS5cbiAgICogRXguIFwiZXh0NFwiLCBcInhmc1wiLCBcIm50ZnNcIi5cbiAgICogRGVmYXVsdCBpcyBcInhmc1wiLlxuICAgKlxuICAgKiBAZGVmYXVsdCB4ZnNcIi5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTY2FsZUlvI2ZzVHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgZnNUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBnYXRld2F5IGlzIHRoZSBob3N0IGFkZHJlc3Mgb2YgdGhlIFNjYWxlSU8gQVBJIEdhdGV3YXkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2NhbGVJbyNnYXRld2F5XG4gICAqL1xuICByZWFkb25seSBnYXRld2F5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHByb3RlY3Rpb25Eb21haW4gaXMgdGhlIG5hbWUgb2YgdGhlIFNjYWxlSU8gUHJvdGVjdGlvbiBEb21haW4gZm9yIHRoZSBjb25maWd1cmVkIHN0b3JhZ2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2NhbGVJbyNwcm90ZWN0aW9uRG9tYWluXG4gICAqL1xuICByZWFkb25seSBwcm90ZWN0aW9uRG9tYWluPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiByZWFkT25seSBEZWZhdWx0cyB0byBmYWxzZSAocmVhZC93cml0ZSkuIFJlYWRPbmx5IGhlcmUgd2lsbCBmb3JjZVxuICAgKiB0aGUgUmVhZE9ubHkgc2V0dGluZyBpbiBWb2x1bWVNb3VudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlIChyZWFkL3dyaXRlKS4gUmVhZE9ubHkgaGVyZSB3aWxsIGZvcmNlXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2NhbGVJbyNyZWFkT25seVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBzZWNyZXRSZWYgcmVmZXJlbmNlcyB0byB0aGUgc2VjcmV0IGZvciBTY2FsZUlPIHVzZXIgYW5kIG90aGVyXG4gICAqIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gSWYgdGhpcyBpcyBub3QgcHJvdmlkZWQsIExvZ2luIG9wZXJhdGlvbiB3aWxsIGZhaWwuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2NhbGVJbyNzZWNyZXRSZWZcbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldFJlZjogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2NhbGVJb1NlY3JldFJlZjtcblxuICAvKipcbiAgICogc3NsRW5hYmxlZCBGbGFnIGVuYWJsZS9kaXNhYmxlIFNTTCBjb21tdW5pY2F0aW9uIHdpdGggR2F0ZXdheSwgZGVmYXVsdCBmYWxzZVxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1NjYWxlSW8jc3NsRW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3NsRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHN0b3JhZ2VNb2RlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzdG9yYWdlIGZvciBhIHZvbHVtZSBzaG91bGQgYmUgVGhpY2tQcm92aXNpb25lZCBvciBUaGluUHJvdmlzaW9uZWQuXG4gICAqIERlZmF1bHQgaXMgVGhpblByb3Zpc2lvbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBUaGluUHJvdmlzaW9uZWQuXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2NhbGVJbyNzdG9yYWdlTW9kZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmFnZU1vZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHN0b3JhZ2VQb29sIGlzIHRoZSBTY2FsZUlPIFN0b3JhZ2UgUG9vbCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3RlY3Rpb24gZG9tYWluLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1NjYWxlSW8jc3RvcmFnZVBvb2xcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2VQb29sPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBzeXN0ZW0gaXMgdGhlIG5hbWUgb2YgdGhlIHN0b3JhZ2Ugc3lzdGVtIGFzIGNvbmZpZ3VyZWQgaW4gU2NhbGVJTy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTY2FsZUlvI3N5c3RlbVxuICAgKi9cbiAgcmVhZG9ubHkgc3lzdGVtOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZvbHVtZU5hbWUgaXMgdGhlIG5hbWUgb2YgYSB2b2x1bWUgYWxyZWFkeSBjcmVhdGVkIGluIHRoZSBTY2FsZUlPIHN5c3RlbVxuICAgKiB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZvbHVtZSBzb3VyY2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2NhbGVJbyN2b2x1bWVOYW1lXG4gICAqL1xuICByZWFkb25seSB2b2x1bWVOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTY2FsZUlvJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1NjYWxlSW8ob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTY2FsZUlvIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZnNUeXBlJzogb2JqLmZzVHlwZSxcbiAgICAnZ2F0ZXdheSc6IG9iai5nYXRld2F5LFxuICAgICdwcm90ZWN0aW9uRG9tYWluJzogb2JqLnByb3RlY3Rpb25Eb21haW4sXG4gICAgJ3JlYWRPbmx5Jzogb2JqLnJlYWRPbmx5LFxuICAgICdzZWNyZXRSZWYnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2NhbGVJb1NlY3JldFJlZihvYmouc2VjcmV0UmVmKSxcbiAgICAnc3NsRW5hYmxlZCc6IG9iai5zc2xFbmFibGVkLFxuICAgICdzdG9yYWdlTW9kZSc6IG9iai5zdG9yYWdlTW9kZSxcbiAgICAnc3RvcmFnZVBvb2wnOiBvYmouc3RvcmFnZVBvb2wsXG4gICAgJ3N5c3RlbSc6IG9iai5zeXN0ZW0sXG4gICAgJ3ZvbHVtZU5hbWUnOiBvYmoudm9sdW1lTmFtZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlY3JldCByZXByZXNlbnRzIGEgc2VjcmV0IHRoYXQgc2hvdWxkIHBvcHVsYXRlIHRoaXMgdm9sdW1lLlxuICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjc2VjcmV0XG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTZWNyZXQge1xuICAvKipcbiAgICogZGVmYXVsdE1vZGUgaXMgT3B0aW9uYWw6IG1vZGUgYml0cyB1c2VkIHRvIHNldCBwZXJtaXNzaW9ucyBvbiBjcmVhdGVkIGZpbGVzIGJ5IGRlZmF1bHQuXG4gICAqIE11c3QgYmUgYW4gb2N0YWwgdmFsdWUgYmV0d2VlbiAwMDAwIGFuZCAwNzc3IG9yIGEgZGVjaW1hbCB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDUxMS5cbiAgICogWUFNTCBhY2NlcHRzIGJvdGggb2N0YWwgYW5kIGRlY2ltYWwgdmFsdWVzLCBKU09OIHJlcXVpcmVzIGRlY2ltYWwgdmFsdWVzXG4gICAqIGZvciBtb2RlIGJpdHMuIERlZmF1bHRzIHRvIDA2NDQuXG4gICAqIERpcmVjdG9yaWVzIHdpdGhpbiB0aGUgcGF0aCBhcmUgbm90IGFmZmVjdGVkIGJ5IHRoaXMgc2V0dGluZy5cbiAgICogVGhpcyBtaWdodCBiZSBpbiBjb25mbGljdCB3aXRoIG90aGVyIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGZpbGVcbiAgICogbW9kZSwgbGlrZSBmc0dyb3VwLCBhbmQgdGhlIHJlc3VsdCBjYW4gYmUgb3RoZXIgbW9kZSBiaXRzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgMDY0NC5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTZWNyZXQjZGVmYXVsdE1vZGVcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRNb2RlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBpdGVtcyBJZiB1bnNwZWNpZmllZCwgZWFjaCBrZXktdmFsdWUgcGFpciBpbiB0aGUgRGF0YSBmaWVsZCBvZiB0aGUgcmVmZXJlbmNlZFxuICAgKiBTZWNyZXQgd2lsbCBiZSBwcm9qZWN0ZWQgaW50byB0aGUgdm9sdW1lIGFzIGEgZmlsZSB3aG9zZSBuYW1lIGlzIHRoZVxuICAgKiBrZXkgYW5kIGNvbnRlbnQgaXMgdGhlIHZhbHVlLiBJZiBzcGVjaWZpZWQsIHRoZSBsaXN0ZWQga2V5cyB3aWxsIGJlXG4gICAqIHByb2plY3RlZCBpbnRvIHRoZSBzcGVjaWZpZWQgcGF0aHMsIGFuZCB1bmxpc3RlZCBrZXlzIHdpbGwgbm90IGJlXG4gICAqIHByZXNlbnQuIElmIGEga2V5IGlzIHNwZWNpZmllZCB3aGljaCBpcyBub3QgcHJlc2VudCBpbiB0aGUgU2VjcmV0LFxuICAgKiB0aGUgdm9sdW1lIHNldHVwIHdpbGwgZXJyb3IgdW5sZXNzIGl0IGlzIG1hcmtlZCBvcHRpb25hbC4gUGF0aHMgbXVzdCBiZVxuICAgKiByZWxhdGl2ZSBhbmQgbWF5IG5vdCBjb250YWluIHRoZSAnLi4nIHBhdGggb3Igc3RhcnQgd2l0aCAnLi4nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1NlY3JldCNpdGVtc1xuICAgKi9cbiAgcmVhZG9ubHkgaXRlbXM/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTZWNyZXRJdGVtc1tdO1xuXG4gIC8qKlxuICAgKiBvcHRpb25hbCBmaWVsZCBzcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5cyBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTZWNyZXQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogc2VjcmV0TmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgc2VjcmV0IGluIHRoZSBwb2QncyBuYW1lc3BhY2UgdG8gdXNlLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcyNzZWNyZXRcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTZWNyZXQjc2VjcmV0TmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0TmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1NlY3JldChvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1NlY3JldCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2RlZmF1bHRNb2RlJzogb2JqLmRlZmF1bHRNb2RlLFxuICAgICdpdGVtcyc6IG9iai5pdGVtcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1NlY3JldEl0ZW1zKHkpKSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gICAgJ3NlY3JldE5hbWUnOiBvYmouc2VjcmV0TmFtZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHN0b3JhZ2VPUyByZXByZXNlbnRzIGEgU3RvcmFnZU9TIHZvbHVtZSBhdHRhY2hlZCBhbmQgbW91bnRlZCBvbiBLdWJlcm5ldGVzIG5vZGVzLlxuICogRGVwcmVjYXRlZDogU3RvcmFnZU9TIGlzIGRlcHJlY2F0ZWQgYW5kIHRoZSBpbi10cmVlIHN0b3JhZ2VvcyB0eXBlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTdG9yYWdlb3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTdG9yYWdlb3Mge1xuICAvKipcbiAgICogZnNUeXBlIGlzIHRoZSBmaWxlc3lzdGVtIHR5cGUgdG8gbW91bnQuXG4gICAqIE11c3QgYmUgYSBmaWxlc3lzdGVtIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0uXG4gICAqIEV4LiBcImV4dDRcIiwgXCJ4ZnNcIiwgXCJudGZzXCIuIEltcGxpY2l0bHkgaW5mZXJyZWQgdG8gYmUgXCJleHQ0XCIgaWYgdW5zcGVjaWZpZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU3RvcmFnZW9zI2ZzVHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgZnNUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiByZWFkT25seSBkZWZhdWx0cyB0byBmYWxzZSAocmVhZC93cml0ZSkuIFJlYWRPbmx5IGhlcmUgd2lsbCBmb3JjZVxuICAgKiB0aGUgUmVhZE9ubHkgc2V0dGluZyBpbiBWb2x1bWVNb3VudHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU3RvcmFnZW9zI3JlYWRPbmx5XG4gICAqL1xuICByZWFkb25seSByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHNlY3JldFJlZiBzcGVjaWZpZXMgdGhlIHNlY3JldCB0byB1c2UgZm9yIG9idGFpbmluZyB0aGUgU3RvcmFnZU9TIEFQSVxuICAgKiBjcmVkZW50aWFscy4gIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHQgdmFsdWVzIHdpbGwgYmUgYXR0ZW1wdGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1N0b3JhZ2VvcyNzZWNyZXRSZWZcbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldFJlZj86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1N0b3JhZ2Vvc1NlY3JldFJlZjtcblxuICAvKipcbiAgICogdm9sdW1lTmFtZSBpcyB0aGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgU3RvcmFnZU9TIHZvbHVtZS4gIFZvbHVtZVxuICAgKiBuYW1lcyBhcmUgb25seSB1bmlxdWUgd2l0aGluIGEgbmFtZXNwYWNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1N0b3JhZ2VvcyN2b2x1bWVOYW1lXG4gICAqL1xuICByZWFkb25seSB2b2x1bWVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2b2x1bWVOYW1lc3BhY2Ugc3BlY2lmaWVzIHRoZSBzY29wZSBvZiB0aGUgdm9sdW1lIHdpdGhpbiBTdG9yYWdlT1MuICBJZiBub1xuICAgKiBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIFBvZCdzIG5hbWVzcGFjZSB3aWxsIGJlIHVzZWQuICBUaGlzIGFsbG93cyB0aGVcbiAgICogS3ViZXJuZXRlcyBuYW1lIHNjb3BpbmcgdG8gYmUgbWlycm9yZWQgd2l0aGluIFN0b3JhZ2VPUyBmb3IgdGlnaHRlciBpbnRlZ3JhdGlvbi5cbiAgICogU2V0IFZvbHVtZU5hbWUgdG8gYW55IG5hbWUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLlxuICAgKiBTZXQgdG8gXCJkZWZhdWx0XCIgaWYgeW91IGFyZSBub3QgdXNpbmcgbmFtZXNwYWNlcyB3aXRoaW4gU3RvcmFnZU9TLlxuICAgKiBOYW1lc3BhY2VzIHRoYXQgZG8gbm90IHByZS1leGlzdCB3aXRoaW4gU3RvcmFnZU9TIHdpbGwgYmUgY3JlYXRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTdG9yYWdlb3Mjdm9sdW1lTmFtZXNwYWNlXG4gICAqL1xuICByZWFkb25seSB2b2x1bWVOYW1lc3BhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1N0b3JhZ2VvcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTdG9yYWdlb3Mob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTdG9yYWdlb3MgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdmc1R5cGUnOiBvYmouZnNUeXBlLFxuICAgICdyZWFkT25seSc6IG9iai5yZWFkT25seSxcbiAgICAnc2VjcmV0UmVmJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1N0b3JhZ2Vvc1NlY3JldFJlZihvYmouc2VjcmV0UmVmKSxcbiAgICAndm9sdW1lTmFtZSc6IG9iai52b2x1bWVOYW1lLFxuICAgICd2b2x1bWVOYW1lc3BhY2UnOiBvYmoudm9sdW1lTmFtZXNwYWNlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogdnNwaGVyZVZvbHVtZSByZXByZXNlbnRzIGEgdlNwaGVyZSB2b2x1bWUgYXR0YWNoZWQgYW5kIG1vdW50ZWQgb24ga3ViZWxldHMgaG9zdCBtYWNoaW5lLlxuICogRGVwcmVjYXRlZDogVnNwaGVyZVZvbHVtZSBpcyBkZXByZWNhdGVkLiBBbGwgb3BlcmF0aW9ucyBmb3IgdGhlIGluLXRyZWUgdnNwaGVyZVZvbHVtZSB0eXBlXG4gKiBhcmUgcmVkaXJlY3RlZCB0byB0aGUgY3NpLnZzcGhlcmUudm13YXJlLmNvbSBDU0kgZHJpdmVyLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzVnNwaGVyZVZvbHVtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1ZzcGhlcmVWb2x1bWUge1xuICAvKipcbiAgICogZnNUeXBlIGlzIGZpbGVzeXN0ZW0gdHlwZSB0byBtb3VudC5cbiAgICogTXVzdCBiZSBhIGZpbGVzeXN0ZW0gdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbS5cbiAgICogRXguIFwiZXh0NFwiLCBcInhmc1wiLCBcIm50ZnNcIi4gSW1wbGljaXRseSBpbmZlcnJlZCB0byBiZSBcImV4dDRcIiBpZiB1bnNwZWNpZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNWc3BoZXJlVm9sdW1lI2ZzVHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgZnNUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBzdG9yYWdlUG9saWN5SUQgaXMgdGhlIHN0b3JhZ2UgUG9saWN5IEJhc2VkIE1hbmFnZW1lbnQgKFNQQk0pIHByb2ZpbGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBTdG9yYWdlUG9saWN5TmFtZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNWc3BoZXJlVm9sdW1lI3N0b3JhZ2VQb2xpY3lJRFxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmFnZVBvbGljeUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBzdG9yYWdlUG9saWN5TmFtZSBpcyB0aGUgc3RvcmFnZSBQb2xpY3kgQmFzZWQgTWFuYWdlbWVudCAoU1BCTSkgcHJvZmlsZSBuYW1lLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1ZzcGhlcmVWb2x1bWUjc3RvcmFnZVBvbGljeU5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2VQb2xpY3lOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2b2x1bWVQYXRoIGlzIHRoZSBwYXRoIHRoYXQgaWRlbnRpZmllcyB2U3BoZXJlIHZvbHVtZSB2bWRrXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzVnNwaGVyZVZvbHVtZSN2b2x1bWVQYXRoXG4gICAqL1xuICByZWFkb25seSB2b2x1bWVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1ZzcGhlcmVWb2x1bWUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzVnNwaGVyZVZvbHVtZShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1ZzcGhlcmVWb2x1bWUgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdmc1R5cGUnOiBvYmouZnNUeXBlLFxuICAgICdzdG9yYWdlUG9saWN5SUQnOiBvYmouc3RvcmFnZVBvbGljeUlkLFxuICAgICdzdG9yYWdlUG9saWN5TmFtZSc6IG9iai5zdG9yYWdlUG9saWN5TmFtZSxcbiAgICAndm9sdW1lUGF0aCc6IG9iai52b2x1bWVQYXRoLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogZGF0YVNvdXJjZSBmaWVsZCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGVpdGhlcjpcbiAqICogQW4gZXhpc3RpbmcgVm9sdW1lU25hcHNob3Qgb2JqZWN0IChzbmFwc2hvdC5zdG9yYWdlLms4cy5pby9Wb2x1bWVTbmFwc2hvdClcbiAqICogQW4gZXhpc3RpbmcgUFZDIChQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0pXG4gKiBJZiB0aGUgcHJvdmlzaW9uZXIgb3IgYW4gZXh0ZXJuYWwgY29udHJvbGxlciBjYW4gc3VwcG9ydCB0aGUgc3BlY2lmaWVkIGRhdGEgc291cmNlLFxuICogaXQgd2lsbCBjcmVhdGUgYSBuZXcgdm9sdW1lIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGRhdGEgc291cmNlLlxuICogV2hlbiB0aGUgQW55Vm9sdW1lRGF0YVNvdXJjZSBmZWF0dXJlIGdhdGUgaXMgZW5hYmxlZCwgZGF0YVNvdXJjZSBjb250ZW50cyB3aWxsIGJlIGNvcGllZCB0byBkYXRhU291cmNlUmVmLFxuICogYW5kIGRhdGFTb3VyY2VSZWYgY29udGVudHMgd2lsbCBiZSBjb3BpZWQgdG8gZGF0YVNvdXJjZSB3aGVuIGRhdGFTb3VyY2VSZWYubmFtZXNwYWNlIGlzIG5vdCBzcGVjaWZpZWQuXG4gKiBJZiB0aGUgbmFtZXNwYWNlIGlzIHNwZWNpZmllZCwgdGhlbiBkYXRhU291cmNlUmVmIHdpbGwgbm90IGJlIGNvcGllZCB0byBkYXRhU291cmNlLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNEYXRhU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNEYXRhU291cmNlIHtcbiAgLyoqXG4gICAqIEFQSUdyb3VwIGlzIHRoZSBncm91cCBmb3IgdGhlIHJlc291cmNlIGJlaW5nIHJlZmVyZW5jZWQuXG4gICAqIElmIEFQSUdyb3VwIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzcGVjaWZpZWQgS2luZCBtdXN0IGJlIGluIHRoZSBjb3JlIEFQSSBncm91cC5cbiAgICogRm9yIGFueSBvdGhlciB0aGlyZC1wYXJ0eSB0eXBlcywgQVBJR3JvdXAgaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNEYXRhU291cmNlI2FwaUdyb3VwXG4gICAqL1xuICByZWFkb25seSBhcGlHcm91cD86IHN0cmluZztcblxuICAvKipcbiAgICogS2luZCBpcyB0aGUgdHlwZSBvZiByZXNvdXJjZSBiZWluZyByZWZlcmVuY2VkXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNEYXRhU291cmNlI2tpbmRcbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBpcyB0aGUgbmFtZSBvZiByZXNvdXJjZSBiZWluZyByZWZlcmVuY2VkXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNEYXRhU291cmNlI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNEYXRhU291cmNlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjRGF0YVNvdXJjZShvYmo6IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjRGF0YVNvdXJjZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FwaUdyb3VwJzogb2JqLmFwaUdyb3VwLFxuICAgICdraW5kJzogb2JqLmtpbmQsXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGRhdGFTb3VyY2VSZWYgc3BlY2lmaWVzIHRoZSBvYmplY3QgZnJvbSB3aGljaCB0byBwb3B1bGF0ZSB0aGUgdm9sdW1lIHdpdGggZGF0YSwgaWYgYSBub24tZW1wdHlcbiAqIHZvbHVtZSBpcyBkZXNpcmVkLiBUaGlzIG1heSBiZSBhbnkgb2JqZWN0IGZyb20gYSBub24tZW1wdHkgQVBJIGdyb3VwIChub25cbiAqIGNvcmUgb2JqZWN0KSBvciBhIFBlcnNpc3RlbnRWb2x1bWVDbGFpbSBvYmplY3QuXG4gKiBXaGVuIHRoaXMgZmllbGQgaXMgc3BlY2lmaWVkLCB2b2x1bWUgYmluZGluZyB3aWxsIG9ubHkgc3VjY2VlZCBpZiB0aGUgdHlwZSBvZlxuICogdGhlIHNwZWNpZmllZCBvYmplY3QgbWF0Y2hlcyBzb21lIGluc3RhbGxlZCB2b2x1bWUgcG9wdWxhdG9yIG9yIGR5bmFtaWNcbiAqIHByb3Zpc2lvbmVyLlxuICogVGhpcyBmaWVsZCB3aWxsIHJlcGxhY2UgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGRhdGFTb3VyY2UgZmllbGQgYW5kIGFzIHN1Y2hcbiAqIGlmIGJvdGggZmllbGRzIGFyZSBub24tZW1wdHksIHRoZXkgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlLiBGb3IgYmFja3dhcmRzXG4gKiBjb21wYXRpYmlsaXR5LCB3aGVuIG5hbWVzcGFjZSBpc24ndCBzcGVjaWZpZWQgaW4gZGF0YVNvdXJjZVJlZixcbiAqIGJvdGggZmllbGRzIChkYXRhU291cmNlIGFuZCBkYXRhU291cmNlUmVmKSB3aWxsIGJlIHNldCB0byB0aGUgc2FtZVxuICogdmFsdWUgYXV0b21hdGljYWxseSBpZiBvbmUgb2YgdGhlbSBpcyBlbXB0eSBhbmQgdGhlIG90aGVyIGlzIG5vbi1lbXB0eS5cbiAqIFdoZW4gbmFtZXNwYWNlIGlzIHNwZWNpZmllZCBpbiBkYXRhU291cmNlUmVmLFxuICogZGF0YVNvdXJjZSBpc24ndCBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYW5kIG11c3QgYmUgZW1wdHkuXG4gKiBUaGVyZSBhcmUgdGhyZWUgaW1wb3J0YW50IGRpZmZlcmVuY2VzIGJldHdlZW4gZGF0YVNvdXJjZSBhbmQgZGF0YVNvdXJjZVJlZjpcbiAqICogV2hpbGUgZGF0YVNvdXJjZSBvbmx5IGFsbG93cyB0d28gc3BlY2lmaWMgdHlwZXMgb2Ygb2JqZWN0cywgZGF0YVNvdXJjZVJlZlxuICogYWxsb3dzIGFueSBub24tY29yZSBvYmplY3QsIGFzIHdlbGwgYXMgUGVyc2lzdGVudFZvbHVtZUNsYWltIG9iamVjdHMuXG4gKiAqIFdoaWxlIGRhdGFTb3VyY2UgaWdub3JlcyBkaXNhbGxvd2VkIHZhbHVlcyAoZHJvcHBpbmcgdGhlbSksIGRhdGFTb3VyY2VSZWZcbiAqIHByZXNlcnZlcyBhbGwgdmFsdWVzLCBhbmQgZ2VuZXJhdGVzIGFuIGVycm9yIGlmIGEgZGlzYWxsb3dlZCB2YWx1ZSBpc1xuICogc3BlY2lmaWVkLlxuICogKiBXaGlsZSBkYXRhU291cmNlIG9ubHkgYWxsb3dzIGxvY2FsIG9iamVjdHMsIGRhdGFTb3VyY2VSZWYgYWxsb3dzIG9iamVjdHNcbiAqIGluIGFueSBuYW1lc3BhY2VzLlxuICogKEJldGEpIFVzaW5nIHRoaXMgZmllbGQgcmVxdWlyZXMgdGhlIEFueVZvbHVtZURhdGFTb3VyY2UgZmVhdHVyZSBnYXRlIHRvIGJlIGVuYWJsZWQuXG4gKiAoQWxwaGEpIFVzaW5nIHRoZSBuYW1lc3BhY2UgZmllbGQgb2YgZGF0YVNvdXJjZVJlZiByZXF1aXJlcyB0aGUgQ3Jvc3NOYW1lc3BhY2VWb2x1bWVEYXRhU291cmNlIGZlYXR1cmUgZ2F0ZSB0byBiZSBlbmFibGVkLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNEYXRhU291cmNlUmVmXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNEYXRhU291cmNlUmVmIHtcbiAgLyoqXG4gICAqIEFQSUdyb3VwIGlzIHRoZSBncm91cCBmb3IgdGhlIHJlc291cmNlIGJlaW5nIHJlZmVyZW5jZWQuXG4gICAqIElmIEFQSUdyb3VwIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzcGVjaWZpZWQgS2luZCBtdXN0IGJlIGluIHRoZSBjb3JlIEFQSSBncm91cC5cbiAgICogRm9yIGFueSBvdGhlciB0aGlyZC1wYXJ0eSB0eXBlcywgQVBJR3JvdXAgaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNEYXRhU291cmNlUmVmI2FwaUdyb3VwXG4gICAqL1xuICByZWFkb25seSBhcGlHcm91cD86IHN0cmluZztcblxuICAvKipcbiAgICogS2luZCBpcyB0aGUgdHlwZSBvZiByZXNvdXJjZSBiZWluZyByZWZlcmVuY2VkXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNEYXRhU291cmNlUmVmI2tpbmRcbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBpcyB0aGUgbmFtZSBvZiByZXNvdXJjZSBiZWluZyByZWZlcmVuY2VkXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNEYXRhU291cmNlUmVmI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZXNwYWNlIGlzIHRoZSBuYW1lc3BhY2Ugb2YgcmVzb3VyY2UgYmVpbmcgcmVmZXJlbmNlZFxuICAgKiBOb3RlIHRoYXQgd2hlbiBhIG5hbWVzcGFjZSBpcyBzcGVjaWZpZWQsIGEgZ2F0ZXdheS5uZXR3b3JraW5nLms4cy5pby9SZWZlcmVuY2VHcmFudCBvYmplY3QgaXMgcmVxdWlyZWQgaW4gdGhlIHJlZmVyZW50IG5hbWVzcGFjZSB0byBhbGxvdyB0aGF0IG5hbWVzcGFjZSdzIG93bmVyIHRvIGFjY2VwdCB0aGUgcmVmZXJlbmNlLiBTZWUgdGhlIFJlZmVyZW5jZUdyYW50IGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuXG4gICAqIChBbHBoYSkgVGhpcyBmaWVsZCByZXF1aXJlcyB0aGUgQ3Jvc3NOYW1lc3BhY2VWb2x1bWVEYXRhU291cmNlIGZlYXR1cmUgZ2F0ZSB0byBiZSBlbmFibGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjRGF0YVNvdXJjZVJlZiNuYW1lc3BhY2VcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNEYXRhU291cmNlUmVmJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjRGF0YVNvdXJjZVJlZihvYmo6IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjRGF0YVNvdXJjZVJlZiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FwaUdyb3VwJzogb2JqLmFwaUdyb3VwLFxuICAgICdraW5kJzogb2JqLmtpbmQsXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnbmFtZXNwYWNlJzogb2JqLm5hbWVzcGFjZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHJlc291cmNlcyByZXByZXNlbnRzIHRoZSBtaW5pbXVtIHJlc291cmNlcyB0aGUgdm9sdW1lIHNob3VsZCBoYXZlLlxuICogVXNlcnMgYXJlIGFsbG93ZWQgdG8gc3BlY2lmeSByZXNvdXJjZSByZXF1aXJlbWVudHNcbiAqIHRoYXQgYXJlIGxvd2VyIHRoYW4gcHJldmlvdXMgdmFsdWUgYnV0IG11c3Qgc3RpbGwgYmUgaGlnaGVyIHRoYW4gY2FwYWNpdHkgcmVjb3JkZWQgaW4gdGhlXG4gKiBzdGF0dXMgZmllbGQgb2YgdGhlIGNsYWltLlxuICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3BlcnNpc3RlbnQtdm9sdW1lcyNyZXNvdXJjZXNcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjUmVzb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNSZXNvdXJjZXMge1xuICAvKipcbiAgICogTGltaXRzIGRlc2NyaWJlcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgY29tcHV0ZSByZXNvdXJjZXMgYWxsb3dlZC5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9jb25maWd1cmF0aW9uL21hbmFnZS1yZXNvdXJjZXMtY29udGFpbmVycy9cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY1Jlc291cmNlcyNsaW1pdHNcbiAgICovXG4gIHJlYWRvbmx5IGxpbWl0cz86IHsgW2tleTogc3RyaW5nXTogVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNSZXNvdXJjZXNMaW1pdHMgfTtcblxuICAvKipcbiAgICogUmVxdWVzdHMgZGVzY3JpYmVzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb21wdXRlIHJlc291cmNlcyByZXF1aXJlZC5cbiAgICogSWYgUmVxdWVzdHMgaXMgb21pdHRlZCBmb3IgYSBjb250YWluZXIsIGl0IGRlZmF1bHRzIHRvIExpbWl0cyBpZiB0aGF0IGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLFxuICAgKiBvdGhlcndpc2UgdG8gYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB2YWx1ZS4gUmVxdWVzdHMgY2Fubm90IGV4Y2VlZCBMaW1pdHMuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvY29uZmlndXJhdGlvbi9tYW5hZ2UtcmVzb3VyY2VzLWNvbnRhaW5lcnMvXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNSZXNvdXJjZXMjcmVxdWVzdHNcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3RzPzogeyBba2V5OiBzdHJpbmddOiBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY1Jlc291cmNlc1JlcXVlc3RzIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjUmVzb3VyY2VzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjUmVzb3VyY2VzKG9iajogVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNSZXNvdXJjZXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsaW1pdHMnOiAoKG9iai5saW1pdHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5saW1pdHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdPy52YWx1ZSB9KSwge30pKSxcbiAgICAncmVxdWVzdHMnOiAoKG9iai5yZXF1ZXN0cykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLnJlcXVlc3RzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXT8udmFsdWUgfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWxlY3RvciBpcyBhIGxhYmVsIHF1ZXJ5IG92ZXIgdm9sdW1lcyB0byBjb25zaWRlciBmb3IgYmluZGluZy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY1NlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogbWF0Y2hMYWJlbHMgaXMgYSBtYXAgb2Yge2tleSx2YWx1ZX0gcGFpcnMuIEEgc2luZ2xlIHtrZXksdmFsdWV9IGluIHRoZSBtYXRjaExhYmVsc1xuICAgKiBtYXAgaXMgZXF1aXZhbGVudCB0byBhbiBlbGVtZW50IG9mIG1hdGNoRXhwcmVzc2lvbnMsIHdob3NlIGtleSBmaWVsZCBpcyBcImtleVwiLCB0aGVcbiAgICogb3BlcmF0b3IgaXMgXCJJblwiLCBhbmQgdGhlIHZhbHVlcyBhcnJheSBjb250YWlucyBvbmx5IFwidmFsdWVcIi4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY1NlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjU2VsZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY1NlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzQWxsb2NhdGVkUmVzb3VyY2VzXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzQWxsb2NhdGVkUmVzb3VyY2VzIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzQWxsb2NhdGVkUmVzb3VyY2VzIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXNBbGxvY2F0ZWRSZXNvdXJjZXModmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1c0FsbG9jYXRlZFJlc291cmNlcyB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzQWxsb2NhdGVkUmVzb3VyY2VzKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXNDYXBhY2l0eVxuICovXG5leHBvcnQgY2xhc3MgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1c0NhcGFjaXR5IHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzQ2FwYWNpdHkge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1c0NhcGFjaXR5KHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGZyb21TdHJpbmcodmFsdWU6IHN0cmluZyk6IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXNDYXBhY2l0eSB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzQ2FwYWNpdHkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgfVxufVxuXG4vKipcbiAqIFBlcnNpc3RlbnRWb2x1bWVDbGFpbUNvbmRpdGlvbiBjb250YWlucyBkZXRhaWxzIGFib3V0IHN0YXRlIG9mIHB2Y1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1c0NvbmRpdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzQ29uZGl0aW9ucyB7XG4gIC8qKlxuICAgKiBsYXN0UHJvYmVUaW1lIGlzIHRoZSB0aW1lIHdlIHByb2JlZCB0aGUgY29uZGl0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXNDb25kaXRpb25zI2xhc3RQcm9iZVRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGxhc3RQcm9iZVRpbWU/OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBsYXN0VHJhbnNpdGlvblRpbWUgaXMgdGhlIHRpbWUgdGhlIGNvbmRpdGlvbiB0cmFuc2l0aW9uZWQgZnJvbSBvbmUgc3RhdHVzIHRvIGFub3RoZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1c0NvbmRpdGlvbnMjbGFzdFRyYW5zaXRpb25UaW1lXG4gICAqL1xuICByZWFkb25seSBsYXN0VHJhbnNpdGlvblRpbWU/OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBtZXNzYWdlIGlzIHRoZSBodW1hbi1yZWFkYWJsZSBtZXNzYWdlIGluZGljYXRpbmcgZGV0YWlscyBhYm91dCBsYXN0IHRyYW5zaXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1c0NvbmRpdGlvbnMjbWVzc2FnZVxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogcmVhc29uIGlzIGEgdW5pcXVlLCB0aGlzIHNob3VsZCBiZSBhIHNob3J0LCBtYWNoaW5lIHVuZGVyc3RhbmRhYmxlIHN0cmluZyB0aGF0IGdpdmVzIHRoZSByZWFzb25cbiAgICogZm9yIGNvbmRpdGlvbidzIGxhc3QgdHJhbnNpdGlvbi4gSWYgaXQgcmVwb3J0cyBcIlJlc2l6aW5nXCIgdGhhdCBtZWFucyB0aGUgdW5kZXJseWluZ1xuICAgKiBwZXJzaXN0ZW50IHZvbHVtZSBpcyBiZWluZyByZXNpemVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXNDb25kaXRpb25zI3JlYXNvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTdGF0dXMgaXMgdGhlIHN0YXR1cyBvZiB0aGUgY29uZGl0aW9uLlxuICAgKiBDYW4gYmUgVHJ1ZSwgRmFsc2UsIFVua25vd24uXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvcmVmZXJlbmNlL2t1YmVybmV0ZXMtYXBpL2NvbmZpZy1hbmQtc3RvcmFnZS1yZXNvdXJjZXMvcGVyc2lzdGVudC12b2x1bWUtY2xhaW0tdjEvIzp+OnRleHQ9c3RhdGUlMjBvZiUyMHB2Yy0sY29uZGl0aW9ucy5zdGF0dXMsLShzdHJpbmcpJTJDJTIwcmVxdWlyZWRcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzQ29uZGl0aW9ucyNzdGF0dXNcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1czogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUeXBlIGlzIHRoZSB0eXBlIG9mIHRoZSBjb25kaXRpb24uXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvcmVmZXJlbmNlL2t1YmVybmV0ZXMtYXBpL2NvbmZpZy1hbmQtc3RvcmFnZS1yZXNvdXJjZXMvcGVyc2lzdGVudC12b2x1bWUtY2xhaW0tdjEvIzp+OnRleHQ9c2V0JTIwdG8lMjAlMjdSZXNpemVTdGFydGVkJTI3Li0sUGVyc2lzdGVudFZvbHVtZUNsYWltQ29uZGl0aW9uLC1jb250YWlucyUyMGRldGFpbHMlMjBhYm91dFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXNDb25kaXRpb25zI3R5cGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1c0NvbmRpdGlvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1c0NvbmRpdGlvbnMob2JqOiBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzQ29uZGl0aW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2xhc3RQcm9iZVRpbWUnOiBvYmoubGFzdFByb2JlVGltZT8udG9JU09TdHJpbmcoKSxcbiAgICAnbGFzdFRyYW5zaXRpb25UaW1lJzogb2JqLmxhc3RUcmFuc2l0aW9uVGltZT8udG9JU09TdHJpbmcoKSxcbiAgICAnbWVzc2FnZSc6IG9iai5tZXNzYWdlLFxuICAgICdyZWFzb24nOiBvYmoucmVhc29uLFxuICAgICdzdGF0dXMnOiBvYmouc3RhdHVzLFxuICAgICd0eXBlJzogb2JqLnR5cGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBNb2RpZnlWb2x1bWVTdGF0dXMgcmVwcmVzZW50cyB0aGUgc3RhdHVzIG9iamVjdCBvZiBDb250cm9sbGVyTW9kaWZ5Vm9sdW1lIG9wZXJhdGlvbi5cbiAqIFdoZW4gdGhpcyBpcyB1bnNldCwgdGhlcmUgaXMgbm8gTW9kaWZ5Vm9sdW1lIG9wZXJhdGlvbiBiZWluZyBhdHRlbXB0ZWQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzTW9kaWZ5Vm9sdW1lU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1c01vZGlmeVZvbHVtZVN0YXR1cyB7XG4gIC8qKlxuICAgKiBzdGF0dXMgaXMgdGhlIHN0YXR1cyBvZiB0aGUgQ29udHJvbGxlck1vZGlmeVZvbHVtZSBvcGVyYXRpb24uIEl0IGNhbiBiZSBpbiBhbnkgb2YgZm9sbG93aW5nIHN0YXRlczpcbiAgICogLSBQZW5kaW5nXG4gICAqIFBlbmRpbmcgaW5kaWNhdGVzIHRoYXQgdGhlIFBlcnNpc3RlbnRWb2x1bWVDbGFpbSBjYW5ub3QgYmUgbW9kaWZpZWQgZHVlIHRvIHVubWV0IHJlcXVpcmVtZW50cywgc3VjaCBhc1xuICAgKiB0aGUgc3BlY2lmaWVkIFZvbHVtZUF0dHJpYnV0ZXNDbGFzcyBub3QgZXhpc3RpbmcuXG4gICAqIC0gSW5Qcm9ncmVzc1xuICAgKiBJblByb2dyZXNzIGluZGljYXRlcyB0aGF0IHRoZSB2b2x1bWUgaXMgYmVpbmcgbW9kaWZpZWQuXG4gICAqIC0gSW5mZWFzaWJsZVxuICAgKiBJbmZlYXNpYmxlIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0IGhhcyBiZWVuIHJlamVjdGVkIGFzIGludmFsaWQgYnkgdGhlIENTSSBkcml2ZXIuIFRvXG4gICAqIHJlc29sdmUgdGhlIGVycm9yLCBhIHZhbGlkIFZvbHVtZUF0dHJpYnV0ZXNDbGFzcyBuZWVkcyB0byBiZSBzcGVjaWZpZWQuXG4gICAqIE5vdGU6IE5ldyBzdGF0dXNlcyBjYW4gYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4gQ29uc3VtZXJzIHNob3VsZCBjaGVjayBmb3IgdW5rbm93biBzdGF0dXNlcyBhbmQgZmFpbCBhcHByb3ByaWF0ZWx5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXNNb2RpZnlWb2x1bWVTdGF0dXMjc3RhdHVzXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM6IHN0cmluZztcblxuICAvKipcbiAgICogdGFyZ2V0Vm9sdW1lQXR0cmlidXRlc0NsYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgVm9sdW1lQXR0cmlidXRlc0NsYXNzIHRoZSBQVkMgY3VycmVudGx5IGJlaW5nIHJlY29uY2lsZWRcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3RhdHVzTW9kaWZ5Vm9sdW1lU3RhdHVzI3RhcmdldFZvbHVtZUF0dHJpYnV0ZXNDbGFzc05hbWVcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFZvbHVtZUF0dHJpYnV0ZXNDbGFzc05hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXNNb2RpZnlWb2x1bWVTdGF0dXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1N0YXR1c01vZGlmeVZvbHVtZVN0YXR1cyhvYmo6IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTdGF0dXNNb2RpZnlWb2x1bWVTdGF0dXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdzdGF0dXMnOiBvYmouc3RhdHVzLFxuICAgICd0YXJnZXRWb2x1bWVBdHRyaWJ1dGVzQ2xhc3NOYW1lJzogb2JqLnRhcmdldFZvbHVtZUF0dHJpYnV0ZXNDbGFzc05hbWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBieSBkZXRlcm1pbmVzIHdoYXQgdmFsdWUgaXMgaGFzaGVkIGZvciBzaGFyZCBzZWxlY3Rpb24uIFwiSEFTSFwiIHVzZXMgdGhlIFZhcm5pc2hcbiAqIGhhc2ggKGRlZmF1bHQpOyBcIlVSTFwiIHVzZXMgdGhlIHJlcXVlc3QgVVJMLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmRCeVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZEJ5IHtcbiAgLyoqIEhBU0ggKi9cbiAgSEFTSCA9IFwiSEFTSFwiLFxuICAvKiogVVJMICovXG4gIFVSTCA9IFwiVVJMXCIsXG59XG5cbi8qKlxuICogaGVhbHRoeSBjb250cm9scyB3aGljaCBiYWNrZW5kcyB0aGUgZGlyZWN0b3IgY29uc2lkZXJzIHdoZW4gc2VsZWN0aW5nIGEgc2hhcmQuXG4gKiBcIkNIT1NFTlwiIChkZWZhdWx0KSBvbmx5IGNvbnNpZGVycyB0aGUgY2hvc2VuIGJhY2tlbmQgaGVhbHRoeTsgXCJBTExcIiByZXF1aXJlcyBhbGxcbiAqIGJhY2tlbmRzIHRvIGJlIGhlYWx0aHkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZEhlYWx0aHlcbiAqL1xuZXhwb3J0IGVudW0gVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmRIZWFsdGh5IHtcbiAgLyoqIENIT1NFTiAqL1xuICBDSE9TRU4gPSBcIkNIT1NFTlwiLFxuICAvKiogQUxMICovXG4gIEFMTCA9IFwiQUxMXCIsXG59XG5cbi8qKlxuICogUmVzb3VyY2VDbGFpbSByZWZlcmVuY2VzIG9uZSBlbnRyeSBpbiBQb2RTcGVjLlJlc291cmNlQ2xhaW1zLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXJSZXNvdXJjZXNDbGFpbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlclJlc291cmNlc0NsYWltcyB7XG4gIC8qKlxuICAgKiBOYW1lIG11c3QgbWF0Y2ggdGhlIG5hbWUgb2Ygb25lIGVudHJ5IGluIHBvZC5zcGVjLnJlc291cmNlQ2xhaW1zIG9mXG4gICAqIHRoZSBQb2Qgd2hlcmUgdGhpcyBmaWVsZCBpcyB1c2VkLiBJdCBtYWtlcyB0aGF0IHJlc291cmNlIGF2YWlsYWJsZVxuICAgKiBpbnNpZGUgYSBjb250YWluZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXJSZXNvdXJjZXNDbGFpbXMjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGlzIHRoZSBuYW1lIGNob3NlbiBmb3IgYSByZXF1ZXN0IGluIHRoZSByZWZlcmVuY2VkIGNsYWltLlxuICAgKiBJZiBlbXB0eSwgZXZlcnl0aGluZyBmcm9tIHRoZSBjbGFpbSBpcyBtYWRlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlXG4gICAqIG9ubHkgdGhlIHJlc3VsdCBvZiB0aGlzIHJlcXVlc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXJSZXNvdXJjZXNDbGFpbXMjcmVxdWVzdFxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXJSZXNvdXJjZXNDbGFpbXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXJSZXNvdXJjZXNDbGFpbXMob2JqOiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlclJlc291cmNlc0NsYWltcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAncmVxdWVzdCc6IG9iai5yZXF1ZXN0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlclJlc291cmNlc0xpbWl0c1xuICovXG5leHBvcnQgY2xhc3MgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXJSZXNvdXJjZXNMaW1pdHMge1xuICBwdWJsaWMgc3RhdGljIGZyb21OdW1iZXIodmFsdWU6IG51bWJlcik6IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVyUmVzb3VyY2VzTGltaXRzIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVyUmVzb3VyY2VzTGltaXRzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGZyb21TdHJpbmcodmFsdWU6IHN0cmluZyk6IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVyUmVzb3VyY2VzTGltaXRzIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVyUmVzb3VyY2VzTGltaXRzKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVyUmVzb3VyY2VzUmVxdWVzdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVyUmVzb3VyY2VzUmVxdWVzdHMge1xuICBwdWJsaWMgc3RhdGljIGZyb21OdW1iZXIodmFsdWU6IG51bWJlcik6IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVyUmVzb3VyY2VzUmVxdWVzdHMge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nRXhwb3J0ZXJSZXNvdXJjZXNSZXF1ZXN0cyh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdFeHBvcnRlclJlc291cmNlc1JlcXVlc3RzIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ0V4cG9ydGVyUmVzb3VyY2VzUmVxdWVzdHModmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGVtcHR5IHByZWZlcnJlZCBzY2hlZHVsaW5nIHRlcm0gbWF0Y2hlcyBhbGwgb2JqZWN0cyB3aXRoIGltcGxpY2l0IHdlaWdodCAwXG4gKiAoaS5lLiBpdCdzIGEgbm8tb3ApLiBBIG51bGwgcHJlZmVycmVkIHNjaGVkdWxpbmcgdGVybSBtYXRjaGVzIG5vIG9iamVjdHMgKGkuZS4gaXMgYWxzbyBhIG5vLW9wKS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBBIG5vZGUgc2VsZWN0b3IgdGVybSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHdlaWdodC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jcHJlZmVyZW5jZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZmVyZW5jZTogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZTtcblxuICAvKipcbiAgICogV2VpZ2h0IGFzc29jaWF0ZWQgd2l0aCBtYXRjaGluZyB0aGUgY29ycmVzcG9uZGluZyBub2RlU2VsZWN0b3JUZXJtLCBpbiB0aGUgcmFuZ2UgMS0xMDAuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3dlaWdodFxuICAgKi9cbiAgcmVhZG9ubHkgd2VpZ2h0OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwcmVmZXJlbmNlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2Uob2JqLnByZWZlcmVuY2UpLFxuICAgICd3ZWlnaHQnOiBvYmoud2VpZ2h0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogSWYgdGhlIGFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBhcmUgbm90IG1ldCBhdFxuICogc2NoZWR1bGluZyB0aW1lLCB0aGUgcG9kIHdpbGwgbm90IGJlIHNjaGVkdWxlZCBvbnRvIHRoZSBub2RlLlxuICogSWYgdGhlIGFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBjZWFzZSB0byBiZSBtZXRcbiAqIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHBvZCBleGVjdXRpb24gKGUuZy4gZHVlIHRvIGFuIHVwZGF0ZSksIHRoZSBzeXN0ZW1cbiAqIG1heSBvciBtYXkgbm90IHRyeSB0byBldmVudHVhbGx5IGV2aWN0IHRoZSBwb2QgZnJvbSBpdHMgbm9kZS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogUmVxdWlyZWQuIEEgbGlzdCBvZiBub2RlIHNlbGVjdG9yIHRlcm1zLiBUaGUgdGVybXMgYXJlIE9SZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbm9kZVNlbGVjdG9yVGVybXNcbiAgICovXG4gIHJlYWRvbmx5IG5vZGVTZWxlY3RvclRlcm1zOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdub2RlU2VsZWN0b3JUZXJtcyc6IG9iai5ub2RlU2VsZWN0b3JUZXJtcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogVGhlIHdlaWdodHMgb2YgYWxsIG9mIHRoZSBtYXRjaGVkIFdlaWdodGVkUG9kQWZmaW5pdHlUZXJtIGZpZWxkcyBhcmUgYWRkZWQgcGVyLW5vZGUgdG8gZmluZCB0aGUgbW9zdCBwcmVmZXJyZWQgbm9kZShzKVxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBSZXF1aXJlZC4gQSBwb2QgYWZmaW5pdHkgdGVybSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHdlaWdodC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNwb2RBZmZpbml0eVRlcm1cbiAgICovXG4gIHJlYWRvbmx5IHBvZEFmZmluaXR5VGVybTogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm07XG5cbiAgLyoqXG4gICAqIHdlaWdodCBhc3NvY2lhdGVkIHdpdGggbWF0Y2hpbmcgdGhlIGNvcnJlc3BvbmRpbmcgcG9kQWZmaW5pdHlUZXJtLFxuICAgKiBpbiB0aGUgcmFuZ2UgMS0xMDAuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jd2VpZ2h0XG4gICAqL1xuICByZWFkb25seSB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3BvZEFmZmluaXR5VGVybSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybShvYmoucG9kQWZmaW5pdHlUZXJtKSxcbiAgICAnd2VpZ2h0Jzogb2JqLndlaWdodCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIERlZmluZXMgYSBzZXQgb2YgcG9kcyAobmFtZWx5IHRob3NlIG1hdGNoaW5nIHRoZSBsYWJlbFNlbGVjdG9yXG4gKiByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gbmFtZXNwYWNlKHMpKSB0aGF0IHRoaXMgcG9kIHNob3VsZCBiZVxuICogY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoLFxuICogd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlIHdob3NlIHZhbHVlIG9mXG4gKiB0aGUgbGFiZWwgd2l0aCBrZXkgPHRvcG9sb2d5S2V5PiBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2hcbiAqIGEgcG9kIG9mIHRoZSBzZXQgb2YgcG9kcyBpcyBydW5uaW5nXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI2xhYmVsU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsU2VsZWN0b3I/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvcjtcblxuICAvKipcbiAgICogTWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgaW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNtaXNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWlzbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gICAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIHNlbGVjdGVkIGJ5IHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIGxpc3RlZCBpbiB0aGUgbmFtZXNwYWNlcyBmaWVsZC5cbiAgICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICAgKiBBbiBlbXB0eSBzZWxlY3RvciAoe30pIG1hdGNoZXMgYWxsIG5hbWVzcGFjZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNuYW1lc3BhY2VTZWxlY3RvclxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlU2VsZWN0b3I/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNuYW1lc3BhY2VzXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoaXMgcG9kIHNob3VsZCBiZSBjby1sb2NhdGVkIChhZmZpbml0eSkgb3Igbm90IGNvLWxvY2F0ZWQgKGFudGktYWZmaW5pdHkpIHdpdGggdGhlIHBvZHMgbWF0Y2hpbmdcbiAgICogdGhlIGxhYmVsU2VsZWN0b3IgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2VzLCB3aGVyZSBjby1sb2NhdGVkIGlzIGRlZmluZWQgYXMgcnVubmluZyBvbiBhIG5vZGVcbiAgICogd2hvc2UgdmFsdWUgb2YgdGhlIGxhYmVsIHdpdGgga2V5IHRvcG9sb2d5S2V5IG1hdGNoZXMgdGhhdCBvZiBhbnkgbm9kZSBvbiB3aGljaCBhbnkgb2YgdGhlXG4gICAqIHNlbGVjdGVkIHBvZHMgaXMgcnVubmluZy5cbiAgICogRW1wdHkgdG9wb2xvZ3lLZXkgaXMgbm90IGFsbG93ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiN0b3BvbG9neUtleVxuICAgKi9cbiAgcmVhZG9ubHkgdG9wb2xvZ3lLZXk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2xhYmVsU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yKG9iai5uYW1lc3BhY2VTZWxlY3RvciksXG4gICAgJ25hbWVzcGFjZXMnOiBvYmoubmFtZXNwYWNlcz8ubWFwKHkgPT4geSksXG4gICAgJ3RvcG9sb2d5S2V5Jzogb2JqLnRvcG9sb2d5S2V5LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogVGhlIHdlaWdodHMgb2YgYWxsIG9mIHRoZSBtYXRjaGVkIFdlaWdodGVkUG9kQWZmaW5pdHlUZXJtIGZpZWxkcyBhcmUgYWRkZWQgcGVyLW5vZGUgdG8gZmluZCB0aGUgbW9zdCBwcmVmZXJyZWQgbm9kZShzKVxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHtcbiAgLyoqXG4gICAqIFJlcXVpcmVkLiBBIHBvZCBhZmZpbml0eSB0ZXJtLCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgd2VpZ2h0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNwb2RBZmZpbml0eVRlcm1cbiAgICovXG4gIHJlYWRvbmx5IHBvZEFmZmluaXR5VGVybTogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtO1xuXG4gIC8qKlxuICAgKiB3ZWlnaHQgYXNzb2NpYXRlZCB3aXRoIG1hdGNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybSxcbiAgICogaW4gdGhlIHJhbmdlIDEtMTAwLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiN3ZWlnaHRcbiAgICovXG4gIHJlYWRvbmx5IHdlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncG9kQWZmaW5pdHlUZXJtJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybShvYmoucG9kQWZmaW5pdHlUZXJtKSxcbiAgICAnd2VpZ2h0Jzogb2JqLndlaWdodCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIERlZmluZXMgYSBzZXQgb2YgcG9kcyAobmFtZWx5IHRob3NlIG1hdGNoaW5nIHRoZSBsYWJlbFNlbGVjdG9yXG4gKiByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gbmFtZXNwYWNlKHMpKSB0aGF0IHRoaXMgcG9kIHNob3VsZCBiZVxuICogY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoLFxuICogd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlIHdob3NlIHZhbHVlIG9mXG4gKiB0aGUgbGFiZWwgd2l0aCBrZXkgPHRvcG9sb2d5S2V5PiBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2hcbiAqIGEgcG9kIG9mIHRoZSBzZXQgb2YgcG9kcyBpcyBydW5uaW5nXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHtcbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICAgKiBJZiBpdCdzIG51bGwsIHRoaXMgUG9kQWZmaW5pdHlUZXJtIG1hdGNoZXMgd2l0aCBubyBQb2RzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI2xhYmVsU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsU2VsZWN0b3I/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIE1hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI21hdGNoTGFiZWxLZXlzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVsS2V5cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNaXNtYXRjaExhYmVsS2V5cyBpcyBhIHNldCBvZiBwb2QgbGFiZWwga2V5cyB0byBzZWxlY3Qgd2hpY2ggcG9kcyB3aWxsXG4gICAqIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIGtleXMgYXJlIHVzZWQgdG8gbG9va3VwIHZhbHVlcyBmcm9tIHRoZVxuICAgKiBpbmNvbWluZyBwb2QgbGFiZWxzLCB0aG9zZSBrZXktdmFsdWUgbGFiZWxzIGFyZSBtZXJnZWQgd2l0aCBgbGFiZWxTZWxlY3RvcmAgYXMgYGtleSBub3RpbiAodmFsdWUpYFxuICAgKiB0byBzZWxlY3QgdGhlIGdyb3VwIG9mIGV4aXN0aW5nIHBvZHMgd2hpY2ggcG9kcyB3aWxsIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgKiBmb3IgdGhlIGluY29taW5nIHBvZCdzIHBvZCAoYW50aSkgYWZmaW5pdHkuIEtleXMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgaW5jb21pbmdcbiAgICogcG9kIGxhYmVscyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBUaGUgc2FtZSBrZXkgaXMgZm9yYmlkZGVuIHRvIGV4aXN0IGluIGJvdGggbWlzbWF0Y2hMYWJlbEtleXMgYW5kIGxhYmVsU2VsZWN0b3IuXG4gICAqIEFsc28sIG1pc21hdGNoTGFiZWxLZXlzIGNhbm5vdCBiZSBzZXQgd2hlbiBsYWJlbFNlbGVjdG9yIGlzbid0IHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNtaXNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWlzbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gICAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIHNlbGVjdGVkIGJ5IHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIGxpc3RlZCBpbiB0aGUgbmFtZXNwYWNlcyBmaWVsZC5cbiAgICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICAgKiBBbiBlbXB0eSBzZWxlY3RvciAoe30pIG1hdGNoZXMgYWxsIG5hbWVzcGFjZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvcjtcblxuICAvKipcbiAgICogbmFtZXNwYWNlcyBzcGVjaWZpZXMgYSBzdGF0aWMgbGlzdCBvZiBuYW1lc3BhY2UgbmFtZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gdGhpcyBmaWVsZFxuICAgKiBhbmQgdGhlIG9uZXMgc2VsZWN0ZWQgYnkgbmFtZXNwYWNlU2VsZWN0b3IuXG4gICAqIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IGFuZCBudWxsIG5hbWVzcGFjZVNlbGVjdG9yIG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNuYW1lc3BhY2VzXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoaXMgcG9kIHNob3VsZCBiZSBjby1sb2NhdGVkIChhZmZpbml0eSkgb3Igbm90IGNvLWxvY2F0ZWQgKGFudGktYWZmaW5pdHkpIHdpdGggdGhlIHBvZHMgbWF0Y2hpbmdcbiAgICogdGhlIGxhYmVsU2VsZWN0b3IgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2VzLCB3aGVyZSBjby1sb2NhdGVkIGlzIGRlZmluZWQgYXMgcnVubmluZyBvbiBhIG5vZGVcbiAgICogd2hvc2UgdmFsdWUgb2YgdGhlIGxhYmVsIHdpdGgga2V5IHRvcG9sb2d5S2V5IG1hdGNoZXMgdGhhdCBvZiBhbnkgbm9kZSBvbiB3aGljaCBhbnkgb2YgdGhlXG4gICAqIHNlbGVjdGVkIHBvZHMgaXMgcnVubmluZy5cbiAgICogRW1wdHkgdG9wb2xvZ3lLZXkgaXMgbm90IGFsbG93ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jdG9wb2xvZ3lLZXlcbiAgICovXG4gIHJlYWRvbmx5IHRvcG9sb2d5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsYWJlbFNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvcihvYmoubGFiZWxTZWxlY3RvciksXG4gICAgJ21hdGNoTGFiZWxLZXlzJzogb2JqLm1hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbWlzbWF0Y2hMYWJlbEtleXMnOiBvYmoubWlzbWF0Y2hMYWJlbEtleXM/Lm1hcCh5ID0+IHkpLFxuICAgICduYW1lc3BhY2VTZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yKG9iai5uYW1lc3BhY2VTZWxlY3RvciksXG4gICAgJ25hbWVzcGFjZXMnOiBvYmoubmFtZXNwYWNlcz8ubWFwKHkgPT4geSksXG4gICAgJ3RvcG9sb2d5S2V5Jzogb2JqLnRvcG9sb2d5S2V5LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogc2VjcmV0UmVmIGlzIE9wdGlvbmFsOiBTZWNyZXRSZWYgaXMgcmVmZXJlbmNlIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBzZWNyZXQgZm9yIFVzZXIsIGRlZmF1bHQgaXMgZW1wdHkuXG4gKiBNb3JlIGluZm86IGh0dHBzOi8vZXhhbXBsZXMuazhzLmlvL3ZvbHVtZXMvY2VwaGZzL1JFQURNRS5tZCNob3ctdG8tdXNlLWl0XG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDZXBoZnNTZWNyZXRSZWZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDZXBoZnNTZWNyZXRSZWYge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2VwaGZzU2VjcmV0UmVmI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NlcGhmc1NlY3JldFJlZicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDZXBoZnNTZWNyZXRSZWYob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDZXBoZnNTZWNyZXRSZWYgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXRSZWYgaXMgb3B0aW9uYWw6IHBvaW50cyB0byBhIHNlY3JldCBvYmplY3QgY29udGFpbmluZyBwYXJhbWV0ZXJzIHVzZWQgdG8gY29ubmVjdFxuICogdG8gT3BlblN0YWNrLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2luZGVyU2VjcmV0UmVmXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2luZGVyU2VjcmV0UmVmIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NpbmRlclNlY3JldFJlZiNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDaW5kZXJTZWNyZXRSZWYnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2luZGVyU2VjcmV0UmVmKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ2luZGVyU2VjcmV0UmVmIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogTWFwcyBhIHN0cmluZyBrZXkgdG8gYSBwYXRoIHdpdGhpbiBhIHZvbHVtZS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NvbmZpZ01hcEl0ZW1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ29uZmlnTWFwSXRlbXMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBrZXkgdG8gcHJvamVjdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDb25maWdNYXBJdGVtcyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBtb2RlIGlzIE9wdGlvbmFsOiBtb2RlIGJpdHMgdXNlZCB0byBzZXQgcGVybWlzc2lvbnMgb24gdGhpcyBmaWxlLlxuICAgKiBNdXN0IGJlIGFuIG9jdGFsIHZhbHVlIGJldHdlZW4gMDAwMCBhbmQgMDc3NyBvciBhIGRlY2ltYWwgdmFsdWUgYmV0d2VlbiAwIGFuZCA1MTEuXG4gICAqIFlBTUwgYWNjZXB0cyBib3RoIG9jdGFsIGFuZCBkZWNpbWFsIHZhbHVlcywgSlNPTiByZXF1aXJlcyBkZWNpbWFsIHZhbHVlcyBmb3IgbW9kZSBiaXRzLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgdm9sdW1lIGRlZmF1bHRNb2RlIHdpbGwgYmUgdXNlZC5cbiAgICogVGhpcyBtaWdodCBiZSBpbiBjb25mbGljdCB3aXRoIG90aGVyIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGZpbGVcbiAgICogbW9kZSwgbGlrZSBmc0dyb3VwLCBhbmQgdGhlIHJlc3VsdCBjYW4gYmUgb3RoZXIgbW9kZSBiaXRzIHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDb25maWdNYXBJdGVtcyNtb2RlXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBwYXRoIGlzIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIG1hcCB0aGUga2V5IHRvLlxuICAgKiBNYXkgbm90IGJlIGFuIGFic29sdXRlIHBhdGguXG4gICAqIE1heSBub3QgY29udGFpbiB0aGUgcGF0aCBlbGVtZW50ICcuLicuXG4gICAqIE1heSBub3Qgc3RhcnQgd2l0aCB0aGUgc3RyaW5nICcuLicuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ29uZmlnTWFwSXRlbXMjcGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDb25maWdNYXBJdGVtcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDb25maWdNYXBJdGVtcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NvbmZpZ01hcEl0ZW1zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbW9kZSc6IG9iai5tb2RlLFxuICAgICdwYXRoJzogb2JqLnBhdGgsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBub2RlUHVibGlzaFNlY3JldFJlZiBpcyBhIHJlZmVyZW5jZSB0byB0aGUgc2VjcmV0IG9iamVjdCBjb250YWluaW5nXG4gKiBzZW5zaXRpdmUgaW5mb3JtYXRpb24gdG8gcGFzcyB0byB0aGUgQ1NJIGRyaXZlciB0byBjb21wbGV0ZSB0aGUgQ1NJXG4gKiBOb2RlUHVibGlzaFZvbHVtZSBhbmQgTm9kZVVucHVibGlzaFZvbHVtZSBjYWxscy5cbiAqIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGFuZCAgbWF5IGJlIGVtcHR5IGlmIG5vIHNlY3JldCBpcyByZXF1aXJlZC4gSWYgdGhlXG4gKiBzZWNyZXQgb2JqZWN0IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgc2VjcmV0LCBhbGwgc2VjcmV0IHJlZmVyZW5jZXMgYXJlIHBhc3NlZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0NzaU5vZGVQdWJsaXNoU2VjcmV0UmVmXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ3NpTm9kZVB1Ymxpc2hTZWNyZXRSZWYge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ3NpTm9kZVB1Ymxpc2hTZWNyZXRSZWYjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ3NpTm9kZVB1Ymxpc2hTZWNyZXRSZWYnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzQ3NpTm9kZVB1Ymxpc2hTZWNyZXRSZWYob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNDc2lOb2RlUHVibGlzaFNlY3JldFJlZiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIERvd253YXJkQVBJVm9sdW1lRmlsZSByZXByZXNlbnRzIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBwb2QgZmllbGRcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNEb3dud2FyZEFwaUl0ZW1zIHtcbiAgLyoqXG4gICAqIFJlcXVpcmVkOiBTZWxlY3RzIGEgZmllbGQgb2YgdGhlIHBvZDogb25seSBhbm5vdGF0aW9ucywgbGFiZWxzLCBuYW1lLCBuYW1lc3BhY2UgYW5kIHVpZCBhcmUgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXMjZmllbGRSZWZcbiAgICovXG4gIHJlYWRvbmx5IGZpZWxkUmVmPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtc0ZpZWxkUmVmO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbDogbW9kZSBiaXRzIHVzZWQgdG8gc2V0IHBlcm1pc3Npb25zIG9uIHRoaXMgZmlsZSwgbXVzdCBiZSBhbiBvY3RhbCB2YWx1ZVxuICAgKiBiZXR3ZWVuIDAwMDAgYW5kIDA3Nzcgb3IgYSBkZWNpbWFsIHZhbHVlIGJldHdlZW4gMCBhbmQgNTExLlxuICAgKiBZQU1MIGFjY2VwdHMgYm90aCBvY3RhbCBhbmQgZGVjaW1hbCB2YWx1ZXMsIEpTT04gcmVxdWlyZXMgZGVjaW1hbCB2YWx1ZXMgZm9yIG1vZGUgYml0cy5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgdGhlIHZvbHVtZSBkZWZhdWx0TW9kZSB3aWxsIGJlIHVzZWQuXG4gICAqIFRoaXMgbWlnaHQgYmUgaW4gY29uZmxpY3Qgd2l0aCBvdGhlciBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBmaWxlXG4gICAqIG1vZGUsIGxpa2UgZnNHcm91cCwgYW5kIHRoZSByZXN1bHQgY2FuIGJlIG90aGVyIG1vZGUgYml0cyBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtcyNtb2RlXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXF1aXJlZDogUGF0aCBpcyAgdGhlIHJlbGF0aXZlIHBhdGggbmFtZSBvZiB0aGUgZmlsZSB0byBiZSBjcmVhdGVkLiBNdXN0IG5vdCBiZSBhYnNvbHV0ZSBvciBjb250YWluIHRoZSAnLi4nIHBhdGguIE11c3QgYmUgdXRmLTggZW5jb2RlZC4gVGhlIGZpcnN0IGl0ZW0gb2YgdGhlIHJlbGF0aXZlIHBhdGggbXVzdCBub3Qgc3RhcnQgd2l0aCAnLi4nXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtcyNwYXRoXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSByZXNvdXJjZSBvZiB0aGUgY29udGFpbmVyOiBvbmx5IHJlc291cmNlcyBsaW1pdHMgYW5kIHJlcXVlc3RzXG4gICAqIChsaW1pdHMuY3B1LCBsaW1pdHMubWVtb3J5LCByZXF1ZXN0cy5jcHUgYW5kIHJlcXVlc3RzLm1lbW9yeSkgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtcyNyZXNvdXJjZUZpZWxkUmVmXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUZpZWxkUmVmPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtc1Jlc291cmNlRmllbGRSZWY7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdmaWVsZFJlZic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNEb3dud2FyZEFwaUl0ZW1zRmllbGRSZWYob2JqLmZpZWxkUmVmKSxcbiAgICAnbW9kZSc6IG9iai5tb2RlLFxuICAgICdwYXRoJzogb2JqLnBhdGgsXG4gICAgJ3Jlc291cmNlRmllbGRSZWYnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtc1Jlc291cmNlRmllbGRSZWYob2JqLnJlc291cmNlRmllbGRSZWYpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogc2l6ZUxpbWl0IGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgbG9jYWwgc3RvcmFnZSByZXF1aXJlZCBmb3IgdGhpcyBFbXB0eURpciB2b2x1bWUuXG4gKiBUaGUgc2l6ZSBsaW1pdCBpcyBhbHNvIGFwcGxpY2FibGUgZm9yIG1lbW9yeSBtZWRpdW0uXG4gKiBUaGUgbWF4aW11bSB1c2FnZSBvbiBtZW1vcnkgbWVkaXVtIEVtcHR5RGlyIHdvdWxkIGJlIHRoZSBtaW5pbXVtIHZhbHVlIGJldHdlZW5cbiAqIHRoZSBTaXplTGltaXQgc3BlY2lmaWVkIGhlcmUgYW5kIHRoZSBzdW0gb2YgbWVtb3J5IGxpbWl0cyBvZiBhbGwgY29udGFpbmVycyBpbiBhIHBvZC5cbiAqIFRoZSBkZWZhdWx0IGlzIG5pbCB3aGljaCBtZWFucyB0aGF0IHRoZSBsaW1pdCBpcyB1bmRlZmluZWQuXG4gKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcyNlbXB0eWRpclxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRW1wdHlEaXJTaXplTGltaXRcbiAqL1xuZXhwb3J0IGNsYXNzIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VtcHR5RGlyU2l6ZUxpbWl0IHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFbXB0eURpclNpemVMaW1pdCB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFbXB0eURpclNpemVMaW1pdCh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFbXB0eURpclNpemVMaW1pdCB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFbXB0eURpclNpemVMaW1pdCh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICB9XG59XG5cbi8qKlxuICogV2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIHN0YW5kLWFsb25lIFBWQyB0byBwcm92aXNpb24gdGhlIHZvbHVtZS5cbiAqIFRoZSBwb2QgaW4gd2hpY2ggdGhpcyBFcGhlbWVyYWxWb2x1bWVTb3VyY2UgaXMgZW1iZWRkZWQgd2lsbCBiZSB0aGVcbiAqIG93bmVyIG9mIHRoZSBQVkMsIGkuZS4gdGhlIFBWQyB3aWxsIGJlIGRlbGV0ZWQgdG9nZXRoZXIgd2l0aCB0aGVcbiAqIHBvZC4gIFRoZSBuYW1lIG9mIHRoZSBQVkMgd2lsbCBiZSBgPHBvZCBuYW1lPi08dm9sdW1lIG5hbWU+YCB3aGVyZVxuICogYDx2b2x1bWUgbmFtZT5gIGlzIHRoZSBuYW1lIGZyb20gdGhlIGBQb2RTcGVjLlZvbHVtZXNgIGFycmF5XG4gKiBlbnRyeS4gUG9kIHZhbGlkYXRpb24gd2lsbCByZWplY3QgdGhlIHBvZCBpZiB0aGUgY29uY2F0ZW5hdGVkIG5hbWVcbiAqIGlzIG5vdCB2YWxpZCBmb3IgYSBQVkMgKGZvciBleGFtcGxlLCB0b28gbG9uZykuXG4gKlxuICogQW4gZXhpc3RpbmcgUFZDIHdpdGggdGhhdCBuYW1lIHRoYXQgaXMgbm90IG93bmVkIGJ5IHRoZSBwb2RcbiAqIHdpbGwgKm5vdCogYmUgdXNlZCBmb3IgdGhlIHBvZCB0byBhdm9pZCB1c2luZyBhbiB1bnJlbGF0ZWRcbiAqIHZvbHVtZSBieSBtaXN0YWtlLiBTdGFydGluZyB0aGUgcG9kIGlzIHRoZW4gYmxvY2tlZCB1bnRpbFxuICogdGhlIHVucmVsYXRlZCBQVkMgaXMgcmVtb3ZlZC4gSWYgc3VjaCBhIHByZS1jcmVhdGVkIFBWQyBpc1xuICogbWVhbnQgdG8gYmUgdXNlZCBieSB0aGUgcG9kLCB0aGUgUFZDIGhhcyB0byB1cGRhdGVkIHdpdGggYW5cbiAqIG93bmVyIHJlZmVyZW5jZSB0byB0aGUgcG9kIG9uY2UgdGhlIHBvZCBleGlzdHMuIE5vcm1hbGx5XG4gKiB0aGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5LCBidXQgaXQgbWF5IGJlIHVzZWZ1bCB3aGVuXG4gKiBtYW51YWxseSByZWNvbnN0cnVjdGluZyBhIGJyb2tlbiBjbHVzdGVyLlxuICpcbiAqIFRoaXMgZmllbGQgaXMgcmVhZC1vbmx5IGFuZCBubyBjaGFuZ2VzIHdpbGwgYmUgbWFkZSBieSBLdWJlcm5ldGVzXG4gKiB0byB0aGUgUFZDIGFmdGVyIGl0IGhhcyBiZWVuIGNyZWF0ZWQuXG4gKlxuICogUmVxdWlyZWQsIG11c3Qgbm90IGJlIG5pbC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlIHtcbiAgLyoqXG4gICAqIE1heSBjb250YWluIGxhYmVscyBhbmQgYW5ub3RhdGlvbnMgdGhhdCB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBQVkNcbiAgICogd2hlbiBjcmVhdGluZyBpdC4gTm8gb3RoZXIgZmllbGRzIGFyZSBhbGxvd2VkIGFuZCB3aWxsIGJlIHJlamVjdGVkIGR1cmluZ1xuICAgKiB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGUjbWV0YWRhdGFcbiAgICovXG4gIHJlYWRvbmx5IG1ldGFkYXRhPzogYW55O1xuXG4gIC8qKlxuICAgKiBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIFBlcnNpc3RlbnRWb2x1bWVDbGFpbS4gVGhlIGVudGlyZSBjb250ZW50IGlzXG4gICAqIGNvcGllZCB1bmNoYW5nZWQgaW50byB0aGUgUFZDIHRoYXQgZ2V0cyBjcmVhdGVkIGZyb20gdGhpc1xuICAgKiB0ZW1wbGF0ZS4gVGhlIHNhbWUgZmllbGRzIGFzIGluIGEgUGVyc2lzdGVudFZvbHVtZUNsYWltXG4gICAqIGFyZSBhbHNvIHZhbGlkIGhlcmUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZSNzcGVjXG4gICAqL1xuICByZWFkb25seSBzcGVjOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlYztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21ldGFkYXRhJzogb2JqLm1ldGFkYXRhLFxuICAgICdzcGVjJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjKG9iai5zcGVjKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlY3JldFJlZiBpcyBPcHRpb25hbDogc2VjcmV0UmVmIGlzIHJlZmVyZW5jZSB0byB0aGUgc2VjcmV0IG9iamVjdCBjb250YWluaW5nXG4gKiBzZW5zaXRpdmUgaW5mb3JtYXRpb24gdG8gcGFzcyB0byB0aGUgcGx1Z2luIHNjcmlwdHMuIFRoaXMgbWF5IGJlXG4gKiBlbXB0eSBpZiBubyBzZWNyZXQgb2JqZWN0IGlzIHNwZWNpZmllZC4gSWYgdGhlIHNlY3JldCBvYmplY3RcbiAqIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgc2VjcmV0LCBhbGwgc2VjcmV0cyBhcmUgcGFzc2VkIHRvIHRoZSBwbHVnaW5cbiAqIHNjcmlwdHMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNGbGV4Vm9sdW1lU2VjcmV0UmVmXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmxleFZvbHVtZVNlY3JldFJlZiB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNGbGV4Vm9sdW1lU2VjcmV0UmVmI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ZsZXhWb2x1bWVTZWNyZXRSZWYnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRmxleFZvbHVtZVNlY3JldFJlZihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0ZsZXhWb2x1bWVTZWNyZXRSZWYgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXRSZWYgaXMgdGhlIENIQVAgU2VjcmV0IGZvciBpU0NTSSB0YXJnZXQgYW5kIGluaXRpYXRvciBhdXRoZW50aWNhdGlvblxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzSXNjc2lTZWNyZXRSZWZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNJc2NzaVNlY3JldFJlZiB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNJc2NzaVNlY3JldFJlZiNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNJc2NzaVNlY3JldFJlZicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNJc2NzaVNlY3JldFJlZihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0lzY3NpU2VjcmV0UmVmIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogUHJvamVjdGlvbiB0aGF0IG1heSBiZSBwcm9qZWN0ZWQgYWxvbmcgd2l0aCBvdGhlciBzdXBwb3J0ZWQgdm9sdW1lIHR5cGVzLlxuICogRXhhY3RseSBvbmUgb2YgdGhlc2UgZmllbGRzIG11c3QgYmUgc2V0LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXMge1xuICAvKipcbiAgICogQ2x1c3RlclRydXN0QnVuZGxlIGFsbG93cyBhIHBvZCB0byBhY2Nlc3MgdGhlIGAuc3BlYy50cnVzdEJ1bmRsZWAgZmllbGRcbiAgICogb2YgQ2x1c3RlclRydXN0QnVuZGxlIG9iamVjdHMgaW4gYW4gYXV0by11cGRhdGluZyBmaWxlLlxuICAgKlxuICAgKiBBbHBoYSwgZ2F0ZWQgYnkgdGhlIENsdXN0ZXJUcnVzdEJ1bmRsZVByb2plY3Rpb24gZmVhdHVyZSBnYXRlLlxuICAgKlxuICAgKiBDbHVzdGVyVHJ1c3RCdW5kbGUgb2JqZWN0cyBjYW4gZWl0aGVyIGJlIHNlbGVjdGVkIGJ5IG5hbWUsIG9yIGJ5IHRoZVxuICAgKiBjb21iaW5hdGlvbiBvZiBzaWduZXIgbmFtZSBhbmQgYSBsYWJlbCBzZWxlY3Rvci5cbiAgICpcbiAgICogS3ViZWxldCBwZXJmb3JtcyBhZ2dyZXNzaXZlIG5vcm1hbGl6YXRpb24gb2YgdGhlIFBFTSBjb250ZW50cyB3cml0dGVuXG4gICAqIGludG8gdGhlIHBvZCBmaWxlc3lzdGVtLiAgRXNvdGVyaWMgUEVNIGZlYXR1cmVzIHN1Y2ggYXMgaW50ZXItYmxvY2tcbiAgICogY29tbWVudHMgYW5kIGJsb2NrIGhlYWRlcnMgYXJlIHN0cmlwcGVkLiAgQ2VydGlmaWNhdGVzIGFyZSBkZWR1cGxpY2F0ZWQuXG4gICAqIFRoZSBvcmRlcmluZyBvZiBjZXJ0aWZpY2F0ZXMgd2l0aGluIHRoZSBmaWxlIGlzIGFyYml0cmFyeSwgYW5kIEt1YmVsZXRcbiAgICogbWF5IGNoYW5nZSB0aGUgb3JkZXIgb3ZlciB0aW1lLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXMjY2x1c3RlclRydXN0QnVuZGxlXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyVHJ1c3RCdW5kbGU/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ2x1c3RlclRydXN0QnVuZGxlO1xuXG4gIC8qKlxuICAgKiBjb25maWdNYXAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbmZpZ01hcCBkYXRhIHRvIHByb2plY3RcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzI2NvbmZpZ01hcFxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnTWFwPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NvbmZpZ01hcDtcblxuICAvKipcbiAgICogZG93bndhcmRBUEkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRvd253YXJkQVBJIGRhdGEgdG8gcHJvamVjdFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXMjZG93bndhcmRBUElcbiAgICovXG4gIHJlYWRvbmx5IGRvd253YXJkQXBpPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpO1xuXG4gIC8qKlxuICAgKiBQcm9qZWN0cyBhbiBhdXRvLXJvdGF0aW5nIGNyZWRlbnRpYWwgYnVuZGxlIChwcml2YXRlIGtleSBhbmQgY2VydGlmaWNhdGVcbiAgICogY2hhaW4pIHRoYXQgdGhlIHBvZCBjYW4gdXNlIGVpdGhlciBhcyBhIFRMUyBjbGllbnQgb3Igc2VydmVyLlxuICAgKlxuICAgKiBLdWJlbGV0IGdlbmVyYXRlcyBhIHByaXZhdGUga2V5IGFuZCB1c2VzIGl0IHRvIHNlbmQgYVxuICAgKiBQb2RDZXJ0aWZpY2F0ZVJlcXVlc3QgdG8gdGhlIG5hbWVkIHNpZ25lci4gIE9uY2UgdGhlIHNpZ25lciBhcHByb3ZlcyB0aGVcbiAgICogcmVxdWVzdCBhbmQgaXNzdWVzIGEgY2VydGlmaWNhdGUgY2hhaW4sIEt1YmVsZXQgd3JpdGVzIHRoZSBrZXkgYW5kXG4gICAqIGNlcnRpZmljYXRlIGNoYWluIHRvIHRoZSBwb2QgZmlsZXN5c3RlbS4gIFRoZSBwb2QgZG9lcyBub3Qgc3RhcnQgdW50aWxcbiAgICogY2VydGlmaWNhdGVzIGhhdmUgYmVlbiBpc3N1ZWQgZm9yIGVhY2ggcG9kQ2VydGlmaWNhdGUgcHJvamVjdGVkIHZvbHVtZVxuICAgKiBzb3VyY2UgaW4gaXRzIHNwZWMuXG4gICAqXG4gICAqIEt1YmVsZXQgd2lsbCBiZWdpbiB0cnlpbmcgdG8gcm90YXRlIHRoZSBjZXJ0aWZpY2F0ZSBhdCB0aGUgdGltZSBpbmRpY2F0ZWRcbiAgICogYnkgdGhlIHNpZ25lciB1c2luZyB0aGUgUG9kQ2VydGlmaWNhdGVSZXF1ZXN0LlN0YXR1cy5CZWdpblJlZnJlc2hBdFxuICAgKiB0aW1lc3RhbXAuXG4gICAqXG4gICAqIEt1YmVsZXQgY2FuIHdyaXRlIGEgc2luZ2xlIGZpbGUsIGluZGljYXRlZCBieSB0aGUgY3JlZGVudGlhbEJ1bmRsZVBhdGhcbiAgICogZmllbGQsIG9yIHNlcGFyYXRlIGZpbGVzLCBpbmRpY2F0ZWQgYnkgdGhlIGtleVBhdGggYW5kXG4gICAqIGNlcnRpZmljYXRlQ2hhaW5QYXRoIGZpZWxkcy5cbiAgICpcbiAgICogVGhlIGNyZWRlbnRpYWwgYnVuZGxlIGlzIGEgc2luZ2xlIGZpbGUgaW4gUEVNIGZvcm1hdC4gIFRoZSBmaXJzdCBQRU1cbiAgICogZW50cnkgaXMgdGhlIHByaXZhdGUga2V5IChpbiBQS0NTIzggZm9ybWF0KSwgYW5kIHRoZSByZW1haW5pbmcgUEVNXG4gICAqIGVudHJpZXMgYXJlIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiBpc3N1ZWQgYnkgdGhlIHNpZ25lciAodHlwaWNhbGx5LFxuICAgKiBzaWduZXJzIHdpbGwgcmV0dXJuIHRoZWlyIGNlcnRpZmljYXRlIGNoYWluIGluIGxlYWYtdG8tcm9vdCBvcmRlcikuXG4gICAqXG4gICAqIFByZWZlciB1c2luZyB0aGUgY3JlZGVudGlhbCBidW5kbGUgZm9ybWF0LCBzaW5jZSB5b3VyIGFwcGxpY2F0aW9uIGNvZGVcbiAgICogY2FuIHJlYWQgaXQgYXRvbWljYWxseS4gIElmIHlvdSB1c2Uga2V5UGF0aCBhbmQgY2VydGlmaWNhdGVDaGFpblBhdGgsXG4gICAqIHlvdXIgYXBwbGljYXRpb24gbXVzdCBtYWtlIHR3byBzZXBhcmF0ZSBmaWxlIHJlYWRzLiBJZiB0aGVzZSBjb2luY2lkZVxuICAgKiB3aXRoIGEgY2VydGlmaWNhdGUgcm90YXRpb24sIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHByaXZhdGUga2V5IGFuZCBsZWFmXG4gICAqIGNlcnRpZmljYXRlIHlvdSByZWFkIG1heSBub3QgY29ycmVzcG9uZCB0byBlYWNoIG90aGVyLiAgWW91ciBhcHBsaWNhdGlvblxuICAgKiB3aWxsIG5lZWQgdG8gY2hlY2sgZm9yIHRoaXMgY29uZGl0aW9uLCBhbmQgcmUtcmVhZCB1bnRpbCB0aGV5IGFyZVxuICAgKiBjb25zaXN0ZW50LlxuICAgKlxuICAgKiBUaGUgbmFtZWQgc2lnbmVyIGNvbnRyb2xzIGNob29zZXMgdGhlIGZvcm1hdCBvZiB0aGUgY2VydGlmaWNhdGUgaXRcbiAgICogaXNzdWVzOyBjb25zdWx0IHRoZSBzaWduZXIgaW1wbGVtZW50YXRpb24ncyBkb2N1bWVudGF0aW9uIHRvIGxlYXJuIGhvdyB0b1xuICAgKiB1c2UgdGhlIGNlcnRpZmljYXRlcyBpdCBpc3N1ZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlcyNwb2RDZXJ0aWZpY2F0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcG9kQ2VydGlmaWNhdGU/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzUG9kQ2VydGlmaWNhdGU7XG5cbiAgLyoqXG4gICAqIHNlY3JldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VjcmV0IGRhdGEgdG8gcHJvamVjdFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXMjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzU2VjcmV0O1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlQWNjb3VudFRva2VuIGlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJ2aWNlQWNjb3VudFRva2VuIGRhdGEgdG8gcHJvamVjdFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXMjc2VydmljZUFjY291bnRUb2tlblxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZUFjY291bnRUb2tlbj86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNTZXJ2aWNlQWNjb3VudFRva2VuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXMob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2x1c3RlclRydXN0QnVuZGxlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNDbHVzdGVyVHJ1c3RCdW5kbGUob2JqLmNsdXN0ZXJUcnVzdEJ1bmRsZSksXG4gICAgJ2NvbmZpZ01hcCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ29uZmlnTWFwKG9iai5jb25maWdNYXApLFxuICAgICdkb3dud2FyZEFQSSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzRG93bndhcmRBcGkob2JqLmRvd253YXJkQXBpKSxcbiAgICAncG9kQ2VydGlmaWNhdGUnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1BvZENlcnRpZmljYXRlKG9iai5wb2RDZXJ0aWZpY2F0ZSksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzU2VjcmV0KG9iai5zZWNyZXQpLFxuICAgICdzZXJ2aWNlQWNjb3VudFRva2VuJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNTZXJ2aWNlQWNjb3VudFRva2VuKG9iai5zZXJ2aWNlQWNjb3VudFRva2VuKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlY3JldFJlZiBpcyBuYW1lIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBzZWNyZXQgZm9yIFJCRFVzZXIuIElmIHByb3ZpZGVkXG4gKiBvdmVycmlkZXMga2V5cmluZy5cbiAqIERlZmF1bHQgaXMgbmlsLlxuICogTW9yZSBpbmZvOiBodHRwczovL2V4YW1wbGVzLms4cy5pby92b2x1bWVzL3JiZC9SRUFETUUubWQjaG93LXRvLXVzZS1pdFxuICpcbiAqIEBkZWZhdWx0IG5pbC5cbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUmJkU2VjcmV0UmVmXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUmJkU2VjcmV0UmVmIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1JiZFNlY3JldFJlZiNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNSYmRTZWNyZXRSZWYnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUmJkU2VjcmV0UmVmKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUmJkU2VjcmV0UmVmIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogc2VjcmV0UmVmIHJlZmVyZW5jZXMgdG8gdGhlIHNlY3JldCBmb3IgU2NhbGVJTyB1c2VyIGFuZCBvdGhlclxuICogc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiBJZiB0aGlzIGlzIG5vdCBwcm92aWRlZCwgTG9naW4gb3BlcmF0aW9uIHdpbGwgZmFpbC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1NjYWxlSW9TZWNyZXRSZWZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTY2FsZUlvU2VjcmV0UmVmIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1NjYWxlSW9TZWNyZXRSZWYjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2NhbGVJb1NlY3JldFJlZicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTY2FsZUlvU2VjcmV0UmVmKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2NhbGVJb1NlY3JldFJlZiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE1hcHMgYSBzdHJpbmcga2V5IHRvIGEgcGF0aCB3aXRoaW4gYSB2b2x1bWUuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTZWNyZXRJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1NlY3JldEl0ZW1zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUga2V5IHRvIHByb2plY3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2VjcmV0SXRlbXMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogbW9kZSBpcyBPcHRpb25hbDogbW9kZSBiaXRzIHVzZWQgdG8gc2V0IHBlcm1pc3Npb25zIG9uIHRoaXMgZmlsZS5cbiAgICogTXVzdCBiZSBhbiBvY3RhbCB2YWx1ZSBiZXR3ZWVuIDAwMDAgYW5kIDA3Nzcgb3IgYSBkZWNpbWFsIHZhbHVlIGJldHdlZW4gMCBhbmQgNTExLlxuICAgKiBZQU1MIGFjY2VwdHMgYm90aCBvY3RhbCBhbmQgZGVjaW1hbCB2YWx1ZXMsIEpTT04gcmVxdWlyZXMgZGVjaW1hbCB2YWx1ZXMgZm9yIG1vZGUgYml0cy5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgdGhlIHZvbHVtZSBkZWZhdWx0TW9kZSB3aWxsIGJlIHVzZWQuXG4gICAqIFRoaXMgbWlnaHQgYmUgaW4gY29uZmxpY3Qgd2l0aCBvdGhlciBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBmaWxlXG4gICAqIG1vZGUsIGxpa2UgZnNHcm91cCwgYW5kIHRoZSByZXN1bHQgY2FuIGJlIG90aGVyIG1vZGUgYml0cyBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2VjcmV0SXRlbXMjbW9kZVxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IG51bWJlcjtcblxuICAvKipcbiAgICogcGF0aCBpcyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSB0byBtYXAgdGhlIGtleSB0by5cbiAgICogTWF5IG5vdCBiZSBhbiBhYnNvbHV0ZSBwYXRoLlxuICAgKiBNYXkgbm90IGNvbnRhaW4gdGhlIHBhdGggZWxlbWVudCAnLi4nLlxuICAgKiBNYXkgbm90IHN0YXJ0IHdpdGggdGhlIHN0cmluZyAnLi4nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1NlY3JldEl0ZW1zI3BhdGhcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2VjcmV0SXRlbXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU2VjcmV0SXRlbXMob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTZWNyZXRJdGVtcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ21vZGUnOiBvYmoubW9kZSxcbiAgICAncGF0aCc6IG9iai5wYXRoLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogc2VjcmV0UmVmIHNwZWNpZmllcyB0aGUgc2VjcmV0IHRvIHVzZSBmb3Igb2J0YWluaW5nIHRoZSBTdG9yYWdlT1MgQVBJXG4gKiBjcmVkZW50aWFscy4gIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHQgdmFsdWVzIHdpbGwgYmUgYXR0ZW1wdGVkLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU3RvcmFnZW9zU2VjcmV0UmVmXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU3RvcmFnZW9zU2VjcmV0UmVmIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1N0b3JhZ2Vvc1NlY3JldFJlZiNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNTdG9yYWdlb3NTZWNyZXRSZWYnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU3RvcmFnZW9zU2VjcmV0UmVmKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzU3RvcmFnZW9zU2VjcmV0UmVmIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY1Jlc291cmNlc0xpbWl0c1xuICovXG5leHBvcnQgY2xhc3MgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNSZXNvdXJjZXNMaW1pdHMge1xuICBwdWJsaWMgc3RhdGljIGZyb21OdW1iZXIodmFsdWU6IG51bWJlcik6IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjUmVzb3VyY2VzTGltaXRzIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjUmVzb3VyY2VzTGltaXRzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGZyb21TdHJpbmcodmFsdWU6IHN0cmluZyk6IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjUmVzb3VyY2VzTGltaXRzIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjUmVzb3VyY2VzTGltaXRzKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjUmVzb3VyY2VzUmVxdWVzdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjUmVzb3VyY2VzUmVxdWVzdHMge1xuICBwdWJsaWMgc3RhdGljIGZyb21OdW1iZXIodmFsdWU6IG51bWJlcik6IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjUmVzb3VyY2VzUmVxdWVzdHMge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNSZXNvdXJjZXNSZXF1ZXN0cyh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY1Jlc291cmNlc1JlcXVlc3RzIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjUmVzb3VyY2VzUmVxdWVzdHModmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgfVxufVxuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNWb2x1bWVDbGFpbVRlbXBsYXRlc1NwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2YWx1ZXMgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gSWYgdGhlIG9wZXJhdG9yIGlzIEluIG9yIE5vdEluLFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzIG9yIERvZXNOb3RFeGlzdCxcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIGVtcHR5LiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpY1xuICAgKiBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1ZvbHVtZUNsYWltVGVtcGxhdGVzU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyhvYmo6IFZpbnlsQ2FjaGVTcGVjVm9sdW1lQ2xhaW1UZW1wbGF0ZXNTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBub2RlIHNlbGVjdG9yIHRlcm0sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2Ygbm9kZSBzZWxlY3RvciByZXF1aXJlbWVudHMgYnkgbm9kZSdzIGxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2Ygbm9kZSBzZWxlY3RvciByZXF1aXJlbWVudHMgYnkgbm9kZSdzIGZpZWxkcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlI21hdGNoRmllbGRzXG4gICAqL1xuICByZWFkb25seSBtYXRjaEZpZWxkcz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkc1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2Uob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZU1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaEZpZWxkcyc6IG9iai5tYXRjaEZpZWxkcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcyh5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIG51bGwgb3IgZW1wdHkgbm9kZSBzZWxlY3RvciB0ZXJtIG1hdGNoZXMgbm8gb2JqZWN0cy4gVGhlIHJlcXVpcmVtZW50cyBvZlxuICogdGhlbSBhcmUgQU5EZWQuXG4gKiBUaGUgVG9wb2xvZ3lTZWxlY3RvclRlcm0gdHlwZSBpbXBsZW1lbnRzIGEgc3Vic2V0IG9mIHRoZSBOb2RlU2VsZWN0b3JUZXJtLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnRzIGJ5IG5vZGUncyBsYWJlbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtcyNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnRzIGJ5IG5vZGUncyBmaWVsZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtcyNtYXRjaEZpZWxkc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hGaWVsZHM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zTWF0Y2hGaWVsZHNbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hGaWVsZHMnOiBvYmoubWF0Y2hGaWVsZHM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zTWF0Y2hGaWVsZHMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogUmVxdWlyZWQuIEEgcG9kIGFmZmluaXR5IHRlcm0sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtIHtcbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICAgKiBJZiBpdCdzIG51bGwsIHRoaXMgUG9kQWZmaW5pdHlUZXJtIG1hdGNoZXMgd2l0aCBubyBQb2RzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI2xhYmVsU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsU2VsZWN0b3I/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIE1hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI21hdGNoTGFiZWxLZXlzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVsS2V5cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNaXNtYXRjaExhYmVsS2V5cyBpcyBhIHNldCBvZiBwb2QgbGFiZWwga2V5cyB0byBzZWxlY3Qgd2hpY2ggcG9kcyB3aWxsXG4gICAqIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIGtleXMgYXJlIHVzZWQgdG8gbG9va3VwIHZhbHVlcyBmcm9tIHRoZVxuICAgKiBpbmNvbWluZyBwb2QgbGFiZWxzLCB0aG9zZSBrZXktdmFsdWUgbGFiZWxzIGFyZSBtZXJnZWQgd2l0aCBgbGFiZWxTZWxlY3RvcmAgYXMgYGtleSBub3RpbiAodmFsdWUpYFxuICAgKiB0byBzZWxlY3QgdGhlIGdyb3VwIG9mIGV4aXN0aW5nIHBvZHMgd2hpY2ggcG9kcyB3aWxsIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgKiBmb3IgdGhlIGluY29taW5nIHBvZCdzIHBvZCAoYW50aSkgYWZmaW5pdHkuIEtleXMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgaW5jb21pbmdcbiAgICogcG9kIGxhYmVscyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBUaGUgc2FtZSBrZXkgaXMgZm9yYmlkZGVuIHRvIGV4aXN0IGluIGJvdGggbWlzbWF0Y2hMYWJlbEtleXMgYW5kIGxhYmVsU2VsZWN0b3IuXG4gICAqIEFsc28sIG1pc21hdGNoTGFiZWxLZXlzIGNhbm5vdCBiZSBzZXQgd2hlbiBsYWJlbFNlbGVjdG9yIGlzbid0IHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNtaXNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWlzbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gICAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIHNlbGVjdGVkIGJ5IHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIGxpc3RlZCBpbiB0aGUgbmFtZXNwYWNlcyBmaWVsZC5cbiAgICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICAgKiBBbiBlbXB0eSBzZWxlY3RvciAoe30pIG1hdGNoZXMgYWxsIG5hbWVzcGFjZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcjtcblxuICAvKipcbiAgICogbmFtZXNwYWNlcyBzcGVjaWZpZXMgYSBzdGF0aWMgbGlzdCBvZiBuYW1lc3BhY2UgbmFtZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gdGhpcyBmaWVsZFxuICAgKiBhbmQgdGhlIG9uZXMgc2VsZWN0ZWQgYnkgbmFtZXNwYWNlU2VsZWN0b3IuXG4gICAqIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IGFuZCBudWxsIG5hbWVzcGFjZVNlbGVjdG9yIG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNuYW1lc3BhY2VzXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoaXMgcG9kIHNob3VsZCBiZSBjby1sb2NhdGVkIChhZmZpbml0eSkgb3Igbm90IGNvLWxvY2F0ZWQgKGFudGktYWZmaW5pdHkpIHdpdGggdGhlIHBvZHMgbWF0Y2hpbmdcbiAgICogdGhlIGxhYmVsU2VsZWN0b3IgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2VzLCB3aGVyZSBjby1sb2NhdGVkIGlzIGRlZmluZWQgYXMgcnVubmluZyBvbiBhIG5vZGVcbiAgICogd2hvc2UgdmFsdWUgb2YgdGhlIGxhYmVsIHdpdGgga2V5IHRvcG9sb2d5S2V5IG1hdGNoZXMgdGhhdCBvZiBhbnkgbm9kZSBvbiB3aGljaCBhbnkgb2YgdGhlXG4gICAqIHNlbGVjdGVkIHBvZHMgaXMgcnVubmluZy5cbiAgICogRW1wdHkgdG9wb2xvZ3lLZXkgaXMgbm90IGFsbG93ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jdG9wb2xvZ3lLZXlcbiAgICovXG4gIHJlYWRvbmx5IHRvcG9sb2d5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsYWJlbFNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmoubGFiZWxTZWxlY3RvciksXG4gICAgJ21hdGNoTGFiZWxLZXlzJzogb2JqLm1hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbWlzbWF0Y2hMYWJlbEtleXMnOiBvYmoubWlzbWF0Y2hMYWJlbEtleXM/Lm1hcCh5ID0+IHkpLFxuICAgICduYW1lc3BhY2VTZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yKG9iai5uYW1lc3BhY2VTZWxlY3RvciksXG4gICAgJ25hbWVzcGFjZXMnOiBvYmoubmFtZXNwYWNlcz8ubWFwKHkgPT4geSksXG4gICAgJ3RvcG9sb2d5S2V5Jzogb2JqLnRvcG9sb2d5S2V5LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIGEgc2V0IG9mIHJlc291cmNlcywgaW4gdGhpcyBjYXNlIHBvZHMuXG4gKiBJZiBpdCdzIG51bGwsIHRoaXMgUG9kQWZmaW5pdHlUZXJtIG1hdGNoZXMgd2l0aCBubyBQb2RzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBtYXRjaEV4cHJlc3Npb25zIGlzIGEgbGlzdCBvZiBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudHMuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogbWF0Y2hMYWJlbHMgaXMgYSBtYXAgb2Yge2tleSx2YWx1ZX0gcGFpcnMuIEEgc2luZ2xlIHtrZXksdmFsdWV9IGluIHRoZSBtYXRjaExhYmVsc1xuICAgKiBtYXAgaXMgZXF1aXZhbGVudCB0byBhbiBlbGVtZW50IG9mIG1hdGNoRXhwcmVzc2lvbnMsIHdob3NlIGtleSBmaWVsZCBpcyBcImtleVwiLCB0aGVcbiAgICogb3BlcmF0b3IgaXMgXCJJblwiLCBhbmQgdGhlIHZhbHVlcyBhcnJheSBjb250YWlucyBvbmx5IFwidmFsdWVcIi4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IjbWF0Y2hMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIHNlbGVjdGVkIGJ5IHRoaXMgZmllbGRcbiAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gKiBudWxsIHNlbGVjdG9yIGFuZCBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gKiBBbiBlbXB0eSBzZWxlY3RvciAoe30pIG1hdGNoZXMgYWxsIG5hbWVzcGFjZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogbWF0Y2hMYWJlbHMgaXMgYSBtYXAgb2Yge2tleSx2YWx1ZX0gcGFpcnMuIEEgc2luZ2xlIHtrZXksdmFsdWV9IGluIHRoZSBtYXRjaExhYmVsc1xuICAgKiBtYXAgaXMgZXF1aXZhbGVudCB0byBhbiBlbGVtZW50IG9mIG1hdGNoRXhwcmVzc2lvbnMsIHdob3NlIGtleSBmaWVsZCBpcyBcImtleVwiLCB0aGVcbiAgICogb3BlcmF0b3IgaXMgXCJJblwiLCBhbmQgdGhlIHZhbHVlcyBhcnJheSBjb250YWlucyBvbmx5IFwidmFsdWVcIi4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFJlcXVpcmVkLiBBIHBvZCBhZmZpbml0eSB0ZXJtLCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgd2VpZ2h0LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtIHtcbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICAgKiBJZiBpdCdzIG51bGwsIHRoaXMgUG9kQWZmaW5pdHlUZXJtIG1hdGNoZXMgd2l0aCBubyBQb2RzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcjtcblxuICAvKipcbiAgICogTWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgaW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI21hdGNoTGFiZWxLZXlzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVsS2V5cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNaXNtYXRjaExhYmVsS2V5cyBpcyBhIHNldCBvZiBwb2QgbGFiZWwga2V5cyB0byBzZWxlY3Qgd2hpY2ggcG9kcyB3aWxsXG4gICAqIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIGtleXMgYXJlIHVzZWQgdG8gbG9va3VwIHZhbHVlcyBmcm9tIHRoZVxuICAgKiBpbmNvbWluZyBwb2QgbGFiZWxzLCB0aG9zZSBrZXktdmFsdWUgbGFiZWxzIGFyZSBtZXJnZWQgd2l0aCBgbGFiZWxTZWxlY3RvcmAgYXMgYGtleSBub3RpbiAodmFsdWUpYFxuICAgKiB0byBzZWxlY3QgdGhlIGdyb3VwIG9mIGV4aXN0aW5nIHBvZHMgd2hpY2ggcG9kcyB3aWxsIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgKiBmb3IgdGhlIGluY29taW5nIHBvZCdzIHBvZCAoYW50aSkgYWZmaW5pdHkuIEtleXMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgaW5jb21pbmdcbiAgICogcG9kIGxhYmVscyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBUaGUgc2FtZSBrZXkgaXMgZm9yYmlkZGVuIHRvIGV4aXN0IGluIGJvdGggbWlzbWF0Y2hMYWJlbEtleXMgYW5kIGxhYmVsU2VsZWN0b3IuXG4gICAqIEFsc28sIG1pc21hdGNoTGFiZWxLZXlzIGNhbm5vdCBiZSBzZXQgd2hlbiBsYWJlbFNlbGVjdG9yIGlzbid0IHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNuYW1lc3BhY2VTZWxlY3RvclxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlU2VsZWN0b3I/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcjtcblxuICAvKipcbiAgICogbmFtZXNwYWNlcyBzcGVjaWZpZXMgYSBzdGF0aWMgbGlzdCBvZiBuYW1lc3BhY2UgbmFtZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gdGhpcyBmaWVsZFxuICAgKiBhbmQgdGhlIG9uZXMgc2VsZWN0ZWQgYnkgbmFtZXNwYWNlU2VsZWN0b3IuXG4gICAqIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IGFuZCBudWxsIG5hbWVzcGFjZVNlbGVjdG9yIG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSN0b3BvbG9neUtleVxuICAgKi9cbiAgcmVhZG9ubHkgdG9wb2xvZ3lLZXk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2xhYmVsU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmoubGFiZWxTZWxlY3RvciksXG4gICAgJ21hdGNoTGFiZWxLZXlzJzogb2JqLm1hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbWlzbWF0Y2hMYWJlbEtleXMnOiBvYmoubWlzbWF0Y2hMYWJlbEtleXM/Lm1hcCh5ID0+IHkpLFxuICAgICduYW1lc3BhY2VTZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBtYXRjaEV4cHJlc3Npb25zIGlzIGEgbGlzdCBvZiBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudHMuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IjbWF0Y2hMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBSZXF1aXJlZDogU2VsZWN0cyBhIGZpZWxkIG9mIHRoZSBwb2Q6IG9ubHkgYW5ub3RhdGlvbnMsIGxhYmVscywgbmFtZSwgbmFtZXNwYWNlIGFuZCB1aWQgYXJlIHN1cHBvcnRlZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXNGaWVsZFJlZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXNGaWVsZFJlZiB7XG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBzY2hlbWEgdGhlIEZpZWxkUGF0aCBpcyB3cml0dGVuIGluIHRlcm1zIG9mLCBkZWZhdWx0cyB0byBcInYxXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtc0ZpZWxkUmVmI2FwaVZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IGFwaVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggb2YgdGhlIGZpZWxkIHRvIHNlbGVjdCBpbiB0aGUgc3BlY2lmaWVkIEFQSSB2ZXJzaW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXNGaWVsZFJlZiNmaWVsZFBhdGhcbiAgICovXG4gIHJlYWRvbmx5IGZpZWxkUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNEb3dud2FyZEFwaUl0ZW1zRmllbGRSZWYnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtc0ZpZWxkUmVmKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtc0ZpZWxkUmVmIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXBpVmVyc2lvbic6IG9iai5hcGlWZXJzaW9uLFxuICAgICdmaWVsZFBhdGgnOiBvYmouZmllbGRQYXRoLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogU2VsZWN0cyBhIHJlc291cmNlIG9mIHRoZSBjb250YWluZXI6IG9ubHkgcmVzb3VyY2VzIGxpbWl0cyBhbmQgcmVxdWVzdHNcbiAqIChsaW1pdHMuY3B1LCBsaW1pdHMubWVtb3J5LCByZXF1ZXN0cy5jcHUgYW5kIHJlcXVlc3RzLm1lbW9yeSkgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNEb3dud2FyZEFwaUl0ZW1zUmVzb3VyY2VGaWVsZFJlZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXNSZXNvdXJjZUZpZWxkUmVmIHtcbiAgLyoqXG4gICAqIENvbnRhaW5lciBuYW1lOiByZXF1aXJlZCBmb3Igdm9sdW1lcywgb3B0aW9uYWwgZm9yIGVudiB2YXJzXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtc1Jlc291cmNlRmllbGRSZWYjY29udGFpbmVyTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBvdXRwdXQgZm9ybWF0IG9mIHRoZSBleHBvc2VkIHJlc291cmNlcywgZGVmYXVsdHMgdG8gXCIxXCJcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNEb3dud2FyZEFwaUl0ZW1zUmVzb3VyY2VGaWVsZFJlZiNkaXZpc29yXG4gICAqL1xuICByZWFkb25seSBkaXZpc29yPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtc1Jlc291cmNlRmllbGRSZWZEaXZpc29yO1xuXG4gIC8qKlxuICAgKiBSZXF1aXJlZDogcmVzb3VyY2UgdG8gc2VsZWN0XG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtc1Jlc291cmNlRmllbGRSZWYjcmVzb3VyY2VcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXNSZXNvdXJjZUZpZWxkUmVmJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXNSZXNvdXJjZUZpZWxkUmVmKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtc1Jlc291cmNlRmllbGRSZWYgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb250YWluZXJOYW1lJzogb2JqLmNvbnRhaW5lck5hbWUsXG4gICAgJ2Rpdmlzb3InOiBvYmouZGl2aXNvcj8udmFsdWUsXG4gICAgJ3Jlc291cmNlJzogb2JqLnJlc291cmNlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0uIFRoZSBlbnRpcmUgY29udGVudCBpc1xuICogY29waWVkIHVuY2hhbmdlZCBpbnRvIHRoZSBQVkMgdGhhdCBnZXRzIGNyZWF0ZWQgZnJvbSB0aGlzXG4gKiB0ZW1wbGF0ZS4gVGhlIHNhbWUgZmllbGRzIGFzIGluIGEgUGVyc2lzdGVudFZvbHVtZUNsYWltXG4gKiBhcmUgYWxzbyB2YWxpZCBoZXJlLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlYyB7XG4gIC8qKlxuICAgKiBhY2Nlc3NNb2RlcyBjb250YWlucyB0aGUgZGVzaXJlZCBhY2Nlc3MgbW9kZXMgdGhlIHZvbHVtZSBzaG91bGQgaGF2ZS5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3BlcnNpc3RlbnQtdm9sdW1lcyNhY2Nlc3MtbW9kZXMtMVxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjI2FjY2Vzc01vZGVzXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NNb2Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBkYXRhU291cmNlIGZpZWxkIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZWl0aGVyOlxuICAgKiAqIEFuIGV4aXN0aW5nIFZvbHVtZVNuYXBzaG90IG9iamVjdCAoc25hcHNob3Quc3RvcmFnZS5rOHMuaW8vVm9sdW1lU25hcHNob3QpXG4gICAqICogQW4gZXhpc3RpbmcgUFZDIChQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0pXG4gICAqIElmIHRoZSBwcm92aXNpb25lciBvciBhbiBleHRlcm5hbCBjb250cm9sbGVyIGNhbiBzdXBwb3J0IHRoZSBzcGVjaWZpZWQgZGF0YSBzb3VyY2UsXG4gICAqIGl0IHdpbGwgY3JlYXRlIGEgbmV3IHZvbHVtZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBkYXRhIHNvdXJjZS5cbiAgICogV2hlbiB0aGUgQW55Vm9sdW1lRGF0YVNvdXJjZSBmZWF0dXJlIGdhdGUgaXMgZW5hYmxlZCwgZGF0YVNvdXJjZSBjb250ZW50cyB3aWxsIGJlIGNvcGllZCB0byBkYXRhU291cmNlUmVmLFxuICAgKiBhbmQgZGF0YVNvdXJjZVJlZiBjb250ZW50cyB3aWxsIGJlIGNvcGllZCB0byBkYXRhU291cmNlIHdoZW4gZGF0YVNvdXJjZVJlZi5uYW1lc3BhY2UgaXMgbm90IHNwZWNpZmllZC5cbiAgICogSWYgdGhlIG5hbWVzcGFjZSBpcyBzcGVjaWZpZWQsIHRoZW4gZGF0YVNvdXJjZVJlZiB3aWxsIG5vdCBiZSBjb3BpZWQgdG8gZGF0YVNvdXJjZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlYyNkYXRhU291cmNlXG4gICAqL1xuICByZWFkb25seSBkYXRhU291cmNlPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNEYXRhU291cmNlO1xuXG4gIC8qKlxuICAgKiBkYXRhU291cmNlUmVmIHNwZWNpZmllcyB0aGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gcG9wdWxhdGUgdGhlIHZvbHVtZSB3aXRoIGRhdGEsIGlmIGEgbm9uLWVtcHR5XG4gICAqIHZvbHVtZSBpcyBkZXNpcmVkLiBUaGlzIG1heSBiZSBhbnkgb2JqZWN0IGZyb20gYSBub24tZW1wdHkgQVBJIGdyb3VwIChub25cbiAgICogY29yZSBvYmplY3QpIG9yIGEgUGVyc2lzdGVudFZvbHVtZUNsYWltIG9iamVjdC5cbiAgICogV2hlbiB0aGlzIGZpZWxkIGlzIHNwZWNpZmllZCwgdm9sdW1lIGJpbmRpbmcgd2lsbCBvbmx5IHN1Y2NlZWQgaWYgdGhlIHR5cGUgb2ZcbiAgICogdGhlIHNwZWNpZmllZCBvYmplY3QgbWF0Y2hlcyBzb21lIGluc3RhbGxlZCB2b2x1bWUgcG9wdWxhdG9yIG9yIGR5bmFtaWNcbiAgICogcHJvdmlzaW9uZXIuXG4gICAqIFRoaXMgZmllbGQgd2lsbCByZXBsYWNlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBkYXRhU291cmNlIGZpZWxkIGFuZCBhcyBzdWNoXG4gICAqIGlmIGJvdGggZmllbGRzIGFyZSBub24tZW1wdHksIHRoZXkgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlLiBGb3IgYmFja3dhcmRzXG4gICAqIGNvbXBhdGliaWxpdHksIHdoZW4gbmFtZXNwYWNlIGlzbid0IHNwZWNpZmllZCBpbiBkYXRhU291cmNlUmVmLFxuICAgKiBib3RoIGZpZWxkcyAoZGF0YVNvdXJjZSBhbmQgZGF0YVNvdXJjZVJlZikgd2lsbCBiZSBzZXQgdG8gdGhlIHNhbWVcbiAgICogdmFsdWUgYXV0b21hdGljYWxseSBpZiBvbmUgb2YgdGhlbSBpcyBlbXB0eSBhbmQgdGhlIG90aGVyIGlzIG5vbi1lbXB0eS5cbiAgICogV2hlbiBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkIGluIGRhdGFTb3VyY2VSZWYsXG4gICAqIGRhdGFTb3VyY2UgaXNuJ3Qgc2V0IHRvIHRoZSBzYW1lIHZhbHVlIGFuZCBtdXN0IGJlIGVtcHR5LlxuICAgKiBUaGVyZSBhcmUgdGhyZWUgaW1wb3J0YW50IGRpZmZlcmVuY2VzIGJldHdlZW4gZGF0YVNvdXJjZSBhbmQgZGF0YVNvdXJjZVJlZjpcbiAgICogKiBXaGlsZSBkYXRhU291cmNlIG9ubHkgYWxsb3dzIHR3byBzcGVjaWZpYyB0eXBlcyBvZiBvYmplY3RzLCBkYXRhU291cmNlUmVmXG4gICAqIGFsbG93cyBhbnkgbm9uLWNvcmUgb2JqZWN0LCBhcyB3ZWxsIGFzIFBlcnNpc3RlbnRWb2x1bWVDbGFpbSBvYmplY3RzLlxuICAgKiAqIFdoaWxlIGRhdGFTb3VyY2UgaWdub3JlcyBkaXNhbGxvd2VkIHZhbHVlcyAoZHJvcHBpbmcgdGhlbSksIGRhdGFTb3VyY2VSZWZcbiAgICogcHJlc2VydmVzIGFsbCB2YWx1ZXMsIGFuZCBnZW5lcmF0ZXMgYW4gZXJyb3IgaWYgYSBkaXNhbGxvd2VkIHZhbHVlIGlzXG4gICAqIHNwZWNpZmllZC5cbiAgICogKiBXaGlsZSBkYXRhU291cmNlIG9ubHkgYWxsb3dzIGxvY2FsIG9iamVjdHMsIGRhdGFTb3VyY2VSZWYgYWxsb3dzIG9iamVjdHNcbiAgICogaW4gYW55IG5hbWVzcGFjZXMuXG4gICAqIChCZXRhKSBVc2luZyB0aGlzIGZpZWxkIHJlcXVpcmVzIHRoZSBBbnlWb2x1bWVEYXRhU291cmNlIGZlYXR1cmUgZ2F0ZSB0byBiZSBlbmFibGVkLlxuICAgKiAoQWxwaGEpIFVzaW5nIHRoZSBuYW1lc3BhY2UgZmllbGQgb2YgZGF0YVNvdXJjZVJlZiByZXF1aXJlcyB0aGUgQ3Jvc3NOYW1lc3BhY2VWb2x1bWVEYXRhU291cmNlIGZlYXR1cmUgZ2F0ZSB0byBiZSBlbmFibGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjI2RhdGFTb3VyY2VSZWZcbiAgICovXG4gIHJlYWRvbmx5IGRhdGFTb3VyY2VSZWY/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY0RhdGFTb3VyY2VSZWY7XG5cbiAgLyoqXG4gICAqIHJlc291cmNlcyByZXByZXNlbnRzIHRoZSBtaW5pbXVtIHJlc291cmNlcyB0aGUgdm9sdW1lIHNob3VsZCBoYXZlLlxuICAgKiBVc2VycyBhcmUgYWxsb3dlZCB0byBzcGVjaWZ5IHJlc291cmNlIHJlcXVpcmVtZW50c1xuICAgKiB0aGF0IGFyZSBsb3dlciB0aGFuIHByZXZpb3VzIHZhbHVlIGJ1dCBtdXN0IHN0aWxsIGJlIGhpZ2hlciB0aGFuIGNhcGFjaXR5IHJlY29yZGVkIGluIHRoZVxuICAgKiBzdGF0dXMgZmllbGQgb2YgdGhlIGNsYWltLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2UvcGVyc2lzdGVudC12b2x1bWVzI3Jlc291cmNlc1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjI3Jlc291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VzPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNSZXNvdXJjZXM7XG5cbiAgLyoqXG4gICAqIHNlbGVjdG9yIGlzIGEgbGFiZWwgcXVlcnkgb3ZlciB2b2x1bWVzIHRvIGNvbnNpZGVyIGZvciBiaW5kaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjI3NlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBzZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIHN0b3JhZ2VDbGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIFN0b3JhZ2VDbGFzcyByZXF1aXJlZCBieSB0aGUgY2xhaW0uXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS9wZXJzaXN0ZW50LXZvbHVtZXMjY2xhc3MtMVxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjI3N0b3JhZ2VDbGFzc05hbWVcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2VDbGFzc05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZvbHVtZUF0dHJpYnV0ZXNDbGFzc05hbWUgbWF5IGJlIHVzZWQgdG8gc2V0IHRoZSBWb2x1bWVBdHRyaWJ1dGVzQ2xhc3MgdXNlZCBieSB0aGlzIGNsYWltLlxuICAgKiBJZiBzcGVjaWZpZWQsIHRoZSBDU0kgZHJpdmVyIHdpbGwgY3JlYXRlIG9yIHVwZGF0ZSB0aGUgdm9sdW1lIHdpdGggdGhlIGF0dHJpYnV0ZXMgZGVmaW5lZFxuICAgKiBpbiB0aGUgY29ycmVzcG9uZGluZyBWb2x1bWVBdHRyaWJ1dGVzQ2xhc3MuIFRoaXMgaGFzIGEgZGlmZmVyZW50IHB1cnBvc2UgdGhhbiBzdG9yYWdlQ2xhc3NOYW1lLFxuICAgKiBpdCBjYW4gYmUgY2hhbmdlZCBhZnRlciB0aGUgY2xhaW0gaXMgY3JlYXRlZC4gQW4gZW1wdHkgc3RyaW5nIG9yIG5pbCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBub1xuICAgKiBWb2x1bWVBdHRyaWJ1dGVzQ2xhc3Mgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBjbGFpbS4gSWYgdGhlIGNsYWltIGVudGVycyBhbiBJbmZlYXNpYmxlIGVycm9yIHN0YXRlLFxuICAgKiB0aGlzIGZpZWxkIGNhbiBiZSByZXNldCB0byBpdHMgcHJldmlvdXMgdmFsdWUgKGluY2x1ZGluZyBuaWwpIHRvIGNhbmNlbCB0aGUgbW9kaWZpY2F0aW9uLlxuICAgKiBJZiB0aGUgcmVzb3VyY2UgcmVmZXJyZWQgdG8gYnkgdm9sdW1lQXR0cmlidXRlc0NsYXNzIGRvZXMgbm90IGV4aXN0LCB0aGlzIFBlcnNpc3RlbnRWb2x1bWVDbGFpbSB3aWxsIGJlXG4gICAqIHNldCB0byBhIFBlbmRpbmcgc3RhdGUsIGFzIHJlZmxlY3RlZCBieSB0aGUgbW9kaWZ5Vm9sdW1lU3RhdHVzIGZpZWxkLCB1bnRpbCBzdWNoIGFzIGEgcmVzb3VyY2VcbiAgICogZXhpc3RzLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lLWF0dHJpYnV0ZXMtY2xhc3Nlcy9cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlYyN2b2x1bWVBdHRyaWJ1dGVzQ2xhc3NOYW1lXG4gICAqL1xuICByZWFkb25seSB2b2x1bWVBdHRyaWJ1dGVzQ2xhc3NOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2b2x1bWVNb2RlIGRlZmluZXMgd2hhdCB0eXBlIG9mIHZvbHVtZSBpcyByZXF1aXJlZCBieSB0aGUgY2xhaW0uXG4gICAqIFZhbHVlIG9mIEZpbGVzeXN0ZW0gaXMgaW1wbGllZCB3aGVuIG5vdCBpbmNsdWRlZCBpbiBjbGFpbSBzcGVjLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjI3ZvbHVtZU1vZGVcbiAgICovXG4gIHJlYWRvbmx5IHZvbHVtZU1vZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZvbHVtZU5hbWUgaXMgdGhlIGJpbmRpbmcgcmVmZXJlbmNlIHRvIHRoZSBQZXJzaXN0ZW50Vm9sdW1lIGJhY2tpbmcgdGhpcyBjbGFpbS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlYyN2b2x1bWVOYW1lXG4gICAqL1xuICByZWFkb25seSB2b2x1bWVOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlYycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlYyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWNjZXNzTW9kZXMnOiBvYmouYWNjZXNzTW9kZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdkYXRhU291cmNlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjRGF0YVNvdXJjZShvYmouZGF0YVNvdXJjZSksXG4gICAgJ2RhdGFTb3VyY2VSZWYnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNEYXRhU291cmNlUmVmKG9iai5kYXRhU291cmNlUmVmKSxcbiAgICAncmVzb3VyY2VzJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjUmVzb3VyY2VzKG9iai5yZXNvdXJjZXMpLFxuICAgICdzZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY1NlbGVjdG9yKG9iai5zZWxlY3RvciksXG4gICAgJ3N0b3JhZ2VDbGFzc05hbWUnOiBvYmouc3RvcmFnZUNsYXNzTmFtZSxcbiAgICAndm9sdW1lQXR0cmlidXRlc0NsYXNzTmFtZSc6IG9iai52b2x1bWVBdHRyaWJ1dGVzQ2xhc3NOYW1lLFxuICAgICd2b2x1bWVNb2RlJzogb2JqLnZvbHVtZU1vZGUsXG4gICAgJ3ZvbHVtZU5hbWUnOiBvYmoudm9sdW1lTmFtZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIENsdXN0ZXJUcnVzdEJ1bmRsZSBhbGxvd3MgYSBwb2QgdG8gYWNjZXNzIHRoZSBgLnNwZWMudHJ1c3RCdW5kbGVgIGZpZWxkXG4gKiBvZiBDbHVzdGVyVHJ1c3RCdW5kbGUgb2JqZWN0cyBpbiBhbiBhdXRvLXVwZGF0aW5nIGZpbGUuXG4gKlxuICogQWxwaGEsIGdhdGVkIGJ5IHRoZSBDbHVzdGVyVHJ1c3RCdW5kbGVQcm9qZWN0aW9uIGZlYXR1cmUgZ2F0ZS5cbiAqXG4gKiBDbHVzdGVyVHJ1c3RCdW5kbGUgb2JqZWN0cyBjYW4gZWl0aGVyIGJlIHNlbGVjdGVkIGJ5IG5hbWUsIG9yIGJ5IHRoZVxuICogY29tYmluYXRpb24gb2Ygc2lnbmVyIG5hbWUgYW5kIGEgbGFiZWwgc2VsZWN0b3IuXG4gKlxuICogS3ViZWxldCBwZXJmb3JtcyBhZ2dyZXNzaXZlIG5vcm1hbGl6YXRpb24gb2YgdGhlIFBFTSBjb250ZW50cyB3cml0dGVuXG4gKiBpbnRvIHRoZSBwb2QgZmlsZXN5c3RlbS4gIEVzb3RlcmljIFBFTSBmZWF0dXJlcyBzdWNoIGFzIGludGVyLWJsb2NrXG4gKiBjb21tZW50cyBhbmQgYmxvY2sgaGVhZGVycyBhcmUgc3RyaXBwZWQuICBDZXJ0aWZpY2F0ZXMgYXJlIGRlZHVwbGljYXRlZC5cbiAqIFRoZSBvcmRlcmluZyBvZiBjZXJ0aWZpY2F0ZXMgd2l0aGluIHRoZSBmaWxlIGlzIGFyYml0cmFyeSwgYW5kIEt1YmVsZXRcbiAqIG1heSBjaGFuZ2UgdGhlIG9yZGVyIG92ZXIgdGltZS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNDbHVzdGVyVHJ1c3RCdW5kbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ2x1c3RlclRydXN0QnVuZGxlIHtcbiAgLyoqXG4gICAqIFNlbGVjdCBhbGwgQ2x1c3RlclRydXN0QnVuZGxlcyB0aGF0IG1hdGNoIHRoaXMgbGFiZWwgc2VsZWN0b3IuICBPbmx5IGhhc1xuICAgKiBlZmZlY3QgaWYgc2lnbmVyTmFtZSBpcyBzZXQuICBNdXR1YWxseS1leGNsdXNpdmUgd2l0aCBuYW1lLiAgSWYgdW5zZXQsXG4gICAqIGludGVycHJldGVkIGFzIFwibWF0Y2ggbm90aGluZ1wiLiAgSWYgc2V0IGJ1dCBlbXB0eSwgaW50ZXJwcmV0ZWQgYXMgXCJtYXRjaFxuICAgKiBldmVyeXRoaW5nXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NsdXN0ZXJUcnVzdEJ1bmRsZSNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NsdXN0ZXJUcnVzdEJ1bmRsZUxhYmVsU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhIHNpbmdsZSBDbHVzdGVyVHJ1c3RCdW5kbGUgYnkgb2JqZWN0IG5hbWUuICBNdXR1YWxseS1leGNsdXNpdmVcbiAgICogd2l0aCBzaWduZXJOYW1lIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNDbHVzdGVyVHJ1c3RCdW5kbGUjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgZG9uJ3QgYmxvY2sgcG9kIHN0YXJ0dXAgaWYgdGhlIHJlZmVyZW5jZWQgQ2x1c3RlclRydXN0QnVuZGxlKHMpXG4gICAqIGFyZW4ndCBhdmFpbGFibGUuICBJZiB1c2luZyBuYW1lLCB0aGVuIHRoZSBuYW1lZCBDbHVzdGVyVHJ1c3RCdW5kbGUgaXNcbiAgICogYWxsb3dlZCBub3QgdG8gZXhpc3QuICBJZiB1c2luZyBzaWduZXJOYW1lLCB0aGVuIHRoZSBjb21iaW5hdGlvbiBvZlxuICAgKiBzaWduZXJOYW1lIGFuZCBsYWJlbFNlbGVjdG9yIGlzIGFsbG93ZWQgdG8gbWF0Y2ggemVyb1xuICAgKiBDbHVzdGVyVHJ1c3RCdW5kbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNDbHVzdGVyVHJ1c3RCdW5kbGUjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVsYXRpdmUgcGF0aCBmcm9tIHRoZSB2b2x1bWUgcm9vdCB0byB3cml0ZSB0aGUgYnVuZGxlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNDbHVzdGVyVHJ1c3RCdW5kbGUjcGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWxlY3QgYWxsIENsdXN0ZXJUcnVzdEJ1bmRsZXMgdGhhdCBtYXRjaCB0aGlzIHNpZ25lciBuYW1lLlxuICAgKiBNdXR1YWxseS1leGNsdXNpdmUgd2l0aCBuYW1lLiAgVGhlIGNvbnRlbnRzIG9mIGFsbCBzZWxlY3RlZFxuICAgKiBDbHVzdGVyVHJ1c3RCdW5kbGVzIHdpbGwgYmUgdW5pZmllZCBhbmQgZGVkdXBsaWNhdGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNDbHVzdGVyVHJ1c3RCdW5kbGUjc2lnbmVyTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmVyTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NsdXN0ZXJUcnVzdEJ1bmRsZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ2x1c3RlclRydXN0QnVuZGxlKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NsdXN0ZXJUcnVzdEJ1bmRsZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2xhYmVsU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NsdXN0ZXJUcnVzdEJ1bmRsZUxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ29wdGlvbmFsJzogb2JqLm9wdGlvbmFsLFxuICAgICdwYXRoJzogb2JqLnBhdGgsXG4gICAgJ3NpZ25lck5hbWUnOiBvYmouc2lnbmVyTmFtZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNvbmZpZ01hcCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29uZmlnTWFwIGRhdGEgdG8gcHJvamVjdFxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NvbmZpZ01hcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNDb25maWdNYXAge1xuICAvKipcbiAgICogaXRlbXMgaWYgdW5zcGVjaWZpZWQsIGVhY2gga2V5LXZhbHVlIHBhaXIgaW4gdGhlIERhdGEgZmllbGQgb2YgdGhlIHJlZmVyZW5jZWRcbiAgICogQ29uZmlnTWFwIHdpbGwgYmUgcHJvamVjdGVkIGludG8gdGhlIHZvbHVtZSBhcyBhIGZpbGUgd2hvc2UgbmFtZSBpcyB0aGVcbiAgICoga2V5IGFuZCBjb250ZW50IGlzIHRoZSB2YWx1ZS4gSWYgc3BlY2lmaWVkLCB0aGUgbGlzdGVkIGtleXMgd2lsbCBiZVxuICAgKiBwcm9qZWN0ZWQgaW50byB0aGUgc3BlY2lmaWVkIHBhdGhzLCBhbmQgdW5saXN0ZWQga2V5cyB3aWxsIG5vdCBiZVxuICAgKiBwcmVzZW50LiBJZiBhIGtleSBpcyBzcGVjaWZpZWQgd2hpY2ggaXMgbm90IHByZXNlbnQgaW4gdGhlIENvbmZpZ01hcCxcbiAgICogdGhlIHZvbHVtZSBzZXR1cCB3aWxsIGVycm9yIHVubGVzcyBpdCBpcyBtYXJrZWQgb3B0aW9uYWwuIFBhdGhzIG11c3QgYmVcbiAgICogcmVsYXRpdmUgYW5kIG1heSBub3QgY29udGFpbiB0aGUgJy4uJyBwYXRoIG9yIHN0YXJ0IHdpdGggJy4uJy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ29uZmlnTWFwI2l0ZW1zXG4gICAqL1xuICByZWFkb25seSBpdGVtcz86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNDb25maWdNYXBJdGVtc1tdO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ29uZmlnTWFwI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wdGlvbmFsIHNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXlzIG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NvbmZpZ01hcCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ29uZmlnTWFwKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2l0ZW1zJzogb2JqLml0ZW1zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NvbmZpZ01hcEl0ZW1zKHkpKSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGRvd253YXJkQVBJIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkb3dud2FyZEFQSSBkYXRhIHRvIHByb2plY3RcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaSB7XG4gIC8qKlxuICAgKiBJdGVtcyBpcyBhIGxpc3Qgb2YgRG93bndhcmRBUElWb2x1bWUgZmlsZVxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaSNpdGVtc1xuICAgKi9cbiAgcmVhZG9ubHkgaXRlbXM/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzRG93bndhcmRBcGlJdGVtc1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzRG93bndhcmRBcGknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnaXRlbXMnOiBvYmouaXRlbXM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzRG93bndhcmRBcGlJdGVtcyh5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBQcm9qZWN0cyBhbiBhdXRvLXJvdGF0aW5nIGNyZWRlbnRpYWwgYnVuZGxlIChwcml2YXRlIGtleSBhbmQgY2VydGlmaWNhdGVcbiAqIGNoYWluKSB0aGF0IHRoZSBwb2QgY2FuIHVzZSBlaXRoZXIgYXMgYSBUTFMgY2xpZW50IG9yIHNlcnZlci5cbiAqXG4gKiBLdWJlbGV0IGdlbmVyYXRlcyBhIHByaXZhdGUga2V5IGFuZCB1c2VzIGl0IHRvIHNlbmQgYVxuICogUG9kQ2VydGlmaWNhdGVSZXF1ZXN0IHRvIHRoZSBuYW1lZCBzaWduZXIuICBPbmNlIHRoZSBzaWduZXIgYXBwcm92ZXMgdGhlXG4gKiByZXF1ZXN0IGFuZCBpc3N1ZXMgYSBjZXJ0aWZpY2F0ZSBjaGFpbiwgS3ViZWxldCB3cml0ZXMgdGhlIGtleSBhbmRcbiAqIGNlcnRpZmljYXRlIGNoYWluIHRvIHRoZSBwb2QgZmlsZXN5c3RlbS4gIFRoZSBwb2QgZG9lcyBub3Qgc3RhcnQgdW50aWxcbiAqIGNlcnRpZmljYXRlcyBoYXZlIGJlZW4gaXNzdWVkIGZvciBlYWNoIHBvZENlcnRpZmljYXRlIHByb2plY3RlZCB2b2x1bWVcbiAqIHNvdXJjZSBpbiBpdHMgc3BlYy5cbiAqXG4gKiBLdWJlbGV0IHdpbGwgYmVnaW4gdHJ5aW5nIHRvIHJvdGF0ZSB0aGUgY2VydGlmaWNhdGUgYXQgdGhlIHRpbWUgaW5kaWNhdGVkXG4gKiBieSB0aGUgc2lnbmVyIHVzaW5nIHRoZSBQb2RDZXJ0aWZpY2F0ZVJlcXVlc3QuU3RhdHVzLkJlZ2luUmVmcmVzaEF0XG4gKiB0aW1lc3RhbXAuXG4gKlxuICogS3ViZWxldCBjYW4gd3JpdGUgYSBzaW5nbGUgZmlsZSwgaW5kaWNhdGVkIGJ5IHRoZSBjcmVkZW50aWFsQnVuZGxlUGF0aFxuICogZmllbGQsIG9yIHNlcGFyYXRlIGZpbGVzLCBpbmRpY2F0ZWQgYnkgdGhlIGtleVBhdGggYW5kXG4gKiBjZXJ0aWZpY2F0ZUNoYWluUGF0aCBmaWVsZHMuXG4gKlxuICogVGhlIGNyZWRlbnRpYWwgYnVuZGxlIGlzIGEgc2luZ2xlIGZpbGUgaW4gUEVNIGZvcm1hdC4gIFRoZSBmaXJzdCBQRU1cbiAqIGVudHJ5IGlzIHRoZSBwcml2YXRlIGtleSAoaW4gUEtDUyM4IGZvcm1hdCksIGFuZCB0aGUgcmVtYWluaW5nIFBFTVxuICogZW50cmllcyBhcmUgdGhlIGNlcnRpZmljYXRlIGNoYWluIGlzc3VlZCBieSB0aGUgc2lnbmVyICh0eXBpY2FsbHksXG4gKiBzaWduZXJzIHdpbGwgcmV0dXJuIHRoZWlyIGNlcnRpZmljYXRlIGNoYWluIGluIGxlYWYtdG8tcm9vdCBvcmRlcikuXG4gKlxuICogUHJlZmVyIHVzaW5nIHRoZSBjcmVkZW50aWFsIGJ1bmRsZSBmb3JtYXQsIHNpbmNlIHlvdXIgYXBwbGljYXRpb24gY29kZVxuICogY2FuIHJlYWQgaXQgYXRvbWljYWxseS4gIElmIHlvdSB1c2Uga2V5UGF0aCBhbmQgY2VydGlmaWNhdGVDaGFpblBhdGgsXG4gKiB5b3VyIGFwcGxpY2F0aW9uIG11c3QgbWFrZSB0d28gc2VwYXJhdGUgZmlsZSByZWFkcy4gSWYgdGhlc2UgY29pbmNpZGVcbiAqIHdpdGggYSBjZXJ0aWZpY2F0ZSByb3RhdGlvbiwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgcHJpdmF0ZSBrZXkgYW5kIGxlYWZcbiAqIGNlcnRpZmljYXRlIHlvdSByZWFkIG1heSBub3QgY29ycmVzcG9uZCB0byBlYWNoIG90aGVyLiAgWW91ciBhcHBsaWNhdGlvblxuICogd2lsbCBuZWVkIHRvIGNoZWNrIGZvciB0aGlzIGNvbmRpdGlvbiwgYW5kIHJlLXJlYWQgdW50aWwgdGhleSBhcmVcbiAqIGNvbnNpc3RlbnQuXG4gKlxuICogVGhlIG5hbWVkIHNpZ25lciBjb250cm9scyBjaG9vc2VzIHRoZSBmb3JtYXQgb2YgdGhlIGNlcnRpZmljYXRlIGl0XG4gKiBpc3N1ZXM7IGNvbnN1bHQgdGhlIHNpZ25lciBpbXBsZW1lbnRhdGlvbidzIGRvY3VtZW50YXRpb24gdG8gbGVhcm4gaG93IHRvXG4gKiB1c2UgdGhlIGNlcnRpZmljYXRlcyBpdCBpc3N1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzUG9kQ2VydGlmaWNhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzUG9kQ2VydGlmaWNhdGUge1xuICAvKipcbiAgICogV3JpdGUgdGhlIGNlcnRpZmljYXRlIGNoYWluIGF0IHRoaXMgcGF0aCBpbiB0aGUgcHJvamVjdGVkIHZvbHVtZS5cbiAgICpcbiAgICogTW9zdCBhcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSBjcmVkZW50aWFsQnVuZGxlUGF0aC4gIFdoZW4gdXNpbmcga2V5UGF0aFxuICAgKiBhbmQgY2VydGlmaWNhdGVDaGFpblBhdGgsIHlvdXIgYXBwbGljYXRpb24gbmVlZHMgdG8gY2hlY2sgdGhhdCB0aGUga2V5XG4gICAqIGFuZCBsZWFmIGNlcnRpZmljYXRlIGFyZSBjb25zaXN0ZW50LCBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlIHRvIHJlYWQgdGhlXG4gICAqIGZpbGVzIG1pZC1yb3RhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzUG9kQ2VydGlmaWNhdGUjY2VydGlmaWNhdGVDaGFpblBhdGhcbiAgICovXG4gIHJlYWRvbmx5IGNlcnRpZmljYXRlQ2hhaW5QYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXcml0ZSB0aGUgY3JlZGVudGlhbCBidW5kbGUgYXQgdGhpcyBwYXRoIGluIHRoZSBwcm9qZWN0ZWQgdm9sdW1lLlxuICAgKlxuICAgKiBUaGUgY3JlZGVudGlhbCBidW5kbGUgaXMgYSBzaW5nbGUgZmlsZSB0aGF0IGNvbnRhaW5zIG11bHRpcGxlIFBFTSBibG9ja3MuXG4gICAqIFRoZSBmaXJzdCBQRU0gYmxvY2sgaXMgYSBQUklWQVRFIEtFWSBibG9jaywgY29udGFpbmluZyBhIFBLQ1MjOCBwcml2YXRlXG4gICAqIGtleS5cbiAgICpcbiAgICogVGhlIHJlbWFpbmluZyBibG9ja3MgYXJlIENFUlRJRklDQVRFIGJsb2NrcywgY29udGFpbmluZyB0aGUgaXNzdWVkXG4gICAqIGNlcnRpZmljYXRlIGNoYWluIGZyb20gdGhlIHNpZ25lciAobGVhZiBhbmQgYW55IGludGVybWVkaWF0ZXMpLlxuICAgKlxuICAgKiBVc2luZyBjcmVkZW50aWFsQnVuZGxlUGF0aCBsZXRzIHlvdXIgUG9kJ3MgYXBwbGljYXRpb24gY29kZSBtYWtlIGEgc2luZ2xlXG4gICAqIGF0b21pYyByZWFkIHRoYXQgcmV0cmlldmVzIGEgY29uc2lzdGVudCBrZXkgYW5kIGNlcnRpZmljYXRlIGNoYWluLiAgSWYgeW91XG4gICAqIHByb2plY3QgdGhlbSB0byBzZXBhcmF0ZSBmaWxlcywgeW91ciBhcHBsaWNhdGlvbiBjb2RlIHdpbGwgbmVlZCB0b1xuICAgKiBhZGRpdGlvbmFsbHkgY2hlY2sgdGhhdCB0aGUgbGVhZiBjZXJ0aWZpY2F0ZSB3YXMgaXNzdWVkIHRvIHRoZSBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1BvZENlcnRpZmljYXRlI2NyZWRlbnRpYWxCdW5kbGVQYXRoXG4gICAqL1xuICByZWFkb25seSBjcmVkZW50aWFsQnVuZGxlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGUgdGhlIGtleSBhdCB0aGlzIHBhdGggaW4gdGhlIHByb2plY3RlZCB2b2x1bWUuXG4gICAqXG4gICAqIE1vc3QgYXBwbGljYXRpb25zIHNob3VsZCB1c2UgY3JlZGVudGlhbEJ1bmRsZVBhdGguICBXaGVuIHVzaW5nIGtleVBhdGhcbiAgICogYW5kIGNlcnRpZmljYXRlQ2hhaW5QYXRoLCB5b3VyIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGNoZWNrIHRoYXQgdGhlIGtleVxuICAgKiBhbmQgbGVhZiBjZXJ0aWZpY2F0ZSBhcmUgY29uc2lzdGVudCwgYmVjYXVzZSBpdCBpcyBwb3NzaWJsZSB0byByZWFkIHRoZVxuICAgKiBmaWxlcyBtaWQtcm90YXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1BvZENlcnRpZmljYXRlI2tleVBhdGhcbiAgICovXG4gIHJlYWRvbmx5IGtleVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGtleXBhaXIgS3ViZWxldCB3aWxsIGdlbmVyYXRlIGZvciB0aGUgcG9kLlxuICAgKlxuICAgKiBWYWxpZCB2YWx1ZXMgYXJlIFwiUlNBMzA3MlwiLCBcIlJTQTQwOTZcIiwgXCJFQ0RTQVAyNTZcIiwgXCJFQ0RTQVAzODRcIixcbiAgICogXCJFQ0RTQVA1MjFcIiwgYW5kIFwiRUQyNTUxOVwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNQb2RDZXJ0aWZpY2F0ZSNrZXlUeXBlXG4gICAqL1xuICByZWFkb25seSBrZXlUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG1heEV4cGlyYXRpb25TZWNvbmRzIGlzIHRoZSBtYXhpbXVtIGxpZmV0aW1lIHBlcm1pdHRlZCBmb3IgdGhlXG4gICAqIGNlcnRpZmljYXRlLlxuICAgKlxuICAgKiBLdWJlbGV0IGNvcGllcyB0aGlzIHZhbHVlIHZlcmJhdGltIGludG8gdGhlIFBvZENlcnRpZmljYXRlUmVxdWVzdHMgaXRcbiAgICogZ2VuZXJhdGVzIGZvciB0aGlzIHByb2plY3Rpb24uXG4gICAqXG4gICAqIElmIG9taXR0ZWQsIGt1YmUtYXBpc2VydmVyIHdpbGwgc2V0IGl0IHRvIDg2NDAwKDI0IGhvdXJzKS4ga3ViZS1hcGlzZXJ2ZXJcbiAgICogd2lsbCByZWplY3QgdmFsdWVzIHNob3J0ZXIgdGhhbiAzNjAwICgxIGhvdXIpLiAgVGhlIG1heGltdW0gYWxsb3dhYmxlXG4gICAqIHZhbHVlIGlzIDc4NjI0MDAgKDkxIGRheXMpLlxuICAgKlxuICAgKiBUaGUgc2lnbmVyIGltcGxlbWVudGF0aW9uIGlzIHRoZW4gZnJlZSB0byBpc3N1ZSBhIGNlcnRpZmljYXRlIHdpdGggYW55XG4gICAqIGxpZmV0aW1lICpzaG9ydGVyKiB0aGFuIE1heEV4cGlyYXRpb25TZWNvbmRzLCBidXQgbm8gc2hvcnRlciB0aGFuIDM2MDBcbiAgICogc2Vjb25kcyAoMSBob3VyKS4gIFRoaXMgY29uc3RyYWludCBpcyBlbmZvcmNlZCBieSBrdWJlLWFwaXNlcnZlci5cbiAgICogYGt1YmVybmV0ZXMuaW9gIHNpZ25lcnMgd2lsbCBuZXZlciBpc3N1ZSBjZXJ0aWZpY2F0ZXMgd2l0aCBhIGxpZmV0aW1lXG4gICAqIGxvbmdlciB0aGFuIDI0IGhvdXJzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNQb2RDZXJ0aWZpY2F0ZSNtYXhFeHBpcmF0aW9uU2Vjb25kc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4RXhwaXJhdGlvblNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEt1YmVsZXQncyBnZW5lcmF0ZWQgQ1NScyB3aWxsIGJlIGFkZHJlc3NlZCB0byB0aGlzIHNpZ25lci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzUG9kQ2VydGlmaWNhdGUjc2lnbmVyTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmVyTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB1c2VyQW5ub3RhdGlvbnMgYWxsb3cgcG9kIGF1dGhvcnMgdG8gcGFzcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvXG4gICAqIHRoZSBzaWduZXIgaW1wbGVtZW50YXRpb24uICBLdWJlcm5ldGVzIGRvZXMgbm90IHJlc3RyaWN0IG9yIHZhbGlkYXRlIHRoaXNcbiAgICogbWV0YWRhdGEgaW4gYW55IHdheS5cbiAgICpcbiAgICogVGhlc2UgdmFsdWVzIGFyZSBjb3BpZWQgdmVyYmF0aW0gaW50byB0aGUgYHNwZWMudW52ZXJpZmllZFVzZXJBbm5vdGF0aW9uc2AgZmllbGQgb2ZcbiAgICogdGhlIFBvZENlcnRpZmljYXRlUmVxdWVzdCBvYmplY3RzIHRoYXQgS3ViZWxldCBjcmVhdGVzLlxuICAgKlxuICAgKiBFbnRyaWVzIGFyZSBzdWJqZWN0IHRvIHRoZSBzYW1lIHZhbGlkYXRpb24gYXMgb2JqZWN0IG1ldGFkYXRhIGFubm90YXRpb25zLFxuICAgKiB3aXRoIHRoZSBhZGRpdGlvbiB0aGF0IGFsbCBrZXlzIG11c3QgYmUgZG9tYWluLXByZWZpeGVkLiBObyByZXN0cmljdGlvbnNcbiAgICogYXJlIHBsYWNlZCBvbiB2YWx1ZXMsIGV4Y2VwdCBhbiBvdmVyYWxsIHNpemUgbGltaXRhdGlvbiBvbiB0aGUgZW50aXJlIGZpZWxkLlxuICAgKlxuICAgKiBTaWduZXJzIHNob3VsZCBkb2N1bWVudCB0aGUga2V5cyBhbmQgdmFsdWVzIHRoZXkgc3VwcG9ydC4gU2lnbmVycyBzaG91bGRcbiAgICogZGVueSByZXF1ZXN0cyB0aGF0IGNvbnRhaW4ga2V5cyB0aGV5IGRvIG5vdCByZWNvZ25pemUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1BvZENlcnRpZmljYXRlI3VzZXJBbm5vdGF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlckFubm90YXRpb25zPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1BvZENlcnRpZmljYXRlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNQb2RDZXJ0aWZpY2F0ZShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNQb2RDZXJ0aWZpY2F0ZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2NlcnRpZmljYXRlQ2hhaW5QYXRoJzogb2JqLmNlcnRpZmljYXRlQ2hhaW5QYXRoLFxuICAgICdjcmVkZW50aWFsQnVuZGxlUGF0aCc6IG9iai5jcmVkZW50aWFsQnVuZGxlUGF0aCxcbiAgICAna2V5UGF0aCc6IG9iai5rZXlQYXRoLFxuICAgICdrZXlUeXBlJzogb2JqLmtleVR5cGUsXG4gICAgJ21heEV4cGlyYXRpb25TZWNvbmRzJzogb2JqLm1heEV4cGlyYXRpb25TZWNvbmRzLFxuICAgICdzaWduZXJOYW1lJzogb2JqLnNpZ25lck5hbWUsXG4gICAgJ3VzZXJBbm5vdGF0aW9ucyc6ICgob2JqLnVzZXJBbm5vdGF0aW9ucykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLnVzZXJBbm5vdGF0aW9ucykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlY3JldCBkYXRhIHRvIHByb2plY3RcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzU2VjcmV0IHtcbiAgLyoqXG4gICAqIGl0ZW1zIGlmIHVuc3BlY2lmaWVkLCBlYWNoIGtleS12YWx1ZSBwYWlyIGluIHRoZSBEYXRhIGZpZWxkIG9mIHRoZSByZWZlcmVuY2VkXG4gICAqIFNlY3JldCB3aWxsIGJlIHByb2plY3RlZCBpbnRvIHRoZSB2b2x1bWUgYXMgYSBmaWxlIHdob3NlIG5hbWUgaXMgdGhlXG4gICAqIGtleSBhbmQgY29udGVudCBpcyB0aGUgdmFsdWUuIElmIHNwZWNpZmllZCwgdGhlIGxpc3RlZCBrZXlzIHdpbGwgYmVcbiAgICogcHJvamVjdGVkIGludG8gdGhlIHNwZWNpZmllZCBwYXRocywgYW5kIHVubGlzdGVkIGtleXMgd2lsbCBub3QgYmVcbiAgICogcHJlc2VudC4gSWYgYSBrZXkgaXMgc3BlY2lmaWVkIHdoaWNoIGlzIG5vdCBwcmVzZW50IGluIHRoZSBTZWNyZXQsXG4gICAqIHRoZSB2b2x1bWUgc2V0dXAgd2lsbCBlcnJvciB1bmxlc3MgaXQgaXMgbWFya2VkIG9wdGlvbmFsLiBQYXRocyBtdXN0IGJlXG4gICAqIHJlbGF0aXZlIGFuZCBtYXkgbm90IGNvbnRhaW4gdGhlICcuLicgcGF0aCBvciBzdGFydCB3aXRoICcuLicuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1NlY3JldCNpdGVtc1xuICAgKi9cbiAgcmVhZG9ubHkgaXRlbXM/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzU2VjcmV0SXRlbXNbXTtcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1NlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcHRpb25hbCBmaWVsZCBzcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNTZWNyZXQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1NlY3JldCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzU2VjcmV0KG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1NlY3JldCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2l0ZW1zJzogb2JqLml0ZW1zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1NlY3JldEl0ZW1zKHkpKSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlcnZpY2VBY2NvdW50VG9rZW4gaXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZpY2VBY2NvdW50VG9rZW4gZGF0YSB0byBwcm9qZWN0XG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzU2VydmljZUFjY291bnRUb2tlblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNTZXJ2aWNlQWNjb3VudFRva2VuIHtcbiAgLyoqXG4gICAqIGF1ZGllbmNlIGlzIHRoZSBpbnRlbmRlZCBhdWRpZW5jZSBvZiB0aGUgdG9rZW4uIEEgcmVjaXBpZW50IG9mIGEgdG9rZW5cbiAgICogbXVzdCBpZGVudGlmeSBpdHNlbGYgd2l0aCBhbiBpZGVudGlmaWVyIHNwZWNpZmllZCBpbiB0aGUgYXVkaWVuY2Ugb2YgdGhlXG4gICAqIHRva2VuLCBhbmQgb3RoZXJ3aXNlIHNob3VsZCByZWplY3QgdGhlIHRva2VuLiBUaGUgYXVkaWVuY2UgZGVmYXVsdHMgdG8gdGhlXG4gICAqIGlkZW50aWZpZXIgb2YgdGhlIGFwaXNlcnZlci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzU2VydmljZUFjY291bnRUb2tlbiNhdWRpZW5jZVxuICAgKi9cbiAgcmVhZG9ubHkgYXVkaWVuY2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGV4cGlyYXRpb25TZWNvbmRzIGlzIHRoZSByZXF1ZXN0ZWQgZHVyYXRpb24gb2YgdmFsaWRpdHkgb2YgdGhlIHNlcnZpY2VcbiAgICogYWNjb3VudCB0b2tlbi4gQXMgdGhlIHRva2VuIGFwcHJvYWNoZXMgZXhwaXJhdGlvbiwgdGhlIGt1YmVsZXQgdm9sdW1lXG4gICAqIHBsdWdpbiB3aWxsIHByb2FjdGl2ZWx5IHJvdGF0ZSB0aGUgc2VydmljZSBhY2NvdW50IHRva2VuLiBUaGUga3ViZWxldCB3aWxsXG4gICAqIHN0YXJ0IHRyeWluZyB0byByb3RhdGUgdGhlIHRva2VuIGlmIHRoZSB0b2tlbiBpcyBvbGRlciB0aGFuIDgwIHBlcmNlbnQgb2ZcbiAgICogaXRzIHRpbWUgdG8gbGl2ZSBvciBpZiB0aGUgdG9rZW4gaXMgb2xkZXIgdGhhbiAyNCBob3Vycy5EZWZhdWx0cyB0byAxIGhvdXJcbiAgICogYW5kIG11c3QgYmUgYXQgbGVhc3QgMTAgbWludXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgMSBob3VyXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1NlcnZpY2VBY2NvdW50VG9rZW4jZXhwaXJhdGlvblNlY29uZHNcbiAgICovXG4gIHJlYWRvbmx5IGV4cGlyYXRpb25TZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBwYXRoIGlzIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBtb3VudCBwb2ludCBvZiB0aGUgZmlsZSB0byBwcm9qZWN0IHRoZVxuICAgKiB0b2tlbiBpbnRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNTZXJ2aWNlQWNjb3VudFRva2VuI3BhdGhcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1NlcnZpY2VBY2NvdW50VG9rZW4nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1NlcnZpY2VBY2NvdW50VG9rZW4ob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzU2VydmljZUFjY291bnRUb2tlbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2F1ZGllbmNlJzogb2JqLmF1ZGllbmNlLFxuICAgICdleHBpcmF0aW9uU2Vjb25kcyc6IG9iai5leHBpcmF0aW9uU2Vjb25kcyxcbiAgICAncGF0aCc6IG9iai5wYXRoLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3JcbiAqIHRoYXQgcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIFRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cywgRG9lc05vdEV4aXN0LiBHdCwgYW5kIEx0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBHdCBvciBMdCwgdGhlIHZhbHVlc1xuICAgKiBhcnJheSBtdXN0IGhhdmUgYSBzaW5nbGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyLlxuICAgKiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpYyBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3JcbiAqIHRoYXQgcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cywgRG9lc05vdEV4aXN0LiBHdCwgYW5kIEx0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gSWYgdGhlIG9wZXJhdG9yIGlzIEluIG9yIE5vdEluLFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzIG9yIERvZXNOb3RFeGlzdCxcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIGVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgR3Qgb3IgTHQsIHRoZSB2YWx1ZXNcbiAgICogYXJyYXkgbXVzdCBoYXZlIGEgc2luZ2xlIGVsZW1lbnQsIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlci5cbiAgICogVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWMgbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZU1hdGNoRmllbGRzI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvclxuICogdGhhdCByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzLCBEb2VzTm90RXhpc3QuIEd0LCBhbmQgTHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEd0IG9yIEx0LCB0aGUgdmFsdWVzXG4gICAqIGFycmF5IG11c3QgaGF2ZSBhIHNpbmdsZSBlbGVtZW50LCB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuIGludGVnZXIuXG4gICAqIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvclxuICogdGhhdCByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyB7XG4gIC8qKlxuICAgKiBUaGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzLCBEb2VzTm90RXhpc3QuIEd0LCBhbmQgTHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBHdCBvciBMdCwgdGhlIHZhbHVlc1xuICAgKiBhcnJheSBtdXN0IGhhdmUgYSBzaW5nbGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyLlxuICAgKiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpYyBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zTWF0Y2hGaWVsZHMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBtYXRjaEV4cHJlc3Npb25zIGlzIGEgbGlzdCBvZiBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudHMuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3IjbWF0Y2hMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3IgdGhhdFxuICogcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogb3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byBhIHNldCBvZiB2YWx1ZXMuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgSW4sIE5vdEluLCBFeGlzdHMgYW5kIERvZXNOb3RFeGlzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIGEgc2V0IG9mIHJlc291cmNlcywgaW4gdGhpcyBjYXNlIHBvZHMuXG4gKiBJZiBpdCdzIG51bGwsIHRoaXMgUG9kQWZmaW5pdHlUZXJtIG1hdGNoZXMgd2l0aCBubyBQb2RzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIHNlbGVjdGVkIGJ5IHRoaXMgZmllbGRcbiAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gKiBudWxsIHNlbGVjdG9yIGFuZCBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gKiBBbiBlbXB0eSBzZWxlY3RvciAoe30pIG1hdGNoZXMgYWxsIG5hbWVzcGFjZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2YWx1ZXMgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gSWYgdGhlIG9wZXJhdG9yIGlzIEluIG9yIE5vdEluLFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzIG9yIERvZXNOb3RFeGlzdCxcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIGVtcHR5LiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpY1xuICAgKiBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBvdXRwdXQgZm9ybWF0IG9mIHRoZSBleHBvc2VkIHJlc291cmNlcywgZGVmYXVsdHMgdG8gXCIxXCJcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXNSZXNvdXJjZUZpZWxkUmVmRGl2aXNvclxuICovXG5leHBvcnQgY2xhc3MgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtc1Jlc291cmNlRmllbGRSZWZEaXZpc29yIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNEb3dud2FyZEFwaUl0ZW1zUmVzb3VyY2VGaWVsZFJlZkRpdmlzb3Ige1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRG93bndhcmRBcGlJdGVtc1Jlc291cmNlRmllbGRSZWZEaXZpc29yKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGZyb21TdHJpbmcodmFsdWU6IHN0cmluZyk6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0Rvd253YXJkQXBpSXRlbXNSZXNvdXJjZUZpZWxkUmVmRGl2aXNvciB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNEb3dud2FyZEFwaUl0ZW1zUmVzb3VyY2VGaWVsZFJlZkRpdmlzb3IodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgfVxufVxuXG4vKipcbiAqIGRhdGFTb3VyY2UgZmllbGQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBlaXRoZXI6XG4gKiAqIEFuIGV4aXN0aW5nIFZvbHVtZVNuYXBzaG90IG9iamVjdCAoc25hcHNob3Quc3RvcmFnZS5rOHMuaW8vVm9sdW1lU25hcHNob3QpXG4gKiAqIEFuIGV4aXN0aW5nIFBWQyAoUGVyc2lzdGVudFZvbHVtZUNsYWltKVxuICogSWYgdGhlIHByb3Zpc2lvbmVyIG9yIGFuIGV4dGVybmFsIGNvbnRyb2xsZXIgY2FuIHN1cHBvcnQgdGhlIHNwZWNpZmllZCBkYXRhIHNvdXJjZSxcbiAqIGl0IHdpbGwgY3JlYXRlIGEgbmV3IHZvbHVtZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBkYXRhIHNvdXJjZS5cbiAqIFdoZW4gdGhlIEFueVZvbHVtZURhdGFTb3VyY2UgZmVhdHVyZSBnYXRlIGlzIGVuYWJsZWQsIGRhdGFTb3VyY2UgY29udGVudHMgd2lsbCBiZSBjb3BpZWQgdG8gZGF0YVNvdXJjZVJlZixcbiAqIGFuZCBkYXRhU291cmNlUmVmIGNvbnRlbnRzIHdpbGwgYmUgY29waWVkIHRvIGRhdGFTb3VyY2Ugd2hlbiBkYXRhU291cmNlUmVmLm5hbWVzcGFjZSBpcyBub3Qgc3BlY2lmaWVkLlxuICogSWYgdGhlIG5hbWVzcGFjZSBpcyBzcGVjaWZpZWQsIHRoZW4gZGF0YVNvdXJjZVJlZiB3aWxsIG5vdCBiZSBjb3BpZWQgdG8gZGF0YVNvdXJjZS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjRGF0YVNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjRGF0YVNvdXJjZSB7XG4gIC8qKlxuICAgKiBBUElHcm91cCBpcyB0aGUgZ3JvdXAgZm9yIHRoZSByZXNvdXJjZSBiZWluZyByZWZlcmVuY2VkLlxuICAgKiBJZiBBUElHcm91cCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc3BlY2lmaWVkIEtpbmQgbXVzdCBiZSBpbiB0aGUgY29yZSBBUEkgZ3JvdXAuXG4gICAqIEZvciBhbnkgb3RoZXIgdGhpcmQtcGFydHkgdHlwZXMsIEFQSUdyb3VwIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjRGF0YVNvdXJjZSNhcGlHcm91cFxuICAgKi9cbiAgcmVhZG9ubHkgYXBpR3JvdXA/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEtpbmQgaXMgdGhlIHR5cGUgb2YgcmVzb3VyY2UgYmVpbmcgcmVmZXJlbmNlZFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjRGF0YVNvdXJjZSNraW5kXG4gICAqL1xuICByZWFkb25seSBraW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgaXMgdGhlIG5hbWUgb2YgcmVzb3VyY2UgYmVpbmcgcmVmZXJlbmNlZFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjRGF0YVNvdXJjZSNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjRGF0YVNvdXJjZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY0RhdGFTb3VyY2Uob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY0RhdGFTb3VyY2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhcGlHcm91cCc6IG9iai5hcGlHcm91cCxcbiAgICAna2luZCc6IG9iai5raW5kLFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBkYXRhU291cmNlUmVmIHNwZWNpZmllcyB0aGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gcG9wdWxhdGUgdGhlIHZvbHVtZSB3aXRoIGRhdGEsIGlmIGEgbm9uLWVtcHR5XG4gKiB2b2x1bWUgaXMgZGVzaXJlZC4gVGhpcyBtYXkgYmUgYW55IG9iamVjdCBmcm9tIGEgbm9uLWVtcHR5IEFQSSBncm91cCAobm9uXG4gKiBjb3JlIG9iamVjdCkgb3IgYSBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0gb2JqZWN0LlxuICogV2hlbiB0aGlzIGZpZWxkIGlzIHNwZWNpZmllZCwgdm9sdW1lIGJpbmRpbmcgd2lsbCBvbmx5IHN1Y2NlZWQgaWYgdGhlIHR5cGUgb2ZcbiAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG1hdGNoZXMgc29tZSBpbnN0YWxsZWQgdm9sdW1lIHBvcHVsYXRvciBvciBkeW5hbWljXG4gKiBwcm92aXNpb25lci5cbiAqIFRoaXMgZmllbGQgd2lsbCByZXBsYWNlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBkYXRhU291cmNlIGZpZWxkIGFuZCBhcyBzdWNoXG4gKiBpZiBib3RoIGZpZWxkcyBhcmUgbm9uLWVtcHR5LCB0aGV5IG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZS4gRm9yIGJhY2t3YXJkc1xuICogY29tcGF0aWJpbGl0eSwgd2hlbiBuYW1lc3BhY2UgaXNuJ3Qgc3BlY2lmaWVkIGluIGRhdGFTb3VyY2VSZWYsXG4gKiBib3RoIGZpZWxkcyAoZGF0YVNvdXJjZSBhbmQgZGF0YVNvdXJjZVJlZikgd2lsbCBiZSBzZXQgdG8gdGhlIHNhbWVcbiAqIHZhbHVlIGF1dG9tYXRpY2FsbHkgaWYgb25lIG9mIHRoZW0gaXMgZW1wdHkgYW5kIHRoZSBvdGhlciBpcyBub24tZW1wdHkuXG4gKiBXaGVuIG5hbWVzcGFjZSBpcyBzcGVjaWZpZWQgaW4gZGF0YVNvdXJjZVJlZixcbiAqIGRhdGFTb3VyY2UgaXNuJ3Qgc2V0IHRvIHRoZSBzYW1lIHZhbHVlIGFuZCBtdXN0IGJlIGVtcHR5LlxuICogVGhlcmUgYXJlIHRocmVlIGltcG9ydGFudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGRhdGFTb3VyY2UgYW5kIGRhdGFTb3VyY2VSZWY6XG4gKiAqIFdoaWxlIGRhdGFTb3VyY2Ugb25seSBhbGxvd3MgdHdvIHNwZWNpZmljIHR5cGVzIG9mIG9iamVjdHMsIGRhdGFTb3VyY2VSZWZcbiAqIGFsbG93cyBhbnkgbm9uLWNvcmUgb2JqZWN0LCBhcyB3ZWxsIGFzIFBlcnNpc3RlbnRWb2x1bWVDbGFpbSBvYmplY3RzLlxuICogKiBXaGlsZSBkYXRhU291cmNlIGlnbm9yZXMgZGlzYWxsb3dlZCB2YWx1ZXMgKGRyb3BwaW5nIHRoZW0pLCBkYXRhU291cmNlUmVmXG4gKiBwcmVzZXJ2ZXMgYWxsIHZhbHVlcywgYW5kIGdlbmVyYXRlcyBhbiBlcnJvciBpZiBhIGRpc2FsbG93ZWQgdmFsdWUgaXNcbiAqIHNwZWNpZmllZC5cbiAqICogV2hpbGUgZGF0YVNvdXJjZSBvbmx5IGFsbG93cyBsb2NhbCBvYmplY3RzLCBkYXRhU291cmNlUmVmIGFsbG93cyBvYmplY3RzXG4gKiBpbiBhbnkgbmFtZXNwYWNlcy5cbiAqIChCZXRhKSBVc2luZyB0aGlzIGZpZWxkIHJlcXVpcmVzIHRoZSBBbnlWb2x1bWVEYXRhU291cmNlIGZlYXR1cmUgZ2F0ZSB0byBiZSBlbmFibGVkLlxuICogKEFscGhhKSBVc2luZyB0aGUgbmFtZXNwYWNlIGZpZWxkIG9mIGRhdGFTb3VyY2VSZWYgcmVxdWlyZXMgdGhlIENyb3NzTmFtZXNwYWNlVm9sdW1lRGF0YVNvdXJjZSBmZWF0dXJlIGdhdGUgdG8gYmUgZW5hYmxlZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjRGF0YVNvdXJjZVJlZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjRGF0YVNvdXJjZVJlZiB7XG4gIC8qKlxuICAgKiBBUElHcm91cCBpcyB0aGUgZ3JvdXAgZm9yIHRoZSByZXNvdXJjZSBiZWluZyByZWZlcmVuY2VkLlxuICAgKiBJZiBBUElHcm91cCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc3BlY2lmaWVkIEtpbmQgbXVzdCBiZSBpbiB0aGUgY29yZSBBUEkgZ3JvdXAuXG4gICAqIEZvciBhbnkgb3RoZXIgdGhpcmQtcGFydHkgdHlwZXMsIEFQSUdyb3VwIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjRGF0YVNvdXJjZVJlZiNhcGlHcm91cFxuICAgKi9cbiAgcmVhZG9ubHkgYXBpR3JvdXA/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEtpbmQgaXMgdGhlIHR5cGUgb2YgcmVzb3VyY2UgYmVpbmcgcmVmZXJlbmNlZFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjRGF0YVNvdXJjZVJlZiNraW5kXG4gICAqL1xuICByZWFkb25seSBraW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgaXMgdGhlIG5hbWUgb2YgcmVzb3VyY2UgYmVpbmcgcmVmZXJlbmNlZFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjRGF0YVNvdXJjZVJlZiNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzcGFjZSBpcyB0aGUgbmFtZXNwYWNlIG9mIHJlc291cmNlIGJlaW5nIHJlZmVyZW5jZWRcbiAgICogTm90ZSB0aGF0IHdoZW4gYSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLCBhIGdhdGV3YXkubmV0d29ya2luZy5rOHMuaW8vUmVmZXJlbmNlR3JhbnQgb2JqZWN0IGlzIHJlcXVpcmVkIGluIHRoZSByZWZlcmVudCBuYW1lc3BhY2UgdG8gYWxsb3cgdGhhdCBuYW1lc3BhY2UncyBvd25lciB0byBhY2NlcHQgdGhlIHJlZmVyZW5jZS4gU2VlIHRoZSBSZWZlcmVuY2VHcmFudCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLlxuICAgKiAoQWxwaGEpIFRoaXMgZmllbGQgcmVxdWlyZXMgdGhlIENyb3NzTmFtZXNwYWNlVm9sdW1lRGF0YVNvdXJjZSBmZWF0dXJlIGdhdGUgdG8gYmUgZW5hYmxlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY0RhdGFTb3VyY2VSZWYjbmFtZXNwYWNlXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjRGF0YVNvdXJjZVJlZicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY0RhdGFTb3VyY2VSZWYob2JqOiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY0RhdGFTb3VyY2VSZWYgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhcGlHcm91cCc6IG9iai5hcGlHcm91cCxcbiAgICAna2luZCc6IG9iai5raW5kLFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ25hbWVzcGFjZSc6IG9iai5uYW1lc3BhY2UsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiByZXNvdXJjZXMgcmVwcmVzZW50cyB0aGUgbWluaW11bSByZXNvdXJjZXMgdGhlIHZvbHVtZSBzaG91bGQgaGF2ZS5cbiAqIFVzZXJzIGFyZSBhbGxvd2VkIHRvIHNwZWNpZnkgcmVzb3VyY2UgcmVxdWlyZW1lbnRzXG4gKiB0aGF0IGFyZSBsb3dlciB0aGFuIHByZXZpb3VzIHZhbHVlIGJ1dCBtdXN0IHN0aWxsIGJlIGhpZ2hlciB0aGFuIGNhcGFjaXR5IHJlY29yZGVkIGluIHRoZVxuICogc3RhdHVzIGZpZWxkIG9mIHRoZSBjbGFpbS5cbiAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS9wZXJzaXN0ZW50LXZvbHVtZXMjcmVzb3VyY2VzXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY1Jlc291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjUmVzb3VyY2VzIHtcbiAgLyoqXG4gICAqIExpbWl0cyBkZXNjcmliZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGNvbXB1dGUgcmVzb3VyY2VzIGFsbG93ZWQuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvY29uZmlndXJhdGlvbi9tYW5hZ2UtcmVzb3VyY2VzLWNvbnRhaW5lcnMvXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNSZXNvdXJjZXMjbGltaXRzXG4gICAqL1xuICByZWFkb25seSBsaW1pdHM/OiB7IFtrZXk6IHN0cmluZ106IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjUmVzb3VyY2VzTGltaXRzIH07XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIGRlc2NyaWJlcyB0aGUgbWluaW11bSBhbW91bnQgb2YgY29tcHV0ZSByZXNvdXJjZXMgcmVxdWlyZWQuXG4gICAqIElmIFJlcXVlc3RzIGlzIG9taXR0ZWQgZm9yIGEgY29udGFpbmVyLCBpdCBkZWZhdWx0cyB0byBMaW1pdHMgaWYgdGhhdCBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCxcbiAgICogb3RoZXJ3aXNlIHRvIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdmFsdWUuIFJlcXVlc3RzIGNhbm5vdCBleGNlZWQgTGltaXRzLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL2NvbmZpZ3VyYXRpb24vbWFuYWdlLXJlc291cmNlcy1jb250YWluZXJzL1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjUmVzb3VyY2VzI3JlcXVlc3RzXG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0cz86IHsgW2tleTogc3RyaW5nXTogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY1Jlc291cmNlcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY1Jlc291cmNlcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjUmVzb3VyY2VzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbGltaXRzJzogKChvYmoubGltaXRzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubGltaXRzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXT8udmFsdWUgfSksIHt9KSksXG4gICAgJ3JlcXVlc3RzJzogKChvYmoucmVxdWVzdHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5yZXF1ZXN0cykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0/LnZhbHVlIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogc2VsZWN0b3IgaXMgYSBsYWJlbCBxdWVyeSBvdmVyIHZvbHVtZXMgdG8gY29uc2lkZXIgZm9yIGJpbmRpbmcuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY1NlbGVjdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBtYXRjaEV4cHJlc3Npb25zIGlzIGEgbGlzdCBvZiBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudHMuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIG1hdGNoTGFiZWxzIGlzIGEgbWFwIG9mIHtrZXksdmFsdWV9IHBhaXJzLiBBIHNpbmdsZSB7a2V5LHZhbHVlfSBpbiB0aGUgbWF0Y2hMYWJlbHNcbiAgICogbWFwIGlzIGVxdWl2YWxlbnQgdG8gYW4gZWxlbWVudCBvZiBtYXRjaEV4cHJlc3Npb25zLCB3aG9zZSBrZXkgZmllbGQgaXMgXCJrZXlcIiwgdGhlXG4gICAqIG9wZXJhdG9yIGlzIFwiSW5cIiwgYW5kIHRoZSB2YWx1ZXMgYXJyYXkgY29udGFpbnMgb25seSBcInZhbHVlXCIuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjU2VsZWN0b3IjbWF0Y2hMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY1NlbGVjdG9yKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNTZWxlY3RvciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNlbGVjdCBhbGwgQ2x1c3RlclRydXN0QnVuZGxlcyB0aGF0IG1hdGNoIHRoaXMgbGFiZWwgc2VsZWN0b3IuICBPbmx5IGhhc1xuICogZWZmZWN0IGlmIHNpZ25lck5hbWUgaXMgc2V0LiAgTXV0dWFsbHktZXhjbHVzaXZlIHdpdGggbmFtZS4gIElmIHVuc2V0LFxuICogaW50ZXJwcmV0ZWQgYXMgXCJtYXRjaCBub3RoaW5nXCIuICBJZiBzZXQgYnV0IGVtcHR5LCBpbnRlcnByZXRlZCBhcyBcIm1hdGNoXG4gKiBldmVyeXRoaW5nXCIuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ2x1c3RlclRydXN0QnVuZGxlTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNDbHVzdGVyVHJ1c3RCdW5kbGVMYWJlbFNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NsdXN0ZXJUcnVzdEJ1bmRsZUxhYmVsU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNDbHVzdGVyVHJ1c3RCdW5kbGVMYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ2x1c3RlclRydXN0QnVuZGxlTGFiZWxTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ2x1c3RlclRydXN0QnVuZGxlTGFiZWxTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ2x1c3RlclRydXN0QnVuZGxlTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNDbHVzdGVyVHJ1c3RCdW5kbGVMYWJlbFNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NsdXN0ZXJUcnVzdEJ1bmRsZUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE1hcHMgYSBzdHJpbmcga2V5IHRvIGEgcGF0aCB3aXRoaW4gYSB2b2x1bWUuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ29uZmlnTWFwSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ29uZmlnTWFwSXRlbXMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBrZXkgdG8gcHJvamVjdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ29uZmlnTWFwSXRlbXMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogbW9kZSBpcyBPcHRpb25hbDogbW9kZSBiaXRzIHVzZWQgdG8gc2V0IHBlcm1pc3Npb25zIG9uIHRoaXMgZmlsZS5cbiAgICogTXVzdCBiZSBhbiBvY3RhbCB2YWx1ZSBiZXR3ZWVuIDAwMDAgYW5kIDA3Nzcgb3IgYSBkZWNpbWFsIHZhbHVlIGJldHdlZW4gMCBhbmQgNTExLlxuICAgKiBZQU1MIGFjY2VwdHMgYm90aCBvY3RhbCBhbmQgZGVjaW1hbCB2YWx1ZXMsIEpTT04gcmVxdWlyZXMgZGVjaW1hbCB2YWx1ZXMgZm9yIG1vZGUgYml0cy5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgdGhlIHZvbHVtZSBkZWZhdWx0TW9kZSB3aWxsIGJlIHVzZWQuXG4gICAqIFRoaXMgbWlnaHQgYmUgaW4gY29uZmxpY3Qgd2l0aCBvdGhlciBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBmaWxlXG4gICAqIG1vZGUsIGxpa2UgZnNHcm91cCwgYW5kIHRoZSByZXN1bHQgY2FuIGJlIG90aGVyIG1vZGUgYml0cyBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NvbmZpZ01hcEl0ZW1zI21vZGVcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHBhdGggaXMgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGZpbGUgdG8gbWFwIHRoZSBrZXkgdG8uXG4gICAqIE1heSBub3QgYmUgYW4gYWJzb2x1dGUgcGF0aC5cbiAgICogTWF5IG5vdCBjb250YWluIHRoZSBwYXRoIGVsZW1lbnQgJy4uJy5cbiAgICogTWF5IG5vdCBzdGFydCB3aXRoIHRoZSBzdHJpbmcgJy4uJy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ29uZmlnTWFwSXRlbXMjcGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ29uZmlnTWFwSXRlbXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NvbmZpZ01hcEl0ZW1zKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NvbmZpZ01hcEl0ZW1zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbW9kZSc6IG9iai5tb2RlLFxuICAgICdwYXRoJzogb2JqLnBhdGgsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEb3dud2FyZEFQSVZvbHVtZUZpbGUgcmVwcmVzZW50cyBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcG9kIGZpZWxkXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzRG93bndhcmRBcGlJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zIHtcbiAgLyoqXG4gICAqIFJlcXVpcmVkOiBTZWxlY3RzIGEgZmllbGQgb2YgdGhlIHBvZDogb25seSBhbm5vdGF0aW9ucywgbGFiZWxzLCBuYW1lLCBuYW1lc3BhY2UgYW5kIHVpZCBhcmUgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zI2ZpZWxkUmVmXG4gICAqL1xuICByZWFkb25seSBmaWVsZFJlZj86IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zRmllbGRSZWY7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsOiBtb2RlIGJpdHMgdXNlZCB0byBzZXQgcGVybWlzc2lvbnMgb24gdGhpcyBmaWxlLCBtdXN0IGJlIGFuIG9jdGFsIHZhbHVlXG4gICAqIGJldHdlZW4gMDAwMCBhbmQgMDc3NyBvciBhIGRlY2ltYWwgdmFsdWUgYmV0d2VlbiAwIGFuZCA1MTEuXG4gICAqIFlBTUwgYWNjZXB0cyBib3RoIG9jdGFsIGFuZCBkZWNpbWFsIHZhbHVlcywgSlNPTiByZXF1aXJlcyBkZWNpbWFsIHZhbHVlcyBmb3IgbW9kZSBiaXRzLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgdm9sdW1lIGRlZmF1bHRNb2RlIHdpbGwgYmUgdXNlZC5cbiAgICogVGhpcyBtaWdodCBiZSBpbiBjb25mbGljdCB3aXRoIG90aGVyIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGZpbGVcbiAgICogbW9kZSwgbGlrZSBmc0dyb3VwLCBhbmQgdGhlIHJlc3VsdCBjYW4gYmUgb3RoZXIgbW9kZSBiaXRzIHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzRG93bndhcmRBcGlJdGVtcyNtb2RlXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXF1aXJlZDogUGF0aCBpcyAgdGhlIHJlbGF0aXZlIHBhdGggbmFtZSBvZiB0aGUgZmlsZSB0byBiZSBjcmVhdGVkLiBNdXN0IG5vdCBiZSBhYnNvbHV0ZSBvciBjb250YWluIHRoZSAnLi4nIHBhdGguIE11c3QgYmUgdXRmLTggZW5jb2RlZC4gVGhlIGZpcnN0IGl0ZW0gb2YgdGhlIHJlbGF0aXZlIHBhdGggbXVzdCBub3Qgc3RhcnQgd2l0aCAnLi4nXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpSXRlbXMjcGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGEgcmVzb3VyY2Ugb2YgdGhlIGNvbnRhaW5lcjogb25seSByZXNvdXJjZXMgbGltaXRzIGFuZCByZXF1ZXN0c1xuICAgKiAobGltaXRzLmNwdSwgbGltaXRzLm1lbW9yeSwgcmVxdWVzdHMuY3B1IGFuZCByZXF1ZXN0cy5tZW1vcnkpIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zI3Jlc291cmNlRmllbGRSZWZcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlRmllbGRSZWY/OiBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzRG93bndhcmRBcGlJdGVtc1Jlc291cmNlRmllbGRSZWY7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpSXRlbXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdmaWVsZFJlZic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzRG93bndhcmRBcGlJdGVtc0ZpZWxkUmVmKG9iai5maWVsZFJlZiksXG4gICAgJ21vZGUnOiBvYmoubW9kZSxcbiAgICAncGF0aCc6IG9iai5wYXRoLFxuICAgICdyZXNvdXJjZUZpZWxkUmVmJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zUmVzb3VyY2VGaWVsZFJlZihvYmoucmVzb3VyY2VGaWVsZFJlZiksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBNYXBzIGEgc3RyaW5nIGtleSB0byBhIHBhdGggd2l0aGluIGEgdm9sdW1lLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1NlY3JldEl0ZW1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1NlY3JldEl0ZW1zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUga2V5IHRvIHByb2plY3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1NlY3JldEl0ZW1zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG1vZGUgaXMgT3B0aW9uYWw6IG1vZGUgYml0cyB1c2VkIHRvIHNldCBwZXJtaXNzaW9ucyBvbiB0aGlzIGZpbGUuXG4gICAqIE11c3QgYmUgYW4gb2N0YWwgdmFsdWUgYmV0d2VlbiAwMDAwIGFuZCAwNzc3IG9yIGEgZGVjaW1hbCB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDUxMS5cbiAgICogWUFNTCBhY2NlcHRzIGJvdGggb2N0YWwgYW5kIGRlY2ltYWwgdmFsdWVzLCBKU09OIHJlcXVpcmVzIGRlY2ltYWwgdmFsdWVzIGZvciBtb2RlIGJpdHMuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB2b2x1bWUgZGVmYXVsdE1vZGUgd2lsbCBiZSB1c2VkLlxuICAgKiBUaGlzIG1pZ2h0IGJlIGluIGNvbmZsaWN0IHdpdGggb3RoZXIgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgZmlsZVxuICAgKiBtb2RlLCBsaWtlIGZzR3JvdXAsIGFuZCB0aGUgcmVzdWx0IGNhbiBiZSBvdGhlciBtb2RlIGJpdHMgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNTZWNyZXRJdGVtcyNtb2RlXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBwYXRoIGlzIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIG1hcCB0aGUga2V5IHRvLlxuICAgKiBNYXkgbm90IGJlIGFuIGFic29sdXRlIHBhdGguXG4gICAqIE1heSBub3QgY29udGFpbiB0aGUgcGF0aCBlbGVtZW50ICcuLicuXG4gICAqIE1heSBub3Qgc3RhcnQgd2l0aCB0aGUgc3RyaW5nICcuLicuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1NlY3JldEl0ZW1zI3BhdGhcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc1NlY3JldEl0ZW1zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNTZWNyZXRJdGVtcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNTZWNyZXRJdGVtcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ21vZGUnOiBvYmoubW9kZSxcbiAgICAncGF0aCc6IG9iai5wYXRoLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3IgdGhhdFxuICogcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogb3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byBhIHNldCBvZiB2YWx1ZXMuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgSW4sIE5vdEluLCBFeGlzdHMgYW5kIERvZXNOb3RFeGlzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjUmVzb3VyY2VzTGltaXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY1Jlc291cmNlc0xpbWl0cyB7XG4gIHB1YmxpYyBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZTogbnVtYmVyKTogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNSZXNvdXJjZXNMaW1pdHMge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNSZXNvdXJjZXNMaW1pdHModmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNSZXNvdXJjZXNMaW1pdHMge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNSZXNvdXJjZXNMaW1pdHModmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgfVxufVxuXG4vKipcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNSZXNvdXJjZXNSZXF1ZXN0c1xuICovXG5leHBvcnQgY2xhc3MgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB7XG4gIHB1YmxpYyBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZTogbnVtYmVyKTogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY1Jlc291cmNlc1JlcXVlc3RzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGZyb21TdHJpbmcodmFsdWU6IHN0cmluZyk6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjUmVzb3VyY2VzUmVxdWVzdHMge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICB9XG59XG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNFcGhlbWVyYWxWb2x1bWVDbGFpbVRlbXBsYXRlU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc0VwaGVtZXJhbFZvbHVtZUNsYWltVGVtcGxhdGVTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzRXBoZW1lcmFsVm9sdW1lQ2xhaW1UZW1wbGF0ZVNwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3IgdGhhdFxuICogcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ2x1c3RlclRydXN0QnVuZGxlTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ2x1c3RlclRydXN0QnVuZGxlTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ2x1c3RlclRydXN0QnVuZGxlTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogb3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byBhIHNldCBvZiB2YWx1ZXMuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgSW4sIE5vdEluLCBFeGlzdHMgYW5kIERvZXNOb3RFeGlzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ2x1c3RlclRydXN0QnVuZGxlTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNDbHVzdGVyVHJ1c3RCdW5kbGVMYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzQ2x1c3RlclRydXN0QnVuZGxlTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NsdXN0ZXJUcnVzdEJ1bmRsZUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0NsdXN0ZXJUcnVzdEJ1bmRsZUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogUmVxdWlyZWQ6IFNlbGVjdHMgYSBmaWVsZCBvZiB0aGUgcG9kOiBvbmx5IGFubm90YXRpb25zLCBsYWJlbHMsIG5hbWUsIG5hbWVzcGFjZSBhbmQgdWlkIGFyZSBzdXBwb3J0ZWQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzRG93bndhcmRBcGlJdGVtc0ZpZWxkUmVmXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpSXRlbXNGaWVsZFJlZiB7XG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBzY2hlbWEgdGhlIEZpZWxkUGF0aCBpcyB3cml0dGVuIGluIHRlcm1zIG9mLCBkZWZhdWx0cyB0byBcInYxXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpSXRlbXNGaWVsZFJlZiNhcGlWZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBhcGlWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIG9mIHRoZSBmaWVsZCB0byBzZWxlY3QgaW4gdGhlIHNwZWNpZmllZCBBUEkgdmVyc2lvbi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzRG93bndhcmRBcGlJdGVtc0ZpZWxkUmVmI2ZpZWxkUGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgZmllbGRQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zRmllbGRSZWYnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpSXRlbXNGaWVsZFJlZihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zRmllbGRSZWYgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhcGlWZXJzaW9uJzogb2JqLmFwaVZlcnNpb24sXG4gICAgJ2ZpZWxkUGF0aCc6IG9iai5maWVsZFBhdGgsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTZWxlY3RzIGEgcmVzb3VyY2Ugb2YgdGhlIGNvbnRhaW5lcjogb25seSByZXNvdXJjZXMgbGltaXRzIGFuZCByZXF1ZXN0c1xuICogKGxpbWl0cy5jcHUsIGxpbWl0cy5tZW1vcnksIHJlcXVlc3RzLmNwdSBhbmQgcmVxdWVzdHMubWVtb3J5KSBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zUmVzb3VyY2VGaWVsZFJlZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zUmVzb3VyY2VGaWVsZFJlZiB7XG4gIC8qKlxuICAgKiBDb250YWluZXIgbmFtZTogcmVxdWlyZWQgZm9yIHZvbHVtZXMsIG9wdGlvbmFsIGZvciBlbnYgdmFyc1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zUmVzb3VyY2VGaWVsZFJlZiNjb250YWluZXJOYW1lXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG91dHB1dCBmb3JtYXQgb2YgdGhlIGV4cG9zZWQgcmVzb3VyY2VzLCBkZWZhdWx0cyB0byBcIjFcIlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zUmVzb3VyY2VGaWVsZFJlZiNkaXZpc29yXG4gICAqL1xuICByZWFkb25seSBkaXZpc29yPzogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpSXRlbXNSZXNvdXJjZUZpZWxkUmVmRGl2aXNvcjtcblxuICAvKipcbiAgICogUmVxdWlyZWQ6IHJlc291cmNlIHRvIHNlbGVjdFxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zUmVzb3VyY2VGaWVsZFJlZiNyZXNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpSXRlbXNSZXNvdXJjZUZpZWxkUmVmJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zUmVzb3VyY2VGaWVsZFJlZihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zUmVzb3VyY2VGaWVsZFJlZiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2NvbnRhaW5lck5hbWUnOiBvYmouY29udGFpbmVyTmFtZSxcbiAgICAnZGl2aXNvcic6IG9iai5kaXZpc29yPy52YWx1ZSxcbiAgICAncmVzb3VyY2UnOiBvYmoucmVzb3VyY2UsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG91dHB1dCBmb3JtYXQgb2YgdGhlIGV4cG9zZWQgcmVzb3VyY2VzLCBkZWZhdWx0cyB0byBcIjFcIlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpSXRlbXNSZXNvdXJjZUZpZWxkUmVmRGl2aXNvclxuICovXG5leHBvcnQgY2xhc3MgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpSXRlbXNSZXNvdXJjZUZpZWxkUmVmRGl2aXNvciB7XG4gIHB1YmxpYyBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZTogbnVtYmVyKTogVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpSXRlbXNSZXNvdXJjZUZpZWxkUmVmRGl2aXNvciB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1BvZFZvbHVtZXNQcm9qZWN0ZWRTb3VyY2VzRG93bndhcmRBcGlJdGVtc1Jlc291cmNlRmllbGRSZWZEaXZpc29yKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGZyb21TdHJpbmcodmFsdWU6IHN0cmluZyk6IFZpbnlsQ2FjaGVTcGVjUG9kVm9sdW1lc1Byb2plY3RlZFNvdXJjZXNEb3dud2FyZEFwaUl0ZW1zUmVzb3VyY2VGaWVsZFJlZkRpdmlzb3Ige1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNQb2RWb2x1bWVzUHJvamVjdGVkU291cmNlc0Rvd253YXJkQXBpSXRlbXNSZXNvdXJjZUZpZWxkUmVmRGl2aXNvcih2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICB9XG59XG5cbiJdfQ==
|