@pipeline-builder/pipeline-core 4.4.11 → 4.4.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.d.ts CHANGED
@@ -38,7 +38,8 @@ export * from './core/security-group-types.js';
38
38
  export { replaceNonAlphanumeric, extractMetadataEnv, resolveFailureBehavior, wrapCommandsForFailureBehavior, STEP_BOOTSTRAP_CMD } from './core/metadata-helpers.js';
39
39
  export * from './core/step-manifest.js';
40
40
  export { type ContractValueType, type PluginContract, type ContractScope, type ContractIssue, type ContractScopeProps, pipelineScopeMetadata, pipelineContractScope, contractScopeFromTemplateScope, isContractValueOfType, checkPluginContract, type PluginStepRef, collectPluginSteps, pluginLookupFilter, pluginArtifactAlias, pluginStepLabel, type PluginRefIdentity, sanitizePublisher, } from './core/plugin-contract.js';
41
- export { unwrapLookup, summarizeLookupWarnings, LOOKUP_WARNING_SEVERITIES, type LookupWarning, type LookupWarningSeverity, lookupNotFoundState, exactPinNotFoundMessage, type LookupNotFoundState, } from './core/plugin-lookup-envelope.js';
41
+ export { unwrapLookup, summarizeLookupWarnings, LOOKUP_WARNING_SEVERITIES, type LookupWarning, type LookupWarningSeverity, lookupNotFoundState, exactPinNotFoundMessage, type LookupNotFoundState, parseLookupToolchain, TOOLCHAIN_RESOLVED_VIA, type ToolchainResolvedVia, type ToolchainVersions, type LookupToolchain, type ResolvedBootstrap, } from './core/plugin-lookup-envelope.js';
42
+ export * from './core/self-mutation.js';
42
43
  export * from './core/synth-failure.js';
43
44
  export * from './core/runtime-check.js';
44
45
  export * from './core/platform-tls.js';
package/lib/index.js CHANGED
@@ -42,7 +42,8 @@ export * from './core/security-group-types.js';
42
42
  export { replaceNonAlphanumeric, extractMetadataEnv, resolveFailureBehavior, wrapCommandsForFailureBehavior, STEP_BOOTSTRAP_CMD } from './core/metadata-helpers.js';
43
43
  export * from './core/step-manifest.js';
44
44
  export { pipelineScopeMetadata, pipelineContractScope, contractScopeFromTemplateScope, isContractValueOfType, checkPluginContract, collectPluginSteps, pluginLookupFilter, pluginArtifactAlias, pluginStepLabel, sanitizePublisher, } from './core/plugin-contract.js';
45
- export { unwrapLookup, summarizeLookupWarnings, LOOKUP_WARNING_SEVERITIES, lookupNotFoundState, exactPinNotFoundMessage, } from './core/plugin-lookup-envelope.js';
45
+ export { unwrapLookup, summarizeLookupWarnings, LOOKUP_WARNING_SEVERITIES, lookupNotFoundState, exactPinNotFoundMessage, parseLookupToolchain, TOOLCHAIN_RESOLVED_VIA, } from './core/plugin-lookup-envelope.js';
46
+ export * from './core/self-mutation.js';
46
47
  export * from './core/synth-failure.js';
47
48
  export * from './core/runtime-check.js';
48
49
  export * from './core/platform-tls.js';
@@ -62,4 +63,4 @@ export * from './pipeline/plugin-spec.js';
62
63
  export { tokenize, hasTemplate, MAX_FIELD_SIZE_BYTES, MAX_PATH_DEPTH, resolve, dependencies, validateTemplates, detectCycles, allowedScopeRoots, resolveSelfReferencing, validateTemplateDraft, formatTemplateDraftProblems, } from './template/index.js';
63
64
  // A plugin's `{{ … }}` resolution against a pipeline scope (synth, `plugin test`)
64
65
  export { resolvePluginTemplates } from './template/plugin-resolver.js';
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUVILGdCQUFnQjtBQUNoQixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUV6RSw4QkFBOEI7QUFDOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQXNDLFdBQVcsRUFBRSxZQUFZLEVBQW9CLE1BQU0sMEJBQTBCLENBQUM7QUFDcEosY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSw4QkFBOEIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BLLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsT0FBTyxFQU1MLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsOEJBQThCLEVBQzlCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFFbkIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsZUFBZSxFQUVmLGlCQUFpQixHQUNsQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUd6QixtQkFBbUIsRUFDbkIsdUJBQXVCLEdBRXhCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxpQ0FBaUMsQ0FBQztBQUVoRCwrRUFBK0U7QUFDL0UsMkVBQTJFO0FBQzNFLHdFQUF3RTtBQUN4RSxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELG1GQUFtRjtBQUNuRix3RUFBd0U7QUFDeEUsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLDJCQUEyQixDQUFDO0FBRTFDLDRFQUE0RTtBQUM1RSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsY0FBYyxFQUtkLE9BQU8sRUFDUCxZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixpQkFBaUIsRUFJakIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQiwyQkFBMkIsR0FNNUIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixrRkFBa0Y7QUFDbEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBAbW9kdWxlIEBwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmVcbiAqXG4gKiBBcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLCBwaXBlbGluZSBkb21haW4gdHlwZXMsIGFuZCB0aGUgdGVtcGxhdGUgZW5naW5lLlxuICpcbiAqIFRoaXMgZW50cnkgcG9pbnQgaXMgZGVsaWJlcmF0ZWx5IEZSRUUgb2YgYGF3cy1jZGstbGliYC4gVGhlIENESyBjb25zdHJ1Y3RzIGxpdmVcbiAqIGJlaGluZCBhIHNlcGFyYXRlIHN1YnBhdGgg4oCUIGBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlL2Nka2Ag4oCUIGJlY2F1c2UgdGhlXG4gKiBBUEkgc2VydmljZXMgY29uc3VtZSB0aGlzIHBhY2thZ2UgZm9yIGNvbmZpZyBhbmQgZG9tYWluIHR5cGVzIG9ubHksIGFuZCBhblxuICogYGV4cG9ydCAqYCBvZiB0aGUgY29uc3RydWN0cyBmcm9tIGhlcmUgcHV0IHRoZSB3aG9sZSBvZiBgYXdzLWNkay1saWJgIG9uIHRoZVxuICogaW1wb3J0IGdyYXBoIG9mIGV2ZXJ5IHNlcnZpY2UgdGhhdCByZWFkIHNvIG11Y2ggYXMgYSBwb3J0IG51bWJlci4gQW55dGhpbmcgdGhhdFxuICogaW1wb3J0cyBgYXdzLWNkay1saWJgLCBhdCB0eXBlIGxldmVsIG9yIHZhbHVlIGxldmVsLCBiZWxvbmdzIGluIGBjZGsudHNgLlxuICpcbiAqICoqQ29uZmlnKipcbiAqIC0gQ29uZmlnIOKAlCBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIHNpbmdsZXRvbiAoZW52aXJvbm1lbnQtZHJpdmVuKVxuICogLSBDb25maWdUeXBlcyDigJQgdHlwZWQgY29uZmlndXJhdGlvbiBpbnRlcmZhY2VzXG4gKlxuICogKipUeXBlcyoqXG4gKiAtIFBpcGVsaW5lVHlwZSwgQ29tcHV0ZVR5cGUsIFBsdWdpblR5cGUsIFZpc2liaWxpdHkg4oCUIHBpcGVsaW5lIGRvbWFpbiBlbnVtc1xuICogLSBSb2xlVHlwZXMsIFNlY3VyaXR5R3JvdXBUeXBlcyDigJQgaW5mcmFzdHJ1Y3R1cmUgdHlwZSBkZWZpbml0aW9uc1xuICogLSBQbHVnaW5TcGVjIOKAlCBhIHBsdWdpbidzIGRlY2xhcmVkIGNvbnRyYWN0XG4gKiAtIElkR2VuZXJhdG9yIOKAlCBkZXRlcm1pbmlzdGljIElEIGdlbmVyYXRpb25cbiAqXG4gKiAqKkhlbHBlcnMqKlxuICogLSByZXBsYWNlTm9uQWxwaGFudW1lcmljLCBleHRyYWN0TWV0YWRhdGFFbnYg4oCUIHN0cmluZyBhbmQgbWV0YWRhdGEgdXRpbGl0aWVzXG4gKiAtIHJlc29sdmVGYWlsdXJlQmVoYXZpb3IsIHdyYXBDb21tYW5kc0ZvckZhaWx1cmVCZWhhdmlvciDigJQgYSBzdGVwJ3MgZmFpbHVyZUJlaGF2aW9yLCBhcyBDb2RlQnVpbGQgcnVucyBpdFxuICpcbiAqIFRoZSBQb3N0Z3Jlcy9Ecml6emxlIGRhdGEgbGF5ZXIgKGRiLCBzY2hlbWEsIENydWRTZXJ2aWNlLCBxdWVyeSBidWlsZGVycyxcbiAqIGZpbHRlci9jb21wbGlhbmNlIHR5cGVzLCBldGMuKSBpcyBOT1QgcmUtZXhwb3J0ZWQgaGVyZSDigJQgaW1wb3J0IHRob3NlXG4gKiBkaXJlY3RseSBmcm9tIGBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1kYXRhYC5cbiAqL1xuXG4vLyBDb25maWd1cmF0aW9uXG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy9hcHAtY29uZmlnLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29uZmlnL2NvbmZpZy10eXBlcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy9zZXJ2aWNlLWNsaWVudC5qcyc7XG5leHBvcnQgeyBwYXJzZVBsYXRmb3JtQmFzZVVybCB9IGZyb20gJy4vY29uZmlnL2luZnJhc3RydWN0dXJlLWNvbmZpZy5qcyc7XG5cbi8vIENvcmUgdHlwZXMgKHB1YmxpYyBzdXJmYWNlKVxuZXhwb3J0IHsgQ29tcHV0ZVR5cGUsIFBsdWdpblR5cGUsIHR5cGUgTWV0YURhdGFUeXBlLCB0eXBlIFZpc2liaWxpdHksIFRyaWdnZXJUeXBlLCBNZXRhZGF0YUtleXMsIHR5cGUgTWV0YWRhdGFLZXkgfSBmcm9tICcuL2NvcmUvcGlwZWxpbmUtdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3JvbGUtdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3NlY3VyaXR5LWdyb3VwLXR5cGVzLmpzJztcbmV4cG9ydCB7IHJlcGxhY2VOb25BbHBoYW51bWVyaWMsIGV4dHJhY3RNZXRhZGF0YUVudiwgcmVzb2x2ZUZhaWx1cmVCZWhhdmlvciwgd3JhcENvbW1hbmRzRm9yRmFpbHVyZUJlaGF2aW9yLCBTVEVQX0JPT1RTVFJBUF9DTUQgfSBmcm9tICcuL2NvcmUvbWV0YWRhdGEtaGVscGVycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvc3RlcC1tYW5pZmVzdC5qcyc7XG5leHBvcnQge1xuICB0eXBlIENvbnRyYWN0VmFsdWVUeXBlLFxuICB0eXBlIFBsdWdpbkNvbnRyYWN0LFxuICB0eXBlIENvbnRyYWN0U2NvcGUsXG4gIHR5cGUgQ29udHJhY3RJc3N1ZSxcbiAgdHlwZSBDb250cmFjdFNjb3BlUHJvcHMsXG4gIHBpcGVsaW5lU2NvcGVNZXRhZGF0YSxcbiAgcGlwZWxpbmVDb250cmFjdFNjb3BlLFxuICBjb250cmFjdFNjb3BlRnJvbVRlbXBsYXRlU2NvcGUsXG4gIGlzQ29udHJhY3RWYWx1ZU9mVHlwZSxcbiAgY2hlY2tQbHVnaW5Db250cmFjdCxcbiAgdHlwZSBQbHVnaW5TdGVwUmVmLFxuICBjb2xsZWN0UGx1Z2luU3RlcHMsXG4gIHBsdWdpbkxvb2t1cEZpbHRlcixcbiAgcGx1Z2luQXJ0aWZhY3RBbGlhcyxcbiAgcGx1Z2luU3RlcExhYmVsLFxuICB0eXBlIFBsdWdpblJlZklkZW50aXR5LFxuICBzYW5pdGl6ZVB1Ymxpc2hlcixcbn0gZnJvbSAnLi9jb3JlL3BsdWdpbi1jb250cmFjdC5qcyc7XG5leHBvcnQge1xuICB1bndyYXBMb29rdXAsXG4gIHN1bW1hcml6ZUxvb2t1cFdhcm5pbmdzLFxuICBMT09LVVBfV0FSTklOR19TRVZFUklUSUVTLFxuICB0eXBlIExvb2t1cFdhcm5pbmcsXG4gIHR5cGUgTG9va3VwV2FybmluZ1NldmVyaXR5LFxuICBsb29rdXBOb3RGb3VuZFN0YXRlLFxuICBleGFjdFBpbk5vdEZvdW5kTWVzc2FnZSxcbiAgdHlwZSBMb29rdXBOb3RGb3VuZFN0YXRlLFxufSBmcm9tICcuL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvc3ludGgtZmFpbHVyZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvcnVudGltZS1jaGVjay5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvcGxhdGZvcm0tdGxzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9hdWRpdC1jb3JyZWxhdGlvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvcXVvdGEtZXhjZWVkZWQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3NlY3VyaXR5LXJlcG9ydHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3BpcGVsaW5lLXJlZ2lzdHJhdGlvbi5qcyc7XG5cbi8vIFBsdWdpbiBkb21haW4gdHlwZSAodGhlIHN5bnRoLXRpbWUgYXV0aG9yaW5nIHR5cGVzIGxpdmUgaW4gdGhlIGAvY2RrYCBlbnRyeSlcbi8vIENESy1mcmVlOiB0aGUgRE9SQSBkZXBsb3kgYXR0cmlidXRpb24gdGhlIEFQSSByZXBvcnRzIGluIGNyZWF0ZS92YWxpZGF0ZVxuLy8gcmVzcG9uc2VzLiBUaGUgY29uc3RydWN0IHRoYXQgc3RhbXBzIHRoZSB0YWcgcmVhZHMgdGhlIHNhbWUgZnVuY3Rpb24uXG5leHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lL2RlcGxveS1hdHRyaWJ1dGlvbi5qcyc7XG4vLyBDREstZnJlZTogdGhlIHN0YWdlL3BsdWdpbi9JQU0gcHJvamVjdGlvbiB0aGUgY3JlYXRlICsgdmFsaWRhdGUgcmVzcG9uc2VzIHJldHVyblxuLy8gc28gYSByZXZpZXdlciBhcHByb3ZlcyBzb21ldGhpbmcgY29uY3JldGUgcmF0aGVyIHRoYW4gcmF3IHByb3BzIEpTT04uXG5leHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lL3N0cnVjdHVyZS1wcmV2aWV3LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmUvcGx1Z2luLXNwZWMuanMnO1xuXG4vLyBUZW1wbGF0ZSBlbmdpbmUg4oCUIHN5bnRoLXRpbWUgc2NyaXB0aW5nIGZvciBwaXBlbGluZSBjb25maWcgKyBwbHVnaW4gc3BlY3NcbmV4cG9ydCB7XG4gIHRva2VuaXplLFxuICBoYXNUZW1wbGF0ZSxcbiAgTUFYX0ZJRUxEX1NJWkVfQllURVMsXG4gIE1BWF9QQVRIX0RFUFRILFxuICB0eXBlIFRva2VuLFxuICB0eXBlIExpdGVyYWxUb2tlbixcbiAgdHlwZSBFeHByVG9rZW4sXG4gIHR5cGUgU291cmNlUG9zaXRpb24sXG4gIHJlc29sdmUsXG4gIGRlcGVuZGVuY2llcyxcbiAgdHlwZSBTY29wZSxcbiAgdHlwZSBGaWVsZFByZWRpY2F0ZSxcbiAgdmFsaWRhdGVUZW1wbGF0ZXMsXG4gIGRldGVjdEN5Y2xlcyxcbiAgYWxsb3dlZFNjb3BlUm9vdHMsXG4gIHR5cGUgVGVtcGxhdGVFcnJvcixcbiAgdHlwZSBUZW1wbGF0ZVZhbGlkYXRpb25SZXN1bHQsXG4gIHR5cGUgUmVzb2x2ZVJlc3VsdCxcbiAgcmVzb2x2ZVNlbGZSZWZlcmVuY2luZyxcbiAgdmFsaWRhdGVUZW1wbGF0ZURyYWZ0LFxuICBmb3JtYXRUZW1wbGF0ZURyYWZ0UHJvYmxlbXMsXG4gIHR5cGUgVGVtcGxhdGVEcmFmdElucHV0LFxuICB0eXBlIFRlbXBsYXRlRHJhZnRMaWtlLFxuICB0eXBlIFRlbXBsYXRlRHJhZnRQcm9ibGVtLFxuICB0eXBlIFRlbXBsYXRlRHJhZnRQcm9ibGVtS2luZCxcbiAgdHlwZSBUZW1wbGF0ZURyYWZ0VmFsaWRhdGlvbixcbn0gZnJvbSAnLi90ZW1wbGF0ZS9pbmRleC5qcyc7XG4vLyBBIHBsdWdpbidzIGB7eyDigKYgfX1gIHJlc29sdXRpb24gYWdhaW5zdCBhIHBpcGVsaW5lIHNjb3BlIChzeW50aCwgYHBsdWdpbiB0ZXN0YClcbmV4cG9ydCB7IHJlc29sdmVQbHVnaW5UZW1wbGF0ZXMgfSBmcm9tICcuL3RlbXBsYXRlL3BsdWdpbi1yZXNvbHZlci5qcyc7XG4iXX0=
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUVILGdCQUFnQjtBQUNoQixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUV6RSw4QkFBOEI7QUFDOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQXNDLFdBQVcsRUFBRSxZQUFZLEVBQW9CLE1BQU0sMEJBQTBCLENBQUM7QUFDcEosY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSw4QkFBOEIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BLLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsT0FBTyxFQU1MLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsOEJBQThCLEVBQzlCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFFbkIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsZUFBZSxFQUVmLGlCQUFpQixHQUNsQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUd6QixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBRXZCLG9CQUFvQixFQUNwQixzQkFBc0IsR0FLdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsaUNBQWlDLENBQUM7QUFFaEQsK0VBQStFO0FBQy9FLDJFQUEyRTtBQUMzRSx3RUFBd0U7QUFDeEUsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxtRkFBbUY7QUFDbkYsd0VBQXdFO0FBQ3hFLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYywyQkFBMkIsQ0FBQztBQUUxQyw0RUFBNEU7QUFDNUUsT0FBTyxFQUNMLFFBQVEsRUFDUixXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLGNBQWMsRUFLZCxPQUFPLEVBQ1AsWUFBWSxFQUdaLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osaUJBQWlCLEVBSWpCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsMkJBQTJCLEdBTTVCLE1BQU0scUJBQXFCLENBQUM7QUFDN0Isa0ZBQWtGO0FBQ2xGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogQG1vZHVsZSBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlXG4gKlxuICogQXBwbGljYXRpb24gY29uZmlndXJhdGlvbiwgcGlwZWxpbmUgZG9tYWluIHR5cGVzLCBhbmQgdGhlIHRlbXBsYXRlIGVuZ2luZS5cbiAqXG4gKiBUaGlzIGVudHJ5IHBvaW50IGlzIGRlbGliZXJhdGVseSBGUkVFIG9mIGBhd3MtY2RrLWxpYmAuIFRoZSBDREsgY29uc3RydWN0cyBsaXZlXG4gKiBiZWhpbmQgYSBzZXBhcmF0ZSBzdWJwYXRoIOKAlCBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZS9jZGtgIOKAlCBiZWNhdXNlIHRoZVxuICogQVBJIHNlcnZpY2VzIGNvbnN1bWUgdGhpcyBwYWNrYWdlIGZvciBjb25maWcgYW5kIGRvbWFpbiB0eXBlcyBvbmx5LCBhbmQgYW5cbiAqIGBleHBvcnQgKmAgb2YgdGhlIGNvbnN0cnVjdHMgZnJvbSBoZXJlIHB1dCB0aGUgd2hvbGUgb2YgYGF3cy1jZGstbGliYCBvbiB0aGVcbiAqIGltcG9ydCBncmFwaCBvZiBldmVyeSBzZXJ2aWNlIHRoYXQgcmVhZCBzbyBtdWNoIGFzIGEgcG9ydCBudW1iZXIuIEFueXRoaW5nIHRoYXRcbiAqIGltcG9ydHMgYGF3cy1jZGstbGliYCwgYXQgdHlwZSBsZXZlbCBvciB2YWx1ZSBsZXZlbCwgYmVsb25ncyBpbiBgY2RrLnRzYC5cbiAqXG4gKiAqKkNvbmZpZyoqXG4gKiAtIENvbmZpZyDigJQgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBzaW5nbGV0b24gKGVudmlyb25tZW50LWRyaXZlbilcbiAqIC0gQ29uZmlnVHlwZXMg4oCUIHR5cGVkIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlc1xuICpcbiAqICoqVHlwZXMqKlxuICogLSBQaXBlbGluZVR5cGUsIENvbXB1dGVUeXBlLCBQbHVnaW5UeXBlLCBWaXNpYmlsaXR5IOKAlCBwaXBlbGluZSBkb21haW4gZW51bXNcbiAqIC0gUm9sZVR5cGVzLCBTZWN1cml0eUdyb3VwVHlwZXMg4oCUIGluZnJhc3RydWN0dXJlIHR5cGUgZGVmaW5pdGlvbnNcbiAqIC0gUGx1Z2luU3BlYyDigJQgYSBwbHVnaW4ncyBkZWNsYXJlZCBjb250cmFjdFxuICogLSBJZEdlbmVyYXRvciDigJQgZGV0ZXJtaW5pc3RpYyBJRCBnZW5lcmF0aW9uXG4gKlxuICogKipIZWxwZXJzKipcbiAqIC0gcmVwbGFjZU5vbkFscGhhbnVtZXJpYywgZXh0cmFjdE1ldGFkYXRhRW52IOKAlCBzdHJpbmcgYW5kIG1ldGFkYXRhIHV0aWxpdGllc1xuICogLSByZXNvbHZlRmFpbHVyZUJlaGF2aW9yLCB3cmFwQ29tbWFuZHNGb3JGYWlsdXJlQmVoYXZpb3Ig4oCUIGEgc3RlcCdzIGZhaWx1cmVCZWhhdmlvciwgYXMgQ29kZUJ1aWxkIHJ1bnMgaXRcbiAqXG4gKiBUaGUgUG9zdGdyZXMvRHJpenpsZSBkYXRhIGxheWVyIChkYiwgc2NoZW1hLCBDcnVkU2VydmljZSwgcXVlcnkgYnVpbGRlcnMsXG4gKiBmaWx0ZXIvY29tcGxpYW5jZSB0eXBlcywgZXRjLikgaXMgTk9UIHJlLWV4cG9ydGVkIGhlcmUg4oCUIGltcG9ydCB0aG9zZVxuICogZGlyZWN0bHkgZnJvbSBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YWAuXG4gKi9cblxuLy8gQ29uZmlndXJhdGlvblxuZXhwb3J0ICogZnJvbSAnLi9jb25maWcvYXBwLWNvbmZpZy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy9jb25maWctdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25maWcvc2VydmljZS1jbGllbnQuanMnO1xuZXhwb3J0IHsgcGFyc2VQbGF0Zm9ybUJhc2VVcmwgfSBmcm9tICcuL2NvbmZpZy9pbmZyYXN0cnVjdHVyZS1jb25maWcuanMnO1xuXG4vLyBDb3JlIHR5cGVzIChwdWJsaWMgc3VyZmFjZSlcbmV4cG9ydCB7IENvbXB1dGVUeXBlLCBQbHVnaW5UeXBlLCB0eXBlIE1ldGFEYXRhVHlwZSwgdHlwZSBWaXNpYmlsaXR5LCBUcmlnZ2VyVHlwZSwgTWV0YWRhdGFLZXlzLCB0eXBlIE1ldGFkYXRhS2V5IH0gZnJvbSAnLi9jb3JlL3BpcGVsaW5lLXR5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9yb2xlLXR5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9zZWN1cml0eS1ncm91cC10eXBlcy5qcyc7XG5leHBvcnQgeyByZXBsYWNlTm9uQWxwaGFudW1lcmljLCBleHRyYWN0TWV0YWRhdGFFbnYsIHJlc29sdmVGYWlsdXJlQmVoYXZpb3IsIHdyYXBDb21tYW5kc0ZvckZhaWx1cmVCZWhhdmlvciwgU1RFUF9CT09UU1RSQVBfQ01EIH0gZnJvbSAnLi9jb3JlL21ldGFkYXRhLWhlbHBlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3N0ZXAtbWFuaWZlc3QuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBDb250cmFjdFZhbHVlVHlwZSxcbiAgdHlwZSBQbHVnaW5Db250cmFjdCxcbiAgdHlwZSBDb250cmFjdFNjb3BlLFxuICB0eXBlIENvbnRyYWN0SXNzdWUsXG4gIHR5cGUgQ29udHJhY3RTY29wZVByb3BzLFxuICBwaXBlbGluZVNjb3BlTWV0YWRhdGEsXG4gIHBpcGVsaW5lQ29udHJhY3RTY29wZSxcbiAgY29udHJhY3RTY29wZUZyb21UZW1wbGF0ZVNjb3BlLFxuICBpc0NvbnRyYWN0VmFsdWVPZlR5cGUsXG4gIGNoZWNrUGx1Z2luQ29udHJhY3QsXG4gIHR5cGUgUGx1Z2luU3RlcFJlZixcbiAgY29sbGVjdFBsdWdpblN0ZXBzLFxuICBwbHVnaW5Mb29rdXBGaWx0ZXIsXG4gIHBsdWdpbkFydGlmYWN0QWxpYXMsXG4gIHBsdWdpblN0ZXBMYWJlbCxcbiAgdHlwZSBQbHVnaW5SZWZJZGVudGl0eSxcbiAgc2FuaXRpemVQdWJsaXNoZXIsXG59IGZyb20gJy4vY29yZS9wbHVnaW4tY29udHJhY3QuanMnO1xuZXhwb3J0IHtcbiAgdW53cmFwTG9va3VwLFxuICBzdW1tYXJpemVMb29rdXBXYXJuaW5ncyxcbiAgTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFUyxcbiAgdHlwZSBMb29rdXBXYXJuaW5nLFxuICB0eXBlIExvb2t1cFdhcm5pbmdTZXZlcml0eSxcbiAgbG9va3VwTm90Rm91bmRTdGF0ZSxcbiAgZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UsXG4gIHR5cGUgTG9va3VwTm90Rm91bmRTdGF0ZSxcbiAgcGFyc2VMb29rdXBUb29sY2hhaW4sXG4gIFRPT0xDSEFJTl9SRVNPTFZFRF9WSUEsXG4gIHR5cGUgVG9vbGNoYWluUmVzb2x2ZWRWaWEsXG4gIHR5cGUgVG9vbGNoYWluVmVyc2lvbnMsXG4gIHR5cGUgTG9va3VwVG9vbGNoYWluLFxuICB0eXBlIFJlc29sdmVkQm9vdHN0cmFwLFxufSBmcm9tICcuL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvc2VsZi1tdXRhdGlvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvc3ludGgtZmFpbHVyZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvcnVudGltZS1jaGVjay5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvcGxhdGZvcm0tdGxzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9hdWRpdC1jb3JyZWxhdGlvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvcXVvdGEtZXhjZWVkZWQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3NlY3VyaXR5LXJlcG9ydHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3BpcGVsaW5lLXJlZ2lzdHJhdGlvbi5qcyc7XG5cbi8vIFBsdWdpbiBkb21haW4gdHlwZSAodGhlIHN5bnRoLXRpbWUgYXV0aG9yaW5nIHR5cGVzIGxpdmUgaW4gdGhlIGAvY2RrYCBlbnRyeSlcbi8vIENESy1mcmVlOiB0aGUgRE9SQSBkZXBsb3kgYXR0cmlidXRpb24gdGhlIEFQSSByZXBvcnRzIGluIGNyZWF0ZS92YWxpZGF0ZVxuLy8gcmVzcG9uc2VzLiBUaGUgY29uc3RydWN0IHRoYXQgc3RhbXBzIHRoZSB0YWcgcmVhZHMgdGhlIHNhbWUgZnVuY3Rpb24uXG5leHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lL2RlcGxveS1hdHRyaWJ1dGlvbi5qcyc7XG4vLyBDREstZnJlZTogdGhlIHN0YWdlL3BsdWdpbi9JQU0gcHJvamVjdGlvbiB0aGUgY3JlYXRlICsgdmFsaWRhdGUgcmVzcG9uc2VzIHJldHVyblxuLy8gc28gYSByZXZpZXdlciBhcHByb3ZlcyBzb21ldGhpbmcgY29uY3JldGUgcmF0aGVyIHRoYW4gcmF3IHByb3BzIEpTT04uXG5leHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lL3N0cnVjdHVyZS1wcmV2aWV3LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmUvcGx1Z2luLXNwZWMuanMnO1xuXG4vLyBUZW1wbGF0ZSBlbmdpbmUg4oCUIHN5bnRoLXRpbWUgc2NyaXB0aW5nIGZvciBwaXBlbGluZSBjb25maWcgKyBwbHVnaW4gc3BlY3NcbmV4cG9ydCB7XG4gIHRva2VuaXplLFxuICBoYXNUZW1wbGF0ZSxcbiAgTUFYX0ZJRUxEX1NJWkVfQllURVMsXG4gIE1BWF9QQVRIX0RFUFRILFxuICB0eXBlIFRva2VuLFxuICB0eXBlIExpdGVyYWxUb2tlbixcbiAgdHlwZSBFeHByVG9rZW4sXG4gIHR5cGUgU291cmNlUG9zaXRpb24sXG4gIHJlc29sdmUsXG4gIGRlcGVuZGVuY2llcyxcbiAgdHlwZSBTY29wZSxcbiAgdHlwZSBGaWVsZFByZWRpY2F0ZSxcbiAgdmFsaWRhdGVUZW1wbGF0ZXMsXG4gIGRldGVjdEN5Y2xlcyxcbiAgYWxsb3dlZFNjb3BlUm9vdHMsXG4gIHR5cGUgVGVtcGxhdGVFcnJvcixcbiAgdHlwZSBUZW1wbGF0ZVZhbGlkYXRpb25SZXN1bHQsXG4gIHR5cGUgUmVzb2x2ZVJlc3VsdCxcbiAgcmVzb2x2ZVNlbGZSZWZlcmVuY2luZyxcbiAgdmFsaWRhdGVUZW1wbGF0ZURyYWZ0LFxuICBmb3JtYXRUZW1wbGF0ZURyYWZ0UHJvYmxlbXMsXG4gIHR5cGUgVGVtcGxhdGVEcmFmdElucHV0LFxuICB0eXBlIFRlbXBsYXRlRHJhZnRMaWtlLFxuICB0eXBlIFRlbXBsYXRlRHJhZnRQcm9ibGVtLFxuICB0eXBlIFRlbXBsYXRlRHJhZnRQcm9ibGVtS2luZCxcbiAgdHlwZSBUZW1wbGF0ZURyYWZ0VmFsaWRhdGlvbixcbn0gZnJvbSAnLi90ZW1wbGF0ZS9pbmRleC5qcyc7XG4vLyBBIHBsdWdpbidzIGB7eyDigKYgfX1gIHJlc29sdXRpb24gYWdhaW5zdCBhIHBpcGVsaW5lIHNjb3BlIChzeW50aCwgYHBsdWdpbiB0ZXN0YClcbmV4cG9ydCB7IHJlc29sdmVQbHVnaW5UZW1wbGF0ZXMgfSBmcm9tICcuL3RlbXBsYXRlL3BsdWdpbi1yZXNvbHZlci5qcyc7XG4iXX0=
@@ -6,6 +6,7 @@ import type { StageOptions, SynthOptions } from './step-types.js';
6
6
  import type { RegistryConfig } from '../config/config-types.js';
7
7
  import type { CodeBuildDefaults } from '../core/network-types.js';
8
8
  import type { MetaDataType } from '../core/pipeline-types.js';
9
+ import type { ResolvedBootstrap } from '../core/plugin-lookup-envelope.js';
9
10
  import type { RoleConfig } from '../core/role-types.js';
10
11
  import type { StepManifestEntry } from '../core/step-manifest.js';
11
12
  /**
@@ -71,6 +72,24 @@ export interface BuilderProps {
71
72
  * who construct PipelineBuilder directly normally leave this unset.
72
73
  */
73
74
  readonly resolvedPlugins?: Record<string, Plugin>;
75
+ /**
76
+ * The toolchain release this pipeline runs on, pinned by the pipeline's own
77
+ * config (`toolchain.release`). Absent ⇒ the org default, its canary, or the
78
+ * platform default — whichever the platform resolves (D7, D8).
79
+ */
80
+ readonly toolchain?: {
81
+ readonly release: string;
82
+ };
83
+ /**
84
+ * The resolved `pipeline-bootstrap` half of the pipeline's toolchain release
85
+ * (REQUIRED). Pins the default CodeBuild image (`codeBuildDefaults`,
86
+ * plugin-less steps, asset publishing) by its signed digest and supplies the
87
+ * CDK CLI (`cliVersion`) and `cdk-assets` (`cdkAssetsCliVersion`) versions.
88
+ * `pipeline-manager pipeline synth/deploy` resolves it from the platform
89
+ * (`/plugins/lookup`, name `pipeline-bootstrap`); CDK consumers building
90
+ * PipelineBuilder directly pass the same record. There is no fallback (D2).
91
+ */
92
+ readonly resolvedBootstrap: ResolvedBootstrap;
74
93
  /**
75
94
  * Platform-sourced registry overrides, applied over the env-loaded `registry`
76
95
  * config at synth start. pipeline-manager populates this from the platform URL
@@ -3,6 +3,7 @@
3
3
  import { createLogger } from '@pipeline-builder/api-core';
4
4
  import { Duration, RemovalPolicy, Tags } from 'aws-cdk-lib';
5
5
  import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
6
+ import { BuildSpec } from 'aws-cdk-lib/aws-codebuild';
6
7
  import { PipelineNotificationEvents, PipelineType, Variable } from 'aws-cdk-lib/aws-codepipeline';
7
8
  import * as events from 'aws-cdk-lib/aws-events';
8
9
  import * as targets from 'aws-cdk-lib/aws-events-targets';
@@ -24,7 +25,7 @@ import { ArtifactManager } from '../core/artifact-manager.js';
24
25
  import { UniqueId } from '../core/id-generator.js';
25
26
  import { asInt, isTrue, metadataForCodePipeline, networkConfigFromMetadata, parsePipelineVariables, roleConfigFromMetadata, securityGroupConfigFromMetadata, } from '../core/metadata-builder.js';
26
27
  import { resolveNetwork, networkConfigFromEnv } from '../core/network.js';
27
- import { createCodeBuildStep, getComputeType, resolveDefaultBuildImage } from '../core/pipeline-helpers.js';
28
+ import { createCodeBuildStep, curatedSelfMutationImage, getComputeType, resolveDefaultBuildImage } from '../core/pipeline-helpers.js';
28
29
  import { PIPELINE_REGISTRATION_SECRET_ENV, PIPELINE_REGISTRATION_SECRET_LEAF } from '../core/pipeline-registration.js';
29
30
  import { MetadataKeys, TriggerType } from '../core/pipeline-types.js';
30
31
  import { PLATFORM_CA_BUNDLE_ENV, PLATFORM_TLS_VERIFY_ENV, platformCaBundle, platformTlsVerify } from '../core/platform-tls.js';
@@ -32,6 +33,7 @@ import { assertPluginContract, contractScopeFromTemplateScope, pluginArtifactAli
32
33
  import { resolveRole } from '../core/role.js';
33
34
  import { isRuntimeVulnCheckEnabled, RUNTIME_VULN_CHECK_KEY } from '../core/runtime-check.js';
34
35
  import { resolveSecurityGroup } from '../core/security-group.js';
36
+ import { selfMutationPartialBuildSpec } from '../core/self-mutation.js';
35
37
  const PIPELINE_EVENT_MAP = {
36
38
  FAILED: PipelineNotificationEvents.PIPELINE_EXECUTION_FAILED,
37
39
  SUCCEEDED: PipelineNotificationEvents.PIPELINE_EXECUTION_SUCCEEDED,
@@ -61,6 +63,36 @@ function buildDeploysTag(props) {
61
63
  log.warn(w.message);
62
64
  return deploysTag;
63
65
  }
66
+ /**
67
+ * The CodePipeline props a toolchain release pins (§3, D10):
68
+ * - `cliVersion` / `cdkAssetsCliVersion` — the release's `awsCdk` /
69
+ * `cdkAssets`, so SelfMutate and asset publishing never install npm `latest`;
70
+ * - `selfMutationCodeBuildDefaults` — the curated image with its Node runtime
71
+ * pinned (`runtime-versions.nodejs`).
72
+ * A value set explicitly in pipeline metadata replaces the pin (the caller
73
+ * spreads the metadata after these). A release that doesn't carry a CLI
74
+ * version, with no explicit metadata either, fails the synth.
75
+ */
76
+ function toolchainPins(bootstrap, explicit) {
77
+ const { releaseVersion, versions } = bootstrap.toolchain;
78
+ const pick = (key, released, label) => {
79
+ const own = explicit[key];
80
+ if (typeof own === 'string' && own.length > 0)
81
+ return own;
82
+ if (released)
83
+ return released;
84
+ throw new Error(`BOOTSTRAP_IMAGE_UNRESOLVED: toolchain release ${releaseVersion} carries no ${label} version, so \`${key}\` can't be pinned. `
85
+ + `Set it explicitly in pipeline metadata (aws:cdk:pipelines:codepipeline:${key.toLowerCase()}) or re-resolve the release.`);
86
+ };
87
+ return {
88
+ cliVersion: pick('cliVersion', versions.awsCdk, 'aws-cdk'),
89
+ cdkAssetsCliVersion: pick('cdkAssetsCliVersion', versions.cdkAssets, 'cdk-assets'),
90
+ selfMutationCodeBuildDefaults: {
91
+ buildEnvironment: { buildImage: curatedSelfMutationImage() },
92
+ partialBuildSpec: BuildSpec.fromObject(selfMutationPartialBuildSpec()),
93
+ },
94
+ };
95
+ }
64
96
  /**
65
97
  * CDK construct that creates and configures a CodePipeline for continuous deployment.
66
98
  *
@@ -112,6 +144,11 @@ export class PipelineBuilder extends Construct {
112
144
  ? Config.overrideScoped('registry', props.registry)
113
145
  : undefined;
114
146
  try {
147
+ if (!props.resolvedBootstrap?.plugin || !props.resolvedBootstrap.toolchain) {
148
+ throw new Error('BOOTSTRAP_IMAGE_UNRESOLVED: PipelineBuilder requires `resolvedBootstrap` — the resolved pipeline-bootstrap '
149
+ + 'half of the toolchain release. `pipeline-manager pipeline synth/deploy` resolves it from the platform; '
150
+ + 'a CDK app constructing PipelineBuilder directly must pass it (see `pipeline-manager toolchain export`).');
151
+ }
115
152
  // Use PipelineConfiguration for all business logic (validation, sanitization, metadata merging)
116
153
  this.config = new PipelineConfiguration(props);
117
154
  const serverConfig = Config.get('server');
@@ -144,9 +181,9 @@ export class PipelineBuilder extends Construct {
144
181
  // API → use it. Synth step runs on the real `cdk-synth` image with
145
182
  // real commands baked into the template.
146
183
  // 2. Otherwise → `bootstrap()`: cold-start `pipeline-manager pipeline synth`
147
- // on the configured CODEBUILD_DEFAULT_IMAGE (default
148
- // pipeline-bootstrap:1.0). Used when the platform isn't reachable
149
- // at synth time (CLI logs a warning per missed plugin).
184
+ // on the resolved toolchain release's pipeline-bootstrap image
185
+ // (`resolvedBootstrap`). Used when the synth plugin wasn't
186
+ // pre-resolved (a non-managed synth plugin whose lookup missed).
150
187
  //
151
188
  // pluginLookup.plugin() reads `resolvedPlugins` internally and returns
152
189
  // the cached entry when present — so calling it always wins over
@@ -163,7 +200,12 @@ export class PipelineBuilder extends Construct {
163
200
  const pipelineScope = this.config.getPipelineScope();
164
201
  // Contract — see StageBuilder.resolveStep.
165
202
  assertPluginContract(plugin, contractScopeFromTemplateScope(pipelineScope), 'synth');
203
+ // The pipeline's default build image: the release's pipeline-bootstrap,
204
+ // resolved once (one registry-credential import) and shared by the
205
+ // pipeline-wide codeBuildDefaults and every plugin-less step.
206
+ const defaultBuildImage = resolveDefaultBuildImage(this, props.orgId, props.resolvedBootstrap.plugin);
166
207
  const stepManifest = new StepManifestRecorder();
208
+ stepManifest.recordBuildImage(props.resolvedBootstrap.plugin, props.resolvedBootstrap.toolchain);
167
209
  const synth = createCodeBuildStep({
168
210
  ...this.config.synthCustomization,
169
211
  id: uniqueId.generate('cdk:synth'),
@@ -182,6 +224,7 @@ export class PipelineBuilder extends Construct {
182
224
  // picked the synth output in the UI asked for a key never registered.
183
225
  pluginAlias: pluginArtifactAlias(this.config.plugin),
184
226
  orgId: props.orgId,
227
+ defaultBuildImage,
185
228
  pipelineScope,
186
229
  });
187
230
  stepManifest.record(synth, plugin, pluginStepLabel(null, this.config.plugin));
@@ -195,7 +238,7 @@ export class PipelineBuilder extends Construct {
195
238
  const registrationSecretName = props.orgId
196
239
  ? CoreConstants.secretPath(props.orgId, PIPELINE_REGISTRATION_SECRET_LEAF)
197
240
  : undefined;
198
- const codeBuildDefaults = this.resolveDefaults(this.config.defaults, uniqueId, props.pipelineId, platformSecretName, serverConfig.platformUrl, props.orgId);
241
+ const codeBuildDefaults = this.resolveDefaults(this.config.defaults, uniqueId, props.pipelineId, platformSecretName, serverConfig.platformUrl, props.orgId, defaultBuildImage);
199
242
  // Resolve IAM role: explicit prop wins, else `iam:role` metadata, else let
200
243
  // CDK auto-create the pipeline role (codepipeline.amazonaws.com principal).
201
244
  const roleConfig = props.role ?? roleConfigFromMetadata(this.config.metadata.merged);
@@ -214,7 +257,11 @@ export class PipelineBuilder extends Construct {
214
257
  // `artifactBucket`, not `encryptionKey`). Absent both keys, CDK auto-creates
215
258
  // the bucket and behavior is unchanged.
216
259
  const artifactBucket = this.buildArtifactBucket();
217
- // Create CodePipeline construct
260
+ // Create CodePipeline construct. The toolchain pins (CLI versions,
261
+ // self-mutation runtime) go BEFORE the metadata spread: explicit pipeline
262
+ // metadata (`cliVersion`, `cdkAssetsCliVersion`,
263
+ // `selfMutationCodeBuildDefaults`, `assetPublishingCodeBuildDefaults`) wins.
264
+ const codePipelineMetadata = metadataForCodePipeline(this.config.metadata.merged);
218
265
  this.pipeline = new CodePipeline(this, uniqueId.generate('pipelines:codepipeline'), {
219
266
  ...(codeBuildDefaults && { codeBuildDefaults }),
220
267
  ...(role && { role }),
@@ -222,7 +269,8 @@ export class PipelineBuilder extends Construct {
222
269
  pipelineType: PipelineType.V2,
223
270
  pipelineName: this.config.pipelineName,
224
271
  synth,
225
- ...metadataForCodePipeline(this.config.metadata.merged),
272
+ ...toolchainPins(props.resolvedBootstrap, codePipelineMetadata),
273
+ ...codePipelineMetadata,
226
274
  });
227
275
  // Run-time vulnerability check (opt-in metadata flag, report-only). It
228
276
  // needs the pipeline id (the check is per pipeline) and the org platform
@@ -243,6 +291,7 @@ export class PipelineBuilder extends Construct {
243
291
  defaultComputeType,
244
292
  artifactManager,
245
293
  orgId: props.orgId,
294
+ defaultBuildImage,
246
295
  pipelineScope,
247
296
  stepManifest,
248
297
  ...(runtimeVulnCheck && platformSecretName && { runtimeVulnCheck: { platformSecretName } }),
@@ -434,7 +483,7 @@ export class PipelineBuilder extends Construct {
434
483
  * Combines network config, security groups, and pipeline-level environment variables
435
484
  * (PIPELINE_ID, EXECUTION_ID, PLATFORM_BASE_URL) available to all CodeBuild actions.
436
485
  */
437
- resolveDefaults(defaults, id, pipelineId, platformSecretName, platformUrl, orgId) {
486
+ resolveDefaults(defaults, id, pipelineId, platformSecretName, platformUrl, orgId, defaultBuildImage) {
438
487
  // Per-pipeline network config wins; otherwise fall back to an env-driven
439
488
  // global VPC (internal / inside-AWS-only mode) so every pipeline's
440
489
  // CodeBuild runs in the VPC and can reach the private gateway. Unset in
@@ -450,7 +499,6 @@ export class PipelineBuilder extends Construct {
450
499
  ? resolveSecurityGroup(this, id, securityGroupConfig)
451
500
  : undefined;
452
501
  const caBundle = platformCaBundle();
453
- const { CODEBUILD_DEFAULT_IMAGE: defaultImage, CODEBUILD_DEFAULT_IMAGE_DIGEST: defaultImageDigest } = process.env;
454
502
  // Pipeline-level env vars available to all CodeBuild actions
455
503
  // Note: #{codepipeline.*} resolved variables must go through CodeBuildStep.env
456
504
  // (action-level), not buildEnvironment.environmentVariables (project-level).
@@ -470,11 +518,10 @@ export class PipelineBuilder extends Construct {
470
518
  // self-mutating synth (and any step calling the platform) VERIFIES the
471
519
  // certificate instead of needing `--no-verify-ssl`. See core/platform-tls.ts.
472
520
  ...(caBundle && { [PLATFORM_CA_BUNDLE_ENV]: { value: caBundle } }),
473
- // The self-mutating synth re-resolves the default build image inside
474
- // CodeBuild, where the operator's env is absent; carry the image and its
475
- // digest so the re-synthesized template keeps the same pin.
476
- ...(defaultImage && { CODEBUILD_DEFAULT_IMAGE: { value: defaultImage } }),
477
- ...(defaultImageDigest && { CODEBUILD_DEFAULT_IMAGE_DIGEST: { value: defaultImageDigest } }),
521
+ // No image carry: the self-mutating synth re-resolves the toolchain from
522
+ // the platform (resolveBootstrapImage), so a re-synth follows the
523
+ // release the platform resolves on that run. The release is recorded
524
+ // platform-side in the step manifest, never in the customer's account.
478
525
  };
479
526
  const securityGroups = [
480
527
  ...(networkProps?.securityGroups ?? []),
@@ -484,16 +531,15 @@ export class PipelineBuilder extends Construct {
484
531
  ...(networkProps && { vpc: networkProps.vpc, subnetSelection: networkProps.subnetSelection }),
485
532
  ...(securityGroups.length > 0 && { securityGroups }),
486
533
  // buildImage at this level reaches CDK Pipelines' internally-wrapped
487
- // ShellStep CodeBuild action, which otherwise hardcodes
488
- // CDK's default curated standard image. Setting it here closes the gap
489
- // exposed in the same env var (`CODEBUILD_DEFAULT_IMAGE`) that the
490
- // CodeBuildStep path already honors via resolvePluginImage()'s
491
- // fallback. Per-step `buildImage` on a CodeBuildStep still wins.
534
+ // ShellStep CodeBuild action and asset publishing, which otherwise run
535
+ // on CDK's default curated image. It is the release's pipeline-bootstrap,
536
+ // pulled exactly like a plugin image. Per-step `buildImage` on a
537
+ // CodeBuildStep still wins; self-mutation overrides it (curated, D10).
492
538
  buildEnvironment: {
493
- buildImage: resolveDefaultBuildImage(this, orgId),
539
+ buildImage: defaultBuildImage,
494
540
  environmentVariables: pipelineEnvVars,
495
541
  },
496
542
  };
497
543
  }
498
544
  }
499
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtYnVpbGRlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BpcGVsaW5lL3BpcGVsaW5lLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sS0FBSyxVQUFVLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRyxPQUFPLEtBQUssTUFBTSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sS0FBSyxPQUFPLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RCxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekMsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUF5QixNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFD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QztTQUM3RixDQUFDO1FBRUYsTUFBTSxjQUFjLEdBQUc7WUFDckIsR0FBRyxDQUFDLFlBQVksRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO1lBQ3ZDLEdBQUcsQ0FBQyx3QkFBd0IsSUFBSSxFQUFFLENBQUM7U0FDcEMsQ0FBQztRQUVGLE9BQU87WUFDTCxHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsZUFBZSxFQUFFLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM3RixHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUNwRCxxRUFBcUU7WUFDckUsd0RBQXdEO1lBQ3hELHVFQUF1RTtZQUN2RSxtRUFBbUU7WUFDbkUsK0RBQStEO1lBQy9ELGlFQUFpRTtZQUNqRSxnQkFBZ0IsRUFBRTtnQkFDaEIsVUFBVSxFQUFFLHdCQUF3QixDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7Z0JBQ2pELG9CQUFvQixFQUFFLGVBQWU7YUFDdEM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSwgVGFncyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMsIFBpcGVsaW5lVHlwZSwgVmFyaWFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lJztcbmltcG9ydCAqIGFzIGV2ZW50cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzJztcbmltcG9ydCAqIGFzIHRhcmdldHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCB7IEVmZmVjdCwgUG9saWN5U3RhdGVtZW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgc25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0IHsgQ29kZVBpcGVsaW5lLCB0eXBlIENvZGVCdWlsZE9wdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYi9waXBlbGluZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBkZXNjcmliZURlcGxveUF0dHJpYnV0aW9uIH0gZnJvbSAnLi9kZXBsb3ktYXR0cmlidXRpb24uanMnO1xuaW1wb3J0IHsgUGlwZWxpbmVDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9waXBlbGluZS1jb25maWd1cmF0aW9uLmpzJztcbmltcG9ydCB7IFBsdWdpbkxvb2t1cCB9IGZyb20gJy4vcGx1Z2luLWxvb2t1cC5qcyc7XG5pbXBvcnQgeyBTb3VyY2VCdWlsZGVyIH0gZnJvbSAnLi9zb3VyY2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBTdGFnZUJ1aWxkZXIgfSBmcm9tICcuL3N0YWdlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgU3RlcE1hbmlmZXN0UmVjb3JkZXIgfSBmcm9tICcuL3N0ZXAtbWFuaWZlc3QtcmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU9wdGlvbnMsIFN5bnRoT3B0aW9ucyB9IGZyb20gJy4vc3RlcC10eXBlcy5qcyc7XG5pbXBvcnQgeyBDb25maWcsIENvcmVDb25zdGFudHMsIGlzUmVzZXJ2ZWRUYWdLZXkgfSBmcm9tICcuLi9jb25maWcvYXBwLWNvbmZpZy5qcyc7XG5pbXBvcnQgeyBsYW1iZGFBcmNoaXRlY3R1cmUsIGxhbWJkYVJ1bnRpbWUsIGxhbWJkYVRpbWVvdXQgfSBmcm9tICcuLi9jb25maWcvYXdzLWNvbmZpZy1jZGsuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWdpc3RyeUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9jb25maWctdHlwZXMuanMnO1xuaW1wb3J0IHsgQXJ0aWZhY3RNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS9hcnRpZmFjdC1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IFVuaXF1ZUlkIH0gZnJvbSAnLi4vY29yZS9pZC1nZW5lcmF0b3IuanMnO1xuaW1wb3J0IHtcbiAgYXNJbnQsXG4gIGlzVHJ1ZSxcbiAgbWV0YWRhdGFGb3JDb2RlUGlwZWxpbmUsXG4gIG5ldHdvcmtDb25maWdGcm9tTWV0YWRhdGEsXG4gIHBhcnNlUGlwZWxpbmVWYXJpYWJsZXMsXG4gIHJvbGVDb25maWdGcm9tTWV0YWRhdGEsXG4gIHNlY3VyaXR5R3JvdXBDb25maWdGcm9tTWV0YWRhdGEsXG59IGZyb20gJy4uL2NvcmUvbWV0YWRhdGEtYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENvZGVCdWlsZERlZmF1bHRzIH0gZnJvbSAnLi4vY29yZS9uZXR3b3JrLXR5cGVzLmpzJztcbmltcG9ydCB7IHJlc29sdmVOZXR3b3JrLCBuZXR3b3JrQ29uZmlnRnJvbUVudiB9IGZyb20gJy4uL2NvcmUvbmV0d29yay5qcyc7XG5pbXBvcnQgeyBjcmVhdGVDb2RlQnVpbGRTdGVwLCBnZXRDb21wdXRlVHlwZSwgcmVzb2x2ZURlZmF1bHRCdWlsZEltYWdlIH0gZnJvbSAnLi4vY29yZS9waXBlbGluZS1oZWxwZXJzLmpzJztcbmltcG9ydCB7IFBJUEVMSU5FX1JFR0lTVFJBVElPTl9TRUNSRVRfRU5WLCBQSVBFTElORV9SRUdJU1RSQVRJT05fU0VDUkVUX0xFQUYgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLXJlZ2lzdHJhdGlvbi5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YUtleXMsIFRyaWdnZXJUeXBlIH0gZnJvbSAnLi4vY29yZS9waXBlbGluZS10eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1ldGFEYXRhVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMuanMnO1xuaW1wb3J0IHsgUExBVEZPUk1fQ0FfQlVORExFX0VOViwgUExBVEZPUk1fVExTX1ZFUklGWV9FTlYsIHBsYXRmb3JtQ2FCdW5kbGUsIHBsYXRmb3JtVGxzVmVyaWZ5IH0gZnJvbSAnLi4vY29yZS9wbGF0Zm9ybS10bHMuanMnO1xuaW1wb3J0IHsgYXNzZXJ0UGx1Z2luQ29udHJhY3QsIGNvbnRyYWN0U2NvcGVGcm9tVGVtcGxhdGVTY29wZSwgcGx1Z2luQXJ0aWZhY3RBbGlhcywgcGx1Z2luU3RlcExhYmVsIH0gZnJvbSAnLi4vY29yZS9wbHVnaW4tY29udHJhY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBSb2xlQ29uZmlnIH0gZnJvbSAnLi4vY29yZS9yb2xlLXR5cGVzLmpzJztcbmltcG9ydCB7IHJlc29sdmVSb2xlIH0gZnJvbSAnLi4vY29yZS9yb2xlLmpzJztcbmltcG9ydCB7IGlzUnVudGltZVZ1bG5DaGVja0VuYWJsZWQsIFJVTlRJTUVfVlVMTl9DSEVDS19LRVkgfSBmcm9tICcuLi9jb3JlL3J1bnRpbWUtY2hlY2suanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVNlY3VyaXR5R3JvdXAgfSBmcm9tICcuLi9jb3JlL3NlY3VyaXR5LWdyb3VwLmpzJztcbmltcG9ydCB0eXBlIHsgU3RlcE1hbmlmZXN0RW50cnkgfSBmcm9tICcuLi9jb3JlL3N0ZXAtbWFuaWZlc3QuanMnO1xuXG5jb25zdCBQSVBFTElORV9FVkVOVF9NQVA6IFJlY29yZDxzdHJpbmcsIFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzPiA9IHtcbiAgRkFJTEVEOiBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cy5QSVBFTElORV9FWEVDVVRJT05fRkFJTEVELFxuICBTVUNDRUVERUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9TVUNDRUVERUQsXG4gIFNUQVJURUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9TVEFSVEVELFxuICBDQU5DRUxFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX0NBTkNFTEVELFxuICBTVVBFUlNFREVEOiBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cy5QSVBFTElORV9FWEVDVVRJT05fU1VQRVJTRURFRCxcbn07XG5cbmZ1bmN0aW9uIHBhcnNlTm90aWZpY2F0aW9uRXZlbnRzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKTtcbiAgcmV0dXJuIFsnRkFJTEVEJywgJ1NVQ0NFRURFRCddO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBgcGIuZGVwbG95c2AgdGFnIHZhbHVlIGFuZCBlbWl0IHRoZSBzeW50aC10aW1lIHdhcm5pbmdzIHRoYXQgY29tZVxuICogd2l0aCBpdC4gVGhlIGRlcml2YXRpb24gaXRzZWxmIGlzIENESy1mcmVlIGFuZCBsaXZlcyBpblxuICoge0BsaW5rIGRlc2NyaWJlRGVwbG95QXR0cmlidXRpb259LCBzbyBgUE9TVCAvcGlwZWxpbmVzYCBhbmRcbiAqIGBQT1NUIC9waXBlbGluZXMvdmFsaWRhdGVgIHJlcG9ydCB0aGUgc2FtZSBhdHRyaWJ1dGlvbiB3aXRob3V0IHN5bnRoZXNpemluZy5cbiAqXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIG5vdGhpbmcgZGVjbGFyZXMgYW4gZW52aXJvbm1lbnQgKG5vIGRlcGxveSBzaWduYWwpLlxuICovXG5mdW5jdGlvbiBidWlsZERlcGxveXNUYWcocHJvcHM6IEJ1aWxkZXJQcm9wcyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgZGVwbG95c1RhZywgd2FybmluZ3MgfSA9IGRlc2NyaWJlRGVwbG95QXR0cmlidXRpb24ocHJvcHMpO1xuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoJ3BpcGVsaW5lLWJ1aWxkZXInKTtcbiAgZm9yIChjb25zdCB3IG9mIHdhcm5pbmdzKSBsb2cud2Fybih3Lm1lc3NhZ2UpO1xuICByZXR1cm4gZGVwbG95c1RhZztcbn1cblxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIFBpcGVsaW5lQnVpbGRlciBjb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZGVyUHJvcHMge1xuICAvKiogUHJvamVjdCBpZGVudGlmaWVyICh3aWxsIGJlIHNhbml0aXplZCB0byBsb3dlcmNhc2UgYWxwaGFudW1lcmljIHdpdGggdW5kZXJzY29yZXMpICovXG4gIHJlYWRvbmx5IHByb2plY3Q6IHN0cmluZztcblxuICAvKiogT3JnYW5pemF0aW9uIGlkZW50aWZpZXIgKHdpbGwgYmUgc2FuaXRpemVkIHRvIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgd2l0aCB1bmRlcnNjb3JlcykgKi9cbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRlcGxveSBlbnZpcm9ubWVudCAoZS5nLiBgcHJvZHVjdGlvbmAsIGBzdGFnaW5nYCkgZm9yIHRoZVxuICAgKiBzaW5nbGUtZW52aXJvbm1lbnQgY2FzZS4gV2hlbiBzZXQgKGFuZCBubyBzdGFnZSBkZWNsYXJlcyBpdHMgb3duXG4gICAqIGBlbnZpcm9ubWVudGApLCBwaXBlbGluZS1jb3JlIGRlcml2ZXMgdGhlIGBwYi5kZXBsb3lzYCB0YWcgZnJvbSBpdCwgbWFya2luZ1xuICAgKiB0aGUgc29sZSBzdGFnZSDigJQgb3IgdGhlIExBU1Qgc3RhZ2Ugb2YgYSBtdWx0aS1zdGFnZSBwaXBlbGluZSAod2l0aCBhIHN5bnRoXG4gICAqIHdhcm5pbmcpLCBvciBhIGxpdGVyYWwgYERlcGxveWAgc3RhZ2Ugd2hlbiB0aGVyZSBhcmUgbm8gc3RhZ2VzIHRvIG5hbWUg4oCUIGFzXG4gICAqIHRoZSBkZXBsb3kgZm9yIERPUkEgbWV0cmljcy4gRm9yIG11bHRpLWVudmlyb25tZW50IHBpcGVsaW5lcywgZGVjbGFyZVxuICAgKiBgZW52aXJvbm1lbnRgIHBlciBzdGFnZSBpbnN0ZWFkIChzZWUgYFN0YWdlT3B0aW9ucy5lbnZpcm9ubWVudGApLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG5cbiAgLyoqIFRlbmFudCBpZGVudGlmaWVyIGZvciByZXNvbHZpbmcgcGVyLW9yZyBzZWNyZXRzIGZyb20gQVdTIFNlY3JldHMgTWFuYWdlciAqL1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZztcblxuICAvKiogUGlwZWxpbmUgZGF0YWJhc2UgcmVjb3JkIElEIOKAlCBpbmplY3RlZCBhcyBQSVBFTElORV9JRCBlbnYgdmFyIGZvciBhdXRvbm9tb3VzIHN5bnRoICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lSWQ/OiBzdHJpbmc7XG5cbiAgLyoqIE9wdGlvbmFsIGN1c3RvbSBwaXBlbGluZSBuYW1lLiBEZWZhdWx0cyB0bzoge29yZ2FuaXphdGlvbn0te3Byb2plY3R9LXBpcGVsaW5lICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZT86IHN0cmluZztcblxuICAvKiogR2xvYmFsIG1ldGFkYXRhIGluaGVyaXRlZCBieSBhbGwgcGlwZWxpbmUgc3RlcHMgKi9cbiAgcmVhZG9ubHkgZ2xvYmFsPzogTWV0YURhdGFUeXBlO1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZS1sZXZlbCB0ZW1wbGF0ZSB2YXJpYWJsZXMsIGV4cG9zZWQgdG8gYHt7IHBpcGVsaW5lLnZhcnMuKiB9fWAgaW5cbiAgICogcGlwZWxpbmUgY29uZmlncyBhbmQgcGx1Z2luIHNwZWNzIChzZWUgYFBsdWdpblNwZWMucmVxdWlyZWRWYXJzYCkuIERlY2xhcmVkXG4gICAqIGhlcmUgc28gdGhlIGBwaXBlbGluZS52YXJzYCB0ZW1wbGF0ZSBzY29wZSBpcyB0eXBlLWNoZWNrZWQgZW5kLXRvLWVuZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogUGlwZWxpbmUtbGV2ZWwgQ29kZUJ1aWxkIGRlZmF1bHRzIGFwcGxpZWQgdG8gYWxsIENvZGVCdWlsZCBhY3Rpb25zXG4gICAqIChzeW50aCwgc2VsZi1tdXRhdGlvbiwgYXNzZXQgcHVibGlzaGluZykgdmlhIGBjb2RlQnVpbGREZWZhdWx0c2AuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0cz86IENvZGVCdWlsZERlZmF1bHRzO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBJQU0gcm9sZSBmb3IgdGhlIENvZGVQaXBlbGluZS5cbiAgICogV2hlbiBwcm92aWRlZCwgcmVzb2x2ZXMgdG8gYSBDREsgSVJvbGUgYW5kIGlzIHBhc3NlZCB0byB0aGUgQ29kZVBpcGVsaW5lIGNvbnN0cnVjdC5cbiAgICogV2hlbiBvbWl0dGVkLCBDREsgYXV0by1jcmVhdGVzIGEgcm9sZSB3aXRoIHRoZSBjb3JyZWN0IGNvZGVwaXBlbGluZS5hbWF6b25hd3MuY29tIHByaW5jaXBhbC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBSb2xlQ29uZmlnO1xuXG4gIC8qKiBTeW50aGVzaXMgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgc291cmNlIGFuZCBwbHVnaW4gZGV0YWlscyAqL1xuICByZWFkb25seSBzeW50aDogU3ludGhPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBwaXBlbGluZSBzdGFnZXMsIGVhY2ggY29udGFpbmluZyBvbmUgb3IgbW9yZSBDb2RlQnVpbGQgc3RlcHMuXG4gICAqIFN0YWdlcyBhcmUgYWRkZWQgYXMgd2F2ZXMgdG8gdGhlIENvZGVQaXBlbGluZSBhZnRlciB0aGUgc3ludGggc3RlcC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWdlcz86IFN0YWdlT3B0aW9uc1tdO1xuXG4gIC8qKiBPcHRpb25hbCBjcm9uL3JhdGUgZXhwcmVzc2lvbiBmb3Igc2NoZWR1bGVkIHBpcGVsaW5lIGV4ZWN1dGlvbi4gKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU/OiBzdHJpbmc7XG5cbiAgLyoqIEN1c3RvbSB0YWdzIGFwcGxpZWQgdG8gYWxsIHBpcGVsaW5lIHJlc291cmNlcy4gKi9cbiAgcmVhZG9ubHkgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFBsdWdpbnMgcHJlLXJlc29sdmVkIGJ5IGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoYCBmcm9tIHRoZSBwbGF0Zm9ybSBBUEksXG4gICAqIGtleWVkIGJ5IGBhbGlhcyB8fCBuYW1lYC4gV2hlbiBwcmVzZW50LCBgUGx1Z2luTG9va3VwLnBsdWdpbigpYCByZXR1cm5zXG4gICAqIHRoZSBtYXRjaGluZyBlbnRyeSBkaXJlY3RseSBhbmQgc2tpcHMgdGhlIGN1c3RvbSByZXNvdXJjZSDigJQgc28gdGhlXG4gICAqIHN5bnRoZXNpemVkIENGTiB0ZW1wbGF0ZSBzaGlwcyB3aXRoIHRoZSByZWFsIENvZGVCdWlsZCBpbWFnZSBiYWtlZCBpbi5cbiAgICogUG9wdWxhdGVkIGJ5IHRoZSBDTEkgYmVmb3JlIGludm9raW5nIHRoZSBib2lsZXJwbGF0ZSBhcHA7IENESyBjb25zdW1lcnNcbiAgICogd2hvIGNvbnN0cnVjdCBQaXBlbGluZUJ1aWxkZXIgZGlyZWN0bHkgbm9ybWFsbHkgbGVhdmUgdGhpcyB1bnNldC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVkUGx1Z2lucz86IFJlY29yZDxzdHJpbmcsIFBsdWdpbj47XG5cbiAgLyoqXG4gICAqIFBsYXRmb3JtLXNvdXJjZWQgcmVnaXN0cnkgb3ZlcnJpZGVzLCBhcHBsaWVkIG92ZXIgdGhlIGVudi1sb2FkZWQgYHJlZ2lzdHJ5YFxuICAgKiBjb25maWcgYXQgc3ludGggc3RhcnQuIHBpcGVsaW5lLW1hbmFnZXIgcG9wdWxhdGVzIHRoaXMgZnJvbSB0aGUgcGxhdGZvcm0gVVJMXG4gICAqIGl0IGRlcGxveXMgYWdhaW5zdCBzbyB0aGUgQ29kZUJ1aWxkIGltYWdlIFVSSXMgdXNlIGEgcHVsbCBob3N0IEFXUyBDb2RlQnVpbGRcbiAgICogY2FuIHJlc29sdmUgKGluc3RlYWQgb2YgdGhlIGluLWNsdXN0ZXIgYHJlZ2lzdHJ5OjUwMDBgIGRlZmF1bHQpLiBDREtcbiAgICogY29uc3VtZXJzIGNvbnN0cnVjdGluZyBQaXBlbGluZUJ1aWxkZXIgZGlyZWN0bHkgbm9ybWFsbHkgbGVhdmUgdGhpcyB1bnNldC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lzdHJ5PzogUGFydGlhbDxSZWdpc3RyeUNvbmZpZz47XG59XG5cbi8qKlxuICogQ0RLIGNvbnN0cnVjdCB0aGF0IGNyZWF0ZXMgYW5kIGNvbmZpZ3VyZXMgYSBDb2RlUGlwZWxpbmUgZm9yIGNvbnRpbnVvdXMgZGVwbG95bWVudC5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gTXVsdGktc291cmNlIHN1cHBvcnQgKFMzLCBHaXRIdWIsIENvZGVTdGFyKVxuICogLSBQbHVnaW4tYmFzZWQgYnVpbGQgc3RlcHNcbiAqIC0gTWV0YWRhdGEtZHJpdmVuIGNvbmZpZ3VyYXRpb25cbiAqIC0gQXV0b21hdGljIHRhZ2dpbmdcbiAqIC0gQXV0b21hdGljIHNhbml0aXphdGlvbiBvZiBwcm9qZWN0IGFuZCBvcmdhbml6YXRpb24gbmFtZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogbmV3IFBpcGVsaW5lQnVpbGRlcih0aGlzLCAnTXlQaXBlbGluZScsIHtcbiAqICAgcHJvamVjdDogJ215LWFwcCcsXG4gKiAgIG9yZ2FuaXphdGlvbjogJ215LW9yZycsXG4gKiAgIHN5bnRoOiB7XG4gKiAgICAgc291cmNlOiB7XG4gKiAgICAgICB0eXBlOiAnZ2l0aHViJyxcbiAqICAgICAgIG9wdGlvbnM6IHsgcmVwbzogJ293bmVyL3JlcG8nLCBicmFuY2g6ICdtYWluJyB9XG4gKiAgICAgfSxcbiAqICAgICBwbHVnaW46IHsgbmFtZTogJ3N5bnRoJyB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXBlbGluZUJ1aWxkZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgcGlwZWxpbmU6IENvZGVQaXBlbGluZTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZzogUGlwZWxpbmVDb25maWd1cmF0aW9uO1xuICAvKipcbiAgICogV2hpY2ggcGx1Z2luIGVhY2ggQ29kZVBpcGVsaW5lIGFjdGlvbiBydW5zLCByZWFkIG9mZiB0aGUgYnVpbHRcbiAgICogcGlwZWxpbmUuIFRoZSBDTEkgc2hpcHMgaXQgd2l0aCB0aGUgcmVnaXN0cnkgcmVnaXN0cmF0aW9uIHNvIGV2ZW50IGluZ2VzdFxuICAgKiBjYW4gYXR0cmlidXRlIGFjdGlvbiBvdXRjb21lcyB0byBhIHBsdWdpbiB2ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0ZXBNYW5pZmVzdDogU3RlcE1hbmlmZXN0RW50cnlbXTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQnVpbGRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIEFwcGx5IHBsYXRmb3JtLXNvdXJjZWQgcmVnaXN0cnkgb3ZlcnJpZGVzIEJFRk9SRSBhbnkgQ29uZmlnLmdldCgncmVnaXN0cnknKVxuICAgIC8vIChwbHVnaW4vZGVmYXVsdCBidWlsZC1pbWFnZSByZXNvbHV0aW9uIGJlbG93KSBzbyB0aGUgc3ludGggdXNlcyB0aGUgcHVsbFxuICAgIC8vIGhvc3QgdGhlIHBsYXRmb3JtIGRlcGxveXMgYWdhaW5zdCwgbm90IHRoZSBpbi1jbHVzdGVyIGVudiBkZWZhdWx0LiBUaGUgQ0xJXG4gICAgLy8gb25seSBzZXRzIHByb3BzLnJlZ2lzdHJ5IHdoZW4gSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUIGlzIHVuc2V0LCBzbyBhblxuICAgIC8vIGV4cGxpY2l0IG9wZXJhdG9yIHB1bGwgaG9zdCBpcyBuZXZlciBjbG9iYmVyZWQgKHNlZSBiYWtlUGxhdGZvcm1SZWdpc3RyeSkuXG4gICAgLy9cbiAgICAvLyBTY29wZWQgKyByZXN0b3JlZCBzbyB0aGUgb3ZlcnJpZGUgZG9lcyBOT1QgbGVhayBpbnRvIHRoZSBwcm9jZXNzLXdpZGVcbiAgICAvLyBDb25maWcgY2FjaGU6IGluIGEgbXVsdGktcGlwZWxpbmUgQ0RLIGFwcCwgcGlwZWxpbmUgQidzIHJlZ2lzdHJ5IG11c3Qgbm90XG4gICAgLy8gYmxlZWQgaW50byBwaXBlbGluZSBBJ3MgaW1hZ2UgcmVzb2x1dGlvbi4gQWxsIHJlZ2lzdHJ5IHJlYWRzIGhhcHBlblxuICAgIC8vIHN5bmNocm9ub3VzbHkgYmVsb3cgKGJ1aWxkLWltYWdlIHJlc29sdXRpb24pLCBzbyByZXN0b3JpbmcgYXQgdGhlIGVuZCBvZlxuICAgIC8vIHRoZSBjb25zdHJ1Y3RvciBrZWVwcyBzaW5nbGUtcGlwZWxpbmUgYmVoYXZpb3IgaWRlbnRpY2FsLlxuICAgIGNvbnN0IHJlc3RvcmVSZWdpc3RyeSA9IHByb3BzLnJlZ2lzdHJ5XG4gICAgICA/IENvbmZpZy5vdmVycmlkZVNjb3BlZCgncmVnaXN0cnknLCBwcm9wcy5yZWdpc3RyeSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgUGlwZWxpbmVDb25maWd1cmF0aW9uIGZvciBhbGwgYnVzaW5lc3MgbG9naWMgKHZhbGlkYXRpb24sIHNhbml0aXphdGlvbiwgbWV0YWRhdGEgbWVyZ2luZylcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IFBpcGVsaW5lQ29uZmlndXJhdGlvbihwcm9wcyk7XG5cbiAgICAgIGNvbnN0IHNlcnZlckNvbmZpZyA9IENvbmZpZy5nZXQoJ3NlcnZlcicpO1xuICAgICAgY29uc3QgYXdzQ29uZmlnID0gQ29uZmlnLmdldCgnYXdzJyk7XG4gICAgICAvLyBQYXNzIG9yZytwcm9qZWN0IHNvIGxvZyBncm91cCAvIElBTSByb2xlIG5hbWVzIGdldCBhIHN0YWJsZSBoYXNoXG4gICAgICAvLyBzdWZmaXggcGVyIHBpcGVsaW5lLiBQcmV2ZW50cyBgUmVzb3VyY2UgYWxyZWFkeSBleGlzdHNgIGNvbGxpc2lvbnNcbiAgICAgIC8vIGFjcm9zcyBzdGFja3MgZGVwbG95ZWQgdG8gdGhlIHNhbWUgQVdTIGFjY291bnQuXG4gICAgICBjb25zdCB1bmlxdWVJZCA9IG5ldyBVbmlxdWVJZCh7XG4gICAgICAgIG9yZ2FuaXphdGlvbjogdGhpcy5jb25maWcub3JnYW5pemF0aW9uLFxuICAgICAgICBwcm9qZWN0OiB0aGlzLmNvbmZpZy5wcm9qZWN0LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwbHVnaW5Mb29rdXAgPSBuZXcgUGx1Z2luTG9va3VwKFxuICAgICAgICB0aGlzLFxuICAgICAgICB1bmlxdWVJZC5nZW5lcmF0ZSgncGx1Z2luOmxvb2t1cCcpLFxuICAgICAgICB7XG4gICAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5vcmdhbml6YXRpb24sXG4gICAgICAgICAgcHJvamVjdDogdGhpcy5jb25maWcucHJvamVjdCxcbiAgICAgICAgICBwbGF0Zm9ybVVybDogc2VydmVyQ29uZmlnLnBsYXRmb3JtVXJsLFxuICAgICAgICAgIHVuaXF1ZUlkLFxuICAgICAgICAgIG9yZ0lkOiBwcm9wcy5vcmdJZCxcbiAgICAgICAgICBwaXBlbGluZUlkOiBwcm9wcy5waXBlbGluZUlkLFxuICAgICAgICAgIHJ1bnRpbWU6IGxhbWJkYVJ1bnRpbWUoYXdzQ29uZmlnLmxhbWJkYS5ydW50aW1lKSxcbiAgICAgICAgICB0aW1lb3V0OiBsYW1iZGFUaW1lb3V0KGF3c0NvbmZpZy5sYW1iZGEudGltZW91dFNlY29uZHMpLFxuICAgICAgICAgIGFyY2hpdGVjdHVyZTogbGFtYmRhQXJjaGl0ZWN0dXJlKGF3c0NvbmZpZy5sYW1iZGEuYXJjaGl0ZWN0dXJlKSxcbiAgICAgICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiBhd3NDb25maWcubGFtYmRhLnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgICAgICAgcmVzb2x2ZWRQbHVnaW5zOiBwcm9wcy5yZXNvbHZlZFBsdWdpbnMsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICAvLyBDcmVhdGUgc291cmNlIGFuZCBidWlsZCBzdGVwXG4gICAgICBjb25zdCBzb3VyY2VCdWlsZGVyID0gbmV3IFNvdXJjZUJ1aWxkZXIodGhpcywgdGhpcy5jb25maWcpO1xuICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQnVpbGRlci5jcmVhdGUodW5pcXVlSWQpO1xuXG4gICAgICAvLyBTeW50aC1wbHVnaW4gcmVzb2x1dGlvbjpcbiAgICAgIC8vICAgMS4gUHJlLXJlc29sdmVkIGJ5IGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoL2RlcGxveWAgZnJvbSB0aGUgcGxhdGZvcm1cbiAgICAgIC8vICAgICAgQVBJIOKGkiB1c2UgaXQuIFN5bnRoIHN0ZXAgcnVucyBvbiB0aGUgcmVhbCBgY2RrLXN5bnRoYCBpbWFnZSB3aXRoXG4gICAgICAvLyAgICAgIHJlYWwgY29tbWFuZHMgYmFrZWQgaW50byB0aGUgdGVtcGxhdGUuXG4gICAgICAvLyAgIDIuIE90aGVyd2lzZSDihpIgYGJvb3RzdHJhcCgpYDogY29sZC1zdGFydCBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aGBcbiAgICAgIC8vICAgICAgb24gdGhlIGNvbmZpZ3VyZWQgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0UgKGRlZmF1bHRcbiAgICAgIC8vICAgICAgcGlwZWxpbmUtYm9vdHN0cmFwOjEuMCkuIFVzZWQgd2hlbiB0aGUgcGxhdGZvcm0gaXNuJ3QgcmVhY2hhYmxlXG4gICAgICAvLyAgICAgIGF0IHN5bnRoIHRpbWUgKENMSSBsb2dzIGEgd2FybmluZyBwZXIgbWlzc2VkIHBsdWdpbikuXG4gICAgICAvL1xuICAgICAgLy8gcGx1Z2luTG9va3VwLnBsdWdpbigpIHJlYWRzIGByZXNvbHZlZFBsdWdpbnNgIGludGVybmFsbHkgYW5kIHJldHVybnNcbiAgICAgIC8vIHRoZSBjYWNoZWQgZW50cnkgd2hlbiBwcmVzZW50IOKAlCBzbyBjYWxsaW5nIGl0IGFsd2F5cyB3aW5zIG92ZXJcbiAgICAgIC8vIGJvb3RzdHJhcCgpIHdoZW4gcHJlLXJlc29sdXRpb24gc3VjY2VlZGVkLlxuICAgICAgY29uc3Qgc3ludGhDYWNoZUtleSA9IHBsdWdpbkFydGlmYWN0QWxpYXModGhpcy5jb25maWcucGx1Z2luKTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IHByb3BzLnJlc29sdmVkUGx1Z2lucz8uW3N5bnRoQ2FjaGVLZXldXG4gICAgICAgID8gcGx1Z2luTG9va3VwLnBsdWdpbih0aGlzLmNvbmZpZy5wbHVnaW4sIHBsdWdpblN0ZXBMYWJlbChudWxsLCB0aGlzLmNvbmZpZy5wbHVnaW4pKVxuICAgICAgICA6IHBsdWdpbkxvb2t1cC5ib290c3RyYXAoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRDb21wdXRlVHlwZSA9IGdldENvbXB1dGVUeXBlKGF3c0NvbmZpZy5jb2RlQnVpbGQuY29tcHV0ZVR5cGUpO1xuICAgICAgY29uc3QgYXJ0aWZhY3RNYW5hZ2VyID0gbmV3IEFydGlmYWN0TWFuYWdlcigpO1xuXG4gICAgICAvLyBTY29wZSBleHBvc2VkIHRvIHBsdWdpbi1zcGVjIHRlbXBsYXRlcyBhcyBgcGlwZWxpbmUuKmAuIFNvdXJjZWQgZnJvbSB0aGVcbiAgICAgIC8vIGNvbmZpZyBzbyB0aGUgc3ludGggc3RlcCwgZXZlcnkgc3RhZ2Ugc3RlcCwgYW5kIHRoZSBzb3VyY2UgdG9rZW4gYWxsXG4gICAgICAvLyByZXNvbHZlIGFnYWluc3QgdGhlIHNhbWUgc25hcHNob3QgKHNlZSBQaXBlbGluZUNvbmZpZ3VyYXRpb24uZ2V0UGlwZWxpbmVTY29wZSkuXG4gICAgICBjb25zdCBwaXBlbGluZVNjb3BlID0gdGhpcy5jb25maWcuZ2V0UGlwZWxpbmVTY29wZSgpO1xuICAgICAgLy8gQ29udHJhY3Qg4oCUIHNlZSBTdGFnZUJ1aWxkZXIucmVzb2x2ZVN0ZXAuXG4gICAgICBhc3NlcnRQbHVnaW5Db250cmFjdChwbHVnaW4sIGNvbnRyYWN0U2NvcGVGcm9tVGVtcGxhdGVTY29wZShwaXBlbGluZVNjb3BlKSwgJ3N5bnRoJyk7XG5cbiAgICAgIGNvbnN0IHN0ZXBNYW5pZmVzdCA9IG5ldyBTdGVwTWFuaWZlc3RSZWNvcmRlcigpO1xuICAgICAgY29uc3Qgc3ludGggPSBjcmVhdGVDb2RlQnVpbGRTdGVwKHtcbiAgICAgICAgLi4udGhpcy5jb25maWcuc3ludGhDdXN0b21pemF0aW9uLFxuICAgICAgICBpZDogdW5pcXVlSWQuZ2VuZXJhdGUoJ2NkazpzeW50aCcpLFxuICAgICAgICB1bmlxdWVJZCxcbiAgICAgICAgcGx1Z2luLFxuICAgICAgICBpbnB1dDogc291cmNlLFxuICAgICAgICBtZXRhZGF0YTogdGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkLFxuICAgICAgICBuZXR3b3JrOiB0aGlzLmNvbmZpZy5uZXR3b3JrLFxuICAgICAgICBzY29wZTogdGhpcyxcbiAgICAgICAgZGVmYXVsdENvbXB1dGVUeXBlLFxuICAgICAgICBhcnRpZmFjdE1hbmFnZXIsXG4gICAgICAgIHN0YWdlTmFtZTogJ25vLXN0YWdlJyxcbiAgICAgICAgc3RhZ2VBbGlhczogJ25vLXN0YWdlLWFsaWFzJyxcbiAgICAgICAgLy8gVGhlIGNhbm9uaWNhbCBrZXkgc2VnbWVudC4gYCR7YWxpYXMgPz8gbmFtZX0tYWxpYXNgIHN1ZmZpeGVkIGFuXG4gICAgICAgIC8vIEVYUExJQ0lUIGFsaWFzIHRvbyAoYG15LXN5bnRoYCDihpIgYG15LXN5bnRoLWFsaWFzYCksIHNvIGEgc3RhZ2UgdGhhdFxuICAgICAgICAvLyBwaWNrZWQgdGhlIHN5bnRoIG91dHB1dCBpbiB0aGUgVUkgYXNrZWQgZm9yIGEga2V5IG5ldmVyIHJlZ2lzdGVyZWQuXG4gICAgICAgIHBsdWdpbkFsaWFzOiBwbHVnaW5BcnRpZmFjdEFsaWFzKHRoaXMuY29uZmlnLnBsdWdpbiksXG4gICAgICAgIG9yZ0lkOiBwcm9wcy5vcmdJZCxcbiAgICAgICAgcGlwZWxpbmVTY29wZSxcbiAgICAgIH0pO1xuICAgICAgc3RlcE1hbmlmZXN0LnJlY29yZChzeW50aCwgcGx1Z2luLCBwbHVnaW5TdGVwTGFiZWwobnVsbCwgdGhpcy5jb25maWcucGx1Z2luKSk7XG5cbiAgICAgIC8vIFJlc29sdmUgcGlwZWxpbmUtbGV2ZWwgZGVmYXVsdHMgaW50byBjb2RlQnVpbGREZWZhdWx0c1xuICAgICAgLy8gQnVpbGQgdGhlIHBlci1vcmcgcGxhdGZvcm0gc2VjcmV0IG5hbWUgZm9yIENvZGVCdWlsZCBlbnYgdmFyc1xuICAgICAgY29uc3QgcGxhdGZvcm1TZWNyZXROYW1lID0gcHJvcHMub3JnSWRcbiAgICAgICAgPyBDb3JlQ29uc3RhbnRzLnNlY3JldFBhdGgocHJvcHMub3JnSWQsICdwbGF0Zm9ybScpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgLy8gVGhlIHJlZ2lzdHJhdGlvbiBrZXkgdGhlIHN5bnRoIHBvc3RzIGl0cyBzdGVwIG1hbmlmZXN0IHdpdGgg4oCUIGFcbiAgICAgIC8vIHNlcGFyYXRlIGNyZWRlbnRpYWwgZnJvbSB0aGUgcGxhdGZvcm0gb25lIChjb3JlL3BpcGVsaW5lLXJlZ2lzdHJhdGlvbi50cykuXG4gICAgICBjb25zdCByZWdpc3RyYXRpb25TZWNyZXROYW1lID0gcHJvcHMub3JnSWRcbiAgICAgICAgPyBDb3JlQ29uc3RhbnRzLnNlY3JldFBhdGgocHJvcHMub3JnSWQsIFBJUEVMSU5FX1JFR0lTVFJBVElPTl9TRUNSRVRfTEVBRilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGNvZGVCdWlsZERlZmF1bHRzID0gdGhpcy5yZXNvbHZlRGVmYXVsdHModGhpcy5jb25maWcuZGVmYXVsdHMsIHVuaXF1ZUlkLCBwcm9wcy5waXBlbGluZUlkLCBwbGF0Zm9ybVNlY3JldE5hbWUsIHNlcnZlckNvbmZpZy5wbGF0Zm9ybVVybCwgcHJvcHMub3JnSWQpO1xuXG4gICAgICAvLyBSZXNvbHZlIElBTSByb2xlOiBleHBsaWNpdCBwcm9wIHdpbnMsIGVsc2UgYGlhbTpyb2xlYCBtZXRhZGF0YSwgZWxzZSBsZXRcbiAgICAgIC8vIENESyBhdXRvLWNyZWF0ZSB0aGUgcGlwZWxpbmUgcm9sZSAoY29kZXBpcGVsaW5lLmFtYXpvbmF3cy5jb20gcHJpbmNpcGFsKS5cbiAgICAgIGNvbnN0IHJvbGVDb25maWcgPSBwcm9wcy5yb2xlID8/IHJvbGVDb25maWdGcm9tTWV0YWRhdGEodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkKTtcbiAgICAgIGlmIChyb2xlQ29uZmlnPy50eXBlID09PSAnY29kZUJ1aWxkRGVmYXVsdCcpIHtcbiAgICAgICAgY3JlYXRlTG9nZ2VyKCdwaXBlbGluZS1idWlsZGVyJykud2FybihcbiAgICAgICAgICAnY29kZUJ1aWxkRGVmYXVsdCByb2xlIHR5cGUgdXNlcyBjb2RlYnVpbGQuYW1hem9uYXdzLmNvbSB0cnVzdCBwcmluY2lwYWwg4oCUICcgK1xuICAgICAgICAndGhpcyBpcyBub3Qgc3VpdGFibGUgYXMgdGhlIHBpcGVsaW5lLWxldmVsIHJvbGUuIENvbnNpZGVyIHVzaW5nIHJvbGVBcm4vcm9sZU5hbWUgJyArXG4gICAgICAgICdvciBvbWl0dGluZyB0aGUgcm9sZSB0byBsZXQgQ0RLIGF1dG8tY3JlYXRlIG9uZSB3aXRoIGNvZGVwaXBlbGluZS5hbWF6b25hd3MuY29tLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCByb2xlID0gcm9sZUNvbmZpZ1xuICAgICAgICA/IHJlc29sdmVSb2xlKHRoaXMsIHVuaXF1ZUlkLCByb2xlQ29uZmlnKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgLy8g4pSA4pSAIEFydGlmYWN0IGJ1Y2tldCAoS01TIGVuY3J5cHRpb24gKyByZXRlbnRpb24pIOKUgOKUgFxuICAgICAgLy8gV2hlbiBgZW5jcnlwdGlvbi5rbXNLZXlBcm5gIGFuZC9vciBgb3BlcmF0aW9ucy5hcnRpZmFjdFJldGVudGlvbkRheXNgIGFyZVxuICAgICAgLy8gc2V0IHdlIGNyZWF0ZSBhIGN1c3RvbSBhcnRpZmFjdCBidWNrZXQgYW5kIHBhc3MgaXQgdG8gQ29kZVBpcGVsaW5lOyB0aGF0XG4gICAgICAvLyBpcyB0aGUgb25seSB3YXkgdG8gYXR0YWNoIGEgY3VzdG9tZXItbWFuYWdlZCBrZXkgKHRoZSBMMyBjb25zdHJ1Y3QgZXhwb3Nlc1xuICAgICAgLy8gYGFydGlmYWN0QnVja2V0YCwgbm90IGBlbmNyeXB0aW9uS2V5YCkuIEFic2VudCBib3RoIGtleXMsIENESyBhdXRvLWNyZWF0ZXNcbiAgICAgIC8vIHRoZSBidWNrZXQgYW5kIGJlaGF2aW9yIGlzIHVuY2hhbmdlZC5cbiAgICAgIGNvbnN0IGFydGlmYWN0QnVja2V0ID0gdGhpcy5idWlsZEFydGlmYWN0QnVja2V0KCk7XG5cbiAgICAgIC8vIENyZWF0ZSBDb2RlUGlwZWxpbmUgY29uc3RydWN0XG4gICAgICB0aGlzLnBpcGVsaW5lID0gbmV3IENvZGVQaXBlbGluZSh0aGlzLCB1bmlxdWVJZC5nZW5lcmF0ZSgncGlwZWxpbmVzOmNvZGVwaXBlbGluZScpLCB7XG4gICAgICAgIC4uLihjb2RlQnVpbGREZWZhdWx0cyAmJiB7IGNvZGVCdWlsZERlZmF1bHRzIH0pLFxuICAgICAgICAuLi4ocm9sZSAmJiB7IHJvbGUgfSksXG4gICAgICAgIC4uLihhcnRpZmFjdEJ1Y2tldCAmJiB7IGFydGlmYWN0QnVja2V0IH0pLFxuICAgICAgICBwaXBlbGluZVR5cGU6IFBpcGVsaW5lVHlwZS5WMixcbiAgICAgICAgcGlwZWxpbmVOYW1lOiB0aGlzLmNvbmZpZy5waXBlbGluZU5hbWUsXG4gICAgICAgIHN5bnRoLFxuICAgICAgICAuLi5tZXRhZGF0YUZvckNvZGVQaXBlbGluZSh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQpLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJ1bi10aW1lIHZ1bG5lcmFiaWxpdHkgY2hlY2sgKG9wdC1pbiBtZXRhZGF0YSBmbGFnLCByZXBvcnQtb25seSkuIEl0XG4gICAgICAvLyBuZWVkcyB0aGUgcGlwZWxpbmUgaWQgKHRoZSBjaGVjayBpcyBwZXIgcGlwZWxpbmUpIGFuZCB0aGUgb3JnIHBsYXRmb3JtXG4gICAgICAvLyBzZWNyZXQgKHRoZSB2ZXJpZnkgc3RlcCBhdXRoZW50aWNhdGVzIHdpdGggaXQpOyB3aXRob3V0IGVpdGhlciBpdCBpc1xuICAgICAgLy8gc2tpcHBlZCB3aXRoIGEgd2FybmluZyDigJQgYSB2aXNpYmlsaXR5IGZlYXR1cmUgbmV2ZXIgZmFpbHMgYSBzeW50aC5cbiAgICAgIGxldCBydW50aW1lVnVsbkNoZWNrID0gaXNSdW50aW1lVnVsbkNoZWNrRW5hYmxlZCh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQpO1xuICAgICAgaWYgKHJ1bnRpbWVWdWxuQ2hlY2sgJiYgKCFwcm9wcy5waXBlbGluZUlkIHx8ICFwbGF0Zm9ybVNlY3JldE5hbWUpKSB7XG4gICAgICAgIGNyZWF0ZUxvZ2dlcigncGlwZWxpbmUtYnVpbGRlcicpLndhcm4oXG4gICAgICAgICAgYCR7UlVOVElNRV9WVUxOX0NIRUNLX0tFWX0gaXMgZW5hYmxlZCBidXQgdGhlIHBpcGVsaW5lIGhhcyBubyAkeyFwcm9wcy5waXBlbGluZUlkID8gJ3BpcGVsaW5lSWQnIDogJ29yZ0lkJ30g4oCUIGBcbiAgICAgICAgICArICdza2lwcGluZyB0aGUgcnVuLXRpbWUgY2hlY2sgc3RlcHMuIFN5bnRoZXNpemUgdGhyb3VnaCBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aC9kZXBsb3kgLS1pZGAuJyxcbiAgICAgICAgKTtcbiAgICAgICAgcnVudGltZVZ1bG5DaGVjayA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMuc3RhZ2VzKSB7XG4gICAgICAgIGNvbnN0IHN0YWdlQnVpbGRlciA9IG5ldyBTdGFnZUJ1aWxkZXIoe1xuICAgICAgICAgIHNjb3BlOiB0aGlzLFxuICAgICAgICAgIHBsdWdpbkxvb2t1cCxcbiAgICAgICAgICB1bmlxdWVJZCxcbiAgICAgICAgICBnbG9iYWxNZXRhZGF0YTogdGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkLFxuICAgICAgICAgIGRlZmF1bHRDb21wdXRlVHlwZSxcbiAgICAgICAgICBhcnRpZmFjdE1hbmFnZXIsXG4gICAgICAgICAgb3JnSWQ6IHByb3BzLm9yZ0lkLFxuICAgICAgICAgIHBpcGVsaW5lU2NvcGUsXG4gICAgICAgICAgc3RlcE1hbmlmZXN0LFxuICAgICAgICAgIC4uLihydW50aW1lVnVsbkNoZWNrICYmIHBsYXRmb3JtU2VjcmV0TmFtZSAmJiB7IHJ1bnRpbWVWdWxuQ2hlY2s6IHsgcGxhdGZvcm1TZWNyZXROYW1lIH0gfSksXG4gICAgICAgIH0pO1xuICAgICAgICBzdGFnZUJ1aWxkZXIuYWRkU3RhZ2VzKHRoaXMucGlwZWxpbmUsIHByb3BzLnN0YWdlcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBUYWdzIOKUgOKUgFxuICAgICAgLy8gVGhlIGZpcnN0IHRocmVlIGFyZSBvcGVyYXRpb25zLWVzc2VudGlhbCBhbmQgdXNlZCBieSBgcGlwZWxpbmUtbWFuYWdlclxuICAgICAgLy8gYXVkaXQgc3RhY2tzYCB0byBkaWZmIENGTiBzdGFja3MgYWdhaW5zdCB0aGUgcGlwZWxpbmVfcmVnaXN0cnkgdGFibGUuXG4gICAgICAvLyBgT3JnSWRgIGlzIHRoZSBjYW5vbmljYWwga2V5IGZvciBjb3N0IGF0dHJpYnV0aW9uIChBV1MgQ29zdCBFeHBsb3JlclxuICAgICAgLy8gZ3JvdXBzIGJ5IHRhZyBrZXkvdmFsdWUgd2hlbiBhY3RpdmF0ZWQgaW4gQmlsbGluZyBzZXR0aW5ncykuXG4gICAgICAvLyBVU0VSIFRBR1MgRklSU1QsIHNvIHRoZSBwbGF0Zm9ybSB0YWdzIGJlbG93IG92ZXJ3cml0ZSByYXRoZXIgdGhhbiBhcmVcbiAgICAgIC8vIG92ZXJ3cml0dGVuLiBgVGFncy5vZmAgbGV0cyBhIGxhdGVyIGFkZCByZXBsYWNlIGFuIGVhcmxpZXIgb25lLCBhbmRcbiAgICAgIC8vIHRoZXNlIHVzZWQgdG8gYmUgYXBwbGllZCBMQVNUIOKAlCB3aGljaCBsZXQgYSBjYWxsZXIgcmVkZWZpbmVcbiAgICAgIC8vIHBiLnBpcGVsaW5lLWlkLCBPcmdJZCBvciBwYi5kZXBsb3lzIGFuZCBwb2ludCBhbm90aGVyIG9yZydzIGV4ZWN1dGlvbnNcbiAgICAgIC8vIGF0IHRoZWlyIG93biBwaXBlbGluZSwgc2luY2UgdGhlIGV2ZW50cyBMYW1iZGEgcmVhZHMgZXhhY3RseSB0aG9zZSB0YWdzXG4gICAgICAvLyB0byBkZWNpZGUgd2hvc2UgcmVwb3J0cyBhbiBleGVjdXRpb24gYmVsb25ncyB0by5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgcmVzZXJ2ZWQta2V5IGZpbHRlciBpcyB0aGUgc2Vjb25kIGhhbGY6IG9yZGVyaW5nIGFsb25lIHdvdWxkIGxldCBhXG4gICAgICAvLyBjYWxsZXIgc2V0IGBwYi5kZXBsb3lzYCBvbiBhIHBpcGVsaW5lIHRoYXQgZGVjbGFyZXMgbm8gZW52aXJvbm1lbnQgKG5vXG4gICAgICAvLyBwbGF0Zm9ybSB0YWcgdG8gb3ZlcndyaXRlIGl0KS4gVGhlIEFQSSByZWZ1c2VzIHRoZXNlIGtleXMgdG9vLCBidXQgYVxuICAgICAgLy8gdGVhbSB1c2luZyB0aGlzIGNvbnN0cnVjdCBkaXJlY3RseSBuZXZlciBwYXNzZXMgdGhyb3VnaCB0aGUgQVBJLCBzb1xuICAgICAgLy8gdGhpcyBpcyB0aGUgY2hlY2sgdGhhdCBhbHdheXMgcnVucy5cbiAgICAgIGlmIChwcm9wcy50YWdzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzLnRhZ3MpKSB7XG4gICAgICAgICAgaWYgKGlzUmVzZXJ2ZWRUYWdLZXkoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKCdwaXBlbGluZS1idWlsZGVyJywgJ3RydWUnKTtcbiAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKCdwcm9qZWN0JywgdGhpcy5jb25maWcucHJvamVjdCk7XG4gICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgnb3JnYW5pemF0aW9uJywgdGhpcy5jb25maWcub3JnYW5pemF0aW9uKTtcbiAgICAgIGlmIChwcm9wcy5vcmdJZCkge1xuICAgICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgnT3JnSWQnLCBwcm9wcy5vcmdJZCk7XG4gICAgICB9XG4gICAgICAvLyBTdGFibGUgZXZlbnQtcmVwb3J0aW5nIGtleS4gQXBwbGllZCBhdCBzeW50aCAodGhlIHBpcGVsaW5lSWQgaXMga25vd25cbiAgICAgIC8vIGhlcmUpLCBzbyBpdCdzIHByZXNlbnQgZnJvbSBzdGFjayBjcmVhdGlvbiDigJQgdGhlIGV2ZW50cyBMYW1iZGEgcmVhZHMgdGhpc1xuICAgICAgLy8gdGFnIHRvIGF0dHJpYnV0ZSBDb2RlUGlwZWxpbmUgc3RhdGUtY2hhbmdlIGV2ZW50cyB0byB0aGUgcGlwZWxpbmUgd2l0aG91dFxuICAgICAgLy8gZXZlciBoYW5kbGluZyB0aGUgQVJOL2FjY291bnQuIFNlZSBwYWNrYWdlcy9waXBlbGluZS1ldmVudHMuXG4gICAgICBpZiAocHJvcHMucGlwZWxpbmVJZCkge1xuICAgICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgncGIucGlwZWxpbmUtaWQnLCBwcm9wcy5waXBlbGluZUlkKTtcbiAgICAgIH1cbiAgICAgIC8vIERlcGxveS1lbnZpcm9ubWVudCBhdHRyaWJ1dGlvbiBmb3IgRE9SQSBtZXRyaWNzLiBgcGIuZGVwbG95c2AgbGlzdHMgZXZlcnlcbiAgICAgIC8vIGRlcGxveSBzdGFnZSBhcyBgPHN0YWdlTmFtZT46PGVudmlyb25tZW50PmAgcGFpcnMgam9pbmVkIGJ5IGArYCwgcmVhZCBieVxuICAgICAgLy8gdGhlIGV2ZW50cyBMYW1iZGEgZnJvbSB0aGUgc2FtZSBMaXN0VGFncyBjYWxsIHRvIG1hcmsgd2hpY2ggc3RhZ2VzIGFyZVxuICAgICAgLy8gZGVwbG95cyBhbmQgdG8gd2hpY2ggZW52aXJvbm1lbnQuIEFic2VudCB3aGVuIG5vIGVudmlyb25tZW50IGlzIGRlY2xhcmVkXG4gICAgICAvLyDigJQgc3VjaCBwaXBlbGluZXMgcHJvZHVjZSBubyBET1JBIGRlcGxveSBzaWduYWwgdW50aWwgdGhleSByZS1zeW50aC5cbiAgICAgIGNvbnN0IGRlcGxveXNUYWcgPSBidWlsZERlcGxveXNUYWcocHJvcHMpO1xuICAgICAgaWYgKGRlcGxveXNUYWcpIHtcbiAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ3BiLmRlcGxveXMnLCBkZXBsb3lzVGFnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQnVpbGQgdGhlIGludGVybmFsIHBpcGVsaW5lIGJlZm9yZSBhY2Nlc3NpbmcgaXRzIHByb3BlcnRpZXNcbiAgICAgIHRoaXMucGlwZWxpbmUuYnVpbGRQaXBlbGluZSgpO1xuXG4gICAgICAvLyBQTEFURk9STV9TRUNSRVRfTkFNRSBpcyBpbmplY3RlZCBpbnRvIHRoZSBDb2RlQnVpbGQgZW52aXJvbm1lbnQgYWJvdmUsXG4gICAgICAvLyBidXQgdGhlIHN5bnRoIHByb2Nlc3MgcmVhZHMgdGhhdCBzZWNyZXQgaXRzZWxmIHdpdGggdGhlIEFXUyBTREtcbiAgICAgIC8vIChoYW5kbGVycy9wbGF0Zm9ybS1jcmVkZW50aWFsLnRzIEdldFNlY3JldFZhbHVlKSDigJQgc28gdGhlIHJvbGUgbmVlZHMgYW5cbiAgICAgIC8vIGV4cGxpY2l0IGdyYW50LiBOb3RoaW5nIHdhcyBncmFudGluZyBpdDogdGhlIFJFR0lTVFJZIHNlY3JldCB3b3JrcyBvbmx5XG4gICAgICAvLyBiZWNhdXNlIGBMaW51eEJ1aWxkSW1hZ2UuZnJvbURvY2tlclJlZ2lzdHJ5KHsgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFscyB9KWBcbiAgICAgIC8vIG1ha2VzIENESyBncmFudCB0aGF0IG9uZSBpbnRlcm5hbGx5LCB3aGljaCBkb2VzIG5vdCBnZW5lcmFsaXNlIHRvIGFcbiAgICAgIC8vIHNlY3JldCB0aGUgYnVpbGQgcmVhZHMgZm9yIGl0c2VsZi4gV2l0aG91dCB0aGlzIGV2ZXJ5IHN5bnRoIGZhaWxzIHdpdGhcbiAgICAgIC8vIEFjY2Vzc0RlbmllZEV4Y2VwdGlvbiBvbiBHZXRTZWNyZXRWYWx1ZSwgYW5kIHRoZSBwaXBlbGluZSByb2xlIGhhcyB0byBiZVxuICAgICAgLy8gcGF0Y2hlZCBieSBoYW5kIGluIGVhY2ggYWNjb3VudC5cbiAgICAgIC8vXG4gICAgICAvLyBTY29wZWQgdG8gdGhpcyBvcmcncyBwbGF0Zm9ybSBzZWNyZXQgYW5kIG1pcnJvcmluZyB0aGUgcGx1Z2luLWxvb2t1cFxuICAgICAgLy8gTGFtYmRhJ3MgZ3JhbnQgKHBpcGVsaW5lL3BsdWdpbi1sb29rdXAudHMpLCBpbmNsdWRpbmcgdGhlIGAtKmAgc3VmZml4IOKAlFxuICAgICAgLy8gU2VjcmV0cyBNYW5hZ2VyIGFwcGVuZHMgc2l4IHJhbmRvbSBjaGFyYWN0ZXJzIHRvIGV2ZXJ5IEFSTi5cbiAgICAgIGlmIChwbGF0Zm9ybVNlY3JldE5hbWUpIHtcbiAgICAgICAgdGhpcy5waXBlbGluZS5zeW50aFByb2plY3QuYWRkVG9Sb2xlUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFsnc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUnXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czpzZWNyZXRzbWFuYWdlcjoqOio6c2VjcmV0OiR7cGxhdGZvcm1TZWNyZXROYW1lfS0qYF0sXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIC8vIFNhbWUgZ3JhbnQgZm9yIHRoZSByZWdpc3RyYXRpb24ga2V5LCBhbmQgb24gdGhlIFNZTlRIIHByb2plY3Qgb25seTogaXRcbiAgICAgIC8vIGlzIHRoZSBvbmUgc3RlcCB0aGF0IHJlZ2lzdGVycy4gSXRzIE5BTUUgcmlkZXMgdGhlIHBpcGVsaW5lLXdpZGVcbiAgICAgIC8vIGVudmlyb25tZW50IChyZXNvbHZlRGVmYXVsdHMpLCBub3QgYSBTRUNSRVRTX01BTkFHRVIgdmFyaWFibGUsIHNvIGFcbiAgICAgIC8vIG1pc3Npbmcga2V5IHNraXBzIHRoZSByZWdpc3RyYXRpb24gd2l0aCBhIHdhcm5pbmcgaW5zdGVhZCBvZiBmYWlsaW5nXG4gICAgICAvLyB0aGUgYnVpbGQgYXQgRE9XTkxPQURfU09VUkNFIOKAlCBhbmQgYSBzdGVwIHdpdGhvdXQgdGhpcyBncmFudCBjYW5ub3RcbiAgICAgIC8vIHJlYWQgaXQuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uU2VjcmV0TmFtZSkge1xuICAgICAgICB0aGlzLnBpcGVsaW5lLnN5bnRoUHJvamVjdC5hZGRUb1JvbGVQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogWydzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZSddLFxuICAgICAgICAgIHJlc291cmNlczogW2Bhcm46YXdzOnNlY3JldHNtYW5hZ2VyOio6KjpzZWNyZXQ6JHtyZWdpc3RyYXRpb25TZWNyZXROYW1lfS0qYF0sXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2RrUGlwZWxpbmUgPSB0aGlzLnBpcGVsaW5lLnBpcGVsaW5lO1xuICAgICAgdGhpcy5zdGVwTWFuaWZlc3QgPSBzdGVwTWFuaWZlc3QuZW50cmllcyhjZGtQaXBlbGluZSk7XG4gICAgICBjb25zdCBtZXRhID0gdGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkO1xuXG4gICAgICAvLyDilIDilIAgUGlwZWxpbmUtbGV2ZWwgVmFyaWFibGVzIChDb2RlUGlwZWxpbmUgVjIpIOKUgOKUgFxuICAgICAgZm9yIChjb25zdCB2IG9mIHBhcnNlUGlwZWxpbmVWYXJpYWJsZXMobWV0YVtNZXRhZGF0YUtleXMuUElQRUxJTkVfVkFSSUFCTEVTXSkpIHtcbiAgICAgICAgY2RrUGlwZWxpbmUuYWRkVmFyaWFibGUobmV3IFZhcmlhYmxlKHtcbiAgICAgICAgICB2YXJpYWJsZU5hbWU6IHYubmFtZSxcbiAgICAgICAgICAuLi4odi5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiB7IGRlZmF1bHRWYWx1ZTogdi5kZWZhdWx0VmFsdWUgfSksXG4gICAgICAgICAgLi4uKHYuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCAmJiB7IGRlc2NyaXB0aW9uOiB2LmRlc2NyaXB0aW9uIH0pLFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBTTlMgTm90aWZpY2F0aW9ucyDilIDilIBcbiAgICAgIGNvbnN0IG5vdGlmaWNhdGlvblRvcGljQXJuID0gbWV0YVtNZXRhZGF0YUtleXMuTk9USUZJQ0FUSU9OX1RPUElDX0FSTl07XG4gICAgICBpZiAodHlwZW9mIG5vdGlmaWNhdGlvblRvcGljQXJuID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCB0b3BpYyA9IHNucy5Ub3BpYy5mcm9tVG9waWNBcm4odGhpcywgJ05vdGlmaWNhdGlvblRvcGljJywgbm90aWZpY2F0aW9uVG9waWNBcm4pO1xuICAgICAgICBjb25zdCBub3RpZmljYXRpb25FdmVudHMgPSBwYXJzZU5vdGlmaWNhdGlvbkV2ZW50cyhtZXRhW01ldGFkYXRhS2V5cy5OT1RJRklDQVRJT05fRVZFTlRTXSlcbiAgICAgICAgICAubWFwKGUgPT4gUElQRUxJTkVfRVZFTlRfTUFQW2UudG9VcHBlckNhc2UoKV0pXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY2RrUGlwZWxpbmUubm90aWZ5T24oJ1BpcGVsaW5lTm90aWZpY2F0aW9uJywgdG9waWMsIHsgZXZlbnRzOiBub3RpZmljYXRpb25FdmVudHMgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSAIFNjaGVkdWxlZCBFeGVjdXRpb24g4pSA4pSAXG4gICAgICBpZiAocHJvcHMuc3ludGguc291cmNlLm9wdGlvbnM/LnRyaWdnZXIgPT09IFRyaWdnZXJUeXBlLlNDSEVEVUxFIHx8IHByb3BzLnNjaGVkdWxlKSB7XG4gICAgICAgIGNvbnN0IGV4cHIgPSBwcm9wcy5zY2hlZHVsZSB8fCAocHJvcHMuc3ludGguc291cmNlLm9wdGlvbnMgYXMgeyBzY2hlZHVsZT86IHN0cmluZyB9KT8uc2NoZWR1bGUgfHwgJ3JhdGUoMSBkYXkpJztcbiAgICAgICAgbmV3IGV2ZW50cy5SdWxlKHRoaXMsICdTY2hlZHVsZVJ1bGUnLCB7XG4gICAgICAgICAgc2NoZWR1bGU6IGV2ZW50cy5TY2hlZHVsZS5leHByZXNzaW9uKGV4cHIpLFxuICAgICAgICAgIHRhcmdldHM6IFtuZXcgdGFyZ2V0cy5Db2RlUGlwZWxpbmUoY2RrUGlwZWxpbmUpXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBFeGVjdXRpb24gRXZlbnQgVHJhY2tpbmcgKGZvcndhcmQgcGlwZWxpbmUgc3RhdGUgY2hhbmdlcyB0byBTTlMpIOKUgOKUgFxuICAgICAgLy8gYGlzVHJ1ZWAsIG5vdCB0cnV0aGluZXNzOiBgXCJmYWxzZVwiYCBpcyBhIHRydXRoeSBzdHJpbmcsIHNvIHRoZSBtZXRhZGF0YVxuICAgICAgLy8gYFwiYXdzOmNkazpvcGVyYXRpb25zOmV4ZWN1dGlvbmV2ZW50c1wiOiBcImZhbHNlXCJgIHVzZWQgdG8gQ1JFQVRFIHRoZSBydWxlLlxuICAgICAgaWYgKGlzVHJ1ZShtZXRhW01ldGFkYXRhS2V5cy5FTkFCTEVfRVhFQ1VUSU9OX0VWRU5UU10pICYmIHR5cGVvZiBub3RpZmljYXRpb25Ub3BpY0FybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbmV3IGV2ZW50cy5SdWxlKHRoaXMsICdFeGVjdXRpb25FdmVudFJ1bGUnLCB7XG4gICAgICAgICAgZXZlbnRQYXR0ZXJuOiB7XG4gICAgICAgICAgICBzb3VyY2U6IFsnYXdzLmNvZGVwaXBlbGluZSddLFxuICAgICAgICAgICAgZGV0YWlsVHlwZTogWydDb2RlUGlwZWxpbmUgUGlwZWxpbmUgRXhlY3V0aW9uIFN0YXRlIENoYW5nZSddLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbY2RrUGlwZWxpbmUucGlwZWxpbmVBcm5dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGFyZ2V0czogW25ldyB0YXJnZXRzLlNuc1RvcGljKFxuICAgICAgICAgICAgc25zLlRvcGljLmZyb21Ub3BpY0Fybih0aGlzLCAnRXhlY3V0aW9uRXZlbnRUb3BpYycsIG5vdGlmaWNhdGlvblRvcGljQXJuKSxcbiAgICAgICAgICApXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBQaXBlbGluZSBNZXRyaWNzICYgQWxhcm1zIOKUgOKUgFxuICAgICAgLy8gU2FtZSB0cmFwOiBgXCJhd3M6Y2RrOm9wZXJhdGlvbnM6bWV0cmljc1wiOiBcImZhbHNlXCJgIGNyZWF0ZWQgdGhlIGFsYXJtLlxuICAgICAgY29uc3QgZW5hYmxlTWV0cmljcyA9IGlzVHJ1ZSh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWRbTWV0YWRhdGFLZXlzLkVOQUJMRV9NRVRSSUNTXSk7XG4gICAgICBpZiAoZW5hYmxlTWV0cmljcykge1xuICAgICAgICBuZXcgY2xvdWR3YXRjaC5BbGFybSh0aGlzLCAnUGlwZWxpbmVGYWlsdXJlQWxhcm0nLCB7XG4gICAgICAgICAgbWV0cmljOiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgICAgICAgbmFtZXNwYWNlOiAnQVdTL0NvZGVQaXBlbGluZScsXG4gICAgICAgICAgICBtZXRyaWNOYW1lOiAnRmFpbGVkUGlwZWxpbmVFeGVjdXRpb25Db3VudCcsXG4gICAgICAgICAgICBkaW1lbnNpb25zTWFwOiB7IFBpcGVsaW5lTmFtZTogdGhpcy5jb25maWcucGlwZWxpbmVOYW1lIH0sXG4gICAgICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICAgICAgcGVyaW9kOiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICAgICAgICBhbGFybURlc2NyaXB0aW9uOiBgUGlwZWxpbmUgJHt0aGlzLmNvbmZpZy5waXBlbGluZU5hbWV9IGV4ZWN1dGlvbiBmYWlsZWRgLFxuICAgICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRCxcbiAgICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBjbG91ZHdhdGNoLlRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJldmVydCB0aGUgcGVyLWJ1aWxkZXIgcmVnaXN0cnkgb3ZlcnJpZGUgc28gaXQgbmV2ZXIgbGVha3MgaW50byB0aGVcbiAgICAgIC8vIHByb2Nlc3Mtd2lkZSBDb25maWcgY2FjaGUgKHNlZSB0aGUgb3ZlcnJpZGUgYXQgdGhlIHRvcCBvZiB0aGUgY29uc3RydWN0b3IpLlxuICAgICAgcmVzdG9yZVJlZ2lzdHJ5Py4oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjdXN0b20gYXJ0aWZhY3QgYnVja2V0IHdoZW4gYGVuY3J5cHRpb24ua21zS2V5QXJuYCBhbmQvb3JcbiAgICogYG9wZXJhdGlvbnMuYXJ0aWZhY3RSZXRlbnRpb25EYXlzYCBhcmUgc2V0LiBSZXR1cm5zIHVuZGVmaW5lZCBvdGhlcndpc2Ugc29cbiAgICogQ0RLIGF1dG8tY3JlYXRlcyB0aGUgZGVmYXVsdCBhcnRpZmFjdCBidWNrZXQgKHVuY2hhbmdlZCBiZWhhdmlvcikuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQXJ0aWZhY3RCdWNrZXQoKTogczMuSUJ1Y2tldCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZDtcbiAgICBjb25zdCBrbXNLZXlBcm4gPSB0eXBlb2YgbWV0YVtNZXRhZGF0YUtleXMuS01TX0tFWV9BUk5dID09PSAnc3RyaW5nJ1xuICAgICAgPyAobWV0YVtNZXRhZGF0YUtleXMuS01TX0tFWV9BUk5dIGFzIHN0cmluZylcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJldGVudGlvbkRheXMgPSBhc0ludChtZXRhW01ldGFkYXRhS2V5cy5BUlRJRkFDVF9SRVRFTlRJT05fREFZU10pO1xuXG4gICAgaWYgKCFrbXNLZXlBcm4gJiYgcmV0ZW50aW9uRGF5cyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IGttc0tleUFyblxuICAgICAgPyBrbXMuS2V5LmZyb21LZXlBcm4odGhpcywgJ0FydGlmYWN0S2V5Jywga21zS2V5QXJuKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBidWNrZXQgPSBuZXcgczMuQnVja2V0KHRoaXMsICdBcnRpZmFjdEJ1Y2tldCcsIHtcbiAgICAgIGVuY3J5cHRpb246IGVuY3J5cHRpb25LZXkgPyBzMy5CdWNrZXRFbmNyeXB0aW9uLktNUyA6IHMzLkJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCxcbiAgICAgIC4uLihlbmNyeXB0aW9uS2V5ICYmIHsgZW5jcnlwdGlvbktleSB9KSxcbiAgICAgIC4uLihyZXRlbnRpb25EYXlzICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogW3sgZXhwaXJhdGlvbjogRHVyYXRpb24uZGF5cyhyZXRlbnRpb25EYXlzKSB9XSxcbiAgICAgIH0pLFxuICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBzMy5CbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICB9KTtcbiAgICBUYWdzLm9mKGJ1Y2tldCkuYWRkKCdwaXBlbGluZScsIHRoaXMuY29uZmlnLnBpcGVsaW5lTmFtZSk7XG4gICAgcmV0dXJuIGJ1Y2tldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBDb2RlQnVpbGREZWZhdWx0cyBpbnRvIHRoZSBzaGFwZSBleHBlY3RlZCBieSBDREsncyBjb2RlQnVpbGREZWZhdWx0cy5cbiAgICogQ29tYmluZXMgbmV0d29yayBjb25maWcsIHNlY3VyaXR5IGdyb3VwcywgYW5kIHBpcGVsaW5lLWxldmVsIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKiAoUElQRUxJTkVfSUQsIEVYRUNVVElPTl9JRCwgUExBVEZPUk1fQkFTRV9VUkwpIGF2YWlsYWJsZSB0byBhbGwgQ29kZUJ1aWxkIGFjdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVEZWZhdWx0cyhcbiAgICBkZWZhdWx0czogQ29kZUJ1aWxkRGVmYXVsdHMgfCB1bmRlZmluZWQsXG4gICAgaWQ6IFVuaXF1ZUlkLFxuICAgIHBpcGVsaW5lSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwbGF0Zm9ybVNlY3JldE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwbGF0Zm9ybVVybDogc3RyaW5nLFxuICAgIG9yZ0lkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICk6IENvZGVCdWlsZE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIC8vIFBlci1waXBlbGluZSBuZXR3b3JrIGNvbmZpZyB3aW5zOyBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIGFuIGVudi1kcml2ZW5cbiAgICAvLyBnbG9iYWwgVlBDIChpbnRlcm5hbCAvIGluc2lkZS1BV1Mtb25seSBtb2RlKSBzbyBldmVyeSBwaXBlbGluZSdzXG4gICAgLy8gQ29kZUJ1aWxkIHJ1bnMgaW4gdGhlIFZQQyBhbmQgY2FuIHJlYWNoIHRoZSBwcml2YXRlIGdhdGV3YXkuIFVuc2V0IGluXG4gICAgLy8gcHVibGljIGRlcGxveXMg4oaSIENvZGVCdWlsZCBzdGF5cyBpbiB0aGUgQVdTLW1hbmFnZWQgbmV0d29yay5cbiAgICAvLyBQcmVjZWRlbmNlOiBleHBsaWNpdCBwcm9wID4gYGVjMjpuZXR3b3JrYCBtZXRhZGF0YSA+IGVudi1kcml2ZW4gZ2xvYmFsIFZQQy5cbiAgICBjb25zdCBuZXR3b3JrID0gZGVmYXVsdHM/Lm5ldHdvcmsgPz8gbmV0d29ya0NvbmZpZ0Zyb21NZXRhZGF0YSh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQpID8/IG5ldHdvcmtDb25maWdGcm9tRW52KCk7XG4gICAgY29uc3QgbmV0d29ya1Byb3BzID0gbmV0d29ya1xuICAgICAgPyByZXNvbHZlTmV0d29yayh0aGlzLCBpZCwgbmV0d29yaylcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gU2FtZSBwcmVjZWRlbmNlIGZvciBzdGFuZGFsb25lIHNlY3VyaXR5IGdyb3VwcyAocHJvcCA+IGBlYzI6c2VjdXJpdHlncm91cGAgbWV0YWRhdGEpLlxuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBDb25maWcgPSBkZWZhdWx0cz8uc2VjdXJpdHlHcm91cHMgPz8gc2VjdXJpdHlHcm91cENvbmZpZ0Zyb21NZXRhZGF0YSh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQpO1xuICAgIGNvbnN0IHN0YW5kYWxvbmVTZWN1cml0eUdyb3VwcyA9IHNlY3VyaXR5R3JvdXBDb25maWdcbiAgICAgID8gcmVzb2x2ZVNlY3VyaXR5R3JvdXAodGhpcywgaWQsIHNlY3VyaXR5R3JvdXBDb25maWcpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNhQnVuZGxlID0gcGxhdGZvcm1DYUJ1bmRsZSgpO1xuICAgIGNvbnN0IHsgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0U6IGRlZmF1bHRJbWFnZSwgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0VfRElHRVNUOiBkZWZhdWx0SW1hZ2VEaWdlc3QgfSA9IHByb2Nlc3MuZW52O1xuXG4gICAgLy8gUGlwZWxpbmUtbGV2ZWwgZW52IHZhcnMgYXZhaWxhYmxlIHRvIGFsbCBDb2RlQnVpbGQgYWN0aW9uc1xuICAgIC8vIE5vdGU6ICN7Y29kZXBpcGVsaW5lLip9IHJlc29sdmVkIHZhcmlhYmxlcyBtdXN0IGdvIHRocm91Z2ggQ29kZUJ1aWxkU3RlcC5lbnZcbiAgICAvLyAoYWN0aW9uLWxldmVsKSwgbm90IGJ1aWxkRW52aXJvbm1lbnQuZW52aXJvbm1lbnRWYXJpYWJsZXMgKHByb2plY3QtbGV2ZWwpLlxuICAgIGNvbnN0IHBpcGVsaW5lRW52VmFyczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogc3RyaW5nIH0+ID0ge1xuICAgICAgUExBVEZPUk1fQkFTRV9VUkw6IHsgdmFsdWU6IHBsYXRmb3JtVXJsIH0sXG4gICAgICAuLi4ocGlwZWxpbmVJZCAmJiB7IFBJUEVMSU5FX0lEOiB7IHZhbHVlOiBwaXBlbGluZUlkIH0gfSksXG4gICAgICAuLi4ocGxhdGZvcm1TZWNyZXROYW1lICYmIHsgUExBVEZPUk1fU0VDUkVUX05BTUU6IHsgdmFsdWU6IHBsYXRmb3JtU2VjcmV0TmFtZSB9IH0pLFxuICAgICAgLy8gVGhlIHJlZ2lzdHJhdGlvbiBrZXkncyBzZWNyZXQgTkFNRSAob25seSB0aGUgc3ludGggcm9sZSBtYXkgcmVhZCBpdCkuXG4gICAgICAuLi4ob3JnSWQgJiYgeyBbUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9FTlZdOiB7IHZhbHVlOiBDb3JlQ29uc3RhbnRzLnNlY3JldFBhdGgob3JnSWQsIFBJUEVMSU5FX1JFR0lTVFJBVElPTl9TRUNSRVRfTEVBRikgfSB9KSxcbiAgICAgIC8vIFBMQVRGT1JNX1RMU19WRVJJRlk9ZmFsc2UgKGRldiBzZWxmLXNpZ25lZCBwbGF0Zm9ybSk6IGV2ZXJ5IENvZGVCdWlsZFxuICAgICAgLy8gc3RlcCByZWFjaGVzIHRoZSBwbGF0Zm9ybSB1bnZlcmlmaWVkLiBTZWUgY29yZS9wbGF0Zm9ybS10bHMudHMuXG4gICAgICAuLi4oIXBsYXRmb3JtVGxzVmVyaWZ5KCkgJiYge1xuICAgICAgICBOT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEOiB7IHZhbHVlOiAnMCcgfSxcbiAgICAgICAgW1BMQVRGT1JNX1RMU19WRVJJRllfRU5WXTogeyB2YWx1ZTogJ2ZhbHNlJyB9LFxuICAgICAgfSksXG4gICAgICAvLyBBIHByaXZhdGUtQ0EgcGxhdGZvcm06IHRoZSBDQSB0cmF2ZWxzIHdpdGggdGhlIHBpcGVsaW5lIHNvIHRoZVxuICAgICAgLy8gc2VsZi1tdXRhdGluZyBzeW50aCAoYW5kIGFueSBzdGVwIGNhbGxpbmcgdGhlIHBsYXRmb3JtKSBWRVJJRklFUyB0aGVcbiAgICAgIC8vIGNlcnRpZmljYXRlIGluc3RlYWQgb2YgbmVlZGluZyBgLS1uby12ZXJpZnktc3NsYC4gU2VlIGNvcmUvcGxhdGZvcm0tdGxzLnRzLlxuICAgICAgLi4uKGNhQnVuZGxlICYmIHsgW1BMQVRGT1JNX0NBX0JVTkRMRV9FTlZdOiB7IHZhbHVlOiBjYUJ1bmRsZSB9IH0pLFxuICAgICAgLy8gVGhlIHNlbGYtbXV0YXRpbmcgc3ludGggcmUtcmVzb2x2ZXMgdGhlIGRlZmF1bHQgYnVpbGQgaW1hZ2UgaW5zaWRlXG4gICAgICAvLyBDb2RlQnVpbGQsIHdoZXJlIHRoZSBvcGVyYXRvcidzIGVudiBpcyBhYnNlbnQ7IGNhcnJ5IHRoZSBpbWFnZSBhbmQgaXRzXG4gICAgICAvLyBkaWdlc3Qgc28gdGhlIHJlLXN5bnRoZXNpemVkIHRlbXBsYXRlIGtlZXBzIHRoZSBzYW1lIHBpbi5cbiAgICAgIC4uLihkZWZhdWx0SW1hZ2UgJiYgeyBDT0RFQlVJTERfREVGQVVMVF9JTUFHRTogeyB2YWx1ZTogZGVmYXVsdEltYWdlIH0gfSksXG4gICAgICAuLi4oZGVmYXVsdEltYWdlRGlnZXN0ICYmIHsgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0VfRElHRVNUOiB7IHZhbHVlOiBkZWZhdWx0SW1hZ2VEaWdlc3QgfSB9KSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2VjdXJpdHlHcm91cHMgPSBbXG4gICAgICAuLi4obmV0d29ya1Byb3BzPy5zZWN1cml0eUdyb3VwcyA/PyBbXSksXG4gICAgICAuLi4oc3RhbmRhbG9uZVNlY3VyaXR5R3JvdXBzID8/IFtdKSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihuZXR3b3JrUHJvcHMgJiYgeyB2cGM6IG5ldHdvcmtQcm9wcy52cGMsIHN1Ym5ldFNlbGVjdGlvbjogbmV0d29ya1Byb3BzLnN1Ym5ldFNlbGVjdGlvbiB9KSxcbiAgICAgIC4uLihzZWN1cml0eUdyb3Vwcy5sZW5ndGggPiAwICYmIHsgc2VjdXJpdHlHcm91cHMgfSksXG4gICAgICAvLyBidWlsZEltYWdlIGF0IHRoaXMgbGV2ZWwgcmVhY2hlcyBDREsgUGlwZWxpbmVzJyBpbnRlcm5hbGx5LXdyYXBwZWRcbiAgICAgIC8vIFNoZWxsU3RlcCBDb2RlQnVpbGQgYWN0aW9uLCB3aGljaCBvdGhlcndpc2UgaGFyZGNvZGVzXG4gICAgICAvLyBDREsncyBkZWZhdWx0IGN1cmF0ZWQgc3RhbmRhcmQgaW1hZ2UuIFNldHRpbmcgaXQgaGVyZSBjbG9zZXMgdGhlIGdhcFxuICAgICAgLy8gZXhwb3NlZCBpbiB0aGUgc2FtZSBlbnYgdmFyIChgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0VgKSB0aGF0IHRoZVxuICAgICAgLy8gQ29kZUJ1aWxkU3RlcCBwYXRoIGFscmVhZHkgaG9ub3JzIHZpYSByZXNvbHZlUGx1Z2luSW1hZ2UoKSdzXG4gICAgICAvLyBmYWxsYmFjay4gUGVyLXN0ZXAgYGJ1aWxkSW1hZ2VgIG9uIGEgQ29kZUJ1aWxkU3RlcCBzdGlsbCB3aW5zLlxuICAgICAgYnVpbGRFbnZpcm9ubWVudDoge1xuICAgICAgICBidWlsZEltYWdlOiByZXNvbHZlRGVmYXVsdEJ1aWxkSW1hZ2UodGhpcywgb3JnSWQpLFxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogcGlwZWxpbmVFbnZWYXJzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iXX0=
545
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtYnVpbGRlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BpcGVsaW5lL3BpcGVsaW5lLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sS0FBSyxVQUFVLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xHLE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxLQUFLLE9BQU8sTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlELE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQXlCLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FB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RUFBa0U7WUFDbEUsR0FBRyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsSUFBSTtnQkFDMUIsNEJBQTRCLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUM1QyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO2FBQzlDLENBQUM7WUFDRixpRUFBaUU7WUFDakUsdUVBQXVFO1lBQ3ZFLDhFQUE4RTtZQUM5RSxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbEUseUVBQXlFO1lBQ3pFLGtFQUFrRTtZQUNsRSxxRUFBcUU7WUFDckUsdUVBQXVFO1NBQ3hFLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRztZQUNyQixHQUFHLENBQUMsWUFBWSxFQUFFLGNBQWMsSUFBSSxFQUFFLENBQUM7WUFDdkMsR0FBRyxDQUFDLHdCQUF3QixJQUFJLEVBQUUsQ0FBQztTQUNwQyxDQUFDO1FBRUYsT0FBTztZQUNMLEdBQUcsQ0FBQyxZQUFZLElBQUksRUFBRSxHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzdGLEdBQUcsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQ3BELHFFQUFxRTtZQUNyRSx1RUFBdUU7WUFDdkUsMEVBQTBFO1lBQzFFLGlFQUFpRTtZQUNqRSx1RUFBdUU7WUFDdkUsZ0JBQWdCLEVBQUU7Z0JBQ2hCLFVBQVUsRUFBRSxpQkFBaUI7Z0JBQzdCLG9CQUFvQixFQUFFLGVBQWU7YUFDdEM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSwgVGFncyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgQnVpbGRTcGVjLCB0eXBlIElCdWlsZEltYWdlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgeyBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cywgUGlwZWxpbmVUeXBlLCBWYXJpYWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUnO1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMnO1xuaW1wb3J0ICogYXMgdGFyZ2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHMnO1xuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgeyBDb2RlUGlwZWxpbmUsIHR5cGUgQ29kZUJ1aWxkT3B0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliL3BpcGVsaW5lcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IGRlc2NyaWJlRGVwbG95QXR0cmlidXRpb24gfSBmcm9tICcuL2RlcGxveS1hdHRyaWJ1dGlvbi5qcyc7XG5pbXBvcnQgeyBQaXBlbGluZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL3BpcGVsaW5lLWNvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IHsgUGx1Z2luTG9va3VwIH0gZnJvbSAnLi9wbHVnaW4tbG9va3VwLmpzJztcbmltcG9ydCB7IFNvdXJjZUJ1aWxkZXIgfSBmcm9tICcuL3NvdXJjZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFN0YWdlQnVpbGRlciB9IGZyb20gJy4vc3RhZ2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBTdGVwTWFuaWZlc3RSZWNvcmRlciB9IGZyb20gJy4vc3RlcC1tYW5pZmVzdC1yZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlT3B0aW9ucywgU3ludGhPcHRpb25zIH0gZnJvbSAnLi9zdGVwLXR5cGVzLmpzJztcbmltcG9ydCB7IENvbmZpZywgQ29yZUNvbnN0YW50cywgaXNSZXNlcnZlZFRhZ0tleSB9IGZyb20gJy4uL2NvbmZpZy9hcHAtY29uZmlnLmpzJztcbmltcG9ydCB7IGxhbWJkYUFyY2hpdGVjdHVyZSwgbGFtYmRhUnVudGltZSwgbGFtYmRhVGltZW91dCB9IGZyb20gJy4uL2NvbmZpZy9hd3MtY29uZmlnLWNkay5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2lzdHJ5Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZy10eXBlcy5qcyc7XG5pbXBvcnQgeyBBcnRpZmFjdE1hbmFnZXIgfSBmcm9tICcuLi9jb3JlL2FydGlmYWN0LW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgVW5pcXVlSWQgfSBmcm9tICcuLi9jb3JlL2lkLWdlbmVyYXRvci5qcyc7XG5pbXBvcnQge1xuICBhc0ludCxcbiAgaXNUcnVlLFxuICBtZXRhZGF0YUZvckNvZGVQaXBlbGluZSxcbiAgbmV0d29ya0NvbmZpZ0Zyb21NZXRhZGF0YSxcbiAgcGFyc2VQaXBlbGluZVZhcmlhYmxlcyxcbiAgcm9sZUNvbmZpZ0Zyb21NZXRhZGF0YSxcbiAgc2VjdXJpdHlHcm91cENvbmZpZ0Zyb21NZXRhZGF0YSxcbn0gZnJvbSAnLi4vY29yZS9tZXRhZGF0YS1idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29kZUJ1aWxkRGVmYXVsdHMgfSBmcm9tICcuLi9jb3JlL25ldHdvcmstdHlwZXMuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZU5ldHdvcmssIG5ldHdvcmtDb25maWdGcm9tRW52IH0gZnJvbSAnLi4vY29yZS9uZXR3b3JrLmpzJztcbmltcG9ydCB7IGNyZWF0ZUNvZGVCdWlsZFN0ZXAsIGN1cmF0ZWRTZWxmTXV0YXRpb25JbWFnZSwgZ2V0Q29tcHV0ZVR5cGUsIHJlc29sdmVEZWZhdWx0QnVpbGRJbWFnZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtaGVscGVycy5qcyc7XG5pbXBvcnQgeyBQSVBFTElORV9SRUdJU1RSQVRJT05fU0VDUkVUX0VOViwgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9MRUFGIH0gZnJvbSAnLi4vY29yZS9waXBlbGluZS1yZWdpc3RyYXRpb24uanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFLZXlzLCBUcmlnZ2VyVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZXRhRGF0YVR5cGUgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLXR5cGVzLmpzJztcbmltcG9ydCB7IFBMQVRGT1JNX0NBX0JVTkRMRV9FTlYsIFBMQVRGT1JNX1RMU19WRVJJRllfRU5WLCBwbGF0Zm9ybUNhQnVuZGxlLCBwbGF0Zm9ybVRsc1ZlcmlmeSB9IGZyb20gJy4uL2NvcmUvcGxhdGZvcm0tdGxzLmpzJztcbmltcG9ydCB7IGFzc2VydFBsdWdpbkNvbnRyYWN0LCBjb250cmFjdFNjb3BlRnJvbVRlbXBsYXRlU2NvcGUsIHBsdWdpbkFydGlmYWN0QWxpYXMsIHBsdWdpblN0ZXBMYWJlbCB9IGZyb20gJy4uL2NvcmUvcGx1Z2luLWNvbnRyYWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUmVzb2x2ZWRCb290c3RyYXAgfSBmcm9tICcuLi9jb3JlL3BsdWdpbi1sb29rdXAtZW52ZWxvcGUuanMnO1xuaW1wb3J0IHR5cGUgeyBSb2xlQ29uZmlnIH0gZnJvbSAnLi4vY29yZS9yb2xlLXR5cGVzLmpzJztcbmltcG9ydCB7IHJlc29sdmVSb2xlIH0gZnJvbSAnLi4vY29yZS9yb2xlLmpzJztcbmltcG9ydCB7IGlzUnVudGltZVZ1bG5DaGVja0VuYWJsZWQsIFJVTlRJTUVfVlVMTl9DSEVDS19LRVkgfSBmcm9tICcuLi9jb3JlL3J1bnRpbWUtY2hlY2suanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVNlY3VyaXR5R3JvdXAgfSBmcm9tICcuLi9jb3JlL3NlY3VyaXR5LWdyb3VwLmpzJztcbmltcG9ydCB7IHNlbGZNdXRhdGlvblBhcnRpYWxCdWlsZFNwZWMgfSBmcm9tICcuLi9jb3JlL3NlbGYtbXV0YXRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBTdGVwTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4uL2NvcmUvc3RlcC1tYW5pZmVzdC5qcyc7XG5cbmNvbnN0IFBJUEVMSU5FX0VWRU5UX01BUDogUmVjb3JkPHN0cmluZywgUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHM+ID0ge1xuICBGQUlMRUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9GQUlMRUQsXG4gIFNVQ0NFRURFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX1NVQ0NFRURFRCxcbiAgU1RBUlRFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX1NUQVJURUQsXG4gIENBTkNFTEVEOiBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cy5QSVBFTElORV9FWEVDVVRJT05fQ0FOQ0VMRUQsXG4gIFNVUEVSU0VERUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9TVVBFUlNFREVELFxufTtcblxuZnVuY3Rpb24gcGFyc2VOb3RpZmljYXRpb25FdmVudHModmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlLnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpO1xuICByZXR1cm4gWydGQUlMRUQnLCAnU1VDQ0VFREVEJ107XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGBwYi5kZXBsb3lzYCB0YWcgdmFsdWUgYW5kIGVtaXQgdGhlIHN5bnRoLXRpbWUgd2FybmluZ3MgdGhhdCBjb21lXG4gKiB3aXRoIGl0LiBUaGUgZGVyaXZhdGlvbiBpdHNlbGYgaXMgQ0RLLWZyZWUgYW5kIGxpdmVzIGluXG4gKiB7QGxpbmsgZGVzY3JpYmVEZXBsb3lBdHRyaWJ1dGlvbn0sIHNvIGBQT1NUIC9waXBlbGluZXNgIGFuZFxuICogYFBPU1QgL3BpcGVsaW5lcy92YWxpZGF0ZWAgcmVwb3J0IHRoZSBzYW1lIGF0dHJpYnV0aW9uIHdpdGhvdXQgc3ludGhlc2l6aW5nLlxuICpcbiAqIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gbm90aGluZyBkZWNsYXJlcyBhbiBlbnZpcm9ubWVudCAobm8gZGVwbG95IHNpZ25hbCkuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRGVwbG95c1RhZyhwcm9wczogQnVpbGRlclByb3BzKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBkZXBsb3lzVGFnLCB3YXJuaW5ncyB9ID0gZGVzY3JpYmVEZXBsb3lBdHRyaWJ1dGlvbihwcm9wcyk7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigncGlwZWxpbmUtYnVpbGRlcicpO1xuICBmb3IgKGNvbnN0IHcgb2Ygd2FybmluZ3MpIGxvZy53YXJuKHcubWVzc2FnZSk7XG4gIHJldHVybiBkZXBsb3lzVGFnO1xufVxuXG5cbi8qKlxuICogVGhlIENvZGVQaXBlbGluZSBwcm9wcyBhIHRvb2xjaGFpbiByZWxlYXNlIHBpbnMgKMKnMywgRDEwKTpcbiAqICAtIGBjbGlWZXJzaW9uYCAvIGBjZGtBc3NldHNDbGlWZXJzaW9uYCDigJQgdGhlIHJlbGVhc2UncyBgYXdzQ2RrYCAvXG4gKiAgICBgY2RrQXNzZXRzYCwgc28gU2VsZk11dGF0ZSBhbmQgYXNzZXQgcHVibGlzaGluZyBuZXZlciBpbnN0YWxsIG5wbSBgbGF0ZXN0YDtcbiAqICAtIGBzZWxmTXV0YXRpb25Db2RlQnVpbGREZWZhdWx0c2Ag4oCUIHRoZSBjdXJhdGVkIGltYWdlIHdpdGggaXRzIE5vZGUgcnVudGltZVxuICogICAgcGlubmVkIChgcnVudGltZS12ZXJzaW9ucy5ub2RlanNgKS5cbiAqIEEgdmFsdWUgc2V0IGV4cGxpY2l0bHkgaW4gcGlwZWxpbmUgbWV0YWRhdGEgcmVwbGFjZXMgdGhlIHBpbiAodGhlIGNhbGxlclxuICogc3ByZWFkcyB0aGUgbWV0YWRhdGEgYWZ0ZXIgdGhlc2UpLiBBIHJlbGVhc2UgdGhhdCBkb2Vzbid0IGNhcnJ5IGEgQ0xJXG4gKiB2ZXJzaW9uLCB3aXRoIG5vIGV4cGxpY2l0IG1ldGFkYXRhIGVpdGhlciwgZmFpbHMgdGhlIHN5bnRoLlxuICovXG5mdW5jdGlvbiB0b29sY2hhaW5QaW5zKGJvb3RzdHJhcDogUmVzb2x2ZWRCb290c3RyYXAsIGV4cGxpY2l0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHtcbiAgY2xpVmVyc2lvbjogc3RyaW5nO1xuICBjZGtBc3NldHNDbGlWZXJzaW9uOiBzdHJpbmc7XG4gIHNlbGZNdXRhdGlvbkNvZGVCdWlsZERlZmF1bHRzOiBDb2RlQnVpbGRPcHRpb25zO1xufSB7XG4gIGNvbnN0IHsgcmVsZWFzZVZlcnNpb24sIHZlcnNpb25zIH0gPSBib290c3RyYXAudG9vbGNoYWluO1xuICBjb25zdCBwaWNrID0gKGtleTogJ2NsaVZlcnNpb24nIHwgJ2Nka0Fzc2V0c0NsaVZlcnNpb24nLCByZWxlYXNlZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBsYWJlbDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBvd24gPSBleHBsaWNpdFtrZXldO1xuICAgIGlmICh0eXBlb2Ygb3duID09PSAnc3RyaW5nJyAmJiBvd24ubGVuZ3RoID4gMCkgcmV0dXJuIG93bjtcbiAgICBpZiAocmVsZWFzZWQpIHJldHVybiByZWxlYXNlZDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQk9PVFNUUkFQX0lNQUdFX1VOUkVTT0xWRUQ6IHRvb2xjaGFpbiByZWxlYXNlICR7cmVsZWFzZVZlcnNpb259IGNhcnJpZXMgbm8gJHtsYWJlbH0gdmVyc2lvbiwgc28gXFxgJHtrZXl9XFxgIGNhbid0IGJlIHBpbm5lZC4gYFxuICAgICAgKyBgU2V0IGl0IGV4cGxpY2l0bHkgaW4gcGlwZWxpbmUgbWV0YWRhdGEgKGF3czpjZGs6cGlwZWxpbmVzOmNvZGVwaXBlbGluZToke2tleS50b0xvd2VyQ2FzZSgpfSkgb3IgcmUtcmVzb2x2ZSB0aGUgcmVsZWFzZS5gLFxuICAgICk7XG4gIH07XG4gIHJldHVybiB7XG4gICAgY2xpVmVyc2lvbjogcGljaygnY2xpVmVyc2lvbicsIHZlcnNpb25zLmF3c0NkaywgJ2F3cy1jZGsnKSxcbiAgICBjZGtBc3NldHNDbGlWZXJzaW9uOiBwaWNrKCdjZGtBc3NldHNDbGlWZXJzaW9uJywgdmVyc2lvbnMuY2RrQXNzZXRzLCAnY2RrLWFzc2V0cycpLFxuICAgIHNlbGZNdXRhdGlvbkNvZGVCdWlsZERlZmF1bHRzOiB7XG4gICAgICBidWlsZEVudmlyb25tZW50OiB7IGJ1aWxkSW1hZ2U6IGN1cmF0ZWRTZWxmTXV0YXRpb25JbWFnZSgpIH0sXG4gICAgICBwYXJ0aWFsQnVpbGRTcGVjOiBCdWlsZFNwZWMuZnJvbU9iamVjdChzZWxmTXV0YXRpb25QYXJ0aWFsQnVpbGRTcGVjKCkpLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgUGlwZWxpbmVCdWlsZGVyIGNvbnN0cnVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkZXJQcm9wcyB7XG4gIC8qKiBQcm9qZWN0IGlkZW50aWZpZXIgKHdpbGwgYmUgc2FuaXRpemVkIHRvIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgd2l0aCB1bmRlcnNjb3JlcykgKi9cbiAgcmVhZG9ubHkgcHJvamVjdDogc3RyaW5nO1xuXG4gIC8qKiBPcmdhbml6YXRpb24gaWRlbnRpZmllciAod2lsbCBiZSBzYW5pdGl6ZWQgdG8gbG93ZXJjYXNlIGFscGhhbnVtZXJpYyB3aXRoIHVuZGVyc2NvcmVzKSAqL1xuICByZWFkb25seSBvcmdhbml6YXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVwbG95IGVudmlyb25tZW50IChlLmcuIGBwcm9kdWN0aW9uYCwgYHN0YWdpbmdgKSBmb3IgdGhlXG4gICAqIHNpbmdsZS1lbnZpcm9ubWVudCBjYXNlLiBXaGVuIHNldCAoYW5kIG5vIHN0YWdlIGRlY2xhcmVzIGl0cyBvd25cbiAgICogYGVudmlyb25tZW50YCksIHBpcGVsaW5lLWNvcmUgZGVyaXZlcyB0aGUgYHBiLmRlcGxveXNgIHRhZyBmcm9tIGl0LCBtYXJraW5nXG4gICAqIHRoZSBzb2xlIHN0YWdlIOKAlCBvciB0aGUgTEFTVCBzdGFnZSBvZiBhIG11bHRpLXN0YWdlIHBpcGVsaW5lICh3aXRoIGEgc3ludGhcbiAgICogd2FybmluZyksIG9yIGEgbGl0ZXJhbCBgRGVwbG95YCBzdGFnZSB3aGVuIHRoZXJlIGFyZSBubyBzdGFnZXMgdG8gbmFtZSDigJQgYXNcbiAgICogdGhlIGRlcGxveSBmb3IgRE9SQSBtZXRyaWNzLiBGb3IgbXVsdGktZW52aXJvbm1lbnQgcGlwZWxpbmVzLCBkZWNsYXJlXG4gICAqIGBlbnZpcm9ubWVudGAgcGVyIHN0YWdlIGluc3RlYWQgKHNlZSBgU3RhZ2VPcHRpb25zLmVudmlyb25tZW50YCkuXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHN0cmluZztcblxuICAvKiogVGVuYW50IGlkZW50aWZpZXIgZm9yIHJlc29sdmluZyBwZXItb3JnIHNlY3JldHMgZnJvbSBBV1MgU2VjcmV0cyBNYW5hZ2VyICovXG4gIHJlYWRvbmx5IG9yZ0lkPzogc3RyaW5nO1xuXG4gIC8qKiBQaXBlbGluZSBkYXRhYmFzZSByZWNvcmQgSUQg4oCUIGluamVjdGVkIGFzIFBJUEVMSU5FX0lEIGVudiB2YXIgZm9yIGF1dG9ub21vdXMgc3ludGggKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVJZD86IHN0cmluZztcblxuICAvKiogT3B0aW9uYWwgY3VzdG9tIHBpcGVsaW5lIG5hbWUuIERlZmF1bHRzIHRvOiB7b3JnYW5pemF0aW9ufS17cHJvamVjdH0tcGlwZWxpbmUgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKiBHbG9iYWwgbWV0YWRhdGEgaW5oZXJpdGVkIGJ5IGFsbCBwaXBlbGluZSBzdGVwcyAqL1xuICByZWFkb25seSBnbG9iYWw/OiBNZXRhRGF0YVR5cGU7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lLWxldmVsIHRlbXBsYXRlIHZhcmlhYmxlcywgZXhwb3NlZCB0byBge3sgcGlwZWxpbmUudmFycy4qIH19YCBpblxuICAgKiBwaXBlbGluZSBjb25maWdzIGFuZCBwbHVnaW4gc3BlY3MgKHNlZSBgUGx1Z2luU3BlYy5yZXF1aXJlZFZhcnNgKS4gRGVjbGFyZWRcbiAgICogaGVyZSBzbyB0aGUgYHBpcGVsaW5lLnZhcnNgIHRlbXBsYXRlIHNjb3BlIGlzIHR5cGUtY2hlY2tlZCBlbmQtdG8tZW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZS1sZXZlbCBDb2RlQnVpbGQgZGVmYXVsdHMgYXBwbGllZCB0byBhbGwgQ29kZUJ1aWxkIGFjdGlvbnNcbiAgICogKHN5bnRoLCBzZWxmLW11dGF0aW9uLCBhc3NldCBwdWJsaXNoaW5nKSB2aWEgYGNvZGVCdWlsZERlZmF1bHRzYC5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRzPzogQ29kZUJ1aWxkRGVmYXVsdHM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIElBTSByb2xlIGZvciB0aGUgQ29kZVBpcGVsaW5lLlxuICAgKiBXaGVuIHByb3ZpZGVkLCByZXNvbHZlcyB0byBhIENESyBJUm9sZSBhbmQgaXMgcGFzc2VkIHRvIHRoZSBDb2RlUGlwZWxpbmUgY29uc3RydWN0LlxuICAgKiBXaGVuIG9taXR0ZWQsIENESyBhdXRvLWNyZWF0ZXMgYSByb2xlIHdpdGggdGhlIGNvcnJlY3QgY29kZXBpcGVsaW5lLmFtYXpvbmF3cy5jb20gcHJpbmNpcGFsLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IFJvbGVDb25maWc7XG5cbiAgLyoqIFN5bnRoZXNpcyBjb25maWd1cmF0aW9uIGluY2x1ZGluZyBzb3VyY2UgYW5kIHBsdWdpbiBkZXRhaWxzICovXG4gIHJlYWRvbmx5IHN5bnRoOiBTeW50aE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHBpcGVsaW5lIHN0YWdlcywgZWFjaCBjb250YWluaW5nIG9uZSBvciBtb3JlIENvZGVCdWlsZCBzdGVwcy5cbiAgICogU3RhZ2VzIGFyZSBhZGRlZCBhcyB3YXZlcyB0byB0aGUgQ29kZVBpcGVsaW5lIGFmdGVyIHRoZSBzeW50aCBzdGVwLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2VzPzogU3RhZ2VPcHRpb25zW107XG5cbiAgLyoqIE9wdGlvbmFsIGNyb24vcmF0ZSBleHByZXNzaW9uIGZvciBzY2hlZHVsZWQgcGlwZWxpbmUgZXhlY3V0aW9uLiAqL1xuICByZWFkb25seSBzY2hlZHVsZT86IHN0cmluZztcblxuICAvKiogQ3VzdG9tIHRhZ3MgYXBwbGllZCB0byBhbGwgcGlwZWxpbmUgcmVzb3VyY2VzLiAqL1xuICByZWFkb25seSB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogUGx1Z2lucyBwcmUtcmVzb2x2ZWQgYnkgYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGhgIGZyb20gdGhlIHBsYXRmb3JtIEFQSSxcbiAgICoga2V5ZWQgYnkgYGFsaWFzIHx8IG5hbWVgLiBXaGVuIHByZXNlbnQsIGBQbHVnaW5Mb29rdXAucGx1Z2luKClgIHJldHVybnNcbiAgICogdGhlIG1hdGNoaW5nIGVudHJ5IGRpcmVjdGx5IGFuZCBza2lwcyB0aGUgY3VzdG9tIHJlc291cmNlIOKAlCBzbyB0aGVcbiAgICogc3ludGhlc2l6ZWQgQ0ZOIHRlbXBsYXRlIHNoaXBzIHdpdGggdGhlIHJlYWwgQ29kZUJ1aWxkIGltYWdlIGJha2VkIGluLlxuICAgKiBQb3B1bGF0ZWQgYnkgdGhlIENMSSBiZWZvcmUgaW52b2tpbmcgdGhlIGJvaWxlcnBsYXRlIGFwcDsgQ0RLIGNvbnN1bWVyc1xuICAgKiB3aG8gY29uc3RydWN0IFBpcGVsaW5lQnVpbGRlciBkaXJlY3RseSBub3JtYWxseSBsZWF2ZSB0aGlzIHVuc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZWRQbHVnaW5zPzogUmVjb3JkPHN0cmluZywgUGx1Z2luPjtcblxuICAvKipcbiAgICogVGhlIHRvb2xjaGFpbiByZWxlYXNlIHRoaXMgcGlwZWxpbmUgcnVucyBvbiwgcGlubmVkIGJ5IHRoZSBwaXBlbGluZSdzIG93blxuICAgKiBjb25maWcgKGB0b29sY2hhaW4ucmVsZWFzZWApLiBBYnNlbnQg4oeSIHRoZSBvcmcgZGVmYXVsdCwgaXRzIGNhbmFyeSwgb3IgdGhlXG4gICAqIHBsYXRmb3JtIGRlZmF1bHQg4oCUIHdoaWNoZXZlciB0aGUgcGxhdGZvcm0gcmVzb2x2ZXMgKEQ3LCBEOCkuXG4gICAqL1xuICByZWFkb25seSB0b29sY2hhaW4/OiB7IHJlYWRvbmx5IHJlbGVhc2U6IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgYHBpcGVsaW5lLWJvb3RzdHJhcGAgaGFsZiBvZiB0aGUgcGlwZWxpbmUncyB0b29sY2hhaW4gcmVsZWFzZVxuICAgKiAoUkVRVUlSRUQpLiBQaW5zIHRoZSBkZWZhdWx0IENvZGVCdWlsZCBpbWFnZSAoYGNvZGVCdWlsZERlZmF1bHRzYCxcbiAgICogcGx1Z2luLWxlc3Mgc3RlcHMsIGFzc2V0IHB1Ymxpc2hpbmcpIGJ5IGl0cyBzaWduZWQgZGlnZXN0IGFuZCBzdXBwbGllcyB0aGVcbiAgICogQ0RLIENMSSAoYGNsaVZlcnNpb25gKSBhbmQgYGNkay1hc3NldHNgIChgY2RrQXNzZXRzQ2xpVmVyc2lvbmApIHZlcnNpb25zLlxuICAgKiBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aC9kZXBsb3lgIHJlc29sdmVzIGl0IGZyb20gdGhlIHBsYXRmb3JtXG4gICAqIChgL3BsdWdpbnMvbG9va3VwYCwgbmFtZSBgcGlwZWxpbmUtYm9vdHN0cmFwYCk7IENESyBjb25zdW1lcnMgYnVpbGRpbmdcbiAgICogUGlwZWxpbmVCdWlsZGVyIGRpcmVjdGx5IHBhc3MgdGhlIHNhbWUgcmVjb3JkLiBUaGVyZSBpcyBubyBmYWxsYmFjayAoRDIpLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZWRCb290c3RyYXA6IFJlc29sdmVkQm9vdHN0cmFwO1xuXG4gIC8qKlxuICAgKiBQbGF0Zm9ybS1zb3VyY2VkIHJlZ2lzdHJ5IG92ZXJyaWRlcywgYXBwbGllZCBvdmVyIHRoZSBlbnYtbG9hZGVkIGByZWdpc3RyeWBcbiAgICogY29uZmlnIGF0IHN5bnRoIHN0YXJ0LiBwaXBlbGluZS1tYW5hZ2VyIHBvcHVsYXRlcyB0aGlzIGZyb20gdGhlIHBsYXRmb3JtIFVSTFxuICAgKiBpdCBkZXBsb3lzIGFnYWluc3Qgc28gdGhlIENvZGVCdWlsZCBpbWFnZSBVUklzIHVzZSBhIHB1bGwgaG9zdCBBV1MgQ29kZUJ1aWxkXG4gICAqIGNhbiByZXNvbHZlIChpbnN0ZWFkIG9mIHRoZSBpbi1jbHVzdGVyIGByZWdpc3RyeTo1MDAwYCBkZWZhdWx0KS4gQ0RLXG4gICAqIGNvbnN1bWVycyBjb25zdHJ1Y3RpbmcgUGlwZWxpbmVCdWlsZGVyIGRpcmVjdGx5IG5vcm1hbGx5IGxlYXZlIHRoaXMgdW5zZXQuXG4gICAqL1xuICByZWFkb25seSByZWdpc3RyeT86IFBhcnRpYWw8UmVnaXN0cnlDb25maWc+O1xufVxuXG4vKipcbiAqIENESyBjb25zdHJ1Y3QgdGhhdCBjcmVhdGVzIGFuZCBjb25maWd1cmVzIGEgQ29kZVBpcGVsaW5lIGZvciBjb250aW51b3VzIGRlcGxveW1lbnQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIE11bHRpLXNvdXJjZSBzdXBwb3J0IChTMywgR2l0SHViLCBDb2RlU3RhcilcbiAqIC0gUGx1Z2luLWJhc2VkIGJ1aWxkIHN0ZXBzXG4gKiAtIE1ldGFkYXRhLWRyaXZlbiBjb25maWd1cmF0aW9uXG4gKiAtIEF1dG9tYXRpYyB0YWdnaW5nXG4gKiAtIEF1dG9tYXRpYyBzYW5pdGl6YXRpb24gb2YgcHJvamVjdCBhbmQgb3JnYW5pemF0aW9uIG5hbWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG5ldyBQaXBlbGluZUJ1aWxkZXIodGhpcywgJ015UGlwZWxpbmUnLCB7XG4gKiAgIHByb2plY3Q6ICdteS1hcHAnLFxuICogICBvcmdhbml6YXRpb246ICdteS1vcmcnLFxuICogICBzeW50aDoge1xuICogICAgIHNvdXJjZToge1xuICogICAgICAgdHlwZTogJ2dpdGh1YicsXG4gKiAgICAgICBvcHRpb25zOiB7IHJlcG86ICdvd25lci9yZXBvJywgYnJhbmNoOiAnbWFpbicgfVxuICogICAgIH0sXG4gKiAgICAgcGx1Z2luOiB7IG5hbWU6ICdzeW50aCcgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUGlwZWxpbmVCdWlsZGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHBpcGVsaW5lOiBDb2RlUGlwZWxpbmU7XG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IFBpcGVsaW5lQ29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIFdoaWNoIHBsdWdpbiBlYWNoIENvZGVQaXBlbGluZSBhY3Rpb24gcnVucywgcmVhZCBvZmYgdGhlIGJ1aWx0XG4gICAqIHBpcGVsaW5lLiBUaGUgQ0xJIHNoaXBzIGl0IHdpdGggdGhlIHJlZ2lzdHJ5IHJlZ2lzdHJhdGlvbiBzbyBldmVudCBpbmdlc3RcbiAgICogY2FuIGF0dHJpYnV0ZSBhY3Rpb24gb3V0Y29tZXMgdG8gYSBwbHVnaW4gdmVyc2lvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdGVwTWFuaWZlc3Q6IFN0ZXBNYW5pZmVzdEVudHJ5W107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEJ1aWxkZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBBcHBseSBwbGF0Zm9ybS1zb3VyY2VkIHJlZ2lzdHJ5IG92ZXJyaWRlcyBCRUZPUkUgYW55IENvbmZpZy5nZXQoJ3JlZ2lzdHJ5JylcbiAgICAvLyAocGx1Z2luL2RlZmF1bHQgYnVpbGQtaW1hZ2UgcmVzb2x1dGlvbiBiZWxvdykgc28gdGhlIHN5bnRoIHVzZXMgdGhlIHB1bGxcbiAgICAvLyBob3N0IHRoZSBwbGF0Zm9ybSBkZXBsb3lzIGFnYWluc3QsIG5vdCB0aGUgaW4tY2x1c3RlciBlbnYgZGVmYXVsdC4gVGhlIENMSVxuICAgIC8vIG9ubHkgc2V0cyBwcm9wcy5yZWdpc3RyeSB3aGVuIElNQUdFX1JFR0lTVFJZX1BVTExfSE9TVCBpcyB1bnNldCwgc28gYW5cbiAgICAvLyBleHBsaWNpdCBvcGVyYXRvciBwdWxsIGhvc3QgaXMgbmV2ZXIgY2xvYmJlcmVkIChzZWUgYmFrZVBsYXRmb3JtUmVnaXN0cnkpLlxuICAgIC8vXG4gICAgLy8gU2NvcGVkICsgcmVzdG9yZWQgc28gdGhlIG92ZXJyaWRlIGRvZXMgTk9UIGxlYWsgaW50byB0aGUgcHJvY2Vzcy13aWRlXG4gICAgLy8gQ29uZmlnIGNhY2hlOiBpbiBhIG11bHRpLXBpcGVsaW5lIENESyBhcHAsIHBpcGVsaW5lIEIncyByZWdpc3RyeSBtdXN0IG5vdFxuICAgIC8vIGJsZWVkIGludG8gcGlwZWxpbmUgQSdzIGltYWdlIHJlc29sdXRpb24uIEFsbCByZWdpc3RyeSByZWFkcyBoYXBwZW5cbiAgICAvLyBzeW5jaHJvbm91c2x5IGJlbG93IChidWlsZC1pbWFnZSByZXNvbHV0aW9uKSwgc28gcmVzdG9yaW5nIGF0IHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgY29uc3RydWN0b3Iga2VlcHMgc2luZ2xlLXBpcGVsaW5lIGJlaGF2aW9yIGlkZW50aWNhbC5cbiAgICBjb25zdCByZXN0b3JlUmVnaXN0cnkgPSBwcm9wcy5yZWdpc3RyeVxuICAgICAgPyBDb25maWcub3ZlcnJpZGVTY29wZWQoJ3JlZ2lzdHJ5JywgcHJvcHMucmVnaXN0cnkpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaWYgKCFwcm9wcy5yZXNvbHZlZEJvb3RzdHJhcD8ucGx1Z2luIHx8ICFwcm9wcy5yZXNvbHZlZEJvb3RzdHJhcC50b29sY2hhaW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdCT09UU1RSQVBfSU1BR0VfVU5SRVNPTFZFRDogUGlwZWxpbmVCdWlsZGVyIHJlcXVpcmVzIGByZXNvbHZlZEJvb3RzdHJhcGAg4oCUIHRoZSByZXNvbHZlZCBwaXBlbGluZS1ib290c3RyYXAgJ1xuICAgICAgICAgICsgJ2hhbGYgb2YgdGhlIHRvb2xjaGFpbiByZWxlYXNlLiBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aC9kZXBsb3lgIHJlc29sdmVzIGl0IGZyb20gdGhlIHBsYXRmb3JtOyAnXG4gICAgICAgICAgKyAnYSBDREsgYXBwIGNvbnN0cnVjdGluZyBQaXBlbGluZUJ1aWxkZXIgZGlyZWN0bHkgbXVzdCBwYXNzIGl0IChzZWUgYHBpcGVsaW5lLW1hbmFnZXIgdG9vbGNoYWluIGV4cG9ydGApLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBVc2UgUGlwZWxpbmVDb25maWd1cmF0aW9uIGZvciBhbGwgYnVzaW5lc3MgbG9naWMgKHZhbGlkYXRpb24sIHNhbml0aXphdGlvbiwgbWV0YWRhdGEgbWVyZ2luZylcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IFBpcGVsaW5lQ29uZmlndXJhdGlvbihwcm9wcyk7XG5cbiAgICAgIGNvbnN0IHNlcnZlckNvbmZpZyA9IENvbmZpZy5nZXQoJ3NlcnZlcicpO1xuICAgICAgY29uc3QgYXdzQ29uZmlnID0gQ29uZmlnLmdldCgnYXdzJyk7XG4gICAgICAvLyBQYXNzIG9yZytwcm9qZWN0IHNvIGxvZyBncm91cCAvIElBTSByb2xlIG5hbWVzIGdldCBhIHN0YWJsZSBoYXNoXG4gICAgICAvLyBzdWZmaXggcGVyIHBpcGVsaW5lLiBQcmV2ZW50cyBgUmVzb3VyY2UgYWxyZWFkeSBleGlzdHNgIGNvbGxpc2lvbnNcbiAgICAgIC8vIGFjcm9zcyBzdGFja3MgZGVwbG95ZWQgdG8gdGhlIHNhbWUgQVdTIGFjY291bnQuXG4gICAgICBjb25zdCB1bmlxdWVJZCA9IG5ldyBVbmlxdWVJZCh7XG4gICAgICAgIG9yZ2FuaXphdGlvbjogdGhpcy5jb25maWcub3JnYW5pemF0aW9uLFxuICAgICAgICBwcm9qZWN0OiB0aGlzLmNvbmZpZy5wcm9qZWN0LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwbHVnaW5Mb29rdXAgPSBuZXcgUGx1Z2luTG9va3VwKFxuICAgICAgICB0aGlzLFxuICAgICAgICB1bmlxdWVJZC5nZW5lcmF0ZSgncGx1Z2luOmxvb2t1cCcpLFxuICAgICAgICB7XG4gICAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5vcmdhbml6YXRpb24sXG4gICAgICAgICAgcHJvamVjdDogdGhpcy5jb25maWcucHJvamVjdCxcbiAgICAgICAgICBwbGF0Zm9ybVVybDogc2VydmVyQ29uZmlnLnBsYXRmb3JtVXJsLFxuICAgICAgICAgIHVuaXF1ZUlkLFxuICAgICAgICAgIG9yZ0lkOiBwcm9wcy5vcmdJZCxcbiAgICAgICAgICBwaXBlbGluZUlkOiBwcm9wcy5waXBlbGluZUlkLFxuICAgICAgICAgIHJ1bnRpbWU6IGxhbWJkYVJ1bnRpbWUoYXdzQ29uZmlnLmxhbWJkYS5ydW50aW1lKSxcbiAgICAgICAgICB0aW1lb3V0OiBsYW1iZGFUaW1lb3V0KGF3c0NvbmZpZy5sYW1iZGEudGltZW91dFNlY29uZHMpLFxuICAgICAgICAgIGFyY2hpdGVjdHVyZTogbGFtYmRhQXJjaGl0ZWN0dXJlKGF3c0NvbmZpZy5sYW1iZGEuYXJjaGl0ZWN0dXJlKSxcbiAgICAgICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiBhd3NDb25maWcubGFtYmRhLnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgICAgICAgcmVzb2x2ZWRQbHVnaW5zOiBwcm9wcy5yZXNvbHZlZFBsdWdpbnMsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICAvLyBDcmVhdGUgc291cmNlIGFuZCBidWlsZCBzdGVwXG4gICAgICBjb25zdCBzb3VyY2VCdWlsZGVyID0gbmV3IFNvdXJjZUJ1aWxkZXIodGhpcywgdGhpcy5jb25maWcpO1xuICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQnVpbGRlci5jcmVhdGUodW5pcXVlSWQpO1xuXG4gICAgICAvLyBTeW50aC1wbHVnaW4gcmVzb2x1dGlvbjpcbiAgICAgIC8vICAgMS4gUHJlLXJlc29sdmVkIGJ5IGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoL2RlcGxveWAgZnJvbSB0aGUgcGxhdGZvcm1cbiAgICAgIC8vICAgICAgQVBJIOKGkiB1c2UgaXQuIFN5bnRoIHN0ZXAgcnVucyBvbiB0aGUgcmVhbCBgY2RrLXN5bnRoYCBpbWFnZSB3aXRoXG4gICAgICAvLyAgICAgIHJlYWwgY29tbWFuZHMgYmFrZWQgaW50byB0aGUgdGVtcGxhdGUuXG4gICAgICAvLyAgIDIuIE90aGVyd2lzZSDihpIgYGJvb3RzdHJhcCgpYDogY29sZC1zdGFydCBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aGBcbiAgICAgIC8vICAgICAgb24gdGhlIHJlc29sdmVkIHRvb2xjaGFpbiByZWxlYXNlJ3MgcGlwZWxpbmUtYm9vdHN0cmFwIGltYWdlXG4gICAgICAvLyAgICAgIChgcmVzb2x2ZWRCb290c3RyYXBgKS4gVXNlZCB3aGVuIHRoZSBzeW50aCBwbHVnaW4gd2Fzbid0XG4gICAgICAvLyAgICAgIHByZS1yZXNvbHZlZCAoYSBub24tbWFuYWdlZCBzeW50aCBwbHVnaW4gd2hvc2UgbG9va3VwIG1pc3NlZCkuXG4gICAgICAvL1xuICAgICAgLy8gcGx1Z2luTG9va3VwLnBsdWdpbigpIHJlYWRzIGByZXNvbHZlZFBsdWdpbnNgIGludGVybmFsbHkgYW5kIHJldHVybnNcbiAgICAgIC8vIHRoZSBjYWNoZWQgZW50cnkgd2hlbiBwcmVzZW50IOKAlCBzbyBjYWxsaW5nIGl0IGFsd2F5cyB3aW5zIG92ZXJcbiAgICAgIC8vIGJvb3RzdHJhcCgpIHdoZW4gcHJlLXJlc29sdXRpb24gc3VjY2VlZGVkLlxuICAgICAgY29uc3Qgc3ludGhDYWNoZUtleSA9IHBsdWdpbkFydGlmYWN0QWxpYXModGhpcy5jb25maWcucGx1Z2luKTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IHByb3BzLnJlc29sdmVkUGx1Z2lucz8uW3N5bnRoQ2FjaGVLZXldXG4gICAgICAgID8gcGx1Z2luTG9va3VwLnBsdWdpbih0aGlzLmNvbmZpZy5wbHVnaW4sIHBsdWdpblN0ZXBMYWJlbChudWxsLCB0aGlzLmNvbmZpZy5wbHVnaW4pKVxuICAgICAgICA6IHBsdWdpbkxvb2t1cC5ib290c3RyYXAoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRDb21wdXRlVHlwZSA9IGdldENvbXB1dGVUeXBlKGF3c0NvbmZpZy5jb2RlQnVpbGQuY29tcHV0ZVR5cGUpO1xuICAgICAgY29uc3QgYXJ0aWZhY3RNYW5hZ2VyID0gbmV3IEFydGlmYWN0TWFuYWdlcigpO1xuXG4gICAgICAvLyBTY29wZSBleHBvc2VkIHRvIHBsdWdpbi1zcGVjIHRlbXBsYXRlcyBhcyBgcGlwZWxpbmUuKmAuIFNvdXJjZWQgZnJvbSB0aGVcbiAgICAgIC8vIGNvbmZpZyBzbyB0aGUgc3ludGggc3RlcCwgZXZlcnkgc3RhZ2Ugc3RlcCwgYW5kIHRoZSBzb3VyY2UgdG9rZW4gYWxsXG4gICAgICAvLyByZXNvbHZlIGFnYWluc3QgdGhlIHNhbWUgc25hcHNob3QgKHNlZSBQaXBlbGluZUNvbmZpZ3VyYXRpb24uZ2V0UGlwZWxpbmVTY29wZSkuXG4gICAgICBjb25zdCBwaXBlbGluZVNjb3BlID0gdGhpcy5jb25maWcuZ2V0UGlwZWxpbmVTY29wZSgpO1xuICAgICAgLy8gQ29udHJhY3Qg4oCUIHNlZSBTdGFnZUJ1aWxkZXIucmVzb2x2ZVN0ZXAuXG4gICAgICBhc3NlcnRQbHVnaW5Db250cmFjdChwbHVnaW4sIGNvbnRyYWN0U2NvcGVGcm9tVGVtcGxhdGVTY29wZShwaXBlbGluZVNjb3BlKSwgJ3N5bnRoJyk7XG5cbiAgICAgIC8vIFRoZSBwaXBlbGluZSdzIGRlZmF1bHQgYnVpbGQgaW1hZ2U6IHRoZSByZWxlYXNlJ3MgcGlwZWxpbmUtYm9vdHN0cmFwLFxuICAgICAgLy8gcmVzb2x2ZWQgb25jZSAob25lIHJlZ2lzdHJ5LWNyZWRlbnRpYWwgaW1wb3J0KSBhbmQgc2hhcmVkIGJ5IHRoZVxuICAgICAgLy8gcGlwZWxpbmUtd2lkZSBjb2RlQnVpbGREZWZhdWx0cyBhbmQgZXZlcnkgcGx1Z2luLWxlc3Mgc3RlcC5cbiAgICAgIGNvbnN0IGRlZmF1bHRCdWlsZEltYWdlID0gcmVzb2x2ZURlZmF1bHRCdWlsZEltYWdlKHRoaXMsIHByb3BzLm9yZ0lkLCBwcm9wcy5yZXNvbHZlZEJvb3RzdHJhcC5wbHVnaW4pO1xuXG4gICAgICBjb25zdCBzdGVwTWFuaWZlc3QgPSBuZXcgU3RlcE1hbmlmZXN0UmVjb3JkZXIoKTtcbiAgICAgIHN0ZXBNYW5pZmVzdC5yZWNvcmRCdWlsZEltYWdlKHByb3BzLnJlc29sdmVkQm9vdHN0cmFwLnBsdWdpbiwgcHJvcHMucmVzb2x2ZWRCb290c3RyYXAudG9vbGNoYWluKTtcbiAgICAgIGNvbnN0IHN5bnRoID0gY3JlYXRlQ29kZUJ1aWxkU3RlcCh7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLnN5bnRoQ3VzdG9taXphdGlvbixcbiAgICAgICAgaWQ6IHVuaXF1ZUlkLmdlbmVyYXRlKCdjZGs6c3ludGgnKSxcbiAgICAgICAgdW5pcXVlSWQsXG4gICAgICAgIHBsdWdpbixcbiAgICAgICAgaW5wdXQ6IHNvdXJjZSxcbiAgICAgICAgbWV0YWRhdGE6IHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCxcbiAgICAgICAgbmV0d29yazogdGhpcy5jb25maWcubmV0d29yayxcbiAgICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICAgIGRlZmF1bHRDb21wdXRlVHlwZSxcbiAgICAgICAgYXJ0aWZhY3RNYW5hZ2VyLFxuICAgICAgICBzdGFnZU5hbWU6ICduby1zdGFnZScsXG4gICAgICAgIHN0YWdlQWxpYXM6ICduby1zdGFnZS1hbGlhcycsXG4gICAgICAgIC8vIFRoZSBjYW5vbmljYWwga2V5IHNlZ21lbnQuIGAke2FsaWFzID8/IG5hbWV9LWFsaWFzYCBzdWZmaXhlZCBhblxuICAgICAgICAvLyBFWFBMSUNJVCBhbGlhcyB0b28gKGBteS1zeW50aGAg4oaSIGBteS1zeW50aC1hbGlhc2ApLCBzbyBhIHN0YWdlIHRoYXRcbiAgICAgICAgLy8gcGlja2VkIHRoZSBzeW50aCBvdXRwdXQgaW4gdGhlIFVJIGFza2VkIGZvciBhIGtleSBuZXZlciByZWdpc3RlcmVkLlxuICAgICAgICBwbHVnaW5BbGlhczogcGx1Z2luQXJ0aWZhY3RBbGlhcyh0aGlzLmNvbmZpZy5wbHVnaW4pLFxuICAgICAgICBvcmdJZDogcHJvcHMub3JnSWQsXG4gICAgICAgIGRlZmF1bHRCdWlsZEltYWdlLFxuICAgICAgICBwaXBlbGluZVNjb3BlLFxuICAgICAgfSk7XG4gICAgICBzdGVwTWFuaWZlc3QucmVjb3JkKHN5bnRoLCBwbHVnaW4sIHBsdWdpblN0ZXBMYWJlbChudWxsLCB0aGlzLmNvbmZpZy5wbHVnaW4pKTtcblxuICAgICAgLy8gUmVzb2x2ZSBwaXBlbGluZS1sZXZlbCBkZWZhdWx0cyBpbnRvIGNvZGVCdWlsZERlZmF1bHRzXG4gICAgICAvLyBCdWlsZCB0aGUgcGVyLW9yZyBwbGF0Zm9ybSBzZWNyZXQgbmFtZSBmb3IgQ29kZUJ1aWxkIGVudiB2YXJzXG4gICAgICBjb25zdCBwbGF0Zm9ybVNlY3JldE5hbWUgPSBwcm9wcy5vcmdJZFxuICAgICAgICA/IENvcmVDb25zdGFudHMuc2VjcmV0UGF0aChwcm9wcy5vcmdJZCwgJ3BsYXRmb3JtJylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAvLyBUaGUgcmVnaXN0cmF0aW9uIGtleSB0aGUgc3ludGggcG9zdHMgaXRzIHN0ZXAgbWFuaWZlc3Qgd2l0aCDigJQgYVxuICAgICAgLy8gc2VwYXJhdGUgY3JlZGVudGlhbCBmcm9tIHRoZSBwbGF0Zm9ybSBvbmUgKGNvcmUvcGlwZWxpbmUtcmVnaXN0cmF0aW9uLnRzKS5cbiAgICAgIGNvbnN0IHJlZ2lzdHJhdGlvblNlY3JldE5hbWUgPSBwcm9wcy5vcmdJZFxuICAgICAgICA/IENvcmVDb25zdGFudHMuc2VjcmV0UGF0aChwcm9wcy5vcmdJZCwgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9MRUFGKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgY29kZUJ1aWxkRGVmYXVsdHMgPSB0aGlzLnJlc29sdmVEZWZhdWx0cyh0aGlzLmNvbmZpZy5kZWZhdWx0cywgdW5pcXVlSWQsIHByb3BzLnBpcGVsaW5lSWQsIHBsYXRmb3JtU2VjcmV0TmFtZSwgc2VydmVyQ29uZmlnLnBsYXRmb3JtVXJsLCBwcm9wcy5vcmdJZCwgZGVmYXVsdEJ1aWxkSW1hZ2UpO1xuXG4gICAgICAvLyBSZXNvbHZlIElBTSByb2xlOiBleHBsaWNpdCBwcm9wIHdpbnMsIGVsc2UgYGlhbTpyb2xlYCBtZXRhZGF0YSwgZWxzZSBsZXRcbiAgICAgIC8vIENESyBhdXRvLWNyZWF0ZSB0aGUgcGlwZWxpbmUgcm9sZSAoY29kZXBpcGVsaW5lLmFtYXpvbmF3cy5jb20gcHJpbmNpcGFsKS5cbiAgICAgIGNvbnN0IHJvbGVDb25maWcgPSBwcm9wcy5yb2xlID8/IHJvbGVDb25maWdGcm9tTWV0YWRhdGEodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkKTtcbiAgICAgIGlmIChyb2xlQ29uZmlnPy50eXBlID09PSAnY29kZUJ1aWxkRGVmYXVsdCcpIHtcbiAgICAgICAgY3JlYXRlTG9nZ2VyKCdwaXBlbGluZS1idWlsZGVyJykud2FybihcbiAgICAgICAgICAnY29kZUJ1aWxkRGVmYXVsdCByb2xlIHR5cGUgdXNlcyBjb2RlYnVpbGQuYW1hem9uYXdzLmNvbSB0cnVzdCBwcmluY2lwYWwg4oCUICcgK1xuICAgICAgICAndGhpcyBpcyBub3Qgc3VpdGFibGUgYXMgdGhlIHBpcGVsaW5lLWxldmVsIHJvbGUuIENvbnNpZGVyIHVzaW5nIHJvbGVBcm4vcm9sZU5hbWUgJyArXG4gICAgICAgICdvciBvbWl0dGluZyB0aGUgcm9sZSB0byBsZXQgQ0RLIGF1dG8tY3JlYXRlIG9uZSB3aXRoIGNvZGVwaXBlbGluZS5hbWF6b25hd3MuY29tLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCByb2xlID0gcm9sZUNvbmZpZ1xuICAgICAgICA/IHJlc29sdmVSb2xlKHRoaXMsIHVuaXF1ZUlkLCByb2xlQ29uZmlnKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgLy8g4pSA4pSAIEFydGlmYWN0IGJ1Y2tldCAoS01TIGVuY3J5cHRpb24gKyByZXRlbnRpb24pIOKUgOKUgFxuICAgICAgLy8gV2hlbiBgZW5jcnlwdGlvbi5rbXNLZXlBcm5gIGFuZC9vciBgb3BlcmF0aW9ucy5hcnRpZmFjdFJldGVudGlvbkRheXNgIGFyZVxuICAgICAgLy8gc2V0IHdlIGNyZWF0ZSBhIGN1c3RvbSBhcnRpZmFjdCBidWNrZXQgYW5kIHBhc3MgaXQgdG8gQ29kZVBpcGVsaW5lOyB0aGF0XG4gICAgICAvLyBpcyB0aGUgb25seSB3YXkgdG8gYXR0YWNoIGEgY3VzdG9tZXItbWFuYWdlZCBrZXkgKHRoZSBMMyBjb25zdHJ1Y3QgZXhwb3Nlc1xuICAgICAgLy8gYGFydGlmYWN0QnVja2V0YCwgbm90IGBlbmNyeXB0aW9uS2V5YCkuIEFic2VudCBib3RoIGtleXMsIENESyBhdXRvLWNyZWF0ZXNcbiAgICAgIC8vIHRoZSBidWNrZXQgYW5kIGJlaGF2aW9yIGlzIHVuY2hhbmdlZC5cbiAgICAgIGNvbnN0IGFydGlmYWN0QnVja2V0ID0gdGhpcy5idWlsZEFydGlmYWN0QnVja2V0KCk7XG5cbiAgICAgIC8vIENyZWF0ZSBDb2RlUGlwZWxpbmUgY29uc3RydWN0LiBUaGUgdG9vbGNoYWluIHBpbnMgKENMSSB2ZXJzaW9ucyxcbiAgICAgIC8vIHNlbGYtbXV0YXRpb24gcnVudGltZSkgZ28gQkVGT1JFIHRoZSBtZXRhZGF0YSBzcHJlYWQ6IGV4cGxpY2l0IHBpcGVsaW5lXG4gICAgICAvLyBtZXRhZGF0YSAoYGNsaVZlcnNpb25gLCBgY2RrQXNzZXRzQ2xpVmVyc2lvbmAsXG4gICAgICAvLyBgc2VsZk11dGF0aW9uQ29kZUJ1aWxkRGVmYXVsdHNgLCBgYXNzZXRQdWJsaXNoaW5nQ29kZUJ1aWxkRGVmYXVsdHNgKSB3aW5zLlxuICAgICAgY29uc3QgY29kZVBpcGVsaW5lTWV0YWRhdGEgPSBtZXRhZGF0YUZvckNvZGVQaXBlbGluZSh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQpO1xuICAgICAgdGhpcy5waXBlbGluZSA9IG5ldyBDb2RlUGlwZWxpbmUodGhpcywgdW5pcXVlSWQuZ2VuZXJhdGUoJ3BpcGVsaW5lczpjb2RlcGlwZWxpbmUnKSwge1xuICAgICAgICAuLi4oY29kZUJ1aWxkRGVmYXVsdHMgJiYgeyBjb2RlQnVpbGREZWZhdWx0cyB9KSxcbiAgICAgICAgLi4uKHJvbGUgJiYgeyByb2xlIH0pLFxuICAgICAgICAuLi4oYXJ0aWZhY3RCdWNrZXQgJiYgeyBhcnRpZmFjdEJ1Y2tldCB9KSxcbiAgICAgICAgcGlwZWxpbmVUeXBlOiBQaXBlbGluZVR5cGUuVjIsXG4gICAgICAgIHBpcGVsaW5lTmFtZTogdGhpcy5jb25maWcucGlwZWxpbmVOYW1lLFxuICAgICAgICBzeW50aCxcbiAgICAgICAgLi4udG9vbGNoYWluUGlucyhwcm9wcy5yZXNvbHZlZEJvb3RzdHJhcCwgY29kZVBpcGVsaW5lTWV0YWRhdGEpLFxuICAgICAgICAuLi5jb2RlUGlwZWxpbmVNZXRhZGF0YSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSdW4tdGltZSB2dWxuZXJhYmlsaXR5IGNoZWNrIChvcHQtaW4gbWV0YWRhdGEgZmxhZywgcmVwb3J0LW9ubHkpLiBJdFxuICAgICAgLy8gbmVlZHMgdGhlIHBpcGVsaW5lIGlkICh0aGUgY2hlY2sgaXMgcGVyIHBpcGVsaW5lKSBhbmQgdGhlIG9yZyBwbGF0Zm9ybVxuICAgICAgLy8gc2VjcmV0ICh0aGUgdmVyaWZ5IHN0ZXAgYXV0aGVudGljYXRlcyB3aXRoIGl0KTsgd2l0aG91dCBlaXRoZXIgaXQgaXNcbiAgICAgIC8vIHNraXBwZWQgd2l0aCBhIHdhcm5pbmcg4oCUIGEgdmlzaWJpbGl0eSBmZWF0dXJlIG5ldmVyIGZhaWxzIGEgc3ludGguXG4gICAgICBsZXQgcnVudGltZVZ1bG5DaGVjayA9IGlzUnVudGltZVZ1bG5DaGVja0VuYWJsZWQodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkKTtcbiAgICAgIGlmIChydW50aW1lVnVsbkNoZWNrICYmICghcHJvcHMucGlwZWxpbmVJZCB8fCAhcGxhdGZvcm1TZWNyZXROYW1lKSkge1xuICAgICAgICBjcmVhdGVMb2dnZXIoJ3BpcGVsaW5lLWJ1aWxkZXInKS53YXJuKFxuICAgICAgICAgIGAke1JVTlRJTUVfVlVMTl9DSEVDS19LRVl9IGlzIGVuYWJsZWQgYnV0IHRoZSBwaXBlbGluZSBoYXMgbm8gJHshcHJvcHMucGlwZWxpbmVJZCA/ICdwaXBlbGluZUlkJyA6ICdvcmdJZCd9IOKAlCBgXG4gICAgICAgICAgKyAnc2tpcHBpbmcgdGhlIHJ1bi10aW1lIGNoZWNrIHN0ZXBzLiBTeW50aGVzaXplIHRocm91Z2ggYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGgvZGVwbG95IC0taWRgLicsXG4gICAgICAgICk7XG4gICAgICAgIHJ1bnRpbWVWdWxuQ2hlY2sgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLnN0YWdlcykge1xuICAgICAgICBjb25zdCBzdGFnZUJ1aWxkZXIgPSBuZXcgU3RhZ2VCdWlsZGVyKHtcbiAgICAgICAgICBzY29wZTogdGhpcyxcbiAgICAgICAgICBwbHVnaW5Mb29rdXAsXG4gICAgICAgICAgdW5pcXVlSWQsXG4gICAgICAgICAgZ2xvYmFsTWV0YWRhdGE6IHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCxcbiAgICAgICAgICBkZWZhdWx0Q29tcHV0ZVR5cGUsXG4gICAgICAgICAgYXJ0aWZhY3RNYW5hZ2VyLFxuICAgICAgICAgIG9yZ0lkOiBwcm9wcy5vcmdJZCxcbiAgICAgICAgICBkZWZhdWx0QnVpbGRJbWFnZSxcbiAgICAgICAgICBwaXBlbGluZVNjb3BlLFxuICAgICAgICAgIHN0ZXBNYW5pZmVzdCxcbiAgICAgICAgICAuLi4ocnVudGltZVZ1bG5DaGVjayAmJiBwbGF0Zm9ybVNlY3JldE5hbWUgJiYgeyBydW50aW1lVnVsbkNoZWNrOiB7IHBsYXRmb3JtU2VjcmV0TmFtZSB9IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgc3RhZ2VCdWlsZGVyLmFkZFN0YWdlcyh0aGlzLnBpcGVsaW5lLCBwcm9wcy5zdGFnZXMpO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgVGFncyDilIDilIBcbiAgICAgIC8vIFRoZSBmaXJzdCB0aHJlZSBhcmUgb3BlcmF0aW9ucy1lc3NlbnRpYWwgYW5kIHVzZWQgYnkgYHBpcGVsaW5lLW1hbmFnZXJcbiAgICAgIC8vIGF1ZGl0IHN0YWNrc2AgdG8gZGlmZiBDRk4gc3RhY2tzIGFnYWluc3QgdGhlIHBpcGVsaW5lX3JlZ2lzdHJ5IHRhYmxlLlxuICAgICAgLy8gYE9yZ0lkYCBpcyB0aGUgY2Fub25pY2FsIGtleSBmb3IgY29zdCBhdHRyaWJ1dGlvbiAoQVdTIENvc3QgRXhwbG9yZXJcbiAgICAgIC8vIGdyb3VwcyBieSB0YWcga2V5L3ZhbHVlIHdoZW4gYWN0aXZhdGVkIGluIEJpbGxpbmcgc2V0dGluZ3MpLlxuICAgICAgLy8gVVNFUiBUQUdTIEZJUlNULCBzbyB0aGUgcGxhdGZvcm0gdGFncyBiZWxvdyBvdmVyd3JpdGUgcmF0aGVyIHRoYW4gYXJlXG4gICAgICAvLyBvdmVyd3JpdHRlbi4gYFRhZ3Mub2ZgIGxldHMgYSBsYXRlciBhZGQgcmVwbGFjZSBhbiBlYXJsaWVyIG9uZSwgYW5kXG4gICAgICAvLyB0aGVzZSB1c2VkIHRvIGJlIGFwcGxpZWQgTEFTVCDigJQgd2hpY2ggbGV0IGEgY2FsbGVyIHJlZGVmaW5lXG4gICAgICAvLyBwYi5waXBlbGluZS1pZCwgT3JnSWQgb3IgcGIuZGVwbG95cyBhbmQgcG9pbnQgYW5vdGhlciBvcmcncyBleGVjdXRpb25zXG4gICAgICAvLyBhdCB0aGVpciBvd24gcGlwZWxpbmUsIHNpbmNlIHRoZSBldmVudHMgTGFtYmRhIHJlYWRzIGV4YWN0bHkgdGhvc2UgdGFnc1xuICAgICAgLy8gdG8gZGVjaWRlIHdob3NlIHJlcG9ydHMgYW4gZXhlY3V0aW9uIGJlbG9uZ3MgdG8uXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHJlc2VydmVkLWtleSBmaWx0ZXIgaXMgdGhlIHNlY29uZCBoYWxmOiBvcmRlcmluZyBhbG9uZSB3b3VsZCBsZXQgYVxuICAgICAgLy8gY2FsbGVyIHNldCBgcGIuZGVwbG95c2Agb24gYSBwaXBlbGluZSB0aGF0IGRlY2xhcmVzIG5vIGVudmlyb25tZW50IChub1xuICAgICAgLy8gcGxhdGZvcm0gdGFnIHRvIG92ZXJ3cml0ZSBpdCkuIFRoZSBBUEkgcmVmdXNlcyB0aGVzZSBrZXlzIHRvbywgYnV0IGFcbiAgICAgIC8vIHRlYW0gdXNpbmcgdGhpcyBjb25zdHJ1Y3QgZGlyZWN0bHkgbmV2ZXIgcGFzc2VzIHRocm91Z2ggdGhlIEFQSSwgc29cbiAgICAgIC8vIHRoaXMgaXMgdGhlIGNoZWNrIHRoYXQgYWx3YXlzIHJ1bnMuXG4gICAgICBpZiAocHJvcHMudGFncykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcy50YWdzKSkge1xuICAgICAgICAgIGlmIChpc1Jlc2VydmVkVGFnS2V5KGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgncGlwZWxpbmUtYnVpbGRlcicsICd0cnVlJyk7XG4gICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgncHJvamVjdCcsIHRoaXMuY29uZmlnLnByb2plY3QpO1xuICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ29yZ2FuaXphdGlvbicsIHRoaXMuY29uZmlnLm9yZ2FuaXphdGlvbik7XG4gICAgICBpZiAocHJvcHMub3JnSWQpIHtcbiAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ09yZ0lkJywgcHJvcHMub3JnSWQpO1xuICAgICAgfVxuICAgICAgLy8gU3RhYmxlIGV2ZW50LXJlcG9ydGluZyBrZXkuIEFwcGxpZWQgYXQgc3ludGggKHRoZSBwaXBlbGluZUlkIGlzIGtub3duXG4gICAgICAvLyBoZXJlKSwgc28gaXQncyBwcmVzZW50IGZyb20gc3RhY2sgY3JlYXRpb24g4oCUIHRoZSBldmVudHMgTGFtYmRhIHJlYWRzIHRoaXNcbiAgICAgIC8vIHRhZyB0byBhdHRyaWJ1dGUgQ29kZVBpcGVsaW5lIHN0YXRlLWNoYW5nZSBldmVudHMgdG8gdGhlIHBpcGVsaW5lIHdpdGhvdXRcbiAgICAgIC8vIGV2ZXIgaGFuZGxpbmcgdGhlIEFSTi9hY2NvdW50LiBTZWUgcGFja2FnZXMvcGlwZWxpbmUtZXZlbnRzLlxuICAgICAgaWYgKHByb3BzLnBpcGVsaW5lSWQpIHtcbiAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ3BiLnBpcGVsaW5lLWlkJywgcHJvcHMucGlwZWxpbmVJZCk7XG4gICAgICB9XG4gICAgICAvLyBEZXBsb3ktZW52aXJvbm1lbnQgYXR0cmlidXRpb24gZm9yIERPUkEgbWV0cmljcy4gYHBiLmRlcGxveXNgIGxpc3RzIGV2ZXJ5XG4gICAgICAvLyBkZXBsb3kgc3RhZ2UgYXMgYDxzdGFnZU5hbWU+OjxlbnZpcm9ubWVudD5gIHBhaXJzIGpvaW5lZCBieSBgK2AsIHJlYWQgYnlcbiAgICAgIC8vIHRoZSBldmVudHMgTGFtYmRhIGZyb20gdGhlIHNhbWUgTGlzdFRhZ3MgY2FsbCB0byBtYXJrIHdoaWNoIHN0YWdlcyBhcmVcbiAgICAgIC8vIGRlcGxveXMgYW5kIHRvIHdoaWNoIGVudmlyb25tZW50LiBBYnNlbnQgd2hlbiBubyBlbnZpcm9ubWVudCBpcyBkZWNsYXJlZFxuICAgICAgLy8g4oCUIHN1Y2ggcGlwZWxpbmVzIHByb2R1Y2Ugbm8gRE9SQSBkZXBsb3kgc2lnbmFsIHVudGlsIHRoZXkgcmUtc3ludGguXG4gICAgICBjb25zdCBkZXBsb3lzVGFnID0gYnVpbGREZXBsb3lzVGFnKHByb3BzKTtcbiAgICAgIGlmIChkZXBsb3lzVGFnKSB7XG4gICAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKCdwYi5kZXBsb3lzJywgZGVwbG95c1RhZyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIHRoZSBpbnRlcm5hbCBwaXBlbGluZSBiZWZvcmUgYWNjZXNzaW5nIGl0cyBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLnBpcGVsaW5lLmJ1aWxkUGlwZWxpbmUoKTtcblxuICAgICAgLy8gUExBVEZPUk1fU0VDUkVUX05BTUUgaXMgaW5qZWN0ZWQgaW50byB0aGUgQ29kZUJ1aWxkIGVudmlyb25tZW50IGFib3ZlLFxuICAgICAgLy8gYnV0IHRoZSBzeW50aCBwcm9jZXNzIHJlYWRzIHRoYXQgc2VjcmV0IGl0c2VsZiB3aXRoIHRoZSBBV1MgU0RLXG4gICAgICAvLyAoaGFuZGxlcnMvcGxhdGZvcm0tY3JlZGVudGlhbC50cyBHZXRTZWNyZXRWYWx1ZSkg4oCUIHNvIHRoZSByb2xlIG5lZWRzIGFuXG4gICAgICAvLyBleHBsaWNpdCBncmFudC4gTm90aGluZyB3YXMgZ3JhbnRpbmcgaXQ6IHRoZSBSRUdJU1RSWSBzZWNyZXQgd29ya3Mgb25seVxuICAgICAgLy8gYmVjYXVzZSBgTGludXhCdWlsZEltYWdlLmZyb21Eb2NrZXJSZWdpc3RyeSh7IHNlY3JldHNNYW5hZ2VyQ3JlZGVudGlhbHMgfSlgXG4gICAgICAvLyBtYWtlcyBDREsgZ3JhbnQgdGhhdCBvbmUgaW50ZXJuYWxseSwgd2hpY2ggZG9lcyBub3QgZ2VuZXJhbGlzZSB0byBhXG4gICAgICAvLyBzZWNyZXQgdGhlIGJ1aWxkIHJlYWRzIGZvciBpdHNlbGYuIFdpdGhvdXQgdGhpcyBldmVyeSBzeW50aCBmYWlscyB3aXRoXG4gICAgICAvLyBBY2Nlc3NEZW5pZWRFeGNlcHRpb24gb24gR2V0U2VjcmV0VmFsdWUsIGFuZCB0aGUgcGlwZWxpbmUgcm9sZSBoYXMgdG8gYmVcbiAgICAgIC8vIHBhdGNoZWQgYnkgaGFuZCBpbiBlYWNoIGFjY291bnQuXG4gICAgICAvL1xuICAgICAgLy8gU2NvcGVkIHRvIHRoaXMgb3JnJ3MgcGxhdGZvcm0gc2VjcmV0IGFuZCBtaXJyb3JpbmcgdGhlIHBsdWdpbi1sb29rdXBcbiAgICAgIC8vIExhbWJkYSdzIGdyYW50IChwaXBlbGluZS9wbHVnaW4tbG9va3VwLnRzKSwgaW5jbHVkaW5nIHRoZSBgLSpgIHN1ZmZpeCDigJRcbiAgICAgIC8vIFNlY3JldHMgTWFuYWdlciBhcHBlbmRzIHNpeCByYW5kb20gY2hhcmFjdGVycyB0byBldmVyeSBBUk4uXG4gICAgICBpZiAocGxhdGZvcm1TZWNyZXROYW1lKSB7XG4gICAgICAgIHRoaXMucGlwZWxpbmUuc3ludGhQcm9qZWN0LmFkZFRvUm9sZVBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICBhY3Rpb25zOiBbJ3NlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbYGFybjphd3M6c2VjcmV0c21hbmFnZXI6KjoqOnNlY3JldDoke3BsYXRmb3JtU2VjcmV0TmFtZX0tKmBdLFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICAvLyBTYW1lIGdyYW50IGZvciB0aGUgcmVnaXN0cmF0aW9uIGtleSwgYW5kIG9uIHRoZSBTWU5USCBwcm9qZWN0IG9ubHk6IGl0XG4gICAgICAvLyBpcyB0aGUgb25lIHN0ZXAgdGhhdCByZWdpc3RlcnMuIEl0cyBOQU1FIHJpZGVzIHRoZSBwaXBlbGluZS13aWRlXG4gICAgICAvLyBlbnZpcm9ubWVudCAocmVzb2x2ZURlZmF1bHRzKSwgbm90IGEgU0VDUkVUU19NQU5BR0VSIHZhcmlhYmxlLCBzbyBhXG4gICAgICAvLyBtaXNzaW5nIGtleSBza2lwcyB0aGUgcmVnaXN0cmF0aW9uIHdpdGggYSB3YXJuaW5nIGluc3RlYWQgb2YgZmFpbGluZ1xuICAgICAgLy8gdGhlIGJ1aWxkIGF0IERPV05MT0FEX1NPVVJDRSDigJQgYW5kIGEgc3RlcCB3aXRob3V0IHRoaXMgZ3JhbnQgY2Fubm90XG4gICAgICAvLyByZWFkIGl0LlxuICAgICAgaWYgKHJlZ2lzdHJhdGlvblNlY3JldE5hbWUpIHtcbiAgICAgICAgdGhpcy5waXBlbGluZS5zeW50aFByb2plY3QuYWRkVG9Sb2xlUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFsnc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUnXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czpzZWNyZXRzbWFuYWdlcjoqOio6c2VjcmV0OiR7cmVnaXN0cmF0aW9uU2VjcmV0TmFtZX0tKmBdLFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNka1BpcGVsaW5lID0gdGhpcy5waXBlbGluZS5waXBlbGluZTtcbiAgICAgIHRoaXMuc3RlcE1hbmlmZXN0ID0gc3RlcE1hbmlmZXN0LmVudHJpZXMoY2RrUGlwZWxpbmUpO1xuICAgICAgY29uc3QgbWV0YSA9IHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZDtcblxuICAgICAgLy8g4pSA4pSAIFBpcGVsaW5lLWxldmVsIFZhcmlhYmxlcyAoQ29kZVBpcGVsaW5lIFYyKSDilIDilIBcbiAgICAgIGZvciAoY29uc3QgdiBvZiBwYXJzZVBpcGVsaW5lVmFyaWFibGVzKG1ldGFbTWV0YWRhdGFLZXlzLlBJUEVMSU5FX1ZBUklBQkxFU10pKSB7XG4gICAgICAgIGNka1BpcGVsaW5lLmFkZFZhcmlhYmxlKG5ldyBWYXJpYWJsZSh7XG4gICAgICAgICAgdmFyaWFibGVOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgLi4uKHYuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgeyBkZWZhdWx0VmFsdWU6IHYuZGVmYXVsdFZhbHVlIH0pLFxuICAgICAgICAgIC4uLih2LmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgJiYgeyBkZXNjcmlwdGlvbjogdi5kZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgU05TIE5vdGlmaWNhdGlvbnMg4pSA4pSAXG4gICAgICBjb25zdCBub3RpZmljYXRpb25Ub3BpY0FybiA9IG1ldGFbTWV0YWRhdGFLZXlzLk5PVElGSUNBVElPTl9UT1BJQ19BUk5dO1xuICAgICAgaWYgKHR5cGVvZiBub3RpZmljYXRpb25Ub3BpY0FybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgdG9waWMgPSBzbnMuVG9waWMuZnJvbVRvcGljQXJuKHRoaXMsICdOb3RpZmljYXRpb25Ub3BpYycsIG5vdGlmaWNhdGlvblRvcGljQXJuKTtcbiAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9uRXZlbnRzID0gcGFyc2VOb3RpZmljYXRpb25FdmVudHMobWV0YVtNZXRhZGF0YUtleXMuTk9USUZJQ0FUSU9OX0VWRU5UU10pXG4gICAgICAgICAgLm1hcChlID0+IFBJUEVMSU5FX0VWRU5UX01BUFtlLnRvVXBwZXJDYXNlKCldKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGlmIChub3RpZmljYXRpb25FdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNka1BpcGVsaW5lLm5vdGlmeU9uKCdQaXBlbGluZU5vdGlmaWNhdGlvbicsIHRvcGljLCB7IGV2ZW50czogbm90aWZpY2F0aW9uRXZlbnRzIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBTY2hlZHVsZWQgRXhlY3V0aW9uIOKUgOKUgFxuICAgICAgaWYgKHByb3BzLnN5bnRoLnNvdXJjZS5vcHRpb25zPy50cmlnZ2VyID09PSBUcmlnZ2VyVHlwZS5TQ0hFRFVMRSB8fCBwcm9wcy5zY2hlZHVsZSkge1xuICAgICAgICBjb25zdCBleHByID0gcHJvcHMuc2NoZWR1bGUgfHwgKHByb3BzLnN5bnRoLnNvdXJjZS5vcHRpb25zIGFzIHsgc2NoZWR1bGU/OiBzdHJpbmcgfSk/LnNjaGVkdWxlIHx8ICdyYXRlKDEgZGF5KSc7XG4gICAgICAgIG5ldyBldmVudHMuUnVsZSh0aGlzLCAnU2NoZWR1bGVSdWxlJywge1xuICAgICAgICAgIHNjaGVkdWxlOiBldmVudHMuU2NoZWR1bGUuZXhwcmVzc2lvbihleHByKSxcbiAgICAgICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuQ29kZVBpcGVsaW5lKGNka1BpcGVsaW5lKV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgRXhlY3V0aW9uIEV2ZW50IFRyYWNraW5nIChmb3J3YXJkIHBpcGVsaW5lIHN0YXRlIGNoYW5nZXMgdG8gU05TKSDilIDilIBcbiAgICAgIC8vIGBpc1RydWVgLCBub3QgdHJ1dGhpbmVzczogYFwiZmFsc2VcImAgaXMgYSB0cnV0aHkgc3RyaW5nLCBzbyB0aGUgbWV0YWRhdGFcbiAgICAgIC8vIGBcImF3czpjZGs6b3BlcmF0aW9uczpleGVjdXRpb25ldmVudHNcIjogXCJmYWxzZVwiYCB1c2VkIHRvIENSRUFURSB0aGUgcnVsZS5cbiAgICAgIGlmIChpc1RydWUobWV0YVtNZXRhZGF0YUtleXMuRU5BQkxFX0VYRUNVVElPTl9FVkVOVFNdKSAmJiB0eXBlb2Ygbm90aWZpY2F0aW9uVG9waWNBcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG5ldyBldmVudHMuUnVsZSh0aGlzLCAnRXhlY3V0aW9uRXZlbnRSdWxlJywge1xuICAgICAgICAgIGV2ZW50UGF0dGVybjoge1xuICAgICAgICAgICAgc291cmNlOiBbJ2F3cy5jb2RlcGlwZWxpbmUnXSxcbiAgICAgICAgICAgIGRldGFpbFR5cGU6IFsnQ29kZVBpcGVsaW5lIFBpcGVsaW5lIEV4ZWN1dGlvbiBTdGF0ZSBDaGFuZ2UnXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW2Nka1BpcGVsaW5lLnBpcGVsaW5lQXJuXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRhcmdldHM6IFtuZXcgdGFyZ2V0cy5TbnNUb3BpYyhcbiAgICAgICAgICAgIHNucy5Ub3BpYy5mcm9tVG9waWNBcm4odGhpcywgJ0V4ZWN1dGlvbkV2ZW50VG9waWMnLCBub3RpZmljYXRpb25Ub3BpY0FybiksXG4gICAgICAgICAgKV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgUGlwZWxpbmUgTWV0cmljcyAmIEFsYXJtcyDilIDilIBcbiAgICAgIC8vIFNhbWUgdHJhcDogYFwiYXdzOmNkazpvcGVyYXRpb25zOm1ldHJpY3NcIjogXCJmYWxzZVwiYCBjcmVhdGVkIHRoZSBhbGFybS5cbiAgICAgIGNvbnN0IGVuYWJsZU1ldHJpY3MgPSBpc1RydWUodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkW01ldGFkYXRhS2V5cy5FTkFCTEVfTUVUUklDU10pO1xuICAgICAgaWYgKGVuYWJsZU1ldHJpY3MpIHtcbiAgICAgICAgbmV3IGNsb3Vkd2F0Y2guQWxhcm0odGhpcywgJ1BpcGVsaW5lRmFpbHVyZUFsYXJtJywge1xuICAgICAgICAgIG1ldHJpYzogbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgICAgICAgIG5hbWVzcGFjZTogJ0FXUy9Db2RlUGlwZWxpbmUnLFxuICAgICAgICAgICAgbWV0cmljTmFtZTogJ0ZhaWxlZFBpcGVsaW5lRXhlY3V0aW9uQ291bnQnLFxuICAgICAgICAgICAgZGltZW5zaW9uc01hcDogeyBQaXBlbGluZU5hbWU6IHRoaXMuY29uZmlnLnBpcGVsaW5lTmFtZSB9LFxuICAgICAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgICAgIHBlcmlvZDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDEsXG4gICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYFBpcGVsaW5lICR7dGhpcy5jb25maWcucGlwZWxpbmVOYW1lfSBleGVjdXRpb24gZmFpbGVkYCxcbiAgICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXZlcnQgdGhlIHBlci1idWlsZGVyIHJlZ2lzdHJ5IG92ZXJyaWRlIHNvIGl0IG5ldmVyIGxlYWtzIGludG8gdGhlXG4gICAgICAvLyBwcm9jZXNzLXdpZGUgQ29uZmlnIGNhY2hlIChzZWUgdGhlIG92ZXJyaWRlIGF0IHRoZSB0b3Agb2YgdGhlIGNvbnN0cnVjdG9yKS5cbiAgICAgIHJlc3RvcmVSZWdpc3RyeT8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY3VzdG9tIGFydGlmYWN0IGJ1Y2tldCB3aGVuIGBlbmNyeXB0aW9uLmttc0tleUFybmAgYW5kL29yXG4gICAqIGBvcGVyYXRpb25zLmFydGlmYWN0UmV0ZW50aW9uRGF5c2AgYXJlIHNldC4gUmV0dXJucyB1bmRlZmluZWQgb3RoZXJ3aXNlIHNvXG4gICAqIENESyBhdXRvLWNyZWF0ZXMgdGhlIGRlZmF1bHQgYXJ0aWZhY3QgYnVja2V0ICh1bmNoYW5nZWQgYmVoYXZpb3IpLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFydGlmYWN0QnVja2V0KCk6IHMzLklCdWNrZXQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQ7XG4gICAgY29uc3Qga21zS2V5QXJuID0gdHlwZW9mIG1ldGFbTWV0YWRhdGFLZXlzLktNU19LRVlfQVJOXSA9PT0gJ3N0cmluZydcbiAgICAgID8gKG1ldGFbTWV0YWRhdGFLZXlzLktNU19LRVlfQVJOXSBhcyBzdHJpbmcpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXRlbnRpb25EYXlzID0gYXNJbnQobWV0YVtNZXRhZGF0YUtleXMuQVJUSUZBQ1RfUkVURU5USU9OX0RBWVNdKTtcblxuICAgIGlmICgha21zS2V5QXJuICYmIHJldGVudGlvbkRheXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBrbXNLZXlBcm5cbiAgICAgID8ga21zLktleS5mcm9tS2V5QXJuKHRoaXMsICdBcnRpZmFjdEtleScsIGttc0tleUFybilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgYnVja2V0ID0gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnQXJ0aWZhY3RCdWNrZXQnLCB7XG4gICAgICBlbmNyeXB0aW9uOiBlbmNyeXB0aW9uS2V5ID8gczMuQnVja2V0RW5jcnlwdGlvbi5LTVMgOiBzMy5CdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICAuLi4oZW5jcnlwdGlvbktleSAmJiB7IGVuY3J5cHRpb25LZXkgfSksXG4gICAgICAuLi4ocmV0ZW50aW9uRGF5cyAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IFt7IGV4cGlyYXRpb246IER1cmF0aW9uLmRheXMocmV0ZW50aW9uRGF5cykgfV0sXG4gICAgICB9KSxcbiAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogczMuQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgfSk7XG4gICAgVGFncy5vZihidWNrZXQpLmFkZCgncGlwZWxpbmUnLCB0aGlzLmNvbmZpZy5waXBlbGluZU5hbWUpO1xuICAgIHJldHVybiBidWNrZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgQ29kZUJ1aWxkRGVmYXVsdHMgaW50byB0aGUgc2hhcGUgZXhwZWN0ZWQgYnkgQ0RLJ3MgY29kZUJ1aWxkRGVmYXVsdHMuXG4gICAqIENvbWJpbmVzIG5ldHdvcmsgY29uZmlnLCBzZWN1cml0eSBncm91cHMsIGFuZCBwaXBlbGluZS1sZXZlbCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogKFBJUEVMSU5FX0lELCBFWEVDVVRJT05fSUQsIFBMQVRGT1JNX0JBU0VfVVJMKSBhdmFpbGFibGUgdG8gYWxsIENvZGVCdWlsZCBhY3Rpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGVmYXVsdHMoXG4gICAgZGVmYXVsdHM6IENvZGVCdWlsZERlZmF1bHRzIHwgdW5kZWZpbmVkLFxuICAgIGlkOiBVbmlxdWVJZCxcbiAgICBwaXBlbGluZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcGxhdGZvcm1TZWNyZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcGxhdGZvcm1Vcmw6IHN0cmluZyxcbiAgICBvcmdJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRCdWlsZEltYWdlOiBJQnVpbGRJbWFnZSxcbiAgKTogQ29kZUJ1aWxkT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gUGVyLXBpcGVsaW5lIG5ldHdvcmsgY29uZmlnIHdpbnM7IG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gYW4gZW52LWRyaXZlblxuICAgIC8vIGdsb2JhbCBWUEMgKGludGVybmFsIC8gaW5zaWRlLUFXUy1vbmx5IG1vZGUpIHNvIGV2ZXJ5IHBpcGVsaW5lJ3NcbiAgICAvLyBDb2RlQnVpbGQgcnVucyBpbiB0aGUgVlBDIGFuZCBjYW4gcmVhY2ggdGhlIHByaXZhdGUgZ2F0ZXdheS4gVW5zZXQgaW5cbiAgICAvLyBwdWJsaWMgZGVwbG95cyDihpIgQ29kZUJ1aWxkIHN0YXlzIGluIHRoZSBBV1MtbWFuYWdlZCBuZXR3b3JrLlxuICAgIC8vIFByZWNlZGVuY2U6IGV4cGxpY2l0IHByb3AgPiBgZWMyOm5ldHdvcmtgIG1ldGFkYXRhID4gZW52LWRyaXZlbiBnbG9iYWwgVlBDLlxuICAgIGNvbnN0IG5ldHdvcmsgPSBkZWZhdWx0cz8ubmV0d29yayA/PyBuZXR3b3JrQ29uZmlnRnJvbU1ldGFkYXRhKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCkgPz8gbmV0d29ya0NvbmZpZ0Zyb21FbnYoKTtcbiAgICBjb25zdCBuZXR3b3JrUHJvcHMgPSBuZXR3b3JrXG4gICAgICA/IHJlc29sdmVOZXR3b3JrKHRoaXMsIGlkLCBuZXR3b3JrKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBTYW1lIHByZWNlZGVuY2UgZm9yIHN0YW5kYWxvbmUgc2VjdXJpdHkgZ3JvdXBzIChwcm9wID4gYGVjMjpzZWN1cml0eWdyb3VwYCBtZXRhZGF0YSkuXG4gICAgY29uc3Qgc2VjdXJpdHlHcm91cENvbmZpZyA9IGRlZmF1bHRzPy5zZWN1cml0eUdyb3VwcyA/PyBzZWN1cml0eUdyb3VwQ29uZmlnRnJvbU1ldGFkYXRhKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCk7XG4gICAgY29uc3Qgc3RhbmRhbG9uZVNlY3VyaXR5R3JvdXBzID0gc2VjdXJpdHlHcm91cENvbmZpZ1xuICAgICAgPyByZXNvbHZlU2VjdXJpdHlHcm91cCh0aGlzLCBpZCwgc2VjdXJpdHlHcm91cENvbmZpZylcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY2FCdW5kbGUgPSBwbGF0Zm9ybUNhQnVuZGxlKCk7XG5cbiAgICAvLyBQaXBlbGluZS1sZXZlbCBlbnYgdmFycyBhdmFpbGFibGUgdG8gYWxsIENvZGVCdWlsZCBhY3Rpb25zXG4gICAgLy8gTm90ZTogI3tjb2RlcGlwZWxpbmUuKn0gcmVzb2x2ZWQgdmFyaWFibGVzIG11c3QgZ28gdGhyb3VnaCBDb2RlQnVpbGRTdGVwLmVudlxuICAgIC8vIChhY3Rpb24tbGV2ZWwpLCBub3QgYnVpbGRFbnZpcm9ubWVudC5lbnZpcm9ubWVudFZhcmlhYmxlcyAocHJvamVjdC1sZXZlbCkuXG4gICAgY29uc3QgcGlwZWxpbmVFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBzdHJpbmcgfT4gPSB7XG4gICAgICBQTEFURk9STV9CQVNFX1VSTDogeyB2YWx1ZTogcGxhdGZvcm1VcmwgfSxcbiAgICAgIC4uLihwaXBlbGluZUlkICYmIHsgUElQRUxJTkVfSUQ6IHsgdmFsdWU6IHBpcGVsaW5lSWQgfSB9KSxcbiAgICAgIC4uLihwbGF0Zm9ybVNlY3JldE5hbWUgJiYgeyBQTEFURk9STV9TRUNSRVRfTkFNRTogeyB2YWx1ZTogcGxhdGZvcm1TZWNyZXROYW1lIH0gfSksXG4gICAgICAvLyBUaGUgcmVnaXN0cmF0aW9uIGtleSdzIHNlY3JldCBOQU1FIChvbmx5IHRoZSBzeW50aCByb2xlIG1heSByZWFkIGl0KS5cbiAgICAgIC4uLihvcmdJZCAmJiB7IFtQSVBFTElORV9SRUdJU1RSQVRJT05fU0VDUkVUX0VOVl06IHsgdmFsdWU6IENvcmVDb25zdGFudHMuc2VjcmV0UGF0aChvcmdJZCwgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9MRUFGKSB9IH0pLFxuICAgICAgLy8gUExBVEZPUk1fVExTX1ZFUklGWT1mYWxzZSAoZGV2IHNlbGYtc2lnbmVkIHBsYXRmb3JtKTogZXZlcnkgQ29kZUJ1aWxkXG4gICAgICAvLyBzdGVwIHJlYWNoZXMgdGhlIHBsYXRmb3JtIHVudmVyaWZpZWQuIFNlZSBjb3JlL3BsYXRmb3JtLXRscy50cy5cbiAgICAgIC4uLighcGxhdGZvcm1UbHNWZXJpZnkoKSAmJiB7XG4gICAgICAgIE5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQ6IHsgdmFsdWU6ICcwJyB9LFxuICAgICAgICBbUExBVEZPUk1fVExTX1ZFUklGWV9FTlZdOiB7IHZhbHVlOiAnZmFsc2UnIH0sXG4gICAgICB9KSxcbiAgICAgIC8vIEEgcHJpdmF0ZS1DQSBwbGF0Zm9ybTogdGhlIENBIHRyYXZlbHMgd2l0aCB0aGUgcGlwZWxpbmUgc28gdGhlXG4gICAgICAvLyBzZWxmLW11dGF0aW5nIHN5bnRoIChhbmQgYW55IHN0ZXAgY2FsbGluZyB0aGUgcGxhdGZvcm0pIFZFUklGSUVTIHRoZVxuICAgICAgLy8gY2VydGlmaWNhdGUgaW5zdGVhZCBvZiBuZWVkaW5nIGAtLW5vLXZlcmlmeS1zc2xgLiBTZWUgY29yZS9wbGF0Zm9ybS10bHMudHMuXG4gICAgICAuLi4oY2FCdW5kbGUgJiYgeyBbUExBVEZPUk1fQ0FfQlVORExFX0VOVl06IHsgdmFsdWU6IGNhQnVuZGxlIH0gfSksXG4gICAgICAvLyBObyBpbWFnZSBjYXJyeTogdGhlIHNlbGYtbXV0YXRpbmcgc3ludGggcmUtcmVzb2x2ZXMgdGhlIHRvb2xjaGFpbiBmcm9tXG4gICAgICAvLyB0aGUgcGxhdGZvcm0gKHJlc29sdmVCb290c3RyYXBJbWFnZSksIHNvIGEgcmUtc3ludGggZm9sbG93cyB0aGVcbiAgICAgIC8vIHJlbGVhc2UgdGhlIHBsYXRmb3JtIHJlc29sdmVzIG9uIHRoYXQgcnVuLiBUaGUgcmVsZWFzZSBpcyByZWNvcmRlZFxuICAgICAgLy8gcGxhdGZvcm0tc2lkZSBpbiB0aGUgc3RlcCBtYW5pZmVzdCwgbmV2ZXIgaW4gdGhlIGN1c3RvbWVyJ3MgYWNjb3VudC5cbiAgICB9O1xuXG4gICAgY29uc3Qgc2VjdXJpdHlHcm91cHMgPSBbXG4gICAgICAuLi4obmV0d29ya1Byb3BzPy5zZWN1cml0eUdyb3VwcyA/PyBbXSksXG4gICAgICAuLi4oc3RhbmRhbG9uZVNlY3VyaXR5R3JvdXBzID8/IFtdKSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihuZXR3b3JrUHJvcHMgJiYgeyB2cGM6IG5ldHdvcmtQcm9wcy52cGMsIHN1Ym5ldFNlbGVjdGlvbjogbmV0d29ya1Byb3BzLnN1Ym5ldFNlbGVjdGlvbiB9KSxcbiAgICAgIC4uLihzZWN1cml0eUdyb3Vwcy5sZW5ndGggPiAwICYmIHsgc2VjdXJpdHlHcm91cHMgfSksXG4gICAgICAvLyBidWlsZEltYWdlIGF0IHRoaXMgbGV2ZWwgcmVhY2hlcyBDREsgUGlwZWxpbmVzJyBpbnRlcm5hbGx5LXdyYXBwZWRcbiAgICAgIC8vIFNoZWxsU3RlcCBDb2RlQnVpbGQgYWN0aW9uIGFuZCBhc3NldCBwdWJsaXNoaW5nLCB3aGljaCBvdGhlcndpc2UgcnVuXG4gICAgICAvLyBvbiBDREsncyBkZWZhdWx0IGN1cmF0ZWQgaW1hZ2UuIEl0IGlzIHRoZSByZWxlYXNlJ3MgcGlwZWxpbmUtYm9vdHN0cmFwLFxuICAgICAgLy8gcHVsbGVkIGV4YWN0bHkgbGlrZSBhIHBsdWdpbiBpbWFnZS4gUGVyLXN0ZXAgYGJ1aWxkSW1hZ2VgIG9uIGFcbiAgICAgIC8vIENvZGVCdWlsZFN0ZXAgc3RpbGwgd2luczsgc2VsZi1tdXRhdGlvbiBvdmVycmlkZXMgaXQgKGN1cmF0ZWQsIEQxMCkuXG4gICAgICBidWlsZEVudmlyb25tZW50OiB7XG4gICAgICAgIGJ1aWxkSW1hZ2U6IGRlZmF1bHRCdWlsZEltYWdlLFxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogcGlwZWxpbmVFbnZWYXJzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iXX0=