projen
Version:
CDK for software projects
189 lines • 28.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Projenrc = void 0;
exports.generateJavaOptionNames = generateJavaOptionNames;
exports.getJavaImport = getJavaImport;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const fs_1 = require("fs");
const path_1 = require("path");
const common_1 = require("../common");
const dependencies_1 = require("../dependencies");
const inventory_1 = require("../inventory");
const projenrc_1 = require("../projenrc");
const util_1 = require("../util");
/**
* Allows writing projenrc files in java.
*
* This will install `org.projen/projen` as a Maven dependency and will add a
* `synth` task which will compile & execute `main()` from
* `src/main/java/projenrc.java`.
*/
class Projenrc extends projenrc_1.ProjenrcFile {
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.java.Projenrc", version: "0.103.12" };
/**
* The name of the java class that includes the projen entrypoint.
*/
className;
/**
* Whether the class is in the "test" or "main" scope?
*/
testScope;
constructor(project, pom, options = {}) {
super(project);
const projenVersion = options.projenVersion ?? common_1.PROJEN_VERSION;
this.className = options.className ?? "projenrc";
this.testScope = options.testScope ?? true;
const depType = this.testScope
? dependencies_1.DependencyType.TEST
: dependencies_1.DependencyType.RUNTIME;
const execOpts = [];
if (this.testScope) {
execOpts.push("-Dexec.classpathScope=test");
}
const compileGoal = this.testScope
? "compiler:testCompile"
: "compiler:compile";
project.deps.addDependency(`io.github.cdklabs/projen@${projenVersion}`, depType);
pom.addPlugin("org.codehaus.mojo/exec-maven-plugin@3.0.0");
// set up the "default" task which is the task executed when `projen` is executed for this project.
project.defaultTask?.execArgs(["mvn", compileGoal, "--quiet"]);
project.defaultTask?.execArgs([
"mvn",
"exec:java",
"--quiet",
`-Dexec.mainClass=${this.className}`,
...execOpts,
]);
}
projectCreation(initProject) {
this.generateProjenrc(initProject);
}
get javaClass() {
const split = this.className.split(".");
if (split.length === 1) {
return split[0];
}
return split[split.length - 1];
}
get javaPackage() {
const split = this.className.split(".");
if (split.length === 1) {
return [];
}
return split.slice(0, split.length - 2);
}
/**
* The path of the projenrc file.
*/
get filePath() {
const dir = this.testScope ? "src/test/java" : "src/main/java";
const javaFile = (0, path_1.join)(this.project.outdir, dir, ...this.javaPackage, this.javaClass + ".java");
const relativePath = (0, path_1.relative)(this.project.outdir, javaFile);
return (0, util_1.normalizePersistedPath)(relativePath);
}
generateProjenrc(bootstrap) {
const jsiiFqn = bootstrap.fqn;
const jsiiManifest = (0, inventory_1.readJsiiManifest)(jsiiFqn);
const jsiiType = jsiiManifest.types[jsiiFqn];
const javaTarget = jsiiManifest.targets.java;
const optionsTypeFqn = jsiiType.initializer?.parameters?.[0].type?.fqn;
if (!optionsTypeFqn) {
this.project.logger.warn("cannot determine jsii type for project options");
return;
}
const jsiiOptionsType = jsiiManifest.types[optionsTypeFqn];
if (!jsiiOptionsType) {
this.project.logger.warn(`cannot find jsii type for project options: ${optionsTypeFqn}`);
return;
}
// skip if file exists
if ((0, fs_1.existsSync)(this.filePath)) {
return;
}
const lines = new Array();
let indent = 0;
const emit = (line = "") => lines.push(" ".repeat(indent * 4) + line);
const openBlock = (line = "") => {
emit(line + " {");
indent++;
};
const closeBlock = () => {
indent--;
emit("}");
};
const optionFqns = generateJavaOptionNames(bootstrap.type.options, jsiiManifest);
if (this.javaPackage.length > 0) {
emit(`package ${this.javaPackage.join(".")};`);
emit();
}
const { renderedOptions, imports } = renderJavaOptions(2, jsiiOptionsType.name, optionFqns, bootstrap.args);
emit(`import ${getJavaImport(jsiiType, jsiiManifest)};`);
emit(`import ${getJavaImport(jsiiOptionsType, jsiiManifest)};`);
for (const optionTypeName of imports) {
emit(`import ${javaTarget.package}.${optionTypeName};`);
}
emit();
openBlock(`public class ${this.javaClass}`);
openBlock("public static void main(String[] args)");
emit(`${jsiiType.name} project = new ${jsiiType.name}(${renderedOptions});`);
emit("project.synth();");
closeBlock();
closeBlock();
const filePath = (0, path_1.join)(this.project.outdir, this.filePath);
(0, fs_1.mkdirSync)((0, path_1.dirname)(filePath), { recursive: true });
(0, fs_1.writeFileSync)(filePath, lines.join("\n"));
this.project.logger.info(`Project definition file was created at ${this.filePath}`);
}
}
exports.Projenrc = Projenrc;
function generateJavaOptionNames(options, jsiiManifest) {
const optionFqns = {};
for (const option of options) {
if (option.fqn && jsiiManifest.types[option.fqn]) {
optionFqns[option.name] = toJavaFullTypeName(jsiiManifest.types[option.fqn]);
}
}
return optionFqns;
}
function renderJavaOptions(indent, optionsTypeName, optionFqns, initOptions) {
const imports = new Set();
if (!initOptions || Object.keys(initOptions).length === 0) {
return { renderedOptions: "", imports }; // no options
}
const lines = [`${optionsTypeName}.builder()`];
for (const [name, value] of Object.entries(initOptions)) {
const { javaValue, importName } = toJavaValue(value, name, optionFqns);
if (importName)
imports.add(importName);
lines.push(`.${toJavaProperty(name)}(${javaValue})`);
}
lines.push(".build()");
const renderedOptions = lines.join(`\n${" ".repeat((indent + 1) * 4)}`);
return { renderedOptions, imports };
}
function toJavaProperty(prop) {
return prop;
}
function toJavaValue(value, name, optionFqns) {
if (typeof value === "string" && optionFqns[name] !== undefined) {
const parts = optionFqns[name].split(".");
const base = parts[parts.length - 1];
const choice = String(value).toUpperCase().replace(/-/g, "_");
return { javaValue: `${base}.${choice}`, importName: optionFqns[name] };
}
else {
return { javaValue: JSON.stringify(value) };
}
}
function toJavaFullTypeName(jsiiType) {
return [jsiiType.namespace, jsiiType.name].filter((x) => x).join(".");
}
function getJavaImport(jsiiType, jsiiManifest) {
const packageName = jsiiManifest?.submodules?.[`${jsiiType.assembly}.${jsiiType?.namespace}`]
?.targets?.java?.package ||
[jsiiManifest.targets.java.package, jsiiType.namespace]
.filter((x) => x)
.join(".");
return `${packageName}.${jsiiType.name}`;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVucmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvamF2YS9wcm9qZW5yYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1TkEsMERBY0M7QUFrREQsc0NBU0M7O0FBaFNELDJCQUEwRDtBQUMxRCwrQkFBK0M7QUFFL0Msc0NBQTJDO0FBQzNDLGtEQUFpRDtBQUVqRCw0Q0FBZ0Q7QUFFaEQsMENBQTJDO0FBQzNDLGtDQUFpRDtBQWlDakQ7Ozs7OztHQU1HO0FBQ0gsTUFBYSxRQUFTLFNBQVEsdUJBQVk7O0lBQ3hDOztPQUVHO0lBQ2EsU0FBUyxDQUFTO0lBRWxDOztPQUVHO0lBQ2MsU0FBUyxDQUFVO0lBRXBDLFlBQVksT0FBZ0IsRUFBRSxHQUFRLEVBQUUsVUFBMkIsRUFBRTtRQUNuRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFZixNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLHVCQUFjLENBQUM7UUFDOUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQztRQUNqRCxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDO1FBRTNDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTO1lBQzVCLENBQUMsQ0FBQyw2QkFBYyxDQUFDLElBQUk7WUFDckIsQ0FBQyxDQUFDLDZCQUFjLENBQUMsT0FBTyxDQUFDO1FBRTNCLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixRQUFRLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTO1lBQ2hDLENBQUMsQ0FBQyxzQkFBc0I7WUFDeEIsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO1FBRXZCLE9BQU8sQ0FBQyxJQUFJ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QUM7SUFDOUMsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLFFBQWE7SUFDdkMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxTQUFnQixhQUFhLENBQUMsUUFBYSxFQUFFLFlBQWlCO0lBQzVELE1BQU0sV0FBVyxHQUNmLFlBQVksRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ3ZFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPO1FBQzFCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUM7YUFDcEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWYsT0FBTyxHQUFHLFdBQVcsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMsIG1rZGlyU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBQb20gfSBmcm9tIFwiLi9wb21cIjtcbmltcG9ydCB7IFBST0pFTl9WRVJTSU9OIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeVR5cGUgfSBmcm9tIFwiLi4vZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3RPcHRpb24gfSBmcm9tIFwiLi4vaW52ZW50b3J5XCI7XG5pbXBvcnQgeyByZWFkSnNpaU1hbmlmZXN0IH0gZnJvbSBcIi4uL2ludmVudG9yeVwiO1xuaW1wb3J0IHR5cGUgeyBJbml0UHJvamVjdCwgUHJvamVjdCB9IGZyb20gXCIuLi9wcm9qZWN0XCI7XG5pbXBvcnQgeyBQcm9qZW5yY0ZpbGUgfSBmcm9tIFwiLi4vcHJvamVucmNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZVBlcnNpc3RlZFBhdGggfSBmcm9tIFwiLi4vdXRpbFwiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBQcm9qZW5yY2AuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVucmNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHdoaWNoIGNvbnRhaW5zIHRoZSBgbWFpbigpYCBtZXRob2QgZm9yIHByb2plbi5cbiAgICogQGRlZmF1bHQgXCJwcm9qZW5yY1wiXG4gICAqL1xuICByZWFkb25seSBjbGFzc05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9qZW4gdmVyc2lvbiB0byB1c2VcbiAgICogQGRlZmF1bHQgLSBjdXJyZW50IHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IHByb2plblZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgcHJvamVucmMgdW5kZXIgdGhlIHRlc3Qgc2NvcGUgaW5zdGVhZCBvZiB0aGUgbWFpbiBzY29wZSwgd2hpY2ggaXNcbiAgICogcmVzZXJ2ZWQgdG8gdGhlIGFwcC4gVGhpcyBtZWFucyB0aGF0IHByb2plbnJjIHdpbGwgYmUgdW5kZXJcbiAgICogYHNyYy90ZXN0L2phdmEvcHJvamVucmMuamF2YWAgYW5kIHByb2plbiB3aWxsIGJlIGRlZmluZWQgYXMgYSB0ZXN0XG4gICAqIGRlcGVuZGVuY3kuIFRoaXMgZW5mb3JjZXMgdGhhdCBhcHBsaWNhdGlvbiBjb2RlIGRvZXMgbm90IHRha2UgYSBkZXBlbmRlbmN5XG4gICAqIG9uIHByb2plbiBjb2RlLlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGRpc2FibGVkLCBwcm9qZW5yYyBzaG91bGQgYmUgdW5kZXJcbiAgICogYHNyYy9tYWluL2phdmEvcHJvamVucmMuamF2YWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHRlc3RTY29wZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWxsb3dzIHdyaXRpbmcgcHJvamVucmMgZmlsZXMgaW4gamF2YS5cbiAqXG4gKiBUaGlzIHdpbGwgaW5zdGFsbCBgb3JnLnByb2plbi9wcm9qZW5gIGFzIGEgTWF2ZW4gZGVwZW5kZW5jeSBhbmQgd2lsbCBhZGQgYVxuICogYHN5bnRoYCB0YXNrIHdoaWNoIHdpbGwgY29tcGlsZSAmIGV4ZWN1dGUgYG1haW4oKWAgZnJvbVxuICogYHNyYy9tYWluL2phdmEvcHJvamVucmMuamF2YWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9qZW5yYyBleHRlbmRzIFByb2plbnJjRmlsZSB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgamF2YSBjbGFzcyB0aGF0IGluY2x1ZGVzIHRoZSBwcm9qZW4gZW50cnlwb2ludC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjbGFzc05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2xhc3MgaXMgaW4gdGhlIFwidGVzdFwiIG9yIFwibWFpblwiIHNjb3BlP1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0ZXN0U2NvcGU6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCwgcG9tOiBQb20sIG9wdGlvbnM6IFByb2plbnJjT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICBjb25zdCBwcm9qZW5WZXJzaW9uID0gb3B0aW9ucy5wcm9qZW5WZXJzaW9uID8/IFBST0pFTl9WRVJTSU9OO1xuICAgIHRoaXMuY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzc05hbWUgPz8gXCJwcm9qZW5yY1wiO1xuICAgIHRoaXMudGVzdFNjb3BlID0gb3B0aW9ucy50ZXN0U2NvcGUgPz8gdHJ1ZTtcblxuICAgIGNvbnN0IGRlcFR5cGUgPSB0aGlzLnRlc3RTY29wZVxuICAgICAgPyBEZXBlbmRlbmN5VHlwZS5URVNUXG4gICAgICA6IERlcGVuZGVuY3lUeXBlLlJVTlRJTUU7XG5cbiAgICBjb25zdCBleGVjT3B0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy50ZXN0U2NvcGUpIHtcbiAgICAgIGV4ZWNPcHRzLnB1c2goXCItRGV4ZWMuY2xhc3NwYXRoU2NvcGU9dGVzdFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21waWxlR29hbCA9IHRoaXMudGVzdFNjb3BlXG4gICAgICA/IFwiY29tcGlsZXI6dGVzdENvbXBpbGVcIlxuICAgICAgOiBcImNvbXBpbGVyOmNvbXBpbGVcIjtcblxuICAgIHByb2plY3QuZGVwcy5hZGREZXBlbmRlbmN5KFxuICAgICAgYGlvLmdpdGh1Yi5jZGtsYWJzL3Byb2plbkAke3Byb2plblZlcnNpb259YCxcbiAgICAgIGRlcFR5cGUsXG4gICAgKTtcbiAgICBwb20uYWRkUGx1Z2luKFwib3JnLmNvZGVoYXVzLm1vam8vZXhlYy1tYXZlbi1wbHVnaW5AMy4wLjBcIik7XG5cbiAgICAvLyBzZXQgdXAgdGhlIFwiZGVmYXVsdFwiIHRhc2sgd2hpY2ggaXMgdGhlIHRhc2sgZXhlY3V0ZWQgd2hlbiBgcHJvamVuYCBpcyBleGVjdXRlZCBmb3IgdGhpcyBwcm9qZWN0LlxuICAgIHByb2plY3QuZGVmYXVsdFRhc2s/LmV4ZWNBcmdzKFtcIm12blwiLCBjb21waWxlR29hbCwgXCItLXF1aWV0XCJdKTtcbiAgICBwcm9qZWN0LmRlZmF1bHRUYXNrPy5leGVjQXJncyhbXG4gICAgICBcIm12blwiLFxuICAgICAgXCJleGVjOmphdmFcIixcbiAgICAgIFwiLS1xdWlldFwiLFxuICAgICAgYC1EZXhlYy5tYWluQ2xhc3M9JHt0aGlzLmNsYXNzTmFtZX1gLFxuICAgICAgLi4uZXhlY09wdHMsXG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgcHJvamVjdENyZWF0aW9uKGluaXRQcm9qZWN0OiBJbml0UHJvamVjdCkge1xuICAgIHRoaXMuZ2VuZXJhdGVQcm9qZW5yYyhpbml0UHJvamVjdCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBqYXZhQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGxpdCA9IHRoaXMuY2xhc3NOYW1lLnNwbGl0KFwiLlwiKTtcbiAgICBpZiAoc3BsaXQubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gc3BsaXRbMF07XG4gICAgfVxuICAgIHJldHVybiBzcGxpdFtzcGxpdC5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGphdmFQYWNrYWdlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzcGxpdCA9IHRoaXMuY2xhc3NOYW1lLnNwbGl0KFwiLlwiKTtcbiAgICBpZiAoc3BsaXQubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBzcGxpdC5zbGljZSgwLCBzcGxpdC5sZW5ndGggLSAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgcHJvamVucmMgZmlsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZmlsZVBhdGgoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXIgPSB0aGlzLnRlc3RTY29wZSA/IFwic3JjL3Rlc3QvamF2YVwiIDogXCJzcmMvbWFpbi9qYXZhXCI7XG5cbiAgICBjb25zdCBqYXZhRmlsZSA9IGpvaW4oXG4gICAgICB0aGlzLnByb2plY3Qub3V0ZGlyLFxuICAgICAgZGlyLFxuICAgICAgLi4udGhpcy5qYXZhUGFja2FnZSxcbiAgICAgIHRoaXMuamF2YUNsYXNzICsgXCIuamF2YVwiLFxuICAgICk7XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZSh0aGlzLnByb2plY3Qub3V0ZGlyLCBqYXZhRmlsZSk7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplUGVyc2lzdGVkUGF0aChyZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVByb2plbnJjKGJvb3RzdHJhcDogSW5pdFByb2plY3QpIHtcbiAgICBjb25zdCBqc2lpRnFuID0gYm9vdHN0cmFwLmZxbjtcbiAgICBjb25zdCBqc2lpTWFuaWZlc3QgPSByZWFkSnNpaU1hbmlmZXN0KGpzaWlGcW4pO1xuICAgIGNvbnN0IGpzaWlUeXBlID0ganNpaU1hbmlmZXN0LnR5cGVzW2pzaWlGcW5dO1xuICAgIGNvbnN0IGphdmFUYXJnZXQgPSBqc2lpTWFuaWZlc3QudGFyZ2V0cy5qYXZhO1xuICAgIGNvbnN0IG9wdGlvbnNUeXBlRnFuID0ganNpaVR5cGUuaW5pdGlhbGl6ZXI/LnBhcmFtZXRlcnM/LlswXS50eXBlPy5mcW47XG4gICAgaWYgKCFvcHRpb25zVHlwZUZxbikge1xuICAgICAgdGhpcy5wcm9qZWN0LmxvZ2dlci53YXJuKFxuICAgICAgICBcImNhbm5vdCBkZXRlcm1pbmUganNpaSB0eXBlIGZvciBwcm9qZWN0IG9wdGlvbnNcIixcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGpzaWlPcHRpb25zVHlwZSA9IGpzaWlNYW5pZmVzdC50eXBlc1tvcHRpb25zVHlwZUZxbl07XG4gICAgaWYgKCFqc2lpT3B0aW9uc1R5cGUpIHtcbiAgICAgIHRoaXMucHJvamVjdC5sb2dnZXIud2FybihcbiAgICAgICAgYGNhbm5vdCBmaW5kIGpzaWkgdHlwZSBmb3IgcHJvamVjdCBvcHRpb25zOiAke29wdGlvbnNUeXBlRnFufWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBza2lwIGlmIGZpbGUgZXhpc3RzXG4gICAgaWYgKGV4aXN0c1N5bmModGhpcy5maWxlUGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBsZXQgaW5kZW50ID0gMDtcbiAgICBjb25zdCBlbWl0ID0gKGxpbmU6IHN0cmluZyA9IFwiXCIpID0+XG4gICAgICBsaW5lcy5wdXNoKFwiIFwiLnJlcGVhdChpbmRlbnQgKiA0KSArIGxpbmUpO1xuICAgIGNvbnN0IG9wZW5CbG9jayA9IChsaW5lOiBzdHJpbmcgPSBcIlwiKSA9PiB7XG4gICAgICBlbWl0KGxpbmUgKyBcIiB7XCIpO1xuICAgICAgaW5kZW50Kys7XG4gICAgfTtcbiAgICBjb25zdCBjbG9zZUJsb2NrID0gKCkgPT4ge1xuICAgICAgaW5kZW50LS07XG4gICAgICBlbWl0KFwifVwiKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb3B0aW9uRnFuczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IGdlbmVyYXRlSmF2YU9wdGlvbk5hbWVzKFxuICAgICAgYm9vdHN0cmFwLnR5cGUub3B0aW9ucyxcbiAgICAgIGpzaWlNYW5pZmVzdCxcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuamF2YVBhY2thZ2UubGVuZ3RoID4gMCkge1xuICAgICAgZW1pdChgcGFja2FnZSAke3RoaXMuamF2YVBhY2thZ2Uuam9pbihcIi5cIil9O2ApO1xuICAgICAgZW1pdCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcmVuZGVyZWRPcHRpb25zLCBpbXBvcnRzIH0gPSByZW5kZXJKYXZhT3B0aW9ucyhcbiAgICAgIDIsXG4gICAgICBqc2lpT3B0aW9uc1R5cGUubmFtZSxcbiAgICAgIG9wdGlvbkZxbnMsXG4gICAgICBib290c3RyYXAuYXJncyxcbiAgICApO1xuXG4gICAgZW1pdChgaW1wb3J0ICR7Z2V0SmF2YUltcG9ydChqc2lpVHlwZSwganNpaU1hbmlmZXN0KX07YCk7XG4gICAgZW1pdChgaW1wb3J0ICR7Z2V0SmF2YUltcG9ydChqc2lpT3B0aW9uc1R5cGUsIGpzaWlNYW5pZmVzdCl9O2ApO1xuICAgIGZvciAoY29uc3Qgb3B0aW9uVHlwZU5hbWUgb2YgaW1wb3J0cykge1xuICAgICAgZW1pdChgaW1wb3J0ICR7amF2YVRhcmdldC5wYWNrYWdlfS4ke29wdGlvblR5cGVOYW1lfTtgKTtcbiAgICB9XG4gICAgZW1pdCgpO1xuICAgIG9wZW5CbG9jayhgcHVibGljIGNsYXNzICR7dGhpcy5qYXZhQ2xhc3N9YCk7XG4gICAgb3BlbkJsb2NrKFwicHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncylcIik7XG4gICAgZW1pdChcbiAgICAgIGAke2pzaWlUeXBlLm5hbWV9IHByb2plY3QgPSBuZXcgJHtqc2lpVHlwZS5uYW1lfSgke3JlbmRlcmVkT3B0aW9uc30pO2AsXG4gICAgKTtcbiAgICBlbWl0KFwicHJvamVjdC5zeW50aCgpO1wiKTtcbiAgICBjbG9zZUJsb2NrKCk7XG4gICAgY2xvc2VCbG9jaygpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKHRoaXMucHJvamVjdC5vdXRkaXIsIHRoaXMuZmlsZVBhdGgpO1xuICAgIG1rZGlyU3luYyhkaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgbGluZXMuam9pbihcIlxcblwiKSk7XG5cbiAgICB0aGlzLnByb2plY3QubG9nZ2VyLmluZm8oXG4gICAgICBgUHJvamVjdCBkZWZpbml0aW9uIGZpbGUgd2FzIGNyZWF0ZWQgYXQgJHt0aGlzLmZpbGVQYXRofWAsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVKYXZhT3B0aW9uTmFtZXMoXG4gIG9wdGlvbnM6IFByb2plY3RPcHRpb25bXSxcbiAganNpaU1hbmlmZXN0OiBhbnksXG4pIHtcbiAgY29uc3Qgb3B0aW9uRnFuczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbi5mcW4gJiYganNpaU1hbmlmZXN0LnR5cGVzW29wdGlvbi5mcW5dKSB7XG4gICAgICBvcHRpb25GcW5zW29wdGlvbi5uYW1lXSA9IHRvSmF2YUZ1bGxUeXBlTmFtZShcbiAgICAgICAganNpaU1hbmlmZXN0LnR5cGVzW29wdGlvbi5mcW5dLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3B0aW9uRnFucztcbn1cblxuZnVuY3Rpb24gcmVuZGVySmF2YU9wdGlvbnMoXG4gIGluZGVudDogbnVtYmVyLFxuICBvcHRpb25zVHlwZU5hbWU6IHN0cmluZyxcbiAgb3B0aW9uRnFuczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgaW5pdE9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuKSB7XG4gIGNvbnN0IGltcG9ydHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgaWYgKCFpbml0T3B0aW9ucyB8fCBPYmplY3Qua2V5cyhpbml0T3B0aW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgcmVuZGVyZWRPcHRpb25zOiBcIlwiLCBpbXBvcnRzIH07IC8vIG5vIG9wdGlvbnNcbiAgfVxuXG4gIGNvbnN0IGxpbmVzID0gW2Ake29wdGlvbnNUeXBlTmFtZX0uYnVpbGRlcigpYF07XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRPcHRpb25zKSkge1xuICAgIGNvbnN0IHsgamF2YVZhbHVlLCBpbXBvcnROYW1lIH0gPSB0b0phdmFWYWx1ZSh2YWx1ZSwgbmFtZSwgb3B0aW9uRnFucyk7XG4gICAgaWYgKGltcG9ydE5hbWUpIGltcG9ydHMuYWRkKGltcG9ydE5hbWUpO1xuICAgIGxpbmVzLnB1c2goYC4ke3RvSmF2YVByb3BlcnR5KG5hbWUpfSgke2phdmFWYWx1ZX0pYCk7XG4gIH1cblxuICBsaW5lcy5wdXNoKFwiLmJ1aWxkKClcIik7XG5cbiAgY29uc3QgcmVuZGVyZWRPcHRpb25zID0gbGluZXMuam9pbihgXFxuJHtcIiBcIi5yZXBlYXQoKGluZGVudCArIDEpICogNCl9YCk7XG4gIHJldHVybiB7IHJlbmRlcmVkT3B0aW9ucywgaW1wb3J0cyB9O1xufVxuXG5mdW5jdGlvbiB0b0phdmFQcm9wZXJ0eShwcm9wOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHByb3A7XG59XG5cbmZ1bmN0aW9uIHRvSmF2YVZhbHVlKFxuICB2YWx1ZTogYW55LFxuICBuYW1lOiBzdHJpbmcsXG4gIG9wdGlvbkZxbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBvcHRpb25GcW5zW25hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBwYXJ0cyA9IG9wdGlvbkZxbnNbbmFtZV0uc3BsaXQoXCIuXCIpO1xuICAgIGNvbnN0IGJhc2UgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBjaG9pY2UgPSBTdHJpbmcodmFsdWUpLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLS9nLCBcIl9cIik7XG4gICAgcmV0dXJuIHsgamF2YVZhbHVlOiBgJHtiYXNlfS4ke2Nob2ljZX1gLCBpbXBvcnROYW1lOiBvcHRpb25GcW5zW25hbWVdIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgamF2YVZhbHVlOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0phdmFGdWxsVHlwZU5hbWUoanNpaVR5cGU6IGFueSkge1xuICByZXR1cm4gW2pzaWlUeXBlLm5hbWVzcGFjZSwganNpaVR5cGUubmFtZV0uZmlsdGVyKCh4KSA9PiB4KS5qb2luKFwiLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEphdmFJbXBvcnQoanNpaVR5cGU6IGFueSwganNpaU1hbmlmZXN0OiBhbnkpIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPVxuICAgIGpzaWlNYW5pZmVzdD8uc3VibW9kdWxlcz8uW2Ake2pzaWlUeXBlLmFzc2VtYmx5fS4ke2pzaWlUeXBlPy5uYW1lc3BhY2V9YF1cbiAgICAgID8udGFyZ2V0cz8uamF2YT8ucGFja2FnZSB8fFxuICAgIFtqc2lpTWFuaWZlc3QudGFyZ2V0cy5qYXZhLnBhY2thZ2UsIGpzaWlUeXBlLm5hbWVzcGFjZV1cbiAgICAgIC5maWx0ZXIoKHgpID0+IHgpXG4gICAgICAuam9pbihcIi5cIik7XG5cbiAgcmV0dXJuIGAke3BhY2thZ2VOYW1lfS4ke2pzaWlUeXBlLm5hbWV9YDtcbn1cbiJdfQ==