@envive-ai/react-hooks 0.2.6-alpha-arthur-2 → 0.2.6-alpha.11

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 (673) hide show
  1. package/dist/{NewOrgConfig-C_1T1iOt.js → NewOrgConfig-BZCP9E7v.js} +2 -2
  2. package/dist/{NewOrgConfig-D2Kvqa1z.cjs → NewOrgConfig-DWLMI1ga.cjs} +2 -2
  3. package/dist/SystemSettingsContext-CO5c1L62.cjs +20 -0
  4. package/dist/SystemSettingsContext-CXmUlH8i.js +13 -0
  5. package/dist/TrackComponentVisibleEvent-BJgNOypY.js +52 -0
  6. package/dist/TrackComponentVisibleEvent-BRC2FTp-.cjs +59 -0
  7. package/dist/amplitudeContext-CCVyp5RU.d.cts +52 -0
  8. package/dist/amplitudeContext-DFYBDc0h.d.ts +52 -0
  9. package/dist/api-BWSsazAG.js +166 -0
  10. package/dist/api-DeW6rHj3.cjs +239 -0
  11. package/dist/application/models/graphql/index.cjs +3 -3
  12. package/dist/application/models/graphql/index.d.cts +2 -2
  13. package/dist/application/models/graphql/index.d.ts +2 -2
  14. package/dist/application/models/graphql/index.js +3 -2
  15. package/dist/application/models/guards/api/index.cjs +3 -3
  16. package/dist/application/models/guards/api/index.d.cts +2 -2
  17. package/dist/application/models/guards/api/index.d.ts +2 -2
  18. package/dist/application/models/guards/api/index.js +3 -3
  19. package/dist/application/models/guards/utils.cjs +1 -1
  20. package/dist/application/models/guards/utils.d.ts +1 -1
  21. package/dist/application/models/guards/utils.js +1 -1
  22. package/dist/application/models/index.cjs +23 -7
  23. package/dist/application/models/index.d.cts +12 -167
  24. package/dist/application/models/index.d.ts +13 -168
  25. package/dist/application/models/index.js +11 -7
  26. package/dist/application/models/utilityTypes/index.cjs +1 -0
  27. package/dist/application/models/utilityTypes/index.d.cts +2 -0
  28. package/dist/application/models/utilityTypes/index.d.ts +2 -0
  29. package/dist/application/models/utilityTypes/index.js +3 -0
  30. package/dist/application/models/variantInfo/index.cjs +3 -0
  31. package/dist/application/models/variantInfo/index.d.cts +2 -0
  32. package/dist/application/models/variantInfo/index.d.ts +2 -0
  33. package/dist/application/models/variantInfo/index.js +3 -0
  34. package/dist/application/utils/index.cjs +19 -10
  35. package/dist/application/utils/index.d.cts +62 -11
  36. package/dist/application/utils/index.d.ts +64 -13
  37. package/dist/application/utils/index.js +19 -10
  38. package/dist/{atomStore-BQVO5haU.cjs → atomStore-DNji91Im.cjs} +1 -1
  39. package/dist/{atomStore-CfzCqWB9.js → atomStore-DXTVqiKc.js} +1 -1
  40. package/dist/atoms/app/index.cjs +24 -22
  41. package/dist/atoms/app/index.d.cts +21 -9
  42. package/dist/atoms/app/index.d.ts +20 -8
  43. package/dist/atoms/app/index.js +19 -17
  44. package/dist/atoms/atomStore/index.cjs +1 -1
  45. package/dist/atoms/atomStore/index.js +1 -1
  46. package/dist/atoms/chat/index.cjs +21 -20
  47. package/dist/atoms/chat/index.d.cts +46 -36
  48. package/dist/atoms/chat/index.d.ts +44 -34
  49. package/dist/atoms/chat/index.js +21 -20
  50. package/dist/atoms/globalSearch/index.cjs +2 -1
  51. package/dist/atoms/globalSearch/index.d.cts +6 -6
  52. package/dist/atoms/globalSearch/index.d.ts +1 -1
  53. package/dist/atoms/globalSearch/index.js +2 -1
  54. package/dist/atoms/org/index.cjs +11 -10
  55. package/dist/atoms/org/index.d.cts +32 -19
  56. package/dist/atoms/org/index.d.ts +32 -19
  57. package/dist/atoms/org/index.js +3 -2
  58. package/dist/atoms/search/index.cjs +47 -7
  59. package/dist/atoms/search/index.d.cts +15 -76
  60. package/dist/atoms/search/index.d.ts +15 -76
  61. package/dist/atoms/search/index.js +29 -7
  62. package/dist/atoms/search/types.cjs +5 -0
  63. package/dist/atoms/search/types.d.cts +2 -0
  64. package/dist/atoms/search/types.d.ts +2 -0
  65. package/dist/atoms/search/types.js +3 -0
  66. package/dist/atoms/search/utils.cjs +1 -1
  67. package/dist/atoms/search/utils.d.cts +1 -1
  68. package/dist/atoms/search/utils.d.ts +1 -1
  69. package/dist/atoms/search/utils.js +1 -1
  70. package/dist/cdnContext-BnqmnEvR.js +38 -0
  71. package/dist/cdnContext-CnYcBOr9.cjs +53 -0
  72. package/dist/chat-CqPuT9_V.cjs +393 -0
  73. package/dist/chat-DH70QqJp.js +257 -0
  74. package/dist/chatElementDisplayLocation-CpgV2wR1.d.ts +25 -0
  75. package/dist/chatElementDisplayLocation-DWmfNX_u.d.cts +25 -0
  76. package/dist/chatSearch-ChyGuHbu.js +295 -0
  77. package/dist/chatSearch-DpnpRWAW.cjs +418 -0
  78. package/dist/chatState-CcFtSqJT.cjs +120 -0
  79. package/dist/chatState-DKnNHmwe.js +34 -0
  80. package/dist/config/index.d.cts +4 -4
  81. package/dist/config/index.d.ts +4 -4
  82. package/dist/config/locators/components/chat/index.d.cts +1 -1
  83. package/dist/config/locators/components/chat/index.d.ts +1 -1
  84. package/dist/config/locators/components/chat/variants/index.d.cts +1 -1
  85. package/dist/config/locators/components/chat/variants/index.d.ts +1 -1
  86. package/dist/config/locators/components/common/index.d.cts +1 -1
  87. package/dist/config/locators/components/common/index.d.ts +1 -1
  88. package/dist/config/locators/components/index.d.cts +1 -1
  89. package/dist/config/locators/components/index.d.ts +1 -1
  90. package/dist/config/locators/components/search/index.d.cts +1 -1
  91. package/dist/config/locators/components/search/index.d.ts +1 -1
  92. package/dist/config/locators/index.d.cts +4 -4
  93. package/dist/config/locators/index.d.ts +4 -4
  94. package/dist/contexts/amplitudeContext/index.cjs +22 -23
  95. package/dist/contexts/amplitudeContext/index.d.cts +2 -11
  96. package/dist/contexts/amplitudeContext/index.d.ts +2 -11
  97. package/dist/contexts/amplitudeContext/index.js +20 -22
  98. package/dist/contexts/cdnContext/index.cjs +4 -4
  99. package/dist/contexts/cdnContext/index.d.cts +6 -2
  100. package/dist/contexts/cdnContext/index.d.ts +6 -2
  101. package/dist/contexts/cdnContext/index.js +4 -4
  102. package/dist/contexts/chatContext/index.cjs +326 -0
  103. package/dist/contexts/chatContext/index.d.cts +15 -0
  104. package/dist/contexts/chatContext/index.d.ts +15 -0
  105. package/dist/contexts/chatContext/index.js +319 -0
  106. package/dist/contexts/enviveConfigContext/index.cjs +4 -4
  107. package/dist/contexts/enviveConfigContext/index.d.cts +25 -3
  108. package/dist/contexts/enviveConfigContext/index.d.ts +25 -3
  109. package/dist/contexts/enviveConfigContext/index.js +4 -4
  110. package/dist/contexts/enviveCssContext/index.cjs +19 -15
  111. package/dist/contexts/enviveCssContext/index.d.cts +5 -3
  112. package/dist/contexts/enviveCssContext/index.d.ts +5 -3
  113. package/dist/contexts/enviveCssContext/index.js +19 -15
  114. package/dist/contexts/featureFlagContext/index.cjs +10 -9
  115. package/dist/contexts/featureFlagContext/index.d.cts +12 -3
  116. package/dist/contexts/featureFlagContext/index.d.ts +12 -3
  117. package/dist/contexts/featureFlagContext/index.js +7 -6
  118. package/dist/contexts/featureFlagServiceContext/index.cjs +3 -4
  119. package/dist/contexts/featureFlagServiceContext/index.d.cts +5 -1
  120. package/dist/contexts/featureFlagServiceContext/index.d.ts +5 -1
  121. package/dist/contexts/featureFlagServiceContext/index.js +3 -4
  122. package/dist/contexts/graphqlContext/index.cjs +13 -8
  123. package/dist/contexts/graphqlContext/index.d.cts +15 -11
  124. package/dist/contexts/graphqlContext/index.d.ts +15 -11
  125. package/dist/contexts/graphqlContext/index.js +13 -8
  126. package/dist/contexts/localStorageContext/index.cjs +3 -3
  127. package/dist/contexts/localStorageContext/index.d.cts +22 -3
  128. package/dist/contexts/localStorageContext/index.d.ts +22 -3
  129. package/dist/contexts/localStorageContext/index.js +3 -4
  130. package/dist/contexts/newOrgConfigContext/index.cjs +17 -13
  131. package/dist/contexts/newOrgConfigContext/index.d.cts +16 -12
  132. package/dist/contexts/newOrgConfigContext/index.d.ts +16 -12
  133. package/dist/contexts/newOrgConfigContext/index.js +17 -13
  134. package/dist/contexts/searchContext/index.cjs +24 -23
  135. package/dist/contexts/searchContext/index.d.cts +7 -2
  136. package/dist/contexts/searchContext/index.d.ts +7 -2
  137. package/dist/contexts/searchContext/index.js +24 -23
  138. package/dist/contexts/sessionStorageContext/index.cjs +2 -2
  139. package/dist/contexts/sessionStorageContext/index.d.cts +6 -2
  140. package/dist/contexts/sessionStorageContext/index.d.ts +6 -2
  141. package/dist/contexts/sessionStorageContext/index.js +2 -2
  142. package/dist/contexts/shopifyUrlContext/index.cjs +2 -2
  143. package/dist/contexts/shopifyUrlContext/index.d.cts +12 -2
  144. package/dist/contexts/shopifyUrlContext/index.d.ts +12 -2
  145. package/dist/contexts/shopifyUrlContext/index.js +2 -2
  146. package/dist/contexts/systemSettingsContext/index.cjs +4 -4
  147. package/dist/contexts/systemSettingsContext/index.d.cts +13 -2
  148. package/dist/contexts/systemSettingsContext/index.d.ts +15 -4
  149. package/dist/contexts/systemSettingsContext/index.js +4 -4
  150. package/dist/contexts/types.cjs +7 -0
  151. package/dist/contexts/types.d.cts +5 -0
  152. package/dist/contexts/types.d.ts +5 -0
  153. package/dist/contexts/types.js +3 -0
  154. package/dist/contexts/userIdentityContext/index.cjs +21 -19
  155. package/dist/contexts/userIdentityContext/index.d.cts +2 -11
  156. package/dist/contexts/userIdentityContext/index.d.ts +2 -11
  157. package/dist/contexts/userIdentityContext/index.js +19 -17
  158. package/dist/custservice-types-CcPnAJ5k.d.ts +29 -0
  159. package/dist/custservice-types-_Dnz4sMy.d.cts +29 -0
  160. package/dist/domObserver-Bqf3ooj8.cjs +304 -0
  161. package/dist/{domObserver-C2oQO8vi.cjs → domObserver-v9ODTyfT.js} +4 -23
  162. package/dist/enviveConfig-DZBohDpc.js +62 -0
  163. package/dist/enviveConfig-Dv9-esGV.cjs +130 -0
  164. package/dist/enviveConfigContext-D2OELZDR.cjs +60 -0
  165. package/dist/enviveConfigContext-DrDjCems.js +45 -0
  166. package/dist/events/index.cjs +3 -2
  167. package/dist/events/index.d.cts +15 -2
  168. package/dist/events/index.d.ts +15 -2
  169. package/dist/events/index.js +2 -2
  170. package/dist/events-DYY4l817.cjs +90 -0
  171. package/dist/events-DyUix-Bn.js +78 -0
  172. package/dist/featureFlagServiceContext-B01ZkIwj.d.cts +23 -0
  173. package/dist/featureFlagServiceContext-CJyYItqu.cjs +62 -0
  174. package/dist/featureFlagServiceContext-FBM6DdMJ.js +42 -0
  175. package/dist/featureFlagServiceContext-jZzoym5C.d.ts +23 -0
  176. package/dist/featureGates-KEwAL8p_.js +26 -0
  177. package/dist/featureGates-qU_ulhpC.cjs +32 -0
  178. package/dist/frontendConfig-BIq8r6nC.d.cts +858 -0
  179. package/dist/frontendConfig-CixANNjw.d.ts +858 -0
  180. package/dist/{globalSearch-Cpc8egsM.cjs → globalSearch-Ba342VVG.cjs} +1 -1
  181. package/dist/globalSearch-DQCMamhv.js +1 -0
  182. package/dist/globalSearch-DYxPE02f.cjs +0 -0
  183. package/dist/{globalSearch-nmrfGLOn.js → globalSearch-eGx-9JQz.js} +1 -1
  184. package/dist/graphql-3PxNRFOc.js +36 -0
  185. package/dist/graphql-DGYfelZp.cjs +53 -0
  186. package/dist/graphqlConfig-GHZ1UgCw.cjs +73 -0
  187. package/dist/graphqlConfig-mDg6J44N.js +24 -0
  188. package/dist/graphqlContext-B4twVCqw.d.ts +28 -0
  189. package/dist/graphqlContext-BZPEAFSR.cjs +111 -0
  190. package/dist/graphqlContext-W6iEyEkv.d.cts +28 -0
  191. package/dist/graphqlContext-eaZPxgRE.js +96 -0
  192. package/dist/hooks/AmplitudeOperations/index.cjs +22 -23
  193. package/dist/hooks/AmplitudeOperations/index.d.cts +2 -2
  194. package/dist/hooks/AmplitudeOperations/index.d.ts +2 -2
  195. package/dist/hooks/AmplitudeOperations/index.js +21 -22
  196. package/dist/hooks/AppDetails/index.cjs +22 -20
  197. package/dist/hooks/AppDetails/index.d.cts +24 -3
  198. package/dist/hooks/AppDetails/index.d.ts +24 -3
  199. package/dist/hooks/AppDetails/index.js +22 -20
  200. package/dist/hooks/CdnOperations/index.cjs +4 -4
  201. package/dist/hooks/CdnOperations/index.js +4 -4
  202. package/dist/hooks/ChatToggle/index.cjs +25 -28
  203. package/dist/hooks/ChatToggle/index.d.cts +2 -2
  204. package/dist/hooks/ChatToggle/index.d.ts +2 -2
  205. package/dist/hooks/ChatToggle/index.js +22 -25
  206. package/dist/hooks/ChatToggleAnalytics/index.cjs +24 -25
  207. package/dist/hooks/ChatToggleAnalytics/index.d.cts +2 -2
  208. package/dist/hooks/ChatToggleAnalytics/index.d.ts +2 -2
  209. package/dist/hooks/ChatToggleAnalytics/index.js +23 -24
  210. package/dist/hooks/CustomerSupportHandoff/index.cjs +2 -2
  211. package/dist/hooks/CustomerSupportHandoff/index.js +2 -2
  212. package/dist/hooks/Debounce/index.cjs +2 -20
  213. package/dist/hooks/Debounce/index.js +2 -18
  214. package/dist/hooks/ElementObserver/index.cjs +6 -4
  215. package/dist/hooks/ElementObserver/index.d.cts +25 -4
  216. package/dist/hooks/ElementObserver/index.d.ts +25 -4
  217. package/dist/hooks/ElementObserver/index.js +6 -4
  218. package/dist/hooks/FloatingButtonVisibility/index.cjs +73 -0
  219. package/dist/hooks/FloatingButtonVisibility/index.d.cts +7 -0
  220. package/dist/hooks/FloatingButtonVisibility/index.d.ts +7 -0
  221. package/dist/hooks/FloatingButtonVisibility/index.js +69 -0
  222. package/dist/hooks/GrabAndScroll/index.cjs +1 -1
  223. package/dist/hooks/GrabAndScroll/index.d.cts +2 -2
  224. package/dist/hooks/GrabAndScroll/index.d.ts +2 -2
  225. package/dist/hooks/GrabAndScroll/index.js +1 -1
  226. package/dist/hooks/GraphQLConfig/index.cjs +14 -9
  227. package/dist/hooks/GraphQLConfig/index.d.cts +14 -2
  228. package/dist/hooks/GraphQLConfig/index.d.ts +14 -2
  229. package/dist/hooks/GraphQLConfig/index.js +14 -9
  230. package/dist/hooks/IdentifyUser/index.cjs +21 -19
  231. package/dist/hooks/IdentifyUser/index.js +20 -18
  232. package/dist/hooks/ImageResolver/index.cjs +29 -20
  233. package/dist/hooks/ImageResolver/index.js +29 -20
  234. package/dist/hooks/Intersection/index.cjs +1 -1
  235. package/dist/hooks/Intersection/index.d.cts +1 -1
  236. package/dist/hooks/Intersection/index.js +1 -1
  237. package/dist/hooks/LastInteraction/index.cjs +34 -0
  238. package/dist/hooks/LastInteraction/index.d.cts +7 -0
  239. package/dist/hooks/LastInteraction/index.d.ts +7 -0
  240. package/dist/hooks/LastInteraction/index.js +32 -0
  241. package/dist/hooks/LocalStorageOperations/index.cjs +7 -8
  242. package/dist/hooks/LocalStorageOperations/index.js +3 -4
  243. package/dist/hooks/MessageFilter/index.cjs +12 -3
  244. package/dist/hooks/MessageFilter/index.d.cts +18 -2
  245. package/dist/hooks/MessageFilter/index.d.ts +18 -2
  246. package/dist/hooks/MessageFilter/index.js +11 -2
  247. package/dist/hooks/NewOrgConfig/index.cjs +18 -14
  248. package/dist/hooks/NewOrgConfig/index.d.cts +17 -3
  249. package/dist/hooks/NewOrgConfig/index.d.ts +17 -3
  250. package/dist/hooks/NewOrgConfig/index.js +18 -14
  251. package/dist/hooks/Search/index.cjs +173 -314
  252. package/dist/hooks/Search/index.d.cts +58 -3
  253. package/dist/hooks/Search/index.d.ts +58 -3
  254. package/dist/hooks/Search/index.js +162 -302
  255. package/dist/hooks/SearchOperations/index.cjs +25 -24
  256. package/dist/hooks/SearchOperations/index.d.cts +3 -2
  257. package/dist/hooks/SearchOperations/index.d.ts +3 -2
  258. package/dist/hooks/SearchOperations/index.js +25 -24
  259. package/dist/hooks/SessionStorageOperations/index.cjs +2 -2
  260. package/dist/hooks/SessionStorageOperations/index.js +2 -2
  261. package/dist/hooks/ShopifyUrlOperations/index.cjs +3 -3
  262. package/dist/hooks/ShopifyUrlOperations/index.d.cts +5 -2
  263. package/dist/hooks/ShopifyUrlOperations/index.d.ts +5 -2
  264. package/dist/hooks/ShopifyUrlOperations/index.js +3 -3
  265. package/dist/hooks/SnapCalculator/index.cjs +1 -1
  266. package/dist/hooks/SnapCalculator/index.d.cts +3 -4
  267. package/dist/hooks/SnapCalculator/index.d.ts +3 -4
  268. package/dist/hooks/SnapCalculator/index.js +1 -1
  269. package/dist/hooks/SystemSettingsContext/index.cjs +6 -17
  270. package/dist/hooks/SystemSettingsContext/index.d.cts +16 -5
  271. package/dist/hooks/SystemSettingsContext/index.d.ts +16 -5
  272. package/dist/hooks/SystemSettingsContext/index.js +6 -15
  273. package/dist/hooks/TrackComponentVisibleEvent/index.cjs +21 -23
  274. package/dist/hooks/TrackComponentVisibleEvent/index.d.cts +3 -2
  275. package/dist/hooks/TrackComponentVisibleEvent/index.d.ts +3 -2
  276. package/dist/hooks/TrackComponentVisibleEvent/index.js +21 -23
  277. package/dist/hooks/UpdateAnalyticsProps/index.cjs +24 -26
  278. package/dist/hooks/UpdateAnalyticsProps/index.js +20 -22
  279. package/dist/hooks/utils.cjs +1 -1
  280. package/dist/hooks/utils.d.cts +14 -20
  281. package/dist/hooks/utils.d.ts +14 -20
  282. package/dist/hooks/utils.js +1 -1
  283. package/dist/index-9oqgeOVC.d.cts +186 -0
  284. package/dist/index-A0HvA68Y.d.cts +1 -0
  285. package/dist/index-BC93l5Th.d.ts +1 -0
  286. package/dist/index-BEzmil_W.d.ts +44 -0
  287. package/dist/{index-DtzPIcQp.d.ts → index-BdjH4aRG.d.ts} +1 -1
  288. package/dist/{index-CsmO1rDH.d.ts → index-BfM7zKRO.d.ts} +1 -1
  289. package/dist/index-Bmub8e38.d.cts +98 -0
  290. package/dist/{index-mv7KvWDq.d.ts → index-CA1Eo7DA.d.ts} +1 -1
  291. package/dist/index-CCa4tZuO.d.ts +184 -0
  292. package/dist/{index-ChiZg0yw.d.cts → index-CCboEuTO.d.cts} +1 -1
  293. package/dist/index-CESxqFso.d.cts +228 -0
  294. package/dist/{index-BbqT4BQv.d.cts → index-COXkY78t.d.cts} +1 -1
  295. package/dist/index-CboygwjO.d.ts +676 -0
  296. package/dist/index-CiWEYzXl.d.cts +184 -0
  297. package/dist/{index-jFQefHda.d.ts → index-Cw9oYJnq.d.ts} +1 -1
  298. package/dist/index-D5lw0cMx.d.ts +186 -0
  299. package/dist/{index-CAJq_8bO.d.cts → index-DZtnHhlr.d.cts} +1 -1
  300. package/dist/index-Dfwnna1j.d.ts +228 -0
  301. package/dist/index-Dt_C-I-2.d.cts +676 -0
  302. package/dist/index-OkKEOL6H.d.cts +44 -0
  303. package/dist/index-bjMvkcBF.d.ts +98 -0
  304. package/dist/{index-npqPeJ1g.d.cts → index-hAqp0oYb.d.cts} +1 -1
  305. package/dist/interceptors/index.cjs +3 -28
  306. package/dist/interceptors/index.d.cts +16 -4
  307. package/dist/interceptors/index.d.ts +16 -4
  308. package/dist/interceptors/index.js +3 -25
  309. package/dist/interceptors/types.cjs +1 -0
  310. package/dist/interceptors/types.d.cts +14 -0
  311. package/dist/interceptors/types.d.ts +14 -0
  312. package/dist/interceptors/types.js +3 -0
  313. package/dist/localStorageContext-BPZ82q-G.js +95 -0
  314. package/dist/localStorageContext-NRP-CdmF.cjs +115 -0
  315. package/dist/{logger-BqHq67zN.cjs → logger-TBIl4uIH.cjs} +1 -1
  316. package/dist/{logger-BMVdhQOV.js → logger-W3lqg-4b.js} +1 -1
  317. package/dist/models-D-4db7XW.cjs +1537 -0
  318. package/dist/models-c86hYW-F.js +1296 -0
  319. package/dist/{newOrgConfigAtom-rrYHmp1b.cjs → newOrgConfigAtom-D6R-7HCk.cjs} +1 -1
  320. package/dist/newOrgConfigAtom-bn1lnljf.js +8 -0
  321. package/dist/newOrgConfigContext-BC79qoiV.d.ts +16 -0
  322. package/dist/newOrgConfigContext-BqZwD8-B.cjs +68 -0
  323. package/dist/newOrgConfigContext-DbcDClwd.js +53 -0
  324. package/dist/newOrgConfigContext-eS4ZLo58.d.cts +16 -0
  325. package/dist/nodeSelector-DybpVr-i.d.ts +31 -0
  326. package/dist/nodeSelector-vKB44CDB.d.cts +31 -0
  327. package/dist/org-CIhjzxWr.cjs +43 -0
  328. package/dist/org-CeWXnpwF.js +12 -0
  329. package/dist/search-6RrxBXD6.d.cts +20 -0
  330. package/dist/search-BBu5YeQa.js +126 -0
  331. package/dist/search-D23INSNg.cjs +205 -0
  332. package/dist/search-filter-types-BItKtezf.d.cts +102 -0
  333. package/dist/search-filter-types-fZf91Pdw.d.ts +102 -0
  334. package/dist/search-nuWWnRRV.d.ts +20 -0
  335. package/dist/searchContext-BPT44uk-.js +129 -0
  336. package/dist/searchContext-CwRRiXQ3.cjs +145 -0
  337. package/dist/searchServiceAdapter-DEv1tTn0.cjs +34 -0
  338. package/dist/searchServiceAdapter-WyCU55NV.js +16 -0
  339. package/dist/sessionStorageContext-1Ks_d4Z0.cjs +66 -0
  340. package/dist/sessionStorageContext-CDcl7NVl.js +52 -0
  341. package/dist/shopifyUrlContext-CejRZfj7.js +61 -0
  342. package/dist/shopifyUrlContext-lnHoAOEf.cjs +75 -0
  343. package/dist/spiffyWidgets-CdxRcXhW.d.ts +20 -0
  344. package/dist/spiffyWidgets-eNbU1gMc.d.cts +20 -0
  345. package/dist/systemSettingsContext-Ba-wi2NZ.cjs +60 -0
  346. package/dist/systemSettingsContext-DumUaV0m.js +39 -0
  347. package/dist/test-types-B3YQpECG.d.cts +13 -0
  348. package/dist/test-types-C8NHqaUS.d.ts +13 -0
  349. package/dist/types/index.cjs +48 -3
  350. package/dist/types/index.d.cts +18 -2
  351. package/dist/types/index.d.ts +18 -2
  352. package/dist/types/index.js +44 -2
  353. package/dist/types-BGqrvAsw.d.ts +10 -0
  354. package/dist/types-CKPddlfS.cjs +0 -0
  355. package/dist/types-CS0Hrzja.js +30 -0
  356. package/dist/types-CtUb63bt.js +76 -0
  357. package/dist/types-CxObxLKs.cjs +48 -0
  358. package/dist/types-DIiH_5gL.d.cts +10 -0
  359. package/dist/types-Dc6hx6ei.js +1 -0
  360. package/dist/types-UUvB6h05.cjs +106 -0
  361. package/dist/types-aQTzSrH1.d.cts +51 -0
  362. package/dist/types-kAjmR2du.d.ts +51 -0
  363. package/dist/types.cjs +0 -0
  364. package/dist/types.d.cts +16 -0
  365. package/dist/types.d.ts +16 -0
  366. package/dist/types.js +1 -0
  367. package/dist/urlsParser-COzMdJaX.cjs +78 -0
  368. package/dist/urlsParser-DxjoLj98.js +42 -0
  369. package/dist/useAmplitudeOperations-Cv0fi3uj.cjs +41 -0
  370. package/dist/useAmplitudeOperations-Ti6phPPq.js +34 -0
  371. package/dist/useAppDetails-CsXHPAh1.cjs +38 -0
  372. package/dist/useAppDetails-PUfYwCjK.js +30 -0
  373. package/dist/useDebounce-DZ8Cgiwc.cjs +26 -0
  374. package/dist/useDebounce-v9cezyjn.js +19 -0
  375. package/dist/useGraphQLConfig-BizpCw23.cjs +76 -0
  376. package/dist/useGraphQLConfig-DFWl9Z89.js +63 -0
  377. package/dist/{useIntersection-BkMkuJcZ.js → useIntersection-Cncgxdmy.js} +1 -1
  378. package/dist/{useIntersection-BcBCa890.cjs → useIntersection-m4PEpvG7.cjs} +1 -1
  379. package/dist/useMessageInterceptor-BjGP_uXm.js +25 -0
  380. package/dist/useMessageInterceptor-arAqUq1Q.cjs +33 -0
  381. package/dist/userIdentityContext-W1OWF3cG.d.ts +20 -0
  382. package/dist/userIdentityContext-kU1PIo8K.d.cts +20 -0
  383. package/dist/utilityTypes-B2KuRn37.js +1 -0
  384. package/dist/utilityTypes-BGbL2WTP.cjs +0 -0
  385. package/dist/{utils-CqVRbvfN.cjs → utils-2SWrJ12w.cjs} +1 -1
  386. package/dist/utils-BewguHW0.d.cts +22 -0
  387. package/dist/{utils-CiJLDPjY.cjs → utils-CDw74BCO.cjs} +1 -1
  388. package/dist/utils-CLGXsOwE.cjs +1591 -0
  389. package/dist/{utils-DQhbbAnt.js → utils-CqBxIpEV.js} +1 -1
  390. package/dist/{utils-B1LVzQYK.js → utils-DIvMgPe8.js} +1 -1
  391. package/dist/utils-D_kATUj6.js +92 -0
  392. package/dist/{utils-BitIIghf.d.ts → utils-DpneNSJf.d.ts} +1 -1
  393. package/dist/utils-hKYwSBo9.d.ts +22 -0
  394. package/dist/utils-hYTjy7hJ.cjs +130 -0
  395. package/dist/utils-jYtD3hmA.js +1385 -0
  396. package/dist/variantInfo-BfKlkaWU.js +11 -0
  397. package/dist/variantInfo-DpLn4nHz.cjs +17 -0
  398. package/package.json +36 -9
  399. package/src/application/commerce-api.ts +37 -40
  400. package/src/application/models/api/context.ts +4 -0
  401. package/src/application/models/api/generationParams.ts +4 -0
  402. package/src/application/models/api/nextMessageRequest.ts +11 -0
  403. package/src/application/models/api/orgAnalyticsConfig.ts +19 -0
  404. package/src/application/models/api/orgConfigResults.ts +44 -0
  405. package/src/application/models/api/organizationConfig.ts +12 -0
  406. package/src/{types/ApiResponse.ts → application/models/api/response.ts} +29 -35
  407. package/src/application/models/api/responseGenerics.ts +67 -0
  408. package/src/application/models/api/search.ts +26 -0
  409. package/src/application/models/api/suggestion.ts +4 -0
  410. package/src/application/models/api/supportedEventRequest.ts +8 -0
  411. package/src/application/models/api/userEvent.ts +101 -0
  412. package/src/application/models/cachedValue.ts +8 -0
  413. package/src/application/models/chatElementDisplayLocation.ts +22 -0
  414. package/src/application/models/clientDetails.ts +18 -0
  415. package/src/application/models/colorsConfig.ts +28 -0
  416. package/src/application/models/conversationalSearchIds.ts +5 -0
  417. package/src/application/models/dataLayer.ts +45 -0
  418. package/src/application/models/events.ts +5 -0
  419. package/src/application/models/featureGates.ts +21 -0
  420. package/src/application/models/frontendConfig.ts +14 -0
  421. package/src/application/models/googleAnalyticsEvents.ts +8 -0
  422. package/src/application/models/graphql/index.ts +0 -1
  423. package/src/application/models/graphql/queries/getMerchantColorsQuery.ts +23 -1
  424. package/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.ts +89 -1
  425. package/src/application/models/guards/api/isApiFormResponse.ts +4 -4
  426. package/src/application/models/guards/api/isApiFormSubmittedResponseAttributes.ts +2 -2
  427. package/src/application/models/guards/api/isApiOrderResponseAttributes.ts +20 -2
  428. package/src/application/models/guards/api/isApiOrgConfigResults.ts +9 -3
  429. package/src/application/models/guards/api/isApiOrganizationConfig.ts +32 -8
  430. package/src/application/models/guards/api/isApiPDPEventAttributes.ts +5 -8
  431. package/src/application/models/guards/api/isApiPLPEventAttributes.ts +10 -14
  432. package/src/application/models/guards/api/isApiPageResponseAttributes.ts +1 -1
  433. package/src/application/models/guards/api/isApiProductResponseAttributes.ts +4 -2
  434. package/src/application/models/guards/api/isApiProductSearchAttributes.ts +6 -9
  435. package/src/application/models/guards/api/isApiProductSearchFilterAttributes.ts +4 -7
  436. package/src/application/models/guards/api/isApiQueryTypedEventAttributes.ts +3 -8
  437. package/src/application/models/guards/api/isApiResponse.ts +15 -22
  438. package/src/application/models/guards/api/isApiReviewResponseAttributes.ts +1 -1
  439. package/src/application/models/guards/api/isApiReviewRichInformation.ts +1 -1
  440. package/src/application/models/guards/api/isApiTextResponseAttributes.ts +1 -1
  441. package/src/application/models/guards/graphQL/isGraphQLColorsConfig.ts +1 -1
  442. package/src/application/models/guards/isBaseEcommerceEvent.ts +2 -1
  443. package/src/application/models/guards/isGA4EcommerceEvent.ts +1 -1
  444. package/src/application/models/guards/isLegacyUAEcommerceEvent.ts +1 -1
  445. package/src/application/models/guards/isMobilePLPChatPlacementParameter.ts +3 -1
  446. package/src/application/models/guards/isSpanxTakeAQuizCtaParameter.ts +3 -5
  447. package/src/application/models/guards/isVariantInfo.ts +1 -6
  448. package/src/application/models/index.ts +95 -30
  449. package/src/application/models/localStorageEventListener.ts +4 -0
  450. package/src/{types/Message.ts → application/models/message.ts} +34 -38
  451. package/src/application/models/mobilePLPChatPlacementParameter.ts +3 -0
  452. package/src/application/models/orgsEnum.ts +36 -0
  453. package/src/application/models/productExperiment.ts +5 -0
  454. package/src/application/models/spanxTakeAQuizCtaParameter.ts +4 -0
  455. package/src/application/models/spiffyWidgets.ts +16 -0
  456. package/src/application/models/utilityTypes/camelCase.ts +87 -0
  457. package/src/application/models/utilityTypes/camelCasedPropertiesDeep.ts +80 -0
  458. package/src/application/models/utilityTypes/delimiterCase.ts +121 -0
  459. package/src/application/models/utilityTypes/delimiterCasedPropertiesDeep.ts +98 -0
  460. package/src/application/models/utilityTypes/index.ts +1 -0
  461. package/src/application/models/utilityTypes/internal.ts +93 -0
  462. package/src/application/models/utilityTypes/primitive.ts +8 -0
  463. package/src/application/models/utilityTypes/snakeCasedPropertiesDeep.ts +49 -0
  464. package/src/application/models/utilityTypes/splitWords.ts +76 -0
  465. package/src/application/models/utilityTypes/trim.ts +28 -0
  466. package/src/application/models/utilityTypes/unknownArray.ts +25 -0
  467. package/src/application/models/utils/snakeToCamelTransformer.ts +8 -8
  468. package/src/application/models/validators/validateGraphQLColorsConfig.ts +2 -6
  469. package/src/application/models/validators/validateGraphQLFrontendConfig.ts +6 -6
  470. package/src/application/models/validators/validateMobilePLPChatPlacementParameter.ts +3 -5
  471. package/src/application/models/validators/validateOrgConfigResults.ts +5 -6
  472. package/src/application/models/validators/validateOrganizationConfig.ts +8 -11
  473. package/src/application/models/validators/validateResponse.ts +44 -66
  474. package/src/application/models/validators/validateSuggestion.ts +1 -1
  475. package/src/application/models/validators/validateUserEvent.ts +12 -23
  476. package/src/application/models/variantInfo/index.ts +1 -0
  477. package/src/application/models/variantInfo/pageVisitInfo.ts +6 -0
  478. package/src/application/models/variantInfo/plpInfo.ts +3 -0
  479. package/src/application/models/variantInfo/productInfo.ts +5 -0
  480. package/src/application/models/variantInfo/variantInfo.ts +29 -0
  481. package/src/application/utils/__tests__/divideArrays.test.ts +14 -0
  482. package/src/application/utils/analyticsUtils.ts +8 -1
  483. package/src/application/utils/cdnUtils.ts +11 -0
  484. package/src/application/utils/coreContextToApiContext.ts +1 -3
  485. package/src/application/utils/coreUserEventToApiUserEvent.ts +2 -2
  486. package/src/application/utils/elementObserver.ts +1 -1
  487. package/src/application/utils/imageFilter.ts +2 -5
  488. package/src/application/utils/index.ts +21 -20
  489. package/src/application/utils/messageFromFormSubmittedEvent.ts +1 -1
  490. package/src/application/utils/messageFromQueryEvent.ts +1 -1
  491. package/src/application/utils/messageFromResponse.ts +10 -14
  492. package/src/application/utils/messageFromSuggestionEvent.ts +4 -6
  493. package/src/application/utils/mouseEventTypes.ts +1 -1
  494. package/src/application/utils/nextMessageRequestToApiRequest.ts +1 -1
  495. package/src/application/utils/overrides.ts +49 -1
  496. package/src/application/utils/supportedEventRequestToApiRequest.ts +1 -3
  497. package/src/application/utils/urlsParser.ts +7 -1
  498. package/src/atoms/amplitude/amplitudeTrackEventAtom.ts +1 -1
  499. package/src/atoms/app/index.ts +25 -15
  500. package/src/atoms/app/variant.ts +1 -1
  501. package/src/atoms/chat/chatState.ts +4 -4
  502. package/src/atoms/chat/form.ts +1 -1
  503. package/src/atoms/chat/messageQueue.ts +50 -25
  504. package/src/atoms/chat/replies.ts +2 -1
  505. package/src/atoms/chat/suggestions.ts +29 -34
  506. package/src/atoms/envive/enviveConfig.ts +20 -14
  507. package/src/atoms/org/customerService.ts +8 -4
  508. package/src/atoms/org/graphqlConfig.ts +15 -7
  509. package/src/atoms/org/index.ts +6 -4
  510. package/src/atoms/org/newOrgConfigAtom.ts +2 -2
  511. package/src/atoms/org/orgAnalyticsConfig.ts +1 -1
  512. package/src/atoms/search/chatSearch.ts +317 -0
  513. package/src/atoms/search/index.ts +1 -0
  514. package/src/atoms/search/productFilters.ts +52 -72
  515. package/src/atoms/search/productSorter.ts +2 -2
  516. package/src/atoms/search/searchAPI.ts +60 -42
  517. package/src/atoms/search/searchServiceAdapter.ts +1 -1
  518. package/src/atoms/search/types.ts +55 -0
  519. package/src/config/divIds.ts +27 -0
  520. package/src/config/socialProofClasses.ts +17 -0
  521. package/src/contexts/amplitudeContext/amplitudeContext.tsx +57 -19
  522. package/src/contexts/cdnContext/cdnContext.tsx +6 -1
  523. package/src/contexts/chatContext/chatContext.tsx +509 -0
  524. package/src/contexts/chatContext/index.ts +1 -0
  525. package/src/contexts/enviveConfigContext/enviveConfigContext.tsx +26 -12
  526. package/src/contexts/enviveCssContext/enviveCssContext.tsx +12 -5
  527. package/src/contexts/featureFlagContext/featureFlagContext.tsx +48 -27
  528. package/src/contexts/featureFlagServiceContext/featureFlagServiceContext.tsx +3 -11
  529. package/src/contexts/graphqlContext/graphqlContext.tsx +95 -40
  530. package/src/contexts/localStorageContext/localStorageContext.tsx +60 -26
  531. package/src/contexts/newOrgConfigContext/newOrgConfigContext.tsx +22 -10
  532. package/src/contexts/searchContext/searchContext.tsx +49 -29
  533. package/src/contexts/sessionStorageContext/sessionStorageContext.tsx +33 -12
  534. package/src/contexts/shopifyUrlContext/shopifyUrlContext.tsx +37 -20
  535. package/src/contexts/systemSettingsContext/systemSettingsContext.tsx +21 -8
  536. package/src/contexts/types.ts +1067 -0
  537. package/src/contexts/userIdentityContext/userIdentityContext.tsx +77 -33
  538. package/src/events/event-types.ts +11 -0
  539. package/src/events/index.ts +5 -8
  540. package/src/events/registerAnalyticsListeners.ts +13 -10
  541. package/src/hooks/AmplitudeOperations/useAmplitudeOperations.ts +11 -6
  542. package/src/hooks/AppDetails/useAppDetails.ts +24 -10
  543. package/src/hooks/ChatToggle/useChatToggle.ts +19 -7
  544. package/src/hooks/ChatToggleAnalytics/useChatToggleAnalytics.ts +4 -4
  545. package/src/hooks/CustomerSupportHandoff/useCustomerSupportHandoff.ts +1 -1
  546. package/src/hooks/ElementObserver/useElementObserver.ts +32 -14
  547. package/src/hooks/FloatingButtonVisibility/index.ts +1 -0
  548. package/src/hooks/FloatingButtonVisibility/useFloatingButtonVisibility.ts +99 -0
  549. package/src/hooks/GrabAndScroll/useGrabAndScroll.ts +124 -125
  550. package/src/hooks/GraphQLConfig/useGraphQLConfig.ts +7 -5
  551. package/src/hooks/ImageResolver/useImageResolver.ts +31 -24
  552. package/src/hooks/LastInteraction/index.ts +1 -0
  553. package/src/hooks/LastInteraction/useLastInteraction.ts +42 -0
  554. package/src/hooks/LocalStorageOperations/useLocalStorageOperations.ts +19 -12
  555. package/src/hooks/MessageFilter/useMessageFilter.ts +7 -1
  556. package/src/hooks/Search/useSearch.tsx +217 -87
  557. package/src/hooks/SearchOperations/useSearchOperations.ts +12 -8
  558. package/src/hooks/ShopifyUrlOperations/useShopifyUrlOperations.ts +14 -8
  559. package/src/hooks/SnapCalculator/useSnapCalculator.ts +2 -1
  560. package/src/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent.ts +11 -8
  561. package/src/hooks/UpdateAnalyticsProps/useUpdateAnalyticsProps.ts +25 -11
  562. package/src/hooks/utils.ts +29 -19
  563. package/src/interceptors/index.ts +2 -1
  564. package/src/interceptors/types.ts +6 -0
  565. package/src/interceptors/useMessageInterceptor.ts +6 -10
  566. package/src/merchants/domInsertion.ts +30 -0
  567. package/src/merchants/gridInsertion.ts +19 -0
  568. package/src/types/config-versions.ts +6 -0
  569. package/src/types/customerService.ts +31 -0
  570. package/src/types/custservice-types.ts +28 -0
  571. package/src/{exceptions → types/exceptions}/unsupportedProductExceptions.ts +2 -2
  572. package/src/types/floatingbuttonoverrides-types.ts +10 -0
  573. package/src/types/index.ts +5 -4
  574. package/src/types/search-filter-types.ts +111 -0
  575. package/src/types/suggestionBarV2-types.ts +4 -0
  576. package/src/types/test-types.ts +3 -0
  577. package/src/types.ts +11 -0
  578. package/dist/AmplitudeOperations-6Y7GejD-.cjs +0 -41
  579. package/dist/AmplitudeOperations-DOEgdx-a.js +0 -34
  580. package/dist/TrackComponentVisibleEvent-BvDOoSsc.js +0 -53
  581. package/dist/TrackComponentVisibleEvent-CcZ6l_cs.cjs +0 -60
  582. package/dist/amplitudeContext-CH-Rtn8y.js +0 -236
  583. package/dist/amplitudeContext-CZXdr3HG.cjs +0 -252
  584. package/dist/amplitudeTrackEventAtom-D66l5oFp.js +0 -8
  585. package/dist/amplitudeTrackEventAtom-f22P2U0u.cjs +0 -15
  586. package/dist/api-D4HaU2Gf.js +0 -166
  587. package/dist/api-D4Xoibs9.cjs +0 -239
  588. package/dist/app-DEnOfim0.js +0 -515
  589. package/dist/app-DOEeLKrt.cjs +0 -570
  590. package/dist/cdnContext-CJ2BNLAD.js +0 -38
  591. package/dist/cdnContext-lkC-AE6A.cjs +0 -53
  592. package/dist/chat-ChbwDr7k.js +0 -226
  593. package/dist/chat-FCaaEJvJ.cjs +0 -326
  594. package/dist/chatState-BbI93m6r.js +0 -33
  595. package/dist/chatState-DlJpHAsW.cjs +0 -119
  596. package/dist/dist-C38adNK1.js +0 -5923
  597. package/dist/dist-VxRI6eQv.cjs +0 -6019
  598. package/dist/domObserver-DNeeSh1F.js +0 -285
  599. package/dist/enviveConfig-Ciq4ASoV.js +0 -62
  600. package/dist/enviveConfig-Dp80h9yu.cjs +0 -130
  601. package/dist/enviveConfigContext-0PQkfMQ6.cjs +0 -62
  602. package/dist/enviveConfigContext-CMDiVsln.js +0 -47
  603. package/dist/events-CgFGtanE.cjs +0 -69
  604. package/dist/events-WOOrnUAx.js +0 -63
  605. package/dist/exceptions/index.cjs +0 -4
  606. package/dist/exceptions/index.d.cts +0 -12
  607. package/dist/exceptions/index.d.ts +0 -12
  608. package/dist/exceptions/index.js +0 -3
  609. package/dist/exceptions-BjDgLzGi.cjs +0 -32
  610. package/dist/exceptions-CUGY31Ua.js +0 -20
  611. package/dist/featureFlagServiceContext-ClnlCJV5.d.cts +0 -24
  612. package/dist/featureFlagServiceContext-Cvp7NlpC.js +0 -46
  613. package/dist/featureFlagServiceContext-CyPGEe2d.d.ts +0 -24
  614. package/dist/featureFlagServiceContext-DHtkQAtq.cjs +0 -66
  615. package/dist/graphql-CvAHWmel.js +0 -46
  616. package/dist/graphql-JaGqsToc.cjs +0 -70
  617. package/dist/graphqlContext-0cg9fEUw.js +0 -96
  618. package/dist/graphqlContext-ChXlE8Ul.cjs +0 -111
  619. package/dist/index-5li6ZMDu.d.ts +0 -11
  620. package/dist/index-BVZbvpx_.d.cts +0 -11
  621. package/dist/index-CMZcE7pk.d.cts +0 -224
  622. package/dist/index-CuihhoIF.d.ts +0 -42
  623. package/dist/index-bEjLKG_Q.d.ts +0 -224
  624. package/dist/index-qOBU4GEh.d.cts +0 -42
  625. package/dist/localStorageContext-BFwvuEcf.js +0 -90
  626. package/dist/localStorageContext-CWc5xJ6U.cjs +0 -104
  627. package/dist/models-Cw0QcbQv.js +0 -1118
  628. package/dist/models-Dl0_Ujgj.cjs +0 -1305
  629. package/dist/newOrgConfigAtom-BuQE_zPK.js +0 -8
  630. package/dist/newOrgConfigContext-D-gU5ppl.js +0 -53
  631. package/dist/newOrgConfigContext-d3RHl430.cjs +0 -68
  632. package/dist/nodeSelector-BAKg1h_y.d.ts +0 -28
  633. package/dist/nodeSelector-BYEAyrsj.d.cts +0 -28
  634. package/dist/org-15F128Ah.js +0 -32
  635. package/dist/org-CIFgIcO4.cjs +0 -111
  636. package/dist/search--80x6CfL.js +0 -233
  637. package/dist/search-Ch6LKNh4.cjs +0 -312
  638. package/dist/searchContext-CSmiMhhs.js +0 -129
  639. package/dist/searchContext-DuB2drQx.cjs +0 -145
  640. package/dist/searchServiceAdapter-B0h7psvh.js +0 -16
  641. package/dist/searchServiceAdapter-BclWy4fE.cjs +0 -34
  642. package/dist/sessionStorageContext-BuWrJQwc.cjs +0 -66
  643. package/dist/sessionStorageContext-DvFHbk81.js +0 -52
  644. package/dist/shopifyUrlContext-Bw1kAZ2P.cjs +0 -75
  645. package/dist/shopifyUrlContext-DnJiUmMA.js +0 -61
  646. package/dist/systemSettingsContext-CyanI1pd.js +0 -39
  647. package/dist/systemSettingsContext-sM46G65r.cjs +0 -60
  648. package/dist/types-1iJ_FnQQ.cjs +0 -39
  649. package/dist/types-D5du68Vp.js +0 -27
  650. package/dist/urlsParser-bb8ciRFg.cjs +0 -78
  651. package/dist/urlsParser-v_1DKvyf.js +0 -42
  652. package/dist/useAppDetails-Ce_siNC2.js +0 -30
  653. package/dist/useAppDetails-Dyn-dAJJ.cjs +0 -38
  654. package/dist/useGraphQLConfig-Btszi6cG.js +0 -63
  655. package/dist/useGraphQLConfig-v9veUbvJ.cjs +0 -76
  656. package/dist/utils-BZT_oZ3n.js +0 -92
  657. package/dist/utils-BzR9AjY0.js +0 -607
  658. package/dist/utils-CLANMl4P.cjs +0 -716
  659. package/dist/utils-qtHPLFby.cjs +0 -130
  660. package/src/atoms/search/productRetrievalAPI.ts +0 -72
  661. package/src/atoms/search/productRetrievalAdapter.ts +0 -28
  662. package/src/exceptions/index.ts +0 -2
  663. package/src/global.d.ts +0 -8
  664. package/src/hooks/Search/useRecommendedProducts.ts +0 -50
  665. package/src/hooks/Search/useSearchInput.ts +0 -237
  666. package/src/types/FilterAttribute.ts +0 -35
  667. package/src/types/Suggestion.ts +0 -6
  668. package/src/util/colorVar.ts +0 -4
  669. package/src/util/configVersion.ts +0 -4
  670. package/src/util/domInsertion.ts +0 -17
  671. /package/dist/{featureFlagServiceContext-Csgo-MUv.cjs → AmplitudeOperations-DxQnurSG.cjs} +0 -0
  672. /package/dist/{featureFlagServiceContext-CISyb90N.js → AmplitudeOperations-ni7wVevx.js} +0 -0
  673. /package/src/{exceptions → types/exceptions}/sessionExceptions.ts +0 -0
@@ -0,0 +1,1296 @@
1
+ import { PageVariantTestType } from "./types-CtUb63bt.js";
2
+ import { hasPropertyOfType } from "./utils-DIvMgPe8.js";
3
+ import { isApiPDPAttributes, isApiProductResponseAttributes, isApiProductSearchResponseAttributes, isApiQueryTypedAttributes, isApiResponse, isApiReviewResponseAttributes, isApiSearchAttributes, isApiSuggestionClickedAttributes, isApiTextResponseAttributes, isApiUserEvent, isSuggestion } from "./api-BWSsazAG.js";
4
+ import { logger_default } from "./logger-W3lqg-4b.js";
5
+ import { FormType, FulfillmentDisplayStatus, OrganizationStatusEnum, PLPAttributeCategory, PageVisitCategory, ResponseCategory, UserEventCategory } from "@spiffy-ai/commerce-api-client";
6
+
7
+ //#region src/application/models/chatElementDisplayLocation.ts
8
+ let ChatElementDisplayLocation = /* @__PURE__ */ function(ChatElementDisplayLocation$1) {
9
+ ChatElementDisplayLocation$1["IN_CHAT"] = "in_chat";
10
+ ChatElementDisplayLocation$1["CHAT_PREVIEW"] = "chat_preview";
11
+ ChatElementDisplayLocation$1["FLOATING_BUTTON"] = "floating_button";
12
+ ChatElementDisplayLocation$1["HELP_ME_CHOOSE"] = "help_me_choose";
13
+ ChatElementDisplayLocation$1["PLP_IMAGE_BANNER"] = "plp_image_banner";
14
+ ChatElementDisplayLocation$1["TOP_REVIEWS_SNIPPET"] = "top_reviews_snippet";
15
+ ChatElementDisplayLocation$1["BOTTOM_REVIEWS_SNIPPET"] = "bottom_reviews_snippet";
16
+ ChatElementDisplayLocation$1["BLOCK_BACK_BUTTON"] = "block_back_button";
17
+ ChatElementDisplayLocation$1["SWITCH_TO_AGENT"] = "switch_to_agent";
18
+ ChatElementDisplayLocation$1["CONVERSATIONAL_SEARCH"] = "conversational_search";
19
+ ChatElementDisplayLocation$1["GLOBAL_SEARCH_ENTRYPOINT"] = "global_search_entrypoint";
20
+ ChatElementDisplayLocation$1["SEARCH_NAV_ENTRYPOINT"] = "search_nav_entrypoint";
21
+ ChatElementDisplayLocation$1["SEARCH_PROMPT"] = "search_prompt";
22
+ ChatElementDisplayLocation$1["SEARCH_PROMPT_BUTTON"] = "search_prompt_button";
23
+ ChatElementDisplayLocation$1["PRODUCT_GRID"] = "product_grid";
24
+ ChatElementDisplayLocation$1["UNSPECIFIED"] = "unspecified";
25
+ ChatElementDisplayLocation$1["FILTER_MODAL"] = "filter_modal";
26
+ ChatElementDisplayLocation$1["PROMPT_CARD"] = "prompt_card";
27
+ ChatElementDisplayLocation$1["WINDOW_API_CALL"] = "window_api_call";
28
+ return ChatElementDisplayLocation$1;
29
+ }({});
30
+
31
+ //#endregion
32
+ //#region src/application/models/events.ts
33
+ let SpiffyEventName = /* @__PURE__ */ function(SpiffyEventName$1) {
34
+ SpiffyEventName$1["WidgetOpen"] = "spiffy:widgetopen";
35
+ SpiffyEventName$1["WidgetClose"] = "spiffy:widgetclose";
36
+ return SpiffyEventName$1;
37
+ }({});
38
+
39
+ //#endregion
40
+ //#region src/application/models/googleAnalyticsEvents.ts
41
+ var GoogleAnalyticsEvents = /* @__PURE__ */ function(GoogleAnalyticsEvents$1) {
42
+ GoogleAnalyticsEvents$1["ADD_TO_CART_v1"] = "add_to_cart";
43
+ GoogleAnalyticsEvents$1["ADD_TO_CART_v2"] = "addToCart";
44
+ return GoogleAnalyticsEvents$1;
45
+ }(GoogleAnalyticsEvents || {});
46
+
47
+ //#endregion
48
+ //#region src/application/models/message.ts
49
+ let MessageRole = /* @__PURE__ */ function(MessageRole$1) {
50
+ MessageRole$1["User"] = "user";
51
+ MessageRole$1["Assistant"] = "assistant";
52
+ return MessageRole$1;
53
+ }({});
54
+ let MessageType = /* @__PURE__ */ function(MessageType$1) {
55
+ MessageType$1["Text"] = "text";
56
+ MessageType$1["SuggestionClicked"] = "suggestion_clicked";
57
+ MessageType$1["Product"] = "product";
58
+ MessageType$1["ProductSearch"] = "product_search";
59
+ MessageType$1["Review"] = "review";
60
+ MessageType$1["QueryTyped"] = "query_typed";
61
+ MessageType$1["Separator"] = "separator";
62
+ MessageType$1["Page"] = "page";
63
+ MessageType$1["Search"] = "search";
64
+ MessageType$1["Attachment"] = "attachment";
65
+ MessageType$1["CXAgentResponse"] = "cx_agent_response";
66
+ MessageType$1["Form"] = "form";
67
+ MessageType$1["Order"] = "order";
68
+ MessageType$1["ProductSearchFilter"] = "product_search_filter";
69
+ return MessageType$1;
70
+ }({});
71
+
72
+ //#endregion
73
+ //#region src/application/models/orgsEnum.ts
74
+ const OrgShortName = {
75
+ Coterie: "coterie",
76
+ ForLoveAndLemons: "for-love-and-lemons",
77
+ Greenpan: "greenpan",
78
+ JordanCraig: "jordan-craig",
79
+ LarryAndSerges: "larry_and_serges",
80
+ LeapsAndRebounds: "leaps-and-rebounds",
81
+ MantraBrand: "mantra-brand",
82
+ Spanx: "spanx",
83
+ SpanxStaging: "staging-spanx",
84
+ Supergoop: "supergoop",
85
+ UniqueVintage: "unique-vintage",
86
+ JackArcher: "jack-archer",
87
+ SkinPerfection: "skin-perfection",
88
+ LookOptic: "look-optic",
89
+ FiveCbd: "five-cbd",
90
+ SnapSupplements: "snap-supplements",
91
+ Longevityrx: "longevityrx",
92
+ VenaCbd: "vena-cbd",
93
+ Medterra: "medterra",
94
+ Modells: "modells",
95
+ PressedFloral: "pressed-floral",
96
+ KindredBravely: "kindred-bravely",
97
+ WineEnthusiast: "wine-enthusiast",
98
+ HomegrownCannabis: "homegrown-cannabis",
99
+ DreamlandBaby: "dreamland-baby",
100
+ Bandolier: "bandolier",
101
+ WestonJonBoucher: "weston-jon-boucher",
102
+ KutFromTheKloth: "kut-from-the-kloth",
103
+ GrooveLife: "groove-life",
104
+ Carpe: "carpe",
105
+ WolfTactical: "wolf-tactical",
106
+ WolfMattress: "wolfmattress",
107
+ Default: "default"
108
+ };
109
+
110
+ //#endregion
111
+ //#region src/application/models/productExperiment.ts
112
+ let ProductExperiment = /* @__PURE__ */ function(ProductExperiment$1) {
113
+ ProductExperiment$1["Default"] = "default";
114
+ return ProductExperiment$1;
115
+ }({});
116
+
117
+ //#endregion
118
+ //#region src/application/models/spiffyWidgets.ts
119
+ /**
120
+ * Enum of all widget names. These are widgets that are rendered and integrated into
121
+ * a merchant's website.
122
+ */
123
+ let SpiffyWidgets = /* @__PURE__ */ function(SpiffyWidgets$1) {
124
+ SpiffyWidgets$1["ImageBanner"] = "image_banner";
125
+ SpiffyWidgets$1["ImagePromptCard"] = "image_prompt_card";
126
+ SpiffyWidgets$1["SingleImagePrompt"] = "single_image_prompt";
127
+ SpiffyWidgets$1["EmbeddedWidget"] = "embedded_widget";
128
+ SpiffyWidgets$1["FloatingButton"] = "floating_button";
129
+ SpiffyWidgets$1["SuggestionBar"] = "suggestion_bar";
130
+ SpiffyWidgets$1["SearchPrompt"] = "search_prompt";
131
+ SpiffyWidgets$1["GlobalSearch"] = "global_search";
132
+ SpiffyWidgets$1["SearchResults"] = "search_results";
133
+ SpiffyWidgets$1["GlobalSearchEntryPoint"] = "global_search_entry_point";
134
+ return SpiffyWidgets$1;
135
+ }({});
136
+
137
+ //#endregion
138
+ //#region src/application/models/graphql/queries/getMerchantOrgIdQuery.ts
139
+ const getMerchantOrgIdQuery = `
140
+ query {
141
+ me {
142
+ org {
143
+ id
144
+ }
145
+ }
146
+ }
147
+ `;
148
+
149
+ //#endregion
150
+ //#region src/application/models/guards/isBaseEcommerceEvent.ts
151
+ /**
152
+ * Checks if an event is a base Google Analytics ecommerce event.
153
+ *
154
+ * @param data The event to check.
155
+ *
156
+ * @returns True if the event is a base ecommerce event, false otherwise.
157
+ */
158
+ const isBaseEcommerceEvent = (data) => data != null && typeof data === "object" && "ecommerce" in data && data.ecommerce != null && typeof data.ecommerce === "object" && "event" in data && typeof data.event === "string";
159
+
160
+ //#endregion
161
+ //#region src/application/models/guards/isGA4EcommerceEvent.ts
162
+ /**
163
+ * Checks if an event is a Google Analytics 4 ecommerce event.
164
+ *
165
+ * @param data The event to check.
166
+ *
167
+ * @returns True if the event is a GA4 ecommerce event, false otherwise.
168
+ */
169
+ const isGA4EcommerceEvent = (data) => typeof data === "object" && data != null && "ecommerce" in data && data.ecommerce != null && typeof data.ecommerce === "object" && "items" in data.ecommerce && Array.isArray(data.ecommerce.items);
170
+
171
+ //#endregion
172
+ //#region src/application/models/guards/isLegacyUAEcommerceEvent.ts
173
+ /**
174
+ * Checks if an event is a legacy Universal Analytics ecommerce event.
175
+ *
176
+ * @param data The event to check.
177
+ *
178
+ * @returns True if the event is a legacy UA ecommerce event, false otherwise.
179
+ */
180
+ const isLegacyUAEcommerceEvent = (data) => data != null && typeof data === "object" && "ecommerce" in data && data.ecommerce != null && typeof data.ecommerce === "object" && "add" in data.ecommerce && typeof data.ecommerce.add === "object";
181
+
182
+ //#endregion
183
+ //#region src/application/models/guards/isMobilePLPChatPlacementParameter.ts
184
+ const isMobilePLPChatPlacementParameter = (value) => value != null && typeof value === "object" && "row_index" in value && typeof value.row_index === "number";
185
+
186
+ //#endregion
187
+ //#region src/application/models/guards/isSpanxTakeAQuizCtaParameter.ts
188
+ const isSpanxTakeAQuizCtaParameter = (value) => value != null && typeof value === "object" && "text" in value && typeof value.text === "string";
189
+
190
+ //#endregion
191
+ //#region src/application/models/guards/isVariantInfo.ts
192
+ const isPDPVariantInfo = (variantInfo) => "variant" in variantInfo && variantInfo.variant === "pdp" && "productId" in variantInfo && typeof variantInfo.productId === "string";
193
+ const isPLPVariantInfo = (variantInfo) => "variant" in variantInfo && variantInfo.variant === "plp" && "plpId" in variantInfo && typeof variantInfo.plpId === "string";
194
+ const isPageVisitVariantInfo = (variantInfo) => "variant" in variantInfo && variantInfo.variant === "page_visit" && "url" in variantInfo && typeof variantInfo.url === "string" && "pageVisitCategory" in variantInfo && Object.values(PageVisitCategory).includes(variantInfo.pageVisitCategory);
195
+ /**
196
+ * Type guard to check if an object is a valid VariantInfo.
197
+ *
198
+ * @param variantInfo - The unknown object to check.
199
+ *
200
+ * @returns True if the data is a valid VariantInfo object, false otherwise.
201
+ */
202
+ const isVariantInfo = (variantInfo) => variantInfo != null && typeof variantInfo === "object" && "variantId" in variantInfo && (isPDPVariantInfo(variantInfo) || isPLPVariantInfo(variantInfo) || isPageVisitVariantInfo(variantInfo));
203
+
204
+ //#endregion
205
+ //#region src/application/models/guards/api/isApiFormResponse.ts
206
+ /**
207
+ * Type guard to check if the provided data has the all of the properties (with the correct types) of
208
+ * a FormResponseAttribute
209
+ *
210
+ * @param data - The data to check
211
+ *
212
+ * @returns true if the data has the correct properties, false otherwise
213
+ */
214
+ const isApiFormResponseAttributes = (data) => {
215
+ if (data == null || typeof data !== "object") {
216
+ logger_default.logError("isApiFormResponseAttributes: data is null or not an object", void 0, { data });
217
+ return false;
218
+ }
219
+ if ("form_category" in data && typeof data.form_category !== "object") {
220
+ logger_default.logError("isApiFormResponseAttributes: form_category is not an object", void 0, { data });
221
+ return false;
222
+ }
223
+ if ("form_category" in data && typeof data.form_category === "object") {
224
+ if (!hasPropertyOfType(data.form_category, "form_type", "string") || !Object.values(FormType).includes(data.form_category.form_type)) {
225
+ logger_default.logError("isApiFormResponseAttributes: form_type is missing or not a valid form type", void 0, { data });
226
+ return false;
227
+ }
228
+ }
229
+ if (!hasPropertyOfType(data, "schema", "object")) {
230
+ logger_default.logError("isApiFormResponseAttributes: schema is missing or not an object", void 0, { data });
231
+ return false;
232
+ }
233
+ if (!hasPropertyOfType(data.schema, "properties", "object")) {
234
+ logger_default.logError("isApiFormResponseAttributes: schema.properties is missing or not an object", void 0, { data });
235
+ return false;
236
+ }
237
+ if (!hasPropertyOfType(data.schema, "required", "array")) {
238
+ logger_default.logError("isApiFormResponseAttributes: schema.required is missing or not an array", void 0, { data });
239
+ return false;
240
+ }
241
+ if (!data.schema.required.every((key) => typeof key === "string" && key in data.schema.properties)) {
242
+ logger_default.logError("isApiFormResponseAttributes: schema.required contains invalid property keys", void 0, { data });
243
+ return false;
244
+ }
245
+ return true;
246
+ };
247
+
248
+ //#endregion
249
+ //#region src/application/models/guards/api/isApiFormSubmittedResponseAttributes.ts
250
+ const isApiFormSubmittedResponseAttributes = (data) => {
251
+ if (data == null || typeof data !== "object") {
252
+ logger_default.logError("isApiFormSubmittedResponseAttributes", "data is null or not an object", data);
253
+ return false;
254
+ }
255
+ if (!hasPropertyOfType(data, "filled_schema", "object")) {
256
+ logger_default.logError("isApiFormSubmittedResponseAttributes", "filled_schema is not an object", data);
257
+ return false;
258
+ }
259
+ if (!hasPropertyOfType(data, "form_response_id", "string")) {
260
+ logger_default.logError("isApiFormSubmittedResponseAttributes", "form_response_id is not a string", data);
261
+ return false;
262
+ }
263
+ if (!("form_type" in data) || !Object.values(FormType).includes(data.form_type)) {
264
+ logger_default.logError("isApiFormSubmittedResponseAttributes", "form_type is not a valid form type enum", data);
265
+ return false;
266
+ }
267
+ return true;
268
+ };
269
+
270
+ //#endregion
271
+ //#region src/application/models/guards/api/isApiOrderResponseAttributes.ts
272
+ const isApiOrderItemInfo = (data) => {
273
+ if (data == null || typeof data !== "object") {
274
+ logger_default.logError("OrderItemInfo must be an object", void 0, { data });
275
+ return false;
276
+ }
277
+ if (!hasPropertyOfType(data, "order_item_id", "string")) {
278
+ logger_default.logError("OrderItemInfo must have an order_item_id property", void 0, { data });
279
+ return false;
280
+ }
281
+ if (!hasPropertyOfType(data, "item_title", "string")) {
282
+ logger_default.logError("OrderItemInfo must have an item_title property", void 0, { data });
283
+ return false;
284
+ }
285
+ if (!hasPropertyOfType(data, "item_price", "number")) {
286
+ logger_default.logError("OrderItemInfo must have an item_price property", void 0, { data });
287
+ return false;
288
+ }
289
+ if (!hasPropertyOfType(data, "item_quantity", "number")) {
290
+ logger_default.logError("OrderItemInfo must have an item_quantity property", void 0, { data });
291
+ return false;
292
+ }
293
+ if (!hasPropertyOfType(data, "image", "string", true)) {
294
+ logger_default.logError("OrderItemInfo.image must be a string or null", void 0, { data });
295
+ return false;
296
+ }
297
+ if (!hasPropertyOfType(data, "fulfillment_display_status", "string", true)) {
298
+ logger_default.logError("OrderItemInfo.fulfillment_display_status must be a string or null", void 0, { data });
299
+ return false;
300
+ }
301
+ if (!hasPropertyOfType(data, "tracking_url", "string", true)) {
302
+ logger_default.logError("OrderItemInfo.tracking_url must be a string or null", void 0, { data });
303
+ return false;
304
+ }
305
+ if (!hasPropertyOfType(data, "delivered_at", "string", true)) {
306
+ logger_default.logError("OrderItemInfo.delivered_at must be a string or null", void 0, { data });
307
+ return false;
308
+ }
309
+ if (!hasPropertyOfType(data, "estimated_delivery_at", "string", true)) {
310
+ logger_default.logError("OrderItemInfo.estimated_delivery_at must be a string or null", void 0, { data });
311
+ return false;
312
+ }
313
+ if (!hasPropertyOfType(data, "in_transit_at", "string", true)) {
314
+ logger_default.logError("OrderItemInfo.in_transit_at must be a string or null", void 0, { data });
315
+ return false;
316
+ }
317
+ return true;
318
+ };
319
+ const isApiOrderResponseAttributes = (data) => {
320
+ if (data == null || typeof data !== "object") {
321
+ logger_default.logError("Order response attributes must be an object", void 0, { data });
322
+ return false;
323
+ }
324
+ if (!hasPropertyOfType(data, "created_at", "string")) {
325
+ logger_default.logError("Order response attributes must have a created_at property and have type string", void 0, { data });
326
+ return false;
327
+ }
328
+ if (!hasPropertyOfType(data, "latest_event_date", "string")) {
329
+ logger_default.logError("Order response attributes must have a latest_event_date property and have type string", void 0, { data });
330
+ return false;
331
+ }
332
+ if (!hasPropertyOfType(data, "line_items", "array") || !data.line_items.every((item) => isApiOrderItemInfo(item))) {
333
+ logger_default.logError("Order response attributes must have a line_items property with at least one order item", void 0, { data });
334
+ return false;
335
+ }
336
+ if (!hasPropertyOfType(data, "order_id", "string")) {
337
+ logger_default.logError("Order response attributes must have an order_id property and have type string", void 0, { data });
338
+ return false;
339
+ }
340
+ if (!hasPropertyOfType(data, "order_number", "string")) {
341
+ logger_default.logError("Order response attributes must have an order_number property and have type string", void 0, { data });
342
+ return false;
343
+ }
344
+ return true;
345
+ };
346
+
347
+ //#endregion
348
+ //#region src/application/models/guards/api/isApiOrganizationConfig.ts
349
+ const isApiOrgAnalyticsConfigAmplitude = (data) => {
350
+ if (data == null || typeof data !== "object") {
351
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: data is not an object", data);
352
+ return false;
353
+ }
354
+ if (!("session_replay_enabled" in data) || typeof data.session_replay_enabled !== "boolean") {
355
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: session_replay_enabled is not a boolean", data);
356
+ return false;
357
+ }
358
+ if (!("session_replay_sample_rate" in data) || typeof data.session_replay_sample_rate !== "number") {
359
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: session_replay_sample_rate is not a number", data);
360
+ return false;
361
+ }
362
+ if (!("tracking_enabled" in data) || typeof data.tracking_enabled !== "boolean") {
363
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: tracking_enabled is not a boolean", data);
364
+ return false;
365
+ }
366
+ return true;
367
+ };
368
+ const isApiOrgAnalyticsConfigCustomerService = (data) => {
369
+ if (data == null || typeof data !== "object") {
370
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigCustomerService: data is not an object", data);
371
+ return false;
372
+ }
373
+ if (!("provider" in data) || typeof data.provider !== "string") {
374
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigCustomerService: provider is not a string", data);
375
+ return false;
376
+ }
377
+ return true;
378
+ };
379
+ const isApiOrgAnalyticsConfigGoogleAnalytics = (data) => {
380
+ if (data == null || typeof data !== "object") {
381
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigGoogleAnalytics: data is not an object", data);
382
+ return false;
383
+ }
384
+ if (!("measurement_id" in data) || typeof data.measurement_id !== "string") {
385
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigGoogleAnalytics: measurement_id is not a string", data);
386
+ return false;
387
+ }
388
+ return true;
389
+ };
390
+ /**
391
+ *
392
+ * @param data
393
+ * @returns
394
+ */
395
+ const isApiOrgAnalyticsConfig = (data) => {
396
+ if (data == null || typeof data !== "object") {
397
+ logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: data is not an object", data);
398
+ return false;
399
+ }
400
+ if ("amplitude" in data && !isApiOrgAnalyticsConfigAmplitude(data.amplitude)) {
401
+ logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: amplitude is not an object", data);
402
+ return false;
403
+ }
404
+ if ("customer_service" in data && !isApiOrgAnalyticsConfigCustomerService(data.customer_service)) {
405
+ logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: customer_service is not an object", data);
406
+ return false;
407
+ }
408
+ if ("google_analytics" in data && !isApiOrgAnalyticsConfigGoogleAnalytics(data.google_analytics)) {
409
+ logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: google_analytics is not an object", data);
410
+ return false;
411
+ }
412
+ return true;
413
+ };
414
+ /**
415
+ *
416
+ * @param data
417
+ * @returns
418
+ */
419
+ const isApiOrganizationConfig = (data) => {
420
+ if (data == null || typeof data !== "object") {
421
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: data is not an object", data);
422
+ return false;
423
+ }
424
+ if (!("created_at" in data)) {
425
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: created_at is not defined", data);
426
+ return false;
427
+ }
428
+ if (!("namespace" in data) || typeof data.namespace !== "string") {
429
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: namespace is not a string", data);
430
+ return false;
431
+ }
432
+ if (!("is_latest" in data) || typeof data.is_latest !== "boolean") {
433
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: is_latest is not a boolean", data);
434
+ return false;
435
+ }
436
+ if (!("version" in data) || typeof data.version !== "string") {
437
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: version is not a string", data);
438
+ return false;
439
+ }
440
+ if (!("updated_at" in data)) {
441
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: updated_at is not defined", data);
442
+ return false;
443
+ }
444
+ if (!("config" in data) || typeof data.config !== "object" || !isApiOrgAnalyticsConfig(data.config)) {
445
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: config is not an object", data);
446
+ return false;
447
+ }
448
+ if ("organization_id" in data && typeof data.organization_id !== "string") {
449
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: organization_id is not a string", data);
450
+ return false;
451
+ }
452
+ if ("id" in data && typeof data.id !== "string") {
453
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: id is not a string", data);
454
+ return false;
455
+ }
456
+ return true;
457
+ };
458
+
459
+ //#endregion
460
+ //#region src/application/models/guards/api/isApiOrgConfigResults.ts
461
+ const isApiOrgConfigExperiment = (data) => {
462
+ if (data == null || typeof data !== "object") {
463
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: data is not an object", void 0, { data });
464
+ return false;
465
+ }
466
+ if ("group" in data && typeof data.group !== "string" && data.group !== void 0) {
467
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: group is not a string or undefined", void 0, { data });
468
+ return false;
469
+ }
470
+ if ("group_name" in data && typeof data.group_name !== "string" && data.group_name !== void 0) {
471
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: group_name is not a string", void 0, { data });
472
+ return false;
473
+ }
474
+ if ("name" in data && typeof data.name !== "string" && data.name !== void 0) {
475
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: name is not a string", void 0, { data });
476
+ return false;
477
+ }
478
+ if ("rule_id" in data && typeof data.rule_id !== "string" && data.rule_id !== void 0) {
479
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: rule_id is not a string", void 0, { data });
480
+ return false;
481
+ }
482
+ if ("value" in data && typeof data.value !== "object" && data.value !== void 0) {
483
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: value is not an object", void 0, { data });
484
+ return false;
485
+ }
486
+ return true;
487
+ };
488
+ const isApiOrgConfigFeatureGate = (data) => {
489
+ if (data == null || typeof data !== "object") {
490
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: data is not an object", void 0, { data });
491
+ return false;
492
+ }
493
+ if ("name" in data && typeof data.name !== "string" && data.name !== void 0) {
494
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: name is not a string", void 0, { data });
495
+ return false;
496
+ }
497
+ if ("rule_id" in data && typeof data.rule_id !== "string" && data.rule_id !== void 0) {
498
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: rule_id is not a string", void 0, { data });
499
+ return false;
500
+ }
501
+ if ("value" in data && typeof data.value !== "boolean" && data.value !== void 0) {
502
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: value is not a boolean", void 0, { data });
503
+ return false;
504
+ }
505
+ return true;
506
+ };
507
+ const isApiOrganization = (data) => {
508
+ if (data == null || typeof data !== "object") {
509
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: data is not an object", void 0, { data });
510
+ return false;
511
+ }
512
+ if (!("id" in data) || typeof data.id !== "string") {
513
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: id is not a string", void 0, { data });
514
+ return false;
515
+ }
516
+ if (!("display_name" in data) || typeof data.display_name !== "string") {
517
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: display_name is not a string", void 0, { data });
518
+ return false;
519
+ }
520
+ if (!("domain" in data) || typeof data.domain !== "string") {
521
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: domain is not a string", void 0, { data });
522
+ return false;
523
+ }
524
+ if (!("short_name" in data) || typeof data.short_name !== "string") {
525
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: short_name is not a string", void 0, { data });
526
+ return false;
527
+ }
528
+ if (!("status" in data) || !Object.values(OrganizationStatusEnum).includes(data.status)) {
529
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: status is not a valid OrganizationStatusEnum value", void 0, { data });
530
+ return false;
531
+ }
532
+ if ("created_at" in data && !(data.created_at instanceof Date) && typeof data.created_at !== "string" && data.created_at !== void 0) {
533
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: created_at is not a Date", void 0, { data });
534
+ return false;
535
+ }
536
+ if ("updated_at" in data && !(data.updated_at instanceof Date) && typeof data.updated_at !== "string" && data.updated_at !== void 0) {
537
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: updated_at is not a Date", void 0, { data });
538
+ return false;
539
+ }
540
+ return true;
541
+ };
542
+ const isApiOrgConfigOrganizationSettings = (data) => {
543
+ if (data == null || typeof data !== "object") {
544
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigOrganizationSettings: data is not an object", void 0, { data });
545
+ return false;
546
+ }
547
+ if (!("org" in data) || !isApiOrganization(data.org)) {
548
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigOrganizationSettings: org is not an object", void 0, { data });
549
+ return false;
550
+ }
551
+ return true;
552
+ };
553
+ /**
554
+ *
555
+ * @param data
556
+ * @returns
557
+ */
558
+ const isApiOrgConfigResults = (data) => {
559
+ if (data == null || typeof data !== "object") {
560
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: data is not an object", void 0, { data });
561
+ return false;
562
+ }
563
+ if (!("configs" in data) || !Array.isArray(data.configs) || !data.configs.every((config) => isApiOrganizationConfig(config))) {
564
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: configs is not an array", void 0, { data });
565
+ return false;
566
+ }
567
+ if ("experiments" in data && data.experiments !== void 0 && (!Array.isArray(data.experiments) || !data.experiments.every((exp) => isApiOrgConfigExperiment(exp)))) {
568
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: experiments is not an array or contains invalid items", void 0, { data });
569
+ return false;
570
+ }
571
+ if (!("gates" in data) || !Array.isArray(data.gates) || !data.gates.every((gate) => isApiOrgConfigFeatureGate(gate))) {
572
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: gates is not an array or contains invalid items", void 0, { data });
573
+ return false;
574
+ }
575
+ if (!("org" in data) || !isApiOrgConfigOrganizationSettings(data.org)) {
576
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: org is not an object or has invalid fields", void 0, { data });
577
+ return false;
578
+ }
579
+ return true;
580
+ };
581
+
582
+ //#endregion
583
+ //#region src/application/models/guards/api/isApiPageResponseAttributes.ts
584
+ const isApiPageResponseAttributes = (obj) => {
585
+ if (obj == null || typeof obj !== "object") return false;
586
+ if ("title" in obj && obj.title != null && typeof obj.title !== "string") return false;
587
+ if ("description" in obj && typeof obj.description !== "string") return false;
588
+ if ("url" in obj && typeof obj.url !== "string") return false;
589
+ return true;
590
+ };
591
+
592
+ //#endregion
593
+ //#region src/application/models/guards/api/isApiPLPEventAttributes.ts
594
+ const isApiPLPIdAttribute = (data) => {
595
+ if (data == null || typeof data !== "object") return false;
596
+ if (!("id" in data) || typeof data.id !== "string") return false;
597
+ return true;
598
+ };
599
+ const isApiPLPEventAttributes = (data) => {
600
+ if (data == null || typeof data !== "object") return false;
601
+ if (!("category" in data) || typeof data.category !== "string" || !Object.values(PLPAttributeCategory).includes(data.category)) return false;
602
+ if (!("attributes" in data) || typeof data.attributes !== "object" || !isApiPLPIdAttribute(data.attributes)) return false;
603
+ return true;
604
+ };
605
+
606
+ //#endregion
607
+ //#region src/application/models/guards/api/isApiProductSearchFilterAttributes.ts
608
+ const isApiProductSearchFilterResponseAttributes = (attributes) => {
609
+ if (attributes == null || typeof attributes !== "object") return false;
610
+ if ("filter_name" in attributes && typeof attributes.filter_name !== "string") return false;
611
+ return true;
612
+ };
613
+
614
+ //#endregion
615
+ //#region src/application/models/guards/graphQL/isGraphQLColorsConfig.ts
616
+ const REQUIRED_COLOR_FIELDS = [
617
+ "accent_primary",
618
+ "accent_secondary",
619
+ "background_dark",
620
+ "background_light",
621
+ "background_primary",
622
+ "background_saturated",
623
+ "background_secondary",
624
+ "background_secondary_dark",
625
+ "background_tertiary",
626
+ "border_dark",
627
+ "border_light",
628
+ "border_medium",
629
+ "border_outline",
630
+ "text_accent",
631
+ "text_light",
632
+ "text_link",
633
+ "text_primary",
634
+ "text_secondary"
635
+ ];
636
+ const isGraphQLColorsConfig = (data) => {
637
+ if (typeof data !== "object" || data === null) {
638
+ logger_default.logError("Invalid graphql response for colors config", void 0, { data });
639
+ return false;
640
+ }
641
+ const missingFields = REQUIRED_COLOR_FIELDS.filter((field) => !(field in data) || typeof data[field] !== "string");
642
+ if (missingFields.length === REQUIRED_COLOR_FIELDS.length) {
643
+ logger_default.logError("All color fields are missing or null", void 0);
644
+ return false;
645
+ }
646
+ if (missingFields.length > 0) {
647
+ logger_default.logError("Missing or invalid color fields", void 0, {
648
+ data,
649
+ missingFields
650
+ });
651
+ return false;
652
+ }
653
+ return true;
654
+ };
655
+
656
+ //#endregion
657
+ //#region src/application/models/utils/snakeToCamelTransformer.ts
658
+ /**
659
+ * Generic utility to transform snake_case object keys to camelCase at runtime.
660
+ * This is the runtime equivalent of the CamelCasedPropertiesDeep type utility.
661
+ */
662
+ const PRESERVED_ACRONYMS = [
663
+ "PLP",
664
+ "PDP",
665
+ "SVG"
666
+ ];
667
+ /**
668
+ * Converts a snake_case string to camelCase
669
+ * Handles specific acronyms like PLP and PDP correctly
670
+ */
671
+ const toCamelCase = (str) => {
672
+ let processedStr = str;
673
+ for (const acronym of PRESERVED_ACRONYMS) {
674
+ const regex = new RegExp(`_${acronym}_?`, "gi");
675
+ if (processedStr.match(regex)) processedStr = processedStr.replace(regex, (v) => v.endsWith("_") ? `${acronym}_` : `${acronym}`);
676
+ }
677
+ return processedStr.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
678
+ };
679
+ /**
680
+ * Converts a camelCase string to snake_case
681
+ * Handles consecutive capital letters correctly (e.g., "PDP" -> "pdp", not "p_d_p")
682
+ * Preserves specific acronyms like PLP and PDP as lowercase in snake_case
683
+ */
684
+ const toSnakeCase = (str) => str.replace(/([A-Z])(?=[a-z])/g, "_$1").replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase().replace(/^_/, "");
685
+ /**
686
+ * Recursively transforms all object keys from snake_case to camelCase
687
+ */
688
+ const transformSnakeToCamel = (obj) => {
689
+ if (obj === null || obj === void 0) return obj;
690
+ if (Array.isArray(obj)) return obj.map((val) => transformSnakeToCamel(val));
691
+ if (typeof obj === "object") {
692
+ const result = {};
693
+ for (const [key, value] of Object.entries(obj)) {
694
+ const camelKey = toCamelCase(key);
695
+ result[camelKey] = transformSnakeToCamel(value);
696
+ }
697
+ return result;
698
+ }
699
+ return obj;
700
+ };
701
+ /**
702
+ * Recursively transforms all object keys from camelCase to snake_case
703
+ */
704
+ const transformCamelToSnake = (obj) => {
705
+ if (obj === null || obj === void 0) return obj;
706
+ if (Array.isArray(obj)) return obj.map(transformCamelToSnake);
707
+ if (typeof obj === "object") {
708
+ const result = {};
709
+ for (const [key, value] of Object.entries(obj)) {
710
+ const snakeKey = toSnakeCase(key);
711
+ result[snakeKey] = transformCamelToSnake(value);
712
+ }
713
+ return result;
714
+ }
715
+ return obj;
716
+ };
717
+
718
+ //#endregion
719
+ //#region src/application/models/utils/stringToFulfillmentDisplayStatusEnumValue.ts
720
+ /**
721
+ * Converts a string to a FulfillmentDisplayStatus enum value.
722
+ *
723
+ * @param status - The string to convert.
724
+ *
725
+ * @returns The FulfillmentDisplayStatus enum value or undefined if the string
726
+ * does not map to a valid enum
727
+ */
728
+ const stringToFulfillmentDisplayStatusEnumValue = (status) => {
729
+ switch (status) {
730
+ case "ATTEMPTED_DELIVERY": return FulfillmentDisplayStatus.ATTEMPTED_DELIVERY;
731
+ case "CANCELED": return FulfillmentDisplayStatus.CANCELED;
732
+ case "CONFIRMED": return FulfillmentDisplayStatus.CONFIRMED;
733
+ case "DELIVERED": return FulfillmentDisplayStatus.DELIVERED;
734
+ case "FAILURE": return FulfillmentDisplayStatus.FAILURE;
735
+ case "FULFILLED": return FulfillmentDisplayStatus.FULFILLED;
736
+ case "IN_TRANSIT": return FulfillmentDisplayStatus.IN_TRANSIT;
737
+ case "LABEL_PRINTED": return FulfillmentDisplayStatus.LABEL_PRINTED;
738
+ case "LABEL_PURCHASED": return FulfillmentDisplayStatus.LABEL_PURCHASED;
739
+ case "LABEL_VOIDED": return FulfillmentDisplayStatus.LABEL_VOIDED;
740
+ case "MARKED_AS_FULFILLED": return FulfillmentDisplayStatus.MARKED_AS_FULFILLED;
741
+ case "NOT_DELIVERED": return FulfillmentDisplayStatus.NOT_DELIVERED;
742
+ case "OUT_FOR_DELIVERY": return FulfillmentDisplayStatus.OUT_FOR_DELIVERY;
743
+ case "PICKED_UP": return FulfillmentDisplayStatus.PICKED_UP;
744
+ case "READY_FOR_PICKUP": return FulfillmentDisplayStatus.READY_FOR_PICKUP;
745
+ case "SUBMITTED": return FulfillmentDisplayStatus.SUBMITTED;
746
+ case "IN_PROGRESS": return FulfillmentDisplayStatus.IN_PROGRESS;
747
+ case "ON_HOLD": return FulfillmentDisplayStatus.ON_HOLD;
748
+ case "OPEN": return FulfillmentDisplayStatus.OPEN;
749
+ case "PARTIALLY_FULFILLED": return FulfillmentDisplayStatus.PARTIALLY_FULFILLED;
750
+ case "PENDING_FULFILLMENT": return FulfillmentDisplayStatus.PENDING_FULFILLMENT;
751
+ case "REQUEST_DECLINED": return FulfillmentDisplayStatus.REQUEST_DECLINED;
752
+ case "RESTOCKED": return FulfillmentDisplayStatus.RESTOCKED;
753
+ case "SCHEDULED": return FulfillmentDisplayStatus.SCHEDULED;
754
+ case "UNFULFILLED": return FulfillmentDisplayStatus.UNFULFILLED;
755
+ default: return;
756
+ }
757
+ };
758
+
759
+ //#endregion
760
+ //#region src/application/models/validators/validateGraphQLColorsConfig.ts
761
+ const validateGraphQLColorsConfig = (data) => {
762
+ if (!isGraphQLColorsConfig(data)) return;
763
+ };
764
+
765
+ //#endregion
766
+ //#region src/merchants/domInsertion.ts
767
+ var DOMInsertionType = /* @__PURE__ */ function(DOMInsertionType$1) {
768
+ DOMInsertionType$1["AFTER"] = "after";
769
+ DOMInsertionType$1["BEFORE"] = "before";
770
+ DOMInsertionType$1["ADJACENT_AFTER_BEGIN"] = "adjacent-after-begin";
771
+ DOMInsertionType$1["ADJACENT_BEFORE_BEGIN"] = "adjacent-before-begin";
772
+ DOMInsertionType$1["ADJACENT_AFTER_END"] = "adjacent-after-end";
773
+ DOMInsertionType$1["ADJACENT_BEFORE_END"] = "adjacent-before-end";
774
+ DOMInsertionType$1["APPEND_CHILD"] = "append-child";
775
+ DOMInsertionType$1["NONE"] = "none";
776
+ return DOMInsertionType$1;
777
+ }(DOMInsertionType || {});
778
+
779
+ //#endregion
780
+ //#region src/merchants/gridInsertion.ts
781
+ var GridInsertionType = /* @__PURE__ */ function(GridInsertionType$1) {
782
+ GridInsertionType$1["FIXED_1"] = "fixed-1";
783
+ GridInsertionType$1["FIXED_2"] = "fixed-2";
784
+ GridInsertionType$1["FIXED_3"] = "fixed-3";
785
+ GridInsertionType$1["FIXED_4"] = "fixed-4";
786
+ GridInsertionType$1["FIXED_5"] = "fixed-5";
787
+ GridInsertionType$1["FIXED_6"] = "fixed-6";
788
+ GridInsertionType$1["FIXED_7"] = "fixed-7";
789
+ GridInsertionType$1["FIXED_8"] = "fixed-8";
790
+ GridInsertionType$1["FIXED_9"] = "fixed-9";
791
+ GridInsertionType$1["FIXED_12"] = "fixed-12";
792
+ GridInsertionType$1["FIXED_13"] = "fixed-13";
793
+ GridInsertionType$1["ROW_1"] = "row-1";
794
+ GridInsertionType$1["ROW_2"] = "row-2";
795
+ GridInsertionType$1["ROW_3"] = "row-3";
796
+ GridInsertionType$1["ROW_4"] = "row-4";
797
+ return GridInsertionType$1;
798
+ }(GridInsertionType || {});
799
+
800
+ //#endregion
801
+ //#region src/application/models/validators/validateGraphQLFrontendConfig.ts
802
+ const validateAndTransformPageVariants = (config) => {
803
+ const { variantChecks, widgetMounting,...rest } = transformSnakeToCamel(config);
804
+ const variantTests = Array.isArray(variantChecks) ? variantChecks.map(({ checkType,...restCheck }) => ({
805
+ ...restCheck,
806
+ testType: checkType
807
+ })) : [];
808
+ const normalizedWidgetMounting = Array.isArray(widgetMounting) ? widgetMounting.map(({ mountingPointWidgets,...restMounting }) => ({
809
+ ...restMounting,
810
+ ...Array.isArray(mountingPointWidgets) ? { mountingPointWidgets: mountingPointWidgets.map(({ checks,...restWidget }) => ({
811
+ ...restWidget,
812
+ tests: Array.isArray(checks) ? checks.map(({ checkType,...restCheck }) => ({
813
+ ...restCheck,
814
+ testType: checkType
815
+ })) : []
816
+ })) } : {}
817
+ })) : [];
818
+ const normalizedConfig = {
819
+ ...rest,
820
+ ...variantTests ? { variantTests } : {},
821
+ ...normalizedWidgetMounting ? { widgetMounting: normalizedWidgetMounting } : {}
822
+ };
823
+ const variantId = normalizedConfig.variantId;
824
+ const variantType = normalizedConfig.variantType;
825
+ if (typeof variantId !== "string" || !variantId) throw new Error(`Missing or invalid variantId for pageVariant`);
826
+ if (typeof variantType !== "string" || !variantType) throw new Error(`Missing or invalid variantType for pageVariant '${variantId}'`);
827
+ if (!Array.isArray(variantTests)) throw new Error(`Missing or invalid variantTests for pageVariant '${variantId}'. Must be an array`);
828
+ for (const test of variantTests) {
829
+ if (!test.testType || typeof test.testType !== "string") throw new Error(`Invalid variantTest.testType for pageVariant '${variantId}'`);
830
+ if (!Object.values(PageVariantTestType).includes(test.testType)) throw new Error(`Invalid testType '${test.testType}' for pageVariant '${variantId}'. Valid types: ${Object.values(PageVariantTestType).join(", ")}`);
831
+ }
832
+ if (!Array.isArray(normalizedWidgetMounting)) throw new Error(`Missing or invalid widgetMounting for pageVariant '${variantId}'. Must be an array`);
833
+ for (const mounting of normalizedWidgetMounting) {
834
+ if (typeof mounting.mountingConfigId !== "string" || !mounting.mountingConfigId) throw new Error(`Invalid mountingConfigId in widgetMounting for pageVariant '${variantId}'`);
835
+ if (mounting.widgetConfigId && typeof mounting.widgetConfigId !== "string") throw new Error(`Invalid widgetConfigId in widgetMounting for pageVariant '${variantId}'`);
836
+ if (mounting.mountingPointWidgets) for (const widget of mounting.mountingPointWidgets) {
837
+ if (typeof widget.widgetConfigId !== "string" || !widget.widgetConfigId) throw new Error(`Invalid widgetConfigId in mountingPointWidgets for pageVariant '${variantId}'`);
838
+ if (!Array.isArray(widget.tests)) throw new Error(`Invalid or missing tests in mountingPointWidgets for pageVariant '${variantId}'`);
839
+ }
840
+ }
841
+ if (variantType === "plp") {
842
+ if (typeof normalizedConfig.plpIdExtractor !== "string" || !normalizedConfig.plpIdExtractor) throw new Error(`Missing or invalid plpIdExtractor for PLP pageVariant '${variantId}'`);
843
+ }
844
+ if (variantType === "pdp") {
845
+ if (typeof normalizedConfig.productIdExtractor !== "string" || !normalizedConfig.productIdExtractor) throw new Error(`Missing or invalid productIdExtractor for PDP pageVariant '${variantId}'`);
846
+ if (normalizedConfig.parentProductIdExtractor && typeof normalizedConfig.parentProductIdExtractor !== "string") throw new Error(`Invalid parentProductIdExtractor for PDP pageVariant '${variantId}'. Must be string if provided`);
847
+ }
848
+ return normalizedConfig;
849
+ };
850
+ const validateAndTransformMountingConfig = (config, configKey) => {
851
+ const normalizedConfig = { ...config };
852
+ if (normalizedConfig.checkId && !normalizedConfig.testId) {
853
+ normalizedConfig.testId = normalizedConfig.checkId;
854
+ delete normalizedConfig.checkId;
855
+ }
856
+ if (typeof normalizedConfig.mountingConfigId !== "string" || !normalizedConfig.mountingConfigId) throw new Error(`Missing or invalid mountingConfigId for config '${configKey}'`);
857
+ if (typeof normalizedConfig.containerId !== "string" || !normalizedConfig.containerId) throw new Error(`Missing or invalid containerId for config '${configKey}'`);
858
+ if (typeof normalizedConfig.testId !== "string" || !normalizedConfig.testId) throw new Error(`Missing or invalid testId for config '${configKey}'`);
859
+ if (!normalizedConfig.insertionPoint || typeof normalizedConfig.insertionPoint !== "object" || Array.isArray(normalizedConfig.insertionPoint)) throw new Error(`Missing or invalid insertionPoint for config '${configKey}'`);
860
+ const insertionPoint = normalizedConfig.insertionPoint;
861
+ if (typeof insertionPoint.selector !== "string" || !insertionPoint.selector) throw new Error(`Missing or invalid insertionPoint.selector for config '${configKey}'`);
862
+ if (typeof insertionPoint.insertionType !== "string" || !insertionPoint.insertionType) throw new Error(`Missing or invalid insertionPoint.insertionType for config '${configKey}'`);
863
+ if (!Object.values(DOMInsertionType).includes(insertionPoint.insertionType)) throw new Error(`Invalid insertionPoint.insertionType '${insertionPoint.insertionType}' for config '${configKey}'. Valid types: ${Object.values(DOMInsertionType).join(", ")}`);
864
+ if (insertionPoint.selectionIndex != null && typeof insertionPoint.selectionIndex !== "number") throw new Error(`Invalid insertionPoint.selectionIndex for config '${configKey}'. Must be a number or null/undefined`);
865
+ let parentInsertionPoint;
866
+ if (normalizedConfig.parentInsertionPoint) {
867
+ if (typeof normalizedConfig.parentInsertionPoint !== "object" || Array.isArray(normalizedConfig.parentInsertionPoint)) throw new Error(`Invalid parentInsertionPoint for config '${configKey}'. Must be an object`);
868
+ const parentPoint = normalizedConfig.parentInsertionPoint;
869
+ if (typeof parentPoint.selector !== "string" || !parentPoint.selector) throw new Error(`Missing or invalid parentInsertionPoint.selector for config '${configKey}'`);
870
+ if (typeof parentPoint.insertionType !== "string" || !parentPoint.insertionType) throw new Error(`Missing or invalid parentInsertionPoint.insertionType for config '${configKey}'`);
871
+ if (!Object.values(DOMInsertionType).includes(parentPoint.insertionType)) throw new Error(`Invalid parentInsertionPoint.insertionType '${parentPoint.insertionType}' for config '${configKey}'. Valid types: ${Object.values(DOMInsertionType).join(", ")}`);
872
+ if (parentPoint.selectionIndex != null && typeof parentPoint.selectionIndex !== "number") throw new Error(`Invalid parentInsertionPoint.selectionIndex for config '${configKey}'. Must be a number or null/undefined`);
873
+ parentInsertionPoint = {
874
+ selector: parentPoint.selector,
875
+ insertionType: parentPoint.insertionType,
876
+ selectionIndex: parentPoint.selectionIndex
877
+ };
878
+ }
879
+ let wrappingElement;
880
+ if (normalizedConfig.wrappingElement) {
881
+ if (typeof normalizedConfig.wrappingElement !== "object" || Array.isArray(normalizedConfig.wrappingElement)) throw new Error(`Invalid wrappingElement for config '${configKey}'. Must be an object`);
882
+ const wrapping = normalizedConfig.wrappingElement;
883
+ if (typeof wrapping.className !== "string" || !wrapping.className) throw new Error(`Missing or invalid wrappingElement.className for config '${configKey}'`);
884
+ if (typeof wrapping.element !== "string" || !wrapping.element) throw new Error(`Missing or invalid wrappingElement.element for config '${configKey}'`);
885
+ if (typeof wrapping.insertionType !== "string" || !wrapping.insertionType) throw new Error(`Missing or invalid wrappingElement.insertionType for config '${configKey}'`);
886
+ if (!Object.values(DOMInsertionType).includes(wrapping.insertionType)) throw new Error(`Invalid wrappingElement.insertionType '${wrapping.insertionType}' for config '${configKey}'. Valid types: ${Object.values(DOMInsertionType).join(", ")}`);
887
+ wrappingElement = {
888
+ className: wrapping.className,
889
+ element: wrapping.element,
890
+ insertionType: wrapping.insertionType
891
+ };
892
+ }
893
+ if (normalizedConfig.divCheckSelector != null && typeof normalizedConfig.divCheckSelector !== "string") throw new Error(`Invalid divCheckSelector for config '${configKey}'. Must be a string or null/undefined`);
894
+ if (normalizedConfig.className != null && typeof normalizedConfig.className !== "string") throw new Error(`Invalid className for config '${configKey}'. Must be a string or null/undefined`);
895
+ if (normalizedConfig.suppressionSelector != null && typeof normalizedConfig.suppressionSelector !== "string") throw new Error(`Invalid suppressionSelector for config '${configKey}'. Must be a string or null/undefined`);
896
+ if (normalizedConfig.dataAttributes != null && (typeof normalizedConfig.dataAttributes !== "object" || Array.isArray(normalizedConfig.dataAttributes))) throw new Error(`Invalid dataAttributes for config '${configKey}'. Must be an object or null/undefined`);
897
+ if (normalizedConfig.style != null && (typeof normalizedConfig.style !== "object" || Array.isArray(normalizedConfig.style))) throw new Error(`Invalid style for config '${configKey}'. Must be an object or null/undefined`);
898
+ let gridInsertionType;
899
+ if (normalizedConfig.gridInsertionType) {
900
+ if (typeof normalizedConfig.gridInsertionType !== "string" || !normalizedConfig.gridInsertionType) throw new Error(`Invalid gridInsertionType for config '${configKey}'. Must be a string`);
901
+ if (!Object.values(GridInsertionType).includes(normalizedConfig.gridInsertionType)) throw new Error(`Invalid gridInsertionType '${normalizedConfig.gridInsertionType}' for config '${configKey}'. Valid types: ${Object.values(GridInsertionType).join(", ")}`);
902
+ gridInsertionType = normalizedConfig.gridInsertionType;
903
+ }
904
+ const result = {
905
+ mountingConfigId: normalizedConfig.mountingConfigId,
906
+ containerId: normalizedConfig.containerId,
907
+ testId: normalizedConfig.testId,
908
+ insertionPoint: {
909
+ selector: insertionPoint.selector,
910
+ insertionType: insertionPoint.insertionType,
911
+ ...insertionPoint.selectionIndex != null && { selectionIndex: insertionPoint.selectionIndex }
912
+ }
913
+ };
914
+ if (parentInsertionPoint) result.parentInsertionPoint = parentInsertionPoint;
915
+ if (gridInsertionType) result.gridInsertionType = gridInsertionType;
916
+ if (wrappingElement) result.wrappingElement = wrappingElement;
917
+ if (normalizedConfig.divCheckSelector) result.divCheckSelector = normalizedConfig.divCheckSelector;
918
+ if (normalizedConfig.className) result.className = normalizedConfig.className;
919
+ if (normalizedConfig.suppressionSelector) result.suppressionSelector = normalizedConfig.suppressionSelector;
920
+ if (normalizedConfig.dataAttributes) result.dataAttributes = normalizedConfig.dataAttributes;
921
+ if (normalizedConfig.style) result.style = normalizedConfig.style;
922
+ return result;
923
+ };
924
+ const validateAndTransformWidgetConfig = (config, configKey) => {
925
+ const normalizedConfig = transformSnakeToCamel(config);
926
+ if (typeof normalizedConfig.widgetConfigId !== "string" || !normalizedConfig.widgetConfigId) throw new Error(`Missing or invalid widgetConfigId for widget config '${configKey}'`);
927
+ if (typeof normalizedConfig.type !== "string" || !normalizedConfig.type) throw new Error(`Missing or invalid type for widget config '${configKey}'`);
928
+ if (normalizedConfig.contentId != null && typeof normalizedConfig.contentId !== "string") throw new Error(`Invalid contentId for widget config '${configKey}'. Must be a string or null/undefined`);
929
+ return normalizedConfig;
930
+ };
931
+ const validateGraphQLFrontendConfig = (data) => {
932
+ if (data === null || data === void 0) return;
933
+ if (typeof data !== "object" || Array.isArray(data)) {
934
+ logger_default.logWarn("Invalid GraphQL frontend config data: not an object", void 0, { data });
935
+ return;
936
+ }
937
+ const obj = data;
938
+ if ("merchant_override_css" in obj && typeof obj.merchant_override_css !== "string" && obj.merchant_override_css !== null) {
939
+ logger_default.logWarn("Invalid GraphQL frontend config data: merchant_override_css must be a string or null", void 0, { data });
940
+ return;
941
+ }
942
+ if ("page_variants" in obj) {
943
+ if (obj.page_variants !== void 0 && obj.page_variants !== null && !Array.isArray(obj.page_variants)) {
944
+ logger_default.logWarn("Invalid GraphQL frontend config data: page_variants must be an array or null/undefined", void 0, { data });
945
+ return;
946
+ }
947
+ }
948
+ if ("mounting_configs" in obj) {
949
+ if (obj.mounting_configs !== void 0 && obj.mounting_configs !== null && !Array.isArray(obj.mounting_configs)) {
950
+ logger_default.logWarn("Invalid GraphQL frontend config data: mounting_configs must be an array or null/undefined", void 0, { data });
951
+ return;
952
+ }
953
+ }
954
+ if ("widget_configs" in obj) {
955
+ if (obj.widget_configs !== void 0 && obj.widget_configs !== null && !Array.isArray(obj.widget_configs)) {
956
+ logger_default.logWarn("Invalid GraphQL frontend config data: widget_configs must be an array or null/undefined", void 0, { data });
957
+ return;
958
+ }
959
+ }
960
+ if ("ui_configs" in obj && typeof obj.ui_configs !== "object" && obj.ui_configs !== null) {
961
+ logger_default.logWarn("Invalid GraphQL frontend config data: ui_configs must be an object or null/undefined", void 0, { data });
962
+ return;
963
+ }
964
+ try {
965
+ const transformedData = transformSnakeToCamel(obj);
966
+ if (transformedData.pageVariants && Array.isArray(transformedData.pageVariants)) {
967
+ const pageVariantsArray = transformedData.pageVariants;
968
+ const validatedPageVariants = [];
969
+ for (const variant of pageVariantsArray) if (variant && typeof variant === "object" && typeof variant.variantId === "string") try {
970
+ const validatedVariant = validateAndTransformPageVariants(variant);
971
+ validatedPageVariants.push(validatedVariant);
972
+ } catch (error) {
973
+ logger_default.logWarn("Invalid page variant, skipping", error, {
974
+ variantId: variant.variantId,
975
+ variant
976
+ });
977
+ }
978
+ else logger_default.logWarn("Invalid page variant structure, skipping", void 0, { variant });
979
+ transformedData.pageVariants = validatedPageVariants;
980
+ }
981
+ if (transformedData.mountingConfigs && Array.isArray(transformedData.mountingConfigs)) {
982
+ const mountingConfigsArray = transformedData.mountingConfigs;
983
+ const mountingConfigsRecord = {};
984
+ for (const item of mountingConfigsArray) if (item && typeof item.key === "string" && item.config && typeof item.config === "object") try {
985
+ const config = item.config;
986
+ const validatedConfig = validateAndTransformMountingConfig(config, item.key);
987
+ mountingConfigsRecord[item.key] = validatedConfig;
988
+ } catch (error) {
989
+ logger_default.logWarn("Invalid mounting config, skipping", error, {
990
+ configKey: item.key,
991
+ config: item.config
992
+ });
993
+ }
994
+ else logger_default.logWarn("Invalid mounting config item structure, skipping", void 0, { item });
995
+ transformedData.mountingConfigs = mountingConfigsRecord;
996
+ }
997
+ if (transformedData.widgetConfigs && Array.isArray(transformedData.widgetConfigs)) {
998
+ const widgetConfigsArray = transformedData.widgetConfigs;
999
+ const widgetConfigsRecord = {};
1000
+ for (const item of widgetConfigsArray) if (item && typeof item.key === "string" && item.config && typeof item.config === "object") try {
1001
+ const config = item.config;
1002
+ const validatedConfig = validateAndTransformWidgetConfig(config, item.key);
1003
+ widgetConfigsRecord[item.key] = validatedConfig;
1004
+ } catch (error) {
1005
+ logger_default.logWarn("Invalid widget config, skipping", error, {
1006
+ configKey: item.key,
1007
+ config: item.config
1008
+ });
1009
+ }
1010
+ else logger_default.logWarn("Invalid widget config item structure, skipping", void 0, { item });
1011
+ transformedData.widgetConfigs = widgetConfigsRecord;
1012
+ }
1013
+ return transformedData;
1014
+ } catch (error) {
1015
+ logger_default.logWarn("Failed to validate and transform GraphQL frontend config data", error, { data });
1016
+ return;
1017
+ }
1018
+ };
1019
+
1020
+ //#endregion
1021
+ //#region src/application/models/validators/validateGraphQLOrgId.ts
1022
+ const validateGraphQLOrgId = (data) => {
1023
+ if (typeof data !== "string" || data === "") return;
1024
+ return data;
1025
+ };
1026
+
1027
+ //#endregion
1028
+ //#region src/application/models/validators/validateMobilePLPChatPlacementParameter.ts
1029
+ const validateMobilePLPChatPlacementParameter = (value) => {
1030
+ if (!isMobilePLPChatPlacementParameter(value)) return;
1031
+ return { rowIndex: value.row_index };
1032
+ };
1033
+
1034
+ //#endregion
1035
+ //#region src/application/models/validators/validateOrganizationConfig.ts
1036
+ const validateOrganizationConfig = (data) => {
1037
+ if (!isApiOrganizationConfig(data)) return;
1038
+ return {
1039
+ id: data.id,
1040
+ createdAt: data.created_at.toISOString(),
1041
+ namespace: data.namespace,
1042
+ organizationId: data.organization_id,
1043
+ isLatest: data.is_latest,
1044
+ version: data.version,
1045
+ updatedAt: data.updated_at.toISOString(),
1046
+ config: {
1047
+ amplitude: data.config.amplitude ? {
1048
+ sessionReplayEnabled: data.config.amplitude.session_replay_enabled,
1049
+ sessionReplaySampleRate: data.config.amplitude.session_replay_sample_rate,
1050
+ trackingEnabled: data.config.amplitude.tracking_enabled
1051
+ } : void 0,
1052
+ customerService: data.config.customer_service ? { provider: data.config.customer_service.provider } : void 0,
1053
+ googleAnalytics: data.config.google_analytics ? { measurementId: data.config.google_analytics.measurement_id } : void 0
1054
+ }
1055
+ };
1056
+ };
1057
+
1058
+ //#endregion
1059
+ //#region src/application/models/validators/validateOrgConfigResults.ts
1060
+ /**
1061
+ *
1062
+ * @param data
1063
+ * @returns
1064
+ */
1065
+ const validateOrgConfigResults = (data) => {
1066
+ if (!isApiOrgConfigResults(data)) return;
1067
+ return {
1068
+ configs: data.configs.map((config) => validateOrganizationConfig(config)).filter((config) => config != null),
1069
+ experiments: data.experiments.map((experiment) => ({
1070
+ group: experiment.group,
1071
+ groupName: experiment.group_name,
1072
+ name: experiment.name,
1073
+ ruleId: experiment.rule_id,
1074
+ value: experiment.value
1075
+ })),
1076
+ gates: data.gates.map((gate) => ({
1077
+ groupName: gate.group_name,
1078
+ name: gate.name,
1079
+ ruleId: gate.rule_id,
1080
+ value: gate.value
1081
+ })),
1082
+ org: {
1083
+ org: {
1084
+ id: data.org.org.id,
1085
+ displayName: data.org.org.display_name,
1086
+ domain: data.org.org.domain,
1087
+ shortName: data.org.org.short_name,
1088
+ status: data.org.org.status,
1089
+ createdAt: data.org.org.created_at?.toISOString(),
1090
+ updatedAt: data.org.org.updated_at?.toISOString()
1091
+ },
1092
+ settings: {}
1093
+ }
1094
+ };
1095
+ };
1096
+
1097
+ //#endregion
1098
+ //#region src/application/models/validators/validateResponse.ts
1099
+ const richInformationFromCommerceRichInformation = (data) => ({
1100
+ cons: data.cons,
1101
+ pros: data.pros,
1102
+ reviewDate: data.review_date,
1103
+ reviewerTitle: data.reviewer_title,
1104
+ productFamiliarity: data.product_familiarity
1105
+ });
1106
+ const validateResponse = (data) => {
1107
+ if (!isApiResponse(data)) return;
1108
+ if (data.category === ResponseCategory.Text && isApiTextResponseAttributes(data.attributes)) return {
1109
+ id: data.id,
1110
+ createdAt: data.created_at,
1111
+ category: ResponseCategory.Text,
1112
+ attributes: { content: data.attributes.content }
1113
+ };
1114
+ if (data.category === ResponseCategory.Product && isApiProductResponseAttributes(data.attributes)) return {
1115
+ id: data.id,
1116
+ createdAt: data.created_at,
1117
+ category: ResponseCategory.Product,
1118
+ attributes: {
1119
+ id: data.attributes.id,
1120
+ description: data.attributes.description,
1121
+ imageUrl: data.attributes.image_url,
1122
+ imageUrls: data.attributes.image_urls,
1123
+ title: data.attributes.title,
1124
+ url: data.attributes.url,
1125
+ originalPrice: data.attributes.original_price,
1126
+ salePrice: data.attributes.sale_price,
1127
+ averageRating: data.attributes.average_rating,
1128
+ numberReviews: data.attributes.number_reviews,
1129
+ metadata: data.attributes.metadata,
1130
+ isForGrid: data.attributes.is_for_grid,
1131
+ colors: data.attributes.colors,
1132
+ sizes: data.attributes.sizes,
1133
+ filters: data.attributes.filters
1134
+ }
1135
+ };
1136
+ if (data.category === ResponseCategory.Review && isApiReviewResponseAttributes(data.attributes)) return {
1137
+ id: data.id,
1138
+ createdAt: data.created_at,
1139
+ category: ResponseCategory.Review,
1140
+ attributes: {
1141
+ id: data.attributes.id,
1142
+ productId: data.attributes.product_id,
1143
+ title: data.attributes.title,
1144
+ reviewer: data.attributes.reviewer,
1145
+ review: data.attributes.review,
1146
+ stars: data.attributes.stars,
1147
+ richInformation: data.attributes.rich_information ? richInformationFromCommerceRichInformation(data.attributes.rich_information) : void 0
1148
+ }
1149
+ };
1150
+ if (data.category === ResponseCategory.Separator) return {
1151
+ id: data.id,
1152
+ createdAt: data.created_at,
1153
+ category: ResponseCategory.Separator
1154
+ };
1155
+ if (data.category === ResponseCategory.Page && isApiPageResponseAttributes(data.attributes)) return {
1156
+ id: data.id,
1157
+ createdAt: data.created_at,
1158
+ category: ResponseCategory.Page,
1159
+ attributes: {
1160
+ id: data.attributes.id,
1161
+ title: data.attributes.title,
1162
+ description: data.attributes.description,
1163
+ url: data.attributes.url
1164
+ }
1165
+ };
1166
+ if (data.category === ResponseCategory.Form && isApiFormResponseAttributes(data.attributes)) return {
1167
+ id: data.id,
1168
+ createdAt: data.created_at,
1169
+ category: ResponseCategory.Form,
1170
+ attributes: {
1171
+ formCategory: data.attributes.form_category ? { formType: data.attributes.form_category.form_type } : void 0,
1172
+ schema: {
1173
+ properties: data.attributes.schema.properties,
1174
+ required: data.attributes.schema.required.map(String)
1175
+ }
1176
+ }
1177
+ };
1178
+ if (data.category === ResponseCategory.ProductSearch && isApiProductSearchResponseAttributes(data.attributes)) return {
1179
+ id: data.id,
1180
+ createdAt: data.created_at,
1181
+ category: ResponseCategory.ProductSearch,
1182
+ attributes: {
1183
+ generatedQuery: data.attributes.generated_query,
1184
+ productCount: data.attributes.product_count
1185
+ }
1186
+ };
1187
+ if (data.category === ResponseCategory.ProductSearchFilter && isApiProductSearchFilterResponseAttributes(data.attributes)) return {
1188
+ id: data.id,
1189
+ createdAt: data.created_at,
1190
+ category: ResponseCategory.ProductSearchFilter,
1191
+ attributes: { filterName: data.attributes.filter_name }
1192
+ };
1193
+ if (data.category === ResponseCategory.Order && isApiOrderResponseAttributes(data.attributes)) return {
1194
+ id: data.id,
1195
+ createdAt: data.created_at,
1196
+ category: ResponseCategory.Order,
1197
+ attributes: {
1198
+ orderId: data.attributes.order_id,
1199
+ orderNumber: data.attributes.order_number,
1200
+ createdAt: data.attributes.created_at,
1201
+ latestEventDate: data.attributes.latest_event_date,
1202
+ lineItems: data.attributes.line_items.map((item) => ({
1203
+ itemTitle: item.item_title,
1204
+ itemPrice: item.item_price,
1205
+ itemQuantity: item.item_quantity,
1206
+ orderItemId: item.order_item_id,
1207
+ image: item.image ?? void 0,
1208
+ inTransitAt: item.in_transit_at ?? void 0,
1209
+ deliveredAt: item.delivered_at ?? void 0,
1210
+ estimatedDeliveryAt: item.estimated_delivery_at ?? void 0,
1211
+ fulfillmentDisplayStatus: item.fulfillment_display_status ? stringToFulfillmentDisplayStatusEnumValue(item.fulfillment_display_status) : void 0,
1212
+ trackingUrl: item.tracking_url ?? void 0
1213
+ }))
1214
+ }
1215
+ };
1216
+ };
1217
+
1218
+ //#endregion
1219
+ //#region src/application/models/validators/validateSuggestion.ts
1220
+ const validateSuggestion = (data) => {
1221
+ if (!isSuggestion(data)) return;
1222
+ return {
1223
+ id: data.id,
1224
+ category: data.category,
1225
+ content: data.content,
1226
+ createdAt: data.created_at,
1227
+ isAnswer: data.is_answer
1228
+ };
1229
+ };
1230
+
1231
+ //#endregion
1232
+ //#region src/application/models/validators/validateUserEvent.ts
1233
+ const validateUserEvent = (data) => {
1234
+ if (!isApiUserEvent(data)) return;
1235
+ if (data.category === UserEventCategory.PdpVisit && isApiPDPAttributes(data.attributes)) return {
1236
+ eventId: data.event_id,
1237
+ createdAt: data.created_at,
1238
+ category: UserEventCategory.PdpVisit,
1239
+ attributes: {
1240
+ productId: data.attributes.product_id,
1241
+ parentProductId: data.attributes.parent_product_id,
1242
+ url: data.attributes.url
1243
+ }
1244
+ };
1245
+ if (data.category === UserEventCategory.QueryTyped && isApiQueryTypedAttributes(data.attributes)) return {
1246
+ eventId: data.event_id,
1247
+ createdAt: data.created_at,
1248
+ category: UserEventCategory.QueryTyped,
1249
+ attributes: { query: data.attributes.query }
1250
+ };
1251
+ if (data.category === UserEventCategory.Search && isApiSearchAttributes(data.attributes)) return {
1252
+ eventId: data.event_id,
1253
+ createdAt: data.created_at,
1254
+ category: UserEventCategory.Search,
1255
+ attributes: {
1256
+ searchTerm: data.attributes.search_term,
1257
+ selectedFilters: data.attributes.selected_filters
1258
+ }
1259
+ };
1260
+ if (data.category === UserEventCategory.SuggestionClicked && isApiSuggestionClickedAttributes(data.attributes)) return {
1261
+ eventId: data.event_id,
1262
+ createdAt: data.created_at,
1263
+ category: UserEventCategory.SuggestionClicked,
1264
+ attributes: { suggestionId: data.attributes.suggestion_id }
1265
+ };
1266
+ if (data.category === UserEventCategory.PlpVisit && isApiPLPEventAttributes(data.attributes)) {
1267
+ if (isApiPLPIdAttribute(data.attributes)) return {
1268
+ eventId: data.event_id,
1269
+ createdAt: data.created_at,
1270
+ category: UserEventCategory.PlpVisit,
1271
+ attributes: {
1272
+ category: data.attributes.category,
1273
+ attributes: { id: data.attributes.id }
1274
+ }
1275
+ };
1276
+ }
1277
+ if (data.category === UserEventCategory.FormSubmitted && isApiFormSubmittedResponseAttributes(data.attributes)) return {
1278
+ eventId: data.event_id,
1279
+ createdAt: data.created_at,
1280
+ category: UserEventCategory.FormSubmitted,
1281
+ attributes: {
1282
+ filledSchema: { ...data.attributes.filled_schema },
1283
+ formResponseId: data.attributes.form_response_id,
1284
+ formType: data.attributes.form_type
1285
+ }
1286
+ };
1287
+ return {
1288
+ eventId: data.event_id,
1289
+ createdAt: data.created_at,
1290
+ category: UserEventCategory.AppLoaded
1291
+ };
1292
+ };
1293
+
1294
+ //#endregion
1295
+ export { ChatElementDisplayLocation, GoogleAnalyticsEvents, MessageRole, MessageType, OrgShortName, ProductExperiment, SpiffyEventName, SpiffyWidgets, getMerchantOrgIdQuery, isApiFormResponseAttributes, isApiFormSubmittedResponseAttributes, isApiOrderResponseAttributes, isApiOrgConfigResults, isApiOrganizationConfig, isApiPLPEventAttributes, isApiPLPIdAttribute, isApiPageResponseAttributes, isApiProductSearchFilterResponseAttributes, isBaseEcommerceEvent, isGA4EcommerceEvent, isGraphQLColorsConfig, isLegacyUAEcommerceEvent, isMobilePLPChatPlacementParameter, isSpanxTakeAQuizCtaParameter, isVariantInfo, stringToFulfillmentDisplayStatusEnumValue, transformCamelToSnake, transformSnakeToCamel, validateAndTransformMountingConfig, validateAndTransformPageVariants, validateAndTransformWidgetConfig, validateGraphQLColorsConfig, validateGraphQLFrontendConfig, validateGraphQLOrgId, validateMobilePLPChatPlacementParameter, validateOrgConfigResults, validateOrganizationConfig, validateResponse, validateSuggestion, validateUserEvent };
1296
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLWM4NmhZVy1GLmpzIiwibmFtZXMiOlsicmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsIm5vcm1hbGl6ZWRDb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IiwicmVzdWx0OiBXaWRnZXRNb3VudGluZ0NvbmZpZyIsInZhbGlkYXRlZFBhZ2VWYXJpYW50czogUGFnZVZhcmlhbnRDb25maWdbXSIsIm1vdW50aW5nQ29uZmlnc1JlY29yZDogUmVjb3JkPHN0cmluZywgV2lkZ2V0TW91bnRpbmdDb25maWc+Iiwid2lkZ2V0Q29uZmlnc1JlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4iXSwic291cmNlcyI6WyIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2NoYXRFbGVtZW50RGlzcGxheUxvY2F0aW9uLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ldmVudHMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2dvb2dsZUFuYWx5dGljc0V2ZW50cy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvbWVzc2FnZS50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvb3Jnc0VudW0udHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3Byb2R1Y3RFeHBlcmltZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9zcGlmZnlXaWRnZXRzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ncmFwaHFsL3F1ZXJpZXMvZ2V0TWVyY2hhbnRPcmdJZFF1ZXJ5LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvaXNCYXNlRWNvbW1lcmNlRXZlbnQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9pc0dBNEVjb21tZXJjZUV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvaXNMZWdhY3lVQUVjb21tZXJjZUV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvaXNNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvaXNTcGFueFRha2VBUXVpekN0YVBhcmFtZXRlci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2lzVmFyaWFudEluZm8udHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlGb3JtUmVzcG9uc2UudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlPcmdhbml6YXRpb25Db25maWcudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlPcmdDb25maWdSZXN1bHRzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUGFnZVJlc3BvbnNlQXR0cmlidXRlcy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVBMUEV2ZW50QXR0cmlidXRlcy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVByb2R1Y3RTZWFyY2hGaWx0ZXJBdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvZ3JhcGhRTC9pc0dyYXBoUUxDb2xvcnNDb25maWcudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3V0aWxzL3NuYWtlVG9DYW1lbFRyYW5zZm9ybWVyLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy91dGlscy9zdHJpbmdUb0Z1bGZpbGxtZW50RGlzcGxheVN0YXR1c0VudW1WYWx1ZS50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZUdyYXBoUUxDb2xvcnNDb25maWcudHMiLCIuLi9zcmMvbWVyY2hhbnRzL2RvbUluc2VydGlvbi50cyIsIi4uL3NyYy9tZXJjaGFudHMvZ3JpZEluc2VydGlvbi50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZUdyYXBoUUxGcm9udGVuZENvbmZpZy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZUdyYXBoUUxPcmdJZC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZU1vYmlsZVBMUENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVPcmdhbml6YXRpb25Db25maWcudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlUmVzcG9uc2UudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVTdWdnZXN0aW9uLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlVXNlckV2ZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENoYXQgZWxlbWVudCBkaXNwbGF5IGxvY2F0aW9uIGVudW1cbmV4cG9ydCBlbnVtIENoYXRFbGVtZW50RGlzcGxheUxvY2F0aW9uIHtcbiAgSU5fQ0hBVCA9ICdpbl9jaGF0JyxcbiAgQ0hBVF9QUkVWSUVXID0gJ2NoYXRfcHJldmlldycsXG4gIEZMT0FUSU5HX0JVVFRPTiA9ICdmbG9hdGluZ19idXR0b24nLFxuICBIRUxQX01FX0NIT09TRSA9ICdoZWxwX21lX2Nob29zZScsXG4gIFBMUF9JTUFHRV9CQU5ORVIgPSAncGxwX2ltYWdlX2Jhbm5lcicsXG4gIFRPUF9SRVZJRVdTX1NOSVBQRVQgPSAndG9wX3Jldmlld3Nfc25pcHBldCcsXG4gIEJPVFRPTV9SRVZJRVdTX1NOSVBQRVQgPSAnYm90dG9tX3Jldmlld3Nfc25pcHBldCcsXG4gIEJMT0NLX0JBQ0tfQlVUVE9OID0gJ2Jsb2NrX2JhY2tfYnV0dG9uJyxcbiAgU1dJVENIX1RPX0FHRU5UID0gJ3N3aXRjaF90b19hZ2VudCcsXG4gIENPTlZFUlNBVElPTkFMX1NFQVJDSCA9ICdjb252ZXJzYXRpb25hbF9zZWFyY2gnLFxuICBHTE9CQUxfU0VBUkNIX0VOVFJZUE9JTlQgPSAnZ2xvYmFsX3NlYXJjaF9lbnRyeXBvaW50JyxcbiAgU0VBUkNIX05BVl9FTlRSWVBPSU5UID0gJ3NlYXJjaF9uYXZfZW50cnlwb2ludCcsXG4gIFNFQVJDSF9QUk9NUFQgPSAnc2VhcmNoX3Byb21wdCcsXG4gIFNFQVJDSF9QUk9NUFRfQlVUVE9OID0gJ3NlYXJjaF9wcm9tcHRfYnV0dG9uJyxcbiAgUFJPRFVDVF9HUklEID0gJ3Byb2R1Y3RfZ3JpZCcsXG4gIFVOU1BFQ0lGSUVEID0gJ3Vuc3BlY2lmaWVkJyxcbiAgRklMVEVSX01PREFMID0gJ2ZpbHRlcl9tb2RhbCcsXG4gIFBST01QVF9DQVJEID0gJ3Byb21wdF9jYXJkJyxcbiAgV0lORE9XX0FQSV9DQUxMID0gJ3dpbmRvd19hcGlfY2FsbCcsXG59XG4iLCIvLyBuYW1lcyBvZiBTcGlmZnkgc3BlY2lmaWMgSFRNTCBldmVudHNcbmV4cG9ydCBlbnVtIFNwaWZmeUV2ZW50TmFtZSB7XG4gIFdpZGdldE9wZW4gPSAnc3BpZmZ5OndpZGdldG9wZW4nLFxuICBXaWRnZXRDbG9zZSA9ICdzcGlmZnk6d2lkZ2V0Y2xvc2UnLFxufVxuIiwiZW51bSBHb29nbGVBbmFseXRpY3NFdmVudHMge1xuICBBRERfVE9fQ0FSVF92MSA9ICdhZGRfdG9fY2FydCcsXG4gIEFERF9UT19DQVJUX3YyID0gJ2FkZFRvQ2FydCcsXG59XG5cbmV4cG9ydCB7XG4gIEdvb2dsZUFuYWx5dGljc0V2ZW50c1xufSIsImltcG9ydCB7IEN1c3RTZXJ2aWNlQXR0YWNobWVudCwgRm9ybVR5cGUgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHtcbiAgT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMsXG4gIFByb2R1Y3RSZXNwb25zZUF0dHJpYnV0ZXMsXG4gIFJldmlld1Jlc3BvbnNlQXR0cmlidXRlcyxcbiAgUGFnZVJlc3BvbnNlQXR0cmlidXRlcyxcbiAgVGV4dFJlc3BvbnNlQXR0cmlidXRlcyxcbiAgU2VhcmNoUmVzcG9uc2VBdHRyaWJ1dGVzLFxuICBTZWFyY2hQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzLFxuICBBY2NlcHRhYmxlRm9ybUZpZWxkVHlwZSxcbiAgU2VhcmNoUHJvZHVjdEZpbHRlckF0dHJpYnV0ZXMsXG59IGZyb20gJy4vYXBpL3Jlc3BvbnNlJztcblxuZXhwb3J0IGVudW0gTWVzc2FnZVJvbGUge1xuICBVc2VyID0gJ3VzZXInLFxuICBBc3Npc3RhbnQgPSAnYXNzaXN0YW50Jyxcbn1cblxuZXhwb3J0IGVudW0gTWVzc2FnZVR5cGUge1xuICBUZXh0ID0gJ3RleHQnLFxuICBTdWdnZXN0aW9uQ2xpY2tlZCA9ICdzdWdnZXN0aW9uX2NsaWNrZWQnLFxuICBQcm9kdWN0ID0gJ3Byb2R1Y3QnLFxuICBQcm9kdWN0U2VhcmNoID0gJ3Byb2R1Y3Rfc2VhcmNoJyxcbiAgUmV2aWV3ID0gJ3JldmlldycsXG4gIFF1ZXJ5VHlwZWQgPSAncXVlcnlfdHlwZWQnLFxuICBTZXBhcmF0b3IgPSAnc2VwYXJhdG9yJyxcbiAgUGFnZSA9ICdwYWdlJyxcbiAgU2VhcmNoID0gJ3NlYXJjaCcsXG4gIEF0dGFjaG1lbnQgPSAnYXR0YWNobWVudCcsXG4gIENYQWdlbnRSZXNwb25zZSA9ICdjeF9hZ2VudF9yZXNwb25zZScsXG4gIEZvcm0gPSAnZm9ybScsXG4gIE9yZGVyID0gJ29yZGVyJyxcbiAgUHJvZHVjdFNlYXJjaEZpbHRlciA9ICdwcm9kdWN0X3NlYXJjaF9maWx0ZXInLFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlID0ge1xuICBpZDogc3RyaW5nO1xuICByb2xlOiBNZXNzYWdlUm9sZTtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG59ICYgKFxuICB8IFRleHRNZXNzYWdlTWV0YWRhdGFcbiAgfCBRdWVyeVR5cGVkTWV0YWRhdGFcbiAgfCBTdWdnZXN0aW9uTWVzc2FnZU1ldGFkYXRhXG4gIHwgUHJvZHVjdE1lc3NhZ2VNZXRhZGF0YVxuICB8IFByb2R1Y3RTZWFyY2hNZXNzYWdlTWV0YWRhdGFcbiAgfCBSZXZpZXdNZXNzYWdlTWV0YWRhdGFcbiAgfCBTZXBhcmF0b3JNZXNzYWdlTWV0YWRhdGFcbiAgfCBQYWdlTWVzc2FnZU1ldGFkYXRhXG4gIHwgU2VhcmNoTWVzc2FnZU1ldGFkYXRhXG4gIHwgQXR0YWNobWVudE1ldGFkYXRhXG4gIHwgQ1hBZ2VudFJlc3BvbnNlTWV0YWRhdGFcbiAgfCBGb3JtTWVzc2FnZU1ldGFkYXRhXG4gIHwgT3JkZXJNZXNzYWdlTWV0YWRhdGFcbiAgfCBQcm9kdWN0U2VhcmNoRmlsdGVyTWV0YWRhdGFcbik7XG5cbnR5cGUgQXR0YWNobWVudE1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5BdHRhY2htZW50O1xuICBtZXRhZGF0YToge1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgYXR0YWNobWVudDogQ3VzdFNlcnZpY2VBdHRhY2htZW50W107XG4gIH07XG59O1xuXG50eXBlIENYQWdlbnRSZXNwb25zZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5DWEFnZW50UmVzcG9uc2U7XG4gIG1ldGFkYXRhOiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICB9O1xufTtcblxudHlwZSBUZXh0TWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5UZXh0O1xuICBtZXRhZGF0YTogVGV4dFJlc3BvbnNlQXR0cmlidXRlc1snYXR0cmlidXRlcyddO1xufTtcblxudHlwZSBRdWVyeVR5cGVkTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLlF1ZXJ5VHlwZWQ7XG4gIG1ldGFkYXRhOiBUZXh0UmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG50eXBlIFN1Z2dlc3Rpb25NZXNzYWdlTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLlN1Z2dlc3Rpb25DbGlja2VkO1xuICBtZXRhZGF0YToge1xuICAgIHN1Z2dlc3Rpb25JZDogc3RyaW5nO1xuICAgIHN1Z2dlc3Rpb25Db250ZW50OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBQcm9kdWN0TWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5Qcm9kdWN0O1xuICBtZXRhZGF0YTogUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlc1snYXR0cmlidXRlcyddO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvZHVjdFNlYXJjaE1lc3NhZ2VNZXRhZGF0YSA9IHtcbiAgdHlwZTogTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaDtcbiAgbWV0YWRhdGE6IFNlYXJjaFByb2R1Y3RSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXTtcbn07XG5cbnR5cGUgUmV2aWV3TWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5SZXZpZXc7XG4gIG1ldGFkYXRhOiBSZXZpZXdSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXTtcbn07XG5cbnR5cGUgU2VwYXJhdG9yTWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5TZXBhcmF0b3I7XG59O1xuXG50eXBlIFBhZ2VNZXNzYWdlTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLlBhZ2U7XG4gIG1ldGFkYXRhOiBQYWdlUmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG50eXBlIFNlYXJjaE1lc3NhZ2VNZXRhZGF0YSA9IHtcbiAgdHlwZTogTWVzc2FnZVR5cGUuU2VhcmNoO1xuICBtZXRhZGF0YTogU2VhcmNoUmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG50eXBlIFByb2R1Y3RTZWFyY2hGaWx0ZXJNZXRhZGF0YSA9IHtcbiAgdHlwZTogTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaEZpbHRlcjtcbiAgbWV0YWRhdGE6IFNlYXJjaFByb2R1Y3RGaWx0ZXJBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG5leHBvcnQgdHlwZSBGb3JtRmllbGQgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB0eXBlOiBBY2NlcHRhYmxlRm9ybUZpZWxkVHlwZTtcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIC8vIHRoaXMgaXMgdGhlIG9ubHkgZm9ybWF0IHdlIGN1cnJlbnRseSBzdXBwb3J0XG4gIGZvcm1hdD86ICdlbWFpbCc7XG4gIHZhbHVlPzogc3RyaW5nO1xufTtcblxudHlwZSBGb3JtTWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5Gb3JtO1xuICBtZXRhZGF0YToge1xuICAgIGZvcm1UeXBlPzogRm9ybVR5cGU7XG4gICAgZmllbGRzOiBGb3JtRmllbGRbXTtcbiAgfTtcbn07XG5cbnR5cGUgT3JkZXJNZXNzYWdlTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLk9yZGVyO1xuICBtZXRhZGF0YTogT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXTtcbn07XG4iLCJleHBvcnQgY29uc3QgT3JnU2hvcnROYW1lID0ge1xuICBDb3RlcmllOiAnY290ZXJpZScsXG4gIEZvckxvdmVBbmRMZW1vbnM6ICdmb3ItbG92ZS1hbmQtbGVtb25zJyxcbiAgR3JlZW5wYW46ICdncmVlbnBhbicsXG4gIEpvcmRhbkNyYWlnOiAnam9yZGFuLWNyYWlnJyxcbiAgTGFycnlBbmRTZXJnZXM6ICdsYXJyeV9hbmRfc2VyZ2VzJyxcbiAgTGVhcHNBbmRSZWJvdW5kczogJ2xlYXBzLWFuZC1yZWJvdW5kcycsXG4gIE1hbnRyYUJyYW5kOiAnbWFudHJhLWJyYW5kJyxcbiAgU3Bhbng6ICdzcGFueCcsXG4gIFNwYW54U3RhZ2luZzogJ3N0YWdpbmctc3BhbngnLFxuICBTdXBlcmdvb3A6ICdzdXBlcmdvb3AnLFxuICBVbmlxdWVWaW50YWdlOiAndW5pcXVlLXZpbnRhZ2UnLFxuICBKYWNrQXJjaGVyOiAnamFjay1hcmNoZXInLFxuICAvKiAtLSBCZWxvdyBpdGVtcyBhcmUgZ2VuZXJhdGVkIGJ5IHBsb3AgLS0gKi9cbiAgU2tpblBlcmZlY3Rpb246ICdza2luLXBlcmZlY3Rpb24nLFxuICBMb29rT3B0aWM6ICdsb29rLW9wdGljJyxcbiAgRml2ZUNiZDogJ2ZpdmUtY2JkJyxcbiAgU25hcFN1cHBsZW1lbnRzOiAnc25hcC1zdXBwbGVtZW50cycsXG4gIExvbmdldml0eXJ4OiAnbG9uZ2V2aXR5cngnLFxuICBWZW5hQ2JkOiAndmVuYS1jYmQnLFxuICBNZWR0ZXJyYTogJ21lZHRlcnJhJyxcbiAgTW9kZWxsczogJ21vZGVsbHMnLFxuICBQcmVzc2VkRmxvcmFsOiAncHJlc3NlZC1mbG9yYWwnLFxuICBLaW5kcmVkQnJhdmVseTogJ2tpbmRyZWQtYnJhdmVseScsXG4gIFdpbmVFbnRodXNpYXN0OiAnd2luZS1lbnRodXNpYXN0JyxcbiAgSG9tZWdyb3duQ2FubmFiaXM6ICdob21lZ3Jvd24tY2FubmFiaXMnLFxuICBEcmVhbWxhbmRCYWJ5OiAnZHJlYW1sYW5kLWJhYnknLFxuICBCYW5kb2xpZXI6ICdiYW5kb2xpZXInLFxuICBXZXN0b25Kb25Cb3VjaGVyOiAnd2VzdG9uLWpvbi1ib3VjaGVyJyxcbiAgS3V0RnJvbVRoZUtsb3RoOiAna3V0LWZyb20tdGhlLWtsb3RoJyxcbiAgR3Jvb3ZlTGlmZTogJ2dyb292ZS1saWZlJyxcbiAgQ2FycGU6ICdjYXJwZScsXG4gIFdvbGZUYWN0aWNhbDogJ3dvbGYtdGFjdGljYWwnLFxuICBXb2xmTWF0dHJlc3M6ICd3b2xmbWF0dHJlc3MnLFxuICBEZWZhdWx0OiAnZGVmYXVsdCcsXG59IGFzIGNvbnN0O1xuIiwiZXhwb3J0IGVudW0gUHJvZHVjdEV4cGVyaW1lbnQge1xuICAvLyBEZWZhdWx0IGlzIG9ubHkgdXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgZW51bSBpcyBub24tZW1wdHksIG90aGVyd2lzZVxuICAvLyBjYWxsZXJzIHRoYXQgdHJ5IHRvIHVzZSB0aGlzIGVudW0gd2lsbCBnZW5lcmF0ZSBhIHR5cGVzY3JpcHQgZXJyb3JcbiAgRGVmYXVsdCA9ICdkZWZhdWx0Jyxcbn1cbiIsIi8qKlxuICogRW51bSBvZiBhbGwgd2lkZ2V0IG5hbWVzLiBUaGVzZSBhcmUgd2lkZ2V0cyB0aGF0IGFyZSByZW5kZXJlZCBhbmQgaW50ZWdyYXRlZCBpbnRvXG4gKiBhIG1lcmNoYW50J3Mgd2Vic2l0ZS5cbiAqL1xuZXhwb3J0IGVudW0gU3BpZmZ5V2lkZ2V0cyB7XG4gIEltYWdlQmFubmVyID0gJ2ltYWdlX2Jhbm5lcicsXG4gIEltYWdlUHJvbXB0Q2FyZCA9ICdpbWFnZV9wcm9tcHRfY2FyZCcsXG4gIFNpbmdsZUltYWdlUHJvbXB0ID0gJ3NpbmdsZV9pbWFnZV9wcm9tcHQnLFxuICBFbWJlZGRlZFdpZGdldCA9ICdlbWJlZGRlZF93aWRnZXQnLFxuICBGbG9hdGluZ0J1dHRvbiA9ICdmbG9hdGluZ19idXR0b24nLFxuICBTdWdnZXN0aW9uQmFyID0gJ3N1Z2dlc3Rpb25fYmFyJyxcbiAgU2VhcmNoUHJvbXB0ID0gJ3NlYXJjaF9wcm9tcHQnLFxuICBHbG9iYWxTZWFyY2ggPSAnZ2xvYmFsX3NlYXJjaCcsXG4gIFNlYXJjaFJlc3VsdHMgPSAnc2VhcmNoX3Jlc3VsdHMnLFxuICBHbG9iYWxTZWFyY2hFbnRyeVBvaW50ID0gJ2dsb2JhbF9zZWFyY2hfZW50cnlfcG9pbnQnLFxufVxuIiwiY29uc3QgZ2V0TWVyY2hhbnRPcmdJZFF1ZXJ5ID0gYFxuICBxdWVyeSB7XG4gICAgbWUge1xuICAgICAgb3JnIHtcbiAgICAgICAgaWRcbiAgICAgIH1cbiAgICB9XG4gIH1cbmA7XG5cbmV4cG9ydCB7IGdldE1lcmNoYW50T3JnSWRRdWVyeSB9O1xuIiwiaW1wb3J0IHR5cGUgeyBCYXNlRWNvbW1lcmNlRXZlbnQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZXZlbnQgaXMgYSBiYXNlIEdvb2dsZSBBbmFseXRpY3MgZWNvbW1lcmNlIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBkYXRhIFRoZSBldmVudCB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBldmVudCBpcyBhIGJhc2UgZWNvbW1lcmNlIGV2ZW50LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0Jhc2VFY29tbWVyY2VFdmVudCA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBCYXNlRWNvbW1lcmNlRXZlbnQgPT5cbiAgZGF0YSAhPSBudWxsICYmXG4gIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJlxuICAnZWNvbW1lcmNlJyBpbiBkYXRhICYmXG4gIGRhdGEuZWNvbW1lcmNlICE9IG51bGwgJiZcbiAgdHlwZW9mIGRhdGEuZWNvbW1lcmNlID09PSAnb2JqZWN0JyAmJlxuICAnZXZlbnQnIGluIGRhdGEgJiZcbiAgdHlwZW9mIGRhdGEuZXZlbnQgPT09ICdzdHJpbmcnO1xuIiwiaW1wb3J0IHR5cGUgeyBHQTRFY29tbWVyY2VFdmVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBhIEdvb2dsZSBBbmFseXRpY3MgNCBlY29tbWVyY2UgZXZlbnQuXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGV2ZW50IHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGV2ZW50IGlzIGEgR0E0IGVjb21tZXJjZSBldmVudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgY29uc3QgaXNHQTRFY29tbWVyY2VFdmVudCA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBHQTRFY29tbWVyY2VFdmVudCA9PlxuICB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgZGF0YSAhPSBudWxsICYmXG4gICdlY29tbWVyY2UnIGluIGRhdGEgJiZcbiAgZGF0YS5lY29tbWVyY2UgIT0gbnVsbCAmJlxuICB0eXBlb2YgZGF0YS5lY29tbWVyY2UgPT09ICdvYmplY3QnICYmXG4gICdpdGVtcycgaW4gZGF0YS5lY29tbWVyY2UgJiZcbiAgQXJyYXkuaXNBcnJheShkYXRhLmVjb21tZXJjZS5pdGVtcyk7XG4iLCJpbXBvcnQgdHlwZSB7IFVBRWNvbW1lcmNlRXZlbnQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZXZlbnQgaXMgYSBsZWdhY3kgVW5pdmVyc2FsIEFuYWx5dGljcyBlY29tbWVyY2UgZXZlbnQuXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGV2ZW50IHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGV2ZW50IGlzIGEgbGVnYWN5IFVBIGVjb21tZXJjZSBldmVudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgY29uc3QgaXNMZWdhY3lVQUVjb21tZXJjZUV2ZW50ID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIFVBRWNvbW1lcmNlRXZlbnQgPT5cbiAgZGF0YSAhPSBudWxsICYmXG4gIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJlxuICAnZWNvbW1lcmNlJyBpbiBkYXRhICYmXG4gIGRhdGEuZWNvbW1lcmNlICE9IG51bGwgJiZcbiAgdHlwZW9mIGRhdGEuZWNvbW1lcmNlID09PSAnb2JqZWN0JyAmJlxuICAnYWRkJyBpbiBkYXRhLmVjb21tZXJjZSAmJlxuICB0eXBlb2YgZGF0YS5lY29tbWVyY2UuYWRkID09PSAnb2JqZWN0JztcbiIsImludGVyZmFjZSBNb2JpbGVQbHBDaGF0UGxhY2VtZW50UGFyYW1ldGVyIHtcbiAgcm93X2luZGV4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBpc01vYmlsZVBMUENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIgPSAoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgTW9iaWxlUGxwQ2hhdFBsYWNlbWVudFBhcmFtZXRlciA9PlxuICB2YWx1ZSAhPSBudWxsICYmXG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgJ3Jvd19pbmRleCcgaW4gdmFsdWUgJiZcbiAgdHlwZW9mIHZhbHVlLnJvd19pbmRleCA9PT0gJ251bWJlcic7XG4iLCJpbXBvcnQgeyBTcGFueFRha2VBUXVpekN0YVBhcmFtZXRlciB9IGZyb20gJy4uL3NwYW54VGFrZUFRdWl6Q3RhUGFyYW1ldGVyJztcblxuZXhwb3J0IGNvbnN0IGlzU3BhbnhUYWtlQVF1aXpDdGFQYXJhbWV0ZXIgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTcGFueFRha2VBUXVpekN0YVBhcmFtZXRlciA9PlxuICB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgJ3RleHQnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50ZXh0ID09PSAnc3RyaW5nJzsiLCJpbXBvcnQgeyBQYWdlVmlzaXRDYXRlZ29yeSB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBQRFBWYXJpYW50SW5mbywgUExQVmFyaWFudEluZm8sIFBhZ2VWaXNpdFZhcmlhbnRJbmZvLCBWYXJpYW50SW5mbyB9IGZyb20gJy4uL3ZhcmlhbnRJbmZvJztcblxuY29uc3QgaXNQRFBWYXJpYW50SW5mbyA9ICh2YXJpYW50SW5mbzogb2JqZWN0KTogdmFyaWFudEluZm8gaXMgUERQVmFyaWFudEluZm8gPT5cbiAgJ3ZhcmlhbnQnIGluIHZhcmlhbnRJbmZvICYmXG4gIHZhcmlhbnRJbmZvLnZhcmlhbnQgPT09ICdwZHAnICYmXG4gICdwcm9kdWN0SWQnIGluIHZhcmlhbnRJbmZvICYmXG4gIHR5cGVvZiB2YXJpYW50SW5mby5wcm9kdWN0SWQgPT09ICdzdHJpbmcnO1xuXG5jb25zdCBpc1BMUFZhcmlhbnRJbmZvID0gKHZhcmlhbnRJbmZvOiBvYmplY3QpOiB2YXJpYW50SW5mbyBpcyBQTFBWYXJpYW50SW5mbyA9PlxuICAndmFyaWFudCcgaW4gdmFyaWFudEluZm8gJiZcbiAgdmFyaWFudEluZm8udmFyaWFudCA9PT0gJ3BscCcgJiZcbiAgJ3BscElkJyBpbiB2YXJpYW50SW5mbyAmJlxuICB0eXBlb2YgdmFyaWFudEluZm8ucGxwSWQgPT09ICdzdHJpbmcnO1xuXG5jb25zdCBpc1BhZ2VWaXNpdFZhcmlhbnRJbmZvID0gKHZhcmlhbnRJbmZvOiBvYmplY3QpOiB2YXJpYW50SW5mbyBpcyBQYWdlVmlzaXRWYXJpYW50SW5mbyA9PlxuICAndmFyaWFudCcgaW4gdmFyaWFudEluZm8gJiZcbiAgdmFyaWFudEluZm8udmFyaWFudCA9PT0gJ3BhZ2VfdmlzaXQnICYmXG4gICd1cmwnIGluIHZhcmlhbnRJbmZvICYmXG4gIHR5cGVvZiB2YXJpYW50SW5mby51cmwgPT09ICdzdHJpbmcnICYmXG4gICdwYWdlVmlzaXRDYXRlZ29yeScgaW4gdmFyaWFudEluZm8gJiZcbiAgT2JqZWN0LnZhbHVlcyhQYWdlVmlzaXRDYXRlZ29yeSkuaW5jbHVkZXModmFyaWFudEluZm8ucGFnZVZpc2l0Q2F0ZWdvcnkgYXMgUGFnZVZpc2l0Q2F0ZWdvcnkpO1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgdmFsaWQgVmFyaWFudEluZm8uXG4gKlxuICogQHBhcmFtIHZhcmlhbnRJbmZvIC0gVGhlIHVua25vd24gb2JqZWN0IHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGRhdGEgaXMgYSB2YWxpZCBWYXJpYW50SW5mbyBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVmFyaWFudEluZm8gPSAodmFyaWFudEluZm86IHVua25vd24pOiB2YXJpYW50SW5mbyBpcyBWYXJpYW50SW5mbyA9PlxuICB2YXJpYW50SW5mbyAhPSBudWxsICYmXG4gIHR5cGVvZiB2YXJpYW50SW5mbyA9PT0gJ29iamVjdCcgJiZcbiAgJ3ZhcmlhbnRJZCcgaW4gdmFyaWFudEluZm8gJiZcbiAgKGlzUERQVmFyaWFudEluZm8odmFyaWFudEluZm8pIHx8XG4gICAgaXNQTFBWYXJpYW50SW5mbyh2YXJpYW50SW5mbykgfHxcbiAgICBpc1BhZ2VWaXNpdFZhcmlhbnRJbmZvKHZhcmlhbnRJbmZvKSk7XG4iLCJpbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5pbXBvcnQgeyBGb3JtVHlwZSB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvcmVzcG9uc2VHZW5lcmljcyc7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0eU9mVHlwZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL3V0aWxzJztcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIHRoZSBwcm92aWRlZCBkYXRhIGhhcyB0aGUgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzICh3aXRoIHRoZSBjb3JyZWN0IHR5cGVzKSBvZlxuICogYSBGb3JtUmVzcG9uc2VBdHRyaWJ1dGVcbiAqXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZGF0YSBoYXMgdGhlIGNvcnJlY3QgcHJvcGVydGllcywgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBjb25zdCBpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXMgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlcyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXM6IGRhdGEgaXMgbnVsbCBvciBub3QgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnZm9ybV9jYXRlZ29yeScgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5mb3JtX2NhdGVnb3J5ICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dFcnJvcignaXNBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzOiBmb3JtX2NhdGVnb3J5IGlzIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCdmb3JtX2NhdGVnb3J5JyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLmZvcm1fY2F0ZWdvcnkgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKFxuICAgICAgIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEuZm9ybV9jYXRlZ29yeSwgJ2Zvcm1fdHlwZScsICdzdHJpbmcnKSB8fFxuICAgICAgIU9iamVjdC52YWx1ZXMoRm9ybVR5cGUpLmluY2x1ZGVzKGRhdGEuZm9ybV9jYXRlZ29yeS5mb3JtX3R5cGUgYXMgRm9ybVR5cGUpXG4gICAgKSB7XG4gICAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAgICdpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXM6IGZvcm1fdHlwZSBpcyBtaXNzaW5nIG9yIG5vdCBhIHZhbGlkIGZvcm0gdHlwZScsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ3NjaGVtYScsICdvYmplY3QnKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignaXNBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzOiBzY2hlbWEgaXMgbWlzc2luZyBvciBub3QgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRPRE86IGFsc28gd2FubmEgdmFsaWRhdGUgdGhlIGZpZWxkcyBvZiBkYXRhLnNjaGVtYS5wcm9wZXJ0aWVzIGJ1dCBtaWdodCB3YW5uYSBjaGFuZ2UgdGhlIHNjaGVtYVxuICAvLyB0byBub3QgaGF2ZSB0aGUgcHJvcGVydHkgbmFtZSBhcyBhIGtleSBpbiB0aGUgb2JqZWN0XG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YS5zY2hlbWEsICdwcm9wZXJ0aWVzJywgJ29iamVjdCcpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ2lzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlczogc2NoZW1hLnByb3BlcnRpZXMgaXMgbWlzc2luZyBvciBub3QgYW4gb2JqZWN0JyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEuc2NoZW1hLCAncmVxdWlyZWQnLCAnYXJyYXknKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXM6IHNjaGVtYS5yZXF1aXJlZCBpcyBtaXNzaW5nIG9yIG5vdCBhbiBhcnJheScsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7IGRhdGEgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhZGF0YS5zY2hlbWEucmVxdWlyZWQuZXZlcnkoXG4gICAgICAoa2V5OiB1bmtub3duKSA9PiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkgaW4gZGF0YS5zY2hlbWEucHJvcGVydGllcyxcbiAgICApXG4gICkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXM6IHNjaGVtYS5yZXF1aXJlZCBjb250YWlucyBpbnZhbGlkIHByb3BlcnR5IGtleXMnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsImltcG9ydCBMb2dnZXIgZnJvbSAnc3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyJztcbmltcG9ydCB7IEZvcm1TdWJtaXR0ZWRBdHRyaWJ1dGVzLCBGb3JtVHlwZSB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0eU9mVHlwZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGlzQXBpRm9ybVN1Ym1pdHRlZFJlc3BvbnNlQXR0cmlidXRlcyA9IChcbiAgZGF0YTogdW5rbm93bixcbik6IGRhdGEgaXMgRm9ybVN1Ym1pdHRlZEF0dHJpYnV0ZXMgPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dFcnJvcignaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzJywgJ2RhdGEgaXMgbnVsbCBvciBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnZmlsbGVkX3NjaGVtYScsICdvYmplY3QnKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzJywgJ2ZpbGxlZF9zY2hlbWEgaXMgbm90IGFuIG9iamVjdCcsIGRhdGEpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2Zvcm1fcmVzcG9uc2VfaWQnLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzJyxcbiAgICAgICdmb3JtX3Jlc3BvbnNlX2lkIGlzIG5vdCBhIHN0cmluZycsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2Zvcm1fdHlwZScgaW4gZGF0YSkgfHwgIU9iamVjdC52YWx1ZXMoRm9ybVR5cGUpLmluY2x1ZGVzKGRhdGEuZm9ybV90eXBlIGFzIEZvcm1UeXBlKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdpc0FwaUZvcm1TdWJtaXR0ZWRSZXNwb25zZUF0dHJpYnV0ZXMnLFxuICAgICAgJ2Zvcm1fdHlwZSBpcyBub3QgYSB2YWxpZCBmb3JtIHR5cGUgZW51bScsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiaW1wb3J0IExvZ2dlciBmcm9tICdzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXInO1xuaW1wb3J0IHsgT3JkZXJJdGVtSW5mbywgT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgaGFzUHJvcGVydHlPZlR5cGUgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy91dGlscyc7XG5cbi8vIHRoZSBjbGllbnQgU0RLIGdlbmVyYXRlcyBkYXRlLXRpbWUgZm9ybWF0IHR5cGVzIGFzIGBEYXRlYCBidXQgdGhlIG9wZW5hcGkgdHlwZXNjcmlwdCBnZW5lcmF0b3Jcbi8vIGRvZXMgbm90IGNvcnJlY3RseSBkZXNlcmlhbGl6ZSBkYXRlLXRpbWUgdmFsdWVzIHNvIHRoZXkgYXJlIGFsd2F5cyBgc3RyaW5nYCBhdCBydW50aW1lIGluc3RlYWQgb2Zcbi8vIGBEYXRlYCBvYmplY3RzLiBUaGVzZSBpbnRlcmZhY2VzIG92ZXJyaWRlIHRoZSBTREsgdHlwZXMgc28gdGhhdCB3ZSBjYW4gdmFsaWRhdGUgYWdhaW5zdCB0aGUgYWN0dWFsXG4vLyBgc3RyaW5nYCB2YWx1ZXMuIGh0dHBzOi8vZ2l0aHViLmNvbS9PcGVuQVBJVG9vbHMvb3BlbmFwaS1nZW5lcmF0b3IvaXNzdWVzLzkyNlxuZXhwb3J0IGludGVyZmFjZSBBcGlPcmRlckl0ZW1JbmZvXG4gIGV4dGVuZHMgT21pdDxPcmRlckl0ZW1JbmZvLCAnZGVsaXZlcmVkX2F0JyB8ICdlc3RpbWF0ZWRfZGVsaXZlcnlfYXQnIHwgJ2luX3RyYW5zaXRfYXQnPiB7XG4gIGRlbGl2ZXJlZF9hdD86IHN0cmluZztcbiAgZXN0aW1hdGVkX2RlbGl2ZXJ5X2F0Pzogc3RyaW5nO1xuICBpbl90cmFuc2l0X2F0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwaU9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzXG4gIGV4dGVuZHMgT21pdDxPcmRlclJlc3BvbnNlQXR0cmlidXRlcywgJ2NyZWF0ZWRfYXQnIHwgJ2xhdGVzdF9ldmVudF9kYXRlJyB8ICdsaW5lX2l0ZW1zJz4ge1xuICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gIGxhdGVzdF9ldmVudF9kYXRlOiBzdHJpbmc7XG4gIGxpbmVfaXRlbXM6IEFwaU9yZGVySXRlbUluZm9bXTtcbn1cblxuY29uc3QgaXNBcGlPcmRlckl0ZW1JbmZvID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZGVySXRlbUluZm8gPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mbyBtdXN0IGJlIGFuIG9iamVjdCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ29yZGVyX2l0ZW1faWQnLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVySXRlbUluZm8gbXVzdCBoYXZlIGFuIG9yZGVyX2l0ZW1faWQgcHJvcGVydHknLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdpdGVtX3RpdGxlJywgJ3N0cmluZycpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdPcmRlckl0ZW1JbmZvIG11c3QgaGF2ZSBhbiBpdGVtX3RpdGxlIHByb3BlcnR5JywgdW5kZWZpbmVkLCB7IGRhdGEgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnaXRlbV9wcmljZScsICdudW1iZXInKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mbyBtdXN0IGhhdmUgYW4gaXRlbV9wcmljZSBwcm9wZXJ0eScsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2l0ZW1fcXVhbnRpdHknLCAnbnVtYmVyJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVySXRlbUluZm8gbXVzdCBoYXZlIGFuIGl0ZW1fcXVhbnRpdHkgcHJvcGVydHknLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdpbWFnZScsICdzdHJpbmcnLCB0cnVlKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mby5pbWFnZSBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwnLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdmdWxmaWxsbWVudF9kaXNwbGF5X3N0YXR1cycsICdzdHJpbmcnLCB0cnVlKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdPcmRlckl0ZW1JbmZvLmZ1bGZpbGxtZW50X2Rpc3BsYXlfc3RhdHVzIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbCcsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAndHJhY2tpbmdfdXJsJywgJ3N0cmluZycsIHRydWUpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdPcmRlckl0ZW1JbmZvLnRyYWNraW5nX3VybCBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwnLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdkZWxpdmVyZWRfYXQnLCAnc3RyaW5nJywgdHJ1ZSkpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVySXRlbUluZm8uZGVsaXZlcmVkX2F0IG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2VzdGltYXRlZF9kZWxpdmVyeV9hdCcsICdzdHJpbmcnLCB0cnVlKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mby5lc3RpbWF0ZWRfZGVsaXZlcnlfYXQgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2luX3RyYW5zaXRfYXQnLCAnc3RyaW5nJywgdHJ1ZSkpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVySXRlbUluZm8uaW5fdHJhbnNpdF9hdCBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwnLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0FwaU9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVyIHJlc3BvbnNlIGF0dHJpYnV0ZXMgbXVzdCBiZSBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdjcmVhdGVkX2F0JywgJ3N0cmluZycpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ09yZGVyIHJlc3BvbnNlIGF0dHJpYnV0ZXMgbXVzdCBoYXZlIGEgY3JlYXRlZF9hdCBwcm9wZXJ0eSBhbmQgaGF2ZSB0eXBlIHN0cmluZycsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnbGF0ZXN0X2V2ZW50X2RhdGUnLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnT3JkZXIgcmVzcG9uc2UgYXR0cmlidXRlcyBtdXN0IGhhdmUgYSBsYXRlc3RfZXZlbnRfZGF0ZSBwcm9wZXJ0eSBhbmQgaGF2ZSB0eXBlIHN0cmluZycsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnbGluZV9pdGVtcycsICdhcnJheScpIHx8XG4gICAgIWRhdGEubGluZV9pdGVtcy5ldmVyeSgoaXRlbTogdW5rbm93bikgPT4gaXNBcGlPcmRlckl0ZW1JbmZvKGl0ZW0pKVxuICApIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnT3JkZXIgcmVzcG9uc2UgYXR0cmlidXRlcyBtdXN0IGhhdmUgYSBsaW5lX2l0ZW1zIHByb3BlcnR5IHdpdGggYXQgbGVhc3Qgb25lIG9yZGVyIGl0ZW0nLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ29yZGVyX2lkJywgJ3N0cmluZycpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ09yZGVyIHJlc3BvbnNlIGF0dHJpYnV0ZXMgbXVzdCBoYXZlIGFuIG9yZGVyX2lkIHByb3BlcnR5IGFuZCBoYXZlIHR5cGUgc3RyaW5nJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdvcmRlcl9udW1iZXInLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnT3JkZXIgcmVzcG9uc2UgYXR0cmlidXRlcyBtdXN0IGhhdmUgYW4gb3JkZXJfbnVtYmVyIHByb3BlcnR5IGFuZCBoYXZlIHR5cGUgc3RyaW5nJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Db25maWcgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuXG4vLyB0aGUgXCJjb25maWdcIiBwcm9wZXJ0eSBpcyBhIGdlbmVyaWMgb2JqZWN0IGluIHRoZSBjb21tZXJjZSBhcGkgc3BlYywgdGhlc2UgaW50ZXJmYWNlc1xuLy8gYXJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHN0cnVjdHVyZSBvZiB0aGF0IG9iamVjdCBhbmQgdG8gdHJhbnNmb3JtIHRoZSBhcGkgcmVzcG9uc2Vcbi8vIGludG8gYSB0eXBlZCBvYmplY3QgZm9yIHRoZSBmcm9udGVuZC4gRG8gbm90IHVzZSB0aGVzZSBpbnRlcmZhY2VzIGZvciBhbnl0aGluZyBlbHNlLlxuaW50ZXJmYWNlIEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZSB7XG4gIHNlc3Npb25fcmVwbGF5X2VuYWJsZWQ6IGJvb2xlYW47XG4gIHNlc3Npb25fcmVwbGF5X3NhbXBsZV9yYXRlOiBudW1iZXI7XG4gIHRyYWNraW5nX2VuYWJsZWQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBcGlPcmdBbmFseXRpY3NDb25maWdDdXN0b21lclNlcnZpY2Uge1xuICBwcm92aWRlcjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBpT3JnQW5hbHl0aWNzQ29uZmlnR29vZ2xlQW5hbHl0aWNzIHtcbiAgbWVhc3VyZW1lbnRfaWQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEFwaU9yZ0FuYWx5dGljc0NvbmZpZyB7XG4gIGFtcGxpdHVkZT86IEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZTtcbiAgY3VzdG9tZXJfc2VydmljZT86IEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0N1c3RvbWVyU2VydmljZTtcbiAgZ29vZ2xlX2FuYWx5dGljcz86IEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0dvb2dsZUFuYWx5dGljcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcGlPcmdhbml6YXRpb25Db25maWcgZXh0ZW5kcyBPcmdhbml6YXRpb25Db25maWcge1xuICBjb25maWc6IEFwaU9yZ0FuYWx5dGljc0NvbmZpZztcbn1cblxuY29uc3QgaXNBcGlPcmdBbmFseXRpY3NDb25maWdBbXBsaXR1ZGUgPSAoXG4gIGRhdGE6IHVua25vd24sXG4pOiBkYXRhIGlzIEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZSA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZTogZGF0YSBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ3Nlc3Npb25fcmVwbGF5X2VuYWJsZWQnIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLnNlc3Npb25fcmVwbGF5X2VuYWJsZWQgIT09ICdib29sZWFuJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZTogc2Vzc2lvbl9yZXBsYXlfZW5hYmxlZCBpcyBub3QgYSBib29sZWFuJyxcbiAgICAgIGRhdGEsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgISgnc2Vzc2lvbl9yZXBsYXlfc2FtcGxlX3JhdGUnIGluIGRhdGEpIHx8XG4gICAgdHlwZW9mIGRhdGEuc2Vzc2lvbl9yZXBsYXlfc2FtcGxlX3JhdGUgIT09ICdudW1iZXInXG4gICkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZTogc2Vzc2lvbl9yZXBsYXlfc2FtcGxlX3JhdGUgaXMgbm90IGEgbnVtYmVyJyxcbiAgICAgIGRhdGEsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgndHJhY2tpbmdfZW5hYmxlZCcgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEudHJhY2tpbmdfZW5hYmxlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlOiB0cmFja2luZ19lbmFibGVkIGlzIG5vdCBhIGJvb2xlYW4nLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgaXNBcGlPcmdBbmFseXRpY3NDb25maWdDdXN0b21lclNlcnZpY2UgPSAoXG4gIGRhdGE6IHVua25vd24sXG4pOiBkYXRhIGlzIEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0N1c3RvbWVyU2VydmljZSA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQ3VzdG9tZXJTZXJ2aWNlOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdwcm92aWRlcicgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEucHJvdmlkZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQ3VzdG9tZXJTZXJ2aWNlOiBwcm92aWRlciBpcyBub3QgYSBzdHJpbmcnLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgaXNBcGlPcmdBbmFseXRpY3NDb25maWdHb29nbGVBbmFseXRpY3MgPSAoXG4gIGRhdGE6IHVua25vd24sXG4pOiBkYXRhIGlzIEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0dvb2dsZUFuYWx5dGljcyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnR29vZ2xlQW5hbHl0aWNzOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdtZWFzdXJlbWVudF9pZCcgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEubWVhc3VyZW1lbnRfaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnR29vZ2xlQW5hbHl0aWNzOiBtZWFzdXJlbWVudF9pZCBpcyBub3QgYSBzdHJpbmcnLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIGRhdGFcbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZ0FuYWx5dGljc0NvbmZpZyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0FuYWx5dGljc0NvbmZpZzogZGF0YSBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICdhbXBsaXR1ZGUnIGluIGRhdGEgJiZcbiAgICAhaXNBcGlPcmdBbmFseXRpY3NDb25maWdBbXBsaXR1ZGUoZGF0YS5hbXBsaXR1ZGUpXG4gICkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNPcmdBbmFseXRpY3NDb25maWc6IGFtcGxpdHVkZSBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICdjdXN0b21lcl9zZXJ2aWNlJyBpbiBkYXRhICYmXG4gICAgIWlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQ3VzdG9tZXJTZXJ2aWNlKGRhdGEuY3VzdG9tZXJfc2VydmljZSlcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0FuYWx5dGljc0NvbmZpZzogY3VzdG9tZXJfc2VydmljZSBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICdnb29nbGVfYW5hbHl0aWNzJyBpbiBkYXRhICYmXG4gICAgIWlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnR29vZ2xlQW5hbHl0aWNzKGRhdGEuZ29vZ2xlX2FuYWx5dGljcylcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0FuYWx5dGljc0NvbmZpZzogZ29vZ2xlX2FuYWx5dGljcyBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gZGF0YVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzQXBpT3JnYW5pemF0aW9uQ29uZmlnID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZ2FuaXphdGlvbkNvbmZpZyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogZGF0YSBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2NyZWF0ZWRfYXQnIGluIGRhdGEpKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogY3JlYXRlZF9hdCBpcyBub3QgZGVmaW5lZCcsIGRhdGEpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCduYW1lc3BhY2UnIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLm5hbWVzcGFjZSAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBuYW1lc3BhY2UgaXMgbm90IGEgc3RyaW5nJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2lzX2xhdGVzdCcgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEuaXNfbGF0ZXN0ICE9PSAnYm9vbGVhbicpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBpc19sYXRlc3QgaXMgbm90IGEgYm9vbGVhbicsIGRhdGEpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCd2ZXJzaW9uJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS52ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNPcmdDb25maWc6IHZlcnNpb24gaXMgbm90IGEgc3RyaW5nJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ3VwZGF0ZWRfYXQnIGluIGRhdGEpKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogdXBkYXRlZF9hdCBpcyBub3QgZGVmaW5lZCcsIGRhdGEpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhKCdjb25maWcnIGluIGRhdGEpIHx8XG4gICAgdHlwZW9mIGRhdGEuY29uZmlnICE9PSAnb2JqZWN0JyB8fFxuICAgICFpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZyhkYXRhLmNvbmZpZylcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogY29uZmlnIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ29yZ2FuaXphdGlvbl9pZCcgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5vcmdhbml6YXRpb25faWQgIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogb3JnYW5pemF0aW9uX2lkIGlzIG5vdCBhIHN0cmluZycsIGRhdGEpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnaWQnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEuaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogaWQgaXMgbm90IGEgc3RyaW5nJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiaW1wb3J0IExvZ2dlciBmcm9tICdzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXInO1xuaW1wb3J0IHtcbiAgU3RhdHNpZ0V4cGVyaW1lbnQgYXMgQXBpT3JnQ29uZmlnRXhwZXJpbWVudCxcbiAgU3RhdHNpZ0ZlYXR1cmVHYXRlIGFzIEFwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlLFxuICBPcmdhbml6YXRpb25TZXR0aW5ncyBhcyBBcGlPcmdDb25maWdPcmdhbml6YXRpb25TZXR0aW5ncyxcbiAgT3JnYW5pemF0aW9uIGFzIEFwaU9yZ2FuaXphdGlvbixcbiAgT3JnYW5pemF0aW9uU3RhdHVzRW51bSxcbn0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IEFwaU9yZ2FuaXphdGlvbkNvbmZpZywgaXNBcGlPcmdhbml6YXRpb25Db25maWcgfSBmcm9tICcuL2lzQXBpT3JnYW5pemF0aW9uQ29uZmlnJztcblxuaW50ZXJmYWNlIEFwaU9yZ0NvbmZpZ1Jlc3VsdHMge1xuICBjb25maWdzOiBBcGlPcmdhbml6YXRpb25Db25maWdbXTtcbiAgZXhwZXJpbWVudHM6IEFwaU9yZ0NvbmZpZ0V4cGVyaW1lbnRbXTtcbiAgZ2F0ZXM6IEFwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlW107XG4gIG9yZzogQXBpT3JnQ29uZmlnT3JnYW5pemF0aW9uU2V0dGluZ3M7XG59XG5cbmNvbnN0IGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudCA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBBcGlPcmdDb25maWdFeHBlcmltZW50ID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudDogZGF0YSBpcyBub3QgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnZ3JvdXAnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEuZ3JvdXAgIT09ICdzdHJpbmcnICYmIGRhdGEuZ3JvdXAgIT09IHVuZGVmaW5lZCkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ0V4cGVyaW1lbnQ6IGdyb3VwIGlzIG5vdCBhIHN0cmluZyBvciB1bmRlZmluZWQnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAnZ3JvdXBfbmFtZScgaW4gZGF0YSAmJlxuICAgIHR5cGVvZiBkYXRhLmdyb3VwX25hbWUgIT09ICdzdHJpbmcnICYmXG4gICAgZGF0YS5ncm91cF9uYW1lICE9PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ0V4cGVyaW1lbnQ6IGdyb3VwX25hbWUgaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnbmFtZScgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5uYW1lICE9PSAnc3RyaW5nJyAmJiBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdFeHBlcmltZW50OiBuYW1lIGlzIG5vdCBhIHN0cmluZycsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ3J1bGVfaWQnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEucnVsZV9pZCAhPT0gJ3N0cmluZycgJiYgZGF0YS5ydWxlX2lkICE9PSB1bmRlZmluZWQpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudDogcnVsZV9pZCBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCd2YWx1ZScgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS52YWx1ZSAhPT0gJ29iamVjdCcgJiYgZGF0YS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ0V4cGVyaW1lbnQ6IHZhbHVlIGlzIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5jb25zdCBpc0FwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGU6IGRhdGEgaXMgbm90IGFuIG9iamVjdCcsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ25hbWUnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEubmFtZSAhPT0gJ3N0cmluZycgJiYgZGF0YS5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGU6IG5hbWUgaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgncnVsZV9pZCcgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5ydWxlX2lkICE9PSAnc3RyaW5nJyAmJiBkYXRhLnJ1bGVfaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdGZWF0dXJlR2F0ZTogcnVsZV9pZCBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCd2YWx1ZScgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS52YWx1ZSAhPT0gJ2Jvb2xlYW4nICYmIGRhdGEudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdGZWF0dXJlR2F0ZTogdmFsdWUgaXMgbm90IGEgYm9vbGVhbicsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmNvbnN0IGlzQXBpT3JnYW5pemF0aW9uID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZ2FuaXphdGlvbiA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ2FuaXphdGlvbjogZGF0YSBpcyBub3QgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdpZCcgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEuaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ2FuaXphdGlvbjogaWQgaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdkaXNwbGF5X25hbWUnIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLmRpc3BsYXlfbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnYW5pemF0aW9uOiBkaXNwbGF5X25hbWUgaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdkb21haW4nIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLmRvbWFpbiAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnYW5pemF0aW9uOiBkb21haW4gaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdzaG9ydF9uYW1lJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS5zaG9ydF9uYW1lICE9PSAnc3RyaW5nJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdhbml6YXRpb246IHNob3J0X25hbWUgaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhKCdzdGF0dXMnIGluIGRhdGEpIHx8XG4gICAgIU9iamVjdC52YWx1ZXMoT3JnYW5pemF0aW9uU3RhdHVzRW51bSkuaW5jbHVkZXMoZGF0YS5zdGF0dXMgYXMgT3JnYW5pemF0aW9uU3RhdHVzRW51bSlcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnYW5pemF0aW9uOiBzdGF0dXMgaXMgbm90IGEgdmFsaWQgT3JnYW5pemF0aW9uU3RhdHVzRW51bSB2YWx1ZScsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICdjcmVhdGVkX2F0JyBpbiBkYXRhICYmXG4gICAgIShkYXRhLmNyZWF0ZWRfYXQgaW5zdGFuY2VvZiBEYXRlKSAmJlxuICAgIHR5cGVvZiBkYXRhLmNyZWF0ZWRfYXQgIT09ICdzdHJpbmcnICYmXG4gICAgZGF0YS5jcmVhdGVkX2F0ICE9PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ2FuaXphdGlvbjogY3JlYXRlZF9hdCBpcyBub3QgYSBEYXRlJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAndXBkYXRlZF9hdCcgaW4gZGF0YSAmJlxuICAgICEoZGF0YS51cGRhdGVkX2F0IGluc3RhbmNlb2YgRGF0ZSkgJiZcbiAgICB0eXBlb2YgZGF0YS51cGRhdGVkX2F0ICE9PSAnc3RyaW5nJyAmJlxuICAgIGRhdGEudXBkYXRlZF9hdCAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdhbml6YXRpb246IHVwZGF0ZWRfYXQgaXMgbm90IGEgRGF0ZScsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmNvbnN0IGlzQXBpT3JnQ29uZmlnT3JnYW5pemF0aW9uU2V0dGluZ3MgPSAoXG4gIGRhdGE6IHVua25vd24sXG4pOiBkYXRhIGlzIEFwaU9yZ0NvbmZpZ09yZ2FuaXphdGlvblNldHRpbmdzID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdPcmdhbml6YXRpb25TZXR0aW5nczogZGF0YSBpcyBub3QgYW4gb2JqZWN0JyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnb3JnJyBpbiBkYXRhKSB8fCAhaXNBcGlPcmdhbml6YXRpb24oZGF0YS5vcmcpKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnT3JnYW5pemF0aW9uU2V0dGluZ3M6IG9yZyBpcyBub3QgYW4gb2JqZWN0JyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBza2lwIHZhbGlkYXRpb24gZm9yICdzZXR0aW5ncycgZm9yIG5vd1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIGRhdGFcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBpc0FwaU9yZ0NvbmZpZ1Jlc3VsdHMgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgUmVxdWlyZWQ8QXBpT3JnQ29uZmlnUmVzdWx0cz4gPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdSZXN1bHRzOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICEoJ2NvbmZpZ3MnIGluIGRhdGEpIHx8XG4gICAgIUFycmF5LmlzQXJyYXkoZGF0YS5jb25maWdzKSB8fFxuICAgICFkYXRhLmNvbmZpZ3MuZXZlcnkoKGNvbmZpZykgPT4gaXNBcGlPcmdhbml6YXRpb25Db25maWcoY29uZmlnKSlcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ1Jlc3VsdHM6IGNvbmZpZ3MgaXMgbm90IGFuIGFycmF5JywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAnZXhwZXJpbWVudHMnIGluIGRhdGEgJiZcbiAgICBkYXRhLmV4cGVyaW1lbnRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAoIUFycmF5LmlzQXJyYXkoZGF0YS5leHBlcmltZW50cykgfHxcbiAgICAgICFkYXRhLmV4cGVyaW1lbnRzLmV2ZXJ5KChleHApID0+IGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudChleHApKSlcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnUmVzdWx0czogZXhwZXJpbWVudHMgaXMgbm90IGFuIGFycmF5IG9yIGNvbnRhaW5zIGludmFsaWQgaXRlbXMnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhKCdnYXRlcycgaW4gZGF0YSkgfHxcbiAgICAhQXJyYXkuaXNBcnJheShkYXRhLmdhdGVzKSB8fFxuICAgICFkYXRhLmdhdGVzLmV2ZXJ5KChnYXRlKSA9PiBpc0FwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlKGdhdGUpKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdSZXN1bHRzOiBnYXRlcyBpcyBub3QgYW4gYXJyYXkgb3IgY29udGFpbnMgaW52YWxpZCBpdGVtcycsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ29yZycgaW4gZGF0YSkgfHwgIWlzQXBpT3JnQ29uZmlnT3JnYW5pemF0aW9uU2V0dGluZ3MoZGF0YS5vcmcpKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnUmVzdWx0czogb3JnIGlzIG5vdCBhbiBvYmplY3Qgb3IgaGFzIGludmFsaWQgZmllbGRzJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHsgZGF0YSB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgeyBBcGlQYWdlUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvcmVzcG9uc2VHZW5lcmljcyc7XG5cbmV4cG9ydCBjb25zdCBpc0FwaVBhZ2VSZXNwb25zZUF0dHJpYnV0ZXMgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIEFwaVBhZ2VSZXNwb25zZUF0dHJpYnV0ZXMgPT4ge1xuICBpZiAob2JqID09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ3RpdGxlJyBpbiBvYmogJiYgb2JqLnRpdGxlICE9IG51bGwgJiYgdHlwZW9mIG9iai50aXRsZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ2Rlc2NyaXB0aW9uJyBpbiBvYmogJiYgdHlwZW9mIG9iai5kZXNjcmlwdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ3VybCcgaW4gb2JqICYmIHR5cGVvZiBvYmoudXJsICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsImltcG9ydCB7XG4gIFBMUEF0dHJpYnV0ZUNhdGVnb3J5LFxuICBQTFBBdHRyaWJ1dGVzLFxuICBQTFBJZEF0dHJpYnV0ZXMsXG59IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBpc0FwaVBMUElkQXR0cmlidXRlID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIFBMUElkQXR0cmlidXRlcyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2lkJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS5pZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0FwaVBMUEV2ZW50QXR0cmlidXRlcyA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBQTFBBdHRyaWJ1dGVzID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgISgnY2F0ZWdvcnknIGluIGRhdGEpIHx8XG4gICAgdHlwZW9mIGRhdGEuY2F0ZWdvcnkgIT09ICdzdHJpbmcnIHx8XG4gICAgIU9iamVjdC52YWx1ZXMoUExQQXR0cmlidXRlQ2F0ZWdvcnkpLmluY2x1ZGVzKGRhdGEuY2F0ZWdvcnkgYXMgUExQQXR0cmlidXRlQ2F0ZWdvcnkpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhKCdhdHRyaWJ1dGVzJyBpbiBkYXRhKSB8fFxuICAgIHR5cGVvZiBkYXRhLmF0dHJpYnV0ZXMgIT09ICdvYmplY3QnIHx8XG4gICAgIWlzQXBpUExQSWRBdHRyaWJ1dGUoZGF0YS5hdHRyaWJ1dGVzKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgeyBQcm9kdWN0U2VhcmNoRmlsdGVyUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IGlzQXBpUHJvZHVjdFNlYXJjaEZpbHRlclJlc3BvbnNlQXR0cmlidXRlcyA9IChcbiAgYXR0cmlidXRlczogdW5rbm93bixcbik6IGF0dHJpYnV0ZXMgaXMgUHJvZHVjdFNlYXJjaEZpbHRlclJlc3BvbnNlQXR0cmlidXRlcyA9PiB7XG4gIGlmIChhdHRyaWJ1dGVzID09IG51bGwgfHwgdHlwZW9mIGF0dHJpYnV0ZXMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCdmaWx0ZXJfbmFtZScgaW4gYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcy5maWx0ZXJfbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5pbXBvcnQgeyBHZXRNZXJjaGFudENvbG9yc1F1ZXJ5RGF0YSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3JhcGhxbCc7XG5cbmNvbnN0IFJFUVVJUkVEX0NPTE9SX0ZJRUxEUyA9IFtcbiAgJ2FjY2VudF9wcmltYXJ5JyxcbiAgJ2FjY2VudF9zZWNvbmRhcnknLFxuICAnYmFja2dyb3VuZF9kYXJrJyxcbiAgJ2JhY2tncm91bmRfbGlnaHQnLFxuICAnYmFja2dyb3VuZF9wcmltYXJ5JyxcbiAgJ2JhY2tncm91bmRfc2F0dXJhdGVkJyxcbiAgJ2JhY2tncm91bmRfc2Vjb25kYXJ5JyxcbiAgJ2JhY2tncm91bmRfc2Vjb25kYXJ5X2RhcmsnLFxuICAnYmFja2dyb3VuZF90ZXJ0aWFyeScsXG4gICdib3JkZXJfZGFyaycsXG4gICdib3JkZXJfbGlnaHQnLFxuICAnYm9yZGVyX21lZGl1bScsXG4gICdib3JkZXJfb3V0bGluZScsXG4gICd0ZXh0X2FjY2VudCcsXG4gICd0ZXh0X2xpZ2h0JyxcbiAgJ3RleHRfbGluaycsXG4gICd0ZXh0X3ByaW1hcnknLFxuICAndGV4dF9zZWNvbmRhcnknLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGlzR3JhcGhRTENvbG9yc0NvbmZpZyA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBHZXRNZXJjaGFudENvbG9yc1F1ZXJ5RGF0YSA9PiB7XG4gIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgZGF0YSA9PT0gbnVsbCkge1xuICAgIExvZ2dlci5sb2dFcnJvcignSW52YWxpZCBncmFwaHFsIHJlc3BvbnNlIGZvciBjb2xvcnMgY29uZmlnJywgdW5kZWZpbmVkLCB7IGRhdGEgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgZWFjaCByZXF1aXJlZCBmaWVsZFxuICBjb25zdCBtaXNzaW5nRmllbGRzID0gUkVRVUlSRURfQ09MT1JfRklFTERTLmZpbHRlcihcbiAgICAoZmllbGQpID0+ICEoZmllbGQgaW4gZGF0YSkgfHwgdHlwZW9mIChkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtmaWVsZF0gIT09ICdzdHJpbmcnLFxuICApO1xuXG4gIGlmIChtaXNzaW5nRmllbGRzLmxlbmd0aCA9PT0gUkVRVUlSRURfQ09MT1JfRklFTERTLmxlbmd0aCkge1xuICAgIExvZ2dlci5sb2dFcnJvcignQWxsIGNvbG9yIGZpZWxkcyBhcmUgbWlzc2luZyBvciBudWxsJywgdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAobWlzc2luZ0ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgY29sb3IgZmllbGRzJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgICAgbWlzc2luZ0ZpZWxkcyxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCIvKipcbiAqIEdlbmVyaWMgdXRpbGl0eSB0byB0cmFuc2Zvcm0gc25ha2VfY2FzZSBvYmplY3Qga2V5cyB0byBjYW1lbENhc2UgYXQgcnVudGltZS5cbiAqIFRoaXMgaXMgdGhlIHJ1bnRpbWUgZXF1aXZhbGVudCBvZiB0aGUgQ2FtZWxDYXNlZFByb3BlcnRpZXNEZWVwIHR5cGUgdXRpbGl0eS5cbiAqL1xuXG4vLyBMaXN0IG9mIGFjcm9ueW1zIHRoYXQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcyB1cHBlcmNhc2UgaW4gY2FtZWxDYXNlIGFuZCBsb3dlcmNhc2UgaW4gc25ha2VfY2FzZVxuY29uc3QgUFJFU0VSVkVEX0FDUk9OWU1TID0gW1wiUExQXCIsIFwiUERQXCIsIFwiU1ZHXCJdO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgc25ha2VfY2FzZSBzdHJpbmcgdG8gY2FtZWxDYXNlXG4gKiBIYW5kbGVzIHNwZWNpZmljIGFjcm9ueW1zIGxpa2UgUExQIGFuZCBQRFAgY29ycmVjdGx5XG4gKi9cbmNvbnN0IHRvQ2FtZWxDYXNlID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgLy8gUHJlLXByb2Nlc3M6IGNvbnZlcnQgYWxsIHdvcmRzIHRoYXQgbWF0Y2ggdGhlIFBSRVNFUlZFRF9BQ1JPTllNUyByZWdleCB0byB1cHBlcmNhc2VcbiAgbGV0IHByb2Nlc3NlZFN0ciA9IHN0cjtcbiAgZm9yIChjb25zdCBhY3JvbnltIG9mIFBSRVNFUlZFRF9BQ1JPTllNUykge1xuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXyR7YWNyb255bX1fP2AsIFwiZ2lcIik7XG5cbiAgICBpZiAocHJvY2Vzc2VkU3RyLm1hdGNoKHJlZ2V4KSkge1xuICAgICAgcHJvY2Vzc2VkU3RyID0gcHJvY2Vzc2VkU3RyLnJlcGxhY2UocmVnZXgsICh2KSA9PlxuICAgICAgICB2LmVuZHNXaXRoKFwiX1wiKSA/IGAke2Fjcm9ueW19X2AgOiBgJHthY3JvbnltfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9jZXNzZWRTdHIucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGxldHRlcikgPT4gbGV0dGVyLnRvVXBwZXJDYXNlKCkpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGNhbWVsQ2FzZSBzdHJpbmcgdG8gc25ha2VfY2FzZVxuICogSGFuZGxlcyBjb25zZWN1dGl2ZSBjYXBpdGFsIGxldHRlcnMgY29ycmVjdGx5IChlLmcuLCBcIlBEUFwiIC0+IFwicGRwXCIsIG5vdCBcInBfZF9wXCIpXG4gKiBQcmVzZXJ2ZXMgc3BlY2lmaWMgYWNyb255bXMgbGlrZSBQTFAgYW5kIFBEUCBhcyBsb3dlcmNhc2UgaW4gc25ha2VfY2FzZVxuICovXG5jb25zdCB0b1NuYWtlQ2FzZSA9IChzdHI6IHN0cmluZykgPT5cbiAgc3RyXG4gICAgLnJlcGxhY2UoLyhbQS1aXSkoPz1bYS16XSkvZywgXCJfJDFcIilcbiAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgXCIkMV8kMlwiKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL15fLywgXCJcIik7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgdHJhbnNmb3JtcyBhbGwgb2JqZWN0IGtleXMgZnJvbSBzbmFrZV9jYXNlIHRvIGNhbWVsQ2FzZVxuICovXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtU25ha2VUb0NhbWVsID0gKG9iajogdW5rbm93bik6IHVua25vd24gPT4ge1xuICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLm1hcCgodmFsKSA9PiB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwodmFsKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIGNvbnN0IGNhbWVsS2V5ID0gdG9DYW1lbENhc2Uoa2V5KTtcbiAgICAgIHJlc3VsdFtjYW1lbEtleV0gPSB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSB0cmFuc2Zvcm1zIGFsbCBvYmplY3Qga2V5cyBmcm9tIGNhbWVsQ2FzZSB0byBzbmFrZV9jYXNlXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1DYW1lbFRvU25ha2UgPSAob2JqOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmoubWFwKHRyYW5zZm9ybUNhbWVsVG9TbmFrZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIGNvbnN0IHNuYWtlS2V5ID0gdG9TbmFrZUNhc2Uoa2V5KTtcbiAgICAgIHJlc3VsdFtzbmFrZUtleV0gPSB0cmFuc2Zvcm1DYW1lbFRvU25ha2UodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcbiIsImltcG9ydCB7IEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cyB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgdG8gYSBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMgZW51bSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gc3RhdHVzIC0gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICpcbiAqIEByZXR1cm5zIFRoZSBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMgZW51bSB2YWx1ZSBvciB1bmRlZmluZWQgaWYgdGhlIHN0cmluZ1xuICogZG9lcyBub3QgbWFwIHRvIGEgdmFsaWQgZW51bVxuICovXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9GdWxmaWxsbWVudERpc3BsYXlTdGF0dXNFbnVtVmFsdWUgPSAoXG4gIHN0YXR1czogc3RyaW5nLFxuKTogRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzIHwgdW5kZWZpbmVkID0+IHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlICdBVFRFTVBURURfREVMSVZFUlknOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5BVFRFTVBURURfREVMSVZFUlk7XG4gICAgY2FzZSAnQ0FOQ0VMRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5DQU5DRUxFRDtcbiAgICBjYXNlICdDT05GSVJNRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5DT05GSVJNRUQ7XG4gICAgY2FzZSAnREVMSVZFUkVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuREVMSVZFUkVEO1xuICAgIGNhc2UgJ0ZBSUxVUkUnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5GQUlMVVJFO1xuICAgIGNhc2UgJ0ZVTEZJTExFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLkZVTEZJTExFRDtcbiAgICBjYXNlICdJTl9UUkFOU0lUJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuSU5fVFJBTlNJVDtcbiAgICBjYXNlICdMQUJFTF9QUklOVEVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuTEFCRUxfUFJJTlRFRDtcbiAgICBjYXNlICdMQUJFTF9QVVJDSEFTRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5MQUJFTF9QVVJDSEFTRUQ7XG4gICAgY2FzZSAnTEFCRUxfVk9JREVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuTEFCRUxfVk9JREVEO1xuICAgIGNhc2UgJ01BUktFRF9BU19GVUxGSUxMRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5NQVJLRURfQVNfRlVMRklMTEVEO1xuICAgIGNhc2UgJ05PVF9ERUxJVkVSRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5OT1RfREVMSVZFUkVEO1xuICAgIGNhc2UgJ09VVF9GT1JfREVMSVZFUlknOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5PVVRfRk9SX0RFTElWRVJZO1xuICAgIGNhc2UgJ1BJQ0tFRF9VUCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLlBJQ0tFRF9VUDtcbiAgICBjYXNlICdSRUFEWV9GT1JfUElDS1VQJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuUkVBRFlfRk9SX1BJQ0tVUDtcbiAgICBjYXNlICdTVUJNSVRURUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5TVUJNSVRURUQ7XG4gICAgY2FzZSAnSU5fUFJPR1JFU1MnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5JTl9QUk9HUkVTUztcbiAgICBjYXNlICdPTl9IT0xEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuT05fSE9MRDtcbiAgICBjYXNlICdPUEVOJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuT1BFTjtcbiAgICBjYXNlICdQQVJUSUFMTFlfRlVMRklMTEVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuUEFSVElBTExZX0ZVTEZJTExFRDtcbiAgICBjYXNlICdQRU5ESU5HX0ZVTEZJTExNRU5UJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuUEVORElOR19GVUxGSUxMTUVOVDtcbiAgICBjYXNlICdSRVFVRVNUX0RFQ0xJTkVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuUkVRVUVTVF9ERUNMSU5FRDtcbiAgICBjYXNlICdSRVNUT0NLRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5SRVNUT0NLRUQ7XG4gICAgY2FzZSAnU0NIRURVTEVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuU0NIRURVTEVEO1xuICAgIGNhc2UgJ1VORlVMRklMTEVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuVU5GVUxGSUxMRUQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBDb2xvck1hcHBpbmcsIENvbG9yTmFtZXMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVscy9jb2xvcnNDb25maWdcIjtcbmltcG9ydCB7IGlzR3JhcGhRTENvbG9yc0NvbmZpZyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9ncmFwaFFML2lzR3JhcGhRTENvbG9yc0NvbmZpZ1wiO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVHcmFwaFFMQ29sb3JzQ29uZmlnID0gKFxuICBkYXRhOiB1bmtub3duXG4pOiBDb2xvck1hcHBpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzR3JhcGhRTENvbG9yc0NvbmZpZyhkYXRhKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG4iLCJlbnVtIERPTUluc2VydGlvblR5cGUge1xuICBBRlRFUiA9IFwiYWZ0ZXJcIixcbiAgQkVGT1JFID0gXCJiZWZvcmVcIixcbiAgQURKQUNFTlRfQUZURVJfQkVHSU4gPSBcImFkamFjZW50LWFmdGVyLWJlZ2luXCIsXG4gIEFESkFDRU5UX0JFRk9SRV9CRUdJTiA9IFwiYWRqYWNlbnQtYmVmb3JlLWJlZ2luXCIsXG4gIEFESkFDRU5UX0FGVEVSX0VORCA9IFwiYWRqYWNlbnQtYWZ0ZXItZW5kXCIsXG4gIEFESkFDRU5UX0JFRk9SRV9FTkQgPSBcImFkamFjZW50LWJlZm9yZS1lbmRcIixcbiAgQVBQRU5EX0NISUxEID0gXCJhcHBlbmQtY2hpbGRcIixcbiAgTk9ORSA9IFwibm9uZVwiLFxufVxuXG5leHBvcnQgY29uc3QgRE9NSW5zZXJ0aW9uVHlwZVRvSW5zZXJ0UG9zaXRpb24gPSAoXG4gIHR5cGU6IERPTUluc2VydGlvblR5cGVcbik6IEluc2VydFBvc2l0aW9uID0+IHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBET01JbnNlcnRpb25UeXBlLkFESkFDRU5UX0FGVEVSX0JFR0lOOlxuICAgICAgcmV0dXJuIFwiYWZ0ZXJiZWdpblwiO1xuICAgIGNhc2UgRE9NSW5zZXJ0aW9uVHlwZS5CRUZPUkU6XG4gICAgY2FzZSBET01JbnNlcnRpb25UeXBlLkFESkFDRU5UX0JFRk9SRV9CRUdJTjpcbiAgICAgIHJldHVybiBcImJlZm9yZWJlZ2luXCI7XG4gICAgY2FzZSBET01JbnNlcnRpb25UeXBlLkFESkFDRU5UX0JFRk9SRV9FTkQ6XG4gICAgICByZXR1cm4gXCJiZWZvcmVlbmRcIjtcbiAgICBjYXNlIERPTUluc2VydGlvblR5cGUuQUZURVI6XG4gICAgY2FzZSBET01JbnNlcnRpb25UeXBlLkFESkFDRU5UX0FGVEVSX0VORDpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwiYWZ0ZXJlbmRcIjtcbiAgfVxufTtcblxuZXhwb3J0IHsgRE9NSW5zZXJ0aW9uVHlwZSB9O1xuIiwiZW51bSBHcmlkSW5zZXJ0aW9uVHlwZSB7XG4gIEZJWEVEXzEgPSBcImZpeGVkLTFcIixcbiAgRklYRURfMiA9IFwiZml4ZWQtMlwiLFxuICBGSVhFRF8zID0gXCJmaXhlZC0zXCIsXG4gIEZJWEVEXzQgPSBcImZpeGVkLTRcIixcbiAgRklYRURfNSA9IFwiZml4ZWQtNVwiLFxuICBGSVhFRF82ID0gXCJmaXhlZC02XCIsXG4gIEZJWEVEXzcgPSBcImZpeGVkLTdcIixcbiAgRklYRURfOCA9IFwiZml4ZWQtOFwiLFxuICBGSVhFRF85ID0gXCJmaXhlZC05XCIsXG4gIEZJWEVEXzEyID0gXCJmaXhlZC0xMlwiLFxuICBGSVhFRF8xMyA9IFwiZml4ZWQtMTNcIixcbiAgUk9XXzEgPSBcInJvdy0xXCIsXG4gIFJPV18yID0gXCJyb3ctMlwiLFxuICBST1dfMyA9IFwicm93LTNcIixcbiAgUk9XXzQgPSBcInJvdy00XCIsXG59XG5cbmV4cG9ydCB7IEdyaWRJbnNlcnRpb25UeXBlIH07XG4iLCJpbXBvcnQgeyBGcm9udGVuZENvbmZpZyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZnJvbnRlbmRDb25maWcnO1xuaW1wb3J0IHsgdHJhbnNmb3JtU25ha2VUb0NhbWVsIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy91dGlscy9zbmFrZVRvQ2FtZWxUcmFuc2Zvcm1lcic7XG5pbXBvcnQge1xuICBXaWRnZXRDb25maWcsXG4gIFBhZ2VWYXJpYW50Q29uZmlnLFxuICBQYWdlVmFyaWFudFRlc3RUeXBlLFxuICBXaWRnZXRNb3VudGluZ0NvbmZpZyxcbn0gZnJvbSAnc3JjL2NvbnRleHRzL3R5cGVzJztcbmltcG9ydCB7IERPTUluc2VydGlvblR5cGUgfSBmcm9tICdzcmMvbWVyY2hhbnRzL2RvbUluc2VydGlvbic7XG5pbXBvcnQgeyBHcmlkSW5zZXJ0aW9uVHlwZSB9IGZyb20gJ3NyYy9tZXJjaGFudHMvZ3JpZEluc2VydGlvbic7XG5pbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byB2YWxpZGF0ZSBhbmQgdHJhbnNmb3JtIFBhZ2VWYXJpYW50UXVlcnlEYXRhIHRvIFBhZ2VWYXJpYW50Q29uZmlnXG5leHBvcnQgY29uc3QgdmFsaWRhdGVBbmRUcmFuc2Zvcm1QYWdlVmFyaWFudHMgPSAoXG4gIGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBQYWdlVmFyaWFudENvbmZpZyA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybWVkID0gdHJhbnNmb3JtU25ha2VUb0NhbWVsKGNvbmZpZykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgY29uc3QgeyB2YXJpYW50Q2hlY2tzLCB3aWRnZXRNb3VudGluZywgLi4ucmVzdCB9ID0gdHJhbnNmb3JtZWQ7XG5cbiAgLy8gQ29udmVydCB2YXJpYW50Q2hlY2tzIHRvIHZhcmlhbnRUZXN0cyB3aXRoIHRlc3RUeXBlIG5vcm1hbGl6YXRpb25cbiAgY29uc3QgdmFyaWFudFRlc3RzID0gQXJyYXkuaXNBcnJheSh2YXJpYW50Q2hlY2tzKVxuICAgID8gdmFyaWFudENoZWNrcy5tYXAoKHsgY2hlY2tUeXBlLCAuLi5yZXN0Q2hlY2sgfSkgPT4gKHtcbiAgICAgICAgLi4ucmVzdENoZWNrLFxuICAgICAgICB0ZXN0VHlwZTogY2hlY2tUeXBlLFxuICAgICAgfSkpXG4gICAgOiBbXTtcblxuICAvLyBOb3JtYWxpemUgd2lkZ2V0TW91bnRpbmc6IGNoZWNrcyAtPiB0ZXN0cywgY2hlY2tUeXBlIC0+IHRlc3RUeXBlXG4gIGNvbnN0IG5vcm1hbGl6ZWRXaWRnZXRNb3VudGluZyA9IEFycmF5LmlzQXJyYXkod2lkZ2V0TW91bnRpbmcpXG4gICAgPyB3aWRnZXRNb3VudGluZy5tYXAoKHsgbW91bnRpbmdQb2ludFdpZGdldHMsIC4uLnJlc3RNb3VudGluZyB9KSA9PiAoe1xuICAgICAgICAuLi5yZXN0TW91bnRpbmcsXG4gICAgICAgIC4uLihBcnJheS5pc0FycmF5KG1vdW50aW5nUG9pbnRXaWRnZXRzKVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBtb3VudGluZ1BvaW50V2lkZ2V0czogbW91bnRpbmdQb2ludFdpZGdldHMubWFwKCh7IGNoZWNrcywgLi4ucmVzdFdpZGdldCB9KSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnJlc3RXaWRnZXQsXG4gICAgICAgICAgICAgICAgdGVzdHM6IEFycmF5LmlzQXJyYXkoY2hlY2tzKVxuICAgICAgICAgICAgICAgICAgPyBjaGVja3MubWFwKCh7IGNoZWNrVHlwZSwgLi4ucmVzdENoZWNrIH0pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgLi4ucmVzdENoZWNrLFxuICAgICAgICAgICAgICAgICAgICAgIHRlc3RUeXBlOiBjaGVja1R5cGUsXG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgOiBbXSxcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSkpXG4gICAgOiBbXTtcblxuICBjb25zdCBub3JtYWxpemVkQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAuLi5yZXN0LFxuICAgIC4uLih2YXJpYW50VGVzdHMgPyB7IHZhcmlhbnRUZXN0cyB9IDoge30pLFxuICAgIC4uLihub3JtYWxpemVkV2lkZ2V0TW91bnRpbmcgPyB7IHdpZGdldE1vdW50aW5nOiBub3JtYWxpemVkV2lkZ2V0TW91bnRpbmcgfSA6IHt9KSxcbiAgfTtcblxuICBjb25zdCB2YXJpYW50SWQgPSBub3JtYWxpemVkQ29uZmlnLnZhcmlhbnRJZCBhcyBzdHJpbmc7XG4gIGNvbnN0IHZhcmlhbnRUeXBlID0gbm9ybWFsaXplZENvbmZpZy52YXJpYW50VHlwZSBhcyBzdHJpbmc7XG5cbiAgaWYgKHR5cGVvZiB2YXJpYW50SWQgIT09ICdzdHJpbmcnIHx8ICF2YXJpYW50SWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCB2YXJpYW50SWQgZm9yIHBhZ2VWYXJpYW50YCk7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhcmlhbnRUeXBlICE9PSAnc3RyaW5nJyB8fCAhdmFyaWFudFR5cGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCB2YXJpYW50VHlwZSBmb3IgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgKTtcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YXJpYW50VGVzdHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1pc3Npbmcgb3IgaW52YWxpZCB2YXJpYW50VGVzdHMgZm9yIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nLiBNdXN0IGJlIGFuIGFycmF5YCxcbiAgICApO1xuICB9XG5cbiAgZm9yIChjb25zdCB0ZXN0IG9mIHZhcmlhbnRUZXN0cykge1xuICAgIGlmICghdGVzdC50ZXN0VHlwZSB8fCB0eXBlb2YgdGVzdC50ZXN0VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YXJpYW50VGVzdC50ZXN0VHlwZSBmb3IgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgKTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKFBhZ2VWYXJpYW50VGVzdFR5cGUpLmluY2x1ZGVzKHRlc3QudGVzdFR5cGUgYXMgUGFnZVZhcmlhbnRUZXN0VHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgdGVzdFR5cGUgJyR7dGVzdC50ZXN0VHlwZX0nIGZvciBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9Jy4gVmFsaWQgdHlwZXM6ICR7T2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICBQYWdlVmFyaWFudFRlc3RUeXBlLFxuICAgICAgICApLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWRXaWRnZXRNb3VudGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWlzc2luZyBvciBpbnZhbGlkIHdpZGdldE1vdW50aW5nIGZvciBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9Jy4gTXVzdCBiZSBhbiBhcnJheWAsXG4gICAgKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgbW91bnRpbmcgb2Ygbm9ybWFsaXplZFdpZGdldE1vdW50aW5nKSB7XG4gICAgaWYgKHR5cGVvZiBtb3VudGluZy5tb3VudGluZ0NvbmZpZ0lkICE9PSAnc3RyaW5nJyB8fCAhbW91bnRpbmcubW91bnRpbmdDb25maWdJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1vdW50aW5nQ29uZmlnSWQgaW4gd2lkZ2V0TW91bnRpbmcgZm9yIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nYCk7XG4gICAgfVxuXG4gICAgaWYgKG1vdW50aW5nLndpZGdldENvbmZpZ0lkICYmIHR5cGVvZiBtb3VudGluZy53aWRnZXRDb25maWdJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB3aWRnZXRDb25maWdJZCBpbiB3aWRnZXRNb3VudGluZyBmb3IgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgKTtcbiAgICB9XG5cbiAgICBpZiAobW91bnRpbmcubW91bnRpbmdQb2ludFdpZGdldHMpIHtcbiAgICAgIGZvciAoY29uc3Qgd2lkZ2V0IG9mIG1vdW50aW5nLm1vdW50aW5nUG9pbnRXaWRnZXRzKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2lkZ2V0LndpZGdldENvbmZpZ0lkICE9PSAnc3RyaW5nJyB8fCAhd2lkZ2V0LndpZGdldENvbmZpZ0lkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgd2lkZ2V0Q29uZmlnSWQgaW4gbW91bnRpbmdQb2ludFdpZGdldHMgZm9yIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHdpZGdldC50ZXN0cykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBvciBtaXNzaW5nIHRlc3RzIGluIG1vdW50aW5nUG9pbnRXaWRnZXRzIGZvciBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9J2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh2YXJpYW50VHlwZSA9PT0gJ3BscCcpIHtcbiAgICBpZiAodHlwZW9mIG5vcm1hbGl6ZWRDb25maWcucGxwSWRFeHRyYWN0b3IgIT09ICdzdHJpbmcnIHx8ICFub3JtYWxpemVkQ29uZmlnLnBscElkRXh0cmFjdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCBwbHBJZEV4dHJhY3RvciBmb3IgUExQIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nYCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHZhcmlhbnRUeXBlID09PSAncGRwJykge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLnByb2R1Y3RJZEV4dHJhY3RvciAhPT0gJ3N0cmluZycgfHxcbiAgICAgICFub3JtYWxpemVkQ29uZmlnLnByb2R1Y3RJZEV4dHJhY3RvclxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgcHJvZHVjdElkRXh0cmFjdG9yIGZvciBQRFAgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbm9ybWFsaXplZENvbmZpZy5wYXJlbnRQcm9kdWN0SWRFeHRyYWN0b3IgJiZcbiAgICAgIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLnBhcmVudFByb2R1Y3RJZEV4dHJhY3RvciAhPT0gJ3N0cmluZydcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgcGFyZW50UHJvZHVjdElkRXh0cmFjdG9yIGZvciBQRFAgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfScuIE11c3QgYmUgc3RyaW5nIGlmIHByb3ZpZGVkYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRDb25maWcgYXMgUGFnZVZhcmlhbnRDb25maWc7XG59O1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gdmFsaWRhdGUgYW5kIHRyYW5zZm9ybSBNb3VudGluZ0NvbmZpZ1F1ZXJ5RGF0YSB0byBXaWRnZXRNb3VudGluZ0NvbmZpZ1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQW5kVHJhbnNmb3JtTW91bnRpbmdDb25maWcgPSAoXG4gIGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbmZpZ0tleTogc3RyaW5nLFxuKTogV2lkZ2V0TW91bnRpbmdDb25maWcgPT4ge1xuICAvLyBSRU5BTUlORyBMT0dJQzogQ29udmVydCBiYWNrZW5kIFwiQ2hlY2tcIiB0ZXJtaW5vbG9neSB0byBmcm9udGVuZCBcIlRlc3RcIiB0ZXJtaW5vbG9neVxuICBjb25zdCBub3JtYWxpemVkQ29uZmlnID0geyAuLi5jb25maWcgfTtcblxuICAvLyBDb252ZXJ0IGNoZWNrSWQgdG8gdGVzdElkIGZvciBmcm9udGVuZCBjb21wYXRpYmlsaXR5IChkYXRhIGlzIGFscmVhZHkgY2FtZWxDYXNlKVxuICBpZiAobm9ybWFsaXplZENvbmZpZy5jaGVja0lkICYmICFub3JtYWxpemVkQ29uZmlnLnRlc3RJZCkge1xuICAgIG5vcm1hbGl6ZWRDb25maWcudGVzdElkID0gbm9ybWFsaXplZENvbmZpZy5jaGVja0lkO1xuICAgIGRlbGV0ZSBub3JtYWxpemVkQ29uZmlnLmNoZWNrSWQ7XG4gIH1cblxuICAvLyBSZXF1aXJlZCBmaWVsZHMgLSB0aGVzZSBtdXN0IGJlIHByZXNlbnQgYW5kIHZhbGlkXG4gIGlmICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5tb3VudGluZ0NvbmZpZ0lkICE9PSAnc3RyaW5nJyB8fCAhbm9ybWFsaXplZENvbmZpZy5tb3VudGluZ0NvbmZpZ0lkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgbW91bnRpbmdDb25maWdJZCBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLmNvbnRhaW5lcklkICE9PSAnc3RyaW5nJyB8fCAhbm9ybWFsaXplZENvbmZpZy5jb250YWluZXJJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIGNvbnRhaW5lcklkIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuICBpZiAodHlwZW9mIG5vcm1hbGl6ZWRDb25maWcudGVzdElkICE9PSAnc3RyaW5nJyB8fCAhbm9ybWFsaXplZENvbmZpZy50ZXN0SWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCB0ZXN0SWQgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICB9XG5cbiAgLy8gUmVxdWlyZWQgaW5zZXJ0aW9uUG9pbnRcbiAgaWYgKFxuICAgICFub3JtYWxpemVkQ29uZmlnLmluc2VydGlvblBvaW50IHx8XG4gICAgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuaW5zZXJ0aW9uUG9pbnQgIT09ICdvYmplY3QnIHx8XG4gICAgQXJyYXkuaXNBcnJheShub3JtYWxpemVkQ29uZmlnLmluc2VydGlvblBvaW50KVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCBpbnNlcnRpb25Qb2ludCBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCk7XG4gIH1cblxuICBjb25zdCBpbnNlcnRpb25Qb2ludCA9IG5vcm1hbGl6ZWRDb25maWcuaW5zZXJ0aW9uUG9pbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLy8gVmFsaWRhdGUgaW5zZXJ0aW9uUG9pbnQgcmVxdWlyZWQgZmllbGRzXG4gIGlmICh0eXBlb2YgaW5zZXJ0aW9uUG9pbnQuc2VsZWN0b3IgIT09ICdzdHJpbmcnIHx8ICFpbnNlcnRpb25Qb2ludC5zZWxlY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIGluc2VydGlvblBvaW50LnNlbGVjdG9yIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuICBpZiAodHlwZW9mIGluc2VydGlvblBvaW50Lmluc2VydGlvblR5cGUgIT09ICdzdHJpbmcnIHx8ICFpbnNlcnRpb25Qb2ludC5pbnNlcnRpb25UeXBlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgaW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBpbnNlcnRpb25UeXBlIGlzIGEgdmFsaWQgRE9NSW5zZXJ0aW9uVHlwZVxuICBpZiAoIU9iamVjdC52YWx1ZXMoRE9NSW5zZXJ0aW9uVHlwZSkuaW5jbHVkZXMoaW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSBhcyBET01JbnNlcnRpb25UeXBlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGluc2VydGlvblBvaW50Lmluc2VydGlvblR5cGUgJyR7aW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZX0nIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIFZhbGlkIHR5cGVzOiAke09iamVjdC52YWx1ZXMoRE9NSW5zZXJ0aW9uVHlwZSkuam9pbignLCAnKX1gLFxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBvcHRpb25hbCBpbnNlcnRpb25Qb2ludCBmaWVsZHNcbiAgaWYgKGluc2VydGlvblBvaW50LnNlbGVjdGlvbkluZGV4ICE9IG51bGwgJiYgdHlwZW9mIGluc2VydGlvblBvaW50LnNlbGVjdGlvbkluZGV4ICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGluc2VydGlvblBvaW50LnNlbGVjdGlvbkluZGV4IGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYSBudW1iZXIgb3IgbnVsbC91bmRlZmluZWRgLFxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBvcHRpb25hbCBwYXJlbnRJbnNlcnRpb25Qb2ludCBpZiBwcmVzZW50XG4gIGxldCBwYXJlbnRJbnNlcnRpb25Qb2ludDtcbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcucGFyZW50SW5zZXJ0aW9uUG9pbnQpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5wYXJlbnRJbnNlcnRpb25Qb2ludCAhPT0gJ29iamVjdCcgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkobm9ybWFsaXplZENvbmZpZy5wYXJlbnRJbnNlcnRpb25Qb2ludClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJlbnRJbnNlcnRpb25Qb2ludCBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nLiBNdXN0IGJlIGFuIG9iamVjdGApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudFBvaW50ID0gbm9ybWFsaXplZENvbmZpZy5wYXJlbnRJbnNlcnRpb25Qb2ludCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAodHlwZW9mIHBhcmVudFBvaW50LnNlbGVjdG9yICE9PSAnc3RyaW5nJyB8fCAhcGFyZW50UG9pbnQuc2VsZWN0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHBhcmVudEluc2VydGlvblBvaW50LnNlbGVjdG9yIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXJlbnRQb2ludC5pbnNlcnRpb25UeXBlICE9PSAnc3RyaW5nJyB8fCAhcGFyZW50UG9pbnQuaW5zZXJ0aW9uVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlzc2luZyBvciBpbnZhbGlkIHBhcmVudEluc2VydGlvblBvaW50Lmluc2VydGlvblR5cGUgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghT2JqZWN0LnZhbHVlcyhET01JbnNlcnRpb25UeXBlKS5pbmNsdWRlcyhwYXJlbnRQb2ludC5pbnNlcnRpb25UeXBlIGFzIERPTUluc2VydGlvblR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHBhcmVudEluc2VydGlvblBvaW50Lmluc2VydGlvblR5cGUgJyR7cGFyZW50UG9pbnQuaW5zZXJ0aW9uVHlwZX0nIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIFZhbGlkIHR5cGVzOiAke09iamVjdC52YWx1ZXMoRE9NSW5zZXJ0aW9uVHlwZSkuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50UG9pbnQuc2VsZWN0aW9uSW5kZXggIT0gbnVsbCAmJiB0eXBlb2YgcGFyZW50UG9pbnQuc2VsZWN0aW9uSW5kZXggIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHBhcmVudEluc2VydGlvblBvaW50LnNlbGVjdGlvbkluZGV4IGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYSBudW1iZXIgb3IgbnVsbC91bmRlZmluZWRgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJlbnRJbnNlcnRpb25Qb2ludCA9IHtcbiAgICAgIHNlbGVjdG9yOiBwYXJlbnRQb2ludC5zZWxlY3RvcixcbiAgICAgIGluc2VydGlvblR5cGU6IHBhcmVudFBvaW50Lmluc2VydGlvblR5cGUgYXMgRE9NSW5zZXJ0aW9uVHlwZSxcbiAgICAgIHNlbGVjdGlvbkluZGV4OiBwYXJlbnRQb2ludC5zZWxlY3Rpb25JbmRleCBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIG9wdGlvbmFsIHdyYXBwaW5nRWxlbWVudCBpZiBwcmVzZW50XG4gIGxldCB3cmFwcGluZ0VsZW1lbnQ7XG4gIGlmIChub3JtYWxpemVkQ29uZmlnLndyYXBwaW5nRWxlbWVudCkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLndyYXBwaW5nRWxlbWVudCAhPT0gJ29iamVjdCcgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkobm9ybWFsaXplZENvbmZpZy53cmFwcGluZ0VsZW1lbnQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgd3JhcHBpbmdFbGVtZW50IGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYW4gb2JqZWN0YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgd3JhcHBpbmcgPSBub3JtYWxpemVkQ29uZmlnLndyYXBwaW5nRWxlbWVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAodHlwZW9mIHdyYXBwaW5nLmNsYXNzTmFtZSAhPT0gJ3N0cmluZycgfHwgIXdyYXBwaW5nLmNsYXNzTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgd3JhcHBpbmdFbGVtZW50LmNsYXNzTmFtZSBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd3JhcHBpbmcuZWxlbWVudCAhPT0gJ3N0cmluZycgfHwgIXdyYXBwaW5nLmVsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHdyYXBwaW5nRWxlbWVudC5lbGVtZW50IGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3cmFwcGluZy5pbnNlcnRpb25UeXBlICE9PSAnc3RyaW5nJyB8fCAhd3JhcHBpbmcuaW5zZXJ0aW9uVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgd3JhcHBpbmdFbGVtZW50Lmluc2VydGlvblR5cGUgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICAgIH1cblxuICAgIGlmICghT2JqZWN0LnZhbHVlcyhET01JbnNlcnRpb25UeXBlKS5pbmNsdWRlcyh3cmFwcGluZy5pbnNlcnRpb25UeXBlIGFzIERPTUluc2VydGlvblR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHdyYXBwaW5nRWxlbWVudC5pbnNlcnRpb25UeXBlICcke3dyYXBwaW5nLmluc2VydGlvblR5cGV9JyBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nLiBWYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKERPTUluc2VydGlvblR5cGUpLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgd3JhcHBpbmdFbGVtZW50ID0ge1xuICAgICAgY2xhc3NOYW1lOiB3cmFwcGluZy5jbGFzc05hbWUsXG4gICAgICBlbGVtZW50OiB3cmFwcGluZy5lbGVtZW50LFxuICAgICAgaW5zZXJ0aW9uVHlwZTogd3JhcHBpbmcuaW5zZXJ0aW9uVHlwZSBhcyBET01JbnNlcnRpb25UeXBlLFxuICAgIH07XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBvcHRpb25hbCBmaWVsZHNcbiAgaWYgKFxuICAgIG5vcm1hbGl6ZWRDb25maWcuZGl2Q2hlY2tTZWxlY3RvciAhPSBudWxsICYmXG4gICAgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuZGl2Q2hlY2tTZWxlY3RvciAhPT0gJ3N0cmluZydcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgZGl2Q2hlY2tTZWxlY3RvciBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nLiBNdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkYCxcbiAgICApO1xuICB9XG4gIGlmIChub3JtYWxpemVkQ29uZmlnLmNsYXNzTmFtZSAhPSBudWxsICYmIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLmNsYXNzTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBjbGFzc05hbWUgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhIHN0cmluZyBvciBudWxsL3VuZGVmaW5lZGAsXG4gICAgKTtcbiAgfVxuICBpZiAoXG4gICAgbm9ybWFsaXplZENvbmZpZy5zdXBwcmVzc2lvblNlbGVjdG9yICE9IG51bGwgJiZcbiAgICB0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5zdXBwcmVzc2lvblNlbGVjdG9yICE9PSAnc3RyaW5nJ1xuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBzdXBwcmVzc2lvblNlbGVjdG9yIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC91bmRlZmluZWRgLFxuICAgICk7XG4gIH1cbiAgaWYgKFxuICAgIG5vcm1hbGl6ZWRDb25maWcuZGF0YUF0dHJpYnV0ZXMgIT0gbnVsbCAmJlxuICAgICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5kYXRhQXR0cmlidXRlcyAhPT0gJ29iamVjdCcgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkobm9ybWFsaXplZENvbmZpZy5kYXRhQXR0cmlidXRlcykpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGRhdGFBdHRyaWJ1dGVzIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYW4gb2JqZWN0IG9yIG51bGwvdW5kZWZpbmVkYCxcbiAgICApO1xuICB9XG4gIGlmIChcbiAgICBub3JtYWxpemVkQ29uZmlnLnN0eWxlICE9IG51bGwgJiZcbiAgICAodHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuc3R5bGUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobm9ybWFsaXplZENvbmZpZy5zdHlsZSkpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzdHlsZSBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nLiBNdXN0IGJlIGFuIG9iamVjdCBvciBudWxsL3VuZGVmaW5lZGApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgZ3JpZEluc2VydGlvblR5cGUgaWYgcHJlc2VudFxuICBsZXQgZ3JpZEluc2VydGlvblR5cGU7XG4gIGlmIChub3JtYWxpemVkQ29uZmlnLmdyaWRJbnNlcnRpb25UeXBlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuZ3JpZEluc2VydGlvblR5cGUgIT09ICdzdHJpbmcnIHx8XG4gICAgICAhbm9ybWFsaXplZENvbmZpZy5ncmlkSW5zZXJ0aW9uVHlwZVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdyaWRJbnNlcnRpb25UeXBlIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYSBzdHJpbmdgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhT2JqZWN0LnZhbHVlcyhHcmlkSW5zZXJ0aW9uVHlwZSkuaW5jbHVkZXMoXG4gICAgICAgIG5vcm1hbGl6ZWRDb25maWcuZ3JpZEluc2VydGlvblR5cGUgYXMgR3JpZEluc2VydGlvblR5cGUsXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGdyaWRJbnNlcnRpb25UeXBlICcke25vcm1hbGl6ZWRDb25maWcuZ3JpZEluc2VydGlvblR5cGV9JyBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nLiBWYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKEdyaWRJbnNlcnRpb25UeXBlKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBncmlkSW5zZXJ0aW9uVHlwZSA9IG5vcm1hbGl6ZWRDb25maWcuZ3JpZEluc2VydGlvblR5cGUgYXMgR3JpZEluc2VydGlvblR5cGU7XG4gIH1cblxuICAvLyBCdWlsZCB0aGUgcmV0dXJuIG9iamVjdCwgb25seSBpbmNsdWRpbmcgb3B0aW9uYWwgZmllbGRzIGlmIHRoZXkgaGF2ZSB2YWx1ZXNcbiAgY29uc3QgcmVzdWx0OiBXaWRnZXRNb3VudGluZ0NvbmZpZyA9IHtcbiAgICBtb3VudGluZ0NvbmZpZ0lkOiBub3JtYWxpemVkQ29uZmlnLm1vdW50aW5nQ29uZmlnSWQsXG4gICAgY29udGFpbmVySWQ6IG5vcm1hbGl6ZWRDb25maWcuY29udGFpbmVySWQsXG4gICAgdGVzdElkOiBub3JtYWxpemVkQ29uZmlnLnRlc3RJZCxcbiAgICBpbnNlcnRpb25Qb2ludDoge1xuICAgICAgc2VsZWN0b3I6IGluc2VydGlvblBvaW50LnNlbGVjdG9yLFxuICAgICAgaW5zZXJ0aW9uVHlwZTogaW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSBhcyBET01JbnNlcnRpb25UeXBlLFxuICAgICAgLi4uKGluc2VydGlvblBvaW50LnNlbGVjdGlvbkluZGV4ICE9IG51bGwgJiYge1xuICAgICAgICBzZWxlY3Rpb25JbmRleDogaW5zZXJ0aW9uUG9pbnQuc2VsZWN0aW9uSW5kZXgsXG4gICAgICB9KSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIE9ubHkgYWRkIG9wdGlvbmFsIGZpZWxkcyBpZiB0aGV5IGhhdmUgdmFsdWVzXG4gIGlmIChwYXJlbnRJbnNlcnRpb25Qb2ludCkge1xuICAgIHJlc3VsdC5wYXJlbnRJbnNlcnRpb25Qb2ludCA9IHBhcmVudEluc2VydGlvblBvaW50O1xuICB9XG4gIGlmIChncmlkSW5zZXJ0aW9uVHlwZSkge1xuICAgIHJlc3VsdC5ncmlkSW5zZXJ0aW9uVHlwZSA9IGdyaWRJbnNlcnRpb25UeXBlO1xuICB9XG4gIGlmICh3cmFwcGluZ0VsZW1lbnQpIHtcbiAgICByZXN1bHQud3JhcHBpbmdFbGVtZW50ID0gd3JhcHBpbmdFbGVtZW50O1xuICB9XG4gIGlmIChub3JtYWxpemVkQ29uZmlnLmRpdkNoZWNrU2VsZWN0b3IpIHtcbiAgICByZXN1bHQuZGl2Q2hlY2tTZWxlY3RvciA9IG5vcm1hbGl6ZWRDb25maWcuZGl2Q2hlY2tTZWxlY3RvciBhcyBzdHJpbmc7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuY2xhc3NOYW1lKSB7XG4gICAgcmVzdWx0LmNsYXNzTmFtZSA9IG5vcm1hbGl6ZWRDb25maWcuY2xhc3NOYW1lIGFzIHN0cmluZztcbiAgfVxuICBpZiAobm9ybWFsaXplZENvbmZpZy5zdXBwcmVzc2lvblNlbGVjdG9yKSB7XG4gICAgcmVzdWx0LnN1cHByZXNzaW9uU2VsZWN0b3IgPSBub3JtYWxpemVkQ29uZmlnLnN1cHByZXNzaW9uU2VsZWN0b3I7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuZGF0YUF0dHJpYnV0ZXMpIHtcbiAgICByZXN1bHQuZGF0YUF0dHJpYnV0ZXMgPSBub3JtYWxpemVkQ29uZmlnLmRhdGFBdHRyaWJ1dGVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuc3R5bGUpIHtcbiAgICByZXN1bHQuc3R5bGUgPSBub3JtYWxpemVkQ29uZmlnLnN0eWxlIGFzIFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj47XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIGFuZCB0cmFuc2Zvcm0gV2lkZ2V0Q29uZmlnUXVlcnlEYXRhIHRvIFdpZGdldENvbmZpZ1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQW5kVHJhbnNmb3JtV2lkZ2V0Q29uZmlnID0gKFxuICBjb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb25maWdLZXk6IHN0cmluZyxcbik6IFdpZGdldENvbmZpZyA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDb25maWcgPSB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwoY29uZmlnKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBpZiAodHlwZW9mIG5vcm1hbGl6ZWRDb25maWcud2lkZ2V0Q29uZmlnSWQgIT09ICdzdHJpbmcnIHx8ICFub3JtYWxpemVkQ29uZmlnLndpZGdldENvbmZpZ0lkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgd2lkZ2V0Q29uZmlnSWQgZm9yIHdpZGdldCBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuICBpZiAodHlwZW9mIG5vcm1hbGl6ZWRDb25maWcudHlwZSAhPT0gJ3N0cmluZycgfHwgIW5vcm1hbGl6ZWRDb25maWcudHlwZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHR5cGUgZm9yIHdpZGdldCBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuXG4gIGlmIChub3JtYWxpemVkQ29uZmlnLmNvbnRlbnRJZCAhPSBudWxsICYmIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLmNvbnRlbnRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBjb250ZW50SWQgZm9yIHdpZGdldCBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC91bmRlZmluZWRgLFxuICAgICk7XG4gIH1cblxuICAvLyBOb3RlOiBXaWRnZXQgY29uZmlncyBhcmUgY29tcGxleCB1bmlvbnMgd2l0aCB0eXBlLXNwZWNpZmljIHByb3BlcnRpZXMuXG5cbiAgLy8gUmV0dXJuIHRoZSBub3JtYWxpemVkIGNvbmZpZyBhcyBXaWRnZXRDb25maWdcbiAgLy8gVXNlIGludGVybWVkaWF0ZSAndW5rbm93bicgY2FzdCBmb3IgY29tcGxleCB1bmlvbiB0eXBlc1xuICByZXR1cm4gbm9ybWFsaXplZENvbmZpZyBhcyB1bmtub3duIGFzIFdpZGdldENvbmZpZztcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUdyYXBoUUxGcm9udGVuZENvbmZpZyA9IChkYXRhOiB1bmtub3duKTogRnJvbnRlbmRDb25maWcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgTG9nZ2VyLmxvZ1dhcm4oJ0ludmFsaWQgR3JhcGhRTCBmcm9udGVuZCBjb25maWcgZGF0YTogbm90IGFuIG9iamVjdCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBvYmogPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8vIFZhbGlkYXRlIG1lcmNoYW50X292ZXJyaWRlX2NzcyBpZiBwcmVzZW50XG4gIGlmIChcbiAgICAnbWVyY2hhbnRfb3ZlcnJpZGVfY3NzJyBpbiBvYmogJiZcbiAgICB0eXBlb2Ygb2JqLm1lcmNoYW50X292ZXJyaWRlX2NzcyAhPT0gJ3N0cmluZycgJiZcbiAgICBvYmoubWVyY2hhbnRfb3ZlcnJpZGVfY3NzICE9PSBudWxsXG4gICkge1xuICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgJ0ludmFsaWQgR3JhcGhRTCBmcm9udGVuZCBjb25maWcgZGF0YTogbWVyY2hhbnRfb3ZlcnJpZGVfY3NzIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbCcsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7IGRhdGEgfSxcbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBwYWdlX3ZhcmlhbnRzIGlmIHByZXNlbnRcbiAgaWYgKCdwYWdlX3ZhcmlhbnRzJyBpbiBvYmopIHtcbiAgICBpZiAoXG4gICAgICBvYmoucGFnZV92YXJpYW50cyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBvYmoucGFnZV92YXJpYW50cyAhPT0gbnVsbCAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkob2JqLnBhZ2VfdmFyaWFudHMpXG4gICAgKSB7XG4gICAgICBMb2dnZXIubG9nV2FybihcbiAgICAgICAgJ0ludmFsaWQgR3JhcGhRTCBmcm9udGVuZCBjb25maWcgZGF0YTogcGFnZV92YXJpYW50cyBtdXN0IGJlIGFuIGFycmF5IG9yIG51bGwvdW5kZWZpbmVkJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7IGRhdGEgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIG1vdW50aW5nX2NvbmZpZ3MgaWYgcHJlc2VudFxuICBpZiAoJ21vdW50aW5nX2NvbmZpZ3MnIGluIG9iaikge1xuICAgIGlmIChcbiAgICAgIG9iai5tb3VudGluZ19jb25maWdzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG9iai5tb3VudGluZ19jb25maWdzICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShvYmoubW91bnRpbmdfY29uZmlncylcbiAgICApIHtcbiAgICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgICAnSW52YWxpZCBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhOiBtb3VudGluZ19jb25maWdzIG11c3QgYmUgYW4gYXJyYXkgb3IgbnVsbC91bmRlZmluZWQnLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHsgZGF0YSB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgd2lkZ2V0X2NvbmZpZ3MgaWYgcHJlc2VudFxuICBpZiAoJ3dpZGdldF9jb25maWdzJyBpbiBvYmopIHtcbiAgICBpZiAoXG4gICAgICBvYmoud2lkZ2V0X2NvbmZpZ3MgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgb2JqLndpZGdldF9jb25maWdzICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShvYmoud2lkZ2V0X2NvbmZpZ3MpXG4gICAgKSB7XG4gICAgICBMb2dnZXIubG9nV2FybihcbiAgICAgICAgJ0ludmFsaWQgR3JhcGhRTCBmcm9udGVuZCBjb25maWcgZGF0YTogd2lkZ2V0X2NvbmZpZ3MgbXVzdCBiZSBhbiBhcnJheSBvciBudWxsL3VuZGVmaW5lZCcsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgeyBkYXRhIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB1aV9jb25maWdzIGlmIHByZXNlbnRcbiAgaWYgKCd1aV9jb25maWdzJyBpbiBvYmogJiYgdHlwZW9mIG9iai51aV9jb25maWdzICE9PSAnb2JqZWN0JyAmJiBvYmoudWlfY29uZmlncyAhPT0gbnVsbCkge1xuICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgJ0ludmFsaWQgR3JhcGhRTCBmcm9udGVuZCBjb25maWcgZGF0YTogdWlfY29uZmlncyBtdXN0IGJlIGFuIG9iamVjdCBvciBudWxsL3VuZGVmaW5lZCcsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7IGRhdGEgfSxcbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRyYW5zZm9ybSB0aGUgZGF0YSB0byBjYW1lbENhc2VcbiAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGEgPSB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwob2JqKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIC8vIENvbnZlcnQgcGFnZV92YXJpYW50cyBmcm9tIGFycmF5IHRvIHZhbGlkYXRlZCBhcnJheSBpZiBwcmVzZW50XG4gICAgaWYgKHRyYW5zZm9ybWVkRGF0YS5wYWdlVmFyaWFudHMgJiYgQXJyYXkuaXNBcnJheSh0cmFuc2Zvcm1lZERhdGEucGFnZVZhcmlhbnRzKSkge1xuICAgICAgY29uc3QgcGFnZVZhcmlhbnRzQXJyYXkgPSB0cmFuc2Zvcm1lZERhdGEucGFnZVZhcmlhbnRzO1xuICAgICAgY29uc3QgdmFsaWRhdGVkUGFnZVZhcmlhbnRzOiBQYWdlVmFyaWFudENvbmZpZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgdmFyaWFudCBvZiBwYWdlVmFyaWFudHNBcnJheSkge1xuICAgICAgICBpZiAodmFyaWFudCAmJiB0eXBlb2YgdmFyaWFudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhcmlhbnQudmFyaWFudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRWYXJpYW50ID0gdmFsaWRhdGVBbmRUcmFuc2Zvcm1QYWdlVmFyaWFudHModmFyaWFudCk7XG4gICAgICAgICAgICB2YWxpZGF0ZWRQYWdlVmFyaWFudHMucHVzaCh2YWxpZGF0ZWRWYXJpYW50KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgTG9nZ2VyLmxvZ1dhcm4oJ0ludmFsaWQgcGFnZSB2YXJpYW50LCBza2lwcGluZycsIGVycm9yLCB7XG4gICAgICAgICAgICAgIHZhcmlhbnRJZDogdmFyaWFudC52YXJpYW50SWQsXG4gICAgICAgICAgICAgIHZhcmlhbnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIENvbnRpbnVlIHByb2Nlc3Npbmcgb3RoZXIgdmFyaWFudHNcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTG9nZ2VyLmxvZ1dhcm4oJ0ludmFsaWQgcGFnZSB2YXJpYW50IHN0cnVjdHVyZSwgc2tpcHBpbmcnLCB1bmRlZmluZWQsIHsgdmFyaWFudCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cmFuc2Zvcm1lZERhdGEucGFnZVZhcmlhbnRzID0gdmFsaWRhdGVkUGFnZVZhcmlhbnRzO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgbW91bnRpbmdfY29uZmlncyBmcm9tIGFycmF5IHRvIFJlY29yZCBpZiBwcmVzZW50XG4gICAgaWYgKHRyYW5zZm9ybWVkRGF0YS5tb3VudGluZ0NvbmZpZ3MgJiYgQXJyYXkuaXNBcnJheSh0cmFuc2Zvcm1lZERhdGEubW91bnRpbmdDb25maWdzKSkge1xuICAgICAgY29uc3QgbW91bnRpbmdDb25maWdzQXJyYXkgPSB0cmFuc2Zvcm1lZERhdGEubW91bnRpbmdDb25maWdzIGFzIEFycmF5PHtcbiAgICAgICAga2V5OiBzdHJpbmc7XG4gICAgICAgIGNvbmZpZzogdW5rbm93bjtcbiAgICAgIH0+O1xuICAgICAgY29uc3QgbW91bnRpbmdDb25maWdzUmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBXaWRnZXRNb3VudGluZ0NvbmZpZz4gPSB7fTtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1vdW50aW5nQ29uZmlnc0FycmF5KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpdGVtICYmXG4gICAgICAgICAgdHlwZW9mIGl0ZW0ua2V5ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIGl0ZW0uY29uZmlnICYmXG4gICAgICAgICAgdHlwZW9mIGl0ZW0uY29uZmlnID09PSAnb2JqZWN0J1xuICAgICAgICApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHRyYW5zZm9ybSB0aGUgY29uZmlnIHN0cnVjdHVyZVxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gaXRlbS5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRDb25maWcgPSB2YWxpZGF0ZUFuZFRyYW5zZm9ybU1vdW50aW5nQ29uZmlnKGNvbmZpZywgaXRlbS5rZXkpO1xuICAgICAgICAgICAgbW91bnRpbmdDb25maWdzUmVjb3JkW2l0ZW0ua2V5XSA9IHZhbGlkYXRlZENvbmZpZztcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgTG9nZ2VyLmxvZ1dhcm4oJ0ludmFsaWQgbW91bnRpbmcgY29uZmlnLCBza2lwcGluZycsIGVycm9yLCB7XG4gICAgICAgICAgICAgIGNvbmZpZ0tleTogaXRlbS5rZXksXG4gICAgICAgICAgICAgIGNvbmZpZzogaXRlbS5jb25maWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIENvbnRpbnVlIHByb2Nlc3Npbmcgb3RoZXIgY29uZmlnc1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCBtb3VudGluZyBjb25maWcgaXRlbSBzdHJ1Y3R1cmUsIHNraXBwaW5nJywgdW5kZWZpbmVkLCB7IGl0ZW0gfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHJhbnNmb3JtZWREYXRhLm1vdW50aW5nQ29uZmlncyA9IG1vdW50aW5nQ29uZmlnc1JlY29yZDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHdpZGdldF9jb25maWdzIGZyb20gYXJyYXkgdG8gUmVjb3JkIGlmIHByZXNlbnRcbiAgICBpZiAodHJhbnNmb3JtZWREYXRhLndpZGdldENvbmZpZ3MgJiYgQXJyYXkuaXNBcnJheSh0cmFuc2Zvcm1lZERhdGEud2lkZ2V0Q29uZmlncykpIHtcbiAgICAgIGNvbnN0IHdpZGdldENvbmZpZ3NBcnJheSA9IHRyYW5zZm9ybWVkRGF0YS53aWRnZXRDb25maWdzIGFzIEFycmF5PHtcbiAgICAgICAga2V5OiBzdHJpbmc7XG4gICAgICAgIGNvbmZpZzogdW5rbm93bjtcbiAgICAgIH0+O1xuICAgICAgY29uc3Qgd2lkZ2V0Q29uZmlnc1JlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHdpZGdldENvbmZpZ3NBcnJheSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXRlbSAmJlxuICAgICAgICAgIHR5cGVvZiBpdGVtLmtleSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBpdGVtLmNvbmZpZyAmJlxuICAgICAgICAgIHR5cGVvZiBpdGVtLmNvbmZpZyA9PT0gJ29iamVjdCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB0cmFuc2Zvcm0gd2lkZ2V0IGNvbmZpZyB1c2luZyB0aGUgZGVkaWNhdGVkIHZhbGlkYXRpb24gZnVuY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGl0ZW0uY29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVkQ29uZmlnID0gdmFsaWRhdGVBbmRUcmFuc2Zvcm1XaWRnZXRDb25maWcoY29uZmlnLCBpdGVtLmtleSk7XG4gICAgICAgICAgICB3aWRnZXRDb25maWdzUmVjb3JkW2l0ZW0ua2V5XSA9IHZhbGlkYXRlZENvbmZpZztcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgTG9nZ2VyLmxvZ1dhcm4oJ0ludmFsaWQgd2lkZ2V0IGNvbmZpZywgc2tpcHBpbmcnLCBlcnJvciwge1xuICAgICAgICAgICAgICBjb25maWdLZXk6IGl0ZW0ua2V5LFxuICAgICAgICAgICAgICBjb25maWc6IGl0ZW0uY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBDb250aW51ZSBwcm9jZXNzaW5nIG90aGVyIGNvbmZpZ3NcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTG9nZ2VyLmxvZ1dhcm4oJ0ludmFsaWQgd2lkZ2V0IGNvbmZpZyBpdGVtIHN0cnVjdHVyZSwgc2tpcHBpbmcnLCB1bmRlZmluZWQsIHsgaXRlbSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cmFuc2Zvcm1lZERhdGEud2lkZ2V0Q29uZmlncyA9IHdpZGdldENvbmZpZ3NSZWNvcmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkRGF0YSBhcyBGcm9udGVuZENvbmZpZztcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBMb2dnZXIubG9nV2FybignRmFpbGVkIHRvIHZhbGlkYXRlIGFuZCB0cmFuc2Zvcm0gR3JhcGhRTCBmcm9udGVuZCBjb25maWcgZGF0YScsIGVycm9yLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG4iLCJleHBvcnQgY29uc3QgdmFsaWRhdGVHcmFwaFFMT3JnSWQgPSAoZGF0YTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgZGF0YSAhPT0gJ3N0cmluZycgfHwgZGF0YSA9PT0gJycpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuIiwiaW1wb3J0IHsgaXNNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyIH0gZnJvbSAnLi4vZ3VhcmRzL2lzTW9iaWxlUExQQ2hhdFBsYWNlbWVudFBhcmFtZXRlcic7XG5pbXBvcnQgeyBNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyIH0gZnJvbSAnLi4vbW9iaWxlUExQQ2hhdFBsYWNlbWVudFBhcmFtZXRlcic7XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZU1vYmlsZVBMUENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIgPSAoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogTW9iaWxlUExQQ2hhdFBsYWNlbWVudFBhcmFtZXRlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyKHZhbHVlKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJvd0luZGV4OiB2YWx1ZS5yb3dfaW5kZXgsXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgT3JnYW5pemF0aW9uQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvb3JnYW5pemF0aW9uQ29uZmlnJztcbmltcG9ydCB7IGlzQXBpT3JnYW5pemF0aW9uQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpT3JnYW5pemF0aW9uQ29uZmlnJztcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlT3JnYW5pemF0aW9uQ29uZmlnID0gKGRhdGE6IHVua25vd24pOiBPcmdhbml6YXRpb25Db25maWcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzQXBpT3JnYW5pemF0aW9uQ29uZmlnKGRhdGEpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaWQ6IGRhdGEuaWQsXG4gICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQudG9JU09TdHJpbmcoKSxcbiAgICBuYW1lc3BhY2U6IGRhdGEubmFtZXNwYWNlLFxuICAgIG9yZ2FuaXphdGlvbklkOiBkYXRhLm9yZ2FuaXphdGlvbl9pZCxcbiAgICBpc0xhdGVzdDogZGF0YS5pc19sYXRlc3QsXG4gICAgdmVyc2lvbjogZGF0YS52ZXJzaW9uLFxuICAgIHVwZGF0ZWRBdDogZGF0YS51cGRhdGVkX2F0LnRvSVNPU3RyaW5nKCksXG4gICAgY29uZmlnOiB7XG4gICAgICBhbXBsaXR1ZGU6IGRhdGEuY29uZmlnLmFtcGxpdHVkZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHNlc3Npb25SZXBsYXlFbmFibGVkOiBkYXRhLmNvbmZpZy5hbXBsaXR1ZGUuc2Vzc2lvbl9yZXBsYXlfZW5hYmxlZCxcbiAgICAgICAgICAgIHNlc3Npb25SZXBsYXlTYW1wbGVSYXRlOiBkYXRhLmNvbmZpZy5hbXBsaXR1ZGUuc2Vzc2lvbl9yZXBsYXlfc2FtcGxlX3JhdGUsXG4gICAgICAgICAgICB0cmFja2luZ0VuYWJsZWQ6IGRhdGEuY29uZmlnLmFtcGxpdHVkZS50cmFja2luZ19lbmFibGVkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBjdXN0b21lclNlcnZpY2U6IGRhdGEuY29uZmlnLmN1c3RvbWVyX3NlcnZpY2VcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBwcm92aWRlcjogZGF0YS5jb25maWcuY3VzdG9tZXJfc2VydmljZS5wcm92aWRlcixcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZ29vZ2xlQW5hbHl0aWNzOiBkYXRhLmNvbmZpZy5nb29nbGVfYW5hbHl0aWNzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgbWVhc3VyZW1lbnRJZDogZGF0YS5jb25maWcuZ29vZ2xlX2FuYWx5dGljcy5tZWFzdXJlbWVudF9pZCxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0sXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgaXNBcGlPcmdDb25maWdSZXN1bHRzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpT3JnQ29uZmlnUmVzdWx0cyc7XG5pbXBvcnQgeyBPcmdDb25maWcgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9vcmdDb25maWdSZXN1bHRzJztcbmltcG9ydCB7IHZhbGlkYXRlT3JnYW5pemF0aW9uQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlT3JnYW5pemF0aW9uQ29uZmlnJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvbkNvbmZpZyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvYXBpL29yZ2FuaXphdGlvbkNvbmZpZyc7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBkYXRhXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzID0gKGRhdGE6IHVua25vd24pOiBPcmdDb25maWcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzQXBpT3JnQ29uZmlnUmVzdWx0cyhkYXRhKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbmZpZ3M6IGRhdGEuY29uZmlnc1xuICAgICAgLm1hcCgoY29uZmlnKSA9PiB2YWxpZGF0ZU9yZ2FuaXphdGlvbkNvbmZpZyhjb25maWcpKVxuICAgICAgLmZpbHRlcigoY29uZmlnKTogY29uZmlnIGlzIE9yZ2FuaXphdGlvbkNvbmZpZyA9PiBjb25maWcgIT0gbnVsbCksXG4gICAgZXhwZXJpbWVudHM6IGRhdGEuZXhwZXJpbWVudHMubWFwKChleHBlcmltZW50KSA9PiAoe1xuICAgICAgZ3JvdXA6IGV4cGVyaW1lbnQuZ3JvdXAsXG4gICAgICBncm91cE5hbWU6IGV4cGVyaW1lbnQuZ3JvdXBfbmFtZSxcbiAgICAgIG5hbWU6IGV4cGVyaW1lbnQubmFtZSxcbiAgICAgIHJ1bGVJZDogZXhwZXJpbWVudC5ydWxlX2lkLFxuICAgICAgLy8gVE9ETyB0aGlzIG5lZWRzIHRvIGJlIHN0cm9uZ2x5IHR5cGVkIGJ1dCB3ZSdyZSBub3QgcnVubmluZyBhbnkgZXhwZXJpbWVudHMgYXQgdGhlIG1vbWVudFxuICAgICAgdmFsdWU6IGV4cGVyaW1lbnQudmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgfSkpLFxuICAgIGdhdGVzOiBkYXRhLmdhdGVzLm1hcCgoZ2F0ZSkgPT4gKHtcbiAgICAgIGdyb3VwTmFtZTogZ2F0ZS5ncm91cF9uYW1lLFxuICAgICAgbmFtZTogZ2F0ZS5uYW1lLFxuICAgICAgcnVsZUlkOiBnYXRlLnJ1bGVfaWQsXG4gICAgICB2YWx1ZTogZ2F0ZS52YWx1ZSxcbiAgICB9KSksXG4gICAgb3JnOiB7XG4gICAgICBvcmc6IHtcbiAgICAgICAgaWQ6IGRhdGEub3JnLm9yZy5pZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGRhdGEub3JnLm9yZy5kaXNwbGF5X25hbWUsXG4gICAgICAgIGRvbWFpbjogZGF0YS5vcmcub3JnLmRvbWFpbixcbiAgICAgICAgc2hvcnROYW1lOiBkYXRhLm9yZy5vcmcuc2hvcnRfbmFtZSxcbiAgICAgICAgc3RhdHVzOiBkYXRhLm9yZy5vcmcuc3RhdHVzLFxuICAgICAgICBjcmVhdGVkQXQ6IGRhdGEub3JnLm9yZy5jcmVhdGVkX2F0Py50b0lTT1N0cmluZygpLFxuICAgICAgICB1cGRhdGVkQXQ6IGRhdGEub3JnLm9yZy51cGRhdGVkX2F0Py50b0lTT1N0cmluZygpLFxuICAgICAgfSxcbiAgICAgIHNldHRpbmdzOiB7fSxcbiAgICB9LFxuICB9O1xufTtcbiIsImltcG9ydCB7IFJlc3BvbnNlQ2F0ZWdvcnkgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgUmVzcG9uc2UsIFJldmlld1JpY2hJbmZvcm1hdGlvbiB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvaW5kZXgnO1xuaW1wb3J0IHsgQXBpUmV2aWV3UmljaEluZm9ybWF0aW9uIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvcmVzcG9uc2VHZW5lcmljcyc7XG5pbXBvcnQgeyBpc0FwaVBhZ2VSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQYWdlUmVzcG9uc2VBdHRyaWJ1dGVzJztcbmltcG9ydCB7IGlzQXBpUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVByb2R1Y3RSZXNwb25zZUF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlSZXNwb25zZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVJlc3BvbnNlJztcbmltcG9ydCB7IGlzQXBpUmV2aWV3UmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUmV2aWV3UmVzcG9uc2VBdHRyaWJ1dGVzJztcbmltcG9ydCB7IGlzQXBpVGV4dFJlc3BvbnNlQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVRleHRSZXNwb25zZUF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlQcm9kdWN0U2VhcmNoUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUHJvZHVjdFNlYXJjaEF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpRm9ybVJlc3BvbnNlJztcbmltcG9ydCB7IGlzQXBpT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlPcmRlclJlc3BvbnNlQXR0cmlidXRlcyc7XG5pbXBvcnQgeyBzdHJpbmdUb0Z1bGZpbGxtZW50RGlzcGxheVN0YXR1c0VudW1WYWx1ZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdXRpbHMvc3RyaW5nVG9GdWxmaWxsbWVudERpc3BsYXlTdGF0dXNFbnVtVmFsdWUnO1xuaW1wb3J0IHsgaXNBcGlQcm9kdWN0U2VhcmNoRmlsdGVyUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUHJvZHVjdFNlYXJjaEZpbHRlckF0dHJpYnV0ZXMnO1xuXG5jb25zdCByaWNoSW5mb3JtYXRpb25Gcm9tQ29tbWVyY2VSaWNoSW5mb3JtYXRpb24gPSAoXG4gIGRhdGE6IEFwaVJldmlld1JpY2hJbmZvcm1hdGlvbixcbik6IFJldmlld1JpY2hJbmZvcm1hdGlvbiA9PiAoe1xuICBjb25zOiBkYXRhLmNvbnMsXG4gIHByb3M6IGRhdGEucHJvcyxcbiAgcmV2aWV3RGF0ZTogZGF0YS5yZXZpZXdfZGF0ZSxcbiAgcmV2aWV3ZXJUaXRsZTogZGF0YS5yZXZpZXdlcl90aXRsZSxcbiAgcHJvZHVjdEZhbWlsaWFyaXR5OiBkYXRhLnByb2R1Y3RfZmFtaWxpYXJpdHksXG59KTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUmVzcG9uc2UgPSAoZGF0YTogdW5rbm93bik6IFJlc3BvbnNlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc0FwaVJlc3BvbnNlKGRhdGEpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlRleHQgJiYgaXNBcGlUZXh0UmVzcG9uc2VBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBSZXNwb25zZUNhdGVnb3J5LlRleHQsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGNvbnRlbnQ6IGRhdGEuYXR0cmlidXRlcy5jb250ZW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdCAmJlxuICAgIGlzQXBpUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZGF0YS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdCxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgaWQ6IGRhdGEuYXR0cmlidXRlcy5pZCxcbiAgICAgICAgZGVzY3JpcHRpb246IGRhdGEuYXR0cmlidXRlcy5kZXNjcmlwdGlvbixcbiAgICAgICAgaW1hZ2VVcmw6IGRhdGEuYXR0cmlidXRlcy5pbWFnZV91cmwsXG4gICAgICAgIGltYWdlVXJsczogZGF0YS5hdHRyaWJ1dGVzLmltYWdlX3VybHMsXG4gICAgICAgIHRpdGxlOiBkYXRhLmF0dHJpYnV0ZXMudGl0bGUsXG4gICAgICAgIHVybDogZGF0YS5hdHRyaWJ1dGVzLnVybCxcbiAgICAgICAgb3JpZ2luYWxQcmljZTogZGF0YS5hdHRyaWJ1dGVzLm9yaWdpbmFsX3ByaWNlLFxuICAgICAgICBzYWxlUHJpY2U6IGRhdGEuYXR0cmlidXRlcy5zYWxlX3ByaWNlLFxuICAgICAgICBhdmVyYWdlUmF0aW5nOiBkYXRhLmF0dHJpYnV0ZXMuYXZlcmFnZV9yYXRpbmcsXG4gICAgICAgIG51bWJlclJldmlld3M6IGRhdGEuYXR0cmlidXRlcy5udW1iZXJfcmV2aWV3cyxcbiAgICAgICAgbWV0YWRhdGE6IGRhdGEuYXR0cmlidXRlcy5tZXRhZGF0YSxcbiAgICAgICAgaXNGb3JHcmlkOiBkYXRhLmF0dHJpYnV0ZXMuaXNfZm9yX2dyaWQsXG4gICAgICAgIGNvbG9yczogZGF0YS5hdHRyaWJ1dGVzLmNvbG9ycyxcbiAgICAgICAgc2l6ZXM6IGRhdGEuYXR0cmlidXRlcy5zaXplcyxcbiAgICAgICAgZmlsdGVyczogZGF0YS5hdHRyaWJ1dGVzLmZpbHRlcnMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5SZXZpZXcgJiYgaXNBcGlSZXZpZXdSZXNwb25zZUF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKSkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZGF0YS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFJlc3BvbnNlQ2F0ZWdvcnkuUmV2aWV3LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBpZDogZGF0YS5hdHRyaWJ1dGVzLmlkLFxuICAgICAgICBwcm9kdWN0SWQ6IGRhdGEuYXR0cmlidXRlcy5wcm9kdWN0X2lkLFxuICAgICAgICB0aXRsZTogZGF0YS5hdHRyaWJ1dGVzLnRpdGxlLFxuICAgICAgICByZXZpZXdlcjogZGF0YS5hdHRyaWJ1dGVzLnJldmlld2VyLFxuICAgICAgICByZXZpZXc6IGRhdGEuYXR0cmlidXRlcy5yZXZpZXcsXG4gICAgICAgIHN0YXJzOiBkYXRhLmF0dHJpYnV0ZXMuc3RhcnMsXG4gICAgICAgIHJpY2hJbmZvcm1hdGlvbjogZGF0YS5hdHRyaWJ1dGVzLnJpY2hfaW5mb3JtYXRpb25cbiAgICAgICAgICA/IHJpY2hJbmZvcm1hdGlvbkZyb21Db21tZXJjZVJpY2hJbmZvcm1hdGlvbihkYXRhLmF0dHJpYnV0ZXMucmljaF9pbmZvcm1hdGlvbilcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlNlcGFyYXRvcikge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZGF0YS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFJlc3BvbnNlQ2F0ZWdvcnkuU2VwYXJhdG9yLFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5QYWdlICYmIGlzQXBpUGFnZVJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5QYWdlLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBpZDogZGF0YS5hdHRyaWJ1dGVzLmlkLFxuICAgICAgICB0aXRsZTogZGF0YS5hdHRyaWJ1dGVzLnRpdGxlLFxuICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS5hdHRyaWJ1dGVzLmRlc2NyaXB0aW9uLFxuICAgICAgICB1cmw6IGRhdGEuYXR0cmlidXRlcy51cmwsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Gb3JtICYmIGlzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5Gb3JtLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBmb3JtQ2F0ZWdvcnk6IGRhdGEuYXR0cmlidXRlcy5mb3JtX2NhdGVnb3J5XG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGZvcm1UeXBlOiBkYXRhLmF0dHJpYnV0ZXMuZm9ybV9jYXRlZ29yeS5mb3JtX3R5cGUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHByb3BlcnRpZXM6IGRhdGEuYXR0cmlidXRlcy5zY2hlbWEucHJvcGVydGllcyxcbiAgICAgICAgICByZXF1aXJlZDogZGF0YS5hdHRyaWJ1dGVzLnNjaGVtYS5yZXF1aXJlZC5tYXAoU3RyaW5nKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChcbiAgICBkYXRhLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlByb2R1Y3RTZWFyY2ggJiZcbiAgICBpc0FwaVByb2R1Y3RTZWFyY2hSZXNwb25zZUF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKVxuICApIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBSZXNwb25zZUNhdGVnb3J5LlByb2R1Y3RTZWFyY2gsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGdlbmVyYXRlZFF1ZXJ5OiBkYXRhLmF0dHJpYnV0ZXMuZ2VuZXJhdGVkX3F1ZXJ5LFxuICAgICAgICBwcm9kdWN0Q291bnQ6IGRhdGEuYXR0cmlidXRlcy5wcm9kdWN0X2NvdW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdFNlYXJjaEZpbHRlciAmJlxuICAgIGlzQXBpUHJvZHVjdFNlYXJjaEZpbHRlclJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZGF0YS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdFNlYXJjaEZpbHRlcixcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZmlsdGVyTmFtZTogZGF0YS5hdHRyaWJ1dGVzLmZpbHRlcl9uYW1lLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuT3JkZXIgJiYgaXNBcGlPcmRlclJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5PcmRlcixcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgb3JkZXJJZDogZGF0YS5hdHRyaWJ1dGVzLm9yZGVyX2lkLFxuICAgICAgICBvcmRlck51bWJlcjogZGF0YS5hdHRyaWJ1dGVzLm9yZGVyX251bWJlcixcbiAgICAgICAgY3JlYXRlZEF0OiBkYXRhLmF0dHJpYnV0ZXMuY3JlYXRlZF9hdCxcbiAgICAgICAgbGF0ZXN0RXZlbnREYXRlOiBkYXRhLmF0dHJpYnV0ZXMubGF0ZXN0X2V2ZW50X2RhdGUsXG4gICAgICAgIGxpbmVJdGVtczogZGF0YS5hdHRyaWJ1dGVzLmxpbmVfaXRlbXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgIGl0ZW1UaXRsZTogaXRlbS5pdGVtX3RpdGxlLFxuICAgICAgICAgIGl0ZW1QcmljZTogaXRlbS5pdGVtX3ByaWNlLFxuICAgICAgICAgIGl0ZW1RdWFudGl0eTogaXRlbS5pdGVtX3F1YW50aXR5LFxuICAgICAgICAgIG9yZGVySXRlbUlkOiBpdGVtLm9yZGVyX2l0ZW1faWQsXG4gICAgICAgICAgaW1hZ2U6IGl0ZW0uaW1hZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGluVHJhbnNpdEF0OiBpdGVtLmluX3RyYW5zaXRfYXQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGRlbGl2ZXJlZEF0OiBpdGVtLmRlbGl2ZXJlZF9hdCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgZXN0aW1hdGVkRGVsaXZlcnlBdDogaXRlbS5lc3RpbWF0ZWRfZGVsaXZlcnlfYXQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGZ1bGZpbGxtZW50RGlzcGxheVN0YXR1czogaXRlbS5mdWxmaWxsbWVudF9kaXNwbGF5X3N0YXR1c1xuICAgICAgICAgICAgPyBzdHJpbmdUb0Z1bGZpbGxtZW50RGlzcGxheVN0YXR1c0VudW1WYWx1ZShpdGVtLmZ1bGZpbGxtZW50X2Rpc3BsYXlfc3RhdHVzKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgdHJhY2tpbmdVcmw6IGl0ZW0udHJhY2tpbmdfdXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iLCJpbXBvcnQgeyBpc1N1Z2dlc3Rpb24gfSBmcm9tICcuLi9ndWFyZHMvYXBpL2lzQXBpU3VnZ2VzdGlvbic7XG5pbXBvcnQgeyBTdWdnZXN0aW9uIH0gZnJvbSAnLi4vYXBpL3N1Z2dlc3Rpb24nO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVTdWdnZXN0aW9uID0gKGRhdGE6IHVua25vd24pOiBTdWdnZXN0aW9uIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1N1Z2dlc3Rpb24oZGF0YSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogZGF0YS5pZCxcbiAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICBjb250ZW50OiBkYXRhLmNvbnRlbnQsXG4gICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgaXNBbnN3ZXI6IGRhdGEuaXNfYW5zd2VyLFxuICB9O1xufTtcbiIsImltcG9ydCB7IFVzZXJFdmVudENhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IGlzQXBpVXNlckV2ZW50IH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpVXNlckV2ZW50JztcbmltcG9ydCB7IFVzZXJFdmVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvaW5kZXgnO1xuaW1wb3J0IHsgaXNBcGlQRFBBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUERQRXZlbnRBdHRyaWJ1dGVzJztcbmltcG9ydCB7IGlzQXBpUXVlcnlUeXBlZEF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlRdWVyeVR5cGVkRXZlbnRBdHRyaWJ1dGVzJztcbmltcG9ydCB7IGlzQXBpU2VhcmNoQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVNlYXJjaEV2ZW50QXR0cmlidXRlcyc7XG5pbXBvcnQgeyBpc0FwaVN1Z2dlc3Rpb25DbGlja2VkQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVN1Z2dlc3Rpb25DbGlja2VkRXZlbnRBdHRyaWJ1dGVzJztcbmltcG9ydCB7XG4gIGlzQXBpUExQRXZlbnRBdHRyaWJ1dGVzLFxuICBpc0FwaVBMUElkQXR0cmlidXRlLFxufSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQTFBFdmVudEF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpRm9ybVN1Ym1pdHRlZFJlc3BvbnNlQXR0cmlidXRlcyc7XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVVzZXJFdmVudCA9IChkYXRhOiB1bmtub3duKTogVXNlckV2ZW50IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc0FwaVVzZXJFdmVudChkYXRhKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUGRwVmlzaXQgJiYgaXNBcGlQRFBBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRJZDogZGF0YS5ldmVudF9pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFVzZXJFdmVudENhdGVnb3J5LlBkcFZpc2l0LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBwcm9kdWN0SWQ6IGRhdGEuYXR0cmlidXRlcy5wcm9kdWN0X2lkLFxuICAgICAgICBwYXJlbnRQcm9kdWN0SWQ6IGRhdGEuYXR0cmlidXRlcy5wYXJlbnRfcHJvZHVjdF9pZCxcbiAgICAgICAgdXJsOiBkYXRhLmF0dHJpYnV0ZXMudXJsLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlF1ZXJ5VHlwZWQgJiZcbiAgICBpc0FwaVF1ZXJ5VHlwZWRBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50SWQ6IGRhdGEuZXZlbnRfaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBVc2VyRXZlbnRDYXRlZ29yeS5RdWVyeVR5cGVkLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBxdWVyeTogZGF0YS5hdHRyaWJ1dGVzLnF1ZXJ5LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlNlYXJjaCAmJiBpc0FwaVNlYXJjaEF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKSkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudElkOiBkYXRhLmV2ZW50X2lkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogVXNlckV2ZW50Q2F0ZWdvcnkuU2VhcmNoLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBzZWFyY2hUZXJtOiBkYXRhLmF0dHJpYnV0ZXMuc2VhcmNoX3Rlcm0sXG4gICAgICAgIHNlbGVjdGVkRmlsdGVyczogZGF0YS5hdHRyaWJ1dGVzLnNlbGVjdGVkX2ZpbHRlcnMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuU3VnZ2VzdGlvbkNsaWNrZWQgJiZcbiAgICBpc0FwaVN1Z2dlc3Rpb25DbGlja2VkQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudElkOiBkYXRhLmV2ZW50X2lkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogVXNlckV2ZW50Q2F0ZWdvcnkuU3VnZ2VzdGlvbkNsaWNrZWQsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHN1Z2dlc3Rpb25JZDogZGF0YS5hdHRyaWJ1dGVzLnN1Z2dlc3Rpb25faWQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUGxwVmlzaXQgJiYgaXNBcGlQTFBFdmVudEF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKSkge1xuICAgIGlmIChpc0FwaVBMUElkQXR0cmlidXRlKGRhdGEuYXR0cmlidXRlcykpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV2ZW50SWQ6IGRhdGEuZXZlbnRfaWQsXG4gICAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgICBjYXRlZ29yeTogVXNlckV2ZW50Q2F0ZWdvcnkuUGxwVmlzaXQsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBjYXRlZ29yeTogZGF0YS5hdHRyaWJ1dGVzLmNhdGVnb3J5LFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgIGlkOiBkYXRhLmF0dHJpYnV0ZXMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQgJiZcbiAgICBpc0FwaUZvcm1TdWJtaXR0ZWRSZXNwb25zZUF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKVxuICApIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRJZDogZGF0YS5ldmVudF9pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGZpbGxlZFNjaGVtYTogeyAuLi5kYXRhLmF0dHJpYnV0ZXMuZmlsbGVkX3NjaGVtYSB9LFxuICAgICAgICBmb3JtUmVzcG9uc2VJZDogZGF0YS5hdHRyaWJ1dGVzLmZvcm1fcmVzcG9uc2VfaWQsXG4gICAgICAgIGZvcm1UeXBlOiBkYXRhLmF0dHJpYnV0ZXMuZm9ybV90eXBlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gd2UncmUgbm90IHVzaW5nIGFwcF91bmxvYWRlZCBhdCB0aGUgbW9tZW50IHNvIHJldHVybiB0aGUgYXBwX2xvYWRlZCBldmVudCBhcyBkZWZhdWx0XG4gIHJldHVybiB7XG4gICAgZXZlbnRJZDogZGF0YS5ldmVudF9pZCxcbiAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICBjYXRlZ29yeTogVXNlckV2ZW50Q2F0ZWdvcnkuQXBwTG9hZGVkLFxuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBLElBQVksb0ZBQUw7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbkJGLElBQVksOERBQUw7QUFDTDtBQUNBOzs7Ozs7QUNIRixJQUFLLDBFQUFMO0FBQ0U7QUFDQTs7RUFGRzs7OztBQ2FMLElBQVksc0RBQUw7QUFDTDtBQUNBOzs7QUFHRixJQUFZLHNEQUFMO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7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