@dyanet/nestjs-config-aws 1.0.1 → 1.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/README.md +208 -1013
  2. package/dist/cjs/config-aws/src/config-manager.js +366 -0
  3. package/dist/cjs/config-aws/src/errors/index.js +77 -0
  4. package/dist/cjs/config-aws/src/index.js +37 -0
  5. package/dist/cjs/config-aws/src/interfaces/config-loader.interface.js +3 -0
  6. package/dist/cjs/config-aws/src/interfaces/config-manager.interface.js +3 -0
  7. package/dist/cjs/config-aws/src/interfaces/env-file-loader.interface.js +3 -0
  8. package/dist/cjs/config-aws/src/interfaces/environment-loader.interface.js +3 -0
  9. package/dist/cjs/config-aws/src/interfaces/s3-loader.interface.js +3 -0
  10. package/dist/cjs/config-aws/src/interfaces/secrets-manager-loader.interface.js +3 -0
  11. package/dist/cjs/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +3 -0
  12. package/dist/cjs/config-aws/src/loaders/env-file.loader.js +169 -0
  13. package/dist/cjs/config-aws/src/loaders/environment.loader.js +85 -0
  14. package/dist/cjs/config-aws/src/loaders/s3.loader.js +145 -0
  15. package/dist/cjs/config-aws/src/loaders/secrets-manager.loader.js +162 -0
  16. package/dist/cjs/config-aws/src/loaders/ssm-parameter-store.loader.js +199 -0
  17. package/dist/cjs/config-aws/src/utils/env-file-parser.util.js +98 -0
  18. package/dist/cjs/config-aws/src/utils/validation.util.js +116 -0
  19. package/dist/cjs/nestjs-config-aws/src/config.module.js +175 -0
  20. package/dist/cjs/nestjs-config-aws/src/index.js +61 -0
  21. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/index.js +1 -1
  22. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +3 -0
  23. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +3 -0
  24. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/interfaces/index.js +1 -1
  25. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +3 -0
  26. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +3 -0
  27. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +73 -0
  28. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +3 -0
  29. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +4 -0
  30. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +52 -0
  31. package/dist/cjs/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +124 -0
  32. package/dist/cjs/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +592 -0
  33. package/dist/cjs/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +385 -0
  34. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/providers/index.js +1 -1
  35. package/dist/cjs/nestjs-config-aws/src/integration/services/async-config-helper.service.js +358 -0
  36. package/dist/cjs/nestjs-config-aws/src/integration/services/error-handler.service.js +267 -0
  37. package/dist/cjs/nestjs-config-aws/src/integration/services/factory-registration.service.js +517 -0
  38. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/services/index.js +1 -1
  39. package/dist/cjs/nestjs-config-aws/src/integration/services/integration-state.service.js +81 -0
  40. package/dist/cjs/nestjs-config-aws/src/integration/services/namespace-handler.service.js +465 -0
  41. package/dist/cjs/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +318 -0
  42. package/dist/cjs/nestjs-config-aws/src/integration/services/precedence-handler.service.js +292 -0
  43. package/dist/cjs/nestjs-config-aws/src/integration/services/validation-integration.service.js +592 -0
  44. package/dist/cjs/nestjs-config-aws/src/integration/utils/config-integration.util.js +283 -0
  45. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/utils/index.js +1 -1
  46. package/dist/cjs/nestjs-config-aws/src/interfaces/config-service.interface.js +11 -0
  47. package/dist/cjs/nestjs-config-aws/src/interfaces/default-schema.interface.js +63 -0
  48. package/dist/cjs/nestjs-config-aws/src/interfaces/index.js +30 -0
  49. package/dist/cjs/nestjs-config-aws/src/interfaces/module-options.interface.js +3 -0
  50. package/dist/cjs/nestjs-config-aws/src/services/config.service.js +142 -0
  51. package/dist/esm/config-aws/src/config-manager.js +362 -0
  52. package/dist/esm/config-aws/src/errors/index.js +69 -0
  53. package/dist/esm/config-aws/src/index.js +21 -0
  54. package/dist/esm/config-aws/src/interfaces/config-loader.interface.js +2 -0
  55. package/dist/esm/config-aws/src/interfaces/config-manager.interface.js +2 -0
  56. package/dist/esm/config-aws/src/interfaces/env-file-loader.interface.js +2 -0
  57. package/dist/esm/config-aws/src/interfaces/environment-loader.interface.js +2 -0
  58. package/dist/esm/config-aws/src/interfaces/s3-loader.interface.js +2 -0
  59. package/dist/esm/config-aws/src/interfaces/secrets-manager-loader.interface.js +2 -0
  60. package/dist/esm/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +2 -0
  61. package/dist/esm/config-aws/src/loaders/env-file.loader.js +132 -0
  62. package/dist/esm/config-aws/src/loaders/environment.loader.js +81 -0
  63. package/dist/esm/config-aws/src/loaders/s3.loader.js +141 -0
  64. package/dist/esm/config-aws/src/loaders/secrets-manager.loader.js +158 -0
  65. package/dist/esm/config-aws/src/loaders/ssm-parameter-store.loader.js +195 -0
  66. package/dist/esm/config-aws/src/utils/env-file-parser.util.js +94 -0
  67. package/dist/esm/config-aws/src/utils/validation.util.js +112 -0
  68. package/dist/esm/nestjs-config-aws/src/config.module.js +172 -0
  69. package/dist/esm/nestjs-config-aws/src/index.js +23 -0
  70. package/dist/esm/nestjs-config-aws/src/integration/index.js +7 -0
  71. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +2 -0
  72. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +2 -0
  73. package/dist/esm/nestjs-config-aws/src/integration/interfaces/index.js +10 -0
  74. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +2 -0
  75. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +2 -0
  76. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +64 -0
  77. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +2 -0
  78. package/dist/esm/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +3 -0
  79. package/dist/esm/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +44 -0
  80. package/dist/esm/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +121 -0
  81. package/dist/esm/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +589 -0
  82. package/dist/esm/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +382 -0
  83. package/dist/esm/nestjs-config-aws/src/integration/providers/index.js +4 -0
  84. package/dist/esm/nestjs-config-aws/src/integration/services/async-config-helper.service.js +355 -0
  85. package/dist/esm/nestjs-config-aws/src/integration/services/error-handler.service.js +264 -0
  86. package/dist/esm/nestjs-config-aws/src/integration/services/factory-registration.service.js +514 -0
  87. package/dist/esm/nestjs-config-aws/src/integration/services/index.js +10 -0
  88. package/dist/esm/nestjs-config-aws/src/integration/services/integration-state.service.js +78 -0
  89. package/dist/esm/nestjs-config-aws/src/integration/services/namespace-handler.service.js +462 -0
  90. package/dist/esm/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +315 -0
  91. package/dist/esm/nestjs-config-aws/src/integration/services/precedence-handler.service.js +289 -0
  92. package/dist/esm/nestjs-config-aws/src/integration/services/validation-integration.service.js +586 -0
  93. package/dist/esm/nestjs-config-aws/src/integration/utils/config-integration.util.js +240 -0
  94. package/dist/esm/nestjs-config-aws/src/integration/utils/index.js +3 -0
  95. package/dist/esm/nestjs-config-aws/src/interfaces/config-service.interface.js +7 -0
  96. package/dist/esm/nestjs-config-aws/src/interfaces/default-schema.interface.js +59 -0
  97. package/dist/esm/nestjs-config-aws/src/interfaces/index.js +8 -0
  98. package/dist/esm/nestjs-config-aws/src/interfaces/module-options.interface.js +2 -0
  99. package/dist/esm/nestjs-config-aws/src/services/config.service.js +139 -0
  100. package/dist/types/config-aws/src/config-manager.d.ts +119 -0
  101. package/dist/types/config-aws/src/config-manager.d.ts.map +1 -0
  102. package/dist/types/config-aws/src/errors/index.d.ts +43 -0
  103. package/dist/types/config-aws/src/errors/index.d.ts.map +1 -0
  104. package/dist/types/config-aws/src/index.d.ts +24 -0
  105. package/dist/types/config-aws/src/index.d.ts.map +1 -0
  106. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts +33 -0
  107. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts.map +1 -0
  108. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts +86 -0
  109. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts.map +1 -0
  110. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts +12 -0
  111. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts.map +1 -0
  112. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts +10 -0
  113. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts.map +1 -0
  114. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts +14 -0
  115. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts.map +1 -0
  116. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts +12 -0
  117. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts.map +1 -0
  118. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts +14 -0
  119. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts.map +1 -0
  120. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts +69 -0
  121. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts.map +1 -0
  122. package/dist/types/config-aws/src/loaders/environment.loader.d.ts +46 -0
  123. package/dist/types/config-aws/src/loaders/environment.loader.d.ts.map +1 -0
  124. package/dist/types/config-aws/src/loaders/s3.loader.d.ts +62 -0
  125. package/dist/types/config-aws/src/loaders/s3.loader.d.ts.map +1 -0
  126. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts +68 -0
  127. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts.map +1 -0
  128. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts +78 -0
  129. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts.map +1 -0
  130. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts +45 -0
  131. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts.map +1 -0
  132. package/dist/types/{utils → config-aws/src/utils}/validation.util.d.ts +10 -10
  133. package/dist/types/config-aws/src/utils/validation.util.d.ts.map +1 -0
  134. package/dist/types/{config.module.d.ts → nestjs-config-aws/src/config.module.d.ts} +1 -0
  135. package/dist/types/nestjs-config-aws/src/config.module.d.ts.map +1 -0
  136. package/dist/types/{index.d.ts → nestjs-config-aws/src/index.d.ts} +2 -4
  137. package/dist/types/nestjs-config-aws/src/index.d.ts.map +1 -0
  138. package/dist/types/nestjs-config-aws/src/integration/index.d.ts.map +1 -0
  139. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts.map +1 -0
  140. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts.map +1 -0
  141. package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts.map +1 -0
  142. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts.map +1 -0
  143. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts.map +1 -0
  144. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts.map +1 -0
  145. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts.map +1 -0
  146. package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts.map +1 -0
  147. package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts.map +1 -0
  148. package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts.map +1 -0
  149. package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts.map +1 -0
  150. package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts.map +1 -0
  151. package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts.map +1 -0
  152. package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts.map +1 -0
  153. package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts.map +1 -0
  154. package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts.map +1 -0
  155. package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts.map +1 -0
  156. package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts.map +1 -0
  157. package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts.map +1 -0
  158. package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts.map +1 -0
  159. package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts.map +1 -0
  160. package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts.map +1 -0
  161. package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts.map +1 -0
  162. package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts.map +1 -0
  163. package/dist/types/nestjs-config-aws/src/interfaces/config-service.interface.d.ts.map +1 -0
  164. package/dist/types/{interfaces → nestjs-config-aws/src/interfaces}/default-schema.interface.d.ts +28 -28
  165. package/dist/types/nestjs-config-aws/src/interfaces/default-schema.interface.d.ts.map +1 -0
  166. package/dist/types/nestjs-config-aws/src/interfaces/index.d.ts +5 -0
  167. package/dist/types/nestjs-config-aws/src/interfaces/index.d.ts.map +1 -0
  168. package/dist/types/nestjs-config-aws/src/interfaces/module-options.interface.d.ts.map +1 -0
  169. package/dist/types/nestjs-config-aws/src/services/config.service.d.ts +88 -0
  170. package/dist/types/nestjs-config-aws/src/services/config.service.d.ts.map +1 -0
  171. package/package.json +17 -24
  172. package/LICENSE +0 -21
  173. package/dist/cjs/config.module.js +0 -178
  174. package/dist/cjs/config.module.js.map +0 -1
  175. package/dist/cjs/index.js +0 -47
  176. package/dist/cjs/index.js.map +0 -1
  177. package/dist/cjs/integration/index.js.map +0 -1
  178. package/dist/cjs/integration/interfaces/configuration-factory.interface.js +0 -3
  179. package/dist/cjs/integration/interfaces/configuration-factory.interface.js.map +0 -1
  180. package/dist/cjs/integration/interfaces/configuration-source.interface.js +0 -3
  181. package/dist/cjs/integration/interfaces/configuration-source.interface.js.map +0 -1
  182. package/dist/cjs/integration/interfaces/index.js.map +0 -1
  183. package/dist/cjs/integration/interfaces/integration-options.interface.js +0 -3
  184. package/dist/cjs/integration/interfaces/integration-options.interface.js.map +0 -1
  185. package/dist/cjs/integration/interfaces/integration-state.interface.js +0 -3
  186. package/dist/cjs/integration/interfaces/integration-state.interface.js.map +0 -1
  187. package/dist/cjs/integration/interfaces/nestjs-config-compatibility.interface.js +0 -73
  188. package/dist/cjs/integration/interfaces/nestjs-config-compatibility.interface.js.map +0 -1
  189. package/dist/cjs/integration/interfaces/nestjs-config-integration.interface.js +0 -3
  190. package/dist/cjs/integration/interfaces/nestjs-config-integration.interface.js.map +0 -1
  191. package/dist/cjs/integration/interfaces/typed-configuration.interface.js +0 -4
  192. package/dist/cjs/integration/interfaces/typed-configuration.interface.js.map +0 -1
  193. package/dist/cjs/integration/interfaces/utility-types.interface.js +0 -52
  194. package/dist/cjs/integration/interfaces/utility-types.interface.js.map +0 -1
  195. package/dist/cjs/integration/nestjs-config-integration.module.js +0 -124
  196. package/dist/cjs/integration/nestjs-config-integration.module.js.map +0 -1
  197. package/dist/cjs/integration/providers/aws-configuration-loader.service.js +0 -591
  198. package/dist/cjs/integration/providers/aws-configuration-loader.service.js.map +0 -1
  199. package/dist/cjs/integration/providers/configuration-factory.provider.js +0 -383
  200. package/dist/cjs/integration/providers/configuration-factory.provider.js.map +0 -1
  201. package/dist/cjs/integration/providers/index.js.map +0 -1
  202. package/dist/cjs/integration/services/async-config-helper.service.js +0 -356
  203. package/dist/cjs/integration/services/async-config-helper.service.js.map +0 -1
  204. package/dist/cjs/integration/services/error-handler.service.js +0 -265
  205. package/dist/cjs/integration/services/error-handler.service.js.map +0 -1
  206. package/dist/cjs/integration/services/factory-registration.service.js +0 -512
  207. package/dist/cjs/integration/services/factory-registration.service.js.map +0 -1
  208. package/dist/cjs/integration/services/index.js.map +0 -1
  209. package/dist/cjs/integration/services/integration-state.service.js +0 -83
  210. package/dist/cjs/integration/services/integration-state.service.js.map +0 -1
  211. package/dist/cjs/integration/services/namespace-handler.service.js +0 -467
  212. package/dist/cjs/integration/services/namespace-handler.service.js.map +0 -1
  213. package/dist/cjs/integration/services/nestjs-config-integration.service.js +0 -316
  214. package/dist/cjs/integration/services/nestjs-config-integration.service.js.map +0 -1
  215. package/dist/cjs/integration/services/precedence-handler.service.js +0 -294
  216. package/dist/cjs/integration/services/precedence-handler.service.js.map +0 -1
  217. package/dist/cjs/integration/services/validation-integration.service.js +0 -591
  218. package/dist/cjs/integration/services/validation-integration.service.js.map +0 -1
  219. package/dist/cjs/integration/utils/config-integration.util.js +0 -283
  220. package/dist/cjs/integration/utils/config-integration.util.js.map +0 -1
  221. package/dist/cjs/integration/utils/index.js.map +0 -1
  222. package/dist/cjs/interfaces/config-loader.interface.js +0 -3
  223. package/dist/cjs/interfaces/config-loader.interface.js.map +0 -1
  224. package/dist/cjs/interfaces/config-service.interface.js +0 -11
  225. package/dist/cjs/interfaces/config-service.interface.js.map +0 -1
  226. package/dist/cjs/interfaces/default-schema.interface.js +0 -63
  227. package/dist/cjs/interfaces/default-schema.interface.js.map +0 -1
  228. package/dist/cjs/interfaces/errors.interface.js +0 -77
  229. package/dist/cjs/interfaces/errors.interface.js.map +0 -1
  230. package/dist/cjs/interfaces/index.js +0 -25
  231. package/dist/cjs/interfaces/index.js.map +0 -1
  232. package/dist/cjs/interfaces/module-options.interface.js +0 -3
  233. package/dist/cjs/interfaces/module-options.interface.js.map +0 -1
  234. package/dist/cjs/loaders/environment.loader.js +0 -59
  235. package/dist/cjs/loaders/environment.loader.js.map +0 -1
  236. package/dist/cjs/loaders/secrets-manager.loader.js +0 -122
  237. package/dist/cjs/loaders/secrets-manager.loader.js.map +0 -1
  238. package/dist/cjs/loaders/ssm-parameter-store.loader.js +0 -146
  239. package/dist/cjs/loaders/ssm-parameter-store.loader.js.map +0 -1
  240. package/dist/cjs/services/config.service.js +0 -297
  241. package/dist/cjs/services/config.service.js.map +0 -1
  242. package/dist/cjs/utils/validation.util.js +0 -114
  243. package/dist/cjs/utils/validation.util.js.map +0 -1
  244. package/dist/esm/config.module.js +0 -175
  245. package/dist/esm/config.module.js.map +0 -1
  246. package/dist/esm/index.js +0 -18
  247. package/dist/esm/index.js.map +0 -1
  248. package/dist/esm/integration/index.js +0 -7
  249. package/dist/esm/integration/index.js.map +0 -1
  250. package/dist/esm/integration/interfaces/configuration-factory.interface.js +0 -2
  251. package/dist/esm/integration/interfaces/configuration-factory.interface.js.map +0 -1
  252. package/dist/esm/integration/interfaces/configuration-source.interface.js +0 -2
  253. package/dist/esm/integration/interfaces/configuration-source.interface.js.map +0 -1
  254. package/dist/esm/integration/interfaces/index.js +0 -10
  255. package/dist/esm/integration/interfaces/index.js.map +0 -1
  256. package/dist/esm/integration/interfaces/integration-options.interface.js +0 -2
  257. package/dist/esm/integration/interfaces/integration-options.interface.js.map +0 -1
  258. package/dist/esm/integration/interfaces/integration-state.interface.js +0 -2
  259. package/dist/esm/integration/interfaces/integration-state.interface.js.map +0 -1
  260. package/dist/esm/integration/interfaces/nestjs-config-compatibility.interface.js +0 -64
  261. package/dist/esm/integration/interfaces/nestjs-config-compatibility.interface.js.map +0 -1
  262. package/dist/esm/integration/interfaces/nestjs-config-integration.interface.js +0 -2
  263. package/dist/esm/integration/interfaces/nestjs-config-integration.interface.js.map +0 -1
  264. package/dist/esm/integration/interfaces/typed-configuration.interface.js +0 -3
  265. package/dist/esm/integration/interfaces/typed-configuration.interface.js.map +0 -1
  266. package/dist/esm/integration/interfaces/utility-types.interface.js +0 -44
  267. package/dist/esm/integration/interfaces/utility-types.interface.js.map +0 -1
  268. package/dist/esm/integration/nestjs-config-integration.module.js +0 -121
  269. package/dist/esm/integration/nestjs-config-integration.module.js.map +0 -1
  270. package/dist/esm/integration/providers/aws-configuration-loader.service.js +0 -588
  271. package/dist/esm/integration/providers/aws-configuration-loader.service.js.map +0 -1
  272. package/dist/esm/integration/providers/configuration-factory.provider.js +0 -380
  273. package/dist/esm/integration/providers/configuration-factory.provider.js.map +0 -1
  274. package/dist/esm/integration/providers/index.js +0 -4
  275. package/dist/esm/integration/providers/index.js.map +0 -1
  276. package/dist/esm/integration/services/async-config-helper.service.js +0 -353
  277. package/dist/esm/integration/services/async-config-helper.service.js.map +0 -1
  278. package/dist/esm/integration/services/error-handler.service.js +0 -262
  279. package/dist/esm/integration/services/error-handler.service.js.map +0 -1
  280. package/dist/esm/integration/services/factory-registration.service.js +0 -509
  281. package/dist/esm/integration/services/factory-registration.service.js.map +0 -1
  282. package/dist/esm/integration/services/index.js +0 -10
  283. package/dist/esm/integration/services/index.js.map +0 -1
  284. package/dist/esm/integration/services/integration-state.service.js +0 -80
  285. package/dist/esm/integration/services/integration-state.service.js.map +0 -1
  286. package/dist/esm/integration/services/namespace-handler.service.js +0 -464
  287. package/dist/esm/integration/services/namespace-handler.service.js.map +0 -1
  288. package/dist/esm/integration/services/nestjs-config-integration.service.js +0 -313
  289. package/dist/esm/integration/services/nestjs-config-integration.service.js.map +0 -1
  290. package/dist/esm/integration/services/precedence-handler.service.js +0 -291
  291. package/dist/esm/integration/services/precedence-handler.service.js.map +0 -1
  292. package/dist/esm/integration/services/validation-integration.service.js +0 -585
  293. package/dist/esm/integration/services/validation-integration.service.js.map +0 -1
  294. package/dist/esm/integration/utils/config-integration.util.js +0 -240
  295. package/dist/esm/integration/utils/config-integration.util.js.map +0 -1
  296. package/dist/esm/integration/utils/index.js +0 -3
  297. package/dist/esm/integration/utils/index.js.map +0 -1
  298. package/dist/esm/interfaces/config-loader.interface.js +0 -2
  299. package/dist/esm/interfaces/config-loader.interface.js.map +0 -1
  300. package/dist/esm/interfaces/config-service.interface.js +0 -7
  301. package/dist/esm/interfaces/config-service.interface.js.map +0 -1
  302. package/dist/esm/interfaces/default-schema.interface.js +0 -59
  303. package/dist/esm/interfaces/default-schema.interface.js.map +0 -1
  304. package/dist/esm/interfaces/errors.interface.js +0 -69
  305. package/dist/esm/interfaces/errors.interface.js.map +0 -1
  306. package/dist/esm/interfaces/index.js +0 -9
  307. package/dist/esm/interfaces/index.js.map +0 -1
  308. package/dist/esm/interfaces/module-options.interface.js +0 -2
  309. package/dist/esm/interfaces/module-options.interface.js.map +0 -1
  310. package/dist/esm/loaders/environment.loader.js +0 -55
  311. package/dist/esm/loaders/environment.loader.js.map +0 -1
  312. package/dist/esm/loaders/secrets-manager.loader.js +0 -118
  313. package/dist/esm/loaders/secrets-manager.loader.js.map +0 -1
  314. package/dist/esm/loaders/ssm-parameter-store.loader.js +0 -142
  315. package/dist/esm/loaders/ssm-parameter-store.loader.js.map +0 -1
  316. package/dist/esm/services/config.service.js +0 -261
  317. package/dist/esm/services/config.service.js.map +0 -1
  318. package/dist/esm/utils/validation.util.js +0 -110
  319. package/dist/esm/utils/validation.util.js.map +0 -1
  320. package/dist/types/config.module.d.ts.map +0 -1
  321. package/dist/types/index.d.ts.map +0 -1
  322. package/dist/types/integration/index.d.ts.map +0 -1
  323. package/dist/types/integration/interfaces/configuration-factory.interface.d.ts.map +0 -1
  324. package/dist/types/integration/interfaces/configuration-source.interface.d.ts.map +0 -1
  325. package/dist/types/integration/interfaces/index.d.ts.map +0 -1
  326. package/dist/types/integration/interfaces/integration-options.interface.d.ts.map +0 -1
  327. package/dist/types/integration/interfaces/integration-state.interface.d.ts.map +0 -1
  328. package/dist/types/integration/interfaces/nestjs-config-compatibility.interface.d.ts.map +0 -1
  329. package/dist/types/integration/interfaces/nestjs-config-integration.interface.d.ts.map +0 -1
  330. package/dist/types/integration/interfaces/typed-configuration.interface.d.ts.map +0 -1
  331. package/dist/types/integration/interfaces/utility-types.interface.d.ts.map +0 -1
  332. package/dist/types/integration/nestjs-config-integration.module.d.ts.map +0 -1
  333. package/dist/types/integration/providers/aws-configuration-loader.service.d.ts.map +0 -1
  334. package/dist/types/integration/providers/configuration-factory.provider.d.ts.map +0 -1
  335. package/dist/types/integration/providers/index.d.ts.map +0 -1
  336. package/dist/types/integration/services/async-config-helper.service.d.ts.map +0 -1
  337. package/dist/types/integration/services/error-handler.service.d.ts.map +0 -1
  338. package/dist/types/integration/services/factory-registration.service.d.ts.map +0 -1
  339. package/dist/types/integration/services/index.d.ts.map +0 -1
  340. package/dist/types/integration/services/integration-state.service.d.ts.map +0 -1
  341. package/dist/types/integration/services/namespace-handler.service.d.ts.map +0 -1
  342. package/dist/types/integration/services/nestjs-config-integration.service.d.ts.map +0 -1
  343. package/dist/types/integration/services/precedence-handler.service.d.ts.map +0 -1
  344. package/dist/types/integration/services/validation-integration.service.d.ts.map +0 -1
  345. package/dist/types/integration/utils/config-integration.util.d.ts.map +0 -1
  346. package/dist/types/integration/utils/index.d.ts.map +0 -1
  347. package/dist/types/interfaces/config-loader.interface.d.ts +0 -22
  348. package/dist/types/interfaces/config-loader.interface.d.ts.map +0 -1
  349. package/dist/types/interfaces/config-service.interface.d.ts.map +0 -1
  350. package/dist/types/interfaces/default-schema.interface.d.ts.map +0 -1
  351. package/dist/types/interfaces/errors.interface.d.ts +0 -38
  352. package/dist/types/interfaces/errors.interface.d.ts.map +0 -1
  353. package/dist/types/interfaces/index.d.ts +0 -6
  354. package/dist/types/interfaces/index.d.ts.map +0 -1
  355. package/dist/types/interfaces/module-options.interface.d.ts.map +0 -1
  356. package/dist/types/loaders/environment.loader.d.ts +0 -26
  357. package/dist/types/loaders/environment.loader.d.ts.map +0 -1
  358. package/dist/types/loaders/secrets-manager.loader.d.ts +0 -52
  359. package/dist/types/loaders/secrets-manager.loader.d.ts.map +0 -1
  360. package/dist/types/loaders/ssm-parameter-store.loader.d.ts +0 -68
  361. package/dist/types/loaders/ssm-parameter-store.loader.d.ts.map +0 -1
  362. package/dist/types/services/config.service.d.ts +0 -94
  363. package/dist/types/services/config.service.d.ts.map +0 -1
  364. package/dist/types/utils/validation.util.d.ts.map +0 -1
  365. /package/dist/types/{integration → nestjs-config-aws/src/integration}/index.d.ts +0 -0
  366. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/configuration-factory.interface.d.ts +0 -0
  367. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/configuration-source.interface.d.ts +0 -0
  368. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/index.d.ts +0 -0
  369. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/integration-options.interface.d.ts +0 -0
  370. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/integration-state.interface.d.ts +0 -0
  371. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/nestjs-config-compatibility.interface.d.ts +0 -0
  372. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/nestjs-config-integration.interface.d.ts +0 -0
  373. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/typed-configuration.interface.d.ts +0 -0
  374. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/utility-types.interface.d.ts +0 -0
  375. /package/dist/types/{integration → nestjs-config-aws/src/integration}/nestjs-config-integration.module.d.ts +0 -0
  376. /package/dist/types/{integration → nestjs-config-aws/src/integration}/providers/aws-configuration-loader.service.d.ts +0 -0
  377. /package/dist/types/{integration → nestjs-config-aws/src/integration}/providers/configuration-factory.provider.d.ts +0 -0
  378. /package/dist/types/{integration → nestjs-config-aws/src/integration}/providers/index.d.ts +0 -0
  379. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/async-config-helper.service.d.ts +0 -0
  380. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/error-handler.service.d.ts +0 -0
  381. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/factory-registration.service.d.ts +0 -0
  382. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/index.d.ts +0 -0
  383. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/integration-state.service.d.ts +0 -0
  384. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/namespace-handler.service.d.ts +0 -0
  385. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/nestjs-config-integration.service.d.ts +0 -0
  386. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/precedence-handler.service.d.ts +0 -0
  387. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/validation-integration.service.d.ts +0 -0
  388. /package/dist/types/{integration → nestjs-config-aws/src/integration}/utils/config-integration.util.d.ts +0 -0
  389. /package/dist/types/{integration → nestjs-config-aws/src/integration}/utils/index.d.ts +0 -0
  390. /package/dist/types/{interfaces → nestjs-config-aws/src/interfaces}/config-service.interface.d.ts +0 -0
  391. /package/dist/types/{interfaces → nestjs-config-aws/src/interfaces}/module-options.interface.d.ts +0 -0
@@ -0,0 +1,592 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var ValidationIntegrationService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.ValidationIntegrationService = exports.CustomValidationProvider = exports.ClassValidatorProvider = exports.JoiValidationProvider = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ /**
16
+ * Joi validation schema provider.
17
+ */
18
+ class JoiValidationProvider {
19
+ name = 'joi';
20
+ joi;
21
+ constructor() {
22
+ try {
23
+ // Try to import Joi dynamically
24
+ this.joi = require('joi');
25
+ }
26
+ catch (error) {
27
+ // Joi is not available
28
+ this.joi = null;
29
+ }
30
+ }
31
+ isAvailable() {
32
+ return this.joi !== null;
33
+ }
34
+ validate(config, schema) {
35
+ if (!this.joi) {
36
+ return { isValid: false, errors: ['Joi is not available'] };
37
+ }
38
+ try {
39
+ const { error } = this.joi.attempt ?
40
+ { error: null } :
41
+ schema.validate(config);
42
+ if (error) {
43
+ const errors = error.details?.map((detail) => detail.message) || [error.message];
44
+ return { isValid: false, errors };
45
+ }
46
+ return { isValid: true, errors: [] };
47
+ }
48
+ catch (error) {
49
+ const validationError = error instanceof Error ? error : new Error(String(error));
50
+ return { isValid: false, errors: [validationError.message] };
51
+ }
52
+ }
53
+ }
54
+ exports.JoiValidationProvider = JoiValidationProvider;
55
+ /**
56
+ * Class-validator validation schema provider.
57
+ */
58
+ class ClassValidatorProvider {
59
+ name = 'class-validator';
60
+ classValidator;
61
+ classTransformer;
62
+ constructor() {
63
+ try {
64
+ // Try to import class-validator and class-transformer dynamically
65
+ this.classValidator = require('class-validator');
66
+ this.classTransformer = require('class-transformer');
67
+ }
68
+ catch (error) {
69
+ // class-validator is not available
70
+ this.classValidator = null;
71
+ this.classTransformer = null;
72
+ }
73
+ }
74
+ isAvailable() {
75
+ return this.classValidator !== null && this.classTransformer !== null;
76
+ }
77
+ validate(config, schemaClass) {
78
+ if (!this.classValidator || !this.classTransformer) {
79
+ return { isValid: false, errors: ['class-validator or class-transformer is not available'] };
80
+ }
81
+ try {
82
+ // Transform plain object to class instance
83
+ const instance = this.classTransformer.plainToClass(schemaClass, config);
84
+ // Validate the instance
85
+ const errors = this.classValidator.validateSync(instance);
86
+ if (errors && errors.length > 0) {
87
+ const errorMessages = errors.map((error) => {
88
+ const constraints = error.constraints || {};
89
+ return Object.values(constraints).join(', ');
90
+ }).filter((msg) => msg.length > 0);
91
+ return { isValid: false, errors: errorMessages };
92
+ }
93
+ return { isValid: true, errors: [] };
94
+ }
95
+ catch (error) {
96
+ const validationError = error instanceof Error ? error : new Error(String(error));
97
+ return { isValid: false, errors: [validationError.message] };
98
+ }
99
+ }
100
+ }
101
+ exports.ClassValidatorProvider = ClassValidatorProvider;
102
+ /**
103
+ * Custom validation function provider.
104
+ */
105
+ class CustomValidationProvider {
106
+ name = 'custom';
107
+ isAvailable() {
108
+ return true;
109
+ }
110
+ validate(config, validationFn) {
111
+ try {
112
+ const result = validationFn(config);
113
+ if (Array.isArray(result) && result.length > 0) {
114
+ return { isValid: false, errors: result };
115
+ }
116
+ return { isValid: true, errors: [] };
117
+ }
118
+ catch (error) {
119
+ const validationError = error instanceof Error ? error : new Error(String(error));
120
+ return { isValid: false, errors: [validationError.message] };
121
+ }
122
+ }
123
+ }
124
+ exports.CustomValidationProvider = CustomValidationProvider;
125
+ /**
126
+ * Service for integrating AWS-sourced configuration with @nestjs/config validation.
127
+ * Supports Joi, class-validator, and custom validation functions.
128
+ */
129
+ let ValidationIntegrationService = ValidationIntegrationService_1 = class ValidationIntegrationService {
130
+ logger = new common_1.Logger(ValidationIntegrationService_1.name);
131
+ validationProviders = new Map();
132
+ constructor() {
133
+ // Register available validation providers
134
+ this.registerValidationProviders();
135
+ }
136
+ /**
137
+ * Create a validated configuration factory.
138
+ * This factory will validate AWS-sourced configuration before returning it.
139
+ *
140
+ * @param namespace - Optional namespace for the configuration
141
+ * @param config - Configuration data to validate
142
+ * @param validationSchema - Validation schema (Joi schema, class-validator class, or custom function)
143
+ * @param validationType - Type of validation ('joi', 'class-validator', or 'custom')
144
+ * @param sources - Configuration sources metadata
145
+ * @returns Validated configuration factory
146
+ */
147
+ createValidatedFactory(namespace, config, validationSchema, validationType, sources) {
148
+ this.logger.debug(`Creating validated factory for namespace: ${namespace || 'default'} with ${validationType} validation`);
149
+ const factory = () => {
150
+ this.logger.debug(`Validated factory called for namespace: ${namespace || 'default'}`);
151
+ // Validate configuration
152
+ const validationResult = this.validateConfiguration(config, validationSchema, validationType, sources);
153
+ if (!validationResult.isValid) {
154
+ const errorMessage = `Configuration validation failed for ${namespace || 'default'}: ${validationResult.errors.join(', ')}`;
155
+ this.logger.error(errorMessage);
156
+ // Create detailed error with source information
157
+ const detailedError = this.createValidationError(namespace || 'default', validationResult.errors, sources);
158
+ throw detailedError;
159
+ }
160
+ this.logger.debug(`Configuration validation passed for namespace: ${namespace || 'default'}`);
161
+ return config;
162
+ };
163
+ // Add validation metadata
164
+ factory.__isValidatedFactory = true;
165
+ factory.__validationType = validationType;
166
+ factory.__namespace = namespace;
167
+ factory.__sources = sources?.map(s => s.name) || [];
168
+ return factory;
169
+ }
170
+ /**
171
+ * Validate configuration using the specified validation type and schema.
172
+ *
173
+ * @param config - Configuration to validate
174
+ * @param schema - Validation schema
175
+ * @param validationType - Type of validation
176
+ * @param sources - Configuration sources for error reporting
177
+ * @returns Validation result
178
+ */
179
+ validateConfiguration(config, schema, validationType, sources) {
180
+ const provider = this.validationProviders.get(validationType);
181
+ if (!provider) {
182
+ return {
183
+ isValid: false,
184
+ errors: [`Validation provider '${validationType}' is not available`],
185
+ warnings: []
186
+ };
187
+ }
188
+ if (!provider.isAvailable()) {
189
+ return {
190
+ isValid: false,
191
+ errors: [`Validation provider '${validationType}' is not properly configured`],
192
+ warnings: []
193
+ };
194
+ }
195
+ try {
196
+ const result = provider.validate(config, schema);
197
+ // Add source information to errors
198
+ const enhancedErrors = result.errors.map(error => this.enhanceErrorWithSourceInfo(error, sources));
199
+ return {
200
+ isValid: result.isValid,
201
+ errors: enhancedErrors,
202
+ warnings: []
203
+ };
204
+ }
205
+ catch (error) {
206
+ const validationError = error instanceof Error ? error : new Error(String(error));
207
+ return {
208
+ isValid: false,
209
+ errors: [validationError.message],
210
+ warnings: []
211
+ };
212
+ }
213
+ }
214
+ /**
215
+ * Create a factory that validates configuration and provides fallback values.
216
+ *
217
+ * @param namespace - Optional namespace
218
+ * @param config - Configuration data
219
+ * @param validationSchema - Validation schema
220
+ * @param validationType - Type of validation
221
+ * @param fallbackConfig - Fallback configuration to use if validation fails
222
+ * @param sources - Configuration sources
223
+ * @returns Factory with validation and fallback
224
+ */
225
+ createValidatedFactoryWithFallback(namespace, config, validationSchema, validationType, fallbackConfig, sources) {
226
+ this.logger.debug(`Creating validated factory with fallback for namespace: ${namespace || 'default'}`);
227
+ const factory = () => {
228
+ this.logger.debug(`Validated factory with fallback called for namespace: ${namespace || 'default'}`);
229
+ // Validate configuration
230
+ const validationResult = this.validateConfiguration(config, validationSchema, validationType, sources);
231
+ if (!validationResult.isValid) {
232
+ this.logger.warn(`Configuration validation failed for ${namespace || 'default'}, using fallback: ${validationResult.errors.join(', ')}`);
233
+ // Validate fallback configuration
234
+ const fallbackValidation = this.validateConfiguration(fallbackConfig, validationSchema, validationType);
235
+ if (fallbackValidation.isValid) {
236
+ return fallbackConfig;
237
+ }
238
+ else {
239
+ // Both primary and fallback failed
240
+ const errorMessage = `Both primary and fallback configuration validation failed for ${namespace || 'default'}`;
241
+ this.logger.error(errorMessage);
242
+ const detailedError = this.createValidationError(namespace || 'default', [...validationResult.errors, ...fallbackValidation.errors], sources);
243
+ throw detailedError;
244
+ }
245
+ }
246
+ this.logger.debug(`Configuration validation passed for namespace: ${namespace || 'default'}`);
247
+ return config;
248
+ };
249
+ // Add metadata
250
+ factory.__isValidatedFactory = true;
251
+ factory.__hasFallback = true;
252
+ factory.__validationType = validationType;
253
+ factory.__namespace = namespace;
254
+ factory.__sources = sources?.map(s => s.name) || [];
255
+ return factory;
256
+ }
257
+ /**
258
+ * Validate multiple namespace configurations.
259
+ *
260
+ * @param namespacedConfig - Configuration organized by namespace
261
+ * @param validationSchemas - Validation schemas for each namespace
262
+ * @param validationType - Type of validation
263
+ * @param sources - Configuration sources
264
+ * @returns Validation results for each namespace
265
+ */
266
+ validateNamespacedConfiguration(namespacedConfig, validationSchemas, validationType, sources) {
267
+ const results = {};
268
+ for (const [namespace, config] of Object.entries(namespacedConfig)) {
269
+ const schema = validationSchemas[namespace];
270
+ if (schema) {
271
+ results[namespace] = this.validateConfiguration(config, schema, validationType, sources);
272
+ }
273
+ else {
274
+ results[namespace] = {
275
+ isValid: true,
276
+ errors: [],
277
+ warnings: [`No validation schema provided for namespace: ${namespace}`]
278
+ };
279
+ }
280
+ }
281
+ return results;
282
+ }
283
+ /**
284
+ * Check which validation providers are available.
285
+ *
286
+ * @returns Object indicating availability of each provider
287
+ */
288
+ getAvailableValidationProviders() {
289
+ const availability = {};
290
+ for (const [name, provider] of this.validationProviders) {
291
+ availability[name] = provider.isAvailable();
292
+ }
293
+ return availability;
294
+ }
295
+ /**
296
+ * Get validation recommendations based on configuration structure.
297
+ *
298
+ * @param config - Configuration to analyze
299
+ * @returns Validation recommendations
300
+ */
301
+ getValidationRecommendations(config) {
302
+ const analysis = this.analyzeConfigurationStructure(config);
303
+ let recommendedProvider = 'custom';
304
+ const reasons = [];
305
+ const examples = {};
306
+ // Determine best validation approach
307
+ if (analysis.hasComplexNesting || analysis.hasArrays) {
308
+ if (this.validationProviders.get('joi')?.isAvailable()) {
309
+ recommendedProvider = 'joi';
310
+ reasons.push('Complex nested structure detected - Joi provides excellent nested validation');
311
+ examples['joi'] = this.generateJoiExample(config);
312
+ }
313
+ }
314
+ if (analysis.hasTypedValues && this.validationProviders.get('class-validator')?.isAvailable()) {
315
+ recommendedProvider = 'class-validator';
316
+ reasons.push('Typed values detected - class-validator provides strong type safety');
317
+ examples['class-validator'] = this.generateClassValidatorExample(config);
318
+ }
319
+ // Always provide custom example
320
+ examples['custom'] = this.generateCustomValidationExample(config);
321
+ return {
322
+ recommendedProvider,
323
+ reasons,
324
+ examples
325
+ };
326
+ }
327
+ /**
328
+ * Register validation providers.
329
+ */
330
+ registerValidationProviders() {
331
+ this.validationProviders.set('joi', new JoiValidationProvider());
332
+ this.validationProviders.set('class-validator', new ClassValidatorProvider());
333
+ this.validationProviders.set('custom', new CustomValidationProvider());
334
+ // Log available providers
335
+ const available = Array.from(this.validationProviders.entries())
336
+ .filter(([_, provider]) => provider.isAvailable())
337
+ .map(([name]) => name);
338
+ this.logger.debug(`Available validation providers: ${available.join(', ')}`);
339
+ }
340
+ /**
341
+ * Create a detailed validation error with source information.
342
+ *
343
+ * @param namespace - Namespace that failed validation
344
+ * @param errors - Validation errors
345
+ * @param sources - Configuration sources
346
+ * @returns Detailed error
347
+ */
348
+ createValidationError(namespace, errors, sources) {
349
+ let message = `Configuration validation failed for namespace '${namespace}':\n`;
350
+ message += errors.map(error => ` - ${error}`).join('\n');
351
+ if (sources && sources.length > 0) {
352
+ message += '\n\nConfiguration sources:\n';
353
+ message += sources.map(source => ` - ${source.name} (${source.type}): ${Object.keys(source.data).length} keys`).join('\n');
354
+ }
355
+ const error = new Error(message);
356
+ error.name = 'ConfigurationValidationError';
357
+ error.namespace = namespace;
358
+ error.validationErrors = errors;
359
+ error.sources = sources;
360
+ return error;
361
+ }
362
+ /**
363
+ * Enhance error message with source information.
364
+ *
365
+ * @param error - Original error message
366
+ * @param sources - Configuration sources
367
+ * @returns Enhanced error message
368
+ */
369
+ enhanceErrorWithSourceInfo(error, sources) {
370
+ if (!sources || sources.length === 0) {
371
+ return error;
372
+ }
373
+ const sourceNames = sources.map(s => s.name).join(', ');
374
+ return `${error} (from sources: ${sourceNames})`;
375
+ }
376
+ /**
377
+ * Analyze configuration structure for validation recommendations.
378
+ *
379
+ * @param config - Configuration to analyze
380
+ * @returns Structure analysis
381
+ */
382
+ analyzeConfigurationStructure(config) {
383
+ let hasComplexNesting = false;
384
+ let hasArrays = false;
385
+ let hasTypedValues = false;
386
+ let maxDepth = 0;
387
+ const analyze = (obj, depth = 0) => {
388
+ maxDepth = Math.max(maxDepth, depth);
389
+ if (depth > 2) {
390
+ hasComplexNesting = true;
391
+ }
392
+ for (const value of Object.values(obj)) {
393
+ if (Array.isArray(value)) {
394
+ hasArrays = true;
395
+ }
396
+ else if (typeof value === 'object' && value !== null) {
397
+ analyze(value, depth + 1);
398
+ }
399
+ else if (typeof value === 'number' || typeof value === 'boolean') {
400
+ hasTypedValues = true;
401
+ }
402
+ }
403
+ };
404
+ analyze(config);
405
+ return {
406
+ hasComplexNesting,
407
+ hasArrays,
408
+ hasTypedValues,
409
+ depth: maxDepth
410
+ };
411
+ }
412
+ /**
413
+ * Generate Joi validation example.
414
+ *
415
+ * @param config - Configuration to generate example for
416
+ * @returns Joi validation example
417
+ */
418
+ generateJoiExample(config) {
419
+ const schema = this.generateJoiSchemaFromConfig(config);
420
+ return `const Joi = require('joi');
421
+
422
+ const schema = ${schema};
423
+
424
+ // Usage in factory
425
+ const factory = () => {
426
+ const config = loadAwsConfig();
427
+ const { error, value } = schema.validate(config);
428
+ if (error) throw error;
429
+ return value;
430
+ };`;
431
+ }
432
+ /**
433
+ * Generate class-validator example.
434
+ *
435
+ * @param config - Configuration to generate example for
436
+ * @returns class-validator example
437
+ */
438
+ generateClassValidatorExample(config) {
439
+ const classDefinition = this.generateClassFromConfig(config);
440
+ return `import { IsString, IsNumber, IsOptional, validateSync } from 'class-validator';
441
+ import { plainToClass } from 'class-transformer';
442
+
443
+ ${classDefinition}
444
+
445
+ // Usage in factory
446
+ const factory = () => {
447
+ const config = loadAwsConfig();
448
+ const instance = plainToClass(ConfigClass, config);
449
+ const errors = validateSync(instance);
450
+ if (errors.length > 0) throw new Error('Validation failed');
451
+ return config;
452
+ };`;
453
+ }
454
+ /**
455
+ * Generate custom validation example.
456
+ *
457
+ * @param config - Configuration to generate example for
458
+ * @returns Custom validation example
459
+ */
460
+ generateCustomValidationExample(config) {
461
+ const validationChecks = this.generateValidationChecks(config);
462
+ return `const validateConfig = (config) => {
463
+ const errors = [];
464
+
465
+ ${validationChecks}
466
+
467
+ return errors;
468
+ };
469
+
470
+ // Usage in factory
471
+ const factory = () => {
472
+ const config = loadAwsConfig();
473
+ const errors = validateConfig(config);
474
+ if (errors.length > 0) throw new Error(\`Validation failed: \${errors.join(', ')}\`);
475
+ return config;
476
+ };`;
477
+ }
478
+ /**
479
+ * Generate Joi schema from configuration structure.
480
+ *
481
+ * @param config - Configuration object
482
+ * @returns Joi schema string
483
+ */
484
+ generateJoiSchemaFromConfig(config) {
485
+ const generateSchema = (obj) => {
486
+ if (typeof obj === 'string')
487
+ return 'Joi.string()';
488
+ if (typeof obj === 'number')
489
+ return 'Joi.number()';
490
+ if (typeof obj === 'boolean')
491
+ return 'Joi.boolean()';
492
+ if (Array.isArray(obj))
493
+ return 'Joi.array()';
494
+ if (typeof obj === 'object' && obj !== null) {
495
+ const properties = Object.entries(obj)
496
+ .map(([key, value]) => ` ${key}: ${generateSchema(value)}`)
497
+ .join(',\n');
498
+ return `Joi.object({\n${properties}\n})`;
499
+ }
500
+ return 'Joi.any()';
501
+ };
502
+ return generateSchema(config);
503
+ }
504
+ /**
505
+ * Generate class definition from configuration structure.
506
+ *
507
+ * @param config - Configuration object
508
+ * @returns Class definition string
509
+ */
510
+ generateClassFromConfig(config) {
511
+ const properties = Object.entries(config)
512
+ .map(([key, value]) => {
513
+ const decorator = this.getClassValidatorDecorator(value);
514
+ return ` ${decorator}\n ${key}: ${this.getTypeScriptType(value)};`;
515
+ })
516
+ .join('\n\n');
517
+ return `class ConfigClass {\n${properties}\n}`;
518
+ }
519
+ /**
520
+ * Generate validation checks for custom validation.
521
+ *
522
+ * @param config - Configuration object
523
+ * @returns Validation checks string
524
+ */
525
+ generateValidationChecks(config) {
526
+ return Object.entries(config)
527
+ .map(([key, value]) => {
528
+ const check = this.getValidationCheck(key, value);
529
+ return ` ${check}`;
530
+ })
531
+ .join('\n');
532
+ }
533
+ /**
534
+ * Get class-validator decorator for a value.
535
+ *
536
+ * @param value - Value to get decorator for
537
+ * @returns Decorator string
538
+ */
539
+ getClassValidatorDecorator(value) {
540
+ if (typeof value === 'string')
541
+ return '@IsString()';
542
+ if (typeof value === 'number')
543
+ return '@IsNumber()';
544
+ if (typeof value === 'boolean')
545
+ return '@IsBoolean()';
546
+ return '@IsOptional()';
547
+ }
548
+ /**
549
+ * Get TypeScript type for a value.
550
+ *
551
+ * @param value - Value to get type for
552
+ * @returns TypeScript type string
553
+ */
554
+ getTypeScriptType(value) {
555
+ if (typeof value === 'string')
556
+ return 'string';
557
+ if (typeof value === 'number')
558
+ return 'number';
559
+ if (typeof value === 'boolean')
560
+ return 'boolean';
561
+ if (Array.isArray(value))
562
+ return 'any[]';
563
+ if (typeof value === 'object')
564
+ return 'object';
565
+ return 'any';
566
+ }
567
+ /**
568
+ * Get validation check for custom validation.
569
+ *
570
+ * @param key - Configuration key
571
+ * @param value - Configuration value
572
+ * @returns Validation check string
573
+ */
574
+ getValidationCheck(key, value) {
575
+ if (typeof value === 'string') {
576
+ return `if (!config.${key} || typeof config.${key} !== 'string') errors.push('${key} must be a string');`;
577
+ }
578
+ if (typeof value === 'number') {
579
+ return `if (config.${key} === undefined || typeof config.${key} !== 'number') errors.push('${key} must be a number');`;
580
+ }
581
+ if (typeof value === 'boolean') {
582
+ return `if (config.${key} === undefined || typeof config.${key} !== 'boolean') errors.push('${key} must be a boolean');`;
583
+ }
584
+ return `if (config.${key} === undefined) errors.push('${key} is required');`;
585
+ }
586
+ };
587
+ exports.ValidationIntegrationService = ValidationIntegrationService;
588
+ exports.ValidationIntegrationService = ValidationIntegrationService = ValidationIntegrationService_1 = __decorate([
589
+ (0, common_1.Injectable)(),
590
+ __metadata("design:paramtypes", [])
591
+ ], ValidationIntegrationService);
592
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1pbnRlZ3JhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2ludGVncmF0aW9uL3NlcnZpY2VzL3ZhbGlkYXRpb24taW50ZWdyYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQW9EO0FBYXBEOztHQUVHO0FBQ0gsTUFBYSxxQkFBcUI7SUFDaEMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNMLEdBQUcsQ0FBTTtJQUVqQjtRQUNFLElBQUksQ0FBQztZQUNILGdDQUFnQztZQUNoQyxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLHVCQUF1QjtZQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRLENBQUMsTUFBVyxFQUFFLE1BQVc7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNkLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztRQUM5RCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2xDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFMUIsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixNQUFNLE1BQU0sR0FBRyxLQUFL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RixDQUFBO0FBNWlCWSxvRUFBNEI7dUNBQTVCLDRCQUE0QjtJQUR4QyxJQUFBLG1CQUFVLEdBQUU7O0dBQ0EsNEJBQTRCLENBNGlCeEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBMb2dnZXIgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbmZpZ0ZhY3RvcnkgfSBmcm9tICdAbmVzdGpzL2NvbmZpZyc7XHJcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25Tb3VyY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZ3VyYXRpb24tc291cmNlLmludGVyZmFjZSc7XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciB2YWxpZGF0aW9uIHNjaGVtYSBwcm92aWRlcnMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25TY2hlbWFQcm92aWRlciB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHZhbGlkYXRlKGNvbmZpZzogYW55LCBzY2hlbWE6IGFueSk6IHsgaXNWYWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXSB9O1xyXG4gIGlzQXZhaWxhYmxlKCk6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBKb2kgdmFsaWRhdGlvbiBzY2hlbWEgcHJvdmlkZXIuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSm9pVmFsaWRhdGlvblByb3ZpZGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblNjaGVtYVByb3ZpZGVyIHtcclxuICBuYW1lID0gJ2pvaSc7XHJcbiAgcHJpdmF0ZSBqb2k6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBUcnkgdG8gaW1wb3J0IEpvaSBkeW5hbWljYWxseVxyXG4gICAgICB0aGlzLmpvaSA9IHJlcXVpcmUoJ2pvaScpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gSm9pIGlzIG5vdCBhdmFpbGFibGVcclxuICAgICAgdGhpcy5qb2kgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNBdmFpbGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5qb2kgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZShjb25maWc6IGFueSwgc2NoZW1hOiBhbnkpOiB7IGlzVmFsaWQ6IGJvb2xlYW47IGVycm9yczogc3RyaW5nW10gfSB7XHJcbiAgICBpZiAoIXRoaXMuam9pKSB7XHJcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnM6IFsnSm9pIGlzIG5vdCBhdmFpbGFibGUnXSB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IHRoaXMuam9pLmF0dGVtcHQgPyBcclxuICAgICAgICB7IGVycm9yOiBudWxsIH0gOlxyXG4gICAgICAgIHNjaGVtYS52YWxpZGF0ZShjb25maWcpO1xyXG5cclxuICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3JzID0gZXJyb3IuZGV0YWlscz8ubWFwKChkZXRhaWw6IGFueSkgPT4gZGV0YWlsLm1lc3NhZ2UpIHx8IFtlcnJvci5tZXNzYWdlXTtcclxuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUsIGVycm9yczogW10gfTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9yczogW3ZhbGlkYXRpb25FcnJvci5tZXNzYWdlXSB9O1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENsYXNzLXZhbGlkYXRvciB2YWxpZGF0aW9uIHNjaGVtYSBwcm92aWRlci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBDbGFzc1ZhbGlkYXRvclByb3ZpZGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblNjaGVtYVByb3ZpZGVyIHtcclxuICBuYW1lID0gJ2NsYXNzLXZhbGlkYXRvcic7XHJcbiAgcHJpdmF0ZSBjbGFzc1ZhbGlkYXRvcjogYW55O1xyXG4gIHByaXZhdGUgY2xhc3NUcmFuc2Zvcm1lcjogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIFRyeSB0byBpbXBvcnQgY2xhc3MtdmFsaWRhdG9yIGFuZCBjbGFzcy10cmFuc2Zvcm1lciBkeW5hbWljYWxseVxyXG4gICAgICB0aGlzLmNsYXNzVmFsaWRhdG9yID0gcmVxdWlyZSgnY2xhc3MtdmFsaWRhdG9yJyk7XHJcbiAgICAgIHRoaXMuY2xhc3NUcmFuc2Zvcm1lciA9IHJlcXVpcmUoJ2NsYXNzLXRyYW5zZm9ybWVyJyk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyBjbGFzcy12YWxpZGF0b3IgaXMgbm90IGF2YWlsYWJsZVxyXG4gICAgICB0aGlzLmNsYXNzVmFsaWRhdG9yID0gbnVsbDtcclxuICAgICAgdGhpcy5jbGFzc1RyYW5zZm9ybWVyID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2xhc3NWYWxpZGF0b3IgIT09IG51bGwgJiYgdGhpcy5jbGFzc1RyYW5zZm9ybWVyICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGUoY29uZmlnOiBhbnksIHNjaGVtYUNsYXNzOiBhbnkpOiB7IGlzVmFsaWQ6IGJvb2xlYW47IGVycm9yczogc3RyaW5nW10gfSB7XHJcbiAgICBpZiAoIXRoaXMuY2xhc3NWYWxpZGF0b3IgfHwgIXRoaXMuY2xhc3NUcmFuc2Zvcm1lcikge1xyXG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzOiBbJ2NsYXNzLXZhbGlkYXRvciBvciBjbGFzcy10cmFuc2Zvcm1lciBpcyBub3QgYXZhaWxhYmxlJ10gfTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBUcmFuc2Zvcm0gcGxhaW4gb2JqZWN0IHRvIGNsYXNzIGluc3RhbmNlXHJcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5jbGFzc1RyYW5zZm9ybWVyLnBsYWluVG9DbGFzcyhzY2hlbWFDbGFzcywgY29uZmlnKTtcclxuICAgICAgXHJcbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBpbnN0YW5jZVxyXG4gICAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmNsYXNzVmFsaWRhdG9yLnZhbGlkYXRlU3luYyhpbnN0YW5jZSk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IGVycm9ycy5tYXAoKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gZXJyb3IuY29uc3RyYWludHMgfHwge307XHJcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb25zdHJhaW50cykuam9pbignLCAnKTtcclxuICAgICAgICB9KS5maWx0ZXIoKG1zZzogc3RyaW5nKSA9PiBtc2cubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnM6IGVycm9yTWVzc2FnZXMgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSB9O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzOiBbdmFsaWRhdGlvbkVycm9yLm1lc3NhZ2VdIH07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb24gcHJvdmlkZXIuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ3VzdG9tVmFsaWRhdGlvblByb3ZpZGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblNjaGVtYVByb3ZpZGVyIHtcclxuICBuYW1lID0gJ2N1c3RvbSc7XHJcblxyXG4gIGlzQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZShjb25maWc6IGFueSwgdmFsaWRhdGlvbkZuOiAoY29uZmlnOiBhbnkpID0+IHN0cmluZ1tdIHwgdm9pZCk6IHsgaXNWYWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXSB9IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRpb25Gbihjb25maWcpO1xyXG4gICAgICBcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnM6IHJlc3VsdCB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdIH07XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnM6IFt2YWxpZGF0aW9uRXJyb3IubWVzc2FnZV0gfTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTZXJ2aWNlIGZvciBpbnRlZ3JhdGluZyBBV1Mtc291cmNlZCBjb25maWd1cmF0aW9uIHdpdGggQG5lc3Rqcy9jb25maWcgdmFsaWRhdGlvbi5cclxuICogU3VwcG9ydHMgSm9pLCBjbGFzcy12YWxpZGF0b3IsIGFuZCBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uSW50ZWdyYXRpb25TZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoVmFsaWRhdGlvbkludGVncmF0aW9uU2VydmljZS5uYW1lKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRpb25Qcm92aWRlcnM6IE1hcDxzdHJpbmcsIFZhbGlkYXRpb25TY2hlbWFQcm92aWRlcj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgLy8gUmVnaXN0ZXIgYXZhaWxhYmxlIHZhbGlkYXRpb24gcHJvdmlkZXJzXHJcbiAgICB0aGlzLnJlZ2lzdGVyVmFsaWRhdGlvblByb3ZpZGVycygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgdmFsaWRhdGVkIGNvbmZpZ3VyYXRpb24gZmFjdG9yeS5cclxuICAgKiBUaGlzIGZhY3Rvcnkgd2lsbCB2YWxpZGF0ZSBBV1Mtc291cmNlZCBjb25maWd1cmF0aW9uIGJlZm9yZSByZXR1cm5pbmcgaXQuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIG5hbWVzcGFjZSAtIE9wdGlvbmFsIG5hbWVzcGFjZSBmb3IgdGhlIGNvbmZpZ3VyYXRpb25cclxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBkYXRhIHRvIHZhbGlkYXRlXHJcbiAgICogQHBhcmFtIHZhbGlkYXRpb25TY2hlbWEgLSBWYWxpZGF0aW9uIHNjaGVtYSAoSm9pIHNjaGVtYSwgY2xhc3MtdmFsaWRhdG9yIGNsYXNzLCBvciBjdXN0b20gZnVuY3Rpb24pXHJcbiAgICogQHBhcmFtIHZhbGlkYXRpb25UeXBlIC0gVHlwZSBvZiB2YWxpZGF0aW9uICgnam9pJywgJ2NsYXNzLXZhbGlkYXRvcicsIG9yICdjdXN0b20nKVxyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQ29uZmlndXJhdGlvbiBzb3VyY2VzIG1ldGFkYXRhXHJcbiAgICogQHJldHVybnMgVmFsaWRhdGVkIGNvbmZpZ3VyYXRpb24gZmFjdG9yeVxyXG4gICAqL1xyXG4gIGNyZWF0ZVZhbGlkYXRlZEZhY3RvcnkoXHJcbiAgICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcclxuICAgIHZhbGlkYXRpb25TY2hlbWE6IGFueSxcclxuICAgIHZhbGlkYXRpb25UeXBlOiAnam9pJyB8ICdjbGFzcy12YWxpZGF0b3InIHwgJ2N1c3RvbScsXHJcbiAgICBzb3VyY2VzPzogQ29uZmlndXJhdGlvblNvdXJjZVtdXHJcbiAgKTogQ29uZmlnRmFjdG9yeSB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgdmFsaWRhdGVkIGZhY3RvcnkgZm9yIG5hbWVzcGFjZTogJHtuYW1lc3BhY2UgfHwgJ2RlZmF1bHQnfSB3aXRoICR7dmFsaWRhdGlvblR5cGV9IHZhbGlkYXRpb25gKTtcclxuXHJcbiAgICBjb25zdCBmYWN0b3J5ID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgVmFsaWRhdGVkIGZhY3RvcnkgY2FsbGVkIGZvciBuYW1lc3BhY2U6ICR7bmFtZXNwYWNlIHx8ICdkZWZhdWx0J31gKTtcclxuXHJcbiAgICAgIC8vIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb25cclxuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGVDb25maWd1cmF0aW9uKGNvbmZpZywgdmFsaWRhdGlvblNjaGVtYSwgdmFsaWRhdGlvblR5cGUsIHNvdXJjZXMpO1xyXG5cclxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcclxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgJHtuYW1lc3BhY2UgfHwgJ2RlZmF1bHQnfTogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWA7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBDcmVhdGUgZGV0YWlsZWQgZXJyb3Igd2l0aCBzb3VyY2UgaW5mb3JtYXRpb25cclxuICAgICAgICBjb25zdCBkZXRhaWxlZEVycm9yID0gdGhpcy5jcmVhdGVWYWxpZGF0aW9uRXJyb3IoXHJcbiAgICAgICAgICBuYW1lc3BhY2UgfHwgJ2RlZmF1bHQnLFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJlc3VsdC5lcnJvcnMsXHJcbiAgICAgICAgICBzb3VyY2VzXHJcbiAgICAgICAgKTtcclxuICAgICAgICBcclxuICAgICAgICB0aHJvdyBkZXRhaWxlZEVycm9yO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHBhc3NlZCBmb3IgbmFtZXNwYWNlOiAke25hbWVzcGFjZSB8fCAnZGVmYXVsdCd9YCk7XHJcbiAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEFkZCB2YWxpZGF0aW9uIG1ldGFkYXRhXHJcbiAgICAoZmFjdG9yeSBhcyBhbnkpLl9faXNWYWxpZGF0ZWRGYWN0b3J5ID0gdHJ1ZTtcclxuICAgIChmYWN0b3J5IGFzIGFueSkuX192YWxpZGF0aW9uVHlwZSA9IHZhbGlkYXRpb25UeXBlO1xyXG4gICAgKGZhY3RvcnkgYXMgYW55KS5fX25hbWVzcGFjZSA9IG5hbWVzcGFjZTtcclxuICAgIChmYWN0b3J5IGFzIGFueSkuX19zb3VyY2VzID0gc291cmNlcz8ubWFwKHMgPT4gcy5uYW1lKSB8fCBbXTtcclxuXHJcbiAgICByZXR1cm4gZmFjdG9yeTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIHNwZWNpZmllZCB2YWxpZGF0aW9uIHR5cGUgYW5kIHNjaGVtYS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiB0byB2YWxpZGF0ZVxyXG4gICAqIEBwYXJhbSBzY2hlbWEgLSBWYWxpZGF0aW9uIHNjaGVtYVxyXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9uVHlwZSAtIFR5cGUgb2YgdmFsaWRhdGlvblxyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQ29uZmlndXJhdGlvbiBzb3VyY2VzIGZvciBlcnJvciByZXBvcnRpbmdcclxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdFxyXG4gICAqL1xyXG4gIHZhbGlkYXRlQ29uZmlndXJhdGlvbihcclxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcclxuICAgIHNjaGVtYTogYW55LFxyXG4gICAgdmFsaWRhdGlvblR5cGU6ICdqb2knIHwgJ2NsYXNzLXZhbGlkYXRvcicgfCAnY3VzdG9tJyxcclxuICAgIHNvdXJjZXM/OiBDb25maWd1cmF0aW9uU291cmNlW11cclxuICApOiB7IGlzVmFsaWQ6IGJvb2xlYW47IGVycm9yczogc3RyaW5nW107IHdhcm5pbmdzOiBzdHJpbmdbXSB9IHtcclxuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy52YWxpZGF0aW9uUHJvdmlkZXJzLmdldCh2YWxpZGF0aW9uVHlwZSk7XHJcbiAgICBcclxuICAgIGlmICghcHJvdmlkZXIpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcclxuICAgICAgICBlcnJvcnM6IFtgVmFsaWRhdGlvbiBwcm92aWRlciAnJHt2YWxpZGF0aW9uVHlwZX0nIGlzIG5vdCBhdmFpbGFibGVgXSxcclxuICAgICAgICB3YXJuaW5nczogW11cclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXByb3ZpZGVyLmlzQXZhaWxhYmxlKCkpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcclxuICAgICAgICBlcnJvcnM6IFtgVmFsaWRhdGlvbiBwcm92aWRlciAnJHt2YWxpZGF0aW9uVHlwZX0nIGlzIG5vdCBwcm9wZXJseSBjb25maWd1cmVkYF0sXHJcbiAgICAgICAgd2FybmluZ3M6IFtdXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gcHJvdmlkZXIudmFsaWRhdGUoY29uZmlnLCBzY2hlbWEpO1xyXG4gICAgICBcclxuICAgICAgLy8gQWRkIHNvdXJjZSBpbmZvcm1hdGlvbiB0byBlcnJvcnNcclxuICAgICAgY29uc3QgZW5oYW5jZWRFcnJvcnMgPSByZXN1bHQuZXJyb3JzLm1hcChlcnJvciA9PiBcclxuICAgICAgICB0aGlzLmVuaGFuY2VFcnJvcldpdGhTb3VyY2VJbmZvKGVycm9yLCBzb3VyY2VzKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpc1ZhbGlkOiByZXN1bHQuaXNWYWxpZCxcclxuICAgICAgICBlcnJvcnM6IGVuaGFuY2VkRXJyb3JzLFxyXG4gICAgICAgIHdhcm5pbmdzOiBbXVxyXG4gICAgICB9O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxyXG4gICAgICAgIGVycm9yczogW3ZhbGlkYXRpb25FcnJvci5tZXNzYWdlXSxcclxuICAgICAgICB3YXJuaW5nczogW11cclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIGZhY3RvcnkgdGhhdCB2YWxpZGF0ZXMgY29uZmlndXJhdGlvbiBhbmQgcHJvdmlkZXMgZmFsbGJhY2sgdmFsdWVzLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBuYW1lc3BhY2UgLSBPcHRpb25hbCBuYW1lc3BhY2VcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBkYXRhXHJcbiAgICogQHBhcmFtIHZhbGlkYXRpb25TY2hlbWEgLSBWYWxpZGF0aW9uIHNjaGVtYVxyXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9uVHlwZSAtIFR5cGUgb2YgdmFsaWRhdGlvblxyXG4gICAqIEBwYXJhbSBmYWxsYmFja0NvbmZpZyAtIEZhbGxiYWNrIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGlmIHZhbGlkYXRpb24gZmFpbHNcclxuICAgKiBAcGFyYW0gc291cmNlcyAtIENvbmZpZ3VyYXRpb24gc291cmNlc1xyXG4gICAqIEByZXR1cm5zIEZhY3Rvcnkgd2l0aCB2YWxpZGF0aW9uIGFuZCBmYWxsYmFja1xyXG4gICAqL1xyXG4gIGNyZWF0ZVZhbGlkYXRlZEZhY3RvcnlXaXRoRmFsbGJhY2soXHJcbiAgICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcclxuICAgIHZhbGlkYXRpb25TY2hlbWE6IGFueSxcclxuICAgIHZhbGlkYXRpb25UeXBlOiAnam9pJyB8ICdjbGFzcy12YWxpZGF0b3InIHwgJ2N1c3RvbScsXHJcbiAgICBmYWxsYmFja0NvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcclxuICAgIHNvdXJjZXM/OiBDb25maWd1cmF0aW9uU291cmNlW11cclxuICApOiBDb25maWdGYWN0b3J5IHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDcmVhdGluZyB2YWxpZGF0ZWQgZmFjdG9yeSB3aXRoIGZhbGxiYWNrIGZvciBuYW1lc3BhY2U6ICR7bmFtZXNwYWNlIHx8ICdkZWZhdWx0J31gKTtcclxuXHJcbiAgICBjb25zdCBmYWN0b3J5ID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgVmFsaWRhdGVkIGZhY3Rvcnkgd2l0aCBmYWxsYmFjayBjYWxsZWQgZm9yIG5hbWVzcGFjZTogJHtuYW1lc3BhY2UgfHwgJ2RlZmF1bHQnfWApO1xyXG5cclxuICAgICAgLy8gVmFsaWRhdGUgY29uZmlndXJhdGlvblxyXG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy52YWxpZGF0ZUNvbmZpZ3VyYXRpb24oY29uZmlnLCB2YWxpZGF0aW9uU2NoZW1hLCB2YWxpZGF0aW9uVHlwZSwgc291cmNlcyk7XHJcblxyXG4gICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBmYWlsZWQgZm9yICR7bmFtZXNwYWNlIHx8ICdkZWZhdWx0J30sIHVzaW5nIGZhbGxiYWNrOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmpvaW4oJywgJyl9YCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVmFsaWRhdGUgZmFsbGJhY2sgY29uZmlndXJhdGlvblxyXG4gICAgICAgIGNvbnN0IGZhbGxiYWNrVmFsaWRhdGlvbiA9IHRoaXMudmFsaWRhdGVDb25maWd1cmF0aW9uKGZhbGxiYWNrQ29uZmlnLCB2YWxpZGF0aW9uU2NoZW1hLCB2YWxpZGF0aW9uVHlwZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGZhbGxiYWNrVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsbGJhY2tDb25maWc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEJvdGggcHJpbWFyeSBhbmQgZmFsbGJhY2sgZmFpbGVkXHJcbiAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgQm90aCBwcmltYXJ5IGFuZCBmYWxsYmFjayBjb25maWd1cmF0aW9uIHZhbGlkYXRpb24gZmFpbGVkIGZvciAke25hbWVzcGFjZSB8fCAnZGVmYXVsdCd9YDtcclxuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGNvbnN0IGRldGFpbGVkRXJyb3IgPSB0aGlzLmNyZWF0ZVZhbGlkYXRpb25FcnJvcihcclxuICAgICAgICAgICAgbmFtZXNwYWNlIHx8ICdkZWZhdWx0JyxcclxuICAgICAgICAgICAgWy4uLnZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLCAuLi5mYWxsYmFja1ZhbGlkYXRpb24uZXJyb3JzXSxcclxuICAgICAgICAgICAgc291cmNlc1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgdGhyb3cgZGV0YWlsZWRFcnJvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gcGFzc2VkIGZvciBuYW1lc3BhY2U6ICR7bmFtZXNwYWNlIHx8ICdkZWZhdWx0J31gKTtcclxuICAgICAgcmV0dXJuIGNvbmZpZztcclxuICAgIH07XHJcblxyXG4gICAgLy8gQWRkIG1ldGFkYXRhXHJcbiAgICAoZmFjdG9yeSBhcyBhbnkpLl9faXNWYWxpZGF0ZWRGYWN0b3J5ID0gdHJ1ZTtcclxuICAgIChmYWN0b3J5IGFzIGFueSkuX19oYXNGYWxsYmFjayA9IHRydWU7XHJcbiAgICAoZmFjdG9yeSBhcyBhbnkpLl9fdmFsaWRhdGlvblR5cGUgPSB2YWxpZGF0aW9uVHlwZTtcclxuICAgIChmYWN0b3J5IGFzIGFueSkuX19uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XHJcbiAgICAoZmFjdG9yeSBhcyBhbnkpLl9fc291cmNlcyA9IHNvdXJjZXM/Lm1hcChzID0+IHMubmFtZSkgfHwgW107XHJcblxyXG4gICAgcmV0dXJuIGZhY3Rvcnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZSBtdWx0aXBsZSBuYW1lc3BhY2UgY29uZmlndXJhdGlvbnMuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIG5hbWVzcGFjZWRDb25maWcgLSBDb25maWd1cmF0aW9uIG9yZ2FuaXplZCBieSBuYW1lc3BhY2VcclxuICAgKiBAcGFyYW0gdmFsaWRhdGlvblNjaGVtYXMgLSBWYWxpZGF0aW9uIHNjaGVtYXMgZm9yIGVhY2ggbmFtZXNwYWNlXHJcbiAgICogQHBhcmFtIHZhbGlkYXRpb25UeXBlIC0gVHlwZSBvZiB2YWxpZGF0aW9uXHJcbiAgICogQHBhcmFtIHNvdXJjZXMgLSBDb25maWd1cmF0aW9uIHNvdXJjZXNcclxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdHMgZm9yIGVhY2ggbmFtZXNwYWNlXHJcbiAgICovXHJcbiAgdmFsaWRhdGVOYW1lc3BhY2VkQ29uZmlndXJhdGlvbihcclxuICAgIG5hbWVzcGFjZWRDb25maWc6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+LFxyXG4gICAgdmFsaWRhdGlvblNjaGVtYXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXHJcbiAgICB2YWxpZGF0aW9uVHlwZTogJ2pvaScgfCAnY2xhc3MtdmFsaWRhdG9yJyB8ICdjdXN0b20nLFxyXG4gICAgc291cmNlcz86IENvbmZpZ3VyYXRpb25Tb3VyY2VbXVxyXG4gICk6IFJlY29yZDxzdHJpbmcsIHsgaXNWYWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXTsgd2FybmluZ3M6IHN0cmluZ1tdIH0+IHtcclxuICAgIGNvbnN0IHJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIHsgaXNWYWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXTsgd2FybmluZ3M6IHN0cmluZ1tdIH0+ID0ge307XHJcblxyXG4gICAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKG5hbWVzcGFjZWRDb25maWcpKSB7XHJcbiAgICAgIGNvbnN0IHNjaGVtYSA9IHZhbGlkYXRpb25TY2hlbWFzW25hbWVzcGFjZV07XHJcbiAgICAgIFxyXG4gICAgICBpZiAoc2NoZW1hKSB7XHJcbiAgICAgICAgcmVzdWx0c1tuYW1lc3BhY2VdID0gdGhpcy52YWxpZGF0ZUNvbmZpZ3VyYXRpb24oY29uZmlnLCBzY2hlbWEsIHZhbGlkYXRpb25UeXBlLCBzb3VyY2VzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHRzW25hbWVzcGFjZV0gPSB7XHJcbiAgICAgICAgICBpc1ZhbGlkOiB0cnVlLFxyXG4gICAgICAgICAgZXJyb3JzOiBbXSxcclxuICAgICAgICAgIHdhcm5pbmdzOiBbYE5vIHZhbGlkYXRpb24gc2NoZW1hIHByb3ZpZGVkIGZvciBuYW1lc3BhY2U6ICR7bmFtZXNwYWNlfWBdXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgd2hpY2ggdmFsaWRhdGlvbiBwcm92aWRlcnMgYXJlIGF2YWlsYWJsZS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBPYmplY3QgaW5kaWNhdGluZyBhdmFpbGFiaWxpdHkgb2YgZWFjaCBwcm92aWRlclxyXG4gICAqL1xyXG4gIGdldEF2YWlsYWJsZVZhbGlkYXRpb25Qcm92aWRlcnMoKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4ge1xyXG4gICAgY29uc3QgYXZhaWxhYmlsaXR5OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBwcm92aWRlcl0gb2YgdGhpcy52YWxpZGF0aW9uUHJvdmlkZXJzKSB7XHJcbiAgICAgIGF2YWlsYWJpbGl0eVtuYW1lXSA9IHByb3ZpZGVyLmlzQXZhaWxhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGF2YWlsYWJpbGl0eTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB2YWxpZGF0aW9uIHJlY29tbWVuZGF0aW9ucyBiYXNlZCBvbiBjb25maWd1cmF0aW9uIHN0cnVjdHVyZS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiB0byBhbmFseXplXHJcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZWNvbW1lbmRhdGlvbnNcclxuICAgKi9cclxuICBnZXRWYWxpZGF0aW9uUmVjb21tZW5kYXRpb25zKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IHtcclxuICAgIHJlY29tbWVuZGVkUHJvdmlkZXI6IHN0cmluZztcclxuICAgIHJlYXNvbnM6IHN0cmluZ1tdO1xyXG4gICAgZXhhbXBsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcbiAgfSB7XHJcbiAgICBjb25zdCBhbmFseXNpcyA9IHRoaXMuYW5hbHl6ZUNvbmZpZ3VyYXRpb25TdHJ1Y3R1cmUoY29uZmlnKTtcclxuICAgIFxyXG4gICAgbGV0IHJlY29tbWVuZGVkUHJvdmlkZXIgPSAnY3VzdG9tJztcclxuICAgIGNvbnN0IHJlYXNvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBleGFtcGxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xyXG5cclxuICAgIC8vIERldGVybWluZSBiZXN0IHZhbGlkYXRpb24gYXBwcm9hY2hcclxuICAgIGlmIChhbmFseXNpcy5oYXNDb21wbGV4TmVzdGluZyB8fCBhbmFseXNpcy5oYXNBcnJheXMpIHtcclxuICAgICAgaWYgKHRoaXMudmFsaWRhdGlvblByb3ZpZGVycy5nZXQoJ2pvaScpPy5pc0F2YWlsYWJsZSgpKSB7XHJcbiAgICAgICAgcmVjb21tZW5kZWRQcm92aWRlciA9ICdqb2knO1xyXG4gICAgICAgIHJlYXNvbnMucHVzaCgnQ29tcGxleCBuZXN0ZWQgc3RydWN0dXJlIGRldGVjdGVkIC0gSm9pIHByb3ZpZGVzIGV4Y2VsbGVudCBuZXN0ZWQgdmFsaWRhdGlvbicpO1xyXG4gICAgICAgIGV4YW1wbGVzWydqb2knXSA9IHRoaXMuZ2VuZXJhdGVKb2lFeGFtcGxlKGNvbmZpZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoYW5hbHlzaXMuaGFzVHlwZWRWYWx1ZXMgJiYgdGhpcy52YWxpZGF0aW9uUHJvdmlkZXJzLmdldCgnY2xhc3MtdmFsaWRhdG9yJyk/LmlzQXZhaWxhYmxlKCkpIHtcclxuICAgICAgcmVjb21tZW5kZWRQcm92aWRlciA9ICdjbGFzcy12YWxpZGF0b3InO1xyXG4gICAgICByZWFzb25zLnB1c2goJ1R5cGVkIHZhbHVlcyBkZXRlY3RlZCAtIGNsYXNzLXZhbGlkYXRvciBwcm92aWRlcyBzdHJvbmcgdHlwZSBzYWZldHknKTtcclxuICAgICAgZXhhbXBsZXNbJ2NsYXNzLXZhbGlkYXRvciddID0gdGhpcy5nZW5lcmF0ZUNsYXNzVmFsaWRhdG9yRXhhbXBsZShjb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFsd2F5cyBwcm92aWRlIGN1c3RvbSBleGFtcGxlXHJcbiAgICBleGFtcGxlc1snY3VzdG9tJ10gPSB0aGlzLmdlbmVyYXRlQ3VzdG9tVmFsaWRhdGlvbkV4YW1wbGUoY29uZmlnKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZWNvbW1lbmRlZFByb3ZpZGVyLFxyXG4gICAgICByZWFzb25zLFxyXG4gICAgICBleGFtcGxlc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIHZhbGlkYXRpb24gcHJvdmlkZXJzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJWYWxpZGF0aW9uUHJvdmlkZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy52YWxpZGF0aW9uUHJvdmlkZXJzLnNldCgnam9pJywgbmV3IEpvaVZhbGlkYXRpb25Qcm92aWRlcigpKTtcclxuICAgIHRoaXMudmFsaWRhdGlvblByb3ZpZGVycy5zZXQoJ2NsYXNzLXZhbGlkYXRvcicsIG5ldyBDbGFzc1ZhbGlkYXRvclByb3ZpZGVyKCkpO1xyXG4gICAgdGhpcy52YWxpZGF0aW9uUHJvdmlkZXJzLnNldCgnY3VzdG9tJywgbmV3IEN1c3RvbVZhbGlkYXRpb25Qcm92aWRlcigpKTtcclxuXHJcbiAgICAvLyBMb2cgYXZhaWxhYmxlIHByb3ZpZGVyc1xyXG4gICAgY29uc3QgYXZhaWxhYmxlID0gQXJyYXkuZnJvbSh0aGlzLnZhbGlkYXRpb25Qcm92aWRlcnMuZW50cmllcygpKVxyXG4gICAgICAuZmlsdGVyKChbXywgcHJvdmlkZXJdKSA9PiBwcm92aWRlci5pc0F2YWlsYWJsZSgpKVxyXG4gICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpO1xyXG5cclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBBdmFpbGFibGUgdmFsaWRhdGlvbiBwcm92aWRlcnM6ICR7YXZhaWxhYmxlLmpvaW4oJywgJyl9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBkZXRhaWxlZCB2YWxpZGF0aW9uIGVycm9yIHdpdGggc291cmNlIGluZm9ybWF0aW9uLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBuYW1lc3BhY2UgLSBOYW1lc3BhY2UgdGhhdCBmYWlsZWQgdmFsaWRhdGlvblxyXG4gICAqIEBwYXJhbSBlcnJvcnMgLSBWYWxpZGF0aW9uIGVycm9yc1xyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQ29uZmlndXJhdGlvbiBzb3VyY2VzXHJcbiAgICogQHJldHVybnMgRGV0YWlsZWQgZXJyb3JcclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZVZhbGlkYXRpb25FcnJvcihcclxuICAgIG5hbWVzcGFjZTogc3RyaW5nLFxyXG4gICAgZXJyb3JzOiBzdHJpbmdbXSxcclxuICAgIHNvdXJjZXM/OiBDb25maWd1cmF0aW9uU291cmNlW11cclxuICApOiBFcnJvciB7XHJcbiAgICBsZXQgbWVzc2FnZSA9IGBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gZmFpbGVkIGZvciBuYW1lc3BhY2UgJyR7bmFtZXNwYWNlfSc6XFxuYDtcclxuICAgIG1lc3NhZ2UgKz0gZXJyb3JzLm1hcChlcnJvciA9PiBgICAtICR7ZXJyb3J9YCkuam9pbignXFxuJyk7XHJcblxyXG4gICAgaWYgKHNvdXJjZXMgJiYgc291cmNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIG1lc3NhZ2UgKz0gJ1xcblxcbkNvbmZpZ3VyYXRpb24gc291cmNlczpcXG4nO1xyXG4gICAgICBtZXNzYWdlICs9IHNvdXJjZXMubWFwKHNvdXJjZSA9PiBcclxuICAgICAgICBgICAtICR7c291cmNlLm5hbWV9ICgke3NvdXJjZS50eXBlfSk6ICR7T2JqZWN0LmtleXMoc291cmNlLmRhdGEpLmxlbmd0aH0ga2V5c2BcclxuICAgICAgKS5qb2luKCdcXG4nKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICAgIGVycm9yLm5hbWUgPSAnQ29uZmlndXJhdGlvblZhbGlkYXRpb25FcnJvcic7XHJcbiAgICAoZXJyb3IgYXMgYW55KS5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XHJcbiAgICAoZXJyb3IgYXMgYW55KS52YWxpZGF0aW9uRXJyb3JzID0gZXJyb3JzO1xyXG4gICAgKGVycm9yIGFzIGFueSkuc291cmNlcyA9IHNvdXJjZXM7XHJcblxyXG4gICAgcmV0dXJuIGVycm9yO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5oYW5jZSBlcnJvciBtZXNzYWdlIHdpdGggc291cmNlIGluZm9ybWF0aW9uLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBlcnJvciAtIE9yaWdpbmFsIGVycm9yIG1lc3NhZ2VcclxuICAgKiBAcGFyYW0gc291cmNlcyAtIENvbmZpZ3VyYXRpb24gc291cmNlc1xyXG4gICAqIEByZXR1cm5zIEVuaGFuY2VkIGVycm9yIG1lc3NhZ2VcclxuICAgKi9cclxuICBwcml2YXRlIGVuaGFuY2VFcnJvcldpdGhTb3VyY2VJbmZvKGVycm9yOiBzdHJpbmcsIHNvdXJjZXM/OiBDb25maWd1cmF0aW9uU291cmNlW10pOiBzdHJpbmcge1xyXG4gICAgaWYgKCFzb3VyY2VzIHx8IHNvdXJjZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBlcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzb3VyY2VOYW1lcyA9IHNvdXJjZXMubWFwKHMgPT4gcy5uYW1lKS5qb2luKCcsICcpO1xyXG4gICAgcmV0dXJuIGAke2Vycm9yfSAoZnJvbSBzb3VyY2VzOiAke3NvdXJjZU5hbWVzfSlgO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW5hbHl6ZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBmb3IgdmFsaWRhdGlvbiByZWNvbW1lbmRhdGlvbnMuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdG8gYW5hbHl6ZVxyXG4gICAqIEByZXR1cm5zIFN0cnVjdHVyZSBhbmFseXNpc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgYW5hbHl6ZUNvbmZpZ3VyYXRpb25TdHJ1Y3R1cmUoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KToge1xyXG4gICAgaGFzQ29tcGxleE5lc3Rpbmc6IGJvb2xlYW47XHJcbiAgICBoYXNBcnJheXM6IGJvb2xlYW47XHJcbiAgICBoYXNUeXBlZFZhbHVlczogYm9vbGVhbjtcclxuICAgIGRlcHRoOiBudW1iZXI7XHJcbiAgfSB7XHJcbiAgICBsZXQgaGFzQ29tcGxleE5lc3RpbmcgPSBmYWxzZTtcclxuICAgIGxldCBoYXNBcnJheXMgPSBmYWxzZTtcclxuICAgIGxldCBoYXNUeXBlZFZhbHVlcyA9IGZhbHNlO1xyXG4gICAgbGV0IG1heERlcHRoID0gMDtcclxuXHJcbiAgICBjb25zdCBhbmFseXplID0gKG9iajogYW55LCBkZXB0aDogbnVtYmVyID0gMCk6IHZvaWQgPT4ge1xyXG4gICAgICBtYXhEZXB0aCA9IE1hdGgubWF4KG1heERlcHRoLCBkZXB0aCk7XHJcblxyXG4gICAgICBpZiAoZGVwdGggPiAyKSB7XHJcbiAgICAgICAgaGFzQ29tcGxleE5lc3RpbmcgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMob2JqKSkge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgaGFzQXJyYXlzID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgIGFuYWx5emUodmFsdWUsIGRlcHRoICsgMSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICBoYXNUeXBlZFZhbHVlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGFuYWx5emUoY29uZmlnKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBoYXNDb21wbGV4TmVzdGluZyxcclxuICAgICAgaGFzQXJyYXlzLFxyXG4gICAgICBoYXNUeXBlZFZhbHVlcyxcclxuICAgICAgZGVwdGg6IG1heERlcHRoXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgSm9pIHZhbGlkYXRpb24gZXhhbXBsZS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiB0byBnZW5lcmF0ZSBleGFtcGxlIGZvclxyXG4gICAqIEByZXR1cm5zIEpvaSB2YWxpZGF0aW9uIGV4YW1wbGVcclxuICAgKi9cclxuICBwcml2YXRlIGdlbmVyYXRlSm9pRXhhbXBsZShjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5nZW5lcmF0ZUpvaVNjaGVtYUZyb21Db25maWcoY29uZmlnKTtcclxuICAgIHJldHVybiBgY29uc3QgSm9pID0gcmVxdWlyZSgnam9pJyk7XHJcblxyXG5jb25zdCBzY2hlbWEgPSAke3NjaGVtYX07XHJcblxyXG4vLyBVc2FnZSBpbiBmYWN0b3J5XHJcbmNvbnN0IGZhY3RvcnkgPSAoKSA9PiB7XHJcbiAgY29uc3QgY29uZmlnID0gbG9hZEF3c0NvbmZpZygpO1xyXG4gIGNvbnN0IHsgZXJyb3IsIHZhbHVlIH0gPSBzY2hlbWEudmFsaWRhdGUoY29uZmlnKTtcclxuICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xyXG4gIHJldHVybiB2YWx1ZTtcclxufTtgO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgY2xhc3MtdmFsaWRhdG9yIGV4YW1wbGUuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdG8gZ2VuZXJhdGUgZXhhbXBsZSBmb3JcclxuICAgKiBAcmV0dXJucyBjbGFzcy12YWxpZGF0b3IgZXhhbXBsZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVDbGFzc1ZhbGlkYXRvckV4YW1wbGUoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGNsYXNzRGVmaW5pdGlvbiA9IHRoaXMuZ2VuZXJhdGVDbGFzc0Zyb21Db25maWcoY29uZmlnKTtcclxuICAgIHJldHVybiBgaW1wb3J0IHsgSXNTdHJpbmcsIElzTnVtYmVyLCBJc09wdGlvbmFsLCB2YWxpZGF0ZVN5bmMgfSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xyXG5pbXBvcnQgeyBwbGFpblRvQ2xhc3MgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XHJcblxyXG4ke2NsYXNzRGVmaW5pdGlvbn1cclxuXHJcbi8vIFVzYWdlIGluIGZhY3RvcnlcclxuY29uc3QgZmFjdG9yeSA9ICgpID0+IHtcclxuICBjb25zdCBjb25maWcgPSBsb2FkQXdzQ29uZmlnKCk7XHJcbiAgY29uc3QgaW5zdGFuY2UgPSBwbGFpblRvQ2xhc3MoQ29uZmlnQ2xhc3MsIGNvbmZpZyk7XHJcbiAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVTeW5jKGluc3RhbmNlKTtcclxuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcignVmFsaWRhdGlvbiBmYWlsZWQnKTtcclxuICByZXR1cm4gY29uZmlnO1xyXG59O2A7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBjdXN0b20gdmFsaWRhdGlvbiBleGFtcGxlLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIHRvIGdlbmVyYXRlIGV4YW1wbGUgZm9yXHJcbiAgICogQHJldHVybnMgQ3VzdG9tIHZhbGlkYXRpb24gZXhhbXBsZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVDdXN0b21WYWxpZGF0aW9uRXhhbXBsZShjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdmFsaWRhdGlvbkNoZWNrcyA9IHRoaXMuZ2VuZXJhdGVWYWxpZGF0aW9uQ2hlY2tzKGNvbmZpZyk7XHJcbiAgICByZXR1cm4gYGNvbnN0IHZhbGlkYXRlQ29uZmlnID0gKGNvbmZpZykgPT4ge1xyXG4gIGNvbnN0IGVycm9ycyA9IFtdO1xyXG4gIFxyXG4ke3ZhbGlkYXRpb25DaGVja3N9XHJcbiAgXHJcbiAgcmV0dXJuIGVycm9ycztcclxufTtcclxuXHJcbi8vIFVzYWdlIGluIGZhY3RvcnlcclxuY29uc3QgZmFjdG9yeSA9ICgpID0+IHtcclxuICBjb25zdCBjb25maWcgPSBsb2FkQXdzQ29uZmlnKCk7XHJcbiAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVDb25maWcoY29uZmlnKTtcclxuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihcXGBWYWxpZGF0aW9uIGZhaWxlZDogXFwke2Vycm9ycy5qb2luKCcsICcpfVxcYCk7XHJcbiAgcmV0dXJuIGNvbmZpZztcclxufTtgO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgSm9pIHNjaGVtYSBmcm9tIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdFxyXG4gICAqIEByZXR1cm5zIEpvaSBzY2hlbWEgc3RyaW5nXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUpvaVNjaGVtYUZyb21Db25maWcoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGdlbmVyYXRlU2NoZW1hID0gKG9iajogYW55KTogc3RyaW5nID0+IHtcclxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gJ0pvaS5zdHJpbmcoKSc7XHJcbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJykgcmV0dXJuICdKb2kubnVtYmVyKCknO1xyXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gJ0pvaS5ib29sZWFuKCknO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gJ0pvaS5hcnJheSgpJztcclxuICAgICAgXHJcbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmVudHJpZXMob2JqKVxyXG4gICAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgICAke2tleX06ICR7Z2VuZXJhdGVTY2hlbWEodmFsdWUpfWApXHJcbiAgICAgICAgICAuam9pbignLFxcbicpO1xyXG4gICAgICAgIHJldHVybiBgSm9pLm9iamVjdCh7XFxuJHtwcm9wZXJ0aWVzfVxcbn0pYDtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgcmV0dXJuICdKb2kuYW55KCknO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gZ2VuZXJhdGVTY2hlbWEoY29uZmlnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGNsYXNzIGRlZmluaXRpb24gZnJvbSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvYmplY3RcclxuICAgKiBAcmV0dXJucyBDbGFzcyBkZWZpbml0aW9uIHN0cmluZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVDbGFzc0Zyb21Db25maWcoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZW50cmllcyhjb25maWcpXHJcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRlY29yYXRvciA9IHRoaXMuZ2V0Q2xhc3NWYWxpZGF0b3JEZWNvcmF0b3IodmFsdWUpO1xyXG4gICAgICAgIHJldHVybiBgICAke2RlY29yYXRvcn1cXG4gICR7a2V5fTogJHt0aGlzLmdldFR5cGVTY3JpcHRUeXBlKHZhbHVlKX07YDtcclxuICAgICAgfSlcclxuICAgICAgLmpvaW4oJ1xcblxcbicpO1xyXG5cclxuICAgIHJldHVybiBgY2xhc3MgQ29uZmlnQ2xhc3Mge1xcbiR7cHJvcGVydGllc31cXG59YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIHZhbGlkYXRpb24gY2hlY2tzIGZvciBjdXN0b20gdmFsaWRhdGlvbi5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvYmplY3RcclxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIGNoZWNrcyBzdHJpbmdcclxuICAgKi9cclxuICBwcml2YXRlIGdlbmVyYXRlVmFsaWRhdGlvbkNoZWNrcyhjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGNvbmZpZylcclxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hlY2sgPSB0aGlzLmdldFZhbGlkYXRpb25DaGVjayhrZXksIHZhbHVlKTtcclxuICAgICAgICByZXR1cm4gYCAgJHtjaGVja31gO1xyXG4gICAgICB9KVxyXG4gICAgICAuam9pbignXFxuJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgY2xhc3MtdmFsaWRhdG9yIGRlY29yYXRvciBmb3IgYSB2YWx1ZS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBnZXQgZGVjb3JhdG9yIGZvclxyXG4gICAqIEByZXR1cm5zIERlY29yYXRvciBzdHJpbmdcclxuICAgKi9cclxuICBwcml2YXRlIGdldENsYXNzVmFsaWRhdG9yRGVjb3JhdG9yKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiAnQElzU3RyaW5nKCknO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiAnQElzTnVtYmVyKCknO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gJ0BJc0Jvb2xlYW4oKSc7XHJcbiAgICByZXR1cm4gJ0BJc09wdGlvbmFsKCknO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IFR5cGVTY3JpcHQgdHlwZSBmb3IgYSB2YWx1ZS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBnZXQgdHlwZSBmb3JcclxuICAgKiBAcmV0dXJucyBUeXBlU2NyaXB0IHR5cGUgc3RyaW5nXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRUeXBlU2NyaXB0VHlwZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gJ3N0cmluZyc7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuICdudW1iZXInO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gJ2Jvb2xlYW4nO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gJ2FueVtdJztcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSByZXR1cm4gJ29iamVjdCc7XHJcbiAgICByZXR1cm4gJ2FueSc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdmFsaWRhdGlvbiBjaGVjayBmb3IgY3VzdG9tIHZhbGlkYXRpb24uXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGtleSAtIENvbmZpZ3VyYXRpb24ga2V5XHJcbiAgICogQHBhcmFtIHZhbHVlIC0gQ29uZmlndXJhdGlvbiB2YWx1ZVxyXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gY2hlY2sgc3RyaW5nXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRWYWxpZGF0aW9uQ2hlY2soa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIGBpZiAoIWNvbmZpZy4ke2tleX0gfHwgdHlwZW9mIGNvbmZpZy4ke2tleX0gIT09ICdzdHJpbmcnKSBlcnJvcnMucHVzaCgnJHtrZXl9IG11c3QgYmUgYSBzdHJpbmcnKTtgO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgcmV0dXJuIGBpZiAoY29uZmlnLiR7a2V5fSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjb25maWcuJHtrZXl9ICE9PSAnbnVtYmVyJykgZXJyb3JzLnB1c2goJyR7a2V5fSBtdXN0IGJlIGEgbnVtYmVyJyk7YDtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICByZXR1cm4gYGlmIChjb25maWcuJHtrZXl9ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGNvbmZpZy4ke2tleX0gIT09ICdib29sZWFuJykgZXJyb3JzLnB1c2goJyR7a2V5fSBtdXN0IGJlIGEgYm9vbGVhbicpO2A7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYGlmIChjb25maWcuJHtrZXl9ID09PSB1bmRlZmluZWQpIGVycm9ycy5wdXNoKCcke2tleX0gaXMgcmVxdWlyZWQnKTtgO1xyXG4gIH1cclxufSJdfQ==