@ukhomeoffice/cop-react-form-renderer 7.3.2-alpha.5 → 8.0.0-alpha

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 (761) hide show
  1. package/README.md +106 -32
  2. package/dist/components/CheckYourAnswers/Answer.d.ts +10 -0
  3. package/dist/components/CheckYourAnswers/CheckYourAnswers.d.ts +35 -0
  4. package/dist/components/CheckYourAnswers/index.d.ts +2 -0
  5. package/dist/components/CollectionPage/CollectionPage.d.ts +24 -0
  6. package/dist/components/CollectionPage/index.d.ts +1 -0
  7. package/dist/components/CollectionSummary/BannerStrip.d.ts +9 -0
  8. package/dist/components/CollectionSummary/CollectionSummary.d.ts +53 -0
  9. package/dist/components/CollectionSummary/Confirmation.d.ts +15 -0
  10. package/dist/components/CollectionSummary/RenderListView.d.ts +42 -0
  11. package/dist/components/CollectionSummary/SummaryCard.d.ts +62 -0
  12. package/dist/components/CollectionSummary/SummaryCardButtons.d.ts +21 -0
  13. package/dist/components/CollectionSummary/SummaryCardDetails.d.ts +14 -0
  14. package/dist/components/CollectionSummary/SummaryCardValidationContext.d.ts +9 -0
  15. package/dist/components/CollectionSummary/index.d.ts +2 -0
  16. package/dist/components/FormComponent/Collection.d.ts +39 -0
  17. package/dist/components/FormComponent/Container.d.ts +26 -0
  18. package/dist/components/FormComponent/FormComponent.d.ts +39 -0
  19. package/dist/components/FormComponent/helpers/addLabel.d.ts +7 -0
  20. package/dist/components/FormComponent/helpers/getComponentDisabled.d.ts +2 -0
  21. package/dist/components/FormComponent/helpers/getComponentError.d.ts +4 -0
  22. package/dist/components/FormComponent/helpers/getComponentFieldSet.d.ts +2 -0
  23. package/dist/components/FormComponent/helpers/index.d.ts +5 -0
  24. package/dist/components/FormComponent/index.d.ts +2 -0
  25. package/dist/components/FormPage/FormPage.d.ts +36 -0
  26. package/dist/components/FormPage/index.d.ts +2 -0
  27. package/dist/components/FormRenderer/FormRenderer.d.ts +39 -0
  28. package/dist/components/FormRenderer/handlers/cyaAction.d.ts +9 -0
  29. package/dist/components/FormRenderer/handlers/getPageId.d.ts +8 -0
  30. package/dist/components/FormRenderer/handlers/index.d.ts +6 -0
  31. package/dist/components/FormRenderer/handlers/navigate.d.ts +10 -0
  32. package/dist/components/FormRenderer/handlers/submissionError.d.ts +7 -0
  33. package/dist/components/FormRenderer/helpers/canActionProceed.d.ts +12 -0
  34. package/dist/components/FormRenderer/helpers/canCYASubmit.d.ts +10 -0
  35. package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.d.ts +2 -0
  36. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.d.ts +51 -0
  37. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.d.ts +179 -0
  38. package/dist/components/FormRenderer/helpers/getCYA.d.ts +20 -0
  39. package/dist/components/FormRenderer/helpers/getFormState.d.ts +25 -0
  40. package/dist/components/FormRenderer/helpers/getNextPageId.d.ts +2 -0
  41. package/dist/components/FormRenderer/helpers/getPage.d.ts +9 -0
  42. package/dist/components/FormRenderer/helpers/getRelevantPages.d.ts +2 -0
  43. package/dist/components/FormRenderer/helpers/getSubmissionStatus.d.ts +2 -0
  44. package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.d.ts +10 -0
  45. package/dist/components/FormRenderer/helpers/index.d.ts +29 -0
  46. package/dist/components/FormRenderer/index.d.ts +2 -0
  47. package/dist/components/FormRenderer/onCYAAction.d.ts +6 -0
  48. package/dist/components/FormRenderer/onPageAction.d.ts +2 -0
  49. package/dist/components/FormRenderer/onTaskAction.d.ts +2 -0
  50. package/dist/components/PageActions/ActionButton.d.ts +7 -0
  51. package/dist/components/PageActions/PageActions.d.ts +7 -0
  52. package/dist/components/PageActions/index.d.ts +2 -0
  53. package/dist/components/SummaryList/GroupAction.d.ts +12 -0
  54. package/dist/components/SummaryList/RowAction.d.ts +12 -0
  55. package/dist/components/SummaryList/SummaryList.d.ts +28 -0
  56. package/dist/components/SummaryList/SummaryList.stories.d.ts +10 -0
  57. package/dist/components/SummaryList/SummaryListHeadingRow.d.ts +7 -0
  58. package/dist/components/SummaryList/SummaryListHeadingRowWithAction.d.ts +16 -0
  59. package/dist/components/SummaryList/SummaryListRow.d.ts +19 -0
  60. package/dist/components/SummaryList/SummaryListTitleRow.d.ts +7 -0
  61. package/dist/components/SummaryList/helpers/getGroupActionAttributes.d.ts +17 -0
  62. package/dist/components/SummaryList/helpers/getRowActionAttributes.d.ts +17 -0
  63. package/dist/components/SummaryList/helpers/index.d.ts +2 -0
  64. package/dist/components/SummaryList/index.d.ts +2 -0
  65. package/dist/components/TaskList/Task.d.ts +12 -0
  66. package/dist/components/TaskList/TaskList.d.ts +40 -0
  67. package/dist/components/TaskList/TaskState.d.ts +6 -0
  68. package/dist/components/TaskList/index.d.ts +2 -0
  69. package/dist/components/index.d.ts +8 -0
  70. package/dist/context/HooksContext/HooksContext.d.ts +23 -0
  71. package/dist/context/HooksContext/index.d.ts +3 -0
  72. package/dist/context/ValidationContext/ValidationContext.d.ts +7 -0
  73. package/dist/context/ValidationContext/index.d.ts +3 -0
  74. package/dist/context/index.d.ts +3 -0
  75. package/dist/hooks/index.d.ts +6 -0
  76. package/dist/hooks/useAxios.d.ts +2 -0
  77. package/dist/hooks/useGetRequest.d.ts +12 -0
  78. package/dist/hooks/useHooks.d.ts +2 -0
  79. package/dist/hooks/useRefData.d.ts +7 -0
  80. package/dist/hooks/useValidation.d.ts +2 -0
  81. package/dist/index.cjs +5 -0
  82. package/dist/index.css +1 -0
  83. package/dist/index.d.ts +6 -0
  84. package/dist/index.js +6124 -81
  85. package/dist/models/CollectionLabels.d.ts +7 -0
  86. package/dist/models/ComponentTypes.d.ts +27 -0
  87. package/dist/models/EventTypes.d.ts +6 -0
  88. package/dist/models/FormPages.d.ts +6 -0
  89. package/dist/models/FormTypes.d.ts +10 -0
  90. package/dist/models/HubFormats.d.ts +5 -0
  91. package/dist/models/PageAction.d.ts +89 -0
  92. package/dist/models/TaskStates.d.ts +39 -0
  93. package/dist/models/index.d.ts +143 -0
  94. package/dist/setupTests.d.ts +14 -0
  95. package/dist/utils/CheckYourAnswers/getCYAAction.d.ts +20 -0
  96. package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.d.ts +22 -0
  97. package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.d.ts +22 -0
  98. package/dist/utils/CheckYourAnswers/getCYARow.d.ts +26 -0
  99. package/dist/utils/CheckYourAnswers/getCYARowForGroup.d.ts +17 -0
  100. package/dist/utils/CheckYourAnswers/getCYARowsForCollection.d.ts +2 -0
  101. package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.d.ts +23 -0
  102. package/dist/utils/CheckYourAnswers/getCYARowsForContainer.d.ts +2 -0
  103. package/dist/utils/CheckYourAnswers/getCYARowsForPage.d.ts +11 -0
  104. package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.d.ts +3 -0
  105. package/dist/utils/CheckYourAnswers/index.d.ts +5 -0
  106. package/dist/utils/CheckYourAnswers/showComponentCYA.d.ts +11 -0
  107. package/dist/utils/CollectionPage/addCollectionPageEntry.d.ts +12 -0
  108. package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.d.ts +13 -0
  109. package/dist/utils/CollectionPage/duplicateCollectionPageEntry.d.ts +13 -0
  110. package/dist/utils/CollectionPage/getCollectionPageActiveId.d.ts +14 -0
  111. package/dist/utils/CollectionPage/getCollectionPageActiveIndex.d.ts +15 -0
  112. package/dist/utils/CollectionPage/getCollectionPageData.d.ts +15 -0
  113. package/dist/utils/CollectionPage/getErrorsForCollection.d.ts +2 -0
  114. package/dist/utils/CollectionPage/getQuickEditPage.d.ts +40 -0
  115. package/dist/utils/CollectionPage/index.d.ts +13 -0
  116. package/dist/utils/CollectionPage/mergeCollectionPages.d.ts +13 -0
  117. package/dist/utils/CollectionPage/removeCollectionPageEntry.d.ts +11 -0
  118. package/dist/utils/CollectionPage/setCollectionPageData.d.ts +16 -0
  119. package/dist/utils/Component/addShowWhen.d.ts +13 -0
  120. package/dist/utils/Component/applyToComponentTree.d.ts +15 -0
  121. package/dist/utils/Component/cleanAttributes.d.ts +14 -0
  122. package/dist/utils/Component/elevateNestedComponents.d.ts +28 -0
  123. package/dist/utils/Component/getDefaultValue.d.ts +2 -0
  124. package/dist/utils/Component/getDefaultValueFromConfig.d.ts +2 -0
  125. package/dist/utils/Component/index.d.ts +12 -0
  126. package/dist/utils/Component/isEditable.d.ts +3 -0
  127. package/dist/utils/Component/optionIsSelected.d.ts +10 -0
  128. package/dist/utils/Component/setupContainerComponentsPath.d.ts +2 -0
  129. package/dist/utils/Component/showComponent.d.ts +2 -0
  130. package/dist/utils/Condition/index.d.ts +6 -0
  131. package/dist/utils/Condition/meetsAllConditions.d.ts +8 -0
  132. package/dist/utils/Condition/meetsCondition.d.ts +14 -0
  133. package/dist/utils/Condition/meetsOneCondition.d.ts +8 -0
  134. package/dist/utils/Condition/setupConditions.d.ts +2 -0
  135. package/dist/utils/Container/getEditableComponents.d.ts +7 -0
  136. package/dist/utils/Container/index.d.ts +6 -0
  137. package/dist/utils/Container/setupNesting.d.ts +2 -0
  138. package/dist/utils/Container/showContainer.d.ts +8 -0
  139. package/dist/utils/Data/applyFormula.d.ts +2 -0
  140. package/dist/utils/Data/deleteValues.d.ts +8 -0
  141. package/dist/utils/Data/getAutocompleteSource.d.ts +2 -0
  142. package/dist/utils/Data/getDataPath.d.ts +21 -0
  143. package/dist/utils/Data/getOptions.d.ts +2 -0
  144. package/dist/utils/Data/getSourceData.d.ts +17 -0
  145. package/dist/utils/Data/index.d.ts +15 -0
  146. package/dist/utils/Data/nestInRefdataOptions.d.ts +10 -0
  147. package/dist/utils/Data/refDataToOptions.d.ts +8 -0
  148. package/dist/utils/Data/setDataItem.d.ts +2 -0
  149. package/dist/utils/Data/setupFormData.d.ts +15 -0
  150. package/dist/utils/Data/setupRefDataUrlForComponent.d.ts +2 -0
  151. package/dist/utils/FormPage/applyConditionalProperties.d.ts +8 -0
  152. package/dist/utils/FormPage/getConditionalText.d.ts +23 -0
  153. package/dist/utils/FormPage/getFormPage.d.ts +9 -0
  154. package/dist/utils/FormPage/getFormPages.d.ts +9 -0
  155. package/dist/utils/FormPage/getPageActions.d.ts +13 -0
  156. package/dist/utils/FormPage/getParagraphFromText.d.ts +11 -0
  157. package/dist/utils/FormPage/index.d.ts +10 -0
  158. package/dist/utils/FormPage/showFormPage.d.ts +8 -0
  159. package/dist/utils/FormPage/showFormPageCYA.d.ts +8 -0
  160. package/dist/utils/FormPage/useComponent.d.ts +9 -0
  161. package/dist/utils/Format/formatData.d.ts +8 -0
  162. package/dist/utils/Format/formatDataForComponent.d.ts +15 -0
  163. package/dist/utils/Format/formatDataForForm.d.ts +8 -0
  164. package/dist/utils/Format/formatDataForPage.d.ts +15 -0
  165. package/dist/utils/Format/index.d.ts +7 -0
  166. package/dist/utils/Hub/getFormHub.d.ts +15 -0
  167. package/dist/utils/Hub/index.d.ts +4 -0
  168. package/dist/utils/Meta/constants.d.ts +2 -0
  169. package/dist/utils/Meta/documents/getDocuments.d.ts +2 -0
  170. package/dist/utils/Meta/documents/index.d.ts +6 -0
  171. package/dist/utils/Meta/documents/setDocumentsForField.d.ts +2 -0
  172. package/dist/utils/Meta/index.d.ts +9 -0
  173. package/dist/utils/Operate/checkValueIsTruthy.d.ts +9 -0
  174. package/dist/utils/Operate/deleteValueInFormData.d.ts +8 -0
  175. package/dist/utils/Operate/doesContainValue.d.ts +11 -0
  176. package/dist/utils/Operate/getFirstOf.d.ts +2 -0
  177. package/dist/utils/Operate/getIndexOfMatchingValueIn.d.ts +11 -0
  178. package/dist/utils/Operate/getLength.d.ts +11 -0
  179. package/dist/utils/Operate/index.d.ts +4 -0
  180. package/dist/utils/Operate/persistValueInFormData.d.ts +9 -0
  181. package/dist/utils/Operate/runPageOperations.d.ts +19 -0
  182. package/dist/utils/Operate/setValueInFormData.d.ts +2 -0
  183. package/dist/utils/Operate/shouldRun.d.ts +9 -0
  184. package/dist/utils/Validate/additional/conditionallyPermittedChange.d.ts +14 -0
  185. package/dist/utils/Validate/additional/conditionallyRequired.d.ts +11 -0
  186. package/dist/utils/Validate/additional/index.d.ts +2 -0
  187. package/dist/utils/Validate/additional/mustBeAfter.d.ts +14 -0
  188. package/dist/utils/Validate/additional/mustBeBefore.d.ts +14 -0
  189. package/dist/utils/Validate/additional/mustBeEarlierDateTime.d.ts +15 -0
  190. package/dist/utils/Validate/additional/mustBeGreaterThan.d.ts +7 -0
  191. package/dist/utils/Validate/additional/mustBeInTheFuture.d.ts +8 -0
  192. package/dist/utils/Validate/additional/mustBeInThePast.d.ts +9 -0
  193. package/dist/utils/Validate/additional/mustBeLessThan.d.ts +7 -0
  194. package/dist/utils/Validate/additional/mustBeLongerThan.d.ts +9 -0
  195. package/dist/utils/Validate/additional/mustBeNumbersOnly.d.ts +9 -0
  196. package/dist/utils/Validate/additional/mustBeOneOf.d.ts +8 -0
  197. package/dist/utils/Validate/additional/mustBeShorterThan.d.ts +9 -0
  198. package/dist/utils/Validate/additional/mustBeUniqueInCollection.d.ts +10 -0
  199. package/dist/utils/Validate/additional/mustEnterAtLeastOne.d.ts +9 -0
  200. package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.d.ts +7 -0
  201. package/dist/utils/Validate/additional/mustNotContainSql.d.ts +2 -0
  202. package/dist/utils/Validate/additional/mustSelectOnlyOne.d.ts +8 -0
  203. package/dist/utils/Validate/additional/utils.d.ts +4 -0
  204. package/dist/utils/Validate/index.d.ts +42 -0
  205. package/dist/utils/Validate/validateCollection.d.ts +9 -0
  206. package/dist/utils/Validate/validateComponent.d.ts +16 -0
  207. package/dist/utils/Validate/validateContainer.d.ts +12 -0
  208. package/dist/utils/Validate/validateDate.d.ts +29 -0
  209. package/dist/utils/Validate/validateEmail.d.ts +13 -0
  210. package/dist/utils/Validate/validateMultifile.d.ts +3 -0
  211. package/dist/utils/Validate/validateOnPageLoad.d.ts +1 -0
  212. package/dist/utils/Validate/validatePage.d.ts +8 -0
  213. package/dist/utils/Validate/validateRegex.d.ts +13 -0
  214. package/dist/utils/Validate/validateRequired.d.ts +9 -0
  215. package/dist/utils/Validate/validateTextArea.d.ts +13 -0
  216. package/dist/utils/Validate/validateTime.d.ts +20 -0
  217. package/dist/utils/canOverrideFieldRequired.d.ts +9 -0
  218. package/dist/utils/index.d.ts +140 -0
  219. package/package.json +81 -170
  220. package/LICENCE.md +0 -21
  221. package/dist/components/CheckYourAnswers/Answer.js +0 -59
  222. package/dist/components/CheckYourAnswers/Answer.test.js +0 -142
  223. package/dist/components/CheckYourAnswers/CheckYourAnswers.js +0 -252
  224. package/dist/components/CheckYourAnswers/CheckYourAnswers.scss +0 -43
  225. package/dist/components/CheckYourAnswers/CheckYourAnswers.stories.mdx +0 -409
  226. package/dist/components/CheckYourAnswers/CheckYourAnswers.test.js +0 -603
  227. package/dist/components/CheckYourAnswers/index.js +0 -10
  228. package/dist/components/CollectionPage/CollectionPage.js +0 -178
  229. package/dist/components/CollectionPage/CollectionPage.test.js +0 -507
  230. package/dist/components/CollectionPage/index.js +0 -10
  231. package/dist/components/CollectionSummary/BannerStrip.js +0 -65
  232. package/dist/components/CollectionSummary/BannerStrip.scss +0 -60
  233. package/dist/components/CollectionSummary/BannerStrip.test.js +0 -167
  234. package/dist/components/CollectionSummary/CollectionSummary.js +0 -362
  235. package/dist/components/CollectionSummary/CollectionSummary.scss +0 -26
  236. package/dist/components/CollectionSummary/CollectionSummary.test.js +0 -368
  237. package/dist/components/CollectionSummary/Confirmation.js +0 -65
  238. package/dist/components/CollectionSummary/Confirmation.scss +0 -26
  239. package/dist/components/CollectionSummary/Confirmation.test.js +0 -109
  240. package/dist/components/CollectionSummary/RenderListView.js +0 -162
  241. package/dist/components/CollectionSummary/RenderListView.scss +0 -295
  242. package/dist/components/CollectionSummary/RenderListView.test.js +0 -303
  243. package/dist/components/CollectionSummary/SummaryCard.js +0 -277
  244. package/dist/components/CollectionSummary/SummaryCard.scss +0 -114
  245. package/dist/components/CollectionSummary/SummaryCard.test.js +0 -1442
  246. package/dist/components/CollectionSummary/SummaryCardButtons.js +0 -76
  247. package/dist/components/CollectionSummary/SummaryCardButtons.test.js +0 -87
  248. package/dist/components/CollectionSummary/SummaryCardDetails.js +0 -206
  249. package/dist/components/CollectionSummary/SummaryCardDetails.scss +0 -216
  250. package/dist/components/CollectionSummary/SummaryCardDetails.test.js +0 -654
  251. package/dist/components/CollectionSummary/SummaryCardValidationContext.js +0 -79
  252. package/dist/components/CollectionSummary/SummaryCardValidationContext.test.js +0 -104
  253. package/dist/components/CollectionSummary/index.js +0 -10
  254. package/dist/components/FormComponent/Collection.js +0 -234
  255. package/dist/components/FormComponent/Collection.scss +0 -24
  256. package/dist/components/FormComponent/Collection.test.js +0 -934
  257. package/dist/components/FormComponent/Container.js +0 -130
  258. package/dist/components/FormComponent/Container.scss +0 -15
  259. package/dist/components/FormComponent/Container.test.js +0 -456
  260. package/dist/components/FormComponent/FormComponent.js +0 -238
  261. package/dist/components/FormComponent/FormComponent.stories.mdx +0 -186
  262. package/dist/components/FormComponent/FormComponent.test.js +0 -436
  263. package/dist/components/FormComponent/helpers/addLabel.js +0 -25
  264. package/dist/components/FormComponent/helpers/getComponentDisabled.js +0 -15
  265. package/dist/components/FormComponent/helpers/getComponentDisabled.test.js +0 -27
  266. package/dist/components/FormComponent/helpers/getComponentError.js +0 -23
  267. package/dist/components/FormComponent/helpers/getComponentError.test.js +0 -51
  268. package/dist/components/FormComponent/helpers/getComponentFieldSet.js +0 -11
  269. package/dist/components/FormComponent/helpers/getComponentFieldSet.test.js +0 -30
  270. package/dist/components/FormComponent/helpers/index.js +0 -35
  271. package/dist/components/FormComponent/index.js +0 -10
  272. package/dist/components/FormPage/FormPage.js +0 -212
  273. package/dist/components/FormPage/FormPage.scss +0 -7
  274. package/dist/components/FormPage/FormPage.stories.mdx +0 -157
  275. package/dist/components/FormPage/FormPage.test.js +0 -454
  276. package/dist/components/FormPage/index.js +0 -10
  277. package/dist/components/FormRenderer/FormRenderer.js +0 -426
  278. package/dist/components/FormRenderer/FormRenderer.scss +0 -5
  279. package/dist/components/FormRenderer/FormRenderer.stories.mdx +0 -178
  280. package/dist/components/FormRenderer/FormRenderer.test.js +0 -799
  281. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/cop-reassign-task-to-rcc.json +0 -446
  282. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-containerised.json +0 -120
  283. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-dependent-component-nested-block.json +0 -113
  284. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-dependent-component-nested.json +0 -106
  285. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-refdata.json +0 -106
  286. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-target-component-nested.json +0 -99
  287. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens.json +0 -106
  288. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-show-whens-page-hidden.json +0 -113
  289. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-cop-airpax.json +0 -26408
  290. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-cop-mandec.json +0 -9405
  291. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-collection-component-dependent-on-external-data.json +0 -158
  292. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-collection-component.json +0 -86
  293. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-referring-to-collection.json +0 -173
  294. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-referring-to-hidden-collection.json +0 -202
  295. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-show-when-in-component-and-page.json +0 -63
  296. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-with-nested-questions-visible-elsewhere.json +0 -118
  297. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-with-nested-questions.json +0 -112
  298. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component.json +0 -58
  299. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-containerised-component.json +0 -97
  300. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-embedded-collection-component.json +0 -83
  301. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-embedded-component.json +0 -55
  302. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-entire-collection.json +0 -114
  303. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-multilevel-containerised-component-leaf-hidden.json +0 -106
  304. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-multilevel-containerised-component.json +0 -106
  305. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-options.json +0 -99
  306. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-collection.json +0 -128
  307. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-component-used-elsewhere.json +0 -109
  308. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-same-component-reused.json +0 -62
  309. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page.json +0 -96
  310. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-nested-answers-hidden-by-option-visible-elsewhere.json +0 -113
  311. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-nested-answers-hidden-by-option.json +0 -112
  312. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-nested-component.json +0 -26003
  313. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-nested-radio-component.json +0 -201
  314. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-same-component-reused-one-shown.json +0 -75
  315. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-variance-breach.json +0 -4272
  316. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-carrier.json +0 -407
  317. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-change-what-happened-before.json +0 -300
  318. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-remove-photos-before.json +0 -384
  319. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-business-interests-before.json +0 -140
  320. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-criminality-before.json +0 -186
  321. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-unspent-convictions-before.json +0 -143
  322. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-variance-breach-with-upload-files.json +0 -1264
  323. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-containerised.json +0 -11
  324. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-dependent-component-nested-block.json +0 -10
  325. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-dependent-component-nested.json +0 -9
  326. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-refdata.json +0 -11
  327. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-target-component-nested.json +0 -9
  328. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens.json +0 -9
  329. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-show-whens-page-hidden.json +0 -9
  330. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-collection-component-dependent-on-external-data.json +0 -26
  331. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-collection-component.json +0 -15
  332. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-referring-to-collection.json +0 -25
  333. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-referring-to-hidden-collection.json +0 -26
  334. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-show-when-in-component-and-page.json +0 -6
  335. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-with-nested-questions-visible-elsewhere.json +0 -12
  336. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-with-nested-questions.json +0 -12
  337. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component.json +0 -5
  338. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-containerised-component.json +0 -11
  339. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-embedded-collection-component.json +0 -15
  340. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-embedded-component.json +0 -5
  341. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-entire-collection.json +0 -20
  342. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-multilevel-containerised-component-leaf-hidden.json +0 -14
  343. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-multilevel-containerised-component.json +0 -14
  344. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-options.json +0 -10
  345. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-collection.json +0 -18
  346. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-component-used-elsewhere.json +0 -9
  347. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-same-component-reused.json +0 -6
  348. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page.json +0 -9
  349. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-nested-answers-hidden-by-option-visible-elsewhere.json +0 -12
  350. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-nested-answers-hidden-by-option.json +0 -12
  351. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-nested-component.json +0 -63
  352. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-nested-radio-component.json +0 -45
  353. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-same-component-reused-one-shown.json +0 -8
  354. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/reassign-to-rcc.json +0 -72
  355. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-airpax-change-what-happened-after.json +0 -280
  356. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-airpax-remove-photos-after.json +0 -355
  357. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-base-file.json +0 -80
  358. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-business-interests-after.json +0 -122
  359. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-criminality-after.json +0 -86
  360. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-unspent-convictions-after.json +0 -127
  361. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-containerised-removed.json +0 -11
  362. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-dependent-component-nested-block-removed.json +0 -7
  363. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-dependent-component-nested-removed.json +0 -7
  364. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-refdata-removed.json +0 -7
  365. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-removed.json +0 -7
  366. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-target-component-nested-removed.json +0 -6
  367. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-show-whens-page-hidden-removed.json +0 -6
  368. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-collection-component-dependent-on-external-data-removed.json +0 -23
  369. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-collection-component-removed.json +0 -4
  370. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-referring-to-collection-removed.json +0 -21
  371. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-referring-to-hidden-collection-removed.json +0 -6
  372. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-removed.json +0 -4
  373. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-show-when-in-component-and-page-removed.json +0 -5
  374. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-with-nested-questions-removed.json +0 -10
  375. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-with-nested-questions-visible-elsewhere-removed.json +0 -11
  376. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-containerised-component-removed.json +0 -10
  377. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-embedded-collection-component-removed.json +0 -4
  378. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-embedded-component-removed.json +0 -4
  379. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-entire-collection-removed.json +0 -3
  380. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-multilevel-containerised-component-leaf-hidden-removed.json +0 -13
  381. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-multilevel-containerised-component-removed.json +0 -10
  382. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-options-removed.json +0 -8
  383. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-collection-removed.json +0 -15
  384. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-component-used-elsewhere-removed.json +0 -5
  385. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-removed.json +0 -4
  386. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-same-component-reused-removed.json +0 -5
  387. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-nested-answers-hidden-by-option-removed.json +0 -11
  388. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-nested-answers-hidden-by-option-visible-elsewhere-removed.json +0 -12
  389. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-nested-component.json +0 -63
  390. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-nested-radio-component-removed.json +0 -45
  391. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-same-component-reused-one-shown-removed.json +0 -7
  392. package/dist/components/FormRenderer/handlers/cyaAction.js +0 -23
  393. package/dist/components/FormRenderer/handlers/getPageId.js +0 -15
  394. package/dist/components/FormRenderer/handlers/getPageId.test.js +0 -35
  395. package/dist/components/FormRenderer/handlers/handlers.test.js +0 -81
  396. package/dist/components/FormRenderer/handlers/index.js +0 -17
  397. package/dist/components/FormRenderer/handlers/navigate.js +0 -25
  398. package/dist/components/FormRenderer/handlers/submissionError.js +0 -18
  399. package/dist/components/FormRenderer/helpers/canActionProceed.js +0 -27
  400. package/dist/components/FormRenderer/helpers/canActionProceed.test.js +0 -84
  401. package/dist/components/FormRenderer/helpers/canCYASubmit.js +0 -17
  402. package/dist/components/FormRenderer/helpers/canCYASubmit.test.js +0 -75
  403. package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.js +0 -63
  404. package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.test.js +0 -191
  405. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.js +0 -338
  406. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.test.js +0 -434
  407. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.js +0 -399
  408. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.test.js +0 -559
  409. package/dist/components/FormRenderer/helpers/getCYA.js +0 -42
  410. package/dist/components/FormRenderer/helpers/getCYA.test.js +0 -46
  411. package/dist/components/FormRenderer/helpers/getFormState.js +0 -25
  412. package/dist/components/FormRenderer/helpers/getFormState.test.js +0 -60
  413. package/dist/components/FormRenderer/helpers/getNextPageId.js +0 -76
  414. package/dist/components/FormRenderer/helpers/getNextPageId.test.js +0 -292
  415. package/dist/components/FormRenderer/helpers/getPage.js +0 -27
  416. package/dist/components/FormRenderer/helpers/getPage.test.js +0 -45
  417. package/dist/components/FormRenderer/helpers/getRelevantPages.js +0 -27
  418. package/dist/components/FormRenderer/helpers/getRelevantPages.test.js +0 -70
  419. package/dist/components/FormRenderer/helpers/getSubmissionStatus.js +0 -65
  420. package/dist/components/FormRenderer/helpers/getSubmissionStatus.test.js +0 -309
  421. package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.js +0 -201
  422. package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.test.js +0 -473
  423. package/dist/components/FormRenderer/helpers/index.js +0 -33
  424. package/dist/components/FormRenderer/index.js +0 -10
  425. package/dist/components/FormRenderer/onCYAAction.js +0 -150
  426. package/dist/components/FormRenderer/onCYAAction.test.js +0 -741
  427. package/dist/components/FormRenderer/onPageAction.js +0 -227
  428. package/dist/components/FormRenderer/onPageAction.test.js +0 -960
  429. package/dist/components/FormRenderer/onTaskAction.js +0 -47
  430. package/dist/components/FormRenderer/onTaskAction.test.js +0 -247
  431. package/dist/components/PageActions/ActionButton.js +0 -48
  432. package/dist/components/PageActions/ActionButton.test.js +0 -73
  433. package/dist/components/PageActions/PageActions.js +0 -37
  434. package/dist/components/PageActions/PageActions.stories.mdx +0 -74
  435. package/dist/components/PageActions/PageActions.test.js +0 -106
  436. package/dist/components/PageActions/index.js +0 -10
  437. package/dist/components/SummaryList/GroupAction.js +0 -50
  438. package/dist/components/SummaryList/GroupAction.test.js +0 -86
  439. package/dist/components/SummaryList/RowAction.js +0 -48
  440. package/dist/components/SummaryList/RowAction.test.js +0 -86
  441. package/dist/components/SummaryList/SummaryList.js +0 -128
  442. package/dist/components/SummaryList/SummaryList.scss +0 -79
  443. package/dist/components/SummaryList/SummaryList.stories.mdx +0 -84
  444. package/dist/components/SummaryList/SummaryList.test.js +0 -504
  445. package/dist/components/SummaryList/SummaryListHeadingRow.js +0 -39
  446. package/dist/components/SummaryList/SummaryListHeadingRowWithAction.js +0 -65
  447. package/dist/components/SummaryList/SummaryListHeadingRowWithAction.scss +0 -38
  448. package/dist/components/SummaryList/SummaryListRow.js +0 -58
  449. package/dist/components/SummaryList/SummaryListTitleRow.js +0 -32
  450. package/dist/components/SummaryList/helpers/getGroupActionAttributes.js +0 -29
  451. package/dist/components/SummaryList/helpers/getGroupActionAttributes.test.js +0 -72
  452. package/dist/components/SummaryList/helpers/getRowActionAttributes.js +0 -29
  453. package/dist/components/SummaryList/helpers/getRowActionAttributes.test.js +0 -72
  454. package/dist/components/SummaryList/helpers/index.js +0 -14
  455. package/dist/components/SummaryList/index.js +0 -10
  456. package/dist/components/TaskList/Task.js +0 -62
  457. package/dist/components/TaskList/Task.test.js +0 -176
  458. package/dist/components/TaskList/TaskList.js +0 -175
  459. package/dist/components/TaskList/TaskList.scss +0 -123
  460. package/dist/components/TaskList/TaskList.stories.mdx +0 -164
  461. package/dist/components/TaskList/TaskList.test.js +0 -535
  462. package/dist/components/TaskList/TaskState.js +0 -37
  463. package/dist/components/TaskList/TaskState.test.js +0 -95
  464. package/dist/components/TaskList/index.js +0 -10
  465. package/dist/components/index.js +0 -56
  466. package/dist/context/HooksContext/HooksContext.js +0 -122
  467. package/dist/context/HooksContext/HooksContext.test.js +0 -45
  468. package/dist/context/HooksContext/index.js +0 -16
  469. package/dist/context/ValidationContext/ValidationContext.js +0 -98
  470. package/dist/context/ValidationContext/ValidationContext.test.js +0 -107
  471. package/dist/context/ValidationContext/index.js +0 -16
  472. package/dist/context/index.js +0 -21
  473. package/dist/hooks/index.js +0 -55
  474. package/dist/hooks/useAxios.js +0 -36
  475. package/dist/hooks/useGetRequest.js +0 -89
  476. package/dist/hooks/useHooks.js +0 -15
  477. package/dist/hooks/useRefData.js +0 -62
  478. package/dist/hooks/useValidation.js +0 -15
  479. package/dist/json/actions.json +0 -17
  480. package/dist/json/actionsNoSave.json +0 -17
  481. package/dist/json/addressDetails.json +0 -149
  482. package/dist/json/areYouACivilServant.json +0 -7
  483. package/dist/json/firstForm.json +0 -94
  484. package/dist/json/grade.json +0 -108
  485. package/dist/json/group.data.json +0 -21
  486. package/dist/json/group.json +0 -402
  487. package/dist/json/groupOfRow.json +0 -137
  488. package/dist/json/groupOfRowData.json +0 -15
  489. package/dist/json/port.json +0 -346
  490. package/dist/json/saveAndContinue.json +0 -98
  491. package/dist/json/sublocation.json +0 -859
  492. package/dist/json/taskList.json +0 -265
  493. package/dist/json/team.json +0 -17351
  494. package/dist/json/terminal.json +0 -81
  495. package/dist/json/userProfile.data.json +0 -21
  496. package/dist/json/userProfile.json +0 -276
  497. package/dist/models/CollectionLabels.js +0 -15
  498. package/dist/models/ComponentTypes.js +0 -58
  499. package/dist/models/EventTypes.js +0 -16
  500. package/dist/models/FormPages.js +0 -16
  501. package/dist/models/FormTypes.js +0 -24
  502. package/dist/models/HubFormats.js +0 -14
  503. package/dist/models/PageAction.js +0 -65
  504. package/dist/models/TaskStates.js +0 -46
  505. package/dist/models/index.js +0 -77
  506. package/dist/setupTests.js +0 -54
  507. package/dist/utils/CheckYourAnswers/getCYAAction.js +0 -44
  508. package/dist/utils/CheckYourAnswers/getCYAAction.test.js +0 -120
  509. package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.js +0 -57
  510. package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.test.js +0 -162
  511. package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.js +0 -66
  512. package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.test.js +0 -198
  513. package/dist/utils/CheckYourAnswers/getCYARow.js +0 -58
  514. package/dist/utils/CheckYourAnswers/getCYARow.test.js +0 -373
  515. package/dist/utils/CheckYourAnswers/getCYARowForGroup.js +0 -69
  516. package/dist/utils/CheckYourAnswers/getCYARowForGroup.test.js +0 -70
  517. package/dist/utils/CheckYourAnswers/getCYARowsForCollection.js +0 -71
  518. package/dist/utils/CheckYourAnswers/getCYARowsForCollection.test.js +0 -285
  519. package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.js +0 -237
  520. package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.test.js +0 -844
  521. package/dist/utils/CheckYourAnswers/getCYARowsForContainer.js +0 -45
  522. package/dist/utils/CheckYourAnswers/getCYARowsForContainer.test.js +0 -535
  523. package/dist/utils/CheckYourAnswers/getCYARowsForPage.js +0 -72
  524. package/dist/utils/CheckYourAnswers/getCYARowsForPage.test.js +0 -343
  525. package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.js +0 -42
  526. package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.test.js +0 -56
  527. package/dist/utils/CheckYourAnswers/index.js +0 -15
  528. package/dist/utils/CheckYourAnswers/showComponentCYA.js +0 -53
  529. package/dist/utils/CheckYourAnswers/showComponentCYA.test.js +0 -149
  530. package/dist/utils/CollectionPage/addCollectionPageEntry.js +0 -23
  531. package/dist/utils/CollectionPage/addCollectionPageEntry.test.js +0 -17
  532. package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.js +0 -26
  533. package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.test.js +0 -70
  534. package/dist/utils/CollectionPage/duplicateCollectionPageEntry.js +0 -51
  535. package/dist/utils/CollectionPage/duplicateCollectionPageEntry.test.js +0 -125
  536. package/dist/utils/CollectionPage/getCollectionPageActiveId.js +0 -24
  537. package/dist/utils/CollectionPage/getCollectionPageActiveId.test.js +0 -26
  538. package/dist/utils/CollectionPage/getCollectionPageActiveIndex.js +0 -44
  539. package/dist/utils/CollectionPage/getCollectionPageActiveIndex.test.js +0 -88
  540. package/dist/utils/CollectionPage/getCollectionPageData.js +0 -53
  541. package/dist/utils/CollectionPage/getCollectionPageData.test.js +0 -103
  542. package/dist/utils/CollectionPage/getErrorsForCollection.js +0 -55
  543. package/dist/utils/CollectionPage/getErrorsForCollection.test.js +0 -154
  544. package/dist/utils/CollectionPage/getQuickEditPage.js +0 -122
  545. package/dist/utils/CollectionPage/getQuickEditPage.test.js +0 -143
  546. package/dist/utils/CollectionPage/index.js +0 -33
  547. package/dist/utils/CollectionPage/mergeCollectionPages.js +0 -128
  548. package/dist/utils/CollectionPage/mergeCollectionPages.test.js +0 -198
  549. package/dist/utils/CollectionPage/removeCollectionPageEntry.js +0 -36
  550. package/dist/utils/CollectionPage/removeCollectionPageEntry.test.js +0 -62
  551. package/dist/utils/CollectionPage/setCollectionPageData.js +0 -60
  552. package/dist/utils/CollectionPage/setCollectionPageData.test.js +0 -182
  553. package/dist/utils/Component/addShowWhen.js +0 -43
  554. package/dist/utils/Component/addShowWhen.test.js +0 -217
  555. package/dist/utils/Component/applyToComponentTree.js +0 -68
  556. package/dist/utils/Component/applyToComponentTree.test.js +0 -125
  557. package/dist/utils/Component/cleanAttributes.js +0 -42
  558. package/dist/utils/Component/cleanAttributes.test.js +0 -67
  559. package/dist/utils/Component/elevateNestedComponents.js +0 -58
  560. package/dist/utils/Component/elevateNestedComponents.test.js +0 -305
  561. package/dist/utils/Component/getComponent.js +0 -305
  562. package/dist/utils/Component/getComponentTests/getComponent.autocomplete.test.js +0 -73
  563. package/dist/utils/Component/getComponentTests/getComponent.calculation.test.js +0 -251
  564. package/dist/utils/Component/getComponentTests/getComponent.checkboxes.test.js +0 -156
  565. package/dist/utils/Component/getComponentTests/getComponent.date.test.js +0 -104
  566. package/dist/utils/Component/getComponentTests/getComponent.details.test.js +0 -56
  567. package/dist/utils/Component/getComponentTests/getComponent.email.test.js +0 -60
  568. package/dist/utils/Component/getComponentTests/getComponent.file.test.js +0 -60
  569. package/dist/utils/Component/getComponentTests/getComponent.heading.test.js +0 -31
  570. package/dist/utils/Component/getComponentTests/getComponent.html.test.js +0 -42
  571. package/dist/utils/Component/getComponentTests/getComponent.insetText.test.js +0 -29
  572. package/dist/utils/Component/getComponentTests/getComponent.list.test.js +0 -47
  573. package/dist/utils/Component/getComponentTests/getComponent.multifile.test.js +0 -66
  574. package/dist/utils/Component/getComponentTests/getComponent.nested.test.js +0 -211
  575. package/dist/utils/Component/getComponentTests/getComponent.paragraph.test.js +0 -46
  576. package/dist/utils/Component/getComponentTests/getComponent.phoneNumber.test.js +0 -60
  577. package/dist/utils/Component/getComponentTests/getComponent.radios.test.js +0 -221
  578. package/dist/utils/Component/getComponentTests/getComponent.select.test.js +0 -62
  579. package/dist/utils/Component/getComponentTests/getComponent.text.test.js +0 -60
  580. package/dist/utils/Component/getComponentTests/getComponent.textArea.test.js +0 -104
  581. package/dist/utils/Component/getComponentTests/getComponent.time.test.js +0 -80
  582. package/dist/utils/Component/getComponentTests/getComponent.unknown.test.js +0 -14
  583. package/dist/utils/Component/getComponentTests/getComponent.warningText.test.js +0 -29
  584. package/dist/utils/Component/getDefaultValue.js +0 -22
  585. package/dist/utils/Component/getDefaultValue.test.js +0 -62
  586. package/dist/utils/Component/getDefaultValueFromConfig.js +0 -106
  587. package/dist/utils/Component/getDefaultValueFromConfig.test.js +0 -141
  588. package/dist/utils/Component/index.js +0 -29
  589. package/dist/utils/Component/isEditable.js +0 -13
  590. package/dist/utils/Component/isEditable.test.js +0 -42
  591. package/dist/utils/Component/optionIsSelected.js +0 -25
  592. package/dist/utils/Component/optionIsSelected.test.js +0 -69
  593. package/dist/utils/Component/setupContainerComponentsPath.js +0 -35
  594. package/dist/utils/Component/setupContainerComponentsPath.test.js +0 -79
  595. package/dist/utils/Component/showComponent.js +0 -25
  596. package/dist/utils/Component/showComponent.test.js +0 -157
  597. package/dist/utils/Component/wrapInFormGroup.js +0 -26
  598. package/dist/utils/Condition/index.js +0 -17
  599. package/dist/utils/Condition/meetsAllConditions.js +0 -44
  600. package/dist/utils/Condition/meetsAllConditions.test.js +0 -109
  601. package/dist/utils/Condition/meetsCondition.js +0 -165
  602. package/dist/utils/Condition/meetsCondition.test.js +0 -899
  603. package/dist/utils/Condition/meetsOneCondition.js +0 -32
  604. package/dist/utils/Condition/meetsOneCondition.test.js +0 -101
  605. package/dist/utils/Condition/setupConditions.js +0 -36
  606. package/dist/utils/Condition/setupConditions.test.js +0 -34
  607. package/dist/utils/Container/getEditableComponents.js +0 -29
  608. package/dist/utils/Container/getEditableComponents.test.js +0 -134
  609. package/dist/utils/Container/index.js +0 -17
  610. package/dist/utils/Container/setupNesting.js +0 -53
  611. package/dist/utils/Container/setupNesting.test.js +0 -143
  612. package/dist/utils/Container/showContainer.js +0 -52
  613. package/dist/utils/Container/showContainer.test.js +0 -179
  614. package/dist/utils/Data/applyFormula.js +0 -90
  615. package/dist/utils/Data/applyFormula.test.js +0 -264
  616. package/dist/utils/Data/deleteValues.js +0 -19
  617. package/dist/utils/Data/deleteValues.test.js +0 -58
  618. package/dist/utils/Data/getAutocompleteSource.js +0 -87
  619. package/dist/utils/Data/getAutocompleteSource.test.js +0 -335
  620. package/dist/utils/Data/getDataPath.js +0 -66
  621. package/dist/utils/Data/getDataPath.test.js +0 -49
  622. package/dist/utils/Data/getOptions.js +0 -86
  623. package/dist/utils/Data/getOptions.test.js +0 -279
  624. package/dist/utils/Data/getSourceData.js +0 -44
  625. package/dist/utils/Data/getSourceData.test.js +0 -158
  626. package/dist/utils/Data/index.js +0 -35
  627. package/dist/utils/Data/nestInRefdataOptions.js +0 -47
  628. package/dist/utils/Data/nestInRefdataOptions.test.js +0 -237
  629. package/dist/utils/Data/refDataToOptions.js +0 -44
  630. package/dist/utils/Data/refDataToOptions.test.js +0 -197
  631. package/dist/utils/Data/setDataItem.js +0 -26
  632. package/dist/utils/Data/setDataItem.test.js +0 -136
  633. package/dist/utils/Data/setupFormData.js +0 -49
  634. package/dist/utils/Data/setupFormData.test.js +0 -215
  635. package/dist/utils/Data/setupRefDataUrlForComponent.js +0 -44
  636. package/dist/utils/Data/setupRefDataUrlForComponent.test.js +0 -150
  637. package/dist/utils/FormPage/applyConditionalProperties.js +0 -34
  638. package/dist/utils/FormPage/applyConditionalProperties.test.js +0 -61
  639. package/dist/utils/FormPage/getConditionalText.js +0 -55
  640. package/dist/utils/FormPage/getConditionalText.test.js +0 -163
  641. package/dist/utils/FormPage/getFormPage.js +0 -54
  642. package/dist/utils/FormPage/getFormPage.test.js +0 -206
  643. package/dist/utils/FormPage/getFormPages.js +0 -30
  644. package/dist/utils/FormPage/getFormPages.test.js +0 -97
  645. package/dist/utils/FormPage/getPageActions.js +0 -58
  646. package/dist/utils/FormPage/getPageActions.test.js +0 -115
  647. package/dist/utils/FormPage/getParagraphFromText.js +0 -21
  648. package/dist/utils/FormPage/getParagraphFromText.test.js +0 -28
  649. package/dist/utils/FormPage/index.js +0 -24
  650. package/dist/utils/FormPage/showFormPage.js +0 -52
  651. package/dist/utils/FormPage/showFormPage.test.js +0 -181
  652. package/dist/utils/FormPage/showFormPageCYA.js +0 -23
  653. package/dist/utils/FormPage/showFormPageCYA.test.js +0 -29
  654. package/dist/utils/FormPage/useComponent.js +0 -83
  655. package/dist/utils/FormPage/useComponent.test.js +0 -216
  656. package/dist/utils/Format/formatData.js +0 -27
  657. package/dist/utils/Format/formatData.test.js +0 -46
  658. package/dist/utils/Format/formatDataForComponent.js +0 -35
  659. package/dist/utils/Format/formatDataForComponent.test.js +0 -114
  660. package/dist/utils/Format/formatDataForForm.js +0 -27
  661. package/dist/utils/Format/formatDataForForm.test.js +0 -79
  662. package/dist/utils/Format/formatDataForPage.js +0 -31
  663. package/dist/utils/Format/formatDataForPage.test.js +0 -94
  664. package/dist/utils/Format/index.js +0 -21
  665. package/dist/utils/Hub/getFormHub.js +0 -40
  666. package/dist/utils/Hub/getFormHub.test.js +0 -105
  667. package/dist/utils/Hub/index.js +0 -15
  668. package/dist/utils/Meta/constants.js +0 -9
  669. package/dist/utils/Meta/documents/getDocuments.js +0 -15
  670. package/dist/utils/Meta/documents/getDocuments.test.js +0 -46
  671. package/dist/utils/Meta/documents/index.js +0 -19
  672. package/dist/utils/Meta/documents/setDocumentsForField.js +0 -30
  673. package/dist/utils/Meta/documents/setDocumentsForField.test.js +0 -97
  674. package/dist/utils/Meta/index.js +0 -17
  675. package/dist/utils/Operate/checkValueIsTruthy.js +0 -29
  676. package/dist/utils/Operate/checkValueIsTruthy.test.js +0 -43
  677. package/dist/utils/Operate/deleteValueInFormData.js +0 -27
  678. package/dist/utils/Operate/deleteValueInFormData.test.js +0 -61
  679. package/dist/utils/Operate/doesContainValue.js +0 -35
  680. package/dist/utils/Operate/doesContainValue.test.js +0 -76
  681. package/dist/utils/Operate/getFirstOf.js +0 -31
  682. package/dist/utils/Operate/getFirstOf.test.js +0 -87
  683. package/dist/utils/Operate/getIndexOfMatchingValueIn.js +0 -68
  684. package/dist/utils/Operate/getIndexOfMatchingValueIn.test.js +0 -158
  685. package/dist/utils/Operate/getLength.js +0 -51
  686. package/dist/utils/Operate/getLength.test.js +0 -90
  687. package/dist/utils/Operate/index.js +0 -13
  688. package/dist/utils/Operate/persistValueInFormData.js +0 -40
  689. package/dist/utils/Operate/persistValueInFormData.test.js +0 -118
  690. package/dist/utils/Operate/runPageOperations.js +0 -75
  691. package/dist/utils/Operate/runPageOperations.test.js +0 -105
  692. package/dist/utils/Operate/setValueInFormData.js +0 -22
  693. package/dist/utils/Operate/setValueInFormData.test.js +0 -45
  694. package/dist/utils/Operate/shouldRun.js +0 -57
  695. package/dist/utils/Operate/shouldRun.test.js +0 -65
  696. package/dist/utils/Validate/additional/conditionallyPermittedChange.js +0 -26
  697. package/dist/utils/Validate/additional/conditionallyPermittedChange.test.js +0 -34
  698. package/dist/utils/Validate/additional/conditionallyRequired.js +0 -24
  699. package/dist/utils/Validate/additional/conditionallyRequired.test.js +0 -74
  700. package/dist/utils/Validate/additional/index.js +0 -74
  701. package/dist/utils/Validate/additional/index.test.js +0 -130
  702. package/dist/utils/Validate/additional/mustBeAfter.js +0 -34
  703. package/dist/utils/Validate/additional/mustBeAfter.test.js +0 -109
  704. package/dist/utils/Validate/additional/mustBeBefore.js +0 -34
  705. package/dist/utils/Validate/additional/mustBeBefore.test.js +0 -77
  706. package/dist/utils/Validate/additional/mustBeEarlierDateTime.js +0 -57
  707. package/dist/utils/Validate/additional/mustBeEarlierDateTime.test.js +0 -128
  708. package/dist/utils/Validate/additional/mustBeGreaterThan.js +0 -22
  709. package/dist/utils/Validate/additional/mustBeGreaterThan.test.js +0 -57
  710. package/dist/utils/Validate/additional/mustBeInTheFuture.js +0 -33
  711. package/dist/utils/Validate/additional/mustBeInTheFuture.test.js +0 -32
  712. package/dist/utils/Validate/additional/mustBeInThePast.js +0 -36
  713. package/dist/utils/Validate/additional/mustBeInThePast.test.js +0 -32
  714. package/dist/utils/Validate/additional/mustBeLessThan.js +0 -22
  715. package/dist/utils/Validate/additional/mustBeLessThan.test.js +0 -53
  716. package/dist/utils/Validate/additional/mustBeLongerThan.js +0 -23
  717. package/dist/utils/Validate/additional/mustBeLongerThan.test.js +0 -49
  718. package/dist/utils/Validate/additional/mustBeNumbersOnly.js +0 -24
  719. package/dist/utils/Validate/additional/mustBeNumbersOnly.test.js +0 -45
  720. package/dist/utils/Validate/additional/mustBeOneOf.js +0 -22
  721. package/dist/utils/Validate/additional/mustBeOneOf.test.js +0 -37
  722. package/dist/utils/Validate/additional/mustBeShorterThan.js +0 -23
  723. package/dist/utils/Validate/additional/mustBeShorterThan.test.js +0 -49
  724. package/dist/utils/Validate/additional/mustBeUniqueInCollection.js +0 -40
  725. package/dist/utils/Validate/additional/mustBeUniqueInCollection.test.js +0 -163
  726. package/dist/utils/Validate/additional/mustEnterAtLeastOne.js +0 -26
  727. package/dist/utils/Validate/additional/mustEnterAtLeastOne.test.js +0 -37
  728. package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.js +0 -19
  729. package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.test.js +0 -37
  730. package/dist/utils/Validate/additional/mustNotContainSql.js +0 -19
  731. package/dist/utils/Validate/additional/mustNotContainSql.test.js +0 -33
  732. package/dist/utils/Validate/additional/mustSelectOnlyOne.js +0 -29
  733. package/dist/utils/Validate/additional/mustSelectOnlyOne.test.js +0 -55
  734. package/dist/utils/Validate/additional/utils.js +0 -35
  735. package/dist/utils/Validate/index.js +0 -33
  736. package/dist/utils/Validate/validateCollection.js +0 -50
  737. package/dist/utils/Validate/validateCollection.test.js +0 -134
  738. package/dist/utils/Validate/validateComponent.js +0 -126
  739. package/dist/utils/Validate/validateComponent.test.js +0 -435
  740. package/dist/utils/Validate/validateContainer.js +0 -52
  741. package/dist/utils/Validate/validateContainer.test.js +0 -115
  742. package/dist/utils/Validate/validateDate.js +0 -112
  743. package/dist/utils/Validate/validateDate.test.js +0 -133
  744. package/dist/utils/Validate/validateEmail.js +0 -45
  745. package/dist/utils/Validate/validateEmail.test.js +0 -78
  746. package/dist/utils/Validate/validateMultifile.js +0 -29
  747. package/dist/utils/Validate/validateMultifile.test.js +0 -46
  748. package/dist/utils/Validate/validateOnPageLoad.js +0 -24
  749. package/dist/utils/Validate/validateOnPageLoad.test.js +0 -89
  750. package/dist/utils/Validate/validatePage.js +0 -56
  751. package/dist/utils/Validate/validatePage.test.js +0 -795
  752. package/dist/utils/Validate/validateRegex.js +0 -41
  753. package/dist/utils/Validate/validateRegex.test.js +0 -43
  754. package/dist/utils/Validate/validateRequired.js +0 -37
  755. package/dist/utils/Validate/validateRequired.test.js +0 -64
  756. package/dist/utils/Validate/validateTextArea.js +0 -36
  757. package/dist/utils/Validate/validateTextArea.test.js +0 -71
  758. package/dist/utils/Validate/validateTime.js +0 -76
  759. package/dist/utils/Validate/validateTime.test.js +0 -116
  760. package/dist/utils/canOverrideFieldRequired.js +0 -23
  761. package/dist/utils/index.js +0 -42
@@ -1,1442 +0,0 @@
1
- "use strict";
2
-
3
- var _react = require("@testing-library/react");
4
- require("@testing-library/jest-dom/extend-expect");
5
- var _react2 = _interopRequireDefault(require("react"));
6
- var _copReactComponents = require("@ukhomeoffice/cop-react-components");
7
- var _testUtils = require("react-dom/test-utils");
8
- var _setupTests = require("../../setupTests");
9
- var _SummaryCard = _interopRequireWildcard(require("./SummaryCard"));
10
- var _BannerStrip = require("./BannerStrip");
11
- var _SummaryCardValidationContext = _interopRequireDefault(require("./SummaryCardValidationContext"));
12
- var _jsxRuntime = require("react/jsx-runtime");
13
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
14
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
16
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
17
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
18
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
19
- function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // Global imports.
20
- // Local imports.
21
- describe('components.CollectionSummary.SummaryCard', () => {
22
- const classes = _copReactComponents.Utils.classBuilder(_SummaryCard.DEFAULT_CLASS, [], '');
23
- const ID = 'summaryCardId';
24
- const ENTRY = {
25
- id: '001',
26
- bannerText: 'A banner',
27
- titleText: 'A title',
28
- detailsText: 'Some details',
29
- index: 0,
30
- summaryText: 'Full details'
31
- };
32
- const checkSetup = container => {
33
- const cardDiv = container.children[0];
34
- expect(cardDiv.tagName).toEqual('DIV');
35
- expect(cardDiv.classList).toContain(_SummaryCard.DEFAULT_CLASS);
36
- const headerDiv = cardDiv.children[0];
37
- expect(headerDiv.tagName).toEqual('DIV');
38
- expect(headerDiv.classList).toContain(classes('header'));
39
- const headerContentDiv = headerDiv.children[0];
40
- expect(headerContentDiv.tagName).toEqual('DIV');
41
- expect(headerContentDiv.classList).toContain(classes('header-content'));
42
- const headerActionDiv = headerDiv.children[1];
43
- expect(headerActionDiv.tagName).toEqual('DIV');
44
- expect(headerActionDiv.className).toContain(classes('header-actions'));
45
- const bodyDiv = cardDiv.children[1];
46
- expect(bodyDiv.tagName).toEqual('DIV');
47
- expect(bodyDiv.classList).toContain(classes('body'));
48
- return {
49
- cardDiv,
50
- headerDiv,
51
- headerContentDiv,
52
- headerActionDiv,
53
- bodyDiv
54
- };
55
- };
56
- it('should correctly render a SummaryCard component', () => {
57
- const CONFIG = {
58
- banners: ['Alpha', 'Bravo'],
59
- title: 'Title text',
60
- details: 'Detail text'
61
- };
62
- const {
63
- container
64
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
65
- id: ID,
66
- entryData: ENTRY,
67
- config: CONFIG,
68
- parentCollectionName: "parent",
69
- formData: {},
70
- masterPage: {
71
- childPages: []
72
- }
73
- }));
74
- const {
75
- headerContentDiv
76
- } = checkSetup(container);
77
- expect(headerContentDiv.children.length).toEqual(3);
78
- const headerBanners = headerContentDiv.children[0];
79
- expect(headerBanners.tagName).toEqual('DIV');
80
- expect(headerBanners.classList).toContain(_BannerStrip.DEFAULT_CLASS);
81
- const headerTitle = headerContentDiv.children[1];
82
- expect(headerTitle.tagName).toEqual('H2');
83
- expect(headerTitle.classList).toContain(classes('header-content-title'));
84
- expect(headerTitle.textContent).toEqual(CONFIG.title);
85
- const headerDetails = headerContentDiv.children[2];
86
- expect(headerDetails.tagName).toEqual('DIV');
87
- expect(headerDetails.classList).toContain(classes('header-content-detail'));
88
- expect(headerDetails.textContent).toEqual(CONFIG.details);
89
- });
90
- it('should not render a banner if none are supplied', () => {
91
- const CONFIG = {
92
- title: 'Title text',
93
- details: 'Detail text'
94
- };
95
- const {
96
- container
97
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
98
- id: ID,
99
- entryData: ENTRY,
100
- config: CONFIG,
101
- parentCollectionName: "parent",
102
- formData: {},
103
- masterPage: {
104
- childPages: []
105
- }
106
- }));
107
- const {
108
- headerContentDiv
109
- } = checkSetup(container);
110
- expect(headerContentDiv.children.length).toEqual(2);
111
-
112
- // The only two children of the content div should be the title
113
- // and the details.
114
-
115
- const headerTitle = headerContentDiv.children[0];
116
- expect(headerTitle.tagName).toEqual('H2');
117
- expect(headerTitle.classList).toContain(classes('header-content-title'));
118
- expect(headerTitle.textContent).toEqual(CONFIG.title);
119
- const headerDetails = headerContentDiv.children[1];
120
- expect(headerDetails.tagName).toEqual('DIV');
121
- expect(headerDetails.classList).toContain(classes('header-content-detail'));
122
- expect(headerDetails.textContent).toEqual(CONFIG.details);
123
- });
124
- it('should not render details if none are supplied', () => {
125
- const CONFIG = {
126
- banners: ['Alpha', 'Bravo'],
127
- title: 'Title text'
128
- };
129
- const {
130
- container
131
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
132
- id: ID,
133
- entryData: ENTRY,
134
- config: CONFIG,
135
- parentCollectionName: "parent",
136
- formData: {},
137
- masterPage: {
138
- childPages: []
139
- }
140
- }));
141
- const {
142
- headerContentDiv
143
- } = checkSetup(container);
144
- expect(headerContentDiv.children.length).toEqual(2);
145
- const headerBanners = headerContentDiv.children[0];
146
- expect(headerBanners.tagName).toEqual('DIV');
147
- expect(headerBanners.classList).toContain(_BannerStrip.DEFAULT_CLASS);
148
-
149
- // The only two children of the content div should be the banner and
150
- // the title.
151
-
152
- const headerTitle = headerContentDiv.children[1];
153
- expect(headerTitle.tagName).toEqual('H2');
154
- expect(headerTitle.classList).toContain(classes('header-content-title'));
155
- expect(headerTitle.textContent).toEqual(CONFIG.title);
156
- });
157
- it('should correctly interpolate the title', () => {
158
- const CONFIG = {
159
- // eslint-disable-next-line no-template-curly-in-string
160
- title: '${titleText} that is interpolated'
161
- };
162
- const {
163
- container
164
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
165
- id: ID,
166
- entryData: ENTRY,
167
- config: CONFIG,
168
- parentCollectionName: "parent",
169
- formData: {},
170
- masterPage: {
171
- childPages: []
172
- }
173
- }));
174
- const {
175
- headerContentDiv
176
- } = checkSetup(container);
177
- const headerTitle = headerContentDiv.children[0];
178
- expect(headerTitle.tagName).toEqual('H2');
179
- expect(headerTitle.classList).toContain(classes('header-content-title'));
180
- expect(headerTitle.textContent).toEqual("".concat(ENTRY.titleText, " that is interpolated"));
181
- });
182
- it('should show the correct conditional title', () => {
183
- const CONFIG = {
184
- title: [{
185
- title: 'Title A',
186
- show_when: {
187
- field: 'testField',
188
- op: '=',
189
- value: '123'
190
- }
191
- }, {
192
- // eslint-disable-next-line no-template-curly-in-string
193
- title: '${titleText} that is interpolated',
194
- show_when: {
195
- field: 'testField',
196
- op: '=',
197
- value: '456'
198
- }
199
- }]
200
- };
201
- const CUSTOM_ENTRY = _objectSpread(_objectSpread({}, ENTRY), {}, {
202
- testField: '456'
203
- });
204
- const {
205
- container
206
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
207
- id: ID,
208
- entryData: CUSTOM_ENTRY,
209
- config: CONFIG,
210
- parentCollectionName: "parent",
211
- formData: {},
212
- masterPage: {
213
- childPages: []
214
- }
215
- }));
216
- const {
217
- headerContentDiv
218
- } = checkSetup(container);
219
- const headerTitle = headerContentDiv.children[0];
220
- expect(headerTitle.tagName).toEqual('H2');
221
- expect(headerTitle.classList).toContain(classes('header-content-title'));
222
- expect(headerTitle.textContent).toEqual("".concat(ENTRY.titleText, " that is interpolated"));
223
- });
224
- it('should correctly interpolate the details', () => {
225
- const CONFIG = {
226
- title: 'Title',
227
- // eslint-disable-next-line no-template-curly-in-string
228
- details: '${detailsText} that are interpolated'
229
- };
230
- const {
231
- container
232
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
233
- id: ID,
234
- entryData: ENTRY,
235
- config: CONFIG,
236
- parentCollectionName: "parent",
237
- formData: {},
238
- masterPage: {
239
- childPages: []
240
- }
241
- }));
242
- const {
243
- headerContentDiv
244
- } = checkSetup(container);
245
- const headerDetails = headerContentDiv.children[1];
246
- expect(headerDetails.tagName).toEqual('DIV');
247
- expect(headerDetails.classList).toContain(classes('header-content-detail'));
248
- expect(headerDetails.textContent).toEqual("".concat(ENTRY.detailsText, " that are interpolated"));
249
- });
250
- describe('Change action button', () => {
251
- let onChangeArgs = [];
252
- let onChangeCalls = 0;
253
- const ON_CHANGE = (page, id) => {
254
- onChangeArgs.push({
255
- page,
256
- id
257
- });
258
- onChangeCalls += 1;
259
- };
260
- beforeEach(() => {
261
- onChangeArgs = [];
262
- onChangeCalls = 0;
263
- });
264
- it('should render correctly', () => {
265
- const CONFIG = {
266
- changeAction: {
267
- label: 'Change label',
268
- page: 'testPage',
269
- aria_label: [{
270
- text: 'testText'
271
- }]
272
- }
273
- };
274
- const {
275
- container
276
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
277
- id: ID,
278
- entryData: ENTRY,
279
- config: CONFIG,
280
- onFullEdit: ON_CHANGE,
281
- parentCollectionName: "parent",
282
- formData: {},
283
- masterPage: {
284
- childPages: []
285
- }
286
- }));
287
- const {
288
- headerActionDiv
289
- } = checkSetup(container);
290
- expect(headerActionDiv.children.length).toEqual(1);
291
- const changeButton = headerActionDiv.children[0];
292
- expect(changeButton.name).toEqual('Change');
293
- expect(changeButton.tagName).toEqual('BUTTON');
294
- expect(changeButton.textContent).toEqual(CONFIG.changeAction.label);
295
- expect(changeButton.getAttribute('aria-label')).toEqual(CONFIG.changeAction.aria_label[0].text);
296
- _react.fireEvent.click(changeButton, {});
297
- expect(onChangeCalls).toEqual(1);
298
- expect(onChangeArgs[0]).toMatchObject({
299
- page: CONFIG.changeAction.page,
300
- id: ENTRY.id
301
- });
302
- });
303
- it('should use the default label when one is not provided', () => {
304
- const CONFIG = {
305
- changeAction: {
306
- page: 'testPage'
307
- }
308
- };
309
- const {
310
- container
311
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
312
- id: ID,
313
- entryData: ENTRY,
314
- config: CONFIG,
315
- onFullEdit: ON_CHANGE,
316
- parentCollectionName: "parent",
317
- formData: {},
318
- masterPage: {
319
- childPages: []
320
- }
321
- }));
322
- const {
323
- headerActionDiv
324
- } = checkSetup(container);
325
- expect(headerActionDiv.children.length).toEqual(1);
326
- const changeButton = headerActionDiv.children[0];
327
- expect(changeButton.tagName).toEqual('BUTTON');
328
- expect(changeButton.textContent).toEqual(_SummaryCard.DEFAULT_CHANGE_BUTTON_LABEL);
329
- });
330
- it('should not render when no config is provided for it', () => {
331
- const {
332
- container
333
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
334
- id: ID,
335
- entryData: ENTRY,
336
- config: {},
337
- onChange: ON_CHANGE,
338
- parentCollectionName: "parent",
339
- formData: {},
340
- masterPage: {
341
- childPages: []
342
- }
343
- }));
344
- const {
345
- headerActionDiv
346
- } = checkSetup(container);
347
- expect(headerActionDiv.children.length).toEqual(0);
348
- });
349
- it('should not render when onChange is not supplied', () => {
350
- const CONFIG = {
351
- changeAction: {
352
- label: 'Change label',
353
- page: 'testPage'
354
- }
355
- };
356
- const {
357
- container
358
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
359
- id: ID,
360
- entryData: ENTRY,
361
- config: CONFIG,
362
- parentCollectionName: "parent",
363
- formData: {},
364
- masterPage: {
365
- childPages: []
366
- }
367
- }));
368
- const {
369
- headerActionDiv
370
- } = checkSetup(container);
371
- expect(headerActionDiv.children.length).toEqual(0);
372
- });
373
- });
374
- describe('Delete action button', () => {
375
- let onDeleteArgs = [];
376
- let onDeleteCalls = 0;
377
- const ON_DELETE = entry => {
378
- onDeleteArgs.push(entry);
379
- onDeleteCalls += 1;
380
- };
381
- beforeEach(() => {
382
- onDeleteArgs = [];
383
- onDeleteCalls = 0;
384
- });
385
- it('should render correctly', () => {
386
- const CONFIG = {
387
- deleteAction: {
388
- label: 'Delete label',
389
- aria_label: [{
390
- text: 'testText'
391
- }]
392
- }
393
- };
394
- const {
395
- container
396
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
397
- id: ID,
398
- entryData: ENTRY,
399
- config: CONFIG,
400
- onDelete: ON_DELETE,
401
- parentCollectionName: "parent",
402
- formData: {},
403
- masterPage: {
404
- childPages: []
405
- }
406
- }));
407
- const {
408
- headerActionDiv
409
- } = checkSetup(container);
410
- expect(headerActionDiv.children.length).toEqual(1);
411
- const deleteButton = headerActionDiv.children[0];
412
- expect(deleteButton.name).toEqual('Delete');
413
- expect(deleteButton.tagName).toEqual('BUTTON');
414
- expect(deleteButton.textContent).toEqual(CONFIG.deleteAction.label);
415
- expect(deleteButton.getAttribute('aria-label')).toEqual(CONFIG.deleteAction.aria_label[0].text);
416
- _react.fireEvent.click(deleteButton, {});
417
- expect(onDeleteCalls).toEqual(1);
418
- expect(onDeleteArgs[0]).toMatchObject(ENTRY);
419
- });
420
- it('should use the default label when one is not provided', () => {
421
- const CONFIG = {
422
- deleteAction: {}
423
- };
424
- const {
425
- container
426
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
427
- id: ID,
428
- entryData: ENTRY,
429
- config: CONFIG,
430
- onDelete: ON_DELETE,
431
- parentCollectionName: "parent",
432
- formData: {},
433
- masterPage: {
434
- childPages: []
435
- }
436
- }));
437
- const {
438
- headerActionDiv
439
- } = checkSetup(container);
440
- expect(headerActionDiv.children.length).toEqual(1);
441
- const deleteButton = headerActionDiv.children[0];
442
- expect(deleteButton.tagName).toEqual('BUTTON');
443
- expect(deleteButton.textContent).toEqual(_SummaryCard.DEFAULT_DELETE_BUTTON_LABEL);
444
- });
445
- it('should not render when no config is provided for it', () => {
446
- const {
447
- container
448
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
449
- id: ID,
450
- entryData: ENTRY,
451
- config: {},
452
- onDelete: ON_DELETE,
453
- parentCollectionName: "parent",
454
- formData: {},
455
- masterPage: {
456
- childPages: []
457
- }
458
- }));
459
- const {
460
- headerActionDiv
461
- } = checkSetup(container);
462
- expect(headerActionDiv.children.length).toEqual(0);
463
- });
464
- it('should not render when onDelete is not supplied', () => {
465
- const CONFIG = {
466
- deleteAction: {
467
- label: 'Delete label'
468
- }
469
- };
470
- const {
471
- container
472
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
473
- id: ID,
474
- entryData: ENTRY,
475
- config: CONFIG,
476
- parentCollectionName: "parent",
477
- formData: {},
478
- masterPage: {
479
- childPages: []
480
- }
481
- }));
482
- const {
483
- headerActionDiv
484
- } = checkSetup(container);
485
- expect(headerActionDiv.children.length).toEqual(0);
486
- });
487
- it('should correctly render the Details section with entry data', () => {
488
- const CONFIG = {
489
- deleteAction: {
490
- label: 'Delete label'
491
- }
492
- };
493
- const {
494
- container
495
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
496
- id: ID,
497
- entryData: ENTRY,
498
- config: CONFIG,
499
- parentCollectionName: "parent",
500
- formData: {},
501
- masterPage: {
502
- childPages: []
503
- }
504
- }));
505
- const detailsSection = container.querySelector('.details');
506
- expect(detailsSection).not.toBeNull();
507
- expect(detailsSection.textContent).toContain(ENTRY.summaryText);
508
- });
509
- });
510
- describe('Duplicate action button', () => {
511
- let onDuplicateArgs = [];
512
- let onDuplicateCalls = 0;
513
- const ON_DUPLICATE = entry => {
514
- onDuplicateArgs.push(entry);
515
- onDuplicateCalls += 1;
516
- };
517
- beforeEach(() => {
518
- onDuplicateArgs = [];
519
- onDuplicateCalls = 0;
520
- });
521
- it('should render correctly', () => {
522
- const CONFIG = {
523
- duplicateAction: {
524
- label: 'Duplicate label'
525
- }
526
- };
527
- const {
528
- container
529
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
530
- id: ID,
531
- entryData: ENTRY,
532
- config: CONFIG,
533
- onDuplicate: ON_DUPLICATE,
534
- parentCollectionName: "parent",
535
- formData: {},
536
- masterPage: {
537
- childPages: []
538
- }
539
- }));
540
- const {
541
- headerActionDiv
542
- } = checkSetup(container);
543
- expect(headerActionDiv.children.length).toEqual(1);
544
- const duplicateButton = headerActionDiv.children[0];
545
- expect(duplicateButton.name).toEqual('Duplicate');
546
- expect(duplicateButton.tagName).toEqual('BUTTON');
547
- expect(duplicateButton.textContent).toEqual(CONFIG.duplicateAction.label);
548
- _react.fireEvent.click(duplicateButton, {});
549
- expect(onDuplicateCalls).toEqual(1);
550
- expect(onDuplicateArgs[0]).toMatchObject(ENTRY);
551
- });
552
- it('should use the default label when one is not provided', () => {
553
- const CONFIG = {
554
- duplicateAction: {}
555
- };
556
- const {
557
- container
558
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
559
- id: ID,
560
- entryData: ENTRY,
561
- config: CONFIG,
562
- onDuplicate: ON_DUPLICATE,
563
- parentCollectionName: "parent",
564
- formData: {},
565
- masterPage: {
566
- childPages: []
567
- }
568
- }));
569
- const {
570
- headerActionDiv
571
- } = checkSetup(container);
572
- expect(headerActionDiv.children.length).toEqual(1);
573
- const duplicateButton = headerActionDiv.children[0];
574
- expect(duplicateButton.tagName).toEqual('BUTTON');
575
- expect(duplicateButton.textContent).toEqual(_SummaryCard.DEFAULT_DUPLICATE_BUTTON_LABEL);
576
- });
577
- it('should not render when no config is provided for it', () => {
578
- const {
579
- container
580
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
581
- id: ID,
582
- entryData: ENTRY,
583
- config: {},
584
- onDuplicate: ON_DUPLICATE,
585
- parentCollectionName: "parent",
586
- formData: {},
587
- masterPage: {
588
- childPages: []
589
- }
590
- }));
591
- const {
592
- headerActionDiv
593
- } = checkSetup(container);
594
- expect(headerActionDiv.children.length).toEqual(0);
595
- });
596
- it('should not render when onDuplicate is not supplied', () => {
597
- const CONFIG = {
598
- duplicateAction: {
599
- label: 'Duplicate label'
600
- }
601
- };
602
- const {
603
- container
604
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
605
- id: ID,
606
- entryData: ENTRY,
607
- config: CONFIG,
608
- parentCollectionName: "parent",
609
- formData: {},
610
- masterPage: {
611
- childPages: []
612
- }
613
- }));
614
- const {
615
- headerActionDiv
616
- } = checkSetup(container);
617
- expect(headerActionDiv.children.length).toEqual(0);
618
- });
619
- it('should focus on the most recently duplicated item', () => {
620
- const entryData = {
621
- id: ID,
622
- isDuplicate: true
623
- };
624
- const config = {
625
- duplicateAction: {
626
- label: 'Duplicate Label',
627
- aria_label: 'Duplicate Aria Label'
628
- }
629
- };
630
- const onDuplicate = jest.fn();
631
- const {
632
- getByTestId
633
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
634
- id: ID,
635
- entryData: entryData,
636
- config: config,
637
- onDuplicate: onDuplicate,
638
- parentCollectionName: "parent",
639
- pages: [],
640
- formData: {},
641
- hideDetails: true,
642
- masterPage: {
643
- childPages: []
644
- }
645
- }));
646
- const updatedConfig = {
647
- focusOn: true,
648
- quickEdit: true
649
- };
650
-
651
- // Rerender the component with updated config
652
- const {
653
- getByTestId: getByTestIdRerender
654
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
655
- id: ID,
656
- entryData: entryData,
657
- config: updatedConfig,
658
- parentCollectionName: "parent",
659
- pages: [],
660
- formData: {},
661
- hideDetails: true,
662
- masterPage: {
663
- childPages: []
664
- }
665
- }));
666
-
667
- // check that focus isn't on the initial component
668
- const initialComponent = getByTestId('duplicate-button');
669
- expect(initialComponent).toBeInTheDocument();
670
- expect(initialComponent).not.toHaveFocus();
671
-
672
- // check that the focus is on the newly duplicated component
673
- const DuplicatedComponent = getByTestIdRerender('quickedit-button');
674
- expect(DuplicatedComponent).toBeInTheDocument();
675
- expect(DuplicatedComponent).toHaveFocus();
676
- });
677
- });
678
- describe('Quick Edit action button', () => {
679
- const CONFIG = {
680
- quickEdit: {}
681
- };
682
- const PAGES = [{
683
- id: 'parentPage',
684
- name: 'parentPage',
685
- components: [{
686
- id: 'testText',
687
- type: 'text',
688
- label: 'Test text',
689
- fieldId: 'testText',
690
- required: true,
691
- use: 'testText',
692
- cya_label: 'Test text',
693
- full_path: 'testText'
694
- }],
695
- summaryQuickEdit: ["testText"],
696
- formData: {
697
- parents: [{
698
- id: '1695037579150',
699
- testText: 'tester',
700
- testText2: 'test test',
701
- index: 0
702
- }]
703
- }
704
- }];
705
- it('should render correctly', () => {
706
- const {
707
- container
708
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
709
- id: ID,
710
- entryData: ENTRY,
711
- config: CONFIG,
712
- parentCollectionName: "parent",
713
- formData: {},
714
- masterPage: {
715
- childPages: PAGES
716
- }
717
- }));
718
- const {
719
- headerActionDiv
720
- } = checkSetup(container);
721
- expect(headerActionDiv.children.length).toEqual(1);
722
-
723
- // Shows edit button but no quick edit
724
- const editButton = headerActionDiv.children[0];
725
- expect(editButton.name).toEqual('QuickEdit');
726
- expect(editButton.tagName).toEqual('BUTTON');
727
- expect(editButton.textContent).toEqual('Quick Edit');
728
- expect(container.childNodes[0].childNodes.length).toEqual(2); // Quick edit hidden
729
-
730
- // shows quickedit once clicked
731
- _react.fireEvent.click(editButton, {});
732
- expect(container.childNodes[0].childNodes.length).toEqual(3); // Quick edit shown
733
- const quickEdit = container.childNodes[0].childNodes[1];
734
- expect(quickEdit.textContent).toContain('Test text');
735
-
736
- // quick edit has proper buttons
737
- const quickEditButtons = quickEdit.childNodes[2];
738
- const saveButton = quickEditButtons.childNodes[0];
739
- const cancelButton = quickEditButtons.childNodes[1];
740
- expect(saveButton.textContent).toContain('Save');
741
- expect(cancelButton.textContent).toContain('Cancel');
742
-
743
- // hides quick edit again adfter clicking cancel
744
- _react.fireEvent.click(cancelButton, {});
745
- expect(container.childNodes[0].childNodes.length).toEqual(2); // Quick edit hidden
746
- });
747
- it('should not render when no config is provided for it', () => {
748
- const {
749
- container
750
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
751
- id: ID,
752
- entryData: ENTRY,
753
- config: {},
754
- parentCollectionName: "parent",
755
- formData: {},
756
- masterPage: {
757
- childPages: PAGES
758
- }
759
- }));
760
- const {
761
- headerActionDiv
762
- } = checkSetup(container);
763
- expect(headerActionDiv.children.length).toEqual(0);
764
- });
765
- });
766
- describe('Quick Edit errors', () => {
767
- const CUSTOM_ENTRY = {
768
- id: '123',
769
- testText: 'value'
770
- };
771
- const CONFIG = {
772
- quickEdit: {}
773
- };
774
- const PAGES = [{
775
- id: 'parentPage',
776
- name: 'parentPage',
777
- components: [{
778
- id: 'testText',
779
- type: 'text',
780
- label: 'Test text',
781
- fieldId: 'testText',
782
- required: true,
783
- use: 'testText',
784
- cya_label: 'Test text',
785
- full_path: 'testText',
786
- custom_errors: [{
787
- type: 'required',
788
- message: 'Custom error message'
789
- }]
790
- }],
791
- summaryQuickEdit: ["testText"],
792
- formData: {
793
- parents: [{
794
- id: '123',
795
- index: 0
796
- }]
797
- }
798
- }];
799
- it('should initally show errors passed in from top-level', () => {
800
- const TOP_LEVEL_ERRORS = [{
801
- id: 'testText',
802
- entryId: '123',
803
- error: 'top-level error message'
804
- }];
805
- const {
806
- container
807
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCardValidationContext.default, {
808
- entryId: CUSTOM_ENTRY.id,
809
- topLevelErrors: TOP_LEVEL_ERRORS,
810
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
811
- id: ID,
812
- entryData: CUSTOM_ENTRY,
813
- config: CONFIG,
814
- parentCollectionName: "parent",
815
- formData: {},
816
- masterPage: {
817
- childPages: PAGES
818
- }
819
- })
820
- }));
821
- const {
822
- headerActionDiv
823
- } = checkSetup(container);
824
- expect(headerActionDiv.children.length).toEqual(1);
825
-
826
- // Shows edit button but no quick edit
827
- const editButton = headerActionDiv.children[0];
828
- expect(editButton.tagName).toEqual('BUTTON');
829
- expect(editButton.textContent).toEqual('Quick Edit');
830
- expect(container.childNodes[0].childNodes.length).toEqual(2); // Quick edit hidden
831
-
832
- // shows quickedit once clicked
833
- _react.fireEvent.click(editButton, {});
834
- expect(container.childNodes[0].childNodes.length).toEqual(3); // Quick edit shown
835
- const quickEdit = container.childNodes[0].childNodes[1];
836
- expect(quickEdit.textContent).toContain('Test text');
837
-
838
- // quick edit is showing top-level error
839
- const errorSummary = quickEdit.childNodes[0];
840
- expect(errorSummary.textContent).toContain(TOP_LEVEL_ERRORS[0].error);
841
- });
842
- it('should only show errors from validation when it happens, ignoring top-level errors', async () => {
843
- const TOP_LEVEL_ERRORS = [{
844
- id: 'testText',
845
- entryId: '123',
846
- error: 'top-level error message'
847
- }];
848
- const {
849
- container
850
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCardValidationContext.default, {
851
- entryId: CUSTOM_ENTRY.id,
852
- topLevelErrors: TOP_LEVEL_ERRORS,
853
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
854
- id: ID,
855
- entryData: CUSTOM_ENTRY,
856
- config: CONFIG,
857
- parentCollectionName: "parent",
858
- formData: {},
859
- masterPage: {
860
- childPages: PAGES
861
- },
862
- onQuickEdit: () => {}
863
- })
864
- }));
865
- const {
866
- headerActionDiv
867
- } = checkSetup(container);
868
- expect(headerActionDiv.children.length).toEqual(1);
869
-
870
- // Shows edit button but no quick edit
871
- const editButton = headerActionDiv.children[0];
872
- expect(editButton.tagName).toEqual('BUTTON');
873
- expect(editButton.textContent).toEqual('Quick Edit');
874
- expect(container.childNodes[0].childNodes.length).toEqual(2); // Quick edit hidden
875
-
876
- // shows quickedit once clicked
877
- _react.fireEvent.click(editButton, {});
878
- expect(container.childNodes[0].childNodes.length).toEqual(3); // Quick edit shown
879
- const quickEdit = container.childNodes[0].childNodes[1];
880
- expect(quickEdit.textContent).toContain('Test text');
881
-
882
- // quick edit is initially showing top-level error
883
- const errorSummary = quickEdit.childNodes[0];
884
- expect(errorSummary.textContent).toContain(TOP_LEVEL_ERRORS[0].error);
885
-
886
- // remove value from required text component
887
- const component = quickEdit.childNodes[2];
888
- const componentInput = component.childNodes[3];
889
- await (0, _testUtils.act)(async () => {
890
- _react.fireEvent.change(componentInput, {
891
- target: {
892
- value: ''
893
- }
894
- });
895
- });
896
-
897
- // click 'save' to trigger validation, which will fail as the component
898
- // cleared above is marked as 'required'.
899
- const quickEditButtons = quickEdit.childNodes[3];
900
- const saveButton = quickEditButtons.childNodes[0];
901
- expect(saveButton.textContent).toContain('Save');
902
- await (0, _testUtils.act)(async () => {
903
- _react.fireEvent.click(saveButton, {});
904
- });
905
-
906
- // quick edit should now be showing the errors from validation
907
- expect(errorSummary.textContent).toContain('Custom error message');
908
- });
909
- });
910
- describe('Quick Edit save changes', () => {
911
- const CONFIG = {
912
- quickEdit: {}
913
- };
914
- const PAGES = [{
915
- id: 'parentPage',
916
- name: 'parentPage',
917
- components: [{
918
- id: 'testText',
919
- type: 'text',
920
- label: 'Test text',
921
- fieldId: 'testText',
922
- required: true,
923
- use: 'testText',
924
- cya_label: 'Test text',
925
- full_path: 'testText',
926
- "additionalValidation": [{
927
- "function": "mustBeLongerThan",
928
- "value": 3,
929
- message: 'error'
930
- }]
931
- }],
932
- summaryQuickEdit: ["testText"],
933
- formData: {
934
- parents: [{
935
- id: '1695037579150',
936
- testText: 'tester',
937
- testText2: 'test test',
938
- index: 0
939
- }]
940
- }
941
- }];
942
- it('should render correctly', () => {
943
- const {
944
- container
945
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
946
- id: ID,
947
- entryData: ENTRY,
948
- config: CONFIG,
949
- parentCollectionName: "parent",
950
- formData: {},
951
- masterPage: {
952
- childPages: PAGES
953
- }
954
- }));
955
- const {
956
- headerActionDiv
957
- } = checkSetup(container);
958
- expect(headerActionDiv.children.length).toEqual(1);
959
-
960
- // Shows edit button but no quick edit
961
- const editButton = headerActionDiv.children[0];
962
- expect(editButton.tagName).toEqual('BUTTON');
963
- expect(editButton.textContent).toEqual('Quick Edit');
964
- expect(container.childNodes[0].childNodes.length).toEqual(2); // Quick edit hidden
965
-
966
- // shows quickedit once clicked
967
- _react.fireEvent.click(editButton, {});
968
- expect(container.childNodes[0].childNodes.length).toEqual(3); // Quick edit shown
969
- const quickEdit = container.childNodes[0].childNodes[1];
970
- expect(quickEdit.textContent).toContain('Test text');
971
-
972
- // quick edit has proper buttons
973
- const quickEditButtons = quickEdit.childNodes[2];
974
- const saveButton = quickEditButtons.childNodes[0];
975
- const cancelButton = quickEditButtons.childNodes[1];
976
- expect(saveButton.textContent).toContain('Save');
977
- expect(cancelButton.textContent).toContain('Cancel');
978
-
979
- // hides quick edit again adfter clicking cancel
980
- _react.fireEvent.click(cancelButton, {});
981
- expect(container.childNodes[0].childNodes.length).toEqual(2); // Quick edit hidden
982
- });
983
- it('should not validate or save if nothing has changed', () => {
984
- const ON_SUBMIT_CALLS = [];
985
- const hooks = {
986
- onSubmit: (type, patch) => ON_SUBMIT_CALLS.push(patch)
987
- };
988
- const {
989
- container
990
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
991
- id: ID,
992
- entryData: ENTRY,
993
- config: CONFIG,
994
- parentCollectionName: "parents",
995
- formData: {},
996
- masterPage: {
997
- childPages: PAGES
998
- }
999
- }), {
1000
- hooks
1001
- });
1002
- const {
1003
- headerActionDiv
1004
- } = checkSetup(container);
1005
-
1006
- // Shows edit button but no quick edit
1007
- const editButton = headerActionDiv.children[0];
1008
-
1009
- // shows quickedit once clicked
1010
- _react.fireEvent.click(editButton, {});
1011
- const quickEdit = container.childNodes[0].childNodes[1];
1012
- const quickEditButtons = quickEdit.childNodes[2];
1013
- const saveButton = quickEditButtons.childNodes[0];
1014
- _react.fireEvent.click(saveButton, {});
1015
- expect(ON_SUBMIT_CALLS.length).toEqual(0);
1016
- });
1017
- it('should return after local validation if errors are present', async () => {
1018
- const ON_SUBMIT_CALLS = [];
1019
- const hooks = {
1020
- onSubmit: (type, patch) => ON_SUBMIT_CALLS.push(patch)
1021
- };
1022
- const ON_QUICK_EDIT_CALLS = [];
1023
- const ON_QUICK_EDIT = _ref => {
1024
- let {
1025
- target
1026
- } = _ref;
1027
- ON_QUICK_EDIT_CALLS.push(target);
1028
- };
1029
- const {
1030
- container
1031
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
1032
- id: ID,
1033
- entryData: _objectSpread(_objectSpread({}, ENTRY), {}, {
1034
- index: 0
1035
- }),
1036
- config: CONFIG,
1037
- parentCollectionName: "parents",
1038
- onQuickEdit: ON_QUICK_EDIT,
1039
- formData: {
1040
- parents: [{
1041
- testText: 'hello'
1042
- }]
1043
- },
1044
- masterPage: {
1045
- childPages: PAGES
1046
- }
1047
- }), {
1048
- hooks
1049
- });
1050
- const {
1051
- headerActionDiv
1052
- } = checkSetup(container);
1053
- const editButton = headerActionDiv.children[0];
1054
- _react.fireEvent.click(editButton, {});
1055
- const quickEdit = container.childNodes[0].childNodes[1];
1056
- const component = quickEdit.childNodes[1];
1057
- const componentInput = component.childNodes[2];
1058
- const quickEditButtons = quickEdit.childNodes[2];
1059
- const saveButton = quickEditButtons.childNodes[0];
1060
- // Field has validation to force the length of this field to be greater than 2 so this should fail
1061
- await (0, _testUtils.act)(async () => {
1062
- _react.fireEvent.change(componentInput, {
1063
- target: {
1064
- value: 'a'
1065
- }
1066
- });
1067
- });
1068
- await (0, _testUtils.act)(async () => {
1069
- _react.fireEvent.click(saveButton, {});
1070
- });
1071
- expect(ON_SUBMIT_CALLS.length).toEqual(0);
1072
- expect(ON_QUICK_EDIT_CALLS.length).toEqual(0);
1073
- });
1074
- it('should run hook validation when local validation is passed', async () => {
1075
- const ON_SUBMIT_CALLS = [];
1076
- const hooks = {
1077
- onSubmit: (type, patch, notRequired, onError) => {
1078
- ON_SUBMIT_CALLS.push(patch);
1079
- onError([{
1080
- error: 'message',
1081
- id: '0'
1082
- }]);
1083
- }
1084
- };
1085
- const ON_QUICK_EDIT_CALLS = [];
1086
- const ON_QUICK_EDIT = _ref2 => {
1087
- let {
1088
- target
1089
- } = _ref2;
1090
- ON_QUICK_EDIT_CALLS.push(target);
1091
- };
1092
- const {
1093
- container
1094
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
1095
- id: ID,
1096
- entryData: ENTRY,
1097
- config: CONFIG,
1098
- parentCollectionName: "parents",
1099
- onQuickEdit: ON_QUICK_EDIT,
1100
- formData: {
1101
- parents: [{
1102
- alreadyProvidedField: 'hello'
1103
- }]
1104
- },
1105
- masterPage: {
1106
- childPages: PAGES
1107
- }
1108
- }), {
1109
- hooks
1110
- });
1111
- const {
1112
- headerActionDiv
1113
- } = checkSetup(container);
1114
- const editButton = headerActionDiv.children[0];
1115
- _react.fireEvent.click(editButton, {});
1116
- const quickEdit = container.childNodes[0].childNodes[1];
1117
-
1118
- // Make a change
1119
- const component = quickEdit.childNodes[1];
1120
- const componentInput = component.childNodes[2];
1121
- _react.fireEvent.change(componentInput, {
1122
- target: {
1123
- value: 'new value'
1124
- }
1125
- });
1126
- const quickEditButtons = quickEdit.childNodes[2];
1127
- const saveButton = quickEditButtons.childNodes[0];
1128
- await (0, _testUtils.act)(async () => {
1129
- _react.fireEvent.click(saveButton, {});
1130
- });
1131
- expect(ON_SUBMIT_CALLS[0]).toMatchObject({
1132
- testText: 'new value'
1133
- });
1134
- expect(ON_QUICK_EDIT_CALLS.length).toEqual(0);
1135
- });
1136
- it('should apply changes if no errors are present', async () => {
1137
- const ON_SUBMIT_CALLS = [];
1138
- const hooks = {
1139
- onSubmit: (type, patch) => ON_SUBMIT_CALLS.push(patch)
1140
- };
1141
- const ON_QUICK_EDIT_CALLS = [];
1142
- const ON_QUICK_EDIT = _ref3 => {
1143
- let {
1144
- target
1145
- } = _ref3;
1146
- ON_QUICK_EDIT_CALLS.push(target);
1147
- };
1148
- const {
1149
- container
1150
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCardValidationContext.default, {
1151
- entryId: "id",
1152
- topLevelErrors: [],
1153
- clearTopLevelErrorsForCard: () => {},
1154
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
1155
- id: ID,
1156
- entryData: {
1157
- index: 0,
1158
- id: '0'
1159
- },
1160
- config: CONFIG,
1161
- parentCollectionName: "parents",
1162
- onQuickEdit: ON_QUICK_EDIT,
1163
- formData: {
1164
- parents: [{
1165
- alreadyProvidedField: 'hello'
1166
- }]
1167
- },
1168
- masterPage: {
1169
- childPages: PAGES
1170
- }
1171
- })
1172
- }), {
1173
- hooks
1174
- });
1175
- const {
1176
- headerActionDiv
1177
- } = checkSetup(container);
1178
- const editButton = headerActionDiv.children[0];
1179
- _react.fireEvent.click(editButton, {});
1180
- const quickEdit = container.childNodes[0].childNodes[1];
1181
-
1182
- // Make a change that will be accepted
1183
- const component = quickEdit.childNodes[1];
1184
- const componentInput = component.childNodes[2];
1185
- _react.fireEvent.change(componentInput, {
1186
- target: {
1187
- value: 'new value'
1188
- }
1189
- });
1190
- const quickEditButtons = quickEdit.childNodes[2];
1191
- const saveButton = quickEditButtons.childNodes[0];
1192
- await (0, _testUtils.act)(async () => {
1193
- _react.fireEvent.click(saveButton, {});
1194
- });
1195
- expect(ON_QUICK_EDIT_CALLS.length).toEqual(1);
1196
- expect(ON_QUICK_EDIT_CALLS[0].value[0]).toEqual({
1197
- alreadyProvidedField: 'hello',
1198
- testText: 'new value'
1199
- });
1200
- });
1201
- it('should remove the isDuplicate flag on a sucessful quick edit', async () => {
1202
- const ON_SUBMIT_CALLS = [];
1203
- const hooks = {
1204
- onSubmit: (type, patch) => ON_SUBMIT_CALLS.push(patch)
1205
- };
1206
- const ON_QUICK_EDIT_CALLS = [];
1207
- const ON_QUICK_EDIT = _ref4 => {
1208
- let {
1209
- target
1210
- } = _ref4;
1211
- ON_QUICK_EDIT_CALLS.push(target);
1212
- };
1213
- const {
1214
- container
1215
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCardValidationContext.default, {
1216
- entryId: "id",
1217
- topLevelErrors: [],
1218
- clearTopLevelErrorsForCard: () => {},
1219
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
1220
- id: ID,
1221
- entryData: {
1222
- index: 0,
1223
- id: '0',
1224
- isDuplicate: true
1225
- },
1226
- config: CONFIG,
1227
- parentCollectionName: "parents",
1228
- onQuickEdit: ON_QUICK_EDIT,
1229
- formData: {
1230
- parents: [{
1231
- alreadyProvidedField: 'hello'
1232
- }]
1233
- },
1234
- masterPage: {
1235
- childPages: PAGES
1236
- }
1237
- })
1238
- }), {
1239
- hooks
1240
- });
1241
- const {
1242
- headerActionDiv
1243
- } = checkSetup(container);
1244
- const editButton = headerActionDiv.children[0];
1245
- _react.fireEvent.click(editButton, {});
1246
- const quickEdit = container.childNodes[0].childNodes[1];
1247
-
1248
- // Make a change that will be accepted
1249
- const component = quickEdit.childNodes[1];
1250
- const componentInput = component.childNodes[2];
1251
- _react.fireEvent.change(componentInput, {
1252
- target: {
1253
- value: 'new value'
1254
- }
1255
- });
1256
- const quickEditButtons = quickEdit.childNodes[2];
1257
- const saveButton = quickEditButtons.childNodes[0];
1258
- await (0, _testUtils.act)(async () => {
1259
- _react.fireEvent.click(saveButton, {});
1260
- });
1261
- expect(ON_QUICK_EDIT_CALLS.length).toEqual(1);
1262
- // isDuplicate flag should not be present.
1263
- expect(ON_QUICK_EDIT_CALLS[0].value[0]).toEqual({
1264
- alreadyProvidedField: 'hello',
1265
- testText: 'new value'
1266
- });
1267
- });
1268
- });
1269
- describe('Details prop behavior', () => {
1270
- it('should render the provided details', () => {
1271
- const DETAILS = 'Sample details';
1272
- const CONFIG = {
1273
- title: 'Title',
1274
- details: DETAILS
1275
- };
1276
- const {
1277
- container
1278
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
1279
- id: ID,
1280
- entryData: ENTRY,
1281
- config: CONFIG,
1282
- parentCollectionName: "parent",
1283
- pages: [],
1284
- formData: {},
1285
- masterPage: {
1286
- childPages: []
1287
- }
1288
- }));
1289
- const {
1290
- headerContentDiv
1291
- } = checkSetup(container);
1292
- const headerDetails = headerContentDiv.children[1];
1293
- expect(headerDetails.tagName).toEqual('DIV');
1294
- expect(headerDetails.classList).toContain(classes('header-content-detail'));
1295
- expect(headerDetails.textContent).toEqual(DETAILS);
1296
- });
1297
- it('should render conditional details', () => {
1298
- const CONFIG = {
1299
- title: 'Title',
1300
- details: [{
1301
- text: 'Details A',
1302
- show_when: [{
1303
- field: 'field',
1304
- op: '!=',
1305
- value: true
1306
- }]
1307
- }, {
1308
- text: 'Details B',
1309
- show_when: [{
1310
- field: 'field',
1311
- op: '=',
1312
- value: true
1313
- }]
1314
- }]
1315
- };
1316
- const {
1317
- container
1318
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
1319
- id: ID,
1320
- entryData: _objectSpread(_objectSpread({}, ENTRY), {}, {
1321
- field: true
1322
- }),
1323
- config: CONFIG,
1324
- parentCollectionName: "parent",
1325
- pages: [],
1326
- formData: {},
1327
- masterPage: {
1328
- childPages: []
1329
- }
1330
- }));
1331
- const {
1332
- headerContentDiv
1333
- } = checkSetup(container);
1334
- const headerDetails = headerContentDiv.children[1];
1335
- expect(headerDetails.tagName).toEqual('DIV');
1336
- expect(headerDetails.classList).toContain(classes('header-content-detail'));
1337
- expect(headerDetails.textContent).toEqual('Details B');
1338
- });
1339
- it('should not render details when they are empty', () => {
1340
- const CONFIG = {
1341
- title: 'Title',
1342
- details: ''
1343
- };
1344
- const {
1345
- container
1346
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
1347
- id: ID,
1348
- entryData: ENTRY,
1349
- config: CONFIG,
1350
- parentCollectionName: "parent",
1351
- pages: [],
1352
- formData: {},
1353
- masterPage: {
1354
- childPages: []
1355
- }
1356
- }));
1357
- const {
1358
- headerContentDiv
1359
- } = checkSetup(container);
1360
- // If no details are provided, we expect only the header title to be rendered.
1361
- expect(headerContentDiv.children.length).toEqual(1);
1362
- const headerTitle = headerContentDiv.children[0];
1363
- expect(headerTitle.classList).toContain(classes('header-content-title'));
1364
- });
1365
- it('should render the interpolated details', () => {
1366
- const DETAILS = 'Full {label}';
1367
- const INTERPOLATED_ENTRY = _objectSpread(_objectSpread({}, ENTRY), {}, {
1368
- label: 'Details'
1369
- });
1370
- const CONFIG = {
1371
- title: 'Title',
1372
- details: DETAILS
1373
- };
1374
- const {
1375
- container
1376
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
1377
- id: ID,
1378
- entryData: INTERPOLATED_ENTRY,
1379
- config: CONFIG,
1380
- parentCollectionName: "parent",
1381
- pages: [],
1382
- formData: {},
1383
- masterPage: {
1384
- childPages: []
1385
- }
1386
- }));
1387
- const {
1388
- headerContentDiv
1389
- } = checkSetup(container);
1390
- const headerDetails = headerContentDiv.children[1];
1391
- const expectedInterpolatedString = _copReactComponents.Utils.interpolateString(DETAILS, INTERPOLATED_ENTRY);
1392
- expect(headerDetails.textContent).toEqual(expectedInterpolatedString);
1393
- });
1394
- it('should not render the details div if config.details is not provided', () => {
1395
- const CONFIG = {
1396
- title: 'Title'
1397
- };
1398
- const {
1399
- container
1400
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
1401
- id: ID,
1402
- entryData: ENTRY,
1403
- config: CONFIG,
1404
- parentCollectionName: "parent",
1405
- pages: [],
1406
- formData: {},
1407
- masterPage: {
1408
- childPages: []
1409
- }
1410
- }));
1411
- const {
1412
- headerContentDiv
1413
- } = checkSetup(container);
1414
- const headerDetails = headerContentDiv.querySelector("#".concat(ID, ".titleDetail"));
1415
- expect(headerDetails).toBeNull();
1416
- });
1417
- it('should not render the entire details section when hideDetails prop is true', () => {
1418
- const DETAILS = 'Sample details that should not be displayed';
1419
- const CONFIG = {
1420
- title: 'Title',
1421
- details: DETAILS
1422
- };
1423
- const {
1424
- container
1425
- } = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
1426
- id: ID,
1427
- entryData: ENTRY,
1428
- config: CONFIG,
1429
- parentCollectionName: "parent",
1430
- pages: [],
1431
- formData: {},
1432
- hideDetails: true,
1433
- masterPage: {
1434
- childPages: []
1435
- }
1436
- }));
1437
- const detailsComponent = container.querySelector('.details');
1438
- expect(detailsComponent).toBeNull();
1439
- });
1440
- });
1441
- });
1442
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3JlYWN0MiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29wUmVhY3RDb21wb25lbnRzIiwiX3Rlc3RVdGlscyIsIl9zZXR1cFRlc3RzIiwiX1N1bW1hcnlDYXJkIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfQmFubmVyU3RyaXAiLCJfU3VtbWFyeUNhcmRWYWxpZGF0aW9uQ29udGV4dCIsIl9qc3hSdW50aW1lIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiZGVmYXVsdCIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl90b1Byb3BlcnR5S2V5IiwidmFsdWUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIl90b1ByaW1pdGl2ZSIsIlN5bWJvbCIsInRvUHJpbWl0aXZlIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwiZGVzY3JpYmUiLCJjbGFzc2VzIiwiVXRpbHMiLCJjbGFzc0J1aWxkZXIiLCJERUZBVUxUX0NMQVNTIiwiSUQiLCJFTlRSWSIsImlkIiwiYmFubmVyVGV4dCIsInRpdGxlVGV4dCIsImRldGFpbHNUZXh0IiwiaW5kZXgiLCJzdW1tYXJ5VGV4dCIsImNoZWNrU2V0dXAiLCJjb250YWluZXIiLCJjYXJkRGl2IiwiY2hpbGRyZW4iLCJleHBlY3QiLCJ0YWdOYW1lIiwidG9FcXVhbCIsImNsYXNzTGlzdCIsInRvQ29udGFpbiIsImhlYWRlckRpdiIsImhlYWRlckNvbnRlbnREaXYiLCJoZWFkZXJBY3Rpb25EaXYiLCJjbGFzc05hbWUiLCJib2R5RGl2IiwiaXQiLCJDT05GSUciLCJiYW5uZXJzIiwidGl0bGUiLCJkZXRhaWxzIiwicmVuZGVyV2l0aFZhbGlkYXRpb24iLCJqc3giLCJlbnRyeURhdGEiLCJjb25maWciLCJwYXJlbnRDb2xsZWN0aW9uTmFtZSIsImZvcm1EYXRhIiwibWFzdGVyUGFnZSIsImNoaWxkUGFnZXMiLCJoZWFkZXJCYW5uZXJzIiwiREVGQVVMVF9CQU5ORVJfQ0xBU1MiLCJoZWFkZXJUaXRsZSIsInRleHRDb250ZW50IiwiaGVhZGVyRGV0YWlscyIsImNvbmNhdCIsInNob3dfd2hlbiIsImZpZWxkIiwib3AiLCJDVVNUT01fRU5UUlkiLCJ0ZXN0RmllbGQiLCJvbkNoYW5nZUFyZ3MiLCJvbkNoYW5nZUNhbGxzIiwiT05fQ0hBTkdFIiwicGFnZSIsImJlZm9yZUVhY2giLCJjaGFuZ2VBY3Rpb24iLCJsYWJlbCIsImFyaWFfbGFiZWwiLCJ0ZXh0Iiwib25GdWxsRWRpdCIsImNoYW5nZUJ1dHRvbiIsIm5hbWUiLCJnZXRBdHRyaWJ1dGUiLCJmaXJlRXZlbnQiLCJjbGljayIsInRvTWF0Y2hPYmplY3QiLCJERUZBVUxUX0NIQU5HRV9CVVRUT05fTEFCRUwiLCJvbkNoYW5nZSIsIm9uRGVsZXRlQXJncyIsIm9uRGVsZXRlQ2FsbHMiLCJPTl9ERUxFVEUiLCJlbnRyeSIsImRlbGV0ZUFjdGlvbiIsIm9uRGVsZXRlIiwiZGVsZXRlQnV0dG9uIiwiREVGQVVMVF9ERUxFVEVfQlVUVE9OX0xBQkVMIiwiZGV0YWlsc1NlY3Rpb24iLCJxdWVyeVNlbGVjdG9yIiwibm90IiwidG9CZU51bGwiLCJvbkR1cGxpY2F0ZUFyZ3MiLCJvbkR1cGxpY2F0ZUNhbGxzIiwiT05fRFVQTElDQVRFIiwiZHVwbGljYXRlQWN0aW9uIiwib25EdXBsaWNhdGUiLCJkdXBsaWNhdGVCdXR0b24iLCJERUZBVUxUX0RVUExJQ0FURV9CVVRUT05fTEFCRUwiLCJpc0R1cGxpY2F0ZSIsImplc3QiLCJmbiIsImdldEJ5VGVzdElkIiwicGFnZXMiLCJoaWRlRGV0YWlscyIsInVwZGF0ZWRDb25maWciLCJmb2N1c09uIiwicXVpY2tFZGl0IiwiZ2V0QnlUZXN0SWRSZXJlbmRlciIsImluaXRpYWxDb21wb25lbnQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsInRvSGF2ZUZvY3VzIiwiRHVwbGljYXRlZENvbXBvbmVudCIsIlBBR0VTIiwiY29tcG9uZW50cyIsInR5cGUiLCJmaWVsZElkIiwicmVxdWlyZWQiLCJ1c2UiLCJjeWFfbGFiZWwiLCJmdWxsX3BhdGgiLCJzdW1tYXJ5UXVpY2tFZGl0IiwicGFyZW50cyIsInRlc3RUZXh0IiwidGVzdFRleHQyIiwiZWRpdEJ1dHRvbiIsImNoaWxkTm9kZXMiLCJxdWlja0VkaXRCdXR0b25zIiwic2F2ZUJ1dHRvbiIsImNhbmNlbEJ1dHRvbiIsImN1c3RvbV9lcnJvcnMiLCJtZXNzYWdlIiwiVE9QX0xFVkVMX0VSUk9SUyIsImVudHJ5SWQiLCJlcnJvciIsInRvcExldmVsRXJyb3JzIiwiZXJyb3JTdW1tYXJ5Iiwib25RdWlja0VkaXQiLCJjb21wb25lbnQiLCJjb21wb25lbnRJbnB1dCIsImFjdCIsImNoYW5nZSIsInRhcmdldCIsIk9OX1NVQk1JVF9DQUxMUyIsImhvb2tzIiwib25TdWJtaXQiLCJwYXRjaCIsIk9OX1FVSUNLX0VESVRfQ0FMTFMiLCJPTl9RVUlDS19FRElUIiwiX3JlZiIsIm5vdFJlcXVpcmVkIiwib25FcnJvciIsIl9yZWYyIiwiYWxyZWFkeVByb3ZpZGVkRmllbGQiLCJfcmVmMyIsImNsZWFyVG9wTGV2ZWxFcnJvcnNGb3JDYXJkIiwiX3JlZjQiLCJERVRBSUxTIiwiSU5URVJQT0xBVEVEX0VOVFJZIiwiZXhwZWN0ZWRJbnRlcnBvbGF0ZWRTdHJpbmciLCJpbnRlcnBvbGF0ZVN0cmluZyIsImRldGFpbHNDb21wb25lbnQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9Db2xsZWN0aW9uU3VtbWFyeS9TdW1tYXJ5Q2FyZC50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdsb2JhbCBpbXBvcnRzLlxuaW1wb3J0IHsgZmlyZUV2ZW50IH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgJ0B0ZXN0aW5nLWxpYnJhcnkvamVzdC1kb20vZXh0ZW5kLWV4cGVjdCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdAdWtob21lb2ZmaWNlL2NvcC1yZWFjdC1jb21wb25lbnRzJztcbmltcG9ydCB7IGFjdCB9IGZyb20gJ3JlYWN0LWRvbS90ZXN0LXV0aWxzJztcblxuLy8gTG9jYWwgaW1wb3J0cy5cbmltcG9ydCB7IHJlbmRlcldpdGhWYWxpZGF0aW9uIH0gZnJvbSAnLi4vLi4vc2V0dXBUZXN0cyc7XG5pbXBvcnQgU3VtbWFyeUNhcmQsIHtcbiAgREVGQVVMVF9DTEFTUyxcbiAgREVGQVVMVF9DSEFOR0VfQlVUVE9OX0xBQkVMLFxuICBERUZBVUxUX0RFTEVURV9CVVRUT05fTEFCRUwsXG4gIERFRkFVTFRfRFVQTElDQVRFX0JVVFRPTl9MQUJFTFxufSBmcm9tIFwiLi9TdW1tYXJ5Q2FyZFwiO1xuaW1wb3J0IHsgREVGQVVMVF9DTEFTUyBhcyBERUZBVUxUX0JBTk5FUl9DTEFTUyB9IGZyb20gJy4vQmFubmVyU3RyaXAnO1xuaW1wb3J0IFN1bW1hcnlDYXJkVmFsaWRhdGlvbkNvbnRleHRQcm92aWRlciBmcm9tICcuL1N1bW1hcnlDYXJkVmFsaWRhdGlvbkNvbnRleHQnO1xuXG5kZXNjcmliZSgnY29tcG9uZW50cy5Db2xsZWN0aW9uU3VtbWFyeS5TdW1tYXJ5Q2FyZCcsICgpID0+IHtcblxuICBjb25zdCBjbGFzc2VzID0gVXRpbHMuY2xhc3NCdWlsZGVyKERFRkFVTFRfQ0xBU1MsIFtdLCAnJyk7XG4gIGNvbnN0IElEID0gJ3N1bW1hcnlDYXJkSWQnO1xuICBjb25zdCBFTlRSWSA9IHtcbiAgICBpZDogJzAwMScsXG4gICAgYmFubmVyVGV4dDogJ0EgYmFubmVyJyxcbiAgICB0aXRsZVRleHQ6ICdBIHRpdGxlJyxcbiAgICBkZXRhaWxzVGV4dDogJ1NvbWUgZGV0YWlscycsXG4gICAgaW5kZXg6IDAsXG4gICAgc3VtbWFyeVRleHQ6ICdGdWxsIGRldGFpbHMnXG4gIH07XG5cbiAgY29uc3QgY2hlY2tTZXR1cCA9IChjb250YWluZXIpID0+IHtcbiAgICBjb25zdCBjYXJkRGl2ID0gY29udGFpbmVyLmNoaWxkcmVuWzBdO1xuICAgIGV4cGVjdChjYXJkRGl2LnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChjYXJkRGl2LmNsYXNzTGlzdCkudG9Db250YWluKERFRkFVTFRfQ0xBU1MpO1xuICAgIGNvbnN0IGhlYWRlckRpdiA9IGNhcmREaXYuY2hpbGRyZW5bMF07XG4gICAgZXhwZWN0KGhlYWRlckRpdi50YWdOYW1lKS50b0VxdWFsKCdESVYnKTtcbiAgICBleHBlY3QoaGVhZGVyRGl2LmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlcicpKTtcbiAgICBjb25zdCBoZWFkZXJDb250ZW50RGl2ID0gaGVhZGVyRGl2LmNoaWxkcmVuWzBdO1xuICAgIGV4cGVjdChoZWFkZXJDb250ZW50RGl2LnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChoZWFkZXJDb250ZW50RGl2LmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlci1jb250ZW50JykpO1xuICAgIGNvbnN0IGhlYWRlckFjdGlvbkRpdiA9IGhlYWRlckRpdi5jaGlsZHJlblsxXTtcbiAgICBleHBlY3QoaGVhZGVyQWN0aW9uRGl2LnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2xhc3NOYW1lKS50b0NvbnRhaW4oY2xhc3NlcygnaGVhZGVyLWFjdGlvbnMnKSk7XG4gICAgY29uc3QgYm9keURpdiA9IGNhcmREaXYuY2hpbGRyZW5bMV07XG4gICAgZXhwZWN0KGJvZHlEaXYudGFnTmFtZSkudG9FcXVhbCgnRElWJyk7XG4gICAgZXhwZWN0KGJvZHlEaXYuY2xhc3NMaXN0KS50b0NvbnRhaW4oY2xhc3NlcygnYm9keScpKTtcbiAgICByZXR1cm4geyBjYXJkRGl2LCBoZWFkZXJEaXYsIGhlYWRlckNvbnRlbnREaXYsIGhlYWRlckFjdGlvbkRpdiwgYm9keURpdiB9O1xuICB9O1xuXG4gIGl0KCdzaG91bGQgY29ycmVjdGx5IHJlbmRlciBhIFN1bW1hcnlDYXJkIGNvbXBvbmVudCcsICgpID0+IHtcbiAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICBiYW5uZXJzOiBbXG4gICAgICAgICdBbHBoYScsICdCcmF2bydcbiAgICAgIF0sXG4gICAgICB0aXRsZTogJ1RpdGxlIHRleHQnLFxuICAgICAgZGV0YWlsczogJ0RldGFpbCB0ZXh0J1xuICAgIH07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICk7XG4gICAgY29uc3QgeyBoZWFkZXJDb250ZW50RGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgZXhwZWN0KGhlYWRlckNvbnRlbnREaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDMpO1xuXG4gICAgY29uc3QgaGVhZGVyQmFubmVycyA9IGhlYWRlckNvbnRlbnREaXYuY2hpbGRyZW5bMF07XG4gICAgZXhwZWN0KGhlYWRlckJhbm5lcnMudGFnTmFtZSkudG9FcXVhbCgnRElWJyk7XG4gICAgZXhwZWN0KGhlYWRlckJhbm5lcnMuY2xhc3NMaXN0KS50b0NvbnRhaW4oREVGQVVMVF9CQU5ORVJfQ0xBU1MpO1xuXG4gICAgY29uc3QgaGVhZGVyVGl0bGUgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzFdO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS50YWdOYW1lKS50b0VxdWFsKCdIMicpO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS5jbGFzc0xpc3QpLnRvQ29udGFpbihjbGFzc2VzKCdoZWFkZXItY29udGVudC10aXRsZScpKTtcbiAgICBleHBlY3QoaGVhZGVyVGl0bGUudGV4dENvbnRlbnQpLnRvRXF1YWwoQ09ORklHLnRpdGxlKTtcblxuICAgIGNvbnN0IGhlYWRlckRldGFpbHMgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzJdO1xuICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlci1jb250ZW50LWRldGFpbCcpKTtcbiAgICBleHBlY3QoaGVhZGVyRGV0YWlscy50ZXh0Q29udGVudCkudG9FcXVhbChDT05GSUcuZGV0YWlscyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IHJlbmRlciBhIGJhbm5lciBpZiBub25lIGFyZSBzdXBwbGllZCcsICgpID0+IHtcbiAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICB0aXRsZTogJ1RpdGxlIHRleHQnLFxuICAgICAgZGV0YWlsczogJ0RldGFpbCB0ZXh0J1xuICAgIH07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICk7XG4gICAgY29uc3QgeyBoZWFkZXJDb250ZW50RGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgZXhwZWN0KGhlYWRlckNvbnRlbnREaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDIpO1xuXG4gICAgLy8gVGhlIG9ubHkgdHdvIGNoaWxkcmVuIG9mIHRoZSBjb250ZW50IGRpdiBzaG91bGQgYmUgdGhlIHRpdGxlXG4gICAgLy8gYW5kIHRoZSBkZXRhaWxzLlxuXG4gICAgY29uc3QgaGVhZGVyVGl0bGUgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzBdO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS50YWdOYW1lKS50b0VxdWFsKCdIMicpO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS5jbGFzc0xpc3QpLnRvQ29udGFpbihjbGFzc2VzKCdoZWFkZXItY29udGVudC10aXRsZScpKTtcbiAgICBleHBlY3QoaGVhZGVyVGl0bGUudGV4dENvbnRlbnQpLnRvRXF1YWwoQ09ORklHLnRpdGxlKTtcblxuICAgIGNvbnN0IGhlYWRlckRldGFpbHMgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzFdO1xuICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlci1jb250ZW50LWRldGFpbCcpKTtcbiAgICBleHBlY3QoaGVhZGVyRGV0YWlscy50ZXh0Q29udGVudCkudG9FcXVhbChDT05GSUcuZGV0YWlscyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IHJlbmRlciBkZXRhaWxzIGlmIG5vbmUgYXJlIHN1cHBsaWVkJywgKCkgPT4ge1xuICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgIGJhbm5lcnM6IFtcbiAgICAgICAgJ0FscGhhJywgJ0JyYXZvJ1xuICAgICAgXSxcbiAgICAgIHRpdGxlOiAnVGl0bGUgdGV4dCdcbiAgICB9O1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICApO1xuICAgIGNvbnN0IHsgaGVhZGVyQ29udGVudERpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgIGV4cGVjdChoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuLmxlbmd0aCkudG9FcXVhbCgyKTtcblxuICAgIGNvbnN0IGhlYWRlckJhbm5lcnMgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzBdO1xuICAgIGV4cGVjdChoZWFkZXJCYW5uZXJzLnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChoZWFkZXJCYW5uZXJzLmNsYXNzTGlzdCkudG9Db250YWluKERFRkFVTFRfQkFOTkVSX0NMQVNTKTtcblxuICAgIC8vIFRoZSBvbmx5IHR3byBjaGlsZHJlbiBvZiB0aGUgY29udGVudCBkaXYgc2hvdWxkIGJlIHRoZSBiYW5uZXIgYW5kXG4gICAgLy8gdGhlIHRpdGxlLlxuXG4gICAgY29uc3QgaGVhZGVyVGl0bGUgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzFdO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS50YWdOYW1lKS50b0VxdWFsKCdIMicpO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS5jbGFzc0xpc3QpLnRvQ29udGFpbihjbGFzc2VzKCdoZWFkZXItY29udGVudC10aXRsZScpKTtcbiAgICBleHBlY3QoaGVhZGVyVGl0bGUudGV4dENvbnRlbnQpLnRvRXF1YWwoQ09ORklHLnRpdGxlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgaW50ZXJwb2xhdGUgdGhlIHRpdGxlJywgKCkgPT4ge1xuICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmdcbiAgICAgIHRpdGxlOiAnJHt0aXRsZVRleHR9IHRoYXQgaXMgaW50ZXJwb2xhdGVkJ1xuICAgIH07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICk7XG4gICAgY29uc3QgeyBoZWFkZXJDb250ZW50RGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG5cbiAgICBjb25zdCBoZWFkZXJUaXRsZSA9IGhlYWRlckNvbnRlbnREaXYuY2hpbGRyZW5bMF07XG4gICAgZXhwZWN0KGhlYWRlclRpdGxlLnRhZ05hbWUpLnRvRXF1YWwoJ0gyJyk7XG4gICAgZXhwZWN0KGhlYWRlclRpdGxlLmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlci1jb250ZW50LXRpdGxlJykpO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS50ZXh0Q29udGVudCkudG9FcXVhbChgJHtFTlRSWS50aXRsZVRleHR9IHRoYXQgaXMgaW50ZXJwb2xhdGVkYCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2hvdyB0aGUgY29ycmVjdCBjb25kaXRpb25hbCB0aXRsZScsICgpID0+IHtcbiAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICB0aXRsZTogW1xuICAgICAgICB7XG4gICAgICAgICAgdGl0bGU6ICdUaXRsZSBBJyxcbiAgICAgICAgICBzaG93X3doZW46IHtcbiAgICAgICAgICAgIGZpZWxkOiAndGVzdEZpZWxkJyxcbiAgICAgICAgICAgIG9wOiAnPScsXG4gICAgICAgICAgICB2YWx1ZTogJzEyMydcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZ1xuICAgICAgICAgIHRpdGxlOiAnJHt0aXRsZVRleHR9IHRoYXQgaXMgaW50ZXJwb2xhdGVkJyxcbiAgICAgICAgICBzaG93X3doZW46IHtcbiAgICAgICAgICAgIGZpZWxkOiAndGVzdEZpZWxkJyxcbiAgICAgICAgICAgIG9wOiAnPScsXG4gICAgICAgICAgICB2YWx1ZTogJzQ1NidcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgICBjb25zdCBDVVNUT01fRU5UUlkgPSB7IC4uLkVOVFJZLCB0ZXN0RmllbGQ6ICc0NTYnIH07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtDVVNUT01fRU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICApO1xuICAgIGNvbnN0IHsgaGVhZGVyQ29udGVudERpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuXG4gICAgY29uc3QgaGVhZGVyVGl0bGUgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzBdO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS50YWdOYW1lKS50b0VxdWFsKCdIMicpO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS5jbGFzc0xpc3QpLnRvQ29udGFpbihjbGFzc2VzKCdoZWFkZXItY29udGVudC10aXRsZScpKTtcbiAgICBleHBlY3QoaGVhZGVyVGl0bGUudGV4dENvbnRlbnQpLnRvRXF1YWwoYCR7RU5UUlkudGl0bGVUZXh0fSB0aGF0IGlzIGludGVycG9sYXRlZGApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNvcnJlY3RseSBpbnRlcnBvbGF0ZSB0aGUgZGV0YWlscycsICgpID0+IHtcbiAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICB0aXRsZTogJ1RpdGxlJyxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmdcbiAgICAgIGRldGFpbHM6ICcke2RldGFpbHNUZXh0fSB0aGF0IGFyZSBpbnRlcnBvbGF0ZWQnXG4gICAgfTtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e0NPTkZJR30gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgKTtcbiAgICBjb25zdCB7IGhlYWRlckNvbnRlbnREaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcblxuICAgIGNvbnN0IGhlYWRlckRldGFpbHMgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzFdO1xuICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlci1jb250ZW50LWRldGFpbCcpKTtcbiAgICBleHBlY3QoaGVhZGVyRGV0YWlscy50ZXh0Q29udGVudCkudG9FcXVhbChgJHtFTlRSWS5kZXRhaWxzVGV4dH0gdGhhdCBhcmUgaW50ZXJwb2xhdGVkYCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDaGFuZ2UgYWN0aW9uIGJ1dHRvbicsICgpID0+IHtcbiAgICBsZXQgb25DaGFuZ2VBcmdzID0gW107XG4gICAgbGV0IG9uQ2hhbmdlQ2FsbHMgPSAwO1xuICAgIGNvbnN0IE9OX0NIQU5HRSA9IChwYWdlLCBpZCkgPT4ge1xuICAgICAgb25DaGFuZ2VBcmdzLnB1c2goeyBwYWdlLCBpZCB9KTtcbiAgICAgIG9uQ2hhbmdlQ2FsbHMgKz0gMTtcbiAgICB9O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBvbkNoYW5nZUFyZ3MgPSBbXTtcbiAgICAgIG9uQ2hhbmdlQ2FsbHMgPSAwO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgQ09ORklHID0ge1xuICAgICAgICBjaGFuZ2VBY3Rpb246IHtcbiAgICAgICAgICBsYWJlbDogJ0NoYW5nZSBsYWJlbCcsXG4gICAgICAgICAgcGFnZTogJ3Rlc3RQYWdlJyxcbiAgICAgICAgICBhcmlhX2xhYmVsOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRleHQ6ICd0ZXN0VGV4dCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IG9uRnVsbEVkaXQ9e09OX0NIQU5HRX0gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19Lz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMSk7XG5cbiAgICAgIGNvbnN0IGNoYW5nZUJ1dHRvbiA9IGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlblswXTtcbiAgICAgIGV4cGVjdChjaGFuZ2VCdXR0b24ubmFtZSkudG9FcXVhbCgnQ2hhbmdlJyk7XG4gICAgICBleHBlY3QoY2hhbmdlQnV0dG9uLnRhZ05hbWUpLnRvRXF1YWwoJ0JVVFRPTicpO1xuICAgICAgZXhwZWN0KGNoYW5nZUJ1dHRvbi50ZXh0Q29udGVudCkudG9FcXVhbChDT05GSUcuY2hhbmdlQWN0aW9uLmxhYmVsKTtcbiAgICAgIGV4cGVjdChjaGFuZ2VCdXR0b24uZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykpLnRvRXF1YWwoQ09ORklHLmNoYW5nZUFjdGlvbi5hcmlhX2xhYmVsWzBdLnRleHQpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soY2hhbmdlQnV0dG9uLCB7fSk7XG4gICAgICBleHBlY3Qob25DaGFuZ2VDYWxscykudG9FcXVhbCgxKTtcbiAgICAgIGV4cGVjdChvbkNoYW5nZUFyZ3NbMF0pLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBwYWdlOiBDT05GSUcuY2hhbmdlQWN0aW9uLnBhZ2UsXG4gICAgICAgIGlkOiBFTlRSWS5pZFxuICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIHRoZSBkZWZhdWx0IGxhYmVsIHdoZW4gb25lIGlzIG5vdCBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgICAgY2hhbmdlQWN0aW9uOiB7XG4gICAgICAgICAgcGFnZTogJ3Rlc3RQYWdlJ1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBvbkZ1bGxFZGl0PXtPTl9DSEFOR0V9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgaGVhZGVyQWN0aW9uRGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgICBleHBlY3QoaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuLmxlbmd0aCkudG9FcXVhbCgxKTtcblxuICAgICAgY29uc3QgY2hhbmdlQnV0dG9uID0gaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuWzBdO1xuICAgICAgZXhwZWN0KGNoYW5nZUJ1dHRvbi50YWdOYW1lKS50b0VxdWFsKCdCVVRUT04nKTtcbiAgICAgIGV4cGVjdChjaGFuZ2VCdXR0b24udGV4dENvbnRlbnQpLnRvRXF1YWwoREVGQVVMVF9DSEFOR0VfQlVUVE9OX0xBQkVMKTtcblxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gbm8gY29uZmlnIGlzIHByb3ZpZGVkIGZvciBpdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXt7fX0gb25DaGFuZ2U9e09OX0NIQU5HRX0gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDApO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBvbkNoYW5nZSBpcyBub3Qgc3VwcGxpZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIGNoYW5nZUFjdGlvbjoge1xuICAgICAgICAgIGxhYmVsOiAnQ2hhbmdlIGxhYmVsJyxcbiAgICAgICAgICBwYWdlOiAndGVzdFBhZ2UnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMCk7XG5cbiAgICB9KTtcblxuICB9KTtcblxuICBkZXNjcmliZSgnRGVsZXRlIGFjdGlvbiBidXR0b24nLCAoKSA9PiB7XG5cbiAgICBsZXQgb25EZWxldGVBcmdzID0gW107XG4gICAgbGV0IG9uRGVsZXRlQ2FsbHMgPSAwO1xuICAgIGNvbnN0IE9OX0RFTEVURSA9IChlbnRyeSkgPT4ge1xuICAgICAgb25EZWxldGVBcmdzLnB1c2goZW50cnkpO1xuICAgICAgb25EZWxldGVDYWxscyArPSAxO1xuICAgIH07XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIG9uRGVsZXRlQXJncyA9IFtdO1xuICAgICAgb25EZWxldGVDYWxscyA9IDA7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIGRlbGV0ZUFjdGlvbjoge1xuICAgICAgICAgIGxhYmVsOiAnRGVsZXRlIGxhYmVsJyxcbiAgICAgICAgICBhcmlhX2xhYmVsOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRleHQ6ICd0ZXN0VGV4dCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IG9uRGVsZXRlPXtPTl9ERUxFVEV9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgaGVhZGVyQWN0aW9uRGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgICBleHBlY3QoaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuLmxlbmd0aCkudG9FcXVhbCgxKTtcblxuICAgICAgY29uc3QgZGVsZXRlQnV0dG9uID0gaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuWzBdO1xuICAgICAgZXhwZWN0KGRlbGV0ZUJ1dHRvbi5uYW1lKS50b0VxdWFsKCdEZWxldGUnKTtcbiAgICAgIGV4cGVjdChkZWxldGVCdXR0b24udGFnTmFtZSkudG9FcXVhbCgnQlVUVE9OJyk7XG4gICAgICBleHBlY3QoZGVsZXRlQnV0dG9uLnRleHRDb250ZW50KS50b0VxdWFsKENPTkZJRy5kZWxldGVBY3Rpb24ubGFiZWwpO1xuICAgICAgZXhwZWN0KGRlbGV0ZUJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSkudG9FcXVhbChDT05GSUcuZGVsZXRlQWN0aW9uLmFyaWFfbGFiZWxbMF0udGV4dCk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhkZWxldGVCdXR0b24sIHt9KTtcbiAgICAgIGV4cGVjdChvbkRlbGV0ZUNhbGxzKS50b0VxdWFsKDEpO1xuICAgICAgZXhwZWN0KG9uRGVsZXRlQXJnc1swXSkudG9NYXRjaE9iamVjdChFTlRSWSk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIHRoZSBkZWZhdWx0IGxhYmVsIHdoZW4gb25lIGlzIG5vdCBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgICAgZGVsZXRlQWN0aW9uOiB7fVxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e0NPTkZJR30gb25EZWxldGU9e09OX0RFTEVURX0gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDEpO1xuXG4gICAgICBjb25zdCBkZWxldGVCdXR0b24gPSBoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW5bMF07XG4gICAgICBleHBlY3QoZGVsZXRlQnV0dG9uLnRhZ05hbWUpLnRvRXF1YWwoJ0JVVFRPTicpO1xuICAgICAgZXhwZWN0KGRlbGV0ZUJ1dHRvbi50ZXh0Q29udGVudCkudG9FcXVhbChERUZBVUxUX0RFTEVURV9CVVRUT05fTEFCRUwpO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBubyBjb25maWcgaXMgcHJvdmlkZWQgZm9yIGl0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e3t9fSBvbkRlbGV0ZT17T05fREVMRVRFfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMCk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciB3aGVuIG9uRGVsZXRlIGlzIG5vdCBzdXBwbGllZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgICAgZGVsZXRlQWN0aW9uOiB7XG4gICAgICAgICAgbGFiZWw6ICdEZWxldGUgbGFiZWwnLFxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e0NPTkZJR30gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDApO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSByZW5kZXIgdGhlIERldGFpbHMgc2VjdGlvbiB3aXRoIGVudHJ5IGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIGRlbGV0ZUFjdGlvbjoge1xuICAgICAgICAgIGxhYmVsOiAnRGVsZXRlIGxhYmVsJyxcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRldGFpbHNTZWN0aW9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5kZXRhaWxzJyk7XG4gICAgICBleHBlY3QoZGV0YWlsc1NlY3Rpb24pLm5vdC50b0JlTnVsbCgpO1xuICAgICAgZXhwZWN0KGRldGFpbHNTZWN0aW9uLnRleHRDb250ZW50KS50b0NvbnRhaW4oRU5UUlkuc3VtbWFyeVRleHQpO1xuICAgIH0pO1xuXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdEdXBsaWNhdGUgYWN0aW9uIGJ1dHRvbicsICgpID0+IHtcblxuICAgIGxldCBvbkR1cGxpY2F0ZUFyZ3MgPSBbXTtcbiAgICBsZXQgb25EdXBsaWNhdGVDYWxscyA9IDA7XG4gICAgY29uc3QgT05fRFVQTElDQVRFID0gKGVudHJ5KSA9PiB7XG4gICAgICBvbkR1cGxpY2F0ZUFyZ3MucHVzaChlbnRyeSk7XG4gICAgICBvbkR1cGxpY2F0ZUNhbGxzICs9IDE7XG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgb25EdXBsaWNhdGVBcmdzID0gW107XG4gICAgICBvbkR1cGxpY2F0ZUNhbGxzID0gMDtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgICAgZHVwbGljYXRlQWN0aW9uOiB7XG4gICAgICAgICAgbGFiZWw6ICdEdXBsaWNhdGUgbGFiZWwnLFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBvbkR1cGxpY2F0ZT17T05fRFVQTElDQVRFfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMSk7XG5cbiAgICAgIGNvbnN0IGR1cGxpY2F0ZUJ1dHRvbiA9IGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlblswXTtcbiAgICAgIGV4cGVjdChkdXBsaWNhdGVCdXR0b24ubmFtZSkudG9FcXVhbCgnRHVwbGljYXRlJyk7XG4gICAgICBleHBlY3QoZHVwbGljYXRlQnV0dG9uLnRhZ05hbWUpLnRvRXF1YWwoJ0JVVFRPTicpO1xuICAgICAgZXhwZWN0KGR1cGxpY2F0ZUJ1dHRvbi50ZXh0Q29udGVudCkudG9FcXVhbChDT05GSUcuZHVwbGljYXRlQWN0aW9uLmxhYmVsKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGR1cGxpY2F0ZUJ1dHRvbiwge30pO1xuICAgICAgZXhwZWN0KG9uRHVwbGljYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3Qob25EdXBsaWNhdGVBcmdzWzBdKS50b01hdGNoT2JqZWN0KEVOVFJZKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIHRoZSBkZWZhdWx0IGxhYmVsIHdoZW4gb25lIGlzIG5vdCBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgICAgZHVwbGljYXRlQWN0aW9uOiB7fVxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e0NPTkZJR30gb25EdXBsaWNhdGU9e09OX0RVUExJQ0FURX0gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDEpO1xuXG4gICAgICBjb25zdCBkdXBsaWNhdGVCdXR0b24gPSBoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW5bMF07XG4gICAgICBleHBlY3QoZHVwbGljYXRlQnV0dG9uLnRhZ05hbWUpLnRvRXF1YWwoJ0JVVFRPTicpO1xuICAgICAgZXhwZWN0KGR1cGxpY2F0ZUJ1dHRvbi50ZXh0Q29udGVudCkudG9FcXVhbChERUZBVUxUX0RVUExJQ0FURV9CVVRUT05fTEFCRUwpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gbm8gY29uZmlnIGlzIHByb3ZpZGVkIGZvciBpdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXt7fX0gb25EdXBsaWNhdGU9e09OX0RVUExJQ0FURX0gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gb25EdXBsaWNhdGUgaXMgbm90IHN1cHBsaWVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgQ09ORklHID0ge1xuICAgICAgICBkdXBsaWNhdGVBY3Rpb246IHtcbiAgICAgICAgICBsYWJlbDogJ0R1cGxpY2F0ZSBsYWJlbCcsXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZvY3VzIG9uIHRoZSBtb3N0IHJlY2VudGx5IGR1cGxpY2F0ZWQgaXRlbScsICgpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5RGF0YSA9IHsgaWQ6IElELCBpc0R1cGxpY2F0ZTogdHJ1ZSB9O1xuICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICBkdXBsaWNhdGVBY3Rpb246IHtcbiAgICAgICAgICBsYWJlbDogJ0R1cGxpY2F0ZSBMYWJlbCcsXG4gICAgICAgICAgYXJpYV9sYWJlbDogJ0R1cGxpY2F0ZSBBcmlhIExhYmVsJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3Qgb25EdXBsaWNhdGUgPSBqZXN0LmZuKCk7XG5cbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmRcbiAgICAgICAgICBpZD17SUR9XG4gICAgICAgICAgZW50cnlEYXRhPXtlbnRyeURhdGF9XG4gICAgICAgICAgY29uZmlnPXtjb25maWd9XG4gICAgICAgICAgb25EdXBsaWNhdGU9e29uRHVwbGljYXRlfVxuICAgICAgICAgIHBhcmVudENvbGxlY3Rpb25OYW1lPVwicGFyZW50XCJcbiAgICAgICAgICBwYWdlcz17W119XG4gICAgICAgICAgZm9ybURhdGE9e3t9fVxuICAgICAgICAgIGhpZGVEZXRhaWxzXG4gICAgICAgICAgbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgICAgY29uc3QgdXBkYXRlZENvbmZpZyA9IHtcbiAgICAgICAgZm9jdXNPbjogdHJ1ZSxcbiAgICAgICAgcXVpY2tFZGl0OiB0cnVlLFxuICAgICAgfTtcblxuICAgICAgLy8gUmVyZW5kZXIgdGhlIGNvbXBvbmVudCB3aXRoIHVwZGF0ZWQgY29uZmlnXG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkOiBnZXRCeVRlc3RJZFJlcmVuZGVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkXG4gICAgICAgICAgaWQ9e0lEfVxuICAgICAgICAgIGVudHJ5RGF0YT17ZW50cnlEYXRhfVxuICAgICAgICAgIGNvbmZpZz17dXBkYXRlZENvbmZpZ31cbiAgICAgICAgICBwYXJlbnRDb2xsZWN0aW9uTmFtZT1cInBhcmVudFwiXG4gICAgICAgICAgcGFnZXM9e1tdfVxuICAgICAgICAgIGZvcm1EYXRhPXt7fX1cbiAgICAgICAgICBoaWRlRGV0YWlsc1xuICAgICAgICAgIG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX1cbiAgICAgICAgLz5cbiAgICAgICk7XG5cbiAgICAgIC8vIGNoZWNrIHRoYXQgZm9jdXMgaXNuJ3Qgb24gdGhlIGluaXRpYWwgY29tcG9uZW50XG4gICAgICBjb25zdCBpbml0aWFsQ29tcG9uZW50ID0gZ2V0QnlUZXN0SWQoJ2R1cGxpY2F0ZS1idXR0b24nKVxuICAgICAgZXhwZWN0KGluaXRpYWxDb21wb25lbnQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QoaW5pdGlhbENvbXBvbmVudCkubm90LnRvSGF2ZUZvY3VzKCk7XG5cbiAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIGZvY3VzIGlzIG9uIHRoZSBuZXdseSBkdXBsaWNhdGVkIGNvbXBvbmVudFxuICAgICAgY29uc3QgRHVwbGljYXRlZENvbXBvbmVudCA9IGdldEJ5VGVzdElkUmVyZW5kZXIoJ3F1aWNrZWRpdC1idXR0b24nKTtcbiAgICAgIGV4cGVjdChEdXBsaWNhdGVkQ29tcG9uZW50KS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KER1cGxpY2F0ZWRDb21wb25lbnQpLnRvSGF2ZUZvY3VzKCk7XG4gICAgfSk7XG4gIH0pO1xuXG5cbiAgZGVzY3JpYmUoJ1F1aWNrIEVkaXQgYWN0aW9uIGJ1dHRvbicsICgpID0+IHtcbiAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICBxdWlja0VkaXQ6IHt9LFxuICAgIH07XG5cbiAgICBjb25zdCBQQUdFUyA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdwYXJlbnRQYWdlJyxcbiAgICAgICAgbmFtZTogJ3BhcmVudFBhZ2UnLFxuICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICd0ZXN0VGV4dCcsXG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICBsYWJlbDogJ1Rlc3QgdGV4dCcsXG4gICAgICAgICAgICBmaWVsZElkOiAndGVzdFRleHQnLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICB1c2U6ICd0ZXN0VGV4dCcsXG4gICAgICAgICAgICBjeWFfbGFiZWw6ICdUZXN0IHRleHQnLFxuICAgICAgICAgICAgZnVsbF9wYXRoOiAndGVzdFRleHQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHN1bW1hcnlRdWlja0VkaXQ6IFtcbiAgICAgICAgICBcInRlc3RUZXh0XCJcbiAgICAgICAgXSxcbiAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICBwYXJlbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnMTY5NTAzNzU3OTE1MCcsXG4gICAgICAgICAgICAgIHRlc3RUZXh0OiAndGVzdGVyJyxcbiAgICAgICAgICAgICAgdGVzdFRleHQyOiAndGVzdCB0ZXN0JyxcbiAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogUEFHRVMgfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMSk7XG5cbiAgICAgIC8vIFNob3dzIGVkaXQgYnV0dG9uIGJ1dCBubyBxdWljayBlZGl0XG4gICAgICBjb25zdCBlZGl0QnV0dG9uID0gaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuWzBdO1xuICAgICAgZXhwZWN0KGVkaXRCdXR0b24ubmFtZSkudG9FcXVhbCgnUXVpY2tFZGl0Jyk7XG4gICAgICBleHBlY3QoZWRpdEJ1dHRvbi50YWdOYW1lKS50b0VxdWFsKCdCVVRUT04nKTtcbiAgICAgIGV4cGVjdChlZGl0QnV0dG9uLnRleHRDb250ZW50KS50b0VxdWFsKCdRdWljayBFZGl0Jyk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvRXF1YWwoMik7IC8vIFF1aWNrIGVkaXQgaGlkZGVuXG5cbiAgICAgIC8vIHNob3dzIHF1aWNrZWRpdCBvbmNlIGNsaWNrZWRcbiAgICAgIGZpcmVFdmVudC5jbGljayhlZGl0QnV0dG9uLCB7fSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvRXF1YWwoMyk7IC8vIFF1aWNrIGVkaXQgc2hvd25cbiAgICAgIGNvbnN0IHF1aWNrRWRpdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG4gICAgICBleHBlY3QocXVpY2tFZGl0LnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1Rlc3QgdGV4dCcpO1xuXG4gICAgICAvLyBxdWljayBlZGl0IGhhcyBwcm9wZXIgYnV0dG9uc1xuICAgICAgY29uc3QgcXVpY2tFZGl0QnV0dG9ucyA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzJdO1xuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IHF1aWNrRWRpdEJ1dHRvbnMuY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IHF1aWNrRWRpdEJ1dHRvbnMuY2hpbGROb2Rlc1sxXTtcbiAgICAgIGV4cGVjdChzYXZlQnV0dG9uLnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1NhdmUnKTtcbiAgICAgIGV4cGVjdChjYW5jZWxCdXR0b24udGV4dENvbnRlbnQpLnRvQ29udGFpbignQ2FuY2VsJyk7XG5cbiAgICAgIC8vIGhpZGVzIHF1aWNrIGVkaXQgYWdhaW4gYWRmdGVyIGNsaWNraW5nIGNhbmNlbFxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGNhbmNlbEJ1dHRvbiwge30pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMubGVuZ3RoKS50b0VxdWFsKDIpOyAvLyBRdWljayBlZGl0IGhpZGRlblxuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBubyBjb25maWcgaXMgcHJvdmlkZWQgZm9yIGl0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e3t9fSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogUEFHRVMgfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1F1aWNrIEVkaXQgZXJyb3JzJywgKCkgPT4ge1xuXG4gICAgY29uc3QgQ1VTVE9NX0VOVFJZID0ge1xuICAgICAgaWQ6ICcxMjMnLFxuICAgICAgdGVzdFRleHQ6ICd2YWx1ZSdcbiAgICB9O1xuXG4gICAgY29uc3QgQ09ORklHID0ge1xuICAgICAgcXVpY2tFZGl0OiB7fVxuICAgIH07XG5cbiAgICBjb25zdCBQQUdFUyA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdwYXJlbnRQYWdlJyxcbiAgICAgICAgbmFtZTogJ3BhcmVudFBhZ2UnLFxuICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICd0ZXN0VGV4dCcsXG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICBsYWJlbDogJ1Rlc3QgdGV4dCcsXG4gICAgICAgICAgICBmaWVsZElkOiAndGVzdFRleHQnLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICB1c2U6ICd0ZXN0VGV4dCcsXG4gICAgICAgICAgICBjeWFfbGFiZWw6ICdUZXN0IHRleHQnLFxuICAgICAgICAgICAgZnVsbF9wYXRoOiAndGVzdFRleHQnLFxuICAgICAgICAgICAgY3VzdG9tX2Vycm9yczogW3tcbiAgICAgICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ0N1c3RvbSBlcnJvciBtZXNzYWdlJ1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHN1bW1hcnlRdWlja0VkaXQ6IFtcbiAgICAgICAgICBcInRlc3RUZXh0XCJcbiAgICAgICAgXSxcbiAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICBwYXJlbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnMTIzJyxcbiAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBpdCgnc2hvdWxkIGluaXRhbGx5IHNob3cgZXJyb3JzIHBhc3NlZCBpbiBmcm9tIHRvcC1sZXZlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IFRPUF9MRVZFTF9FUlJPUlMgPSBbe1xuICAgICAgICBpZDogJ3Rlc3RUZXh0JyxcbiAgICAgICAgZW50cnlJZDogJzEyMycsXG4gICAgICAgIGVycm9yOiAndG9wLWxldmVsIGVycm9yIG1lc3NhZ2UnXG4gICAgICB9XTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkVmFsaWRhdGlvbkNvbnRleHRQcm92aWRlciBlbnRyeUlkPXtDVVNUT01fRU5UUlkuaWR9IHRvcExldmVsRXJyb3JzPXtUT1BfTEVWRUxfRVJST1JTfSA+XG4gICAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtDVVNUT01fRU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogUEFHRVMgfX0gLz5cbiAgICAgICAgPC9TdW1tYXJ5Q2FyZFZhbGlkYXRpb25Db250ZXh0UHJvdmlkZXI+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDEpO1xuXG4gICAgICAvLyBTaG93cyBlZGl0IGJ1dHRvbiBidXQgbm8gcXVpY2sgZWRpdFxuICAgICAgY29uc3QgZWRpdEJ1dHRvbiA9IGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlblswXTtcbiAgICAgIGV4cGVjdChlZGl0QnV0dG9uLnRhZ05hbWUpLnRvRXF1YWwoJ0JVVFRPTicpO1xuICAgICAgZXhwZWN0KGVkaXRCdXR0b24udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1F1aWNrIEVkaXQnKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzLmxlbmd0aCkudG9FcXVhbCgyKTsgLy8gUXVpY2sgZWRpdCBoaWRkZW5cblxuICAgICAgLy8gc2hvd3MgcXVpY2tlZGl0IG9uY2UgY2xpY2tlZFxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGVkaXRCdXR0b24sIHt9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzLmxlbmd0aCkudG9FcXVhbCgzKTsgLy8gUXVpY2sgZWRpdCBzaG93blxuICAgICAgY29uc3QgcXVpY2tFZGl0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcbiAgICAgIGV4cGVjdChxdWlja0VkaXQudGV4dENvbnRlbnQpLnRvQ29udGFpbignVGVzdCB0ZXh0Jyk7XG5cbiAgICAgIC8vIHF1aWNrIGVkaXQgaXMgc2hvd2luZyB0b3AtbGV2ZWwgZXJyb3JcbiAgICAgIGNvbnN0IGVycm9yU3VtbWFyeSA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzBdO1xuICAgICAgZXhwZWN0KGVycm9yU3VtbWFyeS50ZXh0Q29udGVudCkudG9Db250YWluKFRPUF9MRVZFTF9FUlJPUlNbMF0uZXJyb3IpO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG9ubHkgc2hvdyBlcnJvcnMgZnJvbSB2YWxpZGF0aW9uIHdoZW4gaXQgaGFwcGVucywgaWdub3JpbmcgdG9wLWxldmVsIGVycm9ycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IFRPUF9MRVZFTF9FUlJPUlMgPSBbe1xuICAgICAgICBpZDogJ3Rlc3RUZXh0JyxcbiAgICAgICAgZW50cnlJZDogJzEyMycsXG4gICAgICAgIGVycm9yOiAndG9wLWxldmVsIGVycm9yIG1lc3NhZ2UnXG4gICAgICB9XTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkVmFsaWRhdGlvbkNvbnRleHRQcm92aWRlciBlbnRyeUlkPXtDVVNUT01fRU5UUlkuaWR9IHRvcExldmVsRXJyb3JzPXtUT1BfTEVWRUxfRVJST1JTfSA+XG4gICAgICAgICAgPFN1bW1hcnlDYXJkIFxuICAgICAgICAgICAgaWQ9e0lEfSBcbiAgICAgICAgICAgIGVudHJ5RGF0YT17Q1VTVE9NX0VOVFJZfSBcbiAgICAgICAgICAgIGNvbmZpZz17Q09ORklHfSBcbiAgICAgICAgICAgIHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIFxuICAgICAgICAgICAgZm9ybURhdGE9e3t9fSBcbiAgICAgICAgICAgIG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogUEFHRVMgfX0gXG4gICAgICAgICAgICBvblF1aWNrRWRpdD17KCkgPT4ge319XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9TdW1tYXJ5Q2FyZFZhbGlkYXRpb25Db250ZXh0UHJvdmlkZXI+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDEpO1xuXG4gICAgICAvLyBTaG93cyBlZGl0IGJ1dHRvbiBidXQgbm8gcXVpY2sgZWRpdFxuICAgICAgY29uc3QgZWRpdEJ1dHRvbiA9IGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlblswXTtcbiAgICAgIGV4cGVjdChlZGl0QnV0dG9uLnRhZ05hbWUpLnRvRXF1YWwoJ0JVVFRPTicpO1xuICAgICAgZXhwZWN0KGVkaXRCdXR0b24udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1F1aWNrIEVkaXQnKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzLmxlbmd0aCkudG9FcXVhbCgyKTsgLy8gUXVpY2sgZWRpdCBoaWRkZW5cblxuICAgICAgLy8gc2hvd3MgcXVpY2tlZGl0IG9uY2UgY2xpY2tlZFxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGVkaXRCdXR0b24sIHt9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzLmxlbmd0aCkudG9FcXVhbCgzKTsgLy8gUXVpY2sgZWRpdCBzaG93blxuICAgICAgY29uc3QgcXVpY2tFZGl0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcbiAgICAgIGV4cGVjdChxdWlja0VkaXQudGV4dENvbnRlbnQpLnRvQ29udGFpbignVGVzdCB0ZXh0Jyk7XG5cbiAgICAgIC8vIHF1aWNrIGVkaXQgaXMgaW5pdGlhbGx5IHNob3dpbmcgdG9wLWxldmVsIGVycm9yXG4gICAgICBjb25zdCBlcnJvclN1bW1hcnkgPSBxdWlja0VkaXQuY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChlcnJvclN1bW1hcnkudGV4dENvbnRlbnQpLnRvQ29udGFpbihUT1BfTEVWRUxfRVJST1JTWzBdLmVycm9yKTtcblxuICAgICAgLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVxdWlyZWQgdGV4dCBjb21wb25lbnRcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzJdO1xuICAgICAgY29uc3QgY29tcG9uZW50SW5wdXQgPSBjb21wb25lbnQuY2hpbGROb2Rlc1szXTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIGZpcmVFdmVudC5jaGFuZ2UoY29tcG9uZW50SW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnJyB9IH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGNsaWNrICdzYXZlJyB0byB0cmlnZ2VyIHZhbGlkYXRpb24sIHdoaWNoIHdpbGwgZmFpbCBhcyB0aGUgY29tcG9uZW50XG4gICAgICAvLyBjbGVhcmVkIGFib3ZlIGlzIG1hcmtlZCBhcyAncmVxdWlyZWQnLlxuICAgICAgY29uc3QgcXVpY2tFZGl0QnV0dG9ucyA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzNdO1xuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IHF1aWNrRWRpdEJ1dHRvbnMuY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChzYXZlQnV0dG9uLnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1NhdmUnKTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIGZpcmVFdmVudC5jbGljayhzYXZlQnV0dG9uLCB7fSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gcXVpY2sgZWRpdCBzaG91bGQgbm93IGJlIHNob3dpbmcgdGhlIGVycm9ycyBmcm9tIHZhbGlkYXRpb25cbiAgICAgIGV4cGVjdChlcnJvclN1bW1hcnkudGV4dENvbnRlbnQpLnRvQ29udGFpbignQ3VzdG9tIGVycm9yIG1lc3NhZ2UnKTtcbiAgICAgIFxuICAgIH0pO1xuXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdRdWljayBFZGl0IHNhdmUgY2hhbmdlcycsICgpID0+IHtcbiAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICBxdWlja0VkaXQ6IHt9XG4gICAgfTtcblxuICAgIGNvbnN0IFBBR0VTID0gW1xuICAgICAge1xuICAgICAgICBpZDogJ3BhcmVudFBhZ2UnLFxuICAgICAgICBuYW1lOiAncGFyZW50UGFnZScsXG4gICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ3Rlc3RUZXh0JyxcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIGxhYmVsOiAnVGVzdCB0ZXh0JyxcbiAgICAgICAgICAgIGZpZWxkSWQ6ICd0ZXN0VGV4dCcsXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIHVzZTogJ3Rlc3RUZXh0JyxcbiAgICAgICAgICAgIGN5YV9sYWJlbDogJ1Rlc3QgdGV4dCcsXG4gICAgICAgICAgICBmdWxsX3BhdGg6ICd0ZXN0VGV4dCcsXG4gICAgICAgICAgICBcImFkZGl0aW9uYWxWYWxpZGF0aW9uXCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIjogXCJtdXN0QmVMb25nZXJUaGFuXCIsXG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiAzLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdlcnJvcidcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHN1bW1hcnlRdWlja0VkaXQ6IFtcbiAgICAgICAgICBcInRlc3RUZXh0XCJcbiAgICAgICAgXSxcbiAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICBwYXJlbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnMTY5NTAzNzU3OTE1MCcsXG4gICAgICAgICAgICAgIHRlc3RUZXh0OiAndGVzdGVyJyxcbiAgICAgICAgICAgICAgdGVzdFRleHQyOiAndGVzdCB0ZXN0JyxcbiAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG5cblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBQQUdFUyB9fSAvPlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgaGVhZGVyQWN0aW9uRGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgICBleHBlY3QoaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuLmxlbmd0aCkudG9FcXVhbCgxKTtcblxuICAgICAgLy8gU2hvd3MgZWRpdCBidXR0b24gYnV0IG5vIHF1aWNrIGVkaXRcbiAgICAgIGNvbnN0IGVkaXRCdXR0b24gPSBoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW5bMF07XG4gICAgICBleHBlY3QoZWRpdEJ1dHRvbi50YWdOYW1lKS50b0VxdWFsKCdCVVRUT04nKTtcbiAgICAgIGV4cGVjdChlZGl0QnV0dG9uLnRleHRDb250ZW50KS50b0VxdWFsKCdRdWljayBFZGl0Jyk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvRXF1YWwoMik7IC8vIFF1aWNrIGVkaXQgaGlkZGVuXG5cbiAgICAgIC8vIHNob3dzIHF1aWNrZWRpdCBvbmNlIGNsaWNrZWRcbiAgICAgIGZpcmVFdmVudC5jbGljayhlZGl0QnV0dG9uLCB7fSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvRXF1YWwoMyk7IC8vIFF1aWNrIGVkaXQgc2hvd25cbiAgICAgIGNvbnN0IHF1aWNrRWRpdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG4gICAgICBleHBlY3QocXVpY2tFZGl0LnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1Rlc3QgdGV4dCcpO1xuXG4gICAgICAvLyBxdWljayBlZGl0IGhhcyBwcm9wZXIgYnV0dG9uc1xuICAgICAgY29uc3QgcXVpY2tFZGl0QnV0dG9ucyA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzJdO1xuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IHF1aWNrRWRpdEJ1dHRvbnMuY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IHF1aWNrRWRpdEJ1dHRvbnMuY2hpbGROb2Rlc1sxXTtcbiAgICAgIGV4cGVjdChzYXZlQnV0dG9uLnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1NhdmUnKTtcbiAgICAgIGV4cGVjdChjYW5jZWxCdXR0b24udGV4dENvbnRlbnQpLnRvQ29udGFpbignQ2FuY2VsJyk7XG5cbiAgICAgIC8vIGhpZGVzIHF1aWNrIGVkaXQgYWdhaW4gYWRmdGVyIGNsaWNraW5nIGNhbmNlbFxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGNhbmNlbEJ1dHRvbiwge30pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMubGVuZ3RoKS50b0VxdWFsKDIpOyAvLyBRdWljayBlZGl0IGhpZGRlblxuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIG5vdCB2YWxpZGF0ZSBvciBzYXZlIGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IGhvb2tzID0ge1xuICAgICAgICBvblN1Ym1pdDogKHR5cGUsIHBhdGNoKSA9PiBPTl9TVUJNSVRfQ0FMTFMucHVzaChwYXRjaCksXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e0NPTkZJR30gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudHMnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBQQUdFUyB9fSAvPixcbiAgICAgICAgeyBob29rcyB9XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcblxuICAgICAgLy8gU2hvd3MgZWRpdCBidXR0b24gYnV0IG5vIHF1aWNrIGVkaXRcbiAgICAgIGNvbnN0IGVkaXRCdXR0b24gPSBoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW5bMF07XG5cbiAgICAgIC8vIHNob3dzIHF1aWNrZWRpdCBvbmNlIGNsaWNrZWRcbiAgICAgIGZpcmVFdmVudC5jbGljayhlZGl0QnV0dG9uLCB7fSk7XG4gICAgICBjb25zdCBxdWlja0VkaXQgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdO1xuXG4gICAgICBjb25zdCBxdWlja0VkaXRCdXR0b25zID0gcXVpY2tFZGl0LmNoaWxkTm9kZXNbMl07XG4gICAgICBjb25zdCBzYXZlQnV0dG9uID0gcXVpY2tFZGl0QnV0dG9ucy5jaGlsZE5vZGVzWzBdO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKHNhdmVCdXR0b24sIHt9KTtcbiAgICAgIGV4cGVjdChPTl9TVUJNSVRfQ0FMTFMubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYWZ0ZXIgbG9jYWwgdmFsaWRhdGlvbiBpZiBlcnJvcnMgYXJlIHByZXNlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IGhvb2tzID0ge1xuICAgICAgICBvblN1Ym1pdDogKHR5cGUsIHBhdGNoKSA9PiBPTl9TVUJNSVRfQ0FMTFMucHVzaChwYXRjaCksXG4gICAgICB9O1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVCA9ICh7IHRhcmdldCB9KSA9PiB7XG4gICAgICAgIE9OX1FVSUNLX0VESVRfQ0FMTFMucHVzaCh0YXJnZXQpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkXG4gICAgICAgICAgaWQ9e0lEfVxuICAgICAgICAgIGVudHJ5RGF0YT17eyAuLi5FTlRSWSwgaW5kZXg6IDAgfX1cbiAgICAgICAgICBjb25maWc9e0NPTkZJR31cbiAgICAgICAgICBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50cydcbiAgICAgICAgICBvblF1aWNrRWRpdD17T05fUVVJQ0tfRURJVH1cbiAgICAgICAgICBmb3JtRGF0YT17eyBwYXJlbnRzOiBbeyB0ZXN0VGV4dDogJ2hlbGxvJyB9XSB9fVxuICAgICAgICAgIG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogUEFHRVMgfX1cbiAgICAgICAgLz4sXG4gICAgICAgIHsgaG9va3MgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgaGVhZGVyQWN0aW9uRGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG5cbiAgICAgIGNvbnN0IGVkaXRCdXR0b24gPSBoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW5bMF07XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZWRpdEJ1dHRvbiwge30pO1xuICAgICAgY29uc3QgcXVpY2tFZGl0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcblxuICAgICAgY29uc3QgY29tcG9uZW50ID0gcXVpY2tFZGl0LmNoaWxkTm9kZXNbMV07XG4gICAgICBjb25zdCBjb21wb25lbnRJbnB1dCA9IGNvbXBvbmVudC5jaGlsZE5vZGVzWzJdO1xuICAgICAgY29uc3QgcXVpY2tFZGl0QnV0dG9ucyA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzJdO1xuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IHF1aWNrRWRpdEJ1dHRvbnMuY2hpbGROb2Rlc1swXTtcbiAgICAgIC8vIEZpZWxkIGhhcyB2YWxpZGF0aW9uIHRvIGZvcmNlIHRoZSBsZW5ndGggb2YgdGhpcyBmaWVsZCB0byBiZSBncmVhdGVyIHRoYW4gMiBzbyB0aGlzIHNob3VsZCBmYWlsXG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICBmaXJlRXZlbnQuY2hhbmdlKGNvbXBvbmVudElucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJ2EnIH0gfSk7XG4gICAgICB9KVxuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgZmlyZUV2ZW50LmNsaWNrKHNhdmVCdXR0b24sIHt9KTtcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgICBleHBlY3QoT05fUVVJQ0tfRURJVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJ1biBob29rIHZhbGlkYXRpb24gd2hlbiBsb2NhbCB2YWxpZGF0aW9uIGlzIHBhc3NlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgaG9va3MgPSB7XG4gICAgICAgIG9uU3VibWl0OiAodHlwZSwgcGF0Y2gsIG5vdFJlcXVpcmVkLCBvbkVycm9yKSA9PiB7XG4gICAgICAgICAgT05fU1VCTUlUX0NBTExTLnB1c2gocGF0Y2gpO1xuICAgICAgICAgIG9uRXJyb3IoW3sgZXJyb3I6ICdtZXNzYWdlJywgaWQ6ICcwJyB9XSk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVCA9ICh7IHRhcmdldCB9KSA9PiB7XG4gICAgICAgIE9OX1FVSUNLX0VESVRfQ0FMTFMucHVzaCh0YXJnZXQpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkXG4gICAgICAgICAgaWQ9e0lEfVxuICAgICAgICAgIGVudHJ5RGF0YT17RU5UUll9XG4gICAgICAgICAgY29uZmlnPXtDT05GSUd9XG4gICAgICAgICAgcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudHMnXG4gICAgICAgICAgb25RdWlja0VkaXQ9e09OX1FVSUNLX0VESVR9XG4gICAgICAgICAgZm9ybURhdGE9e3sgcGFyZW50czogW3sgYWxyZWFkeVByb3ZpZGVkRmllbGQ6ICdoZWxsbycgfV0gfX1cbiAgICAgICAgICBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFBBR0VTIH19XG4gICAgICAgIC8+LFxuICAgICAgICB7IGhvb2tzIH1cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuXG4gICAgICBjb25zdCBlZGl0QnV0dG9uID0gaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuWzBdO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGVkaXRCdXR0b24sIHt9KTtcbiAgICAgIGNvbnN0IHF1aWNrRWRpdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG5cbiAgICAgIC8vIE1ha2UgYSBjaGFuZ2VcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzFdO1xuICAgICAgY29uc3QgY29tcG9uZW50SW5wdXQgPSBjb21wb25lbnQuY2hpbGROb2Rlc1syXTtcbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoY29tcG9uZW50SW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnbmV3IHZhbHVlJyB9IH0pO1xuXG4gICAgICBjb25zdCBxdWlja0VkaXRCdXR0b25zID0gcXVpY2tFZGl0LmNoaWxkTm9kZXNbMl07XG4gICAgICBjb25zdCBzYXZlQnV0dG9uID0gcXVpY2tFZGl0QnV0dG9ucy5jaGlsZE5vZGVzWzBdO1xuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgZmlyZUV2ZW50LmNsaWNrKHNhdmVCdXR0b24sIHt9KTtcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMU1swXSkudG9NYXRjaE9iamVjdCh7IHRlc3RUZXh0OiAnbmV3IHZhbHVlJyB9KTtcbiAgICAgIGV4cGVjdChPTl9RVUlDS19FRElUX0NBTExTLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYXBwbHkgY2hhbmdlcyBpZiBubyBlcnJvcnMgYXJlIHByZXNlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IGhvb2tzID0ge1xuICAgICAgICBvblN1Ym1pdDogKHR5cGUsIHBhdGNoKSA9PiBPTl9TVUJNSVRfQ0FMTFMucHVzaChwYXRjaCksXG4gICAgICB9O1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVCA9ICh7IHRhcmdldCB9KSA9PiB7XG4gICAgICAgIE9OX1FVSUNLX0VESVRfQ0FMTFMucHVzaCh0YXJnZXQpO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmRWYWxpZGF0aW9uQ29udGV4dFByb3ZpZGVyXG4gICAgICAgICAgZW50cnlJZD0naWQnXG4gICAgICAgICAgdG9wTGV2ZWxFcnJvcnM9e1tdfVxuICAgICAgICAgIGNsZWFyVG9wTGV2ZWxFcnJvcnNGb3JDYXJkPSB7KCkgPT4ge319XG4gICAgICAgID5cbiAgICAgICAgICA8U3VtbWFyeUNhcmRcbiAgICAgICAgICAgIGlkPXtJRH1cbiAgICAgICAgICAgIGVudHJ5RGF0YT17eyBpbmRleDogMCwgaWQ6ICcwJyB9fVxuICAgICAgICAgICAgY29uZmlnPXtDT05GSUd9XG4gICAgICAgICAgICBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50cydcbiAgICAgICAgICAgIG9uUXVpY2tFZGl0PXtPTl9RVUlDS19FRElUfVxuICAgICAgICAgICAgZm9ybURhdGE9e3sgcGFyZW50czogW3sgYWxyZWFkeVByb3ZpZGVkRmllbGQ6ICdoZWxsbycgfV0gfX1cbiAgICAgICAgICAgIG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogUEFHRVMgfX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1N1bW1hcnlDYXJkVmFsaWRhdGlvbkNvbnRleHRQcm92aWRlcj5cbiAgICAgICAgLFxuICAgICAgICB7IGhvb2tzIH1cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuXG4gICAgICBjb25zdCBlZGl0QnV0dG9uID0gaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuWzBdO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGVkaXRCdXR0b24sIHt9KTtcbiAgICAgIGNvbnN0IHF1aWNrRWRpdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG5cbiAgICAgIC8vIE1ha2UgYSBjaGFuZ2UgdGhhdCB3aWxsIGJlIGFjY2VwdGVkXG4gICAgICBjb25zdCBjb21wb25lbnQgPSBxdWlja0VkaXQuY2hpbGROb2Rlc1sxXTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudElucHV0ID0gY29tcG9uZW50LmNoaWxkTm9kZXNbMl07XG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGNvbXBvbmVudElucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJ25ldyB2YWx1ZScgfSB9KTtcbiAgICAgIGNvbnN0IHF1aWNrRWRpdEJ1dHRvbnMgPSBxdWlja0VkaXQuY2hpbGROb2Rlc1syXTtcbiAgICAgIGNvbnN0IHNhdmVCdXR0b24gPSBxdWlja0VkaXRCdXR0b25zLmNoaWxkTm9kZXNbMF07XG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICBmaXJlRXZlbnQuY2xpY2soc2F2ZUJ1dHRvbiwge30pO1xuICAgICAgfSk7XG4gICAgICBleHBlY3QoT05fUVVJQ0tfRURJVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3QoT05fUVVJQ0tfRURJVF9DQUxMU1swXS52YWx1ZVswXSkudG9FcXVhbCh7IGFscmVhZHlQcm92aWRlZEZpZWxkOiAnaGVsbG8nLCB0ZXN0VGV4dDogJ25ldyB2YWx1ZScgfSk7ICBcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVtb3ZlIHRoZSBpc0R1cGxpY2F0ZSBmbGFnIG9uIGEgc3VjZXNzZnVsIHF1aWNrIGVkaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IGhvb2tzID0ge1xuICAgICAgICBvblN1Ym1pdDogKHR5cGUsIHBhdGNoKSA9PiBPTl9TVUJNSVRfQ0FMTFMucHVzaChwYXRjaCksXG4gICAgICB9O1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVCA9ICh7IHRhcmdldCB9KSA9PiB7XG4gICAgICAgIE9OX1FVSUNLX0VESVRfQ0FMTFMucHVzaCh0YXJnZXQpO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmRWYWxpZGF0aW9uQ29udGV4dFByb3ZpZGVyXG4gICAgICAgICAgZW50cnlJZD0naWQnXG4gICAgICAgICAgdG9wTGV2ZWxFcnJvcnM9e1tdfVxuICAgICAgICAgIGNsZWFyVG9wTGV2ZWxFcnJvcnNGb3JDYXJkPXsoKSA9PiB7IH19XG4gICAgICAgID5cbiAgICAgICAgICA8U3VtbWFyeUNhcmRcbiAgICAgICAgICAgIGlkPXtJRH1cbiAgICAgICAgICAgIGVudHJ5RGF0YT17eyBpbmRleDogMCwgaWQ6ICcwJywgaXNEdXBsaWNhdGU6IHRydWUgfX1cbiAgICAgICAgICAgIGNvbmZpZz17Q09ORklHfVxuICAgICAgICAgICAgcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudHMnXG4gICAgICAgICAgICBvblF1aWNrRWRpdD17T05fUVVJQ0tfRURJVH1cbiAgICAgICAgICAgIGZvcm1EYXRhPXt7IHBhcmVudHM6IFt7IGFscmVhZHlQcm92aWRlZEZpZWxkOiAnaGVsbG8nIH1dIH19XG4gICAgICAgICAgICBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFBBR0VTIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9TdW1tYXJ5Q2FyZFZhbGlkYXRpb25Db250ZXh0UHJvdmlkZXI+LFxuICAgICAgICB7IGhvb2tzIH1cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuXG4gICAgICBjb25zdCBlZGl0QnV0dG9uID0gaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuWzBdO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGVkaXRCdXR0b24sIHt9KTtcbiAgICAgIGNvbnN0IHF1aWNrRWRpdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG5cbiAgICAgIC8vIE1ha2UgYSBjaGFuZ2UgdGhhdCB3aWxsIGJlIGFjY2VwdGVkXG4gICAgICBjb25zdCBjb21wb25lbnQgPSBxdWlja0VkaXQuY2hpbGROb2Rlc1sxXTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudElucHV0ID0gY29tcG9uZW50LmNoaWxkTm9kZXNbMl07XG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGNvbXBvbmVudElucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJ25ldyB2YWx1ZScgfSB9KTtcbiAgICAgIGNvbnN0IHF1aWNrRWRpdEJ1dHRvbnMgPSBxdWlja0VkaXQuY2hpbGROb2Rlc1syXTtcbiAgICAgIGNvbnN0IHNhdmVCdXR0b24gPSBxdWlja0VkaXRCdXR0b25zLmNoaWxkTm9kZXNbMF07XG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICBmaXJlRXZlbnQuY2xpY2soc2F2ZUJ1dHRvbiwge30pO1xuICAgICAgfSk7XG4gICAgICBleHBlY3QoT05fUVVJQ0tfRURJVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICAvLyBpc0R1cGxpY2F0ZSBmbGFnIHNob3VsZCBub3QgYmUgcHJlc2VudC5cbiAgICAgIGV4cGVjdChPTl9RVUlDS19FRElUX0NBTExTWzBdLnZhbHVlWzBdKS50b0VxdWFsKHsgXG4gICAgICAgIGFscmVhZHlQcm92aWRlZEZpZWxkOiAnaGVsbG8nLCBcbiAgICAgICAgdGVzdFRleHQ6ICduZXcgdmFsdWUnIFxuICAgICAgfSk7ICBcbiAgICB9KTtcblxuICB9KTtcbiAgZGVzY3JpYmUoJ0RldGFpbHMgcHJvcCBiZWhhdmlvcicsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIHRoZSBwcm92aWRlZCBkZXRhaWxzJywgKCkgPT4ge1xuICAgICAgY29uc3QgREVUQUlMUyA9ICdTYW1wbGUgZGV0YWlscyc7XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIHRpdGxlOiAnVGl0bGUnLFxuICAgICAgICBkZXRhaWxzOiBERVRBSUxTXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e0NPTkZJR30gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgcGFnZXM9e1tdfSBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckNvbnRlbnREaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGhlYWRlckRldGFpbHMgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzFdO1xuICAgICAgZXhwZWN0KGhlYWRlckRldGFpbHMudGFnTmFtZSkudG9FcXVhbCgnRElWJyk7XG4gICAgICBleHBlY3QoaGVhZGVyRGV0YWlscy5jbGFzc0xpc3QpLnRvQ29udGFpbihjbGFzc2VzKCdoZWFkZXItY29udGVudC1kZXRhaWwnKSk7XG4gICAgICBleHBlY3QoaGVhZGVyRGV0YWlscy50ZXh0Q29udGVudCkudG9FcXVhbChERVRBSUxTKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNvbmRpdGlvbmFsIGRldGFpbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIHRpdGxlOiAnVGl0bGUnLFxuICAgICAgICBkZXRhaWxzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogJ0RldGFpbHMgQScsXG4gICAgICAgICAgICBzaG93X3doZW46IFt7IFxuICAgICAgICAgICAgICBmaWVsZDogJ2ZpZWxkJyxcbiAgICAgICAgICAgICAgb3A6ICchPScsXG4gICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogJ0RldGFpbHMgQicsXG4gICAgICAgICAgICBzaG93X3doZW46IFt7IFxuICAgICAgICAgICAgICBmaWVsZDogJ2ZpZWxkJyxcbiAgICAgICAgICAgICAgb3A6ICc9JyxcbiAgICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e3sgLi4uRU5UUlksIGZpZWxkOiB0cnVlIH19IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBwYWdlcz17W119IGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgaGVhZGVyQ29udGVudERpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgY29uc3QgaGVhZGVyRGV0YWlscyA9IGhlYWRlckNvbnRlbnREaXYuY2hpbGRyZW5bMV07XG4gICAgICBleHBlY3QoaGVhZGVyRGV0YWlscy50YWdOYW1lKS50b0VxdWFsKCdESVYnKTtcbiAgICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlci1jb250ZW50LWRldGFpbCcpKTtcbiAgICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLnRleHRDb250ZW50KS50b0VxdWFsKCdEZXRhaWxzIEInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciBkZXRhaWxzIHdoZW4gdGhleSBhcmUgZW1wdHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIHRpdGxlOiAnVGl0bGUnLFxuICAgICAgICBkZXRhaWxzOiAnJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIHBhZ2VzPXtbXX0gZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJDb250ZW50RGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgICAvLyBJZiBubyBkZXRhaWxzIGFyZSBwcm92aWRlZCwgd2UgZXhwZWN0IG9ubHkgdGhlIGhlYWRlciB0aXRsZSB0byBiZSByZW5kZXJlZC5cbiAgICAgIGV4cGVjdChoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgIGNvbnN0IGhlYWRlclRpdGxlID0gaGVhZGVyQ29udGVudERpdi5jaGlsZHJlblswXTtcbiAgICAgIGV4cGVjdChoZWFkZXJUaXRsZS5jbGFzc0xpc3QpLnRvQ29udGFpbihjbGFzc2VzKCdoZWFkZXItY29udGVudC10aXRsZScpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIHRoZSBpbnRlcnBvbGF0ZWQgZGV0YWlscycsICgpID0+IHtcbiAgICAgIGNvbnN0IERFVEFJTFMgPSAnRnVsbCB7bGFiZWx9JztcbiAgICAgIGNvbnN0IElOVEVSUE9MQVRFRF9FTlRSWSA9IHtcbiAgICAgICAgLi4uRU5UUlksXG4gICAgICAgIGxhYmVsOiAnRGV0YWlscydcbiAgICAgIH07XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIHRpdGxlOiAnVGl0bGUnLFxuICAgICAgICBkZXRhaWxzOiBERVRBSUxTXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0lOVEVSUE9MQVRFRF9FTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIHBhZ2VzPXtbXX0gZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJDb250ZW50RGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgICBjb25zdCBoZWFkZXJEZXRhaWxzID0gaGVhZGVyQ29udGVudERpdi5jaGlsZHJlblsxXTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkSW50ZXJwb2xhdGVkU3RyaW5nID0gVXRpbHMuaW50ZXJwb2xhdGVTdHJpbmcoREVUQUlMUywgSU5URVJQT0xBVEVEX0VOVFJZKTtcbiAgICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLnRleHRDb250ZW50KS50b0VxdWFsKGV4cGVjdGVkSW50ZXJwb2xhdGVkU3RyaW5nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciB0aGUgZGV0YWlscyBkaXYgaWYgY29uZmlnLmRldGFpbHMgaXMgbm90IHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgQ09ORklHID0ge1xuICAgICAgICB0aXRsZTogJ1RpdGxlJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIHBhZ2VzPXtbXX0gZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJDb250ZW50RGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgICBjb25zdCBoZWFkZXJEZXRhaWxzID0gaGVhZGVyQ29udGVudERpdi5xdWVyeVNlbGVjdG9yKGAjJHtJRH0udGl0bGVEZXRhaWxgKTtcbiAgICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzKS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHRoZSBlbnRpcmUgZGV0YWlscyBzZWN0aW9uIHdoZW4gaGlkZURldGFpbHMgcHJvcCBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgREVUQUlMUyA9ICdTYW1wbGUgZGV0YWlscyB0aGF0IHNob3VsZCBub3QgYmUgZGlzcGxheWVkJztcbiAgICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgICAgdGl0bGU6ICdUaXRsZScsXG4gICAgICAgIGRldGFpbHM6IERFVEFJTFNcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBwYWdlcz17W119IGZvcm1EYXRhPXt7fX0gaGlkZURldGFpbHMgbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICAgKTtcblxuICAgICAgY29uc3QgZGV0YWlsc0NvbXBvbmVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuZGV0YWlscycpO1xuICAgICAgZXhwZWN0KGRldGFpbHNDb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbn0pO1xuIl0sIm1hcHBpbmdzIjoiOztBQUNBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBQSxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsbUJBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQUdBLElBQUFLLFdBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFlBQUEsR0FBQUMsdUJBQUEsQ0FBQVAsT0FBQTtBQU1BLElBQUFRLFlBQUEsR0FB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