projen
Version:
CDK for software projects
97 lines • 13.3 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.GithubCredentials = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const Case = require("case");
/**
* Represents a method of providing GitHub API access for projen workflows.
*/
class GithubCredentials {
/**
* Provide API access through a GitHub personal access token.
*
* The token must be added as a secret to the GitHub repo, and the name of the
* secret can be specified here.
*
* @see https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token
* @default - a secret named "PROJEN_GITHUB_TOKEN"
*/
static fromPersonalAccessToken(options = {}) {
return new GithubCredentials({
setupSteps: [],
tokenRef: `\${{ secrets.${options.secret ?? "PROJEN_GITHUB_TOKEN"} }}`,
environment: options.environment,
});
}
/**
* Provide API access through a GitHub App.
*
* The GitHub App must be installed on the GitHub repo, its App ID and a
* private key must be added as secrets to the repo. The name of the secrets
* can be specified here.
*
* @see https://docs.github.com/en/developers/apps/building-github-apps/creating-a-github-app
* @see https://projen.io/docs/integrations/github/#github-app
* @default - app id stored in "PROJEN_APP_ID" and private key stored in "PROJEN_APP_PRIVATE_KEY" with all permissions attached to the app
*/
static fromApp(options = {}) {
const appIdSecret = options.appIdSecret ?? "PROJEN_APP_ID";
const privateKeySecret = options.privateKeySecret ?? "PROJEN_APP_PRIVATE_KEY";
const actionConfig = {
"app-id": `\${{ secrets.${appIdSecret} }}`,
"private-key": `\${{ secrets.${privateKeySecret} }}`,
};
if (options.owner) {
actionConfig.owner = options.owner;
}
if (options.repositories) {
actionConfig.repositories = options.repositories.join(",");
}
const permissions = Object.entries(options.permissions ?? {}).reduce((map, [name, val]) => {
map[`permission-${Case.kebab(name)}`] = val;
return map;
}, {});
return new GithubCredentials({
setupSteps: [
{
name: "Generate token",
id: "generate_token",
uses: "actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859",
with: {
...actionConfig,
...permissions,
},
},
],
tokenRef: "${{ steps.generate_token.outputs.token }}",
environment: options.environment,
});
}
constructor(options) {
this.options = options;
}
/**
* Setup steps to obtain GitHub credentials.
*/
get setupSteps() {
return [...this.options.setupSteps];
}
/**
* The value to use in a workflow when a GitHub token is expected. This
* typically looks like "${{ some.path.to.a.value }}".
*/
get tokenRef() {
return this.options.tokenRef;
}
/**
* The GitHub Actions environment the credentials have been added to.
*/
get environment() {
return this.options.environment;
}
}
exports.GithubCredentials = GithubCredentials;
_a = JSII_RTTI_SYMBOL_1;
GithubCredentials[_a] = { fqn: "projen.github.GithubCredentials", version: "0.99.51" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWNyZWRlbnRpYWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dpdGh1Yi9naXRodWItY3JlZGVudGlhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2QkFBNkI7QUE0RTdCOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFDNUI7Ozs7Ozs7O09BUUc7SUFDSSxNQUFNLENBQUMsdUJBQXVCLENBQ25DLFVBQXVELEVBQUU7UUFFekQsT0FBTyxJQUFJLGlCQUFpQixDQUFDO1lBQzNCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsUUFBUSxFQUFFLGdCQUFnQixPQUFPLENBQUMsTUFBTSxJQUFJLHFCQUFxQixLQUFLO1lBQ3RFLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBdUMsRUFBRTtRQUM3RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLGVBQWUsQ0FBQztRQUMzRCxNQUFNLGdCQUFnQixHQUNwQixPQUFPLENBQUMsZ0JBQWdCLElBQUksd0JBQXdCLENBQUM7UUFFdkQsTUFBTSxZQUFZLEdBQTJCO1lBQzNDLFFBQVEsRUFBRSxnQkFBZ0IsV0FBVyxLQUFLO1lBQzFDLGFBQWEsRUFBRSxnQkFBZ0IsZ0JBQWdCLEtBQUs7U0FDckQsQ0FBQztRQUVGLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLFlBQVksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekIsWUFBWSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FFbEUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRTtZQUNyQixHQUFHLENBQUMsY0FBYyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDNUMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFUCxPQUFPLElBQUksaUJBQWlCLENBQUM7WUFDM0IsVUFBVSxFQUFFO2dCQUNWO29CQUNFLElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLEVBQUUsRUFBRSxnQkFBZ0I7b0JBQ3BCLElBQUksRUFBRSwwRUFBMEU7b0JBQ2hGLElBQUksRUFBRTt3QkFDSixHQUFHLFlBQVk7d0JBQ2YsR0FBRyxXQUFXO3FCQUNmO2lCQUNGO2FBQ0Y7WUFDRCxRQUFRLEVBQUUsMkNBQTJDO1lBQ3JELFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBcUMsT0FBaUM7UUFBakMsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7SUFBRyxDQUFDO0lBRTFFOztPQUVHO0lBQ0gsSUFBVyxVQUFVO1FBQ25CLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0lBQ2xDLENBQUM7O0FBOUZILDhDQStGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIENhc2UgZnJvbSBcImNhc2VcIjtcbmltcG9ydCB0eXBlIHsgSm9iU3RlcCwgQXBwUGVybWlzc2lvbnMgfSBmcm9tIFwiLi93b3JrZmxvd3MtbW9kZWxcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBgR2l0aHViQ3JlZGVudGlhbHMuZnJvbVBlcnNvbmFsQWNjZXNzVG9rZW5gXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0aHViQ3JlZGVudGlhbHNQZXJzb25hbEFjY2Vzc1Rva2VuT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VjcmV0IHRoYXQgaG9sZHMgdGhlIEdpdEh1YiBwZXJzb25hbCBhY2Nlc3MgdG9rZW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiUFJPSkVOX0dJVEhVQl9UT0tFTlwiXG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBHaXRIdWIgQWN0aW9ucyBlbnZpcm9ubWVudCB0aGUgc2VjcmV0cyBpcyBhZGRlZCB0by5cbiAgICpcbiAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgZXhwbGljaXQgYXBwcm92YWwgc3RlcHMgdG8gYWNjZXNzIHRoZSBzZWNyZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZW52aXJvbm1lbnQgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYEdpdGh1YkNyZWRlbnRpYWxzLmZyb21BcHBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0aHViQ3JlZGVudGlhbHNBcHBPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzZWNyZXQgY29udGFpbmluZyB0aGUgR2l0SHViIEFwcCBJRFxuICAgKlxuICAgKiBAZGVmYXVsdCBcIlBST0pFTl9BUFBfSURcIlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwSWRTZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWNyZXQgY29udGFpbmluZyB0aGUgR2l0SHViIEFwcCBwcml2YXRlIGtleVxuICAgKlxuICAgKiBFc2NhcGVkIG5ld2xpbmVzIChcXFxcbikgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkIHdpdGggYWN0dWFsIG5ld2xpbmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIlBST0pFTl9BUFBfUFJJVkFURV9LRVlcIlxuICAgKi9cbiAgcmVhZG9ubHkgcHJpdmF0ZUtleVNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG93bmVyIG9mIHRoZSBHaXRIdWIgQXBwIGluc3RhbGxhdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGlmIGVtcHR5LCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCByZXBvc2l0b3J5IG93bmVyXG4gICAqL1xuICByZWFkb25seSBvd25lcj86IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdCBvZiByZXBvc2l0b3JpZXMgdG8gZ3JhbnQgYWNjZXNzIHRvXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gaWYgb3duZXIgaXMgc2V0IGFuZCByZXBvc2l0b3JpZXMgaXMgZW1wdHksIGFjY2VzcyB3aWxsIGJlIHNjb3BlZCB0byBhbGwgcmVwb3NpdG9yaWVzIGluIHRoZSBwcm92aWRlZCByZXBvc2l0b3J5IG93bmVyJ3MgaW5zdGFsbGF0aW9uLlxuICAgKiBJZiBvd25lciBhbmQgcmVwb3NpdG9yaWVzIGFyZSBlbXB0eSwgYWNjZXNzIHdpbGwgYmUgc2NvcGVkIHRvIG9ubHkgdGhlIGN1cnJlbnQgcmVwb3NpdG9yeS5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG9zaXRvcmllcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUgdG9rZW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWxsIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gdGhlIGFwcFxuICAgKi9cbiAgcmVhZG9ubHkgcGVybWlzc2lvbnM/OiBBcHBQZXJtaXNzaW9ucztcblxuICAvKipcbiAgICogVGhlIEdpdEh1YiBBY3Rpb25zIGVudmlyb25tZW50IHRoZSBzZWNyZXRzIGFyZSBhZGRlZCB0by5cbiAgICpcbiAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgZXhwbGljaXQgYXBwcm92YWwgc3RlcHMgdG8gYWNjZXNzIHRoZSBzZWNyZXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGVudmlyb25tZW50IHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtZXRob2Qgb2YgcHJvdmlkaW5nIEdpdEh1YiBBUEkgYWNjZXNzIGZvciBwcm9qZW4gd29ya2Zsb3dzLlxuICovXG5leHBvcnQgY2xhc3MgR2l0aHViQ3JlZGVudGlhbHMge1xuICAvKipcbiAgICogUHJvdmlkZSBBUEkgYWNjZXNzIHRocm91Z2ggYSBHaXRIdWIgcGVyc29uYWwgYWNjZXNzIHRva2VuLlxuICAgKlxuICAgKiBUaGUgdG9rZW4gbXVzdCBiZSBhZGRlZCBhcyBhIHNlY3JldCB0byB0aGUgR2l0SHViIHJlcG8sIGFuZCB0aGUgbmFtZSBvZiB0aGVcbiAgICogc2VjcmV0IGNhbiBiZSBzcGVjaWZpZWQgaGVyZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hdXRoZW50aWNhdGlvbi9rZWVwaW5nLXlvdXItYWNjb3VudC1hbmQtZGF0YS1zZWN1cmUvY3JlYXRpbmctYS1wZXJzb25hbC1hY2Nlc3MtdG9rZW5cbiAgICogQGRlZmF1bHQgLSBhIHNlY3JldCBuYW1lZCBcIlBST0pFTl9HSVRIVUJfVE9LRU5cIlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUGVyc29uYWxBY2Nlc3NUb2tlbihcbiAgICBvcHRpb25zOiBHaXRodWJDcmVkZW50aWFsc1BlcnNvbmFsQWNjZXNzVG9rZW5PcHRpb25zID0ge30sXG4gICkge1xuICAgIHJldHVybiBuZXcgR2l0aHViQ3JlZGVudGlhbHMoe1xuICAgICAgc2V0dXBTdGVwczogW10sXG4gICAgICB0b2tlblJlZjogYFxcJHt7IHNlY3JldHMuJHtvcHRpb25zLnNlY3JldCA/PyBcIlBST0pFTl9HSVRIVUJfVE9LRU5cIn0gfX1gLFxuICAgICAgZW52aXJvbm1lbnQ6IG9wdGlvbnMuZW52aXJvbm1lbnQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZSBBUEkgYWNjZXNzIHRocm91Z2ggYSBHaXRIdWIgQXBwLlxuICAgKlxuICAgKiBUaGUgR2l0SHViIEFwcCBtdXN0IGJlIGluc3RhbGxlZCBvbiB0aGUgR2l0SHViIHJlcG8sIGl0cyBBcHAgSUQgYW5kIGFcbiAgICogcHJpdmF0ZSBrZXkgbXVzdCBiZSBhZGRlZCBhcyBzZWNyZXRzIHRvIHRoZSByZXBvLiBUaGUgbmFtZSBvZiB0aGUgc2VjcmV0c1xuICAgKiBjYW4gYmUgc3BlY2lmaWVkIGhlcmUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vZGV2ZWxvcGVycy9hcHBzL2J1aWxkaW5nLWdpdGh1Yi1hcHBzL2NyZWF0aW5nLWEtZ2l0aHViLWFwcFxuICAgKiBAc2VlIGh0dHBzOi8vcHJvamVuLmlvL2RvY3MvaW50ZWdyYXRpb25zL2dpdGh1Yi8jZ2l0aHViLWFwcFxuICAgKiBAZGVmYXVsdCAtIGFwcCBpZCBzdG9yZWQgaW4gXCJQUk9KRU5fQVBQX0lEXCIgYW5kIHByaXZhdGUga2V5IHN0b3JlZCBpbiBcIlBST0pFTl9BUFBfUFJJVkFURV9LRVlcIiB3aXRoIGFsbCBwZXJtaXNzaW9ucyBhdHRhY2hlZCB0byB0aGUgYXBwXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21BcHAob3B0aW9uczogR2l0aHViQ3JlZGVudGlhbHNBcHBPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBhcHBJZFNlY3JldCA9IG9wdGlvbnMuYXBwSWRTZWNyZXQgPz8gXCJQUk9KRU5fQVBQX0lEXCI7XG4gICAgY29uc3QgcHJpdmF0ZUtleVNlY3JldCA9XG4gICAgICBvcHRpb25zLnByaXZhdGVLZXlTZWNyZXQgPz8gXCJQUk9KRU5fQVBQX1BSSVZBVEVfS0VZXCI7XG5cbiAgICBjb25zdCBhY3Rpb25Db25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBcImFwcC1pZFwiOiBgXFwke3sgc2VjcmV0cy4ke2FwcElkU2VjcmV0fSB9fWAsXG4gICAgICBcInByaXZhdGUta2V5XCI6IGBcXCR7eyBzZWNyZXRzLiR7cHJpdmF0ZUtleVNlY3JldH0gfX1gLFxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucy5vd25lcikge1xuICAgICAgYWN0aW9uQ29uZmlnLm93bmVyID0gb3B0aW9ucy5vd25lcjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucmVwb3NpdG9yaWVzKSB7XG4gICAgICBhY3Rpb25Db25maWcucmVwb3NpdG9yaWVzID0gb3B0aW9ucy5yZXBvc2l0b3JpZXMuam9pbihcIixcIik7XG4gICAgfVxuXG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zLnBlcm1pc3Npb25zID8/IHt9KS5yZWR1Y2U8XG4gICAgICBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgPigobWFwLCBbbmFtZSwgdmFsXSkgPT4ge1xuICAgICAgbWFwW2BwZXJtaXNzaW9uLSR7Q2FzZS5rZWJhYihuYW1lKX1gXSA9IHZhbDtcbiAgICAgIHJldHVybiBtYXA7XG4gICAgfSwge30pO1xuXG4gICAgcmV0dXJuIG5ldyBHaXRodWJDcmVkZW50aWFscyh7XG4gICAgICBzZXR1cFN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIkdlbmVyYXRlIHRva2VuXCIsXG4gICAgICAgICAgaWQ6IFwiZ2VuZXJhdGVfdG9rZW5cIixcbiAgICAgICAgICB1c2VzOiBcImFjdGlvbnMvY3JlYXRlLWdpdGh1Yi1hcHAtdG9rZW5AZjhkMzg3YjY4ZDYxYzU4YWI4M2M2YzAxNjY3MjkzNDEwMjU2OTg1OVwiLFxuICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgIC4uLmFjdGlvbkNvbmZpZyxcbiAgICAgICAgICAgIC4uLnBlcm1pc3Npb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdG9rZW5SZWY6IFwiJHt7IHN0ZXBzLmdlbmVyYXRlX3Rva2VuLm91dHB1dHMudG9rZW4gfX1cIixcbiAgICAgIGVudmlyb25tZW50OiBvcHRpb25zLmVudmlyb25tZW50LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEdpdGh1YkNyZWRlbnRpYWxzT3B0aW9ucykge31cblxuICAvKipcbiAgICogU2V0dXAgc3RlcHMgdG8gb2J0YWluIEdpdEh1YiBjcmVkZW50aWFscy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2V0dXBTdGVwcygpOiBKb2JTdGVwW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5vcHRpb25zLnNldHVwU3RlcHNdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byB1c2UgaW4gYSB3b3JrZmxvdyB3aGVuIGEgR2l0SHViIHRva2VuIGlzIGV4cGVjdGVkLiBUaGlzXG4gICAqIHR5cGljYWxseSBsb29rcyBsaWtlIFwiJHt7IHNvbWUucGF0aC50by5hLnZhbHVlIH19XCIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRva2VuUmVmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50b2tlblJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgR2l0SHViIEFjdGlvbnMgZW52aXJvbm1lbnQgdGhlIGNyZWRlbnRpYWxzIGhhdmUgYmVlbiBhZGRlZCB0by5cbiAgICovXG4gIHB1YmxpYyBnZXQgZW52aXJvbm1lbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmVudmlyb25tZW50O1xuICB9XG59XG5cbmludGVyZmFjZSBHaXRodWJDcmVkZW50aWFsc09wdGlvbnMge1xuICByZWFkb25seSBzZXR1cFN0ZXBzOiBKb2JTdGVwW107XG4gIHJlYWRvbmx5IHRva2VuUmVmOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudmlyb25tZW50Pzogc3RyaW5nO1xufVxuIl19