@cdktn/provider-generator 0.24.0-pre.61 → 0.24.0-pre.62

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider-source-matching.test.d.ts.map
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // Copyright (c) HashiCorp, Inc
4
+ // SPDX-License-Identifier: MPL-2.0
5
+ const commons_1 = require("@cdktn/commons");
6
+ const codemaker_1 = require("codemaker");
7
+ const provider_generator_1 = require("../../generator/provider-generator");
8
+ // Builds a minimal provider schema keyed by a single FQPN. The provider body is
9
+ // intentionally empty (like the empty-provider-resources fixture) since these
10
+ // tests only exercise the schema-key <-> target-source matching logic.
11
+ const schemaWithKey = (fqpn) => ({
12
+ provider_schemas: {
13
+ [fqpn]: { resource_schemas: null },
14
+ },
15
+ provider_versions: {
16
+ [fqpn]: "1.84.0",
17
+ },
18
+ });
19
+ const targetForSource = (source) => new commons_1.ConstructsMakerProviderTarget(new commons_1.TerraformProviderConstraint(`${source}@1.84.0`), commons_1.Language.TYPESCRIPT);
20
+ const generateFor = (schemaKey, source) => {
21
+ const generator = new provider_generator_1.TerraformProviderGenerator(new codemaker_1.CodeMaker(), schemaWithKey(schemaKey));
22
+ generator.generate(targetForSource(source));
23
+ return generator;
24
+ };
25
+ describe("provider source matching against schema keys", () => {
26
+ it("matches a shorthand source against an OpenTofu registry schema key", () => {
27
+ // Regression test for #216: `tofu providers schema` returns keys under
28
+ // registry.opentofu.org, so a shorthand source must not assume
29
+ // registry.terraform.io.
30
+ const generator = generateFor("registry.opentofu.org/hashicorp/awscc", "hashicorp/awscc");
31
+ expect(Object.keys(generator.versions)).toContain("registry.opentofu.org/hashicorp/awscc");
32
+ });
33
+ it("matches a shorthand source against a Terraform registry schema key", () => {
34
+ const generator = generateFor("registry.terraform.io/hashicorp/awscc", "hashicorp/awscc");
35
+ expect(Object.keys(generator.versions)).toContain("registry.terraform.io/hashicorp/awscc");
36
+ });
37
+ it("keeps an explicit hostname strict and does not cross registries", () => {
38
+ expect(() => generateFor("registry.opentofu.org/hashicorp/awscc", "registry.terraform.io/hashicorp/awscc")).toThrow(/Could not find provider with constraint/);
39
+ });
40
+ it("matches an explicit hostname when it agrees with the schema key", () => {
41
+ const generator = generateFor("registry.opentofu.org/hashicorp/awscc", "registry.opentofu.org/hashicorp/awscc");
42
+ expect(Object.keys(generator.versions)).toContain("registry.opentofu.org/hashicorp/awscc");
43
+ });
44
+ });
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItc291cmNlLW1hdGNoaW5nLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ2V0L19fdGVzdHNfXy9nZW5lcmF0b3IvcHJvdmlkZXItc291cmNlLW1hdGNoaW5nLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLDRDQUt3QjtBQUN4Qix5Q0FBc0M7QUFDdEMsMkVBQWdGO0FBRWhGLGdGQUFnRjtBQUNoRiw4RUFBOEU7QUFDOUUsdUVBQXVFO0FBQ3ZFLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBWSxFQUFrQixFQUFFLENBQUMsQ0FBQztJQUN2RCxnQkFBZ0IsRUFBRTtRQUNoQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFTO0tBQzFDO0lBQ0QsaUJBQWlCLEVBQUU7UUFDakIsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRO0tBQ2pCO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsTUFBTSxlQUFlLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUN6QyxJQUFJLHVDQUE2QixDQUMvQixJQUFJLHFDQUEyQixDQUFDLEdBQUcsTUFBTSxTQUFTLENBQUMsRUFDbkQsa0JBQVEsQ0FBQyxVQUFVLENBQ3BCLENBQUM7QUFFSixNQUFNLFdBQVcsR0FBRyxDQUFDLFNBQWlCLEVBQUUsTUFBYyxFQUFFLEVBQUU7SUFDeEQsTUFBTSxTQUFTLEdBQUcsSUFBSSwrQ0FBMEIsQ0FDOUMsSUFBSSxxQkFBUyxFQUFFLEVBQ2YsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUN6QixDQUFDO0lBQ0YsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM1QyxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFRixRQUFRLENBQUMsOENBQThDLEVBQUUsR0FBRyxFQUFFO0lBQzVELEVBQUUsQ0FBQyxvRUFBb0UsRUFBRSxHQUFHLEVBQUU7UUFDNUUsdUVBQXVFO1FBQ3ZFLCtEQUErRDtRQUMvRCx5QkFBeUI7UUFDekIsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUMzQix1Q0FBdUMsRUFDdkMsaUJBQWlCLENBQ2xCLENBQUM7UUFFRixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQy9DLHVDQUF1QyxDQUN4QyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0VBQW9FLEVBQUUsR0FBRyxFQUFFO1FBQzVFLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FDM0IsdUNBQXVDLEVBQ3ZDLGlCQUFpQixDQUNsQixDQUFDO1FBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUMvQyx1Q0FBdUMsQ0FDeEMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlFQUFpRSxFQUFFLEdBQUcsRUFBRTtRQUN6RSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQ1YsV0FBVyxDQUNULHVDQUF1QyxFQUN2Qyx1Q0FBdUMsQ0FDeEMsQ0FDRixDQUFDLE9BQU8sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlFQUFpRSxFQUFFLEdBQUcsRUFBRTtRQUN6RSxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQzNCLHVDQUF1QyxFQUN2Qyx1Q0FBdUMsQ0FDeEMsQ0FBQztRQUVGLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDL0MsdUNBQXVDLENBQ3hDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7XG4gIENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LFxuICBMYW5ndWFnZSxcbiAgUHJvdmlkZXJTY2hlbWEsXG4gIFRlcnJhZm9ybVByb3ZpZGVyQ29uc3RyYWludCxcbn0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQgeyBDb2RlTWFrZXIgfSBmcm9tIFwiY29kZW1ha2VyXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvciB9IGZyb20gXCIuLi8uLi9nZW5lcmF0b3IvcHJvdmlkZXItZ2VuZXJhdG9yXCI7XG5cbi8vIEJ1aWxkcyBhIG1pbmltYWwgcHJvdmlkZXIgc2NoZW1hIGtleWVkIGJ5IGEgc2luZ2xlIEZRUE4uIFRoZSBwcm92aWRlciBib2R5IGlzXG4vLyBpbnRlbnRpb25hbGx5IGVtcHR5IChsaWtlIHRoZSBlbXB0eS1wcm92aWRlci1yZXNvdXJjZXMgZml4dHVyZSkgc2luY2UgdGhlc2Vcbi8vIHRlc3RzIG9ubHkgZXhlcmNpc2UgdGhlIHNjaGVtYS1rZXkgPC0+IHRhcmdldC1zb3VyY2UgbWF0Y2hpbmcgbG9naWMuXG5jb25zdCBzY2hlbWFXaXRoS2V5ID0gKGZxcG46IHN0cmluZyk6IFByb3ZpZGVyU2NoZW1hID0+ICh7XG4gIHByb3ZpZGVyX3NjaGVtYXM6IHtcbiAgICBbZnFwbl06IHsgcmVzb3VyY2Vfc2NoZW1hczogbnVsbCB9IGFzIGFueSxcbiAgfSxcbiAgcHJvdmlkZXJfdmVyc2lvbnM6IHtcbiAgICBbZnFwbl06IFwiMS44NC4wXCIsXG4gIH0sXG59KTtcblxuY29uc3QgdGFyZ2V0Rm9yU291cmNlID0gKHNvdXJjZTogc3RyaW5nKSA9PlxuICBuZXcgQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQoXG4gICAgbmV3IFRlcnJhZm9ybVByb3ZpZGVyQ29uc3RyYWludChgJHtzb3VyY2V9QDEuODQuMGApLFxuICAgIExhbmd1YWdlLlRZUEVTQ1JJUFQsXG4gICk7XG5cbmNvbnN0IGdlbmVyYXRlRm9yID0gKHNjaGVtYUtleTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4ge1xuICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgVGVycmFmb3JtUHJvdmlkZXJHZW5lcmF0b3IoXG4gICAgbmV3IENvZGVNYWtlcigpLFxuICAgIHNjaGVtYVdpdGhLZXkoc2NoZW1hS2V5KSxcbiAgKTtcbiAgZ2VuZXJhdG9yLmdlbmVyYXRlKHRhcmdldEZvclNvdXJjZShzb3VyY2UpKTtcbiAgcmV0dXJuIGdlbmVyYXRvcjtcbn07XG5cbmRlc2NyaWJlKFwicHJvdmlkZXIgc291cmNlIG1hdGNoaW5nIGFnYWluc3Qgc2NoZW1hIGtleXNcIiwgKCkgPT4ge1xuICBpdChcIm1hdGNoZXMgYSBzaG9ydGhhbmQgc291cmNlIGFnYWluc3QgYW4gT3BlblRvZnUgcmVnaXN0cnkgc2NoZW1hIGtleVwiLCAoKSA9PiB7XG4gICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciAjMjE2OiBgdG9mdSBwcm92aWRlcnMgc2NoZW1hYCByZXR1cm5zIGtleXMgdW5kZXJcbiAgICAvLyByZWdpc3RyeS5vcGVudG9mdS5vcmcsIHNvIGEgc2hvcnRoYW5kIHNvdXJjZSBtdXN0IG5vdCBhc3N1bWVcbiAgICAvLyByZWdpc3RyeS50ZXJyYWZvcm0uaW8uXG4gICAgY29uc3QgZ2VuZXJhdG9yID0gZ2VuZXJhdGVGb3IoXG4gICAgICBcInJlZ2lzdHJ5Lm9wZW50b2Z1Lm9yZy9oYXNoaWNvcnAvYXdzY2NcIixcbiAgICAgIFwiaGFzaGljb3JwL2F3c2NjXCIsXG4gICAgKTtcblxuICAgIGV4cGVjdChPYmplY3Qua2V5cyhnZW5lcmF0b3IudmVyc2lvbnMpKS50b0NvbnRhaW4oXG4gICAgICBcInJlZ2lzdHJ5Lm9wZW50b2Z1Lm9yZy9oYXNoaWNvcnAvYXdzY2NcIixcbiAgICApO1xuICB9KTtcblxuICBpdChcIm1hdGNoZXMgYSBzaG9ydGhhbmQgc291cmNlIGFnYWluc3QgYSBUZXJyYWZvcm0gcmVnaXN0cnkgc2NoZW1hIGtleVwiLCAoKSA9PiB7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gZ2VuZXJhdGVGb3IoXG4gICAgICBcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvYXdzY2NcIixcbiAgICAgIFwiaGFzaGljb3JwL2F3c2NjXCIsXG4gICAgKTtcblxuICAgIGV4cGVjdChPYmplY3Qua2V5cyhnZW5lcmF0b3IudmVyc2lvbnMpKS50b0NvbnRhaW4oXG4gICAgICBcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvYXdzY2NcIixcbiAgICApO1xuICB9KTtcblxuICBpdChcImtlZXBzIGFuIGV4cGxpY2l0IGhvc3RuYW1lIHN0cmljdCBhbmQgZG9lcyBub3QgY3Jvc3MgcmVnaXN0cmllc1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+XG4gICAgICBnZW5lcmF0ZUZvcihcbiAgICAgICAgXCJyZWdpc3RyeS5vcGVudG9mdS5vcmcvaGFzaGljb3JwL2F3c2NjXCIsXG4gICAgICAgIFwicmVnaXN0cnkudGVycmFmb3JtLmlvL2hhc2hpY29ycC9hd3NjY1wiLFxuICAgICAgKSxcbiAgICApLnRvVGhyb3coL0NvdWxkIG5vdCBmaW5kIHByb3ZpZGVyIHdpdGggY29uc3RyYWludC8pO1xuICB9KTtcblxuICBpdChcIm1hdGNoZXMgYW4gZXhwbGljaXQgaG9zdG5hbWUgd2hlbiBpdCBhZ3JlZXMgd2l0aCB0aGUgc2NoZW1hIGtleVwiLCAoKSA9PiB7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gZ2VuZXJhdGVGb3IoXG4gICAgICBcInJlZ2lzdHJ5Lm9wZW50b2Z1Lm9yZy9oYXNoaWNvcnAvYXdzY2NcIixcbiAgICAgIFwicmVnaXN0cnkub3BlbnRvZnUub3JnL2hhc2hpY29ycC9hd3NjY1wiLFxuICAgICk7XG5cbiAgICBleHBlY3QoT2JqZWN0LmtleXMoZ2VuZXJhdG9yLnZlcnNpb25zKSkudG9Db250YWluKFxuICAgICAgXCJyZWdpc3RyeS5vcGVudG9mdS5vcmcvaGFzaGljb3JwL2F3c2NjXCIsXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -29,6 +29,13 @@ const isMatching = (target, terraformSchemaName) => {
29
29
  name: "",
30
30
  };
31
31
  const targetElements = target.source.split("/");
32
+ // Only a 3-part source explicitly pins a registry hostname. Shorthand
33
+ // sources (e.g. "hashicorp/awscc") omit it, so we must not assume a
34
+ // default: Terraform resolves them under registry.terraform.io while
35
+ // OpenTofu resolves them under registry.opentofu.org. Comparing against a
36
+ // hard-coded default would make schema lookup fail under OpenTofu even
37
+ // though the provider was installed correctly.
38
+ const explicitHostname = targetElements.length === 3;
32
39
  switch (targetElements.length) {
33
40
  case 1: // only name set
34
41
  targetSource.name = targetElements[0].toLowerCase();
@@ -45,7 +52,7 @@ const isMatching = (target, terraformSchemaName) => {
45
52
  default:
46
53
  throw new Error(`can't handle ${target.source}. Expected string with 1, 2 or 3 elements separated by '/'`);
47
54
  }
48
- return (targetSource.hostname === hostname &&
55
+ return ((!explicitHostname || targetSource.hostname === hostname) &&
49
56
  targetSource.namespace === namespace &&
50
57
  targetSource.name === provider);
51
58
  }
@@ -225,4 +232,4 @@ class TerraformProviderGenerator {
225
232
  }
226
233
  }
227
234
  exports.TerraformProviderGenerator = TerraformProviderGenerator;
228
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2dldC9nZW5lcmF0b3IvcHJvdmlkZXItZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMseUNBQW1EO0FBQ25ELDRDQU93QjtBQUN4Qiw0REFBdUU7QUFFdkUsdURBQW1EO0FBQ25ELHVDQUEyRDtBQWdCM0QsTUFBTSxVQUFVLEdBQUcsQ0FDakIsTUFBNkIsRUFDN0IsbUJBQTJCLEVBQ2xCLEVBQUU7SUFDWCxJQUFJLE1BQU0sQ0FBQyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFbEMsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWhELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssbUJBQW1CLENBQUM7SUFDL0MsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUM7UUFFakQsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLG1CQUFtQixFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsMkNBQTJDO1FBQzNDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sWUFBWSxHQUFHO2dCQUNuQixXQUFXO2dCQUNYLFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLFNBQVMsRUFBRSxXQUFXO2dCQUN0QixJQUFJLEVBQUUsRUFBRTthQUNULENBQUM7WUFDRixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUss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QyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlCLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRU8sY0FBYyxDQUFDLFFBQXVCO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBdFFELGdFQXNRQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBDb2RlTWFrZXIsIHRvQ2FtZWxDYXNlIH0gZnJvbSBcImNvZGVtYWtlclwiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQsXG4gIENvbnN0cnVjdHNNYWtlclRhcmdldCxcbiAgTEFOR1VBR0VTLFxuICBsb2dnZXIsXG4gIFByb3ZpZGVyU2NoZW1hLFxuICBUZXJyYWZvcm1Qcm92aWRlckNvbnN0cmFpbnQsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IHsgRlFQTiwgcGFyc2VGUVBOLCBQcm92aWRlck5hbWUgfSBmcm9tIFwiQGNka3RuL3Byb3ZpZGVyLXNjaGVtYVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VNb2RlbCB9IGZyb20gXCIuL21vZGVsc1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VQYXJzZXIgfSBmcm9tIFwiLi9yZXNvdXJjZS1wYXJzZXJcIjtcbmltcG9ydCB7IFJlc291cmNlRW1pdHRlciwgU3RydWN0RW1pdHRlciB9IGZyb20gXCIuL2VtaXR0ZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvck9wdGlvbnMge1xuICAvKipcbiAgICogRmlsZSBleHRlbnNpb24gdG8gd3JpdGUgb24gZW1pdHRlZCByZWxhdGl2ZSBpbXBvcnRzLlxuICAgKiBEZWZhdWx0cyB0byBcIlwiIChDb21tb25KUykuXG4gICAqL1xuICByZWFkb25seSBpbXBvcnRFeHRlbnNpb24/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQcm92aWRlckRhdGEge1xuICBuYW1lOiBzdHJpbmc7XG4gIHNvdXJjZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmNvbnN0IGlzTWF0Y2hpbmcgPSAoXG4gIHRhcmdldDogQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICB0ZXJyYWZvcm1TY2hlbWFOYW1lOiBzdHJpbmcsXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKHRhcmdldC5pc01vZHVsZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGVsZW1lbnRzID0gdGVycmFmb3JtU2NoZW1hTmFtZS5zcGxpdChcIi9cIik7XG5cbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB0YXJnZXQuc291cmNlID09PSB0ZXJyYWZvcm1TY2hlbWFOYW1lO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtob3N0bmFtZSwgbmFtZXNwYWNlLCBwcm92aWRlcl0gPSBlbGVtZW50cztcblxuICAgIGlmICghaG9zdG5hbWUgfHwgIW5hbWVzcGFjZSB8fCAhcHJvdmlkZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2FuJ3QgaGFuZGxlICR7dGVycmFmb3JtU2NoZW1hTmFtZX1gKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0YXJnZXQuc291cmNlIGlzIHNldCwgdHJ5IHRvIG1hdGNoIGl0XG4gICAgaWYgKHRhcmdldC5zb3VyY2UpIHtcbiAgICAgIGNvbnN0IHRhcmdldFNvdXJjZSA9IHtcbiAgICAgICAgLy8gZGVmYXVsdHNcbiAgICAgICAgaG9zdG5hbWU6IFwicmVnaXN0cnkudGVycmFmb3JtLmlvXCIsXG4gICAgICAgIG5hbWVzcGFjZTogXCJoYXNoaWNvcnBcIixcbiAgICAgICAgbmFtZTogXCJcIixcbiAgICAgIH07XG4gICAgICBjb25zdCB0YXJnZXRFbGVtZW50cyA9IHRhcmdldC5zb3VyY2Uuc3BsaXQoXCIvXCIpO1xuICAgICAgc3dpdGNoICh0YXJnZXRFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOiAvLyBvbmx5IG5hbWUgc2V0XG4gICAgICAgICAgdGFyZ2V0U291cmNlLm5hbWUgPSB0YXJnZXRFbGVtZW50c1swXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6IC8vIG5hbWVzcGFjZSBhbmQgbmFtZSBzZXRcbiAgICAgICAgICB0YXJnZXRTb3VyY2UubmFtZXNwYWNlID0gdGFyZ2V0RWxlbWVudHNbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB0YXJnZXRTb3VyY2UubmFtZSA9IHRhcmdldEVsZW1lbnRzWzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogLy8gaG9zdG5hbWUsIG5hbWVzcGFjZSBhbmQgbmFtZSBzZXRcbiAgICAgICAgICB0YXJnZXRTb3VyY2UuaG9zdG5hbWUgPSB0YXJnZXRFbGVtZW50c1swXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHRhcmdldFNvdXJjZS5uYW1lc3BhY2UgPSB0YXJnZXRFbGVtZW50c1sxXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHRhcmdldFNvdXJjZS5uYW1lID0gdGFyZ2V0RWxlbWVudHNbMl0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgY2FuJ3QgaGFuZGxlICR7dGFyZ2V0LnNvdXJjZX0uIEV4cGVjdGVkIHN0cmluZyB3aXRoIDEsIDIgb3IgMyBlbGVtZW50cyBzZXBhcmF0ZWQgYnkgJy8nYCxcbiAgICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKFxuICAgICAgICB0YXJnZXRTb3VyY2UuaG9zdG5hbWUgPT09IGhvc3RuYW1lICYmXG4gICAgICAgIHRhcmdldFNvdXJjZS5uYW1lc3BhY2UgPT09IG5hbWVzcGFjZSAmJlxuICAgICAgICB0YXJnZXRTb3VyY2UubmFtZSA9PT0gcHJvdmlkZXJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRWxzZSwgdHJ5IHRvIG1hdGNoIHRhcmdldC5uYW1lIHRvIHRoZSBwcm92aWRlciBuYW1lXG5cbiAgICByZXR1cm4gdGFyZ2V0Lm5hbWUgPT09IHByb3ZpZGVyO1xuICB9XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb3ZpZGVyQ29uc3RyYWludHMge1xuICBbZnFuOiBzdHJpbmddOiBQcm92aWRlckRhdGE7XG59XG5cbmV4cG9ydCBjbGFzcyBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvciB7XG4gIHByaXZhdGUgcmVzb3VyY2VQYXJzZXIgPSBuZXcgUmVzb3VyY2VQYXJzZXIoKTtcbiAgcHJpdmF0ZSByZXNvdXJjZUVtaXR0ZXI6IFJlc291cmNlRW1pdHRlcjtcbiAgcHJpdmF0ZSBzdHJ1Y3RFbWl0dGVyOiBTdHJ1Y3RFbWl0dGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGltcG9ydEV4dGVuc2lvbjogc3RyaW5nO1xuICBwdWJsaWMgdmVyc2lvbnM6IHsgW2ZxcG46IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb2RlOiBDb2RlTWFrZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzY2hlbWE6IFByb3ZpZGVyU2NoZW1hLFxuICAgIG9wdGlvbnM6IFRlcnJhZm9ybVByb3ZpZGVyR2VuZXJhdG9yT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICB0aGlzLmNvZGUuaW5kZW50YXRpb24gPSAyO1xuICAgIHRoaXMuaW1wb3J0RXh0ZW5zaW9uID0gb3B0aW9ucy5pbXBvcnRFeHRlbnNpb24gPz8gXCJcIjtcbiAgICB0aGlzLnJlc291cmNlRW1pdHRlciA9IG5ldyBSZXNvdXJjZUVtaXR0ZXIodGhpcy5jb2RlKTtcbiAgICB0aGlzLnN0cnVjdEVtaXR0ZXIgPSBuZXcgU3RydWN0RW1pdHRlcih0aGlzLmNvZGUsIHRoaXMuaW1wb3J0RXh0ZW5zaW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJvdmlkZXJCeUNvbnN0cmFpbnQoXG4gICAgcHJvdmlkZXJDb25zdHJhaW50OiBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQsXG4gICk6IEZRUE4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnNjaGVtYS5wcm92aWRlcl9zY2hlbWFzIHx8IHt9KS5maW5kKChmcXBuKSA9PlxuICAgICAgaXNNYXRjaGluZyhwcm92aWRlckNvbnN0cmFpbnQsIGZxcG4pLFxuICAgICkgYXMgRlFQTiB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZW5lcmF0ZShwcm92aWRlckNvbnN0cmFpbnQ6IENvbnN0cnVjdHNNYWtlclRhcmdldCkge1xuICAgIGNvbnN0IGZxcG4gPSB0aGlzLmdldFByb3ZpZGVyQnlDb25zdHJhaW50KHByb3ZpZGVyQ29uc3RyYWludCk7XG4gICAgaWYgKCFmcXBuKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBDb3VsZCBub3QgZmluZCBwcm92aWRlciBjb25zdHJhaW50IGZvciAke3Byb3ZpZGVyQ29uc3RyYWludH0gaW4gc2NoZW1hOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgMixcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIHByb3ZpZGVyIHdpdGggY29uc3RyYWludCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHByb3ZpZGVyQ29uc3RyYWludCxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm92aWRlclZlcnNpb24gPSB0aGlzLnNjaGVtYS5wcm92aWRlcl92ZXJzaW9ucz8uW2ZxcG5dO1xuICAgIHRoaXMuZW1pdFByb3ZpZGVyKGZxcG4sIHByb3ZpZGVyVmVyc2lvbiwgcHJvdmlkZXJDb25zdHJhaW50KTtcbiAgICB0aGlzLnZlcnNpb25zW2ZxcG5dID0gcHJvdmlkZXJWZXJzaW9uO1xuICB9XG5cbiAgcHVibGljIGdlbmVyYXRlQWxsKCkge1xuICAgIGZvciAoY29uc3QgZnFwbiBvZiBPYmplY3Qua2V5cyh0aGlzLnNjaGVtYS5wcm92aWRlcl9zY2hlbWFzIHx8IHt9KSkge1xuICAgICAgdGhpcy5nZW5lcmF0ZShcbiAgICAgICAgbmV3IENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0KFxuICAgICAgICAgIG5ldyBUZXJyYWZvcm1Qcm92aWRlckNvbnN0cmFpbnQoZnFwbiksXG4gICAgICAgICAgTEFOR1VBR0VTWzBdLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2F2ZShvdXRkaXI6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuY29kZS5zYXZlKG91dGRpcik7XG4gIH1cblxuICBwdWJsaWMgYnVpbGRSZXNvdXJjZU1vZGVscyhcbiAgICBmcXBuOiBGUVBOLFxuICAgIGNvbnN0cmFpbnQ/OiBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQsXG4gICk6IFJlc291cmNlTW9kZWxbXSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLnNjaGVtYS5wcm92aWRlcl9zY2hlbWFzPy5bZnFwbl07XG4gICAgaWYgKCFwcm92aWRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IGZpbmQgcHJvdmlkZXIgJyR7ZnFwbn0nIGluIHNjaGVtYWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlcyA9IE9iamVjdC5lbnRyaWVzKHByb3ZpZGVyLnJlc291cmNlX3NjaGVtYXMgfHwge30pLm1hcChcbiAgICAgIChbdHlwZSwgcmVzb3VyY2VdKSA9PlxuICAgICAgICB0aGlzLnJlc291cmNlUGFyc2VyLnBhcnNlKGZxcG4sIHR5cGUsIHJlc291cmNlLCBcInJlc291cmNlXCIsIGNvbnN0cmFpbnQpLFxuICAgICk7XG5cbiAgICBjb25zdCBkYXRhU291cmNlcyA9IE9iamVjdC5lbnRyaWVzKHByb3ZpZGVyLmRhdGFfc291cmNlX3NjaGVtYXMgfHwge30pLm1hcChcbiAgICAgIChbdHlwZSwgcmVzb3VyY2VdKSA9PlxuICAgICAgICB0aGlzLnJlc291cmNlUGFyc2VyLnBhcnNlKFxuICAgICAgICAgIGZxcG4sXG4gICAgICAgICAgYGRhdGFfJHt0eXBlfWAsXG4gICAgICAgICAgcmVzb3VyY2UsXG4gICAgICAgICAgXCJkYXRhX3NvdXJjZVwiLFxuICAgICAgICAgIGNvbnN0cmFpbnQsXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiAoW10gYXMgUmVzb3VyY2VNb2RlbFtdKS5jb25jYXQoLi4ucmVzb3VyY2VzLCAuLi5kYXRhU291cmNlcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2xhc3NOYW1lRm9yUmVzb3VyY2UodGVycmFmb3JtVHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VQYXJzZXIuZ2V0Q2xhc3NOYW1lRm9yUmVzb3VyY2UodGVycmFmb3JtVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TmFtZXNwYWNlTmFtZUZvclJlc291cmNlKHRlcnJhZm9ybVR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlUGFyc2VyLmdldE5hbWVzcGFjZU5hbWVGb3JSZXNvdXJjZSh0ZXJyYWZvcm1UeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFByb3ZpZGVyKFxuICAgIGZxcG46IEZRUE4sXG4gICAgcHJvdmlkZXJWZXJzaW9uPzogc3RyaW5nLFxuICAgIGNvbnN0cmFpbnQ/OiBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQsXG4gICkge1xuICAgIGNvbnN0IG5hbWUgPSBjb25zdHJhaW50Py5uYW1lXG4gICAgICA/IChjb25zdHJhaW50Lm5hbWUgYXMgUHJvdmlkZXJOYW1lKVxuICAgICAgOiBwYXJzZUZRUE4oZnFwbikubmFtZTtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuc2NoZW1hLnByb3ZpZGVyX3NjaGVtYXM/LltmcXBuXTtcbiAgICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgZmluZCBwcm92aWRlciAnJHtmcXBufScgaW4gc2NoZW1hYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgdGhpcy5idWlsZFJlc291cmNlTW9kZWxzKGZxcG4sIGNvbnN0cmFpbnQpLmZvckVhY2goKHJlc291cmNlTW9kZWwpID0+IHtcbiAgICAgIGlmIChjb25zdHJhaW50KSB7XG4gICAgICAgIHJlc291cmNlTW9kZWwucHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludCA9IGNvbnN0cmFpbnQudmVyc2lvbjtcbiAgICAgICAgcmVzb3VyY2VNb2RlbC50ZXJyYWZvcm1Qcm92aWRlclNvdXJjZSA9IGNvbnN0cmFpbnQuc291cmNlO1xuICAgICAgfVxuICAgICAgcmVzb3VyY2VNb2RlbC5wcm92aWRlclZlcnNpb24gPSBwcm92aWRlclZlcnNpb247XG5cbiAgICAgIGlmIChyZXNvdXJjZU1vZGVsLnN0cnVjdHNSZXF1aXJlU2hhcmRpbmcpIHtcbiAgICAgICAgZmlsZXMucHVzaCh0aGlzLmVtaXRSZXNvdXJjZVdpdGhDb21wbGV4U3RydWN0KHJlc291cmNlTW9kZWwpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbGVzLnB1c2godGhpcy5lbWl0UmVzb3VyY2UocmVzb3VyY2VNb2RlbCkpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbWl0UmVzb3VyY2VSZWFkbWUocmVzb3VyY2VNb2RlbCk7XG4gICAgfSk7XG5cbiAgICBpZiAocHJvdmlkZXIucHJvdmlkZXIpIHtcbiAgICAgIGNvbnN0IHByb3ZpZGVyUmVzb3VyY2UgPSB0aGlzLnJlc291cmNlUGFyc2VyLnBhcnNlKFxuICAgICAgICBmcXBuLFxuICAgICAgICBgcHJvdmlkZXJgLFxuICAgICAgICBwcm92aWRlci5wcm92aWRlcixcbiAgICAgICAgXCJwcm92aWRlclwiLFxuICAgICAgICBjb25zdHJhaW50LFxuICAgICAgKTtcbiAgICAgIGlmIChjb25zdHJhaW50KSB7XG4gICAgICAgIHByb3ZpZGVyUmVzb3VyY2UucHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludCA9IGNvbnN0cmFpbnQudmVyc2lvbjtcbiAgICAgICAgcHJvdmlkZXJSZXNvdXJjZS50ZXJyYWZvcm1Qcm92aWRlclNvdXJjZSA9IGNvbnN0cmFpbnQuc291cmNlO1xuICAgICAgICBwcm92aWRlclJlc291cmNlLnRlcnJhZm9ybVByb3ZpZGVyTmFtZSA9IGNvbnN0cmFpbnQubmFtZTtcbiAgICAgIH1cbiAgICAgIHByb3ZpZGVyUmVzb3VyY2UucHJvdmlkZXJWZXJzaW9uID0gcHJvdmlkZXJWZXJzaW9uO1xuICAgICAgZmlsZXMucHVzaCh0aGlzLmVtaXRSZXNvdXJjZShwcm92aWRlclJlc291cmNlKSk7XG4gICAgICB0aGlzLmVtaXRSZXNvdXJjZVJlYWRtZShwcm92aWRlclJlc291cmNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXRJbmRleEZpbGUobmFtZSwgZmlsZXMpO1xuICAgIHRoaXMuZW1pdExhenlJbmRleEZpbGUobmFtZSwgZmlsZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2VSZWFkbWUocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGAke3Jlc291cmNlLm5hbWVzcGFjZUZvbGRlclBhdGh9L1JFQURNRS5tZGA7XG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKGZpbGVQYXRoKTtcbiAgICB0aGlzLmNvZGUubGluZShgIyBcXGAke3Jlc291cmNlLnRlcnJhZm9ybVR5cGV9XFxgYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICBjb25zdCB0eXBlID0gcmVzb3VyY2UuaXNQcm92aWRlclxuICAgICAgPyByZXNvdXJjZS5wcm92aWRlclxuICAgICAgOiByZXNvdXJjZS50ZXJyYWZvcm1UeXBlO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYFJlZmVyIHRvIHRoZSBUZXJyYWZvcm0gUmVnaXN0cnkgZm9yIGRvY3M6IFtcXGAke3R5cGV9XFxgXSgke3Jlc291cmNlLmxpbmtUb0RvY3N9KS5gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZShmaWxlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRJbmRleEZpbGUocHJvdmlkZXI6IFByb3ZpZGVyTmFtZSwgZmlsZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgZm9sZGVyID0gYHByb3ZpZGVycy8ke3Byb3ZpZGVyfWA7XG4gICAgY29uc3QgZmlsZVBhdGggPSBgJHtmb2xkZXJ9L2luZGV4LnRzYDtcbiAgICB0aGlzLmNvZGUub3BlbkZpbGUoZmlsZVBhdGgpO1xuICAgIHRoaXMuY29kZS5saW5lKFwiLy8gZ2VuZXJhdGVkIGJ5IGNka3RuIGdldFwiKTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBmaWxlLnJlcGxhY2UoYCR7Zm9sZGVyfS9gLCBcIlwiKS5yZXBsYWNlKFwiL2luZGV4LnRzXCIsIFwiXCIpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGBleHBvcnQgKiBhcyAke3RvQ2FtZWxDYXNlKGRpck5hbWUpfSBmcm9tICcuLyR7ZGlyTmFtZX0vaW5kZXgke3RoaXMuaW1wb3J0RXh0ZW5zaW9ufSc7YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZShmaWxlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRMYXp5SW5kZXhGaWxlKHByb3ZpZGVyOiBQcm92aWRlck5hbWUsIGZpbGVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IGZvbGRlciA9IGBwcm92aWRlcnMvJHtwcm92aWRlcn1gO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7Zm9sZGVyfS9sYXp5LWluZGV4LnRzYDtcbiAgICB0aGlzLmNvZGUub3BlbkZpbGUoZmlsZVBhdGgpO1xuICAgIHRoaXMuY29kZS5saW5lKFwiLy8gZ2VuZXJhdGVkIGJ5IGNka3RuIGdldFwiKTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBmaWxlLnJlcGxhY2UoYCR7Zm9sZGVyfS9gLCBcIlwiKS5yZXBsYWNlKFwiL2luZGV4LnRzXCIsIFwiXCIpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJyR7dG9DYW1lbENhc2UoXG4gICAgICAgICAgZGlyTmFtZSxcbiAgICAgICAgKX0nLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVxdWlyZSgnLi8ke2Rpck5hbWV9Jyk7IH0gfSk7YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZShmaWxlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRSZXNvdXJjZShyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCk6IHN0cmluZyB7XG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKHJlc291cmNlLmZpbGVQYXRoKTtcbiAgICB0aGlzLmVtaXRGaWxlSGVhZGVyKHJlc291cmNlKTtcbiAgICB0aGlzLnN0cnVjdEVtaXR0ZXIuZW1pdChyZXNvdXJjZSk7XG4gICAgdGhpcy5yZXNvdXJjZUVtaXR0ZXIuZW1pdChyZXNvdXJjZSk7XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZShyZXNvdXJjZS5maWxlUGF0aCk7XG5cbiAgICByZXR1cm4gcmVzb3VyY2UuZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGVtaXRSZXNvdXJjZVdpdGhDb21wbGV4U3RydWN0KHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgY29uc3QgZ2VuZXJhdGVkRmlsZXMgPSBbXTtcblxuICAgIC8vIGRyb3AgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgZmlsZXBhdGhcbiAgICBjb25zdCBmaWxlUGF0aCA9IHJlc291cmNlLmZpbGVQYXRoO1xuICAgIHRoaXMuY29kZS5vcGVuRmlsZShmaWxlUGF0aCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYC8vIGdlbmVyYXRlZCBmcm9tIHRlcnJhZm9ybSByZXNvdXJjZSBzY2hlbWFgKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgaWYgKHJlc291cmNlLnN0cnVjdHNSZXF1aXJlU2hhcmRpbmcpIHtcbiAgICAgIGNvbnN0IHN0cnVjdHNTcGVjaWZpZXIgPSBgLi8ke3Jlc291cmNlLnN0cnVjdHNGb2xkZXJOYW1lfS9pbmRleCR7dGhpcy5pbXBvcnRFeHRlbnNpb259YDtcbiAgICAgIGlmIChyZXNvdXJjZS5yZWZlcmVuY2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICBgaW1wb3J0IHsgJHtyZXNvdXJjZS5yZWZlcmVuY2VkVHlwZXMuam9pbihcbiAgICAgICAgICAgIFwiLCBcXG5cIixcbiAgICAgICAgICApfX0gZnJvbSAnJHtzdHJ1Y3RzU3BlY2lmaWVyfSc7YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb2RlLmxpbmUoYGV4cG9ydCAqIGZyb20gJyR7c3RydWN0c1NwZWNpZmllcn0nO2ApO1xuXG4gICAgICByZXNvdXJjZS5pbXBvcnRTdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCkgPT5cbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoc3RhdGVtZW50KSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc3RydWN0RW1pdHRlci5lbWl0SW50ZXJmYWNlKHJlc291cmNlLCByZXNvdXJjZS5jb25maWdTdHJ1Y3QpO1xuICAgICAgdGhpcy5yZXNvdXJjZUVtaXR0ZXIuZW1pdChyZXNvdXJjZSk7XG5cbiAgICAgIHRoaXMuY29kZS5jbG9zZUZpbGUoZmlsZVBhdGgpO1xuXG4gICAgICB0aGlzLnN0cnVjdEVtaXR0ZXIuZW1pdChyZXNvdXJjZSk7XG4gICAgICBnZW5lcmF0ZWRGaWxlcy5wdXNoKHJlc291cmNlLmZpbGVOYW1lKTtcbiAgICAgIGdlbmVyYXRlZEZpbGVzLnB1c2gocmVzb3VyY2Uuc3RydWN0c0ZvbGRlck5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvdXJjZS5pbXBvcnRTdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCkgPT5cbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoc3RhdGVtZW50KSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc3RydWN0RW1pdHRlci5lbWl0KHJlc291cmNlKTtcbiAgICAgIHRoaXMucmVzb3VyY2VFbWl0dGVyLmVtaXQocmVzb3VyY2UpO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlRmlsZShmaWxlUGF0aCk7XG4gICAgICBnZW5lcmF0ZWRGaWxlcy5wdXNoKHJlc291cmNlLmZpbGVOYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGVtaXRGaWxlSGVhZGVyKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoYC8vICR7cmVzb3VyY2UubGlua1RvRG9jc31gKTtcbiAgICB0aGlzLmNvZGUubGluZShgLy8gZ2VuZXJhdGVkIGZyb20gdGVycmFmb3JtIHJlc291cmNlIHNjaGVtYWApO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgcmVzb3VyY2UuaW1wb3J0U3RhdGVtZW50cy5mb3JFYWNoKChzdGF0ZW1lbnQpID0+IHRoaXMuY29kZS5saW5lKHN0YXRlbWVudCkpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXCIvLyBDb25maWd1cmF0aW9uXCIpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gIH1cbn1cbiJdfQ==
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2dldC9nZW5lcmF0b3IvcHJvdmlkZXItZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMseUNBQW1EO0FBQ25ELDRDQU93QjtBQUN4Qiw0REFBdUU7QUFFdkUsdURBQW1EO0FBQ25ELHVDQUEyRDtBQWdCM0QsTUFBTSxVQUFVLEdBQUcsQ0FDakIsTUFBNkIsRUFDN0IsbUJBQTJCLEVBQ2xCLEVBQUU7SUFDWCxJQUFJLE1BQU0sQ0FBQyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFbEMsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWhELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssbUJBQW1CLENBQUM7SUFDL0MsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUM7UUFFakQsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLG1CQUFtQixFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsMkNBQTJDO1FBQzNDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sWUFBWSxHQUFHO2dCQUNuQixXQUFXO2dCQUNYLFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLFNBQVMsRUFBRSxXQUFXO2dCQUN0QixJQUFJLEVBQUUsRUFBRTthQUNULENBQUM7WUFDRixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUss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RSxFQUFFLENBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQixDQUFDO1lBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUIsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxjQUFjLENBQUMsUUFBdUI7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUF0UUQsZ0VBc1FDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IENvZGVNYWtlciwgdG9DYW1lbENhc2UgfSBmcm9tIFwiY29kZW1ha2VyXCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RzTWFrZXJQcm92aWRlclRhcmdldCxcbiAgQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICBMQU5HVUFHRVMsXG4gIGxvZ2dlcixcbiAgUHJvdmlkZXJTY2hlbWEsXG4gIFRlcnJhZm9ybVByb3ZpZGVyQ29uc3RyYWludCxcbn0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQgeyBGUVBOLCBwYXJzZUZRUE4sIFByb3ZpZGVyTmFtZSB9IGZyb20gXCJAY2RrdG4vcHJvdmlkZXItc2NoZW1hXCI7XG5pbXBvcnQgeyBSZXNvdXJjZU1vZGVsIH0gZnJvbSBcIi4vbW9kZWxzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVBhcnNlciB9IGZyb20gXCIuL3Jlc291cmNlLXBhcnNlclwiO1xuaW1wb3J0IHsgUmVzb3VyY2VFbWl0dGVyLCBTdHJ1Y3RFbWl0dGVyIH0gZnJvbSBcIi4vZW1pdHRlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlcnJhZm9ybVByb3ZpZGVyR2VuZXJhdG9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBGaWxlIGV4dGVuc2lvbiB0byB3cml0ZSBvbiBlbWl0dGVkIHJlbGF0aXZlIGltcG9ydHMuXG4gICAqIERlZmF1bHRzIHRvIFwiXCIgKENvbW1vbkpTKS5cbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydEV4dGVuc2lvbj86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFByb3ZpZGVyRGF0YSB7XG4gIG5hbWU6IHN0cmluZztcbiAgc291cmNlOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuY29uc3QgaXNNYXRjaGluZyA9IChcbiAgdGFyZ2V0OiBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQsXG4gIHRlcnJhZm9ybVNjaGVtYU5hbWU6IHN0cmluZyxcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAodGFyZ2V0LmlzTW9kdWxlKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZWxlbWVudHMgPSB0ZXJyYWZvcm1TY2hlbWFOYW1lLnNwbGl0KFwiL1wiKTtcblxuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHRhcmdldC5zb3VyY2UgPT09IHRlcnJhZm9ybVNjaGVtYU5hbWU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW2hvc3RuYW1lLCBuYW1lc3BhY2UsIHByb3ZpZGVyXSA9IGVsZW1lbnRzO1xuXG4gICAgaWYgKCFob3N0bmFtZSB8fCAhbmFtZXNwYWNlIHx8ICFwcm92aWRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBoYW5kbGUgJHt0ZXJyYWZvcm1TY2hlbWFOYW1lfWApO1xuICAgIH1cblxuICAgIC8vIElmIHRhcmdldC5zb3VyY2UgaXMgc2V0LCB0cnkgdG8gbWF0Y2ggaXRcbiAgICBpZiAodGFyZ2V0LnNvdXJjZSkge1xuICAgICAgY29uc3QgdGFyZ2V0U291cmNlID0ge1xuICAgICAgICAvLyBkZWZhdWx0c1xuICAgICAgICBob3N0bmFtZTogXCJyZWdpc3RyeS50ZXJyYWZvcm0uaW9cIixcbiAgICAgICAgbmFtZXNwYWNlOiBcImhhc2hpY29ycFwiLFxuICAgICAgICBuYW1lOiBcIlwiLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnRzID0gdGFyZ2V0LnNvdXJjZS5zcGxpdChcIi9cIik7XG4gICAgICAvLyBPbmx5IGEgMy1wYXJ0IHNvdXJjZSBleHBsaWNpdGx5IHBpbnMgYSByZWdpc3RyeSBob3N0bmFtZS4gU2hvcnRoYW5kXG4gICAgICAvLyBzb3VyY2VzIChlLmcuIFwiaGFzaGljb3JwL2F3c2NjXCIpIG9taXQgaXQsIHNvIHdlIG11c3Qgbm90IGFzc3VtZSBhXG4gICAgICAvLyBkZWZhdWx0OiBUZXJyYWZvcm0gcmVzb2x2ZXMgdGhlbSB1bmRlciByZWdpc3RyeS50ZXJyYWZvcm0uaW8gd2hpbGVcbiAgICAgIC8vIE9wZW5Ub2Z1IHJlc29sdmVzIHRoZW0gdW5kZXIgcmVnaXN0cnkub3BlbnRvZnUub3JnLiBDb21wYXJpbmcgYWdhaW5zdCBhXG4gICAgICAvLyBoYXJkLWNvZGVkIGRlZmF1bHQgd291bGQgbWFrZSBzY2hlbWEgbG9va3VwIGZhaWwgdW5kZXIgT3BlblRvZnUgZXZlblxuICAgICAgLy8gdGhvdWdoIHRoZSBwcm92aWRlciB3YXMgaW5zdGFsbGVkIGNvcnJlY3RseS5cbiAgICAgIGNvbnN0IGV4cGxpY2l0SG9zdG5hbWUgPSB0YXJnZXRFbGVtZW50cy5sZW5ndGggPT09IDM7XG4gICAgICBzd2l0Y2ggKHRhcmdldEVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6IC8vIG9ubHkgbmFtZSBzZXRcbiAgICAgICAgICB0YXJnZXRTb3VyY2UubmFtZSA9IHRhcmdldEVsZW1lbnRzWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogLy8gbmFtZXNwYWNlIGFuZCBuYW1lIHNldFxuICAgICAgICAgIHRhcmdldFNvdXJjZS5uYW1lc3BhY2UgPSB0YXJnZXRFbGVtZW50c1swXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHRhcmdldFNvdXJjZS5uYW1lID0gdGFyZ2V0RWxlbWVudHNbMV0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOiAvLyBob3N0bmFtZSwgbmFtZXNwYWNlIGFuZCBuYW1lIHNldFxuICAgICAgICAgIHRhcmdldFNvdXJjZS5ob3N0bmFtZSA9IHRhcmdldEVsZW1lbnRzWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgdGFyZ2V0U291cmNlLm5hbWVzcGFjZSA9IHRhcmdldEVsZW1lbnRzWzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgdGFyZ2V0U291cmNlLm5hbWUgPSB0YXJnZXRFbGVtZW50c1syXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBjYW4ndCBoYW5kbGUgJHt0YXJnZXQuc291cmNlfS4gRXhwZWN0ZWQgc3RyaW5nIHdpdGggMSwgMiBvciAzIGVsZW1lbnRzIHNlcGFyYXRlZCBieSAnLydgLFxuICAgICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgICghZXhwbGljaXRIb3N0bmFtZSB8fCB0YXJnZXRTb3VyY2UuaG9zdG5hbWUgPT09IGhvc3RuYW1lKSAmJlxuICAgICAgICB0YXJnZXRTb3VyY2UubmFtZXNwYWNlID09PSBuYW1lc3BhY2UgJiZcbiAgICAgICAgdGFyZ2V0U291cmNlLm5hbWUgPT09IHByb3ZpZGVyXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEVsc2UsIHRyeSB0byBtYXRjaCB0YXJnZXQubmFtZSB0byB0aGUgcHJvdmlkZXIgbmFtZVxuXG4gICAgcmV0dXJuIHRhcmdldC5uYW1lID09PSBwcm92aWRlcjtcbiAgfVxufTtcblxuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlckNvbnN0cmFpbnRzIHtcbiAgW2Zxbjogc3RyaW5nXTogUHJvdmlkZXJEYXRhO1xufVxuXG5leHBvcnQgY2xhc3MgVGVycmFmb3JtUHJvdmlkZXJHZW5lcmF0b3Ige1xuICBwcml2YXRlIHJlc291cmNlUGFyc2VyID0gbmV3IFJlc291cmNlUGFyc2VyKCk7XG4gIHByaXZhdGUgcmVzb3VyY2VFbWl0dGVyOiBSZXNvdXJjZUVtaXR0ZXI7XG4gIHByaXZhdGUgc3RydWN0RW1pdHRlcjogU3RydWN0RW1pdHRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbXBvcnRFeHRlbnNpb246IHN0cmluZztcbiAgcHVibGljIHZlcnNpb25zOiB7IFtmcXBuOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29kZTogQ29kZU1ha2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hOiBQcm92aWRlclNjaGVtYSxcbiAgICBvcHRpb25zOiBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvck9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgdGhpcy5jb2RlLmluZGVudGF0aW9uID0gMjtcbiAgICB0aGlzLmltcG9ydEV4dGVuc2lvbiA9IG9wdGlvbnMuaW1wb3J0RXh0ZW5zaW9uID8/IFwiXCI7XG4gICAgdGhpcy5yZXNvdXJjZUVtaXR0ZXIgPSBuZXcgUmVzb3VyY2VFbWl0dGVyKHRoaXMuY29kZSk7XG4gICAgdGhpcy5zdHJ1Y3RFbWl0dGVyID0gbmV3IFN0cnVjdEVtaXR0ZXIodGhpcy5jb2RlLCB0aGlzLmltcG9ydEV4dGVuc2lvbik7XG4gIH1cblxuICBwcml2YXRlIGdldFByb3ZpZGVyQnlDb25zdHJhaW50KFxuICAgIHByb3ZpZGVyQ29uc3RyYWludDogQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICApOiBGUVBOIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5zY2hlbWEucHJvdmlkZXJfc2NoZW1hcyB8fCB7fSkuZmluZCgoZnFwbikgPT5cbiAgICAgIGlzTWF0Y2hpbmcocHJvdmlkZXJDb25zdHJhaW50LCBmcXBuKSxcbiAgICApIGFzIEZRUE4gfCB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2VuZXJhdGUocHJvdmlkZXJDb25zdHJhaW50OiBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQpIHtcbiAgICBjb25zdCBmcXBuID0gdGhpcy5nZXRQcm92aWRlckJ5Q29uc3RyYWludChwcm92aWRlckNvbnN0cmFpbnQpO1xuICAgIGlmICghZnFwbikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgcHJvdmlkZXIgY29uc3RyYWludCBmb3IgJHtwcm92aWRlckNvbnN0cmFpbnR9IGluIHNjaGVtYTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB0aGlzLnNjaGVtYSxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIDIsXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgZmluZCBwcm92aWRlciB3aXRoIGNvbnN0cmFpbnQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwcm92aWRlckNvbnN0cmFpbnQsXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdmlkZXJWZXJzaW9uID0gdGhpcy5zY2hlbWEucHJvdmlkZXJfdmVyc2lvbnM/LltmcXBuXTtcbiAgICB0aGlzLmVtaXRQcm92aWRlcihmcXBuLCBwcm92aWRlclZlcnNpb24sIHByb3ZpZGVyQ29uc3RyYWludCk7XG4gICAgdGhpcy52ZXJzaW9uc1tmcXBuXSA9IHByb3ZpZGVyVmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZW5lcmF0ZUFsbCgpIHtcbiAgICBmb3IgKGNvbnN0IGZxcG4gb2YgT2JqZWN0LmtleXModGhpcy5zY2hlbWEucHJvdmlkZXJfc2NoZW1hcyB8fCB7fSkpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGUoXG4gICAgICAgIG5ldyBDb25zdHJ1Y3RzTWFrZXJQcm92aWRlclRhcmdldChcbiAgICAgICAgICBuZXcgVGVycmFmb3JtUHJvdmlkZXJDb25zdHJhaW50KGZxcG4pLFxuICAgICAgICAgIExBTkdVQUdFU1swXSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHNhdmUob3V0ZGlyOiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmNvZGUuc2F2ZShvdXRkaXIpO1xuICB9XG5cbiAgcHVibGljIGJ1aWxkUmVzb3VyY2VNb2RlbHMoXG4gICAgZnFwbjogRlFQTixcbiAgICBjb25zdHJhaW50PzogQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICApOiBSZXNvdXJjZU1vZGVsW10ge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5zY2hlbWEucHJvdmlkZXJfc2NoZW1hcz8uW2ZxcG5dO1xuICAgIGlmICghcHJvdmlkZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuIG5vdCBmaW5kIHByb3ZpZGVyICcke2ZxcG59JyBpbiBzY2hlbWFgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZXMgPSBPYmplY3QuZW50cmllcyhwcm92aWRlci5yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KS5tYXAoXG4gICAgICAoW3R5cGUsIHJlc291cmNlXSkgPT5cbiAgICAgICAgdGhpcy5yZXNvdXJjZVBhcnNlci5wYXJzZShmcXBuLCB0eXBlLCByZXNvdXJjZSwgXCJyZXNvdXJjZVwiLCBjb25zdHJhaW50KSxcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YVNvdXJjZXMgPSBPYmplY3QuZW50cmllcyhwcm92aWRlci5kYXRhX3NvdXJjZV9zY2hlbWFzIHx8IHt9KS5tYXAoXG4gICAgICAoW3R5cGUsIHJlc291cmNlXSkgPT5cbiAgICAgICAgdGhpcy5yZXNvdXJjZVBhcnNlci5wYXJzZShcbiAgICAgICAgICBmcXBuLFxuICAgICAgICAgIGBkYXRhXyR7dHlwZX1gLFxuICAgICAgICAgIHJlc291cmNlLFxuICAgICAgICAgIFwiZGF0YV9zb3VyY2VcIixcbiAgICAgICAgICBjb25zdHJhaW50LFxuICAgICAgICApLFxuICAgICk7XG5cbiAgICByZXR1cm4gKFtdIGFzIFJlc291cmNlTW9kZWxbXSkuY29uY2F0KC4uLnJlc291cmNlcywgLi4uZGF0YVNvdXJjZXMpO1xuICB9XG5cbiAgcHVibGljIGdldENsYXNzTmFtZUZvclJlc291cmNlKHRlcnJhZm9ybVR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlUGFyc2VyLmdldENsYXNzTmFtZUZvclJlc291cmNlKHRlcnJhZm9ybVR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldE5hbWVzcGFjZU5hbWVGb3JSZXNvdXJjZSh0ZXJyYWZvcm1UeXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVBhcnNlci5nZXROYW1lc3BhY2VOYW1lRm9yUmVzb3VyY2UodGVycmFmb3JtVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRQcm92aWRlcihcbiAgICBmcXBuOiBGUVBOLFxuICAgIHByb3ZpZGVyVmVyc2lvbj86IHN0cmluZyxcbiAgICBjb25zdHJhaW50PzogQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICApIHtcbiAgICBjb25zdCBuYW1lID0gY29uc3RyYWludD8ubmFtZVxuICAgICAgPyAoY29uc3RyYWludC5uYW1lIGFzIFByb3ZpZGVyTmFtZSlcbiAgICAgIDogcGFyc2VGUVBOKGZxcG4pLm5hbWU7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLnNjaGVtYS5wcm92aWRlcl9zY2hlbWFzPy5bZnFwbl07XG4gICAgaWYgKCFwcm92aWRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IGZpbmQgcHJvdmlkZXIgJyR7ZnFwbn0nIGluIHNjaGVtYWApO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRoaXMuYnVpbGRSZXNvdXJjZU1vZGVscyhmcXBuLCBjb25zdHJhaW50KS5mb3JFYWNoKChyZXNvdXJjZU1vZGVsKSA9PiB7XG4gICAgICBpZiAoY29uc3RyYWludCkge1xuICAgICAgICByZXNvdXJjZU1vZGVsLnByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQgPSBjb25zdHJhaW50LnZlcnNpb247XG4gICAgICAgIHJlc291cmNlTW9kZWwudGVycmFmb3JtUHJvdmlkZXJTb3VyY2UgPSBjb25zdHJhaW50LnNvdXJjZTtcbiAgICAgIH1cbiAgICAgIHJlc291cmNlTW9kZWwucHJvdmlkZXJWZXJzaW9uID0gcHJvdmlkZXJWZXJzaW9uO1xuXG4gICAgICBpZiAocmVzb3VyY2VNb2RlbC5zdHJ1Y3RzUmVxdWlyZVNoYXJkaW5nKSB7XG4gICAgICAgIGZpbGVzLnB1c2godGhpcy5lbWl0UmVzb3VyY2VXaXRoQ29tcGxleFN0cnVjdChyZXNvdXJjZU1vZGVsKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWxlcy5wdXNoKHRoaXMuZW1pdFJlc291cmNlKHJlc291cmNlTW9kZWwpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW1pdFJlc291cmNlUmVhZG1lKHJlc291cmNlTW9kZWwpO1xuICAgIH0pO1xuXG4gICAgaWYgKHByb3ZpZGVyLnByb3ZpZGVyKSB7XG4gICAgICBjb25zdCBwcm92aWRlclJlc291cmNlID0gdGhpcy5yZXNvdXJjZVBhcnNlci5wYXJzZShcbiAgICAgICAgZnFwbixcbiAgICAgICAgYHByb3ZpZGVyYCxcbiAgICAgICAgcHJvdmlkZXIucHJvdmlkZXIsXG4gICAgICAgIFwicHJvdmlkZXJcIixcbiAgICAgICAgY29uc3RyYWludCxcbiAgICAgICk7XG4gICAgICBpZiAoY29uc3RyYWludCkge1xuICAgICAgICBwcm92aWRlclJlc291cmNlLnByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQgPSBjb25zdHJhaW50LnZlcnNpb247XG4gICAgICAgIHByb3ZpZGVyUmVzb3VyY2UudGVycmFmb3JtUHJvdmlkZXJTb3VyY2UgPSBjb25zdHJhaW50LnNvdXJjZTtcbiAgICAgICAgcHJvdmlkZXJSZXNvdXJjZS50ZXJyYWZvcm1Qcm92aWRlck5hbWUgPSBjb25zdHJhaW50Lm5hbWU7XG4gICAgICB9XG4gICAgICBwcm92aWRlclJlc291cmNlLnByb3ZpZGVyVmVyc2lvbiA9IHByb3ZpZGVyVmVyc2lvbjtcbiAgICAgIGZpbGVzLnB1c2godGhpcy5lbWl0UmVzb3VyY2UocHJvdmlkZXJSZXNvdXJjZSkpO1xuICAgICAgdGhpcy5lbWl0UmVzb3VyY2VSZWFkbWUocHJvdmlkZXJSZXNvdXJjZSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0SW5kZXhGaWxlKG5hbWUsIGZpbGVzKTtcbiAgICB0aGlzLmVtaXRMYXp5SW5kZXhGaWxlKG5hbWUsIGZpbGVzKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFJlc291cmNlUmVhZG1lKHJlc291cmNlOiBSZXNvdXJjZU1vZGVsKTogdm9pZCB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBgJHtyZXNvdXJjZS5uYW1lc3BhY2VGb2xkZXJQYXRofS9SRUFETUUubWRgO1xuICAgIHRoaXMuY29kZS5vcGVuRmlsZShmaWxlUGF0aCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYCMgXFxgJHtyZXNvdXJjZS50ZXJyYWZvcm1UeXBlfVxcYGApO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgY29uc3QgdHlwZSA9IHJlc291cmNlLmlzUHJvdmlkZXJcbiAgICAgID8gcmVzb3VyY2UucHJvdmlkZXJcbiAgICAgIDogcmVzb3VyY2UudGVycmFmb3JtVHlwZTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBSZWZlciB0byB0aGUgVGVycmFmb3JtIFJlZ2lzdHJ5IGZvciBkb2NzOiBbXFxgJHt0eXBlfVxcYF0oJHtyZXNvdXJjZS5saW5rVG9Eb2NzfSkuYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUoZmlsZVBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0SW5kZXhGaWxlKHByb3ZpZGVyOiBQcm92aWRlck5hbWUsIGZpbGVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IGZvbGRlciA9IGBwcm92aWRlcnMvJHtwcm92aWRlcn1gO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7Zm9sZGVyfS9pbmRleC50c2A7XG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKGZpbGVQYXRoKTtcbiAgICB0aGlzLmNvZGUubGluZShcIi8vIGdlbmVyYXRlZCBieSBjZGt0biBnZXRcIik7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZmlsZS5yZXBsYWNlKGAke2ZvbGRlcn0vYCwgXCJcIikucmVwbGFjZShcIi9pbmRleC50c1wiLCBcIlwiKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgZXhwb3J0ICogYXMgJHt0b0NhbWVsQ2FzZShkaXJOYW1lKX0gZnJvbSAnLi8ke2Rpck5hbWV9L2luZGV4JHt0aGlzLmltcG9ydEV4dGVuc2lvbn0nO2AsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUoZmlsZVBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TGF6eUluZGV4RmlsZShwcm92aWRlcjogUHJvdmlkZXJOYW1lLCBmaWxlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBmb2xkZXIgPSBgcHJvdmlkZXJzLyR7cHJvdmlkZXJ9YDtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGAke2ZvbGRlcn0vbGF6eS1pbmRleC50c2A7XG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKGZpbGVQYXRoKTtcbiAgICB0aGlzLmNvZGUubGluZShcIi8vIGdlbmVyYXRlZCBieSBjZGt0biBnZXRcIik7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZmlsZS5yZXBsYWNlKGAke2ZvbGRlcn0vYCwgXCJcIikucmVwbGFjZShcIi9pbmRleC50c1wiLCBcIlwiKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICcke3RvQ2FtZWxDYXNlKFxuICAgICAgICAgIGRpck5hbWUsXG4gICAgICAgICl9JywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlcXVpcmUoJy4vJHtkaXJOYW1lfScpOyB9IH0pO2AsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUoZmlsZVBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2UocmVzb3VyY2U6IFJlc291cmNlTW9kZWwpOiBzdHJpbmcge1xuICAgIHRoaXMuY29kZS5vcGVuRmlsZShyZXNvdXJjZS5maWxlUGF0aCk7XG4gICAgdGhpcy5lbWl0RmlsZUhlYWRlcihyZXNvdXJjZSk7XG4gICAgdGhpcy5zdHJ1Y3RFbWl0dGVyLmVtaXQocmVzb3VyY2UpO1xuICAgIHRoaXMucmVzb3VyY2VFbWl0dGVyLmVtaXQocmVzb3VyY2UpO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUocmVzb3VyY2UuZmlsZVBhdGgpO1xuXG4gICAgcmV0dXJuIHJlc291cmNlLmZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVzb3VyY2VXaXRoQ29tcGxleFN0cnVjdChyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIGNvbnN0IGdlbmVyYXRlZEZpbGVzID0gW107XG5cbiAgICAvLyBkcm9wIHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGZpbGVwYXRoXG4gICAgY29uc3QgZmlsZVBhdGggPSByZXNvdXJjZS5maWxlUGF0aDtcbiAgICB0aGlzLmNvZGUub3BlbkZpbGUoZmlsZVBhdGgpO1xuICAgIHRoaXMuY29kZS5saW5lKGAvLyBnZW5lcmF0ZWQgZnJvbSB0ZXJyYWZvcm0gcmVzb3VyY2Ugc2NoZW1hYCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIGlmIChyZXNvdXJjZS5zdHJ1Y3RzUmVxdWlyZVNoYXJkaW5nKSB7XG4gICAgICBjb25zdCBzdHJ1Y3RzU3BlY2lmaWVyID0gYC4vJHtyZXNvdXJjZS5zdHJ1Y3RzRm9sZGVyTmFtZX0vaW5kZXgke3RoaXMuaW1wb3J0RXh0ZW5zaW9ufWA7XG4gICAgICBpZiAocmVzb3VyY2UucmVmZXJlbmNlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYGltcG9ydCB7ICR7cmVzb3VyY2UucmVmZXJlbmNlZFR5cGVzLmpvaW4oXG4gICAgICAgICAgICBcIiwgXFxuXCIsXG4gICAgICAgICAgKX19IGZyb20gJyR7c3RydWN0c1NwZWNpZmllcn0nO2AsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29kZS5saW5lKGBleHBvcnQgKiBmcm9tICcke3N0cnVjdHNTcGVjaWZpZXJ9JztgKTtcblxuICAgICAgcmVzb3VyY2UuaW1wb3J0U3RhdGVtZW50cy5mb3JFYWNoKChzdGF0ZW1lbnQpID0+XG4gICAgICAgIHRoaXMuY29kZS5saW5lKHN0YXRlbWVudCksXG4gICAgICApO1xuXG4gICAgICB0aGlzLnN0cnVjdEVtaXR0ZXIuZW1pdEludGVyZmFjZShyZXNvdXJjZSwgcmVzb3VyY2UuY29uZmlnU3RydWN0KTtcbiAgICAgIHRoaXMucmVzb3VyY2VFbWl0dGVyLmVtaXQocmVzb3VyY2UpO1xuXG4gICAgICB0aGlzLmNvZGUuY2xvc2VGaWxlKGZpbGVQYXRoKTtcblxuICAgICAgdGhpcy5zdHJ1Y3RFbWl0dGVyLmVtaXQocmVzb3VyY2UpO1xuICAgICAgZ2VuZXJhdGVkRmlsZXMucHVzaChyZXNvdXJjZS5maWxlTmFtZSk7XG4gICAgICBnZW5lcmF0ZWRGaWxlcy5wdXNoKHJlc291cmNlLnN0cnVjdHNGb2xkZXJOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb3VyY2UuaW1wb3J0U3RhdGVtZW50cy5mb3JFYWNoKChzdGF0ZW1lbnQpID0+XG4gICAgICAgIHRoaXMuY29kZS5saW5lKHN0YXRlbWVudCksXG4gICAgICApO1xuXG4gICAgICB0aGlzLnN0cnVjdEVtaXR0ZXIuZW1pdChyZXNvdXJjZSk7XG4gICAgICB0aGlzLnJlc291cmNlRW1pdHRlci5lbWl0KHJlc291cmNlKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUZpbGUoZmlsZVBhdGgpO1xuICAgICAgZ2VuZXJhdGVkRmlsZXMucHVzaChyZXNvdXJjZS5maWxlTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RmlsZUhlYWRlcihyZXNvdXJjZTogUmVzb3VyY2VNb2RlbCkge1xuICAgIHRoaXMuY29kZS5saW5lKGAvLyAke3Jlc291cmNlLmxpbmtUb0RvY3N9YCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYC8vIGdlbmVyYXRlZCBmcm9tIHRlcnJhZm9ybSByZXNvdXJjZSBzY2hlbWFgKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHJlc291cmNlLmltcG9ydFN0YXRlbWVudHMuZm9yRWFjaCgoc3RhdGVtZW50KSA9PiB0aGlzLmNvZGUubGluZShzdGF0ZW1lbnQpKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKFwiLy8gQ29uZmlndXJhdGlvblwiKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cdktn/provider-generator",
3
- "version": "0.24.0-pre.61",
3
+ "version": "0.24.0-pre.62",
4
4
  "description": "Exposes API to generate Terraform CDK provider bindings",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -35,9 +35,9 @@
35
35
  "glob": "10.5.0",
36
36
  "jsii": "~5.9.0",
37
37
  "jsii-pacmak": "1.128.0",
38
- "@cdktn/commons": "0.24.0-pre.61",
39
- "@cdktn/provider-schema": "0.24.0-pre.61",
40
- "cdktn": "0.24.0-pre.61"
38
+ "@cdktn/commons": "0.24.0-pre.62",
39
+ "@cdktn/provider-schema": "0.24.0-pre.62",
40
+ "cdktn": "0.24.0-pre.62"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/fs-extra": "8.1.5",
@@ -0,0 +1,84 @@
1
+ // Copyright (c) HashiCorp, Inc
2
+ // SPDX-License-Identifier: MPL-2.0
3
+ import {
4
+ ConstructsMakerProviderTarget,
5
+ Language,
6
+ ProviderSchema,
7
+ TerraformProviderConstraint,
8
+ } from "@cdktn/commons";
9
+ import { CodeMaker } from "codemaker";
10
+ import { TerraformProviderGenerator } from "../../generator/provider-generator";
11
+
12
+ // Builds a minimal provider schema keyed by a single FQPN. The provider body is
13
+ // intentionally empty (like the empty-provider-resources fixture) since these
14
+ // tests only exercise the schema-key <-> target-source matching logic.
15
+ const schemaWithKey = (fqpn: string): ProviderSchema => ({
16
+ provider_schemas: {
17
+ [fqpn]: { resource_schemas: null } as any,
18
+ },
19
+ provider_versions: {
20
+ [fqpn]: "1.84.0",
21
+ },
22
+ });
23
+
24
+ const targetForSource = (source: string) =>
25
+ new ConstructsMakerProviderTarget(
26
+ new TerraformProviderConstraint(`${source}@1.84.0`),
27
+ Language.TYPESCRIPT,
28
+ );
29
+
30
+ const generateFor = (schemaKey: string, source: string) => {
31
+ const generator = new TerraformProviderGenerator(
32
+ new CodeMaker(),
33
+ schemaWithKey(schemaKey),
34
+ );
35
+ generator.generate(targetForSource(source));
36
+ return generator;
37
+ };
38
+
39
+ describe("provider source matching against schema keys", () => {
40
+ it("matches a shorthand source against an OpenTofu registry schema key", () => {
41
+ // Regression test for #216: `tofu providers schema` returns keys under
42
+ // registry.opentofu.org, so a shorthand source must not assume
43
+ // registry.terraform.io.
44
+ const generator = generateFor(
45
+ "registry.opentofu.org/hashicorp/awscc",
46
+ "hashicorp/awscc",
47
+ );
48
+
49
+ expect(Object.keys(generator.versions)).toContain(
50
+ "registry.opentofu.org/hashicorp/awscc",
51
+ );
52
+ });
53
+
54
+ it("matches a shorthand source against a Terraform registry schema key", () => {
55
+ const generator = generateFor(
56
+ "registry.terraform.io/hashicorp/awscc",
57
+ "hashicorp/awscc",
58
+ );
59
+
60
+ expect(Object.keys(generator.versions)).toContain(
61
+ "registry.terraform.io/hashicorp/awscc",
62
+ );
63
+ });
64
+
65
+ it("keeps an explicit hostname strict and does not cross registries", () => {
66
+ expect(() =>
67
+ generateFor(
68
+ "registry.opentofu.org/hashicorp/awscc",
69
+ "registry.terraform.io/hashicorp/awscc",
70
+ ),
71
+ ).toThrow(/Could not find provider with constraint/);
72
+ });
73
+
74
+ it("matches an explicit hostname when it agrees with the schema key", () => {
75
+ const generator = generateFor(
76
+ "registry.opentofu.org/hashicorp/awscc",
77
+ "registry.opentofu.org/hashicorp/awscc",
78
+ );
79
+
80
+ expect(Object.keys(generator.versions)).toContain(
81
+ "registry.opentofu.org/hashicorp/awscc",
82
+ );
83
+ });
84
+ });
@@ -54,6 +54,13 @@ const isMatching = (
54
54
  name: "",
55
55
  };
56
56
  const targetElements = target.source.split("/");
57
+ // Only a 3-part source explicitly pins a registry hostname. Shorthand
58
+ // sources (e.g. "hashicorp/awscc") omit it, so we must not assume a
59
+ // default: Terraform resolves them under registry.terraform.io while
60
+ // OpenTofu resolves them under registry.opentofu.org. Comparing against a
61
+ // hard-coded default would make schema lookup fail under OpenTofu even
62
+ // though the provider was installed correctly.
63
+ const explicitHostname = targetElements.length === 3;
57
64
  switch (targetElements.length) {
58
65
  case 1: // only name set
59
66
  targetSource.name = targetElements[0].toLowerCase();
@@ -74,7 +81,7 @@ const isMatching = (
74
81
  }
75
82
 
76
83
  return (
77
- targetSource.hostname === hostname &&
84
+ (!explicitHostname || targetSource.hostname === hostname) &&
78
85
  targetSource.namespace === namespace &&
79
86
  targetSource.name === provider
80
87
  );