UNPKG

raindancers-network

Version:
212 lines 24.9 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.Crawler = exports.UpdateBehavior = exports.DeleteBehavior = exports.RecrawlBehavior = exports.CrawlerLineageSettings = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const constructs = require("constructs"); var CrawlerLineageSettings; (function (CrawlerLineageSettings) { CrawlerLineageSettings["ENABLE"] = "ENABLE"; CrawlerLineageSettings["DISABLE"] = "DISABLE"; })(CrawlerLineageSettings = exports.CrawlerLineageSettings || (exports.CrawlerLineageSettings = {})); var RecrawlBehavior; (function (RecrawlBehavior) { RecrawlBehavior["CRAWL_EVERYTHING"] = "CRAWL_EVERTHING"; RecrawlBehavior["CRAWL_NEW_FOLDERS_ONLY"] = "CRAWL_NEW_FOLDERS_ONLY"; RecrawlBehavior["CRAWL_EVENT_MODE"] = "CRAWL_EVENT_MODE"; })(RecrawlBehavior = exports.RecrawlBehavior || (exports.RecrawlBehavior = {})); var DeleteBehavior; (function (DeleteBehavior) { DeleteBehavior["LOG"] = "LOG"; DeleteBehavior["DELETE_FROM_DATABASE"] = "DELETE_FROM_DATABASE"; DeleteBehavior["DEPRECATE_IN_DATABASE"] = "DEPRECATE_IN_DATABASE"; })(DeleteBehavior = exports.DeleteBehavior || (exports.DeleteBehavior = {})); var UpdateBehavior; (function (UpdateBehavior) { UpdateBehavior["LOG"] = "LOG"; UpdateBehavior["UPDATE_IN_DATABASE"] = "UPDATE_IN_DATABASE"; })(UpdateBehavior = exports.UpdateBehavior || (exports.UpdateBehavior = {})); //https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Glue.html#createCrawler-property class Crawler extends constructs.Construct { constructor(scope, id, props) { super(scope, id); // validate that only one of s3Targets has been set. Could not use Type, as this was jsii incompatiable. // so this has to be run time check 🔥 if (props.s3Targets && props.jdbcTargets) { throw new Error('Can not have both S3Targets and JdbcTargets'); } if (props.s3Targets === undefined && props.jdbcTargets === undefined) { throw new Error('Must have at least one target type'); } const targets = {}; if (props.s3Targets) { const s3targets = []; props.s3Targets.forEach((target) => { s3targets.push(target.target); }); targets.S3Targets = s3targets; } if (props.jdbcTargets) { const jdbcTargets = []; props.jdbcTargets.forEach((target) => { jdbcTargets.push(target.target); }); targets.JdbcTargets = jdbcTargets; } console.log(targets); // these are the mandatory paramters this.parameters = { Name: props.name, Role: props.role.roleArn, Targets: pascalCaseKeys(targets), DatabaseName: props.databaseName, }; console.log('------'); console.log(this.parameters); // targets keys, need to have their first character Capitalized. if (props.description) { this.parameters.Description = props.description; } new aws_cdk_lib_1.custom_resources.AwsCustomResource(this, 'Crawler', { resourceType: 'Custom::Crawler', onCreate: { service: 'Glue', action: 'createCrawler', parameters: this.parameters, physicalResourceId: aws_cdk_lib_1.custom_resources.PhysicalResourceId.of(`Crawler${props.name}`), }, onUpdate: { service: 'Glue', action: 'updateCrawler', parameters: this.parameters, }, onDelete: { service: 'Glue', action: 'deleteCrawler', parameters: { Name: props.name, }, }, policy: aws_cdk_lib_1.custom_resources.AwsCustomResourcePolicy.fromStatements([ new aws_cdk_lib_1.aws_iam.PolicyStatement({ actions: [ 'glue:CreateCrawler', 'glue:UpdateCrawler', 'glue:DeleteCrawler', 'iam:PassRole', ], resources: ['*'], }), ]), }); } /** * This will add classifers to the crawler. * @param props addClassifierProps */ addClassifiers(props) { var classiferNames = []; props.classifiers.forEach((classifier) => { classiferNames.push(classifier.name); }); this.parameters.Classifiers = classiferNames; } /** * Use the crawler with lakeFormation Permissions. * @param props LakeFormationConfiguration * @returns void * */ useWithLakeFormation(props) { this.parameters.LakeFormationConfiguration = { UseLakeFormationCredentials: props.useLakeFormationCredentials ?? true, }; if (props.accountId) { this.parameters.LakeFormationConfiguration.AccountId = props.accountId; } } /** * Set the recall policy for the crawler. * @param recallpolicy RecrawlPolicy * @returns void */ addRecrawlBehaviour(recallpolicy) { this.parameters.RecrawlBehaviour = recallpolicy; } /** * Enable Lineage for the Crawler * @param lineage */ enableLineage(lineage) { this.parameters.LineageConfiguration = { CrawlerLineageSettings: lineage, }; } /** * Enable SchemaChangPolicy * @param schemaChangePolicy */ addSchemaChangePolicy(schemaChangePolicy) { this.parameters.SchemaChangePolicy = pascalCaseKeys(schemaChangePolicy); } /** * set crawler Configuration * @param configuration */ addConfiguration(configuration) { this.parameters.Configuration = configuration; } /** * add CrawlerSecurity Configuration * @param configuration * */ addCrawlerSecurityConfiguration(configuration) { this.parameters.CrawlerSecurityConfiguration = configuration; } /** * add schedule for the crawler * @param schedule */ addSchedule(schedule) { if (checkRegex(new RegExp('^((\*(\/\d+)?|\d+((-|\,)\d+)*)(\s+(\*(\/\d+)?|\d+((-|\,)\d+)*)){4})$'), schedule) == false) { throw new Error('The schedule needs to be a valid cron expresson'); } this.parameters.Schedule = schedule; } /** * add table prefix for the crawler * @param tablePrefix */ addTablePrefix(tablePrefix) { this.parameters.TablePrefix = tablePrefix; } } exports.Crawler = Crawler; _a = JSII_RTTI_SYMBOL_1; Crawler[_a] = { fqn: "raindancers-network.glue.Crawler", version: "1.29.3" }; // a function to check if a property is a match for a regex expression function checkRegex(regex, property) { return regex.test(property); } /** * Converts the Keys in an arbitory object, to Pascal Case. Use this to send typescript objects * to API * @param obj a complex object * @returns any */ function pascalCaseKeys(obj) { if (typeof obj !== 'object') { return obj; } if (Array.isArray(obj)) { return obj.map(pascalCaseKeys); } if (obj === null) { return null; } const entries = Object.entries(obj); const mappedEntries = entries.map(([k, v]) => [`${k.slice(0, 1).toUpperCase()}${k.slice(1)}`, pascalCaseKeys(v)]); return Object.fromEntries(mappedEntries); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jhd2xlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nbHVlL2NyYXdsZXIvY3Jhd2xlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUdxQjtBQUVyQix5Q0FBeUM7QUFRekMsSUFBWSxzQkFHWDtBQUhELFdBQVksc0JBQXNCO0lBQ2hDLDJDQUFpQixDQUFBO0lBQ2pCLDZDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxzQkFBc0IsR0FBdEIsOEJBQXNCLEtBQXRCLDhCQUFzQixRQUdqQztBQU1ELElBQVksZUFJWDtBQUpELFdBQVksZUFBZTtJQUN6Qix1REFBb0MsQ0FBQTtJQUNwQyxvRUFBaUQsQ0FBQTtJQUNqRCx3REFBcUMsQ0FBQTtBQUN2QyxDQUFDLEVBSlcsZUFBZSxHQUFmLHVCQUFlLEtBQWYsdUJBQWUsUUFJMUI7QUFNRCxJQUFZLGNBSVg7QUFKRCxXQUFZLGNBQWM7SUFDeEIsNkJBQVcsQ0FBQTtJQUNYLCtEQUE2QyxDQUFBO0lBQzdDLGlFQUErQyxDQUFBO0FBQ2pELENBQUMsRUFKVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQUl6QjtBQUVELElBQVksY0FHWDtBQUhELFdBQVksY0FBYztJQUN4Qiw2QkFBVyxDQUFBO0lBQ1gsMkRBQXlDLENBQUE7QUFDM0MsQ0FBQyxFQUhXLGNBQWMsR0FBZCxzQkFBYyxLQUFkLHNCQUFjLFFBR3pCO0FBcUNELDBGQUEwRjtBQUUxRixNQUFhLE9BQVEsU0FBUSxVQUFVLENBQUMsU0FBUztJQUcvQyxZQUFZLEtBQTJCLEVBQUUsRUFBVSxFQUFFLEtBQW1CO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsd0dBQXdHO1FBQ3hHLHNDQUFzQztRQUN0QyxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRTtZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENB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QUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFVLENBQUMsQ0FBQztJQUMzRixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGN1c3RvbV9yZXNvdXJjZXMgYXMgY3IsXG4gIGF3c19pYW0gYXMgaWFtLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5cbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBnbHVlIGZyb20gJy4uL2luZGV4JztcblxuZXhwb3J0IGludGVyZmFjZSBMYWtlRm9ybWF0aW9uQ29uZmlndXJhdGlvbiB7XG4gIHJlYWRvbmx5IGFjY291bnRJZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgdXNlTGFrZUZvcm1hdGlvbkNyZWRlbnRpYWxzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGVudW0gQ3Jhd2xlckxpbmVhZ2VTZXR0aW5ncyB7XG4gIEVOQUJMRSA9ICdFTkFCTEUnLFxuICBESVNBQkxFID0gJ0RJU0FCTEUnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpbmVhZ2VDb25maWd1cmF0aW9uIHtcbiAgcmVhZG9ubHkgY3Jhd2xlckxpbmVhZ2VTZXR0aW5nczogQ3Jhd2xlckxpbmVhZ2VTZXR0aW5ncztcbn1cblxuZXhwb3J0IGVudW0gUmVjcmF3bEJlaGF2aW9yIHtcbiAgQ1JBV0xfRVZFUllUSElORyA9ICdDUkFXTF9FVkVSVEhJTkcnLFxuICBDUkFXTF9ORVdfRk9MREVSU19PTkxZID0gJ0NSQVdMX05FV19GT0xERVJTX09OTFknLFxuICBDUkFXTF9FVkVOVF9NT0RFID0gJ0NSQVdMX0VWRU5UX01PREUnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Jhd2xQb2xpY3kge1xuICByZWFkb25seSByZWNyYXdsQmVoYXZpb3I6IFJlY3Jhd2xCZWhhdmlvcjtcbn1cblxuZXhwb3J0IGVudW0gRGVsZXRlQmVoYXZpb3Ige1xuICBMT0cgPSAnTE9HJyxcbiAgREVMRVRFX0ZST01fREFUQUJBU0UgPSAnREVMRVRFX0ZST01fREFUQUJBU0UnLFxuICBERVBSRUNBVEVfSU5fREFUQUJBU0UgPSAnREVQUkVDQVRFX0lOX0RBVEFCQVNFJyxcbn1cblxuZXhwb3J0IGVudW0gVXBkYXRlQmVoYXZpb3Ige1xuICBMT0cgPSAnTE9HJyxcbiAgVVBEQVRFX0lOX0RBVEFCQVNFID0gJ1VQREFURV9JTl9EQVRBQkFTRScsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hQ2hhbmdlUG9saWN5IHtcbiAgcmVhZG9ubHkgZGVsZXRlQmVoYXZpb3I6IERlbGV0ZUJlaGF2aW9yO1xuICByZWFkb25seSB1cGRhdGVCZWhhdmlvcjogVXBkYXRlQmVoYXZpb3I7XG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUNyYXdsZXJQYXJhbWV0ZXJzIHtcbi8vICAgbmFtZTogc3RyaW5nO1xuLy8gICByb2xlOiBzdHJpbmc7XG4vLyAgIHMzVGFyZ2V0cz86IGdsdWUuUzNUYXJnZXRbXSB8IHVuZGVmaW5lZDtcbi8vICAgamRiY1RhcmdldHM/OiBnbHVlLkpEQkNUYXJnZXRbXSB8IHVuZGVmaW5lZDtcbi8vICAgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG4vLyAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuLy8gICBjbGFzc2lmaWVycz86IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuLy8gICBsYWtlRm9ybWF0aW9uQ29uZmlndXJhdGlvbj86IExha2VGb3JtYXRpb25Db25maWd1cmF0aW9uO1xuLy8gICBsaW5lYWdlQ29uZmlndXJhdGlvbj86IExpbmVhZ2VDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkO1xuLy8gICByZWNyYXdsQmVoYXZpb3VyPzogUmVjcmF3bFBvbGljeSB8IHVuZGVmaW5lZDtcbi8vICAgc2NoZW1hQ2hhbmdlUG9saWN5PzogU2NoZW1hQ2hhbmdlUG9saWN5O1xuLy8gICBjb25maWd1cmF0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuLy8gICBjcmF3bGVyU2VjdXJpdHlDb25maWd1cmF0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuLy8gICBzY2hlZHVsZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbi8vICAgdGFibGVQcmVmaXg/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4vLyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQ2xhc3NpZmllcnNQcm9wcyB7XG4gIHJlYWRvbmx5IGNsYXNzaWZpZXJzOiBnbHVlLkdsdWVDbGFzc2lmaWVyW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3Jhd2xlclByb3BzIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSByb2xlOiBpYW0uUm9sZTtcbiAgcmVhZG9ubHkgczNUYXJnZXRzPzogZ2x1ZS5TM1RhcmdldFtdIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBqZGJjVGFyZ2V0cz86IGdsdWUuSkRCQ1RhcmdldFtdO1xuICByZWFkb25seSBkYXRhYmFzZU5hbWU6c3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cbi8vaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvbGF0ZXN0L0FXUy9HbHVlLmh0bWwjY3JlYXRlQ3Jhd2xlci1wcm9wZXJ0eVxuXG5leHBvcnQgY2xhc3MgQ3Jhd2xlciBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcGFyYW1ldGVyczoge1trZXk6c3RyaW5nXTogYW55fTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDcmF3bGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gdmFsaWRhdGUgdGhhdCBvbmx5IG9uZSBvZiBzM1RhcmdldHMgaGFzIGJlZW4gc2V0LiBDb3VsZCBub3QgdXNlIFR5cGUsIGFzIHRoaXMgd2FzIGpzaWkgaW5jb21wYXRpYWJsZS5cbiAgICAvLyBzbyB0aGlzIGhhcyB0byBiZSBydW4gdGltZSBjaGVjayDwn5SlXG4gICAgaWYgKHByb3BzLnMzVGFyZ2V0cyAmJiBwcm9wcy5qZGJjVGFyZ2V0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGhhdmUgYm90aCBTM1RhcmdldHMgYW5kIEpkYmNUYXJnZXRzJyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnMzVGFyZ2V0cyA9PT0gdW5kZWZpbmVkICYmIHByb3BzLmpkYmNUYXJnZXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB0YXJnZXQgdHlwZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHM6IHtba2V5OnN0cmluZ106IGFueX0gPSB7fTtcblxuICAgIGlmIChwcm9wcy5zM1RhcmdldHMpIHtcbiAgICAgIGNvbnN0IHMzdGFyZ2V0czogb2JqZWN0W10gPSBbXTtcbiAgICAgIHByb3BzLnMzVGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcbiAgICAgICAgczN0YXJnZXRzLnB1c2godGFyZ2V0LnRhcmdldCk7XG4gICAgICB9KTtcbiAgICAgIHRhcmdldHMuUzNUYXJnZXRzID0gczN0YXJnZXRzO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5qZGJjVGFyZ2V0cykge1xuICAgICAgY29uc3QgamRiY1RhcmdldHM6IG9iamVjdFtdID0gW107XG4gICAgICBwcm9wcy5qZGJjVGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcbiAgICAgICAgamRiY1RhcmdldHMucHVzaCh0YXJnZXQudGFyZ2V0KTtcbiAgICAgIH0pO1xuICAgICAgdGFyZ2V0cy5KZGJjVGFyZ2V0cyA9IGpkYmNUYXJnZXRzO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyh0YXJnZXRzKTtcblxuICAgIC8vIHRoZXNlIGFyZSB0aGUgbWFuZGF0b3J5IHBhcmFtdGVyc1xuICAgIHRoaXMucGFyYW1ldGVycyA9IHtcbiAgICAgIE5hbWU6IHByb3BzLm5hbWUsXG4gICAgICBSb2xlOiBwcm9wcy5yb2xlLnJvbGVBcm4sXG4gICAgICBUYXJnZXRzOiBwYXNjYWxDYXNlS2V5cyh0YXJnZXRzKSxcbiAgICAgIERhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgIH07XG4gICAgY29uc29sZS5sb2coJy0tLS0tLScpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMucGFyYW1ldGVycyk7XG5cbiAgICAvLyB0YXJnZXRzIGtleXMsIG5lZWQgdG8gaGF2ZSB0aGVpciBmaXJzdCBjaGFyYWN0ZXIgQ2FwaXRhbGl6ZWQuXG5cblxuICAgIGlmIChwcm9wcy5kZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5wYXJhbWV0ZXJzLkRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgbmV3IGNyLkF3c0N1c3RvbVJlc291cmNlKHRoaXMsICdDcmF3bGVyJywge1xuICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpDcmF3bGVyJyxcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6ICdHbHVlJyxcbiAgICAgICAgYWN0aW9uOiAnY3JlYXRlQ3Jhd2xlcicsXG4gICAgICAgIHBhcmFtZXRlcnM6IHRoaXMucGFyYW1ldGVycyxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjci5QaHlzaWNhbFJlc291cmNlSWQub2YoYENyYXdsZXIke3Byb3BzLm5hbWV9YCksXG4gICAgICB9LFxuICAgICAgb25VcGRhdGU6IHtcbiAgICAgICAgc2VydmljZTogJ0dsdWUnLFxuICAgICAgICBhY3Rpb246ICd1cGRhdGVDcmF3bGVyJyxcbiAgICAgICAgcGFyYW1ldGVyczogdGhpcy5wYXJhbWV0ZXJzLFxuICAgICAgfSxcbiAgICAgIG9uRGVsZXRlOiB7XG4gICAgICAgIHNlcnZpY2U6ICdHbHVlJyxcbiAgICAgICAgYWN0aW9uOiAnZGVsZXRlQ3Jhd2xlcicsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBOYW1lOiBwcm9wcy5uYW1lLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgcG9saWN5OiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU3RhdGVtZW50cyhbXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICdnbHVlOkNyZWF0ZUNyYXdsZXInLFxuICAgICAgICAgICAgICAnZ2x1ZTpVcGRhdGVDcmF3bGVyJyxcbiAgICAgICAgICAgICAgJ2dsdWU6RGVsZXRlQ3Jhd2xlcicsXG4gICAgICAgICAgICAgICdpYW06UGFzc1JvbGUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgIF0pLFxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgYWRkIGNsYXNzaWZlcnMgdG8gdGhlIGNyYXdsZXIuXG4gICAqIEBwYXJhbSBwcm9wcyBhZGRDbGFzc2lmaWVyUHJvcHNcbiAgICovXG4gIHB1YmxpYyBhZGRDbGFzc2lmaWVycyhwcm9wczogQWRkQ2xhc3NpZmllcnNQcm9wcyk6IHZvaWQge1xuICAgIHZhciBjbGFzc2lmZXJOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBwcm9wcy5jbGFzc2lmaWVycy5mb3JFYWNoKChjbGFzc2lmaWVyKSA9PiB7XG4gICAgICBjbGFzc2lmZXJOYW1lcy5wdXNoKGNsYXNzaWZpZXIubmFtZSk7XG4gICAgfSk7XG4gICAgdGhpcy5wYXJhbWV0ZXJzLkNsYXNzaWZpZXJzID0gY2xhc3NpZmVyTmFtZXM7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGUgY3Jhd2xlciB3aXRoIGxha2VGb3JtYXRpb24gUGVybWlzc2lvbnMuXG4gICAqIEBwYXJhbSBwcm9wcyBMYWtlRm9ybWF0aW9uQ29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqXG4gICAqL1xuICBwdWJsaWMgdXNlV2l0aExha2VGb3JtYXRpb24ocHJvcHM6IExha2VGb3JtYXRpb25Db25maWd1cmF0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5wYXJhbWV0ZXJzLkxha2VGb3JtYXRpb25Db25maWd1cmF0aW9uID0ge1xuICAgICAgVXNlTGFrZUZvcm1hdGlvbkNyZWRlbnRpYWxzOiBwcm9wcy51c2VMYWtlRm9ybWF0aW9uQ3JlZGVudGlhbHMgPz8gdHJ1ZSxcbiAgICB9O1xuICAgIGlmIChwcm9wcy5hY2NvdW50SWQpIHtcbiAgICAgIHRoaXMucGFyYW1ldGVycy5MYWtlRm9ybWF0aW9uQ29uZmlndXJhdGlvbi5BY2NvdW50SWQgPSBwcm9wcy5hY2NvdW50SWQ7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIHJlY2FsbCAgcG9saWN5IGZvciB0aGUgY3Jhd2xlci5cbiAgICogQHBhcmFtIHJlY2FsbHBvbGljeSBSZWNyYXdsUG9saWN5XG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIHB1YmxpYyBhZGRSZWNyYXdsQmVoYXZpb3VyKHJlY2FsbHBvbGljeTogUmVjcmF3bFBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1ldGVycy5SZWNyYXdsQmVoYXZpb3VyID0gcmVjYWxscG9saWN5O1xuICB9XG4gIC8qKlxuICAgKiBFbmFibGUgTGluZWFnZSBmb3IgdGhlIENyYXdsZXJcbiAgICogQHBhcmFtIGxpbmVhZ2VcbiAgICovXG4gIHB1YmxpYyBlbmFibGVMaW5lYWdlKGxpbmVhZ2U6IENyYXdsZXJMaW5lYWdlU2V0dGluZ3MpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtZXRlcnMuTGluZWFnZUNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICBDcmF3bGVyTGluZWFnZVNldHRpbmdzOiBsaW5lYWdlLFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEVuYWJsZSBTY2hlbWFDaGFuZ1BvbGljeVxuICAgKiBAcGFyYW0gc2NoZW1hQ2hhbmdlUG9saWN5XG4gICAqL1xuICBwdWJsaWMgYWRkU2NoZW1hQ2hhbmdlUG9saWN5KHNjaGVtYUNoYW5nZVBvbGljeTogU2NoZW1hQ2hhbmdlUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5wYXJhbWV0ZXJzLlNjaGVtYUNoYW5nZVBvbGljeSA9IHBhc2NhbENhc2VLZXlzKHNjaGVtYUNoYW5nZVBvbGljeSk7XG4gIH1cbiAgLyoqXG4gICAqIHNldCBjcmF3bGVyIENvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHB1YmxpYyBhZGRDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1ldGVycy5Db25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgfVxuICAvKipcbiAgICogYWRkIENyYXdsZXJTZWN1cml0eSBDb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uXG4gICAqICovXG4gIHB1YmxpYyBhZGRDcmF3bGVyU2VjdXJpdHlDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1ldGVycy5DcmF3bGVyU2VjdXJpdHlDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgfVxuICAvKipcbiAgICogYWRkIHNjaGVkdWxlIGZvciB0aGUgY3Jhd2xlclxuICAgKiBAcGFyYW0gc2NoZWR1bGVcbiAgICovXG4gIHB1YmxpYyBhZGRTY2hlZHVsZShzY2hlZHVsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGNoZWNrUmVnZXgobmV3IFJlZ0V4cCgnXigoXFwqKFxcL1xcZCspP3xcXGQrKCgtfFxcLClcXGQrKSopKFxccysoXFwqKFxcL1xcZCspP3xcXGQrKCgtfFxcLClcXGQrKSopKXs0fSkkJyksIHNjaGVkdWxlKSA9PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc2NoZWR1bGUgbmVlZHMgdG8gYmUgYSB2YWxpZCBjcm9uIGV4cHJlc3NvbicpO1xuICAgIH1cbiAgICB0aGlzLnBhcmFtZXRlcnMuU2NoZWR1bGUgPSBzY2hlZHVsZTtcbiAgfVxuICAvKipcbiAgICogYWRkIHRhYmxlIHByZWZpeCBmb3IgdGhlIGNyYXdsZXJcbiAgICogQHBhcmFtIHRhYmxlUHJlZml4XG4gICAqL1xuICBwdWJsaWMgYWRkVGFibGVQcmVmaXgodGFibGVQcmVmaXg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1ldGVycy5UYWJsZVByZWZpeCA9IHRhYmxlUHJlZml4O1xuICB9XG59XG5cbi8vIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBwcm9wZXJ0eSBpcyBhIG1hdGNoIGZvciBhIHJlZ2V4IGV4cHJlc3Npb25cblxuZnVuY3Rpb24gY2hlY2tSZWdleChyZWdleDogUmVnRXhwLCBwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZWdleC50ZXN0KHByb3BlcnR5KTtcbn1cbi8qKlxuICogQ29udmVydHMgdGhlIEtleXMgaW4gYW4gYXJiaXRvcnkgb2JqZWN0LCB0byBQYXNjYWwgQ2FzZS4gVXNlIHRoaXMgdG8gc2VuZCB0eXBlc2NyaXB0IG9iamVjdHNcbiAqIHRvIEFQSVxuICogQHBhcmFtIG9iaiBhIGNvbXBsZXggb2JqZWN0XG4gKiBAcmV0dXJucyBhbnlcbiAqL1xuZnVuY3Rpb24gcGFzY2FsQ2FzZUtleXMob2JqOiBhbnkpOiBhbnkge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLm1hcChwYXNjYWxDYXNlS2V5cyk7XG4gIH1cbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhvYmopO1xuICBjb25zdCBtYXBwZWRFbnRyaWVzID0gZW50cmllcy5tYXAoXG4gICAgKFtrLCB2XSkgPT4gW2Ake2suc2xpY2UoMCwgMSkudG9VcHBlckNhc2UoKX0ke2suc2xpY2UoMSl9YCwgcGFzY2FsQ2FzZUtleXModildIGFzIGNvbnN0KTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhtYXBwZWRFbnRyaWVzKTtcbn0iXX0=