awslint 2.97.1-alpha.0 → 2.99.0-alpha.0

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/bin/awslint.js CHANGED
@@ -18,12 +18,12 @@ async function main() {
18
18
  .command('$0', 'lint the current module (default)')
19
19
  .command('list', 'list all available rules')
20
20
  .option('include', { alias: 'i', type: 'array', desc: 'evaluate only this rule(s)', default: ['*'] })
21
- .option('exclude', { alias: 'x', type: 'array', desc: 'do not evaludate these rules (takes priority over --include)', default: [] })
22
- .option('save', { type: 'boolean', desc: 'updates package.json with "exclude" statements for all failing rules', default: false })
21
+ .option('exclude', { alias: 'x', type: 'array', desc: 'do not evaluate these rules (takes priority over --include)', default: [] })
22
+ .option('save', { type: 'boolean', desc: 'updates package.json (or awslint.json if it exists) with "exclude" statements for all failing rules', default: false })
23
23
  .option('verbose', { alias: 'v', type: 'boolean', desc: 'verbose output (prints all assertions)', default: false })
24
24
  .option('quiet', { alias: 'q', type: 'boolean', desc: 'quiet mode - shows only errors', default: true })
25
25
  .option('force', { type: 'boolean', desc: 'succeed silently if this is not a jsii module', default: true })
26
- .option('config', { type: 'boolean', desc: 'reads options from the "awslint" section in package.json', default: true })
26
+ .option('config', { type: 'boolean', desc: 'reads options from "awslint.json" if it exists, and otherwise from the "awslint" section in package.json', default: true })
27
27
  .option('debug', { type: 'boolean', desc: 'debug output', default: false })
28
28
  .option('compile', { alias: 'c', type: 'boolean', desc: 'always run the jsii compiler (use "--no-compile" to never run the compiler, even if .jsii doesn\'t exist)' })
29
29
  .group('include', 'Filtering')
@@ -50,7 +50,8 @@ async function main() {
50
50
  }
51
51
  const command = args._[0] || 'lint';
52
52
  const workdir = process.cwd();
53
- const config = path.join(workdir, 'package.json');
53
+ const pkgConfig = path.join(workdir, 'package.json');
54
+ const awslintConfig = path.join(workdir, 'awslint.json');
54
55
  if (command === 'list') {
55
56
  for (const rule of lib_1.ALL_RULES_LINTER.rules) {
56
57
  console.info(`${chalk.cyan(rule.code)}: ${rule.message}`);
@@ -58,10 +59,10 @@ async function main() {
58
59
  return;
59
60
  }
60
61
  // if no package.json and force is true (default), just don't do anything
61
- if (!await fs.pathExists(config) && args.force) {
62
+ if (!await fs.pathExists(pkgConfig) && args.force) {
62
63
  return;
63
64
  }
64
- const pkg = await fs.readJSON(config);
65
+ const pkg = await fs.readJSON(pkgConfig);
65
66
  // if this is not a jsii module we have nothing to look for
66
67
  if (!pkg.jsii) {
67
68
  if (args.force) {
@@ -74,9 +75,19 @@ async function main() {
74
75
  if (await shouldCompile()) {
75
76
  await shell('jsii');
76
77
  }
78
+ // awslint.json takes precedence over package.json for awslint options.
79
+ const standloneOptions = await readStandaloneOptions(awslintConfig);
77
80
  // read "awslint" from package.json
78
81
  if (args.config) {
79
- mergeOptions(args, pkg.awslint);
82
+ if (standloneOptions) {
83
+ if (pkg.awslint) {
84
+ console.warn('awslint options in package.json will be ignored since awslint.json exists.');
85
+ }
86
+ mergeOptions(args, standloneOptions);
87
+ }
88
+ else {
89
+ mergeOptions(args, pkg.awslint);
90
+ }
80
91
  }
81
92
  if (args.debug) {
82
93
  console.error('command: ' + command);
@@ -129,20 +140,36 @@ async function main() {
129
140
  }
130
141
  }
131
142
  if (excludesToSave.length > 0) {
132
- if (!pkg.awslint) {
133
- pkg.awslint = {};
143
+ if (standloneOptions) {
144
+ if (!standloneOptions.exclude) {
145
+ standloneOptions.exclude = [];
146
+ }
134
147
  }
135
- if (!pkg.awslint.exclude) {
136
- pkg.awslint.exclude = [];
148
+ else {
149
+ if (!pkg.awslint) {
150
+ pkg.awslint = {};
151
+ }
152
+ if (!pkg.awslint.exclude) {
153
+ pkg.awslint.exclude = [];
154
+ }
137
155
  }
138
- const excludes = pkg.awslint.exclude;
156
+ const excludes = standloneOptions ? standloneOptions.exclude : pkg.awslint.exclude;
139
157
  for (const exclude of excludesToSave) {
140
158
  if (excludes.indexOf(exclude) === -1) {
141
159
  excludes.push(exclude);
142
160
  }
143
161
  }
144
162
  if (excludes.length > 0) {
145
- await fs.writeJSON(config, pkg, { spaces: 2 });
163
+ if (standloneOptions) {
164
+ // If awslint.json exists, write the excludes there instead of the old package.json (legacy format).
165
+ if (pkg.awslint) {
166
+ console.warn('Excludes will be written to awslint.json.');
167
+ }
168
+ await fs.writeJSON(awslintConfig, standloneOptions, { spaces: 2 });
169
+ }
170
+ else {
171
+ await fs.writeJSON(pkgConfig, pkg, { spaces: 2 });
172
+ }
146
173
  }
147
174
  }
148
175
  if (errors && !args.save) {
@@ -206,6 +233,13 @@ function mergeOptions(dest, pkg) {
206
233
  }
207
234
  return dest;
208
235
  }
236
+ async function readStandaloneOptions(awslintConfig) {
237
+ if (!await fs.pathExists(awslintConfig)) {
238
+ return;
239
+ }
240
+ const options = await fs.readJSON(awslintConfig);
241
+ return options;
242
+ }
209
243
  async function shell(command) {
210
244
  const child = child_process.spawn(command, [], { stdio: ['inherit', 'inherit', 'inherit'] });
211
245
  return new Promise((ok, ko) => {
@@ -220,4 +254,4 @@ async function shell(command) {
220
254
  child.once('error', ko);
221
255
  });
222
256
  }
223
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzbGludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImF3c2xpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw0QkFBNEI7QUFDNUIsK0JBQStCO0FBQy9CLCtDQUErQztBQUMvQyw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQix3Q0FBd0M7QUFDeEMsK0JBQStCO0FBQy9CLGdDQUEyRDtBQUUzRCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFFdkIsS0FBSyxVQUFVLElBQUk7SUFDakIsTUFBTSxJQUFJLEdBQUcsS0FBSztTQUNmLEdBQUcsQ0FBQyxTQUFTLENBQUM7U0FDZCxLQUFLLENBQUMsNkJBQTZCLENBQUM7U0FDcEMsY0FBYyxDQUFDLElBQUksQ0FBQztTQUNwQixPQUFPLENBQUMsSUFBSSxFQUFFLG1DQUFtQyxDQUFDO1NBQ2xELE9BQU8sQ0FBQyxNQUFNLEVBQUUsMEJBQTBCLENBQUM7U0FDM0MsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUNwRyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSw4REFBOEQsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7U0FDbkksTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLHNFQUFzRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUNqSSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSx3Q0FBd0MsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDbEgsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsZ0NBQWdDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3ZHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSwrQ0FBK0MsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDMUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLDBEQUEwRCxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUN0SCxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUMxRSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSwyR0FBMkcsRUFBRSxDQUFDO1NBQ3JLLEtBQUssQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDO1NBQzdCLEtBQUssQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDO1NBQzdCLEtBQUssQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDO1NBQ2hDLEtBQUssQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDO1NBQzlCLEtBQUssQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDO1NBQzFCLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO1NBQ3hCLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO1NBQ3hCLEtBQUssQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDO1NBQ3pCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsNENBQTRDLENBQUM7U0FDaEUsT0FBTyxDQUFDLHdDQUF3QyxFQUFFLG9GQUFvRixDQUFDO1NBQ3ZJLE9BQU8sQ0FBQyxpQ0FBaUMsRUFBRSxpRkFBaUYsQ0FBQztTQUM3SCxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsOERBQThELENBQUMsQ0FBQztJQUU3RixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDekIsbUNBQW1DO1FBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztLQUMvQjtJQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7SUFFdkIsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztJQUV4QyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNyQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNqQjtJQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUU5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztJQUVsRCxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUU7UUFDdEIsS0FBSyxNQUFNLElBQUksSUFBSSxzQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7WUFDekMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsT0FBTztLQUNSO0lBRUQseUVBQXlFO0lBQ3pFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtRQUM5QyxPQUFPO0tBQ1I7SUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdEMsMkRBQTJEO0lBQzNELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO1FBQ2IsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLHdCQUF3QjtTQUNqQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxPQUFPLDJEQUEyRCxDQUFDLENBQUM7S0FDbEc7SUFFRCx1RUFBdUU7SUFDdkUsMkNBQTJDO0lBQzNDLElBQUksTUFBTSxhQUFhLEVBQUUsRUFBRTtRQUN6QixNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNyQjtJQUVELG1DQUFtQztJQUNuQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDZixZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUNqQztJQUVELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtRQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2pFO0lBRUQsSUFBSSxPQUFPLEtBQUssTUFBTSxFQUFFO1FBQ3RCLE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixPQUFPO1NBQ1I7UUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQzNDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVmLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUVuQixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsc0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUM5QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBRUosa0RBQWtEO1FBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxQyxrQkFBa0I7UUFFbEIsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLEVBQUU7WUFDMUIsTUFBTSxjQUFjLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFekQsSUFBSSxLQUFLLENBQUM7WUFDVixRQUFRLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2xCLEtBQUsscUJBQWUsQ0FBQyxPQUFPO29CQUMxQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7d0JBQ2hCLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO3FCQUNwQjtvQkFDRCxNQUFNO2dCQUNSLEtBQUsscUJBQWUsQ0FBQyxLQUFLO29CQUN4QixNQUFNLEVBQUUsQ0FBQztvQkFDVCxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztvQkFDbEIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO3dCQUNiLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7cUJBQ3JDO29CQUNELE1BQU07Z0JBQ1IsS0FBSyxxQkFBZSxDQUFDLE9BQU87b0JBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO3dCQUNmLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO3FCQUN0QjtvQkFDRCxNQUFNO2dCQUNSLEtBQUsscUJBQWUsQ0FBQyxPQUFPO29CQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTt3QkFDZixLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztxQkFDcEI7b0JBQ0QsTUFBTTthQUNUO1lBRUQsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxxQkFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDOUo7U0FDRjtRQUVELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2hCLEdBQUcsQ0FBQyxPQUFPLEdBQUcsRUFBRyxDQUFDO2FBQ25CO1lBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO2dCQUN4QixHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7YUFDMUI7WUFFRCxNQUFNLFFBQVEsR0FBYSxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUUvQyxLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsRUFBRTtnQkFDcEMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNwQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN4QjthQUNGO1lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNoRDtTQUNGO1FBRUQsSUFBSSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDakI7UUFFRCxPQUFPO0tBQ1I7SUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUUvQyxLQUFLLFVBQVUsYUFBYTtRQUUxQiw4REFBOEQ7UUFDOUQsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRTtZQUN6QixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsK0VBQStFO1FBQy9FLElBQUksTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUU7WUFDcEQsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELG9GQUFvRjtRQUNwRixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztTQUMxRDtRQUVELFdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFFSCxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLElBQUksVUFBVSxFQUFFO1FBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDeEI7SUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDO0FBRUgsS0FBSyxVQUFVLFVBQVUsQ0FBQyxHQUFXO0lBQ25DLE1BQU0sRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLDhEQUE4RDtJQUN2RywwRUFBMEU7SUFFMUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0tBQzFEO0lBRUQsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUFTLEVBQUUsR0FBUztJQUN4QyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQUUsT0FBTztLQUFFLENBQUMsNkJBQTZCO0lBRW5ELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBRTlDLDZEQUE2RDtRQUM3RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUNoQixTQUFTO1NBQ1Y7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxzQkFBc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdEY7UUFFRCw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztLQUNuQjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELEtBQUssVUFBVSxLQUFLLENBQUMsT0FBZTtJQUNsQyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RixPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDakMsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNoQixPQUFPLEVBQUUsRUFBRSxDQUFDO2FBQ2I7aUJBQU07Z0JBQ0wsT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxPQUFPLHVCQUF1QixNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDakU7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0ICogYXMgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgQUxMX1JVTEVTX0xJTlRFUiwgRGlhZ25vc3RpY0xldmVsIH0gZnJvbSAnLi4vbGliJztcblxubGV0IHN0YWNrVHJhY2UgPSBmYWxzZTtcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgY29uc3QgYXJndiA9IHlhcmdzXG4gICAgLmVudignQVdTTElOVCcpXG4gICAgLnVzYWdlKCdhd3NsaW50IFtvcHRpb25zXSBbY29tbWFuZF0nKVxuICAgIC5zaG93SGVscE9uRmFpbCh0cnVlKVxuICAgIC5jb21tYW5kKCckMCcsICdsaW50IHRoZSBjdXJyZW50IG1vZHVsZSAoZGVmYXVsdCknKVxuICAgIC5jb21tYW5kKCdsaXN0JywgJ2xpc3QgYWxsIGF2YWlsYWJsZSBydWxlcycpXG4gICAgLm9wdGlvbignaW5jbHVkZScsIHsgYWxpYXM6ICdpJywgdHlwZTogJ2FycmF5JywgZGVzYzogJ2V2YWx1YXRlIG9ubHkgdGhpcyBydWxlKHMpJywgZGVmYXVsdDogWycqJ10gfSlcbiAgICAub3B0aW9uKCdleGNsdWRlJywgeyBhbGlhczogJ3gnLCB0eXBlOiAnYXJyYXknLCBkZXNjOiAnZG8gbm90IGV2YWx1ZGF0ZSB0aGVzZSBydWxlcyAodGFrZXMgcHJpb3JpdHkgb3ZlciAtLWluY2x1ZGUpJywgZGVmYXVsdDogW10gfSlcbiAgICAub3B0aW9uKCdzYXZlJywgeyB0eXBlOiAnYm9vbGVhbicsIGRlc2M6ICd1cGRhdGVzIHBhY2thZ2UuanNvbiB3aXRoIFwiZXhjbHVkZVwiIHN0YXRlbWVudHMgZm9yIGFsbCBmYWlsaW5nIHJ1bGVzJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgICAub3B0aW9uKCd2ZXJib3NlJywgeyBhbGlhczogJ3YnLCB0eXBlOiAnYm9vbGVhbicsIGRlc2M6ICd2ZXJib3NlIG91dHB1dCAocHJpbnRzIGFsbCBhc3NlcnRpb25zKScsIGRlZmF1bHQ6IGZhbHNlIH0pXG4gICAgLm9wdGlvbigncXVpZXQnLCB7IGFsaWFzOiAncScsIHR5cGU6ICdib29sZWFuJywgZGVzYzogJ3F1aWV0IG1vZGUgLSBzaG93cyBvbmx5IGVycm9ycycsIGRlZmF1bHQ6IHRydWUgfSlcbiAgICAub3B0aW9uKCdmb3JjZScsIHsgdHlwZTogJ2Jvb2xlYW4nLCBkZXNjOiAnc3VjY2VlZCBzaWxlbnRseSBpZiB0aGlzIGlzIG5vdCBhIGpzaWkgbW9kdWxlJywgZGVmYXVsdDogdHJ1ZSB9KVxuICAgIC5vcHRpb24oJ2NvbmZpZycsIHsgdHlwZTogJ2Jvb2xlYW4nLCBkZXNjOiAncmVhZHMgb3B0aW9ucyBmcm9tIHRoZSBcImF3c2xpbnRcIiBzZWN0aW9uIGluIHBhY2thZ2UuanNvbicsIGRlZmF1bHQ6IHRydWUgfSlcbiAgICAub3B0aW9uKCdkZWJ1ZycsIHsgdHlwZTogJ2Jvb2xlYW4nLCBkZXNjOiAnZGVidWcgb3V0cHV0JywgZGVmYXVsdDogZmFsc2UgfSlcbiAgICAub3B0aW9uKCdjb21waWxlJywgeyBhbGlhczogJ2MnLCB0eXBlOiAnYm9vbGVhbicsIGRlc2M6ICdhbHdheXMgcnVuIHRoZSBqc2lpIGNvbXBpbGVyICh1c2UgXCItLW5vLWNvbXBpbGVcIiB0byBuZXZlciBydW4gdGhlIGNvbXBpbGVyLCBldmVuIGlmIC5qc2lpIGRvZXNuXFwndCBleGlzdCknIH0pXG4gICAgLmdyb3VwKCdpbmNsdWRlJywgJ0ZpbHRlcmluZycpXG4gICAgLmdyb3VwKCdleGNsdWRlJywgJ0ZpbHRlcmluZycpXG4gICAgLmdyb3VwKCdjb25maWcnLCAnQ29uZmlndXJhdGlvbicpXG4gICAgLmdyb3VwKCdzYXZlJywgJ0NvbmZpZ3VyYXRpb24nKVxuICAgIC5ncm91cCgndmVyYm9zZScsICdPdXRwdXQnKVxuICAgIC5ncm91cCgncXVpZXQnLCAnT3V0cHV0JylcbiAgICAuZ3JvdXAoJ2RlYnVnJywgJ091dHB1dCcpXG4gICAgLmdyb3VwKCdjb21waWxlJywgJ0J1aWxkJylcbiAgICAuZXhhbXBsZSgnYXdzbGludCcsICdsaW50cyB0aGUgY3VycmVudCBtb2R1bGUgYWdhaW5zdCBhbGwgcnVsZXMnKVxuICAgIC5leGFtcGxlKCdhd3NsaW50IC12IC1pIFwicmVzb3VyY2UqXCIgLWkgXCJpbXBvcnQqXCInLCAnbGludHMgYWdhaW5zdCBhbGwgcnVsZXMgdGhhdCBzdGFydCB3aXRoIFwicmVzb3VyY2VcIiBvciBcImltcG9ydFwiIGFuZCBwcmludCBzdWNjZXNzZXMnKVxuICAgIC5leGFtcGxlKCdhd3NsaW50IC14IFwiKjpAYXdzLWNkay9hd3MtczMqXCInLCAnZXZhbHVhdGUgYWxsIHJ1bGVzIGluIGFsbCBzY29wZXMgYmVzaWRlcyBvbmVzIHRoYXQgYmVnaW4gd2l0aCBcIkBhd3MtY2RrL2F3cy1zM1wiJylcbiAgICAuZXhhbXBsZSgnYXdzbGludCAtLXNhdmUnLCAndXBkYXRlZCBcInBhY2thZ2UuanNvblwiIHdpdGggXCJleGNsdWRlXCJzIGZvciBhbGwgZmFpbGluZyBydWxlcycpO1xuXG4gIGlmICghcHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICAvLyBEaXNhYmxlIGNoYWxrIGNvbG9yIGhpZ2hsaWdodGluZ1xuICAgIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SID0gJzAnO1xuICB9XG5cbiAgY29uc3QgYXJncyA9IGFyZ3YuYXJndjtcblxuICBzdGFja1RyYWNlID0gYXJncy52ZXJib3NlIHx8IGFyZ3MuZGVidWc7XG5cbiAgaWYgKGFyZ3MuXy5sZW5ndGggPiAxKSB7XG4gICAgYXJndi5zaG93SGVscCgpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGNvbW1hbmQgPSBhcmdzLl9bMF0gfHwgJ2xpbnQnO1xuICBjb25zdCB3b3JrZGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICBjb25zdCBjb25maWcgPSBwYXRoLmpvaW4od29ya2RpciwgJ3BhY2thZ2UuanNvbicpO1xuXG4gIGlmIChjb21tYW5kID09PSAnbGlzdCcpIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgQUxMX1JVTEVTX0xJTlRFUi5ydWxlcykge1xuICAgICAgY29uc29sZS5pbmZvKGAke2NoYWxrLmN5YW4ocnVsZS5jb2RlKX06ICR7cnVsZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBpZiBubyBwYWNrYWdlLmpzb24gYW5kIGZvcmNlIGlzIHRydWUgKGRlZmF1bHQpLCBqdXN0IGRvbid0IGRvIGFueXRoaW5nXG4gIGlmICghYXdhaXQgZnMucGF0aEV4aXN0cyhjb25maWcpICYmIGFyZ3MuZm9yY2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwa2cgPSBhd2FpdCBmcy5yZWFkSlNPTihjb25maWcpO1xuXG4gIC8vIGlmIHRoaXMgaXMgbm90IGEganNpaSBtb2R1bGUgd2UgaGF2ZSBub3RoaW5nIHRvIGxvb2sgZm9yXG4gIGlmICghcGtnLmpzaWkpIHtcbiAgICBpZiAoYXJncy5mb3JjZSkge1xuICAgICAgcmV0dXJuOyAvLyBqdXN0IHNpbGVudGx5IHN1Y2NlZWRcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZHVsZSBpbiAke3dvcmtkaXJ9IGlzIG5vdCBhIGpzaWkgbW9kdWxlIChubyBcImpzaWlcIiBzZWN0aW9uIGluIHBhY2thZ2UuanNvbilgKTtcbiAgfVxuXG4gIC8vIGlmIHBhY2thZ2UuanNvbiBjb250YWlucyBhIGBqc2lpYCBzZWN0aW9uIGJ1dCB0aGVyZSBpcyBubyAuanNpaSBmaWxlXG4gIC8vIGl0IG1lYW5zIHdlIGhhdmVuJ3QgY29tcGlsZWQgdGhlIG1vZHVsZS5cbiAgaWYgKGF3YWl0IHNob3VsZENvbXBpbGUoKSkge1xuICAgIGF3YWl0IHNoZWxsKCdqc2lpJyk7XG4gIH1cblxuICAvLyByZWFkIFwiYXdzbGludFwiIGZyb20gcGFja2FnZS5qc29uXG4gIGlmIChhcmdzLmNvbmZpZykge1xuICAgIG1lcmdlT3B0aW9ucyhhcmdzLCBwa2cuYXdzbGludCk7XG4gIH1cblxuICBpZiAoYXJncy5kZWJ1Zykge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2NvbW1hbmQ6ICcgKyBjb21tYW5kKTtcbiAgICBjb25zb2xlLmVycm9yKCdvcHRpb25zOiAnICsgSlNPTi5zdHJpbmdpZnkoYXJncywgdW5kZWZpbmVkLCAyKSk7XG4gIH1cblxuICBpZiAoY29tbWFuZCA9PT0gJ2xpbnQnKSB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCBsb2FkTW9kdWxlKHdvcmtkaXIpO1xuICAgIGlmICghYXNzZW1ibHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBleGNsdWRlc1RvU2F2ZSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgbGV0IGVycm9ycyA9IDA7XG5cbiAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICByZXN1bHRzLnB1c2goLi4uQUxMX1JVTEVTX0xJTlRFUi5ldmFsKGFzc2VtYmx5LCB7XG4gICAgICBpbmNsdWRlOiBhcmdzLmluY2x1ZGUsXG4gICAgICBleGNsdWRlOiBhcmdzLmV4Y2x1ZGUsXG4gICAgfSkpO1xuXG4gICAgLy8gU29ydCBlcnJvcnMgdG8gdGhlIHRvcCAoaGlnaGVzdCBzZXZlcml0eSBmaXJzdClcbiAgICByZXN1bHRzLnNvcnQoKGEsIGIpID0+IGIubGV2ZWwgLSBhLmxldmVsKTtcblxuICAgIC8vIHByb2Nlc3MgcmVzdWx0c1xuXG4gICAgZm9yIChjb25zdCBkaWFnIG9mIHJlc3VsdHMpIHtcbiAgICAgIGNvbnN0IHN1cHByZXNzaW9uS2V5ID0gYCR7ZGlhZy5ydWxlLmNvZGV9OiR7ZGlhZy5zY29wZX1gO1xuXG4gICAgICBsZXQgY29sb3I7XG4gICAgICBzd2l0Y2ggKGRpYWcubGV2ZWwpIHtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljTGV2ZWwuU3VjY2VzczpcbiAgICAgICAgICBpZiAoYXJncy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb2xvciA9IGNoYWxrLmdyYXk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNMZXZlbC5FcnJvcjpcbiAgICAgICAgICBlcnJvcnMrKztcbiAgICAgICAgICBjb2xvciA9IGNoYWxrLnJlZDtcbiAgICAgICAgICBpZiAoYXJncy5zYXZlKSB7XG4gICAgICAgICAgICBleGNsdWRlc1RvU2F2ZS5wdXNoKHN1cHByZXNzaW9uS2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY0xldmVsLldhcm5pbmc6XG4gICAgICAgICAgaWYgKCFhcmdzLnF1aWV0KSB7XG4gICAgICAgICAgICBjb2xvciA9IGNoYWxrLnllbGxvdztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY0xldmVsLlNraXBwZWQ6XG4gICAgICAgICAgaWYgKCFhcmdzLnF1aWV0KSB7XG4gICAgICAgICAgICBjb2xvciA9IGNoYWxrLmJsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjb2xvcihgJHtEaWFnbm9zdGljTGV2ZWxbZGlhZy5sZXZlbF0udG9Mb3dlckNhc2UoKX06IFske2NoYWxrLmJvbGQoYGF3c2xpbnQ6JHtkaWFnLnJ1bGUuY29kZX1gKX06JHtjaGFsay5ib2xkKGRpYWcuc2NvcGUpfV0gJHtkaWFnLm1lc3NhZ2V9YCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleGNsdWRlc1RvU2F2ZS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIXBrZy5hd3NsaW50KSB7XG4gICAgICAgIHBrZy5hd3NsaW50ID0geyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXBrZy5hd3NsaW50LmV4Y2x1ZGUpIHtcbiAgICAgICAgcGtnLmF3c2xpbnQuZXhjbHVkZSA9IFtdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGNsdWRlczogc3RyaW5nW10gPSBwa2cuYXdzbGludC5leGNsdWRlO1xuXG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGUgb2YgZXhjbHVkZXNUb1NhdmUpIHtcbiAgICAgICAgaWYgKGV4Y2x1ZGVzLmluZGV4T2YoZXhjbHVkZSkgPT09IC0xKSB7XG4gICAgICAgICAgZXhjbHVkZXMucHVzaChleGNsdWRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXhjbHVkZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBmcy53cml0ZUpTT04oY29uZmlnLCBwa2csIHsgc3BhY2VzOiAyIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvcnMgJiYgIWFyZ3Muc2F2ZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGFyZ3Yuc2hvd0hlbHAoKTtcbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcblxuICBhc3luYyBmdW5jdGlvbiBzaG91bGRDb21waWxlKCkge1xuXG4gICAgLy8gaWYgLS1jb21waWxlIGlzIGV4cGxpY2l0bHkgZW5hYmxlZCB0aGVuIGp1c3QgY29tcGlsZSBhbHdheXNcbiAgICBpZiAoYXJncy5jb21waWxlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBoYXZlIGEgLmpzaWkgZmlsZSBhbmQgd2UgYXJlIG5vdCBmb3JjZWQgdG8gY29tcGlsZSwgdGhlbiBkb24ndCBjb21waWxlXG4gICAgaWYgKGF3YWl0IGZzLnBhdGhFeGlzdHMocGF0aC5qb2luKHdvcmtkaXIsICcuanNpaScpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIHdlIGRvbid0IGhhdmUgYSAuanNpaSBmaWxlLCBhbmQgLS1uby1jb21waWxlIGlzIGV4cGxpY2lseSBzZXQsIHRoZW4gaXQncyBhbiBlcnJvclxuICAgIGlmIChhcmdzLmNvbXBpbGUgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIC5qc2lpIGZpbGUgYW5kIC0tbm8tY29tcGlsZSBpcyBzZXQnKTtcbiAgICB9XG5cbiAgICAvLyBjb21waWxlIVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbn1cblxubWFpbigpLmNhdGNoKGUgPT4ge1xuICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlLm1lc3NhZ2UpKTtcbiAgaWYgKHN0YWNrVHJhY2UpIHtcbiAgICBjb25zb2xlLmVycm9yKGUuc3RhY2spO1xuICB9XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkTW9kdWxlKGRpcjogc3RyaW5nKSB7XG4gIGNvbnN0IHRzID0gbmV3IHJlZmxlY3QuVHlwZVN5c3RlbSgpO1xuICBhd2FpdCB0cy5sb2FkKGRpciwgeyB2YWxpZGF0ZTogZmFsc2UgfSk7IC8vIERvbid0IHZhbGlkYXRlIHRvIHNhdmUgNjYlIG9mIGV4ZWN1dGlvbiB0aW1lICgyMHMgdnMgMW1pbikuXG4gIC8vIFdlIHJ1biAnYXdzbGludCcgZHVyaW5nIGJ1aWxkIHRpbWUsIGFzc2VtYmxpZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgb2suXG5cbiAgaWYgKHRzLnJvb3RzLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIG9ubHkgYSBzaW5nbGUgcm9vdCBhc3NlbWJseScpO1xuICB9XG5cbiAgcmV0dXJuIHRzLnJvb3RzWzBdO1xufVxuXG5mdW5jdGlvbiBtZXJnZU9wdGlvbnMoZGVzdDogYW55LCBwa2c/OiBhbnkpIHtcbiAgaWYgKCFwa2cpIHsgcmV0dXJuOyB9IC8vIG5vIG9wdGlvbnMgaW4gcGFja2FnZS5qc29uXG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGtnKSkge1xuXG4gICAgLy8gaWYgdGhpcyBpcyBhbiBhcnJheSBvcHRpb24sIHRoZW4gYWRkIHZhbHVlcyB0byBkZXN0aW5hdGlvblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgYXJyID0gZGVzdFtrZXldIHx8IFtdO1xuICAgICAgYXJyLnB1c2goLi4udmFsdWUpO1xuICAgICAgZGVzdFtrZXldID0gYXJyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gb2JqZWN0cyBhcmUgbm90IGFsbG93ZWRcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9wdGlvbiBcIiR7a2V5fVwiIGluIHBhY2thZ2UuanNvbjogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgfVxuXG4gICAgLy8gcHJpbWl0aXZlcyBzaW1wbHkgb3ZlcnJpZGVcbiAgICBkZXN0W2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzaGVsbChjb21tYW5kOiBzdHJpbmcpIHtcbiAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsIFtdLCB7IHN0ZGlvOiBbJ2luaGVyaXQnLCAnaW5oZXJpdCcsICdpbmhlcml0J10gfSk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigob2ssIGtvKSA9PiB7XG4gICAgY2hpbGQub25jZSgnZXhpdCcsIChzdGF0dXM6IGFueSkgPT4ge1xuICAgICAgaWYgKHN0YXR1cyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBrbyhuZXcgRXJyb3IoYCR7Y29tbWFuZH0gZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIGtvKTtcbiAgfSk7XG59XG4iXX0=
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzbGludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImF3c2xpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw0QkFBNEI7QUFDNUIsK0JBQStCO0FBQy9CLCtDQUErQztBQUMvQyw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQix3Q0FBd0M7QUFDeEMsK0JBQStCO0FBQy9CLGdDQUEyRDtBQUUzRCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFFdkIsS0FBSyxVQUFVLElBQUk7SUFDakIsTUFBTSxJQUFJLEdBQUcsS0FBSztTQUNmLEdBQUcsQ0FBQyxTQUFTLENBQUM7U0FDZCxLQUFLLENBQUMsNkJBQTZCLENBQUM7U0FDcEMsY0FBYyxDQUFDLElBQUksQ0FBQztTQUNwQixPQUFPLENBQUMsSUFBSSxFQUFFLG1DQUFtQyxDQUFDO1NBQ2xELE9BQU8sQ0FBQyxNQUFNLEVBQUUsMEJBQTBCLENBQUM7U0FDM0MsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUNwRyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSw2REFBNkQsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7U0FDbEksTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLHFHQUFxRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUNoSyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSx3Q0FBd0MsRUFBRSxPQUFPLEVBQUUsS0FBSyxF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SyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0YsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ2pDLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDaEIsT0FBTyxFQUFFLEVBQUUsQ0FBQzthQUNiO2lCQUFNO2dCQUNMLE9BQU8sRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsT0FBTyx1QkFBdUIsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2pFO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHJlZmxlY3QgZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCAqIGFzIHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IEFMTF9SVUxFU19MSU5URVIsIERpYWdub3N0aWNMZXZlbCB9IGZyb20gJy4uL2xpYic7XG5cbmxldCBzdGFja1RyYWNlID0gZmFsc2U7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIGNvbnN0IGFyZ3YgPSB5YXJnc1xuICAgIC5lbnYoJ0FXU0xJTlQnKVxuICAgIC51c2FnZSgnYXdzbGludCBbb3B0aW9uc10gW2NvbW1hbmRdJylcbiAgICAuc2hvd0hlbHBPbkZhaWwodHJ1ZSlcbiAgICAuY29tbWFuZCgnJDAnLCAnbGludCB0aGUgY3VycmVudCBtb2R1bGUgKGRlZmF1bHQpJylcbiAgICAuY29tbWFuZCgnbGlzdCcsICdsaXN0IGFsbCBhdmFpbGFibGUgcnVsZXMnKVxuICAgIC5vcHRpb24oJ2luY2x1ZGUnLCB7IGFsaWFzOiAnaScsIHR5cGU6ICdhcnJheScsIGRlc2M6ICdldmFsdWF0ZSBvbmx5IHRoaXMgcnVsZShzKScsIGRlZmF1bHQ6IFsnKiddIH0pXG4gICAgLm9wdGlvbignZXhjbHVkZScsIHsgYWxpYXM6ICd4JywgdHlwZTogJ2FycmF5JywgZGVzYzogJ2RvIG5vdCBldmFsdWF0ZSB0aGVzZSBydWxlcyAodGFrZXMgcHJpb3JpdHkgb3ZlciAtLWluY2x1ZGUpJywgZGVmYXVsdDogW10gfSlcbiAgICAub3B0aW9uKCdzYXZlJywgeyB0eXBlOiAnYm9vbGVhbicsIGRlc2M6ICd1cGRhdGVzIHBhY2thZ2UuanNvbiAob3IgYXdzbGludC5qc29uIGlmIGl0IGV4aXN0cykgd2l0aCBcImV4Y2x1ZGVcIiBzdGF0ZW1lbnRzIGZvciBhbGwgZmFpbGluZyBydWxlcycsIGRlZmF1bHQ6IGZhbHNlIH0pXG4gICAgLm9wdGlvbigndmVyYm9zZScsIHsgYWxpYXM6ICd2JywgdHlwZTogJ2Jvb2xlYW4nLCBkZXNjOiAndmVyYm9zZSBvdXRwdXQgKHByaW50cyBhbGwgYXNzZXJ0aW9ucyknLCBkZWZhdWx0OiBmYWxzZSB9KVxuICAgIC5vcHRpb24oJ3F1aWV0JywgeyBhbGlhczogJ3EnLCB0eXBlOiAnYm9vbGVhbicsIGRlc2M6ICdxdWlldCBtb2RlIC0gc2hvd3Mgb25seSBlcnJvcnMnLCBkZWZhdWx0OiB0cnVlIH0pXG4gICAgLm9wdGlvbignZm9yY2UnLCB7IHR5cGU6ICdib29sZWFuJywgZGVzYzogJ3N1Y2NlZWQgc2lsZW50bHkgaWYgdGhpcyBpcyBub3QgYSBqc2lpIG1vZHVsZScsIGRlZmF1bHQ6IHRydWUgfSlcbiAgICAub3B0aW9uKCdjb25maWcnLCB7IHR5cGU6ICdib29sZWFuJywgZGVzYzogJ3JlYWRzIG9wdGlvbnMgZnJvbSBcImF3c2xpbnQuanNvblwiIGlmIGl0IGV4aXN0cywgYW5kIG90aGVyd2lzZSBmcm9tIHRoZSBcImF3c2xpbnRcIiBzZWN0aW9uIGluIHBhY2thZ2UuanNvbicsIGRlZmF1bHQ6IHRydWUgfSlcbiAgICAub3B0aW9uKCdkZWJ1ZycsIHsgdHlwZTogJ2Jvb2xlYW4nLCBkZXNjOiAnZGVidWcgb3V0cHV0JywgZGVmYXVsdDogZmFsc2UgfSlcbiAgICAub3B0aW9uKCdjb21waWxlJywgeyBhbGlhczogJ2MnLCB0eXBlOiAnYm9vbGVhbicsIGRlc2M6ICdhbHdheXMgcnVuIHRoZSBqc2lpIGNvbXBpbGVyICh1c2UgXCItLW5vLWNvbXBpbGVcIiB0byBuZXZlciBydW4gdGhlIGNvbXBpbGVyLCBldmVuIGlmIC5qc2lpIGRvZXNuXFwndCBleGlzdCknIH0pXG4gICAgLmdyb3VwKCdpbmNsdWRlJywgJ0ZpbHRlcmluZycpXG4gICAgLmdyb3VwKCdleGNsdWRlJywgJ0ZpbHRlcmluZycpXG4gICAgLmdyb3VwKCdjb25maWcnLCAnQ29uZmlndXJhdGlvbicpXG4gICAgLmdyb3VwKCdzYXZlJywgJ0NvbmZpZ3VyYXRpb24nKVxuICAgIC5ncm91cCgndmVyYm9zZScsICdPdXRwdXQnKVxuICAgIC5ncm91cCgncXVpZXQnLCAnT3V0cHV0JylcbiAgICAuZ3JvdXAoJ2RlYnVnJywgJ091dHB1dCcpXG4gICAgLmdyb3VwKCdjb21waWxlJywgJ0J1aWxkJylcbiAgICAuZXhhbXBsZSgnYXdzbGludCcsICdsaW50cyB0aGUgY3VycmVudCBtb2R1bGUgYWdhaW5zdCBhbGwgcnVsZXMnKVxuICAgIC5leGFtcGxlKCdhd3NsaW50IC12IC1pIFwicmVzb3VyY2UqXCIgLWkgXCJpbXBvcnQqXCInLCAnbGludHMgYWdhaW5zdCBhbGwgcnVsZXMgdGhhdCBzdGFydCB3aXRoIFwicmVzb3VyY2VcIiBvciBcImltcG9ydFwiIGFuZCBwcmludCBzdWNjZXNzZXMnKVxuICAgIC5leGFtcGxlKCdhd3NsaW50IC14IFwiKjpAYXdzLWNkay9hd3MtczMqXCInLCAnZXZhbHVhdGUgYWxsIHJ1bGVzIGluIGFsbCBzY29wZXMgYmVzaWRlcyBvbmVzIHRoYXQgYmVnaW4gd2l0aCBcIkBhd3MtY2RrL2F3cy1zM1wiJylcbiAgICAuZXhhbXBsZSgnYXdzbGludCAtLXNhdmUnLCAndXBkYXRlZCBcInBhY2thZ2UuanNvblwiIHdpdGggXCJleGNsdWRlXCJzIGZvciBhbGwgZmFpbGluZyBydWxlcycpO1xuXG4gIGlmICghcHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICAvLyBEaXNhYmxlIGNoYWxrIGNvbG9yIGhpZ2hsaWdodGluZ1xuICAgIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SID0gJzAnO1xuICB9XG5cbiAgY29uc3QgYXJncyA9IGFyZ3YuYXJndjtcblxuICBzdGFja1RyYWNlID0gYXJncy52ZXJib3NlIHx8IGFyZ3MuZGVidWc7XG5cbiAgaWYgKGFyZ3MuXy5sZW5ndGggPiAxKSB7XG4gICAgYXJndi5zaG93SGVscCgpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGNvbW1hbmQgPSBhcmdzLl9bMF0gfHwgJ2xpbnQnO1xuICBjb25zdCB3b3JrZGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICBjb25zdCBwa2dDb25maWcgPSBwYXRoLmpvaW4od29ya2RpciwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBhd3NsaW50Q29uZmlnID0gcGF0aC5qb2luKHdvcmtkaXIsICdhd3NsaW50Lmpzb24nKTtcblxuICBpZiAoY29tbWFuZCA9PT0gJ2xpc3QnKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIEFMTF9SVUxFU19MSU5URVIucnVsZXMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgJHtjaGFsay5jeWFuKHJ1bGUuY29kZSl9OiAke3J1bGUubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gaWYgbm8gcGFja2FnZS5qc29uIGFuZCBmb3JjZSBpcyB0cnVlIChkZWZhdWx0KSwganVzdCBkb24ndCBkbyBhbnl0aGluZ1xuICBpZiAoIWF3YWl0IGZzLnBhdGhFeGlzdHMocGtnQ29uZmlnKSAmJiBhcmdzLmZvcmNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGtnID0gYXdhaXQgZnMucmVhZEpTT04ocGtnQ29uZmlnKTtcblxuICAvLyBpZiB0aGlzIGlzIG5vdCBhIGpzaWkgbW9kdWxlIHdlIGhhdmUgbm90aGluZyB0byBsb29rIGZvclxuICBpZiAoIXBrZy5qc2lpKSB7XG4gICAgaWYgKGFyZ3MuZm9yY2UpIHtcbiAgICAgIHJldHVybjsgLy8ganVzdCBzaWxlbnRseSBzdWNjZWVkXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBNb2R1bGUgaW4gJHt3b3JrZGlyfSBpcyBub3QgYSBqc2lpIG1vZHVsZSAobm8gXCJqc2lpXCIgc2VjdGlvbiBpbiBwYWNrYWdlLmpzb24pYCk7XG4gIH1cblxuICAvLyBpZiBwYWNrYWdlLmpzb24gY29udGFpbnMgYSBganNpaWAgc2VjdGlvbiBidXQgdGhlcmUgaXMgbm8gLmpzaWkgZmlsZVxuICAvLyBpdCBtZWFucyB3ZSBoYXZlbid0IGNvbXBpbGVkIHRoZSBtb2R1bGUuXG4gIGlmIChhd2FpdCBzaG91bGRDb21waWxlKCkpIHtcbiAgICBhd2FpdCBzaGVsbCgnanNpaScpO1xuICB9XG5cbiAgLy8gYXdzbGludC5qc29uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBwYWNrYWdlLmpzb24gZm9yIGF3c2xpbnQgb3B0aW9ucy5cbiAgY29uc3Qgc3RhbmRsb25lT3B0aW9ucyA9IGF3YWl0IHJlYWRTdGFuZGFsb25lT3B0aW9ucyhhd3NsaW50Q29uZmlnKTtcblxuICAvLyByZWFkIFwiYXdzbGludFwiIGZyb20gcGFja2FnZS5qc29uXG4gIGlmIChhcmdzLmNvbmZpZykge1xuICAgIGlmIChzdGFuZGxvbmVPcHRpb25zKSB7XG4gICAgICBpZiAocGtnLmF3c2xpbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdhd3NsaW50IG9wdGlvbnMgaW4gcGFja2FnZS5qc29uIHdpbGwgYmUgaWdub3JlZCBzaW5jZSBhd3NsaW50Lmpzb24gZXhpc3RzLicpO1xuICAgICAgfVxuICAgICAgbWVyZ2VPcHRpb25zKGFyZ3MsIHN0YW5kbG9uZU9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZU9wdGlvbnMoYXJncywgcGtnLmF3c2xpbnQpO1xuICAgIH1cbiAgfVxuXG5cbiAgaWYgKGFyZ3MuZGVidWcpIHtcbiAgICBjb25zb2xlLmVycm9yKCdjb21tYW5kOiAnICsgY29tbWFuZCk7XG4gICAgY29uc29sZS5lcnJvcignb3B0aW9uczogJyArIEpTT04uc3RyaW5naWZ5KGFyZ3MsIHVuZGVmaW5lZCwgMikpO1xuICB9XG5cbiAgaWYgKGNvbW1hbmQgPT09ICdsaW50Jykge1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gYXdhaXQgbG9hZE1vZHVsZSh3b3JrZGlyKTtcbiAgICBpZiAoIWFzc2VtYmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXhjbHVkZXNUb1NhdmUgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGxldCBlcnJvcnMgPSAwO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuXG4gICAgcmVzdWx0cy5wdXNoKC4uLkFMTF9SVUxFU19MSU5URVIuZXZhbChhc3NlbWJseSwge1xuICAgICAgaW5jbHVkZTogYXJncy5pbmNsdWRlLFxuICAgICAgZXhjbHVkZTogYXJncy5leGNsdWRlLFxuICAgIH0pKTtcblxuICAgIC8vIFNvcnQgZXJyb3JzIHRvIHRoZSB0b3AgKGhpZ2hlc3Qgc2V2ZXJpdHkgZmlyc3QpXG4gICAgcmVzdWx0cy5zb3J0KChhLCBiKSA9PiBiLmxldmVsIC0gYS5sZXZlbCk7XG5cbiAgICAvLyBwcm9jZXNzIHJlc3VsdHNcblxuICAgIGZvciAoY29uc3QgZGlhZyBvZiByZXN1bHRzKSB7XG4gICAgICBjb25zdCBzdXBwcmVzc2lvbktleSA9IGAke2RpYWcucnVsZS5jb2RlfToke2RpYWcuc2NvcGV9YDtcblxuICAgICAgbGV0IGNvbG9yO1xuICAgICAgc3dpdGNoIChkaWFnLmxldmVsKSB7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY0xldmVsLlN1Y2Nlc3M6XG4gICAgICAgICAgaWYgKGFyZ3MudmVyYm9zZSkge1xuICAgICAgICAgICAgY29sb3IgPSBjaGFsay5ncmF5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljTGV2ZWwuRXJyb3I6XG4gICAgICAgICAgZXJyb3JzKys7XG4gICAgICAgICAgY29sb3IgPSBjaGFsay5yZWQ7XG4gICAgICAgICAgaWYgKGFyZ3Muc2F2ZSkge1xuICAgICAgICAgICAgZXhjbHVkZXNUb1NhdmUucHVzaChzdXBwcmVzc2lvbktleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNMZXZlbC5XYXJuaW5nOlxuICAgICAgICAgIGlmICghYXJncy5xdWlldCkge1xuICAgICAgICAgICAgY29sb3IgPSBjaGFsay55ZWxsb3c7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNMZXZlbC5Ta2lwcGVkOlxuICAgICAgICAgIGlmICghYXJncy5xdWlldCkge1xuICAgICAgICAgICAgY29sb3IgPSBjaGFsay5ibHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY29sb3IoYCR7RGlhZ25vc3RpY0xldmVsW2RpYWcubGV2ZWxdLnRvTG93ZXJDYXNlKCl9OiBbJHtjaGFsay5ib2xkKGBhd3NsaW50OiR7ZGlhZy5ydWxlLmNvZGV9YCl9OiR7Y2hhbGsuYm9sZChkaWFnLnNjb3BlKX1dICR7ZGlhZy5tZXNzYWdlfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXhjbHVkZXNUb1NhdmUubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHN0YW5kbG9uZU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFzdGFuZGxvbmVPcHRpb25zLmV4Y2x1ZGUpIHtcbiAgICAgICAgICBzdGFuZGxvbmVPcHRpb25zLmV4Y2x1ZGUgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFwa2cuYXdzbGludCkge1xuICAgICAgICAgIHBrZy5hd3NsaW50ID0geyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwa2cuYXdzbGludC5leGNsdWRlKSB7XG4gICAgICAgICAgcGtnLmF3c2xpbnQuZXhjbHVkZSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4Y2x1ZGVzOiBzdHJpbmdbXSA9IHN0YW5kbG9uZU9wdGlvbnMgPyBzdGFuZGxvbmVPcHRpb25zLmV4Y2x1ZGUgOiBwa2cuYXdzbGludC5leGNsdWRlO1xuXG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGUgb2YgZXhjbHVkZXNUb1NhdmUpIHtcbiAgICAgICAgaWYgKGV4Y2x1ZGVzLmluZGV4T2YoZXhjbHVkZSkgPT09IC0xKSB7XG4gICAgICAgICAgZXhjbHVkZXMucHVzaChleGNsdWRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXhjbHVkZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoc3RhbmRsb25lT3B0aW9ucykge1xuICAgICAgICAgIC8vIElmIGF3c2xpbnQuanNvbiBleGlzdHMsIHdyaXRlIHRoZSBleGNsdWRlcyB0aGVyZSBpbnN0ZWFkIG9mIHRoZSBvbGQgcGFja2FnZS5qc29uIChsZWdhY3kgZm9ybWF0KS5cbiAgICAgICAgICBpZiAocGtnLmF3c2xpbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXhjbHVkZXMgd2lsbCBiZSB3cml0dGVuIHRvIGF3c2xpbnQuanNvbi4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgZnMud3JpdGVKU09OKGF3c2xpbnRDb25maWcsIHN0YW5kbG9uZU9wdGlvbnMsIHsgc3BhY2VzOiAyIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGZzLndyaXRlSlNPTihwa2dDb25maWcsIHBrZywgeyBzcGFjZXM6IDIgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzICYmICFhcmdzLnNhdmUpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBhcmd2LnNob3dIZWxwKCk7XG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb21tYW5kOiAke2NvbW1hbmR9YCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2hvdWxkQ29tcGlsZSgpIHtcblxuICAgIC8vIGlmIC0tY29tcGlsZSBpcyBleHBsaWNpdGx5IGVuYWJsZWQgdGhlbiBqdXN0IGNvbXBpbGUgYWx3YXlzXG4gICAgaWYgKGFyZ3MuY29tcGlsZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGF2ZSBhIC5qc2lpIGZpbGUgYW5kIHdlIGFyZSBub3QgZm9yY2VkIHRvIGNvbXBpbGUsIHRoZW4gZG9uJ3QgY29tcGlsZVxuICAgIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKHBhdGguam9pbih3b3JrZGlyLCAnLmpzaWknKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyB3ZSBkb24ndCBoYXZlIGEgLmpzaWkgZmlsZSwgYW5kIC0tbm8tY29tcGlsZSBpcyBleHBsaWNpbHkgc2V0LCB0aGVuIGl0J3MgYW4gZXJyb3JcbiAgICBpZiAoYXJncy5jb21waWxlID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyAuanNpaSBmaWxlIGFuZCAtLW5vLWNvbXBpbGUgaXMgc2V0Jyk7XG4gICAgfVxuXG4gICAgLy8gY29tcGlsZSFcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG59XG5cbm1haW4oKS5jYXRjaChlID0+IHtcbiAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZS5tZXNzYWdlKSk7XG4gIGlmIChzdGFja1RyYWNlKSB7XG4gICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcblxuYXN5bmMgZnVuY3Rpb24gbG9hZE1vZHVsZShkaXI6IHN0cmluZykge1xuICBjb25zdCB0cyA9IG5ldyByZWZsZWN0LlR5cGVTeXN0ZW0oKTtcbiAgYXdhaXQgdHMubG9hZChkaXIsIHsgdmFsaWRhdGU6IGZhbHNlIH0pOyAvLyBEb24ndCB2YWxpZGF0ZSB0byBzYXZlIDY2JSBvZiBleGVjdXRpb24gdGltZSAoMjBzIHZzIDFtaW4pLlxuICAvLyBXZSBydW4gJ2F3c2xpbnQnIGR1cmluZyBidWlsZCB0aW1lLCBhc3NlbWJsaWVzIGFyZSBndWFyYW50ZWVkIHRvIGJlIG9rLlxuXG4gIGlmICh0cy5yb290cy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyBvbmx5IGEgc2luZ2xlIHJvb3QgYXNzZW1ibHknKTtcbiAgfVxuXG4gIHJldHVybiB0cy5yb290c1swXTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKGRlc3Q6IGFueSwgcGtnPzogYW55KSB7XG4gIGlmICghcGtnKSB7IHJldHVybjsgfSAvLyBubyBvcHRpb25zIGluIHBhY2thZ2UuanNvblxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBrZykpIHtcblxuICAgIC8vIGlmIHRoaXMgaXMgYW4gYXJyYXkgb3B0aW9uLCB0aGVuIGFkZCB2YWx1ZXMgdG8gZGVzdGluYXRpb25cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGFyciA9IGRlc3Rba2V5XSB8fCBbXTtcbiAgICAgIGFyci5wdXNoKC4uLnZhbHVlKTtcbiAgICAgIGRlc3Rba2V5XSA9IGFycjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIG9iamVjdHMgYXJlIG5vdCBhbGxvd2VkXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcHRpb24gXCIke2tleX1cIiBpbiBwYWNrYWdlLmpzb246ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgIH1cblxuICAgIC8vIHByaW1pdGl2ZXMgc2ltcGx5IG92ZXJyaWRlXG4gICAgZGVzdFtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFN0YW5kYWxvbmVPcHRpb25zKGF3c2xpbnRDb25maWc6IHN0cmluZykge1xuICBpZiAoIWF3YWl0IGZzLnBhdGhFeGlzdHMoYXdzbGludENvbmZpZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcHRpb25zID0gYXdhaXQgZnMucmVhZEpTT04oYXdzbGludENvbmZpZyk7XG4gIHJldHVybiBvcHRpb25zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzaGVsbChjb21tYW5kOiBzdHJpbmcpIHtcbiAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsIFtdLCB7IHN0ZGlvOiBbJ2luaGVyaXQnLCAnaW5oZXJpdCcsICdpbmhlcml0J10gfSk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigob2ssIGtvKSA9PiB7XG4gICAgY2hpbGQub25jZSgnZXhpdCcsIChzdGF0dXM6IGFueSkgPT4ge1xuICAgICAgaWYgKHN0YXR1cyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBrbyhuZXcgRXJyb3IoYCR7Y29tbWFuZH0gZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIGtvKTtcbiAgfSk7XG59XG4iXX0=
package/bin/awslint.ts CHANGED
@@ -18,12 +18,12 @@ async function main() {
18
18
  .command('$0', 'lint the current module (default)')
19
19
  .command('list', 'list all available rules')
20
20
  .option('include', { alias: 'i', type: 'array', desc: 'evaluate only this rule(s)', default: ['*'] })
21
- .option('exclude', { alias: 'x', type: 'array', desc: 'do not evaludate these rules (takes priority over --include)', default: [] })
22
- .option('save', { type: 'boolean', desc: 'updates package.json with "exclude" statements for all failing rules', default: false })
21
+ .option('exclude', { alias: 'x', type: 'array', desc: 'do not evaluate these rules (takes priority over --include)', default: [] })
22
+ .option('save', { type: 'boolean', desc: 'updates package.json (or awslint.json if it exists) with "exclude" statements for all failing rules', default: false })
23
23
  .option('verbose', { alias: 'v', type: 'boolean', desc: 'verbose output (prints all assertions)', default: false })
24
24
  .option('quiet', { alias: 'q', type: 'boolean', desc: 'quiet mode - shows only errors', default: true })
25
25
  .option('force', { type: 'boolean', desc: 'succeed silently if this is not a jsii module', default: true })
26
- .option('config', { type: 'boolean', desc: 'reads options from the "awslint" section in package.json', default: true })
26
+ .option('config', { type: 'boolean', desc: 'reads options from "awslint.json" if it exists, and otherwise from the "awslint" section in package.json', default: true })
27
27
  .option('debug', { type: 'boolean', desc: 'debug output', default: false })
28
28
  .option('compile', { alias: 'c', type: 'boolean', desc: 'always run the jsii compiler (use "--no-compile" to never run the compiler, even if .jsii doesn\'t exist)' })
29
29
  .group('include', 'Filtering')
@@ -56,7 +56,8 @@ async function main() {
56
56
  const command = args._[0] || 'lint';
57
57
  const workdir = process.cwd();
58
58
 
59
- const config = path.join(workdir, 'package.json');
59
+ const pkgConfig = path.join(workdir, 'package.json');
60
+ const awslintConfig = path.join(workdir, 'awslint.json');
60
61
 
61
62
  if (command === 'list') {
62
63
  for (const rule of ALL_RULES_LINTER.rules) {
@@ -66,11 +67,11 @@ async function main() {
66
67
  }
67
68
 
68
69
  // if no package.json and force is true (default), just don't do anything
69
- if (!await fs.pathExists(config) && args.force) {
70
+ if (!await fs.pathExists(pkgConfig) && args.force) {
70
71
  return;
71
72
  }
72
73
 
73
- const pkg = await fs.readJSON(config);
74
+ const pkg = await fs.readJSON(pkgConfig);
74
75
 
75
76
  // if this is not a jsii module we have nothing to look for
76
77
  if (!pkg.jsii) {
@@ -87,11 +88,22 @@ async function main() {
87
88
  await shell('jsii');
88
89
  }
89
90
 
91
+ // awslint.json takes precedence over package.json for awslint options.
92
+ const standloneOptions = await readStandaloneOptions(awslintConfig);
93
+
90
94
  // read "awslint" from package.json
91
95
  if (args.config) {
92
- mergeOptions(args, pkg.awslint);
96
+ if (standloneOptions) {
97
+ if (pkg.awslint) {
98
+ console.warn('awslint options in package.json will be ignored since awslint.json exists.');
99
+ }
100
+ mergeOptions(args, standloneOptions);
101
+ } else {
102
+ mergeOptions(args, pkg.awslint);
103
+ }
93
104
  }
94
105
 
106
+
95
107
  if (args.debug) {
96
108
  console.error('command: ' + command);
97
109
  console.error('options: ' + JSON.stringify(args, undefined, 2));
@@ -153,15 +165,21 @@ async function main() {
153
165
  }
154
166
 
155
167
  if (excludesToSave.length > 0) {
156
- if (!pkg.awslint) {
157
- pkg.awslint = { };
158
- }
168
+ if (standloneOptions) {
169
+ if (!standloneOptions.exclude) {
170
+ standloneOptions.exclude = [];
171
+ }
172
+ } else {
173
+ if (!pkg.awslint) {
174
+ pkg.awslint = { };
175
+ }
159
176
 
160
- if (!pkg.awslint.exclude) {
161
- pkg.awslint.exclude = [];
177
+ if (!pkg.awslint.exclude) {
178
+ pkg.awslint.exclude = [];
179
+ }
162
180
  }
163
181
 
164
- const excludes: string[] = pkg.awslint.exclude;
182
+ const excludes: string[] = standloneOptions ? standloneOptions.exclude : pkg.awslint.exclude;
165
183
 
166
184
  for (const exclude of excludesToSave) {
167
185
  if (excludes.indexOf(exclude) === -1) {
@@ -170,7 +188,15 @@ async function main() {
170
188
  }
171
189
 
172
190
  if (excludes.length > 0) {
173
- await fs.writeJSON(config, pkg, { spaces: 2 });
191
+ if (standloneOptions) {
192
+ // If awslint.json exists, write the excludes there instead of the old package.json (legacy format).
193
+ if (pkg.awslint) {
194
+ console.warn('Excludes will be written to awslint.json.');
195
+ }
196
+ await fs.writeJSON(awslintConfig, standloneOptions, { spaces: 2 });
197
+ } else {
198
+ await fs.writeJSON(pkgConfig, pkg, { spaces: 2 });
199
+ }
174
200
  }
175
201
  }
176
202
 
@@ -252,6 +278,15 @@ function mergeOptions(dest: any, pkg?: any) {
252
278
  return dest;
253
279
  }
254
280
 
281
+ async function readStandaloneOptions(awslintConfig: string) {
282
+ if (!await fs.pathExists(awslintConfig)) {
283
+ return;
284
+ }
285
+
286
+ const options = await fs.readJSON(awslintConfig);
287
+ return options;
288
+ }
289
+
255
290
  async function shell(command: string) {
256
291
  const child = child_process.spawn(command, [], { stdio: ['inherit', 'inherit', 'inherit'] });
257
292
  return new Promise<void>((ok, ko) => {
@@ -5,9 +5,23 @@ const camelcase = require("camelcase");
5
5
  const core_types_1 = require("./core-types");
6
6
  const resource_1 = require("./resource");
7
7
  const linter_1 = require("../linter");
8
+ const cfnResourceTagName = 'cloudformationResource';
8
9
  // this linter verifies that we have L2 coverage. it finds all "Cfn" classes and verifies
9
10
  // that we have a corresponding L1 class for it that's identified as a resource.
10
11
  exports.cfnResourceLinter = new linter_1.Linter(a => CfnResourceReflection.findAll(a));
12
+ // Cache L1 constructs per type system.
13
+ const l1ConstructCache = new Map();
14
+ function cacheL1ConstructsForTypeSystem(sys) {
15
+ if (!l1ConstructCache.has(sys)) {
16
+ l1ConstructCache.set(sys, new Map());
17
+ for (const cls of sys.classes) {
18
+ const cfnResourceTag = cls.docs.customTag(cfnResourceTagName);
19
+ if (cfnResourceTag) {
20
+ l1ConstructCache.get(sys)?.set(cfnResourceTag?.toLocaleLowerCase(), cls);
21
+ }
22
+ }
23
+ }
24
+ }
11
25
  exports.cfnResourceLinter.add({
12
26
  code: 'resource-class',
13
27
  message: 'every resource must have a resource class (L2), add \'@resource %s\' to its docstring',
@@ -23,10 +37,12 @@ class CfnResourceReflection {
23
37
  * @param fullName first two components are case-insensitive (e.g. `aws::s3::Bucket` is equivalent to `Aws::S3::Bucket`)
24
38
  */
25
39
  static findByName(sys, fullName) {
26
- for (const cls of sys.classes) {
27
- if (cls.docs.customTag('cloudformationResource')?.toLocaleLowerCase() === fullName.toLocaleLowerCase()) {
28
- return new CfnResourceReflection(cls);
29
- }
40
+ if (!l1ConstructCache.has(sys)) {
41
+ cacheL1ConstructsForTypeSystem(sys);
42
+ }
43
+ const cls = l1ConstructCache.get(sys)?.get(fullName.toLowerCase());
44
+ if (cls) {
45
+ return new CfnResourceReflection(cls);
30
46
  }
31
47
  return undefined;
32
48
  }
@@ -34,17 +50,14 @@ class CfnResourceReflection {
34
50
  * Returns all CFN resource classes within an assembly.
35
51
  */
36
52
  static findAll(assembly) {
37
- return assembly.classes
53
+ return assembly.allClasses
38
54
  .filter(c => core_types_1.CoreTypes.isCfnResource(c))
39
55
  .map(c => new CfnResourceReflection(c));
40
56
  }
41
57
  constructor(cls) {
42
58
  this.classType = cls;
43
59
  this.basename = cls.name.slice('Cfn'.length);
44
- // HACK: extract full CFN name from initializer docs
45
- const initializerDoc = (cls.initializer && cls.initializer.docs.docs.summary) || '';
46
- const out = /a new `([^`]+)`/.exec(initializerDoc);
47
- const fullname = out && out[1];
60
+ const fullname = cls.docs.customTag('cloudformationResource');
48
61
  if (!fullname) {
49
62
  throw new Error(`Unable to extract CloudFormation resource name from initializer documentation of ${cls}`);
50
63
  }
@@ -65,4 +78,4 @@ class CfnResourceReflection {
65
78
  }
66
79
  }
67
80
  exports.CfnResourceReflection = CfnResourceReflection;
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2ZuLXJlc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2ZuLXJlc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUF1QztBQUV2Qyw2Q0FBeUM7QUFDekMseUNBQWdEO0FBQ2hELHNDQUFtQztBQUVuQyx5RkFBeUY7QUFDekYsZ0ZBQWdGO0FBQ25FLFFBQUEsaUJBQWlCLEdBQUcsSUFBSSxlQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVuRix5QkFBaUIsQ0FBQyxHQUFHLENBQUM7SUFDcEIsSUFBSSxFQUFFLGdCQUFnQjtJQUN0QixPQUFPLEVBQUUsdUZBQXVGO0lBQ2hHLE9BQU8sRUFBRSxJQUFJO0lBQ2IsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ1IsTUFBTSxFQUFFLEdBQUcsNkJBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0csQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsTUFBYSxxQkFBcUI7SUFDaEM7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUF1QixFQUFFLFFBQWdCO1FBQ2hFLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtZQUM3QixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtnQkFDdEcsT0FBTyxJQUFJLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZDO1NBQ0Y7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQTBCO1FBQzlDLE9BQU8sUUFBUSxDQUFDLE9BQU87YUFDcEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsc0JBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFTRCxZQUFZLEdBQXNCO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBRXJCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTdDLG9EQUFvRDtRQUNwRCxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwRixNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbkQsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxvRkFBb0YsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUM1RztRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBRXpCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3RCxJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxhQUFhO2FBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QixDQUFDO2FBQy9ELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHlCQUF5QixDQUFDLElBQUksU0FBUyxDQUFDO2FBQ2xFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRU8sZ0NBQWdDLENBQUMsSUFBWTtRQUVuRCxvRUFBb0U7UUFDcEUsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGVBQWUsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQzNELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUFqRUQsc0RBaUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2FtZWxjYXNlIGZyb20gJ2NhbWVsY2FzZSc7XG5pbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQgeyBDb3JlVHlwZXMgfSBmcm9tICcuL2NvcmUtdHlwZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VSZWZsZWN0aW9uIH0gZnJvbSAnLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBMaW50ZXIgfSBmcm9tICcuLi9saW50ZXInO1xuXG4vLyB0aGlzIGxpbnRlciB2ZXJpZmllcyB0aGF0IHdlIGhhdmUgTDIgY292ZXJhZ2UuIGl0IGZpbmRzIGFsbCBcIkNmblwiIGNsYXNzZXMgYW5kIHZlcmlmaWVzXG4vLyB0aGF0IHdlIGhhdmUgYSBjb3JyZXNwb25kaW5nIEwxIGNsYXNzIGZvciBpdCB0aGF0J3MgaWRlbnRpZmllZCBhcyBhIHJlc291cmNlLlxuZXhwb3J0IGNvbnN0IGNmblJlc291cmNlTGludGVyID0gbmV3IExpbnRlcihhID0+IENmblJlc291cmNlUmVmbGVjdGlvbi5maW5kQWxsKGEpKTtcblxuY2ZuUmVzb3VyY2VMaW50ZXIuYWRkKHtcbiAgY29kZTogJ3Jlc291cmNlLWNsYXNzJyxcbiAgbWVzc2FnZTogJ2V2ZXJ5IHJlc291cmNlIG11c3QgaGF2ZSBhIHJlc291cmNlIGNsYXNzIChMMiksIGFkZCBcXCdAcmVzb3VyY2UgJXNcXCcgdG8gaXRzIGRvY3N0cmluZycsXG4gIHdhcm5pbmc6IHRydWUsXG4gIGV2YWw6IGUgPT4ge1xuICAgIGNvbnN0IGwyID0gUmVzb3VyY2VSZWZsZWN0aW9uLmZpbmRBbGwoZS5jdHguY2xhc3NUeXBlLmFzc2VtYmx5KS5maW5kKHIgPT4gci5jZm4uZnVsbG5hbWUgPT09IGUuY3R4LmZ1bGxuYW1lKTtcbiAgICBlLmFzc2VydChsMiwgZS5jdHguZnVsbG5hbWUsIGUuY3R4LmZ1bGxuYW1lKTtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY2xhc3MgQ2ZuUmVzb3VyY2VSZWZsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEZpbmRzIGEgQ2ZuIHJlc291cmNlIGNsYXNzIGJ5IGZ1bGwgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgbmFtZSAoZS5nLiBgQVdTOjpTMzo6QnVja2V0YClcbiAgICogQHBhcmFtIGZ1bGxOYW1lIGZpcnN0IHR3byBjb21wb25lbnRzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIChlLmcuIGBhd3M6OnMzOjpCdWNrZXRgIGlzIGVxdWl2YWxlbnQgdG8gYEF3czo6UzM6OkJ1Y2tldGApXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZpbmRCeU5hbWUoc3lzOiByZWZsZWN0LlR5cGVTeXN0ZW0sIGZ1bGxOYW1lOiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IGNscyBvZiBzeXMuY2xhc3Nlcykge1xuICAgICAgaWYgKGNscy5kb2NzLmN1c3RvbVRhZygnY2xvdWRmb3JtYXRpb25SZXNvdXJjZScpPy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBmdWxsTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2ZuUmVzb3VyY2VSZWZsZWN0aW9uKGNscyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBDRk4gcmVzb3VyY2UgY2xhc3NlcyB3aXRoaW4gYW4gYXNzZW1ibHkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZpbmRBbGwoYXNzZW1ibHk6IHJlZmxlY3QuQXNzZW1ibHkpIHtcbiAgICByZXR1cm4gYXNzZW1ibHkuY2xhc3Nlc1xuICAgICAgLmZpbHRlcihjID0+IENvcmVUeXBlcy5pc0NmblJlc291cmNlKGMpKVxuICAgICAgLm1hcChjID0+IG5ldyBDZm5SZXNvdXJjZVJlZmxlY3Rpb24oYykpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGNsYXNzVHlwZTogcmVmbGVjdC5DbGFzc1R5cGU7XG4gIHB1YmxpYyByZWFkb25seSBmdWxsbmFtZTogc3RyaW5nOyAvLyBBV1M6OlMzOjpCdWNrZXRcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nOyAvLyBBV1M6OlMzXG4gIHB1YmxpYyByZWFkb25seSBiYXNlbmFtZTogc3RyaW5nOyAvLyBCdWNrZXRcbiAgcHVibGljIHJlYWRvbmx5IGF0dHJpYnV0ZU5hbWVzOiBzdHJpbmdbXTsgLy8gKG5vcm1hbGl6ZWQpIGJ1Y2tldEFybiwgYnVja2V0TmFtZSwgcXVldWVVcmxcbiAgcHVibGljIHJlYWRvbmx5IGRvYzogc3RyaW5nOyAvLyBsaW5rIHRvIENsb3VkRm9ybWF0aW9uIGRvY3NcblxuICBjb25zdHJ1Y3RvcihjbHM6IHJlZmxlY3QuQ2xhc3NUeXBlKSB7XG4gICAgdGhpcy5jbGFzc1R5cGUgPSBjbHM7XG5cbiAgICB0aGlzLmJhc2VuYW1lID0gY2xzLm5hbWUuc2xpY2UoJ0NmbicubGVuZ3RoKTtcblxuICAgIC8vIEhBQ0s6IGV4dHJhY3QgZnVsbCBDRk4gbmFtZSBmcm9tIGluaXRpYWxpemVyIGRvY3NcbiAgICBjb25zdCBpbml0aWFsaXplckRvYyA9IChjbHMuaW5pdGlhbGl6ZXIgJiYgY2xzLmluaXRpYWxpemVyLmRvY3MuZG9jcy5zdW1tYXJ5KSB8fCAnJztcbiAgICBjb25zdCBvdXQgPSAvYSBuZXcgYChbXmBdKylgLy5leGVjKGluaXRpYWxpemVyRG9jKTtcbiAgICBjb25zdCBmdWxsbmFtZSA9IG91dCAmJiBvdXRbMV07XG4gICAgaWYgKCFmdWxsbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZXh0cmFjdCBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSBuYW1lIGZyb20gaW5pdGlhbGl6ZXIgZG9jdW1lbnRhdGlvbiBvZiAke2Nsc31gKTtcbiAgICB9XG5cbiAgICB0aGlzLmZ1bGxuYW1lID0gZnVsbG5hbWU7XG5cbiAgICB0aGlzLm5hbWVzcGFjZSA9IGZ1bGxuYW1lLnNwbGl0KCc6OicpLnNsaWNlKDAsIDIpLmpvaW4oJzo6Jyk7XG5cbiAgICB0aGlzLmF0dHJpYnV0ZU5hbWVzID0gY2xzLm93blByb3BlcnRpZXNcbiAgICAgIC5maWx0ZXIocCA9PiAocC5kb2NzLmRvY3MuY3VzdG9tIHx8IHt9KS5jbG91ZGZvcm1hdGlvbkF0dHJpYnV0ZSlcbiAgICAgIC5tYXAocCA9PiBwLmRvY3MuY3VzdG9tVGFnKCdjbG91ZGZvcm1hdGlvbkF0dHJpYnV0ZScpIHx8ICc8ZXJyb3I+JylcbiAgICAgIC5tYXAocCA9PiB0aGlzLmF0dHJpYnV0ZVByb3BlcnR5TmFtZUZyb21DZm5OYW1lKHApKTtcblxuICAgIHRoaXMuZG9jID0gY2xzLmRvY3MuZG9jcy5zZWUgfHwgJyc7XG4gIH1cblxuICBwcml2YXRlIGF0dHJpYnV0ZVByb3BlcnR5TmFtZUZyb21DZm5OYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cbiAgICAvLyBzcGVjaWFsIGNhc2UgKHNvbWVvbmUgd2FzIHNtYXJ0KSwgc3BlY2lhbCBjYXNlIGNvcGllZCBmcm9tIGNmbjJ0c1xuICAgIGlmICh0aGlzLmJhc2VuYW1lID09PSAnU2VjdXJpdHlHcm91cCcgJiYgbmFtZSA9PT0gJ0dyb3VwSWQnKSB7XG4gICAgICByZXR1cm4gJ0lkJztcbiAgICB9XG5cbiAgICByZXR1cm4gY2FtZWxjYXNlKG5hbWUsIHsgcGFzY2FsQ2FzZTogdHJ1ZSB9KTtcbiAgfVxufVxuIl19
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2ZuLXJlc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2ZuLXJlc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUF1QztBQUV2Qyw2Q0FBeUM7QUFDekMseUNBQWdEO0FBQ2hELHNDQUFtQztBQUVuQyxNQUFNLGtCQUFrQixHQUFHLHdCQUF3QixDQUFDO0FBRXBELHlGQUF5RjtBQUN6RixnRkFBZ0Y7QUFDbkUsUUFBQSxpQkFBaUIsR0FBRyxJQUFJLGVBQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRW5GLHVDQUF1QztBQUN2QyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFzRCxDQUFDO0FBRXZGLFNBQVMsOEJBQThCLENBQUMsR0FBdUI7SUFDN0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUM5QixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksR0FBRyxFQUE2QixDQUFDLENBQUM7UUFFaEUsS0FBSyxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO1lBQzdCLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFFOUQsSUFBSSxjQUFjLEVBQUU7Z0JBQ2xCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsY0FBYyxFQUFFLGlCQUFpQixFQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDM0U7U0FDRjtLQUNGO0FBQ0gsQ0FBQztBQUVELHlCQUFpQixDQUFDLEdBQUcsQ0FBQztJQUNwQixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLE9BQU8sRUFBRSx1RkFBdUY7SUFDaEcsT0FBTyxFQUFFLElBQUk7SUFDYixJQUFJLEVBQUUsQ0FBQyxDQUFD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QUFDLFFBQVEsS0FBSyxlQUFlLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUMzRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBakVELHNEQWlFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNhbWVsY2FzZSBmcm9tICdjYW1lbGNhc2UnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHsgQ29yZVR5cGVzIH0gZnJvbSAnLi9jb3JlLXR5cGVzJztcbmltcG9ydCB7IFJlc291cmNlUmVmbGVjdGlvbiB9IGZyb20gJy4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgTGludGVyIH0gZnJvbSAnLi4vbGludGVyJztcblxuY29uc3QgY2ZuUmVzb3VyY2VUYWdOYW1lID0gJ2Nsb3VkZm9ybWF0aW9uUmVzb3VyY2UnO1xuXG4vLyB0aGlzIGxpbnRlciB2ZXJpZmllcyB0aGF0IHdlIGhhdmUgTDIgY292ZXJhZ2UuIGl0IGZpbmRzIGFsbCBcIkNmblwiIGNsYXNzZXMgYW5kIHZlcmlmaWVzXG4vLyB0aGF0IHdlIGhhdmUgYSBjb3JyZXNwb25kaW5nIEwxIGNsYXNzIGZvciBpdCB0aGF0J3MgaWRlbnRpZmllZCBhcyBhIHJlc291cmNlLlxuZXhwb3J0IGNvbnN0IGNmblJlc291cmNlTGludGVyID0gbmV3IExpbnRlcihhID0+IENmblJlc291cmNlUmVmbGVjdGlvbi5maW5kQWxsKGEpKTtcblxuLy8gQ2FjaGUgTDEgY29uc3RydWN0cyBwZXIgdHlwZSBzeXN0ZW0uXG5jb25zdCBsMUNvbnN0cnVjdENhY2hlID0gbmV3IE1hcDxyZWZsZWN0LlR5cGVTeXN0ZW0sIE1hcDxzdHJpbmcsIHJlZmxlY3QuQ2xhc3NUeXBlPj4oKTtcblxuZnVuY3Rpb24gY2FjaGVMMUNvbnN0cnVjdHNGb3JUeXBlU3lzdGVtKHN5czogcmVmbGVjdC5UeXBlU3lzdGVtKSB7XG4gIGlmICghbDFDb25zdHJ1Y3RDYWNoZS5oYXMoc3lzKSkge1xuICAgIGwxQ29uc3RydWN0Q2FjaGUuc2V0KHN5cywgbmV3IE1hcDxzdHJpbmcsIHJlZmxlY3QuQ2xhc3NUeXBlPigpKTtcblxuICAgIGZvciAoY29uc3QgY2xzIG9mIHN5cy5jbGFzc2VzKSB7XG4gICAgICBjb25zdCBjZm5SZXNvdXJjZVRhZyA9IGNscy5kb2NzLmN1c3RvbVRhZyhjZm5SZXNvdXJjZVRhZ05hbWUpO1xuXG4gICAgICBpZiAoY2ZuUmVzb3VyY2VUYWcpIHtcbiAgICAgICAgbDFDb25zdHJ1Y3RDYWNoZS5nZXQoc3lzKT8uc2V0KGNmblJlc291cmNlVGFnPy50b0xvY2FsZUxvd2VyQ2FzZSgpISwgY2xzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY2ZuUmVzb3VyY2VMaW50ZXIuYWRkKHtcbiAgY29kZTogJ3Jlc291cmNlLWNsYXNzJyxcbiAgbWVzc2FnZTogJ2V2ZXJ5IHJlc291cmNlIG11c3QgaGF2ZSBhIHJlc291cmNlIGNsYXNzIChMMiksIGFkZCBcXCdAcmVzb3VyY2UgJXNcXCcgdG8gaXRzIGRvY3N0cmluZycsXG4gIHdhcm5pbmc6IHRydWUsXG4gIGV2YWw6IGUgPT4ge1xuICAgIGNvbnN0IGwyID0gUmVzb3VyY2VSZWZsZWN0aW9uLmZpbmRBbGwoZS5jdHguY2xhc3NUeXBlLmFzc2VtYmx5KS5maW5kKHIgPT4gci5jZm4uZnVsbG5hbWUgPT09IGUuY3R4LmZ1bGxuYW1lKTtcbiAgICBlLmFzc2VydChsMiwgZS5jdHguZnVsbG5hbWUsIGUuY3R4LmZ1bGxuYW1lKTtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY2xhc3MgQ2ZuUmVzb3VyY2VSZWZsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEZpbmRzIGEgQ2ZuIHJlc291cmNlIGNsYXNzIGJ5IGZ1bGwgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgbmFtZSAoZS5nLiBgQVdTOjpTMzo6QnVja2V0YClcbiAgICogQHBhcmFtIGZ1bGxOYW1lIGZpcnN0IHR3byBjb21wb25lbnRzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIChlLmcuIGBhd3M6OnMzOjpCdWNrZXRgIGlzIGVxdWl2YWxlbnQgdG8gYEF3czo6UzM6OkJ1Y2tldGApXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZpbmRCeU5hbWUoc3lzOiByZWZsZWN0LlR5cGVTeXN0ZW0sIGZ1bGxOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIWwxQ29uc3RydWN0Q2FjaGUuaGFzKHN5cykpIHtcbiAgICAgIGNhY2hlTDFDb25zdHJ1Y3RzRm9yVHlwZVN5c3RlbShzeXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGNscyA9IGwxQ29uc3RydWN0Q2FjaGUuZ2V0KHN5cyk/LmdldChmdWxsTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoY2xzKSB7XG4gICAgICByZXR1cm4gbmV3IENmblJlc291cmNlUmVmbGVjdGlvbihjbHMpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgQ0ZOIHJlc291cmNlIGNsYXNzZXMgd2l0aGluIGFuIGFzc2VtYmx5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmaW5kQWxsKGFzc2VtYmx5OiByZWZsZWN0LkFzc2VtYmx5KSB7XG4gICAgcmV0dXJuIGFzc2VtYmx5LmFsbENsYXNzZXNcbiAgICAgIC5maWx0ZXIoYyA9PiBDb3JlVHlwZXMuaXNDZm5SZXNvdXJjZShjKSlcbiAgICAgIC5tYXAoYyA9PiBuZXcgQ2ZuUmVzb3VyY2VSZWZsZWN0aW9uKGMpKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBjbGFzc1R5cGU6IHJlZmxlY3QuQ2xhc3NUeXBlO1xuICBwdWJsaWMgcmVhZG9ubHkgZnVsbG5hbWU6IHN0cmluZzsgLy8gQVdTOjpTMzo6QnVja2V0XG4gIHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZzsgLy8gQVdTOjpTM1xuICBwdWJsaWMgcmVhZG9ubHkgYmFzZW5hbWU6IHN0cmluZzsgLy8gQnVja2V0XG4gIHB1YmxpYyByZWFkb25seSBhdHRyaWJ1dGVOYW1lczogc3RyaW5nW107IC8vIChub3JtYWxpemVkKSBidWNrZXRBcm4sIGJ1Y2tldE5hbWUsIHF1ZXVlVXJsXG4gIHB1YmxpYyByZWFkb25seSBkb2M6IHN0cmluZzsgLy8gbGluayB0byBDbG91ZEZvcm1hdGlvbiBkb2NzXG5cbiAgY29uc3RydWN0b3IoY2xzOiByZWZsZWN0LkNsYXNzVHlwZSkge1xuICAgIHRoaXMuY2xhc3NUeXBlID0gY2xzO1xuXG4gICAgdGhpcy5iYXNlbmFtZSA9IGNscy5uYW1lLnNsaWNlKCdDZm4nLmxlbmd0aCk7XG5cbiAgICBjb25zdCBmdWxsbmFtZSA9IGNscy5kb2NzLmN1c3RvbVRhZygnY2xvdWRmb3JtYXRpb25SZXNvdXJjZScpO1xuICAgIGlmICghZnVsbG5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGV4dHJhY3QgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgbmFtZSBmcm9tIGluaXRpYWxpemVyIGRvY3VtZW50YXRpb24gb2YgJHtjbHN9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5mdWxsbmFtZSA9IGZ1bGxuYW1lO1xuXG4gICAgdGhpcy5uYW1lc3BhY2UgPSBmdWxsbmFtZS5zcGxpdCgnOjonKS5zbGljZSgwLCAyKS5qb2luKCc6OicpO1xuXG4gICAgdGhpcy5hdHRyaWJ1dGVOYW1lcyA9IGNscy5vd25Qcm9wZXJ0aWVzXG4gICAgICAuZmlsdGVyKHAgPT4gKHAuZG9jcy5kb2NzLmN1c3RvbSB8fCB7fSkuY2xvdWRmb3JtYXRpb25BdHRyaWJ1dGUpXG4gICAgICAubWFwKHAgPT4gcC5kb2NzLmN1c3RvbVRhZygnY2xvdWRmb3JtYXRpb25BdHRyaWJ1dGUnKSB8fCAnPGVycm9yPicpXG4gICAgICAubWFwKHAgPT4gdGhpcy5hdHRyaWJ1dGVQcm9wZXJ0eU5hbWVGcm9tQ2ZuTmFtZShwKSk7XG5cbiAgICB0aGlzLmRvYyA9IGNscy5kb2NzLmRvY3Muc2VlIHx8ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBhdHRyaWJ1dGVQcm9wZXJ0eU5hbWVGcm9tQ2ZuTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXG4gICAgLy8gc3BlY2lhbCBjYXNlIChzb21lb25lIHdhcyBzbWFydCksIHNwZWNpYWwgY2FzZSBjb3BpZWQgZnJvbSBjZm4ydHNcbiAgICBpZiAodGhpcy5iYXNlbmFtZSA9PT0gJ1NlY3VyaXR5R3JvdXAnICYmIG5hbWUgPT09ICdHcm91cElkJykge1xuICAgICAgcmV0dXJuICdJZCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbWVsY2FzZShuYW1lLCB7IHBhc2NhbENhc2U6IHRydWUgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -4,10 +4,29 @@ import { CoreTypes } from './core-types';
4
4
  import { ResourceReflection } from './resource';
5
5
  import { Linter } from '../linter';
6
6
 
7
+ const cfnResourceTagName = 'cloudformationResource';
8
+
7
9
  // this linter verifies that we have L2 coverage. it finds all "Cfn" classes and verifies
8
10
  // that we have a corresponding L1 class for it that's identified as a resource.
9
11
  export const cfnResourceLinter = new Linter(a => CfnResourceReflection.findAll(a));
10
12
 
13
+ // Cache L1 constructs per type system.
14
+ const l1ConstructCache = new Map<reflect.TypeSystem, Map<string, reflect.ClassType>>();
15
+
16
+ function cacheL1ConstructsForTypeSystem(sys: reflect.TypeSystem) {
17
+ if (!l1ConstructCache.has(sys)) {
18
+ l1ConstructCache.set(sys, new Map<string, reflect.ClassType>());
19
+
20
+ for (const cls of sys.classes) {
21
+ const cfnResourceTag = cls.docs.customTag(cfnResourceTagName);
22
+
23
+ if (cfnResourceTag) {
24
+ l1ConstructCache.get(sys)?.set(cfnResourceTag?.toLocaleLowerCase()!, cls);
25
+ }
26
+ }
27
+ }
28
+ }
29
+
11
30
  cfnResourceLinter.add({
12
31
  code: 'resource-class',
13
32
  message: 'every resource must have a resource class (L2), add \'@resource %s\' to its docstring',
@@ -24,10 +43,13 @@ export class CfnResourceReflection {
24
43
  * @param fullName first two components are case-insensitive (e.g. `aws::s3::Bucket` is equivalent to `Aws::S3::Bucket`)
25
44
  */
26
45
  public static findByName(sys: reflect.TypeSystem, fullName: string) {
27
- for (const cls of sys.classes) {
28
- if (cls.docs.customTag('cloudformationResource')?.toLocaleLowerCase() === fullName.toLocaleLowerCase()) {
29
- return new CfnResourceReflection(cls);
30
- }
46
+ if (!l1ConstructCache.has(sys)) {
47
+ cacheL1ConstructsForTypeSystem(sys);
48
+ }
49
+
50
+ const cls = l1ConstructCache.get(sys)?.get(fullName.toLowerCase());
51
+ if (cls) {
52
+ return new CfnResourceReflection(cls);
31
53
  }
32
54
 
33
55
  return undefined;
@@ -37,7 +59,7 @@ export class CfnResourceReflection {
37
59
  * Returns all CFN resource classes within an assembly.
38
60
  */
39
61
  public static findAll(assembly: reflect.Assembly) {
40
- return assembly.classes
62
+ return assembly.allClasses
41
63
  .filter(c => CoreTypes.isCfnResource(c))
42
64
  .map(c => new CfnResourceReflection(c));
43
65
  }
@@ -54,10 +76,7 @@ export class CfnResourceReflection {
54
76
 
55
77
  this.basename = cls.name.slice('Cfn'.length);
56
78
 
57
- // HACK: extract full CFN name from initializer docs
58
- const initializerDoc = (cls.initializer && cls.initializer.docs.docs.summary) || '';
59
- const out = /a new `([^`]+)`/.exec(initializerDoc);
60
- const fullname = out && out[1];
79
+ const fullname = cls.docs.customTag('cloudformationResource');
61
80
  if (!fullname) {
62
81
  throw new Error(`Unable to extract CloudFormation resource name from initializer documentation of ${cls}`);
63
82
  }
@@ -16,8 +16,8 @@ class EventsReflection extends construct_1.ConstructReflection {
16
16
  }
17
17
  }
18
18
  exports.EventsReflection = EventsReflection;
19
- const ON_EVENT_OPTIONS_FQN = '@aws-cdk/aws-events.OnEventOptions';
20
- const EVENT_RULE_FQN = '@aws-cdk/aws-events.Rule';
19
+ const ON_EVENT_OPTIONS_FQN = 'aws-cdk-lib.aws_events.OnEventOptions';
20
+ const EVENT_RULE_FQN = 'aws-cdk-lib.aws_events.Rule';
21
21
  exports.eventsLinter.add({
22
22
  code: 'events-in-interface',
23
23
  message: '\'onXxx()\' methods should also be defined on construct interface',
@@ -66,4 +66,4 @@ function isDirectEventMethod(m) {
66
66
  function isCloudTrailEventMethod(m) {
67
67
  return m.name.startsWith('onCloudTrail');
68
68
  }
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWR3YXRjaC1ldmVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbG91ZHdhdGNoLWV2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwyQ0FBa0Q7QUFDbEQsNkNBQXlDO0FBQ3pDLHNDQUFtQztBQUV0QixRQUFBLFlBQVksR0FBRyxJQUFJLGVBQU0sQ0FBbUIsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTztLQUNsRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxzQkFBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXRELE1BQWEsZ0JBQWlCLFNBQVEsK0JBQW1CO0lBQ3ZELElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDbkUsQ0FBQztDQUNGO0FBUkQsNENBUUM7QUFFRCxNQUFNLG9CQUFvQixHQUFHLG9DQUFvQyxDQUFDO0FBQ2xFLE1BQU0sY0FBYyxHQUFHLDBCQUEwQixDQUFDO0FBRWxELG9CQUFZLENBQUMsR0FBRyxDQUFDO0lBQ2YsSUFBSSxFQUFFLHFCQUFxQjtJQUMzQixPQUFPLEVBQUUsbUVBQW1FO0lBQzVFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRTtRQUNSLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQ2xG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b3J0IHsgQ29uc3RydWN0UmVmbGVjdGlvbiB9IGZyb20gJy4vY29uc3RydWN0JztcbmltcG9ydCB7IENvcmVUeXBlcyB9IGZyb20gJy4vY29yZS10eXBlcyc7XG5pbXBvcnQgeyBMaW50ZXIgfSBmcm9tICcuLi9saW50ZXInO1xuXG5leHBvcnQgY29uc3QgZXZlbnRzTGludGVyID0gbmV3IExpbnRlcjxFdmVudHNSZWZsZWN0aW9uPihhc3NlbWJseSA9PiBhc3NlbWJseS5jbGFzc2VzXG4gIC5maWx0ZXIodCA9PiBDb3JlVHlwZXMuaXNDb25zdHJ1Y3RDbGFzcyh0KSlcbiAgLm1hcChjb25zdHJ1Y3QgPT4gbmV3IEV2ZW50c1JlZmxlY3Rpb24oY29uc3RydWN0KSkpO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRzUmVmbGVjdGlvbiBleHRlbmRzIENvbnN0cnVjdFJlZmxlY3Rpb24ge1xuICBwdWJsaWMgZ2V0IGRpcmVjdEV2ZW50TWV0aG9kcygpIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc1R5cGUuYWxsTWV0aG9kcy5maWx0ZXIoaXNEaXJlY3RFdmVudE1ldGhvZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNsb3VkVHJhaWxFdmVudE1ldGhvZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NUeXBlLmFsbE1ldGhvZHMuZmlsdGVyKGlzQ2xvdWRUcmFpbEV2ZW50TWV0aG9kKTtcbiAgfVxufVxuXG5jb25zdCBPTl9FVkVOVF9PUFRJT05TX0ZRTiA9ICdAYXdzLWNkay9hd3MtZXZlbnRzLk9uRXZlbnRPcHRpb25zJztcbmNvbnN0IEVWRU5UX1JVTEVfRlFOID0gJ0Bhd3MtY2RrL2F3cy1ldmVudHMuUnVsZSc7XG5cbmV2ZW50c0xpbnRlci5hZGQoe1xuICBjb2RlOiAnZXZlbnRzLWluLWludGVyZmFjZScsXG4gIG1lc3NhZ2U6ICdcXCdvblh4eCgpXFwnIG1ldGhvZHMgc2hvdWxkIGFsc28gYmUgZGVmaW5lZCBvbiBjb25zdHJ1Y3QgaW50ZXJmYWNlJyxcbiAgZXZhbDogZSA9PiB7XG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgZS5jdHguZGlyZWN0RXZlbnRNZXRob2RzLmNvbmNhdChlLmN0eC5jbG91ZFRyYWlsRXZlbnRNZXRob2RzKSkge1xuICAgICAgZS5hc3NlcnQoIWUuY3R4LmludGVyZmFjZVR5cGUgfHwgZS5jdHguaW50ZXJmYWNlVHlwZS5hbGxNZXRob2RzLmZpbHRlcihtID0+ICFtLnByb3RlY3RlZCkuc29tZShtID0+IG0ubmFtZSA9PT0gbWV0aG9kLm5hbWUpLCBgJHtlLmN0eC5mcW59LiR7bWV0aG9kLm5hbWV9YCk7XG4gICAgfVxuICB9LFxufSk7XG5cbmV2ZW50c0xpbnRlci5hZGQoe1xuICBjb2RlOiAnZXZlbnRzLWdlbmVyaWMnLFxuICBtZXNzYWdlOiAnaWYgdGhlcmUgYXJlIHNwZWNpZmljIFxcJ29uWHh4KClcXCcgbWV0aG9kcywgdGhlcmUgc2hvdWxkIGFsc28gYmUgYSBnZW5lcmljIFxcJ29uRXZlbnQoKVxcJyBtZXRob2QnLFxuICBldmFsOiBlID0+IHtcbiAgICBlLmFzc2VydChlLmN0eC5kaXJlY3RFdmVudE1ldGhvZHMubGVuZ3RoID09PSAwIHx8IGUuY3R4LmNsYXNzVHlwZS5hbGxNZXRob2RzLnNvbWUobSA9PiBtLm5hbWUgPT09ICdvbkV2ZW50JyksIGUuY3R4LmZxbik7XG4gIH0sXG59KTtcblxuZXZlbnRzTGludGVyLmFkZCh7XG4gIGNvZGU6ICdldmVudHMtZ2VuZXJpYy1jbG91ZHRyYWlsJyxcbiAgbWVzc2FnZTogJ2lmIHRoZXJlIGFyZSBzcGVjaWZpYyBcXCdvbkNsb3VkVHJhaWxYeHgoKVxcJyBtZXRob2RzLCB0aGVyZSBzaG91bGQgYWxzbyBiZSBhIGdlbmVyaWMgXFwnb25DbG91ZFRyYWlsRXZlbnQoKVxcJyBtZXRob2QnLFxuICBldmFsOiBlID0+IHtcbiAgICBlLmFzc2VydChlLmN0eC5jbG91ZFRyYWlsRXZlbnRNZXRob2RzLmxlbmd0aCA9PT0gMCB8fCBlLmN0eC5jbGFzc1R5cGUuYWxsTWV0aG9kcy5zb21lKG0gPT4gbS5uYW1lID09PSAnb25DbG91ZFRyYWlsRXZlbnQnKSwgZS5jdHguZnFuKTtcbiAgfSxcbn0pO1xuXG5ldmVudHNMaW50ZXIuYWRkKHtcbiAgY29kZTogJ2V2ZW50cy1tZXRob2Qtc2lnbmF0dXJlJyxcbiAgbWVzc2FnZTogJ2FsbCBcXCdvblh4eCgpXFwnIG1ldGhvZHMgc2hvdWxkIGhhdmUgdGhlIENsb3VkV2F0Y2ggRXZlbnRzIHNpZ25hdHVyZSAoaWQ6IHN0cmluZywgb3B0aW9uczogZXZlbnRzLk9uRXZlbnRPcHRpb25zID0ge30pID0+IGV2ZW50cy5SdWxlJyxcbiAgZXZhbDogZSA9PiB7XG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgZS5jdHguZGlyZWN0RXZlbnRNZXRob2RzKSB7XG4gICAgICAvLyBnaXZlIHNsYWNrIHRvIHByb3RlY3RlZCBtZXRob2RzIGxpa2UgXCJvblN5bnRoZXNpemVcIiwgXCJvblByZXBhcmVcIiwgLi4uXG4gICAgICBpZiAobWV0aG9kLnByb3RlY3RlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGUuYXNzZXJ0U2lnbmF0dXJlKG1ldGhvZCwge1xuICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgIHsgdHlwZTogT05fRVZFTlRfT1BUSU9OU19GUU4sIHN1YnR5cGVBbGxvd2VkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9LFxuICAgICAgICBdLFxuICAgICAgICByZXR1cm5zOiBFVkVOVF9SVUxFX0ZRTixcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbn0pO1xuXG5mdW5jdGlvbiBpc0RpcmVjdEV2ZW50TWV0aG9kKG06IHJlZmxlY3QuTWV0aG9kKSB7XG4gIHJldHVybiAhbS5wcm90ZWN0ZWQgJiYgbS5uYW1lLnN0YXJ0c1dpdGgoJ29uJykgJiYgISBtLm5hbWUuc3RhcnRzV2l0aCgnb25DbG91ZFRyYWlsJyk7XG59XG5cbmZ1bmN0aW9uIGlzQ2xvdWRUcmFpbEV2ZW50TWV0aG9kKG06IHJlZmxlY3QuTWV0aG9kKSB7XG4gIHJldHVybiBtLm5hbWUuc3RhcnRzV2l0aCgnb25DbG91ZFRyYWlsJyk7XG59XG4iXX0=
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWR3YXRjaC1ldmVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbG91ZHdhdGNoLWV2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwyQ0FBa0Q7QUFDbEQsNkNBQXlDO0FBQ3pDLHNDQUFtQztBQUV0QixRQUFBLFlBQVksR0FBRyxJQUFJLGVBQU0sQ0FBbUIsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTztLQUNsRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxzQkFBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXRELE1BQWEsZ0JBQWlCLFNBQVEsK0JBQW1CO0lBQ3ZELElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDbkUsQ0FBQztDQUNGO0FBUkQsNENBUUM7QUFFRCxNQUFNLG9CQUFvQixHQUFHLHVDQUF1QyxDQUFDO0FBQ3JFLE1BQU0sY0FBYyxHQUFHLDZCQUE2QixDQUFDO0FBRXJELG9CQUFZLENBQUMsR0FBRyxDQUFDO0lBQ2YsSUFBSSxFQUFFLHFCQUFxQjtJQUMzQixPQUFPLEVBQUUsbUVBQW1FO0lBQzVFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRTtRQUNSLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQ2xG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b3J0IHsgQ29uc3RydWN0UmVmbGVjdGlvbiB9IGZyb20gJy4vY29uc3RydWN0JztcbmltcG9ydCB7IENvcmVUeXBlcyB9IGZyb20gJy4vY29yZS10eXBlcyc7XG5pbXBvcnQgeyBMaW50ZXIgfSBmcm9tICcuLi9saW50ZXInO1xuXG5leHBvcnQgY29uc3QgZXZlbnRzTGludGVyID0gbmV3IExpbnRlcjxFdmVudHNSZWZsZWN0aW9uPihhc3NlbWJseSA9PiBhc3NlbWJseS5jbGFzc2VzXG4gIC5maWx0ZXIodCA9PiBDb3JlVHlwZXMuaXNDb25zdHJ1Y3RDbGFzcyh0KSlcbiAgLm1hcChjb25zdHJ1Y3QgPT4gbmV3IEV2ZW50c1JlZmxlY3Rpb24oY29uc3RydWN0KSkpO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRzUmVmbGVjdGlvbiBleHRlbmRzIENvbnN0cnVjdFJlZmxlY3Rpb24ge1xuICBwdWJsaWMgZ2V0IGRpcmVjdEV2ZW50TWV0aG9kcygpIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc1R5cGUuYWxsTWV0aG9kcy5maWx0ZXIoaXNEaXJlY3RFdmVudE1ldGhvZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNsb3VkVHJhaWxFdmVudE1ldGhvZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NUeXBlLmFsbE1ldGhvZHMuZmlsdGVyKGlzQ2xvdWRUcmFpbEV2ZW50TWV0aG9kKTtcbiAgfVxufVxuXG5jb25zdCBPTl9FVkVOVF9PUFRJT05TX0ZRTiA9ICdhd3MtY2RrLWxpYi5hd3NfZXZlbnRzLk9uRXZlbnRPcHRpb25zJztcbmNvbnN0IEVWRU5UX1JVTEVfRlFOID0gJ2F3cy1jZGstbGliLmF3c19ldmVudHMuUnVsZSc7XG5cbmV2ZW50c0xpbnRlci5hZGQoe1xuICBjb2RlOiAnZXZlbnRzLWluLWludGVyZmFjZScsXG4gIG1lc3NhZ2U6ICdcXCdvblh4eCgpXFwnIG1ldGhvZHMgc2hvdWxkIGFsc28gYmUgZGVmaW5lZCBvbiBjb25zdHJ1Y3QgaW50ZXJmYWNlJyxcbiAgZXZhbDogZSA9PiB7XG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgZS5jdHguZGlyZWN0RXZlbnRNZXRob2RzLmNvbmNhdChlLmN0eC5jbG91ZFRyYWlsRXZlbnRNZXRob2RzKSkge1xuICAgICAgZS5hc3NlcnQoIWUuY3R4LmludGVyZmFjZVR5cGUgfHwgZS5jdHguaW50ZXJmYWNlVHlwZS5hbGxNZXRob2RzLmZpbHRlcihtID0+ICFtLnByb3RlY3RlZCkuc29tZShtID0+IG0ubmFtZSA9PT0gbWV0aG9kLm5hbWUpLCBgJHtlLmN0eC5mcW59LiR7bWV0aG9kLm5hbWV9YCk7XG4gICAgfVxuICB9LFxufSk7XG5cbmV2ZW50c0xpbnRlci5hZGQoe1xuICBjb2RlOiAnZXZlbnRzLWdlbmVyaWMnLFxuICBtZXNzYWdlOiAnaWYgdGhlcmUgYXJlIHNwZWNpZmljIFxcJ29uWHh4KClcXCcgbWV0aG9kcywgdGhlcmUgc2hvdWxkIGFsc28gYmUgYSBnZW5lcmljIFxcJ29uRXZlbnQoKVxcJyBtZXRob2QnLFxuICBldmFsOiBlID0+IHtcbiAgICBlLmFzc2VydChlLmN0eC5kaXJlY3RFdmVudE1ldGhvZHMubGVuZ3RoID09PSAwIHx8IGUuY3R4LmNsYXNzVHlwZS5hbGxNZXRob2RzLnNvbWUobSA9PiBtLm5hbWUgPT09ICdvbkV2ZW50JyksIGUuY3R4LmZxbik7XG4gIH0sXG59KTtcblxuZXZlbnRzTGludGVyLmFkZCh7XG4gIGNvZGU6ICdldmVudHMtZ2VuZXJpYy1jbG91ZHRyYWlsJyxcbiAgbWVzc2FnZTogJ2lmIHRoZXJlIGFyZSBzcGVjaWZpYyBcXCdvbkNsb3VkVHJhaWxYeHgoKVxcJyBtZXRob2RzLCB0aGVyZSBzaG91bGQgYWxzbyBiZSBhIGdlbmVyaWMgXFwnb25DbG91ZFRyYWlsRXZlbnQoKVxcJyBtZXRob2QnLFxuICBldmFsOiBlID0+IHtcbiAgICBlLmFzc2VydChlLmN0eC5jbG91ZFRyYWlsRXZlbnRNZXRob2RzLmxlbmd0aCA9PT0gMCB8fCBlLmN0eC5jbGFzc1R5cGUuYWxsTWV0aG9kcy5zb21lKG0gPT4gbS5uYW1lID09PSAnb25DbG91ZFRyYWlsRXZlbnQnKSwgZS5jdHguZnFuKTtcbiAgfSxcbn0pO1xuXG5ldmVudHNMaW50ZXIuYWRkKHtcbiAgY29kZTogJ2V2ZW50cy1tZXRob2Qtc2lnbmF0dXJlJyxcbiAgbWVzc2FnZTogJ2FsbCBcXCdvblh4eCgpXFwnIG1ldGhvZHMgc2hvdWxkIGhhdmUgdGhlIENsb3VkV2F0Y2ggRXZlbnRzIHNpZ25hdHVyZSAoaWQ6IHN0cmluZywgb3B0aW9uczogZXZlbnRzLk9uRXZlbnRPcHRpb25zID0ge30pID0+IGV2ZW50cy5SdWxlJyxcbiAgZXZhbDogZSA9PiB7XG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgZS5jdHguZGlyZWN0RXZlbnRNZXRob2RzKSB7XG4gICAgICAvLyBnaXZlIHNsYWNrIHRvIHByb3RlY3RlZCBtZXRob2RzIGxpa2UgXCJvblN5bnRoZXNpemVcIiwgXCJvblByZXBhcmVcIiwgLi4uXG4gICAgICBpZiAobWV0aG9kLnByb3RlY3RlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGUuYXNzZXJ0U2lnbmF0dXJlKG1ldGhvZCwge1xuICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgIHsgdHlwZTogT05fRVZFTlRfT1BUSU9OU19GUU4sIHN1YnR5cGVBbGxvd2VkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9LFxuICAgICAgICBdLFxuICAgICAgICByZXR1cm5zOiBFVkVOVF9SVUxFX0ZRTixcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbn0pO1xuXG5mdW5jdGlvbiBpc0RpcmVjdEV2ZW50TWV0aG9kKG06IHJlZmxlY3QuTWV0aG9kKSB7XG4gIHJldHVybiAhbS5wcm90ZWN0ZWQgJiYgbS5uYW1lLnN0YXJ0c1dpdGgoJ29uJykgJiYgISBtLm5hbWUuc3RhcnRzV2l0aCgnb25DbG91ZFRyYWlsJyk7XG59XG5cbmZ1bmN0aW9uIGlzQ2xvdWRUcmFpbEV2ZW50TWV0aG9kKG06IHJlZmxlY3QuTWV0aG9kKSB7XG4gIHJldHVybiBtLm5hbWUuc3RhcnRzV2l0aCgnb25DbG91ZFRyYWlsJyk7XG59XG4iXX0=
@@ -17,8 +17,8 @@ export class EventsReflection extends ConstructReflection {
17
17
  }
18
18
  }
19
19
 
20
- const ON_EVENT_OPTIONS_FQN = '@aws-cdk/aws-events.OnEventOptions';
21
- const EVENT_RULE_FQN = '@aws-cdk/aws-events.Rule';
20
+ const ON_EVENT_OPTIONS_FQN = 'aws-cdk-lib.aws_events.OnEventOptions';
21
+ const EVENT_RULE_FQN = 'aws-cdk-lib.aws_events.Rule';
22
22
 
23
23
  eventsLinter.add({
24
24
  code: 'events-in-interface',
@@ -20,6 +20,7 @@ export declare class ConstructReflection {
20
20
  readonly sys: reflect.TypeSystem;
21
21
  readonly core: CoreTypes;
22
22
  constructor(classType: reflect.ClassType);
23
+ private typePrefix;
23
24
  private tryFindInterface;
24
25
  private tryFindProps;
25
26
  }