terraconstructs 0.0.11 → 0.0.13

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 (411) hide show
  1. package/.jsii +105205 -35113
  2. package/lib/aws/arn.js +1 -1
  3. package/lib/aws/aws-construct.d.ts +1 -1
  4. package/lib/aws/aws-construct.js +28 -2
  5. package/lib/aws/aws-stack.d.ts +2 -4
  6. package/lib/aws/aws-stack.js +21 -8
  7. package/lib/aws/aws-tags.d.ts +58 -0
  8. package/lib/aws/aws-tags.js +77 -0
  9. package/lib/aws/cloudwatch/actions/ec2.js +1 -1
  10. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  11. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  12. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  13. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  14. package/lib/aws/cloudwatch/alarm.js +1 -1
  15. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  16. package/lib/aws/cloudwatch/dashboard.js +1 -1
  17. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  18. package/lib/aws/cloudwatch/graph.js +8 -8
  19. package/lib/aws/cloudwatch/layout.js +3 -3
  20. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  21. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  22. package/lib/aws/cloudwatch/log-group.js +1 -1
  23. package/lib/aws/cloudwatch/log-query.js +1 -1
  24. package/lib/aws/cloudwatch/log-stream.js +1 -1
  25. package/lib/aws/cloudwatch/metric-filter.d.ts +1 -1
  26. package/lib/aws/cloudwatch/metric-filter.js +4 -4
  27. package/lib/aws/cloudwatch/metric.js +2 -2
  28. package/lib/aws/cloudwatch/pattern.js +3 -3
  29. package/lib/aws/cloudwatch/policy.js +1 -1
  30. package/lib/aws/cloudwatch/private/env-tokens.js +5 -6
  31. package/lib/aws/cloudwatch/private/metric-util.js +4 -5
  32. package/lib/aws/cloudwatch/private/object.js +2 -3
  33. package/lib/aws/cloudwatch/private/rendering.js +3 -3
  34. package/lib/aws/cloudwatch/private/statistic.js +6 -7
  35. package/lib/aws/cloudwatch/query-definition.js +2 -2
  36. package/lib/aws/cloudwatch/stats.js +1 -1
  37. package/lib/aws/cloudwatch/subscription-filter.d.ts +1 -1
  38. package/lib/aws/cloudwatch/subscription-filter.js +4 -4
  39. package/lib/aws/cloudwatch/text.js +1 -1
  40. package/lib/aws/cloudwatch/variable.js +3 -3
  41. package/lib/aws/cloudwatch/widget.d.ts +1 -1
  42. package/lib/aws/cloudwatch/widget.js +4 -4
  43. package/lib/aws/compute/activity.js +3 -2
  44. package/lib/aws/compute/alb/application-listener-action.d.ts +334 -0
  45. package/lib/aws/compute/alb/application-listener-action.js +281 -0
  46. package/lib/aws/compute/alb/application-listener-certificate.d.ts +35 -0
  47. package/lib/aws/compute/alb/application-listener-certificate.js +35 -0
  48. package/lib/aws/compute/alb/application-listener-rule.d.ts +233 -0
  49. package/lib/aws/compute/alb/application-listener-rule.js +220 -0
  50. package/lib/aws/compute/alb/application-listener.d.ts +574 -0
  51. package/lib/aws/compute/alb/application-listener.js +538 -0
  52. package/lib/aws/compute/alb/application-load-balancer.d.ts +715 -0
  53. package/lib/aws/compute/alb/application-load-balancer.js +780 -0
  54. package/lib/aws/compute/alb/application-target-group.d.ts +339 -0
  55. package/lib/aws/compute/alb/application-target-group.js +427 -0
  56. package/lib/aws/compute/alb/conditions.d.ts +61 -0
  57. package/lib/aws/compute/alb/conditions.js +164 -0
  58. package/lib/aws/compute/alb/trust-store-revocation.d.ts +59 -0
  59. package/lib/aws/compute/alb/trust-store-revocation.js +46 -0
  60. package/lib/aws/compute/alb/trust-store.d.ts +86 -0
  61. package/lib/aws/compute/alb/trust-store.js +79 -0
  62. package/lib/aws/compute/architecture.js +1 -1
  63. package/lib/aws/compute/aspects/require-imdsv2-aspect.d.ts +75 -0
  64. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +106 -0
  65. package/lib/aws/compute/bastion-host.d.ts +172 -0
  66. package/lib/aws/compute/bastion-host.js +114 -0
  67. package/lib/aws/compute/chain.js +1 -1
  68. package/lib/aws/compute/cidr-splits.d.ts +49 -0
  69. package/lib/aws/compute/cidr-splits.js +59 -0
  70. package/lib/aws/compute/client-vpn-authorization-rule.d.ts +43 -0
  71. package/lib/aws/compute/client-vpn-authorization-rule.js +30 -0
  72. package/lib/aws/compute/client-vpn-endpoint-types.d.ts +62 -0
  73. package/lib/aws/compute/client-vpn-endpoint-types.js +25 -0
  74. package/lib/aws/compute/client-vpn-endpoint.d.ts +239 -0
  75. package/lib/aws/compute/client-vpn-endpoint.js +259 -0
  76. package/lib/aws/compute/client-vpn-route.d.ts +67 -0
  77. package/lib/aws/compute/client-vpn-route.js +57 -0
  78. package/lib/aws/compute/condition.js +1 -1
  79. package/lib/aws/compute/connections.d.ts +137 -0
  80. package/lib/aws/compute/connections.js +208 -0
  81. package/lib/aws/compute/ec2-augmentations.generated.d.ts +53 -0
  82. package/lib/aws/compute/ec2-augmentations.generated.js +35 -0
  83. package/lib/aws/compute/ec2-canned-metrics.generated.d.ts +555 -0
  84. package/lib/aws/compute/ec2-canned-metrics.generated.js +681 -0
  85. package/lib/aws/compute/ec2-util-v2.d.ts +141 -0
  86. package/lib/aws/compute/ec2-util-v2.js +286 -0
  87. package/lib/aws/compute/ec2-util.d.ts +52 -0
  88. package/lib/aws/compute/ec2-util.js +138 -0
  89. package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.d.ts +176 -0
  90. package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.js +119 -0
  91. package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.d.ts +860 -0
  92. package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.js +597 -0
  93. package/lib/aws/compute/event-invoke-config.js +1 -1
  94. package/lib/aws/compute/event-source-filter.js +2 -2
  95. package/lib/aws/compute/event-source-mapping.js +1 -1
  96. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  97. package/lib/aws/compute/event-sources/s3.js +1 -1
  98. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  99. package/lib/aws/compute/event-sources/sqs.js +1 -1
  100. package/lib/aws/compute/fields.js +4 -4
  101. package/lib/aws/compute/function-alias.js +1 -1
  102. package/lib/aws/compute/function-base.js +2 -2
  103. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  104. package/lib/aws/compute/function-destinations/function.js +1 -1
  105. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  106. package/lib/aws/compute/function-nodejs.js +1 -1
  107. package/lib/aws/compute/function-url.js +1 -1
  108. package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
  109. package/lib/aws/compute/function-vpc-config.generated.js +1 -1
  110. package/lib/aws/compute/function.d.ts +1 -1
  111. package/lib/aws/compute/function.js +5 -5
  112. package/lib/aws/compute/index-alpha.d.ts +5 -0
  113. package/lib/aws/compute/index-alpha.js +22 -0
  114. package/lib/aws/compute/index.d.ts +60 -0
  115. package/lib/aws/compute/index.js +70 -2
  116. package/lib/aws/compute/instance-types.d.ts +1354 -0
  117. package/lib/aws/compute/instance-types.js +1683 -0
  118. package/lib/aws/compute/instance.d.ts +436 -0
  119. package/lib/aws/compute/instance.js +262 -0
  120. package/lib/aws/compute/ip-addresses.d.ts +249 -0
  121. package/lib/aws/compute/ip-addresses.js +248 -0
  122. package/lib/aws/compute/ipam.d.ts +309 -0
  123. package/lib/aws/compute/ipam.js +306 -0
  124. package/lib/aws/compute/key-pair.d.ts +178 -0
  125. package/lib/aws/compute/key-pair.js +194 -0
  126. package/lib/aws/compute/lambda-augmentations.generated.d.ts +65 -0
  127. package/lib/aws/compute/lambda-augmentations.generated.js +41 -0
  128. package/lib/aws/compute/lambda-canned-metrics.generated.d.ts +316 -0
  129. package/lib/aws/compute/lambda-canned-metrics.generated.js +119 -0
  130. package/lib/aws/compute/launch-template.d.ts +540 -0
  131. package/lib/aws/compute/launch-template.js +468 -0
  132. package/lib/aws/compute/lb-shared/access-logs-accounts.d.ts +7 -0
  133. package/lib/aws/compute/lb-shared/access-logs-accounts.js +46 -0
  134. package/lib/aws/compute/lb-shared/base-listener.d.ts +113 -0
  135. package/lib/aws/compute/lb-shared/base-listener.js +181 -0
  136. package/lib/aws/compute/lb-shared/base-load-balancer.d.ts +212 -0
  137. package/lib/aws/compute/lb-shared/base-load-balancer.js +290 -0
  138. package/lib/aws/compute/lb-shared/base-target-group.d.ts +382 -0
  139. package/lib/aws/compute/lb-shared/base-target-group.js +364 -0
  140. package/lib/aws/compute/lb-shared/enums.d.ts +282 -0
  141. package/lib/aws/compute/lb-shared/enums.js +301 -0
  142. package/lib/aws/compute/lb-shared/grid-lookup-types.d.ts +42 -0
  143. package/lib/aws/compute/lb-shared/grid-lookup-types.js +53 -0
  144. package/lib/aws/compute/lb-shared/imported.d.ts +24 -0
  145. package/lib/aws/compute/lb-shared/imported.js +27 -0
  146. package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +194 -0
  147. package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +3 -0
  148. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +56 -0
  149. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +3 -0
  150. package/lib/aws/compute/lb-shared/listener-action.d.ts +14 -0
  151. package/lib/aws/compute/lb-shared/listener-action.js +4 -0
  152. package/lib/aws/compute/lb-shared/listener-certificate.d.ts +28 -0
  153. package/lib/aws/compute/lb-shared/listener-certificate.js +29 -0
  154. package/lib/aws/compute/lb-shared/load-balancer-targets.d.ts +93 -0
  155. package/lib/aws/compute/lb-shared/load-balancer-targets.js +127 -0
  156. package/lib/aws/compute/lb-shared/util.d.ts +113 -0
  157. package/lib/aws/compute/lb-shared/util.js +264 -0
  158. package/lib/aws/compute/lb-targets/alb-target.d.ts +67 -0
  159. package/lib/aws/compute/lb-targets/alb-target.js +100 -0
  160. package/lib/aws/compute/lb-targets/index.d.ts +4 -0
  161. package/lib/aws/compute/lb-targets/index.js +22 -0
  162. package/lib/aws/compute/lb-targets/instance-target.d.ts +42 -0
  163. package/lib/aws/compute/lb-targets/instance-target.js +67 -0
  164. package/lib/aws/compute/lb-targets/ip-target.d.ts +55 -0
  165. package/lib/aws/compute/lb-targets/ip-target.js +79 -0
  166. package/lib/aws/compute/lb-targets/lambda-target.d.ts +25 -0
  167. package/lib/aws/compute/lb-targets/lambda-target.js +50 -0
  168. package/lib/aws/compute/load-balancer.d.ts +336 -0
  169. package/lib/aws/compute/load-balancer.js +287 -0
  170. package/lib/aws/compute/machine-image/amazon-linux-2022.d.ts +63 -0
  171. package/lib/aws/compute/machine-image/amazon-linux-2022.js +84 -0
  172. package/lib/aws/compute/machine-image/amazon-linux-2023.d.ts +63 -0
  173. package/lib/aws/compute/machine-image/amazon-linux-2023.js +84 -0
  174. package/lib/aws/compute/machine-image/amazon-linux2.d.ts +76 -0
  175. package/lib/aws/compute/machine-image/amazon-linux2.js +87 -0
  176. package/lib/aws/compute/machine-image/common.d.ts +181 -0
  177. package/lib/aws/compute/machine-image/common.js +122 -0
  178. package/lib/aws/compute/machine-image/index.d.ts +5 -0
  179. package/lib/aws/compute/machine-image/index.js +22 -0
  180. package/lib/aws/compute/machine-image/machine-image.d.ts +463 -0
  181. package/lib/aws/compute/machine-image/machine-image.js +566 -0
  182. package/lib/aws/compute/machine-image/utils.d.ts +2 -0
  183. package/lib/aws/compute/machine-image/utils.js +17 -0
  184. package/lib/aws/compute/nat.d.ts +325 -0
  185. package/lib/aws/compute/nat.js +455 -0
  186. package/lib/aws/compute/network-acl-types.d.ts +152 -0
  187. package/lib/aws/compute/network-acl-types.js +156 -0
  188. package/lib/aws/compute/network-acl.d.ts +285 -0
  189. package/lib/aws/compute/network-acl.js +207 -0
  190. package/lib/aws/compute/network-util.d.ts +116 -0
  191. package/lib/aws/compute/network-util.js +241 -0
  192. package/lib/aws/compute/nlb/network-listener-action.d.ts +92 -0
  193. package/lib/aws/compute/nlb/network-listener-action.js +146 -0
  194. package/lib/aws/compute/nlb/network-listener-certificate.d.ts +24 -0
  195. package/lib/aws/compute/nlb/network-listener-certificate.js +25 -0
  196. package/lib/aws/compute/nlb/network-listener.d.ts +248 -0
  197. package/lib/aws/compute/nlb/network-listener.js +217 -0
  198. package/lib/aws/compute/nlb/network-load-balancer.d.ts +315 -0
  199. package/lib/aws/compute/nlb/network-load-balancer.js +360 -0
  200. package/lib/aws/compute/nlb/network-target-group.d.ts +153 -0
  201. package/lib/aws/compute/nlb/network-target-group.js +223 -0
  202. package/lib/aws/compute/peer.d.ts +64 -0
  203. package/lib/aws/compute/peer.js +235 -0
  204. package/lib/aws/compute/placement-group.d.ts +161 -0
  205. package/lib/aws/compute/placement-group.js +133 -0
  206. package/lib/aws/compute/port.d.ts +287 -0
  207. package/lib/aws/compute/port.js +390 -0
  208. package/lib/aws/compute/prefix-list.d.ts +131 -0
  209. package/lib/aws/compute/prefix-list.js +114 -0
  210. package/lib/aws/compute/private/context-stub.d.ts +7 -0
  211. package/lib/aws/compute/private/context-stub.js +43 -0
  212. package/lib/aws/compute/private/ebs-util.d.ts +14 -0
  213. package/lib/aws/compute/private/ebs-util.js +145 -0
  214. package/lib/aws/compute/private/intrinstics.js +2 -1
  215. package/lib/aws/compute/private/json-path.js +8 -8
  216. package/lib/aws/compute/private/util.js +2 -3
  217. package/lib/aws/compute/route.d.ts +547 -0
  218. package/lib/aws/compute/route.js +469 -0
  219. package/lib/aws/compute/security-group.d.ts +414 -0
  220. package/lib/aws/compute/security-group.js +538 -0
  221. package/lib/aws/compute/state-graph.js +1 -1
  222. package/lib/aws/compute/state-machine-fragment.js +1 -1
  223. package/lib/aws/compute/state-machine.d.ts +2 -2
  224. package/lib/aws/compute/state-machine.js +14 -12
  225. package/lib/aws/compute/states/choice.js +1 -1
  226. package/lib/aws/compute/states/custom-state.js +1 -1
  227. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  228. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  229. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  230. package/lib/aws/compute/states/distributed-map.js +1 -1
  231. package/lib/aws/compute/states/fail.js +1 -1
  232. package/lib/aws/compute/states/map-base.js +1 -1
  233. package/lib/aws/compute/states/map.js +1 -1
  234. package/lib/aws/compute/states/parallel.js +1 -1
  235. package/lib/aws/compute/states/pass.js +2 -2
  236. package/lib/aws/compute/states/state.js +5 -5
  237. package/lib/aws/compute/states/succeed.js +1 -1
  238. package/lib/aws/compute/states/task-base.js +2 -2
  239. package/lib/aws/compute/states/task.js +1 -1
  240. package/lib/aws/compute/states/wait.js +2 -2
  241. package/lib/aws/compute/stepfunctions-canned-metrics.generated.d.ts +83 -0
  242. package/lib/aws/compute/stepfunctions-canned-metrics.generated.js +127 -0
  243. package/lib/aws/compute/subnet-v2.d.ts +213 -0
  244. package/lib/aws/compute/subnet-v2.js +405 -0
  245. package/lib/aws/compute/subnet.d.ts +37 -0
  246. package/lib/aws/compute/subnet.js +181 -0
  247. package/lib/aws/compute/task-credentials.js +1 -1
  248. package/lib/aws/compute/task-input.js +1 -1
  249. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  250. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  251. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  252. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  253. package/lib/aws/compute/tasks/private/task-utils.js +3 -4
  254. package/lib/aws/compute/tasks/resource-arn-suffix.js +2 -3
  255. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  256. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  257. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  258. package/lib/aws/compute/types.js +2 -2
  259. package/lib/aws/compute/user-data.d.ts +270 -0
  260. package/lib/aws/compute/user-data.js +487 -0
  261. package/lib/aws/compute/util.d.ts +1 -1
  262. package/lib/aws/compute/util.js +4 -5
  263. package/lib/aws/compute/volume.d.ts +480 -0
  264. package/lib/aws/compute/volume.js +426 -0
  265. package/lib/aws/compute/vpc-endpoint-service.d.ts +149 -0
  266. package/lib/aws/compute/vpc-endpoint-service.js +90 -0
  267. package/lib/aws/compute/vpc-endpoint.d.ts +742 -0
  268. package/lib/aws/compute/vpc-endpoint.js +811 -0
  269. package/lib/aws/compute/vpc-flow-logs.d.ts +551 -0
  270. package/lib/aws/compute/vpc-flow-logs.js +693 -0
  271. package/lib/aws/compute/vpc-lookup.d.ts +73 -0
  272. package/lib/aws/compute/vpc-lookup.js +3 -0
  273. package/lib/aws/compute/vpc-v2-base.d.ts +353 -0
  274. package/lib/aws/compute/vpc-v2-base.js +493 -0
  275. package/lib/aws/compute/vpc-v2.d.ts +385 -0
  276. package/lib/aws/compute/vpc-v2.js +408 -0
  277. package/lib/aws/compute/vpc.d.ts +1448 -0
  278. package/lib/aws/compute/vpc.js +1495 -0
  279. package/lib/aws/compute/vpn.d.ts +443 -0
  280. package/lib/aws/compute/vpn.js +397 -0
  281. package/lib/aws/compute/windows-versions.d.ts +418 -0
  282. package/lib/aws/compute/windows-versions.js +426 -0
  283. package/lib/aws/edge/certificate-base.d.ts +20 -0
  284. package/lib/aws/edge/certificate-base.js +28 -0
  285. package/lib/aws/edge/certificate.d.ts +23 -2
  286. package/lib/aws/edge/certificate.js +54 -4
  287. package/lib/aws/edge/distribution.js +3 -3
  288. package/lib/aws/edge/dns-alias-record-targets.js +2 -2
  289. package/lib/aws/edge/dns-record.js +16 -16
  290. package/lib/aws/edge/dns-zone.d.ts +20 -2
  291. package/lib/aws/edge/dns-zone.js +25 -10
  292. package/lib/aws/edge/function.js +2 -2
  293. package/lib/aws/edge/index.d.ts +1 -0
  294. package/lib/aws/edge/index.js +2 -1
  295. package/lib/aws/edge/key-value-store.js +4 -4
  296. package/lib/aws/edge/origin.js +7 -5
  297. package/lib/aws/edge/response-headers-policy.js +1 -1
  298. package/lib/aws/encryption/alias.js +1 -1
  299. package/lib/aws/encryption/key.js +1 -1
  300. package/lib/aws/encryption/via-service-principal.js +1 -1
  301. package/lib/aws/iam/grant.js +2 -2
  302. package/lib/aws/iam/index.d.ts +1 -0
  303. package/lib/aws/iam/index.js +2 -1
  304. package/lib/aws/iam/instance-profile.d.ts +155 -0
  305. package/lib/aws/iam/instance-profile.js +124 -0
  306. package/lib/aws/iam/managed-policy.js +1 -1
  307. package/lib/aws/iam/oidc-provider.js +1 -1
  308. package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
  309. package/lib/aws/iam/policy-document-config.generated.js +1 -1
  310. package/lib/aws/iam/policy-document.js +1 -1
  311. package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
  312. package/lib/aws/iam/policy-statement-props.generated.js +1 -1
  313. package/lib/aws/iam/policy-statement.js +9 -9
  314. package/lib/aws/iam/policy.js +1 -1
  315. package/lib/aws/iam/principals.js +26 -26
  316. package/lib/aws/iam/private/assume-role-policy.js +2 -3
  317. package/lib/aws/iam/private/comparable-principal.js +2 -3
  318. package/lib/aws/iam/private/immutable-role.d.ts +2 -1
  319. package/lib/aws/iam/private/immutable-role.js +3 -3
  320. package/lib/aws/iam/private/imported-role.d.ts +1 -1
  321. package/lib/aws/iam/private/imported-role.js +3 -3
  322. package/lib/aws/iam/private/merge-statements.js +2 -3
  323. package/lib/aws/iam/private/util.js +4 -4
  324. package/lib/aws/iam/role.js +1 -1
  325. package/lib/aws/iam/saml-provider.d.ts +1 -1
  326. package/lib/aws/iam/saml-provider.js +6 -6
  327. package/lib/aws/iam/unknown-principal.js +1 -1
  328. package/lib/aws/iam/utils.js +2 -3
  329. package/lib/aws/index.d.ts +1 -0
  330. package/lib/aws/index.js +4 -1
  331. package/lib/aws/network/simple-ipv4-vpc.js +5 -5
  332. package/lib/aws/network/subnet-group.js +3 -3
  333. package/lib/aws/network/subnet.d.ts +1 -1
  334. package/lib/aws/network/subnet.js +7 -7
  335. package/lib/aws/notify/archive.js +3 -2
  336. package/lib/aws/notify/connection.js +5 -4
  337. package/lib/aws/notify/event-bus.js +5 -4
  338. package/lib/aws/notify/event-pattern.d.ts +26 -1
  339. package/lib/aws/notify/event-pattern.js +49 -5
  340. package/lib/aws/notify/index.js +3 -1
  341. package/lib/aws/notify/input.js +4 -3
  342. package/lib/aws/notify/kinesis-stream.js +3 -2
  343. package/lib/aws/notify/on-event-options.js +2 -1
  344. package/lib/aws/notify/queue-config.generated.d.ts +18 -11
  345. package/lib/aws/notify/queue-config.generated.js +1 -1
  346. package/lib/aws/notify/queue-policy.js +1 -1
  347. package/lib/aws/notify/queue.js +1 -1
  348. package/lib/aws/notify/resource-policy.js +1 -1
  349. package/lib/aws/notify/rule.js +3 -2
  350. package/lib/aws/notify/schedule.js +2 -2
  351. package/lib/aws/notify/sqs-augmentations.generated.d.ts +125 -0
  352. package/lib/aws/notify/sqs-augmentations.generated.js +74 -0
  353. package/lib/aws/notify/target.js +2 -1
  354. package/lib/aws/notify/targets/event-bus.js +1 -1
  355. package/lib/aws/notify/targets/function.js +1 -1
  356. package/lib/aws/notify/targets/log-group.js +2 -2
  357. package/lib/aws/notify/targets/sqs.js +1 -1
  358. package/lib/aws/notify/targets/state-machine.js +1 -1
  359. package/lib/aws/notify/targets/util.d.ts +1 -1
  360. package/lib/aws/notify/targets/util.js +10 -11
  361. package/lib/aws/notify/util.js +4 -4
  362. package/lib/aws/provider-config.generated.d.ts +33 -33
  363. package/lib/aws/provider-config.generated.js +1 -1
  364. package/lib/aws/storage/bucket-notifications.js +1 -1
  365. package/lib/aws/storage/bucket-policy.js +1 -1
  366. package/lib/aws/storage/bucket-source.js +1 -1
  367. package/lib/aws/storage/bucket.d.ts +298 -65
  368. package/lib/aws/storage/bucket.js +548 -225
  369. package/lib/aws/storage/cors-config.generated.d.ts +3 -3
  370. package/lib/aws/storage/cors-config.generated.js +1 -1
  371. package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
  372. package/lib/aws/storage/cors-rule-config.generated.js +1 -1
  373. package/lib/aws/storage/index.d.ts +1 -0
  374. package/lib/aws/storage/index.js +2 -1
  375. package/lib/aws/storage/lifecycle-config.generated.d.ts +11 -11
  376. package/lib/aws/storage/lifecycle-config.generated.js +1 -1
  377. package/lib/aws/storage/notification-targets/function.js +6 -6
  378. package/lib/aws/storage/notification-targets/queue.js +1 -1
  379. package/lib/aws/storage/origin-access-identity.d.ts +1 -1
  380. package/lib/aws/storage/origin-access-identity.js +5 -4
  381. package/lib/aws/storage/parameter-util.d.ts +12 -0
  382. package/lib/aws/storage/parameter-util.js +65 -0
  383. package/lib/aws/storage/parameter.d.ts +526 -0
  384. package/lib/aws/storage/parameter.js +606 -0
  385. package/lib/aws/storage/s3-canned-metrics.generated.d.ts +22 -0
  386. package/lib/aws/storage/s3-canned-metrics.generated.js +23 -0
  387. package/lib/aws/storage/util.d.ts +25 -3
  388. package/lib/aws/storage/util.js +84 -17
  389. package/lib/aws/storage/website-config.generated.d.ts +5 -5
  390. package/lib/aws/storage/website-config.generated.js +1 -1
  391. package/lib/aws/util.js +2 -3
  392. package/lib/construct-base.d.ts +10 -1
  393. package/lib/construct-base.js +9 -6
  394. package/lib/duration.js +1 -1
  395. package/lib/expiration.d.ts +48 -0
  396. package/lib/expiration.js +68 -0
  397. package/lib/helpers-internal/index.d.ts +1 -0
  398. package/lib/helpers-internal/index.js +7 -0
  399. package/lib/index.d.ts +2 -0
  400. package/lib/index.js +3 -1
  401. package/lib/private/md5.d.ts +4 -0
  402. package/lib/private/md5.js +14 -0
  403. package/lib/private/unique-resource-name.js +3 -4
  404. package/lib/size.js +2 -2
  405. package/lib/stack-base.d.ts +4 -23
  406. package/lib/stack-base.js +9 -30
  407. package/lib/terra-func.d.ts +103 -0
  408. package/lib/terra-func.js +170 -0
  409. package/lib/token.js +5 -5
  410. package/package.json +15 -8
  411. package/bun.lockb +0 -0
@@ -0,0 +1,405 @@
1
+ "use strict";
2
+ var _a, _b;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.SubnetV2 = exports.IpCidr = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ // https://github.com/aws/aws-cdk/blob/v2.175.1/packages/@aws-cdk/aws-ec2-alpha/lib/subnet-v2.ts
7
+ const provider_aws_1 = require("@cdktf/provider-aws");
8
+ // import { Lazy } from "cdktf";
9
+ const constructs_1 = require("constructs");
10
+ // TODO: Use TagManager and tag-aspect instead
11
+ const aws_tags_1 = require("../aws-tags");
12
+ // import { Tags } from "../tag-aspect";
13
+ const network_acl_1 = require("./network-acl");
14
+ const aws_construct_1 = require("../aws-construct");
15
+ const ec2_util_v2_1 = require("./ec2-util-v2");
16
+ const route_1 = require("./route");
17
+ const vpc_1 = require("./vpc");
18
+ const aws_stack_1 = require("../aws-stack");
19
+ /**
20
+ * IPv4 or IPv6 CIDR range for the subnet
21
+ */
22
+ class IpCidr {
23
+ constructor(props) {
24
+ this.cidr = props;
25
+ }
26
+ }
27
+ exports.IpCidr = IpCidr;
28
+ _a = JSII_RTTI_SYMBOL_1;
29
+ IpCidr[_a] = { fqn: "terraconstructs.aws.compute.alpha.IpCidr", version: "0.0.13" };
30
+ /**
31
+ * Name tag constant
32
+ */
33
+ const NAME_TAG = "Name";
34
+ /**
35
+ * VPC Name tag constant
36
+ */
37
+ const VPCNAME_TAG = "VpcName";
38
+ /**
39
+ * The SubnetV2 class represents a subnet within a VPC (Virtual Private Cloud) in AWS.
40
+ * It extends the Resource class and implements the ISubnet interface.
41
+ *
42
+ * Instances of this class can be used to create and manage subnets within a VpcV2 instance.
43
+ * Subnets can be configured with specific IP address ranges (IPv4 and IPv6), availability zones,
44
+ * and subnet types (e.g., public, private, isolated).
45
+ *
46
+ * @resource AWS::EC2::Subnet
47
+ *
48
+ */
49
+ class SubnetV2 extends aws_construct_1.AwsConstructBase {
50
+ /**
51
+ * Import an existing subnet to the VPC
52
+ */
53
+ static fromSubnetV2Attributes(scope, id, attrs) {
54
+ /**
55
+ * Class to define an import for an existing subnet
56
+ * @resource AWS::EC2::Subnet
57
+ */
58
+ class ImportedSubnetV2 extends aws_construct_1.AwsConstructBase {
59
+ constructor() {
60
+ super(...arguments);
61
+ /**
62
+ * The IPv6 CIDR Block assigned to this subnet
63
+ */
64
+ this.ipv6CidrBlock = attrs.ipv6CidrBlock;
65
+ /**
66
+ * The type of subnet (eg. public or private) that this subnet represents.
67
+ */
68
+ this.subnetType = attrs.subnetType;
69
+ /**
70
+ * The Availability Zone in which subnet is located
71
+ */
72
+ this.availabilityZone = attrs.availabilityZone;
73
+ /**
74
+ * The subnetId for this particular subnet
75
+ * Refers to the physical ID created
76
+ */
77
+ this.subnetId = attrs.subnetId;
78
+ /**
79
+ * Dependable that can be depended upon to force internet connectivity established on the VPC
80
+ */
81
+ this.internetConnectivityEstablished = new constructs_1.DependencyGroup();
82
+ /**
83
+ * The IPv4 CIDR block assigned to this subnet
84
+ */
85
+ this.ipv4CidrBlock = attrs.ipv4CidrBlock;
86
+ /**
87
+ * Current route table associated with this subnet
88
+ */
89
+ this.routeTable = {
90
+ routeTableId: attrs.routeTableId,
91
+ };
92
+ this.subnetOutputs = {
93
+ subnetId: this.subnetId,
94
+ ipv4CidrBlock: this.ipv4CidrBlock,
95
+ routeTableId: this.routeTable.routeTableId,
96
+ };
97
+ }
98
+ get outputs() {
99
+ return this.subnetOutputs;
100
+ }
101
+ /**
102
+ * Associate a Network ACL with this subnet
103
+ * Required here since it is implemented in the ISubnetV2
104
+ */
105
+ associateNetworkAcl(aclId, networkAcl) {
106
+ const aclScope = networkAcl instanceof constructs_1.Construct ? networkAcl : this;
107
+ const other = networkAcl instanceof constructs_1.Construct ? this : networkAcl;
108
+ new network_acl_1.SubnetNetworkAclAssociation(aclScope, aclId + aws_stack_1.AwsStack.uniqueId(other), {
109
+ networkAcl,
110
+ subnet: this,
111
+ });
112
+ }
113
+ }
114
+ return new ImportedSubnetV2(scope, id);
115
+ }
116
+ get subnetOutputs() {
117
+ return {
118
+ subnetId: this.subnetId,
119
+ ipv4CidrBlock: this.ipv4CidrBlock,
120
+ routeTableId: this.routeTable.routeTableId,
121
+ };
122
+ }
123
+ get outputs() {
124
+ return this.subnetOutputs;
125
+ }
126
+ /**
127
+ * Constructs a new SubnetV2 instance.
128
+ * @param scope The parent Construct that this resource will be part of.
129
+ * @param id The unique identifier for this resource.
130
+ * @param props The configuration properties for the subnet.
131
+ */
132
+ constructor(scope, id, props) {
133
+ super(scope, id, props);
134
+ /**
135
+ * The variable name `internetConnectivityEstablished` does not reflect what it actually is.
136
+ * The naming is enforced by ISubnet. We need to keep it to maintain compatibility.
137
+ * It exposes the RouteTable-Subnet association so that other resources can depend on it.
138
+ * E.g. Resources in a subnet, when being deleted, may need the RouteTable to exist in order to delete properly
139
+ */
140
+ this._internetConnectivityEstablished = new constructs_1.DependencyGroup();
141
+ const subnetName = props.subnetName ||
142
+ this.stack.uniqueResourceName(this, {
143
+ prefix: this.gridUUID,
144
+ maxLength: 128,
145
+ allowedSpecialCharacters: "_",
146
+ });
147
+ // Lazy.string({
148
+ // produce: () =>
149
+ // Names.uniqueResourceName(this, {
150
+ // maxLength: 128,
151
+ // allowedSpecialCharacters: "_",
152
+ // }),
153
+ // }),
154
+ const ipv4CidrBlock = props.ipv4CidrBlock.cidr;
155
+ const ipv6CidrBlock = props.ipv6CidrBlock?.cidr;
156
+ if (!checkCidrRanges(props.vpc, props.ipv4CidrBlock.cidr)) {
157
+ throw new Error("CIDR block should be within the range of VPC");
158
+ }
159
+ let overlap = false;
160
+ let overlapIpv6 = false;
161
+ overlap = validateOverlappingCidrRanges(props.vpc, props.ipv4CidrBlock.cidr);
162
+ //check whether VPC supports ipv6
163
+ if (props.ipv6CidrBlock?.cidr) {
164
+ validateSupportIpv6(props.vpc);
165
+ overlapIpv6 = validateOverlappingCidrRangesipv6(props.vpc, props.ipv6CidrBlock?.cidr);
166
+ }
167
+ if (overlap || overlapIpv6) {
168
+ throw new Error("CIDR block should not overlap with existing subnet blocks");
169
+ }
170
+ if (props.assignIpv6AddressOnCreation && !props.ipv6CidrBlock) {
171
+ throw new Error("IPv6 CIDR block is required when assigning IPv6 address on creation");
172
+ }
173
+ this.resource = new provider_aws_1.subnet.Subnet(this, "Resource", {
174
+ vpcId: props.vpc.vpcId,
175
+ cidrBlock: ipv4CidrBlock,
176
+ ipv6CidrBlock: ipv6CidrBlock,
177
+ availabilityZone: props.availabilityZone,
178
+ assignIpv6AddressOnCreation: props.assignIpv6AddressOnCreation ?? false,
179
+ });
180
+ this.node.defaultChild = this.resource;
181
+ this.ipv4CidrBlock = props.ipv4CidrBlock.cidr;
182
+ this.ipv6CidrBlock = props.ipv6CidrBlock?.cidr;
183
+ this.subnetId = this.resource.id;
184
+ this.availabilityZone = props.availabilityZone;
185
+ // Terraform subnet does not provide the default ACL NetworkAclAssociationId attribute
186
+ // this._networkAcl = NetworkAcl.fromNetworkAclId(
187
+ // this,
188
+ // "Acl",
189
+ // this.resource.NetworkAclAssociationId,
190
+ // );
191
+ if (props.subnetName) {
192
+ aws_tags_1.Tags.of(this).add(NAME_TAG, subnetName);
193
+ }
194
+ if (props.vpc.vpcName) {
195
+ aws_tags_1.Tags.of(this).add(VPCNAME_TAG, props.vpc.vpcName);
196
+ }
197
+ if (props.routeTable) {
198
+ this._routeTable = props.routeTable;
199
+ }
200
+ else {
201
+ // Assigning a default route table
202
+ this._routeTable = new route_1.RouteTable(this, "RouteTable", {
203
+ vpc: props.vpc,
204
+ routeTableName: "DefaultCDKRouteTable",
205
+ });
206
+ }
207
+ const routeAssoc = new provider_aws_1.routeTableAssociation.RouteTableAssociation(this, "RouteTableAssociation", {
208
+ subnetId: this.subnetId,
209
+ routeTableId: this.routeTable.routeTableId,
210
+ });
211
+ this._internetConnectivityEstablished.add(routeAssoc);
212
+ this.internetConnectivityEstablished =
213
+ this._internetConnectivityEstablished;
214
+ this.subnetType = props.subnetType;
215
+ storeSubnetToVpcByType(props.vpc, this, props.subnetType);
216
+ }
217
+ /**
218
+ * Associate a Network ACL with this subnet
219
+ *
220
+ * @param id The unique identifier for this association.
221
+ * @param networkAcl The Network ACL to associate with this subnet.
222
+ * This allows controlling inbound and outbound traffic for instances in this subnet.
223
+ */
224
+ associateNetworkAcl(id, networkAcl) {
225
+ this._networkAcl = networkAcl;
226
+ const scope = networkAcl instanceof constructs_1.Construct ? networkAcl : this;
227
+ const other = networkAcl instanceof constructs_1.Construct ? this : networkAcl;
228
+ new network_acl_1.SubnetNetworkAclAssociation(scope, id + aws_stack_1.AwsStack.uniqueId(other.node), {
229
+ networkAcl,
230
+ subnet: this,
231
+ });
232
+ }
233
+ /**
234
+ * Return the Route Table associated with this subnet
235
+ */
236
+ get routeTable() {
237
+ return this._routeTable;
238
+ }
239
+ /**
240
+ * Returns the Network ACL associated with this subnet.
241
+ */
242
+ get networkAcl() {
243
+ // TODO: should this rerturn from DataSource if undefined?
244
+ // https://registry.terraform.io/providers/hashicorp/aws/5.68.0/docs/data-sources/network_acls
245
+ return this._networkAcl;
246
+ }
247
+ }
248
+ exports.SubnetV2 = SubnetV2;
249
+ _b = JSII_RTTI_SYMBOL_1;
250
+ SubnetV2[_b] = { fqn: "terraconstructs.aws.compute.alpha.SubnetV2", version: "0.0.13" };
251
+ const subnetTypeMap = {
252
+ [vpc_1.SubnetType.PRIVATE_ISOLATED]: (vpc, subnet) => vpc.isolatedSubnets.push(subnet),
253
+ [vpc_1.SubnetType.PUBLIC]: (vpc, subnet) => vpc.publicSubnets.push(subnet),
254
+ [vpc_1.SubnetType.PRIVATE_WITH_EGRESS]: (vpc, subnet) => vpc.privateSubnets.push(subnet),
255
+ [vpc_1.SubnetType.ISOLATED]: (vpc, subnet) => vpc.isolatedSubnets.push(subnet),
256
+ [vpc_1.SubnetType.PRIVATE]: (vpc, subnet) => vpc.privateSubnets.push(subnet),
257
+ [vpc_1.SubnetType.PRIVATE_WITH_NAT]: (vpc, subnet) => vpc.privateSubnets.push(subnet),
258
+ };
259
+ /**
260
+ * Stores the provided subnet in the VPC's collection of subnets based on the specified subnet type.
261
+ *
262
+ * @param vpc The VPC instance to which the subnet belongs.
263
+ * @param subnet The subnet instance to be stored.
264
+ * @param type The type of the subnet (e.g., public, private, isolated).
265
+ * @internal
266
+ */
267
+ function storeSubnetToVpcByType(vpc, subnet, type) {
268
+ const findFunctionType = subnetTypeMap[type];
269
+ if (findFunctionType) {
270
+ findFunctionType(vpc, subnet);
271
+ }
272
+ else {
273
+ throw new Error(`Unsupported subnet type: ${type}`);
274
+ }
275
+ /**
276
+ * Need to set explicit dependency as during stack deletion,
277
+ * the cidr blocks may get deleted first and will fail as the subnets are still using the cidr blocks
278
+ */
279
+ if (vpc.secondaryCidrBlock) {
280
+ for (const cidr of vpc.secondaryCidrBlock) {
281
+ subnet.node.addDependency(cidr);
282
+ }
283
+ }
284
+ }
285
+ /**
286
+ * Validates whether the provided VPC supports IPv6 addresses.
287
+ *
288
+ * @param vpc The VPC instance to be validated.
289
+ * @throws Error if the VPC does not support IPv6 addresses.
290
+ * @returns True if the VPC supports IPv6 addresses, false otherwise.
291
+ * @internal
292
+ */
293
+ function validateSupportIpv6(vpc) {
294
+ if (vpc.secondaryCidrBlock) {
295
+ if (vpc.secondaryCidrBlock.some((secondaryAddress) => secondaryAddress.amazonProvidedIpv6CidrBlock === true ||
296
+ secondaryAddress.ipv6IpamPoolId != undefined)) {
297
+ return true;
298
+ }
299
+ else {
300
+ throw new Error("To use IPv6, the VPC must enable IPv6 support.");
301
+ }
302
+ }
303
+ else {
304
+ return false;
305
+ }
306
+ }
307
+ /**
308
+ * Checks if the provided CIDR range falls within the IP address ranges of the given VPC.
309
+ *
310
+ * @param vpc The VPC instance to check against.
311
+ * @param cidrRange The CIDR range to be checked.
312
+ * @returns True if the CIDR range falls within the VPC's IP address ranges, false otherwise.
313
+ * @internal
314
+ */
315
+ function checkCidrRanges(vpc, cidrRange) {
316
+ const vpcCidrBlock = [vpc.ipv4CidrBlock];
317
+ const subnetCidrBlock = new ec2_util_v2_1.CidrBlock(cidrRange);
318
+ const allCidrs = [];
319
+ // Secondary IP addresses assoicated using user defined IPv4 range
320
+ if (vpc.secondaryCidrBlock) {
321
+ for (const ipAddress of vpc.secondaryCidrBlock) {
322
+ if (ipAddress.cidrBlock) {
323
+ vpcCidrBlock.push(ipAddress.cidrBlock);
324
+ }
325
+ }
326
+ const cidrs = vpcCidrBlock.map((cidr) => new ec2_util_v2_1.CidrBlock(cidr));
327
+ allCidrs.push(...cidrs);
328
+ }
329
+ // Secondary IP addresses assoicated using IPAM IPv4 range
330
+ if (vpc.ipv4IpamProvisionedCidrs) {
331
+ const cidrs = vpc.ipv4IpamProvisionedCidrs.map((cidr) => new ec2_util_v2_1.CidrBlock(cidr));
332
+ allCidrs.push(...cidrs);
333
+ }
334
+ // If no IPv4 is assigned as secondary address
335
+ if (allCidrs.length === 0) {
336
+ throw new Error("No secondary IP address attached to VPC");
337
+ }
338
+ return allCidrs.some((c) => c.containsCidr(subnetCidrBlock));
339
+ }
340
+ /**
341
+ * Validates if the provided IPv4 CIDR block overlaps with existing subnet CIDR blocks within the given VPC.
342
+ *
343
+ * @param vpc The VPC instance to check against.
344
+ * @param ipv4CidrBlock The IPv4 CIDR block to be validated.
345
+ * @returns True if the IPv4 CIDR block overlaps with existing subnet CIDR blocks, false otherwise.
346
+ * @internal
347
+ */
348
+ function validateOverlappingCidrRanges(vpc, ipv4CidrBlock) {
349
+ let allSubnets;
350
+ try {
351
+ allSubnets = vpc.selectSubnets().subnets;
352
+ }
353
+ catch (e) {
354
+ ("No subnets in VPC");
355
+ return false;
356
+ }
357
+ const ipMap = new Array();
358
+ const inputRange = new ec2_util_v2_1.CidrBlock(ipv4CidrBlock);
359
+ const inputIpMap = [inputRange.minIp(), inputRange.maxIp()];
360
+ for (const subnet of allSubnets) {
361
+ const cidrBlock = new ec2_util_v2_1.CidrBlock(subnet.ipv4CidrBlock);
362
+ ipMap.push([cidrBlock.minIp(), cidrBlock.maxIp()]);
363
+ }
364
+ for (const range of ipMap) {
365
+ if (inputRange.rangesOverlap(range, inputIpMap)) {
366
+ return true;
367
+ }
368
+ }
369
+ return false;
370
+ }
371
+ /**
372
+ * Validates if the provided IPv6 CIDR block overlaps with existing subnet CIDR blocks within the given VPC.
373
+ *
374
+ * @param vpc The VPC instance to check against.
375
+ * @param ipv6CidrBlock The IPv6 CIDR block to be validated.
376
+ * @returns True if the IPv6 CIDR block overlaps with existing subnet CIDR blocks, false otherwise.
377
+ * @throws Error if no subnets are found in the VPC.
378
+ * @internal
379
+ */
380
+ function validateOverlappingCidrRangesipv6(vpc, ipv6CidrBlock) {
381
+ let allSubnets;
382
+ try {
383
+ allSubnets = vpc.selectSubnets().subnets;
384
+ }
385
+ catch (e) {
386
+ ("No subnets in VPC");
387
+ return false;
388
+ }
389
+ const ipv6Map = [];
390
+ const inputRange = new ec2_util_v2_1.CidrBlockIpv6(ipv6CidrBlock);
391
+ let result = false;
392
+ for (const subnet of allSubnets) {
393
+ if (subnet.ipv6CidrBlock) {
394
+ const cidrBlock = new ec2_util_v2_1.CidrBlockIpv6(subnet.ipv6CidrBlock);
395
+ ipv6Map.push(cidrBlock.cidr);
396
+ }
397
+ }
398
+ for (const range of ipv6Map) {
399
+ if (inputRange.rangesOverlap(range, inputRange.cidr)) {
400
+ result = true;
401
+ }
402
+ }
403
+ return result;
404
+ }
405
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibmV0LXYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9jb21wdXRlL3N1Ym5ldC12Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGdHQUFnRztBQUVoRyxzREFHNkI7QUFDN0IsZ0NBQWdDO0FBQ2hDLDJDQUFxRTtBQUNyRSw4Q0FBOEM7QUFDOUMsMENBQW1DO0FBQ25DLHdDQUF3QztBQUN4QywrQ0FJdUI7QUFDdkIsb0RBQXVFO0FBQ3ZFLCtDQUF5RDtBQUN6RCxtQ0FBcUM7QUFDckMsK0JBQXdFO0FBRXhFLDRDQUF3QztBQVN4Qzs7R0FFRztBQUNILE1BQWEsTUFBTTtJQU1qQixZQUFZLEtBQWE7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7SUFDcEIsQ0FBQzs7QUFSSCx3QkFTQzs7O0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBVyxNQUFNLENBQUM7QUFFaEM7O0dBRUc7QUFDSCxNQUFNLFdBQVcsR0FBVyxTQUFTLENBQUM7QUErRXRDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLFFBQVMsU0FBUSxnQ0FBZ0I7SUFDNUM7O09BRUc7SUFDSSxNQUFNLENBQUMsc0JBQXNCLENBQ2xDLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUF5QjtRQUV6Qjs7O1dBR0c7UUFDSCxNQUFNLGdCQUFpQixTQUFRLGdDQUFnQjtZQUEvQzs7Z0JBQ0U7O21CQUVHO2dCQUNhLGtCQUFhLEdBQVksS0FBSyxDQUFDLGFBQWEsQ0FBQztnQkFFN0Q7O21CQUVHO2dCQUNhLGVBQVUsR0FBZ0IsS0FBSyxDQUFDLFVBQVUsQ0FBQztnQkFFM0Q7O21CQUVHO2dCQUNhLHFCQUFnQixHQUFXLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztnQkFFbEU7OzttQkFHRztnQkFDYSxhQUFRLEdBQVcsS0FBSyxDQUFDLFFBQVEsQ0FBQztnQkFFbEQ7O21CQUVHO2dCQUNhLG9DQUErQixHQUM3QyxJQUFJLDRCQUFl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O1lBQzFELE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM1QixJQUFJLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JELE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTc1LjEvcGFja2FnZXMvQGF3cy1jZGsvYXdzLWVjMi1hbHBoYS9saWIvc3VibmV0LXYyLnRzXG5cbmltcG9ydCB7XG4gIHN1Ym5ldCBhcyB0ZlN1Ym5ldCxcbiAgcm91dGVUYWJsZUFzc29jaWF0aW9uIGFzIHRmUm91dGVUYWJsZUFzc29jaWF0aW9uLFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuLy8gaW1wb3J0IHsgTGF6eSB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBEZXBlbmRlbmN5R3JvdXAsIElEZXBlbmRhYmxlIH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbi8vIFRPRE86IFVzZSBUYWdNYW5hZ2VyIGFuZCB0YWctYXNwZWN0IGluc3RlYWRcbmltcG9ydCB7IFRhZ3MgfSBmcm9tIFwiLi4vYXdzLXRhZ3NcIjtcbi8vIGltcG9ydCB7IFRhZ3MgfSBmcm9tIFwiLi4vdGFnLWFzcGVjdFwiO1xuaW1wb3J0IHtcbiAgLy8gTmV0d29ya0FjbCxcbiAgU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uLFxuICBJTmV0d29ya0FjbCxcbn0gZnJvbSBcIi4vbmV0d29yay1hY2xcIjtcbmltcG9ydCB7IEF3c0NvbnN0cnVjdEJhc2UsIEF3c0NvbnN0cnVjdFByb3BzIH0gZnJvbSBcIi4uL2F3cy1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IENpZHJCbG9jaywgQ2lkckJsb2NrSXB2NiB9IGZyb20gXCIuL2VjMi11dGlsLXYyXCI7XG5pbXBvcnQgeyBSb3V0ZVRhYmxlIH0gZnJvbSBcIi4vcm91dGVcIjtcbmltcG9ydCB7IElSb3V0ZVRhYmxlLCBJU3VibmV0LCBTdWJuZXRPdXRwdXRzLCBTdWJuZXRUeXBlIH0gZnJvbSBcIi4vdnBjXCI7XG5pbXBvcnQgeyBJVnBjVjIgfSBmcm9tIFwiLi92cGMtdjItYmFzZVwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG5cbi8qKlxuICogSW50ZXJmYWNlIHRvIGRlZmluZSBzdWJuZXQgQ0lEUlxuICovXG5pbnRlcmZhY2UgSUNpZHIge1xuICByZWFkb25seSBjaWRyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSVB2NCBvciBJUHY2IENJRFIgcmFuZ2UgZm9yIHRoZSBzdWJuZXRcbiAqL1xuZXhwb3J0IGNsYXNzIElwQ2lkciBpbXBsZW1lbnRzIElDaWRyIHtcbiAgLyoqXG4gICAqIElQdjYgQ0lEUiByYW5nZSBmb3IgdGhlIHN1Ym5ldFxuICAgKiBBbGxvd2VkIG9ubHkgaWYgSVB2NiBpcyBlbmFibGVkIG9uIFZQY1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNpZHI6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHJvcHM6IHN0cmluZykge1xuICAgIHRoaXMuY2lkciA9IHByb3BzO1xuICB9XG59XG5cbi8qKlxuICogTmFtZSB0YWcgY29uc3RhbnRcbiAqL1xuY29uc3QgTkFNRV9UQUc6IHN0cmluZyA9IFwiTmFtZVwiO1xuXG4vKipcbiAqIFZQQyBOYW1lIHRhZyBjb25zdGFudFxuICovXG5jb25zdCBWUENOQU1FX1RBRzogc3RyaW5nID0gXCJWcGNOYW1lXCI7XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBkZWZpbmUgc3VibmV0IGZvciBWUEMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VibmV0VjJQcm9wcyBleHRlbmRzIEF3c0NvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIFZQQyBQcm9wXG4gICAqL1xuICByZWFkb25seSB2cGM6IElWcGNWMjtcblxuICAvKipcbiAgICogaXB2NCBjaWRyIHRvIGFzc2lnbiB0byB0aGlzIHN1Ym5ldC5cbiAgICogU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItc3VibmV0Lmh0bWwjY2ZuLWVjMi1zdWJuZXQtY2lkcmJsb2NrXG4gICAqL1xuICByZWFkb25seSBpcHY0Q2lkckJsb2NrOiBJcENpZHI7XG5cbiAgLyoqXG4gICAqIElwdjYgQ0lEUiBSYW5nZSBmb3Igc3VibmV0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gSXB2NiBhZGRyZXNzXG4gICAqL1xuICByZWFkb25seSBpcHY2Q2lkckJsb2NrPzogSXBDaWRyO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gQVogZm9yIHRoZSBzdWJuZXRcbiAgICovXG4gIHJlYWRvbmx5IGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZztcblxuICAvKipcbiAgICogQ3VzdG9tIFJvdXRlIGZvciBzdWJuZXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIGRlZmF1bHQgcm91dGUgdGFibGUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVUYWJsZT86IElSb3V0ZVRhYmxlO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBTdWJuZXQgdG8gY29uZmlndXJlLlxuICAgKlxuICAgKiBUaGUgU3VibmV0IHR5cGUgd2lsbCBjb250cm9sIHRoZSBhYmlsaXR5IHRvIHJvdXRlIGFuZCBjb25uZWN0IHRvIHRoZVxuICAgKiBJbnRlcm5ldC5cbiAgICpcbiAgICogVE9ETzogQWRkIHZhbGlkYXRpb24gY2hlY2sgYHN1Ym5ldFR5cGVgIHdoZW4gYWRkaW5nIHJlc291cmNlcyAoZS5nLiBjYW5ub3QgYWRkIE5hdEdhdGV3YXkgdG8gcHJpdmF0ZSlcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGU7XG5cbiAgLyoqXG4gICAqIFN1Ym5ldCBuYW1lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcHJvdmlzaW9uZWQgd2l0aCBhbiBhdXRvZ2VuZXJhdGVkIG5hbWUgYnkgQ0RLXG4gICAqL1xuICByZWFkb25seSBzdWJuZXROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhIG5ldHdvcmsgaW50ZXJmYWNlIGNyZWF0ZWQgaW4gdGhpcyBzdWJuZXQgcmVjZWl2ZXMgYW4gSVB2NiBhZGRyZXNzLlxuICAgKiBJZiB5b3Ugc3BlY2lmeSBBc3NpZ25JcHY2QWRkcmVzc09uQ3JlYXRpb24sIHlvdSBtdXN0IGFsc28gc3BlY2lmeSBJcHY2Q2lkckJsb2NrLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZCBpbiBjYXNlIG5vdCBwcm92aWRlZCBhcyBhbiBpbnB1dFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzaWduSXB2NkFkZHJlc3NPbkNyZWF0aW9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2Ugd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIFN1Ym5ldFYyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVN1Ym5ldFYyIGV4dGVuZHMgSVN1Ym5ldCB7XG4gIC8qKlxuICAgKiBUaGUgSVB2NiBDSURSIGJsb2NrIGZvciB0aGlzIHN1Ym5ldFxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NkNpZHJCbG9jaz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygc3VibmV0IChwdWJsaWMgb3IgcHJpdmF0ZSkgdGhhdCB0aGlzIHN1Ym5ldCByZXByZXNlbnRzLlxuICAgKlxuICAgKiBAYXR0cmlidXRlIFN1Ym5ldFR5cGVcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldFR5cGU/OiBTdWJuZXRUeXBlO1xufVxuXG4vKipcbiAqIFRoZSBTdWJuZXRWMiBjbGFzcyByZXByZXNlbnRzIGEgc3VibmV0IHdpdGhpbiBhIFZQQyAoVmlydHVhbCBQcml2YXRlIENsb3VkKSBpbiBBV1MuXG4gKiBJdCBleHRlbmRzIHRoZSBSZXNvdXJjZSBjbGFzcyBhbmQgaW1wbGVtZW50cyB0aGUgSVN1Ym5ldCBpbnRlcmZhY2UuXG4gKlxuICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuZCBtYW5hZ2Ugc3VibmV0cyB3aXRoaW4gYSBWcGNWMiBpbnN0YW5jZS5cbiAqIFN1Ym5ldHMgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBzcGVjaWZpYyBJUCBhZGRyZXNzIHJhbmdlcyAoSVB2NCBhbmQgSVB2NiksIGF2YWlsYWJpbGl0eSB6b25lcyxcbiAqIGFuZCBzdWJuZXQgdHlwZXMgKGUuZy4sIHB1YmxpYywgcHJpdmF0ZSwgaXNvbGF0ZWQpLlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6U3VibmV0XG4gKlxuICovXG5leHBvcnQgY2xhc3MgU3VibmV0VjIgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlIGltcGxlbWVudHMgSVN1Ym5ldFYyIHtcbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBzdWJuZXQgdG8gdGhlIFZQQ1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU3VibmV0VjJBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogU3VibmV0VjJBdHRyaWJ1dGVzLFxuICApOiBJU3VibmV0VjIge1xuICAgIC8qKlxuICAgICAqIENsYXNzIHRvIGRlZmluZSBhbiBpbXBvcnQgZm9yIGFuIGV4aXN0aW5nIHN1Ym5ldFxuICAgICAqIEByZXNvdXJjZSBBV1M6OkVDMjo6U3VibmV0XG4gICAgICovXG4gICAgY2xhc3MgSW1wb3J0ZWRTdWJuZXRWMiBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2UgaW1wbGVtZW50cyBJU3VibmV0VjIge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSVB2NiBDSURSIEJsb2NrIGFzc2lnbmVkIHRvIHRoaXMgc3VibmV0XG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyByZWFkb25seSBpcHY2Q2lkckJsb2NrPzogc3RyaW5nID0gYXR0cnMuaXB2NkNpZHJCbG9jaztcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdHlwZSBvZiBzdWJuZXQgKGVnLiBwdWJsaWMgb3IgcHJpdmF0ZSkgdGhhdCB0aGlzIHN1Ym5ldCByZXByZXNlbnRzLlxuICAgICAgICovXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgc3VibmV0VHlwZT86IFN1Ym5ldFR5cGUgPSBhdHRycy5zdWJuZXRUeXBlO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBBdmFpbGFiaWxpdHkgWm9uZSBpbiB3aGljaCBzdWJuZXQgaXMgbG9jYXRlZFxuICAgICAgICovXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nID0gYXR0cnMuYXZhaWxhYmlsaXR5Wm9uZTtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgc3VibmV0SWQgZm9yIHRoaXMgcGFydGljdWxhciBzdWJuZXRcbiAgICAgICAqIFJlZmVycyB0byB0aGUgcGh5c2ljYWwgSUQgY3JlYXRlZFxuICAgICAgICovXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgc3VibmV0SWQ6IHN0cmluZyA9IGF0dHJzLnN1Ym5ldElkO1xuXG4gICAgICAvKipcbiAgICAgICAqIERlcGVuZGFibGUgdGhhdCBjYW4gYmUgZGVwZW5kZWQgdXBvbiB0byBmb3JjZSBpbnRlcm5ldCBjb25uZWN0aXZpdHkgZXN0YWJsaXNoZWQgb24gdGhlIFZQQ1xuICAgICAgICovXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZDogSURlcGVuZGFibGUgPVxuICAgICAgICBuZXcgRGVwZW5kZW5jeUdyb3VwKCk7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIElQdjQgQ0lEUiBibG9jayBhc3NpZ25lZCB0byB0aGlzIHN1Ym5ldFxuICAgICAgICovXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaXB2NENpZHJCbG9jazogc3RyaW5nID0gYXR0cnMuaXB2NENpZHJCbG9jaztcblxuICAgICAgLyoqXG4gICAgICAgKiAgQ3VycmVudCByb3V0ZSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJuZXRcbiAgICAgICAqL1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJvdXRlVGFibGU6IElSb3V0ZVRhYmxlID0ge1xuICAgICAgICByb3V0ZVRhYmxlSWQ6IGF0dHJzLnJvdXRlVGFibGVJZCEsXG4gICAgICB9O1xuXG4gICAgICBwdWJsaWMgc3VibmV0T3V0cHV0czogU3VibmV0T3V0cHV0cyA9IHtcbiAgICAgICAgc3VibmV0SWQ6IHRoaXMuc3VibmV0SWQsXG4gICAgICAgIGlwdjRDaWRyQmxvY2s6IHRoaXMuaXB2NENpZHJCbG9jayxcbiAgICAgICAgcm91dGVUYWJsZUlkOiB0aGlzLnJvdXRlVGFibGUucm91dGVUYWJsZUlkLFxuICAgICAgfTtcbiAgICAgIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VibmV0T3V0cHV0cztcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQXNzb2NpYXRlIGEgTmV0d29yayBBQ0wgd2l0aCB0aGlzIHN1Ym5ldFxuICAgICAgICogUmVxdWlyZWQgaGVyZSBzaW5jZSBpdCBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgSVN1Ym5ldFYyXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyBhc3NvY2lhdGVOZXR3b3JrQWNsKGFjbElkOiBzdHJpbmcsIG5ldHdvcmtBY2w6IElOZXR3b3JrQWNsKSB7XG4gICAgICAgIGNvbnN0IGFjbFNjb3BlID0gbmV0d29ya0FjbCBpbnN0YW5jZW9mIENvbnN0cnVjdCA/IG5ldHdvcmtBY2wgOiB0aGlzO1xuICAgICAgICBjb25zdCBvdGhlciA9IG5ldHdvcmtBY2wgaW5zdGFuY2VvZiBDb25zdHJ1Y3QgPyB0aGlzIDogbmV0d29ya0FjbDtcbiAgICAgICAgbmV3IFN1Ym5ldE5ldHdvcmtBY2xBc3NvY2lhdGlvbihcbiAgICAgICAgICBhY2xTY29wZSxcbiAgICAgICAgICBhY2xJZCArIEF3c1N0YWNrLnVuaXF1ZUlkKG90aGVyKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuZXR3b3JrQWNsLFxuICAgICAgICAgICAgc3VibmV0OiB0aGlzLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW1wb3J0ZWRTdWJuZXRWMihzY29wZSwgaWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBzdWJuZXRPdXRwdXRzKCk6IFN1Ym5ldE91dHB1dHMge1xuICAgIHJldHVybiB7XG4gICAgICBzdWJuZXRJZDogdGhpcy5zdWJuZXRJZCxcbiAgICAgIGlwdjRDaWRyQmxvY2s6IHRoaXMuaXB2NENpZHJCbG9jayxcbiAgICAgIHJvdXRlVGFibGVJZDogdGhpcy5yb3V0ZVRhYmxlLnJvdXRlVGFibGVJZCxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJuZXRPdXRwdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBBdmFpbGFiaWxpdHkgWm9uZSB0aGUgc3VibmV0IGlzIGxvY2F0ZWQgaW5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhdmFpbGFiaWxpdHlab25lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdWJuZXRJZCBmb3IgdGhpcyBwYXJ0aWN1bGFyIHN1Ym5ldFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3VibmV0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogIERlcGVuZGVuY2llcyBmb3IgaW50ZXJuZXQgY29ubmVjdGl2aXR5XG4gICAqIFRoaXMgUHJvcGVydHkgZXhwb3NlcyB0aGUgUm91dGVUYWJsZS1TdWJuZXQgYXNzb2NpYXRpb24gc28gdGhhdCBvdGhlciByZXNvdXJjZXMgY2FuIGRlcGVuZCBvbiBpdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkOiBJRGVwZW5kYWJsZTtcblxuICAvKipcbiAgICogVGhlIHZhcmlhYmxlIG5hbWUgYGludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWRgIGRvZXMgbm90IHJlZmxlY3Qgd2hhdCBpdCBhY3R1YWxseSBpcy5cbiAgICogVGhlIG5hbWluZyBpcyBlbmZvcmNlZCBieSBJU3VibmV0LiBXZSBuZWVkIHRvIGtlZXAgaXQgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eS5cbiAgICogSXQgZXhwb3NlcyB0aGUgUm91dGVUYWJsZS1TdWJuZXQgYXNzb2NpYXRpb24gc28gdGhhdCBvdGhlciByZXNvdXJjZXMgY2FuIGRlcGVuZCBvbiBpdC5cbiAgICogRS5nLiBSZXNvdXJjZXMgaW4gYSBzdWJuZXQsIHdoZW4gYmVpbmcgZGVsZXRlZCwgbWF5IG5lZWQgdGhlIFJvdXRlVGFibGUgdG8gZXhpc3QgaW4gb3JkZXIgdG8gZGVsZXRlIHByb3Blcmx5XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkID0gbmV3IERlcGVuZGVuY3lHcm91cCgpO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NCBDSURSIGJsb2NrIGZvciB0aGlzIHN1Ym5ldFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwdjRDaWRyQmxvY2s6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQdjYgQ0lEUiBCbG9jayBmb3IgdGhpcyBzdWJuZXRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpcHY2Q2lkckJsb2NrPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzdWJuZXQgKHB1YmxpYyBvciBwcml2YXRlKSB0aGF0IHRoaXMgc3VibmV0IHJlcHJlc2VudHMuXG4gICAqIEBhdHRyaWJ1dGUgU3VibmV0VHlwZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN1Ym5ldFR5cGU/OiBTdWJuZXRUeXBlO1xuXG4gIHByaXZhdGUgX25ldHdvcmtBY2w/OiBJTmV0d29ya0FjbDtcbiAgcHVibGljIHJlc291cmNlOiB0ZlN1Ym5ldC5TdWJuZXQ7XG5cbiAgcHJpdmF0ZSBfcm91dGVUYWJsZTogSVJvdXRlVGFibGU7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgU3VibmV0VjIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgcGFyZW50IENvbnN0cnVjdCB0aGF0IHRoaXMgcmVzb3VyY2Ugd2lsbCBiZSBwYXJ0IG9mLlxuICAgKiBAcGFyYW0gaWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHJlc291cmNlLlxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIHN1Ym5ldC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTdWJuZXRWMlByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgY29uc3Qgc3VibmV0TmFtZSA9XG4gICAgICBwcm9wcy5zdWJuZXROYW1lIHx8XG4gICAgICB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICAgIHByZWZpeDogdGhpcy5ncmlkVVVJRCxcbiAgICAgICAgbWF4TGVuZ3RoOiAxMjgsXG4gICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogXCJfXCIsXG4gICAgICB9KTtcbiAgICAvLyBMYXp5LnN0cmluZyh7XG4gICAgLy8gICBwcm9kdWNlOiAoKSA9PlxuICAgIC8vICAgICBOYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge1xuICAgIC8vICAgICAgIG1heExlbmd0aDogMTI4LFxuICAgIC8vICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogXCJfXCIsXG4gICAgLy8gICAgIH0pLFxuICAgIC8vIH0pLFxuXG4gICAgY29uc3QgaXB2NENpZHJCbG9jayA9IHByb3BzLmlwdjRDaWRyQmxvY2suY2lkcjtcbiAgICBjb25zdCBpcHY2Q2lkckJsb2NrID0gcHJvcHMuaXB2NkNpZHJCbG9jaz8uY2lkcjtcblxuICAgIGlmICghY2hlY2tDaWRyUmFuZ2VzKHByb3BzLnZwYywgcHJvcHMuaXB2NENpZHJCbG9jay5jaWRyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ0lEUiBibG9jayBzaG91bGQgYmUgd2l0aGluIHRoZSByYW5nZSBvZiBWUENcIik7XG4gICAgfVxuXG4gICAgbGV0IG92ZXJsYXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBsZXQgb3ZlcmxhcElwdjY6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIG92ZXJsYXAgPSB2YWxpZGF0ZU92ZXJsYXBwaW5nQ2lkclJhbmdlcyhcbiAgICAgIHByb3BzLnZwYyxcbiAgICAgIHByb3BzLmlwdjRDaWRyQmxvY2suY2lkcixcbiAgICApO1xuXG4gICAgLy9jaGVjayB3aGV0aGVyIFZQQyBzdXBwb3J0cyBpcHY2XG4gICAgaWYgKHByb3BzLmlwdjZDaWRyQmxvY2s/LmNpZHIpIHtcbiAgICAgIHZhbGlkYXRlU3VwcG9ydElwdjYocHJvcHMudnBjKTtcbiAgICAgIG92ZXJsYXBJcHY2ID0gdmFsaWRhdGVPdmVybGFwcGluZ0NpZHJSYW5nZXNpcHY2KFxuICAgICAgICBwcm9wcy52cGMsXG4gICAgICAgIHByb3BzLmlwdjZDaWRyQmxvY2s/LmNpZHIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChvdmVybGFwIHx8IG92ZXJsYXBJcHY2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ0lEUiBibG9jayBzaG91bGQgbm90IG92ZXJsYXAgd2l0aCBleGlzdGluZyBzdWJuZXQgYmxvY2tzXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5hc3NpZ25JcHY2QWRkcmVzc09uQ3JlYXRpb24gJiYgIXByb3BzLmlwdjZDaWRyQmxvY2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJJUHY2IENJRFIgYmxvY2sgaXMgcmVxdWlyZWQgd2hlbiBhc3NpZ25pbmcgSVB2NiBhZGRyZXNzIG9uIGNyZWF0aW9uXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgdGZTdWJuZXQuU3VibmV0KHRoaXMsIFwiUmVzb3VyY2VcIiwge1xuICAgICAgdnBjSWQ6IHByb3BzLnZwYy52cGNJZCxcbiAgICAgIGNpZHJCbG9jazogaXB2NENpZHJCbG9jayxcbiAgICAgIGlwdjZDaWRyQmxvY2s6IGlwdjZDaWRyQmxvY2ssXG4gICAgICBhdmFpbGFiaWxpdHlab25lOiBwcm9wcy5hdmFpbGFiaWxpdHlab25lLFxuICAgICAgYXNzaWduSXB2NkFkZHJlc3NPbkNyZWF0aW9uOiBwcm9wcy5hc3NpZ25JcHY2QWRkcmVzc09uQ3JlYXRpb24gPz8gZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLm5vZGUuZGVmYXVsdENoaWxkID0gdGhpcy5yZXNvdXJjZTtcbiAgICB0aGlzLmlwdjRDaWRyQmxvY2sgPSBwcm9wcy5pcHY0Q2lkckJsb2NrLmNpZHI7XG4gICAgdGhpcy5pcHY2Q2lkckJsb2NrID0gcHJvcHMuaXB2NkNpZHJCbG9jaz8uY2lkcjtcbiAgICB0aGlzLnN1Ym5ldElkID0gdGhpcy5yZXNvdXJjZS5pZDtcbiAgICB0aGlzLmF2YWlsYWJpbGl0eVpvbmUgPSBwcm9wcy5hdmFpbGFiaWxpdHlab25lO1xuXG4gICAgLy8gVGVycmFmb3JtIHN1Ym5ldCBkb2VzIG5vdCBwcm92aWRlIHRoZSBkZWZhdWx0IEFDTCBOZXR3b3JrQWNsQXNzb2NpYXRpb25JZCBhdHRyaWJ1dGVcbiAgICAvLyB0aGlzLl9uZXR3b3JrQWNsID0gTmV0d29ya0FjbC5mcm9tTmV0d29ya0FjbElkKFxuICAgIC8vICAgdGhpcyxcbiAgICAvLyAgIFwiQWNsXCIsXG4gICAgLy8gICB0aGlzLnJlc291cmNlLk5ldHdvcmtBY2xBc3NvY2lhdGlvbklkLFxuICAgIC8vICk7XG5cbiAgICBpZiAocHJvcHMuc3VibmV0TmFtZSkge1xuICAgICAgVGFncy5vZih0aGlzKS5hZGQoTkFNRV9UQUcsIHN1Ym5ldE5hbWUpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy52cGMudnBjTmFtZSkge1xuICAgICAgVGFncy5vZih0aGlzKS5hZGQoVlBDTkFNRV9UQUcsIHByb3BzLnZwYy52cGNOYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMucm91dGVUYWJsZSkge1xuICAgICAgdGhpcy5fcm91dGVUYWJsZSA9IHByb3BzLnJvdXRlVGFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFzc2lnbmluZyBhIGRlZmF1bHQgcm91dGUgdGFibGVcbiAgICAgIHRoaXMuX3JvdXRlVGFibGUgPSBuZXcgUm91dGVUYWJsZSh0aGlzLCBcIlJvdXRlVGFibGVcIiwge1xuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgcm91dGVUYWJsZU5hbWU6IFwiRGVmYXVsdENES1JvdXRlVGFibGVcIixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJvdXRlQXNzb2MgPSBuZXcgdGZSb3V0ZVRhYmxlQXNzb2NpYXRpb24uUm91dGVUYWJsZUFzc29jaWF0aW9uKFxuICAgICAgdGhpcyxcbiAgICAgIFwiUm91dGVUYWJsZUFzc29jaWF0aW9uXCIsXG4gICAgICB7XG4gICAgICAgIHN1Ym5ldElkOiB0aGlzLnN1Ym5ldElkLFxuICAgICAgICByb3V0ZVRhYmxlSWQ6IHRoaXMucm91dGVUYWJsZS5yb3V0ZVRhYmxlSWQsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLl9pbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkLmFkZChyb3V0ZUFzc29jKTtcblxuICAgIHRoaXMuaW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZCA9XG4gICAgICB0aGlzLl9pbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkO1xuXG4gICAgdGhpcy5zdWJuZXRUeXBlID0gcHJvcHMuc3VibmV0VHlwZTtcbiAgICBzdG9yZVN1Ym5ldFRvVnBjQnlUeXBlKHByb3BzLnZwYywgdGhpcywgcHJvcHMuc3VibmV0VHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzb2NpYXRlIGEgTmV0d29yayBBQ0wgd2l0aCB0aGlzIHN1Ym5ldFxuICAgKlxuICAgKiBAcGFyYW0gaWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGFzc29jaWF0aW9uLlxuICAgKiBAcGFyYW0gbmV0d29ya0FjbCBUaGUgTmV0d29yayBBQ0wgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBzdWJuZXQuXG4gICAqIFRoaXMgYWxsb3dzIGNvbnRyb2xsaW5nIGluYm91bmQgYW5kIG91dGJvdW5kIHRyYWZmaWMgZm9yIGluc3RhbmNlcyBpbiB0aGlzIHN1Ym5ldC5cbiAgICovXG4gIHB1YmxpYyBhc3NvY2lhdGVOZXR3b3JrQWNsKGlkOiBzdHJpbmcsIG5ldHdvcmtBY2w6IElOZXR3b3JrQWNsKSB7XG4gICAgdGhpcy5fbmV0d29ya0FjbCA9IG5ldHdvcmtBY2w7XG5cbiAgICBjb25zdCBzY29wZSA9IG5ldHdvcmtBY2wgaW5zdGFuY2VvZiBDb25zdHJ1Y3QgPyBuZXR3b3JrQWNsIDogdGhpcztcbiAgICBjb25zdCBvdGhlciA9IG5ldHdvcmtBY2wgaW5zdGFuY2VvZiBDb25zdHJ1Y3QgPyB0aGlzIDogbmV0d29ya0FjbDtcbiAgICBuZXcgU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uKHNjb3BlLCBpZCArIEF3c1N0YWNrLnVuaXF1ZUlkKG90aGVyLm5vZGUpLCB7XG4gICAgICBuZXR3b3JrQWNsLFxuICAgICAgc3VibmV0OiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgUm91dGUgVGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3VibmV0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvdXRlVGFibGUoKTogSVJvdXRlVGFibGUge1xuICAgIHJldHVybiB0aGlzLl9yb3V0ZVRhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIE5ldHdvcmsgQUNMIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1Ym5ldC5cbiAgICovXG5cbiAgcHVibGljIGdldCBuZXR3b3JrQWNsKCk6IElOZXR3b3JrQWNsIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBUT0RPOiBzaG91bGQgdGhpcyByZXJ0dXJuIGZyb20gRGF0YVNvdXJjZSBpZiB1bmRlZmluZWQ/XG4gICAgLy8gaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS42OC4wL2RvY3MvZGF0YS1zb3VyY2VzL25ldHdvcmtfYWNsc1xuICAgIHJldHVybiB0aGlzLl9uZXR3b3JrQWNsO1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyByZXF1aXJlZCB0byBpbXBvcnQgYSBzdWJuZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWJuZXRWMkF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIEF2YWlsYWJpbGl0eSBab25lIHRoaXMgc3VibmV0IGlzIGxvY2F0ZWQgaW5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBBWiBpbmZvcm1hdGlvbiwgY2Fubm90IHVzZSBBWiBzZWxlY3Rpb24gZmVhdHVyZXNcbiAgICovXG4gIHJlYWRvbmx5IGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQdjQgQ0lEUiBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHN1Ym5ldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIENJRFIgaW5mb3JtYXRpb24sIGNhbm5vdCB1c2UgQ0lEUiBmaWx0ZXIgZmVhdHVyZXNcbiAgICovXG4gIHJlYWRvbmx5IGlwdjRDaWRyQmxvY2s6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQdjQgQ0lEUiBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHN1Ym5ldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIENJRFIgaW5mb3JtYXRpb24sIGNhbm5vdCB1c2UgQ0lEUiBmaWx0ZXIgZmVhdHVyZXNcbiAgICovXG4gIHJlYWRvbmx5IGlwdjZDaWRyQmxvY2s/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFibGUgZm9yIHRoaXMgcGFydGljdWxhciBzdWJuZXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyByb3V0ZSB0YWJsZSBpbmZvcm1hdGlvbiwgY2Fubm90IGNyZWF0ZSBWUEMgZW5kcG9pbnRzXG4gICAqL1xuICByZWFkb25seSByb3V0ZVRhYmxlSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdWJuZXRJZCBmb3IgdGhpcyBwYXJ0aWN1bGFyIHN1Ym5ldFxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygc3VibmV0IChwdWJsaWMgb3IgcHJpdmF0ZSkgdGhhdCB0aGlzIHN1Ym5ldCByZXByZXNlbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0VHlwZTogU3VibmV0VHlwZTtcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgZ2l2ZW4gc3VibmV0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc3VibmV0IG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldE5hbWU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHN1Ym5ldFR5cGVNYXAgPSB7XG4gIFtTdWJuZXRUeXBlLlBSSVZBVEVfSVNPTEFURURdOiAodnBjOiBJVnBjVjIsIHN1Ym5ldDogU3VibmV0VjIpID0+XG4gICAgdnBjLmlzb2xhdGVkU3VibmV0cy5wdXNoKHN1Ym5ldCksXG4gIFtTdWJuZXRUeXBlLlBVQkxJQ106ICh2cGM6IElWcGNWMiwgc3VibmV0OiBTdWJuZXRWMikgPT5cbiAgICB2cGMucHVibGljU3VibmV0cy5wdXNoKHN1Ym5ldCksXG4gIFtTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1NdOiAodnBjOiBJVnBjVjIsIHN1Ym5ldDogU3VibmV0VjIpID0+XG4gICAgdnBjLnByaXZhdGVTdWJuZXRzLnB1c2goc3VibmV0KSxcbiAgW1N1Ym5ldFR5cGUuSVNPTEFURURdOiAodnBjOiBJVnBjVjIsIHN1Ym5ldDogU3VibmV0VjIpID0+XG4gICAgdnBjLmlzb2xhdGVkU3VibmV0cy5wdXNoKHN1Ym5ldCksXG4gIFtTdWJuZXRUeXBlLlBSSVZBVEVdOiAodnBjOiBJVnBjVjIsIHN1Ym5ldDogU3VibmV0VjIpID0+XG4gICAgdnBjLnByaXZhdGVTdWJuZXRzLnB1c2goc3VibmV0KSxcbiAgW1N1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX05BVF06ICh2cGM6IElWcGNWMiwgc3VibmV0OiBTdWJuZXRWMikgPT5cbiAgICB2cGMucHJpdmF0ZVN1Ym5ldHMucHVzaChzdWJuZXQpLFxufTtcblxuLyoqXG4gKiBTdG9yZXMgdGhlIHByb3ZpZGVkIHN1Ym5ldCBpbiB0aGUgVlBDJ3MgY29sbGVjdGlvbiBvZiBzdWJuZXRzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgc3VibmV0IHR5cGUuXG4gKlxuICogQHBhcmFtIHZwYyBUaGUgVlBDIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBzdWJuZXQgYmVsb25ncy5cbiAqIEBwYXJhbSBzdWJuZXQgVGhlIHN1Ym5ldCBpbnN0YW5jZSB0byBiZSBzdG9yZWQuXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgc3VibmV0IChlLmcuLCBwdWJsaWMsIHByaXZhdGUsIGlzb2xhdGVkKS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBzdG9yZVN1Ym5ldFRvVnBjQnlUeXBlKFxuICB2cGM6IElWcGNWMixcbiAgc3VibmV0OiBTdWJuZXRWMixcbiAgdHlwZTogU3VibmV0VHlwZSxcbikge1xuICBjb25zdCBmaW5kRnVuY3Rpb25UeXBlID0gc3VibmV0VHlwZU1hcFt0eXBlXTtcbiAgaWYgKGZpbmRGdW5jdGlvblR5cGUpIHtcbiAgICBmaW5kRnVuY3Rpb25UeXBlKHZwYywgc3VibmV0KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHN1Ym5ldCB0eXBlOiAke3R5cGV9YCk7XG4gIH1cblxuICAvKipcbiAgICogTmVlZCB0byBzZXQgZXhwbGljaXQgZGVwZW5kZW5jeSBhcyBkdXJpbmcgc3RhY2sgZGVsZXRpb24sXG4gICAqIHRoZSBjaWRyIGJsb2NrcyBtYXkgZ2V0IGRlbGV0ZWQgZmlyc3QgYW5kIHdpbGwgZmFpbCBhcyB0aGUgc3VibmV0cyBhcmUgc3RpbGwgdXNpbmcgdGhlIGNpZHIgYmxvY2tzXG4gICAqL1xuICBpZiAodnBjLnNlY29uZGFyeUNpZHJCbG9jaykge1xuICAgIGZvciAoY29uc3QgY2lkciBvZiB2cGMuc2Vjb25kYXJ5Q2lkckJsb2NrKSB7XG4gICAgICBzdWJuZXQubm9kZS5hZGREZXBlbmRlbmN5KGNpZHIpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBWUEMgc3VwcG9ydHMgSVB2NiBhZGRyZXNzZXMuXG4gKlxuICogQHBhcmFtIHZwYyBUaGUgVlBDIGluc3RhbmNlIHRvIGJlIHZhbGlkYXRlZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIFZQQyBkb2VzIG5vdCBzdXBwb3J0IElQdjYgYWRkcmVzc2VzLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgVlBDIHN1cHBvcnRzIElQdjYgYWRkcmVzc2VzLCBmYWxzZSBvdGhlcndpc2UuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTdXBwb3J0SXB2Nih2cGM6IElWcGNWMikge1xuICBpZiAodnBjLnNlY29uZGFyeUNpZHJCbG9jaykge1xuICAgIGlmIChcbiAgICAgIHZwYy5zZWNvbmRhcnlDaWRyQmxvY2suc29tZShcbiAgICAgICAgKHNlY29uZGFyeUFkZHJlc3MpID0+XG4gICAgICAgICAgc2Vjb25kYXJ5QWRkcmVzcy5hbWF6b25Qcm92aWRlZElwdjZDaWRyQmxvY2sgPT09IHRydWUgfHxcbiAgICAgICAgICBzZWNvbmRhcnlBZGRyZXNzLmlwdjZJcGFtUG9vbElkICE9IHVuZGVmaW5lZCxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUbyB1c2UgSVB2NiwgdGhlIFZQQyBtdXN0IGVuYWJsZSBJUHY2IHN1cHBvcnQuXCIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIENJRFIgcmFuZ2UgZmFsbHMgd2l0aGluIHRoZSBJUCBhZGRyZXNzIHJhbmdlcyBvZiB0aGUgZ2l2ZW4gVlBDLlxuICpcbiAqIEBwYXJhbSB2cGMgVGhlIFZQQyBpbnN0YW5jZSB0byBjaGVjayBhZ2FpbnN0LlxuICogQHBhcmFtIGNpZHJSYW5nZSBUaGUgQ0lEUiByYW5nZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgQ0lEUiByYW5nZSBmYWxscyB3aXRoaW4gdGhlIFZQQydzIElQIGFkZHJlc3MgcmFuZ2VzLCBmYWxzZSBvdGhlcndpc2UuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gY2hlY2tDaWRyUmFuZ2VzKHZwYzogSVZwY1YyLCBjaWRyUmFuZ2U6IHN0cmluZykge1xuICBjb25zdCB2cGNDaWRyQmxvY2sgPSBbdnBjLmlwdjRDaWRyQmxvY2tdO1xuICBjb25zdCBzdWJuZXRDaWRyQmxvY2sgPSBuZXcgQ2lkckJsb2NrKGNpZHJSYW5nZSk7XG4gIGNvbnN0IGFsbENpZHJzOiBDaWRyQmxvY2tbXSA9IFtdO1xuXG4gIC8vIFNlY29uZGFyeSBJUCBhZGRyZXNzZXMgYXNzb2ljYXRlZCB1c2luZyB1c2VyIGRlZmluZWQgSVB2NCByYW5nZVxuICBpZiAodnBjLnNlY29uZGFyeUNpZHJCbG9jaykge1xuICAgIGZvciAoY29uc3QgaXBBZGRyZXNzIG9mIHZwYy5zZWNvbmRhcnlDaWRyQmxvY2spIHtcbiAgICAgIGlmIChpcEFkZHJlc3MuY2lkckJsb2NrKSB7XG4gICAgICAgIHZwY0NpZHJCbG9jay5wdXNoKGlwQWRkcmVzcy5jaWRyQmxvY2spO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjaWRycyA9IHZwY0NpZHJCbG9jay5tYXAoKGNpZHIpID0+IG5ldyBDaWRyQmxvY2soY2lkcikpO1xuICAgIGFsbENpZHJzLnB1c2goLi4uY2lkcnMpO1xuICB9XG5cbiAgLy8gU2Vjb25kYXJ5IElQIGFkZHJlc3NlcyBhc3NvaWNhdGVkIHVzaW5nIElQQU0gSVB2NCByYW5nZVxuICBpZiAodnBjLmlwdjRJcGFtUHJvdmlzaW9uZWRDaWRycykge1xuICAgIGNvbnN0IGNpZHJzID0gdnBjLmlwdjRJcGFtUHJvdmlzaW9uZWRDaWRycy5tYXAoXG4gICAgICAoY2lkcikgPT4gbmV3IENpZHJCbG9jayhjaWRyKSxcbiAgICApO1xuICAgIGFsbENpZHJzLnB1c2goLi4uY2lkcnMpO1xuICB9XG5cbiAgLy8gSWYgbm8gSVB2NCBpcyBhc3NpZ25lZCBhcyBzZWNvbmRhcnkgYWRkcmVzc1xuICBpZiAoYWxsQ2lkcnMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc2Vjb25kYXJ5IElQIGFkZHJlc3MgYXR0YWNoZWQgdG8gVlBDXCIpO1xuICB9XG5cbiAgcmV0dXJuIGFsbENpZHJzLnNvbWUoKGMpID0+IGMuY29udGFpbnNDaWRyKHN1Ym5ldENpZHJCbG9jaykpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBpZiB0aGUgcHJvdmlkZWQgSVB2NCBDSURSIGJsb2NrIG92ZXJsYXBzIHdpdGggZXhpc3Rpbmcgc3VibmV0IENJRFIgYmxvY2tzIHdpdGhpbiB0aGUgZ2l2ZW4gVlBDLlxuICpcbiAqIEBwYXJhbSB2cGMgVGhlIFZQQyBpbnN0YW5jZSB0byBjaGVjayBhZ2FpbnN0LlxuICogQHBhcmFtIGlwdjRDaWRyQmxvY2sgVGhlIElQdjQgQ0lEUiBibG9jayB0byBiZSB2YWxpZGF0ZWQuXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBJUHY0IENJRFIgYmxvY2sgb3ZlcmxhcHMgd2l0aCBleGlzdGluZyBzdWJuZXQgQ0lEUiBibG9ja3MsIGZhbHNlIG90aGVyd2lzZS5cbiAqIEBpbnRlcm5hbFxuICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlT3ZlcmxhcHBpbmdDaWRyUmFuZ2VzKFxuICB2cGM6IElWcGNWMixcbiAgaXB2NENpZHJCbG9jazogc3RyaW5nLFxuKTogYm9vbGVhbiB7XG4gIGxldCBhbGxTdWJuZXRzOiBJU3VibmV0VjJbXTtcbiAgdHJ5IHtcbiAgICBhbGxTdWJuZXRzID0gdnBjLnNlbGVjdFN1Ym5ldHMoKS5zdWJuZXRzO1xuICB9IGNhdGNoIChlKSB7XG4gICAgKFwiTm8gc3VibmV0cyBpbiBWUENcIik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaXBNYXA6IFtzdHJpbmcsIHN0cmluZ11bXSA9IG5ldyBBcnJheSgpO1xuXG4gIGNvbnN0IGlucHV0UmFuZ2UgPSBuZXcgQ2lkckJsb2NrKGlwdjRDaWRyQmxvY2spO1xuXG4gIGNvbnN0IGlucHV0SXBNYXA6IFtzdHJpbmcsIHN0cmluZ10gPSBbaW5wdXRSYW5nZS5taW5JcCgpLCBpbnB1dFJhbmdlLm1heElwKCldO1xuXG4gIGZvciAoY29uc3Qgc3VibmV0IG9mIGFsbFN1Ym5ldHMpIHtcbiAgICBjb25zdCBjaWRyQmxvY2sgPSBuZXcgQ2lkckJsb2NrKHN1Ym5ldC5pcHY0Q2lkckJsb2NrKTtcbiAgICBpcE1hcC5wdXNoKFtjaWRyQmxvY2subWluSXAoKSwgY2lkckJsb2NrLm1heElwKCldKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcmFuZ2Ugb2YgaXBNYXApIHtcbiAgICBpZiAoaW5wdXRSYW5nZS5yYW5nZXNPdmVybGFwKHJhbmdlLCBpbnB1dElwTWFwKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBpZiB0aGUgcHJvdmlkZWQgSVB2NiBDSURSIGJsb2NrIG92ZXJsYXBzIHdpdGggZXhpc3Rpbmcgc3VibmV0IENJRFIgYmxvY2tzIHdpdGhpbiB0aGUgZ2l2ZW4gVlBDLlxuICpcbiAqIEBwYXJhbSB2cGMgVGhlIFZQQyBpbnN0YW5jZSB0byBjaGVjayBhZ2FpbnN0LlxuICogQHBhcmFtIGlwdjZDaWRyQmxvY2sgVGhlIElQdjYgQ0lEUiBibG9jayB0byBiZSB2YWxpZGF0ZWQuXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBJUHY2IENJRFIgYmxvY2sgb3ZlcmxhcHMgd2l0aCBleGlzdGluZyBzdWJuZXQgQ0lEUiBibG9ja3MsIGZhbHNlIG90aGVyd2lzZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgbm8gc3VibmV0cyBhcmUgZm91bmQgaW4gdGhlIFZQQy5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU92ZXJsYXBwaW5nQ2lkclJhbmdlc2lwdjYoXG4gIHZwYzogSVZwY1YyLFxuICBpcHY2Q2lkckJsb2NrOiBzdHJpbmcsXG4pOiBib29sZWFuIHtcbiAgbGV0IGFsbFN1Ym5ldHM6IElTdWJuZXRWMltdO1xuICB0cnkge1xuICAgIGFsbFN1Ym5ldHMgPSB2cGMuc2VsZWN0U3VibmV0cygpLnN1Ym5ldHM7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAoXCJObyBzdWJuZXRzIGluIFZQQ1wiKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBpcHY2TWFwOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0IGlucHV0UmFuZ2UgPSBuZXcgQ2lkckJsb2NrSXB2NihpcHY2Q2lkckJsb2NrKTtcblxuICBsZXQgcmVzdWx0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBzdWJuZXQgb2YgYWxsU3VibmV0cykge1xuICAgIGlmIChzdWJuZXQuaXB2NkNpZHJCbG9jaykge1xuICAgICAgY29uc3QgY2lkckJsb2NrID0gbmV3IENpZHJCbG9ja0lwdjYoc3VibmV0LmlwdjZDaWRyQmxvY2spO1xuICAgICAgaXB2Nk1hcC5wdXNoKGNpZHJCbG9jay5jaWRyKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHJhbmdlIG9mIGlwdjZNYXApIHtcbiAgICBpZiAoaW5wdXRSYW5nZS5yYW5nZXNPdmVybGFwKHJhbmdlLCBpbnB1dFJhbmdlLmNpZHIpKSB7XG4gICAgICByZXN1bHQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=
@@ -0,0 +1,37 @@
1
+ import { ISubnet } from "./vpc";
2
+ /**
3
+ * Contains logic which chooses a set of subnets from a larger list, in conjunction
4
+ * with SubnetSelection, to determine where to place AWS resources such as VPC
5
+ * endpoints, EC2 instances, etc.
6
+ */
7
+ export declare abstract class SubnetFilter {
8
+ /**
9
+ * Chooses subnets by id.
10
+ */
11
+ static byIds(subnetIds: string[]): SubnetFilter;
12
+ /**
13
+ * Chooses subnets which are in one of the given availability zones.
14
+ */
15
+ static availabilityZones(availabilityZones: string[]): SubnetFilter;
16
+ /**
17
+ * Chooses subnets such that there is at most one per availability zone.
18
+ */
19
+ static onePerAz(): SubnetFilter;
20
+ /**
21
+ * Chooses subnets which contain any of the specified IP addresses.
22
+ */
23
+ static containsIpAddresses(ipv4addrs: string[]): SubnetFilter;
24
+ /**
25
+ * Chooses subnets which have the provided CIDR netmask.
26
+ */
27
+ static byCidrMask(mask: number): SubnetFilter;
28
+ /**
29
+ * Chooses subnets which are inside any of the specified CIDR range.
30
+ * @param cidrs List of CIDR ranges to filter subnets from
31
+ */
32
+ static byCidrRanges(cidrs: string[]): SubnetFilter;
33
+ /**
34
+ * Executes the subnet filtering logic, returning a filtered set of subnets.
35
+ */
36
+ selectSubnets(_subnets: ISubnet[]): ISubnet[];
37
+ }