@fjall/components-infrastructure 0.75.3 → 0.77.1

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.
Files changed (184) hide show
  1. package/dist/lib/app.d.ts +125 -20
  2. package/dist/lib/app.js +171 -56
  3. package/dist/lib/aspects/resourceInventory.d.ts +41 -0
  4. package/dist/lib/aspects/resourceInventory.js +56 -0
  5. package/dist/lib/config/audit.d.ts +18 -0
  6. package/dist/lib/config/audit.js +22 -0
  7. package/dist/lib/config/aws/backupGlobalSettings.d.ts +1 -1
  8. package/dist/lib/config/aws/backupGlobalSettings.js +1 -1
  9. package/dist/lib/config/aws/cloudTrail.d.ts +1 -1
  10. package/dist/lib/config/aws/cloudTrail.js +2 -2
  11. package/dist/lib/config/aws/disasterRecovery.js +1 -1
  12. package/dist/lib/config/aws/ecrDefaultImage.d.ts +1 -1
  13. package/dist/lib/config/aws/ecrDefaultImage.js +4 -4
  14. package/dist/lib/config/aws/identityCenter.d.ts +3 -3
  15. package/dist/lib/config/aws/identityCenter.js +1 -1
  16. package/dist/lib/config/aws/identityCenterGroupMembership.d.ts +2 -2
  17. package/dist/lib/config/aws/identityCenterGroupMembership.js +1 -1
  18. package/dist/lib/config/aws/ipam.js +2 -4
  19. package/dist/lib/config/aws/organisation.d.ts +3 -3
  20. package/dist/lib/config/aws/organisation.js +1 -1
  21. package/dist/lib/config/aws/organisationsAccess.d.ts +1 -1
  22. package/dist/lib/config/aws/organisationsAccess.js +1 -1
  23. package/dist/lib/config/monitoring.d.ts +18 -0
  24. package/dist/lib/config/monitoring.js +22 -0
  25. package/dist/lib/patterns/aws/auditRole.d.ts +44 -0
  26. package/dist/lib/patterns/aws/auditRole.js +58 -0
  27. package/dist/lib/patterns/aws/buildkite.d.ts +3 -3
  28. package/dist/lib/patterns/aws/buildkite.js +1 -1
  29. package/dist/lib/patterns/aws/compute.d.ts +17 -11
  30. package/dist/lib/patterns/aws/compute.js +7 -7
  31. package/dist/lib/patterns/aws/database.d.ts +185 -24
  32. package/dist/lib/patterns/aws/database.js +280 -42
  33. package/dist/lib/patterns/aws/ec2.d.ts +43 -0
  34. package/dist/lib/patterns/aws/ec2.js +123 -0
  35. package/dist/lib/patterns/aws/fivetranProxy.d.ts +5 -5
  36. package/dist/lib/patterns/aws/fivetranProxy.js +1 -1
  37. package/dist/lib/patterns/aws/hostedZone.d.ts +2 -2
  38. package/dist/lib/patterns/aws/hostedZone.js +1 -1
  39. package/dist/lib/patterns/aws/index.d.ts +1 -0
  40. package/dist/lib/patterns/aws/index.js +2 -1
  41. package/dist/lib/patterns/aws/managedAccount.d.ts +2 -2
  42. package/dist/lib/patterns/aws/managedAccount.js +1 -1
  43. package/dist/lib/patterns/aws/managedIdentityCenter.js +1 -1
  44. package/dist/lib/patterns/aws/managedOrganisation.d.ts +3 -3
  45. package/dist/lib/patterns/aws/managedOrganisation.js +1 -1
  46. package/dist/lib/patterns/aws/managedPlatform.d.ts +2 -2
  47. package/dist/lib/patterns/aws/managedPlatform.js +2 -4
  48. package/dist/lib/patterns/aws/network.d.ts +75 -0
  49. package/dist/lib/patterns/aws/network.js +99 -0
  50. package/dist/lib/patterns/aws/storage.d.ts +4 -55
  51. package/dist/lib/patterns/aws/storage.js +3 -103
  52. package/dist/lib/resources/aws/audit/auditRole.d.ts +32 -0
  53. package/dist/lib/resources/aws/audit/auditRole.js +46 -0
  54. package/dist/lib/resources/aws/backup/backupPlan.d.ts +2 -2
  55. package/dist/lib/resources/aws/backup/backupPlan.js +1 -1
  56. package/dist/lib/resources/aws/backup/backupVault.d.ts +2 -2
  57. package/dist/lib/resources/aws/backup/backupVault.js +1 -1
  58. package/dist/lib/resources/aws/base/awsStack.js +1 -4
  59. package/dist/lib/resources/aws/compute/ec2.d.ts +4 -3
  60. package/dist/lib/resources/aws/compute/ec2.js +5 -3
  61. package/dist/lib/resources/aws/compute/ecs.d.ts +9 -9
  62. package/dist/lib/resources/aws/compute/ecs.js +68 -20
  63. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +6 -7
  64. package/dist/lib/resources/aws/compute/ecsFreeTier.js +17 -10
  65. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +6 -7
  66. package/dist/lib/resources/aws/compute/ecsSpot.js +19 -14
  67. package/dist/lib/resources/aws/compute/lambda.d.ts +15 -10
  68. package/dist/lib/resources/aws/compute/lambda.js +27 -19
  69. package/dist/lib/resources/aws/database/database.d.ts +2 -2
  70. package/dist/lib/resources/aws/database/database.js +1 -1
  71. package/dist/lib/resources/aws/database/databaseInstance.d.ts +2 -2
  72. package/dist/lib/resources/aws/database/databaseInstance.js +2 -2
  73. package/dist/lib/resources/aws/database/index.d.ts +0 -1
  74. package/dist/lib/resources/aws/database/index.js +1 -2
  75. package/dist/lib/resources/aws/database/rdsAurora.d.ts +24 -6
  76. package/dist/lib/resources/aws/database/rdsAurora.js +212 -85
  77. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +41 -6
  78. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +38 -8
  79. package/dist/lib/resources/aws/database/rdsInstance.d.ts +19 -10
  80. package/dist/lib/resources/aws/database/rdsInstance.js +220 -73
  81. package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +1 -1
  82. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +1 -1
  83. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +1 -1
  84. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -1
  85. package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -1
  86. package/dist/lib/resources/aws/iam/identityCenter/group.js +1 -1
  87. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +2 -2
  88. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +1 -1
  89. package/dist/lib/resources/aws/iam/instanceProfile.d.ts +1 -1
  90. package/dist/lib/resources/aws/iam/instanceProfile.js +1 -1
  91. package/dist/lib/resources/aws/iam/managedPolicy.d.ts +1 -1
  92. package/dist/lib/resources/aws/iam/managedPolicy.js +1 -1
  93. package/dist/lib/resources/aws/iam/policy.d.ts +1 -1
  94. package/dist/lib/resources/aws/iam/policy.js +1 -1
  95. package/dist/lib/resources/aws/iam/role.d.ts +1 -1
  96. package/dist/lib/resources/aws/iam/role.js +1 -1
  97. package/dist/lib/resources/aws/iam/securityGroup.d.ts +1 -1
  98. package/dist/lib/resources/aws/iam/securityGroup.js +1 -1
  99. package/dist/lib/resources/aws/index.d.ts +1 -0
  100. package/dist/lib/resources/aws/index.js +2 -1
  101. package/dist/lib/resources/aws/logging/logGroup.d.ts +2 -2
  102. package/dist/lib/resources/aws/logging/logGroup.js +1 -1
  103. package/dist/lib/resources/aws/monitoring/index.d.ts +1 -0
  104. package/dist/lib/resources/aws/monitoring/index.js +18 -0
  105. package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +28 -0
  106. package/dist/lib/resources/aws/monitoring/monitoringRole.js +69 -0
  107. package/dist/lib/resources/aws/networking/index.d.ts +0 -1
  108. package/dist/lib/resources/aws/networking/index.js +1 -2
  109. package/dist/lib/resources/aws/networking/ipam.d.ts +1 -1
  110. package/dist/lib/resources/aws/networking/ipam.js +1 -1
  111. package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
  112. package/dist/lib/resources/aws/networking/ipamPool.js +1 -2
  113. package/dist/lib/resources/aws/networking/vpc.d.ts +42 -23
  114. package/dist/lib/resources/aws/networking/vpc.js +185 -36
  115. package/dist/lib/resources/aws/secrets/alias.d.ts +1 -1
  116. package/dist/lib/resources/aws/secrets/alias.js +1 -1
  117. package/dist/lib/resources/aws/secrets/parameter.d.ts +1 -1
  118. package/dist/lib/resources/aws/secrets/parameter.js +1 -1
  119. package/dist/lib/resources/aws/secrets/secret.d.ts +8 -4
  120. package/dist/lib/resources/aws/secrets/secret.js +19 -2
  121. package/dist/lib/resources/aws/storage/ecr.d.ts +4 -4
  122. package/dist/lib/resources/aws/storage/ecr.js +1 -1
  123. package/dist/lib/resources/aws/storage/s3.d.ts +2 -2
  124. package/dist/lib/resources/aws/storage/s3.js +1 -1
  125. package/dist/lib/resources/aws/utilities/awsCustomResource.d.ts +1 -1
  126. package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
  127. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +1 -1
  128. package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -1
  129. package/dist/lib/resources/aws/utilities/codeBuild.d.ts +1 -1
  130. package/dist/lib/resources/aws/utilities/codeBuild.js +1 -1
  131. package/dist/lib/resources/aws/utilities/customResource.d.ts +9 -7
  132. package/dist/lib/resources/aws/utilities/customResource.js +35 -11
  133. package/dist/lib/resources/aws/utilities/customResourceProvider.d.ts +2 -2
  134. package/dist/lib/resources/aws/utilities/customResourceProvider.js +1 -1
  135. package/dist/lib/resources/aws/utilities/resourceShare.d.ts +2 -2
  136. package/dist/lib/resources/aws/utilities/resourceShare.js +1 -1
  137. package/dist/lib/utils/getAsync.d.ts +1 -1
  138. package/dist/lib/utils/getAsync.js +1 -1
  139. package/dist/lib/utils/getCidr.d.ts +8 -0
  140. package/dist/lib/utils/getCidr.js +40 -0
  141. package/dist/lib/utils/getConfig.d.ts +2 -2
  142. package/dist/lib/utils/getConfig.js +3 -3
  143. package/dist/lib/utils/index.d.ts +1 -0
  144. package/dist/lib/utils/index.js +2 -1
  145. package/dist/lib/utils/resourceNaming.d.ts +41 -0
  146. package/dist/lib/utils/resourceNaming.js +77 -0
  147. package/dist/lib/utils/standardTagsAspect.d.ts +2 -2
  148. package/dist/lib/utils/standardTagsAspect.js +6 -5
  149. package/dist/lib/utils/tagResource.d.ts +1 -1
  150. package/dist/lib/utils/tagResource.js +1 -1
  151. package/package.json +3 -3
  152. package/dist/lib/__tests__/patterns/__snapshots__/compute.test.js.snap +0 -433
  153. package/dist/lib/__tests__/patterns/compute.test.d.ts +0 -1
  154. package/dist/lib/__tests__/patterns/compute.test.js +0 -137
  155. package/dist/lib/__tests__/simple.test.d.ts +0 -0
  156. package/dist/lib/__tests__/simple.test.js +0 -12
  157. package/dist/lib/resources/aws/organisations/account.d.ts +0 -37
  158. package/dist/lib/resources/aws/organisations/account.js +0 -220
  159. package/dist/lib/resources/aws/organisations/delegatedAdministrator.d.ts +0 -14
  160. package/dist/lib/resources/aws/organisations/delegatedAdministrator.js +0 -61
  161. package/dist/lib/resources/aws/organisations/index.d.ts +0 -8
  162. package/dist/lib/resources/aws/organisations/index.js +0 -22
  163. package/dist/lib/resources/aws/organisations/interfaces.d.ts +0 -105
  164. package/dist/lib/resources/aws/organisations/interfaces.js +0 -3
  165. package/dist/lib/resources/aws/organisations/organisation.d.ts +0 -47
  166. package/dist/lib/resources/aws/organisations/organisation.js +0 -263
  167. package/dist/lib/resources/aws/organisations/organisationalUnit.d.ts +0 -28
  168. package/dist/lib/resources/aws/organisations/organisationalUnit.js +0 -170
  169. package/dist/lib/resources/aws/organisations/policy.d.ts +0 -17
  170. package/dist/lib/resources/aws/organisations/policy.js +0 -93
  171. package/dist/lib/resources/aws/organisations/trustedServiceAccess.d.ts +0 -13
  172. package/dist/lib/resources/aws/organisations/trustedServiceAccess.js +0 -58
  173. package/dist/lib/resources/aws/organisations/types.d.ts +0 -165
  174. package/dist/lib/resources/aws/organisations/types.js +0 -36
  175. package/dist/lib/utils/directTagging.d.ts +0 -31
  176. package/dist/lib/utils/directTagging.js +0 -86
  177. package/dist/lib/utils/fjallConstruct.d.ts +0 -8
  178. package/dist/lib/utils/fjallConstruct.js +0 -18
  179. package/dist/lib/utils/fjallStackSynthesizer.d.ts +0 -9
  180. package/dist/lib/utils/fjallStackSynthesizer.js +0 -22
  181. package/dist/lib/utils/tagContext.d.ts +0 -28
  182. package/dist/lib/utils/tagContext.js +0 -53
  183. package/dist/lib/utils/tagSynthesizer.d.ts +0 -13
  184. package/dist/lib/utils/tagSynthesizer.js +0 -55
@@ -5,15 +5,15 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const aws_rds_1 = require("aws-cdk-lib/aws-rds");
6
6
  const constructs_1 = require("constructs");
7
7
  const rdsAurora_1 = require("./rdsAurora");
8
+ const resourceNaming_1 = require("../../../utils/resourceNaming");
8
9
  class RdsAuroraGlobal extends constructs_1.Construct {
9
10
  constructor(scope, id, props) {
10
11
  super(scope, id);
11
12
  this.props = props;
12
13
  this.currentRegion = aws_cdk_lib_1.Stack.of(this).region;
13
- // Ensure global cluster identifier is lowercase for consistency with other identifiers
14
14
  this.globalId =
15
15
  props.globalClusterIdentifier?.toLowerCase() ||
16
- `${props.databaseName.toLowerCase()}-global`;
16
+ resourceNaming_1.ResourceNaming.globalClusterId(props.databaseName);
17
17
  // create clusters / global cluster depending on region
18
18
  this.addAuroraCluster();
19
19
  this.addGlobalCluster();
@@ -24,7 +24,7 @@ class RdsAuroraGlobal extends constructs_1.Construct {
24
24
  return this.globalId;
25
25
  }
26
26
  getPrimaryClusterIdentifier() {
27
- return `${this.props.databaseName.toLowerCase()}-primary-cluster`;
27
+ return resourceNaming_1.ResourceNaming.primaryClusterId(this.props.databaseName);
28
28
  }
29
29
  getGlobalClusterEngineString() {
30
30
  // Default to aurora-postgresql if no engine specified (matches existing behavior)
@@ -95,23 +95,49 @@ class RdsAuroraGlobal extends constructs_1.Construct {
95
95
  }
96
96
  // create an Aurora cluster in this region (primary or secondary)
97
97
  addAuroraCluster() {
98
+ // Common configuration shared between primary and secondary clusters
99
+ const commonConfig = {
100
+ engine: this.props.engine,
101
+ engineConfig: this.props.engineConfig,
102
+ // Instance configuration
103
+ writer: this.props.writer,
104
+ readers: this.props.readers,
105
+ // Nested configurations
106
+ proxy: this.props.proxy,
107
+ encryption: this.props.encryption,
108
+ // Operational configuration
109
+ backupRetention: this.props.backupRetention,
110
+ monitoringInterval: this.props.monitoringInterval,
111
+ preferredMaintenanceWindow: this.props.preferredMaintenanceWindow,
112
+ port: this.props.port,
113
+ performanceInsights: this.props.performanceInsights,
114
+ snapshotIdentifier: this.props.snapshotIdentifier
115
+ };
98
116
  if (this.props.primaryRegion === this.currentRegion) {
99
117
  // primary
100
118
  this.primaryCluster = new rdsAurora_1.RdsAurora(this, `${this.props.databaseName}Primary`, {
101
119
  vpc: this.props.vpc,
102
120
  databaseName: this.props.databaseName,
103
- engine: this.props.engine,
104
- clusterIdentifier: this.getPrimaryClusterIdentifier()
121
+ clusterIdentifier: this.getPrimaryClusterIdentifier(),
122
+ // Enable secret replication to secondary regions
123
+ secretReplicaRegions: this.props.secondaryRegions,
124
+ // Primary region creates credentials
125
+ credentials: this.props.credentials,
126
+ ...commonConfig
105
127
  });
106
128
  this.connections = this.primaryCluster.connections;
107
129
  }
108
130
  else {
109
131
  // secondary region
132
+ // Pass databaseName for resource naming, but flag as global secondary
133
+ // This prevents setting credentials and defaultDatabaseName which are inherited from primary
110
134
  this.regionalCluster = new rdsAurora_1.RdsAurora(this, `${this.props.databaseName}Regional`, {
111
135
  vpc: this.props.vpc,
112
136
  databaseName: this.props.databaseName,
113
- engine: this.props.engine,
114
- clusterIdentifier: `${this.props.databaseName}-secondary-${this.currentRegion}`
137
+ clusterIdentifier: resourceNaming_1.ResourceNaming.secondaryClusterId(this.props.databaseName, this.currentRegion),
138
+ isGlobalSecondary: true,
139
+ // Secondary doesn't create credentials (uses replicated secret)
140
+ ...commonConfig
115
141
  });
116
142
  // set the L1 DBCluster property so CloudFormation will join it to the global cluster
117
143
  if (this.regionalCluster) {
@@ -119,6 +145,10 @@ class RdsAuroraGlobal extends constructs_1.Construct {
119
145
  this.regionalCluster.getCfnCluster();
120
146
  if (regionalL1) {
121
147
  regionalL1.globalClusterIdentifier = this.globalId;
148
+ // Enable write forwarding if requested
149
+ if (this.props.enableGlobalWriteForwarding) {
150
+ regionalL1.enableGlobalWriteForwarding = true;
151
+ }
122
152
  }
123
153
  this.connections = this.regionalCluster.connections;
124
154
  }
@@ -153,4 +183,4 @@ class RdsAuroraGlobal extends constructs_1.Construct {
153
183
  }
154
184
  }
155
185
  exports.RdsAuroraGlobal = RdsAuroraGlobal;
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUErQztBQUMvQyxpREFBcUU7QUFDckUsMkNBQXVDO0FBR3ZDLDJDQUF3QztBQWN4QyxNQUFhLGVBQWdCLFNBQVEsc0JBQVM7SUFVNUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEyQjtRQUNuRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzNDLHVGQUF1RjtRQUN2RixJQUFJLENBQUMsUUFBUTtZQUNYLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxXQUFXLEVBQUU7Z0JBQzVDLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDO1FBRS9DLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELHlCQUF5QjtJQUN6QiwwQkFBMEI7UUFDeEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCwyQkFBMkI7UUFDekIsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQztJQUNwRSxDQUFDO0lBRU8sNEJBQTRCO1FBQ2xDLGtGQUFrRjtRQUNsRixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQUUsT0FB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SUFBSSxFQUNKLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLCtCQUErQixFQUN6RDtZQUNFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNwQixVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVkseUJBQXlCO1NBQ2hFLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyRSxJQUFJLElBQUksQ0FBQyxlQUFlO1lBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdEUsSUFBSSxJQUFJLENBQUMsZUFBZTtZQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4RSxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xFLElBQUksSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRjtBQXpMRCwwQ0F5TEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDZm5HbG9iYWxDbHVzdGVyLCBDZm5EQkNsdXN0ZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElWcGMsIENvbm5lY3Rpb25zLCBJQ29ubmVjdGFibGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgSUNsdXN0ZXJFbmdpbmUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0IHsgUmRzQXVyb3JhIH0gZnJvbSBcIi4vcmRzQXVyb3JhXCI7XG5pbXBvcnQgeyBTZWNyZXQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuXG5pbnRlcmZhY2UgUmRzQXVyb3JhR2xvYmFsUHJvcHMge1xuICB2cGM6IElWcGM7XG4gIGRhdGFiYXNlTmFtZTogc3RyaW5nO1xuICAvKiogcHJpbWFyeSByZWdpb24gd2hlcmUgdGhlIGluaXRpYWwgY2x1c3RlciAmIGdsb2JhbCBjbHVzdGVyIHJlc291cmNlIGFyZSBjcmVhdGVkICovXG4gIHByaW1hcnlSZWdpb246IHN0cmluZztcbiAgLyoqIG9wdGlvbmFsIGRldGVybWluaXN0aWMgaWQgZm9yIHRoZSBnbG9iYWwgY2x1c3RlciAoc2hvdWxkIGJlIHNoYXJlZCBhY3Jvc3Mgc3RhY2tzL3JlZ2lvbnMpICovXG4gIGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyPzogc3RyaW5nO1xuICAvKiogb3B0aW9uYWwgZW5naW5lIHRvIGZvcndhcmQgdG8gdGhlIHVuZGVybHlpbmcgY2x1c3RlciAqL1xuICBlbmdpbmU/OiBJQ2x1c3RlckVuZ2luZTtcbn1cblxuZXhwb3J0IGNsYXNzIFJkc0F1cm9yYUdsb2JhbCBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSBnbG9iYWxDbHVzdGVyPzogQ2ZuR2xvYmFsQ2x1c3RlcjtcbiAgcHJpdmF0ZSBwcmltYXJ5Q2x1c3Rlcj86IFJkc0F1cm9yYTtcbiAgcHJpdmF0ZSByZWdpb25hbENsdXN0ZXI/OiBSZHNBdXJvcmE7XG4gIHByaXZhdGUgcHJvcHM6IFJkc0F1cm9yYUdsb2JhbFByb3BzO1xuICBwcml2YXRlIGN1cnJlbnRSZWdpb246IHN0cmluZztcbiAgcHJpdmF0ZSBnbG9iYWxJZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSZHNBdXJvcmFHbG9iYWxQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5jdXJyZW50UmVnaW9uID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIC8vIEVuc3VyZSBnbG9iYWwgY2x1c3RlciBpZGVudGlmaWVyIGlzIGxvd2VyY2FzZSBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBpZGVudGlmaWVyc1xuICAgIHRoaXMuZ2xvYmFsSWQgPVxuICAgICAgcHJvcHMuZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXI/LnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZS50b0xvd2VyQ2FzZSgpfS1nbG9iYWxgO1xuXG4gICAgLy8gY3JlYXRlIGNsdXN0ZXJzIC8gZ2xvYmFsIGNsdXN0ZXIgZGVwZW5kaW5nIG9uIHJlZ2lvblxuICAgIHRoaXMuYWRkQXVyb3JhQ2x1c3RlcigpO1xuICAgIHRoaXMuYWRkR2xvYmFsQ2x1c3RlcigpO1xuICAgIHRoaXMuYWRkT3V0cHV0cygpO1xuICB9XG5cbiAgLy8gLS0tIHB1YmxpYyBoZWxwZXJzIC0tLVxuICBnZXRHbG9iYWxDbHVzdGVySWRlbnRpZmllcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdsb2JhbElkO1xuICB9XG5cbiAgZ2V0UHJpbWFyeUNsdXN0ZXJJZGVudGlmaWVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lLnRvTG93ZXJDYXNlKCl9LXByaW1hcnktY2x1c3RlcmA7XG4gIH1cblxuICBwcml2YXRlIGdldEdsb2JhbENsdXN0ZXJFbmdpbmVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAvLyBEZWZhdWx0IHRvIGF1cm9yYS1wb3N0Z3Jlc3FsIGlmIG5vIGVuZ2luZSBzcGVjaWZpZWQgKG1hdGNoZXMgZXhpc3RpbmcgYmVoYXZpb3IpXG4gICAgaWYgKCF0aGlzLnByb3BzLmVuZ2luZSkgcmV0dXJuIFwiYXVyb3JhLXBvc3RncmVzcWxcIjtcblxuICAgIGNvbnN0IGVuZ2luZU9iajogYW55ID0gdGhpcy5wcm9wcy5lbmdpbmUgYXMgYW55O1xuXG4gICAgLy8gVHJ5IGNvbW1vbiBsb2NhdGlvbnMgZm9yIHRoZSBlbmdpbmUgaWRlbnRpZmllclxuICAgIGxldCBlbmdpbmVUeXBlOiB1bmtub3duID1cbiAgICAgIGVuZ2luZU9iai5lbmdpbmVUeXBlID8/IGVuZ2luZU9iai5lbmdpbmUgPz8gZW5naW5lT2JqLm5hbWU7XG5cbiAgICAvLyBJZiB0aGUgZW5naW5lIHdhcyBwcm92aWRlZCBhcyBhIHJhdyBzdHJpbmcgKHVubGlrZWx5IGJ1dCBzdXBwb3J0IGl0KVxuICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5lbmdpbmUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGVuZ2luZVR5cGUgPSB0aGlzLnByb3BzLmVuZ2luZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byB0b1N0cmluZygpIGZvciBUb2tlbi1saWtlIG9iamVjdHNcbiAgICBpZiAoIWVuZ2luZVR5cGUgJiYgdHlwZW9mIGVuZ2luZU9iai50b1N0cmluZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlbmdpbmVUeXBlID0gZW5naW5lT2JqLnRvU3RyaW5nKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGVuZ2luZVR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBlbmdpbmVUeXBlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJhdXJvcmEtcG9zdGdyZXNxbFwiO1xuXG4gICAgLy8gTm9ybWFsaXplIGNvbW1vbiBmb3JtczogQVVST1JBX1BPU1RHUkVTUUwgLT4gYXVyb3JhLXBvc3RncmVzcWwsIGF1cm9yYV9wb3N0Z3Jlc3FsIC0+IGF1cm9yYS1wb3N0Z3Jlc3FsXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IGVuZ2luZVR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiLVwiKTtcblxuICAgIC8vIElmIHRoZSBub3JtYWxpemVkIHZhbHVlIGlzIGp1c3QgJ2F1cm9yYScsIHByZWZlciB0aGUgbW9yZSBzcGVjaWZpYyBwb3N0Z3JlcyBkZWZhdWx0XG4gICAgaWYgKG5vcm1hbGl6ZWQgPT09IFwiYXVyb3JhXCIpIHJldHVybiBcImF1cm9yYS1wb3N0Z3Jlc3FsXCI7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIC8vIGNyZWF0ZSB0aGUgQ2ZuR2xvYmFsQ2x1c3RlciBvbmx5IGluIHRoZSBwcmltYXJ5IHJlZ2lvblxuICBhZGRHbG9iYWxDbHVzdGVyKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByaW1hcnlSZWdpb24gIT09IHRoaXMuY3VycmVudFJlZ2lvbikgcmV0dXJuO1xuXG4gICAgLy8gY3JlYXRlIHRoZSBnbG9iYWwgY2x1c3RlciByZXNvdXJjZSByZWZlcmVuY2luZyB0aGUgcHJpbWFyeSBjbHVzdGVyIGlkZW50aWZpZXJcbiAgICAvLyBQcmVmZXIgcmVmZXJlbmNpbmcgdGhlIEwxIERCQ2x1c3RlciBSZWYgc28gQ2xvdWRGb3JtYXRpb24gd2lsbCBjcmVhdGUgdGhlXG4gICAgLy8gREJDbHVzdGVyIGZpcnN0IGFuZCB3ZSBhdm9pZCBpZGVudGlmaWVyLWNhc2luZyBtaXNtYXRjaGVzLlxuICAgIGxldCBzb3VyY2VJZGVudGlmaWVyOiBhbnkgPSB0aGlzLmdldFByaW1hcnlDbHVzdGVySWRlbnRpZmllcigpO1xuICAgIGxldCBwcmltYXJ5TDE6IENmbkRCQ2x1c3RlciB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0aGlzLnByaW1hcnlDbHVzdGVyKSB7XG4gICAgICAvLyBVc2UgdGhlIGhlbHBlciBvbiBSZHNBdXJvcmEgdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIEwxIERCQ2x1c3RlciAobW9yZSByZWxpYWJsZVxuICAgICAgLy8gdGhhbiByZWx5aW5nIG9uIG5vZGUuZGVmYXVsdENoaWxkIHdoaWNoIGNhbiB2YXJ5IGRlcGVuZGluZyBvbiBjb25zdHJ1Y3Qgb3JkZXJpbmcpXG4gICAgICBwcmltYXJ5TDEgPVxuICAgICAgICB0aGlzLnByaW1hcnlDbHVzdGVyLmdldENmbkNsdXN0ZXIgJiZcbiAgICAgICAgdGhpcy5wcmltYXJ5Q2x1c3Rlci5nZXRDZm5DbHVzdGVyKCk7XG4gICAgICBpZiAocHJpbWFyeUwxKSB7XG4gICAgICAgIHNvdXJjZUlkZW50aWZpZXIgPSBwcmltYXJ5TDEucmVmO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZ2xvYmFsQ2x1c3RlciA9IG5ldyBDZm5HbG9iYWxDbHVzdGVyKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lfUdsb2JhbENsdXN0ZXJgLFxuICAgICAge1xuICAgICAgICBnbG9iYWxDbHVzdGVySWRlbnRpZmllcjogdGhpcy5nbG9iYWxJZCxcbiAgICAgICAgc291cmNlRGJDbHVzdGVySWRlbnRpZmllcjogc291cmNlSWRlbnRpZmllclxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBlbnN1cmUgdGhlIHVuZGVybHlpbmcgcHJpbWFyeSBEQkNsdXN0ZXIgTDEgaGFzIHRoZSBnbG9iYWxDbHVzdGVySWRlbnRpZmllciBzZXRcbiAgICBpZiAocHJpbWFyeUwxKSB7XG4gICAgICAvLyBNYWtlIHRoZSBDRk4gZGVwZW5kZW5jeSBleHBsaWNpdCBzbyB0aGUgREJDbHVzdGVyIGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBHbG9iYWxDbHVzdGVyXG4gICAgICB0aGlzLmdsb2JhbENsdXN0ZXIuYWRkRGVwZW5kc09uKHByaW1hcnlMMSk7XG4gICAgICAvLyBJTVBPUlRBTlQ6IGRvIE5PVCBzZXQgdGhlIHByaW1hcnkgREJDbHVzdGVyJ3MgYGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyYCBoZXJlLlxuICAgICAgLy8gSWYgd2Ugc2V0IHRoZSBwcmltYXJ5IERCQ2x1c3RlciB0byByZWZlcmVuY2UgdGhlIGdsb2JhbCBjbHVzdGVyLCBDbG91ZEZvcm1hdGlvblxuICAgICAgLy8gd2lsbCBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoYXQgdGhlIGdsb2JhbCBjbHVzdGVyIGV4aXN0cyB3aGVuIGNyZWF0aW5nIHRoZVxuICAgICAgLy8gREJDbHVzdGVyIOKAlCBidXQgdGhlIGdsb2JhbCBjbHVzdGVyIGlzIGNyZWF0ZWQgYWZ0ZXJ3YXJkICh3ZSBhZGQgYVxuICAgICAgLy8gZGVwZW5kc09uKSwgd2hpY2ggY2F1c2VzIGEgXCJHbG9iYWwgY2x1c3RlciAuLi4gbm90IGZvdW5kXCIgZXJyb3IuIFRoZVxuICAgICAgLy8gY29ycmVjdCBvcmRlciBpcyB0byBjcmVhdGUgdGhlIERCQ2x1c3RlciBmaXJzdCwgdGhlbiBjcmVhdGUgdGhlXG4gICAgICAvLyBDZm5HbG9iYWxDbHVzdGVyIHdpdGggYHNvdXJjZURiQ2x1c3RlcklkZW50aWZpZXJgIHBvaW50aW5nIGF0IHRoZVxuICAgICAgLy8gcHJpbWFyeSBjbHVzdGVyJ3MgUmVmLiBMZWF2aW5nIHRoZSBwcmltYXJ5IEwxIHdpdGhvdXQgdGhlXG4gICAgICAvLyBgZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXJgIGF2b2lkcyB0aGUgY2lyY3VsYXIgcmVmZXJlbmNlLlxuICAgIH1cbiAgfVxuXG4gIC8vIGNyZWF0ZSBhbiBBdXJvcmEgY2x1c3RlciBpbiB0aGlzIHJlZ2lvbiAocHJpbWFyeSBvciBzZWNvbmRhcnkpXG4gIGFkZEF1cm9yYUNsdXN0ZXIoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJpbWFyeVJlZ2lvbiA9PT0gdGhpcy5jdXJyZW50UmVnaW9uKSB7XG4gICAgICAvLyBwcmltYXJ5XG4gICAgICB0aGlzLnByaW1hcnlDbHVzdGVyID0gbmV3IFJkc0F1cm9yYShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7dGhpcy5wcm9wcy5kYXRhYmFzZU5hbWV9UHJpbWFyeWAsXG4gICAgICAgIHtcbiAgICAgICAgICB2cGM6IHRoaXMucHJvcHMudnBjLFxuICAgICAgICAgIGRhdGFiYXNlTmFtZTogdGhpcy5wcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgZW5naW5lOiB0aGlzLnByb3BzLmVuZ2luZSxcbiAgICAgICAgICBjbHVzdGVySWRlbnRpZmllcjogdGhpcy5nZXRQcmltYXJ5Q2x1c3RlcklkZW50aWZpZXIoKVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMucHJpbWFyeUNsdXN0ZXIuY29ubmVjdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNlY29uZGFyeSByZWdpb25cbiAgICAgIHRoaXMucmVnaW9uYWxDbHVzdGVyID0gbmV3IFJkc0F1cm9yYShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7dGhpcy5wcm9wcy5kYXRhYmFzZU5hbWV9UmVnaW9uYWxgLFxuICAgICAgICB7XG4gICAgICAgICAgdnBjOiB0aGlzLnByb3BzLnZwYyxcbiAgICAgICAgICBkYXRhYmFzZU5hbWU6IHRoaXMucHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgICAgIGVuZ2luZTogdGhpcy5wcm9wcy5lbmdpbmUsXG4gICAgICAgICAgY2x1c3RlcklkZW50aWZpZXI6IGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lfS1zZWNvbmRhcnktJHt0aGlzLmN1cnJlbnRSZWdpb259YFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyBzZXQgdGhlIEwxIERCQ2x1c3RlciBwcm9wZXJ0eSBzbyBDbG91ZEZvcm1hdGlvbiB3aWxsIGpvaW4gaXQgdG8gdGhlIGdsb2JhbCBjbHVzdGVyXG4gICAgICBpZiAodGhpcy5yZWdpb25hbENsdXN0ZXIpIHtcbiAgICAgICAgY29uc3QgcmVnaW9uYWxMMSA9XG4gICAgICAgICAgdGhpcy5yZWdpb25hbENsdXN0ZXIuZ2V0Q2ZuQ2x1c3RlciAmJlxuICAgICAgICAgIHRoaXMucmVnaW9uYWxDbHVzdGVyLmdldENmbkNsdXN0ZXIoKTtcbiAgICAgICAgaWYgKHJlZ2lvbmFsTDEpIHtcbiAgICAgICAgICByZWdpb25hbEwxLmdsb2JhbENsdXN0ZXJJZGVudGlmaWVyID0gdGhpcy5nbG9iYWxJZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5yZWdpb25hbENsdXN0ZXIuY29ubmVjdGlvbnM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkT3V0cHV0cygpIHtcbiAgICBuZXcgQ2ZuT3V0cHV0KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lfUdsb2JhbENsdXN0ZXJJZGVudGlmaWVyT3V0cHV0YCxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuZ2xvYmFsSWQsXG4gICAgICAgIGV4cG9ydE5hbWU6IGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lfUdsb2JhbENsdXN0ZXJJZGVudGlmaWVyYFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBnZXRDcmVkZW50aWFscygpOiBTZWNyZXQge1xuICAgIGlmICh0aGlzLnByaW1hcnlDbHVzdGVyKSByZXR1cm4gdGhpcy5wcmltYXJ5Q2x1c3Rlci5nZXRDcmVkZW50aWFscygpO1xuICAgIGlmICh0aGlzLnJlZ2lvbmFsQ2x1c3RlcikgcmV0dXJuIHRoaXMucmVnaW9uYWxDbHVzdGVyLmdldENyZWRlbnRpYWxzKCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQXVyb3JhIGNsdXN0ZXIgYXZhaWxhYmxlIHRvIHJldHVybiBjcmVkZW50aWFscyBmcm9tXCIpO1xuICB9XG5cbiAgZ2V0SG9zdEVuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucHJpbWFyeUNsdXN0ZXIpIHJldHVybiB0aGlzLnByaW1hcnlDbHVzdGVyLmdldEhvc3RFbmRwb2ludCgpO1xuICAgIGlmICh0aGlzLnJlZ2lvbmFsQ2x1c3RlcikgcmV0dXJuIHRoaXMucmVnaW9uYWxDbHVzdGVyLmdldEhvc3RFbmRwb2ludCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIEF1cm9yYSBjbHVzdGVyIGF2YWlsYWJsZSB0byByZXR1cm4gZW5kcG9pbnQgZnJvbVwiKTtcbiAgfVxuXG4gIGdldEhvc3RQb3J0KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucHJpbWFyeUNsdXN0ZXIpIHJldHVybiB0aGlzLnByaW1hcnlDbHVzdGVyLmdldEhvc3RQb3J0KCk7XG4gICAgaWYgKHRoaXMucmVnaW9uYWxDbHVzdGVyKSByZXR1cm4gdGhpcy5yZWdpb25hbENsdXN0ZXIuZ2V0SG9zdFBvcnQoKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBBdXJvcmEgY2x1c3RlciBhdmFpbGFibGUgdG8gcmV0dXJuIHBvcnQgZnJvbVwiKTtcbiAgfVxufVxuIl19
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE4RDtBQUM5RCxpREFBMEU7QUFDMUUsMkNBQXVDO0FBT3ZDLDJDQUF3QztBQVd4QyxrRUFBK0Q7QUFvRC9ELE1BQWEsZUFBZ0IsU0FBUSxzQkFBUztJQVU1QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCO1FBQ25FLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDM0MsSUFBSSxDQUFDLFFBQVE7WUFDWCxLQUFLLENBQUMsdUJBQXVCLEVBQUUsV0FBVyxFQUFFO2dCQUM1QywrQkFBYyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFckQsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLDBCQUEwQjtRQUN4QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELDJCQUEyQjtRQUN6QixPQUFPLCtCQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU8sNEJBQTRCO1FBQ2xDLGtGQUFrRjtRQUNsRixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQUUs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QStCLEVBQ3pEO1lBQ0UsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3BCLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSx5QkFBeUI7U0FDaEUsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JFLElBQUksSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN0RSxJQUFJLElBQUksQ0FBQyxlQUFlO1lBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEUsSUFBSSxJQUFJLENBQUMsZUFBZTtZQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwRSxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7SUFDckUsQ0FBQztDQUNGO0FBM05ELDBDQTJOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCwgdHlwZSBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENmbkdsb2JhbENsdXN0ZXIsIHR5cGUgQ2ZuREJDbHVzdGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICB0eXBlIElWcGMsXG4gIHR5cGUgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyB0eXBlIElDbHVzdGVyRW5naW5lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IFJkc0F1cm9yYSB9IGZyb20gXCIuL3Jkc0F1cm9yYVwiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbmdpbmVDb25maWcsXG4gIHR5cGUgUHJveHlDb25maWcsXG4gIHR5cGUgQ3JlZGVudGlhbHNDb25maWcsXG4gIHR5cGUgQXVyb3JhRW5jcnlwdGlvbkNvbmZpZyxcbiAgdHlwZSBBdXJvcmFXcml0ZXJDb25maWcsXG4gIHR5cGUgQXVyb3JhUmVhZGVyc0NvbmZpZyxcbiAgdHlwZSBQZXJmb3JtYW5jZUluc2lnaHRzQ29uZmlnXG59IGZyb20gXCIuLi8uLi8uLi9wYXR0ZXJucy9hd3MvZGF0YWJhc2VcIjtcbmltcG9ydCB7IFJlc291cmNlTmFtaW5nIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Jlc291cmNlTmFtaW5nXCI7XG5cbmludGVyZmFjZSBSZHNBdXJvcmFHbG9iYWxQcm9wcyB7XG4gIHZwYzogSVZwYztcbiAgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBQcmltYXJ5IHJlZ2lvbiB3aGVyZSB0aGUgaW5pdGlhbCBjbHVzdGVyICYgZ2xvYmFsIGNsdXN0ZXIgcmVzb3VyY2UgYXJlIGNyZWF0ZWQgKi9cbiAgcHJpbWFyeVJlZ2lvbjogc3RyaW5nO1xuICAvKiogU2Vjb25kYXJ5IHJlZ2lvbnMgd2hlcmUgQXVyb3JhIGNsdXN0ZXJzIHdpbGwgYmUgZGVwbG95ZWQgKGZvciBzZWNyZXQgcmVwbGljYXRpb24pICovXG4gIHNlY29uZGFyeVJlZ2lvbnM/OiBzdHJpbmdbXTtcbiAgLyoqIE9wdGlvbmFsIGRldGVybWluaXN0aWMgaWQgZm9yIHRoZSBnbG9iYWwgY2x1c3RlciAoc2hvdWxkIGJlIHNoYXJlZCBhY3Jvc3Mgc3RhY2tzL3JlZ2lvbnMpICovXG4gIGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgZW5naW5lIHRvIGZvcndhcmQgdG8gdGhlIHVuZGVybHlpbmcgY2x1c3RlciAqL1xuICBlbmdpbmU/OiBJQ2x1c3RlckVuZ2luZTtcbiAgLyoqIEVuZ2luZS1zcGVjaWZpYyBjb25maWd1cmF0aW9uICh1c2VybmFtZSwgU1NMIHBhcmFtcywgcm90YXRpb24gYXBwKSAqL1xuICBlbmdpbmVDb25maWc/OiBFbmdpbmVDb25maWc7XG4gIC8qKiBFbmFibGUgd3JpdGUgZm9yd2FyZGluZyBvbiBzZWNvbmRhcnkgY2x1c3RlcnMgdG8gZm9yd2FyZCB3cml0ZXMgdG8gcHJpbWFyeSByZWdpb24gKi9cbiAgZW5hYmxlR2xvYmFsV3JpdGVGb3J3YXJkaW5nPzogYm9vbGVhbjtcblxuICAvLyBJbnN0YW5jZSBjb25maWd1cmF0aW9uIChhcHBsaWVkIHRvIGFsbCByZWdpb25hbCBjbHVzdGVycylcbiAgLyoqIFdyaXRlciBpbnN0YW5jZSBjb25maWd1cmF0aW9uICovXG4gIHdyaXRlcj86IEF1cm9yYVdyaXRlckNvbmZpZztcbiAgLyoqXG4gICAqIFJlYWRlciBpbnN0YW5jZXMgY29uZmlndXJhdGlvbi5cbiAgICogLSBgeyBjb3VudDogTiB9YCAtIFNpbXBsZTogTiByZWFkZXJzIHdpdGggZGVmYXVsdHNcbiAgICogLSBgeyBpbnN0YW5jZXM6IFsuLi5dIH1gIC0gQWR2YW5jZWQ6IHBlci1yZWFkZXIgY29uZmlnXG4gICAqIC0gYGZhbHNlYCAtIEV4cGxpY2l0bHkgZGlzYWJsZSByZWFkZXJzICh3cml0ZXItb25seSBjbHVzdGVyKVxuICAgKiAtIE9taXQgLSBEZWZhdWx0OiAxIHJlYWRlclxuICAgKi9cbiAgcmVhZGVycz86IEF1cm9yYVJlYWRlcnNDb25maWcgfCBmYWxzZTtcblxuICAvLyBOZXN0ZWQgY29uZmlndXJhdGlvbnMgKHByZXNlbmNlLWJhc2VkKVxuICAvKiogUkRTIFByb3h5IGNvbmZpZ3VyYXRpb24uIE9taXQgPSBubyBwcm94eSwge30gPSBkZWZhdWx0cywgZmFsc2UgPSBkaXNhYmxlZCAqL1xuICBwcm94eT86IFByb3h5Q29uZmlnIHwgZmFsc2U7XG4gIC8qKiBDcmVkZW50aWFscyBjb25maWd1cmF0aW9uIGluY2x1ZGluZyB1c2VybmFtZSBhbmQgc2VjcmV0IHJvdGF0aW9uICovXG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHNDb25maWc7XG4gIC8qKiBFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gKi9cbiAgZW5jcnlwdGlvbj86IEF1cm9yYUVuY3J5cHRpb25Db25maWc7XG5cbiAgLy8gT3BlcmF0aW9uYWwgY29uZmlndXJhdGlvblxuICAvKiogQmFja3VwIHJldGVudGlvbiBpbiBkYXlzLiBEZWZhdWx0OiAxNCAqL1xuICBiYWNrdXBSZXRlbnRpb24/OiBudW1iZXI7XG4gIC8qKiBDbG91ZFdhdGNoIG1vbml0b3JpbmcgaW50ZXJ2YWwuIERlZmF1bHQ6IDEgbWludXRlICovXG4gIG1vbml0b3JpbmdJbnRlcnZhbD86IER1cmF0aW9uO1xuICAvKiogUHJlZmVycmVkIG1haW50ZW5hbmNlIHdpbmRvdy4gRGVmYXVsdDogXCJTYXQ6MTI6MzAtU2F0OjIwOjMwXCIgKi9cbiAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c/OiBzdHJpbmc7XG4gIC8qKiBEYXRhYmFzZSBwb3J0LiBEZWZhdWx0OiAzNTI1NSAoRkpBTEwgb24gcGhvbmUga2V5cGFkKSAqL1xuICBwb3J0PzogbnVtYmVyO1xuICBwZXJmb3JtYW5jZUluc2lnaHRzPzogUGVyZm9ybWFuY2VJbnNpZ2h0c0NvbmZpZyB8IGZhbHNlO1xuICAvKiogQVJOIG9yIGlkZW50aWZpZXIgb2YgREIgY2x1c3RlciBzbmFwc2hvdCB0byByZXN0b3JlIGZyb20gKi9cbiAgc25hcHNob3RJZGVudGlmaWVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmRzQXVyb3JhR2xvYmFsIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIGdsb2JhbENsdXN0ZXI/OiBDZm5HbG9iYWxDbHVzdGVyO1xuICBwcml2YXRlIHByaW1hcnlDbHVzdGVyPzogUmRzQXVyb3JhO1xuICBwcml2YXRlIHJlZ2lvbmFsQ2x1c3Rlcj86IFJkc0F1cm9yYTtcbiAgcHJpdmF0ZSBwcm9wczogUmRzQXVyb3JhR2xvYmFsUHJvcHM7XG4gIHByaXZhdGUgY3VycmVudFJlZ2lvbjogc3RyaW5nO1xuICBwcml2YXRlIGdsb2JhbElkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJkc0F1cm9yYUdsb2JhbFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmN1cnJlbnRSZWdpb24gPSBTdGFjay5vZih0aGlzKS5yZWdpb247XG4gICAgdGhpcy5nbG9iYWxJZCA9XG4gICAgICBwcm9wcy5nbG9iYWxDbHVzdGVySWRlbnRpZmllcj8udG9Mb3dlckNhc2UoKSB8fFxuICAgICAgUmVzb3VyY2VOYW1pbmcuZ2xvYmFsQ2x1c3RlcklkKHByb3BzLmRhdGFiYXNlTmFtZSk7XG5cbiAgICAvLyBjcmVhdGUgY2x1c3RlcnMgLyBnbG9iYWwgY2x1c3RlciBkZXBlbmRpbmcgb24gcmVnaW9uXG4gICAgdGhpcy5hZGRBdXJvcmFDbHVzdGVyKCk7XG4gICAgdGhpcy5hZGRHbG9iYWxDbHVzdGVyKCk7XG4gICAgdGhpcy5hZGRPdXRwdXRzKCk7XG4gIH1cblxuICAvLyAtLS0gcHVibGljIGhlbHBlcnMgLS0tXG4gIGdldEdsb2JhbENsdXN0ZXJJZGVudGlmaWVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2xvYmFsSWQ7XG4gIH1cblxuICBnZXRQcmltYXJ5Q2x1c3RlcklkZW50aWZpZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gUmVzb3VyY2VOYW1pbmcucHJpbWFyeUNsdXN0ZXJJZCh0aGlzLnByb3BzLmRhdGFiYXNlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGdldEdsb2JhbENsdXN0ZXJFbmdpbmVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAvLyBEZWZhdWx0IHRvIGF1cm9yYS1wb3N0Z3Jlc3FsIGlmIG5vIGVuZ2luZSBzcGVjaWZpZWQgKG1hdGNoZXMgZXhpc3RpbmcgYmVoYXZpb3IpXG4gICAgaWYgKCF0aGlzLnByb3BzLmVuZ2luZSkgcmV0dXJuIFwiYXVyb3JhLXBvc3RncmVzcWxcIjtcblxuICAgIGNvbnN0IGVuZ2luZU9iajogYW55ID0gdGhpcy5wcm9wcy5lbmdpbmUgYXMgYW55O1xuXG4gICAgLy8gVHJ5IGNvbW1vbiBsb2NhdGlvbnMgZm9yIHRoZSBlbmdpbmUgaWRlbnRpZmllclxuICAgIGxldCBlbmdpbmVUeXBlOiB1bmtub3duID1cbiAgICAgIGVuZ2luZU9iai5lbmdpbmVUeXBlID8/IGVuZ2luZU9iai5lbmdpbmUgPz8gZW5naW5lT2JqLm5hbWU7XG5cbiAgICAvLyBJZiB0aGUgZW5naW5lIHdhcyBwcm92aWRlZCBhcyBhIHJhdyBzdHJpbmcgKHVubGlrZWx5IGJ1dCBzdXBwb3J0IGl0KVxuICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5lbmdpbmUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGVuZ2luZVR5cGUgPSB0aGlzLnByb3BzLmVuZ2luZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byB0b1N0cmluZygpIGZvciBUb2tlbi1saWtlIG9iamVjdHNcbiAgICBpZiAoIWVuZ2luZVR5cGUgJiYgdHlwZW9mIGVuZ2luZU9iai50b1N0cmluZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlbmdpbmVUeXBlID0gZW5naW5lT2JqLnRvU3RyaW5nKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGVuZ2luZVR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBlbmdpbmVUeXBlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJhdXJvcmEtcG9zdGdyZXNxbFwiO1xuXG4gICAgLy8gTm9ybWFsaXplIGNvbW1vbiBmb3JtczogQVVST1JBX1BPU1RHUkVTUUwgLT4gYXVyb3JhLXBvc3RncmVzcWwsIGF1cm9yYV9wb3N0Z3Jlc3FsIC0+IGF1cm9yYS1wb3N0Z3Jlc3FsXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IGVuZ2luZVR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiLVwiKTtcblxuICAgIC8vIElmIHRoZSBub3JtYWxpemVkIHZhbHVlIGlzIGp1c3QgJ2F1cm9yYScsIHByZWZlciB0aGUgbW9yZSBzcGVjaWZpYyBwb3N0Z3JlcyBkZWZhdWx0XG4gICAgaWYgKG5vcm1hbGl6ZWQgPT09IFwiYXVyb3JhXCIpIHJldHVybiBcImF1cm9yYS1wb3N0Z3Jlc3FsXCI7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIC8vIGNyZWF0ZSB0aGUgQ2ZuR2xvYmFsQ2x1c3RlciBvbmx5IGluIHRoZSBwcmltYXJ5IHJlZ2lvblxuICBhZGRHbG9iYWxDbHVzdGVyKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByaW1hcnlSZWdpb24gIT09IHRoaXMuY3VycmVudFJlZ2lvbikgcmV0dXJuO1xuXG4gICAgLy8gY3JlYXRlIHRoZSBnbG9iYWwgY2x1c3RlciByZXNvdXJjZSByZWZlcmVuY2luZyB0aGUgcHJpbWFyeSBjbHVzdGVyIGlkZW50aWZpZXJcbiAgICAvLyBQcmVmZXIgcmVmZXJlbmNpbmcgdGhlIEwxIERCQ2x1c3RlciBSZWYgc28gQ2xvdWRGb3JtYXRpb24gd2lsbCBjcmVhdGUgdGhlXG4gICAgLy8gREJDbHVzdGVyIGZpcnN0IGFuZCB3ZSBhdm9pZCBpZGVudGlmaWVyLWNhc2luZyBtaXNtYXRjaGVzLlxuICAgIGxldCBzb3VyY2VJZGVudGlmaWVyOiBhbnkgPSB0aGlzLmdldFByaW1hcnlDbHVzdGVySWRlbnRpZmllcigpO1xuICAgIGxldCBwcmltYXJ5TDE6IENmbkRCQ2x1c3RlciB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0aGlzLnByaW1hcnlDbHVzdGVyKSB7XG4gICAgICAvLyBVc2UgdGhlIGhlbHBlciBvbiBSZHNBdXJvcmEgdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIEwxIERCQ2x1c3RlciAobW9yZSByZWxpYWJsZVxuICAgICAgLy8gdGhhbiByZWx5aW5nIG9uIG5vZGUuZGVmYXVsdENoaWxkIHdoaWNoIGNhbiB2YXJ5IGRlcGVuZGluZyBvbiBjb25zdHJ1Y3Qgb3JkZXJpbmcpXG4gICAgICBwcmltYXJ5TDEgPVxuICAgICAgICB0aGlzLnByaW1hcnlDbHVzdGVyLmdldENmbkNsdXN0ZXIgJiZcbiAgICAgICAgdGhpcy5wcmltYXJ5Q2x1c3Rlci5nZXRDZm5DbHVzdGVyKCk7XG4gICAgICBpZiAocHJpbWFyeUwxKSB7XG4gICAgICAgIHNvdXJjZUlkZW50aWZpZXIgPSBwcmltYXJ5TDEucmVmO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZ2xvYmFsQ2x1c3RlciA9IG5ldyBDZm5HbG9iYWxDbHVzdGVyKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lfUdsb2JhbENsdXN0ZXJgLFxuICAgICAge1xuICAgICAgICBnbG9iYWxDbHVzdGVySWRlbnRpZmllcjogdGhpcy5nbG9iYWxJZCxcbiAgICAgICAgc291cmNlRGJDbHVzdGVySWRlbnRpZmllcjogc291cmNlSWRlbnRpZmllclxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBlbnN1cmUgdGhlIHVuZGVybHlpbmcgcHJpbWFyeSBEQkNsdXN0ZXIgTDEgaGFzIHRoZSBnbG9iYWxDbHVzdGVySWRlbnRpZmllciBzZXRcbiAgICBpZiAocHJpbWFyeUwxKSB7XG4gICAgICAvLyBNYWtlIHRoZSBDRk4gZGVwZW5kZW5jeSBleHBsaWNpdCBzbyB0aGUgREJDbHVzdGVyIGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBHbG9iYWxDbHVzdGVyXG4gICAgICB0aGlzLmdsb2JhbENsdXN0ZXIuYWRkRGVwZW5kc09uKHByaW1hcnlMMSk7XG4gICAgICAvLyBJTVBPUlRBTlQ6IGRvIE5PVCBzZXQgdGhlIHByaW1hcnkgREJDbHVzdGVyJ3MgYGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyYCBoZXJlLlxuICAgICAgLy8gSWYgd2Ugc2V0IHRoZSBwcmltYXJ5IERCQ2x1c3RlciB0byByZWZlcmVuY2UgdGhlIGdsb2JhbCBjbHVzdGVyLCBDbG91ZEZvcm1hdGlvblxuICAgICAgLy8gd2lsbCBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoYXQgdGhlIGdsb2JhbCBjbHVzdGVyIGV4aXN0cyB3aGVuIGNyZWF0aW5nIHRoZVxuICAgICAgLy8gREJDbHVzdGVyIOKAlCBidXQgdGhlIGdsb2JhbCBjbHVzdGVyIGlzIGNyZWF0ZWQgYWZ0ZXJ3YXJkICh3ZSBhZGQgYVxuICAgICAgLy8gZGVwZW5kc09uKSwgd2hpY2ggY2F1c2VzIGEgXCJHbG9iYWwgY2x1c3RlciAuLi4gbm90IGZvdW5kXCIgZXJyb3IuIFRoZVxuICAgICAgLy8gY29ycmVjdCBvcmRlciBpcyB0byBjcmVhdGUgdGhlIERCQ2x1c3RlciBmaXJzdCwgdGhlbiBjcmVhdGUgdGhlXG4gICAgICAvLyBDZm5HbG9iYWxDbHVzdGVyIHdpdGggYHNvdXJjZURiQ2x1c3RlcklkZW50aWZpZXJgIHBvaW50aW5nIGF0IHRoZVxuICAgICAgLy8gcHJpbWFyeSBjbHVzdGVyJ3MgUmVmLiBMZWF2aW5nIHRoZSBwcmltYXJ5IEwxIHdpdGhvdXQgdGhlXG4gICAgICAvLyBgZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXJgIGF2b2lkcyB0aGUgY2lyY3VsYXIgcmVmZXJlbmNlLlxuICAgIH1cbiAgfVxuXG4gIC8vIGNyZWF0ZSBhbiBBdXJvcmEgY2x1c3RlciBpbiB0aGlzIHJlZ2lvbiAocHJpbWFyeSBvciBzZWNvbmRhcnkpXG4gIGFkZEF1cm9yYUNsdXN0ZXIoKSB7XG4gICAgLy8gQ29tbW9uIGNvbmZpZ3VyYXRpb24gc2hhcmVkIGJldHdlZW4gcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGNsdXN0ZXJzXG4gICAgY29uc3QgY29tbW9uQ29uZmlnID0ge1xuICAgICAgZW5naW5lOiB0aGlzLnByb3BzLmVuZ2luZSxcbiAgICAgIGVuZ2luZUNvbmZpZzogdGhpcy5wcm9wcy5lbmdpbmVDb25maWcsXG4gICAgICAvLyBJbnN0YW5jZSBjb25maWd1cmF0aW9uXG4gICAgICB3cml0ZXI6IHRoaXMucHJvcHMud3JpdGVyLFxuICAgICAgcmVhZGVyczogdGhpcy5wcm9wcy5yZWFkZXJzLFxuICAgICAgLy8gTmVzdGVkIGNvbmZpZ3VyYXRpb25zXG4gICAgICBwcm94eTogdGhpcy5wcm9wcy5wcm94eSxcbiAgICAgIGVuY3J5cHRpb246IHRoaXMucHJvcHMuZW5jcnlwdGlvbixcbiAgICAgIC8vIE9wZXJhdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAgICAgIGJhY2t1cFJldGVudGlvbjogdGhpcy5wcm9wcy5iYWNrdXBSZXRlbnRpb24sXG4gICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6IHRoaXMucHJvcHMubW9uaXRvcmluZ0ludGVydmFsLFxuICAgICAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6IHRoaXMucHJvcHMucHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3csXG4gICAgICBwb3J0OiB0aGlzLnByb3BzLnBvcnQsXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRzOiB0aGlzLnByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHMsXG4gICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHRoaXMucHJvcHMuc25hcHNob3RJZGVudGlmaWVyXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnByb3BzLnByaW1hcnlSZWdpb24gPT09IHRoaXMuY3VycmVudFJlZ2lvbikge1xuICAgICAgLy8gcHJpbWFyeVxuICAgICAgdGhpcy5wcmltYXJ5Q2x1c3RlciA9IG5ldyBSZHNBdXJvcmEoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lfVByaW1hcnlgLFxuICAgICAgICB7XG4gICAgICAgICAgdnBjOiB0aGlzLnByb3BzLnZwYyxcbiAgICAgICAgICBkYXRhYmFzZU5hbWU6IHRoaXMucHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgICAgIGNsdXN0ZXJJZGVudGlmaWVyOiB0aGlzLmdldFByaW1hcnlDbHVzdGVySWRlbnRpZmllcigpLFxuICAgICAgICAgIC8vIEVuYWJsZSBzZWNyZXQgcmVwbGljYXRpb24gdG8gc2Vjb25kYXJ5IHJlZ2lvbnNcbiAgICAgICAgICBzZWNyZXRSZXBsaWNhUmVnaW9uczogdGhpcy5wcm9wcy5zZWNvbmRhcnlSZWdpb25zLFxuICAgICAgICAgIC8vIFByaW1hcnkgcmVnaW9uIGNyZWF0ZXMgY3JlZGVudGlhbHNcbiAgICAgICAgICBjcmVkZW50aWFsczogdGhpcy5wcm9wcy5jcmVkZW50aWFscyxcbiAgICAgICAgICAuLi5jb21tb25Db25maWdcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLnByaW1hcnlDbHVzdGVyLmNvbm5lY3Rpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZWNvbmRhcnkgcmVnaW9uXG4gICAgICAvLyBQYXNzIGRhdGFiYXNlTmFtZSBmb3IgcmVzb3VyY2UgbmFtaW5nLCBidXQgZmxhZyBhcyBnbG9iYWwgc2Vjb25kYXJ5XG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHNldHRpbmcgY3JlZGVudGlhbHMgYW5kIGRlZmF1bHREYXRhYmFzZU5hbWUgd2hpY2ggYXJlIGluaGVyaXRlZCBmcm9tIHByaW1hcnlcbiAgICAgIHRoaXMucmVnaW9uYWxDbHVzdGVyID0gbmV3IFJkc0F1cm9yYShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7dGhpcy5wcm9wcy5kYXRhYmFzZU5hbWV9UmVnaW9uYWxgLFxuICAgICAgICB7XG4gICAgICAgICAgdnBjOiB0aGlzLnByb3BzLnZwYyxcbiAgICAgICAgICBkYXRhYmFzZU5hbWU6IHRoaXMucHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgICAgIGNsdXN0ZXJJZGVudGlmaWVyOiBSZXNvdXJjZU5hbWluZy5zZWNvbmRhcnlDbHVzdGVySWQoXG4gICAgICAgICAgICB0aGlzLnByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFJlZ2lvblxuICAgICAgICAgICksXG4gICAgICAgICAgaXNHbG9iYWxTZWNvbmRhcnk6IHRydWUsXG4gICAgICAgICAgLy8gU2Vjb25kYXJ5IGRvZXNuJ3QgY3JlYXRlIGNyZWRlbnRpYWxzICh1c2VzIHJlcGxpY2F0ZWQgc2VjcmV0KVxuICAgICAgICAgIC4uLmNvbW1vbkNvbmZpZ1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyBzZXQgdGhlIEwxIERCQ2x1c3RlciBwcm9wZXJ0eSBzbyBDbG91ZEZvcm1hdGlvbiB3aWxsIGpvaW4gaXQgdG8gdGhlIGdsb2JhbCBjbHVzdGVyXG4gICAgICBpZiAodGhpcy5yZWdpb25hbENsdXN0ZXIpIHtcbiAgICAgICAgY29uc3QgcmVnaW9uYWxMMSA9XG4gICAgICAgICAgdGhpcy5yZWdpb25hbENsdXN0ZXIuZ2V0Q2ZuQ2x1c3RlciAmJlxuICAgICAgICAgIHRoaXMucmVnaW9uYWxDbHVzdGVyLmdldENmbkNsdXN0ZXIoKTtcbiAgICAgICAgaWYgKHJlZ2lvbmFsTDEpIHtcbiAgICAgICAgICByZWdpb25hbEwxLmdsb2JhbENsdXN0ZXJJZGVudGlmaWVyID0gdGhpcy5nbG9iYWxJZDtcblxuICAgICAgICAgIC8vIEVuYWJsZSB3cml0ZSBmb3J3YXJkaW5nIGlmIHJlcXVlc3RlZFxuICAgICAgICAgIGlmICh0aGlzLnByb3BzLmVuYWJsZUdsb2JhbFdyaXRlRm9yd2FyZGluZykge1xuICAgICAgICAgICAgcmVnaW9uYWxMMS5lbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmcgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5yZWdpb25hbENsdXN0ZXIuY29ubmVjdGlvbnM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkT3V0cHV0cygpIHtcbiAgICBuZXcgQ2ZuT3V0cHV0KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lfUdsb2JhbENsdXN0ZXJJZGVudGlmaWVyT3V0cHV0YCxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuZ2xvYmFsSWQsXG4gICAgICAgIGV4cG9ydE5hbWU6IGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lfUdsb2JhbENsdXN0ZXJJZGVudGlmaWVyYFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBnZXRDcmVkZW50aWFscygpOiBTZWNyZXQge1xuICAgIGlmICh0aGlzLnByaW1hcnlDbHVzdGVyKSByZXR1cm4gdGhpcy5wcmltYXJ5Q2x1c3Rlci5nZXRDcmVkZW50aWFscygpO1xuICAgIGlmICh0aGlzLnJlZ2lvbmFsQ2x1c3RlcikgcmV0dXJuIHRoaXMucmVnaW9uYWxDbHVzdGVyLmdldENyZWRlbnRpYWxzKCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQXVyb3JhIGNsdXN0ZXIgYXZhaWxhYmxlIHRvIHJldHVybiBjcmVkZW50aWFscyBmcm9tXCIpO1xuICB9XG5cbiAgZ2V0SG9zdEVuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucHJpbWFyeUNsdXN0ZXIpIHJldHVybiB0aGlzLnByaW1hcnlDbHVzdGVyLmdldEhvc3RFbmRwb2ludCgpO1xuICAgIGlmICh0aGlzLnJlZ2lvbmFsQ2x1c3RlcikgcmV0dXJuIHRoaXMucmVnaW9uYWxDbHVzdGVyLmdldEhvc3RFbmRwb2ludCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIEF1cm9yYSBjbHVzdGVyIGF2YWlsYWJsZSB0byByZXR1cm4gZW5kcG9pbnQgZnJvbVwiKTtcbiAgfVxuXG4gIGdldEhvc3RQb3J0KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucHJpbWFyeUNsdXN0ZXIpIHJldHVybiB0aGlzLnByaW1hcnlDbHVzdGVyLmdldEhvc3RQb3J0KCk7XG4gICAgaWYgKHRoaXMucmVnaW9uYWxDbHVzdGVyKSByZXR1cm4gdGhpcy5yZWdpb25hbENsdXN0ZXIuZ2V0SG9zdFBvcnQoKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBBdXJvcmEgY2x1c3RlciBhdmFpbGFibGUgdG8gcmV0dXJuIHBvcnQgZnJvbVwiKTtcbiAgfVxufVxuIl19
@@ -1,14 +1,16 @@
1
1
  import { Duration } from "aws-cdk-lib";
2
- import { Connections, IConnectable, IVpc } from "aws-cdk-lib/aws-ec2";
3
- import { IInstanceEngine } from "aws-cdk-lib/aws-rds";
2
+ import { Connections, type IConnectable, type IVpc } from "aws-cdk-lib/aws-ec2";
3
+ import { type IInstanceEngine } from "aws-cdk-lib/aws-rds";
4
4
  import { Construct } from "constructs";
5
5
  import { SecurityGroup } from "../iam";
6
6
  import { Secret } from "../secrets";
7
- import { StackBuilder } from "../base/awsStack";
7
+ import { type StackBuilder } from "../base/awsStack";
8
+ import { type EngineConfig, type ProxyConfig, type ReadReplicaConfig, type CredentialsConfig, type EncryptionConfig, type PerformanceInsightsConfig } from "../../../patterns/aws/database";
8
9
  interface RdsProps {
9
- vpc?: IVpc;
10
+ vpc: IVpc;
10
11
  databaseName?: string;
11
12
  engine?: IInstanceEngine;
13
+ engineConfig?: EngineConfig;
12
14
  instanceType?: string;
13
15
  maxAllocatedStorage?: number;
14
16
  allocatedStorage?: number;
@@ -17,28 +19,35 @@ interface RdsProps {
17
19
  monitoringInterval?: Duration;
18
20
  preferredMaintenanceWindow?: string;
19
21
  port?: number;
20
- enablePerformanceInsights?: boolean;
21
- databaseProxy?: boolean;
22
- readReplica?: boolean;
22
+ performanceInsights?: PerformanceInsightsConfig | false;
23
23
  securityGroupIds?: string[];
24
+ multiAz?: boolean;
25
+ proxy?: ProxyConfig | false;
26
+ readReplica?: ReadReplicaConfig | false;
27
+ credentials?: CredentialsConfig;
28
+ encryption?: EncryptionConfig;
29
+ publiclyAccessible?: boolean;
30
+ /** ARN or identifier of DB instance snapshot to restore from */
31
+ snapshotIdentifier?: string;
24
32
  }
25
33
  export declare class RdsInstance extends Construct implements IConnectable {
26
34
  connections: Connections;
27
35
  databaseSecurityGroup: SecurityGroup;
28
36
  vpc: IVpc;
29
37
  private port;
38
+ private engineConfig;
30
39
  private databaseCredentials;
31
- private encryptionKey;
32
- private databasePerformanceInsightsKey;
33
40
  private database;
34
41
  private masterSecret;
35
42
  private databaseProxy;
43
+ private databaseProxySecurityGroup;
44
+ private readReplicaSecurityGroup;
36
45
  constructor(scope: Construct, id: string, props: RdsProps);
37
- addVpc(props: RdsProps): void;
38
46
  addDatabase(props: RdsProps): void;
39
47
  rotateSecret(props: RdsProps): void;
40
48
  addProxy(props: RdsProps): void;
41
49
  addReadReplica(props: RdsProps): void;
50
+ private getPerformanceInsightRetention;
42
51
  getHostEndpoint(): string;
43
52
  getHostPort(): string;
44
53
  getCredentials(): Secret;