@microsoft/terraform-cdk-constructs 1.2.0 → 1.3.0

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 (291) hide show
  1. package/.jsii +54846 -26661
  2. package/API.md +72091 -23784
  3. package/lib/azure-actiongroup/index.d.ts +0 -10
  4. package/lib/azure-actiongroup/index.js +1 -11
  5. package/lib/azure-actiongroup/lib/action-group.d.ts +0 -10
  6. package/lib/azure-actiongroup/lib/action-group.js +6 -32
  7. package/lib/azure-actiongroup/lib/index.d.ts +1 -4
  8. package/lib/azure-actiongroup/lib/index.js +2 -5
  9. package/lib/azure-activitylogalert/index.d.ts +0 -10
  10. package/lib/azure-activitylogalert/index.js +1 -11
  11. package/lib/azure-activitylogalert/lib/activity-log-alert.d.ts +0 -10
  12. package/lib/azure-activitylogalert/lib/activity-log-alert.js +6 -32
  13. package/lib/azure-activitylogalert/lib/index.d.ts +1 -4
  14. package/lib/azure-activitylogalert/lib/index.js +2 -5
  15. package/lib/azure-aks/index.d.ts +0 -8
  16. package/lib/azure-aks/index.js +1 -11
  17. package/lib/azure-aks/lib/aks-cluster.d.ts +4 -13
  18. package/lib/azure-aks/lib/aks-cluster.js +13 -36
  19. package/lib/azure-aks/lib/index.d.ts +1 -10
  20. package/lib/azure-aks/lib/index.js +2 -21
  21. package/lib/azure-diagnosticsettings/index.d.ts +0 -6
  22. package/lib/azure-diagnosticsettings/index.js +1 -7
  23. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.d.ts +0 -10
  24. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +6 -32
  25. package/lib/azure-diagnosticsettings/lib/index.d.ts +1 -7
  26. package/lib/azure-diagnosticsettings/lib/index.js +2 -8
  27. package/lib/azure-dnsforwardingruleset/index.d.ts +1 -0
  28. package/lib/azure-dnsforwardingruleset/index.js +18 -0
  29. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.d.ts +24 -0
  30. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.js +206 -0
  31. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.d.ts +174 -0
  32. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +214 -0
  33. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.d.ts +24 -0
  34. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.js +242 -0
  35. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.d.ts +193 -0
  36. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +193 -0
  37. package/lib/azure-dnsforwardingruleset/lib/index.d.ts +6 -0
  38. package/lib/azure-dnsforwardingruleset/lib/index.js +23 -0
  39. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.d.ts +24 -0
  40. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.js +199 -0
  41. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.d.ts +160 -0
  42. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +178 -0
  43. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.d.ts +9 -0
  44. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.js +133 -0
  45. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.d.ts +9 -0
  46. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.js +350 -0
  47. package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.d.ts +9 -0
  48. package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.js +397 -0
  49. package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.d.ts +9 -0
  50. package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.js +285 -0
  51. package/lib/azure-dnsresolver/index.d.ts +1 -0
  52. package/lib/azure-dnsresolver/index.js +18 -0
  53. package/lib/azure-dnsresolver/lib/dns-resolver-schemas.d.ts +24 -0
  54. package/lib/azure-dnsresolver/lib/dns-resolver-schemas.js +218 -0
  55. package/lib/azure-dnsresolver/lib/dns-resolver.d.ts +170 -0
  56. package/lib/azure-dnsresolver/lib/dns-resolver.js +236 -0
  57. package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.d.ts +24 -0
  58. package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.js +261 -0
  59. package/lib/azure-dnsresolver/lib/inbound-endpoint.d.ts +189 -0
  60. package/lib/azure-dnsresolver/lib/inbound-endpoint.js +243 -0
  61. package/lib/azure-dnsresolver/lib/index.d.ts +6 -0
  62. package/lib/azure-dnsresolver/lib/index.js +23 -0
  63. package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.d.ts +24 -0
  64. package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.js +231 -0
  65. package/lib/azure-dnsresolver/lib/outbound-endpoint.d.ts +175 -0
  66. package/lib/azure-dnsresolver/lib/outbound-endpoint.js +234 -0
  67. package/lib/azure-dnsresolver/test/dns-resolver.integ.d.ts +14 -0
  68. package/lib/azure-dnsresolver/test/dns-resolver.integ.js +117 -0
  69. package/lib/azure-dnsresolver/test/dns-resolver.spec.d.ts +9 -0
  70. package/lib/azure-dnsresolver/test/dns-resolver.spec.js +353 -0
  71. package/lib/azure-dnsresolver/test/inbound-endpoint.integ.d.ts +9 -0
  72. package/lib/azure-dnsresolver/test/inbound-endpoint.integ.js +151 -0
  73. package/lib/azure-dnsresolver/test/inbound-endpoint.spec.d.ts +9 -0
  74. package/lib/azure-dnsresolver/test/inbound-endpoint.spec.js +441 -0
  75. package/lib/azure-dnsresolver/test/outbound-endpoint.integ.d.ts +9 -0
  76. package/lib/azure-dnsresolver/test/outbound-endpoint.integ.js +149 -0
  77. package/lib/azure-dnsresolver/test/outbound-endpoint.spec.d.ts +9 -0
  78. package/lib/azure-dnsresolver/test/outbound-endpoint.spec.js +301 -0
  79. package/lib/azure-dnszone/index.d.ts +1 -0
  80. package/lib/azure-dnszone/index.js +18 -0
  81. package/lib/azure-dnszone/lib/dns-zone-schemas.d.ts +24 -0
  82. package/lib/azure-dnszone/lib/dns-zone-schemas.js +191 -0
  83. package/lib/azure-dnszone/lib/dns-zone.d.ts +182 -0
  84. package/lib/azure-dnszone/lib/dns-zone.js +228 -0
  85. package/lib/azure-dnszone/lib/index.d.ts +2 -0
  86. package/lib/azure-dnszone/lib/index.js +19 -0
  87. package/lib/azure-dnszone/test/dns-zone.integ.d.ts +9 -0
  88. package/lib/azure-dnszone/test/dns-zone.integ.js +85 -0
  89. package/lib/azure-dnszone/test/dns-zone.spec.d.ts +9 -0
  90. package/lib/azure-dnszone/test/dns-zone.spec.js +285 -0
  91. package/lib/azure-metricalert/index.d.ts +0 -10
  92. package/lib/azure-metricalert/index.js +1 -11
  93. package/lib/azure-metricalert/lib/index.d.ts +1 -4
  94. package/lib/azure-metricalert/lib/index.js +2 -5
  95. package/lib/azure-metricalert/lib/metric-alert.d.ts +0 -10
  96. package/lib/azure-metricalert/lib/metric-alert.js +6 -32
  97. package/lib/azure-networkinterface/index.d.ts +0 -3
  98. package/lib/azure-networkinterface/index.js +1 -4
  99. package/lib/azure-networkinterface/lib/index.d.ts +1 -5
  100. package/lib/azure-networkinterface/lib/index.js +2 -5
  101. package/lib/azure-networkinterface/lib/network-interface.d.ts +4 -9
  102. package/lib/azure-networkinterface/lib/network-interface.js +14 -29
  103. package/lib/azure-networkinterface/test/network-interface.integ.js +20 -6
  104. package/lib/azure-networksecuritygroup/index.d.ts +0 -5
  105. package/lib/azure-networksecuritygroup/index.js +1 -6
  106. package/lib/azure-networksecuritygroup/lib/index.d.ts +2 -5
  107. package/lib/azure-networksecuritygroup/lib/index.js +17 -14
  108. package/lib/azure-networksecuritygroup/lib/network-security-group.d.ts +4 -13
  109. package/lib/azure-networksecuritygroup/lib/network-security-group.js +14 -36
  110. package/lib/azure-policyassignment/index.d.ts +1 -0
  111. package/lib/azure-policyassignment/index.js +18 -0
  112. package/lib/azure-policyassignment/lib/index.d.ts +2 -0
  113. package/lib/azure-policyassignment/lib/index.js +19 -0
  114. package/lib/azure-policyassignment/lib/policy-assignment-schemas.d.ts +25 -0
  115. package/lib/azure-policyassignment/lib/policy-assignment-schemas.js +260 -0
  116. package/lib/azure-policyassignment/lib/policy-assignment.d.ts +342 -0
  117. package/lib/azure-policyassignment/lib/policy-assignment.js +228 -0
  118. package/lib/azure-policyassignment/test/policy-assignment.integ.d.ts +13 -0
  119. package/lib/azure-policyassignment/test/policy-assignment.integ.js +153 -0
  120. package/lib/azure-policyassignment/test/policy-assignment.spec.d.ts +9 -0
  121. package/lib/azure-policyassignment/test/policy-assignment.spec.js +651 -0
  122. package/lib/azure-policydefinition/index.d.ts +1 -0
  123. package/lib/azure-policydefinition/index.js +18 -0
  124. package/lib/azure-policydefinition/lib/index.d.ts +2 -0
  125. package/lib/azure-policydefinition/lib/index.js +19 -0
  126. package/lib/azure-policydefinition/lib/policy-definition-schemas.d.ts +25 -0
  127. package/lib/azure-policydefinition/lib/policy-definition-schemas.js +210 -0
  128. package/lib/azure-policydefinition/lib/policy-definition.d.ts +260 -0
  129. package/lib/azure-policydefinition/lib/policy-definition.js +199 -0
  130. package/lib/azure-policydefinition/test/policy-definition.integ.d.ts +9 -0
  131. package/lib/azure-policydefinition/test/policy-definition.integ.js +137 -0
  132. package/lib/azure-policydefinition/test/policy-definition.spec.d.ts +9 -0
  133. package/lib/azure-policydefinition/test/policy-definition.spec.js +596 -0
  134. package/lib/azure-privatednszone/index.d.ts +1 -0
  135. package/lib/azure-privatednszone/index.js +18 -0
  136. package/lib/azure-privatednszone/lib/index.d.ts +2 -0
  137. package/lib/azure-privatednszone/lib/index.js +19 -0
  138. package/lib/azure-privatednszone/lib/private-dns-zone-schemas.d.ts +24 -0
  139. package/lib/azure-privatednszone/lib/private-dns-zone-schemas.js +254 -0
  140. package/lib/azure-privatednszone/lib/private-dns-zone.d.ts +178 -0
  141. package/lib/azure-privatednszone/lib/private-dns-zone.js +272 -0
  142. package/lib/azure-privatednszone/test/private-dns-zone.integ.d.ts +9 -0
  143. package/lib/azure-privatednszone/test/private-dns-zone.integ.js +84 -0
  144. package/lib/azure-privatednszone/test/private-dns-zone.spec.d.ts +9 -0
  145. package/lib/azure-privatednszone/test/private-dns-zone.spec.js +341 -0
  146. package/lib/azure-privatednszonelink/index.d.ts +1 -0
  147. package/lib/azure-privatednszonelink/index.js +18 -0
  148. package/lib/azure-privatednszonelink/lib/index.d.ts +2 -0
  149. package/lib/azure-privatednszonelink/lib/index.js +19 -0
  150. package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.d.ts +24 -0
  151. package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.js +262 -0
  152. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.d.ts +202 -0
  153. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +250 -0
  154. package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.d.ts +9 -0
  155. package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.js +110 -0
  156. package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.d.ts +9 -0
  157. package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.js +465 -0
  158. package/lib/azure-publicipaddress/index.d.ts +0 -5
  159. package/lib/azure-publicipaddress/index.js +1 -6
  160. package/lib/azure-publicipaddress/lib/index.d.ts +2 -9
  161. package/lib/azure-publicipaddress/lib/index.js +17 -17
  162. package/lib/azure-publicipaddress/lib/public-ip-address.d.ts +4 -13
  163. package/lib/azure-publicipaddress/lib/public-ip-address.js +14 -36
  164. package/lib/azure-resourcegroup/index.d.ts +0 -37
  165. package/lib/azure-resourcegroup/index.js +1 -39
  166. package/lib/azure-resourcegroup/lib/index.d.ts +1 -44
  167. package/lib/azure-resourcegroup/lib/index.js +2 -43
  168. package/lib/azure-resourcegroup/lib/resource-group.d.ts +9 -23
  169. package/lib/azure-resourcegroup/lib/resource-group.js +23 -56
  170. package/lib/azure-resourcegroup/test/resource-group.spec.js +13 -19
  171. package/lib/azure-roleassignment/index.d.ts +1 -0
  172. package/lib/azure-roleassignment/index.js +18 -0
  173. package/lib/azure-roleassignment/lib/index.d.ts +2 -0
  174. package/lib/azure-roleassignment/lib/index.js +19 -0
  175. package/lib/azure-roleassignment/lib/role-assignment-schemas.d.ts +25 -0
  176. package/lib/azure-roleassignment/lib/role-assignment-schemas.js +238 -0
  177. package/lib/azure-roleassignment/lib/role-assignment.d.ts +294 -0
  178. package/lib/azure-roleassignment/lib/role-assignment.js +257 -0
  179. package/lib/azure-roleassignment/test/role-assignment.integ.d.ts +12 -0
  180. package/lib/azure-roleassignment/test/role-assignment.integ.js +101 -0
  181. package/lib/azure-roleassignment/test/role-assignment.spec.d.ts +9 -0
  182. package/lib/azure-roleassignment/test/role-assignment.spec.js +633 -0
  183. package/lib/azure-roledefinition/index.d.ts +1 -0
  184. package/lib/azure-roledefinition/index.js +18 -0
  185. package/lib/azure-roledefinition/lib/index.d.ts +2 -0
  186. package/lib/azure-roledefinition/lib/index.js +19 -0
  187. package/lib/azure-roledefinition/lib/role-definition-schemas.d.ts +25 -0
  188. package/lib/azure-roledefinition/lib/role-definition-schemas.js +195 -0
  189. package/lib/azure-roledefinition/lib/role-definition.d.ts +236 -0
  190. package/lib/azure-roledefinition/lib/role-definition.js +192 -0
  191. package/lib/azure-roledefinition/test/role-definition.integ.d.ts +12 -0
  192. package/lib/azure-roledefinition/test/role-definition.integ.js +142 -0
  193. package/lib/azure-roledefinition/test/role-definition.spec.d.ts +9 -0
  194. package/lib/azure-roledefinition/test/role-definition.spec.js +946 -0
  195. package/lib/azure-storageaccount/index.d.ts +0 -19
  196. package/lib/azure-storageaccount/index.js +1 -20
  197. package/lib/azure-storageaccount/lib/index.d.ts +1 -7
  198. package/lib/azure-storageaccount/lib/index.js +2 -8
  199. package/lib/azure-storageaccount/lib/storage-account.d.ts +4 -9
  200. package/lib/azure-storageaccount/lib/storage-account.js +15 -29
  201. package/lib/azure-subnet/index.d.ts +0 -3
  202. package/lib/azure-subnet/index.js +1 -4
  203. package/lib/azure-subnet/lib/index.d.ts +1 -4
  204. package/lib/azure-subnet/lib/index.js +2 -5
  205. package/lib/azure-subnet/lib/subnet.d.ts +3 -14
  206. package/lib/azure-subnet/lib/subnet.js +28 -47
  207. package/lib/azure-subnet/test/subnet.integ.js +19 -7
  208. package/lib/azure-subnet/test/subnet.spec.js +1 -2
  209. package/lib/azure-virtualmachine/index.d.ts +0 -6
  210. package/lib/azure-virtualmachine/index.js +1 -7
  211. package/lib/azure-virtualmachine/lib/index.d.ts +1 -10
  212. package/lib/azure-virtualmachine/lib/index.js +2 -21
  213. package/lib/azure-virtualmachine/lib/virtual-machine.d.ts +4 -13
  214. package/lib/azure-virtualmachine/lib/virtual-machine.js +15 -36
  215. package/lib/azure-virtualnetwork/index.d.ts +0 -9
  216. package/lib/azure-virtualnetwork/index.js +1 -11
  217. package/lib/azure-virtualnetwork/lib/index.d.ts +2 -9
  218. package/lib/azure-virtualnetwork/lib/index.js +17 -20
  219. package/lib/azure-virtualnetwork/lib/virtual-network.d.ts +4 -13
  220. package/lib/azure-virtualnetwork/lib/virtual-network.js +15 -36
  221. package/lib/azure-virtualnetworkmanager/index.d.ts +1 -0
  222. package/lib/azure-virtualnetworkmanager/index.js +18 -0
  223. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.d.ts +48 -0
  224. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.js +265 -0
  225. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.d.ts +185 -0
  226. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +206 -0
  227. package/lib/azure-virtualnetworkmanager/lib/index.d.ts +14 -0
  228. package/lib/azure-virtualnetworkmanager/lib/index.js +31 -0
  229. package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.d.ts +32 -0
  230. package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.js +189 -0
  231. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.d.ts +32 -0
  232. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.js +201 -0
  233. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.d.ts +135 -0
  234. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +163 -0
  235. package/lib/azure-virtualnetworkmanager/lib/network-group.d.ts +139 -0
  236. package/lib/azure-virtualnetworkmanager/lib/network-group.js +158 -0
  237. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.d.ts +32 -0
  238. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.js +182 -0
  239. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.d.ts +144 -0
  240. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +164 -0
  241. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.d.ts +38 -0
  242. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.js +206 -0
  243. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.d.ts +142 -0
  244. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +162 -0
  245. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.d.ts +39 -0
  246. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.js +359 -0
  247. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.d.ts +221 -0
  248. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +204 -0
  249. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.d.ts +32 -0
  250. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.js +236 -0
  251. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.d.ts +337 -0
  252. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +283 -0
  253. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.d.ts +25 -0
  254. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.js +402 -0
  255. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.d.ts +9 -0
  256. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.js +1652 -0
  257. package/lib/azure-vmss/index.d.ts +0 -5
  258. package/lib/azure-vmss/index.js +1 -6
  259. package/lib/azure-vmss/lib/index.d.ts +0 -7
  260. package/lib/azure-vmss/lib/index.js +1 -21
  261. package/lib/azure-vmss/lib/virtual-machine-scale-set.d.ts +5 -13
  262. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +29 -53
  263. package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.d.ts +10 -0
  264. package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.js +218 -0
  265. package/lib/core-azure/lib/azapi/azapi-resource.d.ts +178 -26
  266. package/lib/core-azure/lib/azapi/azapi-resource.js +328 -90
  267. package/lib/core-azure/lib/azapi/azapi-resource.spec.js +2 -2
  268. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
  269. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
  270. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +5 -3
  271. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
  272. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
  273. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
  274. package/lib/core-azure/lib/azapi/resource-schema-validator.d.ts +118 -0
  275. package/lib/core-azure/lib/azapi/resource-schema-validator.js +236 -0
  276. package/lib/core-azure/lib/azapi/resource-version-manager.d.ts +103 -0
  277. package/lib/core-azure/lib/azapi/resource-version-manager.js +168 -0
  278. package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +11 -6
  279. package/lib/core-azure/lib/index.d.ts +2 -2
  280. package/lib/core-azure/lib/index.js +5 -5
  281. package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
  282. package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
  283. package/lib/index.d.ts +19 -0
  284. package/lib/index.js +21 -2
  285. package/lib/testing/index.js +2 -2
  286. package/lib/testing/lib/cleanup.d.ts +1 -0
  287. package/lib/testing/lib/cleanup.js +19 -12
  288. package/lib/testing/lib/metadata.js +19 -16
  289. package/package.json +1 -1
  290. package/scripts/cleanup-test-resources.ts +22 -4
  291. package/scripts/generate-index.js +25 -8
@@ -0,0 +1,441 @@
1
+ "use strict";
2
+ /**
3
+ * Comprehensive tests for the DnsResolverInboundEndpoint implementation
4
+ *
5
+ * This test suite validates the DnsResolverInboundEndpoint class using the
6
+ * AzapiResource framework. Tests cover automatic version resolution,
7
+ * explicit version pinning, schema validation, property transformation,
8
+ * parent-child resource relationships, and full backward compatibility.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const cdktf_1 = require("cdktf");
12
+ const cdktf = require("cdktf");
13
+ const api_version_manager_1 = require("../../core-azure/lib/version-manager/api-version-manager");
14
+ const version_interfaces_1 = require("../../core-azure/lib/version-manager/interfaces/version-interfaces");
15
+ const inbound_endpoint_1 = require("../lib/inbound-endpoint");
16
+ const inbound_endpoint_schemas_1 = require("../lib/inbound-endpoint-schemas");
17
+ describe("DnsResolverInboundEndpoint - Implementation", () => {
18
+ let app;
19
+ let stack;
20
+ let manager;
21
+ const mockDnsResolverId = "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/test-rg/providers/Microsoft.Network/dnsResolvers/test-resolver";
22
+ const mockSubnetId = "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/test-rg/providers/Microsoft.Network/virtualNetworks/test-vnet/subnets/inbound-subnet";
23
+ beforeEach(() => {
24
+ app = cdktf_1.Testing.app();
25
+ stack = new cdktf.TerraformStack(app, "TestStack");
26
+ manager = api_version_manager_1.ApiVersionManager.instance();
27
+ // Ensure schemas are registered
28
+ try {
29
+ manager.registerResourceType(inbound_endpoint_schemas_1.DNS_RESOLVER_INBOUND_ENDPOINT_TYPE, inbound_endpoint_schemas_1.ALL_DNS_RESOLVER_INBOUND_ENDPOINT_VERSIONS);
30
+ }
31
+ catch (error) {
32
+ // Ignore if already registered
33
+ }
34
+ });
35
+ describe("Constructor and Basic Properties", () => {
36
+ it("should create Inbound Endpoint with automatic latest version resolution", () => {
37
+ const props = {
38
+ name: "my-inbound-endpoint",
39
+ location: "eastus",
40
+ dnsResolverId: mockDnsResolverId,
41
+ subnetId: mockSubnetId,
42
+ };
43
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", props);
44
+ expect(endpoint).toBeInstanceOf(inbound_endpoint_1.DnsResolverInboundEndpoint);
45
+ expect(endpoint.resolvedApiVersion).toBe("2022-07-01");
46
+ expect(endpoint.props).toBe(props);
47
+ });
48
+ it("should create Inbound Endpoint with explicit version pinning", () => {
49
+ const props = {
50
+ name: "my-inbound-endpoint",
51
+ location: "eastus",
52
+ dnsResolverId: mockDnsResolverId,
53
+ subnetId: mockSubnetId,
54
+ apiVersion: "2022-07-01",
55
+ tags: { environment: "test" },
56
+ };
57
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", props);
58
+ expect(endpoint.resolvedApiVersion).toBe("2022-07-01");
59
+ expect(endpoint.tags).toEqual({ environment: "test" });
60
+ });
61
+ it("should use location from props", () => {
62
+ const props = {
63
+ name: "my-inbound-endpoint",
64
+ location: "westus",
65
+ dnsResolverId: mockDnsResolverId,
66
+ subnetId: mockSubnetId,
67
+ };
68
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", props);
69
+ expect(endpoint.location).toBe("westus");
70
+ });
71
+ it("should create Inbound Endpoint with static IP address", () => {
72
+ const props = {
73
+ name: "my-inbound-endpoint",
74
+ location: "eastus",
75
+ dnsResolverId: mockDnsResolverId,
76
+ subnetId: mockSubnetId,
77
+ privateIpAddress: "10.0.1.4",
78
+ privateIpAllocationMethod: "Static",
79
+ };
80
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", props);
81
+ expect(endpoint).toBeDefined();
82
+ expect(endpoint.props.privateIpAddress).toBe("10.0.1.4");
83
+ expect(endpoint.props.privateIpAllocationMethod).toBe("Static");
84
+ });
85
+ it("should create Inbound Endpoint with dynamic IP allocation", () => {
86
+ const props = {
87
+ name: "my-inbound-endpoint",
88
+ location: "eastus",
89
+ dnsResolverId: mockDnsResolverId,
90
+ subnetId: mockSubnetId,
91
+ privateIpAllocationMethod: "Dynamic",
92
+ };
93
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", props);
94
+ expect(endpoint).toBeDefined();
95
+ expect(endpoint.props.privateIpAllocationMethod).toBe("Dynamic");
96
+ });
97
+ });
98
+ describe("Framework Integration", () => {
99
+ it("should resolve latest API version automatically", () => {
100
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
101
+ name: "my-inbound-endpoint",
102
+ location: "eastus",
103
+ dnsResolverId: mockDnsResolverId,
104
+ subnetId: mockSubnetId,
105
+ });
106
+ expect(endpoint.resolvedApiVersion).toBe("2022-07-01");
107
+ expect(endpoint.latestVersion()).toBe("2022-07-01");
108
+ });
109
+ it("should provide version configuration", () => {
110
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
111
+ name: "my-inbound-endpoint",
112
+ location: "eastus",
113
+ dnsResolverId: mockDnsResolverId,
114
+ subnetId: mockSubnetId,
115
+ });
116
+ expect(endpoint.versionConfig).toBeDefined();
117
+ expect(endpoint.versionConfig.version).toBe("2022-07-01");
118
+ expect(endpoint.versionConfig.supportLevel).toBe(version_interfaces_1.VersionSupportLevel.ACTIVE);
119
+ });
120
+ it("should provide supported versions", () => {
121
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
122
+ name: "my-inbound-endpoint",
123
+ location: "eastus",
124
+ dnsResolverId: mockDnsResolverId,
125
+ subnetId: mockSubnetId,
126
+ });
127
+ const versions = endpoint.supportedVersions();
128
+ expect(versions).toContain("2022-07-01");
129
+ expect(versions.length).toBeGreaterThan(0);
130
+ });
131
+ });
132
+ describe("Parent-Child Resource Relationship", () => {
133
+ it("should use dnsResolverId as parent ID", () => {
134
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
135
+ name: "my-inbound-endpoint",
136
+ location: "eastus",
137
+ dnsResolverId: mockDnsResolverId,
138
+ subnetId: mockSubnetId,
139
+ });
140
+ // Verify the endpoint was created successfully with proper parent
141
+ expect(endpoint).toBeDefined();
142
+ expect(endpoint.props.dnsResolverId).toBe(mockDnsResolverId);
143
+ });
144
+ it("should correctly handle child resource in Terraform synthesis", () => {
145
+ new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
146
+ name: "my-inbound-endpoint",
147
+ location: "eastus",
148
+ dnsResolverId: mockDnsResolverId,
149
+ subnetId: mockSubnetId,
150
+ });
151
+ const synthesized = cdktf_1.Testing.synth(stack);
152
+ expect(synthesized).toContain("inboundEndpoints");
153
+ expect(synthesized).toContain(mockDnsResolverId);
154
+ });
155
+ });
156
+ describe("Public Methods - Inbound Endpoint Properties", () => {
157
+ it("should provide subnet ID", () => {
158
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
159
+ name: "my-inbound-endpoint",
160
+ location: "eastus",
161
+ dnsResolverId: mockDnsResolverId,
162
+ subnetId: mockSubnetId,
163
+ });
164
+ expect(endpoint.subnetId).toBeDefined();
165
+ expect(typeof endpoint.subnetId).toBe("string");
166
+ });
167
+ it("should provide private IP address", () => {
168
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
169
+ name: "my-inbound-endpoint",
170
+ location: "eastus",
171
+ dnsResolverId: mockDnsResolverId,
172
+ subnetId: mockSubnetId,
173
+ privateIpAddress: "10.0.1.4",
174
+ });
175
+ expect(endpoint.privateIpAddress).toBeDefined();
176
+ expect(typeof endpoint.privateIpAddress).toBe("string");
177
+ });
178
+ it("should provide provisioning state", () => {
179
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
180
+ name: "my-inbound-endpoint",
181
+ location: "eastus",
182
+ dnsResolverId: mockDnsResolverId,
183
+ subnetId: mockSubnetId,
184
+ });
185
+ expect(endpoint.provisioningState).toBeDefined();
186
+ expect(typeof endpoint.provisioningState).toBe("string");
187
+ });
188
+ });
189
+ describe("Tag Management", () => {
190
+ it("should allow adding tags", () => {
191
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
192
+ name: "my-inbound-endpoint",
193
+ location: "eastus",
194
+ dnsResolverId: mockDnsResolverId,
195
+ subnetId: mockSubnetId,
196
+ tags: { initial: "tag" },
197
+ });
198
+ endpoint.addTag("newKey", "newValue");
199
+ expect(endpoint.props.tags).toHaveProperty("newKey", "newValue");
200
+ expect(endpoint.props.tags).toHaveProperty("initial", "tag");
201
+ });
202
+ it("should allow removing tags", () => {
203
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
204
+ name: "my-inbound-endpoint",
205
+ location: "eastus",
206
+ dnsResolverId: mockDnsResolverId,
207
+ subnetId: mockSubnetId,
208
+ tags: { key1: "value1", key2: "value2" },
209
+ });
210
+ endpoint.removeTag("key1");
211
+ expect(endpoint.props.tags).not.toHaveProperty("key1");
212
+ expect(endpoint.props.tags).toHaveProperty("key2", "value2");
213
+ });
214
+ it("should handle adding tags when no initial tags exist", () => {
215
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
216
+ name: "my-inbound-endpoint",
217
+ location: "eastus",
218
+ dnsResolverId: mockDnsResolverId,
219
+ subnetId: mockSubnetId,
220
+ });
221
+ endpoint.addTag("newKey", "newValue");
222
+ expect(endpoint.props.tags).toHaveProperty("newKey", "newValue");
223
+ });
224
+ });
225
+ describe("Outputs", () => {
226
+ it("should create all required outputs", () => {
227
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
228
+ name: "my-inbound-endpoint",
229
+ location: "eastus",
230
+ dnsResolverId: mockDnsResolverId,
231
+ subnetId: mockSubnetId,
232
+ });
233
+ expect(endpoint.idOutput).toBeDefined();
234
+ expect(endpoint.nameOutput).toBeDefined();
235
+ expect(endpoint.locationOutput).toBeDefined();
236
+ expect(endpoint.tagsOutput).toBeDefined();
237
+ expect(endpoint.provisioningStateOutput).toBeDefined();
238
+ });
239
+ it("should have correct logical IDs for outputs", () => {
240
+ new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
241
+ name: "my-inbound-endpoint",
242
+ location: "eastus",
243
+ dnsResolverId: mockDnsResolverId,
244
+ subnetId: mockSubnetId,
245
+ });
246
+ const synthesized = cdktf_1.Testing.synth(stack);
247
+ expect(synthesized).toContain('"id"');
248
+ expect(synthesized).toContain('"name"');
249
+ expect(synthesized).toContain('"location"');
250
+ expect(synthesized).toContain('"tags"');
251
+ expect(synthesized).toContain('"provisioning_state"');
252
+ });
253
+ });
254
+ describe("Ignore Changes Configuration", () => {
255
+ it("should apply ignore changes lifecycle rules", () => {
256
+ new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
257
+ name: "my-inbound-endpoint",
258
+ location: "eastus",
259
+ dnsResolverId: mockDnsResolverId,
260
+ subnetId: mockSubnetId,
261
+ ignoreChanges: ["tags"],
262
+ });
263
+ const synthesized = cdktf_1.Testing.synth(stack);
264
+ expect(synthesized).toContain("ignore_changes");
265
+ });
266
+ it("should handle multiple ignore changes properties", () => {
267
+ new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
268
+ name: "my-inbound-endpoint",
269
+ location: "eastus",
270
+ dnsResolverId: mockDnsResolverId,
271
+ subnetId: mockSubnetId,
272
+ ignoreChanges: ["tags", "location"],
273
+ });
274
+ const synthesized = cdktf_1.Testing.synth(stack);
275
+ expect(synthesized).toBeDefined();
276
+ });
277
+ });
278
+ describe("CDK Terraform Integration", () => {
279
+ it("should synthesize to valid Terraform configuration", () => {
280
+ new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "SynthTest", {
281
+ name: "my-inbound-endpoint",
282
+ location: "eastus",
283
+ dnsResolverId: mockDnsResolverId,
284
+ subnetId: mockSubnetId,
285
+ tags: { test: "synthesis" },
286
+ });
287
+ const synthesized = cdktf_1.Testing.synth(stack);
288
+ expect(synthesized).toBeDefined();
289
+ const stackConfig = JSON.parse(synthesized);
290
+ expect(stackConfig.resource).toBeDefined();
291
+ });
292
+ it("should generate correct resource type in Terraform", () => {
293
+ new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "SynthTest", {
294
+ name: "my-inbound-endpoint",
295
+ location: "eastus",
296
+ dnsResolverId: mockDnsResolverId,
297
+ subnetId: mockSubnetId,
298
+ });
299
+ const synthesized = cdktf_1.Testing.synth(stack);
300
+ expect(synthesized).toContain("inboundEndpoints");
301
+ expect(synthesized).toContain("2022-07-01");
302
+ });
303
+ it("should include all properties in Terraform body", () => {
304
+ new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "SynthTest", {
305
+ name: "my-inbound-endpoint",
306
+ location: "eastus",
307
+ dnsResolverId: mockDnsResolverId,
308
+ subnetId: mockSubnetId,
309
+ privateIpAddress: "10.0.1.4",
310
+ privateIpAllocationMethod: "Static",
311
+ tags: { env: "test" },
312
+ });
313
+ const synthesized = cdktf_1.Testing.synth(stack);
314
+ expect(synthesized).toContain("eastus");
315
+ expect(synthesized).toContain("env");
316
+ expect(synthesized).toContain(mockSubnetId);
317
+ });
318
+ });
319
+ describe("Resource Identification", () => {
320
+ it("should provide resource ID", () => {
321
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
322
+ name: "my-inbound-endpoint",
323
+ location: "eastus",
324
+ dnsResolverId: mockDnsResolverId,
325
+ subnetId: mockSubnetId,
326
+ });
327
+ expect(endpoint.id).toBeDefined();
328
+ expect(typeof endpoint.id).toBe("string");
329
+ });
330
+ it("should provide resource name from construct id when name not in props", () => {
331
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
332
+ location: "eastus",
333
+ dnsResolverId: mockDnsResolverId,
334
+ subnetId: mockSubnetId,
335
+ });
336
+ expect(endpoint.name).toBe("TestEndpoint");
337
+ });
338
+ it("should provide resource name from props when specified", () => {
339
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
340
+ name: "my-inbound-endpoint",
341
+ location: "eastus",
342
+ dnsResolverId: mockDnsResolverId,
343
+ subnetId: mockSubnetId,
344
+ });
345
+ expect(endpoint.name).toBe("my-inbound-endpoint");
346
+ });
347
+ });
348
+ describe("JSII Compliance", () => {
349
+ it("should have proper return types for all public methods", () => {
350
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
351
+ name: "my-inbound-endpoint",
352
+ location: "eastus",
353
+ dnsResolverId: mockDnsResolverId,
354
+ subnetId: mockSubnetId,
355
+ });
356
+ // All getter methods should return strings for Terraform interpolations
357
+ expect(typeof endpoint.subnetId).toBe("string");
358
+ expect(typeof endpoint.privateIpAddress).toBe("string");
359
+ expect(typeof endpoint.provisioningState).toBe("string");
360
+ });
361
+ it("should not use function types in public interface", () => {
362
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
363
+ name: "my-inbound-endpoint",
364
+ location: "eastus",
365
+ dnsResolverId: mockDnsResolverId,
366
+ subnetId: mockSubnetId,
367
+ });
368
+ // Verify methods exist and are callable
369
+ expect(typeof endpoint.addTag).toBe("function");
370
+ expect(typeof endpoint.removeTag).toBe("function");
371
+ // Test that they work correctly
372
+ endpoint.addTag("test", "value");
373
+ expect(endpoint.props.tags).toHaveProperty("test", "value");
374
+ });
375
+ });
376
+ describe("Schema Registration", () => {
377
+ it("should register schemas successfully", () => {
378
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
379
+ name: "my-inbound-endpoint",
380
+ location: "eastus",
381
+ dnsResolverId: mockDnsResolverId,
382
+ subnetId: mockSubnetId,
383
+ });
384
+ // If the endpoint was created successfully, schemas were registered
385
+ expect(endpoint).toBeDefined();
386
+ expect(endpoint.resolvedApiVersion).toBe("2022-07-01");
387
+ });
388
+ it("should handle multiple instantiations without errors", () => {
389
+ new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint1", {
390
+ name: "my-inbound-endpoint-1",
391
+ location: "eastus",
392
+ dnsResolverId: mockDnsResolverId,
393
+ subnetId: mockSubnetId,
394
+ });
395
+ // Second instantiation should not throw an error even if schemas are already registered
396
+ const endpoint2 = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint2", {
397
+ name: "my-inbound-endpoint-2",
398
+ location: "eastus",
399
+ dnsResolverId: mockDnsResolverId,
400
+ subnetId: mockSubnetId,
401
+ });
402
+ expect(endpoint2).toBeDefined();
403
+ });
404
+ });
405
+ describe("Property Validation", () => {
406
+ it("should handle static IP allocation correctly", () => {
407
+ const endpointStatic = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpointStatic", {
408
+ name: "my-inbound-endpoint-static",
409
+ location: "eastus",
410
+ dnsResolverId: mockDnsResolverId,
411
+ subnetId: mockSubnetId,
412
+ privateIpAddress: "10.0.1.4",
413
+ privateIpAllocationMethod: "Static",
414
+ });
415
+ expect(endpointStatic.props.privateIpAddress).toBe("10.0.1.4");
416
+ expect(endpointStatic.props.privateIpAllocationMethod).toBe("Static");
417
+ });
418
+ it("should handle dynamic IP allocation correctly", () => {
419
+ const endpointDynamic = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpointDynamic", {
420
+ name: "my-inbound-endpoint-dynamic",
421
+ location: "eastus",
422
+ dnsResolverId: mockDnsResolverId,
423
+ subnetId: mockSubnetId,
424
+ privateIpAllocationMethod: "Dynamic",
425
+ });
426
+ expect(endpointDynamic.props.privateIpAllocationMethod).toBe("Dynamic");
427
+ expect(endpointDynamic.props.privateIpAddress).toBeUndefined();
428
+ });
429
+ it("should handle IP allocation without explicit method", () => {
430
+ const endpoint = new inbound_endpoint_1.DnsResolverInboundEndpoint(stack, "TestEndpoint", {
431
+ name: "my-inbound-endpoint",
432
+ location: "eastus",
433
+ dnsResolverId: mockDnsResolverId,
434
+ subnetId: mockSubnetId,
435
+ });
436
+ // Should default to dynamic when not specified
437
+ expect(endpoint.props.privateIpAllocationMethod).toBeUndefined();
438
+ });
439
+ });
440
+ });
441
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5ib3VuZC1lbmRwb2ludC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F6dXJlLWRuc3Jlc29sdmVyL3Rlc3QvaW5ib3VuZC1lbmRwb2ludC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOztBQUVILGlDQUFnQztBQUNoQywrQkFBK0I7QUFDL0Isa0dBQTZGO0FBQzdGLDJHQUF5RztBQUN6Ryw4REFHaUM7QUFDakMsOEVBR3lDO0FBRXpDLFFBQVEsQ0FBQyw2Q0FBNkMsRUFBRSxHQUFHLEVBQUU7SUFDM0QsSUFBSSxHQUFjLENBQUM7SUFDbkIsSUFBSSxLQUEyQixDQUFDO0lBQ2hDLElBQUksT0FBMEIsQ0FBQztJQUUvQixNQUFNLGlCQUFpQixHQUNyQixtSUFBbUksQ0FBQztJQUN0SSxNQUFNLFlBQVksR0FDaEIseUpBQXlKLENBQUM7SUFFNUosVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLEdBQUcsR0FBRyxlQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbkQsT0FBTyxHQUFHLHVDQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXZDLGdDQUFnQztRQUNoQyxJQUFJLENBQUM7WUFDSCxPQUFPLENBQUMsb0JBQW9CLENBQzFCLDZEQUFrQyxFQUNsQyxxRUFBMEMsQ0FDM0MsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsK0JBQStCO1FBQ2pDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7UUFDaEQsRUFBRSxDQUFDLHlFQUF5RSxFQUFFLEdBQUcsRUFBRTtZQUNqRixNQUFNLEtBQUssR0FBb0M7Z0JBQzdDLElBQUksRUFBRSxxQkFBcUI7Z0JBQzNCLFFB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Q0FDRixDQUFDO1lBRUYsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7WUFDN0QsTUFBTSxRQUFRLEdBQUcsSUFBSSw2Q0FBMEIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFO2dCQUNyRSxJQUFJLEVBQUUscUJBQXFCO2dCQUMzQixRQUFRLEVBQUUsUUFBUTtnQkFDbEIsYUFBYSxFQUFFLGlCQUFpQjtnQkFDaEMsUUFBUSxFQUFFLFlBQVk7YUFDdkIsQ0FBQyxDQUFDO1lBRUgsK0NBQStDO1lBQy9DLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21wcmVoZW5zaXZlIHRlc3RzIGZvciB0aGUgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQgaW1wbGVtZW50YXRpb25cbiAqXG4gKiBUaGlzIHRlc3Qgc3VpdGUgdmFsaWRhdGVzIHRoZSBEbnNSZXNvbHZlckluYm91bmRFbmRwb2ludCBjbGFzcyB1c2luZyB0aGVcbiAqIEF6YXBpUmVzb3VyY2UgZnJhbWV3b3JrLiBUZXN0cyBjb3ZlciBhdXRvbWF0aWMgdmVyc2lvbiByZXNvbHV0aW9uLFxuICogZXhwbGljaXQgdmVyc2lvbiBwaW5uaW5nLCBzY2hlbWEgdmFsaWRhdGlvbiwgcHJvcGVydHkgdHJhbnNmb3JtYXRpb24sXG4gKiBwYXJlbnQtY2hpbGQgcmVzb3VyY2UgcmVsYXRpb25zaGlwcywgYW5kIGZ1bGwgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuXG5pbXBvcnQgeyBUZXN0aW5nIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgKiBhcyBjZGt0ZiBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IEFwaVZlcnNpb25NYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL3ZlcnNpb24tbWFuYWdlci9hcGktdmVyc2lvbi1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBWZXJzaW9uU3VwcG9ydExldmVsIH0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL3ZlcnNpb24tbWFuYWdlci9pbnRlcmZhY2VzL3ZlcnNpb24taW50ZXJmYWNlc1wiO1xuaW1wb3J0IHtcbiAgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQsXG4gIERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50UHJvcHMsXG59IGZyb20gXCIuLi9saWIvaW5ib3VuZC1lbmRwb2ludFwiO1xuaW1wb3J0IHtcbiAgQUxMX0ROU19SRVNPTFZFUl9JTkJPVU5EX0VORFBPSU5UX1ZFUlNJT05TLFxuICBETlNfUkVTT0xWRVJfSU5CT1VORF9FTkRQT0lOVF9UWVBFLFxufSBmcm9tIFwiLi4vbGliL2luYm91bmQtZW5kcG9pbnQtc2NoZW1hc1wiO1xuXG5kZXNjcmliZShcIkRuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50IC0gSW1wbGVtZW50YXRpb25cIiwgKCkgPT4ge1xuICBsZXQgYXBwOiBjZGt0Zi5BcHA7XG4gIGxldCBzdGFjazogY2RrdGYuVGVycmFmb3JtU3RhY2s7XG4gIGxldCBtYW5hZ2VyOiBBcGlWZXJzaW9uTWFuYWdlcjtcblxuICBjb25zdCBtb2NrRG5zUmVzb2x2ZXJJZCA9XG4gICAgXCIvc3Vic2NyaXB0aW9ucy8xMjM0NTY3OC0xMjM0LTEyMzQtMTIzNC0xMjM0NTY3ODkwMTIvcmVzb3VyY2VHcm91cHMvdGVzdC1yZy9wcm92aWRlcnMvTWljcm9zb2Z0Lk5ldHdvcmsvZG5zUmVzb2x2ZXJzL3Rlc3QtcmVzb2x2ZXJcIjtcbiAgY29uc3QgbW9ja1N1Ym5ldElkID1cbiAgICBcIi9zdWJzY3JpcHRpb25zLzEyMzQ1Njc4LTEyMzQtMTIzNC0xMjM0LTEyMzQ1Njc4OTAxMi9yZXNvdXJjZUdyb3Vwcy90ZXN0LXJnL3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay92aXJ0dWFsTmV0d29ya3MvdGVzdC12bmV0L3N1Ym5ldHMvaW5ib3VuZC1zdWJuZXRcIjtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBhcHAgPSBUZXN0aW5nLmFwcCgpO1xuICAgIHN0YWNrID0gbmV3IGNka3RmLlRlcnJhZm9ybVN0YWNrKGFwcCwgXCJUZXN0U3RhY2tcIik7XG4gICAgbWFuYWdlciA9IEFwaVZlcnNpb25NYW5hZ2VyLmluc3RhbmNlKCk7XG5cbiAgICAvLyBFbnN1cmUgc2NoZW1hcyBhcmUgcmVnaXN0ZXJlZFxuICAgIHRyeSB7XG4gICAgICBtYW5hZ2VyLnJlZ2lzdGVyUmVzb3VyY2VUeXBlKFxuICAgICAgICBETlNfUkVTT0xWRVJfSU5CT1VORF9FTkRQT0lOVF9UWVBFLFxuICAgICAgICBBTExfRE5TX1JFU09MVkVSX0lOQk9VTkRfRU5EUE9JTlRfVkVSU0lPTlMsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZ25vcmUgaWYgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgfVxuICB9KTtcblxuICBkZXNjcmliZShcIkNvbnN0cnVjdG9yIGFuZCBCYXNpYyBQcm9wZXJ0aWVzXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBjcmVhdGUgSW5ib3VuZCBFbmRwb2ludCB3aXRoIGF1dG9tYXRpYyBsYXRlc3QgdmVyc2lvbiByZXNvbHV0aW9uXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzOiBEbnNSZXNvbHZlckluYm91bmRFbmRwb2ludFByb3BzID0ge1xuICAgICAgICBuYW1lOiBcIm15LWluYm91bmQtZW5kcG9pbnRcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGRuc1Jlc29sdmVySWQ6IG1vY2tEbnNSZXNvbHZlcklkLFxuICAgICAgICBzdWJuZXRJZDogbW9ja1N1Ym5ldElkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5kcG9pbnQgPSBuZXcgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQoXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBcIlRlc3RFbmRwb2ludFwiLFxuICAgICAgICBwcm9wcyxcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChlbmRwb2ludCkudG9CZUluc3RhbmNlT2YoRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQpO1xuICAgICAgZXhwZWN0KGVuZHBvaW50LnJlc29sdmVkQXBpVmVyc2lvbikudG9CZShcIjIwMjItMDctMDFcIik7XG4gICAgICBleHBlY3QoZW5kcG9pbnQucHJvcHMpLnRvQmUocHJvcHMpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIEluYm91bmQgRW5kcG9pbnQgd2l0aCBleHBsaWNpdCB2ZXJzaW9uIHBpbm5pbmdcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHM6IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50UHJvcHMgPSB7XG4gICAgICAgIG5hbWU6IFwibXktaW5ib3VuZC1lbmRwb2ludFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgZG5zUmVzb2x2ZXJJZDogbW9ja0Ruc1Jlc29sdmVySWQsXG4gICAgICAgIHN1Ym5ldElkOiBtb2NrU3VibmV0SWQsXG4gICAgICAgIGFwaVZlcnNpb246IFwiMjAyMi0wNy0wMVwiLFxuICAgICAgICB0YWdzOiB7IGVudmlyb25tZW50OiBcInRlc3RcIiB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5kcG9pbnQgPSBuZXcgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQoXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBcIlRlc3RFbmRwb2ludFwiLFxuICAgICAgICBwcm9wcyxcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChlbmRwb2ludC5yZXNvbHZlZEFwaVZlcnNpb24pLnRvQmUoXCIyMDIyLTA3LTAxXCIpO1xuICAgICAgZXhwZWN0KGVuZHBvaW50LnRhZ3MpLnRvRXF1YWwoeyBlbnZpcm9ubWVudDogXCJ0ZXN0XCIgfSk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCB1c2UgbG9jYXRpb24gZnJvbSBwcm9wc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wczogRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnRQcm9wcyA9IHtcbiAgICAgICAgbmFtZTogXCJteS1pbmJvdW5kLWVuZHBvaW50XCIsXG4gICAgICAgIGxvY2F0aW9uOiBcIndlc3R1c1wiLFxuICAgICAgICBkbnNSZXNvbHZlcklkOiBtb2NrRG5zUmVzb2x2ZXJJZCxcbiAgICAgICAgc3VibmV0SWQ6IG1vY2tTdWJuZXRJZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KFxuICAgICAgICBzdGFjayxcbiAgICAgICAgXCJUZXN0RW5kcG9pbnRcIixcbiAgICAgICAgcHJvcHMsXG4gICAgICApO1xuXG4gICAgICBleHBlY3QoZW5kcG9pbnQubG9jYXRpb24pLnRvQmUoXCJ3ZXN0dXNcIik7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBjcmVhdGUgSW5ib3VuZCBFbmRwb2ludCB3aXRoIHN0YXRpYyBJUCBhZGRyZXNzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzOiBEbnNSZXNvbHZlckluYm91bmRFbmRwb2ludFByb3BzID0ge1xuICAgICAgICBuYW1lOiBcIm15LWluYm91bmQtZW5kcG9pbnRcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGRuc1Jlc29sdmVySWQ6IG1vY2tEbnNSZXNvbHZlcklkLFxuICAgICAgICBzdWJuZXRJZDogbW9ja1N1Ym5ldElkLFxuICAgICAgICBwcml2YXRlSXBBZGRyZXNzOiBcIjEwLjAuMS40XCIsXG4gICAgICAgIHByaXZhdGVJcEFsbG9jYXRpb25NZXRob2Q6IFwiU3RhdGljXCIsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmRwb2ludCA9IG5ldyBEbnNSZXNvbHZlckluYm91bmRFbmRwb2ludChcbiAgICAgICAgc3RhY2ssXG4gICAgICAgIFwiVGVzdEVuZHBvaW50XCIsXG4gICAgICAgIHByb3BzLFxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KGVuZHBvaW50KS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGVuZHBvaW50LnByb3BzLnByaXZhdGVJcEFkZHJlc3MpLnRvQmUoXCIxMC4wLjEuNFwiKTtcbiAgICAgIGV4cGVjdChlbmRwb2ludC5wcm9wcy5wcml2YXRlSXBBbGxvY2F0aW9uTWV0aG9kKS50b0JlKFwiU3RhdGljXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIEluYm91bmQgRW5kcG9pbnQgd2l0aCBkeW5hbWljIElQIGFsbG9jYXRpb25cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHM6IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50UHJvcHMgPSB7XG4gICAgICAgIG5hbWU6IFwibXktaW5ib3VuZC1lbmRwb2ludFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgZG5zUmVzb2x2ZXJJZDogbW9ja0Ruc1Jlc29sdmVySWQsXG4gICAgICAgIHN1Ym5ldElkOiBtb2NrU3VibmV0SWQsXG4gICAgICAgIHByaXZhdGVJcEFsbG9jYXRpb25NZXRob2Q6IFwiRHluYW1pY1wiLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5kcG9pbnQgPSBuZXcgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQoXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBcIlRlc3RFbmRwb2ludFwiLFxuICAgICAgICBwcm9wcyxcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChlbmRwb2ludCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChlbmRwb2ludC5wcm9wcy5wcml2YXRlSXBBbGxvY2F0aW9uTWV0aG9kKS50b0JlKFwiRHluYW1pY1wiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJGcmFtZXdvcmsgSW50ZWdyYXRpb25cIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIHJlc29sdmUgbGF0ZXN0IEFQSSB2ZXJzaW9uIGF1dG9tYXRpY2FsbHlcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSBuZXcgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQoc3RhY2ssIFwiVGVzdEVuZHBvaW50XCIsIHtcbiAgICAgICAgbmFtZTogXCJteS1pbmJvdW5kLWVuZHBvaW50XCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBkbnNSZXNvbHZlcklkOiBtb2NrRG5zUmVzb2x2ZXJJZCxcbiAgICAgICAgc3VibmV0SWQ6IG1vY2tTdWJuZXRJZCxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoZW5kcG9pbnQucmVzb2x2ZWRBcGlWZXJzaW9uKS50b0JlKFwiMjAyMi0wNy0wMVwiKTtcbiAgICAgIGV4cGVjdChlbmRwb2ludC5sYXRlc3RWZXJzaW9uKCkpLnRvQmUoXCIyMDIyLTA3LTAxXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgcHJvdmlkZSB2ZXJzaW9uIGNvbmZpZ3VyYXRpb25cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSBuZXcgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQoc3RhY2ssIFwiVGVzdEVuZHBvaW50XCIsIHtcbiAgICAgICAgbmFtZTogXCJteS1pbmJvdW5kLWVuZHBvaW50XCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBkbnNSZXNvbHZlcklkOiBtb2NrRG5zUmVzb2x2ZXJJZCxcbiAgICAgICAgc3VibmV0SWQ6IG1vY2tTdWJuZXRJZCxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoZW5kcG9pbnQudmVyc2lvbkNvbmZpZykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChlbmRwb2ludC52ZXJzaW9uQ29uZmlnLnZlcnNpb24pLnRvQmUoXCIyMDIyLTA3LTAxXCIpO1xuICAgICAgZXhwZWN0KGVuZHBvaW50LnZlcnNpb25Db25maWcuc3VwcG9ydExldmVsKS50b0JlKFxuICAgICAgICBWZXJzaW9uU3VwcG9ydExldmVsLkFDVElWRSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBwcm92aWRlIHN1cHBvcnRlZCB2ZXJzaW9uc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IG5ldyBEbnNSZXNvbHZlckluYm91bmRFbmRwb2ludChzdGFjaywgXCJUZXN0RW5kcG9pbnRcIiwge1xuICAgICAgICBuYW1lOiBcIm15LWluYm91bmQtZW5kcG9pbnRcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGRuc1Jlc29sdmVySWQ6IG1vY2tEbnNSZXNvbHZlcklkLFxuICAgICAgICBzdWJuZXRJZDogbW9ja1N1Ym5ldElkLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHZlcnNpb25zID0gZW5kcG9pbnQuc3VwcG9ydGVkVmVyc2lvbnMoKTtcbiAgICAgIGV4cGVjdCh2ZXJzaW9ucykudG9Db250YWluKFwiMjAyMi0wNy0wMVwiKTtcbiAgICAgIGV4cGVjdCh2ZXJzaW9ucy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJQYXJlbnQtQ2hpbGQgUmVzb3VyY2UgUmVsYXRpb25zaGlwXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCB1c2UgZG5zUmVzb2x2ZXJJZCBhcyBwYXJlbnQgSURcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSBuZXcgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQoc3RhY2ssIFwiVGVzdEVuZHBvaW50XCIsIHtcbiAgICAgICAgbmFtZTogXCJteS1pbmJvdW5kLWVuZHBvaW50XCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBkbnNSZXNvbHZlcklkOiBtb2NrRG5zUmVzb2x2ZXJJZCxcbiAgICAgICAgc3VibmV0SWQ6IG1vY2tTdWJuZXRJZCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIGVuZHBvaW50IHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseSB3aXRoIHByb3BlciBwYXJlbnRcbiAgICAgIGV4cGVjdChlbmRwb2ludCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChlbmRwb2ludC5wcm9wcy5kbnNSZXNvbHZlcklkKS50b0JlKG1vY2tEbnNSZXNvbHZlcklkKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGNvcnJlY3RseSBoYW5kbGUgY2hpbGQgcmVzb3VyY2UgaW4gVGVycmFmb3JtIHN5bnRoZXNpc1wiLCAoKSA9PiB7XG4gICAgICBuZXcgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQoc3RhY2ssIFwiVGVzdEVuZHBvaW50XCIsIHtcbiAgICAgICAgbmFtZTogXCJteS1pbmJvdW5kLWVuZHBvaW50XCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBkbnNSZXNvbHZlcklkOiBtb2NrRG5zUmVzb2x2ZXJJZCxcbiAgICAgICAgc3VibmV0SWQ6IG1vY2tTdWJuZXRJZCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzeW50aGVzaXplZCA9IFRlc3Rpbmcuc3ludGgoc3RhY2spO1xuICAgICAgZXhwZWN0KHN5bnRoZXNpemVkKS50b0NvbnRhaW4oXCJpbmJvdW5kRW5kcG9pbnRzXCIpO1xuICAgICAgZXhwZWN0KHN5bnRoZXNpemVkKS50b0NvbnRhaW4obW9ja0Ruc1Jlc29sdmVySWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIlB1YmxpYyBNZXRob2RzIC0gSW5ib3VuZCBFbmRwb2ludCBQcm9wZXJ0aWVzXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBwcm92aWRlIHN1Ym5ldCBJRFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IG5ldyBEbnNSZXNvbHZlckluYm91bmRFbmRwb2ludChzdGFjaywgXCJUZXN0RW5kcG9pbnRcIiwge1xuICAgICAgICBuYW1lOiBcIm15LWluYm91bmQtZW5kcG9pbnRcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGRuc1Jlc29sdmVySWQ6IG1vY2tEbnNSZXNvbHZlcklkLFxuICAgICAgICBzdWJuZXRJZDogbW9ja1N1Ym5ldElkLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChlbmRwb2ludC5zdWJuZXRJZCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdCh0eXBlb2YgZW5kcG9pbnQuc3VibmV0SWQpLnRvQmUoXCJzdHJpbmdcIik7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBwcm92aWRlIHByaXZhdGUgSVAgYWRkcmVzc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IG5ldyBEbnNSZXNvbHZlckluYm91bmRFbmRwb2ludChzdGFjaywgXCJUZXN0RW5kcG9pbnRcIiwge1xuICAgICAgICBuYW1lOiBcIm15LWluYm91bmQtZW5kcG9pbnRcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGRuc1Jlc29sdmVySWQ6IG1vY2tEbnNSZXNvbHZlcklkLFxuICAgICAgICBzdWJuZXRJZDogbW9ja1N1Ym5ldElkLFxuICAgICAgICBwcml2YXRlSXBBZGRyZXNzOiBcIjEwLjAuMS40XCIsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGVuZHBvaW50LnByaXZhdGVJcEFkZHJlc3MpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QodHlwZW9mIGVuZHBvaW50LnByaXZhdGVJcEFkZHJlc3MpLnRvQmUoXCJzdHJpbmdcIik7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBwcm92aWRlIHByb3Zpc2lvbmluZyBzdGF0ZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IG5ldyBEbnNSZXNvbHZlckluYm91bmRFbmRwb2ludChzdGFjaywgXCJUZXN0RW5kcG9pbnRcIiwge1xuICAgICAgICBuYW1lOiBcIm15LWluYm91bmQtZW5kcG9pbnRcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGRuc1Jlc29sdmVySWQ6IG1vY2tEbnNSZXNvbHZlcklkLFxuICAgICAgICBzdWJuZXRJZDogbW9ja1N1Ym5ldElkLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChlbmRwb2ludC5wcm92aXNpb25pbmdTdGF0ZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdCh0eXBlb2YgZW5kcG9pbnQucHJvdmlzaW9uaW5nU3RhdGUpLnRvQmUoXCJzdHJpbmdcIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiVGFnIE1hbmFnZW1lbnRcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGFsbG93IGFkZGluZyB0YWdzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KHN0YWNrLCBcIlRlc3RFbmRwb2ludFwiLCB7XG4gICAgICAgIG5hbWU6IFwibXktaW5ib3VuZC1lbmRwb2ludFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgZG5zUmVzb2x2ZXJJZDogbW9ja0Ruc1Jlc29sdmVySWQsXG4gICAgICAgIHN1Ym5ldElkOiBtb2NrU3VibmV0SWQsXG4gICAgICAgIHRhZ3M6IHsgaW5pdGlhbDogXCJ0YWdcIiB9LFxuICAgICAgfSk7XG5cbiAgICAgIGVuZHBvaW50LmFkZFRhZyhcIm5ld0tleVwiLCBcIm5ld1ZhbHVlXCIpO1xuICAgICAgZXhwZWN0KGVuZHBvaW50LnByb3BzLnRhZ3MpLnRvSGF2ZVByb3BlcnR5KFwibmV3S2V5XCIsIFwibmV3VmFsdWVcIik7XG4gICAgICBleHBlY3QoZW5kcG9pbnQucHJvcHMudGFncykudG9IYXZlUHJvcGVydHkoXCJpbml0aWFsXCIsIFwidGFnXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgYWxsb3cgcmVtb3ZpbmcgdGFnc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IG5ldyBEbnNSZXNvbHZlckluYm91bmRFbmRwb2ludChzdGFjaywgXCJUZXN0RW5kcG9pbnRcIiwge1xuICAgICAgICBuYW1lOiBcIm15LWluYm91bmQtZW5kcG9pbnRcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGRuc1Jlc29sdmVySWQ6IG1vY2tEbnNSZXNvbHZlcklkLFxuICAgICAgICBzdWJuZXRJZDogbW9ja1N1Ym5ldElkLFxuICAgICAgICB0YWdzOiB7IGtleTE6IFwidmFsdWUxXCIsIGtleTI6IFwidmFsdWUyXCIgfSxcbiAgICAgIH0pO1xuXG4gICAgICBlbmRwb2ludC5yZW1vdmVUYWcoXCJrZXkxXCIpO1xuICAgICAgZXhwZWN0KGVuZHBvaW50LnByb3BzLnRhZ3MpLm5vdC50b0hhdmVQcm9wZXJ0eShcImtleTFcIik7XG4gICAgICBleHBlY3QoZW5kcG9pbnQucHJvcHMudGFncykudG9IYXZlUHJvcGVydHkoXCJrZXkyXCIsIFwidmFsdWUyXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIGFkZGluZyB0YWdzIHdoZW4gbm8gaW5pdGlhbCB0YWdzIGV4aXN0XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KHN0YWNrLCBcIlRlc3RFbmRwb2ludFwiLCB7XG4gICAgICAgIG5hbWU6IFwibXktaW5ib3VuZC1lbmRwb2ludFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgZG5zUmVzb2x2ZXJJZDogbW9ja0Ruc1Jlc29sdmVySWQsXG4gICAgICAgIHN1Ym5ldElkOiBtb2NrU3VibmV0SWQsXG4gICAgICB9KTtcblxuICAgICAgZW5kcG9pbnQuYWRkVGFnKFwibmV3S2V5XCIsIFwibmV3VmFsdWVcIik7XG4gICAgICBleHBlY3QoZW5kcG9pbnQucHJvcHMudGFncykudG9IYXZlUHJvcGVydHkoXCJuZXdLZXlcIiwgXCJuZXdWYWx1ZVwiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJPdXRwdXRzXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBjcmVhdGUgYWxsIHJlcXVpcmVkIG91dHB1dHNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSBuZXcgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQoc3RhY2ssIFwiVGVzdEVuZHBvaW50XCIsIHtcbiAgICAgICAgbmFtZTogXCJteS1pbmJvdW5kLWVuZHBvaW50XCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBkbnNSZXNvbHZlcklkOiBtb2NrRG5zUmVzb2x2ZXJJZCxcbiAgICAgICAgc3VibmV0SWQ6IG1vY2tTdWJuZXRJZCxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoZW5kcG9pbnQuaWRPdXRwdXQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoZW5kcG9pbnQubmFtZU91dHB1dCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChlbmRwb2ludC5sb2NhdGlvbk91dHB1dCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChlbmRwb2ludC50YWdzT3V0cHV0KS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGVuZHBvaW50LnByb3Zpc2lvbmluZ1N0YXRlT3V0cHV0KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgaGF2ZSBjb3JyZWN0IGxvZ2ljYWwgSURzIGZvciBvdXRwdXRzXCIsICgpID0+IHtcbiAgICAgIG5ldyBEbnNSZXNvbHZlckluYm91bmRFbmRwb2ludChzdGFjaywgXCJUZXN0RW5kcG9pbnRcIiwge1xuICAgICAgICBuYW1lOiBcIm15LWluYm91bmQtZW5kcG9pbnRcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGRuc1Jlc29sdmVySWQ6IG1vY2tEbnNSZXNvbHZlcklkLFxuICAgICAgICBzdWJuZXRJZDogbW9ja1N1Ym5ldElkLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHN5bnRoZXNpemVkID0gVGVzdGluZy5zeW50aChzdGFjayk7XG4gICAgICBleHBlY3Qoc3ludGhlc2l6ZWQpLnRvQ29udGFpbignXCJpZFwiJyk7XG4gICAgICBleHBlY3Qoc3ludGhlc2l6ZWQpLnRvQ29udGFpbignXCJuYW1lXCInKTtcbiAgICAgIGV4cGVjdChzeW50aGVzaXplZCkudG9Db250YWluKCdcImxvY2F0aW9uXCInKTtcbiAgICAgIGV4cGVjdChzeW50aGVzaXplZCkudG9Db250YWluKCdcInRhZ3NcIicpO1xuICAgICAgZXhwZWN0KHN5bnRoZXNpemVkKS50b0NvbnRhaW4oJ1wicHJvdmlzaW9uaW5nX3N0YXRlXCInKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJJZ25vcmUgQ2hhbmdlcyBDb25maWd1cmF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBhcHBseSBpZ25vcmUgY2hhbmdlcyBsaWZlY3ljbGUgcnVsZXNcIiwgKCkgPT4ge1xuICAgICAgbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KHN0YWNrLCBcIlRlc3RFbmRwb2ludFwiLCB7XG4gICAgICAgIG5hbWU6IFwibXktaW5ib3VuZC1lbmRwb2ludFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgZG5zUmVzb2x2ZXJJZDogbW9ja0Ruc1Jlc29sdmVySWQsXG4gICAgICAgIHN1Ym5ldElkOiBtb2NrU3VibmV0SWQsXG4gICAgICAgIGlnbm9yZUNoYW5nZXM6IFtcInRhZ3NcIl0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3ludGhlc2l6ZWQgPSBUZXN0aW5nLnN5bnRoKHN0YWNrKTtcbiAgICAgIGV4cGVjdChzeW50aGVzaXplZCkudG9Db250YWluKFwiaWdub3JlX2NoYW5nZXNcIik7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgbXVsdGlwbGUgaWdub3JlIGNoYW5nZXMgcHJvcGVydGllc1wiLCAoKSA9PiB7XG4gICAgICBuZXcgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQoc3RhY2ssIFwiVGVzdEVuZHBvaW50XCIsIHtcbiAgICAgICAgbmFtZTogXCJteS1pbmJvdW5kLWVuZHBvaW50XCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBkbnNSZXNvbHZlcklkOiBtb2NrRG5zUmVzb2x2ZXJJZCxcbiAgICAgICAgc3VibmV0SWQ6IG1vY2tTdWJuZXRJZCxcbiAgICAgICAgaWdub3JlQ2hhbmdlczogW1widGFnc1wiLCBcImxvY2F0aW9uXCJdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHN5bnRoZXNpemVkID0gVGVzdGluZy5zeW50aChzdGFjayk7XG4gICAgICBleHBlY3Qoc3ludGhlc2l6ZWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiQ0RLIFRlcnJhZm9ybSBJbnRlZ3JhdGlvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgc3ludGhlc2l6ZSB0byB2YWxpZCBUZXJyYWZvcm0gY29uZmlndXJhdGlvblwiLCAoKSA9PiB7XG4gICAgICBuZXcgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQoc3RhY2ssIFwiU3ludGhUZXN0XCIsIHtcbiAgICAgICAgbmFtZTogXCJteS1pbmJvdW5kLWVuZHBvaW50XCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBkbnNSZXNvbHZlcklkOiBtb2NrRG5zUmVzb2x2ZXJJZCxcbiAgICAgICAgc3VibmV0SWQ6IG1vY2tTdWJuZXRJZCxcbiAgICAgICAgdGFnczogeyB0ZXN0OiBcInN5bnRoZXNpc1wiIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3ludGhlc2l6ZWQgPSBUZXN0aW5nLnN5bnRoKHN0YWNrKTtcbiAgICAgIGV4cGVjdChzeW50aGVzaXplZCkudG9CZURlZmluZWQoKTtcblxuICAgICAgY29uc3Qgc3RhY2tDb25maWcgPSBKU09OLnBhcnNlKHN5bnRoZXNpemVkKTtcbiAgICAgIGV4cGVjdChzdGFja0NvbmZpZy5yZXNvdXJjZSkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGdlbmVyYXRlIGNvcnJlY3QgcmVzb3VyY2UgdHlwZSBpbiBUZXJyYWZvcm1cIiwgKCkgPT4ge1xuICAgICAgbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KHN0YWNrLCBcIlN5bnRoVGVzdFwiLCB7XG4gICAgICAgIG5hbWU6IFwibXktaW5ib3VuZC1lbmRwb2ludFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgZG5zUmVzb2x2ZXJJZDogbW9ja0Ruc1Jlc29sdmVySWQsXG4gICAgICAgIHN1Ym5ldElkOiBtb2NrU3VibmV0SWQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3ludGhlc2l6ZWQgPSBUZXN0aW5nLnN5bnRoKHN0YWNrKTtcbiAgICAgIGV4cGVjdChzeW50aGVzaXplZCkudG9Db250YWluKFwiaW5ib3VuZEVuZHBvaW50c1wiKTtcbiAgICAgIGV4cGVjdChzeW50aGVzaXplZCkudG9Db250YWluKFwiMjAyMi0wNy0wMVwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGluY2x1ZGUgYWxsIHByb3BlcnRpZXMgaW4gVGVycmFmb3JtIGJvZHlcIiwgKCkgPT4ge1xuICAgICAgbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KHN0YWNrLCBcIlN5bnRoVGVzdFwiLCB7XG4gICAgICAgIG5hbWU6IFwibXktaW5ib3VuZC1lbmRwb2ludFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgZG5zUmVzb2x2ZXJJZDogbW9ja0Ruc1Jlc29sdmVySWQsXG4gICAgICAgIHN1Ym5ldElkOiBtb2NrU3VibmV0SWQsXG4gICAgICAgIHByaXZhdGVJcEFkZHJlc3M6IFwiMTAuMC4xLjRcIixcbiAgICAgICAgcHJpdmF0ZUlwQWxsb2NhdGlvbk1ldGhvZDogXCJTdGF0aWNcIixcbiAgICAgICAgdGFnczogeyBlbnY6IFwidGVzdFwiIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3ludGhlc2l6ZWQgPSBUZXN0aW5nLnN5bnRoKHN0YWNrKTtcbiAgICAgIGV4cGVjdChzeW50aGVzaXplZCkudG9Db250YWluKFwiZWFzdHVzXCIpO1xuICAgICAgZXhwZWN0KHN5bnRoZXNpemVkKS50b0NvbnRhaW4oXCJlbnZcIik7XG4gICAgICBleHBlY3Qoc3ludGhlc2l6ZWQpLnRvQ29udGFpbihtb2NrU3VibmV0SWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIlJlc291cmNlIElkZW50aWZpY2F0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBwcm92aWRlIHJlc291cmNlIElEXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KHN0YWNrLCBcIlRlc3RFbmRwb2ludFwiLCB7XG4gICAgICAgIG5hbWU6IFwibXktaW5ib3VuZC1lbmRwb2ludFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgZG5zUmVzb2x2ZXJJZDogbW9ja0Ruc1Jlc29sdmVySWQsXG4gICAgICAgIHN1Ym5ldElkOiBtb2NrU3VibmV0SWQsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGVuZHBvaW50LmlkKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHR5cGVvZiBlbmRwb2ludC5pZCkudG9CZShcInN0cmluZ1wiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIHByb3ZpZGUgcmVzb3VyY2UgbmFtZSBmcm9tIGNvbnN0cnVjdCBpZCB3aGVuIG5hbWUgbm90IGluIHByb3BzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KHN0YWNrLCBcIlRlc3RFbmRwb2ludFwiLCB7XG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBkbnNSZXNvbHZlcklkOiBtb2NrRG5zUmVzb2x2ZXJJZCxcbiAgICAgICAgc3VibmV0SWQ6IG1vY2tTdWJuZXRJZCxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoZW5kcG9pbnQubmFtZSkudG9CZShcIlRlc3RFbmRwb2ludFwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIHByb3ZpZGUgcmVzb3VyY2UgbmFtZSBmcm9tIHByb3BzIHdoZW4gc3BlY2lmaWVkXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KHN0YWNrLCBcIlRlc3RFbmRwb2ludFwiLCB7XG4gICAgICAgIG5hbWU6IFwibXktaW5ib3VuZC1lbmRwb2ludFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgZG5zUmVzb2x2ZXJJZDogbW9ja0Ruc1Jlc29sdmVySWQsXG4gICAgICAgIHN1Ym5ldElkOiBtb2NrU3VibmV0SWQsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGVuZHBvaW50Lm5hbWUpLnRvQmUoXCJteS1pbmJvdW5kLWVuZHBvaW50XCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIkpTSUkgQ29tcGxpYW5jZVwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgaGF2ZSBwcm9wZXIgcmV0dXJuIHR5cGVzIGZvciBhbGwgcHVibGljIG1ldGhvZHNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSBuZXcgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQoc3RhY2ssIFwiVGVzdEVuZHBvaW50XCIsIHtcbiAgICAgICAgbmFtZTogXCJteS1pbmJvdW5kLWVuZHBvaW50XCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBkbnNSZXNvbHZlcklkOiBtb2NrRG5zUmVzb2x2ZXJJZCxcbiAgICAgICAgc3VibmV0SWQ6IG1vY2tTdWJuZXRJZCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBbGwgZ2V0dGVyIG1ldGhvZHMgc2hvdWxkIHJldHVybiBzdHJpbmdzIGZvciBUZXJyYWZvcm0gaW50ZXJwb2xhdGlvbnNcbiAgICAgIGV4cGVjdCh0eXBlb2YgZW5kcG9pbnQuc3VibmV0SWQpLnRvQmUoXCJzdHJpbmdcIik7XG4gICAgICBleHBlY3QodHlwZW9mIGVuZHBvaW50LnByaXZhdGVJcEFkZHJlc3MpLnRvQmUoXCJzdHJpbmdcIik7XG4gICAgICBleHBlY3QodHlwZW9mIGVuZHBvaW50LnByb3Zpc2lvbmluZ1N0YXRlKS50b0JlKFwic3RyaW5nXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgbm90IHVzZSBmdW5jdGlvbiB0eXBlcyBpbiBwdWJsaWMgaW50ZXJmYWNlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KHN0YWNrLCBcIlRlc3RFbmRwb2ludFwiLCB7XG4gICAgICAgIG5hbWU6IFwibXktaW5ib3VuZC1lbmRwb2ludFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgZG5zUmVzb2x2ZXJJZDogbW9ja0Ruc1Jlc29sdmVySWQsXG4gICAgICAgIHN1Ym5ldElkOiBtb2NrU3VibmV0SWQsXG4gICAgICB9KTtcblxuICAgICAgLy8gVmVyaWZ5IG1ldGhvZHMgZXhpc3QgYW5kIGFyZSBjYWxsYWJsZVxuICAgICAgZXhwZWN0KHR5cGVvZiBlbmRwb2ludC5hZGRUYWcpLnRvQmUoXCJmdW5jdGlvblwiKTtcbiAgICAgIGV4cGVjdCh0eXBlb2YgZW5kcG9pbnQucmVtb3ZlVGFnKS50b0JlKFwiZnVuY3Rpb25cIik7XG5cbiAgICAgIC8vIFRlc3QgdGhhdCB0aGV5IHdvcmsgY29ycmVjdGx5XG4gICAgICBlbmRwb2ludC5hZGRUYWcoXCJ0ZXN0XCIsIFwidmFsdWVcIik7XG4gICAgICBleHBlY3QoZW5kcG9pbnQucHJvcHMudGFncykudG9IYXZlUHJvcGVydHkoXCJ0ZXN0XCIsIFwidmFsdWVcIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiU2NoZW1hIFJlZ2lzdHJhdGlvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgcmVnaXN0ZXIgc2NoZW1hcyBzdWNjZXNzZnVsbHlcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSBuZXcgRG5zUmVzb2x2ZXJJbmJvdW5kRW5kcG9pbnQoc3RhY2ssIFwiVGVzdEVuZHBvaW50XCIsIHtcbiAgICAgICAgbmFtZTogXCJteS1pbmJvdW5kLWVuZHBvaW50XCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBkbnNSZXNvbHZlcklkOiBtb2NrRG5zUmVzb2x2ZXJJZCxcbiAgICAgICAgc3VibmV0SWQ6IG1vY2tTdWJuZXRJZCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiB0aGUgZW5kcG9pbnQgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LCBzY2hlbWFzIHdlcmUgcmVnaXN0ZXJlZFxuICAgICAgZXhwZWN0KGVuZHBvaW50KS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGVuZHBvaW50LnJlc29sdmVkQXBpVmVyc2lvbikudG9CZShcIjIwMjItMDctMDFcIik7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgbXVsdGlwbGUgaW5zdGFudGlhdGlvbnMgd2l0aG91dCBlcnJvcnNcIiwgKCkgPT4ge1xuICAgICAgbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KHN0YWNrLCBcIlRlc3RFbmRwb2ludDFcIiwge1xuICAgICAgICBuYW1lOiBcIm15LWluYm91bmQtZW5kcG9pbnQtMVwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgZG5zUmVzb2x2ZXJJZDogbW9ja0Ruc1Jlc29sdmVySWQsXG4gICAgICAgIHN1Ym5ldElkOiBtb2NrU3VibmV0SWQsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2Vjb25kIGluc3RhbnRpYXRpb24gc2hvdWxkIG5vdCB0aHJvdyBhbiBlcnJvciBldmVuIGlmIHNjaGVtYXMgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgICAgY29uc3QgZW5kcG9pbnQyID0gbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KHN0YWNrLCBcIlRlc3RFbmRwb2ludDJcIiwge1xuICAgICAgICBuYW1lOiBcIm15LWluYm91bmQtZW5kcG9pbnQtMlwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgZG5zUmVzb2x2ZXJJZDogbW9ja0Ruc1Jlc29sdmVySWQsXG4gICAgICAgIHN1Ym5ldElkOiBtb2NrU3VibmV0SWQsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGVuZHBvaW50MikudG9CZURlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJQcm9wZXJ0eSBWYWxpZGF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBoYW5kbGUgc3RhdGljIElQIGFsbG9jYXRpb24gY29ycmVjdGx5XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGVuZHBvaW50U3RhdGljID0gbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KFxuICAgICAgICBzdGFjayxcbiAgICAgICAgXCJUZXN0RW5kcG9pbnRTdGF0aWNcIixcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwibXktaW5ib3VuZC1lbmRwb2ludC1zdGF0aWNcIixcbiAgICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgICBkbnNSZXNvbHZlcklkOiBtb2NrRG5zUmVzb2x2ZXJJZCxcbiAgICAgICAgICBzdWJuZXRJZDogbW9ja1N1Ym5ldElkLFxuICAgICAgICAgIHByaXZhdGVJcEFkZHJlc3M6IFwiMTAuMC4xLjRcIixcbiAgICAgICAgICBwcml2YXRlSXBBbGxvY2F0aW9uTWV0aG9kOiBcIlN0YXRpY1wiLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KGVuZHBvaW50U3RhdGljLnByb3BzLnByaXZhdGVJcEFkZHJlc3MpLnRvQmUoXCIxMC4wLjEuNFwiKTtcbiAgICAgIGV4cGVjdChlbmRwb2ludFN0YXRpYy5wcm9wcy5wcml2YXRlSXBBbGxvY2F0aW9uTWV0aG9kKS50b0JlKFwiU3RhdGljXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIGR5bmFtaWMgSVAgYWxsb2NhdGlvbiBjb3JyZWN0bHlcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZW5kcG9pbnREeW5hbWljID0gbmV3IERuc1Jlc29sdmVySW5ib3VuZEVuZHBvaW50KFxuICAgICAgICBzdGFjayxcbiAgICAgICAgXCJUZXN0RW5kcG9pbnREeW5hbWljXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIm15LWluYm91bmQtZW5kcG9pbnQtZHluYW1pY1wiLFxuICAgICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICAgIGRuc1Jlc29sdmVySWQ6IG1vY2tEbnNSZXNvbHZlcklkLFxuICAgICAgICAgIHN1Ym5ldElkOiBtb2NrU3VibmV0SWQsXG4gICAgICAgICAgcHJpdmF0ZUlwQWxsb2NhdGlvbk1ldGhvZDogXCJEeW5hbWljXCIsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBleHBlY3QoZW5kcG9pbnREeW5hbWljLnByb3BzLnByaXZhdGVJcEFsbG9jYXRpb25NZXRob2QpLnRvQmUoXCJEeW5hbWljXCIpO1xuICAgICAgZXhwZWN0KGVuZHBvaW50RHluYW1pYy5wcm9wcy5wcml2YXRlSXBBZGRyZXNzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgSVAgYWxsb2NhdGlvbiB3aXRob3V0IGV4cGxpY2l0IG1ldGhvZFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IG5ldyBEbnNSZXNvbHZlckluYm91bmRFbmRwb2ludChzdGFjaywgXCJUZXN0RW5kcG9pbnRcIiwge1xuICAgICAgICBuYW1lOiBcIm15LWluYm91bmQtZW5kcG9pbnRcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGRuc1Jlc29sdmVySWQ6IG1vY2tEbnNSZXNvbHZlcklkLFxuICAgICAgICBzdWJuZXRJZDogbW9ja1N1Ym5ldElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNob3VsZCBkZWZhdWx0IHRvIGR5bmFtaWMgd2hlbiBub3Qgc3BlY2lmaWVkXG4gICAgICBleHBlY3QoZW5kcG9pbnQucHJvcHMucHJpdmF0ZUlwQWxsb2NhdGlvbk1ldGhvZCkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Integration test for Azure DNS Resolver Outbound Endpoint
3
+ *
4
+ * This test demonstrates basic usage of the DnsResolverOutboundEndpoint construct
5
+ * and validates deployment, idempotency, and cleanup for child resources.
6
+ *
7
+ * Run with: npm run integration:nostream
8
+ */
9
+ import "cdktf/lib/testing/adapters/jest";