@fjall/components-infrastructure 0.89.4 → 0.89.6

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 (378) hide show
  1. package/LICENSE +50 -21
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +1 -18
  4. package/dist/lib/app.d.ts +12 -12
  5. package/dist/lib/app.js +61 -56
  6. package/dist/lib/aspects/index.d.ts +1 -1
  7. package/dist/lib/aspects/index.js +1 -6
  8. package/dist/lib/aspects/resourceInventory.js +6 -13
  9. package/dist/lib/config/audit.js +1 -5
  10. package/dist/lib/config/aws/accessAnalyser.d.ts +11 -0
  11. package/dist/lib/config/aws/accessAnalyser.js +17 -0
  12. package/dist/lib/config/aws/accountAuditRole.js +11 -15
  13. package/dist/lib/config/aws/accountMonitoringRole.js +25 -29
  14. package/dist/lib/config/aws/alarmTopic.d.ts +8 -0
  15. package/dist/lib/config/aws/alarmTopic.js +19 -0
  16. package/dist/lib/config/aws/cloudTrail.js +4 -9
  17. package/dist/lib/config/aws/configRecorder.d.ts +16 -0
  18. package/dist/lib/config/aws/configRecorder.js +51 -0
  19. package/dist/lib/config/aws/configRulePreset.d.ts +13 -0
  20. package/dist/lib/config/aws/configRulePreset.js +62 -0
  21. package/dist/lib/config/aws/disasterRecovery.d.ts +1 -1
  22. package/dist/lib/config/aws/disasterRecovery.js +56 -73
  23. package/dist/lib/config/aws/ebsDefaultEncryption.d.ts +8 -0
  24. package/dist/lib/config/aws/ebsDefaultEncryption.js +41 -0
  25. package/dist/lib/config/aws/ecrDefaultImage.js +25 -30
  26. package/dist/lib/config/aws/eventBus.js +8 -11
  27. package/dist/lib/config/aws/guardDutyDetector.d.ts +16 -0
  28. package/dist/lib/config/aws/guardDutyDetector.js +26 -0
  29. package/dist/lib/config/aws/identityCenter.d.ts +1 -1
  30. package/dist/lib/config/aws/identityCenter.js +23 -25
  31. package/dist/lib/config/aws/identityCenterGroupMembership.js +18 -22
  32. package/dist/lib/config/aws/index.d.ts +19 -8
  33. package/dist/lib/config/aws/index.js +19 -25
  34. package/dist/lib/config/aws/inspectorEnablement.d.ts +9 -0
  35. package/dist/lib/config/aws/inspectorEnablement.js +51 -0
  36. package/dist/lib/config/aws/ipam.js +9 -13
  37. package/dist/lib/config/aws/oidcConnector.js +8 -12
  38. package/dist/lib/config/aws/platform.js +1 -5
  39. package/dist/lib/config/aws/s3BlockPublicAccess.d.ts +9 -0
  40. package/dist/lib/config/aws/s3BlockPublicAccess.js +55 -0
  41. package/dist/lib/config/aws/scpPreset.d.ts +21 -0
  42. package/dist/lib/config/aws/scpPreset.js +311 -0
  43. package/dist/lib/config/aws/securityBaseline.d.ts +15 -0
  44. package/dist/lib/config/aws/securityBaseline.js +27 -0
  45. package/dist/lib/config/aws/securityHubHub.d.ts +15 -0
  46. package/dist/lib/config/aws/securityHubHub.js +28 -0
  47. package/dist/lib/config/aws/securityServicesAdmin.d.ts +20 -0
  48. package/dist/lib/config/aws/securityServicesAdmin.js +115 -0
  49. package/dist/lib/config/index.d.ts +2 -2
  50. package/dist/lib/config/index.js +2 -21
  51. package/dist/lib/index.d.ts +4 -4
  52. package/dist/lib/index.js +5 -26
  53. package/dist/lib/patterns/aws/account.d.ts +17 -1
  54. package/dist/lib/patterns/aws/account.js +61 -33
  55. package/dist/lib/patterns/aws/apexDomainPattern.d.ts +26 -0
  56. package/dist/lib/patterns/aws/apexDomainPattern.js +91 -0
  57. package/dist/lib/patterns/aws/auditRole.js +13 -16
  58. package/dist/lib/patterns/aws/buildkite.d.ts +1 -1
  59. package/dist/lib/patterns/aws/buildkite.js +70 -75
  60. package/dist/lib/patterns/aws/cdn.d.ts +5 -5
  61. package/dist/lib/patterns/aws/cdn.js +22 -28
  62. package/dist/lib/patterns/aws/compute.d.ts +1 -1
  63. package/dist/lib/patterns/aws/compute.js +31 -44
  64. package/dist/lib/patterns/aws/computeEc2.d.ts +1 -1
  65. package/dist/lib/patterns/aws/computeEc2.js +11 -14
  66. package/dist/lib/patterns/aws/computeEcs.d.ts +18 -2
  67. package/dist/lib/patterns/aws/computeEcs.js +41 -31
  68. package/dist/lib/patterns/aws/computeLambda.d.ts +2 -2
  69. package/dist/lib/patterns/aws/computeLambda.js +24 -31
  70. package/dist/lib/patterns/aws/database.d.ts +16 -7
  71. package/dist/lib/patterns/aws/database.js +81 -73
  72. package/dist/lib/patterns/aws/delegatedDomainPattern.d.ts +17 -0
  73. package/dist/lib/patterns/aws/delegatedDomainPattern.js +54 -0
  74. package/dist/lib/patterns/aws/dnsRecordComposer.d.ts +25 -0
  75. package/dist/lib/patterns/aws/dnsRecordComposer.js +225 -0
  76. package/dist/lib/patterns/aws/domain.d.ts +32 -0
  77. package/dist/lib/patterns/aws/domain.js +115 -0
  78. package/dist/lib/patterns/aws/domainDelegation.d.ts +3 -3
  79. package/dist/lib/patterns/aws/domainDelegation.js +28 -37
  80. package/dist/lib/patterns/aws/domainFactory.d.ts +20 -5
  81. package/dist/lib/patterns/aws/domainFactory.js +48 -10
  82. package/dist/lib/patterns/aws/domainValidation.d.ts +11 -0
  83. package/dist/lib/patterns/aws/domainValidation.js +145 -0
  84. package/dist/lib/patterns/aws/externalRecordsPattern.d.ts +18 -0
  85. package/dist/lib/patterns/aws/externalRecordsPattern.js +141 -0
  86. package/dist/lib/patterns/aws/fivetranProxy.d.ts +1 -1
  87. package/dist/lib/patterns/aws/fivetranProxy.js +6 -11
  88. package/dist/lib/patterns/aws/index.d.ts +21 -19
  89. package/dist/lib/patterns/aws/index.js +25 -36
  90. package/dist/lib/patterns/aws/interfaces/cdn.js +1 -5
  91. package/dist/lib/patterns/aws/interfaces/compute.js +4 -11
  92. package/dist/lib/patterns/aws/interfaces/connector.js +1 -15
  93. package/dist/lib/patterns/aws/interfaces/database.d.ts +1 -1
  94. package/dist/lib/patterns/aws/interfaces/database.js +6 -15
  95. package/dist/lib/patterns/aws/interfaces/domain.d.ts +80 -2
  96. package/dist/lib/patterns/aws/interfaces/domain.js +1 -6
  97. package/dist/lib/patterns/aws/interfaces/index.js +8 -41
  98. package/dist/lib/patterns/aws/interfaces/messaging.js +4 -11
  99. package/dist/lib/patterns/aws/interfaces/organisation.d.ts +1 -1
  100. package/dist/lib/patterns/aws/interfaces/organisation.js +4 -11
  101. package/dist/lib/patterns/aws/interfaces/pattern.js +2 -7
  102. package/dist/lib/patterns/aws/interfaces/storage.js +1 -5
  103. package/dist/lib/patterns/aws/managedIdentityCenter.js +7 -12
  104. package/dist/lib/patterns/aws/messaging.d.ts +7 -7
  105. package/dist/lib/patterns/aws/messaging.js +22 -33
  106. package/dist/lib/patterns/aws/network.d.ts +2 -2
  107. package/dist/lib/patterns/aws/network.js +9 -14
  108. package/dist/lib/patterns/aws/organisation.d.ts +6 -2
  109. package/dist/lib/patterns/aws/organisation.js +34 -35
  110. package/dist/lib/patterns/aws/organisationFactory.d.ts +3 -3
  111. package/dist/lib/patterns/aws/organisationFactory.js +7 -12
  112. package/dist/lib/patterns/aws/pattern.js +6 -12
  113. package/dist/lib/patterns/aws/payload.js +73 -63
  114. package/dist/lib/patterns/aws/platform.d.ts +6 -3
  115. package/dist/lib/patterns/aws/platform.js +15 -15
  116. package/dist/lib/patterns/aws/storage.d.ts +6 -4
  117. package/dist/lib/patterns/aws/storage.js +35 -40
  118. package/dist/lib/patterns/aws/subdomainHostedZone.js +11 -16
  119. package/dist/lib/patterns/aws/targets/fjallTargets.d.ts +37 -0
  120. package/dist/lib/patterns/aws/targets/fjallTargets.js +66 -0
  121. package/dist/lib/patterns/aws/targets/index.d.ts +2 -0
  122. package/dist/lib/patterns/aws/targets/index.js +2 -0
  123. package/dist/lib/patterns/aws/targets/targetResolution.d.ts +76 -0
  124. package/dist/lib/patterns/aws/targets/targetResolution.js +119 -0
  125. package/dist/lib/patterns/index.d.ts +1 -0
  126. package/dist/lib/patterns/index.js +1 -0
  127. package/dist/lib/resources/aws/analytics/clickhouse.d.ts +15 -0
  128. package/dist/lib/resources/aws/analytics/clickhouse.js +292 -0
  129. package/dist/lib/resources/aws/analytics/clickhouseConstants.d.ts +73 -0
  130. package/dist/lib/resources/aws/analytics/clickhouseConstants.js +87 -0
  131. package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.d.ts +13 -0
  132. package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.js +28 -0
  133. package/dist/lib/resources/aws/analytics/clickhouseTypes.d.ts +47 -0
  134. package/dist/lib/resources/aws/analytics/clickhouseTypes.js +1 -0
  135. package/dist/lib/resources/aws/analytics/clickhouseUserData.d.ts +5 -0
  136. package/dist/lib/resources/aws/analytics/clickhouseUserData.js +248 -0
  137. package/dist/lib/resources/aws/analytics/index.d.ts +2 -0
  138. package/dist/lib/resources/aws/analytics/index.js +1 -0
  139. package/dist/lib/resources/aws/audit/auditRole.js +10 -15
  140. package/dist/lib/resources/aws/audit/index.d.ts +1 -1
  141. package/dist/lib/resources/aws/audit/index.js +1 -6
  142. package/dist/lib/resources/aws/backup/backupPlan.d.ts +1 -1
  143. package/dist/lib/resources/aws/backup/backupPlan.js +14 -16
  144. package/dist/lib/resources/aws/backup/backupVault.d.ts +1 -1
  145. package/dist/lib/resources/aws/backup/backupVault.js +13 -15
  146. package/dist/lib/resources/aws/backup/index.d.ts +2 -2
  147. package/dist/lib/resources/aws/backup/index.js +2 -19
  148. package/dist/lib/resources/aws/base/awsStack.js +17 -19
  149. package/dist/lib/resources/aws/base/index.d.ts +1 -1
  150. package/dist/lib/resources/aws/base/index.js +1 -18
  151. package/dist/lib/resources/aws/cdn/cloudFront.js +40 -42
  152. package/dist/lib/resources/aws/cdn/index.d.ts +1 -1
  153. package/dist/lib/resources/aws/cdn/index.js +1 -18
  154. package/dist/lib/resources/aws/compute/ec2.js +39 -39
  155. package/dist/lib/resources/aws/compute/ecs.d.ts +18 -396
  156. package/dist/lib/resources/aws/compute/ecs.js +105 -976
  157. package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.d.ts +22 -0
  158. package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.js +35 -0
  159. package/dist/lib/resources/aws/compute/ecsConstants.d.ts +20 -0
  160. package/dist/lib/resources/aws/compute/ecsConstants.js +49 -0
  161. package/dist/lib/resources/aws/compute/ecsContext.d.ts +12 -0
  162. package/dist/lib/resources/aws/compute/ecsContext.js +1 -0
  163. package/dist/lib/resources/aws/compute/ecsImages.d.ts +4 -0
  164. package/dist/lib/resources/aws/compute/ecsImages.js +35 -0
  165. package/dist/lib/resources/aws/compute/ecsNetworking.d.ts +28 -0
  166. package/dist/lib/resources/aws/compute/ecsNetworking.js +290 -0
  167. package/dist/lib/resources/aws/compute/ecsRoles.d.ts +15 -0
  168. package/dist/lib/resources/aws/compute/ecsRoles.js +110 -0
  169. package/dist/lib/resources/aws/compute/ecsServiceFactory.d.ts +33 -0
  170. package/dist/lib/resources/aws/compute/ecsServiceFactory.js +183 -0
  171. package/dist/lib/resources/aws/compute/ecsTaskDefinition.d.ts +30 -0
  172. package/dist/lib/resources/aws/compute/ecsTaskDefinition.js +168 -0
  173. package/dist/lib/resources/aws/compute/ecsTypes.d.ts +337 -0
  174. package/dist/lib/resources/aws/compute/ecsTypes.js +10 -0
  175. package/dist/lib/resources/aws/compute/ecsValidation.d.ts +18 -0
  176. package/dist/lib/resources/aws/compute/ecsValidation.js +72 -0
  177. package/dist/lib/resources/aws/compute/index.d.ts +3 -3
  178. package/dist/lib/resources/aws/compute/index.js +3 -20
  179. package/dist/lib/resources/aws/compute/lambda.d.ts +10 -2
  180. package/dist/lib/resources/aws/compute/lambda.js +82 -70
  181. package/dist/lib/resources/aws/database/dynamodb.js +27 -28
  182. package/dist/lib/resources/aws/database/index.d.ts +7 -7
  183. package/dist/lib/resources/aws/database/index.js +14 -33
  184. package/dist/lib/resources/aws/database/rdsAurora.d.ts +10 -2
  185. package/dist/lib/resources/aws/database/rdsAurora.js +76 -61
  186. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +2 -2
  187. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +24 -21
  188. package/dist/lib/resources/aws/database/rdsDefaults.js +3 -7
  189. package/dist/lib/resources/aws/database/rdsHelpers.d.ts +2 -2
  190. package/dist/lib/resources/aws/database/rdsHelpers.js +21 -29
  191. package/dist/lib/resources/aws/database/rdsInstance.d.ts +11 -3
  192. package/dist/lib/resources/aws/database/rdsInstance.js +101 -83
  193. package/dist/lib/resources/aws/database/rdsProxyOutput.js +5 -9
  194. package/dist/lib/resources/aws/iam/delegationRole.d.ts +18 -0
  195. package/dist/lib/resources/aws/iam/delegationRole.js +60 -0
  196. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +4 -9
  197. package/dist/lib/resources/aws/iam/identityCenter/group.js +5 -9
  198. package/dist/lib/resources/aws/iam/identityCenter/index.d.ts +3 -3
  199. package/dist/lib/resources/aws/iam/identityCenter/index.js +3 -20
  200. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -1
  201. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +5 -9
  202. package/dist/lib/resources/aws/iam/index.d.ts +5 -4
  203. package/dist/lib/resources/aws/iam/index.js +5 -21
  204. package/dist/lib/resources/aws/iam/instanceProfile.js +2 -7
  205. package/dist/lib/resources/aws/iam/managedPolicy.js +2 -7
  206. package/dist/lib/resources/aws/iam/policy.js +2 -7
  207. package/dist/lib/resources/aws/iam/role.js +2 -7
  208. package/dist/lib/resources/aws/index.d.ts +7 -7
  209. package/dist/lib/resources/aws/index.js +7 -24
  210. package/dist/lib/resources/aws/logging/cloudTrail.d.ts +1 -1
  211. package/dist/lib/resources/aws/logging/cloudTrail.js +18 -22
  212. package/dist/lib/resources/aws/logging/index.d.ts +2 -2
  213. package/dist/lib/resources/aws/logging/index.js +2 -19
  214. package/dist/lib/resources/aws/logging/logGroup.js +4 -10
  215. package/dist/lib/resources/aws/messaging/eventbridge.js +11 -14
  216. package/dist/lib/resources/aws/messaging/index.d.ts +4 -4
  217. package/dist/lib/resources/aws/messaging/index.js +4 -21
  218. package/dist/lib/resources/aws/messaging/sns.js +11 -14
  219. package/dist/lib/resources/aws/messaging/sqs.js +32 -34
  220. package/dist/lib/resources/aws/messaging/utils.d.ts +1 -1
  221. package/dist/lib/resources/aws/messaging/utils.js +1 -6
  222. package/dist/lib/resources/aws/monitoring/alarmDefaults.d.ts +36 -0
  223. package/dist/lib/resources/aws/monitoring/alarmDefaults.js +34 -0
  224. package/dist/lib/resources/aws/monitoring/ecsAlarms.d.ts +21 -0
  225. package/dist/lib/resources/aws/monitoring/ecsAlarms.js +88 -0
  226. package/dist/lib/resources/aws/monitoring/index.d.ts +4 -0
  227. package/dist/lib/resources/aws/monitoring/index.js +4 -5
  228. package/dist/lib/resources/aws/monitoring/lambdaAlarms.d.ts +18 -0
  229. package/dist/lib/resources/aws/monitoring/lambdaAlarms.js +44 -0
  230. package/dist/lib/resources/aws/monitoring/rdsAlarms.d.ts +20 -0
  231. package/dist/lib/resources/aws/monitoring/rdsAlarms.js +52 -0
  232. package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.d.ts +17 -0
  233. package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.js +26 -0
  234. package/dist/lib/resources/aws/networking/dnsRecord/aRecord.d.ts +12 -0
  235. package/dist/lib/resources/aws/networking/dnsRecord/aRecord.js +21 -0
  236. package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.d.ts +12 -0
  237. package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.js +22 -0
  238. package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.d.ts +12 -0
  239. package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.js +23 -0
  240. package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.d.ts +17 -0
  241. package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.js +21 -0
  242. package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.d.ts +12 -0
  243. package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.js +22 -0
  244. package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.d.ts +17 -0
  245. package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.js +17 -0
  246. package/dist/lib/resources/aws/networking/dnsRecord/index.d.ts +10 -0
  247. package/dist/lib/resources/aws/networking/dnsRecord/index.js +10 -0
  248. package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.d.ts +16 -0
  249. package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.js +21 -0
  250. package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.d.ts +12 -0
  251. package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.js +21 -0
  252. package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.d.ts +18 -0
  253. package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.js +21 -0
  254. package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.d.ts +12 -0
  255. package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.js +21 -0
  256. package/dist/lib/resources/aws/networking/domain.d.ts +1 -1
  257. package/dist/lib/resources/aws/networking/domain.js +32 -34
  258. package/dist/lib/resources/aws/networking/domainCertificate.d.ts +8 -3
  259. package/dist/lib/resources/aws/networking/domainCertificate.js +22 -16
  260. package/dist/lib/resources/aws/networking/hostedZone.d.ts +23 -19
  261. package/dist/lib/resources/aws/networking/hostedZone.js +70 -134
  262. package/dist/lib/resources/aws/networking/index.d.ts +8 -7
  263. package/dist/lib/resources/aws/networking/index.js +8 -24
  264. package/dist/lib/resources/aws/networking/ipam.js +2 -7
  265. package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
  266. package/dist/lib/resources/aws/networking/ipamPool.js +45 -55
  267. package/dist/lib/resources/aws/networking/securityGroup.js +2 -7
  268. package/dist/lib/resources/aws/networking/vpc.d.ts +1 -1
  269. package/dist/lib/resources/aws/networking/vpc.js +17 -21
  270. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.d.ts +1 -1
  271. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.js +11 -15
  272. package/dist/lib/resources/aws/organisation/index.d.ts +5 -5
  273. package/dist/lib/resources/aws/organisation/index.js +4 -12
  274. package/dist/lib/resources/aws/organisation/organisation.js +5 -7
  275. package/dist/lib/resources/aws/organisation/organisationAccount.js +7 -10
  276. package/dist/lib/resources/aws/organisation/organisationPolicy.js +5 -9
  277. package/dist/lib/resources/aws/organisation/organisationalUnit.js +1 -3
  278. package/dist/lib/resources/aws/secrets/alias.js +2 -7
  279. package/dist/lib/resources/aws/secrets/index.d.ts +4 -4
  280. package/dist/lib/resources/aws/secrets/index.js +4 -21
  281. package/dist/lib/resources/aws/secrets/kms.js +15 -18
  282. package/dist/lib/resources/aws/secrets/parameter.d.ts +3 -3
  283. package/dist/lib/resources/aws/secrets/parameter.js +19 -22
  284. package/dist/lib/resources/aws/secrets/secret.d.ts +2 -2
  285. package/dist/lib/resources/aws/secrets/secret.js +12 -14
  286. package/dist/lib/resources/aws/storage/ecr.d.ts +2 -2
  287. package/dist/lib/resources/aws/storage/ecr.js +7 -13
  288. package/dist/lib/resources/aws/storage/index.d.ts +2 -2
  289. package/dist/lib/resources/aws/storage/index.js +2 -19
  290. package/dist/lib/resources/aws/storage/s3.d.ts +1 -1
  291. package/dist/lib/resources/aws/storage/s3.js +24 -12
  292. package/dist/lib/resources/aws/utilities/awsCustomResource.js +3 -7
  293. package/dist/lib/resources/aws/utilities/codeBuild.js +7 -12
  294. package/dist/lib/resources/aws/utilities/customResource.js +14 -17
  295. package/dist/lib/resources/aws/utilities/customResourceProvider.js +2 -7
  296. package/dist/lib/resources/aws/utilities/index.d.ts +5 -5
  297. package/dist/lib/resources/aws/utilities/index.js +5 -22
  298. package/dist/lib/resources/aws/utilities/resourceShare.js +2 -7
  299. package/dist/lib/resources/index.d.ts +1 -1
  300. package/dist/lib/resources/index.js +1 -18
  301. package/dist/lib/types.js +1 -3
  302. package/dist/lib/utils/accountsUtils.d.ts +5 -0
  303. package/dist/lib/utils/accountsUtils.js +18 -0
  304. package/dist/lib/utils/addSuffixToEmail.js +1 -5
  305. package/dist/lib/utils/backupTierMapping.js +2 -6
  306. package/dist/lib/utils/capitaliseString.js +1 -10
  307. package/dist/lib/utils/connections.js +9 -13
  308. package/dist/lib/utils/connector.js +10 -23
  309. package/dist/lib/utils/constructMap.d.ts +33 -0
  310. package/dist/lib/utils/constructMap.js +154 -0
  311. package/dist/lib/utils/databaseTypes.js +4 -10
  312. package/dist/lib/utils/dnsRecords.d.ts +1 -1
  313. package/dist/lib/utils/dnsRecords.js +23 -27
  314. package/dist/lib/utils/domainTypes.d.ts +0 -1
  315. package/dist/lib/utils/domainTypes.js +2 -10
  316. package/dist/lib/utils/env.js +14 -26
  317. package/dist/lib/utils/getAccountId.js +3 -7
  318. package/dist/lib/utils/getAsync.js +7 -10
  319. package/dist/lib/utils/getConfig.d.ts +0 -2
  320. package/dist/lib/utils/getConfig.js +29 -47
  321. package/dist/lib/utils/getStackOutput.js +4 -8
  322. package/dist/lib/utils/index.d.ts +12 -12
  323. package/dist/lib/utils/index.js +12 -29
  324. package/dist/lib/utils/manifestWriter.d.ts +14 -3
  325. package/dist/lib/utils/manifestWriter.js +60 -43
  326. package/dist/lib/utils/orgConfigParser.d.ts +14 -0
  327. package/dist/lib/utils/orgConfigParser.js +49 -0
  328. package/dist/lib/utils/removalPolicy.js +5 -9
  329. package/dist/lib/utils/resourceNaming.js +11 -16
  330. package/dist/lib/utils/standardTagsAspect.js +9 -16
  331. package/dist/lib/utils/stripAndCamelCase.js +1 -5
  332. package/dist/lib/utils/validationLogger.js +12 -18
  333. package/dist/lib/utils/vpcUtils.js +5 -10
  334. package/package.json +25 -8
  335. package/dist/lib/config/aws/accountId.d.ts +0 -6
  336. package/dist/lib/config/aws/accountId.js +0 -32
  337. package/dist/lib/config/aws/backupGlobalSettings.d.ts +0 -29
  338. package/dist/lib/config/aws/backupGlobalSettings.js +0 -49
  339. package/dist/lib/config/aws/costAllocationTags.d.ts +0 -12
  340. package/dist/lib/config/aws/costAllocationTags.js +0 -47
  341. package/dist/lib/config/aws/ipamDelegateAdmin.d.ts +0 -8
  342. package/dist/lib/config/aws/ipamDelegateAdmin.js +0 -57
  343. package/dist/lib/config/aws/ipamPoolId.d.ts +0 -16
  344. package/dist/lib/config/aws/ipamPoolId.js +0 -42
  345. package/dist/lib/config/aws/organisation.d.ts +0 -30
  346. package/dist/lib/config/aws/organisation.js +0 -92
  347. package/dist/lib/config/aws/organisationId.d.ts +0 -7
  348. package/dist/lib/config/aws/organisationId.js +0 -45
  349. package/dist/lib/config/aws/organisationsAccess.d.ts +0 -10
  350. package/dist/lib/config/aws/organisationsAccess.js +0 -49
  351. package/dist/lib/config/aws/ramSharing.d.ts +0 -4
  352. package/dist/lib/config/aws/ramSharing.js +0 -34
  353. package/dist/lib/config/monitoring.d.ts +0 -18
  354. package/dist/lib/config/monitoring.js +0 -22
  355. package/dist/lib/patterns/aws/connections.d.ts +0 -46
  356. package/dist/lib/patterns/aws/connections.js +0 -159
  357. package/dist/lib/patterns/aws/hostedZone.d.ts +0 -28
  358. package/dist/lib/patterns/aws/hostedZone.js +0 -150
  359. package/dist/lib/patterns/aws/managedAccount.d.ts +0 -9
  360. package/dist/lib/patterns/aws/managedAccount.js +0 -55
  361. package/dist/lib/patterns/aws/managedOrganisation.d.ts +0 -36
  362. package/dist/lib/patterns/aws/managedOrganisation.js +0 -97
  363. package/dist/lib/patterns/aws/managedPlatform.d.ts +0 -12
  364. package/dist/lib/patterns/aws/managedPlatform.js +0 -29
  365. package/dist/lib/resources/aws/database/database.d.ts +0 -14
  366. package/dist/lib/resources/aws/database/database.js +0 -28
  367. package/dist/lib/resources/aws/database/databaseInstance.d.ts +0 -15
  368. package/dist/lib/resources/aws/database/databaseInstance.js +0 -30
  369. package/dist/lib/resources/aws/database/migrationLambda.d.ts +0 -80
  370. package/dist/lib/resources/aws/database/migrationLambda.js +0 -119
  371. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +0 -13
  372. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +0 -51
  373. package/dist/lib/resources/aws/iam/securityGroup.d.ts +0 -5
  374. package/dist/lib/resources/aws/iam/securityGroup.js +0 -14
  375. package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +0 -29
  376. package/dist/lib/resources/aws/monitoring/monitoringRole.js +0 -120
  377. package/dist/lib/utils/capitalizeString.d.ts +0 -12
  378. package/dist/lib/utils/capitalizeString.js +0 -30
@@ -1,31 +1,22 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.IpamPoolStack = exports.IpamPool = void 0;
4
- const aws_cdk_lib_1 = require("aws-cdk-lib");
5
- const constructs_1 = require("constructs");
6
- const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
7
- const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
8
- const aws_iam_1 = require("aws-cdk-lib/aws-iam");
9
- const resourceShare_1 = require("../utilities/resourceShare");
10
- const customResource_1 = require("../utilities/customResource");
11
- const getAccountId_1 = require("../../../utils/getAccountId");
12
- const validationLogger_1 = require("../../../utils/validationLogger");
13
- // IPAM enforces a low concurrent-mutation limit (not publicly documented).
14
- // Account pools are serialised WITHIN each region (they mutate the same regional
15
- // pool parent). Across regions, account pools run in parallel because they mutate
16
- // DIFFERENT regional pool parents — this keeps effective concurrency at 2 (one
17
- // per region), well within observed AWS limits (~2-3).
18
- const IPAM_POOL_BATCH_SIZE = 1;
1
+ import { CfnOutput, Duration, Fn, Stack } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
3
+ import { CfnIPAMPool as IpamPoolClass, CfnIPAMPoolCidr } from "aws-cdk-lib/aws-ec2";
4
+ import { Runtime } from "aws-cdk-lib/aws-lambda";
5
+ import { Effect, PolicyStatement } from "aws-cdk-lib/aws-iam";
6
+ import { ResourceShare } from "../utilities/resourceShare.js";
7
+ import { CustomResource } from "../utilities/customResource.js";
8
+ import getAccountId from "../../../utils/getAccountId.js";
9
+ import { FjallLogger } from "../../../utils/validationLogger.js";
19
10
  const IPAM_TAGS = {
20
11
  OPERATIONS_POOL: "fjall:operations:pool",
21
12
  COST_ALLOCATION_ENVIRONMENT: "fjall:costAllocation:environment",
22
13
  COST_ALLOCATION_ACCOUNT_NAME: "fjall:costAllocation:accountName"
23
14
  };
24
- class IpamPool extends constructs_1.Construct {
15
+ export class IpamPool extends Construct {
25
16
  constructor(scope, id, props) {
26
17
  super(scope, id);
27
18
  // Get the default IPAM scope ID from props, or CFN import
28
- const IpamPrivateDefaultScopeId = props.ipamScope || aws_cdk_lib_1.Fn.importValue("IpamPrivateDefaultScopeId");
19
+ const ipamScopeId = props.ipamScope || Fn.importValue("ipamPrivateDefaultScopeId");
29
20
  const regions = props.regions;
30
21
  if (!regions || regions.length === 0) {
31
22
  throw new Error("At least one region must be specified for IPAM pools");
@@ -44,14 +35,14 @@ class IpamPool extends constructs_1.Construct {
44
35
  }
45
36
  // Warn if user requests VPC allocations larger than the provisioned pool
46
37
  if (defaultNetmaskLength < provisionedNetmaskLength) {
47
- validationLogger_1.FjallLogger.warn(`'allocationDefaultNetmaskLength' (/${defaultNetmaskLength}) is larger than 'provisionedNetmaskLength' (/${provisionedNetmaskLength}). ` +
38
+ FjallLogger.warn(`'allocationDefaultNetmaskLength' (/${defaultNetmaskLength}) is larger than 'provisionedNetmaskLength' (/${provisionedNetmaskLength}). ` +
48
39
  `VPC allocation may fail if the pool cannot satisfy the request.`);
49
40
  }
50
41
  // Top Level Pool
51
- const rootPool = new aws_ec2_1.CfnIPAMPool(this, "TopLevelIpamPool", {
42
+ const rootPool = new IpamPoolClass(this, "TopLevelIpamPool", {
52
43
  description: `Root IPAM pool (Global)`,
53
44
  addressFamily: "ipv4",
54
- ipamScopeId: IpamPrivateDefaultScopeId,
45
+ ipamScopeId,
55
46
  provisionedCidrs: [
56
47
  { cidr: "10.0.0.0/8" },
57
48
  { cidr: "172.16.0.0/12" },
@@ -77,10 +68,10 @@ class IpamPool extends constructs_1.Construct {
77
68
  for (const region of regions) {
78
69
  const regionSuffix = region.replace(/-/g, "");
79
70
  // Create a regional pool for this specific region
80
- const regionalPool = new aws_ec2_1.CfnIPAMPool(this, `RegionalPool${regionSuffix}`, {
71
+ const regionalPool = new IpamPoolClass(this, `RegionalPool${regionSuffix}`, {
81
72
  description: `Regional IPAM pool - ${region}`,
82
73
  addressFamily: "ipv4",
83
- ipamScopeId: IpamPrivateDefaultScopeId,
74
+ ipamScopeId,
84
75
  locale: region,
85
76
  sourceIpamPoolId: rootPool.attrIpamPoolId,
86
77
  autoImport: true,
@@ -101,7 +92,7 @@ class IpamPool extends constructs_1.Construct {
101
92
  if (previousRegionalCidr) {
102
93
  regionalPool.addDependency(previousRegionalCidr);
103
94
  }
104
- const regionalCidrAllocation = new aws_ec2_1.CfnIPAMPoolCidr(this, `RegionalPoolCidr${regionSuffix}`, {
95
+ const regionalCidrAllocation = new CfnIPAMPoolCidr(this, `RegionalPoolCidr${regionSuffix}`, {
105
96
  ipamPoolId: regionalPool.attrIpamPoolId,
106
97
  netmaskLength: 10 // Each region gets a /10 (4,194,304 IPs)
107
98
  });
@@ -113,14 +104,13 @@ class IpamPool extends constructs_1.Construct {
113
104
  //
114
105
  // Uses CfnResource.addDependency() (not node.addDependency) for
115
106
  // guaranteed CloudFormation DependsOn generation between L1 constructs.
116
- let previousWaveAnchorCidr;
117
- for (let i = 0; i < organisationAccounts.length; i++) {
118
- const account = organisationAccounts[i];
119
- const accountId = (0, getAccountId_1.default)(account);
120
- const ipamPool = new aws_ec2_1.CfnIPAMPool(this, `${account}IpamPool${regionSuffix}`, {
107
+ let previousAccountCidr;
108
+ for (const account of organisationAccounts) {
109
+ const accountId = getAccountId(account);
110
+ const ipamPool = new IpamPoolClass(this, `${account}IpamPool${regionSuffix}`, {
121
111
  description: `${account} - IPAM pool - ${region}`,
122
112
  addressFamily: "ipv4",
123
- ipamScopeId: IpamPrivateDefaultScopeId,
113
+ ipamScopeId,
124
114
  locale: region,
125
115
  sourceIpamPoolId: regionalPool.attrIpamPoolId,
126
116
  allocationDefaultNetmaskLength: defaultNetmaskLength,
@@ -144,33 +134,28 @@ class IpamPool extends constructs_1.Construct {
144
134
  });
145
135
  // Ensure the account pool is created after the regional CIDR allocation
146
136
  ipamPool.addDependency(regionalCidrAllocation);
147
- // Wave boundary: pools in wave N+1 depend on the last CIDR from wave N
148
- if (previousWaveAnchorCidr) {
149
- ipamPool.addDependency(previousWaveAnchorCidr);
137
+ // Each account pool depends on the previous account's CIDR completing
138
+ if (previousAccountCidr) {
139
+ ipamPool.addDependency(previousAccountCidr);
150
140
  }
151
- const cidrAllocation = new aws_ec2_1.CfnIPAMPoolCidr(this, `${account}PoolCidr${provisionedNetmaskLength}${regionSuffix}`, {
141
+ const cidrAllocation = new CfnIPAMPoolCidr(this, `${account}PoolCidr${provisionedNetmaskLength}${regionSuffix}`, {
152
142
  ipamPoolId: ipamPool.attrIpamPoolId,
153
143
  netmaskLength: provisionedNetmaskLength
154
144
  });
155
- // The last pool in each wave anchors the next wave's dependency
156
- const isLastInWave = (i + 1) % IPAM_POOL_BATCH_SIZE === 0 ||
157
- i === organisationAccounts.length - 1;
158
- if (isLastInWave) {
159
- previousWaveAnchorCidr = cidrAllocation;
160
- }
145
+ previousAccountCidr = cidrAllocation;
161
146
  // On stack deletion, VPC allocations (not managed by CloudFormation)
162
147
  // block CIDR deprovisioning. This custom resource releases them first.
163
- const allocationCleanup = new customResource_1.CustomResource(this, `${account}IpamCleanup${regionSuffix}`, {
164
- runtime: aws_lambda_1.Runtime.NODEJS_22_X,
165
- timeout: aws_cdk_lib_1.Duration.minutes(5),
148
+ const allocationCleanup = new CustomResource(this, `${account}IpamCleanup${regionSuffix}`, {
149
+ runtime: Runtime.NODEJS_22_X,
150
+ timeout: Duration.minutes(5),
166
151
  lambdaDescription: `${account} IPAM pool allocation cleanup - ${region}`,
167
152
  properties: {
168
153
  IpamPoolId: ipamPool.attrIpamPoolId,
169
154
  PoolRegion: region
170
155
  },
171
156
  inlinePolicy: [
172
- new aws_iam_1.PolicyStatement({
173
- effect: aws_iam_1.Effect.ALLOW,
157
+ new PolicyStatement({
158
+ effect: Effect.ALLOW,
174
159
  actions: [
175
160
  "ec2:GetIpamPoolAllocations",
176
161
  "ec2:ReleaseIpamPoolAllocation"
@@ -178,6 +163,8 @@ class IpamPool extends constructs_1.Construct {
178
163
  resources: ["*"]
179
164
  })
180
165
  ],
166
+ // Inline because CDK CustomResource requires a string for inlineCode —
167
+ // extracting to a separate file would require switching to NodejsFunction + Provider
181
168
  inlineCode: `
182
169
  const { EC2Client, GetIpamPoolAllocationsCommand, ReleaseIpamPoolAllocationCommand } = require('@aws-sdk/client-ec2');
183
170
 
@@ -202,7 +189,13 @@ exports.handler = async (event) => {
202
189
  Cidr: alloc.Cidr,
203
190
  IpamPoolAllocationId: alloc.IpamPoolAllocationId
204
191
  }));
205
- } catch (e) { console.log('Release failed (may already be released):', e.message); }
192
+ } catch (e) {
193
+ if (e && typeof e === 'object' && (e.name === 'InvalidParameterValue' || (e.message && e.message.includes('already been released')))) {
194
+ // Already released — safe to skip
195
+ } else {
196
+ throw e;
197
+ }
198
+ }
206
199
  }
207
200
  nextToken = res.NextToken;
208
201
  } while (nextToken);
@@ -211,7 +204,7 @@ exports.handler = async (event) => {
211
204
  });
212
205
  allocationCleanup.node.addDependency(cidrAllocation);
213
206
  // Share the pool with the target account so that VPCs can allocate
214
- const share = new resourceShare_1.ResourceShare(this, `${account}IpamResourceShare${regionSuffix}`, {
207
+ const share = new ResourceShare(this, `${account}IpamResourceShare${regionSuffix}`, {
215
208
  name: `${account}IpamResourceShare.${region}`,
216
209
  allowExternalPrincipals: false,
217
210
  principals: [accountId],
@@ -226,12 +219,12 @@ exports.handler = async (event) => {
226
219
  // Delete order: share → cleanup (releases VPC allocations) → cidrAllocation → pool
227
220
  share.node.addDependency(allocationCleanup.resource);
228
221
  // Expose the pool ID for cross-stack usage (e.g. VPC allocations)
229
- new aws_cdk_lib_1.CfnOutput(this, `IpamPoolId${accountId}${regionSuffix}`, {
222
+ new CfnOutput(this, `IpamPoolId${accountId}${regionSuffix}`, {
230
223
  key: `IpamPoolId${accountId}${regionSuffix}`,
231
224
  value: ipamPool.attrIpamPoolId,
232
225
  exportName: `IpamPoolId${accountId}${regionSuffix}`
233
226
  });
234
- new aws_cdk_lib_1.CfnOutput(this, `IpamPoolArn${accountId}${regionSuffix}`, {
227
+ new CfnOutput(this, `IpamPoolArn${accountId}${regionSuffix}`, {
235
228
  key: `IpamPoolArn${accountId}${regionSuffix}`,
236
229
  value: ipamPool.attrArn,
237
230
  exportName: `IpamPoolArn${accountId}${regionSuffix}`
@@ -242,8 +235,7 @@ exports.handler = async (event) => {
242
235
  }
243
236
  }
244
237
  }
245
- exports.IpamPool = IpamPool;
246
- class IpamPoolStack extends aws_cdk_lib_1.Stack {
238
+ export class IpamPoolStack extends Stack {
247
239
  constructor(scope, id, props) {
248
240
  super(scope, id);
249
241
  new IpamPool(this, "IpamPool", {
@@ -252,5 +244,3 @@ class IpamPoolStack extends aws_cdk_lib_1.Stack {
252
244
  });
253
245
  }
254
246
  }
255
- exports.IpamPoolStack = IpamPoolStack;
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBhbVBvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9uZXR3b3JraW5nL2lwYW1Qb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE4RTtBQUM5RSwyQ0FBdUM7QUFDdkMsaURBRzZCO0FBQzdCLHVEQUFpRDtBQUNqRCxpREFBOEQ7QUFDOUQsOERBQTJEO0FBQzNELGdFQUE2RDtBQUM3RCw4REFBdUQ7QUFDdkQsc0VBQThEO0FBRTlELDJFQUEyRTtBQUMzRSxpRkFBaUY7QUFDakYsa0ZBQWtGO0FBQ2xGLCtFQUErRTtBQUMvRSx1REFBdUQ7QUFDdkQsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFFL0IsTUFBTSxTQUFTLEdBQUc7SUFDaEIsZUFBZSxFQUFFLHVCQUF1QjtJQUN4QywyQkFBMkIsRUFBRSxrQ0FBa0M7SUFDL0QsNEJBQTRCLEVBQUUsa0NBQWtDO0NBQ3hELENBQUM7QUF5QlgsTUFBYSxRQUFTLFNBQVEsc0JBQVM7SUFDckMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFvQjtRQUM1RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLDBEQUEwRDtRQUMxRCxNQUFNLHlCQUF5QixHQUM3QixLQUFLLENBQUMsU0FBUyxJQUFJLGdCQUFFLENBQUMsV0FBVyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFFakUsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDN0Qs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O29CQUM5QixVQUFVLEVBQUUsYUFBYSxTQUFTLEdBQUcsWUFBWSxFQUFFO2lCQUNwRCxDQUFDLENBQUM7Z0JBRUgsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxjQUFjLFNBQVMsR0FBRyxZQUFZLEVBQUUsRUFBRTtvQkFDNUQsR0FBRyxFQUFFLGNBQWMsU0FBUyxHQUFHLFlBQVksRUFBRTtvQkFDN0MsS0FBSyxFQUFFLFFBQVEsQ0FBQyxPQUFPO29CQUN2QixVQUFVLEVBQUUsY0FBYyxTQUFTLEdBQUcsWUFBWSxFQUFFO2lCQUNyRCxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsc0VBQXNFO1lBQ3RFLG9FQUFvRTtRQUN0RSxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBMVJELDRCQTBSQztBQUVELE1BQWEsYUFBYyxTQUFRLG1CQUFLO0lBQ3RDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUI7UUFDakUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQzdCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBVEQsc0NBU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBGbiwgdHlwZSBTdGFja1Byb3BzLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIENmbklQQU1Qb29sIGFzIElwYW1Qb29sQ2xhc3MsXG4gIENmbklQQU1Qb29sQ2lkclxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgUnVudGltZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBFZmZlY3QsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVNoYXJlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9yZXNvdXJjZVNoYXJlXCI7XG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvY3VzdG9tUmVzb3VyY2VcIjtcbmltcG9ydCBnZXRBY2NvdW50SWQgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2dldEFjY291bnRJZFwiO1xuaW1wb3J0IHsgRmphbGxMb2dnZXIgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdmFsaWRhdGlvbkxvZ2dlclwiO1xuXG4vLyBJUEFNIGVuZm9yY2VzIGEgbG93IGNvbmN1cnJlbnQtbXV0YXRpb24gbGltaXQgKG5vdCBwdWJsaWNseSBkb2N1bWVudGVkKS5cbi8vIEFjY291bnQgcG9vbHMgYXJlIHNlcmlhbGlzZWQgV0lUSElOIGVhY2ggcmVnaW9uICh0aGV5IG11dGF0ZSB0aGUgc2FtZSByZWdpb25hbFxuLy8gcG9vbCBwYXJlbnQpLiBBY3Jvc3MgcmVnaW9ucywgYWNjb3VudCBwb29scyBydW4gaW4gcGFyYWxsZWwgYmVjYXVzZSB0aGV5IG11dGF0ZVxuLy8gRElGRkVSRU5UIHJlZ2lvbmFsIHBvb2wgcGFyZW50cyDigJQgdGhpcyBrZWVwcyBlZmZlY3RpdmUgY29uY3VycmVuY3kgYXQgMiAob25lXG4vLyBwZXIgcmVnaW9uKSwgd2VsbCB3aXRoaW4gb2JzZXJ2ZWQgQVdTIGxpbWl0cyAofjItMykuXG5jb25zdCBJUEFNX1BPT0xfQkFUQ0hfU0laRSA9IDE7XG5cbmNvbnN0IElQQU1fVEFHUyA9IHtcbiAgT1BFUkFUSU9OU19QT09MOiBcImZqYWxsOm9wZXJhdGlvbnM6cG9vbFwiLFxuICBDT1NUX0FMTE9DQVRJT05fRU5WSVJPTk1FTlQ6IFwiZmphbGw6Y29zdEFsbG9jYXRpb246ZW52aXJvbm1lbnRcIixcbiAgQ09TVF9BTExPQ0FUSU9OX0FDQ09VTlRfTkFNRTogXCJmamFsbDpjb3N0QWxsb2NhdGlvbjphY2NvdW50TmFtZVwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElwYW1Qb29sUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgb3JnQWNjb3VudHM6IHN0cmluZ1tdO1xuICBpcGFtU2NvcGU/OiBzdHJpbmc7XG4gIHJlZ2lvbnM6IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIG5ldG1hc2sgbGVuZ3RoICgvQ0lEUikgZWFjaCBjaGlsZCBJUEFNIHBvb2wgc2hvdWxkIHJlY2VpdmUuXG4gICAqIENvbnRyb2xzIHRoZSBzaXplIG9mIENJRFIgYmxvY2tzIGF1dG9tYXRpY2FsbHkgYWxsb2NhdGVkIHRvIFZQQ3MgZnJvbSB0aGUgcG9vbC5cbiAgICogQWNjZXB0ZWQgcmFuZ2U6IC8xNiAoNjUsNTM2IElQcykg4oCTIC8yOCAoMTYgSVBzKS4gRGVmYXVsdHMgdG8gLzIwICg0LDA5NiBJUHMpLlxuICAgKi9cbiAgYWxsb2NhdGlvbkRlZmF1bHROZXRtYXNrTGVuZ3RoPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG5ldG1hc2sgbGVuZ3RoICgvQ0lEUikgcHJvdmlzaW9uZWQgaW50byBlYWNoIGNoaWxkIElQQU0gcG9vbCBvbiBjcmVhdGlvbi5cbiAgICogRGV0ZXJtaW5lcyB0aGUgdG90YWwgYWRkcmVzcyBzcGFjZSBhdmFpbGFibGUgZm9yIFZQQyBhbGxvY2F0aW9ucyBpbiB0aGF0IGFjY291bnQuXG4gICAqIEFjY2VwdGVkIHJhbmdlOiAvMTMgKDUyNCwyODggSVBzKSDigJMgLzE2ICg2NSw1MzYgSVBzKS4gRGVmYXVsdHMgdG8gLzE0LlxuICAgKi9cbiAgcHJvdmlzaW9uZWROZXRtYXNrTGVuZ3RoPzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSXBhbVBvb2xTdGFja1Byb3BzIGV4dGVuZHMgU3RhY2tQcm9wcyB7XG4gIG9yZ0FjY291bnRzOiBzdHJpbmdbXTtcbiAgcmVnaW9uczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBJcGFtUG9vbCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJcGFtUG9vbFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIEdldCB0aGUgZGVmYXVsdCBJUEFNIHNjb3BlIElEIGZyb20gcHJvcHMsIG9yIENGTiBpbXBvcnRcbiAgICBjb25zdCBJcGFtUHJpdmF0ZURlZmF1bHRTY29wZUlkID1cbiAgICAgIHByb3BzLmlwYW1TY29wZSB8fCBGbi5pbXBvcnRWYWx1ZShcIklwYW1Qcml2YXRlRGVmYXVsdFNjb3BlSWRcIik7XG5cbiAgICBjb25zdCByZWdpb25zID0gcHJvcHMucmVnaW9ucztcbiAgICBpZiAoIXJlZ2lvbnMgfHwgcmVnaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0IGxlYXN0IG9uZSByZWdpb24gbXVzdCBiZSBzcGVjaWZpZWQgZm9yIElQQU0gcG9vbHNcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JnYW5pc2F0aW9uQWNjb3VudHMgPSBwcm9wcy5vcmdBY2NvdW50cy5tYXAoKGFjY291bnQpID0+XG4gICAgICBhY2NvdW50LnRvTG93ZXJDYXNlKClcbiAgICApO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBjaGlsZC1wb29sIENJRFIgc2l6ZSAoZGVmYXVsdHMgdG8gLzIwKVxuICAgIGNvbnN0IGRlZmF1bHROZXRtYXNrTGVuZ3RoID0gcHJvcHMuYWxsb2NhdGlvbkRlZmF1bHROZXRtYXNrTGVuZ3RoID8/IDIwO1xuICAgIGNvbnN0IHByb3Zpc2lvbmVkTmV0bWFza0xlbmd0aCA9IHByb3BzLnByb3Zpc2lvbmVkTmV0bWFza0xlbmd0aCA/PyAxNDtcblxuICAgIC8vIEJhc2ljIHZhbGlkYXRpb24g4oCTIC8xNiB0byAvMjggaW5jbHVzaXZlIGFyZSBjb25zaWRlcmVkIHNhZmUgZm9yIFZQQyBhbGxvY2F0aW9uc1xuICAgIGlmIChkZWZhdWx0TmV0bWFza0xlbmd0aCA8IDE2IHx8IGRlZmF1bHROZXRtYXNrTGVuZ3RoID4gMjgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGFsbG9jYXRpb25EZWZhdWx0TmV0bWFza0xlbmd0aCBtdXN0IGJlIGJldHdlZW4gMTYgYW5kIDI4IChpbmNsdXNpdmUpLiBSZWNlaXZlZDogJHtkZWZhdWx0TmV0bWFza0xlbmd0aH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHByb3Zpc2lvbmVkIGJsb2NrIHNpemUgKC8xMyB0byAvMTYpXG4gICAgaWYgKHByb3Zpc2lvbmVkTmV0bWFza0xlbmd0aCA8IDEzIHx8IHByb3Zpc2lvbmVkTmV0bWFza0xlbmd0aCA+IDE2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwcm92aXNpb25lZE5ldG1hc2tMZW5ndGggbXVzdCBiZSBiZXR3ZWVuIDEzIGFuZCAxNiAoaW5jbHVzaXZlKS4gUmVjZWl2ZWQ6ICR7cHJvdmlzaW9uZWROZXRtYXNrTGVuZ3RofWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2FybiBpZiB1c2VyIHJlcXVlc3RzIFZQQyBhbGxvY2F0aW9ucyBsYXJnZXIgdGhhbiB0aGUgcHJvdmlzaW9uZWQgcG9vbFxuICAgIGlmIChkZWZhdWx0TmV0bWFza0xlbmd0aCA8IHByb3Zpc2lvbmVkTmV0bWFza0xlbmd0aCkge1xuICAgICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgICAgYCdhbGxvY2F0aW9uRGVmYXVsdE5ldG1hc2tMZW5ndGgnICgvJHtkZWZhdWx0TmV0bWFza0xlbmd0aH0pIGlzIGxhcmdlciB0aGFuICdwcm92aXNpb25lZE5ldG1hc2tMZW5ndGgnICgvJHtwcm92aXNpb25lZE5ldG1hc2tMZW5ndGh9KS4gYCArXG4gICAgICAgICAgYFZQQyBhbGxvY2F0aW9uIG1heSBmYWlsIGlmIHRoZSBwb29sIGNhbm5vdCBzYXRpc2Z5IHRoZSByZXF1ZXN0LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVG9wIExldmVsIFBvb2xcbiAgICBjb25zdCByb290UG9vbCA9IG5ldyBJcGFtUG9vbENsYXNzKHRoaXMsIFwiVG9wTGV2ZWxJcGFtUG9vbFwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogYFJvb3QgSVBBTSBwb29sIChHbG9iYWwpYCxcbiAgICAgIGFkZHJlc3NGYW1pbHk6IFwiaXB2NFwiLFxuICAgICAgaXBhbVNjb3BlSWQ6IElwYW1Qcml2YXRlRGVmYXVsdFNjb3BlSWQsXG4gICAgICBwcm92aXNpb25lZENpZHJzOiBbXG4gICAgICAgIHsgY2lkcjogXCIxMC4wLjAuMC84XCIgfSxcbiAgICAgICAgeyBjaWRyOiBcIjE3Mi4xNi4wLjAvMTJcIiB9LFxuICAgICAgICB7IGNpZHI6IFwiMTkyLjE2OC4wLjAvMTZcIiB9XG4gICAgICBdLFxuICAgICAgYXV0b0ltcG9ydDogdHJ1ZSxcbiAgICAgIHRhZ3M6IFtcbiAgICAgICAge1xuICAgICAgICAgIGtleTogSVBBTV9UQUdTLk9QRVJBVElPTlNfUE9PTCxcbiAgICAgICAgICB2YWx1ZTogXCJ0b3AtbGV2ZWxcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiBJUEFNX1RBR1MuQ09TVF9BTExPQ0FUSU9OX0VOVklST05NRU5ULFxuICAgICAgICAgIHZhbHVlOiBcIm1hbmFnZW1lbnRcIlxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgcmVnaW9uYWwgcG9vbHMgYXMgY2hpbGRyZW4gb2YgdGhlIHJvb3QgcG9vbC5cbiAgICAvLyBTZXJpYWxpc2VkIHRvIGF2b2lkIEVDMiBJUEFNIFwidG9vIG1hbnkgY29uY3VycmVudCBtdXRhdGlvbnNcIiBlcnJvcnMg4oCUXG4gICAgLy8gZWFjaCByZWdpb25hbCBwb29sICsgQ0lEUiBtdXRhdGVzIHRoZSBwYXJlbnQgcm9vdCBwb29sIHJlc291cmNlLCBhbmRcbiAgICAvLyBJUEFNIHJlamVjdHMgcGFyYWxsZWwgbXV0YXRpb25zIG9uIHRoZSBzYW1lIHBhcmVudC5cbiAgICBsZXQgcHJldmlvdXNSZWdpb25hbENpZHI6IENmbklQQU1Qb29sQ2lkciB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIHJlZ2lvbnMpIHtcbiAgICAgIGNvbnN0IHJlZ2lvblN1ZmZpeCA9IHJlZ2lvbi5yZXBsYWNlKC8tL2csIFwiXCIpO1xuXG4gICAgICAvLyBDcmVhdGUgYSByZWdpb25hbCBwb29sIGZvciB0aGlzIHNwZWNpZmljIHJlZ2lvblxuICAgICAgY29uc3QgcmVnaW9uYWxQb29sID0gbmV3IElwYW1Qb29sQ2xhc3MoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGBSZWdpb25hbFBvb2wke3JlZ2lvblN1ZmZpeH1gLFxuICAgICAgICB7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBSZWdpb25hbCBJUEFNIHBvb2wgLSAke3JlZ2lvbn1gLFxuICAgICAgICAgIGFkZHJlc3NGYW1pbHk6IFwiaXB2NFwiLFxuICAgICAgICAgIGlwYW1TY29wZUlkOiBJcGFtUHJpdmF0ZURlZmF1bHRTY29wZUlkLFxuICAgICAgICAgIGxvY2FsZTogcmVnaW9uLFxuICAgICAgICAgIHNvdXJjZUlwYW1Qb29sSWQ6IHJvb3RQb29sLmF0dHJJcGFtUG9vbElkLFxuICAgICAgICAgIGF1dG9JbXBvcnQ6IHRydWUsXG4gICAgICAgICAgdGFnczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IElQQU1fVEFHUy5PUEVSQVRJT05TX1BPT0wsXG4gICAgICAgICAgICAgIHZhbHVlOiBgcmVnaW9uYWwtJHtyZWdpb259YFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBJUEFNX1RBR1MuQ09TVF9BTExPQ0FUSU9OX0VOVklST05NRU5ULFxuICAgICAgICAgICAgICB2YWx1ZTogXCJtYW5hZ2VtZW50XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIENoYWluOiBlYWNoIHJlZ2lvbmFsIHBvb2wgd2FpdHMgZm9yIHRoZSBwcmV2aW91cyByZWdpb24ncyBDSURSIHRvIGNvbXBsZXRlLlxuICAgICAgLy8gVGhpcyBzZXJpYWxpc2VzIHJlZ2lvbmFsIHBvb2wgY3JlYXRpb24sIHByZXZlbnRpbmcgY29uY3VycmVudCBtdXRhdGlvbnNcbiAgICAgIC8vIG9uIHRoZSByb290IHBvb2wgcmVzb3VyY2UuXG4gICAgICBpZiAocHJldmlvdXNSZWdpb25hbENpZHIpIHtcbiAgICAgICAgcmVnaW9uYWxQb29sLmFkZERlcGVuZGVuY3kocHJldmlvdXNSZWdpb25hbENpZHIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWdpb25hbENpZHJBbGxvY2F0aW9uID0gbmV3IENmbklQQU1Qb29sQ2lkcihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYFJlZ2lvbmFsUG9vbENpZHIke3JlZ2lvblN1ZmZpeH1gLFxuICAgICAgICB7XG4gICAgICAgICAgaXBhbVBvb2xJZDogcmVnaW9uYWxQb29sLmF0dHJJcGFtUG9vbElkLFxuICAgICAgICAgIG5ldG1hc2tMZW5ndGg6IDEwIC8vIEVhY2ggcmVnaW9uIGdldHMgYSAvMTAgKDQsMTk0LDMwNCBJUHMpXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHByZXZpb3VzUmVnaW9uYWxDaWRyID0gcmVnaW9uYWxDaWRyQWxsb2NhdGlvbjtcblxuICAgICAgLy8gU2VyaWFsaXNlZCBhY2NvdW50IHBvb2wgY3JlYXRpb24gd2l0aGluIGVhY2ggcmVnaW9uLlxuICAgICAgLy8gQWNjb3VudCBwb29scyB3aXRoaW4gYSByZWdpb24gYWxsIG11dGF0ZSB0aGUgc2FtZSByZWdpb25hbCBwb29sIHBhcmVudCxcbiAgICAgIC8vIHNvIHRoZXkgbXVzdCBiZSBzZXJpYWxpc2VkLiBBY2NvdW50IHBvb2xzIGluIERJRkZFUkVOVCByZWdpb25zIG11dGF0ZVxuICAgICAgLy8gZGlmZmVyZW50IHJlZ2lvbmFsIHBvb2wgcGFyZW50cywgc28gdGhleSBjYW4gc2FmZWx5IHJ1biBpbiBwYXJhbGxlbC5cbiAgICAgIC8vXG4gICAgICAvLyBVc2VzIENmblJlc291cmNlLmFkZERlcGVuZGVuY3koKSAobm90IG5vZGUuYWRkRGVwZW5kZW5jeSkgZm9yXG4gICAgICAvLyBndWFyYW50ZWVkIENsb3VkRm9ybWF0aW9uIERlcGVuZHNPbiBnZW5lcmF0aW9uIGJldHdlZW4gTDEgY29uc3RydWN0cy5cbiAgICAgIGxldCBwcmV2aW91c1dhdmVBbmNob3JDaWRyOiBDZm5JUEFNUG9vbENpZHIgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JnYW5pc2F0aW9uQWNjb3VudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYWNjb3VudCA9IG9yZ2FuaXNhdGlvbkFjY291bnRzW2ldO1xuICAgICAgICBjb25zdCBhY2NvdW50SWQgPSBnZXRBY2NvdW50SWQoYWNjb3VudCk7XG5cbiAgICAgICAgY29uc3QgaXBhbVBvb2wgPSBuZXcgSXBhbVBvb2xDbGFzcyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke2FjY291bnR9SXBhbVBvb2wke3JlZ2lvblN1ZmZpeH1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHthY2NvdW50fSAtIElQQU0gcG9vbCAtICR7cmVnaW9ufWAsXG4gICAgICAgICAgICBhZGRyZXNzRmFtaWx5OiBcImlwdjRcIixcbiAgICAgICAgICAgIGlwYW1TY29wZUlkOiBJcGFtUHJpdmF0ZURlZmF1bHRTY29wZUlkLFxuICAgICAgICAgICAgbG9jYWxlOiByZWdpb24sXG4gICAgICAgICAgICBzb3VyY2VJcGFtUG9vbElkOiByZWdpb25hbFBvb2wuYXR0cklwYW1Qb29sSWQsXG4gICAgICAgICAgICBhbGxvY2F0aW9uRGVmYXVsdE5ldG1hc2tMZW5ndGg6IGRlZmF1bHROZXRtYXNrTGVuZ3RoLFxuICAgICAgICAgICAgYWxsb2NhdGlvblJlc291cmNlVGFnczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAga2V5OiBJUEFNX1RBR1MuT1BFUkFUSU9OU19QT09MLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBgJHthY2NvdW50SWR9LSR7cmVnaW9ufWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGF1dG9JbXBvcnQ6IHRydWUsXG4gICAgICAgICAgICB0YWdzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IElQQU1fVEFHUy5PUEVSQVRJT05TX1BPT0wsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGAke2FjY291bnRJZH0tJHtyZWdpb259YFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAga2V5OiBJUEFNX1RBR1MuQ09TVF9BTExPQ0FUSU9OX0FDQ09VTlRfTkFNRSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogYWNjb3VudFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVuc3VyZSB0aGUgYWNjb3VudCBwb29sIGlzIGNyZWF0ZWQgYWZ0ZXIgdGhlIHJlZ2lvbmFsIENJRFIgYWxsb2NhdGlvblxuICAgICAgICBpcGFtUG9vbC5hZGREZXBlbmRlbmN5KHJlZ2lvbmFsQ2lkckFsbG9jYXRpb24pO1xuXG4gICAgICAgIC8vIFdhdmUgYm91bmRhcnk6IHBvb2xzIGluIHdhdmUgTisxIGRlcGVuZCBvbiB0aGUgbGFzdCBDSURSIGZyb20gd2F2ZSBOXG4gICAgICAgIGlmIChwcmV2aW91c1dhdmVBbmNob3JDaWRyKSB7XG4gICAgICAgICAgaXBhbVBvb2wuYWRkRGVwZW5kZW5jeShwcmV2aW91c1dhdmVBbmNob3JDaWRyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNpZHJBbGxvY2F0aW9uID0gbmV3IENmbklQQU1Qb29sQ2lkcihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke2FjY291bnR9UG9vbENpZHIke3Byb3Zpc2lvbmVkTmV0bWFza0xlbmd0aH0ke3JlZ2lvblN1ZmZpeH1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlwYW1Qb29sSWQ6IGlwYW1Qb29sLmF0dHJJcGFtUG9vbElkLFxuICAgICAgICAgICAgbmV0bWFza0xlbmd0aDogcHJvdmlzaW9uZWROZXRtYXNrTGVuZ3RoXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFRoZSBsYXN0IHBvb2wgaW4gZWFjaCB3YXZlIGFuY2hvcnMgdGhlIG5leHQgd2F2ZSdzIGRlcGVuZGVuY3lcbiAgICAgICAgY29uc3QgaXNMYXN0SW5XYXZlID1cbiAgICAgICAgICAoaSArIDEpICUgSVBBTV9QT09MX0JBVENIX1NJWkUgPT09IDAgfHxcbiAgICAgICAgICBpID09PSBvcmdhbmlzYXRpb25BY2NvdW50cy5sZW5ndGggLSAxO1xuXG4gICAgICAgIGlmIChpc0xhc3RJbldhdmUpIHtcbiAgICAgICAgICBwcmV2aW91c1dhdmVBbmNob3JDaWRyID0gY2lkckFsbG9jYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbiBzdGFjayBkZWxldGlvbiwgVlBDIGFsbG9jYXRpb25zIChub3QgbWFuYWdlZCBieSBDbG91ZEZvcm1hdGlvbilcbiAgICAgICAgLy8gYmxvY2sgQ0lEUiBkZXByb3Zpc2lvbmluZy4gVGhpcyBjdXN0b20gcmVzb3VyY2UgcmVsZWFzZXMgdGhlbSBmaXJzdC5cbiAgICAgICAgY29uc3QgYWxsb2NhdGlvbkNsZWFudXAgPSBuZXcgQ3VzdG9tUmVzb3VyY2UoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBgJHthY2NvdW50fUlwYW1DbGVhbnVwJHtyZWdpb25TdWZmaXh9YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgICAgICAgIGxhbWJkYURlc2NyaXB0aW9uOiBgJHthY2NvdW50fSBJUEFNIHBvb2wgYWxsb2NhdGlvbiBjbGVhbnVwIC0gJHtyZWdpb259YCxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgSXBhbVBvb2xJZDogaXBhbVBvb2wuYXR0cklwYW1Qb29sSWQsXG4gICAgICAgICAgICAgIFBvb2xSZWdpb246IHJlZ2lvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlubGluZVBvbGljeTogW1xuICAgICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICBcImVjMjpHZXRJcGFtUG9vbEFsbG9jYXRpb25zXCIsXG4gICAgICAgICAgICAgICAgICBcImVjMjpSZWxlYXNlSXBhbVBvb2xBbGxvY2F0aW9uXCJcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGlubGluZUNvZGU6IGBcbmNvbnN0IHsgRUMyQ2xpZW50LCBHZXRJcGFtUG9vbEFsbG9jYXRpb25zQ29tbWFuZCwgUmVsZWFzZUlwYW1Qb29sQWxsb2NhdGlvbkNvbW1hbmQgfSA9IHJlcXVpcmUoJ0Bhd3Mtc2RrL2NsaWVudC1lYzInKTtcblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHBoeXNpY2FsUmVzb3VyY2VJZCA9IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCB8fCBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCB8fCAnaXBhbS1wb29sLWNsZWFudXAnO1xuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgIT09ICdEZWxldGUnKSB7XG4gICAgcmV0dXJuIHsgUGh5c2ljYWxSZXNvdXJjZUlkOiBwaHlzaWNhbFJlc291cmNlSWQgfTtcbiAgfVxuICBjb25zdCBwb29sSWQgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuSXBhbVBvb2xJZDtcbiAgY29uc3QgcG9vbFJlZ2lvbiA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5Qb29sUmVnaW9uO1xuICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHsgcmVnaW9uOiBwb29sUmVnaW9uIH0pO1xuICBsZXQgbmV4dFRva2VuO1xuICBkbyB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZWMyLnNlbmQobmV3IEdldElwYW1Qb29sQWxsb2NhdGlvbnNDb21tYW5kKHtcbiAgICAgIElwYW1Qb29sSWQ6IHBvb2xJZCwgLi4uKG5leHRUb2tlbiAmJiB7IE5leHRUb2tlbjogbmV4dFRva2VuIH0pXG4gICAgfSkpO1xuICAgIGZvciAoY29uc3QgYWxsb2Mgb2YgKHJlcy5JcGFtUG9vbEFsbG9jYXRpb25zIHx8IFtdKSkge1xuICAgICAgaWYgKGFsbG9jLlJlc291cmNlVHlwZSA9PT0gJ2lwYW0tcG9vbCcpIGNvbnRpbnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZWMyLnNlbmQobmV3IFJlbGVhc2VJcGFtUG9vbEFsbG9jYXRpb25Db21tYW5kKHtcbiAgICAgICAgICBJcGFtUG9vbElkOiBwb29sSWQsXG4gICAgICAgICAgQ2lkcjogYWxsb2MuQ2lkcixcbiAgICAgICAgICBJcGFtUG9vbEFsbG9jYXRpb25JZDogYWxsb2MuSXBhbVBvb2xBbGxvY2F0aW9uSWRcbiAgICAgICAgfSkpO1xuICAgICAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmxvZygnUmVsZWFzZSBmYWlsZWQgKG1heSBhbHJlYWR5IGJlIHJlbGVhc2VkKTonLCBlLm1lc3NhZ2UpOyB9XG4gICAgfVxuICAgIG5leHRUb2tlbiA9IHJlcy5OZXh0VG9rZW47XG4gIH0gd2hpbGUgKG5leHRUb2tlbik7XG4gIHJldHVybiB7IFBoeXNpY2FsUmVzb3VyY2VJZDogcGh5c2ljYWxSZXNvdXJjZUlkIH07XG59O2BcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGFsbG9jYXRpb25DbGVhbnVwLm5vZGUuYWRkRGVwZW5kZW5jeShjaWRyQWxsb2NhdGlvbik7XG5cbiAgICAgICAgLy8gU2hhcmUgdGhlIHBvb2wgd2l0aCB0aGUgdGFyZ2V0IGFjY291bnQgc28gdGhhdCBWUENzIGNhbiBhbGxvY2F0ZVxuICAgICAgICBjb25zdCBzaGFyZSA9IG5ldyBSZXNvdXJjZVNoYXJlKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYCR7YWNjb3VudH1JcGFtUmVzb3VyY2VTaGFyZSR7cmVnaW9uU3VmZml4fWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogYCR7YWNjb3VudH1JcGFtUmVzb3VyY2VTaGFyZS4ke3JlZ2lvbn1gLFxuICAgICAgICAgICAgYWxsb3dFeHRlcm5hbFByaW5jaXBhbHM6IGZhbHNlLFxuICAgICAgICAgICAgcHJpbmNpcGFsczogW2FjY291bnRJZF0sXG4gICAgICAgICAgICByZXNvdXJjZUFybnM6IFtpcGFtUG9vbC5hdHRyQXJuXSxcbiAgICAgICAgICAgIHRhZ3M6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogSVBBTV9UQUdTLkNPU1RfQUxMT0NBVElPTl9FTlZJUk9OTUVOVCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJtYW5hZ2VtZW50XCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBEZWxldGUgb3JkZXI6IHNoYXJlIOKGkiBjbGVhbnVwIChyZWxlYXNlcyBWUEMgYWxsb2NhdGlvbnMpIOKGkiBjaWRyQWxsb2NhdGlvbiDihpIgcG9vbFxuICAgICAgICBzaGFyZS5ub2RlLmFkZERlcGVuZGVuY3koYWxsb2NhdGlvbkNsZWFudXAucmVzb3VyY2UpO1xuXG4gICAgICAgIC8vIEV4cG9zZSB0aGUgcG9vbCBJRCBmb3IgY3Jvc3Mtc3RhY2sgdXNhZ2UgKGUuZy4gVlBDIGFsbG9jYXRpb25zKVxuICAgICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGBJcGFtUG9vbElkJHthY2NvdW50SWR9JHtyZWdpb25TdWZmaXh9YCwge1xuICAgICAgICAgIGtleTogYElwYW1Qb29sSWQke2FjY291bnRJZH0ke3JlZ2lvblN1ZmZpeH1gLFxuICAgICAgICAgIHZhbHVlOiBpcGFtUG9vbC5hdHRySXBhbVBvb2xJZCxcbiAgICAgICAgICBleHBvcnROYW1lOiBgSXBhbVBvb2xJZCR7YWNjb3VudElkfSR7cmVnaW9uU3VmZml4fWBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCBgSXBhbVBvb2xBcm4ke2FjY291bnRJZH0ke3JlZ2lvblN1ZmZpeH1gLCB7XG4gICAgICAgICAga2V5OiBgSXBhbVBvb2xBcm4ke2FjY291bnRJZH0ke3JlZ2lvblN1ZmZpeH1gLFxuICAgICAgICAgIHZhbHVlOiBpcGFtUG9vbC5hdHRyQXJuLFxuICAgICAgICAgIGV4cG9ydE5hbWU6IGBJcGFtUG9vbEFybiR7YWNjb3VudElkfSR7cmVnaW9uU3VmZml4fWBcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vIGNyb3NzLXJlZ2lvbiBjaGFpbmluZyBuZWVkZWQ6IGFjY291bnQgcG9vbHMgaW4gZGlmZmVyZW50IHJlZ2lvbnNcbiAgICAgIC8vIG11dGF0ZSBkaWZmZXJlbnQgcGFyZW50IHJlc291cmNlcyBhbmQgY2FuIHNhZmVseSBydW4gaW4gcGFyYWxsZWwuXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJcGFtUG9vbFN0YWNrIGV4dGVuZHMgU3RhY2sge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSXBhbVBvb2xTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIG5ldyBJcGFtUG9vbCh0aGlzLCBcIklwYW1Qb29sXCIsIHtcbiAgICAgIG9yZ0FjY291bnRzOiBwcm9wcy5vcmdBY2NvdW50cyxcbiAgICAgIHJlZ2lvbnM6IHByb3BzLnJlZ2lvbnNcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -1,8 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SecurityGroup = void 0;
4
- const ec2 = require("aws-cdk-lib/aws-ec2");
5
- class SecurityGroup extends ec2.SecurityGroup {
1
+ import * as ec2 from "aws-cdk-lib/aws-ec2";
2
+ export class SecurityGroup extends ec2.SecurityGroup {
6
3
  constructor(scope, id, props) {
7
4
  super(scope, id, {
8
5
  ...props,
@@ -10,5 +7,3 @@ class SecurityGroup extends ec2.SecurityGroup {
10
7
  });
11
8
  }
12
9
  }
13
- exports.SecurityGroup = SecurityGroup;
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHlHcm91cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL25ldHdvcmtpbmcvc2VjdXJpdHlHcm91cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBMkM7QUFHM0MsTUFBYSxhQUFjLFNBQVEsR0FBRyxDQUFDLGFBQWE7SUFDbEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE2QjtRQUNyRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLEdBQUcsS0FBSztZQUNSLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLEdBQUcsRUFBRSxpQkFBaUI7U0FDekQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBUEQsc0NBT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuZXhwb3J0IGNsYXNzIFNlY3VyaXR5R3JvdXAgZXh0ZW5kcyBlYzIuU2VjdXJpdHlHcm91cCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBlYzIuU2VjdXJpdHlHcm91cFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbiB8fCBgJHtpZH0gU2VjdXJpdHkgR3JvdXBgXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,6 +1,6 @@
1
1
  import { type Construct } from "constructs";
2
2
  import * as ec2 from "aws-cdk-lib/aws-ec2";
3
- import { type StackBuilder } from "../base/awsStack";
3
+ import { type StackBuilder } from "../base/awsStack.js";
4
4
  export interface VpcFlowLogConfig {
5
5
  destination?: "cloudwatch" | "s3";
6
6
  retentionDays?: number;
@@ -1,12 +1,12 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Vpc = void 0;
4
- const aws_cdk_lib_1 = require("aws-cdk-lib");
5
- const ec2 = require("aws-cdk-lib/aws-ec2");
6
- const s3 = require("aws-cdk-lib/aws-s3");
7
- const logGroup_1 = require("../logging/logGroup");
8
- const storage_1 = require("../storage");
9
- class Vpc extends ec2.Vpc {
1
+ import { Duration, RemovalPolicy, Stack } from "aws-cdk-lib";
2
+ import * as ec2 from "aws-cdk-lib/aws-ec2";
3
+ import * as s3 from "aws-cdk-lib/aws-s3";
4
+ import { LogGroup } from "../logging/logGroup.js";
5
+ import { S3Bucket } from "../storage/index.js";
6
+ export class Vpc extends ec2.Vpc {
7
+ gatewayEndpoints = [];
8
+ interfaceEndpoints = [];
9
+ hasNatGateways;
10
10
  constructor(scope, id, props) {
11
11
  const { maxAzs: maxAzsFromProps, vpcName: explicitName, ...restProps } = props ?? {};
12
12
  const maxAzs = maxAzsFromProps ?? 3;
@@ -21,8 +21,6 @@ class Vpc extends ec2.Vpc {
21
21
  ipAddresses: Vpc.ipAddresses(scope, id, props),
22
22
  gatewayEndpoints: Vpc.gatewayEndpoints(props)
23
23
  });
24
- this.gatewayEndpoints = [];
25
- this.interfaceEndpoints = [];
26
24
  this.hasNatGateways = natGateways !== 0;
27
25
  this.addInterfaceEndpoints(id, props, this.hasNatGateways);
28
26
  }
@@ -143,7 +141,7 @@ class Vpc extends ec2.Vpc {
143
141
  return natConfig.count ?? 1;
144
142
  }
145
143
  static availabilityZones(scope, maxAzs = 3) {
146
- return aws_cdk_lib_1.Stack.of(scope).availabilityZones.slice(0, maxAzs);
144
+ return Stack.of(scope).availabilityZones.slice(0, maxAzs);
147
145
  }
148
146
  static flowLogs(scope, id, props) {
149
147
  if (props?.flowLogConfig === false) {
@@ -155,9 +153,9 @@ class Vpc extends ec2.Vpc {
155
153
  }
156
154
  return {
157
155
  [`${id}VpcFlowLogs`]: {
158
- destination: ec2.FlowLogDestination.toCloudWatchLogs(new logGroup_1.LogGroup(scope, `${id}FlowLogGroup`, {
156
+ destination: ec2.FlowLogDestination.toCloudWatchLogs(new LogGroup(scope, `${id}FlowLogGroup`, {
159
157
  logGroupName: `/vpc/flowlogs/vpc-${id}/`,
160
- removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY
158
+ removalPolicy: RemovalPolicy.DESTROY
161
159
  }))
162
160
  }
163
161
  };
@@ -165,11 +163,11 @@ class Vpc extends ec2.Vpc {
165
163
  const config = props.flowLogConfig;
166
164
  const trafficType = Vpc.resolveTrafficType(config.trafficType);
167
165
  if (config.destination === "s3") {
168
- const bucket = new storage_1.S3Bucket(scope, `${id}FlowLogBucket`, {
169
- bucketName: `vpc-flowlogs-${id.toLowerCase()}-${aws_cdk_lib_1.Stack.of(scope).account}`,
166
+ const bucket = new S3Bucket(scope, `${id}FlowLogBucket`, {
167
+ bucketName: `vpc-flowlogs-${id.toLowerCase()}-${Stack.of(scope).account}`,
170
168
  encryption: s3.BucketEncryption.S3_MANAGED,
171
169
  lifecycleRules: config.retentionDays
172
- ? [{ expiration: aws_cdk_lib_1.Duration.days(config.retentionDays), enabled: true }]
170
+ ? [{ expiration: Duration.days(config.retentionDays), enabled: true }]
173
171
  : undefined
174
172
  });
175
173
  return {
@@ -182,9 +180,9 @@ class Vpc extends ec2.Vpc {
182
180
  const retentionDays = config.retentionDays ?? 14;
183
181
  return {
184
182
  [`${id}VpcFlowLogs`]: {
185
- destination: ec2.FlowLogDestination.toCloudWatchLogs(new logGroup_1.LogGroup(scope, `${id}FlowLogGroup`, {
183
+ destination: ec2.FlowLogDestination.toCloudWatchLogs(new LogGroup(scope, `${id}FlowLogGroup`, {
186
184
  logGroupName: `/vpc/flowlogs/vpc-${id}/`,
187
- removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
185
+ removalPolicy: RemovalPolicy.DESTROY,
188
186
  retention: Vpc.daysToRetention(retentionDays)
189
187
  })),
190
188
  trafficType
@@ -234,5 +232,3 @@ class Vpc extends ec2.Vpc {
234
232
  };
235
233
  }
236
234
  }
237
- exports.Vpc = Vpc;
238
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnBjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvbmV0d29ya2luZy92cGMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQTZEO0FBQzdELDJDQUEyQztBQUMzQyx5Q0FBeUM7QUFFekMsa0RBQStDO0FBQy9DLHdDQUFzQztBQTZDdEMsTUFBYSxHQUFJLFNBQVEsR0FBRyxDQUFDLEdBQUc7SUFLOUIsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQjtRQUN4RCxNQUFNLEVBQ0osTUFBTSxFQUFFLGVBQWUsRUFDdkIsT0FBTyxFQUFFLFlBQVksRUFDckIsR0FBRyxTQUFTLEVBQ2IsR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLGVBQWUsSUFBSSxDQUFDLENBQUM7UUFDcEMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLFlBQVksSUFBSSxFQUFFLENBQUM7UUFFbkMsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1lBQ3hCLEdBQUcsU0FBUztZQUNaLE9BQU87WUFDUCxXQUFXO1lBQ1gsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7WUFDdkQsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUM7WUFDeEMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUM7WUFDOUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQztTQUM5QyxDQUFDLENBQUM7UUF0QlcscUJBQWdCLEdBQTZCLEVBQUUsQ0FBQztRQUNoRCx1QkFBa0IsR0FBK0IsRUFBRSxDQUFDO1FBdUJsRSxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyxNQUFNLENBQUMsZ0JBQWdCLENBQzdCLEtBQWdCO1FBRWhCLElBQUksS0FBSyxFQUFFLGVBQWUsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNyQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsS0FBSyxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUM7UUFDdEQsSUFBSSxhQUFhLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDNUIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLGFBQWEsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDO1FBQzNDLE1BQU0sY0FBYyxHQUFHLGFBQWEsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDO1FBRXZELElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNqQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQWtELEVBQUUsQ0FBQztRQUVwRSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsU0FBUyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbEUsQ0FBQztRQUNELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsU0FBUyxDQUFDLFFBQVEsR0FBRztnQkFDbkIsT0FBTyxFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRO2FBQ25ELENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVPLHFCQUFxQixDQUMzQixFQUFVLEVBQ1YsS0FBMkIsRUFDM0IsY0FBdUI7UUFFdkIsSUFBSSxLQUFLLEVBQUUsZUFBZSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3JDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUM7UUFDMUQsSUFBSSxlQUFlLEtBQUssS0FBSyxJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvRCxPQUFPO1FBQ1QsQ0FBQztRQUVELDZFQUE2RTtRQUM3RSw0RUFBNEU7UUFDNUUsa0ZBQWtGO1FBQ2xGLE1BQU0sVUFBVSxHQUFHLGNBQWM7WUFDL0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsbUJBQW1CO1lBQ3BDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDO1FBQ3BDLE1BQU0sZUFBZSxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFFdkMsSUFBSSxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDMUIsSUFBSSxHQUFHLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUU7Z0JBQ25ELEdBQUcsRUFBRSxJQUFJO2dCQUNULE9BQU8sRUFBRSxHQUFHLENBQUMsOEJBQThCLENBQUMsVUFBVTtnQkFDdEQsaUJBQWlCLEVBQUUsSUFBSTtnQkFDdkIsT0FBTyxFQUFFLGVBQWU7YUFDekIsQ0FBQyxDQUNILENBQUM7WUFDRixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUMxQixJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRTtnQkFDaEQsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsT0FBTyxFQUFFLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHO2dCQUMvQyxpQkFBaUIsRUFBRSxJQUFJO2dCQUN2QixPQUFPLEVBQUUsZUFBZTthQUN6QixDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUMxQixJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFO2dCQUN4RCxHQUFHLEVBQUUsSUFBSTtnQkFDVCxPQUFPLEVBQUUsR0FBRyxDQUFDLDhCQUE4QixDQUFDLGVBQWU7Z0JBQzNELGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLE9BQU8sRUFBRSxlQUFlO2FBQ3pCLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQzFCLElBQUksR0FBRyxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO2dCQUM3QyxHQUFHLEVBQUUsSUFBSTtnQkFDVCxPQUFPLEVBQUUsR0FBRyxDQUFDLDhCQUE4QixDQUFDLEdBQUc7Z0JBQy9DLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLE9BQU8sRUFBRSxlQUFlO2FBQ3pCLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQzFCLElBQUksR0FBRyxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ3hELEdBQUcsRUFBRSxJQUFJO2dCQUNULE9BQU8sRUFBRSxHQUFHLENBQUMsOEJBQThCLENBQUMsZUFBZTtnQkFDM0QsaUJBQWlCLEVBQUUsSUFBSTtnQkFDdkIsT0FBTyxFQUFFLGVBQWU7YUFDekIsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDMUIsSUFBSSxHQUFHLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUU7Z0JBQzdDLEdBQUcsRUFBRSxJQUFJO2dCQUNULE9BQU8sRUFBRSxHQUFHLENBQUMsOEJBQThCLENBQUMsR0FBRztnQkFDL0MsaUJBQWlCLEVBQUUsSUFBSTtnQkFDdkIsT0FBTyxFQUFFLGVBQWU7YUFDekIsQ0FBQyxDQUNILENBQUM7WUFDRixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUMxQixJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRTtnQkFDckQsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsT0FBTyxFQUFFLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxZQUFZO2dCQUN4RCxpQkFBaUIsRUFBRSxJQUFJO2dCQUN2QixPQUFPLEVBQUUsZUFBZTthQUN6QixDQUFDLENBQ0gsQ0FBQztZQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQzFCLElBQUksR0FBRyxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFO2dCQUNyRCxHQUFHLEVBQUUsSUFBSTtnQkFDVCxPQUFPLEVBQUUsR0FBRyxDQUFDLDhCQUE4QixDQUFDLFlBQVk7Z0JBQ3hELGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLE9BQU8sRUFBRSxlQUFlO2FBQ3pCLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQzFCLElBQUksR0FBRyxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO2dCQUM3QyxHQUFHLEVBQUUsSUFBSTtnQkFDVCxPQUFPLEVBQUUsR0FBRyxDQUFDLDhCQUE4QixDQUFDLEdBQUc7Z0JBQy9DLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLE9BQU8sRUFBRSxlQUFlO2FBQ3pCLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBZ0I7UUFDeEMsTUFBTSxTQUFTLEdBQUcsS0FBSyxFQUFFLGdCQUFnQixDQUFDO1FBRTFDLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJLFNBQVMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN4QixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBZ0IsRUFBRSxNQUFNLEdBQUcsQ0FBQztRQUNuRCxPQUFPLG1CQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQ2IsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQWdCO1FBRWhCLElBQUksS0FBSyxFQUFFLGFBQWEsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsSUFBSSxLQUFLLEVBQUUsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFDRCxPQUFPO2dCQUNMLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxFQUFFO29CQUNwQixXQUFXLEVBQUUsR0FBRyxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUNsRCxJQUFJLG1CQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUU7d0JBQ3ZDLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxHQUFHO3dCQUN4QyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO3FCQUNyQyxDQUFDLENBQ0g7aUJBQ0Y7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDbkMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUvRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxrQkFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFO2dCQUN2RCxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3pFLFVBQVUsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVTtnQkFDMUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxhQUFhO29CQUNsQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxzQkFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO29CQUN0RSxDQUFDLENBQUMsU0FBUzthQUNkLENBQUMsQ0FBQztZQUVILE9BQU87Z0JBQ0wsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLEVBQUU7b0JBQ3BCLFdBQVcsRUFBRSxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztvQkFDaEQsV0FBVztpQkFDWjthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7UUFDakQsT0FBTztZQUNMLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxFQUFFO2dCQUNwQixXQUFXLEVBQUUsR0FBRyxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUNsRCxJQUFJLG1CQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUU7b0JBQ3ZDLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxHQUFHO29CQUN4QyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO29CQUNwQyxTQUFTLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUM7aUJBQzlDLENBQUMsQ0FDSDtnQkFDRCxXQUFXO2FBQ1o7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBWTtRQUN6QyxNQUFNLGVBQWUsR0FBRztZQUN0QixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUN6RSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtTQUM3QixDQUFDO1FBQ0YsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3hELENBQUM7SUFFTyxNQUFNLENBQUMsa0JBQWtCLENBQy9CLFdBQXlDO1FBRXpDLFFBQVEsV0FBVyxFQUFFLENBQUM7WUFDcEIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sR0FBRyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztZQUN2QyxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxHQUFHLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLEtBQUssS0FBSyxDQUFDO1lBQ1g7Z0JBQ0UsT0FBTyxHQUFHLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQjtRQUMvRCxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUNoRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDNUMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFFbEQsT0FBTyxHQUFHLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDO1lBQ3ZDLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztZQUNwQyxpQkFBaUIsRUFBRSxXQUFXO1lBQzlCLDhCQUE4QixFQUFFLGNBQWM7U0FDL0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBVSxFQUFFLEtBQWdCO1FBQ3ZDLE9BQU8sQ0FBQyxFQUFnQixFQUFFLEVBQUU7WUFDMUIsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsTUFBTSxDQUNYLEVBQVUsRUFDVixZQUFvQjtRQUVwQixPQUFPLENBQUMsRUFBZ0IsRUFBRSxFQUFFO1lBQzFCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRTtnQkFDM0MsT0FBTyxFQUFFLEdBQUcsWUFBWSxJQUFJLEVBQUUsRUFBRTthQUNqQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFsVEQsa0JBa1RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCAqIGFzIHMzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IHR5cGUgU3RhY2tCdWlsZGVyIH0gZnJvbSBcIi4uL2Jhc2UvYXdzU3RhY2tcIjtcbmltcG9ydCB7IExvZ0dyb3VwIH0gZnJvbSBcIi4uL2xvZ2dpbmcvbG9nR3JvdXBcIjtcbmltcG9ydCB7IFMzQnVja2V0IH0gZnJvbSBcIi4uL3N0b3JhZ2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWcGNGbG93TG9nQ29uZmlnIHtcbiAgZGVzdGluYXRpb24/OiBcImNsb3Vkd2F0Y2hcIiB8IFwiczNcIjtcbiAgcmV0ZW50aW9uRGF5cz86IG51bWJlcjtcbiAgdHJhZmZpY1R5cGU/OiBcIkFMTFwiIHwgXCJBQ0NFUFRcIiB8IFwiUkVKRUNUXCI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVnBjTmF0Q29uZmlnIHtcbiAgY291bnQ/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBHYXRld2F5RW5kcG9pbnRzIHtcbiAgczM/OiBib29sZWFuO1xuICBkeW5hbW9kYj86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBJbnRlcmZhY2VFbmRwb2ludHMge1xuICBlY3I/OiBib29sZWFuO1xuICBzZWNyZXRzTWFuYWdlcj86IGJvb2xlYW47XG4gIGttcz86IGJvb2xlYW47XG4gIGNsb3Vkd2F0Y2hMb2dzPzogYm9vbGVhbjtcbiAgc3NtPzogYm9vbGVhbjtcbiAgc3RzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEVuZHBvaW50c0NvbmZpZyB7XG4gIGdhdGV3YXk/OiBHYXRld2F5RW5kcG9pbnRzIHwgZmFsc2U7XG4gIGludGVyZmFjZT86IEludGVyZmFjZUVuZHBvaW50cyB8IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZwY1Byb3BzIGV4dGVuZHMgZWMyLlZwY1Byb3BzIHtcbiAgcmVnaW9uPzogc3RyaW5nO1xuICBhY2NvdW50SWQ/OiBzdHJpbmc7XG4gIGF2YWlsYWJpbGl0eVpvbmVzPzogc3RyaW5nW107XG4gIGlwdjRJcGFtUG9vbElkPzogc3RyaW5nO1xuICBtYXhBenM/OiBudW1iZXI7XG4gIG5hdEdhdGV3YXlDb25maWc/OiBWcGNOYXRDb25maWcgfCBmYWxzZTtcbiAgZmxvd0xvZ0NvbmZpZz86IFZwY0Zsb3dMb2dDb25maWcgfCBmYWxzZTtcbiAgZW5kcG9pbnRzQ29uZmlnPzogRW5kcG9pbnRzQ29uZmlnIHwgZmFsc2U7XG4gIHZwY0NpZHJNYXNrPzogbnVtYmVyO1xuICBzdWJuZXRDaWRyTWFzaz86IG51bWJlcjtcbiAgdnBjTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFZwYyBleHRlbmRzIGVjMi5WcGMge1xuICBwdWJsaWMgcmVhZG9ubHkgZ2F0ZXdheUVuZHBvaW50czogZWMyLkdhdGV3YXlWcGNFbmRwb2ludFtdID0gW107XG4gIHB1YmxpYyByZWFkb25seSBpbnRlcmZhY2VFbmRwb2ludHM6IGVjMi5JbnRlcmZhY2VWcGNFbmRwb2ludFtdID0gW107XG4gIHB1YmxpYyByZWFkb25seSBoYXNOYXRHYXRld2F5czogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFZwY1Byb3BzKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWF4QXpzOiBtYXhBenNGcm9tUHJvcHMsXG4gICAgICB2cGNOYW1lOiBleHBsaWNpdE5hbWUsXG4gICAgICAuLi5yZXN0UHJvcHNcbiAgICB9ID0gcHJvcHMgPz8ge307XG4gICAgY29uc3QgbWF4QXpzID0gbWF4QXpzRnJvbVByb3BzID8/IDM7XG4gICAgY29uc3QgbmF0R2F0ZXdheXMgPSBWcGMucmVzb2x2ZU5hdEdhdGV3YXlzKHByb3BzKTtcbiAgICBjb25zdCB2cGNOYW1lID0gZXhwbGljaXROYW1lID8/IGlkO1xuXG4gICAgc3VwZXIoc2NvcGUsIGB2cGMtJHtpZH1gLCB7XG4gICAgICAuLi5yZXN0UHJvcHMsXG4gICAgICB2cGNOYW1lLFxuICAgICAgbmF0R2F0ZXdheXMsXG4gICAgICBhdmFpbGFiaWxpdHlab25lczogVnBjLmF2YWlsYWJpbGl0eVpvbmVzKHNjb3BlLCBtYXhBenMpLFxuICAgICAgZmxvd0xvZ3M6IFZwYy5mbG93TG9ncyhzY29wZSwgaWQsIHByb3BzKSxcbiAgICAgIGlwQWRkcmVzc2VzOiBWcGMuaXBBZGRyZXNzZXMoc2NvcGUsIGlkLCBwcm9wcyksXG4gICAgICBnYXRld2F5RW5kcG9pbnRzOiBWcGMuZ2F0ZXdheUVuZHBvaW50cyhwcm9wcylcbiAgICB9KTtcblxuICAgIHRoaXMuaGFzTmF0R2F0ZXdheXMgPSBuYXRHYXRld2F5cyAhPT0gMDtcbiAgICB0aGlzLmFkZEludGVyZmFjZUVuZHBvaW50cyhpZCwgcHJvcHMsIHRoaXMuaGFzTmF0R2F0ZXdheXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2F0ZXdheUVuZHBvaW50cyhcbiAgICBwcm9wcz86IFZwY1Byb3BzXG4gICk6IFJlY29yZDxzdHJpbmcsIGVjMi5HYXRld2F5VnBjRW5kcG9pbnRPcHRpb25zPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByb3BzPy5lbmRwb2ludHNDb25maWcgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGdhdGV3YXlDb25maWcgPSBwcm9wcz8uZW5kcG9pbnRzQ29uZmlnPy5nYXRld2F5O1xuICAgIGlmIChnYXRld2F5Q29uZmlnID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVTMyA9IGdhdGV3YXlDb25maWc/LnMzID8/IHRydWU7XG4gICAgY29uc3QgZW5hYmxlRHluYW1vZGIgPSBnYXRld2F5Q29uZmlnPy5keW5hbW9kYiA/PyB0cnVlO1xuXG4gICAgaWYgKCFlbmFibGVTMyAmJiAhZW5hYmxlRHluYW1vZGIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnRzOiBSZWNvcmQ8c3RyaW5nLCBlYzIuR2F0ZXdheVZwY0VuZHBvaW50T3B0aW9ucz4gPSB7fTtcblxuICAgIGlmIChlbmFibGVTMykge1xuICAgICAgZW5kcG9pbnRzLlMzID0geyBzZXJ2aWNlOiBlYzIuR2F0ZXdheVZwY0VuZHBvaW50QXdzU2VydmljZS5TMyB9O1xuICAgIH1cbiAgICBpZiAoZW5hYmxlRHluYW1vZGIpIHtcbiAgICAgIGVuZHBvaW50cy5EeW5hbW9EQiA9IHtcbiAgICAgICAgc2VydmljZTogZWMyLkdhdGV3YXlWcGNFbmRwb2ludEF3c1NlcnZpY2UuRFlOQU1PREJcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuZHBvaW50cztcbiAgfVxuXG4gIHByaXZhdGUgYWRkSW50ZXJmYWNlRW5kcG9pbnRzKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFZwY1Byb3BzIHwgdW5kZWZpbmVkLFxuICAgIGhhc05hdEdhdGV3YXlzOiBib29sZWFuXG4gICkge1xuICAgIGlmIChwcm9wcz8uZW5kcG9pbnRzQ29uZmlnID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVyZmFjZUNvbmZpZyA9IHByb3BzPy5lbmRwb2ludHNDb25maWc/LmludGVyZmFjZTtcbiAgICBpZiAoaW50ZXJmYWNlQ29uZmlnID09PSBmYWxzZSB8fCBpbnRlcmZhY2VDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZQQyBlbmRwb2ludHMgbXVzdCBiZSBpbiB0aGUgc2FtZSBzdWJuZXQgdHlwZSBhcyB0aGUgcmVzb3VyY2VzIHVzaW5nIHRoZW06XG4gICAgLy8gLSBXaXRoIE5BVDogUFJJVkFURV9XSVRIX0VHUkVTUyAoTGFtYmRhIHVzZXMgdGhlc2Ugd2hlbiBOQVQgaXMgYXZhaWxhYmxlKVxuICAgIC8vIC0gV2l0aG91dCBOQVQ6IFBSSVZBVEVfSVNPTEFURUQgKExhbWJkYSBmYWxscyBiYWNrIHRvIHRoZXNlIHdoZW4gbm8gTkFUIGV4aXN0cylcbiAgICBjb25zdCBzdWJuZXRUeXBlID0gaGFzTmF0R2F0ZXdheXNcbiAgICAgID8gZWMyLlN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgICAgOiBlYzIuU3VibmV0VHlwZS5QUklWQVRFX0lTT0xBVEVEO1xuICAgIGNvbnN0IHN1Ym5ldFNlbGVjdGlvbiA9IHsgc3VibmV0VHlwZSB9O1xuXG4gICAgaWYgKGludGVyZmFjZUNvbmZpZy5lY3IpIHtcbiAgICAgIHRoaXMuaW50ZXJmYWNlRW5kcG9pbnRzLnB1c2goXG4gICAgICAgIG5ldyBlYzIuSW50ZXJmYWNlVnBjRW5kcG9pbnQodGhpcywgYCR7aWR9RWNyRG9ja2VyYCwge1xuICAgICAgICAgIHZwYzogdGhpcyxcbiAgICAgICAgICBzZXJ2aWNlOiBlYzIuSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLkVDUl9ET0NLRVIsXG4gICAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3VibmV0czogc3VibmV0U2VsZWN0aW9uXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5pbnRlcmZhY2VFbmRwb2ludHMucHVzaChcbiAgICAgICAgbmV3IGVjMi5JbnRlcmZhY2VWcGNFbmRwb2ludCh0aGlzLCBgJHtpZH1FY3JBcGlgLCB7XG4gICAgICAgICAgdnBjOiB0aGlzLFxuICAgICAgICAgIHNlcnZpY2U6IGVjMi5JbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UuRUNSLFxuICAgICAgICAgIHByaXZhdGVEbnNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgIHN1Ym5ldHM6IHN1Ym5ldFNlbGVjdGlvblxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaW50ZXJmYWNlQ29uZmlnLnNlY3JldHNNYW5hZ2VyKSB7XG4gICAgICB0aGlzLmludGVyZmFjZUVuZHBvaW50cy5wdXNoKFxuICAgICAgICBuZXcgZWMyLkludGVyZmFjZVZwY0VuZHBvaW50KHRoaXMsIGAke2lkfVNlY3JldHNNYW5hZ2VyYCwge1xuICAgICAgICAgIHZwYzogdGhpcyxcbiAgICAgICAgICBzZXJ2aWNlOiBlYzIuSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLlNFQ1JFVFNfTUFOQUdFUixcbiAgICAgICAgICBwcml2YXRlRG5zRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBzdWJuZXRzOiBzdWJuZXRTZWxlY3Rpb25cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGludGVyZmFjZUNvbmZpZy5rbXMpIHtcbiAgICAgIHRoaXMuaW50ZXJmYWNlRW5kcG9pbnRzLnB1c2goXG4gICAgICAgIG5ldyBlYzIuSW50ZXJmYWNlVnBjRW5kcG9pbnQodGhpcywgYCR7aWR9S21zYCwge1xuICAgICAgICAgIHZwYzogdGhpcyxcbiAgICAgICAgICBzZXJ2aWNlOiBlYzIuSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLktNUyxcbiAgICAgICAgICBwcml2YXRlRG5zRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBzdWJuZXRzOiBzdWJuZXRTZWxlY3Rpb25cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGludGVyZmFjZUNvbmZpZy5jbG91ZHdhdGNoTG9ncykge1xuICAgICAgdGhpcy5pbnRlcmZhY2VFbmRwb2ludHMucHVzaChcbiAgICAgICAgbmV3IGVjMi5JbnRlcmZhY2VWcGNFbmRwb2ludCh0aGlzLCBgJHtpZH1DbG91ZFdhdGNoTG9nc2AsIHtcbiAgICAgICAgICB2cGM6IHRoaXMsXG4gICAgICAgICAgc2VydmljZTogZWMyLkludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5DTE9VRFdBVENIX0xPR1MsXG4gICAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3VibmV0czogc3VibmV0U2VsZWN0aW9uXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpbnRlcmZhY2VDb25maWcuc3NtKSB7XG4gICAgICB0aGlzLmludGVyZmFjZUVuZHBvaW50cy5wdXNoKFxuICAgICAgICBuZXcgZWMyLkludGVyZmFjZVZwY0VuZHBvaW50KHRoaXMsIGAke2lkfVNzbWAsIHtcbiAgICAgICAgICB2cGM6IHRoaXMsXG4gICAgICAgICAgc2VydmljZTogZWMyLkludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5TU00sXG4gICAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3VibmV0czogc3VibmV0U2VsZWN0aW9uXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5pbnRlcmZhY2VFbmRwb2ludHMucHVzaChcbiAgICAgICAgbmV3IGVjMi5JbnRlcmZhY2VWcGNFbmRwb2ludCh0aGlzLCBgJHtpZH1Tc21NZXNzYWdlc2AsIHtcbiAgICAgICAgICB2cGM6IHRoaXMsXG4gICAgICAgICAgc2VydmljZTogZWMyLkludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5TU01fTUVTU0FHRVMsXG4gICAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3VibmV0czogc3VibmV0U2VsZWN0aW9uXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5pbnRlcmZhY2VFbmRwb2ludHMucHVzaChcbiAgICAgICAgbmV3IGVjMi5JbnRlcmZhY2VWcGNFbmRwb2ludCh0aGlzLCBgJHtpZH1FYzJNZXNzYWdlc2AsIHtcbiAgICAgICAgICB2cGM6IHRoaXMsXG4gICAgICAgICAgc2VydmljZTogZWMyLkludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5FQzJfTUVTU0FHRVMsXG4gICAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3VibmV0czogc3VibmV0U2VsZWN0aW9uXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpbnRlcmZhY2VDb25maWcuc3RzKSB7XG4gICAgICB0aGlzLmludGVyZmFjZUVuZHBvaW50cy5wdXNoKFxuICAgICAgICBuZXcgZWMyLkludGVyZmFjZVZwY0VuZHBvaW50KHRoaXMsIGAke2lkfVN0c2AsIHtcbiAgICAgICAgICB2cGM6IHRoaXMsXG4gICAgICAgICAgc2VydmljZTogZWMyLkludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5TVFMsXG4gICAgICAgICAgcHJpdmF0ZURuc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3VibmV0czogc3VibmV0U2VsZWN0aW9uXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyByZXNvbHZlTmF0R2F0ZXdheXMocHJvcHM/OiBWcGNQcm9wcyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbmF0Q29uZmlnID0gcHJvcHM/Lm5hdEdhdGV3YXlDb25maWc7XG5cbiAgICBpZiAobmF0Q29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKG5hdENvbmZpZyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiBuYXRDb25maWcuY291bnQgPz8gMTtcbiAgfVxuXG4gIHN0YXRpYyBhdmFpbGFiaWxpdHlab25lcyhzY29wZTogQ29uc3RydWN0LCBtYXhBenMgPSAzKSB7XG4gICAgcmV0dXJuIFN0YWNrLm9mKHNjb3BlKS5hdmFpbGFiaWxpdHlab25lcy5zbGljZSgwLCBtYXhBenMpO1xuICB9XG5cbiAgc3RhdGljIGZsb3dMb2dzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wcz86IFZwY1Byb3BzXG4gICk6IFJlY29yZDxzdHJpbmcsIGVjMi5GbG93TG9nT3B0aW9ucz4gfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9wcz8uZmxvd0xvZ0NvbmZpZyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzPy5mbG93TG9nQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghcHJvcHM/LmFjY291bnRJZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2Ake2lkfVZwY0Zsb3dMb2dzYF06IHtcbiAgICAgICAgICBkZXN0aW5hdGlvbjogZWMyLkZsb3dMb2dEZXN0aW5hdGlvbi50b0Nsb3VkV2F0Y2hMb2dzKFxuICAgICAgICAgICAgbmV3IExvZ0dyb3VwKHNjb3BlLCBgJHtpZH1GbG93TG9nR3JvdXBgLCB7XG4gICAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC92cGMvZmxvd2xvZ3MvdnBjLSR7aWR9L2AsXG4gICAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gcHJvcHMuZmxvd0xvZ0NvbmZpZztcbiAgICBjb25zdCB0cmFmZmljVHlwZSA9IFZwYy5yZXNvbHZlVHJhZmZpY1R5cGUoY29uZmlnLnRyYWZmaWNUeXBlKTtcblxuICAgIGlmIChjb25maWcuZGVzdGluYXRpb24gPT09IFwiczNcIikge1xuICAgICAgY29uc3QgYnVja2V0ID0gbmV3IFMzQnVja2V0KHNjb3BlLCBgJHtpZH1GbG93TG9nQnVja2V0YCwge1xuICAgICAgICBidWNrZXROYW1lOiBgdnBjLWZsb3dsb2dzLSR7aWQudG9Mb3dlckNhc2UoKX0tJHtTdGFjay5vZihzY29wZSkuYWNjb3VudH1gLFxuICAgICAgICBlbmNyeXB0aW9uOiBzMy5CdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBjb25maWcucmV0ZW50aW9uRGF5c1xuICAgICAgICAgID8gW3sgZXhwaXJhdGlvbjogRHVyYXRpb24uZGF5cyhjb25maWcucmV0ZW50aW9uRGF5cyksIGVuYWJsZWQ6IHRydWUgfV1cbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtgJHtpZH1WcGNGbG93TG9nc2BdOiB7XG4gICAgICAgICAgZGVzdGluYXRpb246IGVjMi5GbG93TG9nRGVzdGluYXRpb24udG9TMyhidWNrZXQpLFxuICAgICAgICAgIHRyYWZmaWNUeXBlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ZW50aW9uRGF5cyA9IGNvbmZpZy5yZXRlbnRpb25EYXlzID8/IDE0O1xuICAgIHJldHVybiB7XG4gICAgICBbYCR7aWR9VnBjRmxvd0xvZ3NgXToge1xuICAgICAgICBkZXN0aW5hdGlvbjogZWMyLkZsb3dMb2dEZXN0aW5hdGlvbi50b0Nsb3VkV2F0Y2hMb2dzKFxuICAgICAgICAgIG5ldyBMb2dHcm91cChzY29wZSwgYCR7aWR9Rmxvd0xvZ0dyb3VwYCwge1xuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL3ZwYy9mbG93bG9ncy92cGMtJHtpZH0vYCxcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIHJldGVudGlvbjogVnBjLmRheXNUb1JldGVudGlvbihyZXRlbnRpb25EYXlzKVxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHRyYWZmaWNUeXBlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRheXNUb1JldGVudGlvbihkYXlzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbGlkUmV0ZW50aW9ucyA9IFtcbiAgICAgIDEsIDMsIDUsIDcsIDE0LCAzMCwgNjAsIDkwLCAxMjAsIDE1MCwgMTgwLCAzNjUsIDQwMCwgNTQ1LCA3MzEsIDEwOTYsIDE4MjcsXG4gICAgICAyMTkyLCAyNTU3LCAyOTIyLCAzMjg4LCAzNjUzXG4gICAgXTtcbiAgICByZXR1cm4gdmFsaWRSZXRlbnRpb25zLmZpbmQoKHIpID0+IHIgPj0gZGF5cykgPz8gMzY1MztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlc29sdmVUcmFmZmljVHlwZShcbiAgICB0cmFmZmljVHlwZT86IFwiQUxMXCIgfCBcIkFDQ0VQVFwiIHwgXCJSRUpFQ1RcIlxuICApOiBlYzIuRmxvd0xvZ1RyYWZmaWNUeXBlIHtcbiAgICBzd2l0Y2ggKHRyYWZmaWNUeXBlKSB7XG4gICAgICBjYXNlIFwiQUNDRVBUXCI6XG4gICAgICAgIHJldHVybiBlYzIuRmxvd0xvZ1RyYWZmaWNUeXBlLkFDQ0VQVDtcbiAgICAgIGNhc2UgXCJSRUpFQ1RcIjpcbiAgICAgICAgcmV0dXJuIGVjMi5GbG93TG9nVHJhZmZpY1R5cGUuUkVKRUNUO1xuICAgICAgY2FzZSBcIkFMTFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGVjMi5GbG93TG9nVHJhZmZpY1R5cGUuQUxMO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpcEFkZHJlc3NlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFZwY1Byb3BzKSB7XG4gICAgaWYgKCFwcm9wcz8uYWNjb3VudElkIHx8ICFwcm9wcz8uaXB2NElwYW1Qb29sSWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdnBjQ2lkck1hc2sgPSBwcm9wcy52cGNDaWRyTWFzayA/PyAyMDtcbiAgICBjb25zdCBzdWJuZXRDaWRyTWFzayA9IHByb3BzLnN1Ym5ldENpZHJNYXNrID8/IDIzO1xuXG4gICAgcmV0dXJuIGVjMi5JcEFkZHJlc3Nlcy5hd3NJcGFtQWxsb2NhdGlvbih7XG4gICAgICBpcHY0SXBhbVBvb2xJZDogcHJvcHMuaXB2NElwYW1Qb29sSWQsXG4gICAgICBpcHY0TmV0bWFza0xlbmd0aDogdnBjQ2lkck1hc2ssXG4gICAgICBkZWZhdWx0U3VibmV0SXB2NE5ldG1hc2tMZW5ndGg6IHN1Ym5ldENpZHJNYXNrXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgYnVpbGQoaWQ6IHN0cmluZywgcHJvcHM/OiBWcGNQcm9wcyk6IChzYjogU3RhY2tCdWlsZGVyKSA9PiBDb25zdHJ1Y3Qge1xuICAgIHJldHVybiAoc2I6IFN0YWNrQnVpbGRlcikgPT4ge1xuICAgICAgcmV0dXJuIG5ldyB0aGlzKHNiLmdldFN0YWNrKCksIGlkLCBwcm9wcyk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBpbXBvcnQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICB2cGNTdGFja05hbWU6IHN0cmluZ1xuICApOiAoc2I6IFN0YWNrQnVpbGRlcikgPT4gQ29uc3RydWN0IHtcbiAgICByZXR1cm4gKHNiOiBTdGFja0J1aWxkZXIpID0+IHtcbiAgICAgIHJldHVybiBlYzIuVnBjLmZyb21Mb29rdXAoc2IuZ2V0U3RhY2soKSwgaWQsIHtcbiAgICAgICAgdnBjTmFtZTogYCR7dnBjU3RhY2tOYW1lfS8ke2lkfWBcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import { Construct } from "constructs";
2
- import { LambdaFunction } from "../compute/lambda";
2
+ import { LambdaFunction } from "../compute/lambda.js";
3
3
  export interface CostAllocationTagActivatorProps {
4
4
  /** EventBridge schedule expression. Default: "rate(24 hours)" */
5
5
  scheduleExpression?: string;
@@ -1,10 +1,7 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CostAllocationTagActivator = void 0;
4
- const constructs_1 = require("constructs");
5
- const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
6
- const aws_iam_1 = require("aws-cdk-lib/aws-iam");
7
- const lambda_1 = require("../compute/lambda");
1
+ import { Construct } from "constructs";
2
+ import { Code, Runtime } from "aws-cdk-lib/aws-lambda";
3
+ import { PolicyStatement, Effect } from "aws-cdk-lib/aws-iam";
4
+ import { LambdaFunction } from "../compute/lambda.js";
8
5
  /**
9
6
  * Deploys a Lambda that auto-discovers and activates cost allocation tags.
10
7
  *
@@ -12,21 +9,22 @@ const lambda_1 = require("../compute/lambda");
12
9
  * (via app.addTags() or CDK aspects) is automatically activated in Cost
13
10
  * Explorer within 24 hours — no manual intervention required.
14
11
  */
15
- class CostAllocationTagActivator extends constructs_1.Construct {
12
+ export class CostAllocationTagActivator extends Construct {
13
+ lambda;
16
14
  constructor(scope, id, props) {
17
15
  super(scope, id);
18
16
  const schedule = props?.scheduleExpression ?? "rate(24 hours)";
19
- this.lambda = new lambda_1.LambdaFunction(this, "TagActivatorFunction", {
20
- runtime: aws_lambda_1.Runtime.NODEJS_22_X,
17
+ this.lambda = new LambdaFunction(this, "TagActivatorFunction", {
18
+ runtime: Runtime.NODEJS_22_X,
21
19
  handler: "index.handler",
22
- code: aws_lambda_1.Code.fromInline(HANDLER_CODE),
20
+ code: Code.fromInline(HANDLER_CODE),
23
21
  lambdaDescription: "Auto-discovers and activates cost allocation tags in Cost Explorer",
24
22
  memorySize: 128,
25
23
  timeout: 60,
26
24
  scheduleExpression: schedule,
27
25
  inlinePolicy: [
28
- new aws_iam_1.PolicyStatement({
29
- effect: aws_iam_1.Effect.ALLOW,
26
+ new PolicyStatement({
27
+ effect: Effect.ALLOW,
30
28
  actions: [
31
29
  "ce:ListCostAllocationTags",
32
30
  "ce:UpdateCostAllocationTagsStatus"
@@ -37,7 +35,6 @@ class CostAllocationTagActivator extends constructs_1.Construct {
37
35
  });
38
36
  }
39
37
  }
40
- exports.CostAllocationTagActivator = CostAllocationTagActivator;
41
38
  const HANDLER_CODE = `
42
39
  const { CostExplorerClient, ListCostAllocationTagsCommand, UpdateCostAllocationTagsStatusCommand } = require("@aws-sdk/client-cost-explorer");
43
40
 
@@ -63,4 +60,3 @@ exports.handler = async () => {
63
60
  return { activated: inactive.length, tags: inactive.map((t) => t.TagKey) };
64
61
  };
65
62
  `.trim();
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zdEFsbG9jYXRpb25UYWdBY3RpdmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9vcmdhbmlzYXRpb24vY29zdEFsbG9jYXRpb25UYWdBY3RpdmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBQ3ZDLHVEQUF1RDtBQUN2RCxpREFBOEQ7QUFFOUQsOENBQW1EO0FBT25EOzs7Ozs7R0FNRztBQUNILE1BQWEsMEJBQTJCLFNBQVEsc0JBQVM7SUFHdkQsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBdUM7UUFFdkMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQUUsa0JBQWtCLElBQUksZ0JBQWdCLENBQUM7UUFFL0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLHVCQUFjLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQzdELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztZQUNuQyxpQkFBaUIsRUFDZixvRUFBb0U7WUFDdEUsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsRUFBRTtZQUNYLGtCQUFrQixFQUFFLFFBQVE7WUFDNUIsWUFBWSxFQUFFO2dCQUNaLElBQUkseUJBQWUsQ0FBQztvQkFDbEIsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSztvQkFDcEIsT0FBTyxFQUFFO3dCQUNQLDJCQUEyQjt3QkFDM0IsbUNBQW1DO3FCQUNwQztvQkFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7aUJBQ2pCLENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWpDRCxnRUFpQ0M7QUFFRCxNQUFNLFlBQVksR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBd0JwQixDQUFDLElBQUksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IENvZGUsIFJ1bnRpbWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBFZmZlY3QgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuXG5pbXBvcnQgeyBMYW1iZGFGdW5jdGlvbiB9IGZyb20gXCIuLi9jb21wdXRlL2xhbWJkYVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvc3RBbGxvY2F0aW9uVGFnQWN0aXZhdG9yUHJvcHMge1xuICAvKiogRXZlbnRCcmlkZ2Ugc2NoZWR1bGUgZXhwcmVzc2lvbi4gRGVmYXVsdDogXCJyYXRlKDI0IGhvdXJzKVwiICovXG4gIHNjaGVkdWxlRXhwcmVzc2lvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZXBsb3lzIGEgTGFtYmRhIHRoYXQgYXV0by1kaXNjb3ZlcnMgYW5kIGFjdGl2YXRlcyBjb3N0IGFsbG9jYXRpb24gdGFncy5cbiAqXG4gKiBSdW5zIGRhaWx5IGluIHRoZSBtYW5hZ2VtZW50IGFjY291bnQuIEFueSBub24tQVdTIHRhZyBhcHBsaWVkIHRvIHJlc291cmNlc1xuICogKHZpYSBhcHAuYWRkVGFncygpIG9yIENESyBhc3BlY3RzKSBpcyBhdXRvbWF0aWNhbGx5IGFjdGl2YXRlZCBpbiBDb3N0XG4gKiBFeHBsb3JlciB3aXRoaW4gMjQgaG91cnMg4oCUIG5vIG1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb3N0QWxsb2NhdGlvblRhZ0FjdGl2YXRvciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBsYW1iZGE6IExhbWJkYUZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wcz86IENvc3RBbGxvY2F0aW9uVGFnQWN0aXZhdG9yUHJvcHNcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHNjaGVkdWxlID0gcHJvcHM/LnNjaGVkdWxlRXhwcmVzc2lvbiA/PyBcInJhdGUoMjQgaG91cnMpXCI7XG5cbiAgICB0aGlzLmxhbWJkYSA9IG5ldyBMYW1iZGFGdW5jdGlvbih0aGlzLCBcIlRhZ0FjdGl2YXRvckZ1bmN0aW9uXCIsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShIQU5ETEVSX0NPREUpLFxuICAgICAgbGFtYmRhRGVzY3JpcHRpb246XG4gICAgICAgIFwiQXV0by1kaXNjb3ZlcnMgYW5kIGFjdGl2YXRlcyBjb3N0IGFsbG9jYXRpb24gdGFncyBpbiBDb3N0IEV4cGxvcmVyXCIsXG4gICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICB0aW1lb3V0OiA2MCxcbiAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbjogc2NoZWR1bGUsXG4gICAgICBpbmxpbmVQb2xpY3k6IFtcbiAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgXCJjZTpMaXN0Q29zdEFsbG9jYXRpb25UYWdzXCIsXG4gICAgICAgICAgICBcImNlOlVwZGF0ZUNvc3RBbGxvY2F0aW9uVGFnc1N0YXR1c1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgICAgfSlcbiAgICAgIF1cbiAgICB9KTtcbiAgfVxufVxuXG5jb25zdCBIQU5ETEVSX0NPREUgPSBgXG5jb25zdCB7IENvc3RFeHBsb3JlckNsaWVudCwgTGlzdENvc3RBbGxvY2F0aW9uVGFnc0NvbW1hbmQsIFVwZGF0ZUNvc3RBbGxvY2F0aW9uVGFnc1N0YXR1c0NvbW1hbmQgfSA9IHJlcXVpcmUoXCJAYXdzLXNkay9jbGllbnQtY29zdC1leHBsb3JlclwiKTtcblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge1xuICBjb25zdCBjbGllbnQgPSBuZXcgQ29zdEV4cGxvcmVyQ2xpZW50KHt9KTtcbiAgY29uc3QgeyBDb3N0QWxsb2NhdGlvblRhZ3MgPSBbXSB9ID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IExpc3RDb3N0QWxsb2NhdGlvblRhZ3NDb21tYW5kKHsgTWF4UmVzdWx0czogMTAwMCB9KSk7XG5cbiAgY29uc3QgaW5hY3RpdmUgPSBDb3N0QWxsb2NhdGlvblRhZ3MuZmlsdGVyKFxuICAgICh0KSA9PiB0LlRhZ0tleSAmJiB0LlN0YXR1cyA9PT0gXCJJbmFjdGl2ZVwiICYmICF0LlRhZ0tleS5zdGFydHNXaXRoKFwiYXdzOlwiKVxuICApO1xuXG4gIGlmIChpbmFjdGl2ZS5sZW5ndGggPT09IDApIHJldHVybiB7IGFjdGl2YXRlZDogMCB9O1xuXG4gIC8vIEFQSSBsaW1pdDogbWF4IDIwIHRhZ3MgcGVyIFVwZGF0ZUNvc3RBbGxvY2F0aW9uVGFnc1N0YXR1cyBjYWxsXG4gIGNvbnN0IEJBVENIX1NJWkUgPSAyMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmFjdGl2ZS5sZW5ndGg7IGkgKz0gQkFUQ0hfU0laRSkge1xuICAgIGNvbnN0IGJhdGNoID0gaW5hY3RpdmUuc2xpY2UoaSwgaSArIEJBVENIX1NJWkUpO1xuICAgIGF3YWl0IGNsaWVudC5zZW5kKG5ldyBVcGRhdGVDb3N0QWxsb2NhdGlvblRhZ3NTdGF0dXNDb21tYW5kKHtcbiAgICAgIENvc3RBbGxvY2F0aW9uVGFnc1N0YXR1czogYmF0Y2gubWFwKCh0KSA9PiAoeyBUYWdLZXk6IHQuVGFnS2V5LCBTdGF0dXM6IFwiQWN0aXZlXCIgfSkpXG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIHsgYWN0aXZhdGVkOiBpbmFjdGl2ZS5sZW5ndGgsIHRhZ3M6IGluYWN0aXZlLm1hcCgodCkgPT4gdC5UYWdLZXkpIH07XG59O1xuYC50cmltKCk7XG4iXX0=
@@ -1,5 +1,5 @@
1
- export { Organisation as OrganisationResource, type OrganisationProps as OrganisationResourceProps } from "./organisation";
2
- export { type OrganisationalUnitProps } from "./organisationalUnit";
3
- export { OrganisationAccount, type OrganisationAccountProps } from "./organisationAccount";
4
- export { OrganisationPolicy, type OrganisationPolicyProps, type OrganisationPolicyType } from "./organisationPolicy";
5
- export { CostAllocationTagActivator, type CostAllocationTagActivatorProps } from "./costAllocationTagActivator";
1
+ export { Organisation as OrganisationResource, type OrganisationProps as OrganisationResourceProps } from "./organisation.js";
2
+ export { type OrganisationalUnitProps } from "./organisationalUnit.js";
3
+ export { OrganisationAccount, type OrganisationAccountProps } from "./organisationAccount.js";
4
+ export { OrganisationPolicy, type OrganisationPolicyProps, type OrganisationPolicyType } from "./organisationPolicy.js";
5
+ export { CostAllocationTagActivator, type CostAllocationTagActivatorProps } from "./costAllocationTagActivator.js";
@@ -1,12 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CostAllocationTagActivator = exports.OrganisationPolicy = exports.OrganisationAccount = exports.OrganisationResource = void 0;
4
- var organisation_1 = require("./organisation");
5
- Object.defineProperty(exports, "OrganisationResource", { enumerable: true, get: function () { return organisation_1.Organisation; } });
6
- var organisationAccount_1 = require("./organisationAccount");
7
- Object.defineProperty(exports, "OrganisationAccount", { enumerable: true, get: function () { return organisationAccount_1.OrganisationAccount; } });
8
- var organisationPolicy_1 = require("./organisationPolicy");
9
- Object.defineProperty(exports, "OrganisationPolicy", { enumerable: true, get: function () { return organisationPolicy_1.OrganisationPolicy; } });
10
- var costAllocationTagActivator_1 = require("./costAllocationTagActivator");
11
- Object.defineProperty(exports, "CostAllocationTagActivator", { enumerable: true, get: function () { return costAllocationTagActivator_1.CostAllocationTagActivator; } });
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9vcmdhbmlzYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0NBR3dCO0FBRnRCLG9IQUFBLFlBQVksT0FBd0I7QUFJdEMsNkRBRytCO0FBRjdCLDBIQUFBLG1CQUFtQixPQUFBO0FBR3JCLDJEQUk4QjtBQUg1Qix3SEFBQSxrQkFBa0IsT0FBQTtBQUlwQiwyRUFHc0M7QUFGcEMsd0lBQUEsMEJBQTBCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBPcmdhbmlzYXRpb24gYXMgT3JnYW5pc2F0aW9uUmVzb3VyY2UsXG4gIHR5cGUgT3JnYW5pc2F0aW9uUHJvcHMgYXMgT3JnYW5pc2F0aW9uUmVzb3VyY2VQcm9wc1xufSBmcm9tIFwiLi9vcmdhbmlzYXRpb25cIjtcbmV4cG9ydCB7IHR5cGUgT3JnYW5pc2F0aW9uYWxVbml0UHJvcHMgfSBmcm9tIFwiLi9vcmdhbmlzYXRpb25hbFVuaXRcIjtcbmV4cG9ydCB7XG4gIE9yZ2FuaXNhdGlvbkFjY291bnQsXG4gIHR5cGUgT3JnYW5pc2F0aW9uQWNjb3VudFByb3BzXG59IGZyb20gXCIuL29yZ2FuaXNhdGlvbkFjY291bnRcIjtcbmV4cG9ydCB7XG4gIE9yZ2FuaXNhdGlvblBvbGljeSxcbiAgdHlwZSBPcmdhbmlzYXRpb25Qb2xpY3lQcm9wcyxcbiAgdHlwZSBPcmdhbmlzYXRpb25Qb2xpY3lUeXBlXG59IGZyb20gXCIuL29yZ2FuaXNhdGlvblBvbGljeVwiO1xuZXhwb3J0IHtcbiAgQ29zdEFsbG9jYXRpb25UYWdBY3RpdmF0b3IsXG4gIHR5cGUgQ29zdEFsbG9jYXRpb25UYWdBY3RpdmF0b3JQcm9wc1xufSBmcm9tIFwiLi9jb3N0QWxsb2NhdGlvblRhZ0FjdGl2YXRvclwiO1xuIl19
1
+ export { Organisation as OrganisationResource } from "./organisation.js";
2
+ export { OrganisationAccount } from "./organisationAccount.js";
3
+ export { OrganisationPolicy } from "./organisationPolicy.js";
4
+ export { CostAllocationTagActivator } from "./costAllocationTagActivator.js";
@@ -1,8 +1,8 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Organisation = void 0;
4
- const constructs_1 = require("constructs");
5
- class Organisation extends constructs_1.Construct {
1
+ import { Construct } from "constructs";
2
+ export class Organisation extends Construct {
3
+ orgId;
4
+ rootId;
5
+ managementAccountId;
6
6
  constructor(scope, id, props) {
7
7
  super(scope, id);
8
8
  this.orgId = props.orgId;
@@ -10,5 +10,3 @@ class Organisation extends constructs_1.Construct {
10
10
  this.managementAccountId = props.managementAccountId;
11
11
  }
12
12
  }
13
- exports.Organisation = Organisation;
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pc2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3Mvb3JnYW5pc2F0aW9uL29yZ2FuaXNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFRdkMsTUFBYSxZQUFhLFNBQVEsc0JBQVM7SUFLekMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF3QjtRQUNoRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztJQUN2RCxDQUFDO0NBQ0Y7QUFYRCxvQ0FXQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pc2F0aW9uUHJvcHMge1xuICBvcmdJZDogc3RyaW5nO1xuICByb290SWQ6IHN0cmluZztcbiAgbWFuYWdlbWVudEFjY291bnRJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgT3JnYW5pc2F0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IG9yZ0lkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByb290SWQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG1hbmFnZW1lbnRBY2NvdW50SWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogT3JnYW5pc2F0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMub3JnSWQgPSBwcm9wcy5vcmdJZDtcbiAgICB0aGlzLnJvb3RJZCA9IHByb3BzLnJvb3RJZDtcbiAgICB0aGlzLm1hbmFnZW1lbnRBY2NvdW50SWQgPSBwcm9wcy5tYW5hZ2VtZW50QWNjb3VudElkO1xuICB9XG59XG4iXX0=
@@ -1,8 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OrganisationAccount = void 0;
4
- const aws_cdk_lib_1 = require("aws-cdk-lib");
5
- const constructs_1 = require("constructs");
1
+ import { CfnOutput } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
6
3
  /**
7
4
  * CDK construct that exports account ID and ARN as CloudFormation outputs.
8
5
  *
@@ -10,22 +7,22 @@ const constructs_1 = require("constructs");
10
7
  * (AwsAccountService.ensureMissingAccountsCreated / placeAccountsInOUs).
11
8
  * This construct only produces the CfnOutputs needed for cross-stack references.
12
9
  */
13
- class OrganisationAccount extends constructs_1.Construct {
10
+ export class OrganisationAccount extends Construct {
11
+ accountId;
12
+ accountArn;
14
13
  constructor(scope, id, props) {
15
14
  super(scope, id);
16
15
  this.accountId = props.accountId;
17
16
  this.accountArn = `arn:aws:organizations::${props.managementAccountId}:account/${props.orgId}/${props.accountId}`;
18
- new aws_cdk_lib_1.CfnOutput(this, `${id}Id`, {
17
+ new CfnOutput(this, `${id}Id`, {
19
18
  key: `${id}Id`,
20
19
  value: this.accountId,
21
20
  exportName: `${id}Id`
22
21
  });
23
- new aws_cdk_lib_1.CfnOutput(this, `${id}Arn`, {
22
+ new CfnOutput(this, `${id}Arn`, {
24
23
  key: `${id}Arn`,
25
24
  value: this.accountArn,
26
25
  exportName: `${id}Arn`
27
26
  });
28
27
  }
29
28
  }
30
- exports.OrganisationAccount = OrganisationAccount;
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pc2F0aW9uQWNjb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL29yZ2FuaXNhdGlvbi9vcmdhbmlzYXRpb25BY2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF3QztBQUN4QywyQ0FBdUM7QUFRdkM7Ozs7OztHQU1HO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxzQkFBUztJQUloRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQStCO1FBQ3ZFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsMEJBQTBCLEtBQUssQ0FBQyxtQkFBbUIsWUFBWSxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVsSCxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7WUFDN0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3JCLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUM7UUFFSCxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUU7WUFDOUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLO1lBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3RCLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSztTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF0QkQsa0RBc0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXNhdGlvbkFjY291bnRQcm9wcyB7XG4gIGFjY291bnRJZDogc3RyaW5nO1xuICBtYW5hZ2VtZW50QWNjb3VudElkOiBzdHJpbmc7XG4gIG9yZ0lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ0RLIGNvbnN0cnVjdCB0aGF0IGV4cG9ydHMgYWNjb3VudCBJRCBhbmQgQVJOIGFzIENsb3VkRm9ybWF0aW9uIG91dHB1dHMuXG4gKlxuICogQWNjb3VudCBjcmVhdGlvbiBhbmQgT1UgcGxhY2VtZW50IGFyZSBoYW5kbGVkIGJ5IHRoZSBDTEkgcHJlLWRlcGxveSBzdGVwc1xuICogKEF3c0FjY291bnRTZXJ2aWNlLmVuc3VyZU1pc3NpbmdBY2NvdW50c0NyZWF0ZWQgLyBwbGFjZUFjY291bnRzSW5PVXMpLlxuICogVGhpcyBjb25zdHJ1Y3Qgb25seSBwcm9kdWNlcyB0aGUgQ2ZuT3V0cHV0cyBuZWVkZWQgZm9yIGNyb3NzLXN0YWNrIHJlZmVyZW5jZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBPcmdhbmlzYXRpb25BY2NvdW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGFjY291bnRJZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgYWNjb3VudEFybjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBPcmdhbmlzYXRpb25BY2NvdW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5hY2NvdW50SWQgPSBwcm9wcy5hY2NvdW50SWQ7XG4gICAgdGhpcy5hY2NvdW50QXJuID0gYGFybjphd3M6b3JnYW5pemF0aW9uczo6JHtwcm9wcy5tYW5hZ2VtZW50QWNjb3VudElkfTphY2NvdW50LyR7cHJvcHMub3JnSWR9LyR7cHJvcHMuYWNjb3VudElkfWA7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfUlkYCwge1xuICAgICAga2V5OiBgJHtpZH1JZGAsXG4gICAgICB2YWx1ZTogdGhpcy5hY2NvdW50SWQsXG4gICAgICBleHBvcnROYW1lOiBgJHtpZH1JZGBcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9QXJuYCwge1xuICAgICAga2V5OiBgJHtpZH1Bcm5gLFxuICAgICAgdmFsdWU6IHRoaXMuYWNjb3VudEFybixcbiAgICAgIGV4cG9ydE5hbWU6IGAke2lkfUFybmBcbiAgICB9KTtcbiAgfVxufVxuIl19