terraconstructs 0.0.8

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 (680) hide show
  1. package/.envrc +5 -0
  2. package/.jsii +79780 -0
  3. package/.mise.toml +8 -0
  4. package/.nvmrc +1 -0
  5. package/.terraform-version +1 -0
  6. package/.terraform.d/plugin-cache/.gitignore +5 -0
  7. package/LICENSE +674 -0
  8. package/NOTICE.txt +12 -0
  9. package/README.md +42 -0
  10. package/bun.lockb +0 -0
  11. package/go.mod +158 -0
  12. package/go.sum +1206 -0
  13. package/lib/aws/arn.d.ts +187 -0
  14. package/lib/aws/arn.js +383 -0
  15. package/lib/aws/aws-construct.d.ts +76 -0
  16. package/lib/aws/aws-construct.js +38 -0
  17. package/lib/aws/aws-stack.d.ts +201 -0
  18. package/lib/aws/aws-stack.js +303 -0
  19. package/lib/aws/cloudwatch/actions/ec2.d.ts +35 -0
  20. package/lib/aws/cloudwatch/actions/ec2.js +48 -0
  21. package/lib/aws/cloudwatch/actions/index.d.ts +2 -0
  22. package/lib/aws/cloudwatch/actions/index.js +24 -0
  23. package/lib/aws/cloudwatch/actions/lambda.d.ts +16 -0
  24. package/lib/aws/cloudwatch/actions/lambda.js +48 -0
  25. package/lib/aws/cloudwatch/alarm-action.d.ts +23 -0
  26. package/lib/aws/cloudwatch/alarm-action.js +4 -0
  27. package/lib/aws/cloudwatch/alarm-base.d.ts +84 -0
  28. package/lib/aws/cloudwatch/alarm-base.js +64 -0
  29. package/lib/aws/cloudwatch/alarm-rule.d.ts +61 -0
  30. package/lib/aws/cloudwatch/alarm-rule.js +116 -0
  31. package/lib/aws/cloudwatch/alarm-status-widget.d.ts +77 -0
  32. package/lib/aws/cloudwatch/alarm-status-widget.js +62 -0
  33. package/lib/aws/cloudwatch/alarm.d.ts +158 -0
  34. package/lib/aws/cloudwatch/alarm.js +410 -0
  35. package/lib/aws/cloudwatch/composite-alarm.d.ts +88 -0
  36. package/lib/aws/cloudwatch/composite-alarm.js +98 -0
  37. package/lib/aws/cloudwatch/dashboard.d.ts +137 -0
  38. package/lib/aws/cloudwatch/dashboard.js +141 -0
  39. package/lib/aws/cloudwatch/data-protection-policy.d.ts +184 -0
  40. package/lib/aws/cloudwatch/data-protection-policy.js +246 -0
  41. package/lib/aws/cloudwatch/graph.d.ts +792 -0
  42. package/lib/aws/cloudwatch/graph.js +537 -0
  43. package/lib/aws/cloudwatch/index.d.ts +26 -0
  44. package/lib/aws/cloudwatch/index.js +49 -0
  45. package/lib/aws/cloudwatch/layout.d.ts +89 -0
  46. package/lib/aws/cloudwatch/layout.js +147 -0
  47. package/lib/aws/cloudwatch/log-destinations/index.d.ts +2 -0
  48. package/lib/aws/cloudwatch/log-destinations/index.js +20 -0
  49. package/lib/aws/cloudwatch/log-destinations/kinesis.d.ts +29 -0
  50. package/lib/aws/cloudwatch/log-destinations/kinesis.js +52 -0
  51. package/lib/aws/cloudwatch/log-destinations/lambda.d.ts +22 -0
  52. package/lib/aws/cloudwatch/log-destinations/lambda.js +46 -0
  53. package/lib/aws/cloudwatch/log-group.d.ts +453 -0
  54. package/lib/aws/cloudwatch/log-group.js +350 -0
  55. package/lib/aws/cloudwatch/log-query.d.ts +91 -0
  56. package/lib/aws/cloudwatch/log-query.js +85 -0
  57. package/lib/aws/cloudwatch/log-stream.d.ts +57 -0
  58. package/lib/aws/cloudwatch/log-stream.js +57 -0
  59. package/lib/aws/cloudwatch/metric-filter.d.ts +30 -0
  60. package/lib/aws/cloudwatch/metric-filter.js +69 -0
  61. package/lib/aws/cloudwatch/metric-types.d.ts +407 -0
  62. package/lib/aws/cloudwatch/metric-types.js +151 -0
  63. package/lib/aws/cloudwatch/metric.d.ts +492 -0
  64. package/lib/aws/cloudwatch/metric.js +493 -0
  65. package/lib/aws/cloudwatch/pattern.d.ts +195 -0
  66. package/lib/aws/cloudwatch/pattern.js +412 -0
  67. package/lib/aws/cloudwatch/policy.d.ts +43 -0
  68. package/lib/aws/cloudwatch/policy.js +50 -0
  69. package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.d.ts +14 -0
  70. package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.js +37 -0
  71. package/lib/aws/cloudwatch/private/env-tokens.d.ts +8 -0
  72. package/lib/aws/cloudwatch/private/env-tokens.js +48 -0
  73. package/lib/aws/cloudwatch/private/metric-util.d.ts +60 -0
  74. package/lib/aws/cloudwatch/private/metric-util.js +132 -0
  75. package/lib/aws/cloudwatch/private/object.d.ts +1 -0
  76. package/lib/aws/cloudwatch/private/object.js +18 -0
  77. package/lib/aws/cloudwatch/private/rendering.d.ts +60 -0
  78. package/lib/aws/cloudwatch/private/rendering.js +181 -0
  79. package/lib/aws/cloudwatch/private/statistic.d.ts +51 -0
  80. package/lib/aws/cloudwatch/private/statistic.js +176 -0
  81. package/lib/aws/cloudwatch/query-definition.d.ts +150 -0
  82. package/lib/aws/cloudwatch/query-definition.js +114 -0
  83. package/lib/aws/cloudwatch/stats.d.ts +150 -0
  84. package/lib/aws/cloudwatch/stats.js +207 -0
  85. package/lib/aws/cloudwatch/subscription-filter.d.ts +75 -0
  86. package/lib/aws/cloudwatch/subscription-filter.js +51 -0
  87. package/lib/aws/cloudwatch/text.d.ts +52 -0
  88. package/lib/aws/cloudwatch/text.js +53 -0
  89. package/lib/aws/cloudwatch/variable.d.ts +156 -0
  90. package/lib/aws/cloudwatch/variable.js +156 -0
  91. package/lib/aws/cloudwatch/widget.d.ts +62 -0
  92. package/lib/aws/cloudwatch/widget.js +45 -0
  93. package/lib/aws/compute/activity.d.ts +81 -0
  94. package/lib/aws/compute/activity.js +132 -0
  95. package/lib/aws/compute/architecture.d.ts +33 -0
  96. package/lib/aws/compute/architecture.js +42 -0
  97. package/lib/aws/compute/chain.d.ts +52 -0
  98. package/lib/aws/compute/chain.js +68 -0
  99. package/lib/aws/compute/condition.d.ts +202 -0
  100. package/lib/aws/compute/condition.js +409 -0
  101. package/lib/aws/compute/event-invoke-config.d.ts +74 -0
  102. package/lib/aws/compute/event-invoke-config.js +63 -0
  103. package/lib/aws/compute/event-source-filter.d.ts +64 -0
  104. package/lib/aws/compute/event-source-filter.js +86 -0
  105. package/lib/aws/compute/event-source-mapping.d.ts +310 -0
  106. package/lib/aws/compute/event-source-mapping.js +267 -0
  107. package/lib/aws/compute/event-sources/index.d.ts +4 -0
  108. package/lib/aws/compute/event-sources/index.js +28 -0
  109. package/lib/aws/compute/event-sources/s3-onfailure-destination.d.ts +13 -0
  110. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +26 -0
  111. package/lib/aws/compute/event-sources/s3.d.ts +24 -0
  112. package/lib/aws/compute/event-sources/s3.js +25 -0
  113. package/lib/aws/compute/event-sources/sqs-dlq.d.ts +13 -0
  114. package/lib/aws/compute/event-sources/sqs-dlq.js +26 -0
  115. package/lib/aws/compute/event-sources/sqs.d.ts +75 -0
  116. package/lib/aws/compute/event-sources/sqs.js +84 -0
  117. package/lib/aws/compute/fields.d.ts +367 -0
  118. package/lib/aws/compute/fields.js +546 -0
  119. package/lib/aws/compute/function-alias.d.ts +148 -0
  120. package/lib/aws/compute/function-alias.js +176 -0
  121. package/lib/aws/compute/function-base.d.ts +314 -0
  122. package/lib/aws/compute/function-base.js +421 -0
  123. package/lib/aws/compute/function-destination.d.ts +42 -0
  124. package/lib/aws/compute/function-destination.js +18 -0
  125. package/lib/aws/compute/function-destinations/event-bridge.d.ts +19 -0
  126. package/lib/aws/compute/function-destinations/event-bridge.js +46 -0
  127. package/lib/aws/compute/function-destinations/function.d.ts +34 -0
  128. package/lib/aws/compute/function-destinations/function.js +55 -0
  129. package/lib/aws/compute/function-destinations/index.d.ts +3 -0
  130. package/lib/aws/compute/function-destinations/index.js +22 -0
  131. package/lib/aws/compute/function-destinations/sqs.d.ts +14 -0
  132. package/lib/aws/compute/function-destinations/sqs.js +27 -0
  133. package/lib/aws/compute/function-nodejs.d.ts +55 -0
  134. package/lib/aws/compute/function-nodejs.js +70 -0
  135. package/lib/aws/compute/function-permission.d.ts +83 -0
  136. package/lib/aws/compute/function-permission.js +3 -0
  137. package/lib/aws/compute/function-url.d.ts +210 -0
  138. package/lib/aws/compute/function-url.js +148 -0
  139. package/lib/aws/compute/function-vpc-config.generated.d.ts +36 -0
  140. package/lib/aws/compute/function-vpc-config.generated.js +3 -0
  141. package/lib/aws/compute/function.d.ts +492 -0
  142. package/lib/aws/compute/function.js +692 -0
  143. package/lib/aws/compute/index.d.ts +42 -0
  144. package/lib/aws/compute/index.js +64 -0
  145. package/lib/aws/compute/private/intrinstics.d.ts +86 -0
  146. package/lib/aws/compute/private/intrinstics.js +220 -0
  147. package/lib/aws/compute/private/json-path.d.ts +57 -0
  148. package/lib/aws/compute/private/json-path.js +351 -0
  149. package/lib/aws/compute/private/util.d.ts +1 -0
  150. package/lib/aws/compute/private/util.js +38 -0
  151. package/lib/aws/compute/state-graph.d.ts +100 -0
  152. package/lib/aws/compute/state-graph.js +177 -0
  153. package/lib/aws/compute/state-machine-fragment.d.ts +61 -0
  154. package/lib/aws/compute/state-machine-fragment.js +56 -0
  155. package/lib/aws/compute/state-machine.d.ts +323 -0
  156. package/lib/aws/compute/state-machine.js +392 -0
  157. package/lib/aws/compute/states/choice.d.ts +94 -0
  158. package/lib/aws/compute/states/choice.js +81 -0
  159. package/lib/aws/compute/states/custom-state.d.ts +55 -0
  160. package/lib/aws/compute/states/custom-state.js +114 -0
  161. package/lib/aws/compute/states/distributed-map/item-batcher.d.ts +64 -0
  162. package/lib/aws/compute/states/distributed-map/item-batcher.js +58 -0
  163. package/lib/aws/compute/states/distributed-map/item-reader.d.ts +256 -0
  164. package/lib/aws/compute/states/distributed-map/item-reader.js +253 -0
  165. package/lib/aws/compute/states/distributed-map/result-writer.d.ts +41 -0
  166. package/lib/aws/compute/states/distributed-map/result-writer.js +66 -0
  167. package/lib/aws/compute/states/distributed-map.d.ts +153 -0
  168. package/lib/aws/compute/states/distributed-map.js +207 -0
  169. package/lib/aws/compute/states/fail.d.ts +74 -0
  170. package/lib/aws/compute/states/fail.js +83 -0
  171. package/lib/aws/compute/states/map-base.d.ts +145 -0
  172. package/lib/aws/compute/states/map-base.js +109 -0
  173. package/lib/aws/compute/states/map.d.ts +76 -0
  174. package/lib/aws/compute/states/map.js +110 -0
  175. package/lib/aws/compute/states/parallel.d.ts +113 -0
  176. package/lib/aws/compute/states/parallel.js +100 -0
  177. package/lib/aws/compute/states/pass.d.ts +122 -0
  178. package/lib/aws/compute/states/pass.js +99 -0
  179. package/lib/aws/compute/states/private/state-type.d.ts +13 -0
  180. package/lib/aws/compute/states/private/state-type.js +19 -0
  181. package/lib/aws/compute/states/state.d.ts +276 -0
  182. package/lib/aws/compute/states/state.js +482 -0
  183. package/lib/aws/compute/states/succeed.d.ts +51 -0
  184. package/lib/aws/compute/states/succeed.js +32 -0
  185. package/lib/aws/compute/states/task-base.d.ts +225 -0
  186. package/lib/aws/compute/states/task-base.js +160 -0
  187. package/lib/aws/compute/states/task.d.ts +127 -0
  188. package/lib/aws/compute/states/task.js +92 -0
  189. package/lib/aws/compute/states/wait.d.ts +78 -0
  190. package/lib/aws/compute/states/wait.js +90 -0
  191. package/lib/aws/compute/step-functions-task.d.ts +78 -0
  192. package/lib/aws/compute/step-functions-task.js +27 -0
  193. package/lib/aws/compute/task-credentials.d.ts +45 -0
  194. package/lib/aws/compute/task-credentials.js +52 -0
  195. package/lib/aws/compute/task-input.d.ts +86 -0
  196. package/lib/aws/compute/task-input.js +107 -0
  197. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.d.ts +73 -0
  198. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +69 -0
  199. package/lib/aws/compute/tasks/eventbridge/put-events.d.ts +74 -0
  200. package/lib/aws/compute/tasks/eventbridge/put-events.js +94 -0
  201. package/lib/aws/compute/tasks/http/invoke.d.ts +104 -0
  202. package/lib/aws/compute/tasks/http/invoke.js +117 -0
  203. package/lib/aws/compute/tasks/index.d.ts +7 -0
  204. package/lib/aws/compute/tasks/index.js +42 -0
  205. package/lib/aws/compute/tasks/lambda/invoke.d.ts +106 -0
  206. package/lib/aws/compute/tasks/lambda/invoke.js +125 -0
  207. package/lib/aws/compute/tasks/private/task-utils.d.ts +8 -0
  208. package/lib/aws/compute/tasks/private/task-utils.js +36 -0
  209. package/lib/aws/compute/tasks/resource-arn-suffix.d.ts +3 -0
  210. package/lib/aws/compute/tasks/resource-arn-suffix.js +25 -0
  211. package/lib/aws/compute/tasks/sqs/send-message.d.ts +62 -0
  212. package/lib/aws/compute/tasks/sqs/send-message.js +70 -0
  213. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.d.ts +36 -0
  214. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +45 -0
  215. package/lib/aws/compute/tasks/stepfunctions/start-execution.d.ts +63 -0
  216. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +123 -0
  217. package/lib/aws/compute/types.d.ts +214 -0
  218. package/lib/aws/compute/types.js +103 -0
  219. package/lib/aws/compute/util.d.ts +12 -0
  220. package/lib/aws/compute/util.js +29 -0
  221. package/lib/aws/edge/certificate.d.ts +144 -0
  222. package/lib/aws/edge/certificate.js +191 -0
  223. package/lib/aws/edge/distribution.d.ts +505 -0
  224. package/lib/aws/edge/distribution.js +444 -0
  225. package/lib/aws/edge/dns-alias-record-targets.d.ts +29 -0
  226. package/lib/aws/edge/dns-alias-record-targets.js +46 -0
  227. package/lib/aws/edge/dns-record.d.ts +536 -0
  228. package/lib/aws/edge/dns-record.js +532 -0
  229. package/lib/aws/edge/dns-zone.d.ts +169 -0
  230. package/lib/aws/edge/dns-zone.js +149 -0
  231. package/lib/aws/edge/function.d.ts +185 -0
  232. package/lib/aws/edge/function.js +141 -0
  233. package/lib/aws/edge/index.d.ts +8 -0
  234. package/lib/aws/edge/index.js +25 -0
  235. package/lib/aws/edge/key-value-store.d.ts +162 -0
  236. package/lib/aws/edge/key-value-store.js +163 -0
  237. package/lib/aws/edge/origin.d.ts +160 -0
  238. package/lib/aws/edge/origin.js +245 -0
  239. package/lib/aws/encryption/alias.d.ts +137 -0
  240. package/lib/aws/encryption/alias.js +216 -0
  241. package/lib/aws/encryption/index.d.ts +4 -0
  242. package/lib/aws/encryption/index.js +21 -0
  243. package/lib/aws/encryption/key-lookup.d.ts +11 -0
  244. package/lib/aws/encryption/key-lookup.js +4 -0
  245. package/lib/aws/encryption/key.d.ts +461 -0
  246. package/lib/aws/encryption/key.js +586 -0
  247. package/lib/aws/encryption/private/perms.d.ts +5 -0
  248. package/lib/aws/encryption/private/perms.js +30 -0
  249. package/lib/aws/encryption/via-service-principal.d.ts +11 -0
  250. package/lib/aws/encryption/via-service-principal.js +39 -0
  251. package/lib/aws/iam/grant.d.ts +221 -0
  252. package/lib/aws/iam/grant.js +239 -0
  253. package/lib/aws/iam/identity-base.d.ts +20 -0
  254. package/lib/aws/iam/identity-base.js +3 -0
  255. package/lib/aws/iam/index.d.ts +16 -0
  256. package/lib/aws/iam/index.js +34 -0
  257. package/lib/aws/iam/managed-policy.d.ts +227 -0
  258. package/lib/aws/iam/managed-policy.js +237 -0
  259. package/lib/aws/iam/oidc-provider.d.ts +120 -0
  260. package/lib/aws/iam/oidc-provider.js +82 -0
  261. package/lib/aws/iam/policy-document-config.generated.d.ts +78 -0
  262. package/lib/aws/iam/policy-document-config.generated.js +3 -0
  263. package/lib/aws/iam/policy-document.d.ts +150 -0
  264. package/lib/aws/iam/policy-document.js +172 -0
  265. package/lib/aws/iam/policy-statement-props.generated.d.ts +55 -0
  266. package/lib/aws/iam/policy-statement-props.generated.js +3 -0
  267. package/lib/aws/iam/policy-statement.d.ts +451 -0
  268. package/lib/aws/iam/policy-statement.js +947 -0
  269. package/lib/aws/iam/policy.d.ts +122 -0
  270. package/lib/aws/iam/policy.js +192 -0
  271. package/lib/aws/iam/principals.d.ts +668 -0
  272. package/lib/aws/iam/principals.js +1032 -0
  273. package/lib/aws/iam/private/adapter.d.ts +21 -0
  274. package/lib/aws/iam/private/adapter.js +51 -0
  275. package/lib/aws/iam/private/assume-role-policy.d.ts +8 -0
  276. package/lib/aws/iam/private/assume-role-policy.js +27 -0
  277. package/lib/aws/iam/private/comparable-principal.d.ts +6 -0
  278. package/lib/aws/iam/private/comparable-principal.js +20 -0
  279. package/lib/aws/iam/private/immutable-role.d.ts +43 -0
  280. package/lib/aws/iam/private/immutable-role.js +76 -0
  281. package/lib/aws/iam/private/imported-role.d.ts +49 -0
  282. package/lib/aws/iam/private/imported-role.js +103 -0
  283. package/lib/aws/iam/private/merge-statements.d.ts +44 -0
  284. package/lib/aws/iam/private/merge-statements.js +214 -0
  285. package/lib/aws/iam/private/postprocess-policy-document.d.ts +15 -0
  286. package/lib/aws/iam/private/postprocess-policy-document.js +102 -0
  287. package/lib/aws/iam/private/util.d.ts +37 -0
  288. package/lib/aws/iam/private/util.js +87 -0
  289. package/lib/aws/iam/role.d.ts +425 -0
  290. package/lib/aws/iam/role.js +407 -0
  291. package/lib/aws/iam/saml-provider.d.ts +79 -0
  292. package/lib/aws/iam/saml-provider.js +79 -0
  293. package/lib/aws/iam/unknown-principal.d.ts +32 -0
  294. package/lib/aws/iam/unknown-principal.js +45 -0
  295. package/lib/aws/iam/utils.d.ts +12 -0
  296. package/lib/aws/iam/utils.js +41 -0
  297. package/lib/aws/index.d.ts +13 -0
  298. package/lib/aws/index.js +34 -0
  299. package/lib/aws/log-retention.d.ts +97 -0
  300. package/lib/aws/log-retention.js +103 -0
  301. package/lib/aws/network/index.d.ts +4 -0
  302. package/lib/aws/network/index.js +21 -0
  303. package/lib/aws/network/network.d.ts +77 -0
  304. package/lib/aws/network/network.js +3 -0
  305. package/lib/aws/network/simple-ipv4-vpc.d.ts +84 -0
  306. package/lib/aws/network/simple-ipv4-vpc.js +236 -0
  307. package/lib/aws/network/subnet-group.d.ts +42 -0
  308. package/lib/aws/network/subnet-group.js +72 -0
  309. package/lib/aws/network/subnet.d.ts +95 -0
  310. package/lib/aws/network/subnet.js +123 -0
  311. package/lib/aws/notify/archive.d.ts +77 -0
  312. package/lib/aws/notify/archive.js +62 -0
  313. package/lib/aws/notify/connection.d.ts +276 -0
  314. package/lib/aws/notify/connection.js +261 -0
  315. package/lib/aws/notify/event-bus.d.ts +298 -0
  316. package/lib/aws/notify/event-bus.js +326 -0
  317. package/lib/aws/notify/event-pattern.d.ts +220 -0
  318. package/lib/aws/notify/event-pattern.js +197 -0
  319. package/lib/aws/notify/index.d.ts +15 -0
  320. package/lib/aws/notify/index.js +35 -0
  321. package/lib/aws/notify/input.d.ts +126 -0
  322. package/lib/aws/notify/input.js +282 -0
  323. package/lib/aws/notify/kinesis-canned-metrics.generated.d.ts +68 -0
  324. package/lib/aws/notify/kinesis-canned-metrics.generated.js +103 -0
  325. package/lib/aws/notify/kinesis-fixed-canned-metrics.d.ts +195 -0
  326. package/lib/aws/notify/kinesis-fixed-canned-metrics.js +155 -0
  327. package/lib/aws/notify/kinesis-stream.d.ts +705 -0
  328. package/lib/aws/notify/kinesis-stream.js +541 -0
  329. package/lib/aws/notify/on-event-options.d.ts +54 -0
  330. package/lib/aws/notify/on-event-options.js +3 -0
  331. package/lib/aws/notify/queue-config.generated.d.ts +85 -0
  332. package/lib/aws/notify/queue-config.generated.js +3 -0
  333. package/lib/aws/notify/queue-policy.d.ts +35 -0
  334. package/lib/aws/notify/queue-policy.js +39 -0
  335. package/lib/aws/notify/queue.d.ts +355 -0
  336. package/lib/aws/notify/queue.js +305 -0
  337. package/lib/aws/notify/resource-policy.d.ts +41 -0
  338. package/lib/aws/notify/resource-policy.js +43 -0
  339. package/lib/aws/notify/rule.d.ts +153 -0
  340. package/lib/aws/notify/rule.js +227 -0
  341. package/lib/aws/notify/schedule.d.ts +83 -0
  342. package/lib/aws/notify/schedule.js +116 -0
  343. package/lib/aws/notify/target.d.ts +102 -0
  344. package/lib/aws/notify/target.js +3 -0
  345. package/lib/aws/notify/targets/event-bus.d.ts +39 -0
  346. package/lib/aws/notify/targets/event-bus.js +40 -0
  347. package/lib/aws/notify/targets/function.d.ts +31 -0
  348. package/lib/aws/notify/targets/function.js +36 -0
  349. package/lib/aws/notify/targets/index.d.ts +6 -0
  350. package/lib/aws/notify/targets/index.js +37 -0
  351. package/lib/aws/notify/targets/log-group.d.ts +89 -0
  352. package/lib/aws/notify/targets/log-group.js +110 -0
  353. package/lib/aws/notify/targets/sqs.d.ts +45 -0
  354. package/lib/aws/notify/targets/sqs.js +73 -0
  355. package/lib/aws/notify/targets/state-machine.d.ts +36 -0
  356. package/lib/aws/notify/targets/state-machine.js +39 -0
  357. package/lib/aws/notify/targets/util.d.ts +71 -0
  358. package/lib/aws/notify/targets/util.js +130 -0
  359. package/lib/aws/notify/util.d.ts +13 -0
  360. package/lib/aws/notify/util.js +69 -0
  361. package/lib/aws/provider-config.generated.d.ts +220 -0
  362. package/lib/aws/provider-config.generated.js +3 -0
  363. package/lib/aws/storage/bucket-destination.d.ts +41 -0
  364. package/lib/aws/storage/bucket-destination.js +13 -0
  365. package/lib/aws/storage/bucket-notifications.d.ts +58 -0
  366. package/lib/aws/storage/bucket-notifications.js +169 -0
  367. package/lib/aws/storage/bucket-perms.d.ts +9 -0
  368. package/lib/aws/storage/bucket-perms.js +33 -0
  369. package/lib/aws/storage/bucket-policy.d.ts +51 -0
  370. package/lib/aws/storage/bucket-policy.js +53 -0
  371. package/lib/aws/storage/bucket-source.d.ts +41 -0
  372. package/lib/aws/storage/bucket-source.js +79 -0
  373. package/lib/aws/storage/bucket.d.ts +941 -0
  374. package/lib/aws/storage/bucket.js +869 -0
  375. package/lib/aws/storage/cors-config.generated.d.ts +57 -0
  376. package/lib/aws/storage/cors-config.generated.js +3 -0
  377. package/lib/aws/storage/cors-rule-config.generated.d.ts +38 -0
  378. package/lib/aws/storage/cors-rule-config.generated.js +3 -0
  379. package/lib/aws/storage/index.d.ts +12 -0
  380. package/lib/aws/storage/index.js +31 -0
  381. package/lib/aws/storage/lifecycle-config.generated.d.ts +55 -0
  382. package/lib/aws/storage/lifecycle-config.generated.js +3 -0
  383. package/lib/aws/storage/notification-targets/function.d.ts +11 -0
  384. package/lib/aws/storage/notification-targets/function.js +48 -0
  385. package/lib/aws/storage/notification-targets/index.d.ts +2 -0
  386. package/lib/aws/storage/notification-targets/index.js +21 -0
  387. package/lib/aws/storage/notification-targets/queue.d.ts +15 -0
  388. package/lib/aws/storage/notification-targets/queue.js +58 -0
  389. package/lib/aws/storage/origin-access-identity.d.ts +91 -0
  390. package/lib/aws/storage/origin-access-identity.js +76 -0
  391. package/lib/aws/storage/util.d.ts +40 -0
  392. package/lib/aws/storage/util.js +85 -0
  393. package/lib/aws/storage/website-config.generated.d.ts +73 -0
  394. package/lib/aws/storage/website-config.generated.js +3 -0
  395. package/lib/aws/util.d.ts +4 -0
  396. package/lib/aws/util.js +25 -0
  397. package/lib/construct-base.d.ts +69 -0
  398. package/lib/construct-base.js +89 -0
  399. package/lib/duration.d.ts +160 -0
  400. package/lib/duration.js +327 -0
  401. package/lib/index.d.ts +5 -0
  402. package/lib/index.js +24 -0
  403. package/lib/private/index.d.ts +2 -0
  404. package/lib/private/index.js +19 -0
  405. package/lib/private/terraform-dependables-aspect.d.ts +20 -0
  406. package/lib/private/terraform-dependables-aspect.js +95 -0
  407. package/lib/private/unique-resource-name.d.ts +9 -0
  408. package/lib/private/unique-resource-name.js +145 -0
  409. package/lib/size.d.ts +146 -0
  410. package/lib/size.js +220 -0
  411. package/lib/stack-base.d.ts +188 -0
  412. package/lib/stack-base.js +183 -0
  413. package/lib/token.d.ts +32 -0
  414. package/lib/token.js +54 -0
  415. package/node_modules/camel-case/LICENSE +21 -0
  416. package/node_modules/camel-case/README.md +47 -0
  417. package/node_modules/camel-case/dist/index.d.ts +5 -0
  418. package/node_modules/camel-case/dist/index.js +23 -0
  419. package/node_modules/camel-case/dist/index.js.map +1 -0
  420. package/node_modules/camel-case/dist/index.spec.d.ts +1 -0
  421. package/node_modules/camel-case/dist/index.spec.js +26 -0
  422. package/node_modules/camel-case/dist/index.spec.js.map +1 -0
  423. package/node_modules/camel-case/dist.es2015/index.d.ts +5 -0
  424. package/node_modules/camel-case/dist.es2015/index.js +17 -0
  425. package/node_modules/camel-case/dist.es2015/index.js.map +1 -0
  426. package/node_modules/camel-case/dist.es2015/index.spec.d.ts +1 -0
  427. package/node_modules/camel-case/dist.es2015/index.spec.js +24 -0
  428. package/node_modules/camel-case/dist.es2015/index.spec.js.map +1 -0
  429. package/node_modules/camel-case/package.json +89 -0
  430. package/node_modules/capital-case/LICENSE +21 -0
  431. package/node_modules/capital-case/README.md +37 -0
  432. package/node_modules/capital-case/dist/index.d.ts +4 -0
  433. package/node_modules/capital-case/dist/index.js +16 -0
  434. package/node_modules/capital-case/dist/index.js.map +1 -0
  435. package/node_modules/capital-case/dist/index.spec.d.ts +1 -0
  436. package/node_modules/capital-case/dist/index.spec.js +24 -0
  437. package/node_modules/capital-case/dist/index.spec.js.map +1 -0
  438. package/node_modules/capital-case/dist.es2015/index.d.ts +4 -0
  439. package/node_modules/capital-case/dist.es2015/index.js +11 -0
  440. package/node_modules/capital-case/dist.es2015/index.js.map +1 -0
  441. package/node_modules/capital-case/dist.es2015/index.spec.d.ts +1 -0
  442. package/node_modules/capital-case/dist.es2015/index.spec.js +22 -0
  443. package/node_modules/capital-case/dist.es2015/index.spec.js.map +1 -0
  444. package/node_modules/capital-case/package.json +90 -0
  445. package/node_modules/change-case/LICENSE +21 -0
  446. package/node_modules/change-case/README.md +44 -0
  447. package/node_modules/change-case/dist/index.d.ts +11 -0
  448. package/node_modules/change-case/dist/index.js +15 -0
  449. package/node_modules/change-case/dist/index.js.map +1 -0
  450. package/node_modules/change-case/dist/index.spec.d.ts +1 -0
  451. package/node_modules/change-case/dist/index.spec.js +9 -0
  452. package/node_modules/change-case/dist/index.spec.js.map +1 -0
  453. package/node_modules/change-case/dist.es2015/index.d.ts +11 -0
  454. package/node_modules/change-case/dist.es2015/index.js +12 -0
  455. package/node_modules/change-case/dist.es2015/index.js.map +1 -0
  456. package/node_modules/change-case/dist.es2015/index.spec.d.ts +1 -0
  457. package/node_modules/change-case/dist.es2015/index.spec.js +7 -0
  458. package/node_modules/change-case/dist.es2015/index.spec.js.map +1 -0
  459. package/node_modules/change-case/package.json +101 -0
  460. package/node_modules/constant-case/LICENSE +21 -0
  461. package/node_modules/constant-case/README.md +37 -0
  462. package/node_modules/constant-case/dist/index.d.ts +3 -0
  463. package/node_modules/constant-case/dist/index.js +12 -0
  464. package/node_modules/constant-case/dist/index.js.map +1 -0
  465. package/node_modules/constant-case/dist/index.spec.d.ts +1 -0
  466. package/node_modules/constant-case/dist/index.spec.js +26 -0
  467. package/node_modules/constant-case/dist/index.spec.js.map +1 -0
  468. package/node_modules/constant-case/dist.es2015/index.d.ts +3 -0
  469. package/node_modules/constant-case/dist.es2015/index.js +8 -0
  470. package/node_modules/constant-case/dist.es2015/index.js.map +1 -0
  471. package/node_modules/constant-case/dist.es2015/index.spec.d.ts +1 -0
  472. package/node_modules/constant-case/dist.es2015/index.spec.js +24 -0
  473. package/node_modules/constant-case/dist.es2015/index.spec.js.map +1 -0
  474. package/node_modules/constant-case/package.json +90 -0
  475. package/node_modules/dot-case/LICENSE +21 -0
  476. package/node_modules/dot-case/README.md +37 -0
  477. package/node_modules/dot-case/dist/index.d.ts +3 -0
  478. package/node_modules/dot-case/dist/index.js +11 -0
  479. package/node_modules/dot-case/dist/index.js.map +1 -0
  480. package/node_modules/dot-case/dist/index.spec.d.ts +1 -0
  481. package/node_modules/dot-case/dist/index.spec.js +26 -0
  482. package/node_modules/dot-case/dist/index.spec.js.map +1 -0
  483. package/node_modules/dot-case/dist.es2015/index.d.ts +3 -0
  484. package/node_modules/dot-case/dist.es2015/index.js +7 -0
  485. package/node_modules/dot-case/dist.es2015/index.js.map +1 -0
  486. package/node_modules/dot-case/dist.es2015/index.spec.d.ts +1 -0
  487. package/node_modules/dot-case/dist.es2015/index.spec.js +24 -0
  488. package/node_modules/dot-case/dist.es2015/index.spec.js.map +1 -0
  489. package/node_modules/dot-case/package.json +89 -0
  490. package/node_modules/esbuild-wasm/LICENSE.md +21 -0
  491. package/node_modules/esbuild-wasm/README.md +3 -0
  492. package/node_modules/esbuild-wasm/bin/esbuild +91 -0
  493. package/node_modules/esbuild-wasm/esbuild.wasm +0 -0
  494. package/node_modules/esbuild-wasm/esm/browser.d.ts +705 -0
  495. package/node_modules/esbuild-wasm/esm/browser.js +2370 -0
  496. package/node_modules/esbuild-wasm/esm/browser.min.js +20 -0
  497. package/node_modules/esbuild-wasm/lib/browser.d.ts +705 -0
  498. package/node_modules/esbuild-wasm/lib/browser.js +2415 -0
  499. package/node_modules/esbuild-wasm/lib/browser.min.js +22 -0
  500. package/node_modules/esbuild-wasm/lib/main.d.ts +705 -0
  501. package/node_modules/esbuild-wasm/lib/main.js +2051 -0
  502. package/node_modules/esbuild-wasm/package.json +19 -0
  503. package/node_modules/esbuild-wasm/wasm_exec.js +561 -0
  504. package/node_modules/esbuild-wasm/wasm_exec_node.js +39 -0
  505. package/node_modules/header-case/LICENSE +21 -0
  506. package/node_modules/header-case/README.md +37 -0
  507. package/node_modules/header-case/dist/index.d.ts +3 -0
  508. package/node_modules/header-case/dist/index.js +11 -0
  509. package/node_modules/header-case/dist/index.js.map +1 -0
  510. package/node_modules/header-case/dist/index.spec.d.ts +1 -0
  511. package/node_modules/header-case/dist/index.spec.js +24 -0
  512. package/node_modules/header-case/dist/index.spec.js.map +1 -0
  513. package/node_modules/header-case/dist.es2015/index.d.ts +3 -0
  514. package/node_modules/header-case/dist.es2015/index.js +7 -0
  515. package/node_modules/header-case/dist.es2015/index.js.map +1 -0
  516. package/node_modules/header-case/dist.es2015/index.spec.d.ts +1 -0
  517. package/node_modules/header-case/dist.es2015/index.spec.js +22 -0
  518. package/node_modules/header-case/dist.es2015/index.spec.js.map +1 -0
  519. package/node_modules/header-case/package.json +89 -0
  520. package/node_modules/lower-case/LICENSE +21 -0
  521. package/node_modules/lower-case/README.md +35 -0
  522. package/node_modules/lower-case/dist/index.d.ts +8 -0
  523. package/node_modules/lower-case/dist/index.js +53 -0
  524. package/node_modules/lower-case/dist/index.js.map +1 -0
  525. package/node_modules/lower-case/dist/index.spec.d.ts +1 -0
  526. package/node_modules/lower-case/dist/index.spec.js +36 -0
  527. package/node_modules/lower-case/dist/index.spec.js.map +1 -0
  528. package/node_modules/lower-case/dist.es2015/index.d.ts +8 -0
  529. package/node_modules/lower-case/dist.es2015/index.js +48 -0
  530. package/node_modules/lower-case/dist.es2015/index.js.map +1 -0
  531. package/node_modules/lower-case/dist.es2015/index.spec.d.ts +1 -0
  532. package/node_modules/lower-case/dist.es2015/index.spec.js +34 -0
  533. package/node_modules/lower-case/dist.es2015/index.spec.js.map +1 -0
  534. package/node_modules/lower-case/package.json +87 -0
  535. package/node_modules/mime-db/HISTORY.md +507 -0
  536. package/node_modules/mime-db/LICENSE +23 -0
  537. package/node_modules/mime-db/README.md +100 -0
  538. package/node_modules/mime-db/db.json +8519 -0
  539. package/node_modules/mime-db/index.js +12 -0
  540. package/node_modules/mime-db/package.json +60 -0
  541. package/node_modules/mime-types/HISTORY.md +397 -0
  542. package/node_modules/mime-types/LICENSE +23 -0
  543. package/node_modules/mime-types/README.md +113 -0
  544. package/node_modules/mime-types/index.js +188 -0
  545. package/node_modules/mime-types/package.json +44 -0
  546. package/node_modules/no-case/LICENSE +21 -0
  547. package/node_modules/no-case/README.md +37 -0
  548. package/node_modules/no-case/dist/index.d.ts +10 -0
  549. package/node_modules/no-case/dist/index.js +35 -0
  550. package/node_modules/no-case/dist/index.js.map +1 -0
  551. package/node_modules/no-case/dist/index.spec.d.ts +1 -0
  552. package/node_modules/no-case/dist/index.spec.js +59 -0
  553. package/node_modules/no-case/dist/index.spec.js.map +1 -0
  554. package/node_modules/no-case/dist.es2015/index.d.ts +10 -0
  555. package/node_modules/no-case/dist.es2015/index.js +31 -0
  556. package/node_modules/no-case/dist.es2015/index.js.map +1 -0
  557. package/node_modules/no-case/dist.es2015/index.spec.d.ts +1 -0
  558. package/node_modules/no-case/dist.es2015/index.spec.js +57 -0
  559. package/node_modules/no-case/dist.es2015/index.spec.js.map +1 -0
  560. package/node_modules/no-case/package.json +85 -0
  561. package/node_modules/param-case/LICENSE +21 -0
  562. package/node_modules/param-case/README.md +37 -0
  563. package/node_modules/param-case/dist/index.d.ts +3 -0
  564. package/node_modules/param-case/dist/index.js +11 -0
  565. package/node_modules/param-case/dist/index.js.map +1 -0
  566. package/node_modules/param-case/dist/index.spec.d.ts +1 -0
  567. package/node_modules/param-case/dist/index.spec.js +24 -0
  568. package/node_modules/param-case/dist/index.spec.js.map +1 -0
  569. package/node_modules/param-case/dist.es2015/index.d.ts +3 -0
  570. package/node_modules/param-case/dist.es2015/index.js +7 -0
  571. package/node_modules/param-case/dist.es2015/index.js.map +1 -0
  572. package/node_modules/param-case/dist.es2015/index.spec.d.ts +1 -0
  573. package/node_modules/param-case/dist.es2015/index.spec.js +22 -0
  574. package/node_modules/param-case/dist.es2015/index.spec.js.map +1 -0
  575. package/node_modules/param-case/package.json +91 -0
  576. package/node_modules/pascal-case/LICENSE +21 -0
  577. package/node_modules/pascal-case/README.md +47 -0
  578. package/node_modules/pascal-case/dist/index.d.ts +5 -0
  579. package/node_modules/pascal-case/dist/index.js +24 -0
  580. package/node_modules/pascal-case/dist/index.js.map +1 -0
  581. package/node_modules/pascal-case/dist/index.spec.d.ts +1 -0
  582. package/node_modules/pascal-case/dist/index.spec.js +25 -0
  583. package/node_modules/pascal-case/dist/index.spec.js.map +1 -0
  584. package/node_modules/pascal-case/dist.es2015/index.d.ts +5 -0
  585. package/node_modules/pascal-case/dist.es2015/index.js +18 -0
  586. package/node_modules/pascal-case/dist.es2015/index.js.map +1 -0
  587. package/node_modules/pascal-case/dist.es2015/index.spec.d.ts +1 -0
  588. package/node_modules/pascal-case/dist.es2015/index.spec.js +23 -0
  589. package/node_modules/pascal-case/dist.es2015/index.spec.js.map +1 -0
  590. package/node_modules/pascal-case/package.json +90 -0
  591. package/node_modules/path-case/LICENSE +21 -0
  592. package/node_modules/path-case/README.md +37 -0
  593. package/node_modules/path-case/dist/index.d.ts +3 -0
  594. package/node_modules/path-case/dist/index.js +11 -0
  595. package/node_modules/path-case/dist/index.js.map +1 -0
  596. package/node_modules/path-case/dist/index.spec.d.ts +1 -0
  597. package/node_modules/path-case/dist/index.spec.js +24 -0
  598. package/node_modules/path-case/dist/index.spec.js.map +1 -0
  599. package/node_modules/path-case/dist.es2015/index.d.ts +3 -0
  600. package/node_modules/path-case/dist.es2015/index.js +7 -0
  601. package/node_modules/path-case/dist.es2015/index.js.map +1 -0
  602. package/node_modules/path-case/dist.es2015/index.spec.d.ts +1 -0
  603. package/node_modules/path-case/dist.es2015/index.spec.js +22 -0
  604. package/node_modules/path-case/dist.es2015/index.spec.js.map +1 -0
  605. package/node_modules/path-case/package.json +88 -0
  606. package/node_modules/sentence-case/LICENSE +21 -0
  607. package/node_modules/sentence-case/README.md +37 -0
  608. package/node_modules/sentence-case/dist/index.d.ts +4 -0
  609. package/node_modules/sentence-case/dist/index.js +19 -0
  610. package/node_modules/sentence-case/dist/index.js.map +1 -0
  611. package/node_modules/sentence-case/dist/index.spec.d.ts +1 -0
  612. package/node_modules/sentence-case/dist/index.spec.js +24 -0
  613. package/node_modules/sentence-case/dist/index.spec.js.map +1 -0
  614. package/node_modules/sentence-case/dist.es2015/index.d.ts +4 -0
  615. package/node_modules/sentence-case/dist.es2015/index.js +14 -0
  616. package/node_modules/sentence-case/dist.es2015/index.js.map +1 -0
  617. package/node_modules/sentence-case/dist.es2015/index.spec.d.ts +1 -0
  618. package/node_modules/sentence-case/dist.es2015/index.spec.js +22 -0
  619. package/node_modules/sentence-case/dist.es2015/index.spec.js.map +1 -0
  620. package/node_modules/sentence-case/package.json +89 -0
  621. package/node_modules/snake-case/LICENSE +21 -0
  622. package/node_modules/snake-case/README.md +37 -0
  623. package/node_modules/snake-case/dist/index.d.ts +3 -0
  624. package/node_modules/snake-case/dist/index.js +11 -0
  625. package/node_modules/snake-case/dist/index.js.map +1 -0
  626. package/node_modules/snake-case/dist/index.spec.d.ts +1 -0
  627. package/node_modules/snake-case/dist/index.spec.js +25 -0
  628. package/node_modules/snake-case/dist/index.spec.js.map +1 -0
  629. package/node_modules/snake-case/dist.es2015/index.d.ts +3 -0
  630. package/node_modules/snake-case/dist.es2015/index.js +7 -0
  631. package/node_modules/snake-case/dist.es2015/index.js.map +1 -0
  632. package/node_modules/snake-case/dist.es2015/index.spec.d.ts +1 -0
  633. package/node_modules/snake-case/dist.es2015/index.spec.js +23 -0
  634. package/node_modules/snake-case/dist.es2015/index.spec.js.map +1 -0
  635. package/node_modules/snake-case/package.json +90 -0
  636. package/node_modules/tslib/CopyrightNotice.txt +15 -0
  637. package/node_modules/tslib/LICENSE.txt +12 -0
  638. package/node_modules/tslib/README.md +164 -0
  639. package/node_modules/tslib/SECURITY.md +41 -0
  640. package/node_modules/tslib/modules/index.d.ts +37 -0
  641. package/node_modules/tslib/modules/index.js +68 -0
  642. package/node_modules/tslib/modules/package.json +3 -0
  643. package/node_modules/tslib/package.json +47 -0
  644. package/node_modules/tslib/tslib.d.ts +453 -0
  645. package/node_modules/tslib/tslib.es6.html +1 -0
  646. package/node_modules/tslib/tslib.es6.js +374 -0
  647. package/node_modules/tslib/tslib.es6.mjs +373 -0
  648. package/node_modules/tslib/tslib.html +1 -0
  649. package/node_modules/tslib/tslib.js +424 -0
  650. package/node_modules/upper-case/README.md +34 -0
  651. package/node_modules/upper-case/dist/index.d.ts +8 -0
  652. package/node_modules/upper-case/dist/index.js +49 -0
  653. package/node_modules/upper-case/dist/index.js.map +1 -0
  654. package/node_modules/upper-case/dist/index.spec.d.ts +1 -0
  655. package/node_modules/upper-case/dist/index.spec.js +34 -0
  656. package/node_modules/upper-case/dist/index.spec.js.map +1 -0
  657. package/node_modules/upper-case/dist.es2015/index.d.ts +8 -0
  658. package/node_modules/upper-case/dist.es2015/index.js +44 -0
  659. package/node_modules/upper-case/dist.es2015/index.js.map +1 -0
  660. package/node_modules/upper-case/dist.es2015/index.spec.d.ts +1 -0
  661. package/node_modules/upper-case/dist.es2015/index.spec.js +32 -0
  662. package/node_modules/upper-case/dist.es2015/index.spec.js.map +1 -0
  663. package/node_modules/upper-case/package.json +86 -0
  664. package/node_modules/upper-case-first/LICENSE +21 -0
  665. package/node_modules/upper-case-first/README.md +32 -0
  666. package/node_modules/upper-case-first/dist/index.d.ts +4 -0
  667. package/node_modules/upper-case-first/dist/index.js +11 -0
  668. package/node_modules/upper-case-first/dist/index.js.map +1 -0
  669. package/node_modules/upper-case-first/dist/index.spec.d.ts +1 -0
  670. package/node_modules/upper-case-first/dist/index.spec.js +20 -0
  671. package/node_modules/upper-case-first/dist/index.spec.js.map +1 -0
  672. package/node_modules/upper-case-first/dist.es2015/index.d.ts +4 -0
  673. package/node_modules/upper-case-first/dist.es2015/index.js +7 -0
  674. package/node_modules/upper-case-first/dist.es2015/index.js.map +1 -0
  675. package/node_modules/upper-case-first/dist.es2015/index.spec.d.ts +1 -0
  676. package/node_modules/upper-case-first/dist.es2015/index.spec.js +18 -0
  677. package/node_modules/upper-case-first/dist.es2015/index.spec.js.map +1 -0
  678. package/node_modules/upper-case-first/package.json +87 -0
  679. package/package.json +152 -0
  680. package/setup.js +2 -0
@@ -0,0 +1,692 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.LoggingFormat = exports.ApplicationLogLevel = exports.SystemLogLevel = exports.Tracing = exports.LambdaFunction = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ // source: https://github.com/cdktf-plus/cdktf-plus/blob/586aabad3ab2fb2a2e93e05ed33f94474ebe9397/packages/%40cdktf-plus/aws/lib/aws-lambda-function/index.ts
7
+ // update to align closer with https://github.com/aws/aws-cdk/blob/v2.156.0/packages/aws-cdk-lib/aws-lambda/lib/function.ts
8
+ const provider_aws_1 = require("@cdktf/provider-aws");
9
+ const cdktf_1 = require("cdktf");
10
+ const __1 = require("..");
11
+ const architecture_1 = require("./architecture");
12
+ const function_base_1 = require("./function-base");
13
+ const util_1 = require("./util");
14
+ const __2 = require("../../");
15
+ const iam = require("../iam");
16
+ const notify_1 = require("../notify");
17
+ // re-add ec2.IConnectable?
18
+ // /**
19
+ // * A Lambda function.
20
+ // */
21
+ // export interface IFunction extends IAwsConstruct, iam.IGrantable {
22
+ // /**
23
+ // * Add an environment variable to this function.
24
+ // */
25
+ // addEnvironment(key: string, value: string): IFunction;
26
+ // }
27
+ /**
28
+ * Provides a Lambda Function resource. Lambda allows you to trigger execution
29
+ * of code in response to events in AWS, enabling serverless backend solutions.
30
+ *
31
+ * The Lambda Function itself includes source code and runtime configuration.
32
+ *
33
+ * This Construct manages permissions as part of the function Principal iam policy.
34
+ * This works for same account resources, but for cross-account resources,
35
+ * you may need to manage access as part of the Resource iam policy.
36
+ *
37
+ * @resource aws_lambda_function
38
+ * @beacon-class compute.IFunction
39
+ */
40
+ class LambdaFunction extends function_base_1.LambdaFunctionBase {
41
+ // TODO: Terraform aws_lambda_function == CDK FunctionVersion
42
+ /**
43
+ * Latest published version of your Lambda Function.
44
+ */
45
+ get version() {
46
+ // TODO: What is this if publish is false??
47
+ return this.resource.version;
48
+ }
49
+ /**
50
+ * Import a lambda function into the TerraConstruct spec using its name
51
+ */
52
+ static fromFunctionName(scope, id, functionName) {
53
+ return LambdaFunction.fromFunctionAttributes(scope, id, {
54
+ functionArn: __1.AwsStack.ofAwsConstruct(scope).formatArn({
55
+ service: "lambda",
56
+ resource: "function",
57
+ resourceName: functionName,
58
+ arnFormat: __1.ArnFormat.COLON_RESOURCE_NAME,
59
+ }),
60
+ sameEnvironment: true,
61
+ });
62
+ }
63
+ /**
64
+ * Import a lambda function into the TerraConstruct spec using its ARN.
65
+ *
66
+ * For `Function.addPermissions()` to work on this imported lambda, make sure that is
67
+ * in the same account and region as the stack you are importing it into.
68
+ */
69
+ static fromFunctionArn(scope, id, functionArn) {
70
+ return LambdaFunction.fromFunctionAttributes(scope, id, { functionArn });
71
+ }
72
+ /**
73
+ * Creates a Lambda function object which represents a function not defined
74
+ * within this stack.
75
+ *
76
+ * For `Function.addPermissions()` to work on this imported lambda, set the sameEnvironment property to true
77
+ * if this imported lambda is in the same account and region as the stack you are importing it into.
78
+ *
79
+ * @param scope The parent construct
80
+ * @param id The name of the lambda construct
81
+ * @param attrs the attributes of the function to import
82
+ */
83
+ static fromFunctionAttributes(scope, id, attrs) {
84
+ const functionArn = attrs.functionArn;
85
+ const functionName = extractNameFromArn(attrs.functionArn);
86
+ const role = attrs.role;
87
+ class Import extends function_base_1.LambdaFunctionBase {
88
+ /**
89
+ * The version of the Lambda function returned.
90
+ *
91
+ * If qualifier is not set, this will resolve to the most recent published version.
92
+ * If no published version of the function exists, version will resolve to `$LATEST`.
93
+ */
94
+ get version() {
95
+ return this.resource.version;
96
+ }
97
+ get functionOutputs() {
98
+ return {
99
+ name: this.functionName,
100
+ arn: this.functionArn,
101
+ roleArn: this.role?.roleArn ?? "",
102
+ };
103
+ }
104
+ get outputs() {
105
+ return this.functionOutputs;
106
+ }
107
+ constructor(s, i) {
108
+ super(s, i, {
109
+ environmentFromArn: functionArn,
110
+ });
111
+ this.functionName = functionName;
112
+ this.functionArn = functionArn;
113
+ this.role = role;
114
+ this.permissionsNode = this.node;
115
+ // Force user to provide arch or assume X86_64
116
+ this.architecture = attrs.architecture ?? architecture_1.Architecture.X86_64;
117
+ // public get architecture(): string {
118
+ // return Fn.element(this.resource.architectures, 0) as string;
119
+ // }
120
+ this.resourceArnsForGrantInvoke = [
121
+ this.functionArn,
122
+ `${this.functionArn}:*`,
123
+ ];
124
+ this.canCreatePermissions = attrs.sameEnvironment ?? this._isStackAccount();
125
+ this._skipPermissions = attrs.skipPermissions ?? false;
126
+ this.grantPrincipal =
127
+ role || new iam.UnknownPrincipal({ resource: this });
128
+ this.resource = new provider_aws_1.dataAwsLambdaFunction.DataAwsLambdaFunction(this, "Resource", {
129
+ functionName: this.functionName,
130
+ });
131
+ // // TODO: re-add support for EC2 connections
132
+ // if (attrs.securityGroup) {
133
+ // this._connections = new ec2.Connections({
134
+ // securityGroups: [attrs.securityGroup],
135
+ // });
136
+ // }
137
+ }
138
+ }
139
+ return new Import(scope, id);
140
+ }
141
+ /** Strongly Typed Function Outputs */
142
+ get functionOutputs() {
143
+ return this._outputs;
144
+ }
145
+ get outputs() {
146
+ return this.functionOutputs;
147
+ }
148
+ /**
149
+ * The ARN fo the function.
150
+ */
151
+ get functionArn() {
152
+ return this.resource.arn;
153
+ }
154
+ /**
155
+ * The ARN fo the function.
156
+ * (if versioning is enabled via publish = true)
157
+ */
158
+ get functionQualifiedArn() {
159
+ return this.resource.qualifiedArn;
160
+ }
161
+ /**
162
+ * The ARN fo the function.
163
+ */
164
+ get functionQualifiedInvokeArn() {
165
+ return this.resource.qualifiedInvokeArn;
166
+ }
167
+ // // Teraform provider for AWS Automatically manages Function Versioning through code hash..
168
+ // // need to drop most of this version logic..
169
+ // private readonly currentVersionOptions?: VersionOptions;
170
+ // private _currentVersion?: Version;
171
+ // /**
172
+ // * Returns a `lambda.Version` which represents the current version of this
173
+ // * Lambda function. A new version will be created every time the function's
174
+ // * configuration changes.
175
+ // *
176
+ // * You can specify options for this version using the `currentVersionOptions`
177
+ // * prop when initializing the `lambda.Function`.
178
+ // */
179
+ // public get currentVersion(): Version {
180
+ // if (this._currentVersion) {
181
+ // return this._currentVersion;
182
+ // }
183
+ // // if (this._warnIfCurrentVersionCalled) {
184
+ // // this.warnInvokeFunctionPermissions(this);
185
+ // // }
186
+ // this._currentVersion = new Version(this, "CurrentVersion", {
187
+ // lambda: this,
188
+ // ...this.currentVersionOptions,
189
+ // });
190
+ // // override the version's logical ID with a lazy string which includes the
191
+ // // hash of the function itself, so a new version resource is created when
192
+ // // the function configuration changes.
193
+ // const cfn = this._currentVersion.node.defaultChild as TerraformResource;
194
+ // const originalLogicalId = this.stack.resolve(cfn.logicalId) as string;
195
+ // cfn.overrideLogicalId(
196
+ // Lazy.stringValue({
197
+ // produce: () => {
198
+ // const hash = calculateFunctionHash(this, this.hashMixins.join(""));
199
+ // const logicalId = trimFromStart(originalLogicalId, 255 - 32);
200
+ // return `${logicalId}${hash}`;
201
+ // },
202
+ // }),
203
+ // );
204
+ // return this._currentVersion;
205
+ // }
206
+ /**
207
+ * The ARN(s) to put into the resource field of the generated IAM policy for grantInvoke()
208
+ */
209
+ get resourceArnsForGrantInvoke() {
210
+ // TODO: should this be qualifiedArn or qualifiedInvokeArn?
211
+ // https://registry.terraform.io/providers/hashicorp/aws/5.68.0/docs/resources/lambda_function#qualified_arn
212
+ return [this.functionArn, this.functionQualifiedInvokeArn];
213
+ }
214
+ /**
215
+ * HTTP Endpoint for this function if defined.
216
+ *
217
+ * use `addFunctionUrl` to enable Endpoint.
218
+ */
219
+ get url() {
220
+ return this._url;
221
+ }
222
+ get eventSources() {
223
+ return Object.values(this._eventSources);
224
+ }
225
+ get securityGroup() {
226
+ return this._securityGroup;
227
+ }
228
+ constructor(scope, name, props) {
229
+ super(scope, name, props);
230
+ /**
231
+ * The construct node where permissions are attached.
232
+ */
233
+ this.permissionsNode = this.node;
234
+ this.canCreatePermissions = true;
235
+ /**
236
+ * Mapping of invocation principals to grants. Used to de-dupe `grantInvoke()` calls.
237
+ * @internal
238
+ */
239
+ this._invocationGrants = {};
240
+ /**
241
+ * Mapping of fucntion URL invocation principals to grants. Used to de-dupe `grantInvokeUrl()` calls.
242
+ * @internal
243
+ */
244
+ this._functionUrlInvocationGrants = {};
245
+ /**
246
+ * Environment variables for this function
247
+ */
248
+ this.environment = {};
249
+ this._eventSources = {};
250
+ const { description, environment: variables, logRetentionInDays = __1.RetentionDays.ONE_WEEK, memorySize = 128, timeout = __2.Duration.seconds(3), layers, reservedConcurrentExecutions, } = props;
251
+ /**
252
+ * The name or ARN of the Lambda function.
253
+ * is limited to 64 characters in length.
254
+ *
255
+ * ARN Pattern: ([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?
256
+ */
257
+ const functionName = props.functionName ??
258
+ this.stack.uniqueResourceNamePrefix(this, {
259
+ prefix: props.functionNamePrefix ?? this.gridUUID + "-",
260
+ allowedSpecialCharacters: "+",
261
+ maxLength: 64,
262
+ });
263
+ if (functionName && !cdktf_1.Token.isUnresolved(functionName)) {
264
+ if (functionName.length > 64) {
265
+ throw new Error(`Function name can not be longer than 64 characters but has ${functionName.length} characters.`);
266
+ }
267
+ if (!/^[a-zA-Z0-9-_]+$/.test(functionName)) {
268
+ throw new Error(`Function name ${functionName} can contain only letters, numbers, hyphens, or underscores with no spaces.`);
269
+ }
270
+ }
271
+ if (description && !cdktf_1.Token.isUnresolved(description)) {
272
+ if (description.length > 256) {
273
+ throw new Error(`Function description can not be longer than 256 characters but has ${description.length} characters.`);
274
+ }
275
+ }
276
+ const managedPolicies = new Array();
277
+ // the arn is in the form of - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
278
+ managedPolicies.push(iam.ManagedPolicy.fromAwsManagedPolicyName(this, "AWSLambdaBasicExecutionRole", "service-role/AWSLambdaBasicExecutionRole"));
279
+ if (props.networkConfig) {
280
+ // Policy that will have ENI creation permissions
281
+ // not sure if time.sleep is necessary?
282
+ // ref:
283
+ // - https://github.com/pulumi/pulumi-aws/issues/2260#issuecomment-1977606509
284
+ // - https://github.com/hashicorp/terraform-provider-aws/issues/29828#issuecomment-1693307500
285
+ managedPolicies.push(iam.ManagedPolicy.fromAwsManagedPolicyName(this, "AWSLambdaVPCAccessExecutionRole", "service-role/AWSLambdaVPCAccessExecutionRole"));
286
+ }
287
+ // TODO: Any concern not scoping the logGroup IAM Permissions?
288
+ // .allow()
289
+ // .toCreateLogStream()
290
+ // .toPutLogEvents()
291
+ // .on(logGroup.arn, `${logGroup.arn}:log-stream:*`),
292
+ this.role =
293
+ props.role ||
294
+ new iam.Role(this, "ServiceRole", {
295
+ assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"),
296
+ managedPolicies,
297
+ });
298
+ this.grantPrincipal = this.role;
299
+ // TODO: Re-add filesystem / localMountPath support
300
+ // ref: filesystem.config.policies to be added to principal
301
+ // https://github.com/aws/aws-cdk/blob/v2.160.0/packages/aws-cdk-lib/aws-lambda/lib/function.ts#L949-L965
302
+ for (const statement of props.initialPolicy || []) {
303
+ this.role.addToPrincipalPolicy(statement);
304
+ }
305
+ // add support for AWS_CODEGURU Profile env variables...
306
+ const env = variables || {};
307
+ for (const [key, value] of Object.entries(env)) {
308
+ this.addEnvironment(key, value);
309
+ }
310
+ // DLQ can be either sns.ITopic or sqs.IQueue
311
+ const dlqTopicOrQueue = this.buildDeadLetterQueue(props);
312
+ if (dlqTopicOrQueue !== undefined) {
313
+ if (this.isQueue(dlqTopicOrQueue)) {
314
+ this.deadLetterQueue = dlqTopicOrQueue;
315
+ }
316
+ else {
317
+ throw new Error("DeadLetterTopic is not supported yet");
318
+ // this.deadLetterTopic = dlqTopicOrQueue;
319
+ }
320
+ }
321
+ const logGroup = new provider_aws_1.cloudwatchLogGroup.CloudwatchLogGroup(this, "LogGroup", {
322
+ name: `/aws/lambda/${functionName}`,
323
+ retentionInDays: logRetentionInDays,
324
+ });
325
+ this._logGroup = logGroup;
326
+ this.resource = new provider_aws_1.lambdaFunction.LambdaFunction(this, "Resource", {
327
+ functionName,
328
+ description,
329
+ role: this.role.roleArn,
330
+ architectures: [
331
+ // This is an array, but maximum length is 1!
332
+ // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-architectures
333
+ props.architecture?.toString() ?? architecture_1.Architecture.X86_64.toString(),
334
+ ],
335
+ memorySize,
336
+ timeout: timeout.toSeconds(),
337
+ layers, // TODO: Support ILayer with Lazy list of arns
338
+ reservedConcurrentExecutions,
339
+ // TODO: CDK Sorts environment to match Lambda Hash behaviour
340
+ // ref: https://github.com/aws/aws-cdk/blob/v2.156.0/packages/aws-cdk-lib/aws-lambda/lib/function.ts#L1467
341
+ environment: {
342
+ variables: cdktf_1.Lazy.anyValue({
343
+ produce: (_context) => {
344
+ return this.environment;
345
+ },
346
+ }),
347
+ },
348
+ vpcConfig: this.parseVpcConfig(props.networkConfig),
349
+ loggingConfig: this.getLoggingConfig(this._logGroup.name, props),
350
+ tracingConfig: this.parseTracingConfig(props.tracing ?? Tracing.ACTIVE),
351
+ deadLetterConfig: this.parseDeadLetterConfig(dlqTopicOrQueue),
352
+ publish: props.publish,
353
+ // TODO: use logGroup.node.addDependency when logGroup is implemented
354
+ dependsOn: [logGroup],
355
+ });
356
+ this.functionName = this.resource.functionName;
357
+ // make sure any role attachments are added as dependencies for this lambda
358
+ // this achieved by the CDKTF Aspect on the parent StackBase
359
+ this.resource.node.addDependency(this.role);
360
+ this.timeout = props.timeout;
361
+ this.architecture = props.architecture ?? architecture_1.Architecture.X86_64;
362
+ // TODO: Add aws_lambda_provisioned_concurrency_config
363
+ for (const event of props.events || []) {
364
+ this.addEventSource(event);
365
+ }
366
+ // Event Invoke Config
367
+ if (props.onFailure ||
368
+ props.onSuccess ||
369
+ props.maxEventAge ||
370
+ props.retryAttempts !== undefined) {
371
+ this.configureAsyncInvoke({
372
+ onFailure: props.onFailure,
373
+ onSuccess: props.onSuccess,
374
+ maxEventAge: props.maxEventAge,
375
+ retryAttempts: props.retryAttempts,
376
+ });
377
+ }
378
+ this._outputs = {
379
+ name: this.functionName,
380
+ arn: this.resource.arn,
381
+ roleArn: this.role.roleArn,
382
+ // only known at synth time
383
+ // explicit `null` required to avoid syntax errors when using stringValue && "undefined"
384
+ url: cdktf_1.Lazy.anyValue({
385
+ produce: () => this._url ?? null,
386
+ }),
387
+ defaultSecurityGroup: cdktf_1.Lazy.anyValue({
388
+ produce: () => this._securityGroup?.id ?? null,
389
+ }),
390
+ };
391
+ }
392
+ /**
393
+ * Adds an environment variable to this Lambda function.
394
+ * If this is a ref to a Lambda function, this operation results in a no-op.
395
+ * @param key The environment variable key.
396
+ * @param value The environment variable's value.
397
+ */
398
+ addEnvironment(key, value) {
399
+ // Reserved environment variables will fail during cloudformation deploy if they're set.
400
+ // This check is just to allow CDK to fail faster when these are specified.
401
+ const reservedEnvironmentVariables = [
402
+ "_HANDLER",
403
+ "_X_AMZN_TRACE_ID",
404
+ "AWS_DEFAULT_REGION",
405
+ "AWS_REGION",
406
+ "AWS_EXECUTION_ENV",
407
+ "AWS_LAMBDA_FUNCTION_NAME",
408
+ "AWS_LAMBDA_FUNCTION_MEMORY_SIZE",
409
+ "AWS_LAMBDA_FUNCTION_VERSION",
410
+ "AWS_LAMBDA_INITIALIZATION_TYPE",
411
+ "AWS_LAMBDA_LOG_GROUP_NAME",
412
+ "AWS_LAMBDA_LOG_STREAM_NAME",
413
+ "AWS_ACCESS_KEY",
414
+ "AWS_ACCESS_KEY_ID",
415
+ "AWS_SECRET_ACCESS_KEY",
416
+ "AWS_SESSION_TOKEN",
417
+ "AWS_LAMBDA_RUNTIME_API",
418
+ "LAMBDA_TASK_ROOT",
419
+ "LAMBDA_RUNTIME_DIR",
420
+ ];
421
+ if (reservedEnvironmentVariables.includes(key)) {
422
+ throw new Error(`${key} environment variable is reserved by the lambda runtime and can not be set manually. See https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html`);
423
+ }
424
+ this.environment[key] = value;
425
+ return this;
426
+ }
427
+ addFunctionUrl(options) {
428
+ const endpoint = super.addFunctionUrl(options);
429
+ this._url = endpoint.url;
430
+ return endpoint;
431
+ }
432
+ /**
433
+ * Get Logging Config propety for the function.
434
+ * This method returns the function LoggingConfig Property if the property is set on the
435
+ * function and undefined if not.
436
+ */
437
+ getLoggingConfig(logGroupName, props) {
438
+ if (props.applicationLogLevel || props.systemLogLevel) {
439
+ if (props.loggingFormat !== LoggingFormat.JSON) {
440
+ throw new Error(`To use ApplicationLogLevel and/or SystemLogLevel you must set LoggingFormat to '${LoggingFormat.JSON}', got '${props.loggingFormat}'.`);
441
+ }
442
+ }
443
+ let loggingConfig;
444
+ if (props.loggingFormat) {
445
+ loggingConfig = {
446
+ logFormat: props.loggingFormat,
447
+ systemLogLevel: props.systemLogLevel,
448
+ applicationLogLevel: props.applicationLogLevel,
449
+ logGroup: logGroupName,
450
+ };
451
+ return loggingConfig;
452
+ }
453
+ return undefined;
454
+ }
455
+ /**
456
+ * Defines an alias for this function.
457
+ *
458
+ * The alias will automatically be updated to point to the latest version of
459
+ * the function as it is being updated during a deployment.
460
+ *
461
+ * ```ts
462
+ * declare const fn: compute.LambdaFunction;
463
+ *
464
+ * fn.addAlias('Live');
465
+ *
466
+ * // Is equivalent to
467
+ *
468
+ * new compute.Alias(this, 'AliasLive', {
469
+ * aliasName: 'Live',
470
+ * version: fn.version,
471
+ * });
472
+ * ```
473
+ *
474
+ * @param aliasName The name of the alias
475
+ * @param options Alias options
476
+ */
477
+ addAlias(aliasName, options) {
478
+ return (0, util_1.addAlias)(this, this, this.version, aliasName, options);
479
+ }
480
+ /**
481
+ * Optionally create LambdaFunctionVpcConfig
482
+ */
483
+ parseVpcConfig(config) {
484
+ if (!config) {
485
+ return undefined;
486
+ }
487
+ let securityGroupIds = config.securityGroupIds;
488
+ if (!securityGroupIds) {
489
+ this._securityGroup = new provider_aws_1.securityGroup.SecurityGroup(this, "SecurityGroup", {
490
+ name: this.functionName,
491
+ description: this.functionName,
492
+ vpcId: config.vpcId,
493
+ egress: config.egress ?? [
494
+ {
495
+ fromPort: 0,
496
+ toPort: 0,
497
+ protocol: "-1",
498
+ cidrBlocks: ["0.0.0.0/0"],
499
+ ipv6CidrBlocks: ["::/0"],
500
+ },
501
+ ],
502
+ });
503
+ securityGroupIds = [this._securityGroup.id];
504
+ }
505
+ return {
506
+ subnetIds: config.subnetIds,
507
+ ipv6AllowedForDualStack: config.ipv6AllowedForDualStack,
508
+ securityGroupIds,
509
+ };
510
+ }
511
+ isQueue(deadLetterQueue) {
512
+ return deadLetterQueue.queueArn !== undefined;
513
+ }
514
+ buildDeadLetterQueue(props) {
515
+ // | sns.ITopic
516
+ if (!props.deadLetterQueue &&
517
+ !props.deadLetterQueueEnabled
518
+ // && !props.deadLetterTopic
519
+ ) {
520
+ return undefined;
521
+ }
522
+ if (props.deadLetterQueue && props.deadLetterQueueEnabled === false) {
523
+ throw Error("deadLetterQueue defined but deadLetterQueueEnabled explicitly set to false");
524
+ }
525
+ // if (
526
+ // props.deadLetterTopic &&
527
+ // (props.deadLetterQueue || props.deadLetterQueueEnabled !== undefined)
528
+ // ) {
529
+ // throw new Error(
530
+ // "deadLetterQueue and deadLetterTopic cannot be specified together at the same time",
531
+ // );
532
+ // }
533
+ let deadLetterQueue; // | ITopic;
534
+ // if (props.deadLetterTopic) {
535
+ // deadLetterQueue = props.deadLetterTopic;
536
+ // this.addToRolePolicy(
537
+ // new iam.PolicyStatement({
538
+ // actions: ["sns:Publish"],
539
+ // resources: [deadLetterQueue.topicArn],
540
+ // }),
541
+ // );
542
+ // } else {
543
+ deadLetterQueue =
544
+ props.deadLetterQueue ||
545
+ new notify_1.Queue(this, "DeadLetterQueue", {
546
+ messageRetentionSeconds: __2.Duration.days(14).toSeconds(),
547
+ });
548
+ this.addToRolePolicy(new iam.PolicyStatement({
549
+ actions: ["sqs:SendMessage"],
550
+ resources: [deadLetterQueue.queueArn],
551
+ }));
552
+ // }
553
+ return deadLetterQueue;
554
+ }
555
+ // TODO: Support sns.ITopic + sns:Publish topicArn
556
+ /**
557
+ * Optionally create LambdaFunctionDeadLetterConfig
558
+ */
559
+ parseDeadLetterConfig(deadLetterQueue) {
560
+ if (deadLetterQueue) {
561
+ // this.isQueue(deadLetterQueue) ? deadLetterQueue.queueArn : ...
562
+ return {
563
+ targetArn: deadLetterQueue.queueArn,
564
+ };
565
+ }
566
+ else {
567
+ return undefined;
568
+ }
569
+ }
570
+ parseTracingConfig(tracing) {
571
+ if (tracing === undefined || tracing === Tracing.DISABLED) {
572
+ return undefined;
573
+ }
574
+ this.addToRolePolicy(new iam.PolicyStatement({
575
+ actions: ["xray:PutTraceSegments", "xray:PutTelemetryRecords"],
576
+ resources: ["*"],
577
+ }));
578
+ return {
579
+ mode: tracing,
580
+ };
581
+ }
582
+ }
583
+ exports.LambdaFunction = LambdaFunction;
584
+ _a = JSII_RTTI_SYMBOL_1;
585
+ LambdaFunction[_a] = { fqn: "terraconstructs.aws.compute.LambdaFunction", version: "0.0.8" };
586
+ /**
587
+ * Given an opaque (token) ARN, returns a TF expression that extracts the function
588
+ * name from the ARN.
589
+ *
590
+ * Function ARNs look like this:
591
+ *
592
+ * arn:aws:lambda:region:account-id:function:function-name
593
+ *
594
+ * ..which means that in order to extract the `function-name` component from the ARN, we can
595
+ * split the ARN using ":" and select the component in index 6.
596
+ *
597
+ * @returns `element(split(':', arn), 6)`
598
+ */
599
+ function extractNameFromArn(arn) {
600
+ return cdktf_1.Fn.element(cdktf_1.Fn.split(":", arn), 6);
601
+ }
602
+ /**
603
+ * X-Ray Tracing Modes (https://docs.aws.amazon.com/lambda/latest/dg/API_TracingConfig.html)
604
+ */
605
+ var Tracing;
606
+ (function (Tracing) {
607
+ /**
608
+ * Lambda will respect any tracing header it receives from an upstream service.
609
+ * If no tracing header is received, Lambda will sample the request based on a fixed rate. Please see the [Using AWS Lambda with AWS X-Ray](https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html) documentation for details on this sampling behavior.
610
+ */
611
+ Tracing["ACTIVE"] = "Active";
612
+ /**
613
+ * Lambda will only trace the request from an upstream service
614
+ * if it contains a tracing header with "sampled=1"
615
+ */
616
+ Tracing["PASS_THROUGH"] = "PassThrough";
617
+ /**
618
+ * Lambda will not trace any request.
619
+ */
620
+ Tracing["DISABLED"] = "Disabled";
621
+ })(Tracing || (exports.Tracing = Tracing = {}));
622
+ /**
623
+ * Lambda service will automatically captures system logs about function invocation
624
+ * generated by the Lambda service (known as system logs) and sends these logs to a
625
+ * default CloudWatch log group named after the Lambda function.
626
+ */
627
+ var SystemLogLevel;
628
+ (function (SystemLogLevel) {
629
+ /**
630
+ * Lambda will capture only logs at info level.
631
+ */
632
+ SystemLogLevel["INFO"] = "INFO";
633
+ /**
634
+ * Lambda will capture only logs at debug level.
635
+ */
636
+ SystemLogLevel["DEBUG"] = "DEBUG";
637
+ /**
638
+ * Lambda will capture only logs at warn level.
639
+ */
640
+ SystemLogLevel["WARN"] = "WARN";
641
+ })(SystemLogLevel || (exports.SystemLogLevel = SystemLogLevel = {}));
642
+ /**
643
+ * Lambda service automatically captures logs generated by the function code
644
+ * (known as application logs) and sends these logs to a default CloudWatch
645
+ * log group named after the Lambda function.
646
+ */
647
+ var ApplicationLogLevel;
648
+ (function (ApplicationLogLevel) {
649
+ /**
650
+ * Lambda will capture only logs at info level.
651
+ */
652
+ ApplicationLogLevel["INFO"] = "INFO";
653
+ /**
654
+ * Lambda will capture only logs at debug level.
655
+ */
656
+ ApplicationLogLevel["DEBUG"] = "DEBUG";
657
+ /**
658
+ * Lambda will capture only logs at warn level.
659
+ */
660
+ ApplicationLogLevel["WARN"] = "WARN";
661
+ /**
662
+ * Lambda will capture only logs at trace level.
663
+ */
664
+ ApplicationLogLevel["TRACE"] = "TRACE";
665
+ /**
666
+ * Lambda will capture only logs at error level.
667
+ */
668
+ ApplicationLogLevel["ERROR"] = "ERROR";
669
+ /**
670
+ * Lambda will capture only logs at fatal level.
671
+ */
672
+ ApplicationLogLevel["FATAL"] = "FATAL";
673
+ })(ApplicationLogLevel || (exports.ApplicationLogLevel = ApplicationLogLevel = {}));
674
+ /**
675
+ * This field takes in 2 values either Text or JSON. By setting this value to Text,
676
+ * will result in the current structure of logs format, whereas, by setting this value to JSON,
677
+ * Lambda will print the logs as Structured JSON Logs, with the corresponding timestamp and log level
678
+ * of each event. Selecting ‘JSON’ format will only allow customer’s to have different log level
679
+ * Application log level and the System log level.
680
+ */
681
+ var LoggingFormat;
682
+ (function (LoggingFormat) {
683
+ /**
684
+ * Lambda Logs text format.
685
+ */
686
+ LoggingFormat["TEXT"] = "Text";
687
+ /**
688
+ * Lambda structured logging in Json format.
689
+ */
690
+ LoggingFormat["JSON"] = "JSON";
691
+ })(LoggingFormat || (exports.LoggingFormat = LoggingFormat = {}));
692
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2SkFBNko7QUFDN0osMkhBQTJIO0FBQzNILHNEQU02QjtBQUM3QixpQ0FBc0U7QUFFdEUsMEJBQXdEO0FBQ3hELGlEQUE4QztBQUk5QyxtREFLeUI7QUFHekIsaUNBQWtDO0FBQ2xDLDhCQUFrQztBQUNsQyw4QkFBOEI7QUFDOUIsc0NBQTBDO0FBK08xQywyQkFBMkI7QUFFM0IsTUFBTTtBQUNOLHdCQUF3QjtBQUN4QixNQUFNO0FBQ04scUVBQXFFO0FBRXJFLFFBQVE7QUFDUixxREFBcUQ7QUFDckQsUUFBUTtBQUNSLDJEQUEyRDtBQUMzRCxJQUFJO0FBRUo7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsa0NBQWtCO0lBQ3BELDZEQUE2RDtJQUU3RDs7T0FFRztJQUNILElBQVcsT0FBTztRQUNoQiwyQ0FBMkM7UUFDM0MsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQzVCLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixZQUFvQjtRQUVwQixPQUFPLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3RELFdBQVcsRUFBRSxZQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDcEQsT0FBTyxFQUFFLFFBQVE7Z0JBQ2pCLFFBQVEsRUFBRSxVQUFVO2dCQUNwQixZQUFZLEVBQUUsWUFBWTtnQkFDMUIsU0FBUyxFQUFFLGFBQVMsQ0FBQyxtQkFBbUI7YUFDekMsQ0FBQztZQUNGLGVBQWUsRUFBRSxJQUFJO1NBQ3RCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1B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LENBQUE7QUFDakIsQ0FBQyxFQXpCVyxtQkFBbUIsbUNBQW5CLG1CQUFtQixRQXlCOUI7QUFFRDs7Ozs7O0dBTUc7QUFDSCxJQUFZLGFBU1g7QUFURCxXQUFZLGFBQWE7SUFDdkI7O09BRUc7SUFDSCw4QkFBYSxDQUFBO0lBQ2I7O09BRUc7SUFDSCw4QkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQVRXLGFBQWEsNkJBQWIsYUFBYSxRQVN4QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2Nka3RmLXBsdXMvY2RrdGYtcGx1cy9ibG9iLzU4NmFhYmFkM2FiMmZiMmEyZTkzZTA1ZWQzM2Y5NDQ3NGViZTkzOTcvcGFja2FnZXMvJTQwY2RrdGYtcGx1cy9hd3MvbGliL2F3cy1sYW1iZGEtZnVuY3Rpb24vaW5kZXgudHNcbi8vIHVwZGF0ZSB0byBhbGlnbiBjbG9zZXIgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTYuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtbGFtYmRhL2xpYi9mdW5jdGlvbi50c1xuaW1wb3J0IHtcbiAgbGFtYmRhRnVuY3Rpb24sXG4gIGNsb3Vkd2F0Y2hMb2dHcm91cCxcbiAgc2VjdXJpdHlHcm91cCxcbiAgbGFtYmRhRXZlbnRTb3VyY2VNYXBwaW5nLFxuICBkYXRhQXdzTGFtYmRhRnVuY3Rpb24sXG59IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQgeyBJUmVzb2x2ZUNvbnRleHQsIExhenksIElSZXNvbHZhYmxlLCBUb2tlbiwgRm4gfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBSZXRlbnRpb25EYXlzLCBBd3NTdGFjaywgQXJuRm9ybWF0IH0gZnJvbSBcIi4uXCI7XG5pbXBvcnQgeyBBcmNoaXRlY3R1cmUgfSBmcm9tIFwiLi9hcmNoaXRlY3R1cmVcIjtcbmltcG9ydCB7IEV2ZW50SW52b2tlQ29uZmlnT3B0aW9ucyB9IGZyb20gXCIuL2V2ZW50LWludm9rZS1jb25maWdcIjtcbmltcG9ydCB7IElFdmVudFNvdXJjZU1hcHBpbmcgfSBmcm9tIFwiLi9ldmVudC1zb3VyY2UtbWFwcGluZ1wiO1xuaW1wb3J0IHsgQWxpYXNPcHRpb25zLCBBbGlhcyB9IGZyb20gXCIuL2Z1bmN0aW9uLWFsaWFzXCI7XG5pbXBvcnQge1xuICBMYW1iZGFGdW5jdGlvbkJhc2UsXG4gIElGdW5jdGlvbixcbiAgRnVuY3Rpb25BdHRyaWJ1dGVzLFxuICBJRXZlbnRTb3VyY2UsXG59IGZyb20gXCIuL2Z1bmN0aW9uLWJhc2VcIjtcbmltcG9ydCB7IEZ1bmN0aW9uVXJsLCBGdW5jdGlvblVybE9wdGlvbnMgfSBmcm9tIFwiLi9mdW5jdGlvbi11cmxcIjtcbmltcG9ydCB7IFZwY0NvbmZpZyB9IGZyb20gXCIuL2Z1bmN0aW9uLXZwYy1jb25maWcuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBhZGRBbGlhcyB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcIi4uLy4uL1wiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcbmltcG9ydCB7IElRdWV1ZSwgUXVldWUgfSBmcm9tIFwiLi4vbm90aWZ5XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25PdXRwdXRzIHtcbiAgLyoqXG4gICAqIEFXUyBMYW1iZGEgZnVuY3Rpb24gbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBV1MgTGFtYmRhIGFybiBvZiB0aGUgZnVuY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIFJvbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBMYW1iZGEgZnVuY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogRnVuY3Rpb24gVVJMIGlmIGVuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IHVybD86IHN0cmluZyB8IElSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cCBvZiB0aGUgZnVuY3Rpb24gaWYgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFNlY3VyaXR5R3JvdXA/OiBzdHJpbmcgfCBJUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblByb3BzIGV4dGVuZHMgRXZlbnRJbnZva2VDb25maWdPcHRpb25zIHtcbiAgLyoqXG4gICAqIEZvcmNlIGZ1bmN0aW9uIG5hbWUgKGZvciBhZG9wdGlvbiBvZiBleGlzdGluZyByZXNvdXJjZXMpLlxuICAgKlxuICAgKiBQcmVmZXIgdG8gdXNlIGZ1bmN0aW9uTmFtZVByZWZpeC5cbiAgICpcbiAgICogVXNlIFtUZXJyYWZvcm0gUmVzb3VyY2UgTWV0YSBBcmd1bWVudHNdKGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL3Jlc291cmNlcy9zeW50YXgjbWV0YS1hcmd1bWVudHMpXG4gICAqIHRvIGNvbnRyb2wgbGlmZWN5Y2xlIHdoZW4gcmVwbGFjaW5nIHRoZSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBvbWl0dGVkLCBSZWZlciB0byBgZnVuY3Rpb25OYW1lUHJlZml4YC5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBuYW1lIHByZWZpeCBmb3IgdGhlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEdyaWQgZ2VuZXJhdGVzIGEgdW5pcXVlIHBoeXNpY2FsIElEIGFuZCB1c2VzIHRoYXRcbiAgICogSUQgZm9yIHRoZSBmdW5jdGlvbidzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk5hbWVQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEtleS12YWx1ZSBwYWlycyB0aGF0IExhbWJkYSBjYWNoZXMgYW5kIG1ha2VzIGF2YWlsYWJsZSBmb3IgeW91ciBMYW1iZGFcbiAgICogZnVuY3Rpb25zLiBVc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGFwcGx5IGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgc3VjaFxuICAgKiBhcyB0ZXN0IGFuZCBwcm9kdWN0aW9uIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb25zLCB3aXRob3V0IGNoYW5naW5nIHlvdXJcbiAgICogTGFtYmRhIGZ1bmN0aW9uIHNvdXJjZSBjb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiBvZiB3aGF0IHlvdXIgTGFtYmRhIEZ1bmN0aW9uIGRvZXMuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN5c3RlbSBhcmNoaXRlY3R1cmVzIGNvbXBhdGlibGUgd2l0aCB0aGlzIGxhbWJkYSBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgQXJjaGl0ZWN0dXJlLlg4Nl82NFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBUaGUgdHJhY2luZyBtb2RlIGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIGlhbSByb2xlIHdpbGwgcmVjZWl2ZSBwZXJtaXNzaW9uIHRvXG4gICAqIHdyaXRlIHRvIEFXUyBYLVJheS5cbiAgICpcbiAgICogQGRlZmF1bHQgVHJhY2luZy5BQ1RJVkVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWNpbmc/OiBUcmFjaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nIHJldGVudGlvbiBwZXJpb2QgaW4gZGF5cy4gRGVmYXVsdHMgdG8gNy5cbiAgICovXG4gIHJlYWRvbmx5IGxvZ1JldGVudGlvbkluRGF5cz86IFJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIFRoZSBtZW1vcnkgbGltaXQgaW4gTUIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEyOC5cbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiBleGVjdXRpb24gdGltZSAoaW4gc2Vjb25kcykgYWZ0ZXIgd2hpY2ggTGFtYmRhIHRlcm1pbmF0ZXNcbiAgICogdGhlIGZ1bmN0aW9uLiBCZWNhdXNlIHRoZSBleGVjdXRpb24gdGltZSBhZmZlY3RzIGNvc3QsIHNldCB0aGlzIHZhbHVlXG4gICAqIGJhc2VkIG9uIHRoZSBmdW5jdGlvbidzIGV4cGVjdGVkIGV4ZWN1dGlvbiB0aW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMpXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExheWVycyBmb3IgdGhlIExhbWJkYS5cbiAgICovXG4gIHJlYWRvbmx5IGxheWVycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIHBvbGljeSBzdGF0ZW1lbnRzIHRvIGFkZCB0byB0aGUgY3JlYXRlZCBMYW1iZGEgUm9sZS5cbiAgICpcbiAgICogWW91IGNhbiBjYWxsIGBhZGRUb1JvbGVQb2xpY3lgIHRvIHRoZSBjcmVhdGVkIGxhbWJkYSB0byBhZGQgc3RhdGVtZW50cyBwb3N0IGNyZWF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHBvbGljeSBzdGF0ZW1lbnRzIGFyZSBhZGRlZCB0byB0aGUgY3JlYXRlZCBMYW1iZGEgcm9sZS5cbiAgICovXG4gIHJlYWRvbmx5IGluaXRpYWxQb2xpY3k/OiBpYW0uUG9saWN5U3RhdGVtZW50W107XG5cbiAgLyoqXG4gICAqIExhbWJkYSBleGVjdXRpb24gcm9sZS5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgcm9sZSB0aGF0IHdpbGwgYmUgYXNzdW1lZCBieSB0aGUgZnVuY3Rpb24gdXBvbiBleGVjdXRpb24uXG4gICAqIEl0IGNvbnRyb2xzIHRoZSBwZXJtaXNzaW9ucyB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGhhdmUuIFRoZSBSb2xlIG11c3RcbiAgICogYmUgYXNzdW1hYmxlIGJ5IHRoZSAnbGFtYmRhLmFtYXpvbmF3cy5jb20nIHNlcnZpY2UgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBSb2xlIGF1dG9tYXRpY2FsbHkgaGFzIHBlcm1pc3Npb25zIGdyYW50ZWQgZm9yIExhbWJkYSBleGVjdXRpb24uIElmIHlvdVxuICAgKiBwcm92aWRlIGEgUm9sZSwgeW91IG11c3QgYWRkIHRoZSByZWxldmFudCBBV1MgbWFuYWdlZCBwb2xpY2llcyB5b3Vyc2VsZi5cbiAgICpcbiAgICogVGhlIHJlbGV2YW50IG1hbmFnZWQgcG9saWNpZXMgYXJlIFwic2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZVwiIGFuZFxuICAgKiBcInNlcnZpY2Utcm9sZS9BV1NMYW1iZGFWUENBY2Nlc3NFeGVjdXRpb25Sb2xlXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSB1bmlxdWUgcm9sZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBsYW1iZGEgZnVuY3Rpb24uXG4gICAqIEJvdGggc3VwcGxpZWQgYW5kIGdlbmVyYXRlZCByb2xlcyBjYW4gYWx3YXlzIGJlIGNoYW5nZWQgYnkgY2FsbGluZyBgYWRkVG9Sb2xlUG9saWN5YC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIENvbmZpZyBmb3IgbmV0d29yayBjb25uZWN0aXZpdHkgdG8gQVdTIHJlc291cmNlcyBpbiBhIFZQQywgc3BlY2lmeSBhIGxpc3RcbiAgICogb2Ygc3VibmV0LCBhbmQgb3B0aW9uYWxseSBzZWN1cml0eSBncm91cHMsIGluIHRoZSBWUEMuXG4gICAqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gaWFtIHJvbGUgd2lsbCByZWNlaXZlIHBlcm1pc3Npb24gdG9cbiAgICogbWFuYWdlIEVOSXMgd2l0aGluIHRoZSBwcm92aWRlZCBuZXR3b3JrLlxuICAgKlxuICAgKiBXaGVuIHlvdSBjb25uZWN0IGEgZnVuY3Rpb24gdG8gYSBWUEMsIGl0IGNhbiBvbmx5IGFjY2VzcyByZXNvdXJjZXMgYW5kIHRoZSBpbnRlcm5ldCB0aHJvdWdoIHRoYXQgVlBDLlxuICAgKlxuICAgKiBTZWUgW1ZQQyBTZXR0aW5nc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvY29uZmlndXJhdGlvbi12cGMuaHRtbCkuXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrQ29uZmlnPzogVnBjQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgU1FTIERMUS5cbiAgICpcbiAgICogVGhlIExhbWJkYSBmdW5jdGlvbiBpYW0gcm9sZSB3aWxsIHJlY2VpdmUgcGVybWlzc2lvbiB0b1xuICAgKiBzZW5kIG1lc3NhZ2VzIG9uIHRoaXMgcXVldWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVhZGxldHRlciBxdWV1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVhZExldHRlclF1ZXVlPzogSVF1ZXVlO1xuXG4gIC8qKlxuICAgKiBFbmFibGVkIERMUS4gSWYgYGRlYWRMZXR0ZXJRdWV1ZWAgaXMgdW5kZWZpbmVkLFxuICAgKiBhbiBTUVMgcXVldWUgd2l0aCBkZWZhdWx0IG9wdGlvbnMgd2lsbCBiZSBkZWZpbmVkIGZvciB5b3VyIEZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlIHVubGVzcyBgZGVhZExldHRlclF1ZXVlYCBpcyBzZXQsIHdoaWNoIGltcGxpZXMgRExRIGlzIGVuYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBkZWFkTGV0dGVyUXVldWVFbmFibGVkPzogYm9vbGVhbjtcblxuICAvLyBUT0RPOiByZS1hZGQgU05TIGRlYWRMZXR0ZXJUb3BpY1xuXG4gIC8qKlxuICAgKiBFdmVudCBzb3VyY2VzIGZvciB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBZb3UgY2FuIGFsc28gYWRkIGV2ZW50IHNvdXJjZXMgdXNpbmcgYGFkZEV2ZW50U291cmNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBldmVudCBzb3VyY2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRzPzogSUV2ZW50U291cmNlW107XG5cbiAgLyoqXG4gICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS42MC4wL2RvY3MvcmVzb3VyY2VzL2xhbWJkYV9mdW5jdGlvbiNyZXNlcnZlZF9jb25jdXJyZW50X2V4ZWN1dGlvbnMgTGFtYmRhRnVuY3Rpb24jcmVzZXJ2ZWRfY29uY3VycmVudF9leGVjdXRpb25zfVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGFncyB0byBhcHBseSB0byB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBpbmZvcm1zIHRoZSBDREsgdGhhdCB0aGUgaW1wb3J0ZWQgZnVuY3Rpb24gQUxSRUFEWSBIQVMgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9uc1xuICAgKiBmb3Igd2hhdCB5b3UgYXJlIHRyeWluZyB0byBkby4gV2hlbiBub3QgY29uZmlndXJlZCwgdGhlIENESyBhdHRlbXB0cyB0byBhdXRvLWRldGVybWluZSB3aGV0aGVyIG9yIG5vdFxuICAgKiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFyZSBuZWNlc3Nhcnkgb24gdGhlIGZ1bmN0aW9uIHdoZW4gZ3JhbnQgQVBJcyBhcmUgdXNlZC4gSWYgdGhlIENESyB0cmllZCB0byBhZGRcbiAgICogcGVybWlzc2lvbnMgb24gYW4gaW1wb3J0ZWQgbGFtYmRhLCBpdCB3aWxsIGZhaWwuXG4gICAqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5ICpPTkxZIElGKiB5b3UgYXJlIGNvbW1pdHRpbmcgdG8gbWFuYWdlIHRoZSBpbXBvcnRlZCBmdW5jdGlvbidzIHBlcm1pc3Npb25zIG91dHNpZGUgb2ZcbiAgICogQ0RLLiBZb3UgYXJlIGFja25vd2xlZGdpbmcgdGhhdCB5b3VyIENESyBjb2RlIGFsb25lIHdpbGwgaGF2ZSBpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZVxuICAgKiBpbXBvcnRlZCBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNraXBQZXJtaXNzaW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGxvZ2dpbmdGb3JtYXQgZm9yIHRoZSBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgTG9nZ2luZ0Zvcm1hdC5URVhUXG4gICAqL1xuICByZWFkb25seSBsb2dnaW5nRm9ybWF0PzogTG9nZ2luZ0Zvcm1hdDtcblxuICAvKipcbiAgICogU2V0cyB0aGUgYXBwbGljYXRpb24gbG9nIGxldmVsIGZvciB0aGUgZnVuY3Rpb24uXG4gICAqIEBkZWZhdWx0IEFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb25Mb2dMZXZlbD86IEFwcGxpY2F0aW9uTG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN5c3RlbSBsb2cgbGV2ZWwgZm9yIHRoZSBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgU3lzdGVtTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgc3lzdGVtTG9nTGV2ZWw/OiBTeXN0ZW1Mb2dMZXZlbDtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHVibGlzaCBjcmVhdGlvbi9jaGFuZ2UgYXMgbmV3IExhbWJkYSBGdW5jdGlvbiBWZXJzaW9uLlxuICAgKlxuICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzL2xhdGVzdC9kb2NzL3Jlc291cmNlcy9sYW1iZGFfZnVuY3Rpb24jcHVibGlzaCBMYW1iZGFGdW5jdGlvbiNwdWJsaXNofVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGlzaD86IGJvb2xlYW4gfCBJUmVzb2x2YWJsZTtcblxuICAvLyAvLyBUaGlzIHdpbGwgYmUgZGVmaW5lZCBieSBleHRlbmRpbmcgY2xhc3Nlc1xuICAvLyAvLyByZWY6IGh0dHBzOi8vYXdzLmdpdGh1Yi5pby9qc2lpL3VzZXItZ3VpZGVzL2xpYi1hdXRob3IvdHlwZXNjcmlwdC1yZXN0cmljdGlvbnMvI2NvdmFyaWFudC1vdmVycmlkZXMtcGFyYW1ldGVyLWxpc3QtY2hhbmdlc1xuICAvLyAvLyBpbXBsZW1lbnQgUnVudGltZSBhcyBhIGNsYXNzP1xuICAvLyAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTYuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtbGFtYmRhL2xpYi9ydW50aW1lLnRzXG4gIC8vIC8qKlxuICAvLyAgKiBJZGVudGlmaWVyIG9mIHRoZSBmdW5jdGlvbidzIHJ1bnRpbWUuXG4gIC8vICAqXG4gIC8vICAqIERvY3M6XG4gIC8vICAqIC0gYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvbGF0ZXN0L2RvY3MvcmVzb3VyY2VzL2xhbWJkYV9mdW5jdGlvbiNydW50aW1lIExhbWJkYUZ1bmN0aW9uI3J1bnRpbWV9XG4gIC8vICAqIC0gQVdTIExhbWJkYSBDcmVhdEZ1bmN0aW9uIGRvY3M6IHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9hcGkvQVBJX0NyZWF0ZUZ1bmN0aW9uLmh0bWwjbGFtYmRhLUNyZWF0ZUZ1bmN0aW9uLXJlcXVlc3QtUnVudGltZSBDcmVhdGVGdW5jdGlvbiNybnRpbWV9XG4gIC8vICAqL1xuICAvLyByZWFkb25seSBydW50aW1lPzogc3RyaW5nO1xufVxuXG4vLyByZS1hZGQgZWMyLklDb25uZWN0YWJsZT9cblxuLy8gLyoqXG4vLyAgKiBBIExhbWJkYSBmdW5jdGlvbi5cbi8vICAqL1xuLy8gZXhwb3J0IGludGVyZmFjZSBJRnVuY3Rpb24gZXh0ZW5kcyBJQXdzQ29uc3RydWN0LCBpYW0uSUdyYW50YWJsZSB7XG5cbi8vICAgLyoqXG4vLyAgICAqIEFkZCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGlzIGZ1bmN0aW9uLlxuLy8gICAgKi9cbi8vICAgYWRkRW52aXJvbm1lbnQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBJRnVuY3Rpb247XG4vLyB9XG5cbi8qKlxuICogUHJvdmlkZXMgYSBMYW1iZGEgRnVuY3Rpb24gcmVzb3VyY2UuIExhbWJkYSBhbGxvd3MgeW91IHRvIHRyaWdnZXIgZXhlY3V0aW9uXG4gKiBvZiBjb2RlIGluIHJlc3BvbnNlIHRvIGV2ZW50cyBpbiBBV1MsIGVuYWJsaW5nIHNlcnZlcmxlc3MgYmFja2VuZCBzb2x1dGlvbnMuXG4gKlxuICogVGhlIExhbWJkYSBGdW5jdGlvbiBpdHNlbGYgaW5jbHVkZXMgc291cmNlIGNvZGUgYW5kIHJ1bnRpbWUgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBUaGlzIENvbnN0cnVjdCBtYW5hZ2VzIHBlcm1pc3Npb25zIGFzIHBhcnQgb2YgdGhlIGZ1bmN0aW9uIFByaW5jaXBhbCBpYW0gcG9saWN5LlxuICogVGhpcyB3b3JrcyBmb3Igc2FtZSBhY2NvdW50IHJlc291cmNlcywgYnV0IGZvciBjcm9zcy1hY2NvdW50IHJlc291cmNlcyxcbiAqIHlvdSBtYXkgbmVlZCB0byBtYW5hZ2UgYWNjZXNzIGFzIHBhcnQgb2YgdGhlIFJlc291cmNlIGlhbSBwb2xpY3kuXG4gKlxuICogQHJlc291cmNlIGF3c19sYW1iZGFfZnVuY3Rpb25cbiAqIEBiZWFjb24tY2xhc3MgY29tcHV0ZS5JRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYUZ1bmN0aW9uIGV4dGVuZHMgTGFtYmRhRnVuY3Rpb25CYXNlIGltcGxlbWVudHMgSUZ1bmN0aW9uIHtcbiAgLy8gVE9ETzogVGVycmFmb3JtIGF3c19sYW1iZGFfZnVuY3Rpb24gPT0gQ0RLIEZ1bmN0aW9uVmVyc2lvblxuXG4gIC8qKlxuICAgKiBMYXRlc3QgcHVibGlzaGVkIHZlcnNpb24gb2YgeW91ciBMYW1iZGEgRnVuY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZlcnNpb24oKTogc3RyaW5nIHtcbiAgICAvLyBUT0RPOiBXaGF0IGlzIHRoaXMgaWYgcHVibGlzaCBpcyBmYWxzZT8/XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UudmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYSBsYW1iZGEgZnVuY3Rpb24gaW50byB0aGUgVGVycmFDb25zdHJ1Y3Qgc3BlYyB1c2luZyBpdHMgbmFtZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRnVuY3Rpb25OYW1lKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgKTogSUZ1bmN0aW9uIHtcbiAgICByZXR1cm4gTGFtYmRhRnVuY3Rpb24uZnJvbUZ1bmN0aW9uQXR0cmlidXRlcyhzY29wZSwgaWQsIHtcbiAgICAgIGZ1bmN0aW9uQXJuOiBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogXCJsYW1iZGFcIixcbiAgICAgICAgcmVzb3VyY2U6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgcmVzb3VyY2VOYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUsXG4gICAgICB9KSxcbiAgICAgIHNhbWVFbnZpcm9ubWVudDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYSBsYW1iZGEgZnVuY3Rpb24gaW50byB0aGUgVGVycmFDb25zdHJ1Y3Qgc3BlYyB1c2luZyBpdHMgQVJOLlxuICAgKlxuICAgKiBGb3IgYEZ1bmN0aW9uLmFkZFBlcm1pc3Npb25zKClgIHRvIHdvcmsgb24gdGhpcyBpbXBvcnRlZCBsYW1iZGEsIG1ha2Ugc3VyZSB0aGF0IGlzXG4gICAqIGluIHRoZSBzYW1lIGFjY291bnQgYW5kIHJlZ2lvbiBhcyB0aGUgc3RhY2sgeW91IGFyZSBpbXBvcnRpbmcgaXQgaW50by5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZ1bmN0aW9uQXJuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBmdW5jdGlvbkFybjogc3RyaW5nLFxuICApOiBJRnVuY3Rpb24ge1xuICAgIHJldHVybiBMYW1iZGFGdW5jdGlvbi5mcm9tRnVuY3Rpb25BdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyBmdW5jdGlvbkFybiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgTGFtYmRhIGZ1bmN0aW9uIG9iamVjdCB3aGljaCByZXByZXNlbnRzIGEgZnVuY3Rpb24gbm90IGRlZmluZWRcbiAgICogd2l0aGluIHRoaXMgc3RhY2suXG4gICAqXG4gICAqIEZvciBgRnVuY3Rpb24uYWRkUGVybWlzc2lvbnMoKWAgdG8gd29yayBvbiB0aGlzIGltcG9ydGVkIGxhbWJkYSwgc2V0IHRoZSBzYW1lRW52aXJvbm1lbnQgcHJvcGVydHkgdG8gdHJ1ZVxuICAgKiBpZiB0aGlzIGltcG9ydGVkIGxhbWJkYSBpcyBpbiB0aGUgc2FtZSBhY2NvdW50IGFuZCByZWdpb24gYXMgdGhlIHN0YWNrIHlvdSBhcmUgaW1wb3J0aW5nIGl0IGludG8uXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgcGFyZW50IGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgVGhlIG5hbWUgb2YgdGhlIGxhbWJkYSBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBmdW5jdGlvbiB0byBpbXBvcnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZ1bmN0aW9uQXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IEZ1bmN0aW9uQXR0cmlidXRlcyxcbiAgKTogSUZ1bmN0aW9uIHtcbiAgICBjb25zdCBmdW5jdGlvbkFybiA9IGF0dHJzLmZ1bmN0aW9uQXJuO1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGV4dHJhY3ROYW1lRnJvbUFybihhdHRycy5mdW5jdGlvbkFybik7XG4gICAgY29uc3Qgcm9sZSA9IGF0dHJzLnJvbGU7XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBMYW1iZGFGdW5jdGlvbkJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBkYXRhQXdzTGFtYmRhRnVuY3Rpb24uRGF0YUF3c0xhbWJkYUZ1bmN0aW9uO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uTmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBmdW5jdGlvbkFybiA9IGZ1bmN0aW9uQXJuO1xuICAgICAgLy8gVE9ETzogUmVzb2x2ZSByb2xlIGFuZCBwcmluY2lwYWwgcmVzb2x2ZSBmcm9tIFRGIGRhdGEgc291cmNlP1xuICAgICAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcbiAgICAgIHB1YmxpYyByZWFkb25seSByb2xlID0gcm9sZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uc05vZGUgPSB0aGlzLm5vZGU7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBMYW1iZGEgZnVuY3Rpb24gcmV0dXJuZWQuXG4gICAgICAgKlxuICAgICAgICogSWYgcXVhbGlmaWVyIGlzIG5vdCBzZXQsIHRoaXMgd2lsbCByZXNvbHZlIHRvIHRoZSBtb3N0IHJlY2VudCBwdWJsaXNoZWQgdmVyc2lvbi5cbiAgICAgICAqIElmIG5vIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBleGlzdHMsIHZlcnNpb24gd2lsbCByZXNvbHZlIHRvIGAkTEFURVNUYC5cbiAgICAgICAqL1xuICAgICAgcHVibGljIGdldCB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlLnZlcnNpb247XG4gICAgICB9XG4gICAgICAvLyBGb3JjZSB1c2VyIHRvIHByb3ZpZGUgYXJjaCBvciBhc3N1bWUgWDg2XzY0XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlID0gYXR0cnMuYXJjaGl0ZWN0dXJlID8/IEFyY2hpdGVjdHVyZS5YODZfNjQ7XG4gICAgICAvLyBwdWJsaWMgZ2V0IGFyY2hpdGVjdHVyZSgpOiBzdHJpbmcge1xuICAgICAgLy8gICByZXR1cm4gRm4uZWxlbWVudCh0aGlzLnJlc291cmNlLmFyY2hpdGVjdHVyZXMsIDApIGFzIHN0cmluZztcbiAgICAgIC8vIH1cbiAgICAgIHB1YmxpYyByZWFkb25seSByZXNvdXJjZUFybnNGb3JHcmFudEludm9rZSA9IFtcbiAgICAgICAgdGhpcy5mdW5jdGlvbkFybixcbiAgICAgICAgYCR7dGhpcy5mdW5jdGlvbkFybn06KmAsXG4gICAgICBdO1xuICAgICAgcHVibGljIGdldCBmdW5jdGlvbk91dHB1dHMoKTogRnVuY3Rpb25PdXRwdXRzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiB0aGlzLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICBhcm46IHRoaXMuZnVuY3Rpb25Bcm4sXG4gICAgICAgICAgcm9sZUFybjogdGhpcy5yb2xlPy5yb2xlQXJuID8/IFwiXCIsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBwdWJsaWMgZ2V0IG91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmN0aW9uT3V0cHV0cztcbiAgICAgIH1cbiAgICAgIHByb3RlY3RlZCByZWFkb25seSBjYW5DcmVhdGVQZXJtaXNzaW9ucyA9XG4gICAgICAgIGF0dHJzLnNhbWVFbnZpcm9ubWVudCA/PyB0aGlzLl9pc1N0YWNrQWNjb3VudCgpO1xuICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9za2lwUGVybWlzc2lvbnMgPSBhdHRycy5za2lwUGVybWlzc2lvbnMgPz8gZmFsc2U7XG5cbiAgICAgIGNvbnN0cnVjdG9yKHM6IENvbnN0cnVjdCwgaTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHMsIGksIHtcbiAgICAgICAgICBlbnZpcm9ubWVudEZyb21Bcm46IGZ1bmN0aW9uQXJuLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmdyYW50UHJpbmNpcGFsID1cbiAgICAgICAgICByb2xlIHx8IG5ldyBpYW0uVW5rbm93blByaW5jaXBhbCh7IHJlc291cmNlOiB0aGlzIH0pO1xuICAgICAgICB0aGlzLnJlc291cmNlID0gbmV3IGRhdGFBd3NMYW1iZGFGdW5jdGlvbi5EYXRhQXdzTGFtYmRhRnVuY3Rpb24oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcIlJlc291cmNlXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIC8vIFRPRE86IHJlLWFkZCBzdXBwb3J0IGZvciBFQzIgY29ubmVjdGlvbnNcbiAgICAgICAgLy8gaWYgKGF0dHJzLnNlY3VyaXR5R3JvdXApIHtcbiAgICAgICAgLy8gICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBlYzIuQ29ubmVjdGlvbnMoe1xuICAgICAgICAvLyAgICAgc2VjdXJpdHlHcm91cHM6IFthdHRycy5zZWN1cml0eUdyb3VwXSxcbiAgICAgICAgLy8gICB9KTtcbiAgICAgICAgLy8gfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb3VyY2U6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX291dHB1dHM6IEZ1bmN0aW9uT3V0cHV0cztcblxuICAvKiogU3Ryb25nbHkgVHlwZWQgRnVuY3Rpb24gT3V0cHV0cyAqL1xuICBwdWJsaWMgZ2V0IGZ1bmN0aW9uT3V0cHV0cygpOiBGdW5jdGlvbk91dHB1dHMge1xuICAgIHJldHVybiB0aGlzLl9vdXRwdXRzO1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvbk91dHB1dHM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiAobm90IGEgVE9LRU4pXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gZm8gdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBmdW5jdGlvbkFybigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLmFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgQVJOIGZvIHRoZSBmdW5jdGlvbi5cbiAgICogKGlmIHZlcnNpb25pbmcgaXMgZW5hYmxlZCB2aWEgcHVibGlzaCA9IHRydWUpXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZ1bmN0aW9uUXVhbGlmaWVkQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UucXVhbGlmaWVkQXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gZm8gdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBmdW5jdGlvblF1YWxpZmllZEludm9rZUFybigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLnF1YWxpZmllZEludm9rZUFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoaXMgTGFtYmRhIEZ1bmN0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpbmNpcGFsIHRoaXMgTGFtYmRhIEZ1bmN0aW9uIGlzIHJ1bm5pbmcgYXNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmdW5jdGlvbi5cbiAgICpcbiAgICogVW5kZWZpbmVkIGlmIHRoZSBmdW5jdGlvbiB3YXMgaW1wb3J0ZWQgd2l0aG91dCBhIHJvbGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogVGhlIERMUSAoYXMgcXVldWUpIGFzc29jaWF0ZWQgd2l0aCB0aGlzIExhbWJkYSBGdW5jdGlvbiAodGhpcyBpcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlYWRMZXR0ZXJRdWV1ZT86IElRdWV1ZTtcblxuICAvKipcbiAgICogVGhlIHRpbWVvdXQgY29uZmlndXJlZCBmb3IgdGhpcyBsYW1iZGEuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uc3RydWN0IG5vZGUgd2hlcmUgcGVybWlzc2lvbnMgYXJlIGF0dGFjaGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zTm9kZSA9IHRoaXMubm9kZTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FuQ3JlYXRlUGVybWlzc2lvbnMgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGludm9jYXRpb24gcHJpbmNpcGFscyB0byBncmFudHMuIFVzZWQgdG8gZGUtZHVwZSBgZ3JhbnRJbnZva2UoKWAgY2FsbHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9pbnZvY2F0aW9uR3JhbnRzOiBSZWNvcmQ8c3RyaW5nLCBpYW0uR3JhbnQ+ID0ge307XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgZnVjbnRpb24gVVJMIGludm9jYXRpb24gcHJpbmNpcGFscyB0byBncmFudHMuIFVzZWQgdG8gZGUtZHVwZSBgZ3JhbnRJbnZva2VVcmwoKWAgY2FsbHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9mdW5jdGlvblVybEludm9jYXRpb25HcmFudHM6IFJlY29yZDxzdHJpbmcsIGlhbS5HcmFudD4gPSB7fTtcblxuICAvLyAvLyBUZXJhZm9ybSBwcm92aWRlciBmb3IgQVdTIEF1dG9tYXRpY2FsbHkgbWFuYWdlcyBGdW5jdGlvbiBWZXJzaW9uaW5nIHRocm91Z2ggY29kZSBoYXNoLi5cbiAgLy8gLy8gbmVlZCB0byBkcm9wIG1vc3Qgb2YgdGhpcyB2ZXJzaW9uIGxvZ2ljLi5cblxuICAvLyBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRWZXJzaW9uT3B0aW9ucz86IFZlcnNpb25PcHRpb25zO1xuICAvLyBwcml2YXRlIF9jdXJyZW50VmVyc2lvbj86IFZlcnNpb247XG4gIC8vIC8qKlxuICAvLyAgKiBSZXR1cm5zIGEgYGxhbWJkYS5WZXJzaW9uYCB3aGljaCByZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhpc1xuICAvLyAgKiBMYW1iZGEgZnVuY3Rpb24uIEEgbmV3IHZlcnNpb24gd2lsbCBiZSBjcmVhdGVkIGV2ZXJ5IHRpbWUgdGhlIGZ1bmN0aW9uJ3NcbiAgLy8gICogY29uZmlndXJhdGlvbiBjaGFuZ2VzLlxuICAvLyAgKlxuICAvLyAgKiBZb3UgY2FuIHNwZWNpZnkgb3B0aW9ucyBmb3IgdGhpcyB2ZXJzaW9uIHVzaW5nIHRoZSBgY3VycmVudFZlcnNpb25PcHRpb25zYFxuICAvLyAgKiBwcm9wIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBgbGFtYmRhLkZ1bmN0aW9uYC5cbiAgLy8gICovXG4gIC8vIHB1YmxpYyBnZXQgY3VycmVudFZlcnNpb24oKTogVmVyc2lvbiB7XG4gIC8vICAgaWYgKHRoaXMuX2N1cnJlbnRWZXJzaW9uKSB7XG4gIC8vICAgICByZXR1cm4gdGhpcy5fY3VycmVudFZlcnNpb247XG4gIC8vICAgfVxuXG4gIC8vICAgLy8gaWYgKHRoaXMuX3dhcm5JZkN1cnJlbnRWZXJzaW9uQ2FsbGVkKSB7XG4gIC8vICAgLy8gICB0aGlzLndhcm5JbnZva2VGdW5jdGlvblBlcm1pc3Npb25zKHRoaXMpO1xuICAvLyAgIC8vIH1cblxuICAvLyAgIHRoaXMuX2N1cnJlbnRWZXJzaW9uID0gbmV3IFZlcnNpb24odGhpcywgXCJDdXJyZW50VmVyc2lvblwiLCB7XG4gIC8vICAgICBsYW1iZGE6IHRoaXMsXG4gIC8vICAgICAuLi50aGlzLmN1cnJlbnRWZXJzaW9uT3B0aW9ucyxcbiAgLy8gICB9KTtcblxuICAvLyAgIC8vIG92ZXJyaWRlIHRoZSB2ZXJzaW9uJ3MgbG9naWNhbCBJRCB3aXRoIGEgbGF6eSBzdHJpbmcgd2hpY2ggaW5jbHVkZXMgdGhlXG4gIC8vICAgLy8gaGFzaCBvZiB0aGUgZnVuY3Rpb24gaXRzZWxmLCBzbyBhIG5ldyB2ZXJzaW9uIHJlc291cmNlIGlzIGNyZWF0ZWQgd2hlblxuICAvLyAgIC8vIHRoZSBmdW5jdGlvbiBjb25maWd1cmF0aW9uIGNoYW5nZXMuXG4gIC8vICAgY29uc3QgY2ZuID0gdGhpcy5fY3VycmVudFZlcnNpb24ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgVGVycmFmb3JtUmVzb3VyY2U7XG4gIC8vICAgY29uc3Qgb3JpZ2luYWxMb2dpY2FsSWQgPSB0aGlzLnN0YWNrLnJlc29sdmUoY2ZuLmxvZ2ljYWxJZCkgYXMgc3RyaW5nO1xuXG4gIC8vICAgY2ZuLm92ZXJyaWRlTG9naWNhbElkKFxuICAvLyAgICAgTGF6eS5zdHJpbmdWYWx1ZSh7XG4gIC8vICAgICAgIHByb2R1Y2U6ICgpID0+IHtcbiAgLy8gICAgICAgICBjb25zdCBoYXNoID0gY2FsY3VsYXRlRnVuY3Rpb25IYXNoKHRoaXMsIHRoaXMuaGFzaE1peGlucy5qb2luKFwiXCIpKTtcbiAgLy8gICAgICAgICBjb25zdCBsb2dpY2FsSWQgPSB0cmltRnJvbVN0YXJ0KG9yaWdpbmFsTG9naWNhbElkLCAyNTUgLSAzMik7XG4gIC8vICAgICAgICAgcmV0dXJuIGAke2xvZ2ljYWxJZH0ke2hhc2h9YDtcbiAgLy8gICAgICAgfSxcbiAgLy8gICAgIH0pLFxuICAvLyAgICk7XG5cbiAgLy8gICByZXR1cm4gdGhpcy5fY3VycmVudFZlcnNpb247XG4gIC8vIH1cblxuICAvKipcbiAgICogVGhlIEFSTihzKSB0byBwdXQgaW50byB0aGUgcmVzb3VyY2UgZmllbGQgb2YgdGhlIGdlbmVyYXRlZCBJQU0gcG9saWN5IGZvciBncmFudEludm9rZSgpXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlQXJuc0ZvckdyYW50SW52b2tlKCkge1xuICAgIC8vIFRPRE86IHNob3VsZCB0aGlzIGJlIHF1YWxpZmllZEFybiBvciBxdWFsaWZpZWRJbnZva2VBcm4/XG4gICAgLy8gaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS42OC4wL2RvY3MvcmVzb3VyY2VzL2xhbWJkYV9mdW5jdGlvbiNxdWFsaWZpZWRfYXJuXG4gICAgcmV0dXJuIFt0aGlzLmZ1bmN0aW9uQXJuLCB0aGlzLmZ1bmN0aW9uUXVhbGlmaWVkSW52b2tlQXJuXTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIHJlYWRvbmx5IF9sb2dHcm91cDogY2xvdWR3YXRjaExvZ0dyb3VwLkNsb3Vkd2F0Y2hMb2dHcm91cDtcblxuICAvKipcbiAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGlzIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICBwcml2YXRlIF91cmw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIVFRQIEVuZHBvaW50IGZvciB0aGlzIGZ1bmN0aW9uIGlmIGRlZmluZWQuXG4gICAqXG4gICAqIHVzZSBgYWRkRnVuY3Rpb25VcmxgIHRvIGVuYWJsZSBFbmRwb2ludC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIHByaXZhdGUgX2V2ZW50U291cmNlczoge1xuICAgIFtpZDogc3RyaW5nXTogbGFtYmRhRXZlbnRTb3VyY2VNYXBwaW5nLkxhbWJkYUV2ZW50U291cmNlTWFwcGluZztcbiAgfSA9IHt9O1xuICBwdWJsaWMgZ2V0IGV2ZW50U291cmNlcygpOiBsYW1iZGFFdmVudFNvdXJjZU1hcHBpbmcuTGFtYmRhRXZlbnRTb3VyY2VNYXBwaW5nW10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX2V2ZW50U291cmNlcyk7XG4gIH1cblxuICBwcml2YXRlIF9zZWN1cml0eUdyb3VwPzogc2VjdXJpdHlHcm91cC5TZWN1cml0eUdyb3VwO1xuICBwdWJsaWMgZ2V0IHNlY3VyaXR5R3JvdXAoKTogc2VjdXJpdHlHcm91cC5TZWN1cml0eUdyb3VwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdXJpdHlHcm91cDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG5hbWU6IHN0cmluZywgcHJvcHM6IEZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgbmFtZSwgcHJvcHMpO1xuXG4gICAgY29uc3Qge1xuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBlbnZpcm9ubWVudDogdmFyaWFibGVzLFxuICAgICAgbG9nUmV0ZW50aW9uSW5EYXlzID0gUmV0ZW50aW9uRGF5cy5PTkVfV0VFSyxcbiAgICAgIG1lbW9yeVNpemUgPSAxMjgsXG4gICAgICB0aW1lb3V0ID0gRHVyYXRpb24uc2Vjb25kcygzKSxcbiAgICAgIGxheWVycyxcbiAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb3IgQVJOIG9mIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICogaXMgbGltaXRlZCB0byA2NCBjaGFyYWN0ZXJzIGluIGxlbmd0aC5cbiAgICAgKlxuICAgICAqIEFSTiBQYXR0ZXJuOiAoW2EtekEtWjAtOS1fXSspKDooXFwkTEFURVNUfFthLXpBLVowLTktX10rKSk/XG4gICAgICovXG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID1cbiAgICAgIHByb3BzLmZ1bmN0aW9uTmFtZSA/P1xuICAgICAgdGhpcy5zdGFjay51bmlxdWVSZXNvdXJjZU5hbWVQcmVmaXgodGhpcywge1xuICAgICAgICBwcmVmaXg6IHByb3BzLmZ1bmN0aW9uTmFtZVByZWZpeCA/PyB0aGlzLmdyaWRVVUlEICsgXCItXCIsXG4gICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogXCIrXCIsXG4gICAgICAgIG1heExlbmd0aDogNjQsXG4gICAgICB9KTtcblxuICAgIGlmIChmdW5jdGlvbk5hbWUgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChmdW5jdGlvbk5hbWUpKSB7XG4gICAgICBpZiAoZnVuY3Rpb25OYW1lLmxlbmd0aCA+IDY0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRnVuY3Rpb24gbmFtZSBjYW4gbm90IGJlIGxvbmdlciB0aGFuIDY0IGNoYXJhY3RlcnMgYnV0IGhhcyAke2Z1bmN0aW9uTmFtZS5sZW5ndGh9IGNoYXJhY3RlcnMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICghL15bYS16QS1aMC05LV9dKyQvLnRlc3QoZnVuY3Rpb25OYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZ1bmN0aW9uIG5hbWUgJHtmdW5jdGlvbk5hbWV9IGNhbiBjb250YWluIG9ubHkgbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgb3IgdW5kZXJzY29yZXMgd2l0aCBubyBzcGFjZXMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVzY3JpcHRpb24gJiYgIVRva2VuLmlzVW5yZXNvbHZlZChkZXNjcmlwdGlvbikpIHtcbiAgICAgIGlmIChkZXNjcmlwdGlvbi5sZW5ndGggPiAyNTYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGdW5jdGlvbiBkZXNjcmlwdGlvbiBjYW4gbm90IGJlIGxvbmdlciB0aGFuIDI1NiBjaGFyYWN0ZXJzIGJ1dCBoYXMgJHtkZXNjcmlwdGlvbi5sZW5ndGh9IGNoYXJhY3RlcnMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtYW5hZ2VkUG9saWNpZXMgPSBuZXcgQXJyYXk8aWFtLklNYW5hZ2VkUG9saWN5PigpO1xuICAgIC8vIHRoZSBhcm4gaXMgaW4gdGhlIGZvcm0gb2YgLSBhcm46YXdzOmlhbTo6YXdzOnBvbGljeS9zZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlXG4gICAgbWFuYWdlZFBvbGljaWVzLnB1c2goXG4gICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlXCIsXG4gICAgICAgIFwic2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZVwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIGlmIChwcm9wcy5uZXR3b3JrQ29uZmlnKSB7XG4gICAgICAvLyBQb2xpY3kgdGhhdCB3aWxsIGhhdmUgRU5JIGNyZWF0aW9uIHBlcm1pc3Npb25zXG4gICAgICAvLyBub3Qgc3VyZSBpZiB0aW1lLnNsZWVwIGlzIG5lY2Vzc2FyeT9cbiAgICAgIC8vIHJlZjpcbiAgICAgIC8vICAtIGh0dHBzOi8vZ2l0aHViLmNvbS9wdWx1bWkvcHVsdW1pLWF3cy9pc3N1ZXMvMjI2MCNpc3N1ZWNvbW1lbnQtMTk3NzYwNjUwOVxuICAgICAgLy8gIC0gaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tcHJvdmlkZXItYXdzL2lzc3Vlcy8yOTgyOCNpc3N1ZWNvbW1lbnQtMTY5MzMwNzUwMFxuICAgICAgbWFuYWdlZFBvbGljaWVzLnB1c2goXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIFwiQVdTTGFtYmRhVlBDQWNjZXNzRXhlY3V0aW9uUm9sZVwiLFxuICAgICAgICAgIFwic2VydmljZS1yb2xlL0FXU0xhbWJkYVZQQ0FjY2Vzc0V4ZWN1dGlvblJvbGVcIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogQW55IGNvbmNlcm4gbm90IHNjb3BpbmcgdGhlIGxvZ0dyb3VwIElBTSBQZXJtaXNzaW9ucz9cbiAgICAvLyAuYWxsb3coKVxuICAgIC8vIC50b0NyZWF0ZUxvZ1N0cmVhbSgpXG4gICAgLy8gLnRvUHV0TG9nRXZlbnRzKClcbiAgICAvLyAub24obG9nR3JvdXAuYXJuLCBgJHtsb2dHcm91cC5hcm59OmxvZy1zdHJlYW06KmApLFxuXG4gICAgdGhpcy5yb2xlID1cbiAgICAgIHByb3BzLnJvbGUgfHxcbiAgICAgIG5ldyBpYW0uUm9sZSh0aGlzLCBcIlNlcnZpY2VSb2xlXCIsIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJsYW1iZGEuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgICAgbWFuYWdlZFBvbGljaWVzLFxuICAgICAgfSk7XG4gICAgdGhpcy5ncmFudFByaW5jaXBhbCA9IHRoaXMucm9sZTtcbiAgICAvLyBUT0RPOiBSZS1hZGQgZmlsZXN5c3RlbSAvIGxvY2FsTW91bnRQYXRoIHN1cHBvcnRcbiAgICAvLyByZWY6IGZpbGVzeXN0ZW0uY29uZmlnLnBvbGljaWVzIHRvIGJlIGFkZGVkIHRvIHByaW5jaXBhbFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1sYW1iZGEvbGliL2Z1bmN0aW9uLnRzI0w5NDktTDk2NVxuXG4gICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgcHJvcHMuaW5pdGlhbFBvbGljeSB8fCBbXSkge1xuICAgICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gYWRkIHN1cHBvcnQgZm9yIEFXU19DT0RFR1VSVSBQcm9maWxlIGVudiB2YXJpYWJsZXMuLi5cbiAgICBjb25zdCBlbnYgPSB2YXJpYWJsZXMgfHwge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52KSkge1xuICAgICAgdGhpcy5hZGRFbnZpcm9ubWVudChrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBETFEgY2FuIGJlIGVpdGhlciBzbnMuSVRvcGljIG9yIHNxcy5JUXVldWVcbiAgICBjb25zdCBkbHFUb3BpY09yUXVldWUgPSB0aGlzLmJ1aWxkRGVhZExldHRlclF1ZXVlKHByb3BzKTtcbiAgICBpZiAoZGxxVG9waWNPclF1ZXVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzUXVldWUoZGxxVG9waWNPclF1ZXVlKSkge1xuICAgICAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZSA9IGRscVRvcGljT3JRdWV1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlYWRMZXR0ZXJUb3BpYyBpcyBub3Qgc3VwcG9ydGVkIHlldFwiKTtcbiAgICAgICAgLy8gdGhpcy5kZWFkTGV0dGVyVG9waWMgPSBkbHFUb3BpY09yUXVldWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbG9nR3JvdXAgPSBuZXcgY2xvdWR3YXRjaExvZ0dyb3VwLkNsb3Vkd2F0Y2hMb2dHcm91cChcbiAgICAgIHRoaXMsXG4gICAgICBcIkxvZ0dyb3VwXCIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gLFxuICAgICAgICByZXRlbnRpb25JbkRheXM6IGxvZ1JldGVudGlvbkluRGF5cyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLl9sb2dHcm91cCA9IGxvZ0dyb3VwO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBsYW1iZGFGdW5jdGlvbi5MYW1iZGFGdW5jdGlvbih0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgcm9sZTogdGhpcy5yb2xlLnJvbGVBcm4sXG4gICAgICBhcmNoaXRlY3R1cmVzOiBbXG4gICAgICAgIC8vIFRoaXMgaXMgYW4gYXJyYXksIGJ1dCBtYXhpbXVtIGxlbmd0aCBpcyAxIVxuICAgICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtbGFtYmRhLWZ1bmN0aW9uLmh0bWwjY2ZuLWxhbWJkYS1mdW5jdGlvbi1hcmNoaXRlY3R1cmVzXG4gICAgICAgIHByb3BzLmFyY2hpdGVjdHVyZT8udG9TdHJpbmcoKSA/PyBBcmNoaXRlY3R1cmUuWDg2XzY0LnRvU3RyaW5nKCksXG4gICAgICBdLFxuICAgICAgbWVtb3J5U2l6ZSxcbiAgICAgIHRpbWVvdXQ6IHRpbWVvdXQudG9TZWNvbmRzKCksXG4gICAgICBsYXllcnMsIC8vIFRPRE86IFN1cHBvcnQgSUxheWVyIHdpdGggTGF6eSBsaXN0IG9mIGFybnNcbiAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgICAvLyBUT0RPOiBDREsgU29ydHMgZW52aXJvbm1lbnQgdG8gbWF0Y2ggTGFtYmRhIEhhc2ggYmVoYXZpb3VyXG4gICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE1Ni4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1sYW1iZGEvbGliL2Z1bmN0aW9uLnRzI0wxNDY3XG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICB2YXJpYWJsZXM6IExhenkuYW55VmFsdWUoe1xuICAgICAgICAgIHByb2R1Y2U6IChfY29udGV4dDogSVJlc29sdmVDb250ZXh0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSBhcyBhbnksXG4gICAgICB9LFxuICAgICAgdnBjQ29uZmlnOiB0aGlzLnBhcnNlVnBjQ29uZmlnKHByb3BzLm5ldHdvcmtDb25maWcpLFxuICAgICAgbG9nZ2luZ0NvbmZpZzogdGhpcy5nZXRMb2dnaW5nQ29uZmlnKHRoaXMuX2xvZ0dyb3VwLm5hbWUsIHByb3BzKSxcbiAgICAgIHRyYWNpbmdDb25maWc6IHRoaXMucGFyc2VUcmFjaW5nQ29uZmlnKHByb3BzLnRyYWNpbmcgPz8gVHJhY2luZy5BQ1RJVkUpLFxuICAgICAgZGVhZExldHRlckNvbmZpZzogdGhpcy5wYXJzZURlYWRMZXR0ZXJDb25maWcoZGxxVG9waWNPclF1ZXVlKSxcbiAgICAgIHB1Ymxpc2g6IHByb3BzLnB1Ymxpc2gsXG4gICAgICAvLyBUT0RPOiB1c2UgbG9nR3JvdXAubm9kZS5hZGREZXBlbmRlbmN5IHdoZW4gbG9nR3JvdXAgaXMgaW1wbGVtZW50ZWRcbiAgICAgIGRlcGVuZHNPbjogW2xvZ0dyb3VwXSxcbiAgICB9KTtcbiAgICB0aGlzLmZ1bmN0aW9uTmFtZSA9IHRoaXMucmVzb3VyY2UuZnVuY3Rpb25OYW1lO1xuXG4gICAgLy8gbWFrZSBzdXJlIGFueSByb2xlIGF0dGFjaG1lbnRzIGFyZSBhZGRlZCBhcyBkZXBlbmRlbmNpZXMgZm9yIHRoaXMgbGFtYmRhXG4gICAgLy8gdGhpcyBhY2hpZXZlZCBieSB0aGUgQ0RLVEYgQXNwZWN0IG9uIHRoZSBwYXJlbnQgU3RhY2tCYXNlXG4gICAgdGhpcy5yZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5yb2xlKTtcblxuICAgIHRoaXMudGltZW91dCA9IHByb3BzLnRpbWVvdXQ7XG4gICAgdGhpcy5hcmNoaXRlY3R1cmUgPSBwcm9wcy5hcmNoaXRlY3R1cmUgPz8gQXJjaGl0ZWN0dXJlLlg4Nl82NDtcblxuICAgIC8vIFRPRE86IEFkZCBhd3NfbGFtYmRhX3Byb3Zpc2lvbmVkX2NvbmN1cnJlbmN5X2NvbmZpZ1xuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBwcm9wcy5ldmVudHMgfHwgW10pIHtcbiAgICAgIHRoaXMuYWRkRXZlbnRTb3VyY2UoZXZlbnQpO1xuICAgIH1cblxuICAgIC8vIEV2ZW50IEludm9rZSBDb25maWdcbiAgICBpZiAoXG4gICAgICBwcm9wcy5vbkZhaWx1cmUgfHxcbiAgICAgIHByb3BzLm9uU3VjY2VzcyB8fFxuICAgICAgcHJvcHMubWF4RXZlbnRBZ2UgfHxcbiAgICAgIHByb3BzLnJldHJ5QXR0ZW1wdHMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy5jb25maWd1cmVBc3luY0ludm9rZSh7XG4gICAgICAgIG9uRmFpbHVyZTogcHJvcHMub25GYWlsdXJlLFxuICAgICAgICBvblN1Y2Nlc3M6IHByb3BzLm9uU3VjY2VzcyxcbiAgICAgICAgbWF4RXZlbnRBZ2U6IHByb3BzLm1heEV2ZW50QWdlLFxuICAgICAgICByZXRyeUF0dGVtcHRzOiBwcm9wcy5yZXRyeUF0dGVtcHRzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fb3V0cHV0cyA9IHtcbiAgICAgIG5hbWU6IHRoaXMuZnVuY3Rpb25OYW1lLFxuICAgICAgYXJuOiB0aGlzLnJlc291cmNlLmFybixcbiAgICAgIHJvbGVBcm46IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgLy8gb25seSBrbm93biBhdCBzeW50aCB0aW1lXG4gICAgICAvLyBleHBsaWNpdCBgbnVsbGAgcmVxdWlyZWQgdG8gYXZvaWQgc3ludGF4IGVycm9ycyB3aGVuIHVzaW5nIHN0cmluZ1ZhbHVlICYmIFwidW5kZWZpbmVkXCJcbiAgICAgIHVybDogTGF6eS5hbnlWYWx1ZSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMuX3VybCA/PyBudWxsLFxuICAgICAgfSksXG4gICAgICBkZWZhdWx0U2VjdXJpdHlHcm91cDogTGF6eS5hbnlWYWx1ZSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMuX3NlY3VyaXR5R3JvdXA/LmlkID8/IG51bGwsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhpcyBMYW1iZGEgZnVuY3Rpb24uXG4gICAqIElmIHRoaXMgaXMgYSByZWYgdG8gYSBMYW1iZGEgZnVuY3Rpb24sIHRoaXMgb3BlcmF0aW9uIHJlc3VsdHMgaW4gYSBuby1vcC5cbiAgICogQHBhcmFtIGtleSBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUga2V5LlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlJ3MgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgYWRkRW52aXJvbm1lbnQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBJRnVuY3Rpb24ge1xuICAgIC8vIFJlc2VydmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aWxsIGZhaWwgZHVyaW5nIGNsb3VkZm9ybWF0aW9uIGRlcGxveSBpZiB0aGV5J3JlIHNldC5cbiAgICAvLyBUaGlzIGNoZWNrIGlzIGp1c3QgdG8gYWxsb3cgQ0RLIHRvIGZhaWwgZmFzdGVyIHdoZW4gdGhlc2UgYXJlIHNwZWNpZmllZC5cbiAgICBjb25zdCByZXNlcnZlZEVudmlyb25tZW50VmFyaWFibGVzID0gW1xuICAgICAgXCJfSEFORExFUlwiLFxuICAgICAgXCJfWF9BTVpOX1RSQUNFX0lEXCIsXG4gICAgICBcIkFXU19ERUZBVUxUX1JFR0lPTlwiLFxuICAgICAgXCJBV1NfUkVHSU9OXCIsXG4gICAgICBcIkFXU19FWEVDVVRJT05fRU5WXCIsXG4gICAgICBcIkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRVwiLFxuICAgICAgXCJBV1NfTEFNQkRBX0ZVTkNUSU9OX01FTU9SWV9TSVpFXCIsXG4gICAgICBcIkFXU19MQU1CREFfRlVOQ1RJT05fVkVSU0lPTlwiLFxuICAgICAgXCJBV1NfTEFNQkRBX0lOSVRJQUxJWkFUSU9OX1RZUEVcIixcbiAgICAgIFwiQVdTX0xBTUJEQV9MT0dfR1JPVVBfTkFNRVwiLFxuICAgICAgXCJBV1NfTEFNQkRBX0xPR19TVFJFQU1fTkFNRVwiLFxuICAgICAgXCJBV1NfQUNDRVNTX0tFWVwiLFxuICAgICAgXCJBV1NfQUNDRVNTX0tFWV9JRFwiLFxuICAgICAgXCJBV1NfU0VDUkVUX0FDQ0VTU19LRVlcIixcbiAgICAgIFwiQVdTX1NFU1NJT05fVE9LRU5cIixcbiAgICAgIFwiQVdTX0xBTUJEQV9SVU5USU1FX0FQSVwiLFxuICAgICAgXCJMQU1CREFfVEFTS19ST09UXCIsXG4gICAgICBcIkxBTUJEQV9SVU5USU1FX0RJUlwiLFxuICAgIF07XG4gICAgaWYgKHJlc2VydmVkRW52aXJvbm1lbnRWYXJpYWJsZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtrZXl9IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlc2VydmVkIGJ5IHRoZSBsYW1iZGEgcnVudGltZSBhbmQgY2FuIG5vdCBiZSBzZXQgbWFudWFsbHkuIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9kZy9jb25maWd1cmF0aW9uLWVudnZhcnMuaHRtbGAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmVudmlyb25tZW50W2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBhZGRGdW5jdGlvblVybChvcHRpb25zPzogRnVuY3Rpb25VcmxPcHRpb25zKTogRnVuY3Rpb25Vcmwge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gc3VwZXIuYWRkRnVuY3Rpb25Vcmwob3B0aW9ucyk7XG4gICAgdGhpcy5fdXJsID0gZW5kcG9pbnQudXJsO1xuICAgIHJldHVybiBlbmRwb2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTG9nZ2luZyBDb25maWcgcHJvcGV0eSBmb3IgdGhlIGZ1bmN0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmdW5jdGlvbiBMb2dnaW5nQ29uZmlnIFByb3BlcnR5IGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgb24gdGhlXG4gICAqIGZ1bmN0aW9uIGFuZCB1bmRlZmluZWQgaWYgbm90LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRMb2dnaW5nQ29uZmlnKFxuICAgIGxvZ0dyb3VwTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBGdW5jdGlvblByb3BzLFxuICApOiBsYW1iZGFGdW5jdGlvbi5MYW1iZGFGdW5jdGlvbkxvZ2dpbmdDb25maWcgfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9wcy5hcHBsaWNhdGlvbkxvZ0xldmVsIHx8IHByb3BzLnN5c3RlbUxvZ0xldmVsKSB7XG4gICAgICBpZiAocHJvcHMubG9nZ2luZ0Zvcm1hdCAhPT0gTG9nZ2luZ0Zvcm1hdC5KU09OKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVG8gdXNlIEFwcGxpY2F0aW9uTG9nTGV2ZWwgYW5kL29yIFN5c3RlbUxvZ0xldmVsIHlvdSBtdXN0IHNldCBMb2dnaW5nRm9ybWF0IHRvICcke0xvZ2dpbmdGb3JtYXQuSlNPTn0nLCBnb3QgJyR7cHJvcHMubG9nZ2luZ0Zvcm1hdH0nLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGxvZ2dpbmdDb25maWc6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uTG9nZ2luZ0NvbmZpZztcbiAgICBpZiAocHJvcHMubG9nZ2luZ0Zvcm1hdCkge1xuICAgICAgbG9nZ2luZ0NvbmZpZyA9IHtcbiAgICAgICAgbG9nRm9ybWF0OiBwcm9wcy5sb2dnaW5nRm9ybWF0LFxuICAgICAgICBzeXN0ZW1Mb2dMZXZlbDogcHJvcHMuc3lzdGVtTG9nTGV2ZWwsXG4gICAgICAgIGFwcGxpY2F0aW9uTG9nTGV2ZWw6IHByb3BzLmFwcGxpY2F0aW9uTG9nTGV2ZWwsXG4gICAgICAgIGxvZ0dyb3VwOiBsb2dHcm91cE5hbWUsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGxvZ2dpbmdDb25maWc7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBhbiBhbGlhcyBmb3IgdGhpcyBmdW5jdGlvbi5cbiAgICpcbiAgICogVGhlIGFsaWFzIHdpbGwgYXV0b21hdGljYWxseSBiZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZlxuICAgKiB0aGUgZnVuY3Rpb24gYXMgaXQgaXMgYmVpbmcgdXBkYXRlZCBkdXJpbmcgYSBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBkZWNsYXJlIGNvbnN0IGZuOiBjb21wdXRlLkxhbWJkYUZ1bmN0aW9uO1xuICAgKlxuICAgKiBmbi5hZGRBbGlhcygnTGl2ZScpO1xuICAgKlxuICAgKiAvLyBJcyBlcXVpdmFsZW50IHRvXG4gICAqXG4gICAqIG5ldyBjb21wdXRlLkFsaWFzKHRoaXMsICdBbGlhc0xpdmUnLCB7XG4gICAqICAgYWxpYXNOYW1lOiAnTGl2ZScsXG4gICAqICAgdmVyc2lvbjogZm4udmVyc2lvbixcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gYWxpYXNOYW1lIFRoZSBuYW1lIG9mIHRoZSBhbGlhc1xuICAgKiBAcGFyYW0gb3B0aW9ucyBBbGlhcyBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYWRkQWxpYXMoYWxpYXNOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBBbGlhc09wdGlvbnMpOiBBbGlhcyB7XG4gICAgcmV0dXJuIGFkZEFsaWFzKHRoaXMsIHRoaXMsIHRoaXMudmVyc2lvbiwgYWxpYXNOYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb25hbGx5IGNyZWF0ZSBMYW1iZGFGdW5jdGlvblZwY0NvbmZpZ1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVZwY0NvbmZpZyhcbiAgICBjb25maWc/OiBWcGNDb25maWcsXG4gICk6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uVnBjQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbGV0IHNlY3VyaXR5R3JvdXBJZHMgPSBjb25maWcuc2VjdXJpdHlHcm91cElkcztcbiAgICBpZiAoIXNlY3VyaXR5R3JvdXBJZHMpIHtcbiAgICAgIHRoaXMuX3NlY3VyaXR5R3JvdXAgPSBuZXcgc2VjdXJpdHlHcm91cC5TZWN1cml0eUdyb3VwKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIlNlY3VyaXR5R3JvdXBcIixcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHRoaXMuZnVuY3Rpb25OYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICB2cGNJZDogY29uZmlnLnZwY0lkLFxuXG4gICAgICAgICAgZWdyZXNzOiBjb25maWcuZWdyZXNzID8/IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZnJvbVBvcnQ6IDAsXG4gICAgICAgICAgICAgIHRvUG9ydDogMCxcbiAgICAgICAgICAgICAgcHJvdG9jb2w6IFwiLTFcIixcbiAgICAgICAgICAgICAgY2lkckJsb2NrczogW1wiMC4wLjAuMC8wXCJdLFxuICAgICAgICAgICAgICBpcHY2Q2lkckJsb2NrczogW1wiOjovMFwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBzZWN1cml0eUdyb3VwSWRzID0gW3RoaXMuX3NlY3VyaXR5R3JvdXAuaWRdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3VibmV0SWRzOiBjb25maWcuc3VibmV0SWRzLFxuICAgICAgaXB2NkFsbG93ZWRGb3JEdWFsU3RhY2s6IGNvbmZpZy5pcHY2QWxsb3dlZEZvckR1YWxTdGFjayxcbiAgICAgIHNlY3VyaXR5R3JvdXBJZHMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaXNRdWV1ZShkZWFkTGV0dGVyUXVldWU6IElRdWV1ZSk6IGRlYWRMZXR0ZXJRdWV1ZSBpcyBJUXVldWUge1xuICAgIHJldHVybiAoPElRdWV1ZT5kZWFkTGV0dGVyUXVldWUpLnF1ZXVlQXJuICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVhZExldHRlclF1ZXVlKHByb3BzOiBGdW5jdGlvblByb3BzKTogSVF1ZXVlIHwgdW5kZWZpbmVkIHtcbiAgICAvLyB8IHNucy5JVG9waWNcbiAgICBpZiAoXG4gICAgICAhcHJvcHMuZGVhZExldHRlclF1ZXVlICYmXG4gICAgICAhcHJvcHMuZGVhZExldHRlclF1ZXVlRW5hYmxlZFxuICAgICAgLy8gJiYgIXByb3BzLmRlYWRMZXR0ZXJUb3BpY1xuICAgICkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHByb3BzLmRlYWRMZXR0ZXJRdWV1ZSAmJiBwcm9wcy5kZWFkTGV0dGVyUXVldWVFbmFibGVkID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIFwiZGVhZExldHRlclF1ZXVlIGRlZmluZWQgYnV0IGRlYWRMZXR0ZXJRdWV1ZUVuYWJsZWQgZXhwbGljaXRseSBzZXQgdG8gZmFsc2VcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIGlmIChcbiAgICAvLyAgIHByb3BzLmRlYWRMZXR0ZXJUb3BpYyAmJlxuICAgIC8vICAgKHByb3BzLmRlYWRMZXR0ZXJRdWV1ZSB8fCBwcm9wcy5kZWFkTGV0dGVyUXVldWVFbmFibGVkICE9PSB1bmRlZmluZWQpXG4gICAgLy8gKSB7XG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgLy8gICAgIFwiZGVhZExldHRlclF1ZXVlIGFuZCBkZWFkTGV0dGVyVG9waWMgY2Fubm90IGJlIHNwZWNpZmllZCB0b2dldGhlciBhdCB0aGUgc2FtZSB0aW1lXCIsXG4gICAgLy8gICApO1xuICAgIC8vIH1cblxuICAgIGxldCBkZWFkTGV0dGVyUXVldWU6IElRdWV1ZTsgLy8gfCBJVG9waWM7XG4gICAgLy8gaWYgKHByb3BzLmRlYWRMZXR0ZXJUb3BpYykge1xuICAgIC8vICAgZGVhZExldHRlclF1ZXVlID0gcHJvcHMuZGVhZExldHRlclRvcGljO1xuICAgIC8vICAgdGhpcy5hZGRUb1JvbGVQb2xpY3koXG4gICAgLy8gICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAvLyAgICAgICBhY3Rpb25zOiBbXCJzbnM6UHVibGlzaFwiXSxcbiAgICAvLyAgICAgICByZXNvdXJjZXM6IFtkZWFkTGV0dGVyUXVldWUudG9waWNBcm5dLFxuICAgIC8vICAgICB9KSxcbiAgICAvLyAgICk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICBkZWFkTGV0dGVyUXVldWUgPVxuICAgICAgcHJvcHMuZGVhZExldHRlclF1ZXVlIHx8XG4gICAgICBuZXcgUXVldWUodGhpcywgXCJEZWFkTGV0dGVyUXVldWVcIiwge1xuICAgICAgICBtZXNzYWdlUmV0ZW50aW9uU2Vjb25kczogRHVyYXRpb24uZGF5cygxNCkudG9TZWNvbmRzKCksXG4gICAgICB9KTtcbiAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wic3FzOlNlbmRNZXNzYWdlXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtkZWFkTGV0dGVyUXVldWUucXVldWVBcm5dLFxuICAgICAgfSksXG4gICAgKTtcbiAgICAvLyB9XG5cbiAgICByZXR1cm4gZGVhZExldHRlclF1ZXVlO1xuICB9XG5cbiAgLy8gVE9ETzogU3VwcG9ydCBzbnMuSVRvcGljICsgc25zOlB1Ymxpc2ggdG9waWNBcm5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgY3JlYXRlIExhbWJkYUZ1bmN0aW9uRGVhZExldHRlckNvbmZpZ1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZURlYWRMZXR0ZXJDb25maWcoXG4gICAgZGVhZExldHRlclF1ZXVlPzogSVF1ZXVlLCAvLyB8IHNucy5JVG9waWNcbiAgKTogbGFtYmRhRnVuY3Rpb24uTGFtYmRhRnVuY3Rpb25EZWFkTGV0dGVyQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZGVhZExldHRlclF1ZXVlKSB7XG4gICAgICAvLyB0aGlzLmlzUXVldWUoZGVhZExldHRlclF1ZXVlKSA/IGRlYWRMZXR0ZXJRdWV1ZS5xdWV1ZUFybiA6IC4uLlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0QXJuOiBkZWFkTGV0dGVyUXVldWUucXVldWVBcm4sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUcmFjaW5nQ29uZmlnKFxuICAgIHRyYWNpbmc6IFRyYWNpbmcsXG4gICk6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uVHJhY2luZ0NvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRyYWNpbmcgPT09IHVuZGVmaW5lZCB8fCB0cmFjaW5nID09PSBUcmFjaW5nLkRJU0FCTEVEKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJ4cmF5OlB1dFRyYWNlU2VnbWVudHNcIiwgXCJ4cmF5OlB1dFRlbGVtZXRyeVJlY29yZHNcIl0sXG4gICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kZTogdHJhY2luZyxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gb3BhcXVlICh0b2tlbikgQVJOLCByZXR1cm5zIGEgVEYgZXhwcmVzc2lvbiB0aGF0IGV4dHJhY3RzIHRoZSBmdW5jdGlvblxuICogbmFtZSBmcm9tIHRoZSBBUk4uXG4gKlxuICogRnVuY3Rpb24gQVJOcyBsb29rIGxpa2UgdGhpczpcbiAqXG4gKiAgIGFybjphd3M6bGFtYmRhOnJlZ2lvbjphY2NvdW50LWlkOmZ1bmN0aW9uOmZ1bmN0aW9uLW5hbWVcbiAqXG4gKiAuLndoaWNoIG1lYW5zIHRoYXQgaW4gb3JkZXIgdG8gZXh0cmFjdCB0aGUgYGZ1bmN0aW9uLW5hbWVgIGNvbXBvbmVudCBmcm9tIHRoZSBBUk4sIHdlIGNhblxuICogc3BsaXQgdGhlIEFSTiB1c2luZyBcIjpcIiBhbmQgc2VsZWN0IHRoZSBjb21wb25lbnQgaW4gaW5kZXggNi5cbiAqXG4gKiBAcmV0dXJucyBgZWxlbWVudChzcGxpdCgnOicsIGFybiksIDYpYFxuICovXG5mdW5jdGlvbiBleHRyYWN0TmFtZUZyb21Bcm4oYXJuOiBzdHJpbmcpIHtcbiAgcmV0dXJuIEZuLmVsZW1lbnQoRm4uc3BsaXQoXCI6XCIsIGFybiksIDYpO1xufVxuXG4vKipcbiAqIFgtUmF5IFRyYWNpbmcgTW9kZXMgKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYW1iZGEvbGF0ZXN0L2RnL0FQSV9UcmFjaW5nQ29uZmlnLmh0bWwpXG4gKi9cbmV4cG9ydCBlbnVtIFRyYWNpbmcge1xuICAvKipcbiAgICogTGFtYmRhIHdpbGwgcmVzcGVjdCBhbnkgdHJhY2luZyBoZWFkZXIgaXQgcmVjZWl2ZXMgZnJvbSBhbiB1cHN0cmVhbSBzZXJ2aWNlLlxuICAgKiBJZiBubyB0cmFjaW5nIGhlYWRlciBpcyByZWNlaXZlZCwgTGFtYmRhIHdpbGwgc2FtcGxlIHRoZSByZXF1ZXN0IGJhc2VkIG9uIGEgZml4ZWQgcmF0ZS4gUGxlYXNlIHNlZSB0aGUgW1VzaW5nIEFXUyBMYW1iZGEgd2l0aCBBV1MgWC1SYXldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYW1iZGEvbGF0ZXN0L2RnL3NlcnZpY2VzLXhyYXkuaHRtbCkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGlzIHNhbXBsaW5nIGJlaGF2aW9yLlxuICAgKi9cbiAgQUNUSVZFID0gXCJBY3RpdmVcIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIG9ubHkgdHJhY2UgdGhlIHJlcXVlc3QgZnJvbSBhbiB1cHN0cmVhbSBzZXJ2aWNlXG4gICAqIGlmIGl0IGNvbnRhaW5zIGEgdHJhY2luZyBoZWFkZXIgd2l0aCBcInNhbXBsZWQ9MVwiXG4gICAqL1xuICBQQVNTX1RIUk9VR0ggPSBcIlBhc3NUaHJvdWdoXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBub3QgdHJhY2UgYW55IHJlcXVlc3QuXG4gICAqL1xuICBESVNBQkxFRCA9IFwiRGlzYWJsZWRcIixcbn1cblxuLyoqXG4gKiBMYW1iZGEgc2VydmljZSB3aWxsIGF1dG9tYXRpY2FsbHkgY2FwdHVyZXMgc3lzdGVtIGxvZ3MgYWJvdXQgZnVuY3Rpb24gaW52b2NhdGlvblxuICogZ2VuZXJhdGVkIGJ5IHRoZSBMYW1iZGEgc2VydmljZSAoa25vd24gYXMgc3lzdGVtIGxvZ3MpIGFuZCBzZW5kcyB0aGVzZSBsb2dzIHRvIGFcbiAqIGRlZmF1bHQgQ2xvdWRXYXRjaCBsb2cgZ3JvdXAgbmFtZWQgYWZ0ZXIgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gU3lzdGVtTG9nTGV2ZWwge1xuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgaW5mbyBsZXZlbC5cbiAgICovXG4gIElORk8gPSBcIklORk9cIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IGRlYnVnIGxldmVsLlxuICAgKi9cbiAgREVCVUcgPSBcIkRFQlVHXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCB3YXJuIGxldmVsLlxuICAgKi9cbiAgV0FSTiA9IFwiV0FSTlwiLFxufVxuXG4vKipcbiAqIExhbWJkYSBzZXJ2aWNlIGF1dG9tYXRpY2FsbHkgY2FwdHVyZXMgbG9ncyBnZW5lcmF0ZWQgYnkgdGhlIGZ1bmN0aW9uIGNvZGVcbiAqIChrbm93biBhcyBhcHBsaWNhdGlvbiBsb2dzKSBhbmQgc2VuZHMgdGhlc2UgbG9ncyB0byBhIGRlZmF1bHQgQ2xvdWRXYXRjaFxuICogbG9nIGdyb3VwIG5hbWVkIGFmdGVyIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBlbnVtIEFwcGxpY2F0aW9uTG9nTGV2ZWwge1xuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgaW5mbyBsZXZlbC5cbiAgICovXG4gIElORk8gPSBcIklORk9cIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IGRlYnVnIGxldmVsLlxuICAgKi9cbiAgREVCVUcgPSBcIkRFQlVHXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCB3YXJuIGxldmVsLlxuICAgKi9cbiAgV0FSTiA9IFwiV0FSTlwiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgdHJhY2UgbGV2ZWwuXG4gICAqL1xuICBUUkFDRSA9IFwiVFJBQ0VcIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IGVycm9yIGxldmVsLlxuICAgKi9cbiAgRVJST1IgPSBcIkVSUk9SXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCBmYXRhbCBsZXZlbC5cbiAgICovXG4gIEZBVEFMID0gXCJGQVRBTFwiLFxufVxuXG4vKipcbiAqIFRoaXMgZmllbGQgdGFrZXMgaW4gMiB2YWx1ZXMgZWl0aGVyIFRleHQgb3IgSlNPTi4gQnkgc2V0dGluZyB0aGlzIHZhbHVlIHRvIFRleHQsXG4gKiB3aWxsIHJlc3VsdCBpbiB0aGUgY3VycmVudCBzdHJ1Y3R1cmUgb2YgbG9ncyBmb3JtYXQsIHdoZXJlYXMsIGJ5IHNldHRpbmcgdGhpcyB2YWx1ZSB0byBKU09OLFxuICogTGFtYmRhIHdpbGwgcHJpbnQgdGhlIGxvZ3MgYXMgU3RydWN0dXJlZCBKU09OIExvZ3MsIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdGltZXN0YW1wIGFuZCBsb2cgbGV2ZWxcbiAqIG9mIGVhY2ggZXZlbnQuIFNlbGVjdGluZyDigJhKU09O4oCZIGZvcm1hdCB3aWxsIG9ubHkgYWxsb3cgY3VzdG9tZXLigJlzIHRvIGhhdmUgZGlmZmVyZW50IGxvZyBsZXZlbFxuICogQXBwbGljYXRpb24gbG9nIGxldmVsIGFuZCB0aGUgU3lzdGVtIGxvZyBsZXZlbC5cbiAqL1xuZXhwb3J0IGVudW0gTG9nZ2luZ0Zvcm1hdCB7XG4gIC8qKlxuICAgKiBMYW1iZGEgTG9ncyB0ZXh0IGZvcm1hdC5cbiAgICovXG4gIFRFWFQgPSBcIlRleHRcIixcbiAgLyoqXG4gICAqIExhbWJkYSBzdHJ1Y3R1cmVkIGxvZ2dpbmcgaW4gSnNvbiBmb3JtYXQuXG4gICAqL1xuICBKU09OID0gXCJKU09OXCIsXG59XG5cbi8qKlxuICogQSBkZXN0aW5hdGlvbiBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGxxRGVzdGluYXRpb25Db25maWcge1xuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBkZXN0aW5hdGlvbiByZXNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIERMUSBmb3IgYW4gZXZlbnQgc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50U291cmNlRGxxIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIERMUSBkZXN0aW5hdGlvbiBjb25maWcgb2YgdGhlIERMUVxuICAgKi9cbiAgYmluZChcbiAgICB0YXJnZXQ6IElFdmVudFNvdXJjZU1hcHBpbmcsXG4gICAgdGFyZ2V0SGFuZGxlcjogSUZ1bmN0aW9uLFxuICApOiBEbHFEZXN0aW5hdGlvbkNvbmZpZztcbn1cbiJdfQ==