@po-ui/ng-templates 6.0.0-rc.1 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/README.md +18 -18
  2. package/esm2020/lib/components/components.module.mjs +86 -86
  3. package/esm2020/lib/components/index.mjs +12 -12
  4. package/esm2020/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-modal-content.enum.mjs +17 -17
  5. package/esm2020/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-type.enum.mjs +17 -17
  6. package/esm2020/lib/components/po-modal-password-recovery/index.mjs +8 -8
  7. package/esm2020/lib/components/po-modal-password-recovery/interfaces/po-modal-password-recovery.interface.mjs +2 -2
  8. package/esm2020/lib/components/po-modal-password-recovery/literals/i18n/po-modal-password-recovery-literals.mjs +119 -119
  9. package/esm2020/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.mjs +172 -172
  10. package/esm2020/lib/components/po-modal-password-recovery/po-modal-password-recovery-error-message/po-modal-password-recovery-error-message.component.mjs +31 -31
  11. package/esm2020/lib/components/po-modal-password-recovery/po-modal-password-recovery.component.mjs +451 -451
  12. package/esm2020/lib/components/po-modal-password-recovery/po-modal-password-recovery.module.mjs +29 -29
  13. package/esm2020/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.mjs +17 -17
  14. package/esm2020/lib/components/po-page-background/index.mjs +3 -3
  15. package/esm2020/lib/components/po-page-background/po-page-background.component.mjs +191 -191
  16. package/esm2020/lib/components/po-page-background/po-page-background.module.mjs +27 -27
  17. package/esm2020/lib/components/po-page-blocked-user/enums/po-page-blocked-user-reason.enum.mjs +17 -17
  18. package/esm2020/lib/components/po-page-blocked-user/index.mjs +8 -8
  19. package/esm2020/lib/components/po-page-blocked-user/interfaces/po-page-blocked-user-reason-params.interface.mjs +2 -2
  20. package/esm2020/lib/components/po-page-blocked-user/literals/i18n/po-page-blocked-user-literals.mjs +78 -78
  21. package/esm2020/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.mjs +170 -170
  22. package/esm2020/lib/components/po-page-blocked-user/po-page-blocked-user-contacts/po-page-blocked-user-contacts.component.mjs +109 -109
  23. package/esm2020/lib/components/po-page-blocked-user/po-page-blocked-user-reason/po-page-blocked-user-reason.component.mjs +104 -104
  24. package/esm2020/lib/components/po-page-blocked-user/po-page-blocked-user.component.mjs +112 -112
  25. package/esm2020/lib/components/po-page-blocked-user/po-page-blocked-user.module.mjs +29 -29
  26. package/esm2020/lib/components/po-page-change-password/index.mjs +7 -7
  27. package/esm2020/lib/components/po-page-change-password/interfaces/po-page-change-password-recovery.interface.mjs +2 -2
  28. package/esm2020/lib/components/po-page-change-password/interfaces/po-page-change-password-requirement.interface.mjs +2 -2
  29. package/esm2020/lib/components/po-page-change-password/interfaces/po-page-change-password.interface.mjs +2 -2
  30. package/esm2020/lib/components/po-page-change-password/literals/i18n/po-page-change-password-literals.mjs +79 -79
  31. package/esm2020/lib/components/po-page-change-password/po-page-change-password-base.component.mjs +186 -186
  32. package/esm2020/lib/components/po-page-change-password/po-page-change-password.component.mjs +423 -423
  33. package/esm2020/lib/components/po-page-change-password/po-page-change-password.module.mjs +30 -30
  34. package/esm2020/lib/components/po-page-change-password/po-page-change-password.service.mjs +17 -17
  35. package/esm2020/lib/components/po-page-dynamic-detail/index.mjs +10 -10
  36. package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-actions.interface.mjs +2 -2
  37. package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-back.interface.mjs +2 -2
  38. package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-edit.interface.mjs +2 -2
  39. package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-remove.interface.mjs +2 -2
  40. package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-field.interface.mjs +2 -2
  41. package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-metadata.interface.mjs +2 -2
  42. package/esm2020/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-options.interface.mjs +2 -2
  43. package/esm2020/lib/components/po-page-dynamic-detail/po-page-dynamic-detail-actions.service.mjs +43 -43
  44. package/esm2020/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.component.mjs +462 -462
  45. package/esm2020/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.module.mjs +53 -53
  46. package/esm2020/lib/components/po-page-dynamic-edit/index.mjs +10 -10
  47. package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-actions.interface.mjs +2 -2
  48. package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-cancel.interface.mjs +2 -2
  49. package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save-new.interface.mjs +2 -2
  50. package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save.interface.mjs +2 -2
  51. package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-field.interface.mjs +2 -2
  52. package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-metadata.interface.mjs +2 -2
  53. package/esm2020/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-options.interface.mjs +2 -2
  54. package/esm2020/lib/components/po-page-dynamic-edit/po-page-dynamic-edit-actions.service.mjs +43 -43
  55. package/esm2020/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.component.mjs +572 -572
  56. package/esm2020/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.module.mjs +59 -59
  57. package/esm2020/lib/components/po-page-dynamic-search/index.mjs +7 -7
  58. package/esm2020/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.mjs +134 -134
  59. package/esm2020/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-literals.interface.mjs +2 -2
  60. package/esm2020/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter.component.mjs +74 -74
  61. package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.mjs +260 -252
  62. package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search-filters.interface.mjs +2 -2
  63. package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search-literals.interface.mjs +2 -2
  64. package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search-options.interface.mjs +2 -2
  65. package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.mjs +267 -267
  66. package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search.interface.mjs +2 -2
  67. package/esm2020/lib/components/po-page-dynamic-search/po-page-dynamic-search.module.mjs +54 -54
  68. package/esm2020/lib/components/po-page-dynamic-table/index.mjs +16 -16
  69. package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-actions.interface.mjs +2 -2
  70. package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-detail.interface.mjs +2 -2
  71. package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-duplicate.interface.mjs +2 -2
  72. package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-edit.interface.mjs +2 -2
  73. package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-new.interface.mjs +2 -2
  74. package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove-all.interface.mjs +2 -2
  75. package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove.interface.mjs +2 -2
  76. package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.mjs +2 -2
  77. package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.mjs +2 -2
  78. package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-field.interface.mjs +2 -2
  79. package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-filters.interface.mjs +2 -2
  80. package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-metadata.interface.mjs +2 -2
  81. package/esm2020/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-options.interface.mjs +2 -2
  82. package/esm2020/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.mjs +104 -104
  83. package/esm2020/lib/components/po-page-dynamic-table/po-page-dynamic-table-actions.service.mjs +58 -58
  84. package/esm2020/lib/components/po-page-dynamic-table/po-page-dynamic-table-literals.mjs +63 -63
  85. package/esm2020/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.mjs +831 -803
  86. package/esm2020/lib/components/po-page-dynamic-table/po-page-dynamic-table.module.mjs +52 -52
  87. package/esm2020/lib/components/po-page-job-scheduler/index.mjs +4 -4
  88. package/esm2020/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler-internal.interface.mjs +2 -2
  89. package/esm2020/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler.interface.mjs +2 -2
  90. package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.mjs +80 -80
  91. package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.mjs +374 -374
  92. package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-internal.mjs +15 -15
  93. package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-literals.mjs +195 -195
  94. package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-lookup.service.mjs +21 -21
  95. package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-page-job-scheduler-parameters.component.mjs +81 -81
  96. package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.mjs +195 -195
  97. package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler.component.mjs +275 -275
  98. package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler.module.mjs +72 -72
  99. package/esm2020/lib/components/po-page-job-scheduler/po-page-job-scheduler.service.mjs +206 -206
  100. package/esm2020/lib/components/po-page-login/enums/po-page-login-authentication-type.enum.mjs +15 -15
  101. package/esm2020/lib/components/po-page-login/index.mjs +8 -8
  102. package/esm2020/lib/components/po-page-login/interfaces/po-page-login-custom-field.interface.mjs +2 -2
  103. package/esm2020/lib/components/po-page-login/interfaces/po-page-login-literals.interface.mjs +2 -2
  104. package/esm2020/lib/components/po-page-login/interfaces/po-page-login-recovery.interface.mjs +2 -2
  105. package/esm2020/lib/components/po-page-login/interfaces/po-page-login.interface.mjs +2 -2
  106. package/esm2020/lib/components/po-page-login/po-page-login-base.component.mjs +954 -954
  107. package/esm2020/lib/components/po-page-login/po-page-login-popover/po-page-login-popover.component.mjs +139 -139
  108. package/esm2020/lib/components/po-page-login/po-page-login.component.mjs +487 -487
  109. package/esm2020/lib/components/po-page-login/po-page-login.module.mjs +31 -31
  110. package/esm2020/lib/components/po-page-login/po-page-login.service.mjs +31 -31
  111. package/esm2020/lib/index.mjs +4 -4
  112. package/esm2020/lib/po-templates.module.mjs +18 -18
  113. package/esm2020/lib/services/index.mjs +4 -4
  114. package/esm2020/lib/services/po-page-customization/index.mjs +4 -4
  115. package/esm2020/lib/services/po-page-customization/po-page-customization.module.mjs +24 -24
  116. package/esm2020/lib/services/po-page-customization/po-page-customization.service.mjs +85 -85
  117. package/esm2020/lib/services/po-page-customization/po-page-dynamic-options.interface.mjs +2 -2
  118. package/esm2020/lib/services/po-page-dynamic/index.mjs +3 -3
  119. package/esm2020/lib/services/po-page-dynamic/po-page-dynamic-literals.interface.mjs +2 -2
  120. package/esm2020/lib/services/po-page-dynamic/po-page-dynamic.module.mjs +24 -24
  121. package/esm2020/lib/services/po-page-dynamic/po-page-dynamic.service.mjs +102 -102
  122. package/esm2020/lib/services/services.module.mjs +18 -18
  123. package/esm2020/lib/utils/util.mjs +352 -352
  124. package/esm2020/po-ui-ng-templates.mjs +4 -4
  125. package/esm2020/public-api.mjs +2 -2
  126. package/fesm2015/po-ui-ng-templates.mjs +9304 -9269
  127. package/fesm2015/po-ui-ng-templates.mjs.map +1 -1
  128. package/fesm2020/po-ui-ng-templates.mjs +8937 -8902
  129. package/fesm2020/po-ui-ng-templates.mjs.map +1 -1
  130. package/lib/components/components.module.d.ts +16 -16
  131. package/lib/components/index.d.ts +11 -11
  132. package/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-modal-content.enum.d.ts +15 -15
  133. package/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-type.enum.d.ts +15 -15
  134. package/lib/components/po-modal-password-recovery/index.d.ts +7 -7
  135. package/lib/components/po-modal-password-recovery/interfaces/po-modal-password-recovery.interface.d.ts +25 -25
  136. package/lib/components/po-modal-password-recovery/literals/i18n/po-modal-password-recovery-literals.d.ts +6 -6
  137. package/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.d.ts +283 -283
  138. package/lib/components/po-modal-password-recovery/po-modal-password-recovery-error-message/po-modal-password-recovery-error-message.component.d.ts +14 -14
  139. package/lib/components/po-modal-password-recovery/po-modal-password-recovery.component.d.ts +90 -90
  140. package/lib/components/po-modal-password-recovery/po-modal-password-recovery.module.d.ts +16 -16
  141. package/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.d.ts +13 -13
  142. package/lib/components/po-page-background/index.d.ts +2 -2
  143. package/lib/components/po-page-background/po-page-background.component.d.ts +54 -54
  144. package/lib/components/po-page-background/po-page-background.module.d.ts +16 -16
  145. package/lib/components/po-page-blocked-user/enums/po-page-blocked-user-reason.enum.d.ts +15 -15
  146. package/lib/components/po-page-blocked-user/index.d.ts +7 -7
  147. package/lib/components/po-page-blocked-user/interfaces/po-page-blocked-user-reason-params.interface.d.ts +15 -15
  148. package/lib/components/po-page-blocked-user/literals/i18n/po-page-blocked-user-literals.d.ts +72 -72
  149. package/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.d.ts +146 -146
  150. package/lib/components/po-page-blocked-user/po-page-blocked-user-contacts/po-page-blocked-user-contacts.component.d.ts +19 -19
  151. package/lib/components/po-page-blocked-user/po-page-blocked-user-reason/po-page-blocked-user-reason.component.d.ts +26 -26
  152. package/lib/components/po-page-blocked-user/po-page-blocked-user.component.d.ts +43 -43
  153. package/lib/components/po-page-blocked-user/po-page-blocked-user.module.d.ts +18 -18
  154. package/lib/components/po-page-change-password/index.d.ts +6 -6
  155. package/lib/components/po-page-change-password/interfaces/po-page-change-password-recovery.interface.d.ts +30 -30
  156. package/lib/components/po-page-change-password/interfaces/po-page-change-password-requirement.interface.d.ts +17 -17
  157. package/lib/components/po-page-change-password/interfaces/po-page-change-password.interface.d.ts +13 -13
  158. package/lib/components/po-page-change-password/literals/i18n/po-page-change-password-literals.d.ts +6 -6
  159. package/lib/components/po-page-change-password/po-page-change-password-base.component.d.ts +233 -233
  160. package/lib/components/po-page-change-password/po-page-change-password.component.d.ts +93 -93
  161. package/lib/components/po-page-change-password/po-page-change-password.module.d.ts +17 -17
  162. package/lib/components/po-page-change-password/po-page-change-password.service.d.ts +10 -10
  163. package/lib/components/po-page-dynamic-detail/index.d.ts +9 -9
  164. package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-actions.interface.d.ts +95 -95
  165. package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-back.interface.d.ts +18 -18
  166. package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-edit.interface.d.ts +18 -18
  167. package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-remove.interface.d.ts +18 -18
  168. package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-field.interface.d.ts +16 -16
  169. package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-metadata.interface.d.ts +31 -31
  170. package/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-options.interface.d.ts +36 -36
  171. package/lib/components/po-page-dynamic-detail/po-page-dynamic-detail-actions.service.d.ts +18 -18
  172. package/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.component.d.ts +257 -257
  173. package/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.module.d.ts +17 -17
  174. package/lib/components/po-page-dynamic-edit/index.d.ts +9 -9
  175. package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-actions.interface.d.ts +123 -123
  176. package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-cancel.interface.d.ts +18 -18
  177. package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save-new.interface.d.ts +44 -44
  178. package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save.interface.d.ts +43 -43
  179. package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-field.interface.d.ts +12 -12
  180. package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-metadata.interface.d.ts +25 -25
  181. package/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-options.interface.d.ts +28 -28
  182. package/lib/components/po-page-dynamic-edit/po-page-dynamic-edit-actions.service.d.ts +18 -18
  183. package/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.component.d.ts +329 -329
  184. package/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.module.d.ts +17 -17
  185. package/lib/components/po-page-dynamic-search/index.d.ts +6 -6
  186. package/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.d.ts +48 -48
  187. package/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-literals.interface.d.ts +15 -15
  188. package/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter.component.d.ts +29 -29
  189. package/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.d.ts +184 -183
  190. package/lib/components/po-page-dynamic-search/po-page-dynamic-search-filters.interface.d.ts +14 -14
  191. package/lib/components/po-page-dynamic-search/po-page-dynamic-search-literals.interface.d.ts +21 -21
  192. package/lib/components/po-page-dynamic-search/po-page-dynamic-search-options.interface.d.ts +59 -59
  193. package/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.d.ts +62 -62
  194. package/lib/components/po-page-dynamic-search/po-page-dynamic-search.interface.d.ts +29 -29
  195. package/lib/components/po-page-dynamic-search/po-page-dynamic-search.module.d.ts +18 -18
  196. package/lib/components/po-page-dynamic-table/index.d.ts +15 -15
  197. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-actions.interface.d.ts +196 -196
  198. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-detail.interface.d.ts +21 -21
  199. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-duplicate.interface.d.ts +29 -29
  200. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-edit.interface.d.ts +22 -22
  201. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-new.interface.d.ts +18 -18
  202. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove-all.interface.d.ts +39 -39
  203. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove.interface.d.ts +18 -18
  204. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.d.ts +82 -82
  205. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.d.ts +91 -83
  206. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-field.interface.d.ts +49 -38
  207. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-filters.interface.d.ts +18 -18
  208. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-metadata.interface.d.ts +31 -31
  209. package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-options.interface.d.ts +91 -91
  210. package/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.d.ts +130 -130
  211. package/lib/components/po-page-dynamic-table/po-page-dynamic-table-actions.service.d.ts +26 -26
  212. package/lib/components/po-page-dynamic-table/po-page-dynamic-table-literals.d.ts +62 -62
  213. package/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.d.ts +314 -303
  214. package/lib/components/po-page-dynamic-table/po-page-dynamic-table.module.d.ts +19 -19
  215. package/lib/components/po-page-job-scheduler/index.d.ts +3 -3
  216. package/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler-internal.interface.d.ts +14 -14
  217. package/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler.interface.d.ts +48 -48
  218. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.d.ts +176 -176
  219. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.d.ts +52 -52
  220. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-internal.d.ts +9 -9
  221. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-literals.d.ts +194 -194
  222. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-lookup.service.d.ts +16 -16
  223. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-page-job-scheduler-parameters.component.d.ts +14 -14
  224. package/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.d.ts +36 -36
  225. package/lib/components/po-page-job-scheduler/po-page-job-scheduler.component.d.ts +116 -116
  226. package/lib/components/po-page-job-scheduler/po-page-job-scheduler.module.d.ts +13 -13
  227. package/lib/components/po-page-job-scheduler/po-page-job-scheduler.service.d.ts +32 -32
  228. package/lib/components/po-page-login/enums/po-page-login-authentication-type.enum.d.ts +13 -13
  229. package/lib/components/po-page-login/index.d.ts +7 -7
  230. package/lib/components/po-page-login/interfaces/po-page-login-custom-field.interface.d.ts +72 -72
  231. package/lib/components/po-page-login/interfaces/po-page-login-literals.interface.d.ts +59 -59
  232. package/lib/components/po-page-login/interfaces/po-page-login-recovery.interface.d.ts +30 -30
  233. package/lib/components/po-page-login/interfaces/po-page-login.interface.d.ts +15 -15
  234. package/lib/components/po-page-login/po-page-login-base.component.d.ts +663 -663
  235. package/lib/components/po-page-login/po-page-login-popover/po-page-login-popover.component.d.ts +19 -19
  236. package/lib/components/po-page-login/po-page-login.component.d.ts +72 -72
  237. package/lib/components/po-page-login/po-page-login.module.d.ts +18 -18
  238. package/lib/components/po-page-login/po-page-login.service.d.ts +12 -12
  239. package/lib/index.d.ts +3 -3
  240. package/lib/po-templates.module.d.ts +8 -8
  241. package/lib/services/index.d.ts +3 -3
  242. package/lib/services/po-page-customization/index.d.ts +3 -3
  243. package/lib/services/po-page-customization/po-page-customization.module.d.ts +13 -13
  244. package/lib/services/po-page-customization/po-page-customization.service.d.ts +19 -19
  245. package/lib/services/po-page-customization/po-page-dynamic-options.interface.d.ts +8 -8
  246. package/lib/services/po-page-dynamic/index.d.ts +2 -2
  247. package/lib/services/po-page-dynamic/po-page-dynamic-literals.interface.d.ts +4 -4
  248. package/lib/services/po-page-dynamic/po-page-dynamic.module.d.ts +13 -13
  249. package/lib/services/po-page-dynamic/po-page-dynamic.service.d.ts +31 -31
  250. package/lib/services/services.module.d.ts +8 -8
  251. package/lib/utils/util.d.ts +152 -152
  252. package/package.json +9 -6
  253. package/po-ui-ng-templates-6.3.0.tgz +0 -0
  254. package/po-ui-ng-templates.d.ts +5 -5
  255. package/public-api.d.ts +1 -1
  256. package/schematics/README.md +14 -14
  257. package/schematics/collection.json +50 -50
  258. package/schematics/ng-add/index.d.ts +8 -8
  259. package/schematics/ng-add/index.js +60 -60
  260. package/schematics/ng-add/index.spec.d.ts +1 -1
  261. package/schematics/ng-add/index.spec.js +90 -90
  262. package/schematics/ng-add/schema.json +7 -7
  263. package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
  264. package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
  265. package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +14 -14
  266. package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
  267. package/schematics/ng-generate/po-page-blocked-user/index.d.ts +4 -4
  268. package/schematics/ng-generate/po-page-blocked-user/index.js +12 -12
  269. package/schematics/ng-generate/po-page-blocked-user/index.spec.d.ts +1 -1
  270. package/schematics/ng-generate/po-page-blocked-user/index.spec.js +120 -120
  271. package/schematics/ng-generate/po-page-blocked-user/schema.d.ts +3 -3
  272. package/schematics/ng-generate/po-page-blocked-user/schema.js +2 -2
  273. package/schematics/ng-generate/po-page-blocked-user/schema.json +67 -67
  274. package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
  275. package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
  276. package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +14 -14
  277. package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
  278. package/schematics/ng-generate/po-page-change-password/index.d.ts +4 -4
  279. package/schematics/ng-generate/po-page-change-password/index.js +12 -12
  280. package/schematics/ng-generate/po-page-change-password/index.spec.d.ts +1 -1
  281. package/schematics/ng-generate/po-page-change-password/index.spec.js +120 -120
  282. package/schematics/ng-generate/po-page-change-password/schema.d.ts +3 -3
  283. package/schematics/ng-generate/po-page-change-password/schema.js +2 -2
  284. package/schematics/ng-generate/po-page-change-password/schema.json +67 -67
  285. package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
  286. package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.html.template +5 -5
  287. package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
  288. package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +23 -23
  289. package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
  290. package/schematics/ng-generate/po-page-dynamic-detail/index.d.ts +4 -4
  291. package/schematics/ng-generate/po-page-dynamic-detail/index.js +12 -12
  292. package/schematics/ng-generate/po-page-dynamic-detail/index.spec.d.ts +1 -1
  293. package/schematics/ng-generate/po-page-dynamic-detail/index.spec.js +120 -120
  294. package/schematics/ng-generate/po-page-dynamic-detail/schema.d.ts +3 -3
  295. package/schematics/ng-generate/po-page-dynamic-detail/schema.js +2 -2
  296. package/schematics/ng-generate/po-page-dynamic-detail/schema.json +67 -67
  297. package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
  298. package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.html.template +5 -5
  299. package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
  300. package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +23 -23
  301. package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
  302. package/schematics/ng-generate/po-page-dynamic-edit/index.d.ts +4 -4
  303. package/schematics/ng-generate/po-page-dynamic-edit/index.js +12 -12
  304. package/schematics/ng-generate/po-page-dynamic-edit/index.spec.d.ts +1 -1
  305. package/schematics/ng-generate/po-page-dynamic-edit/index.spec.js +120 -120
  306. package/schematics/ng-generate/po-page-dynamic-edit/schema.d.ts +3 -3
  307. package/schematics/ng-generate/po-page-dynamic-edit/schema.js +2 -2
  308. package/schematics/ng-generate/po-page-dynamic-edit/schema.json +67 -67
  309. package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
  310. package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.html.template +5 -5
  311. package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
  312. package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +28 -28
  313. package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
  314. package/schematics/ng-generate/po-page-dynamic-search/index.d.ts +4 -4
  315. package/schematics/ng-generate/po-page-dynamic-search/index.js +12 -12
  316. package/schematics/ng-generate/po-page-dynamic-search/index.spec.d.ts +1 -1
  317. package/schematics/ng-generate/po-page-dynamic-search/index.spec.js +120 -120
  318. package/schematics/ng-generate/po-page-dynamic-search/schema.d.ts +3 -3
  319. package/schematics/ng-generate/po-page-dynamic-search/schema.js +2 -2
  320. package/schematics/ng-generate/po-page-dynamic-search/schema.json +67 -67
  321. package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
  322. package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.html.template +5 -5
  323. package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
  324. package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +21 -21
  325. package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
  326. package/schematics/ng-generate/po-page-dynamic-table/index.d.ts +4 -4
  327. package/schematics/ng-generate/po-page-dynamic-table/index.js +12 -12
  328. package/schematics/ng-generate/po-page-dynamic-table/index.spec.d.ts +1 -1
  329. package/schematics/ng-generate/po-page-dynamic-table/index.spec.js +120 -120
  330. package/schematics/ng-generate/po-page-dynamic-table/schema.d.ts +3 -3
  331. package/schematics/ng-generate/po-page-dynamic-table/schema.js +2 -2
  332. package/schematics/ng-generate/po-page-dynamic-table/schema.json +67 -67
  333. package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
  334. package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.html.template +3 -3
  335. package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
  336. package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +17 -17
  337. package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
  338. package/schematics/ng-generate/po-page-job-scheduler/index.d.ts +4 -4
  339. package/schematics/ng-generate/po-page-job-scheduler/index.js +12 -12
  340. package/schematics/ng-generate/po-page-job-scheduler/index.spec.d.ts +1 -1
  341. package/schematics/ng-generate/po-page-job-scheduler/index.spec.js +120 -120
  342. package/schematics/ng-generate/po-page-job-scheduler/schema.d.ts +3 -3
  343. package/schematics/ng-generate/po-page-job-scheduler/schema.js +2 -2
  344. package/schematics/ng-generate/po-page-job-scheduler/schema.json +67 -67
  345. package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__-routing.module.ts.template +14 -14
  346. package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +32 -32
  347. package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +14 -14
  348. package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.module.ts.template +19 -19
  349. package/schematics/ng-generate/po-page-login/index.d.ts +4 -4
  350. package/schematics/ng-generate/po-page-login/index.js +12 -12
  351. package/schematics/ng-generate/po-page-login/index.spec.d.ts +1 -1
  352. package/schematics/ng-generate/po-page-login/index.spec.js +120 -120
  353. package/schematics/ng-generate/po-page-login/schema.d.ts +3 -3
  354. package/schematics/ng-generate/po-page-login/schema.js +2 -2
  355. package/schematics/ng-generate/po-page-login/schema.json +67 -67
  356. package/po-ui-ng-templates-6.0.0-rc.1.tgz +0 -0
@@ -1,954 +1,954 @@
1
- import { EventEmitter, Input, Output, Directive } from '@angular/core';
2
- import { convertToBoolean, convertToInt, getShortBrowserLanguage, isExternalLink, isTypeof } from './../../utils/util';
3
- import { poLocaleDefault, poLanguageDefault } from '@po-ui/ng-components';
4
- import { PoPageLoginAuthenticationType } from './enums/po-page-login-authentication-type.enum';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./po-page-login.service";
7
- import * as i2 from "@angular/router";
8
- import * as i3 from "@po-ui/ng-components";
9
- const poPageLoginContentMaxLength = 40;
10
- export const poPageLoginLiteralsDefault = {
11
- en: {
12
- title: 'Welcome',
13
- loginErrorPattern: 'Invalid Login',
14
- loginHint: `Your login user was given to you at your first day.
15
- If you don't have this information contact support`,
16
- loginPlaceholder: 'Insert your e-mail',
17
- passwordErrorPattern: 'Invalid Password',
18
- passwordPlaceholder: 'Insert your password',
19
- customFieldErrorPattern: 'Invalid value',
20
- customFieldPlaceholder: 'Please enter a value',
21
- rememberUser: 'Automatic login',
22
- rememberUserHint: 'You can disable this option in system configuration',
23
- submitLabel: 'Enter',
24
- submittedLabel: 'Loading...',
25
- forgotPassword: 'Forgot your Password?',
26
- highlightInfo: '',
27
- registerUrl: 'New register',
28
- titlePopover: 'Oops!',
29
- forgotYourPassword: 'Forgot your password?',
30
- ifYouTryHarder: 'If you try ',
31
- attempts: '{0} more time(s) ',
32
- yourUserWillBeBlocked: 'without success your user will be blocked and you will be left 24 hours without being able to access :(',
33
- createANewPasswordNow: 'Better create a new password now! You will be able to log into the system right away.',
34
- iForgotMyPassword: 'I forgot my password',
35
- welcome: 'Welcome',
36
- support: 'Support'
37
- },
38
- es: {
39
- title: 'Bienvenido',
40
- loginErrorPattern: 'Login inválido',
41
- loginHint: `Su usuario ha sido entregado para usted en su primer día.
42
- Si no tiene esta información, póngase en contacto con el soporte técnico`,
43
- loginPlaceholder: 'Inserte su e-mail',
44
- passwordErrorPattern: 'Contraseña inválida',
45
- passwordPlaceholder: 'Inserte su contraseña',
46
- customFieldErrorPattern: 'Valor no válido.',
47
- customFieldPlaceholder: 'Por favor introduzca un valor',
48
- rememberUser: 'Inicio de sesión automáticamente',
49
- rememberUserHint: 'Puede deshabilitar esta opción en el menú del sistema.',
50
- submitLabel: 'Entrar',
51
- submittedLabel: 'Cargando...',
52
- forgotPassword: 'Olvidaste tu contraseña?',
53
- highlightInfo: '',
54
- registerUrl: 'Nuevo registro',
55
- titlePopover: 'Opa!',
56
- forgotYourPassword: 'Olvidaste tu contraseña?',
57
- ifYouTryHarder: 'Si intenta más ',
58
- attempts: '{0} vez/veces ',
59
- yourUserWillBeBlocked: 'sin éxito su usuario sera bloqueado y usted vás permanecer 24 horas sin poder acceder a :(',
60
- createANewPasswordNow: '¡Mejor crear una nueva contraseña ahora! Usted podrá entrar en el sistema inmediatamente después.',
61
- iForgotMyPassword: 'Olvide mi contraseña',
62
- welcome: 'Bienvenido',
63
- support: 'Soporte'
64
- },
65
- pt: {
66
- title: 'Bem-vindo',
67
- loginErrorPattern: 'Login inválido',
68
- loginHint: `Seu usuário foi entregue a você no seu primeiro dia.
69
- Caso não tenha mais essa informação contacte o suporte`,
70
- loginPlaceholder: 'Insira seu e-mail',
71
- passwordErrorPattern: 'Senha inválida',
72
- passwordPlaceholder: 'Insira sua senha',
73
- customFieldErrorPattern: 'Valor inválido.',
74
- customFieldPlaceholder: 'Por favor insira um valor',
75
- rememberUser: 'Logar automaticamente',
76
- rememberUserHint: 'Você pode desabilitar essa opção no menu do sistema',
77
- submitLabel: 'Entrar',
78
- submittedLabel: 'Carregando...',
79
- forgotPassword: 'Esqueceu sua senha?',
80
- highlightInfo: '',
81
- registerUrl: 'Novo registro',
82
- titlePopover: 'Opa!',
83
- forgotYourPassword: 'Esqueceu sua senha?',
84
- ifYouTryHarder: 'Se tentar mais ',
85
- attempts: '{0} vez(es) ',
86
- yourUserWillBeBlocked: 'sem sucesso seu usuário será bloqueado e você fica 24 horas sem poder acessar :(',
87
- createANewPasswordNow: 'Melhor criar uma senha nova agora! Você vai poder entrar no sistema logo em seguida.',
88
- iForgotMyPassword: 'Esqueci minha senha',
89
- welcome: 'Boas-vindas',
90
- support: 'Suporte'
91
- },
92
- ru: {
93
- title: 'Добро пожаловать!',
94
- loginErrorPattern: 'Неверный логин',
95
- loginHint: `Ваш логин был предоставлен вам в первый день.
96
- Если у вас нет этой информации, обратитесь в службу поддержки`,
97
- loginPlaceholder: 'Вставьте свой адрес электронной почты',
98
- passwordErrorPattern: 'Неверный пароль',
99
- passwordPlaceholder: 'Введите свой пароль',
100
- customFieldErrorPattern: 'Неверное значение.',
101
- customFieldPlaceholder: 'Пожалуйста, введите значение',
102
- rememberUser: 'Автоматический вход',
103
- rememberUserHint: 'Вы можете отключить эту опцию в конфигурации системы',
104
- submitLabel: 'Войти',
105
- submittedLabel: '3агрузка...',
106
- forgotPassword: 'Забыли пароль?',
107
- highlightInfo: '',
108
- registerUrl: 'Новый регистр',
109
- titlePopover: 'Ой!',
110
- forgotYourPassword: 'Забыли пароль?',
111
- ifYouTryHarder: 'Если вы безуспешно попытаетесь войти еще ',
112
- attempts: '{0} раз(а) ',
113
- yourUserWillBeBlocked: 'Ваш пользователь будет заблокирован, и Вы останетесь на 24 часа без возможности доступа :(',
114
- createANewPasswordNow: 'Лучше создайте новый пароль сейчас! Вы сможете сразу войти в систему.',
115
- iForgotMyPassword: 'Я забыл свой пароль',
116
- welcome: 'добро пожаловать',
117
- support: 'Поддержка'
118
- }
119
- };
120
- export const poPageLoginLiteralIn = {
121
- en: 'in',
122
- es: 'en',
123
- pt: 'em',
124
- ru: 'в'
125
- };
126
- /**
127
- * @description
128
- *
129
- * O componente `po-page-login` é utilizado como template para tela de login.
130
- * Com ele é possível definirmos valores para usuário, senha e definir ações para recuperação de senha e gravação de dados do usuário.
131
- * Também é possível inserir uma imagem em conjunto com um texto de destaque.
132
- *
133
- *
134
- * A propriedade `p-authentication-url` automatiza a rotina do componente e simplifica o processo para autenticação do usuário, bastando
135
- * definir uma url para requisição da autenticação. A flexibilidade e praticidade podem chegar a um nível em que o desenvolvimento
136
- * da aplicação no *client side* é desprovida de qualquer código-fonte relacionado à rotina de login de usuário.
137
- * Seu detalhamento para uso pode ser visto logo abaixo em *propriedades*.
138
- * Caso julgue necessário, pode-se também definir manualmente a rotina do componente.
139
- *
140
- *
141
- * Para que as imagens sejam exibidas corretamente, é necessário incluir o caminho delas ao projeto. Para isso, edite
142
- * o *assets* no arquivo **angular.json** da aplicação na seguinte ordem:
143
- * ```
144
- * "assets": [
145
- * "src/assets",
146
- * "src/favicon.ico",
147
- * {
148
- * "glob": "**\/*",
149
- * "input": "node_modules/@po-ui/style/images",
150
- * "output": "assets/images"
151
- * }
152
- * ]
153
- * ```
154
- */
155
- export class PoPageLoginBaseComponent {
156
- constructor(loginService, router, poLanguageService) {
157
- this.loginService = loginService;
158
- this.router = router;
159
- this.poLanguageService = poLanguageService;
160
- /**
161
- * @optional
162
- *
163
- * @description
164
- *
165
- * Evento disparado quando o usuário alterar o input do campo login.
166
- *
167
- * Esse evento receberá como parâmetro uma variável do tipo `string` com o texto informado no campo.
168
- *
169
- * > Esta propriedade será ignorada se for definido valor para a propriedade `p-authentication-url`.
170
- */
171
- this.loginChange = new EventEmitter();
172
- /**
173
- * Evento disparado ao submeter o formulário de login (apertando `Enter` dentro dos campos ou pressionando o botão de confirmação).
174
- *
175
- * Esse evento receberá como parâmetro um objeto do tipo `PoPageLogin` com os dados informados no formulário.
176
- *
177
- * > Esta propriedade será ignorada se for definido valor para a propriedade `p-url-recovery`.
178
- *
179
- * > Para mais detalhes consulte a documentação sobre a interface `PoPageLogin` mais abaixo.
180
- */
181
- this.loginSubmit = new EventEmitter();
182
- /**
183
- * @optional
184
- *
185
- * @description
186
- *
187
- * Evento disparado quando o usuário alterar o input do campo password.
188
- *
189
- * Esse evento receberá como parâmetro uma variável do tipo `string` com o texto informado no campo.
190
- *
191
- * > Esta propriedade será ignorada se for definido valor para a propriedade `p-authentication-url`.
192
- */
193
- this.passwordChange = new EventEmitter();
194
- /**
195
- * @optional
196
- *
197
- * @description
198
- *
199
- * Evento disparado quando o usuário alterar o idioma da página.
200
- *
201
- * Esse evento receberá como parâmetro um objeto do tipo `PoLanguage` com a linguagem selecionada.
202
- *
203
- */
204
- this.languageChange = new EventEmitter();
205
- this.allLoginErrors = [];
206
- this.allPasswordErrors = [];
207
- this.rememberUser = false;
208
- this.showExceededAttemptsWarning = false;
209
- this._authenticationType = PoPageLoginAuthenticationType.Basic;
210
- this._hideRememberUser = false;
211
- this._loading = false;
212
- this._loginErrors = [];
213
- this._passwordErrors = [];
214
- this.selectedLanguage = this.poLanguageService.getShortLanguage();
215
- }
216
- /**
217
- * @optional
218
- *
219
- * @description
220
- *
221
- * Ao informar um valor do tipo `string`, o mesmo será aplicado como a chave do campo customizado e utilizará
222
- * os valores padrões contidos na propriedade `literals` como `customFieldErrorPattern` e `customFieldPlaceholder`.
223
- *
224
- * Existe a possibilidade de informar um objeto que segue a definição da interface `PoPageLoginCustomField`, onde
225
- * através dos parâmetros enviados pode gerar um `po-input`, `po-combo` especificamente para serviços
226
- * ou `po-select` para valores fixos.
227
- *
228
- * Abaixo seguem os exemplos de cada tipo de campo.
229
- *
230
- * `po-input`:
231
- *
232
- * ```
233
- * {
234
- * property: 'domain',
235
- * value: 'jv01',
236
- * placeholder: 'Enter your domain',
237
- * pattern: '[a-z]',
238
- * errorPattern: 'Invalid value'
239
- * }
240
- * ```
241
- *
242
- * `po-combo`:
243
- *
244
- * ```
245
- * {
246
- * property: 'domain',
247
- * value: 'jv01',
248
- * placeholder: 'Enter your domain',
249
- * url: 'https://po-ui.io/sample/api/comboOption/domains',
250
- * fieldValue: 'nickname'
251
- * }
252
- * ```
253
- *
254
- * `po-select`:
255
- *
256
- * ```
257
- * {
258
- * property: 'domain',
259
- * value: 'jv01',
260
- * placeholder: 'Enter your domain',
261
- * options: [{label: 'Domain 1', value: '1'}, {label: 'Domain 2', value: '2'}]
262
- * }
263
- * ```
264
- *
265
- * Caso o customField possua options, url e fieldValue preenchidos, será priorizado o po-select
266
- * utilizando o options.
267
- *
268
- */
269
- set customField(value) {
270
- if (value) {
271
- if (isTypeof(value, 'string')) {
272
- this.customFieldType = 'input';
273
- this._customField = value;
274
- this.customFieldObject = this.getDefaultCustomFieldObject(value);
275
- return;
276
- }
277
- if (isTypeof(value, 'object') && !Array.isArray(value) && value['property']) {
278
- this._customField = value;
279
- this.customFieldObject = value;
280
- if (!this.customFieldObject.options && !this.customFieldObject.url) {
281
- this.customFieldType = 'input';
282
- }
283
- else {
284
- this.customFieldType = this.customFieldObject.options ? 'select' : 'combo';
285
- }
286
- return;
287
- }
288
- }
289
- this._customField = undefined;
290
- this.customFieldObject = undefined;
291
- }
292
- get customField() {
293
- return this._customField;
294
- }
295
- /**
296
- * @optional
297
- *
298
- * @description
299
- *
300
- * Personaliza o e-mail que é exibido na mensagem de dica de login padrão para contato de suporte.
301
- */
302
- set contactEmail(value) {
303
- this._contactEmail = value;
304
- }
305
- get contactEmail() {
306
- return this._contactEmail;
307
- }
308
- /**
309
- * @optional
310
- *
311
- * @description
312
- *
313
- * Texto customizado que fica entre a logo e a mensagem de boas-vindas.
314
- */
315
- set productName(value) {
316
- this._productName = value;
317
- }
318
- get productName() {
319
- return this._productName;
320
- }
321
- /**
322
- * @optional
323
- *
324
- * @description
325
- * Adiciona uma `tag` abaixo do título que especifica o ambiente que o usuário está fazendo o login.
326
- *
327
- * > Essa propriedade limita o texto em 40 caracteres.
328
- */
329
- set environment(environment) {
330
- if (environment && environment.length > poPageLoginContentMaxLength) {
331
- this._environment = environment.substring(0, poPageLoginContentMaxLength);
332
- }
333
- else {
334
- this._environment = environment;
335
- }
336
- }
337
- get environment() {
338
- return this._environment;
339
- }
340
- /**
341
- * @optional
342
- *
343
- * @description
344
- * Exibe um aviso de bloqueio de acordo com a quantidade restante de tentativas.
345
- * O aviso será exibido somente se a quantidade for maior que zero.
346
- *
347
- * > Caso tenha algum valor atribuído para o atributo `p-authentication-url` e o retorno da requisição estiver atribuindo valor
348
- * para o `p-exceeded-attempts-warning`, o valor considerado será o do retorno da requisição.
349
- *
350
- * @default `0`
351
- */
352
- set exceededAttemptsWarning(value) {
353
- this._exceededAttemptsWarning = convertToInt(value);
354
- this.showExceededAttemptsWarning = this.exceededAttemptsWarning > 0;
355
- }
356
- get exceededAttemptsWarning() {
357
- return this._exceededAttemptsWarning;
358
- }
359
- /**
360
- * @optional
361
- *
362
- * @description
363
- *
364
- * Esconde a função "Lembrar usuário" do formulário de login.
365
- *
366
- * Quando essa propriedade é setada com `true` a propriedade `rememberUser` enviada no evento `p-login-submit` será sempre
367
- * `false`.
368
- *
369
- * > Veja a propriedade `p-literals` para customizar a literal `rememberUser`.
370
- *
371
- * @default `false`
372
- */
373
- set hideRememberUser(value) {
374
- this._hideRememberUser = value === '' ? true : convertToBoolean(value);
375
- if (this._hideRememberUser) {
376
- this.rememberUser = false;
377
- }
378
- }
379
- get hideRememberUser() {
380
- return this._hideRememberUser;
381
- }
382
- /**
383
- * @optional
384
- *
385
- * @description
386
- *
387
- * Objeto com as literais usadas no `po-page-login`.
388
- *
389
- * Existem duas maneiras de customizar o componente, passando um objeto com todas as literais disponíveis:
390
- *
391
- * ```
392
- * const customLiterals: PoPageLoginLiterals = {
393
- * attempts: '{0} vez(es) ',
394
- * createANewPasswordNow: 'Melhor criar uma senha nova agora! Você vai poder entrar no sistema logo em seguida.',
395
- * forgotPassword: 'Esqueceu sua senha?',
396
- * forgotYourPassword: 'Esqueceu sua senha?',
397
- * highlightInfo: '',
398
- * iForgotMyPassword: 'Esqueci minha senha',
399
- * ifYouTryHarder: 'Se tentar mais ',
400
- * welcome: 'Boas-vindas',
401
- * loginErrorPattern: 'Login obrigatório',
402
- * loginHint: 'Caso não possua usuário entre em contato com o suporte',
403
- * loginLabel: 'Insira seu usuário',
404
- * loginPlaceholder: 'Insira seu usuário de acesso',
405
- * passwordErrorPattern: 'Senha obrigatória',
406
- * passwordLabel: 'Insira sua senha',
407
- * passwordPlaceholder: 'Insira sua senha de acesso',
408
- * customFieldErrorPattern: 'Campo customizado inválido',
409
- * customFieldPlaceholder: 'Por favor insira um valor',
410
- * registerUrl: 'Novo registro',
411
- * rememberUser: 'Lembrar usuário',
412
- * rememberUserHint: 'Esta opção pode ser desabilitada nas configurações do sistema',
413
- * submitLabel: 'Acessar sistema',
414
- * submittedLabel: 'Carregando...',
415
- * titlePopover: 'Opa!',
416
- * yourUserWillBeBlocked: 'sem sucesso seu usuário será bloqueado e você fica 24 horas sem poder acessar :('
417
- * };
418
- * ```
419
- *
420
- * Ou passando apenas as literais que deseja customizar:
421
- *
422
- * ```
423
- * const customLiterals: PoPageLoginLiterals = {
424
- * loginPlaceholder: 'Insira seu usuário de acesso',
425
- * passwordPlaceholder: 'Insira sua senha de acesso',
426
- * submitLabel: 'Acessar sistema'
427
- * };
428
- * ```
429
- *
430
- * E para carregar as literais customizadas, basta apenas passar o objeto para o componente.
431
- *
432
- * ```
433
- * <po-page-login
434
- * [p-literals]="customLiterals">
435
- * </po-page-login>
436
- * ```
437
- *
438
- * > O objeto padrão de literais será traduzido de acordo com o idioma do browser (pt, en, es).
439
- * > É também possível alternar o objeto padrão de literais através do seletor de idiomas localizado na parte inferior do template,
440
- * nesse caso, há também a opção do idioma russo.
441
- */
442
- set literals(value) {
443
- this._literals = value;
444
- }
445
- get literals() {
446
- return this._literals;
447
- }
448
- /**
449
- * @optional
450
- *
451
- * @description
452
- *
453
- * Habilita um estado de carregamento ao botão de *login*.
454
- *
455
- * > É necessário atribuir `true` à esta propriedade na função definida em `p-login-submit`.
456
- *
457
- * @default `false`
458
- */
459
- set loading(value) {
460
- this._loading = convertToBoolean(value);
461
- }
462
- get loading() {
463
- return this._loading;
464
- }
465
- /**
466
- * @optional
467
- *
468
- * @description
469
- *
470
- * Valor do modelo do campo de login.
471
- */
472
- set login(value) {
473
- this._login = value;
474
- if (!this.authenticationUrl) {
475
- this.loginChange.emit(this._login);
476
- }
477
- }
478
- get login() {
479
- return this._login;
480
- }
481
- /**
482
- * @optional
483
- *
484
- * @description
485
- *
486
- * Atributo que recebe uma lista de erros e exibe abaixo do campo de login.
487
- */
488
- set loginErrors(value) {
489
- this._loginErrors = value || [];
490
- this.setLoginErrors(this._loginErrors);
491
- }
492
- get loginErrors() {
493
- return this._loginErrors;
494
- }
495
- /**
496
- * @optional
497
- *
498
- * @description
499
- *
500
- * Atributo que recebe uma lista de erros e exibe abaixo do campo de password.
501
- */
502
- set passwordErrors(value) {
503
- this._passwordErrors = value || [];
504
- this.setPasswordErrors(this._passwordErrors);
505
- }
506
- get passwordErrors() {
507
- return this._passwordErrors;
508
- }
509
- /**
510
- * @optional
511
- *
512
- * @description
513
- *
514
- * Exibe um link abaixo do formulário de login para que os usuários da aplicação façam a recuperação dos dados de autenticação.
515
- *
516
- * A propriedade aceita os seguintes tipos:
517
- *
518
- * - **String**: informe uma url externa ou uma rota válida;
519
- * - **Function**: pode-se customizar a ação. Para esta possilidade basta atribuir:
520
- * ```
521
- * <po-page-login>
522
- * [recovery]="this.myRecovery.bind(this)">
523
- * </po-page-login>
524
- * ```
525
- *
526
- * - **PoPageLoginRecovery**: cria-se vínculo automático com o template **po-modal-password-recovery**.
527
- * O objeto deve conter a **url** para requisição dos recursos e pode-se definir o **tipo** de modal para recuperação de senha,
528
- * **email** para contato e **máscara** do campo de telefone.
529
- */
530
- set recovery(value) {
531
- this._recovery = value;
532
- }
533
- get recovery() {
534
- return this._recovery;
535
- }
536
- /**
537
- * @optional
538
- *
539
- * @description
540
- *
541
- * Caso a aplicação tenha um link para novos cadastros, informe uma url externa ou uma rota válida, dessa
542
- * forma será exibido um link abaixo do formulário de login para os usuários da aplicação.
543
- *
544
- * Exemplos de valores válidos:
545
- * - **local**: `/home`
546
- * - **url externa**: `https://po-ui.io`
547
- *
548
- * > Veja a propriedade `p-literals` para customizar a literal `registerUrl`.
549
- */
550
- set registerUrl(value) {
551
- this._registerUrl = isTypeof(value, 'string') ? value : undefined;
552
- }
553
- get registerUrl() {
554
- return this._registerUrl;
555
- }
556
- /**
557
- * @optional
558
- *
559
- * @description
560
- *
561
- * Atributo que recebe o tipo de esquema da autenticação, sendo suportados apenas os valores `Basic` e `Bearer`.
562
- *
563
- * > Caso o tipo definido seja `Basic`, o componente fará uma requisição `POST` contendo:
564
- *
565
- * ```
566
- * headers {
567
- * Authorization: Basic base64(login:password)
568
- * }
569
- *
570
- * body {
571
- * rememberUser: rememberUser
572
- * }
573
- * ```
574
- *
575
- * > Caso o tipo definido seja `Bearer`, o componente fará uma requisição `POST` contendo:
576
- *
577
- * ```
578
- * body {
579
- * login: login,
580
- * password: base64(password),
581
- * rememberUser: rememberUser
582
- * }
583
- * ```
584
- *
585
- * @default `PoPageLoginAuthenticationType.Basic`
586
- */
587
- set authenticationType(value) {
588
- this._authenticationType = Object.values(PoPageLoginAuthenticationType).includes(value)
589
- ? value
590
- : PoPageLoginAuthenticationType.Basic;
591
- }
592
- get authenticationType() {
593
- return this._authenticationType;
594
- }
595
- /**
596
- * @optional
597
- *
598
- * @description
599
- *
600
- * Endpoint usado pelo template para requisição do recurso. Quando preenchido, o método `p-login-submit` será ignorado e o
601
- * componente adquirirá automatização para o processo de autenticação.
602
- *
603
- * ### Processos
604
- * Ao digitar um valor válido no campo de login/password e pressionar **Enter**, o componente fará uma requisição `POST`
605
- * na url especificada nesta propriedade passando o objeto contendo o valor definido pelo usuário:
606
- *
607
- * ```
608
- * headers {
609
- * Authorization: Basic base64(login:password)
610
- * }
611
- *
612
- * body {
613
- * rememberUser: rememberUser
614
- * }
615
- * ```
616
- *
617
- * Em caso de **sucesso**, o objeto de retorno é armazenado no `sessionStorage` e o usuário é redirecionado para a página inicial da
618
- * aplicação `/`.
619
- *
620
- * ```
621
- * 200:
622
- * {
623
- * user: user
624
- * }
625
- * ```
626
- *
627
- * Em caso de **erro** na autenticação, espera-se o seguinte retorno:
628
- *
629
- * ```
630
- * 400/401
631
- * {
632
- * code: 400/401,
633
- * message: message,
634
- * detailedMessage: detailedMessage,
635
- * helpUrl?: helpUrl
636
- * }
637
- * ```
638
- *
639
- * > Pode-se atribuir uma quantidade máxima de tentativas restantes (maxAttemptsRemaining) para o atributo `p-exceeded-attempts-warning`,
640
- * assim como os avisos relacionados aos campos login e password (loginWarnings, passwordWarnings) para os atributos `p-login-errors` e
641
- * `p-password-errors` conforme retorno abaixo:
642
- *
643
- * ```
644
- * 400
645
- * {
646
- * code: 400/401,
647
- * message: message,
648
- * detailedMessage: detailedMessage,
649
- * helpUrl?: helpUrl,
650
- * maxAttemptsRemaining?: maxAttemptsRemaining,
651
- * loginWarnings?: [loginWarnings],
652
- * passwordWarnings?: [passwordWarnings]
653
- * }
654
- * ```
655
- *
656
- * > Caso o valor atribuído para `p-exceeded-attempts-warning` seja igual a 0(zero), poderá ser passado um valor para o
657
- * atributo `p-blocked-url` e o usuário será redirecionado para uma tela de bloqueio.
658
- *
659
- * *Processo finalizado.*
660
- *
661
- * _______________
662
- *
663
- * #### Praticidade
664
- * As informações do serviço de autenticação também podem ser transmitidas diretamente pelas configuraçãos de rota e, desta maneira,
665
- * dispensa-se qualquer menção e/ou importação do componente `po-page-login` no restante da aplicação. O exemplo abaixo exemplifica
666
- * a forma dinâmica com a qual o template de tela de login pode ser gerado ao navegar para rota `/login`, e também como ele se comunica
667
- * com o serviço para efetuação do processo de autenticação do usuário e solicitação de nova senha.
668
- * Basta definir nas configurações de rota:
669
- *
670
- *
671
- * ```
672
- * import { PoPageLoginComponent, PoPageLoginAthenticationType } from '@po-ui/ng-templates';
673
- *
674
- * ...
675
- * const routes: Routes = [
676
- * {
677
- * path: 'login', component: PoPageLoginComponent, data: {
678
- * serviceApi: 'https://po-ui.io/sample/api/users/authentication',
679
- * environment: 'development',
680
- * recovery: {
681
- * url: 'https://po-ui.io/sample/api/users',
682
- * type: PoModalPasswordRecoveryType.All,
683
- * contactMail: 'dev.po@po-ui.com',
684
- * phoneMask: '9-999-999-9999'
685
- * },
686
- * registerUrl: '/new-password',
687
- * authenticationType: PoPageLoginAthenticationType.Basic
688
- * }
689
- * }
690
- * ...
691
- * ];
692
- *
693
- * @NgModule({
694
- * imports: [RouterModule.forRoot(routes)],
695
- * exports: [RouterModule]
696
- * })
697
- * export class AppRoutingModule { }
698
- * ```
699
- *
700
- *
701
- * O metadado `serviceApi` deve ser a **url** para requisição dos recursos de autenticação, o `environment` alimenta a propriedade
702
- * `p-environment`, `recovery` é a interface `PoPageLoginRecovery` responsável pelas especificações contidas na modal de recuperação de
703
- * senha, `registerUrl` alimenta a propriedade `p-register-url` e `authenticationType` que define a propriedade `p-authentication-type`.
704
- *
705
- * > É essencial que siga a nomenclatura dos atributos exemplificados acima para sua efetiva funcionalidade.
706
- *
707
- */
708
- set authenticationUrl(value) {
709
- this._authenticationUrl = isTypeof(value, 'string') ? value : undefined;
710
- }
711
- get authenticationUrl() {
712
- return this._authenticationUrl;
713
- }
714
- /**
715
- * @optional
716
- *
717
- * @description
718
- *
719
- * Caso o valor atribuído para `p-exceeded-attempts-warning` seja igual a 0(zero) e a aplicação tenha um link de bloqueio de usuário,
720
- * informe uma url externa ou uma rota válida, dessa forma em caso de bloqueio o usuário será redirecionado.
721
- */
722
- set blockedUrl(value) {
723
- this._blockedUrl = isTypeof(value, 'string') ? value : undefined;
724
- }
725
- get blockedUrl() {
726
- return this._blockedUrl;
727
- }
728
- /**
729
- * @optional
730
- *
731
- * @description
732
- *
733
- * Exibe um botão para suporte.
734
- *
735
- * A propriedade aceita os seguintes tipos:
736
- *
737
- * - **String**: URL externa ou uma rota válida;
738
- * - **Function**: Função a ser disparada ao clicar no botão de suporte;
739
- * ```
740
- * <po-page-login>
741
- * [p-support]="this.mySupport.bind(this)">
742
- * </po-page-login>
743
- * ```
744
- *
745
- */
746
- set support(value) {
747
- this._support = value;
748
- }
749
- get support() {
750
- return this._support;
751
- }
752
- /**
753
- * @optional
754
- *
755
- * @description
756
- *
757
- * Coleção de idiomas que o componente irá tratar e disponibilizará para o usuário escolher.
758
- *
759
- * Caso essa propriedade não seja utilizada o componente mostrará no combo os idiomas que ele suporta por padrão.
760
- *
761
- * Caso a coleção tenha um idioma, a página estará nesse idioma e não mostrará o combo.
762
- *
763
- * Caso seja passado um array vazio, a página terá o idioma configurado no `i18n` e não mostrará o combo de seleção.
764
- *
765
- * > Se for passado um idioma não suportado, será preciso passar as literais pela propriedade `p-literals`.
766
- *
767
- *
768
- */
769
- set languagesList(languagesList) {
770
- if (languagesList) {
771
- if (languagesList.length) {
772
- this._languagesList = languagesList;
773
- }
774
- else {
775
- this._languagesList = poLanguageDefault.filter(language => language.language === this.language);
776
- }
777
- }
778
- }
779
- get languagesList() {
780
- if (this._languagesList) {
781
- return this._languagesList;
782
- }
783
- return poLanguageDefault;
784
- }
785
- get showLanguage() {
786
- return this.languagesList.length > 1;
787
- }
788
- get language() {
789
- return this.selectedLanguage || getShortBrowserLanguage();
790
- }
791
- get pageLoginLiterals() {
792
- const loginHintWithContactEmail = this.contactEmail
793
- ? this.concatenateLoginHintWithContactEmail(this.contactEmail)
794
- : undefined;
795
- return {
796
- ...poPageLoginLiteralsDefault[poLocaleDefault],
797
- ...poPageLoginLiteralsDefault[this.language],
798
- ...loginHintWithContactEmail,
799
- ...this.literals
800
- };
801
- }
802
- ngOnDestroy() {
803
- if (this.loginSubscription) {
804
- this.loginSubscription.unsubscribe();
805
- }
806
- }
807
- closePopover() {
808
- this.showExceededAttemptsWarning = false;
809
- }
810
- onLoginSubmit() {
811
- const loginForm = {
812
- login: this.login,
813
- password: this.password,
814
- rememberUser: this.rememberUser
815
- };
816
- if (this.customField) {
817
- loginForm[this.customFieldObject.property] = this.customFieldObject.value;
818
- }
819
- if (this.authenticationUrl) {
820
- this.loginSubscription = this.loginService
821
- .onLogin(this.authenticationUrl, this.authenticationType, loginForm)
822
- .subscribe(data => {
823
- this.setValuesToProperties();
824
- sessionStorage.setItem('PO_USER_LOGIN', JSON.stringify(data));
825
- this.openInternalLink('/');
826
- }, error => {
827
- if (error.error.code === '400' || error.error.code === '401') {
828
- this.setValuesToProperties(error);
829
- this.redirectBlockedUrl(this.exceededAttemptsWarning, this.blockedUrl);
830
- }
831
- });
832
- }
833
- else {
834
- this.loginSubmit.emit(loginForm);
835
- this.showExceededAttemptsWarning = this.exceededAttemptsWarning > 0;
836
- }
837
- }
838
- getDefaultCustomFieldObject(property) {
839
- return { property };
840
- }
841
- openExternalLink(url) {
842
- window.open(url, '_blank');
843
- }
844
- openInternalLink(url) {
845
- this.router.navigate([url]);
846
- }
847
- redirectBlockedUrl(attempts, blockedUrl) {
848
- if (attempts === 0 && blockedUrl) {
849
- this.showExceededAttemptsWarning = false;
850
- isExternalLink(blockedUrl) ? this.openExternalLink(blockedUrl) : this.openInternalLink(blockedUrl);
851
- }
852
- }
853
- setValuesToProperties(result) {
854
- if (result) {
855
- this.exceededAttemptsWarning = result.error.maxAttemptsRemaining;
856
- this.loginErrors = result.error.loginWarnings;
857
- this.passwordErrors = result.error.passwordWarnings;
858
- this.blockedUrl = result.error.blockedUrl;
859
- }
860
- else {
861
- this.exceededAttemptsWarning = 0;
862
- this.loginErrors = [];
863
- this.passwordErrors = [];
864
- this.blockedUrl = '';
865
- }
866
- }
867
- }
868
- PoPageLoginBaseComponent.ɵfac = function PoPageLoginBaseComponent_Factory(t) { return new (t || PoPageLoginBaseComponent)(i0.ɵɵdirectiveInject(i1.PoPageLoginService), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i3.PoLanguageService)); };
869
- PoPageLoginBaseComponent.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: PoPageLoginBaseComponent, inputs: { background: ["p-background", "background"], logo: ["p-logo", "logo"], loginPattern: ["p-login-pattern", "loginPattern"], passwordPattern: ["p-password-pattern", "passwordPattern"], secondaryLogo: ["p-secondary-logo", "secondaryLogo"], customField: ["p-custom-field", "customField"], contactEmail: ["p-contact-email", "contactEmail"], productName: ["p-product-name", "productName"], environment: ["p-environment", "environment"], exceededAttemptsWarning: ["p-exceeded-attempts-warning", "exceededAttemptsWarning"], hideRememberUser: ["p-hide-remember-user", "hideRememberUser"], literals: ["p-literals", "literals"], loading: ["p-loading", "loading"], login: ["p-login", "login"], loginErrors: ["p-login-errors", "loginErrors"], passwordErrors: ["p-password-errors", "passwordErrors"], recovery: ["p-recovery", "recovery"], registerUrl: ["p-register-url", "registerUrl"], authenticationType: ["p-authentication-type", "authenticationType"], authenticationUrl: ["p-authentication-url", "authenticationUrl"], blockedUrl: ["p-blocked-url", "blockedUrl"], support: ["p-support", "support"], languagesList: ["p-languages", "languagesList"] }, outputs: { loginChange: "p-login-change", loginSubmit: "p-login-submit", passwordChange: "p-password-change", languageChange: "p-language-change" } });
870
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoPageLoginBaseComponent, [{
871
- type: Directive
872
- }], function () { return [{ type: i1.PoPageLoginService }, { type: i2.Router }, { type: i3.PoLanguageService }]; }, { background: [{
873
- type: Input,
874
- args: ['p-background']
875
- }], logo: [{
876
- type: Input,
877
- args: ['p-logo']
878
- }], loginPattern: [{
879
- type: Input,
880
- args: ['p-login-pattern']
881
- }], passwordPattern: [{
882
- type: Input,
883
- args: ['p-password-pattern']
884
- }], secondaryLogo: [{
885
- type: Input,
886
- args: ['p-secondary-logo']
887
- }], loginChange: [{
888
- type: Output,
889
- args: ['p-login-change']
890
- }], loginSubmit: [{
891
- type: Output,
892
- args: ['p-login-submit']
893
- }], passwordChange: [{
894
- type: Output,
895
- args: ['p-password-change']
896
- }], languageChange: [{
897
- type: Output,
898
- args: ['p-language-change']
899
- }], customField: [{
900
- type: Input,
901
- args: ['p-custom-field']
902
- }], contactEmail: [{
903
- type: Input,
904
- args: ['p-contact-email']
905
- }], productName: [{
906
- type: Input,
907
- args: ['p-product-name']
908
- }], environment: [{
909
- type: Input,
910
- args: ['p-environment']
911
- }], exceededAttemptsWarning: [{
912
- type: Input,
913
- args: ['p-exceeded-attempts-warning']
914
- }], hideRememberUser: [{
915
- type: Input,
916
- args: ['p-hide-remember-user']
917
- }], literals: [{
918
- type: Input,
919
- args: ['p-literals']
920
- }], loading: [{
921
- type: Input,
922
- args: ['p-loading']
923
- }], login: [{
924
- type: Input,
925
- args: ['p-login']
926
- }], loginErrors: [{
927
- type: Input,
928
- args: ['p-login-errors']
929
- }], passwordErrors: [{
930
- type: Input,
931
- args: ['p-password-errors']
932
- }], recovery: [{
933
- type: Input,
934
- args: ['p-recovery']
935
- }], registerUrl: [{
936
- type: Input,
937
- args: ['p-register-url']
938
- }], authenticationType: [{
939
- type: Input,
940
- args: ['p-authentication-type']
941
- }], authenticationUrl: [{
942
- type: Input,
943
- args: ['p-authentication-url']
944
- }], blockedUrl: [{
945
- type: Input,
946
- args: ['p-blocked-url']
947
- }], support: [{
948
- type: Input,
949
- args: ['p-support']
950
- }], languagesList: [{
951
- type: Input,
952
- args: ['p-languages']
953
- }] }); })();
954
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcGFnZS1sb2dpbi1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RlbXBsYXRlcy9zcmMvbGliL2NvbXBvbmVudHMvcG8tcGFnZS1sb2dpbi9wby1wYWdlLWxvZ2luLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkgsT0FBTyxFQUFxQixlQUFlLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUd6RyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7Ozs7QUFNL0YsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFdkMsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMsRUFBRSxFQUF1QjtRQUN2QixLQUFLLEVBQUUsU0FBUztRQUNoQixpQkFBaUIsRUFBRSxlQUFlO1FBQ2xDLFNBQVMsRUFBRTt1REFDd0M7UUFDbkQsZ0JBQWdCLEVBQUUsb0JBQW9CO1FBQ3RDLG9CQUFvQixFQUFFLGtCQUFrQjtRQUN4QyxtQkFBbUIsRUFBRSxzQkFBc0I7UUFDM0MsdUJBQXVCLEVBQUUsZUFBZTtRQUN4QyxzQkFBc0IsRUFBRSxzQkFBc0I7UUFDOUMsWUFBWSxFQUFFLGlCQUFpQjtRQUMvQixnQkFBZ0IsRUFBRSxxREFBcUQ7UUFDdkUsV0FBVyxFQUFFLE9BQU87UUFDcEIsY0FBYyxFQUFFLFlBQVk7UUFDNUIsY0FBYyxFQUFFLHVCQUF1QjtRQUN2QyxhQUFhLEVBQUUsRUFBRTtRQUNqQixXQUFXLEVBQUUsY0FBYztRQUMzQixZQUFZLEVBQUUsT0FBTztRQUNyQixrQkFBa0IsRUFBRSx1QkFBdUI7UUFDM0MsY0FBYyxFQUFFLGFBQWE7UUFDN0IsUUFBUSxFQUFFLG1CQUFtQjtRQUM3QixxQkFBcUIsRUFDbkIseUdBQXlHO1FBQzNHLHFCQUFxQixFQUFFLHVGQUF1RjtRQUM5RyxpQkFBaUIsRUFBRSxzQkFBc0I7UUFDekMsT0FBTyxFQUFFLFNBQVM7UUFDbEIsT0FBTyxFQUFFLFNBQVM7S0FDbkI7SUFDRCxFQUFFLEVBQXVCO1FBQ3ZCLEtBQUssRUFBRSxZQUFZO1FBQ25CLGlCQUFpQixFQUFFLGdCQUFnQjtRQUNuQyxTQUFTLEVBQUU7NkVBQzhEO1FBQ3pFLGdCQUFnQixFQUFFLG1CQUFtQjtRQUNyQyxvQkFBb0IsRUFBRSxxQkFBcUI7UUFDM0MsbUJBQW1CLEVBQUUsdUJBQXVCO1FBQzVDLHVCQUF1QixFQUFFLGtCQUFrQjtRQUMzQyxzQkFBc0IsRUFBRSwrQkFBK0I7UUFDdkQsWUFBWSxFQUFFLGtDQUFrQztRQUNoRCxnQkFBZ0IsRUFBRSx3REFBd0Q7UUFDMUUsV0FBVyxFQUFFLFFBQVE7UUFDckIsY0FBYyxFQUFFLGFBQWE7UUFDN0IsY0FBYyxFQUFFLDBCQUEwQjtRQUMxQyxhQUFhLEVBQUUsRUFBRTtRQUNqQixXQUFXLEVBQUUsZ0JBQWdCO1FBQzdCLFlBQVksRUFBRSxNQUFNO1FBQ3BCLGtCQUFrQixFQUFFLDBCQUEwQjtRQUM5QyxjQUFjLEVBQUUsaUJBQWlCO1FBQ2pDLFFBQVEsRUFBRSxnQkFBZ0I7UUFDMUIscUJBQXFCLEVBQUUsNEZBQTRGO1FBQ25ILHFCQUFxQixFQUNuQixtR0FBbUc7UUFDckcsaUJBQWlCLEVBQUUsc0JBQXNCO1FBQ3pDLE9BQU8sRUFBRSxZQUFZO1FBQ3JCLE9BQU8sRUFBRSxTQUFTO0tBQ25CO0lBQ0QsRUFBRSxFQUF1QjtRQUN2QixLQUFLLEVBQUUsV0FBVztRQUNsQixpQkFBaUIsRUFBRSxnQkFBZ0I7UUFDbkMsU0FBUyxFQUFFOzJEQUM0QztRQUN2RCxnQkFBZ0IsRUFBRSxtQkFBbUI7UUFDckMsb0JBQW9CLEVBQUUsZ0JBQWdCO1FBQ3RDLG1CQUFtQixFQUFFLGtCQUFrQjtRQUN2Qyx1QkFBdUIsRUFBRSxpQkFBaUI7UUFDMUMsc0JBQXNCLEVBQUUsMkJBQTJCO1FBQ25ELFlBQVksRUFBRSx1QkFBdUI7UUFDckMsZ0JBQWdCLEVBQUUscURBQXFEO1FBQ3ZFLFdBQVcsRUFBRSxRQUFRO1FBQ3JCLGNBQWMsRUFBRSxlQUFlO1FBQy9CLGNBQWMsRUFBRSxxQkFBcUI7UUFDckMsYUFBYSxFQUFFLEVBQUU7UUFDakIsV0FBVyxFQUFFLGVBQWU7UUFDNUIsWUFBWSxFQUFFLE1BQU07UUFDcEIsa0JBQWtCLEVBQUUscUJBQXFCO1FBQ3pDLGNBQWMsRUFBRSxpQkFBaUI7UUFDakMsUUFBUSxFQUFFLGNBQWM7UUFDeEIscUJBQXFCLEVBQUUsa0ZBQWtGO1FBQ3pHLHFCQUFxQixFQUFFLHNGQUFzRjtRQUM3RyxpQkFBaUIsRUFBRSxxQkFBcUI7UUFDeEMsT0FBTyxFQUFFLGFBQWE7UUFDdEIsT0FBTyxFQUFFLFNBQVM7S0FDbkI7SUFDRCxFQUFFLEVBQXVCO1FBQ3ZCLEtBQUssRUFBRSxtQkFBbUI7UUFDMUIsaUJBQWlCLEVBQUUsZ0JBQWdCO1FBQ25DLFNBQVMsRUFBRTtrRUFDbUQ7UUFDOUQsZ0JBQWdCLEVBQUUsdUNBQXVDO1FBQ3pELG9CQUFvQixFQUFFLGlCQUFpQjtRQUN2QyxtQkFBbUIsRUFBRSxxQkFBcUI7UUFDMUMsdUJBQXVCLEVBQUUsb0JBQW9CO1FBQzdDLHNCQUFzQixFQUFFLDhCQUE4QjtRQUN0RCxZQUFZLEVBQUUscUJBQXFCO1FBQ25DLGdCQUFnQixFQUFFLHNEQUFzRDtRQUN4RSxXQUFXLEVBQUUsT0FBTztRQUNwQixjQUFjLEVBQUUsYUFBYTtRQUM3QixjQUFjLEVBQUUsZ0JBQWdCO1FBQ2hDLGFBQWEsRUFBRSxFQUFFO1FBQ2pCLFdBQVcsRUFBRSxlQUFlO1FBQzVCLFlBQVksRUFBRSxLQUFLO1FBQ25CLGtCQUFrQixFQUFFLGdCQUFnQjtRQUNwQyxjQUFjLEVBQUUsMkNBQTJDO1FBQzNELFFBQVEsRUFBRSxhQUFhO1FBQ3ZCLHFCQUFxQixFQUFFLDRGQUE0RjtRQUNuSCxxQkFBcUIsRUFBRSx1RUFBdUU7UUFDOUYsaUJBQWlCLEVBQUUscUJBQXFCO1FBQ3hDLE9BQU8sRUFBRSxrQkFBa0I7UUFDM0IsT0FBTyxFQUFFLFdBQVc7S0FDckI7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUc7SUFDbEMsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLEdBQUc7Q0FDUixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFFSCxNQUFNLE9BQWdCLHdCQUF3QjtJQXF3QjVDLFlBQ1UsWUFBZ0MsRUFDakMsTUFBYyxFQUNkLGlCQUFvQztRQUZuQyxpQkFBWSxHQUFaLFlBQVksQ0FBb0I7UUFDakMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFoc0I3Qzs7Ozs7Ozs7OztXQVVHO1FBQ3VCLGdCQUFXLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFekY7Ozs7Ozs7O1dBUUc7UUFDdUIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBRXhFOzs7Ozs7Ozs7O1dBVUc7UUFDMEIsbUJBQWMsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUUvRjs7Ozs7Ozs7O1dBU0c7UUFDMEIsbUJBQWMsR0FBNkIsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUV2RyxtQkFBYyxHQUFrQixFQUFFLENBQUM7UUFDbkMsc0JBQWlCLEdBQWtCLEVBQUUsQ0FBQztRQUt0QyxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUU5QixnQ0FBMkIsR0FBRyxLQUFLLENBQUM7UUFFNUIsd0JBQW1CLEdBQWtDLDZCQUE2QixDQUFDLEtBQUssQ0FBQztRQU96RixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFFbkMsYUFBUSxHQUFhLEtBQUssQ0FBQztRQUUzQixpQkFBWSxHQUFrQixFQUFFLENBQUM7UUFDakMsb0JBQWUsR0FBa0IsRUFBRSxDQUFDO1FBMm5CMUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3BFLENBQUM7SUFybkJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0RHO0lBQ0gsSUFBNkIsV0FBVyxDQUFDLEtBQXNDO1FBQzdFLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pFLE9BQU87YUFDUjtZQUVELElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUMzRSxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUEyQixLQUFLLENBQUM7Z0JBRXZELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtvQkFDbEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUM7aUJBQ2hDO3FCQUFNO29CQUNMLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7aUJBQzVFO2dCQUVELE9BQU87YUFDUjtTQUNGO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUE4QixZQUFZLENBQUMsS0FBYTtRQUN0RCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUE2QixXQUFXLENBQUMsS0FBYTtRQUNwRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFBNEIsV0FBVyxDQUFDLFdBQW1CO1FBQ3pELElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsMkJBQTJCLEVBQUU7WUFDbkUsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1NBQzNFO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztTQUNqQztJQUNILENBQUM7SUFDRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsSUFBMEMsdUJBQXVCLENBQUMsS0FBYTtRQUM3RSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFJLHVCQUF1QjtRQUN6QixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILElBQW1DLGdCQUFnQixDQUFDLEtBQWM7UUFDaEUsSUFBSSxDQUFDLGlCQUFpQixHQUFRLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFNUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTJERztJQUNILElBQXlCLFFBQVEsQ0FBQyxLQUEwQjtRQUMxRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsSUFBd0IsT0FBTyxDQUFDLEtBQWM7UUFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFzQixLQUFLLENBQUMsS0FBYTtRQUN2QyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQTZCLFdBQVcsQ0FBQyxLQUFvQjtRQUMzRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFBZ0MsY0FBYyxDQUFDLEtBQW9CO1FBQ2pFLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FvQkc7SUFDSCxJQUF5QixRQUFRLENBQUMsS0FBOEM7UUFDOUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILElBQTZCLFdBQVcsQ0FBQyxLQUFhO1FBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQThCRztJQUNILElBQW9DLGtCQUFrQixDQUFDLEtBQW9DO1FBQ3pGLElBQUksQ0FBQyxtQkFBbUIsR0FBUyxNQUFPLENBQUMsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUM1RixDQUFDLENBQUMsS0FBSztZQUNQLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWdIRztJQUNILElBQW1DLGlCQUFpQixDQUFDLEtBQWE7UUFDaEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzFFLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQTRCLFVBQVUsQ0FBQyxLQUFhO1FBQ2xELElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbkUsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O09BaUJHO0lBQ0gsSUFBd0IsT0FBTyxDQUFDLEtBQXdCO1FBQ3RELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsSUFBMEIsYUFBYSxDQUFDLGFBQWdDO1FBQ3RFLElBQUksYUFBYSxFQUFFO1lBQ2pCLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRTtnQkFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7YUFDckM7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNqRztTQUNGO0lBQ0gsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7U0FDNUI7UUFDRCxPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLElBQUksdUJBQXVCLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsWUFBWTtZQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDOUQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLE9BQU87WUFDTCxHQUFHLDBCQUEwQixDQUFDLGVBQWUsQ0FBQztZQUM5QyxHQUFHLDBCQUEwQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDNUMsR0FBRyx5QkFBeUI7WUFDNUIsR0FBRyxJQUFJLENBQUMsUUFBUTtTQUNqQixDQUFDO0lBQ0osQ0FBQztJQVVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUVELGFBQWE7UUFDWCxNQUFNLFNBQVMsR0FBZ0I7WUFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDaEMsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7U0FDM0U7UUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVk7aUJBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQztpQkFDbkUsU0FBUyxDQUNSLElBQUksQ0FBQyxFQUFFO2dCQUNMLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM3QixjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixDQUFDLEVBQ0QsS0FBSyxDQUFDLEVBQUU7Z0JBQ04sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFO29CQUM1RCxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUN4RTtZQUNILENBQUMsQ0FDRixDQUFDO1NBQ0w7YUFBTTtZQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO1NBQ3JFO0lBQ0gsQ0FBQztJQUVPLDJCQUEyQixDQUFDLFFBQVE7UUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxHQUFXO1FBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxHQUFXO1FBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU8sa0JBQWtCLENBQUMsUUFBZ0IsRUFBRSxVQUFrQjtRQUM3RCxJQUFJLFFBQVEsS0FBSyxDQUFDLElBQUksVUFBVSxFQUFFO1lBQ2hDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUM7WUFDekMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNwRztJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxNQUFPO1FBQ25DLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxDQUFDLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUM7WUFDakUsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztZQUM5QyxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7WUFDcEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztTQUMzQzthQUFNO1lBQ0wsSUFBSSxDQUFDLHVCQUF1QixHQUFHLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztTQUN0QjtJQUNILENBQUM7O2dHQXYxQm1CLHdCQUF3QjsyRUFBeEIsd0JBQXdCO3VGQUF4Qix3QkFBd0I7Y0FEN0MsU0FBUzswSEFtQmUsVUFBVTtrQkFBaEMsS0FBSzttQkFBQyxjQUFjO1lBV0osSUFBSTtrQkFBcEIsS0FBSzttQkFBQyxRQUFRO1lBZ0JXLFlBQVk7a0JBQXJDLEtBQUs7bUJBQUMsaUJBQWlCO1lBZ0JLLGVBQWU7a0JBQTNDLEtBQUs7bUJBQUMsb0JBQW9CO1lBU0EsYUFBYTtrQkFBdkMsS0FBSzttQkFBQyxrQkFBa0I7WUFhQyxXQUFXO2tCQUFwQyxNQUFNO21CQUFDLGdCQUFnQjtZQVdFLFdBQVc7a0JBQXBDLE1BQU07bUJBQUMsZ0JBQWdCO1lBYUssY0FBYztrQkFBMUMsTUFBTTttQkFBQyxtQkFBbUI7WUFZRSxjQUFjO2tCQUExQyxNQUFNO21CQUFDLG1CQUFtQjtZQW9GRSxXQUFXO2tCQUF2QyxLQUFLO21CQUFDLGdCQUFnQjtZQXNDTyxZQUFZO2tCQUF6QyxLQUFLO21CQUFDLGlCQUFpQjtZQWNLLFdBQVc7a0JBQXZDLEtBQUs7bUJBQUMsZ0JBQWdCO1lBZUssV0FBVztrQkFBdEMsS0FBSzttQkFBQyxlQUFlO1lBdUJvQix1QkFBdUI7a0JBQWhFLEtBQUs7bUJBQUMsNkJBQTZCO1lBdUJELGdCQUFnQjtrQkFBbEQsS0FBSzttQkFBQyxzQkFBc0I7WUF1RUosUUFBUTtrQkFBaEMsS0FBSzttQkFBQyxZQUFZO1lBbUJLLE9BQU87a0JBQTlCLEtBQUs7bUJBQUMsV0FBVztZQWVJLEtBQUs7a0JBQTFCLEtBQUs7bUJBQUMsU0FBUztZQW1CYSxXQUFXO2tCQUF2QyxLQUFLO21CQUFDLGdCQUFnQjtZQWVTLGNBQWM7a0JBQTdDLEtBQUs7bUJBQUMsbUJBQW1CO1lBNkJELFFBQVE7a0JBQWhDLEtBQUs7bUJBQUMsWUFBWTtZQXNCVSxXQUFXO2tCQUF2QyxLQUFLO21CQUFDLGdCQUFnQjtZQXVDYSxrQkFBa0I7a0JBQXJELEtBQUs7bUJBQUMsdUJBQXVCO1lBMkhLLGlCQUFpQjtrQkFBbkQsS0FBSzttQkFBQyxzQkFBc0I7WUFnQkQsVUFBVTtrQkFBckMsS0FBSzttQkFBQyxlQUFlO1lBMEJFLE9BQU87a0JBQTlCLEtBQUs7bUJBQUMsV0FBVztZQXlCUSxhQUFhO2tCQUF0QyxLQUFLO21CQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuaW1wb3J0IHsgY29udmVydFRvQm9vbGVhbiwgY29udmVydFRvSW50LCBnZXRTaG9ydEJyb3dzZXJMYW5ndWFnZSwgaXNFeHRlcm5hbExpbmssIGlzVHlwZW9mIH0gZnJvbSAnLi8uLi8uLi91dGlscy91dGlsJztcclxuXHJcbmltcG9ydCB7IFBvTGFuZ3VhZ2VTZXJ2aWNlLCBwb0xvY2FsZURlZmF1bHQsIFBvTGFuZ3VhZ2UsIHBvTGFuZ3VhZ2VEZWZhdWx0IH0gZnJvbSAnQHBvLXVpL25nLWNvbXBvbmVudHMnO1xyXG5cclxuaW1wb3J0IHsgUG9QYWdlTG9naW4gfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1sb2dpbi5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSB9IGZyb20gJy4vZW51bXMvcG8tcGFnZS1sb2dpbi1hdXRoZW50aWNhdGlvbi10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtbG9naW4tY3VzdG9tLWZpZWxkLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvUGFnZUxvZ2luTGl0ZXJhbHMgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1sb2dpbi1saXRlcmFscy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1BhZ2VMb2dpblJlY292ZXJ5IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtbG9naW4tcmVjb3ZlcnkuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9QYWdlTG9naW5TZXJ2aWNlIH0gZnJvbSAnLi9wby1wYWdlLWxvZ2luLnNlcnZpY2UnO1xyXG5cclxuY29uc3QgcG9QYWdlTG9naW5Db250ZW50TWF4TGVuZ3RoID0gNDA7XHJcblxyXG5leHBvcnQgY29uc3QgcG9QYWdlTG9naW5MaXRlcmFsc0RlZmF1bHQgPSB7XHJcbiAgZW46IDxQb1BhZ2VMb2dpbkxpdGVyYWxzPntcclxuICAgIHRpdGxlOiAnV2VsY29tZScsXHJcbiAgICBsb2dpbkVycm9yUGF0dGVybjogJ0ludmFsaWQgTG9naW4nLFxyXG4gICAgbG9naW5IaW50OiBgWW91ciBsb2dpbiB1c2VyIHdhcyBnaXZlbiB0byB5b3UgYXQgeW91ciBmaXJzdCBkYXkuXHJcbiAgICBJZiB5b3UgZG9uJ3QgaGF2ZSB0aGlzIGluZm9ybWF0aW9uIGNvbnRhY3Qgc3VwcG9ydGAsXHJcbiAgICBsb2dpblBsYWNlaG9sZGVyOiAnSW5zZXJ0IHlvdXIgZS1tYWlsJyxcclxuICAgIHBhc3N3b3JkRXJyb3JQYXR0ZXJuOiAnSW52YWxpZCBQYXNzd29yZCcsXHJcbiAgICBwYXNzd29yZFBsYWNlaG9sZGVyOiAnSW5zZXJ0IHlvdXIgcGFzc3dvcmQnLFxyXG4gICAgY3VzdG9tRmllbGRFcnJvclBhdHRlcm46ICdJbnZhbGlkIHZhbHVlJyxcclxuICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICdQbGVhc2UgZW50ZXIgYSB2YWx1ZScsXHJcbiAgICByZW1lbWJlclVzZXI6ICdBdXRvbWF0aWMgbG9naW4nLFxyXG4gICAgcmVtZW1iZXJVc2VySGludDogJ1lvdSBjYW4gZGlzYWJsZSB0aGlzIG9wdGlvbiBpbiBzeXN0ZW0gY29uZmlndXJhdGlvbicsXHJcbiAgICBzdWJtaXRMYWJlbDogJ0VudGVyJyxcclxuICAgIHN1Ym1pdHRlZExhYmVsOiAnTG9hZGluZy4uLicsXHJcbiAgICBmb3Jnb3RQYXNzd29yZDogJ0ZvcmdvdCB5b3VyIFBhc3N3b3JkPycsXHJcbiAgICBoaWdobGlnaHRJbmZvOiAnJyxcclxuICAgIHJlZ2lzdGVyVXJsOiAnTmV3IHJlZ2lzdGVyJyxcclxuICAgIHRpdGxlUG9wb3ZlcjogJ09vcHMhJyxcclxuICAgIGZvcmdvdFlvdXJQYXNzd29yZDogJ0ZvcmdvdCB5b3VyIHBhc3N3b3JkPycsXHJcbiAgICBpZllvdVRyeUhhcmRlcjogJ0lmIHlvdSB0cnkgJyxcclxuICAgIGF0dGVtcHRzOiAnezB9IG1vcmUgdGltZShzKSAnLFxyXG4gICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOlxyXG4gICAgICAnd2l0aG91dCBzdWNjZXNzIHlvdXIgdXNlciB3aWxsIGJlIGJsb2NrZWQgYW5kIHlvdSB3aWxsIGJlIGxlZnQgMjQgaG91cnMgd2l0aG91dCBiZWluZyBhYmxlIHRvIGFjY2VzcyA6KCcsXHJcbiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6ICdCZXR0ZXIgY3JlYXRlIGEgbmV3IHBhc3N3b3JkIG5vdyEgWW91IHdpbGwgYmUgYWJsZSB0byBsb2cgaW50byB0aGUgc3lzdGVtIHJpZ2h0IGF3YXkuJyxcclxuICAgIGlGb3Jnb3RNeVBhc3N3b3JkOiAnSSBmb3Jnb3QgbXkgcGFzc3dvcmQnLFxyXG4gICAgd2VsY29tZTogJ1dlbGNvbWUnLFxyXG4gICAgc3VwcG9ydDogJ1N1cHBvcnQnXHJcbiAgfSxcclxuICBlczogPFBvUGFnZUxvZ2luTGl0ZXJhbHM+e1xyXG4gICAgdGl0bGU6ICdCaWVudmVuaWRvJyxcclxuICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAnTG9naW4gaW52w6FsaWRvJyxcclxuICAgIGxvZ2luSGludDogYFN1IHVzdWFyaW8gaGEgc2lkbyBlbnRyZWdhZG8gcGFyYSB1c3RlZCBlbiBzdSBwcmltZXIgZMOtYS5cclxuICAgIFNpIG5vIHRpZW5lIGVzdGEgaW5mb3JtYWNpw7NuLCBww7NuZ2FzZSBlbiBjb250YWN0byBjb24gZWwgc29wb3J0ZSB0w6ljbmljb2AsXHJcbiAgICBsb2dpblBsYWNlaG9sZGVyOiAnSW5zZXJ0ZSBzdSBlLW1haWwnLFxyXG4gICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICdDb250cmFzZcOxYSBpbnbDoWxpZGEnLFxyXG4gICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ0luc2VydGUgc3UgY29udHJhc2XDsWEnLFxyXG4gICAgY3VzdG9tRmllbGRFcnJvclBhdHRlcm46ICdWYWxvciBubyB2w6FsaWRvLicsXHJcbiAgICBjdXN0b21GaWVsZFBsYWNlaG9sZGVyOiAnUG9yIGZhdm9yIGludHJvZHV6Y2EgdW4gdmFsb3InLFxyXG4gICAgcmVtZW1iZXJVc2VyOiAnSW5pY2lvIGRlIHNlc2nDs24gYXV0b23DoXRpY2FtZW50ZScsXHJcbiAgICByZW1lbWJlclVzZXJIaW50OiAnUHVlZGUgZGVzaGFiaWxpdGFyIGVzdGEgb3BjacOzbiBlbiBlbCBtZW7DuiBkZWwgc2lzdGVtYS4nLFxyXG4gICAgc3VibWl0TGFiZWw6ICdFbnRyYXInLFxyXG4gICAgc3VibWl0dGVkTGFiZWw6ICdDYXJnYW5kby4uLicsXHJcbiAgICBmb3Jnb3RQYXNzd29yZDogJ09sdmlkYXN0ZSB0dSBjb250cmFzZcOxYT8nLFxyXG4gICAgaGlnaGxpZ2h0SW5mbzogJycsXHJcbiAgICByZWdpc3RlclVybDogJ051ZXZvIHJlZ2lzdHJvJyxcclxuICAgIHRpdGxlUG9wb3ZlcjogJ09wYSEnLFxyXG4gICAgZm9yZ290WW91clBhc3N3b3JkOiAnT2x2aWRhc3RlIHR1IGNvbnRyYXNlw7FhPycsXHJcbiAgICBpZllvdVRyeUhhcmRlcjogJ1NpIGludGVudGEgbcOhcyAnLFxyXG4gICAgYXR0ZW1wdHM6ICd7MH0gdmV6L3ZlY2VzICcsXHJcbiAgICB5b3VyVXNlcldpbGxCZUJsb2NrZWQ6ICdzaW4gw6l4aXRvIHN1IHVzdWFyaW8gc2VyYSBibG9xdWVhZG8geSB1c3RlZCB2w6FzIHBlcm1hbmVjZXIgMjQgaG9yYXMgc2luIHBvZGVyIGFjY2VkZXIgYSA6KCcsXHJcbiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6XHJcbiAgICAgICfCoU1lam9yIGNyZWFyIHVuYSBudWV2YSBjb250cmFzZcOxYSBhaG9yYSEgVXN0ZWQgcG9kcsOhIGVudHJhciBlbiBlbCBzaXN0ZW1hIGlubWVkaWF0YW1lbnRlIGRlc3B1w6lzLicsXHJcbiAgICBpRm9yZ290TXlQYXNzd29yZDogJ09sdmlkZSBtaSBjb250cmFzZcOxYScsXHJcbiAgICB3ZWxjb21lOiAnQmllbnZlbmlkbycsXHJcbiAgICBzdXBwb3J0OiAnU29wb3J0ZSdcclxuICB9LFxyXG4gIHB0OiA8UG9QYWdlTG9naW5MaXRlcmFscz57XHJcbiAgICB0aXRsZTogJ0JlbS12aW5kbycsXHJcbiAgICBsb2dpbkVycm9yUGF0dGVybjogJ0xvZ2luIGludsOhbGlkbycsXHJcbiAgICBsb2dpbkhpbnQ6IGBTZXUgdXN1w6FyaW8gZm9pIGVudHJlZ3VlIGEgdm9jw6ogbm8gc2V1IHByaW1laXJvIGRpYS5cclxuICAgIENhc28gbsOjbyB0ZW5oYSBtYWlzIGVzc2EgaW5mb3JtYcOnw6NvIGNvbnRhY3RlIG8gc3Vwb3J0ZWAsXHJcbiAgICBsb2dpblBsYWNlaG9sZGVyOiAnSW5zaXJhIHNldSBlLW1haWwnLFxyXG4gICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICdTZW5oYSBpbnbDoWxpZGEnLFxyXG4gICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ0luc2lyYSBzdWEgc2VuaGEnLFxyXG4gICAgY3VzdG9tRmllbGRFcnJvclBhdHRlcm46ICdWYWxvciBpbnbDoWxpZG8uJyxcclxuICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICdQb3IgZmF2b3IgaW5zaXJhIHVtIHZhbG9yJyxcclxuICAgIHJlbWVtYmVyVXNlcjogJ0xvZ2FyIGF1dG9tYXRpY2FtZW50ZScsXHJcbiAgICByZW1lbWJlclVzZXJIaW50OiAnVm9jw6ogcG9kZSBkZXNhYmlsaXRhciBlc3NhIG9ww6fDo28gbm8gbWVudSBkbyBzaXN0ZW1hJyxcclxuICAgIHN1Ym1pdExhYmVsOiAnRW50cmFyJyxcclxuICAgIHN1Ym1pdHRlZExhYmVsOiAnQ2FycmVnYW5kby4uLicsXHJcbiAgICBmb3Jnb3RQYXNzd29yZDogJ0VzcXVlY2V1IHN1YSBzZW5oYT8nLFxyXG4gICAgaGlnaGxpZ2h0SW5mbzogJycsXHJcbiAgICByZWdpc3RlclVybDogJ05vdm8gcmVnaXN0cm8nLFxyXG4gICAgdGl0bGVQb3BvdmVyOiAnT3BhIScsXHJcbiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcclxuICAgIGlmWW91VHJ5SGFyZGVyOiAnU2UgdGVudGFyIG1haXMgJyxcclxuICAgIGF0dGVtcHRzOiAnezB9IHZleihlcykgJyxcclxuICAgIHlvdXJVc2VyV2lsbEJlQmxvY2tlZDogJ3NlbSBzdWNlc3NvIHNldSB1c3XDoXJpbyBzZXLDoSBibG9xdWVhZG8gZSB2b2PDqiBmaWNhIDI0IGhvcmFzIHNlbSBwb2RlciBhY2Vzc2FyIDooJyxcclxuICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzogJ01lbGhvciBjcmlhciB1bWEgc2VuaGEgbm92YSBhZ29yYSEgVm9jw6ogdmFpIHBvZGVyIGVudHJhciBubyBzaXN0ZW1hIGxvZ28gZW0gc2VndWlkYS4nLFxyXG4gICAgaUZvcmdvdE15UGFzc3dvcmQ6ICdFc3F1ZWNpIG1pbmhhIHNlbmhhJyxcclxuICAgIHdlbGNvbWU6ICdCb2FzLXZpbmRhcycsXHJcbiAgICBzdXBwb3J0OiAnU3Vwb3J0ZSdcclxuICB9LFxyXG4gIHJ1OiA8UG9QYWdlTG9naW5MaXRlcmFscz57XHJcbiAgICB0aXRsZTogJ9CU0L7QsdGA0L4g0L/QvtC20LDQu9C+0LLQsNGC0YwhJyxcclxuICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAn0J3QtdCy0LXRgNC90YvQuSDQu9C+0LPQuNC9JyxcclxuICAgIGxvZ2luSGludDogYNCS0LDRiCDQu9C+0LPQuNC9INCx0YvQuyDQv9GA0LXQtNC+0YHRgtCw0LLQu9C10L0g0LLQsNC8INCyINC/0LXRgNCy0YvQuSDQtNC10L3RjC5cclxuICAgINCV0YHQu9C4INGDINCy0LDRgSDQvdC10YIg0Y3RgtC+0Lkg0LjQvdGE0L7RgNC80LDRhtC40LgsINC+0LHRgNCw0YLQuNGC0LXRgdGMINCyINGB0LvRg9C20LHRgyDQv9C+0LTQtNC10YDQttC60LhgLFxyXG4gICAgbG9naW5QbGFjZWhvbGRlcjogJ9CS0YHRgtCw0LLRjNGC0LUg0YHQstC+0Lkg0LDQtNGA0LXRgSDRjdC70LXQutGC0YDQvtC90L3QvtC5INC/0L7Rh9GC0YsnLFxyXG4gICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICfQndC10LLQtdGA0L3Ri9C5INC/0LDRgNC+0LvRjCcsXHJcbiAgICBwYXNzd29yZFBsYWNlaG9sZGVyOiAn0JLQstC10LTQuNGC0LUg0YHQstC+0Lkg0L/QsNGA0L7Qu9GMJyxcclxuICAgIGN1c3RvbUZpZWxkRXJyb3JQYXR0ZXJuOiAn0J3QtdCy0LXRgNC90L7QtSDQt9C90LDRh9C10L3QuNC1LicsXHJcbiAgICBjdXN0b21GaWVsZFBsYWNlaG9sZGVyOiAn0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INC30L3QsNGH0LXQvdC40LUnLFxyXG4gICAgcmVtZW1iZXJVc2VyOiAn0JDQstGC0L7QvNCw0YLQuNGH0LXRgdC60LjQuSDQstGF0L7QtCcsXHJcbiAgICByZW1lbWJlclVzZXJIaW50OiAn0JLRiyDQvNC+0LbQtdGC0LUg0L7RgtC60LvRjtGH0LjRgtGMINGN0YLRgyDQvtC/0YbQuNGOINCyINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQuCDRgdC40YHRgtC10LzRiycsXHJcbiAgICBzdWJtaXRMYWJlbDogJ9CS0L7QudGC0LgnLFxyXG4gICAgc3VibWl0dGVkTGFiZWw6ICcz0LDQs9GA0YPQt9C60LAuLi4nLFxyXG4gICAgZm9yZ290UGFzc3dvcmQ6ICfQl9Cw0LHRi9C70Lgg0L/QsNGA0L7Qu9GMPycsXHJcbiAgICBoaWdobGlnaHRJbmZvOiAnJyxcclxuICAgIHJlZ2lzdGVyVXJsOiAn0J3QvtCy0YvQuSDRgNC10LPQuNGB0YLRgCcsXHJcbiAgICB0aXRsZVBvcG92ZXI6ICfQntC5IScsXHJcbiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICfQl9Cw0LHRi9C70Lgg0L/QsNGA0L7Qu9GMPycsXHJcbiAgICBpZllvdVRyeUhhcmRlcjogJ9CV0YHQu9C4INCy0Ysg0LHQtdC30YPRgdC/0LXRiNC90L4g0L/QvtC/0YvRgtCw0LXRgtC10YHRjCDQstC+0LnRgtC4INC10YnQtSAnLFxyXG4gICAgYXR0ZW1wdHM6ICd7MH0g0YDQsNC3KNCwKSAnLFxyXG4gICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOiAn0JLQsNGIINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjCDQsdGD0LTQtdGCINC30LDQsdC70L7QutC40YDQvtCy0LDQvSwg0Lgg0JLRiyDQvtGB0YLQsNC90LXRgtC10YHRjCDQvdCwIDI0INGH0LDRgdCwINCx0LXQtyDQstC+0LfQvNC+0LbQvdC+0YHRgtC4INC00L7RgdGC0YPQv9CwIDooJyxcclxuICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzogJ9Cb0YPRh9GI0LUg0YHQvtC30LTQsNC50YLQtSDQvdC+0LLRi9C5INC/0LDRgNC+0LvRjCDRgdC10LnRh9Cw0YEhwqDQktGLINGB0LzQvtC20LXRgtC1INGB0YDQsNC30YMg0LLQvtC50YLQuCDQsiDRgdC40YHRgtC10LzRgy4nLFxyXG4gICAgaUZvcmdvdE15UGFzc3dvcmQ6ICfQryDQt9Cw0LHRi9C7INGB0LLQvtC5INC/0LDRgNC+0LvRjCcsXHJcbiAgICB3ZWxjb21lOiAn0LTQvtCx0YDQviDQv9C+0LbQsNC70L7QstCw0YLRjCcsXHJcbiAgICBzdXBwb3J0OiAn0J/QvtC00LTQtdGA0LbQutCwJ1xyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBwb1BhZ2VMb2dpbkxpdGVyYWxJbiA9IHtcclxuICBlbjogJ2luJyxcclxuICBlczogJ2VuJyxcclxuICBwdDogJ2VtJyxcclxuICBydTogJ9CyJ1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKlxyXG4gKiBPIGNvbXBvbmVudGUgYHBvLXBhZ2UtbG9naW5gIMOpIHV0aWxpemFkbyBjb21vIHRlbXBsYXRlIHBhcmEgdGVsYSBkZSBsb2dpbi5cclxuICogQ29tIGVsZSDDqSBwb3Nzw612ZWwgZGVmaW5pcm1vcyB2YWxvcmVzIHBhcmEgdXN1w6FyaW8sIHNlbmhhIGUgZGVmaW5pciBhw6fDtWVzIHBhcmEgcmVjdXBlcmHDp8OjbyBkZSBzZW5oYSBlIGdyYXZhw6fDo28gZGUgZGFkb3MgZG8gdXN1w6FyaW8uXHJcbiAqIFRhbWLDqW0gw6kgcG9zc8OtdmVsIGluc2VyaXIgdW1hIGltYWdlbSBlbSBjb25qdW50byBjb20gdW0gdGV4dG8gZGUgZGVzdGFxdWUuXHJcbiAqXHJcbiAqXHJcbiAqIEEgcHJvcHJpZWRhZGUgYHAtYXV0aGVudGljYXRpb24tdXJsYCBhdXRvbWF0aXphIGEgcm90aW5hIGRvIGNvbXBvbmVudGUgZSBzaW1wbGlmaWNhIG8gcHJvY2Vzc28gcGFyYSBhdXRlbnRpY2HDp8OjbyBkbyB1c3XDoXJpbywgYmFzdGFuZG9cclxuICogZGVmaW5pciB1bWEgdXJsIHBhcmEgcmVxdWlzacOnw6NvIGRhIGF1dGVudGljYcOnw6NvLiBBIGZsZXhpYmlsaWRhZGUgZSBwcmF0aWNpZGFkZSBwb2RlbSBjaGVnYXIgYSB1bSBuw612ZWwgZW0gcXVlIG8gZGVzZW52b2x2aW1lbnRvXHJcbiAqIGRhIGFwbGljYcOnw6NvIG5vICpjbGllbnQgc2lkZSogw6kgZGVzcHJvdmlkYSBkZSBxdWFscXVlciBjw7NkaWdvLWZvbnRlIHJlbGFjaW9uYWRvIMOgIHJvdGluYSBkZSBsb2dpbiBkZSB1c3XDoXJpby5cclxuICogU2V1IGRldGFsaGFtZW50byBwYXJhIHVzbyBwb2RlIHNlciB2aXN0byBsb2dvIGFiYWl4byBlbSAqcHJvcHJpZWRhZGVzKi5cclxuICogQ2FzbyBqdWxndWUgbmVjZXNzw6FyaW8sIHBvZGUtc2UgdGFtYsOpbSBkZWZpbmlyIG1hbnVhbG1lbnRlIGEgcm90aW5hIGRvIGNvbXBvbmVudGUuXHJcbiAqXHJcbiAqXHJcbiAqIFBhcmEgcXVlIGFzIGltYWdlbnMgc2VqYW0gZXhpYmlkYXMgY29ycmV0YW1lbnRlLCDDqSBuZWNlc3PDoXJpbyBpbmNsdWlyIG8gY2FtaW5obyBkZWxhcyBhbyBwcm9qZXRvLiBQYXJhIGlzc28sIGVkaXRlXHJcbiAqIG8gKmFzc2V0cyogbm8gYXJxdWl2byAqKmFuZ3VsYXIuanNvbioqIGRhIGFwbGljYcOnw6NvIG5hIHNlZ3VpbnRlIG9yZGVtOlxyXG4gKiBgYGBcclxuICogICBcImFzc2V0c1wiOiBbXHJcbiAqICAgICBcInNyYy9hc3NldHNcIixcclxuICogICAgIFwic3JjL2Zhdmljb24uaWNvXCIsXHJcbiAqICAgICB7XHJcbiAqICAgICAgIFwiZ2xvYlwiOiBcIioqXFwvKlwiLFxyXG4gKiAgICAgICBcImlucHV0XCI6IFwibm9kZV9tb2R1bGVzL0Bwby11aS9zdHlsZS9pbWFnZXNcIixcclxuICogICAgICAgXCJvdXRwdXRcIjogXCJhc3NldHMvaW1hZ2VzXCJcclxuICogICAgIH1cclxuICogICBdXHJcbiAqIGBgYFxyXG4gKi9cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQb1BhZ2VMb2dpbkJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIC8qKlxyXG4gICAqIE8gYHAtYmFja2dyb3VuZGAgcGVybWl0ZSBpbnNlcmlyIHVtYSBpbWFnZW0gZGUgZGVzdGFxdWUgYW8gbGFkbyBkaXJlaXRvIGRvIGZvcm11bMOhcmlvIGRlIGxvZ2luLCBjYXNvIGEgcHJvcHJpZWRhZGVcclxuICAgKiBuw6NvIHNlamEgcHJlZW5jaGlkYSBvIGZvcm11bMOhcmlvIHNlcsOhIGNlbnRyYWxpemFkbyBubyBlc3Bhw6dvIGRpc3BvbsOtdmVsLlxyXG4gICAqXHJcbiAgICogQSBmb250ZSBkYSBpbWFnZW0gcG9kZSBzZXIgZGUgdW0gY2FtaW5obyBsb2NhbCBvdSB1bWEgdXJsIGRlIHVtIHNlcnZpZG9yIGV4dGVybm8uXHJcbiAgICpcclxuICAgKiBBbMOpbSBkYSBpbWFnZW0sIMOpIHBvc3PDrXZlbCBhZGljaW9uYXIgdW0gdGV4dG8gaW5mb3JtYXRpdm8gcG9yIGNpbWEgZGEgaW1hZ2VtIGRhIGltYWdlbSBkZSBkZXN0YXF1ZSwgcGFyYSBpc3NvIGluZm9ybWVcclxuICAgKiB1bSB2YWxvciBwYXJhIGEgbGl0ZXJhbCBgaGlnaGxpZ2h0SW5mb2AuXHJcbiAgICpcclxuICAgKiA+IFZlamEgbWFpcyBzb2JyZSBhcyBsaXRlcmFpcyBuYSBwcm9wcmllZGFkZSBgcC1saXRlcmFsc2AuXHJcbiAgICpcclxuICAgKiBFeGVtcGxvcyBkZSB2YWxvcmVzIHbDoWxpZG9zOlxyXG4gICAqIC0gKipsb2NhbCoqOiBgLi9hc3NldHMvaW1hZ2VzL2xvZ2luLWJhY2tncm91bmQucG5nYFxyXG4gICAqIC0gKip1cmwgZXh0ZXJuYSoqOiBgaHR0cHM6Ly9wby11aS5pby9hc3NldHMvaW1hZ2VzL2xvZ2luLWJhY2tncm91bmQucG5nYFxyXG4gICAqXHJcbiAgICogPiBFc3NhIHByb3ByaWVkYWRlIMOpIGlnbm9yYWRhIHBhcmEgYXBsaWNhw6fDtWVzIG1vYmlsZS5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtYmFja2dyb3VuZCcpIGJhY2tncm91bmQ/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBDYW1pbmhvIHBhcmEgYSBsb2dvbWFyY2EgbG9jYWxpemFkYSBuYSBwYXJ0ZSBzdXBlcmlvci5cclxuICAgKlxyXG4gICAqID4gQ2FzbyBzZWphIGluZGVmaW5pZGEgbyBlc3Bhw6dvIHNlIG1hbnTDqW0gcHJlc2VydmFkbyBwb3LDqW0gdmF6aW8uXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWxvZ28nKSBsb2dvPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogRXhwcmVzc8OjbyByZWd1bGFyIHBhcmEgdmFsaWRhciBvIGNhbXBvIGRlIGxvZ2luLCBjYXNvIGEgZXhwcmVzc8OjbyBuw6NvIHNlamEgYXRlbnRpZGEsIGEgbGl0ZXJhbCBgbG9naW5FcnJvclBhdHRlcm5gXHJcbiAgICogc2Vyw6EgZXhpYmlkYS5cclxuICAgKlxyXG4gICAqIEV4ZW1wbG9zIGRlIHZhbG9yZXMgdsOhbGlkb3M6XHJcbiAgICogLSBlbWFpbDogYFtleHByZXNzYW8tcmVndWxhci1lbWFpbF1gXHJcbiAgICogLSBjcGY6IGBbZXhwcmVzc2FvLXJlZ3VsYXItY3BmXWBcclxuICAgKlxyXG4gICAqID4gVmVqYSBhIHByb3ByaWVkYWRlIGBwLWxpdGVyYWxzYCBwYXJhIGN1c3RvbWl6YXIgYSBsaXRlcmFsIGBsb2dpbkVycm9yUGF0dGVybmAuXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWxvZ2luLXBhdHRlcm4nKSBsb2dpblBhdHRlcm4/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBFeHByZXNzw6NvIHJlZ3VsYXIgcGFyYSB2YWxpZGFyIG8gY2FtcG8gZGUgcGFzc3dvcmQsIGNhc28gYSBleHByZXNzw6NvIG7Do28gc2VqYSBhdGVudGlkYSwgYSBsaXRlcmFsIGBwYXNzd29yZEVycm9yUGF0dGVybmBcclxuICAgKiBzZXLDoSBleGliaWRhLlxyXG4gICAqXHJcbiAgICogRXhlbXBsb3MgZGUgdmFsb3JlcyB2w6FsaWRvczpcclxuICAgKiAtIEFwZW5hcyBuw7ptZXJvczogYFxcZD9gXHJcbiAgICogLSBMZXRyYXMgbcOtbnVzY3VsYXM6IGBcXHo/YFxyXG4gICAqXHJcbiAgICogPiBWZWphIGEgcHJvcHJpZWRhZGUgYHAtbGl0ZXJhbHNgIHBhcmEgY3VzdG9taXphciBhIGxpdGVyYWwgYHBhc3N3b3JkRXJyb3JQYXR0ZXJuYC5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtcGFzc3dvcmQtcGF0dGVybicpIHBhc3N3b3JkUGF0dGVybj86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIENhbWluaG8gcGFyYSBhIGxvZ29tYXJjYSBsb2NhbGl6YWRhIG5vIHJvZGFww6kuXHJcbiAgICovXHJcbiAgQElucHV0KCdwLXNlY29uZGFyeS1sb2dvJykgc2Vjb25kYXJ5TG9nbz86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIEV2ZW50byBkaXNwYXJhZG8gcXVhbmRvIG8gdXN1w6FyaW8gYWx0ZXJhciBvIGlucHV0IGRvIGNhbXBvIGxvZ2luLlxyXG4gICAqXHJcbiAgICogRXNzZSBldmVudG8gcmVjZWJlcsOhIGNvbW8gcGFyw6JtZXRybyB1bWEgdmFyacOhdmVsIGRvIHRpcG8gYHN0cmluZ2AgY29tIG8gdGV4dG8gaW5mb3JtYWRvIG5vIGNhbXBvLlxyXG4gICAqXHJcbiAgICogPiBFc3RhIHByb3ByaWVkYWRlIHNlcsOhIGlnbm9yYWRhIHNlIGZvciBkZWZpbmlkbyB2YWxvciBwYXJhIGEgcHJvcHJpZWRhZGUgYHAtYXV0aGVudGljYXRpb24tdXJsYC5cclxuICAgKi9cclxuICBAT3V0cHV0KCdwLWxvZ2luLWNoYW5nZScpIGxvZ2luQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gZGlzcGFyYWRvIGFvIHN1Ym1ldGVyIG8gZm9ybXVsw6FyaW8gZGUgbG9naW4gKGFwZXJ0YW5kbyBgRW50ZXJgIGRlbnRybyBkb3MgY2FtcG9zIG91IHByZXNzaW9uYW5kbyBvIGJvdMOjbyBkZSBjb25maXJtYcOnw6NvKS5cclxuICAgKlxyXG4gICAqIEVzc2UgZXZlbnRvIHJlY2ViZXLDoSBjb21vIHBhcsOibWV0cm8gdW0gb2JqZXRvIGRvIHRpcG8gYFBvUGFnZUxvZ2luYCBjb20gb3MgZGFkb3MgaW5mb3JtYWRvcyBubyBmb3JtdWzDoXJpby5cclxuICAgKlxyXG4gICAqID4gRXN0YSBwcm9wcmllZGFkZSBzZXLDoSBpZ25vcmFkYSBzZSBmb3IgZGVmaW5pZG8gdmFsb3IgcGFyYSBhIHByb3ByaWVkYWRlIGBwLXVybC1yZWNvdmVyeWAuXHJcbiAgICpcclxuICAgKiA+IFBhcmEgbWFpcyBkZXRhbGhlcyBjb25zdWx0ZSBhIGRvY3VtZW50YcOnw6NvIHNvYnJlIGEgaW50ZXJmYWNlIGBQb1BhZ2VMb2dpbmAgbWFpcyBhYmFpeG8uXHJcbiAgICovXHJcbiAgQE91dHB1dCgncC1sb2dpbi1zdWJtaXQnKSBsb2dpblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UG9QYWdlTG9naW4+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBFdmVudG8gZGlzcGFyYWRvIHF1YW5kbyBvIHVzdcOhcmlvIGFsdGVyYXIgbyBpbnB1dCBkbyBjYW1wbyBwYXNzd29yZC5cclxuICAgKlxyXG4gICAqIEVzc2UgZXZlbnRvIHJlY2ViZXLDoSBjb21vIHBhcsOibWV0cm8gdW1hIHZhcmnDoXZlbCBkbyB0aXBvIGBzdHJpbmdgIGNvbSBvIHRleHRvIGluZm9ybWFkbyBubyBjYW1wby5cclxuICAgKlxyXG4gICAqID4gRXN0YSBwcm9wcmllZGFkZSBzZXLDoSBpZ25vcmFkYSBzZSBmb3IgZGVmaW5pZG8gdmFsb3IgcGFyYSBhIHByb3ByaWVkYWRlIGBwLWF1dGhlbnRpY2F0aW9uLXVybGAuXHJcbiAgICovXHJcbiAgQE91dHB1dCgncC1wYXNzd29yZC1jaGFuZ2UnKSBwYXNzd29yZENoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIEV2ZW50byBkaXNwYXJhZG8gcXVhbmRvIG8gdXN1w6FyaW8gYWx0ZXJhciBvIGlkaW9tYSBkYSBww6FnaW5hLlxyXG4gICAqXHJcbiAgICogRXNzZSBldmVudG8gcmVjZWJlcsOhIGNvbW8gcGFyw6JtZXRybyB1bSBvYmpldG8gZG8gdGlwbyBgUG9MYW5ndWFnZWAgY29tIGEgbGluZ3VhZ2VtIHNlbGVjaW9uYWRhLlxyXG4gICAqXHJcbiAgICovXHJcbiAgQE91dHB1dCgncC1sYW5ndWFnZS1jaGFuZ2UnKSBsYW5ndWFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPFBvTGFuZ3VhZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxQb0xhbmd1YWdlPigpO1xyXG5cclxuICBhbGxMb2dpbkVycm9yczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gIGFsbFBhc3N3b3JkRXJyb3JzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgY3VzdG9tRmllbGRPYmplY3Q6IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQ7XHJcbiAgY3VzdG9tRmllbGRUeXBlOiBzdHJpbmc7XHJcbiAgbG9naW5TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwYXNzd29yZDogc3RyaW5nO1xyXG4gIHJlbWVtYmVyVXNlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkTGFuZ3VhZ2U6IHN0cmluZztcclxuICBzaG93RXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfYXV0aGVudGljYXRpb25UeXBlOiBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSA9IFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlLkJhc2ljO1xyXG4gIHByaXZhdGUgX2F1dGhlbnRpY2F0aW9uVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfYmxvY2tlZFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2NvbnRhY3RFbWFpbDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2N1c3RvbUZpZWxkOiBzdHJpbmcgfCBQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkO1xyXG4gIHByaXZhdGUgX2Vudmlyb25tZW50Pzogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nPzogbnVtYmVyO1xyXG4gIHByaXZhdGUgX2hpZGVSZW1lbWJlclVzZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9saXRlcmFsczogUG9QYWdlTG9naW5MaXRlcmFscztcclxuICBwcml2YXRlIF9sb2FkaW5nPzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2xvZ2luOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfbG9naW5FcnJvcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuICBwcml2YXRlIF9wYXNzd29yZEVycm9yczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gIHByaXZhdGUgX3Byb2R1Y3ROYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfcmVjb3Zlcnk6IHN0cmluZyB8IFBvUGFnZUxvZ2luUmVjb3ZlcnkgfCBGdW5jdGlvbjtcclxuICBwcml2YXRlIF9yZWdpc3RlclVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3N1cHBvcnQ6IHN0cmluZyB8IEZ1bmN0aW9uO1xyXG4gIHByaXZhdGUgX2xhbmd1YWdlc0xpc3Q6IEFycmF5PFBvTGFuZ3VhZ2U+O1xyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogQW8gaW5mb3JtYXIgdW0gdmFsb3IgZG8gdGlwbyBgc3RyaW5nYCwgbyBtZXNtbyBzZXLDoSBhcGxpY2FkbyBjb21vIGEgY2hhdmUgZG8gY2FtcG8gY3VzdG9taXphZG8gZSB1dGlsaXphcsOhXHJcbiAgICogb3MgdmFsb3JlcyBwYWRyw7VlcyBjb250aWRvcyBuYSBwcm9wcmllZGFkZSBgbGl0ZXJhbHNgIGNvbW8gYGN1c3RvbUZpZWxkRXJyb3JQYXR0ZXJuYCBlIGBjdXN0b21GaWVsZFBsYWNlaG9sZGVyYC5cclxuICAgKlxyXG4gICAqIEV4aXN0ZSBhIHBvc3NpYmlsaWRhZGUgZGUgaW5mb3JtYXIgdW0gb2JqZXRvIHF1ZSBzZWd1ZSBhIGRlZmluacOnw6NvIGRhIGludGVyZmFjZSBgUG9QYWdlTG9naW5DdXN0b21GaWVsZGAsIG9uZGVcclxuICAgKiBhdHJhdsOpcyBkb3MgcGFyw6JtZXRyb3MgZW52aWFkb3MgcG9kZSBnZXJhciB1bSBgcG8taW5wdXRgLCBgcG8tY29tYm9gIGVzcGVjaWZpY2FtZW50ZSBwYXJhIHNlcnZpw6dvc1xyXG4gICAqIG91IGBwby1zZWxlY3RgIHBhcmEgdmFsb3JlcyBmaXhvcy5cclxuICAgKlxyXG4gICAqIEFiYWl4byBzZWd1ZW0gb3MgZXhlbXBsb3MgZGUgY2FkYSB0aXBvIGRlIGNhbXBvLlxyXG4gICAqXHJcbiAgICogYHBvLWlucHV0YDpcclxuICAgKlxyXG4gICAqIGBgYFxyXG4gICAqIHtcclxuICAgKiAgIHByb3BlcnR5OiAnZG9tYWluJyxcclxuICAgKiAgIHZhbHVlOiAnanYwMScsXHJcbiAgICogICBwbGFjZWhvbGRlcjogJ0VudGVyIHlvdXIgZG9tYWluJyxcclxuICAgKiAgIHBhdHRlcm46ICdbYS16XScsXHJcbiAgICogICBlcnJvclBhdHRlcm46ICdJbnZhbGlkIHZhbHVlJ1xyXG4gICAqIH1cclxuICAgKiBgYGBcclxuICAgKlxyXG4gICAqIGBwby1jb21ib2A6XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiB7XHJcbiAgICogICBwcm9wZXJ0eTogJ2RvbWFpbicsXHJcbiAgICogICB2YWx1ZTogJ2p2MDEnLFxyXG4gICAqICAgcGxhY2Vob2xkZXI6ICdFbnRlciB5b3VyIGRvbWFpbicsXHJcbiAgICogICB1cmw6ICdodHRwczovL3BvLXVpLmlvL3NhbXBsZS9hcGkvY29tYm9PcHRpb24vZG9tYWlucycsXHJcbiAgICogICBmaWVsZFZhbHVlOiAnbmlja25hbWUnXHJcbiAgICogfVxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogYHBvLXNlbGVjdGA6XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiB7XHJcbiAgICogICBwcm9wZXJ0eTogJ2RvbWFpbicsXHJcbiAgICogICB2YWx1ZTogJ2p2MDEnLFxyXG4gICAqICAgcGxhY2Vob2xkZXI6ICdFbnRlciB5b3VyIGRvbWFpbicsXHJcbiAgICogICBvcHRpb25zOiBbe2xhYmVsOiAnRG9tYWluIDEnLCB2YWx1ZTogJzEnfSwge2xhYmVsOiAnRG9tYWluIDInLCB2YWx1ZTogJzInfV1cclxuICAgKiB9XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBDYXNvIG8gY3VzdG9tRmllbGQgcG9zc3VhIG9wdGlvbnMsIHVybCBlIGZpZWxkVmFsdWUgcHJlZW5jaGlkb3MsIHNlcsOhIHByaW9yaXphZG8gbyBwby1zZWxlY3RcclxuICAgKiB1dGlsaXphbmRvIG8gb3B0aW9ucy5cclxuICAgKlxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1jdXN0b20tZmllbGQnKSBzZXQgY3VzdG9tRmllbGQodmFsdWU6IHN0cmluZyB8IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBpZiAoaXNUeXBlb2YodmFsdWUsICdzdHJpbmcnKSkge1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRmllbGRUeXBlID0gJ2lucHV0JztcclxuICAgICAgICB0aGlzLl9jdXN0b21GaWVsZCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRmllbGRPYmplY3QgPSB0aGlzLmdldERlZmF1bHRDdXN0b21GaWVsZE9iamVjdCh2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNUeXBlb2YodmFsdWUsICdvYmplY3QnKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWVbJ3Byb3BlcnR5J10pIHtcclxuICAgICAgICB0aGlzLl9jdXN0b21GaWVsZCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRmllbGRPYmplY3QgPSA8UG9QYWdlTG9naW5DdXN0b21GaWVsZD52YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmN1c3RvbUZpZWxkT2JqZWN0Lm9wdGlvbnMgJiYgIXRoaXMuY3VzdG9tRmllbGRPYmplY3QudXJsKSB7XHJcbiAgICAgICAgICB0aGlzLmN1c3RvbUZpZWxkVHlwZSA9ICdpbnB1dCc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tRmllbGRUeXBlID0gdGhpcy5jdXN0b21GaWVsZE9iamVjdC5vcHRpb25zID8gJ3NlbGVjdCcgOiAnY29tYm8nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fY3VzdG9tRmllbGQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmN1c3RvbUZpZWxkT2JqZWN0ID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1c3RvbUZpZWxkKCk6IHN0cmluZyB8IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1c3RvbUZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIFBlcnNvbmFsaXphIG8gZS1tYWlsIHF1ZSDDqSBleGliaWRvIG5hIG1lbnNhZ2VtIGRlIGRpY2EgZGUgbG9naW4gcGFkcsOjbyBwYXJhIGNvbnRhdG8gZGUgc3Vwb3J0ZS5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtY29udGFjdC1lbWFpbCcpIHNldCBjb250YWN0RW1haWwodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fY29udGFjdEVtYWlsID0gdmFsdWU7XHJcbiAgfVxyXG4gIGdldCBjb250YWN0RW1haWwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udGFjdEVtYWlsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIFRleHRvIGN1c3RvbWl6YWRvIHF1ZSBmaWNhIGVudHJlIGEgbG9nbyBlIGEgbWVuc2FnZW0gZGUgYm9hcy12aW5kYXMuXHJcbiAgICovXHJcbiAgQElucHV0KCdwLXByb2R1Y3QtbmFtZScpIHNldCBwcm9kdWN0TmFtZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9wcm9kdWN0TmFtZSA9IHZhbHVlO1xyXG4gIH1cclxuICBnZXQgcHJvZHVjdE5hbWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvZHVjdE5hbWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIEFkaWNpb25hIHVtYSBgdGFnYCBhYmFpeG8gZG8gdMOtdHVsbyBxdWUgZXNwZWNpZmljYSBvIGFtYmllbnRlIHF1ZSBvIHVzdcOhcmlvIGVzdMOhIGZhemVuZG8gbyBsb2dpbi5cclxuICAgKlxyXG4gICAqID4gRXNzYSBwcm9wcmllZGFkZSBsaW1pdGEgbyB0ZXh0byBlbSA0MCBjYXJhY3RlcmVzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1lbnZpcm9ubWVudCcpIHNldCBlbnZpcm9ubWVudChlbnZpcm9ubWVudDogc3RyaW5nKSB7XHJcbiAgICBpZiAoZW52aXJvbm1lbnQgJiYgZW52aXJvbm1lbnQubGVuZ3RoID4gcG9QYWdlTG9naW5Db250ZW50TWF4TGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuX2Vudmlyb25tZW50ID0gZW52aXJvbm1lbnQuc3Vic3RyaW5nKDAsIHBvUGFnZUxvZ2luQ29udGVudE1heExlbmd0aCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9lbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgZW52aXJvbm1lbnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW52aXJvbm1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIEV4aWJlIHVtIGF2aXNvIGRlIGJsb3F1ZWlvIGRlIGFjb3JkbyBjb20gYSBxdWFudGlkYWRlIHJlc3RhbnRlIGRlIHRlbnRhdGl2YXMuXHJcbiAgICogTyBhdmlzbyBzZXLDoSBleGliaWRvIHNvbWVudGUgc2UgYSBxdWFudGlkYWRlIGZvciBtYWlvciBxdWUgemVyby5cclxuICAgKlxyXG4gICAqID4gQ2FzbyB0ZW5oYSBhbGd1bSB2YWxvciBhdHJpYnXDrWRvIHBhcmEgbyBhdHJpYnV0byBgcC1hdXRoZW50aWNhdGlvbi11cmxgIGUgbyByZXRvcm5vIGRhIHJlcXVpc2nDp8OjbyBlc3RpdmVyIGF0cmlidWluZG8gdmFsb3JcclxuICAgKiBwYXJhIG8gYHAtZXhjZWVkZWQtYXR0ZW1wdHMtd2FybmluZ2AsIG8gdmFsb3IgY29uc2lkZXJhZG8gc2Vyw6EgbyBkbyByZXRvcm5vIGRhIHJlcXVpc2nDp8Ojby5cclxuICAgKlxyXG4gICAqIEBkZWZhdWx0IGAwYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1leGNlZWRlZC1hdHRlbXB0cy13YXJuaW5nJykgc2V0IGV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gY29udmVydFRvSW50KHZhbHVlKTtcclxuICAgIHRoaXMuc2hvd0V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gdGhpcy5leGNlZWRlZEF0dGVtcHRzV2FybmluZyA+IDA7XHJcbiAgfVxyXG5cclxuICBnZXQgZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9leGNlZWRlZEF0dGVtcHRzV2FybmluZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBFc2NvbmRlIGEgZnVuw6fDo28gXCJMZW1icmFyIHVzdcOhcmlvXCIgZG8gZm9ybXVsw6FyaW8gZGUgbG9naW4uXHJcbiAgICpcclxuICAgKiBRdWFuZG8gZXNzYSBwcm9wcmllZGFkZSDDqSBzZXRhZGEgY29tIGB0cnVlYCBhIHByb3ByaWVkYWRlIGByZW1lbWJlclVzZXJgIGVudmlhZGEgbm8gZXZlbnRvIGBwLWxvZ2luLXN1Ym1pdGAgc2Vyw6Egc2VtcHJlXHJcbiAgICogYGZhbHNlYC5cclxuICAgKlxyXG4gICAqID4gVmVqYSBhIHByb3ByaWVkYWRlIGBwLWxpdGVyYWxzYCBwYXJhIGN1c3RvbWl6YXIgYSBsaXRlcmFsIGByZW1lbWJlclVzZXJgLlxyXG4gICAqXHJcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgncC1oaWRlLXJlbWVtYmVyLXVzZXInKSBzZXQgaGlkZVJlbWVtYmVyVXNlcih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faGlkZVJlbWVtYmVyVXNlciA9IDxhbnk+dmFsdWUgPT09ICcnID8gdHJ1ZSA6IGNvbnZlcnRUb0Jvb2xlYW4odmFsdWUpO1xyXG5cclxuICAgIGlmICh0aGlzLl9oaWRlUmVtZW1iZXJVc2VyKSB7XHJcbiAgICAgIHRoaXMucmVtZW1iZXJVc2VyID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBoaWRlUmVtZW1iZXJVc2VyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hpZGVSZW1lbWJlclVzZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogT2JqZXRvIGNvbSBhcyBsaXRlcmFpcyB1c2FkYXMgbm8gYHBvLXBhZ2UtbG9naW5gLlxyXG4gICAqXHJcbiAgICogRXhpc3RlbSBkdWFzIG1hbmVpcmFzIGRlIGN1c3RvbWl6YXIgbyBjb21wb25lbnRlLCBwYXNzYW5kbyB1bSBvYmpldG8gY29tIHRvZGFzIGFzIGxpdGVyYWlzIGRpc3BvbsOtdmVpczpcclxuICAgKlxyXG4gICAqIGBgYFxyXG4gICAqICBjb25zdCBjdXN0b21MaXRlcmFsczogUG9QYWdlTG9naW5MaXRlcmFscyA9IHtcclxuICAgKiAgICBhdHRlbXB0czogJ3swfSB2ZXooZXMpICcsXHJcbiAgICogICAgY3JlYXRlQU5ld1Bhc3N3b3JkTm93OiAnTWVsaG9yIGNyaWFyIHVtYSBzZW5oYSBub3ZhIGFnb3JhISBWb2PDqiB2YWkgcG9kZXIgZW50cmFyIG5vIHNpc3RlbWEgbG9nbyBlbSBzZWd1aWRhLicsXHJcbiAgICogICAgZm9yZ290UGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcclxuICAgKiAgICBmb3Jnb3RZb3VyUGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcclxuICAgKiAgICBoaWdobGlnaHRJbmZvOiAnJyxcclxuICAgKiAgICBpRm9yZ290TXlQYXNzd29yZDogJ0VzcXVlY2kgbWluaGEgc2VuaGEnLFxyXG4gICAqICAgIGlmWW91VHJ5SGFyZGVyOiAnU2UgdGVudGFyIG1haXMgJyxcclxuICAgKiAgICB3ZWxjb21lOiAnQm9hcy12aW5kYXMnLFxyXG4gICAqICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAnTG9naW4gb2JyaWdhdMOzcmlvJyxcclxuICAgKiAgICBsb2dpbkhpbnQ6ICdDYXNvIG7Do28gcG9zc3VhIHVzdcOhcmlvIGVudHJlIGVtIGNvbnRhdG8gY29tIG8gc3Vwb3J0ZScsXHJcbiAgICogICAgbG9naW5MYWJlbDogJ0luc2lyYSBzZXUgdXN1w6FyaW8nLFxyXG4gICAqICAgIGxvZ2luUGxhY2Vob2xkZXI6ICdJbnNpcmEgc2V1IHVzdcOhcmlvIGRlIGFjZXNzbycsXHJcbiAgICogICAgcGFzc3dvcmRFcnJvclBhdHRlcm46ICdTZW5oYSBvYnJpZ2F0w7NyaWEnLFxyXG4gICAqICAgIHBhc3N3b3JkTGFiZWw6ICdJbnNpcmEgc3VhIHNlbmhhJyxcclxuICAgKiAgICBwYXNzd29yZFBsYWNlaG9sZGVyOiAnSW5zaXJhIHN1YSBzZW5oYSBkZSBhY2Vzc28nLFxyXG4gICAqICAgIGN1c3RvbUZpZWxkRXJyb3JQYXR0ZXJuOiAnQ2FtcG8gY3VzdG9taXphZG8gaW52w6FsaWRvJyxcclxuICAgKiAgICBjdXN0b21GaWVsZFBsYWNlaG9sZGVyOiAnUG9yIGZhdm9yIGluc2lyYSB1bSB2YWxvcicsXHJcbiAgICogICAgcmVnaXN0ZXJVcmw6ICdOb3ZvIHJlZ2lzdHJvJyxcclxuICAgKiAgICByZW1lbWJlclVzZXI6ICdMZW1icmFyIHVzdcOhcmlvJyxcclxuICAgKiAgICByZW1lbWJlclVzZXJIaW50OiAnRXN0YSBvcMOnw6NvIHBvZGUgc2VyIGRlc2FiaWxpdGFkYSBuYXMgY29uZmlndXJhw6fDtWVzIGRvIHNpc3RlbWEnLFxyXG4gICAqICAgIHN1Ym1pdExhYmVsOiAnQWNlc3NhciBzaXN0ZW1hJyxcclxuICAgKiAgICBzdWJtaXR0ZWRMYWJlbDogJ0NhcnJlZ2FuZG8uLi4nLFxyXG4gICAqICAgIHRpdGxlUG9wb3ZlcjogJ09wYSEnLFxyXG4gICAqICAgIHlvdXJVc2VyV2lsbEJlQmxvY2tlZDogJ3NlbSBzdWNlc3NvIHNldSB1c3XDoXJpbyBzZXLDoSBibG9xdWVhZG8gZSB2b2PDqiBmaWNhIDI0IGhvcmFzIHNlbSBwb2RlciBhY2Vzc2FyIDooJ1xyXG4gICAqICB9O1xyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogT3UgcGFzc2FuZG8gYXBlbmFzIGFzIGxpdGVyYWlzIHF1ZSBkZXNlamEgY3VzdG9taXphcjpcclxuICAgKlxyXG4gICAqIGBgYFxyXG4gICAqICBjb25zdCBjdXN0b21MaXRlcmFsczogUG9QYWdlTG9naW5MaXRlcmFscyA9IHtcclxuICAgKiAgICBsb2dpblBsYWNlaG9sZGVyOiAnSW5zaXJhIHNldSB1c3XDoXJpbyBkZSBhY2Vzc28nLFxyXG4gICAqICAgIHBhc3N3b3JkUGxhY2Vob2xkZXI6ICdJbnNpcmEgc3VhIHNlbmhhIGRlIGFjZXNzbycsXHJcbiAgICogICAgc3VibWl0TGFiZWw6ICdBY2Vzc2FyIHNpc3RlbWEnXHJcbiAgICogIH07XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBFIHBhcmEgY2FycmVnYXIgYXMgbGl0ZXJhaXMgY3VzdG9taXphZGFzLCBiYXN0YSBhcGVuYXMgcGFzc2FyIG8gb2JqZXRvIHBhcmEgbyBjb21wb25lbnRlLlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogPHBvLXBhZ2UtbG9naW5cclxuICAgKiAgIFtwLWxpdGVyYWxzXT1cImN1c3RvbUxpdGVyYWxzXCI+XHJcbiAgICogPC9wby1wYWdlLWxvZ2luPlxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogID4gTyBvYmpldG8gcGFkcsOjbyBkZSBsaXRlcmFpcyBzZXLDoSB0cmFkdXppZG8gZGUgYWNvcmRvIGNvbSBvIGlkaW9tYSBkbyBicm93c2VyIChwdCwgZW4sIGVzKS5cclxuICAgKiAgPiDDiSB0YW1iw6ltIHBvc3PDrXZlbCBhbHRlcm5hciBvIG9iamV0byBwYWRyw6NvIGRlIGxpdGVyYWlzIGF0cmF2w6lzIGRvIHNlbGV0b3IgZGUgaWRpb21hcyBsb2NhbGl6YWRvIG5hIHBhcnRlIGluZmVyaW9yIGRvIHRlbXBsYXRlLFxyXG4gICAqIG5lc3NlIGNhc28sIGjDoSB0YW1iw6ltIGEgb3DDp8OjbyBkbyBpZGlvbWEgcnVzc28uXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWxpdGVyYWxzJykgc2V0IGxpdGVyYWxzKHZhbHVlOiBQb1BhZ2VMb2dpbkxpdGVyYWxzKSB7XHJcbiAgICB0aGlzLl9saXRlcmFscyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGxpdGVyYWxzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xpdGVyYWxzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIEhhYmlsaXRhIHVtIGVzdGFkbyBkZSBjYXJyZWdhbWVudG8gYW8gYm90w6NvIGRlICpsb2dpbiouXHJcbiAgICpcclxuICAgKiA+IMOJIG5lY2Vzc8OhcmlvIGF0cmlidWlyIGB0cnVlYCDDoCBlc3RhIHByb3ByaWVkYWRlIG5hIGZ1bsOnw6NvIGRlZmluaWRhIGVtIGBwLWxvZ2luLXN1Ym1pdGAuXHJcbiAgICpcclxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWxvYWRpbmcnKSBzZXQgbG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fbG9hZGluZyA9IGNvbnZlcnRUb0Jvb2xlYW4odmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbG9hZGluZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBWYWxvciBkbyBtb2RlbG8gZG8gY2FtcG8gZGUgbG9naW4uXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWxvZ2luJykgc2V0IGxvZ2luKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2xvZ2luID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKCF0aGlzLmF1dGhlbnRpY2F0aW9uVXJsKSB7XHJcbiAgICAgIHRoaXMubG9naW5DaGFuZ2UuZW1pdCh0aGlzLl9sb2dpbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbG9naW4oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9sb2dpbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBBdHJpYnV0byBxdWUgcmVjZWJlIHVtYSBsaXN0YSBkZSBlcnJvcyBlIGV4aWJlIGFiYWl4byBkbyBjYW1wbyBkZSBsb2dpbi5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtbG9naW4tZXJyb3JzJykgc2V0IGxvZ2luRXJyb3JzKHZhbHVlOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICB0aGlzLl9sb2dpbkVycm9ycyA9IHZhbHVlIHx8IFtdO1xyXG4gICAgdGhpcy5zZXRMb2dpbkVycm9ycyh0aGlzLl9sb2dpbkVycm9ycyk7XHJcbiAgfVxyXG4gIGdldCBsb2dpbkVycm9ycygpIHtcclxuICAgIHJldHVybiB0aGlzLl9sb2dpbkVycm9ycztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBBdHJpYnV0byBxdWUgcmVjZWJlIHVtYSBsaXN0YSBkZSBlcnJvcyBlIGV4aWJlIGFiYWl4byBkbyBjYW1wbyBkZSBwYXNzd29yZC5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtcGFzc3dvcmQtZXJyb3JzJykgc2V0IHBhc3N3b3JkRXJyb3JzKHZhbHVlOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICB0aGlzLl9wYXNzd29yZEVycm9ycyA9IHZhbHVlIHx8IFtdO1xyXG4gICAgdGhpcy5zZXRQYXNzd29yZEVycm9ycyh0aGlzLl9wYXNzd29yZEVycm9ycyk7XHJcbiAgfVxyXG4gIGdldCBwYXNzd29yZEVycm9ycygpIHtcclxuICAgIHJldHVybiB0aGlzLl9wYXNzd29yZEVycm9ycztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBFeGliZSB1bSBsaW5rIGFiYWl4byBkbyBmb3JtdWzDoXJpbyBkZSBsb2dpbiBwYXJhIHF1ZSBvcyB1c3XDoXJpb3MgZGEgYXBsaWNhw6fDo28gZmHDp2FtIGEgcmVjdXBlcmHDp8OjbyBkb3MgZGFkb3MgZGUgYXV0ZW50aWNhw6fDo28uXHJcbiAgICpcclxuICAgKiBBIHByb3ByaWVkYWRlIGFjZWl0YSBvcyBzZWd1aW50ZXMgdGlwb3M6XHJcbiAgICpcclxuICAgKiAtICoqU3RyaW5nKio6IGluZm9ybWUgdW1hIHVybCBleHRlcm5hIG91IHVtYSByb3RhIHbDoWxpZGE7XHJcbiAgICogLSAqKkZ1bmN0aW9uKio6IHBvZGUtc2UgY3VzdG9taXphciBhIGHDp8Ojby4gUGFyYSBlc3RhIHBvc3NpbGlkYWRlIGJhc3RhIGF0cmlidWlyOlxyXG4gICAqIGBgYFxyXG4gICAqIDxwby1wYWdlLWxvZ2luPlxyXG4gICAqICAgW3JlY292ZXJ5XT1cInRoaXMubXlSZWNvdmVyeS5iaW5kKHRoaXMpXCI+XHJcbiAgICogPC9wby1wYWdlLWxvZ2luPlxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogLSAqKlBvUGFnZUxvZ2luUmVjb3ZlcnkqKjogY3JpYS1zZSB2w61uY3VsbyBhdXRvbcOhdGljbyBjb20gbyB0ZW1wbGF0ZSAqKnBvLW1vZGFsLXBhc3N3b3JkLXJlY292ZXJ5KiouXHJcbiAgICogICBPIG9iamV0byBkZXZlIGNvbnRlciBhICoqdXJsKiogcGFyYSByZXF1aXNpw6fDo28gZG9zIHJlY3Vyc29zIGUgcG9kZS1zZSBkZWZpbmlyIG8gKip0aXBvKiogZGUgbW9kYWwgcGFyYSByZWN1cGVyYcOnw6NvIGRlIHNlbmhhLFxyXG4gICAqICAgKiplbWFpbCoqIHBhcmEgY29udGF0byBlICoqbcOhc2NhcmEqKiBkbyBjYW1wbyBkZSB0ZWxlZm9uZS5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtcmVjb3ZlcnknKSBzZXQgcmVjb3ZlcnkodmFsdWU6IHN0cmluZyB8IEZ1bmN0aW9uIHwgUG9QYWdlTG9naW5SZWNvdmVyeSkge1xyXG4gICAgdGhpcy5fcmVjb3ZlcnkgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCByZWNvdmVyeSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvdmVyeTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBDYXNvIGEgYXBsaWNhw6fDo28gdGVuaGEgdW0gbGluayBwYXJhIG5vdm9zIGNhZGFzdHJvcywgaW5mb3JtZSB1bWEgdXJsIGV4dGVybmEgb3UgdW1hIHJvdGEgdsOhbGlkYSwgZGVzc2FcclxuICAgKiBmb3JtYSBzZXLDoSBleGliaWRvIHVtIGxpbmsgYWJhaXhvIGRvIGZvcm11bMOhcmlvIGRlIGxvZ2luIHBhcmEgb3MgdXN1w6FyaW9zIGRhIGFwbGljYcOnw6NvLlxyXG4gICAqXHJcbiAgICogRXhlbXBsb3MgZGUgdmFsb3JlcyB2w6FsaWRvczpcclxuICAgKiAtICoqbG9jYWwqKjogYC9ob21lYFxyXG4gICAqIC0gKip1cmwgZXh0ZXJuYSoqOiBgaHR0cHM6Ly9wby11aS5pb2BcclxuICAgKlxyXG4gICAqID4gVmVqYSBhIHByb3ByaWVkYWRlIGBwLWxpdGVyYWxzYCBwYXJhIGN1c3RvbWl6YXIgYSBsaXRlcmFsIGByZWdpc3RlclVybGAuXHJcbiAgICovXHJcbiAgQElucHV0KCdwLXJlZ2lzdGVyLXVybCcpIHNldCByZWdpc3RlclVybCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9yZWdpc3RlclVybCA9IGlzVHlwZW9mKHZhbHVlLCAnc3RyaW5nJykgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGdldCByZWdpc3RlclVybCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyVXJsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIEF0cmlidXRvIHF1ZSByZWNlYmUgbyB0aXBvIGRlIGVzcXVlbWEgZGEgYXV0ZW50aWNhw6fDo28sIHNlbmRvIHN1cG9ydGFkb3MgYXBlbmFzIG9zIHZhbG9yZXMgYEJhc2ljYCBlIGBCZWFyZXJgLlxyXG4gICAqXHJcbiAgICogPiBDYXNvIG8gdGlwbyBkZWZpbmlkbyBzZWphIGBCYXNpY2AsIG8gY29tcG9uZW50ZSBmYXLDoSB1bWEgcmVxdWlzacOnw6NvIGBQT1NUYCBjb250ZW5kbzpcclxuICAgKlxyXG4gICAqIGBgYFxyXG4gICAqIGhlYWRlcnMge1xyXG4gICAqICBBdXRob3JpemF0aW9uOiBCYXNpYyBiYXNlNjQobG9naW46cGFzc3dvcmQpXHJcbiAgICogfVxyXG4gICAqXHJcbiAgICogYm9keSB7XHJcbiAgICogIHJlbWVtYmVyVXNlcjogcmVtZW1iZXJVc2VyXHJcbiAgICogfVxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogPiBDYXNvIG8gdGlwbyBkZWZpbmlkbyBzZWphIGBCZWFyZXJgLCBvIGNvbXBvbmVudGUgZmFyw6EgdW1hIHJlcXVpc2nDp8OjbyBgUE9TVGAgY29udGVuZG86XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiBib2R5IHtcclxuICAgKiAgbG9naW46IGxvZ2luLFxyXG4gICAqICBwYXNzd29yZDogYmFzZTY0KHBhc3N3b3JkKSxcclxuICAgKiAgcmVtZW1iZXJVc2VyOiByZW1lbWJlclVzZXJcclxuICAgKiB9XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBAZGVmYXVsdCBgUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUuQmFzaWNgXHJcbiAgICovXHJcbiAgQElucHV0KCdwLWF1dGhlbnRpY2F0aW9uLXR5cGUnKSBzZXQgYXV0aGVudGljYXRpb25UeXBlKHZhbHVlOiBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSkge1xyXG4gICAgdGhpcy5fYXV0aGVudGljYXRpb25UeXBlID0gKDxhbnk+T2JqZWN0KS52YWx1ZXMoUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUpLmluY2x1ZGVzKHZhbHVlKVxyXG4gICAgICA/IHZhbHVlXHJcbiAgICAgIDogUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUuQmFzaWM7XHJcbiAgfVxyXG5cclxuICBnZXQgYXV0aGVudGljYXRpb25UeXBlKCk6IFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlIHtcclxuICAgIHJldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvblR5cGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogRW5kcG9pbnQgdXNhZG8gcGVsbyB0ZW1wbGF0ZSBwYXJhIHJlcXVpc2nDp8OjbyBkbyByZWN1cnNvLiBRdWFuZG8gcHJlZW5jaGlkbywgbyBtw6l0b2RvIGBwLWxvZ2luLXN1Ym1pdGAgc2Vyw6EgaWdub3JhZG8gZSBvXHJcbiAgICogY29tcG9uZW50ZSBhZHF1aXJpcsOhIGF1dG9tYXRpemHDp8OjbyBwYXJhIG8gcHJvY2Vzc28gZGUgYXV0ZW50aWNhw6fDo28uXHJcbiAgICpcclxuICAgKiAjIyMgUHJvY2Vzc29zXHJcbiAgICogQW8gZGlnaXRhciB1bSB2YWxvciB2w6FsaWRvIG5vIGNhbXBvIGRlIGxvZ2luL3Bhc3N3b3JkIGUgcHJlc3Npb25hciAqKkVudGVyKiosIG8gY29tcG9uZW50ZSBmYXLDoSB1bWEgcmVxdWlzacOnw6NvIGBQT1NUYFxyXG4gICAqIG5hIHVybCBlc3BlY2lmaWNhZGEgbmVzdGEgcHJvcHJpZWRhZGUgcGFzc2FuZG8gbyBvYmpldG8gY29udGVuZG8gbyB2YWxvciBkZWZpbmlkbyBwZWxvIHVzdcOhcmlvOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogaGVhZGVycyB7XHJcbiAgICogIEF1dGhvcml6YXRpb246IEJhc2ljIGJhc2U2NChsb2dpbjpwYXNzd29yZClcclxuICAgKiB9XHJcbiAgICpcclxuICAgKiBib2R5IHtcclxuICAgKiAgcmVtZW1iZXJVc2VyOiByZW1lbWJlclVzZXJcclxuICAgKiB9XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBFbSBjYXNvIGRlICoqc3VjZXNzbyoqLCBvIG9iamV0byBkZSByZXRvcm5vIMOpIGFybWF6ZW5hZG8gbm8gYHNlc3Npb25TdG9yYWdlYCBlIG8gdXN1w6FyaW8gw6kgcmVkaXJlY2lvbmFkbyBwYXJhIGEgcMOhZ2luYSBpbmljaWFsIGRhXHJcbiAgICogYXBsaWNhw6fDo28gYC9gLlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogMjAwOlxyXG4gICAqICB7XHJcbiAgICogICAgdXNlcjogdXNlclxyXG4gICAqICB9XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBFbSBjYXNvIGRlICoqZXJybyoqIG5hIGF1dGVudGljYcOnw6NvLCBlc3BlcmEtc2UgbyBzZWd1aW50ZSByZXRvcm5vOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogNDAwLzQwMVxyXG4gICAqICB7XHJcbiAgICogICAgY29kZTogNDAwLzQwMSxcclxuICAgKiAgICBtZXNzYWdlOiBtZXNzYWdlLFxyXG4gICAqICAgIGRldGFpbGVkTWVzc2FnZTogZGV0YWlsZWRNZXNzYWdlLFxyXG4gICAqICAgIGhlbHBVcmw/OiBoZWxwVXJsXHJcbiAgICogIH1cclxuICAgKiBgYGBcclxuICAgKlxyXG4gICAqID4gUG9kZS1zZSBhdHJpYnVpciB1bWEgcXVhbnRpZGFkZSBtw6F4aW1hIGRlIHRlbnRhdGl2YXMgcmVzdGFudGVzIChtYXhBdHRlbXB0c1JlbWFpbmluZykgcGFyYSBvIGF0cmlidXRvIGBwLWV4Y2VlZGVkLWF0dGVtcHRzLXdhcm5pbmdgLFxyXG4gICAqIGFzc2ltIGNvbW8gb3MgYXZpc29zIHJlbGFjaW9uYWRvcyBhb3MgY2FtcG9zIGxvZ2luIGUgcGFzc3dvcmQgKGxvZ2luV2FybmluZ3MsIHBhc3N3b3JkV2FybmluZ3MpIHBhcmEgb3MgYXRyaWJ1dG9zIGBwLWxvZ2luLWVycm9yc2AgZVxyXG4gICAqIGBwLXBhc3N3b3JkLWVycm9yc2AgY29uZm9ybWUgcmV0b3JubyBhYmFpeG86XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiA0MDBcclxuICAgKiAge1xyXG4gICAqICAgIGNvZGU6IDQwMC80MDEsXHJcbiAgICogICAgbWVzc2FnZTogbWVzc2FnZSxcclxuICAgKiAgICBkZXRhaWxlZE1lc3NhZ2U6IGRldGFpbGVkTWVzc2FnZSxcclxuICAgKiAgICBoZWxwVXJsPzogaGVscFVybCxcclxuICAgKiAgICBtYXhBdHRlbXB0c1JlbWFpbmluZz86IG1heEF0dGVtcHRzUmVtYWluaW5nLFxyXG4gICAqICAgIGxvZ2luV2FybmluZ3M/OiBbbG9naW5XYXJuaW5nc10sXHJcbiAgICogICAgcGFzc3dvcmRXYXJuaW5ncz86IFtwYXNzd29yZFdhcm5pbmdzXVxyXG4gICAqICB9XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiA+IENhc28gbyB2YWxvciBhdHJpYnXDrWRvIHBhcmEgYHAtZXhjZWVkZWQtYXR0ZW1wdHMtd2FybmluZ2Agc2VqYSBpZ3VhbCBhIDAoemVybyksIHBvZGVyw6Egc2VyIHBhc3NhZG8gdW0gdmFsb3IgcGFyYSBvXHJcbiAgICogYXRyaWJ1dG8gYHAtYmxvY2tlZC11cmxgIGUgbyB1c3XDoXJpbyBzZXLDoSByZWRpcmVjaW9uYWRvIHBhcmEgdW1hIHRlbGEgZGUgYmxvcXVlaW8uXHJcbiAgICpcclxuICAgKiAqUHJvY2Vzc28gZmluYWxpemFkby4qXHJcbiAgICpcclxuICAgKiBfX19fX19fX19fX19fX19cclxuICAgKlxyXG4gICAqICMjIyMgUHJhdGljaWRhZGVcclxuICAgKiBBcyBpbmZvcm1hw6fDtWVzIGRvIHNlcnZpw6dvIGRlIGF1dGVudGljYcOnw6NvIHRhbWLDqW0gcG9kZW0gc2VyIHRyYW5zbWl0aWRhcyBkaXJldGFtZW50ZSBwZWxhcyBjb25maWd1cmHDp8Ojb3MgZGUgcm90YSBlLCBkZXN0YSBtYW5laXJhLFxyXG4gICAqIGRpc3BlbnNhLXNlIHF1YWxxdWVyIG1lbsOnw6NvIGUvb3UgaW1wb3J0YcOnw6NvIGRvIGNvbXBvbmVudGUgYHBvLXBhZ2UtbG9naW5gIG5vIHJlc3RhbnRlIGRhIGFwbGljYcOnw6NvLiBPIGV4ZW1wbG8gYWJhaXhvIGV4ZW1wbGlmaWNhXHJcbiAgICogYSBmb3JtYSBkaW7Dom1pY2EgY29tIGEgcXVhbCBvIHRlbXBsYXRlIGRlIHRlbGEgZGUgbG9naW4gcG9kZSBzZXIgZ2VyYWRvIGFvIG5hdmVnYXIgcGFyYSByb3RhIGAvbG9naW5gLCBlIHRhbWLDqW0gY29tbyBlbGUgc2UgY29tdW5pY2FcclxuICAgKiBjb20gbyBzZXJ2acOnbyBwYXJhIGVmZXR1YcOnw6NvIGRvIHByb2Nlc3NvIGRlIGF1dGVudGljYcOnw6NvIGRvIHVzdcOhcmlvIGUgc29saWNpdGHDp8OjbyBkZSBub3ZhIHNlbmhhLlxyXG4gICAqIEJhc3RhIGRlZmluaXIgbmFzIGNvbmZpZ3VyYcOnw7VlcyBkZSByb3RhOlxyXG4gICAqXHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiAgIGltcG9ydCB7IFBvUGFnZUxvZ2luQ29tcG9uZW50LCBQb1BhZ2VMb2dpbkF0aGVudGljYXRpb25UeXBlIH0gZnJvbSAnQHBvLXVpL25nLXRlbXBsYXRlcyc7XHJcbiAgICpcclxuICAgKiAgIC4uLlxyXG4gICAqICAgY29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBbXHJcbiAgICogICAgIHtcclxuICAgKiAgICAgICBwYXRoOiAnbG9naW4nLCBjb21wb25lbnQ6IFBvUGFnZUxvZ2luQ29tcG9uZW50LCBkYXRhOiB7XHJcbiAgICogICAgICAgICBzZXJ2aWNlQXBpOiAnaHR0cHM6Ly9wby11aS5pby9zYW1wbGUvYXBpL3VzZXJzL2F1dGhlbnRpY2F0aW9uJyxcclxuICAgKiAgICAgICAgIGVudmlyb25tZW50OiAnZGV2ZWxvcG1lbnQnLFxyXG4gICAqICAgICAgICAgcmVjb3Zlcnk6IHtcclxuICAgKiAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9wby11aS5pby9zYW1wbGUvYXBpL3VzZXJzJyxcclxuICAgKiAgICAgICAgICAgdHlwZTogUG9Nb2RhbFBhc3N3b3JkUmVjb3ZlcnlUeXBlLkFsbCxcclxuICAgKiAgICAgICAgICAgY29udGFjdE1haWw6ICdkZXYucG9AcG8tdWkuY29tJyxcclxuICAgKiAgICAgICAgICAgcGhvbmVNYXNrOiAnOS05OTktOTk5LTk5OTknXHJcbiAgICogICAgICAgICB9LFxyXG4gICAqICAgICAgICAgcmVnaXN0ZXJVcmw6ICcvbmV3LXBhc3N3b3JkJyxcclxuICAgKiAgICAgICAgIGF1dGhlbnRpY2F0aW9uVHlwZTogUG9QYWdlTG9naW5BdGhlbnRpY2F0aW9uVHlwZS5CYXNpY1xyXG4gICAqICAgICAgIH1cclxuICAgKiAgICAgfVxyXG4gICAqICAgICAuLi5cclxuICAgKiAgIF07XHJcbiAgICpcclxuICAgKiAgIEBOZ01vZHVsZSh7XHJcbiAgICogICAgIGltcG9ydHM6IFtSb3V0ZXJNb2R1bGUuZm9yUm9vdChyb3V0ZXMpXSxcclxuICAgKiAgICAgZXhwb3J0czogW1JvdXRlck1vZHVsZV1cclxuICAgKiAgIH0pXHJcbiAgICogICBleHBvcnQgY2xhc3MgQXBwUm91dGluZ01vZHVsZSB7IH1cclxuICAgKiBgYGBcclxuICAgKlxyXG4gICAqXHJcbiAgICogTyBtZXRhZGFkbyBgc2VydmljZUFwaWAgZGV2ZSBzZXIgYSAqKnVybCoqIHBhcmEgcmVxdWlzacOnw6NvIGRvcyByZWN1cnNvcyBkZSBhdXRlbnRpY2HDp8OjbywgbyBgZW52aXJvbm1lbnRgIGFsaW1lbnRhIGEgcHJvcHJpZWRhZGVcclxuICAgKiBgcC1lbnZpcm9ubWVudGAsIGByZWNvdmVyeWAgw6kgYSBpbnRlcmZhY2UgYFBvUGFnZUxvZ2luUmVjb3ZlcnlgIHJlc3BvbnPDoXZlbCBwZWxhcyBlc3BlY2lmaWNhw6fDtWVzIGNvbnRpZGFzIG5hIG1vZGFsIGRlIHJlY3VwZXJhw6fDo28gZGVcclxuICAgKiBzZW5oYSwgYHJlZ2lzdGVyVXJsYCBhbGltZW50YSBhIHByb3ByaWVkYWRlIGBwLXJlZ2lzdGVyLXVybGAgZSBgYXV0aGVudGljYXRpb25UeXBlYCBxdWUgZGVmaW5lIGEgcHJvcHJpZWRhZGUgYHAtYXV0aGVudGljYXRpb24tdHlwZWAuXHJcbiAgICpcclxuICAgKiA+IMOJIGVzc2VuY2lhbCBxdWUgc2lnYSBhIG5vbWVuY2xhdHVyYSBkb3MgYXRyaWJ1dG9zIGV4ZW1wbGlmaWNhZG9zIGFjaW1hIHBhcmEgc3VhIGVmZXRpdmEgZnVuY2lvbmFsaWRhZGUuXHJcbiAgICpcclxuICAgKi9cclxuICBASW5wdXQoJ3AtYXV0aGVudGljYXRpb24tdXJsJykgc2V0IGF1dGhlbnRpY2F0aW9uVXJsKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2F1dGhlbnRpY2F0aW9uVXJsID0gaXNUeXBlb2YodmFsdWUsICdzdHJpbmcnKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF1dGhlbnRpY2F0aW9uVXJsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Vcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqXHJcbiAgICogQ2FzbyBvIHZhbG9yIGF0cmlidcOtZG8gcGFyYSBgcC1leGNlZWRlZC1hdHRlbXB0cy13YXJuaW5nYCBzZWphIGlndWFsIGEgMCh6ZXJvKSBlIGEgYXBsaWNhw6fDo28gdGVuaGEgdW0gbGluayBkZSBibG9xdWVpbyBkZSB1c3XDoXJpbyxcclxuICAgKiBpbmZvcm1lIHVtYSB1cmwgZXh0ZXJuYSBvdSB1bWEgcm90YSB2w6FsaWRhLCBkZXNzYSBmb3JtYSBlbSBjYXNvIGRlIGJsb3F1ZWlvIG8gdXN1w6FyaW8gc2Vyw6EgcmVkaXJlY2lvbmFkby5cclxuICAgKi9cclxuICBASW5wdXQoJ3AtYmxvY2tlZC11cmwnKSBzZXQgYmxvY2tlZFVybCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9ibG9ja2VkVXJsID0gaXNUeXBlb2YodmFsdWUsICdzdHJpbmcnKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJsb2NrZWRVcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9ibG9ja2VkVXJsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICpcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKlxyXG4gICAqIEV4aWJlIHVtIGJvdMOjbyBwYXJhIHN1cG9ydGUuXHJcbiAgICpcclxuICAgKiBBIHByb3ByaWVkYWRlIGFjZWl0YSBvcyBzZWd1aW50ZXMgdGlwb3M6XHJcbiAgICpcclxuICAgKiAtICoqU3RyaW5nKio6IFVSTCBleHRlcm5hIG91IHVtYSByb3RhIHbDoWxpZGE7XHJcbiAgICogLSAqKkZ1bmN0aW9uKio6IEZ1bsOnw6NvIGEgc2VyIGRpc3BhcmFkYSBhbyBjbGljYXIgbm8gYm90w6NvIGRlIHN1cG9ydGU7XHJcbiAgICogYGBgXHJcbiAgICogPHBvLXBhZ2UtbG9naW4+XHJcbiAgICogICBbcC1zdXBwb3J0XT1cInRoaXMubXlTdXBwb3J0LmJpbmQodGhpcylcIj5cclxuICAgKiA8L3BvLXBhZ2UtbG9naW4+XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKi9cclxuICBASW5wdXQoJ3Atc3VwcG9ydCcpIHNldCBzdXBwb3J0KHZhbHVlOiBzdHJpbmcgfCBGdW5jdGlvbikge1xyXG4gICAgdGhpcy5fc3VwcG9ydCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN1cHBvcnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3VwcG9ydDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICpcclxuICAgKiBDb2xlw6fDo28gZGUgaWRpb21hcyBxdWUgbyBjb21wb25lbnRlIGlyw6EgdHJhdGFyIGUgZGlzcG9uaWJpbGl6YXLDoSBwYXJhIG8gdXN1w6FyaW8gZXNjb2xoZXIuXHJcbiAgICpcclxuICAgKiBDYXNvIGVzc2EgcHJvcHJpZWRhZGUgbsOjbyBzZWphIHV0aWxpemFkYSBvIGNvbXBvbmVudGUgbW9zdHJhcsOhIG5vIGNvbWJvIG9zIGlkaW9tYXMgcXVlIGVsZSBzdXBvcnRhIHBvciBwYWRyw6NvLlxyXG4gICAqXHJcbiAgICogQ2FzbyBhIGNvbGXDp8OjbyB0ZW5oYSB1bSBpZGlvbWEsIGEgcMOhZ2luYSBlc3RhcsOhIG5lc3NlIGlkaW9tYSBlIG7Do28gbW9zdHJhcsOhIG8gY29tYm8uXHJcbiAgICpcclxuICAgKiBDYXNvIHNlamEgcGFzc2FkbyB1bSBhcnJheSB2YXppbywgYSBww6FnaW5hIHRlcsOhIG8gaWRpb21hIGNvbmZpZ3VyYWRvIG5vIGBpMThuYCBlIG7Do28gbW9zdHJhcsOhIG8gY29tYm8gZGUgc2VsZcOnw6NvLlxyXG4gICAqXHJcbiAgICogPiBTZSBmb3IgcGFzc2FkbyB1bSBpZGlvbWEgbsOjbyBzdXBvcnRhZG8sIHNlcsOhIHByZWNpc28gcGFzc2FyIGFzIGxpdGVyYWlzIHBlbGEgcHJvcHJpZWRhZGUgYHAtbGl0ZXJhbHNgLlxyXG4gICAqXHJcbiAgICpcclxuICAgKi9cclxuICBASW5wdXQoJ3AtbGFuZ3VhZ2VzJykgc2V0IGxhbmd1YWdlc0xpc3QobGFuZ3VhZ2VzTGlzdDogQXJyYXk8UG9MYW5ndWFnZT4pIHtcclxuICAgIGlmIChsYW5ndWFnZXNMaXN0KSB7XHJcbiAgICAgIGlmIChsYW5ndWFnZXNMaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlc0xpc3QgPSBsYW5ndWFnZXNMaXN0O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlc0xpc3QgPSBwb0xhbmd1YWdlRGVmYXVsdC5maWx0ZXIobGFuZ3VhZ2UgPT4gbGFuZ3VhZ2UubGFuZ3VhZ2UgPT09IHRoaXMubGFuZ3VhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFuZ3VhZ2VzTGlzdCgpOiBBcnJheTxQb0xhbmd1YWdlPiB7XHJcbiAgICBpZiAodGhpcy5fbGFuZ3VhZ2VzTGlzdCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VzTGlzdDtcclxuICAgIH1cclxuICAgIHJldHVybiBwb0xhbmd1YWdlRGVmYXVsdDtcclxuICB9XHJcblxyXG4gIGdldCBzaG93TGFuZ3VhZ2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sYW5ndWFnZXNMaXN0Lmxlbmd0aCA+IDE7XHJcbiAgfVxyXG5cclxuICBnZXQgbGFuZ3VhZ2UoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgfHwgZ2V0U2hvcnRCcm93c2VyTGFuZ3VhZ2UoKTtcclxuICB9XHJcblxyXG4gIGdldCBwYWdlTG9naW5MaXRlcmFscygpOiBQb1BhZ2VMb2dpbkxpdGVyYWxzIHtcclxuICAgIGNvbnN0IGxvZ2luSGludFdpdGhDb250YWN0RW1haWwgPSB0aGlzLmNvbnRhY3RFbWFpbFxyXG4gICAgICA/IHRoaXMuY29uY2F0ZW5hdGVMb2dpbkhpbnRXaXRoQ29udGFjdEVtYWlsKHRoaXMuY29udGFjdEVtYWlsKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5wb1BhZ2VMb2dpbkxpdGVyYWxzRGVmYXVsdFtwb0xvY2FsZURlZmF1bHRdLFxyXG4gICAgICAuLi5wb1BhZ2VMb2dpbkxpdGVyYWxzRGVmYXVsdFt0aGlzLmxhbmd1YWdlXSxcclxuICAgICAgLi4ubG9naW5IaW50V2l0aENvbnRhY3RFbWFpbCxcclxuICAgICAgLi4udGhpcy5saXRlcmFsc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBsb2dpblNlcnZpY2U6IFBvUGFnZUxvZ2luU2VydmljZSxcclxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcclxuICAgIHB1YmxpYyBwb0xhbmd1YWdlU2VydmljZTogUG9MYW5ndWFnZVNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IHRoaXMucG9MYW5ndWFnZVNlcnZpY2UuZ2V0U2hvcnRMYW5ndWFnZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5sb2dpblN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLmxvZ2luU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZVBvcG92ZXIoKSB7XHJcbiAgICB0aGlzLnNob3dFeGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25Mb2dpblN1Ym1pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxvZ2luRm9ybTogUG9QYWdlTG9naW4gPSB7XHJcbiAgICAgIGxvZ2luOiB0aGlzLmxvZ2luLFxyXG4gICAgICBwYXNzd29yZDogdGhpcy5wYXNzd29yZCxcclxuICAgICAgcmVtZW1iZXJVc2VyOiB0aGlzLnJlbWVtYmVyVXNlclxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5jdXN0b21GaWVsZCkge1xyXG4gICAgICBsb2dpbkZvcm1bdGhpcy5jdXN0b21GaWVsZE9iamVjdC5wcm9wZXJ0eV0gPSB0aGlzLmN1c3RvbUZpZWxkT2JqZWN0LnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmF1dGhlbnRpY2F0aW9uVXJsKSB7XHJcbiAgICAgIHRoaXMubG9naW5TdWJzY3JpcHRpb24gPSB0aGlzLmxvZ2luU2VydmljZVxyXG4gICAgICAgIC5vbkxvZ2luKHRoaXMuYXV0aGVudGljYXRpb25VcmwsIHRoaXMuYXV0aGVudGljYXRpb25UeXBlLCBsb2dpbkZvcm0pXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlc1RvUHJvcGVydGllcygpO1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdQT19VU0VSX0xPR0lOJywgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5JbnRlcm5hbExpbmsoJy8nKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5lcnJvci5jb2RlID09PSAnNDAwJyB8fCBlcnJvci5lcnJvci5jb2RlID09PSAnNDAxJykge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVzVG9Qcm9wZXJ0aWVzKGVycm9yKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0QmxvY2tlZFVybCh0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nLCB0aGlzLmJsb2NrZWRVcmwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubG9naW5TdWJtaXQuZW1pdChsb2dpbkZvcm0pO1xyXG4gICAgICB0aGlzLnNob3dFeGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IHRoaXMuZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPiAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREZWZhdWx0Q3VzdG9tRmllbGRPYmplY3QocHJvcGVydHkpOiBQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkIHtcclxuICAgIHJldHVybiB7IHByb3BlcnR5IH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9wZW5FeHRlcm5hbExpbmsodXJsOiBzdHJpbmcpIHtcclxuICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuSW50ZXJuYWxMaW5rKHVybDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZGlyZWN0QmxvY2tlZFVybChhdHRlbXB0czogbnVtYmVyLCBibG9ja2VkVXJsOiBzdHJpbmcpIHtcclxuICAgIGlmIChhdHRlbXB0cyA9PT0gMCAmJiBibG9ja2VkVXJsKSB7XHJcbiAgICAgIHRoaXMuc2hvd0V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gZmFsc2U7XHJcbiAgICAgIGlzRXh0ZXJuYWxMaW5rKGJsb2NrZWRVcmwpID8gdGhpcy5vcGVuRXh0ZXJuYWxMaW5rKGJsb2NrZWRVcmwpIDogdGhpcy5vcGVuSW50ZXJuYWxMaW5rKGJsb2NrZWRVcmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRWYWx1ZXNUb1Byb3BlcnRpZXMocmVzdWx0Pykge1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICB0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gcmVzdWx0LmVycm9yLm1heEF0dGVtcHRzUmVtYWluaW5nO1xyXG4gICAgICB0aGlzLmxvZ2luRXJyb3JzID0gcmVzdWx0LmVycm9yLmxvZ2luV2FybmluZ3M7XHJcbiAgICAgIHRoaXMucGFzc3dvcmRFcnJvcnMgPSByZXN1bHQuZXJyb3IucGFzc3dvcmRXYXJuaW5ncztcclxuICAgICAgdGhpcy5ibG9ja2VkVXJsID0gcmVzdWx0LmVycm9yLmJsb2NrZWRVcmw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gMDtcclxuICAgICAgdGhpcy5sb2dpbkVycm9ycyA9IFtdO1xyXG4gICAgICB0aGlzLnBhc3N3b3JkRXJyb3JzID0gW107XHJcbiAgICAgIHRoaXMuYmxvY2tlZFVybCA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNvbmNhdGVuYXRlTG9naW5IaW50V2l0aENvbnRhY3RFbWFpbChjb250YWN0RW1haWw6IHN0cmluZyk7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRMb2dpbkVycm9ycyh2YWx1ZTogQXJyYXk8c3RyaW5nPik6IHZvaWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRQYXNzd29yZEVycm9ycyh2YWx1ZTogQXJyYXk8c3RyaW5nPik6IHZvaWQ7XHJcbn1cclxuIl19
1
+ import { EventEmitter, Input, Output, Directive } from '@angular/core';
2
+ import { convertToBoolean, convertToInt, getShortBrowserLanguage, isExternalLink, isTypeof } from './../../utils/util';
3
+ import { poLocaleDefault, poLanguageDefault } from '@po-ui/ng-components';
4
+ import { PoPageLoginAuthenticationType } from './enums/po-page-login-authentication-type.enum';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "./po-page-login.service";
7
+ import * as i2 from "@angular/router";
8
+ import * as i3 from "@po-ui/ng-components";
9
+ const poPageLoginContentMaxLength = 40;
10
+ export const poPageLoginLiteralsDefault = {
11
+ en: {
12
+ title: 'Welcome',
13
+ loginErrorPattern: 'Invalid Login',
14
+ loginHint: `Your login user was given to you at your first day.
15
+ If you don't have this information contact support`,
16
+ loginPlaceholder: 'Insert your e-mail',
17
+ passwordErrorPattern: 'Invalid Password',
18
+ passwordPlaceholder: 'Insert your password',
19
+ customFieldErrorPattern: 'Invalid value',
20
+ customFieldPlaceholder: 'Please enter a value',
21
+ rememberUser: 'Automatic login',
22
+ rememberUserHint: 'You can disable this option in system configuration',
23
+ submitLabel: 'Enter',
24
+ submittedLabel: 'Loading...',
25
+ forgotPassword: 'Forgot your Password?',
26
+ highlightInfo: '',
27
+ registerUrl: 'New register',
28
+ titlePopover: 'Oops!',
29
+ forgotYourPassword: 'Forgot your password?',
30
+ ifYouTryHarder: 'If you try ',
31
+ attempts: '{0} more time(s) ',
32
+ yourUserWillBeBlocked: 'without success your user will be blocked and you will be left 24 hours without being able to access :(',
33
+ createANewPasswordNow: 'Better create a new password now! You will be able to log into the system right away.',
34
+ iForgotMyPassword: 'I forgot my password',
35
+ welcome: 'Welcome',
36
+ support: 'Support'
37
+ },
38
+ es: {
39
+ title: 'Bienvenido',
40
+ loginErrorPattern: 'Login inválido',
41
+ loginHint: `Su usuario ha sido entregado para usted en su primer día.
42
+ Si no tiene esta información, póngase en contacto con el soporte técnico`,
43
+ loginPlaceholder: 'Inserte su e-mail',
44
+ passwordErrorPattern: 'Contraseña inválida',
45
+ passwordPlaceholder: 'Inserte su contraseña',
46
+ customFieldErrorPattern: 'Valor no válido.',
47
+ customFieldPlaceholder: 'Por favor introduzca un valor',
48
+ rememberUser: 'Inicio de sesión automáticamente',
49
+ rememberUserHint: 'Puede deshabilitar esta opción en el menú del sistema.',
50
+ submitLabel: 'Entrar',
51
+ submittedLabel: 'Cargando...',
52
+ forgotPassword: 'Olvidaste tu contraseña?',
53
+ highlightInfo: '',
54
+ registerUrl: 'Nuevo registro',
55
+ titlePopover: 'Opa!',
56
+ forgotYourPassword: 'Olvidaste tu contraseña?',
57
+ ifYouTryHarder: 'Si intenta más ',
58
+ attempts: '{0} vez/veces ',
59
+ yourUserWillBeBlocked: 'sin éxito su usuario sera bloqueado y usted vás permanecer 24 horas sin poder acceder a :(',
60
+ createANewPasswordNow: '¡Mejor crear una nueva contraseña ahora! Usted podrá entrar en el sistema inmediatamente después.',
61
+ iForgotMyPassword: 'Olvide mi contraseña',
62
+ welcome: 'Bienvenido',
63
+ support: 'Soporte'
64
+ },
65
+ pt: {
66
+ title: 'Bem-vindo',
67
+ loginErrorPattern: 'Login inválido',
68
+ loginHint: `Seu usuário foi entregue a você no seu primeiro dia.
69
+ Caso não tenha mais essa informação contacte o suporte`,
70
+ loginPlaceholder: 'Insira seu e-mail',
71
+ passwordErrorPattern: 'Senha inválida',
72
+ passwordPlaceholder: 'Insira sua senha',
73
+ customFieldErrorPattern: 'Valor inválido.',
74
+ customFieldPlaceholder: 'Por favor insira um valor',
75
+ rememberUser: 'Logar automaticamente',
76
+ rememberUserHint: 'Você pode desabilitar essa opção no menu do sistema',
77
+ submitLabel: 'Entrar',
78
+ submittedLabel: 'Carregando...',
79
+ forgotPassword: 'Esqueceu sua senha?',
80
+ highlightInfo: '',
81
+ registerUrl: 'Novo registro',
82
+ titlePopover: 'Opa!',
83
+ forgotYourPassword: 'Esqueceu sua senha?',
84
+ ifYouTryHarder: 'Se tentar mais ',
85
+ attempts: '{0} vez(es) ',
86
+ yourUserWillBeBlocked: 'sem sucesso seu usuário será bloqueado e você fica 24 horas sem poder acessar :(',
87
+ createANewPasswordNow: 'Melhor criar uma senha nova agora! Você vai poder entrar no sistema logo em seguida.',
88
+ iForgotMyPassword: 'Esqueci minha senha',
89
+ welcome: 'Boas-vindas',
90
+ support: 'Suporte'
91
+ },
92
+ ru: {
93
+ title: 'Добро пожаловать!',
94
+ loginErrorPattern: 'Неверный логин',
95
+ loginHint: `Ваш логин был предоставлен вам в первый день.
96
+ Если у вас нет этой информации, обратитесь в службу поддержки`,
97
+ loginPlaceholder: 'Вставьте свой адрес электронной почты',
98
+ passwordErrorPattern: 'Неверный пароль',
99
+ passwordPlaceholder: 'Введите свой пароль',
100
+ customFieldErrorPattern: 'Неверное значение.',
101
+ customFieldPlaceholder: 'Пожалуйста, введите значение',
102
+ rememberUser: 'Автоматический вход',
103
+ rememberUserHint: 'Вы можете отключить эту опцию в конфигурации системы',
104
+ submitLabel: 'Войти',
105
+ submittedLabel: '3агрузка...',
106
+ forgotPassword: 'Забыли пароль?',
107
+ highlightInfo: '',
108
+ registerUrl: 'Новый регистр',
109
+ titlePopover: 'Ой!',
110
+ forgotYourPassword: 'Забыли пароль?',
111
+ ifYouTryHarder: 'Если вы безуспешно попытаетесь войти еще ',
112
+ attempts: '{0} раз(а) ',
113
+ yourUserWillBeBlocked: 'Ваш пользователь будет заблокирован, и Вы останетесь на 24 часа без возможности доступа :(',
114
+ createANewPasswordNow: 'Лучше создайте новый пароль сейчас! Вы сможете сразу войти в систему.',
115
+ iForgotMyPassword: 'Я забыл свой пароль',
116
+ welcome: 'добро пожаловать',
117
+ support: 'Поддержка'
118
+ }
119
+ };
120
+ export const poPageLoginLiteralIn = {
121
+ en: 'in',
122
+ es: 'en',
123
+ pt: 'em',
124
+ ru: 'в'
125
+ };
126
+ /**
127
+ * @description
128
+ *
129
+ * O componente `po-page-login` é utilizado como template para tela de login.
130
+ * Com ele é possível definirmos valores para usuário, senha e definir ações para recuperação de senha e gravação de dados do usuário.
131
+ * Também é possível inserir uma imagem em conjunto com um texto de destaque.
132
+ *
133
+ *
134
+ * A propriedade `p-authentication-url` automatiza a rotina do componente e simplifica o processo para autenticação do usuário, bastando
135
+ * definir uma url para requisição da autenticação. A flexibilidade e praticidade podem chegar a um nível em que o desenvolvimento
136
+ * da aplicação no *client side* é desprovida de qualquer código-fonte relacionado à rotina de login de usuário.
137
+ * Seu detalhamento para uso pode ser visto logo abaixo em *propriedades*.
138
+ * Caso julgue necessário, pode-se também definir manualmente a rotina do componente.
139
+ *
140
+ *
141
+ * Para que as imagens sejam exibidas corretamente, é necessário incluir o caminho delas ao projeto. Para isso, edite
142
+ * o *assets* no arquivo **angular.json** da aplicação na seguinte ordem:
143
+ * ```
144
+ * "assets": [
145
+ * "src/assets",
146
+ * "src/favicon.ico",
147
+ * {
148
+ * "glob": "**\/*",
149
+ * "input": "node_modules/@po-ui/style/images",
150
+ * "output": "assets/images"
151
+ * }
152
+ * ]
153
+ * ```
154
+ */
155
+ export class PoPageLoginBaseComponent {
156
+ constructor(loginService, router, poLanguageService) {
157
+ this.loginService = loginService;
158
+ this.router = router;
159
+ this.poLanguageService = poLanguageService;
160
+ /**
161
+ * @optional
162
+ *
163
+ * @description
164
+ *
165
+ * Evento disparado quando o usuário alterar o input do campo login.
166
+ *
167
+ * Esse evento receberá como parâmetro uma variável do tipo `string` com o texto informado no campo.
168
+ *
169
+ * > Esta propriedade será ignorada se for definido valor para a propriedade `p-authentication-url`.
170
+ */
171
+ this.loginChange = new EventEmitter();
172
+ /**
173
+ * Evento disparado ao submeter o formulário de login (apertando `Enter` dentro dos campos ou pressionando o botão de confirmação).
174
+ *
175
+ * Esse evento receberá como parâmetro um objeto do tipo `PoPageLogin` com os dados informados no formulário.
176
+ *
177
+ * > Esta propriedade será ignorada se for definido valor para a propriedade `p-url-recovery`.
178
+ *
179
+ * > Para mais detalhes consulte a documentação sobre a interface `PoPageLogin` mais abaixo.
180
+ */
181
+ this.loginSubmit = new EventEmitter();
182
+ /**
183
+ * @optional
184
+ *
185
+ * @description
186
+ *
187
+ * Evento disparado quando o usuário alterar o input do campo password.
188
+ *
189
+ * Esse evento receberá como parâmetro uma variável do tipo `string` com o texto informado no campo.
190
+ *
191
+ * > Esta propriedade será ignorada se for definido valor para a propriedade `p-authentication-url`.
192
+ */
193
+ this.passwordChange = new EventEmitter();
194
+ /**
195
+ * @optional
196
+ *
197
+ * @description
198
+ *
199
+ * Evento disparado quando o usuário alterar o idioma da página.
200
+ *
201
+ * Esse evento receberá como parâmetro um objeto do tipo `PoLanguage` com a linguagem selecionada.
202
+ *
203
+ */
204
+ this.languageChange = new EventEmitter();
205
+ this.allLoginErrors = [];
206
+ this.allPasswordErrors = [];
207
+ this.rememberUser = false;
208
+ this.showExceededAttemptsWarning = false;
209
+ this._authenticationType = PoPageLoginAuthenticationType.Basic;
210
+ this._hideRememberUser = false;
211
+ this._loading = false;
212
+ this._loginErrors = [];
213
+ this._passwordErrors = [];
214
+ this.selectedLanguage = this.poLanguageService.getShortLanguage();
215
+ }
216
+ /**
217
+ * @optional
218
+ *
219
+ * @description
220
+ *
221
+ * Ao informar um valor do tipo `string`, o mesmo será aplicado como a chave do campo customizado e utilizará
222
+ * os valores padrões contidos na propriedade `literals` como `customFieldErrorPattern` e `customFieldPlaceholder`.
223
+ *
224
+ * Existe a possibilidade de informar um objeto que segue a definição da interface `PoPageLoginCustomField`, onde
225
+ * através dos parâmetros enviados pode gerar um `po-input`, `po-combo` especificamente para serviços
226
+ * ou `po-select` para valores fixos.
227
+ *
228
+ * Abaixo seguem os exemplos de cada tipo de campo.
229
+ *
230
+ * `po-input`:
231
+ *
232
+ * ```
233
+ * {
234
+ * property: 'domain',
235
+ * value: 'jv01',
236
+ * placeholder: 'Enter your domain',
237
+ * pattern: '[a-z]',
238
+ * errorPattern: 'Invalid value'
239
+ * }
240
+ * ```
241
+ *
242
+ * `po-combo`:
243
+ *
244
+ * ```
245
+ * {
246
+ * property: 'domain',
247
+ * value: 'jv01',
248
+ * placeholder: 'Enter your domain',
249
+ * url: 'https://po-ui.io/sample/api/comboOption/domains',
250
+ * fieldValue: 'nickname'
251
+ * }
252
+ * ```
253
+ *
254
+ * `po-select`:
255
+ *
256
+ * ```
257
+ * {
258
+ * property: 'domain',
259
+ * value: 'jv01',
260
+ * placeholder: 'Enter your domain',
261
+ * options: [{label: 'Domain 1', value: '1'}, {label: 'Domain 2', value: '2'}]
262
+ * }
263
+ * ```
264
+ *
265
+ * Caso o customField possua options, url e fieldValue preenchidos, será priorizado o po-select
266
+ * utilizando o options.
267
+ *
268
+ */
269
+ set customField(value) {
270
+ if (value) {
271
+ if (isTypeof(value, 'string')) {
272
+ this.customFieldType = 'input';
273
+ this._customField = value;
274
+ this.customFieldObject = this.getDefaultCustomFieldObject(value);
275
+ return;
276
+ }
277
+ if (isTypeof(value, 'object') && !Array.isArray(value) && value['property']) {
278
+ this._customField = value;
279
+ this.customFieldObject = value;
280
+ if (!this.customFieldObject.options && !this.customFieldObject.url) {
281
+ this.customFieldType = 'input';
282
+ }
283
+ else {
284
+ this.customFieldType = this.customFieldObject.options ? 'select' : 'combo';
285
+ }
286
+ return;
287
+ }
288
+ }
289
+ this._customField = undefined;
290
+ this.customFieldObject = undefined;
291
+ }
292
+ get customField() {
293
+ return this._customField;
294
+ }
295
+ /**
296
+ * @optional
297
+ *
298
+ * @description
299
+ *
300
+ * Personaliza o e-mail que é exibido na mensagem de dica de login padrão para contato de suporte.
301
+ */
302
+ set contactEmail(value) {
303
+ this._contactEmail = value;
304
+ }
305
+ get contactEmail() {
306
+ return this._contactEmail;
307
+ }
308
+ /**
309
+ * @optional
310
+ *
311
+ * @description
312
+ *
313
+ * Texto customizado que fica entre a logo e a mensagem de boas-vindas.
314
+ */
315
+ set productName(value) {
316
+ this._productName = value;
317
+ }
318
+ get productName() {
319
+ return this._productName;
320
+ }
321
+ /**
322
+ * @optional
323
+ *
324
+ * @description
325
+ * Adiciona uma `tag` abaixo do título que especifica o ambiente que o usuário está fazendo o login.
326
+ *
327
+ * > Essa propriedade limita o texto em 40 caracteres.
328
+ */
329
+ set environment(environment) {
330
+ if (environment && environment.length > poPageLoginContentMaxLength) {
331
+ this._environment = environment.substring(0, poPageLoginContentMaxLength);
332
+ }
333
+ else {
334
+ this._environment = environment;
335
+ }
336
+ }
337
+ get environment() {
338
+ return this._environment;
339
+ }
340
+ /**
341
+ * @optional
342
+ *
343
+ * @description
344
+ * Exibe um aviso de bloqueio de acordo com a quantidade restante de tentativas.
345
+ * O aviso será exibido somente se a quantidade for maior que zero.
346
+ *
347
+ * > Caso tenha algum valor atribuído para o atributo `p-authentication-url` e o retorno da requisição estiver atribuindo valor
348
+ * para o `p-exceeded-attempts-warning`, o valor considerado será o do retorno da requisição.
349
+ *
350
+ * @default `0`
351
+ */
352
+ set exceededAttemptsWarning(value) {
353
+ this._exceededAttemptsWarning = convertToInt(value);
354
+ this.showExceededAttemptsWarning = this.exceededAttemptsWarning > 0;
355
+ }
356
+ get exceededAttemptsWarning() {
357
+ return this._exceededAttemptsWarning;
358
+ }
359
+ /**
360
+ * @optional
361
+ *
362
+ * @description
363
+ *
364
+ * Esconde a função "Lembrar usuário" do formulário de login.
365
+ *
366
+ * Quando essa propriedade é setada com `true` a propriedade `rememberUser` enviada no evento `p-login-submit` será sempre
367
+ * `false`.
368
+ *
369
+ * > Veja a propriedade `p-literals` para customizar a literal `rememberUser`.
370
+ *
371
+ * @default `false`
372
+ */
373
+ set hideRememberUser(value) {
374
+ this._hideRememberUser = value === '' ? true : convertToBoolean(value);
375
+ if (this._hideRememberUser) {
376
+ this.rememberUser = false;
377
+ }
378
+ }
379
+ get hideRememberUser() {
380
+ return this._hideRememberUser;
381
+ }
382
+ /**
383
+ * @optional
384
+ *
385
+ * @description
386
+ *
387
+ * Objeto com as literais usadas no `po-page-login`.
388
+ *
389
+ * Existem duas maneiras de customizar o componente, passando um objeto com todas as literais disponíveis:
390
+ *
391
+ * ```
392
+ * const customLiterals: PoPageLoginLiterals = {
393
+ * attempts: '{0} vez(es) ',
394
+ * createANewPasswordNow: 'Melhor criar uma senha nova agora! Você vai poder entrar no sistema logo em seguida.',
395
+ * forgotPassword: 'Esqueceu sua senha?',
396
+ * forgotYourPassword: 'Esqueceu sua senha?',
397
+ * highlightInfo: '',
398
+ * iForgotMyPassword: 'Esqueci minha senha',
399
+ * ifYouTryHarder: 'Se tentar mais ',
400
+ * welcome: 'Boas-vindas',
401
+ * loginErrorPattern: 'Login obrigatório',
402
+ * loginHint: 'Caso não possua usuário entre em contato com o suporte',
403
+ * loginLabel: 'Insira seu usuário',
404
+ * loginPlaceholder: 'Insira seu usuário de acesso',
405
+ * passwordErrorPattern: 'Senha obrigatória',
406
+ * passwordLabel: 'Insira sua senha',
407
+ * passwordPlaceholder: 'Insira sua senha de acesso',
408
+ * customFieldErrorPattern: 'Campo customizado inválido',
409
+ * customFieldPlaceholder: 'Por favor insira um valor',
410
+ * registerUrl: 'Novo registro',
411
+ * rememberUser: 'Lembrar usuário',
412
+ * rememberUserHint: 'Esta opção pode ser desabilitada nas configurações do sistema',
413
+ * submitLabel: 'Acessar sistema',
414
+ * submittedLabel: 'Carregando...',
415
+ * titlePopover: 'Opa!',
416
+ * yourUserWillBeBlocked: 'sem sucesso seu usuário será bloqueado e você fica 24 horas sem poder acessar :('
417
+ * };
418
+ * ```
419
+ *
420
+ * Ou passando apenas as literais que deseja customizar:
421
+ *
422
+ * ```
423
+ * const customLiterals: PoPageLoginLiterals = {
424
+ * loginPlaceholder: 'Insira seu usuário de acesso',
425
+ * passwordPlaceholder: 'Insira sua senha de acesso',
426
+ * submitLabel: 'Acessar sistema'
427
+ * };
428
+ * ```
429
+ *
430
+ * E para carregar as literais customizadas, basta apenas passar o objeto para o componente.
431
+ *
432
+ * ```
433
+ * <po-page-login
434
+ * [p-literals]="customLiterals">
435
+ * </po-page-login>
436
+ * ```
437
+ *
438
+ * > O objeto padrão de literais será traduzido de acordo com o idioma do browser (pt, en, es).
439
+ * > É também possível alternar o objeto padrão de literais através do seletor de idiomas localizado na parte inferior do template,
440
+ * nesse caso, há também a opção do idioma russo.
441
+ */
442
+ set literals(value) {
443
+ this._literals = value;
444
+ }
445
+ get literals() {
446
+ return this._literals;
447
+ }
448
+ /**
449
+ * @optional
450
+ *
451
+ * @description
452
+ *
453
+ * Habilita um estado de carregamento ao botão de *login*.
454
+ *
455
+ * > É necessário atribuir `true` à esta propriedade na função definida em `p-login-submit`.
456
+ *
457
+ * @default `false`
458
+ */
459
+ set loading(value) {
460
+ this._loading = convertToBoolean(value);
461
+ }
462
+ get loading() {
463
+ return this._loading;
464
+ }
465
+ /**
466
+ * @optional
467
+ *
468
+ * @description
469
+ *
470
+ * Valor do modelo do campo de login.
471
+ */
472
+ set login(value) {
473
+ this._login = value;
474
+ if (!this.authenticationUrl) {
475
+ this.loginChange.emit(this._login);
476
+ }
477
+ }
478
+ get login() {
479
+ return this._login;
480
+ }
481
+ /**
482
+ * @optional
483
+ *
484
+ * @description
485
+ *
486
+ * Atributo que recebe uma lista de erros e exibe abaixo do campo de login.
487
+ */
488
+ set loginErrors(value) {
489
+ this._loginErrors = value || [];
490
+ this.setLoginErrors(this._loginErrors);
491
+ }
492
+ get loginErrors() {
493
+ return this._loginErrors;
494
+ }
495
+ /**
496
+ * @optional
497
+ *
498
+ * @description
499
+ *
500
+ * Atributo que recebe uma lista de erros e exibe abaixo do campo de password.
501
+ */
502
+ set passwordErrors(value) {
503
+ this._passwordErrors = value || [];
504
+ this.setPasswordErrors(this._passwordErrors);
505
+ }
506
+ get passwordErrors() {
507
+ return this._passwordErrors;
508
+ }
509
+ /**
510
+ * @optional
511
+ *
512
+ * @description
513
+ *
514
+ * Exibe um link abaixo do formulário de login para que os usuários da aplicação façam a recuperação dos dados de autenticação.
515
+ *
516
+ * A propriedade aceita os seguintes tipos:
517
+ *
518
+ * - **String**: informe uma url externa ou uma rota válida;
519
+ * - **Function**: pode-se customizar a ação. Para esta possilidade basta atribuir:
520
+ * ```
521
+ * <po-page-login>
522
+ * [recovery]="this.myRecovery.bind(this)">
523
+ * </po-page-login>
524
+ * ```
525
+ *
526
+ * - **PoPageLoginRecovery**: cria-se vínculo automático com o template **po-modal-password-recovery**.
527
+ * O objeto deve conter a **url** para requisição dos recursos e pode-se definir o **tipo** de modal para recuperação de senha,
528
+ * **email** para contato e **máscara** do campo de telefone.
529
+ */
530
+ set recovery(value) {
531
+ this._recovery = value;
532
+ }
533
+ get recovery() {
534
+ return this._recovery;
535
+ }
536
+ /**
537
+ * @optional
538
+ *
539
+ * @description
540
+ *
541
+ * Caso a aplicação tenha um link para novos cadastros, informe uma url externa ou uma rota válida, dessa
542
+ * forma será exibido um link abaixo do formulário de login para os usuários da aplicação.
543
+ *
544
+ * Exemplos de valores válidos:
545
+ * - **local**: `/home`
546
+ * - **url externa**: `https://po-ui.io`
547
+ *
548
+ * > Veja a propriedade `p-literals` para customizar a literal `registerUrl`.
549
+ */
550
+ set registerUrl(value) {
551
+ this._registerUrl = isTypeof(value, 'string') ? value : undefined;
552
+ }
553
+ get registerUrl() {
554
+ return this._registerUrl;
555
+ }
556
+ /**
557
+ * @optional
558
+ *
559
+ * @description
560
+ *
561
+ * Atributo que recebe o tipo de esquema da autenticação, sendo suportados apenas os valores `Basic` e `Bearer`.
562
+ *
563
+ * > Caso o tipo definido seja `Basic`, o componente fará uma requisição `POST` contendo:
564
+ *
565
+ * ```
566
+ * headers {
567
+ * Authorization: Basic base64(login:password)
568
+ * }
569
+ *
570
+ * body {
571
+ * rememberUser: rememberUser
572
+ * }
573
+ * ```
574
+ *
575
+ * > Caso o tipo definido seja `Bearer`, o componente fará uma requisição `POST` contendo:
576
+ *
577
+ * ```
578
+ * body {
579
+ * login: login,
580
+ * password: base64(password),
581
+ * rememberUser: rememberUser
582
+ * }
583
+ * ```
584
+ *
585
+ * @default `PoPageLoginAuthenticationType.Basic`
586
+ */
587
+ set authenticationType(value) {
588
+ this._authenticationType = Object.values(PoPageLoginAuthenticationType).includes(value)
589
+ ? value
590
+ : PoPageLoginAuthenticationType.Basic;
591
+ }
592
+ get authenticationType() {
593
+ return this._authenticationType;
594
+ }
595
+ /**
596
+ * @optional
597
+ *
598
+ * @description
599
+ *
600
+ * Endpoint usado pelo template para requisição do recurso. Quando preenchido, o método `p-login-submit` será ignorado e o
601
+ * componente adquirirá automatização para o processo de autenticação.
602
+ *
603
+ * ### Processos
604
+ * Ao digitar um valor válido no campo de login/password e pressionar **Enter**, o componente fará uma requisição `POST`
605
+ * na url especificada nesta propriedade passando o objeto contendo o valor definido pelo usuário:
606
+ *
607
+ * ```
608
+ * headers {
609
+ * Authorization: Basic base64(login:password)
610
+ * }
611
+ *
612
+ * body {
613
+ * rememberUser: rememberUser
614
+ * }
615
+ * ```
616
+ *
617
+ * Em caso de **sucesso**, o objeto de retorno é armazenado no `sessionStorage` e o usuário é redirecionado para a página inicial da
618
+ * aplicação `/`.
619
+ *
620
+ * ```
621
+ * 200:
622
+ * {
623
+ * user: user
624
+ * }
625
+ * ```
626
+ *
627
+ * Em caso de **erro** na autenticação, espera-se o seguinte retorno:
628
+ *
629
+ * ```
630
+ * 400/401
631
+ * {
632
+ * code: 400/401,
633
+ * message: message,
634
+ * detailedMessage: detailedMessage,
635
+ * helpUrl?: helpUrl
636
+ * }
637
+ * ```
638
+ *
639
+ * > Pode-se atribuir uma quantidade máxima de tentativas restantes (maxAttemptsRemaining) para o atributo `p-exceeded-attempts-warning`,
640
+ * assim como os avisos relacionados aos campos login e password (loginWarnings, passwordWarnings) para os atributos `p-login-errors` e
641
+ * `p-password-errors` conforme retorno abaixo:
642
+ *
643
+ * ```
644
+ * 400
645
+ * {
646
+ * code: 400/401,
647
+ * message: message,
648
+ * detailedMessage: detailedMessage,
649
+ * helpUrl?: helpUrl,
650
+ * maxAttemptsRemaining?: maxAttemptsRemaining,
651
+ * loginWarnings?: [loginWarnings],
652
+ * passwordWarnings?: [passwordWarnings]
653
+ * }
654
+ * ```
655
+ *
656
+ * > Caso o valor atribuído para `p-exceeded-attempts-warning` seja igual a 0(zero), poderá ser passado um valor para o
657
+ * atributo `p-blocked-url` e o usuário será redirecionado para uma tela de bloqueio.
658
+ *
659
+ * *Processo finalizado.*
660
+ *
661
+ * _______________
662
+ *
663
+ * #### Praticidade
664
+ * As informações do serviço de autenticação também podem ser transmitidas diretamente pelas configuraçãos de rota e, desta maneira,
665
+ * dispensa-se qualquer menção e/ou importação do componente `po-page-login` no restante da aplicação. O exemplo abaixo exemplifica
666
+ * a forma dinâmica com a qual o template de tela de login pode ser gerado ao navegar para rota `/login`, e também como ele se comunica
667
+ * com o serviço para efetuação do processo de autenticação do usuário e solicitação de nova senha.
668
+ * Basta definir nas configurações de rota:
669
+ *
670
+ *
671
+ * ```
672
+ * import { PoPageLoginComponent, PoPageLoginAthenticationType } from '@po-ui/ng-templates';
673
+ *
674
+ * ...
675
+ * const routes: Routes = [
676
+ * {
677
+ * path: 'login', component: PoPageLoginComponent, data: {
678
+ * serviceApi: 'https://po-ui.io/sample/api/users/authentication',
679
+ * environment: 'development',
680
+ * recovery: {
681
+ * url: 'https://po-ui.io/sample/api/users',
682
+ * type: PoModalPasswordRecoveryType.All,
683
+ * contactMail: 'dev.po@po-ui.com',
684
+ * phoneMask: '9-999-999-9999'
685
+ * },
686
+ * registerUrl: '/new-password',
687
+ * authenticationType: PoPageLoginAthenticationType.Basic
688
+ * }
689
+ * }
690
+ * ...
691
+ * ];
692
+ *
693
+ * @NgModule({
694
+ * imports: [RouterModule.forRoot(routes)],
695
+ * exports: [RouterModule]
696
+ * })
697
+ * export class AppRoutingModule { }
698
+ * ```
699
+ *
700
+ *
701
+ * O metadado `serviceApi` deve ser a **url** para requisição dos recursos de autenticação, o `environment` alimenta a propriedade
702
+ * `p-environment`, `recovery` é a interface `PoPageLoginRecovery` responsável pelas especificações contidas na modal de recuperação de
703
+ * senha, `registerUrl` alimenta a propriedade `p-register-url` e `authenticationType` que define a propriedade `p-authentication-type`.
704
+ *
705
+ * > É essencial que siga a nomenclatura dos atributos exemplificados acima para sua efetiva funcionalidade.
706
+ *
707
+ */
708
+ set authenticationUrl(value) {
709
+ this._authenticationUrl = isTypeof(value, 'string') ? value : undefined;
710
+ }
711
+ get authenticationUrl() {
712
+ return this._authenticationUrl;
713
+ }
714
+ /**
715
+ * @optional
716
+ *
717
+ * @description
718
+ *
719
+ * Caso o valor atribuído para `p-exceeded-attempts-warning` seja igual a 0(zero) e a aplicação tenha um link de bloqueio de usuário,
720
+ * informe uma url externa ou uma rota válida, dessa forma em caso de bloqueio o usuário será redirecionado.
721
+ */
722
+ set blockedUrl(value) {
723
+ this._blockedUrl = isTypeof(value, 'string') ? value : undefined;
724
+ }
725
+ get blockedUrl() {
726
+ return this._blockedUrl;
727
+ }
728
+ /**
729
+ * @optional
730
+ *
731
+ * @description
732
+ *
733
+ * Exibe um botão para suporte.
734
+ *
735
+ * A propriedade aceita os seguintes tipos:
736
+ *
737
+ * - **String**: URL externa ou uma rota válida;
738
+ * - **Function**: Função a ser disparada ao clicar no botão de suporte;
739
+ * ```
740
+ * <po-page-login>
741
+ * [p-support]="this.mySupport.bind(this)">
742
+ * </po-page-login>
743
+ * ```
744
+ *
745
+ */
746
+ set support(value) {
747
+ this._support = value;
748
+ }
749
+ get support() {
750
+ return this._support;
751
+ }
752
+ /**
753
+ * @optional
754
+ *
755
+ * @description
756
+ *
757
+ * Coleção de idiomas que o componente irá tratar e disponibilizará para o usuário escolher.
758
+ *
759
+ * Caso essa propriedade não seja utilizada o componente mostrará no combo os idiomas que ele suporta por padrão.
760
+ *
761
+ * Caso a coleção tenha um idioma, a página estará nesse idioma e não mostrará o combo.
762
+ *
763
+ * Caso seja passado um array vazio, a página terá o idioma configurado no `i18n` e não mostrará o combo de seleção.
764
+ *
765
+ * > Se for passado um idioma não suportado, será preciso passar as literais pela propriedade `p-literals`.
766
+ *
767
+ *
768
+ */
769
+ set languagesList(languagesList) {
770
+ if (languagesList) {
771
+ if (languagesList.length) {
772
+ this._languagesList = languagesList;
773
+ }
774
+ else {
775
+ this._languagesList = poLanguageDefault.filter(language => language.language === this.language);
776
+ }
777
+ }
778
+ }
779
+ get languagesList() {
780
+ if (this._languagesList) {
781
+ return this._languagesList;
782
+ }
783
+ return poLanguageDefault;
784
+ }
785
+ get showLanguage() {
786
+ return this.languagesList.length > 1;
787
+ }
788
+ get language() {
789
+ return this.selectedLanguage || getShortBrowserLanguage();
790
+ }
791
+ get pageLoginLiterals() {
792
+ const loginHintWithContactEmail = this.contactEmail
793
+ ? this.concatenateLoginHintWithContactEmail(this.contactEmail)
794
+ : undefined;
795
+ return {
796
+ ...poPageLoginLiteralsDefault[poLocaleDefault],
797
+ ...poPageLoginLiteralsDefault[this.language],
798
+ ...loginHintWithContactEmail,
799
+ ...this.literals
800
+ };
801
+ }
802
+ ngOnDestroy() {
803
+ if (this.loginSubscription) {
804
+ this.loginSubscription.unsubscribe();
805
+ }
806
+ }
807
+ closePopover() {
808
+ this.showExceededAttemptsWarning = false;
809
+ }
810
+ onLoginSubmit() {
811
+ const loginForm = {
812
+ login: this.login,
813
+ password: this.password,
814
+ rememberUser: this.rememberUser
815
+ };
816
+ if (this.customField) {
817
+ loginForm[this.customFieldObject.property] = this.customFieldObject.value;
818
+ }
819
+ if (this.authenticationUrl) {
820
+ this.loginSubscription = this.loginService
821
+ .onLogin(this.authenticationUrl, this.authenticationType, loginForm)
822
+ .subscribe(data => {
823
+ this.setValuesToProperties();
824
+ sessionStorage.setItem('PO_USER_LOGIN', JSON.stringify(data));
825
+ this.openInternalLink('/');
826
+ }, error => {
827
+ if (error.error.code === '400' || error.error.code === '401') {
828
+ this.setValuesToProperties(error);
829
+ this.redirectBlockedUrl(this.exceededAttemptsWarning, this.blockedUrl);
830
+ }
831
+ });
832
+ }
833
+ else {
834
+ this.loginSubmit.emit(loginForm);
835
+ this.showExceededAttemptsWarning = this.exceededAttemptsWarning > 0;
836
+ }
837
+ }
838
+ getDefaultCustomFieldObject(property) {
839
+ return { property };
840
+ }
841
+ openExternalLink(url) {
842
+ window.open(url, '_blank');
843
+ }
844
+ openInternalLink(url) {
845
+ this.router.navigate([url]);
846
+ }
847
+ redirectBlockedUrl(attempts, blockedUrl) {
848
+ if (attempts === 0 && blockedUrl) {
849
+ this.showExceededAttemptsWarning = false;
850
+ isExternalLink(blockedUrl) ? this.openExternalLink(blockedUrl) : this.openInternalLink(blockedUrl);
851
+ }
852
+ }
853
+ setValuesToProperties(result) {
854
+ if (result) {
855
+ this.exceededAttemptsWarning = result.error.maxAttemptsRemaining;
856
+ this.loginErrors = result.error.loginWarnings;
857
+ this.passwordErrors = result.error.passwordWarnings;
858
+ this.blockedUrl = result.error.blockedUrl;
859
+ }
860
+ else {
861
+ this.exceededAttemptsWarning = 0;
862
+ this.loginErrors = [];
863
+ this.passwordErrors = [];
864
+ this.blockedUrl = '';
865
+ }
866
+ }
867
+ }
868
+ PoPageLoginBaseComponent.ɵfac = function PoPageLoginBaseComponent_Factory(t) { return new (t || PoPageLoginBaseComponent)(i0.ɵɵdirectiveInject(i1.PoPageLoginService), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i3.PoLanguageService)); };
869
+ PoPageLoginBaseComponent.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: PoPageLoginBaseComponent, inputs: { background: ["p-background", "background"], logo: ["p-logo", "logo"], loginPattern: ["p-login-pattern", "loginPattern"], passwordPattern: ["p-password-pattern", "passwordPattern"], secondaryLogo: ["p-secondary-logo", "secondaryLogo"], customField: ["p-custom-field", "customField"], contactEmail: ["p-contact-email", "contactEmail"], productName: ["p-product-name", "productName"], environment: ["p-environment", "environment"], exceededAttemptsWarning: ["p-exceeded-attempts-warning", "exceededAttemptsWarning"], hideRememberUser: ["p-hide-remember-user", "hideRememberUser"], literals: ["p-literals", "literals"], loading: ["p-loading", "loading"], login: ["p-login", "login"], loginErrors: ["p-login-errors", "loginErrors"], passwordErrors: ["p-password-errors", "passwordErrors"], recovery: ["p-recovery", "recovery"], registerUrl: ["p-register-url", "registerUrl"], authenticationType: ["p-authentication-type", "authenticationType"], authenticationUrl: ["p-authentication-url", "authenticationUrl"], blockedUrl: ["p-blocked-url", "blockedUrl"], support: ["p-support", "support"], languagesList: ["p-languages", "languagesList"] }, outputs: { loginChange: "p-login-change", loginSubmit: "p-login-submit", passwordChange: "p-password-change", languageChange: "p-language-change" } });
870
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoPageLoginBaseComponent, [{
871
+ type: Directive
872
+ }], function () { return [{ type: i1.PoPageLoginService }, { type: i2.Router }, { type: i3.PoLanguageService }]; }, { background: [{
873
+ type: Input,
874
+ args: ['p-background']
875
+ }], logo: [{
876
+ type: Input,
877
+ args: ['p-logo']
878
+ }], loginPattern: [{
879
+ type: Input,
880
+ args: ['p-login-pattern']
881
+ }], passwordPattern: [{
882
+ type: Input,
883
+ args: ['p-password-pattern']
884
+ }], secondaryLogo: [{
885
+ type: Input,
886
+ args: ['p-secondary-logo']
887
+ }], loginChange: [{
888
+ type: Output,
889
+ args: ['p-login-change']
890
+ }], loginSubmit: [{
891
+ type: Output,
892
+ args: ['p-login-submit']
893
+ }], passwordChange: [{
894
+ type: Output,
895
+ args: ['p-password-change']
896
+ }], languageChange: [{
897
+ type: Output,
898
+ args: ['p-language-change']
899
+ }], customField: [{
900
+ type: Input,
901
+ args: ['p-custom-field']
902
+ }], contactEmail: [{
903
+ type: Input,
904
+ args: ['p-contact-email']
905
+ }], productName: [{
906
+ type: Input,
907
+ args: ['p-product-name']
908
+ }], environment: [{
909
+ type: Input,
910
+ args: ['p-environment']
911
+ }], exceededAttemptsWarning: [{
912
+ type: Input,
913
+ args: ['p-exceeded-attempts-warning']
914
+ }], hideRememberUser: [{
915
+ type: Input,
916
+ args: ['p-hide-remember-user']
917
+ }], literals: [{
918
+ type: Input,
919
+ args: ['p-literals']
920
+ }], loading: [{
921
+ type: Input,
922
+ args: ['p-loading']
923
+ }], login: [{
924
+ type: Input,
925
+ args: ['p-login']
926
+ }], loginErrors: [{
927
+ type: Input,
928
+ args: ['p-login-errors']
929
+ }], passwordErrors: [{
930
+ type: Input,
931
+ args: ['p-password-errors']
932
+ }], recovery: [{
933
+ type: Input,
934
+ args: ['p-recovery']
935
+ }], registerUrl: [{
936
+ type: Input,
937
+ args: ['p-register-url']
938
+ }], authenticationType: [{
939
+ type: Input,
940
+ args: ['p-authentication-type']
941
+ }], authenticationUrl: [{
942
+ type: Input,
943
+ args: ['p-authentication-url']
944
+ }], blockedUrl: [{
945
+ type: Input,
946
+ args: ['p-blocked-url']
947
+ }], support: [{
948
+ type: Input,
949
+ args: ['p-support']
950
+ }], languagesList: [{
951
+ type: Input,
952
+ args: ['p-languages']
953
+ }] }); })();
954
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcGFnZS1sb2dpbi1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RlbXBsYXRlcy9zcmMvbGliL2NvbXBvbmVudHMvcG8tcGFnZS1sb2dpbi9wby1wYWdlLWxvZ2luLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkgsT0FBTyxFQUFxQixlQUFlLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUd6RyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7Ozs7QUFNL0YsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFdkMsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMsRUFBRSxFQUF1QjtRQUN2QixLQUFLLEVBQUUsU0FBUztRQUNoQixpQkFBaUIsRUFBRSxlQUFlO1FBQ2xDLFNBQVMsRUFBRTt1REFDd0M7UUFDbkQsZ0JBQWdCLEVBQUUsb0JBQW9CO1FBQ3RDLG9CQUFvQixFQUFFLGtCQUFrQjtRQUN4QyxtQkFBbUIsRUFBRSxzQkFBc0I7UUFDM0MsdUJBQXVCLEVBQUUsZUFBZTtRQUN4QyxzQkFBc0IsRUFBRSxzQkFBc0I7UUFDOUMsWUFBWSxFQUFFLGlCQUFpQjtRQUMvQixnQkFBZ0IsRUFBRSxxREFBcUQ7UUFDdkUsV0FBVyxFQUFFLE9BQU87UUFDcEIsY0FBYyxFQUFFLFlBQVk7UUFDNUIsY0FBYyxFQUFFLHVCQUF1QjtRQUN2QyxhQUFhLEVBQUUsRUFBRTtRQUNqQixXQUFXLEVBQUUsY0FBYztRQUMzQixZQUFZLEVBQUUsT0FBTztRQUNyQixrQkFBa0IsRUFBRSx1QkFBdUI7UUFDM0MsY0FBYyxFQUFFLGFBQWE7UUFDN0IsUUFBUSxFQUFFLG1CQUFtQjtRQUM3QixxQkFBcUIsRUFDbkIseUdBQXlHO1FBQzNHLHFCQUFxQixFQUFFLHVGQUF1RjtRQUM5RyxpQkFBaUIsRUFBRSxzQkFBc0I7UUFDekMsT0FBTyxFQUFFLFNBQVM7UUFDbEIsT0FBTyxFQUFFLFNBQVM7S0FDbkI7SUFDRCxFQUFFLEVBQXVCO1FBQ3ZCLEtBQUssRUFBRSxZQUFZO1FBQ25CLGlCQUFpQixFQUFFLGdCQUFnQjtRQUNuQyxTQUFTLEVBQUU7NkVBQzhEO1FBQ3pFLGdCQUFnQixFQUFFLG1CQUFtQjtRQUNyQyxvQkFBb0IsRUFBRSxxQkFBcUI7UUFDM0MsbUJBQW1CLEVBQUUsdUJBQXVCO1FBQzVDLHVCQUF1QixFQUFFLGtCQUFrQjtRQUMzQyxzQkFBc0IsRUFBRSwrQkFBK0I7UUFDdkQsWUFBWSxFQUFFLGtDQUFrQztRQUNoRCxnQkFBZ0IsRUFBRSx3REFBd0Q7UUFDMUUsV0FBVyxFQUFFLFFBQVE7UUFDckIsY0FBYyxFQUFFLGFBQWE7UUFDN0IsY0FBYyxFQUFFLDBCQUEwQjtRQUMxQyxhQUFhLEVBQUUsRUFBRTtRQUNqQixXQUFXLEVBQUUsZ0JBQWdCO1FBQzdCLFlBQVksRUFBRSxNQUFNO1FBQ3BCLGtCQUFrQixFQUFFLDBCQUEwQjtRQUM5QyxjQUFjLEVBQUUsaUJBQWlCO1FBQ2pDLFFBQVEsRUFBRSxnQkFBZ0I7UUFDMUIscUJBQXFCLEVBQUUsNEZBQTRGO1FBQ25ILHFCQUFxQixFQUNuQixtR0FBbUc7UUFDckcsaUJBQWlCLEVBQUUsc0JBQXNCO1FBQ3pDLE9BQU8sRUFBRSxZQUFZO1FBQ3JCLE9BQU8sRUFBRSxTQUFTO0tBQ25CO0lBQ0QsRUFBRSxFQUF1QjtRQUN2QixLQUFLLEVBQUUsV0FBVztRQUNsQixpQkFBaUIsRUFBRSxnQkFBZ0I7UUFDbkMsU0FBUyxFQUFFOzJEQUM0QztRQUN2RCxnQkFBZ0IsRUFBRSxtQkFBbUI7UUFDckMsb0JBQW9CLEVBQUUsZ0JBQWdCO1FBQ3RDLG1CQUFtQixFQUFFLGtCQUFrQjtRQUN2Qyx1QkFBdUIsRUFBRSxpQkFBaUI7UUFDMUMsc0JBQXNCLEVBQUUsMkJBQTJCO1FBQ25ELFlBQVksRUFBRSx1QkFBdUI7UUFDckMsZ0JBQWdCLEVBQUUscURBQXFEO1FBQ3ZFLFdBQVcsRUFBRSxRQUFRO1FBQ3JCLGNBQWMsRUFBRSxlQUFlO1FBQy9CLGNBQWMsRUFBRSxxQkFBcUI7UUFDckMsYUFBYSxFQUFFLEVBQUU7UUFDakIsV0FBVyxFQUFFLGVBQWU7UUFDNUIsWUFBWSxFQUFFLE1BQU07UUFDcEIsa0JBQWtCLEVBQUUscUJBQXFCO1FBQ3pDLGNBQWMsRUFBRSxpQkFBaUI7UUFDakMsUUFBUSxFQUFFLGNBQWM7UUFDeEIscUJBQXFCLEVBQUUsa0ZBQWtGO1FBQ3pHLHFCQUFxQixFQUFFLHNGQUFzRjtRQUM3RyxpQkFBaUIsRUFBRSxxQkFBcUI7UUFDeEMsT0FBTyxFQUFFLGFBQWE7UUFDdEIsT0FBTyxFQUFFLFNBQVM7S0FDbkI7SUFDRCxFQUFFLEVBQXVCO1FBQ3ZCLEtBQUssRUFBRSxtQkFBbUI7UUFDMUIsaUJBQWlCLEVBQUUsZ0JBQWdCO1FBQ25DLFNBQVMsRUFBRTtrRUFDbUQ7UUFDOUQsZ0JBQWdCLEVBQUUsdUNBQXVDO1FBQ3pELG9CQUFvQixFQUFFLGlCQUFpQjtRQUN2QyxtQkFBbUIsRUFBRSxxQkFBcUI7UUFDMUMsdUJBQXVCLEVBQUUsb0JBQW9CO1FBQzdDLHNCQUFzQixFQUFFLDhCQUE4QjtRQUN0RCxZQUFZLEVBQUUscUJBQXFCO1FBQ25DLGdCQUFnQixFQUFFLHNEQUFzRDtRQUN4RSxXQUFXLEVBQUUsT0FBTztRQUNwQixjQUFjLEVBQUUsYUFBYTtRQUM3QixjQUFjLEVBQUUsZ0JBQWdCO1FBQ2hDLGFBQWEsRUFBRSxFQUFFO1FBQ2pCLFdBQVcsRUFBRSxlQUFlO1FBQzVCLFlBQVksRUFBRSxLQUFLO1FBQ25CLGtCQUFrQixFQUFFLGdCQUFnQjtRQUNwQyxjQUFjLEVBQUUsMkNBQTJDO1FBQzNELFFBQVEsRUFBRSxhQUFhO1FBQ3ZCLHFCQUFxQixFQUFFLDRGQUE0RjtRQUNuSCxxQkFBcUIsRUFBRSx1RUFBdUU7UUFDOUYsaUJBQWlCLEVBQUUscUJBQXFCO1FBQ3hDLE9BQU8sRUFBRSxrQkFBa0I7UUFDM0IsT0FBTyxFQUFFLFdBQVc7S0FDckI7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUc7SUFDbEMsRUFBRSxFQUFFLElBQUk7SUFDUixFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLEdBQUc7Q0FDUixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFFSCxNQUFNLE9BQWdCLHdCQUF3QjtJQXF3QjVDLFlBQ1UsWUFBZ0MsRUFDakMsTUFBYyxFQUNkLGlCQUFvQztRQUZuQyxpQkFBWSxHQUFaLFlBQVksQ0FBb0I7UUFDakMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFoc0I3Qzs7Ozs7Ozs7OztXQVVHO1FBQ3VCLGdCQUFXLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFekY7Ozs7Ozs7O1dBUUc7UUFDdUIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBRXhFOzs7Ozs7Ozs7O1dBVUc7UUFDMEIsbUJBQWMsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUUvRjs7Ozs7Ozs7O1dBU0c7UUFDMEIsbUJBQWMsR0FBNkIsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUV2RyxtQkFBYyxHQUFrQixFQUFFLENBQUM7UUFDbkMsc0JBQWlCLEdBQWtCLEVBQUUsQ0FBQztRQUt0QyxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUU5QixnQ0FBMkIsR0FBRyxLQUFLLENBQUM7UUFFNUIsd0JBQW1CLEdBQWtDLDZCQUE2QixDQUFDLEtBQUssQ0FBQztRQU96RixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFFbkMsYUFBUSxHQUFhLEtBQUssQ0FBQztRQUUzQixpQkFBWSxHQUFrQixFQUFFLENBQUM7UUFDakMsb0JBQWUsR0FBa0IsRUFBRSxDQUFDO1FBMm5CMUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3BFLENBQUM7SUFybkJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0RHO0lBQ0gsSUFBNkIsV0FBVyxDQUFDLEtBQXNDO1FBQzdFLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pFLE9BQU87YUFDUjtZQUVELElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUMzRSxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUEyQixLQUFLLENBQUM7Z0JBRXZELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtvQkFDbEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUM7aUJBQ2hDO3FCQUFNO29CQUNMLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7aUJBQzVFO2dCQUVELE9BQU87YUFDUjtTQUNGO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUE4QixZQUFZLENBQUMsS0FBYTtRQUN0RCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUE2QixXQUFXLENBQUMsS0FBYTtRQUNwRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFBNEIsV0FBVyxDQUFDLFdBQW1CO1FBQ3pELElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsMkJBQTJCLEVBQUU7WUFDbkUsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1NBQzNFO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztTQUNqQztJQUNILENBQUM7SUFDRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsSUFBMEMsdUJBQXVCLENBQUMsS0FBYTtRQUM3RSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFJLHVCQUF1QjtRQUN6QixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILElBQW1DLGdCQUFnQixDQUFDLEtBQWM7UUFDaEUsSUFBSSxDQUFDLGlCQUFpQixHQUFRLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFNUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTJERztJQUNILElBQXlCLFFBQVEsQ0FBQyxLQUEwQjtRQUMxRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsSUFBd0IsT0FBTyxDQUFDLEtBQWM7UUFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFzQixLQUFLLENBQUMsS0FBYTtRQUN2QyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQTZCLFdBQVcsQ0FBQyxLQUFvQjtRQUMzRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFBZ0MsY0FBYyxDQUFDLEtBQW9CO1FBQ2pFLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FvQkc7SUFDSCxJQUF5QixRQUFRLENBQUMsS0FBOEM7UUFDOUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILElBQTZCLFdBQVcsQ0FBQyxLQUFhO1FBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQThCRztJQUNILElBQW9DLGtCQUFrQixDQUFDLEtBQW9DO1FBQ3pGLElBQUksQ0FBQyxtQkFBbUIsR0FBUyxNQUFPLENBQUMsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUM1RixDQUFDLENBQUMsS0FBSztZQUNQLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWdIRztJQUNILElBQW1DLGlCQUFpQixDQUFDLEtBQWE7UUFDaEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzFFLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQTRCLFVBQVUsQ0FBQyxLQUFhO1FBQ2xELElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbkUsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O09BaUJHO0lBQ0gsSUFBd0IsT0FBTyxDQUFDLEtBQXdCO1FBQ3RELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsSUFBMEIsYUFBYSxDQUFDLGFBQWdDO1FBQ3RFLElBQUksYUFBYSxFQUFFO1lBQ2pCLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRTtnQkFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7YUFDckM7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNqRztTQUNGO0lBQ0gsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7U0FDNUI7UUFDRCxPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLElBQUksdUJBQXVCLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsWUFBWTtZQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDOUQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLE9BQU87WUFDTCxHQUFHLDBCQUEwQixDQUFDLGVBQWUsQ0FBQztZQUM5QyxHQUFHLDBCQUEwQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDNUMsR0FBRyx5QkFBeUI7WUFDNUIsR0FBRyxJQUFJLENBQUMsUUFBUTtTQUNqQixDQUFDO0lBQ0osQ0FBQztJQVVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUVELGFBQWE7UUFDWCxNQUFNLFNBQVMsR0FBZ0I7WUFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDaEMsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7U0FDM0U7UUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVk7aUJBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQztpQkFDbkUsU0FBUyxDQUNSLElBQUksQ0FBQyxFQUFFO2dCQUNMLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM3QixjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixDQUFDLEVBQ0QsS0FBSyxDQUFDLEVBQUU7Z0JBQ04sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFO29CQUM1RCxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUN4RTtZQUNILENBQUMsQ0FDRixDQUFDO1NBQ0w7YUFBTTtZQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO1NBQ3JFO0lBQ0gsQ0FBQztJQUVPLDJCQUEyQixDQUFDLFFBQVE7UUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxHQUFXO1FBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxHQUFXO1FBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU8sa0JBQWtCLENBQUMsUUFBZ0IsRUFBRSxVQUFrQjtRQUM3RCxJQUFJLFFBQVEsS0FBSyxDQUFDLElBQUksVUFBVSxFQUFFO1lBQ2hDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUM7WUFDekMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNwRztJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxNQUFPO1FBQ25DLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxDQUFDLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUM7WUFDakUsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztZQUM5QyxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7WUFDcEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztTQUMzQzthQUFNO1lBQ0wsSUFBSSxDQUFDLHVCQUF1QixHQUFHLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztTQUN0QjtJQUNILENBQUM7O2dHQXYxQm1CLHdCQUF3QjsyRUFBeEIsd0JBQXdCO3VGQUF4Qix3QkFBd0I7Y0FEN0MsU0FBUzswSEFtQmUsVUFBVTtrQkFBaEMsS0FBSzttQkFBQyxjQUFjO1lBV0osSUFBSTtrQkFBcEIsS0FBSzttQkFBQyxRQUFRO1lBZ0JXLFlBQVk7a0JBQXJDLEtBQUs7bUJBQUMsaUJBQWlCO1lBZ0JLLGVBQWU7a0JBQTNDLEtBQUs7bUJBQUMsb0JBQW9CO1lBU0EsYUFBYTtrQkFBdkMsS0FBSzttQkFBQyxrQkFBa0I7WUFhQyxXQUFXO2tCQUFwQyxNQUFNO21CQUFDLGdCQUFnQjtZQVdFLFdBQVc7a0JBQXBDLE1BQU07bUJBQUMsZ0JBQWdCO1lBYUssY0FBYztrQkFBMUMsTUFBTTttQkFBQyxtQkFBbUI7WUFZRSxjQUFjO2tCQUExQyxNQUFNO21CQUFDLG1CQUFtQjtZQW9GRSxXQUFXO2tCQUF2QyxLQUFLO21CQUFDLGdCQUFnQjtZQXNDTyxZQUFZO2tCQUF6QyxLQUFLO21CQUFDLGlCQUFpQjtZQWNLLFdBQVc7a0JBQXZDLEtBQUs7bUJBQUMsZ0JBQWdCO1lBZUssV0FBVztrQkFBdEMsS0FBSzttQkFBQyxlQUFlO1lBdUJvQix1QkFBdUI7a0JBQWhFLEtBQUs7bUJBQUMsNkJBQTZCO1lBdUJELGdCQUFnQjtrQkFBbEQsS0FBSzttQkFBQyxzQkFBc0I7WUF1RUosUUFBUTtrQkFBaEMsS0FBSzttQkFBQyxZQUFZO1lBbUJLLE9BQU87a0JBQTlCLEtBQUs7bUJBQUMsV0FBVztZQWVJLEtBQUs7a0JBQTFCLEtBQUs7bUJBQUMsU0FBUztZQW1CYSxXQUFXO2tCQUF2QyxLQUFLO21CQUFDLGdCQUFnQjtZQWVTLGNBQWM7a0JBQTdDLEtBQUs7bUJBQUMsbUJBQW1CO1lBNkJELFFBQVE7a0JBQWhDLEtBQUs7bUJBQUMsWUFBWTtZQXNCVSxXQUFXO2tCQUF2QyxLQUFLO21CQUFDLGdCQUFnQjtZQXVDYSxrQkFBa0I7a0JBQXJELEtBQUs7bUJBQUMsdUJBQXVCO1lBMkhLLGlCQUFpQjtrQkFBbkQsS0FBSzttQkFBQyxzQkFBc0I7WUFnQkQsVUFBVTtrQkFBckMsS0FBSzttQkFBQyxlQUFlO1lBMEJFLE9BQU87a0JBQTlCLEtBQUs7bUJBQUMsV0FBVztZQXlCUSxhQUFhO2tCQUF0QyxLQUFLO21CQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IGNvbnZlcnRUb0Jvb2xlYW4sIGNvbnZlcnRUb0ludCwgZ2V0U2hvcnRCcm93c2VyTGFuZ3VhZ2UsIGlzRXh0ZXJuYWxMaW5rLCBpc1R5cGVvZiB9IGZyb20gJy4vLi4vLi4vdXRpbHMvdXRpbCc7XG5cbmltcG9ydCB7IFBvTGFuZ3VhZ2VTZXJ2aWNlLCBwb0xvY2FsZURlZmF1bHQsIFBvTGFuZ3VhZ2UsIHBvTGFuZ3VhZ2VEZWZhdWx0IH0gZnJvbSAnQHBvLXVpL25nLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQgeyBQb1BhZ2VMb2dpbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWxvZ2luLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSB9IGZyb20gJy4vZW51bXMvcG8tcGFnZS1sb2dpbi1hdXRoZW50aWNhdGlvbi10eXBlLmVudW0nO1xuaW1wb3J0IHsgUG9QYWdlTG9naW5DdXN0b21GaWVsZCB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWxvZ2luLWN1c3RvbS1maWVsZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlTG9naW5MaXRlcmFscyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWxvZ2luLWxpdGVyYWxzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1BhZ2VMb2dpblJlY292ZXJ5IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtbG9naW4tcmVjb3ZlcnkuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvUGFnZUxvZ2luU2VydmljZSB9IGZyb20gJy4vcG8tcGFnZS1sb2dpbi5zZXJ2aWNlJztcblxuY29uc3QgcG9QYWdlTG9naW5Db250ZW50TWF4TGVuZ3RoID0gNDA7XG5cbmV4cG9ydCBjb25zdCBwb1BhZ2VMb2dpbkxpdGVyYWxzRGVmYXVsdCA9IHtcbiAgZW46IDxQb1BhZ2VMb2dpbkxpdGVyYWxzPntcbiAgICB0aXRsZTogJ1dlbGNvbWUnLFxuICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAnSW52YWxpZCBMb2dpbicsXG4gICAgbG9naW5IaW50OiBgWW91ciBsb2dpbiB1c2VyIHdhcyBnaXZlbiB0byB5b3UgYXQgeW91ciBmaXJzdCBkYXkuXG4gICAgSWYgeW91IGRvbid0IGhhdmUgdGhpcyBpbmZvcm1hdGlvbiBjb250YWN0IHN1cHBvcnRgLFxuICAgIGxvZ2luUGxhY2Vob2xkZXI6ICdJbnNlcnQgeW91ciBlLW1haWwnLFxuICAgIHBhc3N3b3JkRXJyb3JQYXR0ZXJuOiAnSW52YWxpZCBQYXNzd29yZCcsXG4gICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ0luc2VydCB5b3VyIHBhc3N3b3JkJyxcbiAgICBjdXN0b21GaWVsZEVycm9yUGF0dGVybjogJ0ludmFsaWQgdmFsdWUnLFxuICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICdQbGVhc2UgZW50ZXIgYSB2YWx1ZScsXG4gICAgcmVtZW1iZXJVc2VyOiAnQXV0b21hdGljIGxvZ2luJyxcbiAgICByZW1lbWJlclVzZXJIaW50OiAnWW91IGNhbiBkaXNhYmxlIHRoaXMgb3B0aW9uIGluIHN5c3RlbSBjb25maWd1cmF0aW9uJyxcbiAgICBzdWJtaXRMYWJlbDogJ0VudGVyJyxcbiAgICBzdWJtaXR0ZWRMYWJlbDogJ0xvYWRpbmcuLi4nLFxuICAgIGZvcmdvdFBhc3N3b3JkOiAnRm9yZ290IHlvdXIgUGFzc3dvcmQ/JyxcbiAgICBoaWdobGlnaHRJbmZvOiAnJyxcbiAgICByZWdpc3RlclVybDogJ05ldyByZWdpc3RlcicsXG4gICAgdGl0bGVQb3BvdmVyOiAnT29wcyEnLFxuICAgIGZvcmdvdFlvdXJQYXNzd29yZDogJ0ZvcmdvdCB5b3VyIHBhc3N3b3JkPycsXG4gICAgaWZZb3VUcnlIYXJkZXI6ICdJZiB5b3UgdHJ5ICcsXG4gICAgYXR0ZW1wdHM6ICd7MH0gbW9yZSB0aW1lKHMpICcsXG4gICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOlxuICAgICAgJ3dpdGhvdXQgc3VjY2VzcyB5b3VyIHVzZXIgd2lsbCBiZSBibG9ja2VkIGFuZCB5b3Ugd2lsbCBiZSBsZWZ0IDI0IGhvdXJzIHdpdGhvdXQgYmVpbmcgYWJsZSB0byBhY2Nlc3MgOignLFxuICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzogJ0JldHRlciBjcmVhdGUgYSBuZXcgcGFzc3dvcmQgbm93ISBZb3Ugd2lsbCBiZSBhYmxlIHRvIGxvZyBpbnRvIHRoZSBzeXN0ZW0gcmlnaHQgYXdheS4nLFxuICAgIGlGb3Jnb3RNeVBhc3N3b3JkOiAnSSBmb3Jnb3QgbXkgcGFzc3dvcmQnLFxuICAgIHdlbGNvbWU6ICdXZWxjb21lJyxcbiAgICBzdXBwb3J0OiAnU3VwcG9ydCdcbiAgfSxcbiAgZXM6IDxQb1BhZ2VMb2dpbkxpdGVyYWxzPntcbiAgICB0aXRsZTogJ0JpZW52ZW5pZG8nLFxuICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAnTG9naW4gaW52w6FsaWRvJyxcbiAgICBsb2dpbkhpbnQ6IGBTdSB1c3VhcmlvIGhhIHNpZG8gZW50cmVnYWRvIHBhcmEgdXN0ZWQgZW4gc3UgcHJpbWVyIGTDrWEuXG4gICAgU2kgbm8gdGllbmUgZXN0YSBpbmZvcm1hY2nDs24sIHDDs25nYXNlIGVuIGNvbnRhY3RvIGNvbiBlbCBzb3BvcnRlIHTDqWNuaWNvYCxcbiAgICBsb2dpblBsYWNlaG9sZGVyOiAnSW5zZXJ0ZSBzdSBlLW1haWwnLFxuICAgIHBhc3N3b3JkRXJyb3JQYXR0ZXJuOiAnQ29udHJhc2XDsWEgaW52w6FsaWRhJyxcbiAgICBwYXNzd29yZFBsYWNlaG9sZGVyOiAnSW5zZXJ0ZSBzdSBjb250cmFzZcOxYScsXG4gICAgY3VzdG9tRmllbGRFcnJvclBhdHRlcm46ICdWYWxvciBubyB2w6FsaWRvLicsXG4gICAgY3VzdG9tRmllbGRQbGFjZWhvbGRlcjogJ1BvciBmYXZvciBpbnRyb2R1emNhIHVuIHZhbG9yJyxcbiAgICByZW1lbWJlclVzZXI6ICdJbmljaW8gZGUgc2VzacOzbiBhdXRvbcOhdGljYW1lbnRlJyxcbiAgICByZW1lbWJlclVzZXJIaW50OiAnUHVlZGUgZGVzaGFiaWxpdGFyIGVzdGEgb3BjacOzbiBlbiBlbCBtZW7DuiBkZWwgc2lzdGVtYS4nLFxuICAgIHN1Ym1pdExhYmVsOiAnRW50cmFyJyxcbiAgICBzdWJtaXR0ZWRMYWJlbDogJ0NhcmdhbmRvLi4uJyxcbiAgICBmb3Jnb3RQYXNzd29yZDogJ09sdmlkYXN0ZSB0dSBjb250cmFzZcOxYT8nLFxuICAgIGhpZ2hsaWdodEluZm86ICcnLFxuICAgIHJlZ2lzdGVyVXJsOiAnTnVldm8gcmVnaXN0cm8nLFxuICAgIHRpdGxlUG9wb3ZlcjogJ09wYSEnLFxuICAgIGZvcmdvdFlvdXJQYXNzd29yZDogJ09sdmlkYXN0ZSB0dSBjb250cmFzZcOxYT8nLFxuICAgIGlmWW91VHJ5SGFyZGVyOiAnU2kgaW50ZW50YSBtw6FzICcsXG4gICAgYXR0ZW1wdHM6ICd7MH0gdmV6L3ZlY2VzICcsXG4gICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOiAnc2luIMOpeGl0byBzdSB1c3VhcmlvIHNlcmEgYmxvcXVlYWRvIHkgdXN0ZWQgdsOhcyBwZXJtYW5lY2VyIDI0IGhvcmFzIHNpbiBwb2RlciBhY2NlZGVyIGEgOignLFxuICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzpcbiAgICAgICfCoU1lam9yIGNyZWFyIHVuYSBudWV2YSBjb250cmFzZcOxYSBhaG9yYSEgVXN0ZWQgcG9kcsOhIGVudHJhciBlbiBlbCBzaXN0ZW1hIGlubWVkaWF0YW1lbnRlIGRlc3B1w6lzLicsXG4gICAgaUZvcmdvdE15UGFzc3dvcmQ6ICdPbHZpZGUgbWkgY29udHJhc2XDsWEnLFxuICAgIHdlbGNvbWU6ICdCaWVudmVuaWRvJyxcbiAgICBzdXBwb3J0OiAnU29wb3J0ZSdcbiAgfSxcbiAgcHQ6IDxQb1BhZ2VMb2dpbkxpdGVyYWxzPntcbiAgICB0aXRsZTogJ0JlbS12aW5kbycsXG4gICAgbG9naW5FcnJvclBhdHRlcm46ICdMb2dpbiBpbnbDoWxpZG8nLFxuICAgIGxvZ2luSGludDogYFNldSB1c3XDoXJpbyBmb2kgZW50cmVndWUgYSB2b2PDqiBubyBzZXUgcHJpbWVpcm8gZGlhLlxuICAgIENhc28gbsOjbyB0ZW5oYSBtYWlzIGVzc2EgaW5mb3JtYcOnw6NvIGNvbnRhY3RlIG8gc3Vwb3J0ZWAsXG4gICAgbG9naW5QbGFjZWhvbGRlcjogJ0luc2lyYSBzZXUgZS1tYWlsJyxcbiAgICBwYXNzd29yZEVycm9yUGF0dGVybjogJ1NlbmhhIGludsOhbGlkYScsXG4gICAgcGFzc3dvcmRQbGFjZWhvbGRlcjogJ0luc2lyYSBzdWEgc2VuaGEnLFxuICAgIGN1c3RvbUZpZWxkRXJyb3JQYXR0ZXJuOiAnVmFsb3IgaW52w6FsaWRvLicsXG4gICAgY3VzdG9tRmllbGRQbGFjZWhvbGRlcjogJ1BvciBmYXZvciBpbnNpcmEgdW0gdmFsb3InLFxuICAgIHJlbWVtYmVyVXNlcjogJ0xvZ2FyIGF1dG9tYXRpY2FtZW50ZScsXG4gICAgcmVtZW1iZXJVc2VySGludDogJ1ZvY8OqIHBvZGUgZGVzYWJpbGl0YXIgZXNzYSBvcMOnw6NvIG5vIG1lbnUgZG8gc2lzdGVtYScsXG4gICAgc3VibWl0TGFiZWw6ICdFbnRyYXInLFxuICAgIHN1Ym1pdHRlZExhYmVsOiAnQ2FycmVnYW5kby4uLicsXG4gICAgZm9yZ290UGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcbiAgICBoaWdobGlnaHRJbmZvOiAnJyxcbiAgICByZWdpc3RlclVybDogJ05vdm8gcmVnaXN0cm8nLFxuICAgIHRpdGxlUG9wb3ZlcjogJ09wYSEnLFxuICAgIGZvcmdvdFlvdXJQYXNzd29yZDogJ0VzcXVlY2V1IHN1YSBzZW5oYT8nLFxuICAgIGlmWW91VHJ5SGFyZGVyOiAnU2UgdGVudGFyIG1haXMgJyxcbiAgICBhdHRlbXB0czogJ3swfSB2ZXooZXMpICcsXG4gICAgeW91clVzZXJXaWxsQmVCbG9ja2VkOiAnc2VtIHN1Y2Vzc28gc2V1IHVzdcOhcmlvIHNlcsOhIGJsb3F1ZWFkbyBlIHZvY8OqIGZpY2EgMjQgaG9yYXMgc2VtIHBvZGVyIGFjZXNzYXIgOignLFxuICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzogJ01lbGhvciBjcmlhciB1bWEgc2VuaGEgbm92YSBhZ29yYSEgVm9jw6ogdmFpIHBvZGVyIGVudHJhciBubyBzaXN0ZW1hIGxvZ28gZW0gc2VndWlkYS4nLFxuICAgIGlGb3Jnb3RNeVBhc3N3b3JkOiAnRXNxdWVjaSBtaW5oYSBzZW5oYScsXG4gICAgd2VsY29tZTogJ0JvYXMtdmluZGFzJyxcbiAgICBzdXBwb3J0OiAnU3Vwb3J0ZSdcbiAgfSxcbiAgcnU6IDxQb1BhZ2VMb2dpbkxpdGVyYWxzPntcbiAgICB0aXRsZTogJ9CU0L7QsdGA0L4g0L/QvtC20LDQu9C+0LLQsNGC0YwhJyxcbiAgICBsb2dpbkVycm9yUGF0dGVybjogJ9Cd0LXQstC10YDQvdGL0Lkg0LvQvtCz0LjQvScsXG4gICAgbG9naW5IaW50OiBg0JLQsNGIINC70L7Qs9C40L0g0LHRi9C7INC/0YDQtdC00L7RgdGC0LDQstC70LXQvSDQstCw0Lwg0LIg0L/QtdGA0LLRi9C5INC00LXQvdGMLlxuICAgINCV0YHQu9C4INGDINCy0LDRgSDQvdC10YIg0Y3RgtC+0Lkg0LjQvdGE0L7RgNC80LDRhtC40LgsINC+0LHRgNCw0YLQuNGC0LXRgdGMINCyINGB0LvRg9C20LHRgyDQv9C+0LTQtNC10YDQttC60LhgLFxuICAgIGxvZ2luUGxhY2Vob2xkZXI6ICfQktGB0YLQsNCy0YzRgtC1INGB0LLQvtC5INCw0LTRgNC10YEg0Y3Qu9C10LrRgtGA0L7QvdC90L7QuSDQv9C+0YfRgtGLJyxcbiAgICBwYXNzd29yZEVycm9yUGF0dGVybjogJ9Cd0LXQstC10YDQvdGL0Lkg0L/QsNGA0L7Qu9GMJyxcbiAgICBwYXNzd29yZFBsYWNlaG9sZGVyOiAn0JLQstC10LTQuNGC0LUg0YHQstC+0Lkg0L/QsNGA0L7Qu9GMJyxcbiAgICBjdXN0b21GaWVsZEVycm9yUGF0dGVybjogJ9Cd0LXQstC10YDQvdC+0LUg0LfQvdCw0YfQtdC90LjQtS4nLFxuICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICfQn9C+0LbQsNC70YPQudGB0YLQsCwg0LLQstC10LTQuNGC0LUg0LfQvdCw0YfQtdC90LjQtScsXG4gICAgcmVtZW1iZXJVc2VyOiAn0JDQstGC0L7QvNCw0YLQuNGH0LXRgdC60LjQuSDQstGF0L7QtCcsXG4gICAgcmVtZW1iZXJVc2VySGludDogJ9CS0Ysg0LzQvtC20LXRgtC1INC+0YLQutC70Y7Rh9C40YLRjCDRjdGC0YMg0L7Qv9GG0LjRjiDQsiDQutC+0L3RhNC40LPRg9GA0LDRhtC40Lgg0YHQuNGB0YLQtdC80YsnLFxuICAgIHN1Ym1pdExhYmVsOiAn0JLQvtC50YLQuCcsXG4gICAgc3VibWl0dGVkTGFiZWw6ICcz0LDQs9GA0YPQt9C60LAuLi4nLFxuICAgIGZvcmdvdFBhc3N3b3JkOiAn0JfQsNCx0YvQu9C4INC/0LDRgNC+0LvRjD8nLFxuICAgIGhpZ2hsaWdodEluZm86ICcnLFxuICAgIHJlZ2lzdGVyVXJsOiAn0J3QvtCy0YvQuSDRgNC10LPQuNGB0YLRgCcsXG4gICAgdGl0bGVQb3BvdmVyOiAn0J7QuSEnLFxuICAgIGZvcmdvdFlvdXJQYXNzd29yZDogJ9CX0LDQsdGL0LvQuCDQv9Cw0YDQvtC70Yw/JyxcbiAgICBpZllvdVRyeUhhcmRlcjogJ9CV0YHQu9C4INCy0Ysg0LHQtdC30YPRgdC/0LXRiNC90L4g0L/QvtC/0YvRgtCw0LXRgtC10YHRjCDQstC+0LnRgtC4INC10YnQtSAnLFxuICAgIGF0dGVtcHRzOiAnezB9INGA0LDQtyjQsCkgJyxcbiAgICB5b3VyVXNlcldpbGxCZUJsb2NrZWQ6ICfQktCw0Ygg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GMINCx0YPQtNC10YIg0LfQsNCx0LvQvtC60LjRgNC+0LLQsNC9LCDQuCDQktGLINC+0YHRgtCw0L3QtdGC0LXRgdGMINC90LAgMjQg0YfQsNGB0LAg0LHQtdC3INCy0L7Qt9C80L7QttC90L7RgdGC0Lgg0LTQvtGB0YLRg9C/0LAgOignLFxuICAgIGNyZWF0ZUFOZXdQYXNzd29yZE5vdzogJ9Cb0YPRh9GI0LUg0YHQvtC30LTQsNC50YLQtSDQvdC+0LLRi9C5INC/0LDRgNC+0LvRjCDRgdC10LnRh9Cw0YEhwqDQktGLINGB0LzQvtC20LXRgtC1INGB0YDQsNC30YMg0LLQvtC50YLQuCDQsiDRgdC40YHRgtC10LzRgy4nLFxuICAgIGlGb3Jnb3RNeVBhc3N3b3JkOiAn0K8g0LfQsNCx0YvQuyDRgdCy0L7QuSDQv9Cw0YDQvtC70YwnLFxuICAgIHdlbGNvbWU6ICfQtNC+0LHRgNC+INC/0L7QttCw0LvQvtCy0LDRgtGMJyxcbiAgICBzdXBwb3J0OiAn0J/QvtC00LTQtdGA0LbQutCwJ1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcG9QYWdlTG9naW5MaXRlcmFsSW4gPSB7XG4gIGVuOiAnaW4nLFxuICBlczogJ2VuJyxcbiAgcHQ6ICdlbScsXG4gIHJ1OiAn0LInXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIE8gY29tcG9uZW50ZSBgcG8tcGFnZS1sb2dpbmAgw6kgdXRpbGl6YWRvIGNvbW8gdGVtcGxhdGUgcGFyYSB0ZWxhIGRlIGxvZ2luLlxuICogQ29tIGVsZSDDqSBwb3Nzw612ZWwgZGVmaW5pcm1vcyB2YWxvcmVzIHBhcmEgdXN1w6FyaW8sIHNlbmhhIGUgZGVmaW5pciBhw6fDtWVzIHBhcmEgcmVjdXBlcmHDp8OjbyBkZSBzZW5oYSBlIGdyYXZhw6fDo28gZGUgZGFkb3MgZG8gdXN1w6FyaW8uXG4gKiBUYW1iw6ltIMOpIHBvc3PDrXZlbCBpbnNlcmlyIHVtYSBpbWFnZW0gZW0gY29uanVudG8gY29tIHVtIHRleHRvIGRlIGRlc3RhcXVlLlxuICpcbiAqXG4gKiBBIHByb3ByaWVkYWRlIGBwLWF1dGhlbnRpY2F0aW9uLXVybGAgYXV0b21hdGl6YSBhIHJvdGluYSBkbyBjb21wb25lbnRlIGUgc2ltcGxpZmljYSBvIHByb2Nlc3NvIHBhcmEgYXV0ZW50aWNhw6fDo28gZG8gdXN1w6FyaW8sIGJhc3RhbmRvXG4gKiBkZWZpbmlyIHVtYSB1cmwgcGFyYSByZXF1aXNpw6fDo28gZGEgYXV0ZW50aWNhw6fDo28uIEEgZmxleGliaWxpZGFkZSBlIHByYXRpY2lkYWRlIHBvZGVtIGNoZWdhciBhIHVtIG7DrXZlbCBlbSBxdWUgbyBkZXNlbnZvbHZpbWVudG9cbiAqIGRhIGFwbGljYcOnw6NvIG5vICpjbGllbnQgc2lkZSogw6kgZGVzcHJvdmlkYSBkZSBxdWFscXVlciBjw7NkaWdvLWZvbnRlIHJlbGFjaW9uYWRvIMOgIHJvdGluYSBkZSBsb2dpbiBkZSB1c3XDoXJpby5cbiAqIFNldSBkZXRhbGhhbWVudG8gcGFyYSB1c28gcG9kZSBzZXIgdmlzdG8gbG9nbyBhYmFpeG8gZW0gKnByb3ByaWVkYWRlcyouXG4gKiBDYXNvIGp1bGd1ZSBuZWNlc3PDoXJpbywgcG9kZS1zZSB0YW1iw6ltIGRlZmluaXIgbWFudWFsbWVudGUgYSByb3RpbmEgZG8gY29tcG9uZW50ZS5cbiAqXG4gKlxuICogUGFyYSBxdWUgYXMgaW1hZ2VucyBzZWphbSBleGliaWRhcyBjb3JyZXRhbWVudGUsIMOpIG5lY2Vzc8OhcmlvIGluY2x1aXIgbyBjYW1pbmhvIGRlbGFzIGFvIHByb2pldG8uIFBhcmEgaXNzbywgZWRpdGVcbiAqIG8gKmFzc2V0cyogbm8gYXJxdWl2byAqKmFuZ3VsYXIuanNvbioqIGRhIGFwbGljYcOnw6NvIG5hIHNlZ3VpbnRlIG9yZGVtOlxuICogYGBgXG4gKiAgIFwiYXNzZXRzXCI6IFtcbiAqICAgICBcInNyYy9hc3NldHNcIixcbiAqICAgICBcInNyYy9mYXZpY29uLmljb1wiLFxuICogICAgIHtcbiAqICAgICAgIFwiZ2xvYlwiOiBcIioqXFwvKlwiLFxuICogICAgICAgXCJpbnB1dFwiOiBcIm5vZGVfbW9kdWxlcy9AcG8tdWkvc3R5bGUvaW1hZ2VzXCIsXG4gKiAgICAgICBcIm91dHB1dFwiOiBcImFzc2V0cy9pbWFnZXNcIlxuICogICAgIH1cbiAqICAgXVxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBvUGFnZUxvZ2luQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBPIGBwLWJhY2tncm91bmRgIHBlcm1pdGUgaW5zZXJpciB1bWEgaW1hZ2VtIGRlIGRlc3RhcXVlIGFvIGxhZG8gZGlyZWl0byBkbyBmb3JtdWzDoXJpbyBkZSBsb2dpbiwgY2FzbyBhIHByb3ByaWVkYWRlXG4gICAqIG7Do28gc2VqYSBwcmVlbmNoaWRhIG8gZm9ybXVsw6FyaW8gc2Vyw6EgY2VudHJhbGl6YWRvIG5vIGVzcGHDp28gZGlzcG9uw612ZWwuXG4gICAqXG4gICAqIEEgZm9udGUgZGEgaW1hZ2VtIHBvZGUgc2VyIGRlIHVtIGNhbWluaG8gbG9jYWwgb3UgdW1hIHVybCBkZSB1bSBzZXJ2aWRvciBleHRlcm5vLlxuICAgKlxuICAgKiBBbMOpbSBkYSBpbWFnZW0sIMOpIHBvc3PDrXZlbCBhZGljaW9uYXIgdW0gdGV4dG8gaW5mb3JtYXRpdm8gcG9yIGNpbWEgZGEgaW1hZ2VtIGRhIGltYWdlbSBkZSBkZXN0YXF1ZSwgcGFyYSBpc3NvIGluZm9ybWVcbiAgICogdW0gdmFsb3IgcGFyYSBhIGxpdGVyYWwgYGhpZ2hsaWdodEluZm9gLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBzb2JyZSBhcyBsaXRlcmFpcyBuYSBwcm9wcmllZGFkZSBgcC1saXRlcmFsc2AuXG4gICAqXG4gICAqIEV4ZW1wbG9zIGRlIHZhbG9yZXMgdsOhbGlkb3M6XG4gICAqIC0gKipsb2NhbCoqOiBgLi9hc3NldHMvaW1hZ2VzL2xvZ2luLWJhY2tncm91bmQucG5nYFxuICAgKiAtICoqdXJsIGV4dGVybmEqKjogYGh0dHBzOi8vcG8tdWkuaW8vYXNzZXRzL2ltYWdlcy9sb2dpbi1iYWNrZ3JvdW5kLnBuZ2BcbiAgICpcbiAgICogPiBFc3NhIHByb3ByaWVkYWRlIMOpIGlnbm9yYWRhIHBhcmEgYXBsaWNhw6fDtWVzIG1vYmlsZS5cbiAgICovXG4gIEBJbnB1dCgncC1iYWNrZ3JvdW5kJykgYmFja2dyb3VuZD86IHN0cmluZztcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBDYW1pbmhvIHBhcmEgYSBsb2dvbWFyY2EgbG9jYWxpemFkYSBuYSBwYXJ0ZSBzdXBlcmlvci5cbiAgICpcbiAgICogPiBDYXNvIHNlamEgaW5kZWZpbmlkYSBvIGVzcGHDp28gc2UgbWFudMOpbSBwcmVzZXJ2YWRvIHBvcsOpbSB2YXppby5cbiAgICovXG4gIEBJbnB1dCgncC1sb2dvJykgbG9nbz86IHN0cmluZztcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBFeHByZXNzw6NvIHJlZ3VsYXIgcGFyYSB2YWxpZGFyIG8gY2FtcG8gZGUgbG9naW4sIGNhc28gYSBleHByZXNzw6NvIG7Do28gc2VqYSBhdGVudGlkYSwgYSBsaXRlcmFsIGBsb2dpbkVycm9yUGF0dGVybmBcbiAgICogc2Vyw6EgZXhpYmlkYS5cbiAgICpcbiAgICogRXhlbXBsb3MgZGUgdmFsb3JlcyB2w6FsaWRvczpcbiAgICogLSBlbWFpbDogYFtleHByZXNzYW8tcmVndWxhci1lbWFpbF1gXG4gICAqIC0gY3BmOiBgW2V4cHJlc3Nhby1yZWd1bGFyLWNwZl1gXG4gICAqXG4gICAqID4gVmVqYSBhIHByb3ByaWVkYWRlIGBwLWxpdGVyYWxzYCBwYXJhIGN1c3RvbWl6YXIgYSBsaXRlcmFsIGBsb2dpbkVycm9yUGF0dGVybmAuXG4gICAqL1xuICBASW5wdXQoJ3AtbG9naW4tcGF0dGVybicpIGxvZ2luUGF0dGVybj86IHN0cmluZztcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBFeHByZXNzw6NvIHJlZ3VsYXIgcGFyYSB2YWxpZGFyIG8gY2FtcG8gZGUgcGFzc3dvcmQsIGNhc28gYSBleHByZXNzw6NvIG7Do28gc2VqYSBhdGVudGlkYSwgYSBsaXRlcmFsIGBwYXNzd29yZEVycm9yUGF0dGVybmBcbiAgICogc2Vyw6EgZXhpYmlkYS5cbiAgICpcbiAgICogRXhlbXBsb3MgZGUgdmFsb3JlcyB2w6FsaWRvczpcbiAgICogLSBBcGVuYXMgbsO6bWVyb3M6IGBcXGQ/YFxuICAgKiAtIExldHJhcyBtw61udXNjdWxhczogYFxcej9gXG4gICAqXG4gICAqID4gVmVqYSBhIHByb3ByaWVkYWRlIGBwLWxpdGVyYWxzYCBwYXJhIGN1c3RvbWl6YXIgYSBsaXRlcmFsIGBwYXNzd29yZEVycm9yUGF0dGVybmAuXG4gICAqL1xuICBASW5wdXQoJ3AtcGFzc3dvcmQtcGF0dGVybicpIHBhc3N3b3JkUGF0dGVybj86IHN0cmluZztcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBDYW1pbmhvIHBhcmEgYSBsb2dvbWFyY2EgbG9jYWxpemFkYSBubyByb2RhcMOpLlxuICAgKi9cbiAgQElucHV0KCdwLXNlY29uZGFyeS1sb2dvJykgc2Vjb25kYXJ5TG9nbz86IHN0cmluZztcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBFdmVudG8gZGlzcGFyYWRvIHF1YW5kbyBvIHVzdcOhcmlvIGFsdGVyYXIgbyBpbnB1dCBkbyBjYW1wbyBsb2dpbi5cbiAgICpcbiAgICogRXNzZSBldmVudG8gcmVjZWJlcsOhIGNvbW8gcGFyw6JtZXRybyB1bWEgdmFyacOhdmVsIGRvIHRpcG8gYHN0cmluZ2AgY29tIG8gdGV4dG8gaW5mb3JtYWRvIG5vIGNhbXBvLlxuICAgKlxuICAgKiA+IEVzdGEgcHJvcHJpZWRhZGUgc2Vyw6EgaWdub3JhZGEgc2UgZm9yIGRlZmluaWRvIHZhbG9yIHBhcmEgYSBwcm9wcmllZGFkZSBgcC1hdXRoZW50aWNhdGlvbi11cmxgLlxuICAgKi9cbiAgQE91dHB1dCgncC1sb2dpbi1jaGFuZ2UnKSBsb2dpbkNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKipcbiAgICogRXZlbnRvIGRpc3BhcmFkbyBhbyBzdWJtZXRlciBvIGZvcm11bMOhcmlvIGRlIGxvZ2luIChhcGVydGFuZG8gYEVudGVyYCBkZW50cm8gZG9zIGNhbXBvcyBvdSBwcmVzc2lvbmFuZG8gbyBib3TDo28gZGUgY29uZmlybWHDp8OjbykuXG4gICAqXG4gICAqIEVzc2UgZXZlbnRvIHJlY2ViZXLDoSBjb21vIHBhcsOibWV0cm8gdW0gb2JqZXRvIGRvIHRpcG8gYFBvUGFnZUxvZ2luYCBjb20gb3MgZGFkb3MgaW5mb3JtYWRvcyBubyBmb3JtdWzDoXJpby5cbiAgICpcbiAgICogPiBFc3RhIHByb3ByaWVkYWRlIHNlcsOhIGlnbm9yYWRhIHNlIGZvciBkZWZpbmlkbyB2YWxvciBwYXJhIGEgcHJvcHJpZWRhZGUgYHAtdXJsLXJlY292ZXJ5YC5cbiAgICpcbiAgICogPiBQYXJhIG1haXMgZGV0YWxoZXMgY29uc3VsdGUgYSBkb2N1bWVudGHDp8OjbyBzb2JyZSBhIGludGVyZmFjZSBgUG9QYWdlTG9naW5gIG1haXMgYWJhaXhvLlxuICAgKi9cbiAgQE91dHB1dCgncC1sb2dpbi1zdWJtaXQnKSBsb2dpblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UG9QYWdlTG9naW4+KCk7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXZlbnRvIGRpc3BhcmFkbyBxdWFuZG8gbyB1c3XDoXJpbyBhbHRlcmFyIG8gaW5wdXQgZG8gY2FtcG8gcGFzc3dvcmQuXG4gICAqXG4gICAqIEVzc2UgZXZlbnRvIHJlY2ViZXLDoSBjb21vIHBhcsOibWV0cm8gdW1hIHZhcmnDoXZlbCBkbyB0aXBvIGBzdHJpbmdgIGNvbSBvIHRleHRvIGluZm9ybWFkbyBubyBjYW1wby5cbiAgICpcbiAgICogPiBFc3RhIHByb3ByaWVkYWRlIHNlcsOhIGlnbm9yYWRhIHNlIGZvciBkZWZpbmlkbyB2YWxvciBwYXJhIGEgcHJvcHJpZWRhZGUgYHAtYXV0aGVudGljYXRpb24tdXJsYC5cbiAgICovXG4gIEBPdXRwdXQoJ3AtcGFzc3dvcmQtY2hhbmdlJykgcGFzc3dvcmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRXZlbnRvIGRpc3BhcmFkbyBxdWFuZG8gbyB1c3XDoXJpbyBhbHRlcmFyIG8gaWRpb21hIGRhIHDDoWdpbmEuXG4gICAqXG4gICAqIEVzc2UgZXZlbnRvIHJlY2ViZXLDoSBjb21vIHBhcsOibWV0cm8gdW0gb2JqZXRvIGRvIHRpcG8gYFBvTGFuZ3VhZ2VgIGNvbSBhIGxpbmd1YWdlbSBzZWxlY2lvbmFkYS5cbiAgICpcbiAgICovXG4gIEBPdXRwdXQoJ3AtbGFuZ3VhZ2UtY2hhbmdlJykgbGFuZ3VhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxQb0xhbmd1YWdlPiA9IG5ldyBFdmVudEVtaXR0ZXI8UG9MYW5ndWFnZT4oKTtcblxuICBhbGxMb2dpbkVycm9yczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBhbGxQYXNzd29yZEVycm9yczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBjdXN0b21GaWVsZE9iamVjdDogUG9QYWdlTG9naW5DdXN0b21GaWVsZDtcbiAgY3VzdG9tRmllbGRUeXBlOiBzdHJpbmc7XG4gIGxvZ2luU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHBhc3N3b3JkOiBzdHJpbmc7XG4gIHJlbWVtYmVyVXNlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RlZExhbmd1YWdlOiBzdHJpbmc7XG4gIHNob3dFeGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2F1dGhlbnRpY2F0aW9uVHlwZTogUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUgPSBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZS5CYXNpYztcbiAgcHJpdmF0ZSBfYXV0aGVudGljYXRpb25Vcmw6IHN0cmluZztcbiAgcHJpdmF0ZSBfYmxvY2tlZFVybDogc3RyaW5nO1xuICBwcml2YXRlIF9jb250YWN0RW1haWw6IHN0cmluZztcbiAgcHJpdmF0ZSBfY3VzdG9tRmllbGQ6IHN0cmluZyB8IFBvUGFnZUxvZ2luQ3VzdG9tRmllbGQ7XG4gIHByaXZhdGUgX2Vudmlyb25tZW50Pzogc3RyaW5nO1xuICBwcml2YXRlIF9leGNlZWRlZEF0dGVtcHRzV2FybmluZz86IG51bWJlcjtcbiAgcHJpdmF0ZSBfaGlkZVJlbWVtYmVyVXNlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9saXRlcmFsczogUG9QYWdlTG9naW5MaXRlcmFscztcbiAgcHJpdmF0ZSBfbG9hZGluZz86IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbG9naW46IHN0cmluZztcbiAgcHJpdmF0ZSBfbG9naW5FcnJvcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgcHJpdmF0ZSBfcGFzc3dvcmRFcnJvcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgcHJpdmF0ZSBfcHJvZHVjdE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcmVjb3Zlcnk6IHN0cmluZyB8IFBvUGFnZUxvZ2luUmVjb3ZlcnkgfCBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBfcmVnaXN0ZXJVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSBfc3VwcG9ydDogc3RyaW5nIHwgRnVuY3Rpb247XG4gIHByaXZhdGUgX2xhbmd1YWdlc0xpc3Q6IEFycmF5PFBvTGFuZ3VhZ2U+O1xuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEFvIGluZm9ybWFyIHVtIHZhbG9yIGRvIHRpcG8gYHN0cmluZ2AsIG8gbWVzbW8gc2Vyw6EgYXBsaWNhZG8gY29tbyBhIGNoYXZlIGRvIGNhbXBvIGN1c3RvbWl6YWRvIGUgdXRpbGl6YXLDoVxuICAgKiBvcyB2YWxvcmVzIHBhZHLDtWVzIGNvbnRpZG9zIG5hIHByb3ByaWVkYWRlIGBsaXRlcmFsc2AgY29tbyBgY3VzdG9tRmllbGRFcnJvclBhdHRlcm5gIGUgYGN1c3RvbUZpZWxkUGxhY2Vob2xkZXJgLlxuICAgKlxuICAgKiBFeGlzdGUgYSBwb3NzaWJpbGlkYWRlIGRlIGluZm9ybWFyIHVtIG9iamV0byBxdWUgc2VndWUgYSBkZWZpbmnDp8OjbyBkYSBpbnRlcmZhY2UgYFBvUGFnZUxvZ2luQ3VzdG9tRmllbGRgLCBvbmRlXG4gICAqIGF0cmF2w6lzIGRvcyBwYXLDom1ldHJvcyBlbnZpYWRvcyBwb2RlIGdlcmFyIHVtIGBwby1pbnB1dGAsIGBwby1jb21ib2AgZXNwZWNpZmljYW1lbnRlIHBhcmEgc2VydmnDp29zXG4gICAqIG91IGBwby1zZWxlY3RgIHBhcmEgdmFsb3JlcyBmaXhvcy5cbiAgICpcbiAgICogQWJhaXhvIHNlZ3VlbSBvcyBleGVtcGxvcyBkZSBjYWRhIHRpcG8gZGUgY2FtcG8uXG4gICAqXG4gICAqIGBwby1pbnB1dGA6XG4gICAqXG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgcHJvcGVydHk6ICdkb21haW4nLFxuICAgKiAgIHZhbHVlOiAnanYwMScsXG4gICAqICAgcGxhY2Vob2xkZXI6ICdFbnRlciB5b3VyIGRvbWFpbicsXG4gICAqICAgcGF0dGVybjogJ1thLXpdJyxcbiAgICogICBlcnJvclBhdHRlcm46ICdJbnZhbGlkIHZhbHVlJ1xuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBgcG8tY29tYm9gOlxuICAgKlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIHByb3BlcnR5OiAnZG9tYWluJyxcbiAgICogICB2YWx1ZTogJ2p2MDEnLFxuICAgKiAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgeW91ciBkb21haW4nLFxuICAgKiAgIHVybDogJ2h0dHBzOi8vcG8tdWkuaW8vc2FtcGxlL2FwaS9jb21ib09wdGlvbi9kb21haW5zJyxcbiAgICogICBmaWVsZFZhbHVlOiAnbmlja25hbWUnXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIGBwby1zZWxlY3RgOlxuICAgKlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIHByb3BlcnR5OiAnZG9tYWluJyxcbiAgICogICB2YWx1ZTogJ2p2MDEnLFxuICAgKiAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgeW91ciBkb21haW4nLFxuICAgKiAgIG9wdGlvbnM6IFt7bGFiZWw6ICdEb21haW4gMScsIHZhbHVlOiAnMSd9LCB7bGFiZWw6ICdEb21haW4gMicsIHZhbHVlOiAnMid9XVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBDYXNvIG8gY3VzdG9tRmllbGQgcG9zc3VhIG9wdGlvbnMsIHVybCBlIGZpZWxkVmFsdWUgcHJlZW5jaGlkb3MsIHNlcsOhIHByaW9yaXphZG8gbyBwby1zZWxlY3RcbiAgICogdXRpbGl6YW5kbyBvIG9wdGlvbnMuXG4gICAqXG4gICAqL1xuICBASW5wdXQoJ3AtY3VzdG9tLWZpZWxkJykgc2V0IGN1c3RvbUZpZWxkKHZhbHVlOiBzdHJpbmcgfCBQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAoaXNUeXBlb2YodmFsdWUsICdzdHJpbmcnKSkge1xuICAgICAgICB0aGlzLmN1c3RvbUZpZWxkVHlwZSA9ICdpbnB1dCc7XG4gICAgICAgIHRoaXMuX2N1c3RvbUZpZWxkID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY3VzdG9tRmllbGRPYmplY3QgPSB0aGlzLmdldERlZmF1bHRDdXN0b21GaWVsZE9iamVjdCh2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVHlwZW9mKHZhbHVlLCAnb2JqZWN0JykgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlWydwcm9wZXJ0eSddKSB7XG4gICAgICAgIHRoaXMuX2N1c3RvbUZpZWxkID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY3VzdG9tRmllbGRPYmplY3QgPSA8UG9QYWdlTG9naW5DdXN0b21GaWVsZD52YWx1ZTtcblxuICAgICAgICBpZiAoIXRoaXMuY3VzdG9tRmllbGRPYmplY3Qub3B0aW9ucyAmJiAhdGhpcy5jdXN0b21GaWVsZE9iamVjdC51cmwpIHtcbiAgICAgICAgICB0aGlzLmN1c3RvbUZpZWxkVHlwZSA9ICdpbnB1dCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jdXN0b21GaWVsZFR5cGUgPSB0aGlzLmN1c3RvbUZpZWxkT2JqZWN0Lm9wdGlvbnMgPyAnc2VsZWN0JyA6ICdjb21ibyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fY3VzdG9tRmllbGQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jdXN0b21GaWVsZE9iamVjdCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBjdXN0b21GaWVsZCgpOiBzdHJpbmcgfCBQb1BhZ2VMb2dpbkN1c3RvbUZpZWxkIHtcbiAgICByZXR1cm4gdGhpcy5fY3VzdG9tRmllbGQ7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBQZXJzb25hbGl6YSBvIGUtbWFpbCBxdWUgw6kgZXhpYmlkbyBuYSBtZW5zYWdlbSBkZSBkaWNhIGRlIGxvZ2luIHBhZHLDo28gcGFyYSBjb250YXRvIGRlIHN1cG9ydGUuXG4gICAqL1xuICBASW5wdXQoJ3AtY29udGFjdC1lbWFpbCcpIHNldCBjb250YWN0RW1haWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NvbnRhY3RFbWFpbCA9IHZhbHVlO1xuICB9XG4gIGdldCBjb250YWN0RW1haWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRhY3RFbWFpbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIFRleHRvIGN1c3RvbWl6YWRvIHF1ZSBmaWNhIGVudHJlIGEgbG9nbyBlIGEgbWVuc2FnZW0gZGUgYm9hcy12aW5kYXMuXG4gICAqL1xuICBASW5wdXQoJ3AtcHJvZHVjdC1uYW1lJykgc2V0IHByb2R1Y3ROYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wcm9kdWN0TmFtZSA9IHZhbHVlO1xuICB9XG4gIGdldCBwcm9kdWN0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvZHVjdE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBZGljaW9uYSB1bWEgYHRhZ2AgYWJhaXhvIGRvIHTDrXR1bG8gcXVlIGVzcGVjaWZpY2EgbyBhbWJpZW50ZSBxdWUgbyB1c3XDoXJpbyBlc3TDoSBmYXplbmRvIG8gbG9naW4uXG4gICAqXG4gICAqID4gRXNzYSBwcm9wcmllZGFkZSBsaW1pdGEgbyB0ZXh0byBlbSA0MCBjYXJhY3RlcmVzLlxuICAgKi9cbiAgQElucHV0KCdwLWVudmlyb25tZW50Jykgc2V0IGVudmlyb25tZW50KGVudmlyb25tZW50OiBzdHJpbmcpIHtcbiAgICBpZiAoZW52aXJvbm1lbnQgJiYgZW52aXJvbm1lbnQubGVuZ3RoID4gcG9QYWdlTG9naW5Db250ZW50TWF4TGVuZ3RoKSB7XG4gICAgICB0aGlzLl9lbnZpcm9ubWVudCA9IGVudmlyb25tZW50LnN1YnN0cmluZygwLCBwb1BhZ2VMb2dpbkNvbnRlbnRNYXhMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9lbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xuICAgIH1cbiAgfVxuICBnZXQgZW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Vudmlyb25tZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRXhpYmUgdW0gYXZpc28gZGUgYmxvcXVlaW8gZGUgYWNvcmRvIGNvbSBhIHF1YW50aWRhZGUgcmVzdGFudGUgZGUgdGVudGF0aXZhcy5cbiAgICogTyBhdmlzbyBzZXLDoSBleGliaWRvIHNvbWVudGUgc2UgYSBxdWFudGlkYWRlIGZvciBtYWlvciBxdWUgemVyby5cbiAgICpcbiAgICogPiBDYXNvIHRlbmhhIGFsZ3VtIHZhbG9yIGF0cmlidcOtZG8gcGFyYSBvIGF0cmlidXRvIGBwLWF1dGhlbnRpY2F0aW9uLXVybGAgZSBvIHJldG9ybm8gZGEgcmVxdWlzacOnw6NvIGVzdGl2ZXIgYXRyaWJ1aW5kbyB2YWxvclxuICAgKiBwYXJhIG8gYHAtZXhjZWVkZWQtYXR0ZW1wdHMtd2FybmluZ2AsIG8gdmFsb3IgY29uc2lkZXJhZG8gc2Vyw6EgbyBkbyByZXRvcm5vIGRhIHJlcXVpc2nDp8Ojby5cbiAgICpcbiAgICogQGRlZmF1bHQgYDBgXG4gICAqL1xuICBASW5wdXQoJ3AtZXhjZWVkZWQtYXR0ZW1wdHMtd2FybmluZycpIHNldCBleGNlZWRlZEF0dGVtcHRzV2FybmluZyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPSBjb252ZXJ0VG9JbnQodmFsdWUpO1xuICAgIHRoaXMuc2hvd0V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gdGhpcy5leGNlZWRlZEF0dGVtcHRzV2FybmluZyA+IDA7XG4gIH1cblxuICBnZXQgZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmc7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBFc2NvbmRlIGEgZnVuw6fDo28gXCJMZW1icmFyIHVzdcOhcmlvXCIgZG8gZm9ybXVsw6FyaW8gZGUgbG9naW4uXG4gICAqXG4gICAqIFF1YW5kbyBlc3NhIHByb3ByaWVkYWRlIMOpIHNldGFkYSBjb20gYHRydWVgIGEgcHJvcHJpZWRhZGUgYHJlbWVtYmVyVXNlcmAgZW52aWFkYSBubyBldmVudG8gYHAtbG9naW4tc3VibWl0YCBzZXLDoSBzZW1wcmVcbiAgICogYGZhbHNlYC5cbiAgICpcbiAgICogPiBWZWphIGEgcHJvcHJpZWRhZGUgYHAtbGl0ZXJhbHNgIHBhcmEgY3VzdG9taXphciBhIGxpdGVyYWwgYHJlbWVtYmVyVXNlcmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIEBJbnB1dCgncC1oaWRlLXJlbWVtYmVyLXVzZXInKSBzZXQgaGlkZVJlbWVtYmVyVXNlcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2hpZGVSZW1lbWJlclVzZXIgPSA8YW55PnZhbHVlID09PSAnJyA/IHRydWUgOiBjb252ZXJ0VG9Cb29sZWFuKHZhbHVlKTtcblxuICAgIGlmICh0aGlzLl9oaWRlUmVtZW1iZXJVc2VyKSB7XG4gICAgICB0aGlzLnJlbWVtYmVyVXNlciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBnZXQgaGlkZVJlbWVtYmVyVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGlkZVJlbWVtYmVyVXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIE9iamV0byBjb20gYXMgbGl0ZXJhaXMgdXNhZGFzIG5vIGBwby1wYWdlLWxvZ2luYC5cbiAgICpcbiAgICogRXhpc3RlbSBkdWFzIG1hbmVpcmFzIGRlIGN1c3RvbWl6YXIgbyBjb21wb25lbnRlLCBwYXNzYW5kbyB1bSBvYmpldG8gY29tIHRvZGFzIGFzIGxpdGVyYWlzIGRpc3BvbsOtdmVpczpcbiAgICpcbiAgICogYGBgXG4gICAqICBjb25zdCBjdXN0b21MaXRlcmFsczogUG9QYWdlTG9naW5MaXRlcmFscyA9IHtcbiAgICogICAgYXR0ZW1wdHM6ICd7MH0gdmV6KGVzKSAnLFxuICAgKiAgICBjcmVhdGVBTmV3UGFzc3dvcmROb3c6ICdNZWxob3IgY3JpYXIgdW1hIHNlbmhhIG5vdmEgYWdvcmEhIFZvY8OqIHZhaSBwb2RlciBlbnRyYXIgbm8gc2lzdGVtYSBsb2dvIGVtIHNlZ3VpZGEuJyxcbiAgICogICAgZm9yZ290UGFzc3dvcmQ6ICdFc3F1ZWNldSBzdWEgc2VuaGE/JyxcbiAgICogICAgZm9yZ290WW91clBhc3N3b3JkOiAnRXNxdWVjZXUgc3VhIHNlbmhhPycsXG4gICAqICAgIGhpZ2hsaWdodEluZm86ICcnLFxuICAgKiAgICBpRm9yZ290TXlQYXNzd29yZDogJ0VzcXVlY2kgbWluaGEgc2VuaGEnLFxuICAgKiAgICBpZllvdVRyeUhhcmRlcjogJ1NlIHRlbnRhciBtYWlzICcsXG4gICAqICAgIHdlbGNvbWU6ICdCb2FzLXZpbmRhcycsXG4gICAqICAgIGxvZ2luRXJyb3JQYXR0ZXJuOiAnTG9naW4gb2JyaWdhdMOzcmlvJyxcbiAgICogICAgbG9naW5IaW50OiAnQ2FzbyBuw6NvIHBvc3N1YSB1c3XDoXJpbyBlbnRyZSBlbSBjb250YXRvIGNvbSBvIHN1cG9ydGUnLFxuICAgKiAgICBsb2dpbkxhYmVsOiAnSW5zaXJhIHNldSB1c3XDoXJpbycsXG4gICAqICAgIGxvZ2luUGxhY2Vob2xkZXI6ICdJbnNpcmEgc2V1IHVzdcOhcmlvIGRlIGFjZXNzbycsXG4gICAqICAgIHBhc3N3b3JkRXJyb3JQYXR0ZXJuOiAnU2VuaGEgb2JyaWdhdMOzcmlhJyxcbiAgICogICAgcGFzc3dvcmRMYWJlbDogJ0luc2lyYSBzdWEgc2VuaGEnLFxuICAgKiAgICBwYXNzd29yZFBsYWNlaG9sZGVyOiAnSW5zaXJhIHN1YSBzZW5oYSBkZSBhY2Vzc28nLFxuICAgKiAgICBjdXN0b21GaWVsZEVycm9yUGF0dGVybjogJ0NhbXBvIGN1c3RvbWl6YWRvIGludsOhbGlkbycsXG4gICAqICAgIGN1c3RvbUZpZWxkUGxhY2Vob2xkZXI6ICdQb3IgZmF2b3IgaW5zaXJhIHVtIHZhbG9yJyxcbiAgICogICAgcmVnaXN0ZXJVcmw6ICdOb3ZvIHJlZ2lzdHJvJyxcbiAgICogICAgcmVtZW1iZXJVc2VyOiAnTGVtYnJhciB1c3XDoXJpbycsXG4gICAqICAgIHJlbWVtYmVyVXNlckhpbnQ6ICdFc3RhIG9ww6fDo28gcG9kZSBzZXIgZGVzYWJpbGl0YWRhIG5hcyBjb25maWd1cmHDp8O1ZXMgZG8gc2lzdGVtYScsXG4gICAqICAgIHN1Ym1pdExhYmVsOiAnQWNlc3NhciBzaXN0ZW1hJyxcbiAgICogICAgc3VibWl0dGVkTGFiZWw6ICdDYXJyZWdhbmRvLi4uJyxcbiAgICogICAgdGl0bGVQb3BvdmVyOiAnT3BhIScsXG4gICAqICAgIHlvdXJVc2VyV2lsbEJlQmxvY2tlZDogJ3NlbSBzdWNlc3NvIHNldSB1c3XDoXJpbyBzZXLDoSBibG9xdWVhZG8gZSB2b2PDqiBmaWNhIDI0IGhvcmFzIHNlbSBwb2RlciBhY2Vzc2FyIDooJ1xuICAgKiAgfTtcbiAgICogYGBgXG4gICAqXG4gICAqIE91IHBhc3NhbmRvIGFwZW5hcyBhcyBsaXRlcmFpcyBxdWUgZGVzZWphIGN1c3RvbWl6YXI6XG4gICAqXG4gICAqIGBgYFxuICAgKiAgY29uc3QgY3VzdG9tTGl0ZXJhbHM6IFBvUGFnZUxvZ2luTGl0ZXJhbHMgPSB7XG4gICAqICAgIGxvZ2luUGxhY2Vob2xkZXI6ICdJbnNpcmEgc2V1IHVzdcOhcmlvIGRlIGFjZXNzbycsXG4gICAqICAgIHBhc3N3b3JkUGxhY2Vob2xkZXI6ICdJbnNpcmEgc3VhIHNlbmhhIGRlIGFjZXNzbycsXG4gICAqICAgIHN1Ym1pdExhYmVsOiAnQWNlc3NhciBzaXN0ZW1hJ1xuICAgKiAgfTtcbiAgICogYGBgXG4gICAqXG4gICAqIEUgcGFyYSBjYXJyZWdhciBhcyBsaXRlcmFpcyBjdXN0b21pemFkYXMsIGJhc3RhIGFwZW5hcyBwYXNzYXIgbyBvYmpldG8gcGFyYSBvIGNvbXBvbmVudGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8cG8tcGFnZS1sb2dpblxuICAgKiAgIFtwLWxpdGVyYWxzXT1cImN1c3RvbUxpdGVyYWxzXCI+XG4gICAqIDwvcG8tcGFnZS1sb2dpbj5cbiAgICogYGBgXG4gICAqXG4gICAqICA+IE8gb2JqZXRvIHBhZHLDo28gZGUgbGl0ZXJhaXMgc2Vyw6EgdHJhZHV6aWRvIGRlIGFjb3JkbyBjb20gbyBpZGlvbWEgZG8gYnJvd3NlciAocHQsIGVuLCBlcykuXG4gICAqICA+IMOJIHRhbWLDqW0gcG9zc8OtdmVsIGFsdGVybmFyIG8gb2JqZXRvIHBhZHLDo28gZGUgbGl0ZXJhaXMgYXRyYXbDqXMgZG8gc2VsZXRvciBkZSBpZGlvbWFzIGxvY2FsaXphZG8gbmEgcGFydGUgaW5mZXJpb3IgZG8gdGVtcGxhdGUsXG4gICAqIG5lc3NlIGNhc28sIGjDoSB0YW1iw6ltIGEgb3DDp8OjbyBkbyBpZGlvbWEgcnVzc28uXG4gICAqL1xuICBASW5wdXQoJ3AtbGl0ZXJhbHMnKSBzZXQgbGl0ZXJhbHModmFsdWU6IFBvUGFnZUxvZ2luTGl0ZXJhbHMpIHtcbiAgICB0aGlzLl9saXRlcmFscyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGxpdGVyYWxzKCkge1xuICAgIHJldHVybiB0aGlzLl9saXRlcmFscztcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEhhYmlsaXRhIHVtIGVzdGFkbyBkZSBjYXJyZWdhbWVudG8gYW8gYm90w6NvIGRlICpsb2dpbiouXG4gICAqXG4gICAqID4gw4kgbmVjZXNzw6FyaW8gYXRyaWJ1aXIgYHRydWVgIMOgIGVzdGEgcHJvcHJpZWRhZGUgbmEgZnVuw6fDo28gZGVmaW5pZGEgZW0gYHAtbG9naW4tc3VibWl0YC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgQElucHV0KCdwLWxvYWRpbmcnKSBzZXQgbG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2xvYWRpbmcgPSBjb252ZXJ0VG9Cb29sZWFuKHZhbHVlKTtcbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogVmFsb3IgZG8gbW9kZWxvIGRvIGNhbXBvIGRlIGxvZ2luLlxuICAgKi9cbiAgQElucHV0KCdwLWxvZ2luJykgc2V0IGxvZ2luKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dpbiA9IHZhbHVlO1xuXG4gICAgaWYgKCF0aGlzLmF1dGhlbnRpY2F0aW9uVXJsKSB7XG4gICAgICB0aGlzLmxvZ2luQ2hhbmdlLmVtaXQodGhpcy5fbG9naW4pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsb2dpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2dpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEF0cmlidXRvIHF1ZSByZWNlYmUgdW1hIGxpc3RhIGRlIGVycm9zIGUgZXhpYmUgYWJhaXhvIGRvIGNhbXBvIGRlIGxvZ2luLlxuICAgKi9cbiAgQElucHV0KCdwLWxvZ2luLWVycm9ycycpIHNldCBsb2dpbkVycm9ycyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMuX2xvZ2luRXJyb3JzID0gdmFsdWUgfHwgW107XG4gICAgdGhpcy5zZXRMb2dpbkVycm9ycyh0aGlzLl9sb2dpbkVycm9ycyk7XG4gIH1cbiAgZ2V0IGxvZ2luRXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2dpbkVycm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEF0cmlidXRvIHF1ZSByZWNlYmUgdW1hIGxpc3RhIGRlIGVycm9zIGUgZXhpYmUgYWJhaXhvIGRvIGNhbXBvIGRlIHBhc3N3b3JkLlxuICAgKi9cbiAgQElucHV0KCdwLXBhc3N3b3JkLWVycm9ycycpIHNldCBwYXNzd29yZEVycm9ycyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMuX3Bhc3N3b3JkRXJyb3JzID0gdmFsdWUgfHwgW107XG4gICAgdGhpcy5zZXRQYXNzd29yZEVycm9ycyh0aGlzLl9wYXNzd29yZEVycm9ycyk7XG4gIH1cbiAgZ2V0IHBhc3N3b3JkRXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXNzd29yZEVycm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEV4aWJlIHVtIGxpbmsgYWJhaXhvIGRvIGZvcm11bMOhcmlvIGRlIGxvZ2luIHBhcmEgcXVlIG9zIHVzdcOhcmlvcyBkYSBhcGxpY2HDp8OjbyBmYcOnYW0gYSByZWN1cGVyYcOnw6NvIGRvcyBkYWRvcyBkZSBhdXRlbnRpY2HDp8Ojby5cbiAgICpcbiAgICogQSBwcm9wcmllZGFkZSBhY2VpdGEgb3Mgc2VndWludGVzIHRpcG9zOlxuICAgKlxuICAgKiAtICoqU3RyaW5nKio6IGluZm9ybWUgdW1hIHVybCBleHRlcm5hIG91IHVtYSByb3RhIHbDoWxpZGE7XG4gICAqIC0gKipGdW5jdGlvbioqOiBwb2RlLXNlIGN1c3RvbWl6YXIgYSBhw6fDo28uIFBhcmEgZXN0YSBwb3NzaWxpZGFkZSBiYXN0YSBhdHJpYnVpcjpcbiAgICogYGBgXG4gICAqIDxwby1wYWdlLWxvZ2luPlxuICAgKiAgIFtyZWNvdmVyeV09XCJ0aGlzLm15UmVjb3ZlcnkuYmluZCh0aGlzKVwiPlxuICAgKiA8L3BvLXBhZ2UtbG9naW4+XG4gICAqIGBgYFxuICAgKlxuICAgKiAtICoqUG9QYWdlTG9naW5SZWNvdmVyeSoqOiBjcmlhLXNlIHbDrW5jdWxvIGF1dG9tw6F0aWNvIGNvbSBvIHRlbXBsYXRlICoqcG8tbW9kYWwtcGFzc3dvcmQtcmVjb3ZlcnkqKi5cbiAgICogICBPIG9iamV0byBkZXZlIGNvbnRlciBhICoqdXJsKiogcGFyYSByZXF1aXNpw6fDo28gZG9zIHJlY3Vyc29zIGUgcG9kZS1zZSBkZWZpbmlyIG8gKip0aXBvKiogZGUgbW9kYWwgcGFyYSByZWN1cGVyYcOnw6NvIGRlIHNlbmhhLFxuICAgKiAgICoqZW1haWwqKiBwYXJhIGNvbnRhdG8gZSAqKm3DoXNjYXJhKiogZG8gY2FtcG8gZGUgdGVsZWZvbmUuXG4gICAqL1xuICBASW5wdXQoJ3AtcmVjb3ZlcnknKSBzZXQgcmVjb3ZlcnkodmFsdWU6IHN0cmluZyB8IEZ1bmN0aW9uIHwgUG9QYWdlTG9naW5SZWNvdmVyeSkge1xuICAgIHRoaXMuX3JlY292ZXJ5ID0gdmFsdWU7XG4gIH1cblxuICBnZXQgcmVjb3ZlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY292ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQ2FzbyBhIGFwbGljYcOnw6NvIHRlbmhhIHVtIGxpbmsgcGFyYSBub3ZvcyBjYWRhc3Ryb3MsIGluZm9ybWUgdW1hIHVybCBleHRlcm5hIG91IHVtYSByb3RhIHbDoWxpZGEsIGRlc3NhXG4gICAqIGZvcm1hIHNlcsOhIGV4aWJpZG8gdW0gbGluayBhYmFpeG8gZG8gZm9ybXVsw6FyaW8gZGUgbG9naW4gcGFyYSBvcyB1c3XDoXJpb3MgZGEgYXBsaWNhw6fDo28uXG4gICAqXG4gICAqIEV4ZW1wbG9zIGRlIHZhbG9yZXMgdsOhbGlkb3M6XG4gICAqIC0gKipsb2NhbCoqOiBgL2hvbWVgXG4gICAqIC0gKip1cmwgZXh0ZXJuYSoqOiBgaHR0cHM6Ly9wby11aS5pb2BcbiAgICpcbiAgICogPiBWZWphIGEgcHJvcHJpZWRhZGUgYHAtbGl0ZXJhbHNgIHBhcmEgY3VzdG9taXphciBhIGxpdGVyYWwgYHJlZ2lzdGVyVXJsYC5cbiAgICovXG4gIEBJbnB1dCgncC1yZWdpc3Rlci11cmwnKSBzZXQgcmVnaXN0ZXJVcmwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3JlZ2lzdGVyVXJsID0gaXNUeXBlb2YodmFsdWUsICdzdHJpbmcnKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0IHJlZ2lzdGVyVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQXRyaWJ1dG8gcXVlIHJlY2ViZSBvIHRpcG8gZGUgZXNxdWVtYSBkYSBhdXRlbnRpY2HDp8Ojbywgc2VuZG8gc3Vwb3J0YWRvcyBhcGVuYXMgb3MgdmFsb3JlcyBgQmFzaWNgIGUgYEJlYXJlcmAuXG4gICAqXG4gICAqID4gQ2FzbyBvIHRpcG8gZGVmaW5pZG8gc2VqYSBgQmFzaWNgLCBvIGNvbXBvbmVudGUgZmFyw6EgdW1hIHJlcXVpc2nDp8OjbyBgUE9TVGAgY29udGVuZG86XG4gICAqXG4gICAqIGBgYFxuICAgKiBoZWFkZXJzIHtcbiAgICogIEF1dGhvcml6YXRpb246IEJhc2ljIGJhc2U2NChsb2dpbjpwYXNzd29yZClcbiAgICogfVxuICAgKlxuICAgKiBib2R5IHtcbiAgICogIHJlbWVtYmVyVXNlcjogcmVtZW1iZXJVc2VyXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqID4gQ2FzbyBvIHRpcG8gZGVmaW5pZG8gc2VqYSBgQmVhcmVyYCwgbyBjb21wb25lbnRlIGZhcsOhIHVtYSByZXF1aXNpw6fDo28gYFBPU1RgIGNvbnRlbmRvOlxuICAgKlxuICAgKiBgYGBcbiAgICogYm9keSB7XG4gICAqICBsb2dpbjogbG9naW4sXG4gICAqICBwYXNzd29yZDogYmFzZTY0KHBhc3N3b3JkKSxcbiAgICogIHJlbWVtYmVyVXNlcjogcmVtZW1iZXJVc2VyXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBkZWZhdWx0IGBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZS5CYXNpY2BcbiAgICovXG4gIEBJbnB1dCgncC1hdXRoZW50aWNhdGlvbi10eXBlJykgc2V0IGF1dGhlbnRpY2F0aW9uVHlwZSh2YWx1ZTogUG9QYWdlTG9naW5BdXRoZW50aWNhdGlvblR5cGUpIHtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGlvblR5cGUgPSAoPGFueT5PYmplY3QpLnZhbHVlcyhQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSkuaW5jbHVkZXModmFsdWUpXG4gICAgICA/IHZhbHVlXG4gICAgICA6IFBvUGFnZUxvZ2luQXV0aGVudGljYXRpb25UeXBlLkJhc2ljO1xuICB9XG5cbiAgZ2V0IGF1dGhlbnRpY2F0aW9uVHlwZSgpOiBQb1BhZ2VMb2dpbkF1dGhlbnRpY2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEVuZHBvaW50IHVzYWRvIHBlbG8gdGVtcGxhdGUgcGFyYSByZXF1aXNpw6fDo28gZG8gcmVjdXJzby4gUXVhbmRvIHByZWVuY2hpZG8sIG8gbcOpdG9kbyBgcC1sb2dpbi1zdWJtaXRgIHNlcsOhIGlnbm9yYWRvIGUgb1xuICAgKiBjb21wb25lbnRlIGFkcXVpcmlyw6EgYXV0b21hdGl6YcOnw6NvIHBhcmEgbyBwcm9jZXNzbyBkZSBhdXRlbnRpY2HDp8Ojby5cbiAgICpcbiAgICogIyMjIFByb2Nlc3Nvc1xuICAgKiBBbyBkaWdpdGFyIHVtIHZhbG9yIHbDoWxpZG8gbm8gY2FtcG8gZGUgbG9naW4vcGFzc3dvcmQgZSBwcmVzc2lvbmFyICoqRW50ZXIqKiwgbyBjb21wb25lbnRlIGZhcsOhIHVtYSByZXF1aXNpw6fDo28gYFBPU1RgXG4gICAqIG5hIHVybCBlc3BlY2lmaWNhZGEgbmVzdGEgcHJvcHJpZWRhZGUgcGFzc2FuZG8gbyBvYmpldG8gY29udGVuZG8gbyB2YWxvciBkZWZpbmlkbyBwZWxvIHVzdcOhcmlvOlxuICAgKlxuICAgKiBgYGBcbiAgICogaGVhZGVycyB7XG4gICAqICBBdXRob3JpemF0aW9uOiBCYXNpYyBiYXNlNjQobG9naW46cGFzc3dvcmQpXG4gICAqIH1cbiAgICpcbiAgICogYm9keSB7XG4gICAqICByZW1lbWJlclVzZXI6IHJlbWVtYmVyVXNlclxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBFbSBjYXNvIGRlICoqc3VjZXNzbyoqLCBvIG9iamV0byBkZSByZXRvcm5vIMOpIGFybWF6ZW5hZG8gbm8gYHNlc3Npb25TdG9yYWdlYCBlIG8gdXN1w6FyaW8gw6kgcmVkaXJlY2lvbmFkbyBwYXJhIGEgcMOhZ2luYSBpbmljaWFsIGRhXG4gICAqIGFwbGljYcOnw6NvIGAvYC5cbiAgICpcbiAgICogYGBgXG4gICAqIDIwMDpcbiAgICogIHtcbiAgICogICAgdXNlcjogdXNlclxuICAgKiAgfVxuICAgKiBgYGBcbiAgICpcbiAgICogRW0gY2FzbyBkZSAqKmVycm8qKiBuYSBhdXRlbnRpY2HDp8OjbywgZXNwZXJhLXNlIG8gc2VndWludGUgcmV0b3JubzpcbiAgICpcbiAgICogYGBgXG4gICAqIDQwMC80MDFcbiAgICogIHtcbiAgICogICAgY29kZTogNDAwLzQwMSxcbiAgICogICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICogICAgZGV0YWlsZWRNZXNzYWdlOiBkZXRhaWxlZE1lc3NhZ2UsXG4gICAqICAgIGhlbHBVcmw/OiBoZWxwVXJsXG4gICAqICB9XG4gICAqIGBgYFxuICAgKlxuICAgKiA+IFBvZGUtc2UgYXRyaWJ1aXIgdW1hIHF1YW50aWRhZGUgbcOheGltYSBkZSB0ZW50YXRpdmFzIHJlc3RhbnRlcyAobWF4QXR0ZW1wdHNSZW1haW5pbmcpIHBhcmEgbyBhdHJpYnV0byBgcC1leGNlZWRlZC1hdHRlbXB0cy13YXJuaW5nYCxcbiAgICogYXNzaW0gY29tbyBvcyBhdmlzb3MgcmVsYWNpb25hZG9zIGFvcyBjYW1wb3MgbG9naW4gZSBwYXNzd29yZCAobG9naW5XYXJuaW5ncywgcGFzc3dvcmRXYXJuaW5ncykgcGFyYSBvcyBhdHJpYnV0b3MgYHAtbG9naW4tZXJyb3JzYCBlXG4gICAqIGBwLXBhc3N3b3JkLWVycm9yc2AgY29uZm9ybWUgcmV0b3JubyBhYmFpeG86XG4gICAqXG4gICAqIGBgYFxuICAgKiA0MDBcbiAgICogIHtcbiAgICogICAgY29kZTogNDAwLzQwMSxcbiAgICogICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICogICAgZGV0YWlsZWRNZXNzYWdlOiBkZXRhaWxlZE1lc3NhZ2UsXG4gICAqICAgIGhlbHBVcmw/OiBoZWxwVXJsLFxuICAgKiAgICBtYXhBdHRlbXB0c1JlbWFpbmluZz86IG1heEF0dGVtcHRzUmVtYWluaW5nLFxuICAgKiAgICBsb2dpbldhcm5pbmdzPzogW2xvZ2luV2FybmluZ3NdLFxuICAgKiAgICBwYXNzd29yZFdhcm5pbmdzPzogW3Bhc3N3b3JkV2FybmluZ3NdXG4gICAqICB9XG4gICAqIGBgYFxuICAgKlxuICAgKiA+IENhc28gbyB2YWxvciBhdHJpYnXDrWRvIHBhcmEgYHAtZXhjZWVkZWQtYXR0ZW1wdHMtd2FybmluZ2Agc2VqYSBpZ3VhbCBhIDAoemVybyksIHBvZGVyw6Egc2VyIHBhc3NhZG8gdW0gdmFsb3IgcGFyYSBvXG4gICAqIGF0cmlidXRvIGBwLWJsb2NrZWQtdXJsYCBlIG8gdXN1w6FyaW8gc2Vyw6EgcmVkaXJlY2lvbmFkbyBwYXJhIHVtYSB0ZWxhIGRlIGJsb3F1ZWlvLlxuICAgKlxuICAgKiAqUHJvY2Vzc28gZmluYWxpemFkby4qXG4gICAqXG4gICAqIF9fX19fX19fX19fX19fX1xuICAgKlxuICAgKiAjIyMjIFByYXRpY2lkYWRlXG4gICAqIEFzIGluZm9ybWHDp8O1ZXMgZG8gc2VydmnDp28gZGUgYXV0ZW50aWNhw6fDo28gdGFtYsOpbSBwb2RlbSBzZXIgdHJhbnNtaXRpZGFzIGRpcmV0YW1lbnRlIHBlbGFzIGNvbmZpZ3VyYcOnw6NvcyBkZSByb3RhIGUsIGRlc3RhIG1hbmVpcmEsXG4gICAqIGRpc3BlbnNhLXNlIHF1YWxxdWVyIG1lbsOnw6NvIGUvb3UgaW1wb3J0YcOnw6NvIGRvIGNvbXBvbmVudGUgYHBvLXBhZ2UtbG9naW5gIG5vIHJlc3RhbnRlIGRhIGFwbGljYcOnw6NvLiBPIGV4ZW1wbG8gYWJhaXhvIGV4ZW1wbGlmaWNhXG4gICAqIGEgZm9ybWEgZGluw6JtaWNhIGNvbSBhIHF1YWwgbyB0ZW1wbGF0ZSBkZSB0ZWxhIGRlIGxvZ2luIHBvZGUgc2VyIGdlcmFkbyBhbyBuYXZlZ2FyIHBhcmEgcm90YSBgL2xvZ2luYCwgZSB0YW1iw6ltIGNvbW8gZWxlIHNlIGNvbXVuaWNhXG4gICAqIGNvbSBvIHNlcnZpw6dvIHBhcmEgZWZldHVhw6fDo28gZG8gcHJvY2Vzc28gZGUgYXV0ZW50aWNhw6fDo28gZG8gdXN1w6FyaW8gZSBzb2xpY2l0YcOnw6NvIGRlIG5vdmEgc2VuaGEuXG4gICAqIEJhc3RhIGRlZmluaXIgbmFzIGNvbmZpZ3VyYcOnw7VlcyBkZSByb3RhOlxuICAgKlxuICAgKlxuICAgKiBgYGBcbiAgICogICBpbXBvcnQgeyBQb1BhZ2VMb2dpbkNvbXBvbmVudCwgUG9QYWdlTG9naW5BdGhlbnRpY2F0aW9uVHlwZSB9IGZyb20gJ0Bwby11aS9uZy10ZW1wbGF0ZXMnO1xuICAgKlxuICAgKiAgIC4uLlxuICAgKiAgIGNvbnN0IHJvdXRlczogUm91dGVzID0gW1xuICAgKiAgICAge1xuICAgKiAgICAgICBwYXRoOiAnbG9naW4nLCBjb21wb25lbnQ6IFBvUGFnZUxvZ2luQ29tcG9uZW50LCBkYXRhOiB7XG4gICAqICAgICAgICAgc2VydmljZUFwaTogJ2h0dHBzOi8vcG8tdWkuaW8vc2FtcGxlL2FwaS91c2Vycy9hdXRoZW50aWNhdGlvbicsXG4gICAqICAgICAgICAgZW52aXJvbm1lbnQ6ICdkZXZlbG9wbWVudCcsXG4gICAqICAgICAgICAgcmVjb3Zlcnk6IHtcbiAgICogICAgICAgICAgIHVybDogJ2h0dHBzOi8vcG8tdWkuaW8vc2FtcGxlL2FwaS91c2VycycsXG4gICAqICAgICAgICAgICB0eXBlOiBQb01vZGFsUGFzc3dvcmRSZWNvdmVyeVR5cGUuQWxsLFxuICAgKiAgICAgICAgICAgY29udGFjdE1haWw6ICdkZXYucG9AcG8tdWkuY29tJyxcbiAgICogICAgICAgICAgIHBob25lTWFzazogJzktOTk5LTk5OS05OTk5J1xuICAgKiAgICAgICAgIH0sXG4gICAqICAgICAgICAgcmVnaXN0ZXJVcmw6ICcvbmV3LXBhc3N3b3JkJyxcbiAgICogICAgICAgICBhdXRoZW50aWNhdGlvblR5cGU6IFBvUGFnZUxvZ2luQXRoZW50aWNhdGlvblR5cGUuQmFzaWNcbiAgICogICAgICAgfVxuICAgKiAgICAgfVxuICAgKiAgICAgLi4uXG4gICAqICAgXTtcbiAgICpcbiAgICogICBATmdNb2R1bGUoe1xuICAgKiAgICAgaW1wb3J0czogW1JvdXRlck1vZHVsZS5mb3JSb290KHJvdXRlcyldLFxuICAgKiAgICAgZXhwb3J0czogW1JvdXRlck1vZHVsZV1cbiAgICogICB9KVxuICAgKiAgIGV4cG9ydCBjbGFzcyBBcHBSb3V0aW5nTW9kdWxlIHsgfVxuICAgKiBgYGBcbiAgICpcbiAgICpcbiAgICogTyBtZXRhZGFkbyBgc2VydmljZUFwaWAgZGV2ZSBzZXIgYSAqKnVybCoqIHBhcmEgcmVxdWlzacOnw6NvIGRvcyByZWN1cnNvcyBkZSBhdXRlbnRpY2HDp8OjbywgbyBgZW52aXJvbm1lbnRgIGFsaW1lbnRhIGEgcHJvcHJpZWRhZGVcbiAgICogYHAtZW52aXJvbm1lbnRgLCBgcmVjb3ZlcnlgIMOpIGEgaW50ZXJmYWNlIGBQb1BhZ2VMb2dpblJlY292ZXJ5YCByZXNwb25zw6F2ZWwgcGVsYXMgZXNwZWNpZmljYcOnw7VlcyBjb250aWRhcyBuYSBtb2RhbCBkZSByZWN1cGVyYcOnw6NvIGRlXG4gICAqIHNlbmhhLCBgcmVnaXN0ZXJVcmxgIGFsaW1lbnRhIGEgcHJvcHJpZWRhZGUgYHAtcmVnaXN0ZXItdXJsYCBlIGBhdXRoZW50aWNhdGlvblR5cGVgIHF1ZSBkZWZpbmUgYSBwcm9wcmllZGFkZSBgcC1hdXRoZW50aWNhdGlvbi10eXBlYC5cbiAgICpcbiAgICogPiDDiSBlc3NlbmNpYWwgcXVlIHNpZ2EgYSBub21lbmNsYXR1cmEgZG9zIGF0cmlidXRvcyBleGVtcGxpZmljYWRvcyBhY2ltYSBwYXJhIHN1YSBlZmV0aXZhIGZ1bmNpb25hbGlkYWRlLlxuICAgKlxuICAgKi9cbiAgQElucHV0KCdwLWF1dGhlbnRpY2F0aW9uLXVybCcpIHNldCBhdXRoZW50aWNhdGlvblVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYXV0aGVudGljYXRpb25VcmwgPSBpc1R5cGVvZih2YWx1ZSwgJ3N0cmluZycpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgYXV0aGVudGljYXRpb25VcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Vcmw7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBDYXNvIG8gdmFsb3IgYXRyaWJ1w61kbyBwYXJhIGBwLWV4Y2VlZGVkLWF0dGVtcHRzLXdhcm5pbmdgIHNlamEgaWd1YWwgYSAwKHplcm8pIGUgYSBhcGxpY2HDp8OjbyB0ZW5oYSB1bSBsaW5rIGRlIGJsb3F1ZWlvIGRlIHVzdcOhcmlvLFxuICAgKiBpbmZvcm1lIHVtYSB1cmwgZXh0ZXJuYSBvdSB1bWEgcm90YSB2w6FsaWRhLCBkZXNzYSBmb3JtYSBlbSBjYXNvIGRlIGJsb3F1ZWlvIG8gdXN1w6FyaW8gc2Vyw6EgcmVkaXJlY2lvbmFkby5cbiAgICovXG4gIEBJbnB1dCgncC1ibG9ja2VkLXVybCcpIHNldCBibG9ja2VkVXJsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9ibG9ja2VkVXJsID0gaXNUeXBlb2YodmFsdWUsICdzdHJpbmcnKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0IGJsb2NrZWRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYmxvY2tlZFVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEV4aWJlIHVtIGJvdMOjbyBwYXJhIHN1cG9ydGUuXG4gICAqXG4gICAqIEEgcHJvcHJpZWRhZGUgYWNlaXRhIG9zIHNlZ3VpbnRlcyB0aXBvczpcbiAgICpcbiAgICogLSAqKlN0cmluZyoqOiBVUkwgZXh0ZXJuYSBvdSB1bWEgcm90YSB2w6FsaWRhO1xuICAgKiAtICoqRnVuY3Rpb24qKjogRnVuw6fDo28gYSBzZXIgZGlzcGFyYWRhIGFvIGNsaWNhciBubyBib3TDo28gZGUgc3Vwb3J0ZTtcbiAgICogYGBgXG4gICAqIDxwby1wYWdlLWxvZ2luPlxuICAgKiAgIFtwLXN1cHBvcnRdPVwidGhpcy5teVN1cHBvcnQuYmluZCh0aGlzKVwiPlxuICAgKiA8L3BvLXBhZ2UtbG9naW4+XG4gICAqIGBgYFxuICAgKlxuICAgKi9cbiAgQElucHV0KCdwLXN1cHBvcnQnKSBzZXQgc3VwcG9ydCh2YWx1ZTogc3RyaW5nIHwgRnVuY3Rpb24pIHtcbiAgICB0aGlzLl9zdXBwb3J0ID0gdmFsdWU7XG4gIH1cblxuICBnZXQgc3VwcG9ydCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3VwcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIENvbGXDp8OjbyBkZSBpZGlvbWFzIHF1ZSBvIGNvbXBvbmVudGUgaXLDoSB0cmF0YXIgZSBkaXNwb25pYmlsaXphcsOhIHBhcmEgbyB1c3XDoXJpbyBlc2NvbGhlci5cbiAgICpcbiAgICogQ2FzbyBlc3NhIHByb3ByaWVkYWRlIG7Do28gc2VqYSB1dGlsaXphZGEgbyBjb21wb25lbnRlIG1vc3RyYXLDoSBubyBjb21ibyBvcyBpZGlvbWFzIHF1ZSBlbGUgc3Vwb3J0YSBwb3IgcGFkcsOjby5cbiAgICpcbiAgICogQ2FzbyBhIGNvbGXDp8OjbyB0ZW5oYSB1bSBpZGlvbWEsIGEgcMOhZ2luYSBlc3RhcsOhIG5lc3NlIGlkaW9tYSBlIG7Do28gbW9zdHJhcsOhIG8gY29tYm8uXG4gICAqXG4gICAqIENhc28gc2VqYSBwYXNzYWRvIHVtIGFycmF5IHZhemlvLCBhIHDDoWdpbmEgdGVyw6EgbyBpZGlvbWEgY29uZmlndXJhZG8gbm8gYGkxOG5gIGUgbsOjbyBtb3N0cmFyw6EgbyBjb21ibyBkZSBzZWxlw6fDo28uXG4gICAqXG4gICAqID4gU2UgZm9yIHBhc3NhZG8gdW0gaWRpb21hIG7Do28gc3Vwb3J0YWRvLCBzZXLDoSBwcmVjaXNvIHBhc3NhciBhcyBsaXRlcmFpcyBwZWxhIHByb3ByaWVkYWRlIGBwLWxpdGVyYWxzYC5cbiAgICpcbiAgICpcbiAgICovXG4gIEBJbnB1dCgncC1sYW5ndWFnZXMnKSBzZXQgbGFuZ3VhZ2VzTGlzdChsYW5ndWFnZXNMaXN0OiBBcnJheTxQb0xhbmd1YWdlPikge1xuICAgIGlmIChsYW5ndWFnZXNMaXN0KSB7XG4gICAgICBpZiAobGFuZ3VhZ2VzTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VzTGlzdCA9IGxhbmd1YWdlc0xpc3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sYW5ndWFnZXNMaXN0ID0gcG9MYW5ndWFnZURlZmF1bHQuZmlsdGVyKGxhbmd1YWdlID0+IGxhbmd1YWdlLmxhbmd1YWdlID09PSB0aGlzLmxhbmd1YWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgbGFuZ3VhZ2VzTGlzdCgpOiBBcnJheTxQb0xhbmd1YWdlPiB7XG4gICAgaWYgKHRoaXMuX2xhbmd1YWdlc0xpc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZXNMaXN0O1xuICAgIH1cbiAgICByZXR1cm4gcG9MYW5ndWFnZURlZmF1bHQ7XG4gIH1cblxuICBnZXQgc2hvd0xhbmd1YWdlKCkge1xuICAgIHJldHVybiB0aGlzLmxhbmd1YWdlc0xpc3QubGVuZ3RoID4gMTtcbiAgfVxuXG4gIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgfHwgZ2V0U2hvcnRCcm93c2VyTGFuZ3VhZ2UoKTtcbiAgfVxuXG4gIGdldCBwYWdlTG9naW5MaXRlcmFscygpOiBQb1BhZ2VMb2dpbkxpdGVyYWxzIHtcbiAgICBjb25zdCBsb2dpbkhpbnRXaXRoQ29udGFjdEVtYWlsID0gdGhpcy5jb250YWN0RW1haWxcbiAgICAgID8gdGhpcy5jb25jYXRlbmF0ZUxvZ2luSGludFdpdGhDb250YWN0RW1haWwodGhpcy5jb250YWN0RW1haWwpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5wb1BhZ2VMb2dpbkxpdGVyYWxzRGVmYXVsdFtwb0xvY2FsZURlZmF1bHRdLFxuICAgICAgLi4ucG9QYWdlTG9naW5MaXRlcmFsc0RlZmF1bHRbdGhpcy5sYW5ndWFnZV0sXG4gICAgICAuLi5sb2dpbkhpbnRXaXRoQ29udGFjdEVtYWlsLFxuICAgICAgLi4udGhpcy5saXRlcmFsc1xuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGxvZ2luU2VydmljZTogUG9QYWdlTG9naW5TZXJ2aWNlLFxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcbiAgICBwdWJsaWMgcG9MYW5ndWFnZVNlcnZpY2U6IFBvTGFuZ3VhZ2VTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IHRoaXMucG9MYW5ndWFnZVNlcnZpY2UuZ2V0U2hvcnRMYW5ndWFnZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMubG9naW5TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubG9naW5TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZVBvcG92ZXIoKSB7XG4gICAgdGhpcy5zaG93RXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPSBmYWxzZTtcbiAgfVxuXG4gIG9uTG9naW5TdWJtaXQoKTogdm9pZCB7XG4gICAgY29uc3QgbG9naW5Gb3JtOiBQb1BhZ2VMb2dpbiA9IHtcbiAgICAgIGxvZ2luOiB0aGlzLmxvZ2luLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMucGFzc3dvcmQsXG4gICAgICByZW1lbWJlclVzZXI6IHRoaXMucmVtZW1iZXJVc2VyXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmN1c3RvbUZpZWxkKSB7XG4gICAgICBsb2dpbkZvcm1bdGhpcy5jdXN0b21GaWVsZE9iamVjdC5wcm9wZXJ0eV0gPSB0aGlzLmN1c3RvbUZpZWxkT2JqZWN0LnZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmF1dGhlbnRpY2F0aW9uVXJsKSB7XG4gICAgICB0aGlzLmxvZ2luU3Vic2NyaXB0aW9uID0gdGhpcy5sb2dpblNlcnZpY2VcbiAgICAgICAgLm9uTG9naW4odGhpcy5hdXRoZW50aWNhdGlvblVybCwgdGhpcy5hdXRoZW50aWNhdGlvblR5cGUsIGxvZ2luRm9ybSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVzVG9Qcm9wZXJ0aWVzKCk7XG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdQT19VU0VSX0xPR0lOJywgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgICAgICAgdGhpcy5vcGVuSW50ZXJuYWxMaW5rKCcvJyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IuZXJyb3IuY29kZSA9PT0gJzQwMCcgfHwgZXJyb3IuZXJyb3IuY29kZSA9PT0gJzQwMScpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZXNUb1Byb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0QmxvY2tlZFVybCh0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nLCB0aGlzLmJsb2NrZWRVcmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2dpblN1Ym1pdC5lbWl0KGxvZ2luRm9ybSk7XG4gICAgICB0aGlzLnNob3dFeGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IHRoaXMuZXhjZWVkZWRBdHRlbXB0c1dhcm5pbmcgPiAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdEN1c3RvbUZpZWxkT2JqZWN0KHByb3BlcnR5KTogUG9QYWdlTG9naW5DdXN0b21GaWVsZCB7XG4gICAgcmV0dXJuIHsgcHJvcGVydHkgfTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkV4dGVybmFsTGluayh1cmw6IHN0cmluZykge1xuICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuSW50ZXJuYWxMaW5rKHVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybF0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWRpcmVjdEJsb2NrZWRVcmwoYXR0ZW1wdHM6IG51bWJlciwgYmxvY2tlZFVybDogc3RyaW5nKSB7XG4gICAgaWYgKGF0dGVtcHRzID09PSAwICYmIGJsb2NrZWRVcmwpIHtcbiAgICAgIHRoaXMuc2hvd0V4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gZmFsc2U7XG4gICAgICBpc0V4dGVybmFsTGluayhibG9ja2VkVXJsKSA/IHRoaXMub3BlbkV4dGVybmFsTGluayhibG9ja2VkVXJsKSA6IHRoaXMub3BlbkludGVybmFsTGluayhibG9ja2VkVXJsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFZhbHVlc1RvUHJvcGVydGllcyhyZXN1bHQ/KSB7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgdGhpcy5leGNlZWRlZEF0dGVtcHRzV2FybmluZyA9IHJlc3VsdC5lcnJvci5tYXhBdHRlbXB0c1JlbWFpbmluZztcbiAgICAgIHRoaXMubG9naW5FcnJvcnMgPSByZXN1bHQuZXJyb3IubG9naW5XYXJuaW5ncztcbiAgICAgIHRoaXMucGFzc3dvcmRFcnJvcnMgPSByZXN1bHQuZXJyb3IucGFzc3dvcmRXYXJuaW5ncztcbiAgICAgIHRoaXMuYmxvY2tlZFVybCA9IHJlc3VsdC5lcnJvci5ibG9ja2VkVXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4Y2VlZGVkQXR0ZW1wdHNXYXJuaW5nID0gMDtcbiAgICAgIHRoaXMubG9naW5FcnJvcnMgPSBbXTtcbiAgICAgIHRoaXMucGFzc3dvcmRFcnJvcnMgPSBbXTtcbiAgICAgIHRoaXMuYmxvY2tlZFVybCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjb25jYXRlbmF0ZUxvZ2luSGludFdpdGhDb250YWN0RW1haWwoY29udGFjdEVtYWlsOiBzdHJpbmcpO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRMb2dpbkVycm9ycyh2YWx1ZTogQXJyYXk8c3RyaW5nPik6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNldFBhc3N3b3JkRXJyb3JzKHZhbHVlOiBBcnJheTxzdHJpbmc+KTogdm9pZDtcbn1cbiJdfQ==