UNPKG

aws-delivlib

Version:

A fabulous library for defining continuous pipelines for building, testing and releasing code libraries.

177 lines • 28.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BuildSpec = void 0; const util_1 = require("./util"); const MAGIC_ARTIFACT_NAME = 'PRIMARY'; /** * Class to model a buildspec version 0.2 * * Artifact handling is a little special: CodeBuild will interpret the * 'artifacts' section differently depending on whether there are secondary * artifacts or not. * * If there is only one artifact, the single artifact must go into the top-level * 'artifacts' section. If there are multiple artifacts, all of them must go * into the 'secondary-artifacts' section. Upon rendering to JSON, the caller * must supply the name of the primary artifact (it's determined by * the CodePipeline Action that invokes the CodeBuild Project that uses this * buildspec). * * INVARIANT: in-memory, the BuildSpec will treat all artifacts the same (as * a bag of secondary artifacts). At the edges (construction or rendering), * if there's only a single artifact it will be rendered to the primary * artifact. */ class BuildSpec { static literal(struct) { return new BuildSpec(struct); } static simple(props) { // We merge the primary artifact into the secondary artifacts under a special key // They will be compacted back together during rendering. const artifactDirectories = Object.assign({}, props.additionalArtifactDirectories || {}, props.artifactDirectory ? { [MAGIC_ARTIFACT_NAME]: props.artifactDirectory } : {}); let artifacts; if (Object.keys(artifactDirectories || {}).length > 0) { artifacts = { 'secondary-artifacts': (0, util_1.mapValues)(artifactDirectories, d => ({ 'base-directory': d, 'files': ['**/*'], })), }; } return new BuildSpec({ version: '0.2', phases: (0, util_1.noUndefined)({ install: props.install !== undefined ? { commands: props.install } : undefined, pre_build: props.preBuild !== undefined ? { commands: props.preBuild } : undefined, build: props.build !== undefined ? { commands: props.build } : undefined, }), artifacts, reports: props.reports, }); } static empty() { return new BuildSpec({ version: '0.2' }); } constructor(spec) { this.spec = spec; } get additionalArtifactNames() { return Object.keys(this.spec.artifacts && this.spec.artifacts['secondary-artifacts'] || {}).filter(n => n !== MAGIC_ARTIFACT_NAME); } merge(other) { return new BuildSpec({ 'version': '0.2', 'run-as': mergeObj(this.spec['run-as'], other.spec['run-as'], equalObjects), 'env': mergeObj(this.spec.env, other.spec.env, (a, b) => ({ 'parameter-store': mergeDict(a['parameter-store'], b['parameter-store'], equalObjects), 'variables': mergeDict(a.variables, b.variables, equalObjects), })), 'phases': mergeDict(this.spec.phases, other.spec.phases, (a, b, phase) => { const merged = { 'run-as': mergeObj(a['run-as'], b['run-as'], equalObjects), 'on-failure': mergeObj(a['on-failure'], b['on-failure'], equalObjects), 'commands': mergeList(a.commands, b.commands), 'finally': mergeList(a.finally, b.finally), }; if (phase === 'install') { merged['runtime-versions'] = mergeDict(a['runtime-versions'], b['runtime-versions'], equalObjects); } return (0, util_1.noUndefined)(merged); }), 'artifacts': mergeObj(this.spec.artifacts, other.spec.artifacts, mergeArtifacts), 'cache': mergeObj(this.spec.cache, other.spec.cache, (a, b) => ({ paths: mergeList(a.paths, b.paths), })), 'reports': mergeDict(this.spec.reports, other.spec.reports, (a, b) => { throw new Error(`Reports must have unique names, got ${a} and ${b}`); }), }); function mergeArtifacts(a, b) { if (a.files || b.files) { throw new Error('None of the BuildSpecs may have a primary artifact.'); } const artifacts = Object.assign({}, a['secondary-artifacts'] || {}); for (const [k, v] of Object.entries(b['secondary-artifacts'] || {})) { if (k in artifacts) { throw new Error(`There is already an artifact with name ${k}`); } artifacts[k] = v; } return Object.assign({}, a, { 'secondary-artifacts': artifacts }); } function equalObjects(a, b) { if (a !== b) { throw new Error(`Can't merge two different values for the same key: ${JSON.stringify(a)}, ${JSON.stringify(b)}`); } return b; } function mergeObj(a, b, fn) { if (a === undefined) { return b; } if (b === undefined) { return a; } return fn(a, b); } function mergeDict(as, bs, fn) { return mergeObj(as, bs, (a, b) => { const ret = Object.assign({}, a); for (const [k, v] of Object.entries(b)) { if (ret[k]) { ret[k] = fn(ret[k], v, k); } else { ret[k] = v; } } return ret; }); } function mergeList(as, bs) { return mergeObj(as, bs, (a, b) => a.concat(b)); } } render(options = {}) { return Object.assign({}, this.spec, { artifacts: this.renderArtifacts(options) }); } renderArtifacts(options) { if (!this.spec.artifacts || !this.spec.artifacts['secondary-artifacts']) { return this.spec.artifacts; } // Simplify a single "secondary-artifacts" to a single primary artifact (regardless of the name) const singleArt = dictSingletonValue(this.spec.artifacts['secondary-artifacts']); if (singleArt) { return singleArt; } // Otherwise rename a 'PRIMARY' key if it exists if (MAGIC_ARTIFACT_NAME in this.spec.artifacts['secondary-artifacts']) { if (!options.primaryArtifactName) { throw new Error(`Replacement name for ${MAGIC_ARTIFACT_NAME} artifact not supplied`); } return { 'secondary-artifacts': renameKey(this.spec.artifacts['secondary-artifacts'], MAGIC_ARTIFACT_NAME, options.primaryArtifactName) }; } return this.spec.artifacts; } } exports.BuildSpec = BuildSpec; /** * If the dict is a singleton dict, return the value of the first key, otherwise return undefined */ function dictSingletonValue(xs) { const keys = Object.keys(xs); if (keys.length === 1) { return xs[keys[0]]; } return undefined; } function renameKey(xs, orig, rename) { const ret = Object.assign({}, xs); if (orig in ret) { ret[rename] = ret[orig]; delete ret[orig]; } return ret; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJ1aWxkLXNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQWdEO0FBR2hELE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFhLFNBQVM7SUFDYixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQXVCO1FBQzNDLE9BQU8sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBMkI7UUFDOUMsaUZBQWlGO1FBQ2pGLHlEQUF5RDtRQUN6RCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUMxQyxLQUFLLENBQUMsNkJBQTZCLElBQUksRUFBRSxFQUN6QyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2xGLENBQUM7UUFFRixJQUFJLFNBQTRDLENBQUM7UUFDakQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckQsU0FBUyxHQUFHO2dCQUNWLHFCQUFxQixFQUFFLElBQUEsZ0JBQVMsRUFBQyxtQkFBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzNELGdCQUFnQixFQUFFLENBQUM7b0JBQ25CLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztpQkFDbEIsQ0FBQyxDQUFDO2FBQ0osQ0FBQztTQUNIO1FBRUQsT0FBTyxJQUFJLFNBQVMsQ0FBQztZQUNuQixPQUFPLEVBQUUsS0FBSztZQUNkLE1BQU0sRUFBRSxJQUFBLGtCQUFXLEVBQUM7Z0JBQ2xCLE9BQU8sRUFB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QUFDLENBQUM7UUFDeEIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYXBWYWx1ZXMsIG5vVW5kZWZpbmVkIH0gZnJvbSAnLi91dGlsJztcblxuXG5jb25zdCBNQUdJQ19BUlRJRkFDVF9OQU1FID0gJ1BSSU1BUlknO1xuXG4vKipcbiAqIENsYXNzIHRvIG1vZGVsIGEgYnVpbGRzcGVjIHZlcnNpb24gMC4yXG4gKlxuICogQXJ0aWZhY3QgaGFuZGxpbmcgaXMgYSBsaXR0bGUgc3BlY2lhbDogQ29kZUJ1aWxkIHdpbGwgaW50ZXJwcmV0IHRoZVxuICogJ2FydGlmYWN0cycgc2VjdGlvbiBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGVyZSBhcmUgc2Vjb25kYXJ5XG4gKiBhcnRpZmFjdHMgb3Igbm90LlxuICpcbiAqIElmIHRoZXJlIGlzIG9ubHkgb25lIGFydGlmYWN0LCB0aGUgc2luZ2xlIGFydGlmYWN0IG11c3QgZ28gaW50byB0aGUgdG9wLWxldmVsXG4gKiAnYXJ0aWZhY3RzJyBzZWN0aW9uLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgYXJ0aWZhY3RzLCBhbGwgb2YgdGhlbSBtdXN0IGdvXG4gKiBpbnRvIHRoZSAnc2Vjb25kYXJ5LWFydGlmYWN0cycgc2VjdGlvbi4gVXBvbiByZW5kZXJpbmcgdG8gSlNPTiwgdGhlIGNhbGxlclxuICogbXVzdCBzdXBwbHkgdGhlIG5hbWUgb2YgdGhlIHByaW1hcnkgYXJ0aWZhY3QgKGl0J3MgZGV0ZXJtaW5lZCBieVxuICogdGhlIENvZGVQaXBlbGluZSBBY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBDb2RlQnVpbGQgUHJvamVjdCB0aGF0IHVzZXMgdGhpc1xuICogYnVpbGRzcGVjKS5cbiAqXG4gKiBJTlZBUklBTlQ6IGluLW1lbW9yeSwgdGhlIEJ1aWxkU3BlYyB3aWxsIHRyZWF0IGFsbCBhcnRpZmFjdHMgdGhlIHNhbWUgKGFzXG4gKiBhIGJhZyBvZiBzZWNvbmRhcnkgYXJ0aWZhY3RzKS4gQXQgdGhlIGVkZ2VzIChjb25zdHJ1Y3Rpb24gb3IgcmVuZGVyaW5nKSxcbiAqIGlmIHRoZXJlJ3Mgb25seSBhIHNpbmdsZSBhcnRpZmFjdCBpdCB3aWxsIGJlIHJlbmRlcmVkIHRvIHRoZSBwcmltYXJ5XG4gKiBhcnRpZmFjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1aWxkU3BlYyB7XG4gIHB1YmxpYyBzdGF0aWMgbGl0ZXJhbChzdHJ1Y3Q6IEJ1aWxkU3BlY1N0cnVjdCkge1xuICAgIHJldHVybiBuZXcgQnVpbGRTcGVjKHN0cnVjdCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNpbXBsZShwcm9wczogU2ltcGxlQnVpbGRTcGVjUHJvcHMpIHtcbiAgICAvLyBXZSBtZXJnZSB0aGUgcHJpbWFyeSBhcnRpZmFjdCBpbnRvIHRoZSBzZWNvbmRhcnkgYXJ0aWZhY3RzIHVuZGVyIGEgc3BlY2lhbCBrZXlcbiAgICAvLyBUaGV5IHdpbGwgYmUgY29tcGFjdGVkIGJhY2sgdG9nZXRoZXIgZHVyaW5nIHJlbmRlcmluZy5cbiAgICBjb25zdCBhcnRpZmFjdERpcmVjdG9yaWVzID0gT2JqZWN0LmFzc2lnbih7fSxcbiAgICAgIHByb3BzLmFkZGl0aW9uYWxBcnRpZmFjdERpcmVjdG9yaWVzIHx8IHt9LFxuICAgICAgcHJvcHMuYXJ0aWZhY3REaXJlY3RvcnkgPyB7IFtNQUdJQ19BUlRJRkFDVF9OQU1FXTogcHJvcHMuYXJ0aWZhY3REaXJlY3RvcnkgfSA6IHt9LFxuICAgICk7XG5cbiAgICBsZXQgYXJ0aWZhY3RzOiBQcmltYXJ5QXJ0aWZhY3RTdHJ1Y3QgfCB1bmRlZmluZWQ7XG4gICAgaWYgKE9iamVjdC5rZXlzKGFydGlmYWN0RGlyZWN0b3JpZXMgfHwge30pLmxlbmd0aCA+IDApIHtcbiAgICAgIGFydGlmYWN0cyA9IHtcbiAgICAgICAgJ3NlY29uZGFyeS1hcnRpZmFjdHMnOiBtYXBWYWx1ZXMoYXJ0aWZhY3REaXJlY3RvcmllcyEsIGQgPT4gKHtcbiAgICAgICAgICAnYmFzZS1kaXJlY3RvcnknOiBkLFxuICAgICAgICAgICdmaWxlcyc6IFsnKiovKiddLFxuICAgICAgICB9KSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQnVpbGRTcGVjKHtcbiAgICAgIHZlcnNpb246ICcwLjInLFxuICAgICAgcGhhc2VzOiBub1VuZGVmaW5lZCh7XG4gICAgICAgIGluc3RhbGw6IHByb3BzLmluc3RhbGwgIT09IHVuZGVmaW5lZCA/IHsgY29tbWFuZHM6IHByb3BzLmluc3RhbGwgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlX2J1aWxkOiBwcm9wcy5wcmVCdWlsZCAhPT0gdW5kZWZpbmVkID8geyBjb21tYW5kczogcHJvcHMucHJlQnVpbGQgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgYnVpbGQ6IHByb3BzLmJ1aWxkICE9PSB1bmRlZmluZWQgPyB7IGNvbW1hbmRzOiBwcm9wcy5idWlsZCB9IDogdW5kZWZpbmVkLFxuICAgICAgfSksXG4gICAgICBhcnRpZmFjdHMsXG4gICAgICByZXBvcnRzOiBwcm9wcy5yZXBvcnRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBlbXB0eSgpIHtcbiAgICByZXR1cm4gbmV3IEJ1aWxkU3BlYyh7IHZlcnNpb246ICcwLjInIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHNwZWM6IEJ1aWxkU3BlY1N0cnVjdCkge1xuICB9XG5cbiAgcHVibGljIGdldCBhZGRpdGlvbmFsQXJ0aWZhY3ROYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuc3BlYy5hcnRpZmFjdHMgJiYgdGhpcy5zcGVjLmFydGlmYWN0c1snc2Vjb25kYXJ5LWFydGlmYWN0cyddIHx8IHt9KS5maWx0ZXIobiA9PiBuICE9PSBNQUdJQ19BUlRJRkFDVF9OQU1FKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXJnZShvdGhlcjogQnVpbGRTcGVjKTogQnVpbGRTcGVjIHtcbiAgICByZXR1cm4gbmV3IEJ1aWxkU3BlYyh7XG4gICAgICAndmVyc2lvbic6ICcwLjInLFxuICAgICAgJ3J1bi1hcyc6IG1lcmdlT2JqKHRoaXMuc3BlY1sncnVuLWFzJ10sIG90aGVyLnNwZWNbJ3J1bi1hcyddLCBlcXVhbE9iamVjdHMpLFxuICAgICAgJ2Vudic6IG1lcmdlT2JqKHRoaXMuc3BlYy5lbnYsIG90aGVyLnNwZWMuZW52LCAoYSwgYikgPT4gKHtcbiAgICAgICAgJ3BhcmFtZXRlci1zdG9yZSc6IG1lcmdlRGljdChhWydwYXJhbWV0ZXItc3RvcmUnXSwgYlsncGFyYW1ldGVyLXN0b3JlJ10sIGVxdWFsT2JqZWN0cyksXG4gICAgICAgICd2YXJpYWJsZXMnOiBtZXJnZURpY3QoYS52YXJpYWJsZXMsIGIudmFyaWFibGVzLCBlcXVhbE9iamVjdHMpLFxuICAgICAgfSkpLFxuICAgICAgJ3BoYXNlcyc6IG1lcmdlRGljdCh0aGlzLnNwZWMucGhhc2VzLCBvdGhlci5zcGVjLnBoYXNlcywgKGEsIGIsIHBoYXNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lcmdlZDogUGhhc2VTdHJ1Y3QgPSB7XG4gICAgICAgICAgJ3J1bi1hcyc6IG1lcmdlT2JqKGFbJ3J1bi1hcyddLCBiWydydW4tYXMnXSwgZXF1YWxPYmplY3RzKSxcbiAgICAgICAgICAnb24tZmFpbHVyZSc6IG1lcmdlT2JqKGFbJ29uLWZhaWx1cmUnXSwgYlsnb24tZmFpbHVyZSddLCBlcXVhbE9iamVjdHMpLFxuICAgICAgICAgICdjb21tYW5kcyc6IG1lcmdlTGlzdChhLmNvbW1hbmRzLCBiLmNvbW1hbmRzKSEsXG4gICAgICAgICAgJ2ZpbmFsbHknOiBtZXJnZUxpc3QoYS5maW5hbGx5LCBiLmZpbmFsbHkpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwaGFzZSA9PT0gJ2luc3RhbGwnKSB7XG4gICAgICAgICAgKG1lcmdlZCBhcyBJbnN0YWxsUGhhc2VTdHJ1Y3QpWydydW50aW1lLXZlcnNpb25zJ10gPSBtZXJnZURpY3QoXG4gICAgICAgICAgICAoYSBhcyBJbnN0YWxsUGhhc2VTdHJ1Y3QpWydydW50aW1lLXZlcnNpb25zJ10sXG4gICAgICAgICAgICAoYiBhcyBJbnN0YWxsUGhhc2VTdHJ1Y3QpWydydW50aW1lLXZlcnNpb25zJ10sXG4gICAgICAgICAgICBlcXVhbE9iamVjdHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub1VuZGVmaW5lZChtZXJnZWQpO1xuICAgICAgfSksXG4gICAgICAnYXJ0aWZhY3RzJzogbWVyZ2VPYmoodGhpcy5zcGVjLmFydGlmYWN0cywgb3RoZXIuc3BlYy5hcnRpZmFjdHMsIG1lcmdlQXJ0aWZhY3RzKSxcbiAgICAgICdjYWNoZSc6IG1lcmdlT2JqKHRoaXMuc3BlYy5jYWNoZSwgb3RoZXIuc3BlYy5jYWNoZSwgKGEsIGIpID0+ICh7XG4gICAgICAgIHBhdGhzOiBtZXJnZUxpc3QoYS5wYXRocywgYi5wYXRocykhLFxuICAgICAgfSkpLFxuICAgICAgJ3JlcG9ydHMnOiBtZXJnZURpY3QodGhpcy5zcGVjLnJlcG9ydHMsIG90aGVyLnNwZWMucmVwb3J0cywgKGEsIGIpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXBvcnRzIG11c3QgaGF2ZSB1bmlxdWUgbmFtZXMsIGdvdCAke2F9IGFuZCAke2J9YCk7XG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1lcmdlQXJ0aWZhY3RzKGE6IFByaW1hcnlBcnRpZmFjdFN0cnVjdCwgYjogUHJpbWFyeUFydGlmYWN0U3RydWN0KTogUHJpbWFyeUFydGlmYWN0U3RydWN0IHtcbiAgICAgIGlmIChhLmZpbGVzIHx8IGIuZmlsZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb25lIG9mIHRoZSBCdWlsZFNwZWNzIG1heSBoYXZlIGEgcHJpbWFyeSBhcnRpZmFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXJ0aWZhY3RzID0gT2JqZWN0LmFzc2lnbih7fSwgYVsnc2Vjb25kYXJ5LWFydGlmYWN0cyddIHx8IHt9KTtcbiAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGJbJ3NlY29uZGFyeS1hcnRpZmFjdHMnXSB8fCB7fSkpIHtcbiAgICAgICAgaWYgKGsgaW4gYXJ0aWZhY3RzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGVyZSBpcyBhbHJlYWR5IGFuIGFydGlmYWN0IHdpdGggbmFtZSAke2t9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYXJ0aWZhY3RzW2tdID0gdjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBhLCB7ICdzZWNvbmRhcnktYXJ0aWZhY3RzJzogYXJ0aWZhY3RzIH0pO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gZXF1YWxPYmplY3RzKGE6IHN0cmluZywgYjogc3RyaW5nKSB7XG4gICAgICBpZiAoYSAhPT0gYikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IG1lcmdlIHR3byBkaWZmZXJlbnQgdmFsdWVzIGZvciB0aGUgc2FtZSBrZXk6ICR7SlNPTi5zdHJpbmdpZnkoYSl9LCAke0pTT04uc3RyaW5naWZ5KGIpfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VPYmo8VD4oYTogVCB8IHVuZGVmaW5lZCwgYjogVCB8IHVuZGVmaW5lZCwgZm46IChhOiBULCBiOiBUKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBiOyB9XG4gICAgICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBhOyB9XG4gICAgICByZXR1cm4gZm4oYSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VEaWN0PFQ+KGFzOiB7IFtrOiBzdHJpbmddOiBUIH0gfCB1bmRlZmluZWQsIGJzOiB7IFtrOiBzdHJpbmddOiBUIH0gfCB1bmRlZmluZWQsIGZuOiAoYTogVCwgYjogVCwgazogc3RyaW5nKSA9PiBUKSB7XG4gICAgICByZXR1cm4gbWVyZ2VPYmooYXMsIGJzLCAoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCByZXQgPSBPYmplY3QuYXNzaWduKHt9LCBhKTtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYikpIHtcbiAgICAgICAgICBpZiAocmV0W2tdKSB7XG4gICAgICAgICAgICByZXRba10gPSBmbihyZXRba10sIHYsIGspO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXRba10gPSB2O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VMaXN0PFQ+KGFzOiBUW10gfCB1bmRlZmluZWQsIGJzOiBUW10gfCB1bmRlZmluZWQpOiBUW10gfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIG1lcmdlT2JqKGFzLCBicywgKGEsIGIpID0+IGEuY29uY2F0KGIpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKG9wdGlvbnM6IEJ1aWxkU3BlY1JlbmRlck9wdGlvbnMgPSB7fSk6IEJ1aWxkU3BlY1N0cnVjdCB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3BlYywgeyBhcnRpZmFjdHM6IHRoaXMucmVuZGVyQXJ0aWZhY3RzKG9wdGlvbnMpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJBcnRpZmFjdHMob3B0aW9uczogQnVpbGRTcGVjUmVuZGVyT3B0aW9ucyk6IFByaW1hcnlBcnRpZmFjdFN0cnVjdCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnNwZWMuYXJ0aWZhY3RzIHx8ICF0aGlzLnNwZWMuYXJ0aWZhY3RzWydzZWNvbmRhcnktYXJ0aWZhY3RzJ10pIHsgcmV0dXJuIHRoaXMuc3BlYy5hcnRpZmFjdHM7IH1cblxuICAgIC8vIFNpbXBsaWZ5IGEgc2luZ2xlIFwic2Vjb25kYXJ5LWFydGlmYWN0c1wiIHRvIGEgc2luZ2xlIHByaW1hcnkgYXJ0aWZhY3QgKHJlZ2FyZGxlc3Mgb2YgdGhlIG5hbWUpXG4gICAgY29uc3Qgc2luZ2xlQXJ0ID0gZGljdFNpbmdsZXRvblZhbHVlKHRoaXMuc3BlYy5hcnRpZmFjdHNbJ3NlY29uZGFyeS1hcnRpZmFjdHMnXSk7XG4gICAgaWYgKHNpbmdsZUFydCkgeyByZXR1cm4gc2luZ2xlQXJ0OyB9XG5cbiAgICAvLyBPdGhlcndpc2UgcmVuYW1lIGEgJ1BSSU1BUlknIGtleSBpZiBpdCBleGlzdHNcbiAgICBpZiAoTUFHSUNfQVJUSUZBQ1RfTkFNRSBpbiB0aGlzLnNwZWMuYXJ0aWZhY3RzWydzZWNvbmRhcnktYXJ0aWZhY3RzJ10pIHtcbiAgICAgIGlmICghb3B0aW9ucy5wcmltYXJ5QXJ0aWZhY3ROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVwbGFjZW1lbnQgbmFtZSBmb3IgJHtNQUdJQ19BUlRJRkFDVF9OQU1FfSBhcnRpZmFjdCBub3Qgc3VwcGxpZWRgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgJ3NlY29uZGFyeS1hcnRpZmFjdHMnOiByZW5hbWVLZXkodGhpcy5zcGVjLmFydGlmYWN0c1snc2Vjb25kYXJ5LWFydGlmYWN0cyddLCBNQUdJQ19BUlRJRkFDVF9OQU1FLCBvcHRpb25zLnByaW1hcnlBcnRpZmFjdE5hbWUpIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3BlYy5hcnRpZmFjdHM7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVCdWlsZFNwZWNQcm9wcyB7XG4gIGluc3RhbGw/OiBzdHJpbmdbXTtcbiAgcHJlQnVpbGQ/OiBzdHJpbmdbXTtcbiAgYnVpbGQ/OiBzdHJpbmdbXTtcbiAgcmVwb3J0cz86IHsgW2tleTogc3RyaW5nXTogUmVwb3J0U3RydWN0IH07XG4gIGFydGlmYWN0RGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgZGlyZWN0b3JpZXMgZm9yIGVhY2ggYXJ0aWZhY3QgYXJlXG4gICAqXG4gICAqIFVzZSBzcGVjaWFsIG5hbWUgUFJJTUFSWSB0byByZWZlciB0byB0aGUgcHJpbWFyeSBhcnRpZmFjdC4gV2lsbCBiZVxuICAgKiByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgYXJ0aWZhY3QgbmFtZSB3aGVuIHRoZSBidWlsZCBzcGVjIGlzIHN5bnRoZXNpemVkLlxuICAgKi9cbiAgYWRkaXRpb25hbEFydGlmYWN0RGlyZWN0b3JpZXM/OiB7IFtpZDogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRTcGVjU3RydWN0IHtcbiAgJ3ZlcnNpb24nOiAnMC4yJztcbiAgJ3J1bi1hcyc/OiBzdHJpbmc7XG4gICdlbnYnPzogRW52U3RydWN0O1xuICAncGhhc2VzJz86IHtcbiAgICBpbnN0YWxsPzogSW5zdGFsbFBoYXNlU3RydWN0O1xuICAgIHByZV9idWlsZD86IFBoYXNlU3RydWN0O1xuICAgIGJ1aWxkPzogUGhhc2VTdHJ1Y3Q7XG4gICAgcG9zdF9idWlsZD86IFBoYXNlU3RydWN0O1xuICB9O1xuICAnYXJ0aWZhY3RzJz86IFByaW1hcnlBcnRpZmFjdFN0cnVjdDtcbiAgJ2NhY2hlJz86IENhY2hlU3RydWN0O1xuICAncmVwb3J0cyc/OiB7IFtrZXk6IHN0cmluZ106IFJlcG9ydFN0cnVjdCB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudlN0cnVjdCB7XG4gICd2YXJpYWJsZXMnPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgJ3BhcmFtZXRlci1zdG9yZSc/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAnZXhwb3J0ZWQtdmFyaWFibGVzJz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBoYXNlU3RydWN0IHtcbiAgJ3J1bi1hcyc/OiBzdHJpbmc7XG4gICdvbi1mYWlsdXJlJz86IHN0cmluZztcbiAgJ2NvbW1hbmRzJzogc3RyaW5nW107XG4gICdmaW5hbGx5Jz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbGxQaGFzZVN0cnVjdCBleHRlbmRzIFBoYXNlU3RydWN0IHtcbiAgJ3J1bnRpbWUtdmVyc2lvbnMnPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRTdHJ1Y3Qge1xuICAnZmlsZXMnPzogc3RyaW5nW107XG4gICdiYXNlLWRpcmVjdG9yeSc/OiBzdHJpbmc7XG4gICdkaXNjYXJkLXBhdGhzJz86ICd5ZXMnIHwgJ25vJztcbiAgJ2ZpbGUtZm9ybWF0Jz86ICdDdWN1bWJlckpzb24nIHwgJ0p1bml0WG1sJyB8ICdOdW5pdFhtbCcgfCAnVGVzdE5HWG1sJyB8ICdWaXN1YWxTdHVkaW9UcngnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFydGlmYWN0U3RydWN0IHtcbiAgJ2ZpbGVzJz86IHN0cmluZ1tdO1xuICAnbmFtZSc/OiBzdHJpbmc7XG4gICdiYXNlLWRpcmVjdG9yeSc/OiBzdHJpbmc7XG4gICdkaXNjYXJkLXBhdGhzJz86ICd5ZXMnIHwgJ25vJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmltYXJ5QXJ0aWZhY3RTdHJ1Y3QgZXh0ZW5kcyBBcnRpZmFjdFN0cnVjdCB7XG4gICdzZWNvbmRhcnktYXJ0aWZhY3RzJz86IHsgW2tleTogc3RyaW5nXTogQXJ0aWZhY3RTdHJ1Y3QgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZVN0cnVjdCB7XG4gIHBhdGhzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFNwZWNSZW5kZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJlcGxhY2UgUFJJTUFSWSBhcnRpZmFjdCBuYW1lIHdpdGggdGhpc1xuICAgKlxuICAgKiBDYW5ub3QgdXNlIHRoZSBzcGVjaWFsIHRlcm0gUFJJTUFSWSBpZiB0aGlzIGlzIG5vdCBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgIENhbm5vdCB1c2UgUFJJTUFSWVxuICAgKi9cbiAgcHJpbWFyeUFydGlmYWN0TmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJZiB0aGUgZGljdCBpcyBhIHNpbmdsZXRvbiBkaWN0LCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBrZXksIG90aGVyd2lzZSByZXR1cm4gdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGRpY3RTaW5nbGV0b25WYWx1ZTxUPih4czogeyBba2V5OiBzdHJpbmddOiBUIH0pOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHhzKTtcbiAgaWYgKGtleXMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHhzW2tleXNbMF1dO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlbmFtZUtleTxUPih4czogeyBba2V5OiBzdHJpbmddOiBUIH0sIG9yaWc6IHN0cmluZywgcmVuYW1lOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IFQgfSB7XG4gIGNvbnN0IHJldCA9IE9iamVjdC5hc3NpZ24oe30sIHhzKTtcbiAgaWYgKG9yaWcgaW4gcmV0KSB7XG4gICAgcmV0W3JlbmFtZV0gPSByZXRbb3JpZ107XG4gICAgZGVsZXRlIHJldFtvcmlnXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIl19