@cleavelandprice/ngx-lib 3.14.6 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/README.md +5 -5
  2. package/active-directory/{public_api.d.ts → active-directory.api.d.ts} +2 -4
  3. package/active-directory/active-directory.module.d.ts +2 -2
  4. package/active-directory/index.d.ts +1 -1
  5. package/active-directory/{gui → material}/components/user-chooser/user-chooser.component.d.ts +11 -31
  6. package/active-directory/{gui → material}/components/user-form-field/user-form-field.component.d.ts +5 -8
  7. package/active-directory/{gui → material}/index.d.ts +2 -2
  8. package/active-directory/{gui/public_api.d.ts → material/mat-active-directory.api.d.ts} +1 -1
  9. package/active-directory/material/mat-active-directory.module.d.ts +25 -0
  10. package/active-directory/model/active-directory-service-options.d.ts +7 -0
  11. package/active-directory/services/active-directory.service.d.ts +7 -7
  12. package/authentication/{public_api.d.ts → authentication.api.d.ts} +1 -1
  13. package/authentication/authentication.base.module.d.ts +5 -1
  14. package/authentication/index.d.ts +1 -1
  15. package/authentication/{token/gui → material}/components/login/login.component.d.ts +6 -4
  16. package/authentication/{token/gui → material}/components/login-form/login-form.component.d.ts +9 -10
  17. package/authentication/material/index.d.ts +5 -0
  18. package/authentication/material/mat-authentication.api.d.ts +6 -0
  19. package/authentication/material/mat-authentication.module.d.ts +21 -0
  20. package/authentication/material/model/mat-authentication-service-options.d.ts +6 -0
  21. package/authentication/material/services/mat-authentication.service.d.ts +11 -0
  22. package/authentication/model/abstract-authentication-service.d.ts +4 -4
  23. package/authentication/model/authentication-service-options.d.ts +8 -0
  24. package/authentication/object/authentication-object.api.d.ts +2 -0
  25. package/authentication/object/authentication-object.module.d.ts +11 -0
  26. package/authentication/object/index.d.ts +1 -1
  27. package/authentication/object/services/authentication-object.service.d.ts +23 -0
  28. package/authentication/token/authentication-token.api.d.ts +4 -0
  29. package/authentication/token/authetiction-token.module.d.ts +11 -0
  30. package/authentication/token/index.d.ts +1 -1
  31. package/authentication/token/model/authentication-token-service-options.d.ts +6 -0
  32. package/authentication/token/services/authentication-token.service.d.ts +23 -0
  33. package/dialog/components/base/base.component.d.ts +3 -3
  34. package/dialog/components/choice/choice.component.d.ts +5 -3
  35. package/dialog/components/confirmation/confirmation.component.d.ts +5 -3
  36. package/dialog/components/input/input.component.d.ts +5 -3
  37. package/dialog/components/message/message.component.d.ts +5 -3
  38. package/dialog/dialog.module.d.ts +13 -13
  39. package/dialog/index.d.ts +1 -1
  40. package/esm2022/active-directory/active-directory.api.mjs +12 -0
  41. package/esm2022/active-directory/active-directory.module.mjs +11 -10
  42. package/esm2022/active-directory/cleavelandprice-ngx-lib-active-directory.mjs +2 -2
  43. package/esm2022/active-directory/material/cleavelandprice-ngx-lib-active-directory-material.mjs +5 -0
  44. package/esm2022/active-directory/material/components/user-chooser/user-chooser.component.mjs +406 -0
  45. package/esm2022/active-directory/material/components/user-form-field/user-form-field.component.mjs +136 -0
  46. package/esm2022/active-directory/material/mat-active-directory.api.mjs +9 -0
  47. package/esm2022/active-directory/material/mat-active-directory.module.mjs +100 -0
  48. package/esm2022/active-directory/material/model/selectable-group.mjs +2 -0
  49. package/esm2022/active-directory/material/model/selectable-user.mjs +2 -0
  50. package/esm2022/active-directory/material/model/user-chooser-data.mjs +33 -0
  51. package/esm2022/active-directory/material/model/user-chooser-filter-options.mjs +10 -0
  52. package/esm2022/active-directory/{gui → material}/model/user-chooser-mode.mjs +1 -1
  53. package/esm2022/active-directory/material/model/user-chooser-pre-processing-group.mjs +9 -0
  54. package/esm2022/active-directory/model/active-directory-service-options.mjs +3 -0
  55. package/esm2022/active-directory/services/active-directory.service.mjs +61 -41
  56. package/esm2022/authentication/authentication.api.mjs +6 -0
  57. package/esm2022/authentication/authentication.base.module.mjs +28 -7
  58. package/esm2022/authentication/cleavelandprice-ngx-lib-authentication.mjs +2 -2
  59. package/esm2022/authentication/material/cleavelandprice-ngx-lib-authentication-material.mjs +5 -0
  60. package/esm2022/authentication/material/components/login/login.component.mjs +49 -0
  61. package/esm2022/authentication/material/components/login-form/login-form.component.mjs +82 -0
  62. package/esm2022/authentication/material/mat-authentication.api.mjs +7 -0
  63. package/esm2022/authentication/material/mat-authentication.module.mjs +84 -0
  64. package/esm2022/authentication/material/model/login-form-data.mjs +2 -0
  65. package/esm2022/authentication/material/model/mat-authentication-service-options.mjs +3 -0
  66. package/esm2022/authentication/material/services/mat-authentication.service.mjs +67 -0
  67. package/esm2022/authentication/model/abstract-authentication-service.mjs +1 -1
  68. package/esm2022/authentication/model/authentication-service-options.mjs +3 -0
  69. package/esm2022/authentication/object/authentication-object.api.mjs +4 -0
  70. package/esm2022/authentication/object/authentication-object.module.mjs +40 -0
  71. package/esm2022/authentication/object/cleavelandprice-ngx-lib-authentication-object.mjs +2 -2
  72. package/esm2022/authentication/object/services/authentication-object.service.mjs +119 -0
  73. package/esm2022/authentication/token/authentication-token.api.mjs +5 -0
  74. package/esm2022/authentication/token/authetiction-token.module.mjs +40 -0
  75. package/esm2022/authentication/token/cleavelandprice-ngx-lib-authentication-token.mjs +2 -2
  76. package/esm2022/authentication/token/model/authentication-token-service-options.mjs +3 -0
  77. package/esm2022/authentication/token/services/authentication-token.service.mjs +128 -0
  78. package/esm2022/dialog/cleavelandprice-ngx-lib-dialog.mjs +2 -2
  79. package/esm2022/dialog/components/base/base.component.mjs +27 -16
  80. package/esm2022/dialog/components/choice/choice.component.mjs +11 -11
  81. package/esm2022/dialog/components/confirmation/confirmation.component.mjs +11 -11
  82. package/esm2022/dialog/components/input/input.component.mjs +11 -11
  83. package/esm2022/dialog/components/message/message.component.mjs +11 -11
  84. package/esm2022/dialog/dialog.api.mjs +20 -0
  85. package/esm2022/dialog/dialog.module.mjs +25 -20
  86. package/esm2022/lib/model/caching-config.mjs +2 -0
  87. package/esm2022/lib/model/credentials.mjs +2 -0
  88. package/esm2022/lib/model/logging-config.mjs +2 -0
  89. package/esm2022/lib/model/service-options.mjs +3 -0
  90. package/esm2022/lib/ngx-lib.module.mjs +11 -10
  91. package/esm2022/lib/services/app-path-config.service.mjs +31 -24
  92. package/esm2022/lib/services/service-base.mjs +26 -0
  93. package/esm2022/msgraph/cleavelandprice-ngx-lib-msgraph.mjs +2 -2
  94. package/esm2022/msgraph/msgraph.api.mjs +19 -0
  95. package/esm2022/msgraph/msgraph.module.mjs +6 -11
  96. package/esm2022/public_api.mjs +6 -2
  97. package/esm2022/quill/cleavelandprice-ngx-lib-quill.mjs +2 -2
  98. package/esm2022/quill/components/editor/editor.component.mjs +29 -39
  99. package/esm2022/quill/components/raw/raw.component.mjs +18 -11
  100. package/esm2022/quill/mention/cleavelandprice-ngx-lib-quill-mention.mjs +2 -2
  101. package/esm2022/quill/mention/components/editor/editor.component.mjs +20 -14
  102. package/esm2022/quill/mention/quill-mention.api.mjs +8 -0
  103. package/esm2022/quill/mention/quill-mention.module.mjs +12 -12
  104. package/esm2022/quill/quill.api.mjs +9 -0
  105. package/esm2022/quill/quill.module.mjs +17 -20
  106. package/esm2022/sharepoint/cleavelandprice-ngx-lib-sharepoint.mjs +2 -2
  107. package/esm2022/sharepoint/components/user-photo/user-photo.component.mjs +13 -9
  108. package/esm2022/sharepoint/model/sharepoint-service-options.mjs +3 -0
  109. package/esm2022/sharepoint/pipes/user-photo-url.pipe.mjs +8 -9
  110. package/esm2022/sharepoint/services/sharepoint.service.mjs +74 -65
  111. package/esm2022/sharepoint/sharepoint.api.mjs +17 -0
  112. package/esm2022/sharepoint/sharepoint.module.mjs +16 -15
  113. package/esm2022/table/cleavelandprice-ngx-lib-table.mjs +2 -2
  114. package/esm2022/table/components/table/table.component.mjs +76 -74
  115. package/esm2022/table/table.api.mjs +4 -0
  116. package/esm2022/table/table.module.mjs +16 -15
  117. package/esm2022/upload/cleavelandprice-ngx-lib-upload.mjs +2 -2
  118. package/esm2022/upload/components/upload/upload.component.mjs +16 -20
  119. package/esm2022/upload/components/upload-dialog/upload-dialog.component.mjs +49 -39
  120. package/esm2022/upload/model/upload-service-options.mjs +4 -0
  121. package/esm2022/upload/model/upload-status.mjs +2 -0
  122. package/esm2022/upload/services/upload.service.mjs +44 -29
  123. package/esm2022/upload/upload.api.mjs +9 -0
  124. package/esm2022/upload/upload.module.mjs +24 -20
  125. package/esm2022/url-utilities/cleavelandprice-ngx-lib-url-utilities.mjs +2 -2
  126. package/esm2022/url-utilities/pipes/safe-resource-url.pipe.mjs +8 -9
  127. package/esm2022/url-utilities/pipes/safe-url.pipe.mjs +8 -9
  128. package/esm2022/url-utilities/pipes/uri-scheme.pipe.mjs +9 -8
  129. package/esm2022/url-utilities/url-utilities.api.mjs +13 -0
  130. package/esm2022/url-utilities/url-utilities.module.mjs +11 -11
  131. package/fesm2022/cleavelandprice-ngx-lib-active-directory-material.mjs +674 -0
  132. package/fesm2022/cleavelandprice-ngx-lib-active-directory-material.mjs.map +1 -0
  133. package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs +70 -72
  134. package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs.map +1 -1
  135. package/fesm2022/cleavelandprice-ngx-lib-authentication-material.mjs +268 -0
  136. package/fesm2022/cleavelandprice-ngx-lib-authentication-material.mjs.map +1 -0
  137. package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs +54 -49
  138. package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs.map +1 -1
  139. package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs +50 -51
  140. package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs.map +1 -1
  141. package/fesm2022/cleavelandprice-ngx-lib-authentication.mjs +28 -18
  142. package/fesm2022/cleavelandprice-ngx-lib-authentication.mjs.map +1 -1
  143. package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs +87 -66
  144. package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs.map +1 -1
  145. package/fesm2022/cleavelandprice-ngx-lib-msgraph.mjs +5 -10
  146. package/fesm2022/cleavelandprice-ngx-lib-msgraph.mjs.map +1 -1
  147. package/fesm2022/cleavelandprice-ngx-lib-quill-mention.mjs +29 -26
  148. package/fesm2022/cleavelandprice-ngx-lib-quill-mention.mjs.map +1 -1
  149. package/fesm2022/cleavelandprice-ngx-lib-quill.mjs +58 -69
  150. package/fesm2022/cleavelandprice-ngx-lib-quill.mjs.map +1 -1
  151. package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs +106 -118
  152. package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs.map +1 -1
  153. package/fesm2022/cleavelandprice-ngx-lib-table.mjs +85 -90
  154. package/fesm2022/cleavelandprice-ngx-lib-table.mjs.map +1 -1
  155. package/fesm2022/cleavelandprice-ngx-lib-upload.mjs +125 -117
  156. package/fesm2022/cleavelandprice-ngx-lib-upload.mjs.map +1 -1
  157. package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs +38 -33
  158. package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs.map +1 -1
  159. package/fesm2022/cleavelandprice-ngx-lib.mjs +57 -45
  160. package/fesm2022/cleavelandprice-ngx-lib.mjs.map +1 -1
  161. package/lib/model/caching-config.d.ts +4 -0
  162. package/lib/model/credentials.d.ts +4 -0
  163. package/lib/model/logging-config.d.ts +6 -0
  164. package/lib/model/service-options.d.ts +6 -0
  165. package/lib/ngx-lib.module.d.ts +2 -2
  166. package/lib/services/app-path-config.service.d.ts +5 -4
  167. package/lib/services/service-base.d.ts +7 -0
  168. package/msgraph/index.d.ts +1 -1
  169. package/msgraph/msgraph.module.d.ts +0 -2
  170. package/package.json +27 -27
  171. package/public_api.d.ts +5 -1
  172. package/quill/components/editor/editor.component.d.ts +10 -10
  173. package/quill/components/raw/raw.component.d.ts +1 -1
  174. package/quill/index.d.ts +1 -1
  175. package/quill/mention/components/editor/editor.component.d.ts +3 -3
  176. package/quill/mention/index.d.ts +1 -1
  177. package/quill/mention/quill-mention.module.d.ts +9 -9
  178. package/quill/quill.module.d.ts +12 -14
  179. package/sharepoint/components/user-photo/user-photo.component.d.ts +2 -2
  180. package/sharepoint/index.d.ts +1 -1
  181. package/sharepoint/model/sharepoint-service-options.d.ts +19 -0
  182. package/sharepoint/pipes/user-photo-url.pipe.d.ts +2 -2
  183. package/sharepoint/services/sharepoint.service.d.ts +7 -10
  184. package/sharepoint/{public_api.d.ts → sharepoint.api.d.ts} +1 -1
  185. package/sharepoint/sharepoint.module.d.ts +6 -6
  186. package/table/components/table/table.component.d.ts +21 -22
  187. package/table/index.d.ts +1 -1
  188. package/table/table.module.d.ts +13 -13
  189. package/upload/components/upload/upload.component.d.ts +4 -8
  190. package/upload/components/upload-dialog/upload-dialog.component.d.ts +11 -9
  191. package/upload/index.d.ts +1 -1
  192. package/upload/model/upload-service-options.d.ts +16 -0
  193. package/upload/model/upload-status.d.ts +6 -0
  194. package/upload/services/upload.service.d.ts +9 -6
  195. package/upload/{public_api.d.ts → upload.api.d.ts} +2 -2
  196. package/upload/upload.module.d.ts +10 -10
  197. package/url-utilities/index.d.ts +1 -1
  198. package/url-utilities/pipes/safe-resource-url.pipe.d.ts +2 -2
  199. package/url-utilities/pipes/safe-url.pipe.d.ts +2 -2
  200. package/url-utilities/pipes/uri-scheme.pipe.d.ts +2 -3
  201. package/url-utilities/url-utilities.api.d.ts +8 -0
  202. package/url-utilities/url-utilities.module.d.ts +5 -5
  203. package/active-directory/gui/gui.module.d.ts +0 -25
  204. package/active-directory/model/caching-config.d.ts +0 -4
  205. package/active-directory/model/logging-config.d.ts +0 -6
  206. package/active-directory/model/service-config.d.ts +0 -8
  207. package/authentication/model/service-config.d.ts +0 -8
  208. package/authentication/object/model/service-config.d.ts +0 -4
  209. package/authentication/object/object.module.d.ts +0 -11
  210. package/authentication/object/public_api.d.ts +0 -3
  211. package/authentication/object/services/authentication.service.d.ts +0 -23
  212. package/authentication/token/gui/index.d.ts +0 -5
  213. package/authentication/token/gui/model/service-config.d.ts +0 -5
  214. package/authentication/token/gui/public_api.d.ts +0 -6
  215. package/authentication/token/gui/services/authentication.service.d.ts +0 -12
  216. package/authentication/token/gui/token-gui.module.d.ts +0 -21
  217. package/authentication/token/model/service-config.d.ts +0 -5
  218. package/authentication/token/public_api.d.ts +0 -4
  219. package/authentication/token/services/authentication.service.d.ts +0 -23
  220. package/authentication/token/token.module.d.ts +0 -11
  221. package/esm2022/active-directory/gui/cleavelandprice-ngx-lib-active-directory-gui.mjs +0 -5
  222. package/esm2022/active-directory/gui/components/user-chooser/user-chooser.component.mjs +0 -393
  223. package/esm2022/active-directory/gui/components/user-form-field/user-form-field.component.mjs +0 -132
  224. package/esm2022/active-directory/gui/gui.module.mjs +0 -96
  225. package/esm2022/active-directory/gui/model/selectable-group.mjs +0 -2
  226. package/esm2022/active-directory/gui/model/selectable-user.mjs +0 -2
  227. package/esm2022/active-directory/gui/model/user-chooser-data.mjs +0 -33
  228. package/esm2022/active-directory/gui/model/user-chooser-filter-options.mjs +0 -10
  229. package/esm2022/active-directory/gui/model/user-chooser-pre-processing-group.mjs +0 -9
  230. package/esm2022/active-directory/gui/public_api.mjs +0 -9
  231. package/esm2022/active-directory/model/caching-config.mjs +0 -7
  232. package/esm2022/active-directory/model/logging-config.mjs +0 -9
  233. package/esm2022/active-directory/model/service-config.mjs +0 -12
  234. package/esm2022/active-directory/public_api.mjs +0 -12
  235. package/esm2022/authentication/model/service-config.mjs +0 -12
  236. package/esm2022/authentication/object/model/service-config.mjs +0 -9
  237. package/esm2022/authentication/object/object.module.mjs +0 -39
  238. package/esm2022/authentication/object/public_api.mjs +0 -4
  239. package/esm2022/authentication/object/services/authentication.service.mjs +0 -110
  240. package/esm2022/authentication/public_api.mjs +0 -6
  241. package/esm2022/authentication/token/gui/cleavelandprice-ngx-lib-authentication-token-gui.mjs +0 -5
  242. package/esm2022/authentication/token/gui/components/login/login.component.mjs +0 -43
  243. package/esm2022/authentication/token/gui/components/login-form/login-form.component.mjs +0 -72
  244. package/esm2022/authentication/token/gui/model/login-form-data.mjs +0 -2
  245. package/esm2022/authentication/token/gui/model/service-config.mjs +0 -10
  246. package/esm2022/authentication/token/gui/public_api.mjs +0 -7
  247. package/esm2022/authentication/token/gui/services/authentication.service.mjs +0 -78
  248. package/esm2022/authentication/token/gui/token-gui.module.mjs +0 -81
  249. package/esm2022/authentication/token/model/service-config.mjs +0 -10
  250. package/esm2022/authentication/token/public_api.mjs +0 -5
  251. package/esm2022/authentication/token/services/authentication.service.mjs +0 -124
  252. package/esm2022/authentication/token/token.module.mjs +0 -39
  253. package/esm2022/dialog/public_api.mjs +0 -10
  254. package/esm2022/lib/model/service-config.mjs +0 -21
  255. package/esm2022/msgraph/public_api.mjs +0 -19
  256. package/esm2022/quill/mention/public_api.mjs +0 -8
  257. package/esm2022/quill/public_api.mjs +0 -9
  258. package/esm2022/sharepoint/model/service-config.mjs +0 -27
  259. package/esm2022/sharepoint/public_api.mjs +0 -17
  260. package/esm2022/table/public_api.mjs +0 -4
  261. package/esm2022/upload/model/service-config.mjs +0 -16
  262. package/esm2022/upload/public_api.mjs +0 -9
  263. package/esm2022/url-utilities/public_api.mjs +0 -5
  264. package/fesm2022/cleavelandprice-ngx-lib-active-directory-gui.mjs +0 -660
  265. package/fesm2022/cleavelandprice-ngx-lib-active-directory-gui.mjs.map +0 -1
  266. package/fesm2022/cleavelandprice-ngx-lib-authentication-token-gui.mjs +0 -271
  267. package/fesm2022/cleavelandprice-ngx-lib-authentication-token-gui.mjs.map +0 -1
  268. package/lib/model/service-config.d.ts +0 -6
  269. package/sharepoint/model/service-config.d.ts +0 -23
  270. package/upload/model/service-config.d.ts +0 -15
  271. package/url-utilities/public_api.d.ts +0 -4
  272. /package/active-directory/{gui → material}/model/selectable-group.d.ts +0 -0
  273. /package/active-directory/{gui → material}/model/selectable-user.d.ts +0 -0
  274. /package/active-directory/{gui → material}/model/user-chooser-data.d.ts +0 -0
  275. /package/active-directory/{gui → material}/model/user-chooser-filter-options.d.ts +0 -0
  276. /package/active-directory/{gui → material}/model/user-chooser-mode.d.ts +0 -0
  277. /package/active-directory/{gui → material}/model/user-chooser-pre-processing-group.d.ts +0 -0
  278. /package/authentication/{token/gui → material}/model/login-form-data.d.ts +0 -0
  279. /package/dialog/{public_api.d.ts → dialog.api.d.ts} +0 -0
  280. /package/msgraph/{public_api.d.ts → msgraph.api.d.ts} +0 -0
  281. /package/quill/mention/{public_api.d.ts → quill-mention.api.d.ts} +0 -0
  282. /package/quill/{public_api.d.ts → quill.api.d.ts} +0 -0
  283. /package/table/{public_api.d.ts → table.api.d.ts} +0 -0
@@ -0,0 +1,406 @@
1
+ import { Component, inject, ViewChild, viewChild } from '@angular/core';
2
+ import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
3
+ import { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef } from '@angular/material/dialog';
4
+ import { MatListOption, MatSelectionList } from '@angular/material/list';
5
+ import { MatTableDataSource } from '@angular/material/table';
6
+ import { debounceTime, forkJoin, of } from 'rxjs';
7
+ import { ActiveDirectoryService } from '@cleavelandprice/ngx-lib/active-directory';
8
+ import { SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';
9
+ import { MatButton, MatIconButton } from '@angular/material/button';
10
+ import { MatFormField } from '@angular/material/form-field';
11
+ import { MatIcon } from '@angular/material/icon';
12
+ import { MatInput } from '@angular/material/input';
13
+ import { MatProgressSpinner } from '@angular/material/progress-spinner';
14
+ import { MatSlideToggle } from '@angular/material/slide-toggle';
15
+ import { MatTooltip } from '@angular/material/tooltip';
16
+ import { UserChooserData } from '../../model/user-chooser-data';
17
+ import { UserChooserMode } from '../../model/user-chooser-mode';
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "@angular/forms";
20
+ export class UserChooserComponent {
21
+ constructor() {
22
+ this.#services = {
23
+ dialogRef: inject((MatDialogRef)),
24
+ activeDirectory: inject(ActiveDirectoryService),
25
+ sharePoint: inject(SharePointService),
26
+ data: inject(MAT_DIALOG_DATA)
27
+ };
28
+ this._data = { ...new UserChooserData(), ...this.#services.data };
29
+ //#region Fields
30
+ //@ViewChild(MatSelectionList) selectionList?: MatSelectionList;
31
+ this.selectionList = viewChild(MatSelectionList);
32
+ //filterInput = viewChild<ElementRef>('filterInput');
33
+ this.filterForm = new FormGroup({
34
+ filter: new FormControl()
35
+ });
36
+ }
37
+ #services;
38
+ set filterInput(elRef) {
39
+ if (elRef) {
40
+ elRef.nativeElement.focus();
41
+ }
42
+ }
43
+ ;
44
+ //#endregion
45
+ //#region Properties
46
+ get isMultiMode() {
47
+ return this._data.mode === UserChooserMode.Multiple;
48
+ }
49
+ get selectedOptions() {
50
+ return this.selectionList()?.options.filter(o => o.selected) ?? [];
51
+ }
52
+ get selectedUsers() {
53
+ return this.dataSource?.data?.filter(d => d.selected) ?? [];
54
+ }
55
+ get filterValue() {
56
+ return this.filterForm.value.filter;
57
+ }
58
+ get adGroupsNeeded() {
59
+ // If any are these are true, then we need to pull AD groups for use later
60
+ return this._data.showGroupMembershipTooltips ||
61
+ this._data.exclusions.groups.length > 0 ||
62
+ this._data.inclusions.groups.length > 0 ||
63
+ this._data.preSelections.groups.length > 0 ||
64
+ this._data.filterOptions.groupMembership ||
65
+ (this._data.selectableGroupNames?.length ?? 0) > 0; // debug
66
+ }
67
+ //#endregion
68
+ //#region Lifecycle
69
+ ngOnInit() {
70
+ this.#getData();
71
+ this.#listenForFilterChanges();
72
+ }
73
+ //#endregion
74
+ //#region Events
75
+ listSelectionChanged(options) {
76
+ if (this._data.mode === UserChooserMode.Single &&
77
+ this.selectedOptions.length &&
78
+ this._data.closeWhenSelectionMade) {
79
+ this.close();
80
+ }
81
+ }
82
+ optionSelectionChanged(option) {
83
+ const user = this.dataSource?.data
84
+ .find(u => u.sAMAccountName.toLocaleLowerCase() === option.value.sAMAccountName.toLowerCase());
85
+ if (user) {
86
+ user.selected = option.selected;
87
+ }
88
+ }
89
+ hideUnselectedChanged(selected) {
90
+ this.filterForm.get('filter')?.setValue(selected ? '{selected:true}' : null);
91
+ }
92
+ selectAll() {
93
+ this.selectionList()?.selectAll();
94
+ if (this.selectionList()?.options) {
95
+ this.listSelectionChanged(this.selectionList().options.toArray());
96
+ }
97
+ }
98
+ deselectAll() {
99
+ this.selectionList()?.deselectAll();
100
+ }
101
+ //#endregion
102
+ //#region Utilities
103
+ isUser(userOrGroup) {
104
+ return 'title' in userOrGroup;
105
+ }
106
+ castUser(userOrGroup) {
107
+ return userOrGroup;
108
+ }
109
+ #getData() {
110
+ const dataObservables = [
111
+ this._data.users ?
112
+ // Users were passed in
113
+ of(this._data.users) :
114
+ // Users need to be retrieved
115
+ this.#services.activeDirectory.getUsers(false, this._data.includeDisabledUsers, this._data.parentOu),
116
+ this._data.photos ?
117
+ // Photos were passed in
118
+ of(this._data.photos) :
119
+ // Photos need to be retrieved
120
+ this.#services.sharePoint.getPhotos()
121
+ ];
122
+ // Do we need AD groups?
123
+ if (this.adGroupsNeeded) {
124
+ this._data.groups ?
125
+ // Groups were passed in
126
+ of(this._data.groups) :
127
+ // Groups need to be retrieved
128
+ dataObservables.push(this.#services.activeDirectory.getGroups());
129
+ }
130
+ forkJoin(dataObservables)
131
+ //.subscribe(([users, photos]) => {
132
+ .subscribe(data => {
133
+ // Need groups in place before we handle exclusions/inclusions/pre-selections
134
+ this.groups = this.adGroupsNeeded ? data[2] : null;
135
+ let users = data[0];
136
+ users.forEach(u => u.selected = false); // In case existing data was re-used
137
+ users = this.#includeUsersByAccountName(users);
138
+ users = this.#includeUsersByGroupName(users);
139
+ users = this.#includeUsersByDepartment(users);
140
+ users = this.#includeUsersByTitle(users);
141
+ users = this.#excludeUsersByAccountName(users);
142
+ users = this.#excludeUsersByGroupName(users);
143
+ users = this.#excludeUsersByDepartment(users);
144
+ users = this.#excludeUsersByTitle(users);
145
+ users = this.#preSelectUsersByAccountName(users);
146
+ users = this.#preSelectUsersByGroupName(users);
147
+ users = this.#preSelectUsersByDepartment(users);
148
+ users = this.#preSelectUsersByTitle(users);
149
+ // debug
150
+ const usersAndGroups = [
151
+ ...users
152
+ ];
153
+ if (this._data.selectableGroupNames?.length) {
154
+ this._data.selectableGroupNames
155
+ .forEach(groupName => {
156
+ const group = this.groups.find(g => g.displayName === groupName);
157
+ if (group) {
158
+ usersAndGroups.push({
159
+ ...group,
160
+ selected: false
161
+ });
162
+ }
163
+ });
164
+ }
165
+ this.dataSource = new MatTableDataSource(usersAndGroups);
166
+ this.photos = data[1];
167
+ this.#setFilterPredicate();
168
+ });
169
+ }
170
+ close() {
171
+ if (!this.selectedUsers) {
172
+ this.#services.dialogRef.close();
173
+ return;
174
+ }
175
+ const value = this.selectedUsers
176
+ .map(u => this._data.returnUserObjects ? u : u.sAMAccountName);
177
+ this.#services.dialogRef.close(this._data.mode === UserChooserMode.Multiple ?
178
+ value :
179
+ value[0]);
180
+ }
181
+ getPhoto(user) {
182
+ if (!this.isUser(user)) {
183
+ return;
184
+ }
185
+ return this.photos?.find(p => (p.employeeNumber && p.employeeNumber.toString() === user.employeeNumber) ||
186
+ p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||
187
+ p.displayName?.toLowerCase() === user.displayName.toLowerCase() ||
188
+ p.title?.toLowerCase() === user.displayName.toLowerCase())?.encodedAbsUrl;
189
+ }
190
+ //#region Exclusions - won't be included in the dataSource at all
191
+ #excludeUsersByAccountName(users) {
192
+ this._data.exclusions.accountNames
193
+ .forEach(accountName => {
194
+ const index = users.findIndex(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());
195
+ if (index === -1) {
196
+ return;
197
+ }
198
+ users.splice(index, 1);
199
+ });
200
+ return users;
201
+ }
202
+ #excludeUsersByGroupName(users) {
203
+ this._data.exclusions.groups
204
+ .forEach(groupName => {
205
+ const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());
206
+ if (!group) {
207
+ return;
208
+ }
209
+ group.member.forEach(groupMemberDn => {
210
+ const index = users.findIndex(u => u.distinguishedName === groupMemberDn);
211
+ if (index === -1) {
212
+ return;
213
+ }
214
+ users.splice(index, 1);
215
+ });
216
+ });
217
+ return users;
218
+ }
219
+ #excludeUsersByDepartment(users) {
220
+ this._data.exclusions.departments
221
+ .forEach(department => {
222
+ const excludedUsers = users.filter(u => u.department?.toLowerCase() === department.toLowerCase());
223
+ excludedUsers.forEach(user => {
224
+ const index = users.indexOf(user);
225
+ users.splice(index, 1);
226
+ });
227
+ });
228
+ return users;
229
+ }
230
+ #excludeUsersByTitle(users) {
231
+ this._data.exclusions.titles
232
+ .forEach(title => {
233
+ const excludedUsers = users.filter(u => u.title?.toLowerCase() === title.toLowerCase());
234
+ excludedUsers.forEach(user => {
235
+ const index = users.indexOf(user);
236
+ users.splice(index, 1);
237
+ });
238
+ });
239
+ return users;
240
+ }
241
+ //#endregion
242
+ //#region Inclusions - only these will be included in the dataSource
243
+ #includeUsersByAccountName(users) {
244
+ return users.filter(user => this._data.inclusions.accountNames.length === 0 || // No account inclusions specified
245
+ this._data.inclusions.accountNames.find(accountName => accountName.toLowerCase() === user.sAMAccountName.toLowerCase()));
246
+ }
247
+ #includeUsersByDepartment(users) {
248
+ return users.filter(user => this._data.inclusions.departments.length === 0 || // No department inclusions specified
249
+ this._data.inclusions.departments.find(department => department.toLowerCase() === user.department?.toLowerCase()));
250
+ }
251
+ #includeUsersByTitle(users) {
252
+ return users.filter(user => this._data.inclusions.titles.length === 0 || // No title inclusions specified
253
+ this._data.inclusions.titles.find(title => title.toLowerCase() === user.title?.toLowerCase()));
254
+ }
255
+ #includeUsersByGroupName(users) {
256
+ if (!this._data.inclusions.groups.length) {
257
+ return users; // No group inclusions specified
258
+ }
259
+ // Cheating a bit and leveraging the 'selected' property to keep track of who should be included
260
+ // Since inclusions happen befor pre-selections, we can do that, as long as we set 'selected' back to false when we're done
261
+ this._data.inclusions.groups
262
+ .forEach(groupName => {
263
+ const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());
264
+ if (!group) {
265
+ return;
266
+ }
267
+ users
268
+ .filter(user => group.member.find(groupMemberDn => groupMemberDn === user.distinguishedName))
269
+ .forEach(user => user.selected = true);
270
+ });
271
+ // At this point, all of the appropriate users should have 'selected' set to true
272
+ const selectedUsers = users.filter(user => user.selected); // Subset of the original list
273
+ // Reset 'selected' to false, and return
274
+ selectedUsers.forEach(user => user.selected = false);
275
+ return selectedUsers;
276
+ }
277
+ //#endregion
278
+ //#region Pre-Selections
279
+ #preSelectUsersByAccountName(users) {
280
+ this._data.preSelections.accountNames
281
+ .forEach(accountName => {
282
+ const user = users.find(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());
283
+ if (!user) {
284
+ return;
285
+ }
286
+ user.selected = true;
287
+ });
288
+ return users;
289
+ }
290
+ #preSelectUsersByDepartment(users) {
291
+ this._data.preSelections.departments
292
+ .forEach(department => users
293
+ .filter(u => u.department?.toLowerCase() === department.toLowerCase())
294
+ .forEach(user => user.selected = true));
295
+ return users;
296
+ }
297
+ #preSelectUsersByTitle(users) {
298
+ this._data.preSelections.titles
299
+ .forEach(title => users
300
+ .filter(u => u.title?.toLowerCase() === title.toLowerCase())
301
+ .forEach(user => user.selected = true));
302
+ return users;
303
+ }
304
+ #preSelectUsersByGroupName(users) {
305
+ this._data.preSelections.groups
306
+ .forEach(groupName => {
307
+ const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());
308
+ if (!group) {
309
+ return;
310
+ }
311
+ group.member.forEach(groupMemberDn => {
312
+ const user = users.find(u => u.distinguishedName === groupMemberDn);
313
+ if (!user) {
314
+ return;
315
+ }
316
+ user.selected = true;
317
+ });
318
+ });
319
+ return users;
320
+ }
321
+ //#endregion
322
+ #setFilterPredicate() {
323
+ if (!this.dataSource) {
324
+ return;
325
+ }
326
+ this.dataSource.filterPredicate = (user, filter) => {
327
+ if (filter === '{selected:true}') {
328
+ return user.selected;
329
+ }
330
+ else {
331
+ const regex = new RegExp(filter, 'i'); // Case-insensitive
332
+ let match = false; // The end result - whether or not a employee matches the filter
333
+ const filterProperties = ['displayName'];
334
+ if (this._data.filterOptions.accountName) {
335
+ filterProperties.push('sAMAccountName');
336
+ }
337
+ if (this._data.filterOptions.title) {
338
+ filterProperties.push('title');
339
+ }
340
+ if (this._data.filterOptions.department) {
341
+ filterProperties.push('department');
342
+ }
343
+ if (this._data.filterOptions.phoneNumber) {
344
+ filterProperties.push('telephoneNumber');
345
+ }
346
+ // Match on the properties configured above
347
+ filterProperties
348
+ .forEach(field => {
349
+ // @ts-ignore
350
+ if (user[field] && user[field].match(regex)) {
351
+ match = true;
352
+ }
353
+ });
354
+ // Match on group membership (group name)
355
+ if (this._data.filterOptions.groupMembership) {
356
+ user.memberOf.forEach(groupDn => {
357
+ const group = this.groups?.find(group => group.distinguishedName === groupDn && group.name.match(regex));
358
+ if (group) {
359
+ match = true;
360
+ }
361
+ });
362
+ }
363
+ return match;
364
+ }
365
+ };
366
+ }
367
+ #listenForFilterChanges() {
368
+ this.filterForm.get('filter')?.valueChanges
369
+ .pipe(debounceTime(250))
370
+ .subscribe(() => this.dataSource.filter = this.filterForm.value.filter?.trim().toLowerCase());
371
+ }
372
+ tooltip(user) {
373
+ return this._data.showGroupMembershipTooltips ?
374
+ user.memberOf
375
+ .map(groupDn => this.groups
376
+ ?.find(group => group.distinguishedName === groupDn)?.name)
377
+ .sort((a, b) => a > b ? 1 : -1)
378
+ .join('\n') :
379
+ '';
380
+ }
381
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: UserChooserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
382
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: UserChooserComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "selectionList", first: true, predicate: MatSelectionList, descendants: true, isSignal: true }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }], ngImport: i0, template: "<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ _data.title }}</h2>\n\n <div id=\"num-selected\">\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n @if (dataSource && photos) {\n <form [formGroup]=\"filterForm\">\n @if (dataSource) {\n <mat-form-field>\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\n @if (filterForm.value.filter) {\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"/>\n </button>\n }\n </mat-form-field>\n }\n </form>\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n @for (user of dataSource?.filteredData; track user) {\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n @if (getPhoto(user)) {\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\n } @else {\n <mat-icon matListItemAvatar class=\"no-photo\"\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\"/>\n }\n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n @if (isUser(user) && _data.showPhone && castUser(user).telephoneNumber) {\n <div>{{ castUser(user).telephoneNumber }}</div>\n }\n </div>\n @if (isUser(user)) {\n <div>{{ castUser(user).department }}</div>\n <div class=\"title\">{{ castUser(user).title }}</div>\n }\n </div>\n </mat-list-option>\n }\n </mat-selection-list>\n } @else {\n <div>\n <mat-spinner [diameter]=\"50\"/>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (dataSource && photos) {\n @if (selectedOptions.length) {\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n }\n @if (isMultiMode) {\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n >\n <mat-icon fontIcon=\"select_all\"/>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n }\n @if (isMultiMode && selectedOptions.length) {\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n >\n <mat-icon fontIcon=\"clear_all\"/>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n }\n @if (isMultiMode || !_data.closeWhenSelectionMade) {\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"/>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n }\n }\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"/>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}#num-selected{margin:1em 1em 0 0}mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width: 801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"], dependencies: [{ kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
383
+ }
384
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: UserChooserComponent, decorators: [{
385
+ type: Component,
386
+ args: [{ standalone: true, imports: [
387
+ MatButton,
388
+ MatDialogActions,
389
+ MatDialogClose,
390
+ MatDialogContent,
391
+ MatFormField,
392
+ MatIcon,
393
+ MatIconButton,
394
+ MatInput,
395
+ MatListOption,
396
+ MatProgressSpinner,
397
+ MatSelectionList,
398
+ MatSlideToggle,
399
+ MatTooltip,
400
+ ReactiveFormsModule,
401
+ ], template: "<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ _data.title }}</h2>\n\n <div id=\"num-selected\">\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n @if (dataSource && photos) {\n <form [formGroup]=\"filterForm\">\n @if (dataSource) {\n <mat-form-field>\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\n @if (filterForm.value.filter) {\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"/>\n </button>\n }\n </mat-form-field>\n }\n </form>\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n @for (user of dataSource?.filteredData; track user) {\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n @if (getPhoto(user)) {\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\n } @else {\n <mat-icon matListItemAvatar class=\"no-photo\"\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\"/>\n }\n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n @if (isUser(user) && _data.showPhone && castUser(user).telephoneNumber) {\n <div>{{ castUser(user).telephoneNumber }}</div>\n }\n </div>\n @if (isUser(user)) {\n <div>{{ castUser(user).department }}</div>\n <div class=\"title\">{{ castUser(user).title }}</div>\n }\n </div>\n </mat-list-option>\n }\n </mat-selection-list>\n } @else {\n <div>\n <mat-spinner [diameter]=\"50\"/>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (dataSource && photos) {\n @if (selectedOptions.length) {\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n }\n @if (isMultiMode) {\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n >\n <mat-icon fontIcon=\"select_all\"/>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n }\n @if (isMultiMode && selectedOptions.length) {\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n >\n <mat-icon fontIcon=\"clear_all\"/>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n }\n @if (isMultiMode || !_data.closeWhenSelectionMade) {\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"/>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n }\n }\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"/>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}#num-selected{margin:1em 1em 0 0}mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width: 801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"] }]
402
+ }], propDecorators: { filterInput: [{
403
+ type: ViewChild,
404
+ args: ['filterInput']
405
+ }] } });
406
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jaG9vc2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnkvbWF0ZXJpYWwvc3JjL2NvbXBvbmVudHMvdXNlci1jaG9vc2VyL3VzZXItY2hvb3Nlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hY3RpdmUtZGlyZWN0b3J5L21hdGVyaWFsL3NyYy9jb21wb25lbnRzL3VzZXItY2hvb3Nlci91c2VyLWNob29zZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQVUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdILE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLHNCQUFzQixFQUFTLE1BQU0sMkNBQTJDLENBQUM7QUFDMUYsT0FBTyxFQUFhLGlCQUFpQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFbkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIs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LENBQ1I7aUJBQ0EsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBRSxHQUFHLENBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakIsRUFBRSxDQUFDO0lBQ1AsQ0FBQzs4R0EvYlUsb0JBQW9CO2tHQUFwQixvQkFBb0IsdUhBWUwsZ0JBQWdCLDZKQzFENUMsOHZHQTBGcUIsMnRDRGhFakIsU0FBUyxpTEFDVCxnQkFBZ0IsNEhBQ2hCLGNBQWMscUxBQ2QsZ0JBQWdCLHlHQUNoQixZQUFZLDRMQUNaLE9BQU8sMklBQ1AsYUFBYSw2RkFDYixRQUFRLGlVQUNSLGFBQWEsb01BQ2Isa0JBQWtCLCtLQUNsQixnQkFBZ0IsdU5BQ2hCLGNBQWMsbVRBQ2QsVUFBVSxnUkFDVixtQkFBbUI7OzJGQU9WLG9CQUFvQjtrQkF4QmhDLFNBQVM7aUNBQ0ksSUFBSSxXQUVQO3dCQUNQLFNBQVM7d0JBQ1QsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixPQUFPO3dCQUNQLGFBQWE7d0JBQ2IsUUFBUTt3QkFDUixhQUFhO3dCQUNiLGtCQUFrQjt3QkFDbEIsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLFVBQVU7d0JBQ1YsbUJBQW1CO3FCQUNwQjs4QkFvQjZCLFdBQVc7c0JBQXhDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgaW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dBY3Rpb25zLCBNYXREaWFsb2dDbG9zZSwgTWF0RGlhbG9nQ29udGVudCwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdExpc3RPcHRpb24sIE1hdFNlbGVjdGlvbkxpc3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9saXN0JztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFjdGl2ZURpcmVjdG9yeVNlcnZpY2UsIEdyb3VwIH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnknO1xuaW1wb3J0IHsgUGhvdG9JdGVtLCBTaGFyZVBvaW50U2VydmljZSB9IGZyb20gJ0BjbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9zaGFyZXBvaW50JztcblxuaW1wb3J0IHsgTWF0QnV0dG9uLCBNYXRJY29uQnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IFNlbGVjdGFibGVHcm91cCB9IGZyb20gJy4uLy4uL21vZGVsL3NlbGVjdGFibGUtZ3JvdXAnO1xuaW1wb3J0IHsgU2VsZWN0YWJsZVVzZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9zZWxlY3RhYmxlLXVzZXInO1xuaW1wb3J0IHsgVXNlckNob29zZXJEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlci1jaG9vc2VyLWRhdGEnO1xuaW1wb3J0IHsgVXNlckNob29zZXJNb2RlIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlci1jaG9vc2VyLW1vZGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItY2hvb3Nlci5jb21wb25lbnQuaHRtbCcsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRCdXR0b24sXG4gICAgTWF0RGlhbG9nQWN0aW9ucyxcbiAgICBNYXREaWFsb2dDbG9zZSxcbiAgICBNYXREaWFsb2dDb250ZW50LFxuICAgIE1hdEZvcm1GaWVsZCxcbiAgICBNYXRJY29uLFxuICAgIE1hdEljb25CdXR0b24sXG4gICAgTWF0SW5wdXQsXG4gICAgTWF0TGlzdE9wdGlvbixcbiAgICBNYXRQcm9ncmVzc1NwaW5uZXIsXG4gICAgTWF0U2VsZWN0aW9uTGlzdCxcbiAgICBNYXRTbGlkZVRvZ2dsZSxcbiAgICBNYXRUb29sdGlwLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIF0sXG4gIHN0eWxlVXJsczogW1xuICAgICcuL3VzZXItY2hvb3Nlci5jb21wb25lbnQuc2NzcycsXG4gICAgJy4uLy4uLy4uLy4uLy4uL3N0eWxlcy9tYXQtaWNvbi5zY3NzJ1xuICBdXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJDaG9vc2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgI3NlcnZpY2VzID0ge1xuICAgIGRpYWxvZ1JlZjogaW5qZWN0KE1hdERpYWxvZ1JlZjxVc2VyQ2hvb3NlckNvbXBvbmVudD4pLFxuICAgIGFjdGl2ZURpcmVjdG9yeTogaW5qZWN0KEFjdGl2ZURpcmVjdG9yeVNlcnZpY2UpLFxuICAgIHNoYXJlUG9pbnQ6IGluamVjdChTaGFyZVBvaW50U2VydmljZSksXG4gICAgZGF0YTogaW5qZWN0PFVzZXJDaG9vc2VyRGF0YT4oTUFUX0RJQUxPR19EQVRBKVxuICB9O1xuICBfZGF0YSA9IHsuLi5uZXcgVXNlckNob29zZXJEYXRhKCksIC4uLnRoaXMuI3NlcnZpY2VzLmRhdGF9O1xuICBcbiAgLy8jcmVnaW9uIEZpZWxkc1xuICBcbiAgLy9AVmlld0NoaWxkKE1hdFNlbGVjdGlvbkxpc3QpIHNlbGVjdGlvbkxpc3Q/OiBNYXRTZWxlY3Rpb25MaXN0O1xuICBzZWxlY3Rpb25MaXN0ID0gdmlld0NoaWxkKE1hdFNlbGVjdGlvbkxpc3QpO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlcklucHV0Jykgc2V0IGZpbHRlcklucHV0KGVsUmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+KSB7XG4gICAgaWYgKGVsUmVmKSB7XG4gICAgICBlbFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuICAvL2ZpbHRlcklucHV0ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdmaWx0ZXJJbnB1dCcpO1xuXG4gIGZpbHRlckZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBmaWx0ZXI6IG5ldyBGb3JtQ29udHJvbCgpXG4gIH0pO1xuXG4gIGRhdGFTb3VyY2U/OiBNYXRUYWJsZURhdGFTb3VyY2U8U2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXA+O1xuICBwaG90b3M/OiBQaG90b0l0ZW1bXTtcbiAgZ3JvdXBzPzogR3JvdXBbXTsgLy8gTWF5IG9yIG1heSBub3QgZ2V0IHBvcHVsYXRlZCwgZGVwZW5kaW5nIG9uIGNvbmZpZyBkYXRhIHNlbnQgaW5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFByb3BlcnRpZXNcbiAgZ2V0IGlzTXVsdGlNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLm1vZGUgPT09IFVzZXJDaG9vc2VyTW9kZS5NdWx0aXBsZTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZE9wdGlvbnMoKTogTWF0TGlzdE9wdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25MaXN0KCk/Lm9wdGlvbnMuZmlsdGVyKG8gPT4gby5zZWxlY3RlZCkgPz8gW107XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRVc2VycygpOiAoU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2U/LmRhdGE/LmZpbHRlcihkID0+IGQuc2VsZWN0ZWQpID8/IFtdO1xuICB9XG5cbiAgZ2V0IGZpbHRlclZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyRm9ybS52YWx1ZS5maWx0ZXI7XG4gIH1cblxuICBnZXQgYWRHcm91cHNOZWVkZWQoKTogYm9vbGVhbiB7XG4gICAgLy8gSWYgYW55IGFyZSB0aGVzZSBhcmUgdHJ1ZSwgdGhlbiB3ZSBuZWVkIHRvIHB1bGwgQUQgZ3JvdXBzIGZvciB1c2UgbGF0ZXJcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zaG93R3JvdXBNZW1iZXJzaGlwVG9vbHRpcHMgfHxcbiAgICAgIHRoaXMuX2RhdGEuZXhjbHVzaW9ucy5ncm91cHMubGVuZ3RoID4gMCB8fFxuICAgICAgdGhpcy5fZGF0YS5pbmNsdXNpb25zLmdyb3Vwcy5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLl9kYXRhLnByZVNlbGVjdGlvbnMuZ3JvdXBzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRoaXMuX2RhdGEuZmlsdGVyT3B0aW9ucy5ncm91cE1lbWJlcnNoaXAgfHxcbiAgICAgICh0aGlzLl9kYXRhLnNlbGVjdGFibGVHcm91cE5hbWVzPy5sZW5ndGggPz8gMCkgPiAwOyAvLyBkZWJ1Z1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBMaWZlY3ljbGVcbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy4jZ2V0RGF0YSgpO1xuICAgIHRoaXMuI2xpc3RlbkZvckZpbHRlckNoYW5nZXMoKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gRXZlbnRzXG4gICBsaXN0U2VsZWN0aW9uQ2hhbmdlZChvcHRpb25zOiBNYXRMaXN0T3B0aW9uW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGF0YS5tb2RlID09PSBVc2VyQ2hvb3Nlck1vZGUuU2luZ2xlICYmXG4gICAgICB0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGggJiZcbiAgICAgIHRoaXMuX2RhdGEuY2xvc2VXaGVuU2VsZWN0aW9uTWFkZVxuICAgICAgKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgb3B0aW9uU2VsZWN0aW9uQ2hhbmdlZChvcHRpb246IE1hdExpc3RPcHRpb24pOiB2b2lkIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5kYXRhU291cmNlPy5kYXRhXG4gICAgICAuZmluZCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gKG9wdGlvbi52YWx1ZSBhcyBTZWxlY3RhYmxlVXNlcikuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgICBpZiAodXNlcikge1xuICAgICAgdXNlci5zZWxlY3RlZCA9IG9wdGlvbi5zZWxlY3RlZDtcbiAgICB9XG4gIH1cblxuICBoaWRlVW5zZWxlY3RlZENoYW5nZWQoc2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8uc2V0VmFsdWUoc2VsZWN0ZWQgPyAne3NlbGVjdGVkOnRydWV9JyA6IG51bGwpO1xuICB9XG5cbiAgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uTGlzdCgpPy5zZWxlY3RBbGwoKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkxpc3QoKT8ub3B0aW9ucykge1xuICAgICAgdGhpcy5saXN0U2VsZWN0aW9uQ2hhbmdlZCh0aGlzLnNlbGVjdGlvbkxpc3QoKSEub3B0aW9ucy50b0FycmF5KCkpO1xuICAgIH1cbiAgfVxuXG4gIGRlc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uTGlzdCgpPy5kZXNlbGVjdEFsbCgpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBVdGlsaXRpZXNcbiAgaXNVc2VyKHVzZXJPckdyb3VwOiBTZWxlY3RhYmxlVXNlciB8IFNlbGVjdGFibGVHcm91cCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAndGl0bGUnIGluIHVzZXJPckdyb3VwO1xuICB9XG4gIGNhc3RVc2VyKHVzZXJPckdyb3VwOiBTZWxlY3RhYmxlVXNlciB8IFNlbGVjdGFibGVHcm91cCk6IFNlbGVjdGFibGVVc2VyIHtcbiAgICByZXR1cm4gdXNlck9yR3JvdXAgYXMgU2VsZWN0YWJsZVVzZXI7XG4gIH1cblxuICAjZ2V0RGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhT2JzZXJ2YWJsZXM6IE9ic2VydmFibGU8YW55PltdID0gW1xuICAgICAgdGhpcy5fZGF0YS51c2VycyA/XG4gICAgICAgIC8vIFVzZXJzIHdlcmUgcGFzc2VkIGluXG4gICAgICAgIG9mKHRoaXMuX2RhdGEudXNlcnMpIDpcbiAgICAgICAgLy8gVXNlcnMgbmVlZCB0byBiZSByZXRyaWV2ZWRcbiAgICAgICAgdGhpcy4jc2VydmljZXMuYWN0aXZlRGlyZWN0b3J5LmdldFVzZXJzKGZhbHNlLCB0aGlzLl9kYXRhLmluY2x1ZGVEaXNhYmxlZFVzZXJzLCB0aGlzLl9kYXRhLnBhcmVudE91KSxcblxuICAgICAgdGhpcy5fZGF0YS5waG90b3MgP1xuICAgICAgICAvLyBQaG90b3Mgd2VyZSBwYXNzZWQgaW5cbiAgICAgICAgb2YodGhpcy5fZGF0YS5waG90b3MpIDpcbiAgICAgICAgLy8gUGhvdG9zIG5lZWQgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgIHRoaXMuI3NlcnZpY2VzLnNoYXJlUG9pbnQuZ2V0UGhvdG9zKClcbiAgICBdO1xuXG4gICAgLy8gRG8gd2UgbmVlZCBBRCBncm91cHM/XG4gICAgaWYgKHRoaXMuYWRHcm91cHNOZWVkZWQpIHtcbiAgICAgIHRoaXMuX2RhdGEuZ3JvdXBzID9cbiAgICAgICAgLy8gR3JvdXBzIHdlcmUgcGFzc2VkIGluXG4gICAgICAgIG9mKHRoaXMuX2RhdGEuZ3JvdXBzKSA6XG4gICAgICAgIC8vIEdyb3VwcyBuZWVkIHRvIGJlIHJldHJpZXZlZFxuICAgICAgICBkYXRhT2JzZXJ2YWJsZXMucHVzaCh0aGlzLiNzZXJ2aWNlcy5hY3RpdmVEaXJlY3RvcnkuZ2V0R3JvdXBzKCkpO1xuICAgIH1cblxuXG4gICAgZm9ya0pvaW4oZGF0YU9ic2VydmFibGVzKVxuICAgICAgLy8uc3Vic2NyaWJlKChbdXNlcnMsIHBob3Rvc10pID0+IHtcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIC8vIE5lZWQgZ3JvdXBzIGluIHBsYWNlIGJlZm9yZSB3ZSBoYW5kbGUgZXhjbHVzaW9ucy9pbmNsdXNpb25zL3ByZS1zZWxlY3Rpb25zXG4gICAgICAgIHRoaXMuZ3JvdXBzID0gdGhpcy5hZEdyb3Vwc05lZWRlZCA/IGRhdGFbMl0gOiBudWxsO1xuXG4gICAgICAgIGxldCB1c2VycyA9IGRhdGFbMF0gYXMgU2VsZWN0YWJsZVVzZXJbXTtcbiAgICAgICAgdXNlcnMuZm9yRWFjaCh1ID0+IHUuc2VsZWN0ZWQgPSBmYWxzZSk7IC8vIEluIGNhc2UgZXhpc3RpbmcgZGF0YSB3YXMgcmUtdXNlZFxuICAgICAgICB1c2VycyA9IHRoaXMuI2luY2x1ZGVVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI2luY2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNpbmNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI2luY2x1ZGVVc2Vyc0J5VGl0bGUodXNlcnMpO1xuXG4gICAgICAgIHVzZXJzID0gdGhpcy4jZXhjbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy4jZXhjbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI2V4Y2x1ZGVVc2Vyc0J5RGVwYXJ0bWVudCh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy4jZXhjbHVkZVVzZXJzQnlUaXRsZSh1c2Vycyk7XG5cbiAgICAgICAgdXNlcnMgPSB0aGlzLiNwcmVTZWxlY3RVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI3ByZVNlbGVjdFVzZXJzQnlHcm91cE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI3ByZVNlbGVjdFVzZXJzQnlEZXBhcnRtZW50KHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNwcmVTZWxlY3RVc2Vyc0J5VGl0bGUodXNlcnMpO1xuXG4gICAgICAgIC8vIGRlYnVnXG4gICAgICAgIGNvbnN0IHVzZXJzQW5kR3JvdXBzOiAoU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApW10gPSBbXG4gICAgICAgICAgLi4udXNlcnNcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAodGhpcy5fZGF0YS5zZWxlY3RhYmxlR3JvdXBOYW1lcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5fZGF0YS5zZWxlY3RhYmxlR3JvdXBOYW1lc1xuICAgICAgICAgICAgLmZvckVhY2goZ3JvdXBOYW1lID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3VwcyEuZmluZChnID0+IGcuZGlzcGxheU5hbWUgPT09IGdyb3VwTmFtZSk7XG5cbiAgICAgICAgICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdXNlcnNBbmRHcm91cHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAuLi5ncm91cCxcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodXNlcnNBbmRHcm91cHMpO1xuICAgICAgXG4gICAgICAgIHRoaXMucGhvdG9zID0gZGF0YVsxXTtcblxuICAgICAgICB0aGlzLiNzZXRGaWx0ZXJQcmVkaWNhdGUoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVXNlcnMpIHtcbiAgICAgIHRoaXMuI3NlcnZpY2VzLmRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRVc2Vyc1xuICAgICAgLm1hcCh1ID0+IHRoaXMuX2RhdGEucmV0dXJuVXNlck9iamVjdHMgPyB1IDogdS5zQU1BY2NvdW50TmFtZSk7XG5cbiAgICB0aGlzLiNzZXJ2aWNlcy5kaWFsb2dSZWYuY2xvc2UodGhpcy5fZGF0YS5tb2RlID09PSBVc2VyQ2hvb3Nlck1vZGUuTXVsdGlwbGUgP1xuICAgICAgdmFsdWUgOlxuICAgICAgdmFsdWVbMF1cbiAgICApO1xuICB9XG5cbiAgZ2V0UGhvdG8odXNlcjogU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5pc1VzZXIodXNlcikpIHsgcmV0dXJuOyB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMucGhvdG9zPy5maW5kKHAgPT5cbiAgICAgIChwLmVtcGxveWVlTnVtYmVyICYmIHAuZW1wbG95ZWVOdW1iZXIudG9TdHJpbmcoKSA9PT0gKHVzZXIgYXMgU2VsZWN0YWJsZVVzZXIpLmVtcGxveWVlTnVtYmVyKSB8fFxuICAgICAgcC5hY2NvdW50TmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gdXNlci5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBwLmRpc3BsYXlOYW1lPy50b0xvd2VyQ2FzZSgpID09PSB1c2VyLmRpc3BsYXlOYW1lLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIHAudGl0bGU/LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk/LmVuY29kZWRBYnNVcmw7XG4gIH1cblxuICAvLyNyZWdpb24gRXhjbHVzaW9ucyAtIHdvbid0IGJlIGluY2x1ZGVkIGluIHRoZSBkYXRhU291cmNlIGF0IGFsbFxuICAjZXhjbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuX2RhdGEuZXhjbHVzaW9ucy5hY2NvdW50TmFtZXNcbiAgICAgIC5mb3JFYWNoKGFjY291bnROYW1lID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB1c2Vycy5maW5kSW5kZXgodSA9PiB1LnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IGFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHVzZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gICNleGNsdWRlVXNlcnNCeUdyb3VwTmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuX2RhdGEuZXhjbHVzaW9ucy5ncm91cHNcbiAgICAgIC5mb3JFYWNoKGdyb3VwTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZyA9PiBnLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZ3JvdXBOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxuICAgICAgICBcbiAgICAgICAgZ3JvdXAubWVtYmVyLmZvckVhY2goZ3JvdXBNZW1iZXJEbiA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB1c2Vycy5maW5kSW5kZXgodSA9PiB1LmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cE1lbWJlckRuKTtcbiAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gICNleGNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLl9kYXRhLmV4Y2x1c2lvbnMuZGVwYXJ0bWVudHNcbiAgICAgIC5mb3JFYWNoKGRlcGFydG1lbnQgPT4ge1xuICAgICAgICBjb25zdCBleGNsdWRlZFVzZXJzID0gdXNlcnMuZmlsdGVyKHUgPT4gdS5kZXBhcnRtZW50Py50b0xvd2VyQ2FzZSgpID09PSBkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgIGV4Y2x1ZGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmluZGV4T2YodXNlcik7XG4gICAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gICNleGNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5fZGF0YS5leGNsdXNpb25zLnRpdGxlc1xuICAgICAgLmZvckVhY2godGl0bGUgPT4ge1xuICAgICAgICBjb25zdCBleGNsdWRlZFVzZXJzID0gdXNlcnMuZmlsdGVyKHUgPT4gdS50aXRsZT8udG9Mb3dlckNhc2UoKSA9PT0gdGl0bGUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIFxuICAgICAgICBleGNsdWRlZFVzZXJzLmZvckVhY2godXNlciA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB1c2Vycy5pbmRleE9mKHVzZXIpO1xuICAgICAgICAgIHVzZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEluY2x1c2lvbnMgLSBvbmx5IHRoZXNlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRhdGFTb3VyY2VcbiAgI2luY2x1ZGVVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cbiAgICAgIHRoaXMuX2RhdGEuaW5jbHVzaW9ucy5hY2NvdW50TmFtZXMubGVuZ3RoID09PSAwIHx8IC8vIE5vIGFjY291bnQgaW5jbHVzaW9ucyBzcGVjaWZpZWRcblxuICAgICAgdGhpcy5fZGF0YS5pbmNsdXNpb25zLmFjY291bnROYW1lcy5maW5kKGFjY291bnROYW1lID0+XG4gICAgICAgIGFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgKSk7XG4gIH1cblxuICAjaW5jbHVkZVVzZXJzQnlEZXBhcnRtZW50KHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgcmV0dXJuIHVzZXJzLmZpbHRlcih1c2VyID0+XG4gICAgICB0aGlzLl9kYXRhLmluY2x1c2lvbnMuZGVwYXJ0bWVudHMubGVuZ3RoID09PSAwIHx8IC8vIE5vIGRlcGFydG1lbnQgaW5jbHVzaW9ucyBzcGVjaWZpZWRcblxuICAgICAgdGhpcy5fZGF0YS5pbmNsdXNpb25zLmRlcGFydG1lbnRzLmZpbmQoZGVwYXJ0bWVudCA9PlxuICAgICAgICBkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKVxuICAgICAgKSk7XG4gIH1cblxuICAjaW5jbHVkZVVzZXJzQnlUaXRsZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHJldHVybiB1c2Vycy5maWx0ZXIodXNlciA9PlxuICAgICAgdGhpcy5fZGF0YS5pbmNsdXNpb25zLnRpdGxlcy5sZW5ndGggPT09IDAgfHwgLy8gTm8gdGl0bGUgaW5jbHVzaW9ucyBzcGVjaWZpZWRcblxuICAgICAgdGhpcy5fZGF0YS5pbmNsdXNpb25zLnRpdGxlcy5maW5kKHRpdGxlID0+XG4gICAgICAgIHRpdGxlLnRvTG93ZXJDYXNlKCkgPT09IHVzZXIudGl0bGU/LnRvTG93ZXJDYXNlKClcbiAgICAgICkpO1xuICB9XG5cbiAgI2luY2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgaWYgKCF0aGlzLl9kYXRhLmluY2x1c2lvbnMuZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHVzZXJzOyAvLyBObyBncm91cCBpbmNsdXNpb25zIHNwZWNpZmllZFxuICAgIH1cblxuICAgIC8vIENoZWF0aW5nIGEgYml0IGFuZCBsZXZlcmFnaW5nIHRoZSAnc2VsZWN0ZWQnIHByb3BlcnR5IHRvIGtlZXAgdHJhY2sgb2Ygd2hvIHNob3VsZCBiZSBpbmNsdWRlZFxuICAgIC8vIFNpbmNlIGluY2x1c2lvbnMgaGFwcGVuIGJlZm9yIHByZS1zZWxlY3Rpb25zLCB3ZSBjYW4gZG8gdGhhdCwgYXMgbG9uZyBhcyB3ZSBzZXQgJ3NlbGVjdGVkJyBiYWNrIHRvIGZhbHNlIHdoZW4gd2UncmUgZG9uZVxuICAgIHRoaXMuX2RhdGEuaW5jbHVzaW9ucy5ncm91cHNcbiAgICAgIC5mb3JFYWNoKGdyb3VwTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZyA9PiBnLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZ3JvdXBOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHVzZXJzXG4gICAgICAgICAgLmZpbHRlcih1c2VyID0+XG4gICAgICAgICAgICAgIGdyb3VwLm1lbWJlci5maW5kKGdyb3VwTWVtYmVyRG4gPT4gZ3JvdXBNZW1iZXJEbiA9PT0gdXNlci5kaXN0aW5ndWlzaGVkTmFtZSlcbiAgICAgICAgICApXG4gICAgICAgICAgLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gdHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIFxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIGFsbCBvZiB0aGUgYXBwcm9wcmlhdGUgdXNlcnMgc2hvdWxkIGhhdmUgJ3NlbGVjdGVkJyBzZXQgdG8gdHJ1ZVxuICAgIGNvbnN0IHNlbGVjdGVkVXNlcnMgPSB1c2Vycy5maWx0ZXIodXNlciA9PiB1c2VyLnNlbGVjdGVkKTsgLy8gU3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBsaXN0XG4gICAgLy8gUmVzZXQgJ3NlbGVjdGVkJyB0byBmYWxzZSwgYW5kIHJldHVyblxuICAgIHNlbGVjdGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSBmYWxzZSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkVXNlcnM7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uICBQcmUtU2VsZWN0aW9uc1xuICAjcHJlU2VsZWN0VXNlcnNCeUFjY291bnROYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5fZGF0YS5wcmVTZWxlY3Rpb25zLmFjY291bnROYW1lc1xuICAgICAgLmZvckVhY2goYWNjb3VudE5hbWUgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gdXNlcnMuZmluZCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmICghdXNlcikgeyByZXR1cm47IH1cblxuICAgICAgICB1c2VyLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgI3ByZVNlbGVjdFVzZXJzQnlEZXBhcnRtZW50KHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5fZGF0YS5wcmVTZWxlY3Rpb25zLmRlcGFydG1lbnRzXG4gICAgICAuZm9yRWFjaChkZXBhcnRtZW50ID0+XG4gICAgICAgIHVzZXJzXG4gICAgICAgICAgLmZpbHRlcih1ID0+IHUuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKSA9PT0gZGVwYXJ0bWVudC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgIC5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IHRydWUpXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgI3ByZVNlbGVjdFVzZXJzQnlUaXRsZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucy50aXRsZXNcbiAgICAgIC5mb3JFYWNoKHRpdGxlID0+XG4gICAgICAgIHVzZXJzXG4gICAgICAgICAgLmZpbHRlcih1ID0+IHUudGl0bGU/LnRvTG93ZXJDYXNlKCkgPT09IHRpdGxlLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gdHJ1ZSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cblxuICAjcHJlU2VsZWN0VXNlcnNCeUdyb3VwTmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucy5ncm91cHNcbiAgICAgIC5mb3JFYWNoKGdyb3VwTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZyA9PiBnLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZ3JvdXBOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGdyb3VwLm1lbWJlci5mb3JFYWNoKGdyb3VwTWVtYmVyRG4gPT4ge1xuICAgICAgICAgIGNvbnN0IHVzZXIgPSB1c2Vycy5maW5kKHUgPT4gdS5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBNZW1iZXJEbik7XG4gICAgICAgICAgaWYgKCF1c2VyKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgdXNlci5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG4gIFxuICAjc2V0RmlsdGVyUHJlZGljYXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9ICh1c2VyOiAoU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApLCBmaWx0ZXI6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGZpbHRlciA9PT0gJ3tzZWxlY3RlZDp0cnVlfScpIHtcbiAgICAgICAgcmV0dXJuIHVzZXIuc2VsZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoZmlsdGVyLCAnaScpOyAvLyBDYXNlLWluc2Vuc2l0aXZlXG4gICAgICAgIGxldCBtYXRjaCA9IGZhbHNlOyAvLyBUaGUgZW5kIHJlc3VsdCAtIHdoZXRoZXIgb3Igbm90IGEgZW1wbG95ZWUgbWF0Y2hlcyB0aGUgZmlsdGVyXG5cbiAgICAgICAgY29uc3QgZmlsdGVyUHJvcGVydGllcyA9IFsgJ2Rpc3BsYXlOYW1lJyBdO1xuICAgICAgICBpZiAodGhpcy5fZGF0YS5maWx0ZXJPcHRpb25zLmFjY291bnROYW1lKSB7XG4gICAgICAgICAgZmlsdGVyUHJvcGVydGllcy5wdXNoKCdzQU1BY2NvdW50TmFtZScpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RhdGEuZmlsdGVyT3B0aW9ucy50aXRsZSkge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgndGl0bGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGF0YS5maWx0ZXJPcHRpb25zLmRlcGFydG1lbnQpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ2RlcGFydG1lbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGF0YS5maWx0ZXJPcHRpb25zLnBob25lTnVtYmVyKSB7XG4gICAgICAgICAgZmlsdGVyUHJvcGVydGllcy5wdXNoKCd0ZWxlcGhvbmVOdW1iZXInKTtcbiAgICAgICAgfVxuICBcbiAgICAgICAgLy8gTWF0Y2ggb24gdGhlIHByb3BlcnRpZXMgY29uZmlndXJlZCBhYm92ZVxuICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzXG4gICAgICAgICAgLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHVzZXJbZmllbGRdICYmIHVzZXJbZmllbGRdLm1hdGNoKHJlZ2V4KSkge1xuICAgICAgICAgICAgICBtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gIFxuICAgICAgICAvLyBNYXRjaCBvbiBncm91cCBtZW1iZXJzaGlwIChncm91cCBuYW1lKVxuICAgICAgICBpZiAodGhpcy5fZGF0YS5maWx0ZXJPcHRpb25zLmdyb3VwTWVtYmVyc2hpcCkge1xuICAgICAgICAgIHVzZXIubWVtYmVyT2YuZm9yRWFjaChncm91cERuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZ3JvdXAgPT4gZ3JvdXAuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwRG4gJiYgZ3JvdXAubmFtZS5tYXRjaChyZWdleCkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAjbGlzdGVuRm9yRmlsdGVyQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDI1MClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kYXRhU291cmNlIS5maWx0ZXIgPSB0aGlzLmZpbHRlckZvcm0udmFsdWUuZmlsdGVyPy50cmltKCkudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICB0b29sdGlwKHVzZXI6IFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zaG93R3JvdXBNZW1iZXJzaGlwVG9vbHRpcHMgP1xuICAgICAgdXNlci5tZW1iZXJPZlxuICAgICAgICAubWFwKGdyb3VwRG4gPT5cbiAgICAgICAgICB0aGlzLmdyb3Vwc1xuICAgICAgICAgICAgPy5maW5kKGdyb3VwID0+XG4gICAgICAgICAgICAgIGdyb3VwLmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cERuXG4gICAgICAgICAgICApPy5uYW1lXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhISA+IGIhID8gMSA6IC0xKVxuICAgICAgICAgIC5qb2luKCdcXG4nKSA6XG4gICAgICAnJztcbiAgfVxuICAvLyNlbmRyZWdpb25cbn0iLCI8ZGl2IGlkPVwiZGlhbG9nLXRpdGxlXCI+XG4gIDxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7IF9kYXRhLnRpdGxlIH19PC9oMj5cblxuICA8ZGl2IGlkPVwibnVtLXNlbGVjdGVkXCI+XG4gICAge3sgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCB9fSBzZWxlY3RlZFxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bWF0LWRpYWxvZy1jb250ZW50PlxuICBAaWYgKGRhdGFTb3VyY2UgJiYgcGhvdG9zKSB7XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCI+XG4gICAgICBAaWYgKGRhdGFTb3VyY2UpIHtcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiIGZvcm1Db250cm9sTmFtZT1cImZpbHRlclwiICNmaWx0ZXJJbnB1dD5cbiAgICAgICAgICBAaWYgKGZpbHRlckZvcm0udmFsdWUuZmlsdGVyKSB7XG4gICAgICAgICAgICA8YnV0dG9uIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIkNsZWFyXCIgKGNsaWNrKT1cImZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8uc2V0VmFsdWUoJycpXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsb3NlXCIvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfVxuICAgIDwvZm9ybT5cbiAgICA8bWF0LXNlbGVjdGlvbi1saXN0IFttdWx0aXBsZV09XCJpc011bHRpTW9kZVwiXG4gICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImxpc3RTZWxlY3Rpb25DaGFuZ2VkKCRldmVudC5vcHRpb25zKVwiPlxuICAgICAgQGZvciAodXNlciBvZiBkYXRhU291cmNlPy5maWx0ZXJlZERhdGE7IHRyYWNrIHVzZXIpIHtcbiAgICAgICAgPG1hdC1saXN0LW9wdGlvbiBbdmFsdWVdPVwidXNlclwiIFtzZWxlY3RlZF09XCJ1c2VyLnNlbGVjdGVkXCJcbiAgICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwib3B0aW9uU2VsZWN0aW9uQ2hhbmdlZChvcHRpb24pXCIgI29wdGlvbj5cbiAgICAgICAgICBAaWYgKGdldFBob3RvKHVzZXIpKSB7XG4gICAgICAgICAgICA8aW1nIG1hdExpc3RJdGVtQXZhdGFyIGFsdD1cIlwiIFtzcmNdPVwiZ2V0UGhvdG8odXNlcilcIj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRMaXN0SXRlbUF2YXRhciBjbGFzcz1cIm5vLXBob3RvXCJcbiAgICAgICAgICAgICAgW2ZvbnRJY29uXT1cImlzVXNlcih1c2VyKSA/ICdhY2NvdW50X2NpcmNsZScgOiAnZ3JvdXAnXCIvPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlclwiPlxuICAgICAgICAgICAgPGRpdiBbbWF0VG9vbHRpcF09XCJ0b29sdGlwKHVzZXIpXCIgY2xhc3M9XCJ1c2VyLW5hbWVcIj5cbiAgICAgICAgICAgICAge3sgdXNlci5kaXNwbGF5TmFtZSB9fVxuICAgICAgICAgICAgICBAaWYgKGlzVXNlcih1c2VyKSAmJiBfZGF0YS5zaG93UGhvbmUgJiYgY2FzdFVzZXIodXNlcikudGVsZXBob25lTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgPGRpdj57eyBjYXN0VXNlcih1c2VyKS50ZWxlcGhvbmVOdW1iZXIgfX08L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKGlzVXNlcih1c2VyKSkge1xuICAgICAgICAgICAgICA8ZGl2Pnt7IGNhc3RVc2VyKHVzZXIpLmRlcGFydG1lbnQgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3sgY2FzdFVzZXIodXNlcikudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtbGlzdC1vcHRpb24+XG4gICAgICB9XG4gICAgPC9tYXQtc2VsZWN0aW9uLWxpc3Q+XG4gIH0gQGVsc2Uge1xuICAgIDxkaXY+XG4gICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjUwXCIvPlxuICAgICAgPGgyIGlkPVwic3Bpbm5lci1tZXNzYWdlXCI+R2V0dGluZyB1c2VycyBhbmQgcGhvdG9zLi4uPC9oMj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG5cbjxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gIEBpZiAoZGF0YVNvdXJjZSAmJiBwaG90b3MpIHtcbiAgICBAaWYgKHNlbGVjdGVkT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIChjaGFuZ2UpPVwiaGlkZVVuc2VsZWN0ZWRDaGFuZ2VkKCRldmVudC5jaGVja2VkKVwiPlxuICAgICAgICBIaWRlIFVuc2VsZWN0ZWRcbiAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICB9XG4gICAgQGlmIChpc011bHRpTW9kZSkge1xuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwic2VsZWN0QWxsKClcIlxuICAgICAgICA+XG4gICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cInNlbGVjdF9hbGxcIi8+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5TZWxlY3QgQWxsPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICAgIEBpZiAoaXNNdWx0aU1vZGUgJiYgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZGVzZWxlY3RBbGwoKVwiXG4gICAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiY2xlYXJfYWxsXCIvPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGUtbW9iaWxlXCI+Q2xlYXIgQWxsPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICAgIEBpZiAoaXNNdWx0aU1vZGUgfHwgIV9kYXRhLmNsb3NlV2hlblNlbGVjdGlvbk1hZGUpIHtcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNsb3NlKClcIiBtYXRUb29sdGlwPVwiQWNjZXB0IHlvdXIgc2VsZWN0aW9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZE9wdGlvbnMubGVuZ3RoXCI+XG4gICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNoZWNrXCIvPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGUtbW9iaWxlXCI+T2s8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIH1cblxuICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwid2FyblwiIG1hdC1kaWFsb2ctY2xvc2UgbWF0VG9vbHRpcD1cIkNsb3NlIHRoaXMgd2luZG93XCI+XG4gICAgPG1hdC1pY29uIGZvbnRJY29uPVwiY2xvc2VcIi8+XG4gICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPkNhbmNlbDwvc3Bhbj5cbiAgPC9idXR0b24+XG48L21hdC1kaWFsb2ctYWN0aW9ucz4iXX0=