@colijnit/sharedcomponents 1.0.60 → 1.0.62

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 (479) hide show
  1. package/README.md +24 -24
  2. package/bundles/colijnit-sharedcomponents.umd.js +9848 -9843
  3. package/bundles/colijnit-sharedcomponents.umd.js.map +1 -1
  4. package/colijnit-sharedcomponents.d.ts +91 -91
  5. package/colijnit-sharedcomponents.metadata.json +1 -1
  6. package/esm2015/colijnit-sharedcomponents.js +91 -91
  7. package/esm2015/lib/assets/dictionary/text.properties.js +11 -11
  8. package/esm2015/lib/businessobject/build-images-and-documentation-result.js +2 -2
  9. package/esm2015/lib/businessobject/co-document-right.bo.js +3 -3
  10. package/esm2015/lib/businessobject/drag-drop-container-element.js +2 -2
  11. package/esm2015/lib/businessobject/drag-drop-container.js +7 -7
  12. package/esm2015/lib/components/activity-list/activity-list.component.js +130 -130
  13. package/esm2015/lib/components/activity-list/activity-list.module.js +24 -24
  14. package/esm2015/lib/components/app-file-dropzone/app-file-dropzone.component.js +47 -47
  15. package/esm2015/lib/components/app-file-dropzone/app-file-dropzone.module.js +20 -20
  16. package/esm2015/lib/components/date-planning/component/agenda/agenda-base-view.component.js +61 -61
  17. package/esm2015/lib/components/date-planning/component/agenda/agenda-day-view.component.js +36 -36
  18. package/esm2015/lib/components/date-planning/component/agenda/agenda-event.component.js +56 -56
  19. package/esm2015/lib/components/date-planning/component/agenda/agenda-events.component.js +47 -47
  20. package/esm2015/lib/components/date-planning/component/agenda/agenda-half-hour-cell.component.js +68 -68
  21. package/esm2015/lib/components/date-planning/component/agenda/agenda-header.component.js +243 -243
  22. package/esm2015/lib/components/date-planning/component/agenda/agenda-hour-cell.component.js +36 -36
  23. package/esm2015/lib/components/date-planning/component/agenda/agenda-hour-view-labels.component.js +50 -50
  24. package/esm2015/lib/components/date-planning/component/agenda/agenda-hour-view.component.js +46 -46
  25. package/esm2015/lib/components/date-planning/component/agenda/agenda-month-view.component.js +61 -61
  26. package/esm2015/lib/components/date-planning/component/agenda/agenda-select-event.component.js +39 -39
  27. package/esm2015/lib/components/date-planning/component/agenda/agenda-view.component.js +35 -35
  28. package/esm2015/lib/components/date-planning/component/agenda/agenda-week-select-view.component.js +64 -64
  29. package/esm2015/lib/components/date-planning/component/agenda/agenda-week-view.component.js +48 -48
  30. package/esm2015/lib/components/date-planning/component/agenda/view-select.component.js +42 -42
  31. package/esm2015/lib/components/date-planning/component/calendar/calendar-all-months.component.js +34 -34
  32. package/esm2015/lib/components/date-planning/component/calendar/calendar-all-years.component.js +48 -48
  33. package/esm2015/lib/components/date-planning/component/calendar/calendar-header.component.js +107 -107
  34. package/esm2015/lib/components/date-planning/component/calendar/calendar-view.component.js +178 -178
  35. package/esm2015/lib/components/date-planning/component/calendar/calendar.component.js +34 -34
  36. package/esm2015/lib/components/date-planning/date-planning.component.js +113 -113
  37. package/esm2015/lib/components/date-planning/date-planning.module.js +63 -63
  38. package/esm2015/lib/components/docsign/component/signature/signature.component.js +75 -75
  39. package/esm2015/lib/components/docsign/component/signatures/signatures.component.js +44 -44
  40. package/esm2015/lib/components/docsign/docsign.component.js +242 -242
  41. package/esm2015/lib/components/docsign/docsign.module.js +23 -23
  42. package/esm2015/lib/components/file-upload/file-upload.component.js +189 -189
  43. package/esm2015/lib/components/file-upload/file-upload.module.js +25 -25
  44. package/esm2015/lib/components/file-upload-popup/file-upload-popup.component.js +397 -397
  45. package/esm2015/lib/components/file-upload-popup/file-upload-popup.module.js +30 -30
  46. package/esm2015/lib/components/files-upload/components/base-file-upload.component.js +469 -469
  47. package/esm2015/lib/components/files-upload/components/drag-drop-container.component.js +115 -115
  48. package/esm2015/lib/components/files-upload/files-upload.component.js +131 -131
  49. package/esm2015/lib/components/files-upload/files-upload.module.js +47 -47
  50. package/esm2015/lib/components/image-display/image-display.component.js +36 -36
  51. package/esm2015/lib/components/image-display/image-display.module.js +23 -23
  52. package/esm2015/lib/components/key-pad/key-pad.component.js +200 -200
  53. package/esm2015/lib/components/key-pad/key-pad.module.js +22 -22
  54. package/esm2015/lib/components/layout-switcher/layout-switcher.component.js +74 -74
  55. package/esm2015/lib/components/layout-switcher/layout-switcher.module.js +21 -21
  56. package/esm2015/lib/components/linear-gauge/co-linear-gauge.component.js +59 -59
  57. package/esm2015/lib/components/linear-gauge/co-linear-gauge.module.js +19 -19
  58. package/esm2015/lib/components/multi-property-toggler/multiple-property-toggler.component.js +89 -89
  59. package/esm2015/lib/components/multi-property-toggler/multiple-property-toggler.module.js +21 -21
  60. package/esm2015/lib/components/send-method-dialog/components/layout-selection/layout-selection.component.js +79 -79
  61. package/esm2015/lib/components/send-method-dialog/components/layout-selection/layout-selection.module.js +21 -21
  62. package/esm2015/lib/components/send-method-dialog/components/printer-selection/printer-selection.component.js +85 -85
  63. package/esm2015/lib/components/send-method-dialog/components/printer-selection/printer-selection.module.js +21 -21
  64. package/esm2015/lib/components/send-method-dialog/components/send-method-email/send-method-email.component.js +64 -64
  65. package/esm2015/lib/components/send-method-dialog/components/send-method-email/send-method-email.module.js +26 -26
  66. package/esm2015/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.component.js +40 -40
  67. package/esm2015/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.module.js +23 -23
  68. package/esm2015/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.component.js +61 -61
  69. package/esm2015/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.module.js +28 -28
  70. package/esm2015/lib/components/send-method-dialog/components/signature-button/signature-button.component.js +38 -38
  71. package/esm2015/lib/components/send-method-dialog/components/signature-button/signature-button.module.js +21 -21
  72. package/esm2015/lib/components/send-method-dialog/model/email-address-viewmodel.js +7 -7
  73. package/esm2015/lib/components/send-method-dialog/send-method-dialog.component.js +258 -258
  74. package/esm2015/lib/components/send-method-dialog/send-method-dialog.module.js +35 -35
  75. package/esm2015/lib/components/send-method-dialog/send-method-params.interface.js +2 -2
  76. package/esm2015/lib/components/send-method-dialog/service/send-method.service.js +59 -59
  77. package/esm2015/lib/components/simple-tags/simple-tags.component.js +229 -229
  78. package/esm2015/lib/components/simple-tags/simple-tags.module.js +26 -26
  79. package/esm2015/lib/components/statusbar/statusbar-popup.component.js +97 -97
  80. package/esm2015/lib/components/statusbar/statusbar.component.js +81 -81
  81. package/esm2015/lib/components/statusbar/statusbar.module.js +27 -27
  82. package/esm2015/lib/components/stock/components/allocation-stock-history/allocation-stock-history.component.js +47 -47
  83. package/esm2015/lib/components/stock/components/order-commission-stock-history/order-commission-stock-history.component.js +47 -47
  84. package/esm2015/lib/components/stock/components/order-stock-history/order-stock-history.component.js +47 -47
  85. package/esm2015/lib/components/stock/components/order-stock-tab/order-stock-tab.component.js +47 -47
  86. package/esm2015/lib/components/stock/components/order-supply-stock-history/order-supply-stock-history.component.js +47 -47
  87. package/esm2015/lib/components/stock/components/order-tab/order-tab.component.js +67 -67
  88. package/esm2015/lib/components/stock/components/stock-history/stock-history.component.js +53 -53
  89. package/esm2015/lib/components/stock/components/stock-location/stock-location.component.js +240 -240
  90. package/esm2015/lib/components/stock/components/stock-prognose/stock-prognose.component.js +52 -52
  91. package/esm2015/lib/components/stock/components/stock-tab/stock-tab.component.js +39 -41
  92. package/esm2015/lib/components/stock/localization/translation.js +63 -63
  93. package/esm2015/lib/components/stock/stock-history-tabs/stock-history-tabs.component.js +33 -33
  94. package/esm2015/lib/components/stock/stock-information/stock-information.component.js +49 -48
  95. package/esm2015/lib/components/stock/stock-information-grid/stock-information-grid.component.js +457 -457
  96. package/esm2015/lib/components/stock/stock-tabs/stock-tabs.component.js +243 -241
  97. package/esm2015/lib/components/stock/stock-transfer/co-drop-down-list-fields.interface.js +2 -2
  98. package/esm2015/lib/components/stock/stock-transfer/stock-change-amount.component.js +72 -72
  99. package/esm2015/lib/components/stock/stock-transfer/stock-transfer.component.js +149 -149
  100. package/esm2015/lib/components/stock/stock.component.js +197 -193
  101. package/esm2015/lib/components/stock/stock.module.js +80 -80
  102. package/esm2015/lib/components/stock-statusbar/stock-statusbar.component.js +23 -23
  103. package/esm2015/lib/components/stock-statusbar/stock-statusbar.module.js +19 -19
  104. package/esm2015/lib/components/tab-bar/tab-bar.component.js +90 -88
  105. package/esm2015/lib/components/tab-bar/tab-bar.module.js +21 -21
  106. package/esm2015/lib/components/tab-bar/tab.interface.js +2 -2
  107. package/esm2015/lib/components/tile-renderer/tile-render.component.js +80 -80
  108. package/esm2015/lib/components/tile-renderer/tile-render.module.js +26 -26
  109. package/esm2015/lib/decorator/input-boolean.decorator.js +34 -34
  110. package/esm2015/lib/enum/calendar-view.enum.js +9 -9
  111. package/esm2015/lib/enum/document-email-report.enum.js +18 -18
  112. package/esm2015/lib/enum/domain-multiple-name.enum.js +13 -13
  113. package/esm2015/lib/enum/file-type.js +14 -14
  114. package/esm2015/lib/enum/files-upload-config-objects.js +3 -3
  115. package/esm2015/lib/enum/gauge-color.enum.js +10 -10
  116. package/esm2015/lib/enum/icon.enum.js +44 -44
  117. package/esm2015/lib/enum/internal-param.enum.js +38 -38
  118. package/esm2015/lib/enum/keyboard-code.enum.js +32 -32
  119. package/esm2015/lib/enum/language-code.enum.js +8 -8
  120. package/esm2015/lib/enum/month.enum.js +17 -17
  121. package/esm2015/lib/enum/read-write-access-config-names.enum.js +2 -2
  122. package/esm2015/lib/enum/table-name.enum.js +86 -86
  123. package/esm2015/lib/enum/tag-category.enum.js +22 -22
  124. package/esm2015/lib/enum/tags-component-config-names.js +2 -2
  125. package/esm2015/lib/enum/thumb-three-way-state.js +19 -19
  126. package/esm2015/lib/enum/tile-size-type.js +7 -7
  127. package/esm2015/lib/enum/time-period.enum.js +11 -11
  128. package/esm2015/lib/event/co-drag-event.js +2 -2
  129. package/esm2015/lib/event/co-drop-event.js +2 -2
  130. package/esm2015/lib/interface/key-value-pair.js +2 -2
  131. package/esm2015/lib/interface/operation-callback-simple-function.js +4 -4
  132. package/esm2015/lib/localization/localization.module.js +19 -19
  133. package/esm2015/lib/localization/localize.pipe.js +26 -26
  134. package/esm2015/lib/localization/localize.service.js +30 -30
  135. package/esm2015/lib/localization/translation.js +3 -3
  136. package/esm2015/lib/model/agenda-event-per-day.model.js +6 -6
  137. package/esm2015/lib/model/agenda-event.model.js +8 -8
  138. package/esm2015/lib/model/agenda-null-objects.js +11 -11
  139. package/esm2015/lib/model/constant/all-months.js +17 -17
  140. package/esm2015/lib/model/date-range.js +5 -5
  141. package/esm2015/lib/model/day.model.js +7 -7
  142. package/esm2015/lib/model/icon-svg.js +43 -43
  143. package/esm2015/lib/model/month.model.js +11 -11
  144. package/esm2015/lib/model/send-method.js +8 -8
  145. package/esm2015/lib/model/settings.js +4 -4
  146. package/esm2015/lib/model/tag-tree-item.bo.js +16 -16
  147. package/esm2015/lib/model/time-window.bo.js +26 -26
  148. package/esm2015/lib/model/tree-object.js +15 -15
  149. package/esm2015/lib/model/week.model.js +6 -6
  150. package/esm2015/lib/model/weekday.model.js +10 -10
  151. package/esm2015/lib/pipe/array-number.pipe.js +15 -15
  152. package/esm2015/lib/pipe/file-type-image.pipe.js +51 -51
  153. package/esm2015/lib/pipe/master-pipes.js +9 -9
  154. package/esm2015/lib/pipe/ucfirst.pipe.js +16 -16
  155. package/esm2015/lib/service/dictionary.service.js +76 -76
  156. package/esm2015/lib/service/drag-drop.service.js +365 -365
  157. package/esm2015/lib/service/icon-cache.service.js +51 -51
  158. package/esm2015/lib/service/options.service.js +48 -48
  159. package/esm2015/lib/service/shared-connector.service.js +433 -433
  160. package/esm2015/lib/service/shared.service.js +60 -60
  161. package/esm2015/lib/service/stock.service.js +110 -110
  162. package/esm2015/lib/utils/array-utils.js +202 -202
  163. package/esm2015/lib/utils/calendar.utils.js +68 -68
  164. package/esm2015/lib/utils/check-precision-and-scale-result.js +2 -2
  165. package/esm2015/lib/utils/check-within-stepped-bounds-result.js +2 -2
  166. package/esm2015/lib/utils/co-document-shared-field-logic.js +50 -50
  167. package/esm2015/lib/utils/date-utils.js +264 -264
  168. package/esm2015/lib/utils/enum-utils.js +128 -128
  169. package/esm2015/lib/utils/function/not-nill.function.js +5 -5
  170. package/esm2015/lib/utils/is-nill.function.js +5 -5
  171. package/esm2015/lib/utils/map-utils.js +41 -41
  172. package/esm2015/lib/utils/number-utils.js +390 -390
  173. package/esm2015/lib/utils/object-utils.js +278 -278
  174. package/esm2015/lib/utils/ref-code-utils.js +49 -49
  175. package/esm2015/lib/utils/string-utils.js +93 -93
  176. package/esm2015/public-api.js +31 -31
  177. package/fesm2015/colijnit-sharedcomponents.js +10332 -10326
  178. package/fesm2015/colijnit-sharedcomponents.js.map +1 -1
  179. package/lib/assets/dictionary/text.properties.d.ts +3 -3
  180. package/lib/businessobject/build-images-and-documentation-result.d.ts +5 -5
  181. package/lib/businessobject/co-document-right.bo.d.ts +6 -6
  182. package/lib/businessobject/drag-drop-container-element.d.ts +6 -6
  183. package/lib/businessobject/drag-drop-container.d.ts +6 -6
  184. package/lib/components/access/read-write-access.scss +25 -25
  185. package/lib/components/access/style/_layout.scss +23 -23
  186. package/lib/components/access/style/_material-definition.scss +12 -12
  187. package/lib/components/access/style/_theme.scss +4 -4
  188. package/lib/components/access/style/material.scss +4 -4
  189. package/lib/components/activity-list/activity-list.component.d.ts +33 -33
  190. package/lib/components/activity-list/activity-list.module.d.ts +2 -2
  191. package/lib/components/activity-list/style/_layout.scss +68 -68
  192. package/lib/components/activity-list/style/_theme.scss +4 -4
  193. package/lib/components/activity-list/style/material.scss +4 -4
  194. package/lib/components/app-file-dropzone/app-file-dropzone.component.d.ts +14 -14
  195. package/lib/components/app-file-dropzone/app-file-dropzone.module.d.ts +2 -2
  196. package/lib/components/app-file-dropzone/style/_layout.scss +61 -61
  197. package/lib/components/app-file-dropzone/style/_theme.scss +4 -4
  198. package/lib/components/app-file-dropzone/style/material.scss +4 -4
  199. package/lib/components/date-planning/component/agenda/agenda-base-view.component.d.ts +21 -21
  200. package/lib/components/date-planning/component/agenda/agenda-day-view.component.d.ts +7 -7
  201. package/lib/components/date-planning/component/agenda/agenda-event.component.d.ts +18 -18
  202. package/lib/components/date-planning/component/agenda/agenda-events.component.d.ts +13 -13
  203. package/lib/components/date-planning/component/agenda/agenda-half-hour-cell.component.d.ts +18 -18
  204. package/lib/components/date-planning/component/agenda/agenda-header.component.d.ts +48 -48
  205. package/lib/components/date-planning/component/agenda/agenda-hour-cell.component.d.ts +9 -9
  206. package/lib/components/date-planning/component/agenda/agenda-hour-view-labels.component.d.ts +8 -8
  207. package/lib/components/date-planning/component/agenda/agenda-hour-view.component.d.ts +7 -7
  208. package/lib/components/date-planning/component/agenda/agenda-month-view.component.d.ts +10 -10
  209. package/lib/components/date-planning/component/agenda/agenda-select-event.component.d.ts +12 -12
  210. package/lib/components/date-planning/component/agenda/agenda-view.component.d.ts +12 -12
  211. package/lib/components/date-planning/component/agenda/agenda-week-select-view.component.d.ts +10 -10
  212. package/lib/components/date-planning/component/agenda/agenda-week-view.component.d.ts +9 -9
  213. package/lib/components/date-planning/component/agenda/style/_layout.scss +443 -443
  214. package/lib/components/date-planning/component/agenda/style/_material-definition.scss +12 -12
  215. package/lib/components/date-planning/component/agenda/style/_theme.scss +7 -7
  216. package/lib/components/date-planning/component/agenda/style/material.scss +5 -5
  217. package/lib/components/date-planning/component/agenda/view-select.component.d.ts +11 -11
  218. package/lib/components/date-planning/component/calendar/calendar-all-months.component.d.ts +9 -9
  219. package/lib/components/date-planning/component/calendar/calendar-all-years.component.d.ts +9 -9
  220. package/lib/components/date-planning/component/calendar/calendar-header.component.d.ts +23 -23
  221. package/lib/components/date-planning/component/calendar/calendar-view.component.d.ts +31 -31
  222. package/lib/components/date-planning/component/calendar/calendar.component.d.ts +10 -10
  223. package/lib/components/date-planning/component/calendar/style/_layout.scss +167 -167
  224. package/lib/components/date-planning/component/calendar/style/_material-definition.scss +7 -7
  225. package/lib/components/date-planning/component/calendar/style/_theme.scss +7 -7
  226. package/lib/components/date-planning/component/calendar/style/material.scss +5 -5
  227. package/lib/components/date-planning/date-planning.component.d.ts +28 -28
  228. package/lib/components/date-planning/date-planning.module.d.ts +2 -2
  229. package/lib/components/date-planning/style/_layout.scss +45 -45
  230. package/lib/components/date-planning/style/_theme.scss +5 -5
  231. package/lib/components/date-planning/style/material.scss +7 -7
  232. package/lib/components/docsign/component/signature/signature.component.d.ts +16 -16
  233. package/lib/components/docsign/component/signature/style/_layout.scss +40 -40
  234. package/lib/components/docsign/component/signature/style/_material-definition.scss +11 -11
  235. package/lib/components/docsign/component/signature/style/_theme.scss +13 -13
  236. package/lib/components/docsign/component/signature/style/material.scss +4 -4
  237. package/lib/components/docsign/component/signatures/signatures.component.d.ts +12 -12
  238. package/lib/components/docsign/component/signatures/style/_layout.scss +13 -13
  239. package/lib/components/docsign/component/signatures/style/_material-definition.scss +1 -1
  240. package/lib/components/docsign/component/signatures/style/_theme.scss +4 -4
  241. package/lib/components/docsign/component/signatures/style/material.scss +5 -5
  242. package/lib/components/docsign/docsign.component.d.ts +94 -94
  243. package/lib/components/docsign/docsign.module.d.ts +2 -2
  244. package/lib/components/docsign/style/_layout.scss +40 -40
  245. package/lib/components/docsign/style/_material-definition.scss +12 -12
  246. package/lib/components/docsign/style/_theme.scss +12 -12
  247. package/lib/components/docsign/style/material.scss +15 -15
  248. package/lib/components/file-upload/file-upload.component.d.ts +42 -42
  249. package/lib/components/file-upload/file-upload.module.d.ts +2 -2
  250. package/lib/components/file-upload/style/_layout.scss +59 -59
  251. package/lib/components/file-upload/style/_material-definition.scss +2 -2
  252. package/lib/components/file-upload/style/_theme.scss +4 -4
  253. package/lib/components/file-upload/style/material.scss +4 -4
  254. package/lib/components/file-upload-popup/file-upload-popup.component.d.ts +75 -75
  255. package/lib/components/file-upload-popup/file-upload-popup.module.d.ts +2 -2
  256. package/lib/components/file-upload-popup/style/_layout.scss +48 -48
  257. package/lib/components/file-upload-popup/style/_material-definition.scss +2 -2
  258. package/lib/components/file-upload-popup/style/_theme.scss +5 -5
  259. package/lib/components/file-upload-popup/style/material.scss +4 -4
  260. package/lib/components/files-upload/components/base-file-upload.component.d.ts +98 -98
  261. package/lib/components/files-upload/components/drag-drop-container.component.d.ts +34 -34
  262. package/lib/components/files-upload/files-upload.component.d.ts +32 -32
  263. package/lib/components/files-upload/files-upload.module.d.ts +2 -2
  264. package/lib/components/files-upload/style/_layout.scss +49 -49
  265. package/lib/components/files-upload/style/_theme.scss +5 -5
  266. package/lib/components/files-upload/style/material.scss +4 -4
  267. package/lib/components/image-display/image-display.component.d.ts +14 -14
  268. package/lib/components/image-display/image-display.module.d.ts +2 -2
  269. package/lib/components/image-display/style/_layout.scss +56 -56
  270. package/lib/components/image-display/style/_material-definition.scss +4 -4
  271. package/lib/components/image-display/style/_theme.scss +6 -6
  272. package/lib/components/image-display/style/material.scss +3 -3
  273. package/lib/components/key-pad/key-pad.component.d.ts +38 -38
  274. package/lib/components/key-pad/key-pad.module.d.ts +2 -2
  275. package/lib/components/key-pad/style/_layout.scss +160 -160
  276. package/lib/components/key-pad/style/_material-definition.scss +19 -19
  277. package/lib/components/key-pad/style/_theme.scss +35 -35
  278. package/lib/components/key-pad/style/material.scss +4 -4
  279. package/lib/components/layout-switcher/layout-switcher.component.d.ts +16 -16
  280. package/lib/components/layout-switcher/layout-switcher.module.d.ts +2 -2
  281. package/lib/components/layout-switcher/style/_layout.scss +94 -94
  282. package/lib/components/layout-switcher/style/_material-definition.scss +16 -16
  283. package/lib/components/layout-switcher/style/_theme.scss +4 -4
  284. package/lib/components/layout-switcher/style/material.scss +6 -6
  285. package/lib/components/linear-gauge/co-linear-gauge.component.d.ts +11 -11
  286. package/lib/components/linear-gauge/co-linear-gauge.module.d.ts +2 -2
  287. package/lib/components/linear-gauge/style/_layout.scss +20 -20
  288. package/lib/components/linear-gauge/style/_material-definition.scss +8 -8
  289. package/lib/components/linear-gauge/style/_theme.scss +4 -4
  290. package/lib/components/linear-gauge/style/material.scss +6 -6
  291. package/lib/components/login/style/_layout.scss +57 -57
  292. package/lib/components/login/style/_material-definition.scss +23 -23
  293. package/lib/components/login/style/_theme.scss +7 -7
  294. package/lib/components/login/style/material.scss +4 -4
  295. package/lib/components/multi-property-toggler/multiple-property-toggler.component.d.ts +27 -27
  296. package/lib/components/multi-property-toggler/multiple-property-toggler.module.d.ts +2 -2
  297. package/lib/components/multi-property-toggler/style/_layout.scss +24 -24
  298. package/lib/components/multi-property-toggler/style/_theme.scss +4 -4
  299. package/lib/components/multi-property-toggler/style/material.scss +4 -4
  300. package/lib/components/screen-config-generator/style/_layout.scss +95 -95
  301. package/lib/components/screen-config-generator/style/_theme.scss +4 -4
  302. package/lib/components/screen-config-generator/style/material.scss +4 -4
  303. package/lib/components/send-method-dialog/components/layout-selection/layout-selection.component.d.ts +19 -19
  304. package/lib/components/send-method-dialog/components/layout-selection/layout-selection.module.d.ts +2 -2
  305. package/lib/components/send-method-dialog/components/layout-selection/style/_layout.scss +44 -44
  306. package/lib/components/send-method-dialog/components/layout-selection/style/_material-definition.scss +19 -19
  307. package/lib/components/send-method-dialog/components/layout-selection/style/_theme.scss +17 -17
  308. package/lib/components/send-method-dialog/components/layout-selection/style/material.scss +4 -4
  309. package/lib/components/send-method-dialog/components/printer-selection/printer-selection.component.d.ts +19 -19
  310. package/lib/components/send-method-dialog/components/printer-selection/printer-selection.module.d.ts +2 -2
  311. package/lib/components/send-method-dialog/components/printer-selection/style/_layout.scss +69 -69
  312. package/lib/components/send-method-dialog/components/printer-selection/style/_material-definition.scss +37 -37
  313. package/lib/components/send-method-dialog/components/printer-selection/style/_theme.scss +23 -23
  314. package/lib/components/send-method-dialog/components/printer-selection/style/material.scss +4 -4
  315. package/lib/components/send-method-dialog/components/send-method-email/send-method-email.component.d.ts +14 -14
  316. package/lib/components/send-method-dialog/components/send-method-email/send-method-email.module.d.ts +2 -2
  317. package/lib/components/send-method-dialog/components/send-method-email/style/_layout.scss +29 -29
  318. package/lib/components/send-method-dialog/components/send-method-email/style/_material-definition.scss +8 -8
  319. package/lib/components/send-method-dialog/components/send-method-email/style/_theme.scss +5 -5
  320. package/lib/components/send-method-dialog/components/send-method-email/style/material.scss +4 -4
  321. package/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.component.d.ts +8 -8
  322. package/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.module.d.ts +2 -2
  323. package/lib/components/send-method-dialog/components/send-method-pdf/style/_layout.scss +25 -25
  324. package/lib/components/send-method-dialog/components/send-method-pdf/style/_material-definition.scss +5 -5
  325. package/lib/components/send-method-dialog/components/send-method-pdf/style/_theme.scss +5 -5
  326. package/lib/components/send-method-dialog/components/send-method-pdf/style/material.scss +4 -4
  327. package/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.component.d.ts +13 -13
  328. package/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.module.d.ts +2 -2
  329. package/lib/components/send-method-dialog/components/send-method-printer/style/_layout.scss +30 -30
  330. package/lib/components/send-method-dialog/components/send-method-printer/style/_material-definition.scss +5 -5
  331. package/lib/components/send-method-dialog/components/send-method-printer/style/_theme.scss +5 -5
  332. package/lib/components/send-method-dialog/components/send-method-printer/style/material.scss +4 -4
  333. package/lib/components/send-method-dialog/components/signature-button/signature-button.component.d.ts +12 -12
  334. package/lib/components/send-method-dialog/components/signature-button/signature-button.module.d.ts +2 -2
  335. package/lib/components/send-method-dialog/components/signature-button/style/_layout.scss +28 -28
  336. package/lib/components/send-method-dialog/components/signature-button/style/_material-definition.scss +8 -8
  337. package/lib/components/send-method-dialog/components/signature-button/style/_theme.scss +4 -4
  338. package/lib/components/send-method-dialog/components/signature-button/style/material.scss +4 -4
  339. package/lib/components/send-method-dialog/model/email-address-viewmodel.d.ts +5 -5
  340. package/lib/components/send-method-dialog/send-method-dialog.component.d.ts +71 -71
  341. package/lib/components/send-method-dialog/send-method-dialog.module.d.ts +2 -2
  342. package/lib/components/send-method-dialog/send-method-params.interface.d.ts +13 -13
  343. package/lib/components/send-method-dialog/service/send-method.service.d.ts +23 -23
  344. package/lib/components/send-method-dialog/style/_layout.scss +165 -165
  345. package/lib/components/send-method-dialog/style/_material-definition.scss +48 -48
  346. package/lib/components/send-method-dialog/style/_theme.scss +33 -33
  347. package/lib/components/send-method-dialog/style/material.scss +10 -10
  348. package/lib/components/simple-tags/simple-tags.component.d.ts +31 -31
  349. package/lib/components/simple-tags/simple-tags.module.d.ts +2 -2
  350. package/lib/components/simple-tags/style/_layout.scss +272 -272
  351. package/lib/components/simple-tags/style/_material-definition.scss +39 -39
  352. package/lib/components/simple-tags/style/_theme.scss +4 -4
  353. package/lib/components/simple-tags/style/material.scss +4 -4
  354. package/lib/components/statusbar/statusbar-popup.component.d.ts +21 -21
  355. package/lib/components/statusbar/statusbar.component.d.ts +26 -26
  356. package/lib/components/statusbar/statusbar.module.d.ts +2 -2
  357. package/lib/components/statusbar/style/_layout.scss +70 -70
  358. package/lib/components/statusbar/style/_material-definition.scss +23 -23
  359. package/lib/components/statusbar/style/_theme.scss +13 -13
  360. package/lib/components/statusbar/style/material.scss +5 -5
  361. package/lib/components/stock/components/allocation-stock-history/allocation-stock-history.component.d.ts +9 -9
  362. package/lib/components/stock/components/order-commission-stock-history/order-commission-stock-history.component.d.ts +9 -9
  363. package/lib/components/stock/components/order-stock-history/order-stock-history.component.d.ts +9 -9
  364. package/lib/components/stock/components/order-stock-tab/order-stock-tab.component.d.ts +11 -11
  365. package/lib/components/stock/components/order-supply-stock-history/order-supply-stock-history.component.d.ts +9 -9
  366. package/lib/components/stock/components/order-tab/order-tab.component.d.ts +20 -20
  367. package/lib/components/stock/components/stock-history/stock-history.component.d.ts +13 -13
  368. package/lib/components/stock/components/stock-location/stock-location.component.d.ts +50 -50
  369. package/lib/components/stock/components/stock-prognose/stock-prognose.component.d.ts +11 -11
  370. package/lib/components/stock/components/stock-tab/stock-tab.component.d.ts +7 -9
  371. package/lib/components/stock/localization/translation.d.ts +60 -60
  372. package/lib/components/stock/stock-history-tabs/stock-history-tabs.component.d.ts +7 -7
  373. package/lib/components/stock/stock-information/stock-information.component.d.ts +9 -8
  374. package/lib/components/stock/stock-information-grid/stock-information-grid.component.d.ts +75 -75
  375. package/lib/components/stock/stock-tabs/stock-tabs.component.d.ts +56 -56
  376. package/lib/components/stock/stock-transfer/co-drop-down-list-fields.interface.d.ts +4 -4
  377. package/lib/components/stock/stock-transfer/stock-change-amount.component.d.ts +18 -18
  378. package/lib/components/stock/stock-transfer/stock-transfer.component.d.ts +42 -42
  379. package/lib/components/stock/stock.component.d.ts +58 -57
  380. package/lib/components/stock/stock.module.d.ts +2 -2
  381. package/lib/components/stock/style/_layout.scss +286 -286
  382. package/lib/components/stock/style/_material-definition.scss +25 -25
  383. package/lib/components/stock/style/_theme.scss +5 -5
  384. package/lib/components/stock/style/material.scss +4 -4
  385. package/lib/components/stock-statusbar/stock-statusbar.component.d.ts +4 -4
  386. package/lib/components/stock-statusbar/stock-statusbar.module.d.ts +2 -2
  387. package/lib/components/stock-statusbar/style/_layout.scss +24 -24
  388. package/lib/components/stock-statusbar/style/material.scss +4 -4
  389. package/lib/components/tab-bar/style/_layout.scss +78 -78
  390. package/lib/components/tab-bar/style/_material-definition.scss +6 -6
  391. package/lib/components/tab-bar/style/material.scss +4 -4
  392. package/lib/components/tab-bar/tab-bar.component.d.ts +21 -21
  393. package/lib/components/tab-bar/tab-bar.module.d.ts +2 -2
  394. package/lib/components/tab-bar/tab.interface.d.ts +5 -5
  395. package/lib/components/tags/component/style/_layout.scss +67 -67
  396. package/lib/components/tags/component/style/_material-definition.scss +1 -1
  397. package/lib/components/tags/component/style/_theme.scss +8 -8
  398. package/lib/components/tags/component/style/material.scss +3 -3
  399. package/lib/components/tags/component/tag-join-label/style/_layout.scss +97 -97
  400. package/lib/components/tags/component/tag-join-label/style/_material-definition.scss +4 -4
  401. package/lib/components/tags/component/tag-join-label/style/_theme.scss +8 -8
  402. package/lib/components/tags/component/tag-join-label/style/material.scss +3 -3
  403. package/lib/components/tile-renderer/style/_layout.scss +90 -90
  404. package/lib/components/tile-renderer/style/_theme.scss +4 -4
  405. package/lib/components/tile-renderer/style/material.scss +4 -4
  406. package/lib/components/tile-renderer/tile-render.component.d.ts +31 -31
  407. package/lib/components/tile-renderer/tile-render.module.d.ts +2 -2
  408. package/lib/decorator/input-boolean.decorator.d.ts +8 -8
  409. package/lib/enum/calendar-view.enum.d.ts +7 -7
  410. package/lib/enum/document-email-report.enum.d.ts +15 -15
  411. package/lib/enum/domain-multiple-name.enum.d.ts +10 -10
  412. package/lib/enum/file-type.d.ts +7 -7
  413. package/lib/enum/files-upload-config-objects.d.ts +22 -22
  414. package/lib/enum/gauge-color.enum.d.ts +8 -8
  415. package/lib/enum/icon.enum.d.ts +42 -42
  416. package/lib/enum/internal-param.enum.d.ts +34 -34
  417. package/lib/enum/keyboard-code.enum.d.ts +30 -30
  418. package/lib/enum/language-code.enum.d.ts +6 -6
  419. package/lib/enum/month.enum.d.ts +14 -14
  420. package/lib/enum/read-write-access-config-names.enum.d.ts +4 -4
  421. package/lib/enum/table-name.enum.d.ts +84 -84
  422. package/lib/enum/tag-category.enum.d.ts +19 -19
  423. package/lib/enum/tags-component-config-names.d.ts +4 -4
  424. package/lib/enum/thumb-three-way-state.d.ts +6 -6
  425. package/lib/enum/tile-size-type.d.ts +4 -4
  426. package/lib/enum/time-period.enum.d.ts +8 -8
  427. package/lib/event/co-drag-event.d.ts +5 -5
  428. package/lib/event/co-drop-event.d.ts +8 -8
  429. package/lib/interface/key-value-pair.d.ts +4 -4
  430. package/lib/interface/operation-callback-simple-function.d.ts +4 -4
  431. package/lib/localization/localization.module.d.ts +2 -2
  432. package/lib/localization/localize.pipe.d.ts +7 -7
  433. package/lib/localization/localize.service.d.ts +7 -7
  434. package/lib/localization/translation.d.ts +2 -2
  435. package/lib/model/agenda-event-per-day.model.d.ts +5 -5
  436. package/lib/model/agenda-event.model.d.ts +17 -17
  437. package/lib/model/agenda-null-objects.d.ts +10 -10
  438. package/lib/model/constant/all-months.d.ts +2 -2
  439. package/lib/model/date-range.d.ts +7 -7
  440. package/lib/model/day.model.d.ts +8 -8
  441. package/lib/model/icon-svg.d.ts +4 -4
  442. package/lib/model/month.model.d.ts +5 -5
  443. package/lib/model/send-method.d.ts +7 -7
  444. package/lib/model/settings.d.ts +3 -3
  445. package/lib/model/tag-tree-item.bo.d.ts +18 -18
  446. package/lib/model/time-window.bo.d.ts +13 -13
  447. package/lib/model/tree-object.d.ts +8 -8
  448. package/lib/model/week.model.d.ts +4 -4
  449. package/lib/model/weekday.model.d.ts +16 -16
  450. package/lib/pipe/array-number.pipe.d.ts +4 -4
  451. package/lib/pipe/file-type-image.pipe.d.ts +12 -12
  452. package/lib/pipe/master-pipes.d.ts +1 -1
  453. package/lib/pipe/ucfirst.pipe.d.ts +4 -4
  454. package/lib/service/dictionary.service.d.ts +21 -21
  455. package/lib/service/drag-drop.service.d.ts +86 -86
  456. package/lib/service/icon-cache.service.d.ts +18 -18
  457. package/lib/service/options.service.d.ts +13 -13
  458. package/lib/service/shared-connector.service.d.ts +55 -55
  459. package/lib/service/shared.service.d.ts +18 -18
  460. package/lib/service/stock.service.d.ts +41 -41
  461. package/lib/style/_mixin.scss +14 -14
  462. package/lib/style/_variables.scss +21 -21
  463. package/lib/style/sharedcomponents-globals.scss +10 -10
  464. package/lib/utils/array-utils.d.ts +63 -63
  465. package/lib/utils/calendar.utils.d.ts +10 -10
  466. package/lib/utils/check-precision-and-scale-result.d.ts +4 -4
  467. package/lib/utils/check-within-stepped-bounds-result.d.ts +8 -8
  468. package/lib/utils/co-document-shared-field-logic.d.ts +7 -7
  469. package/lib/utils/date-utils.d.ts +44 -44
  470. package/lib/utils/enum-utils.d.ts +31 -31
  471. package/lib/utils/function/not-nill.function.d.ts +1 -1
  472. package/lib/utils/is-nill.function.d.ts +1 -1
  473. package/lib/utils/map-utils.d.ts +16 -16
  474. package/lib/utils/number-utils.d.ts +125 -125
  475. package/lib/utils/object-utils.d.ts +40 -40
  476. package/lib/utils/ref-code-utils.d.ts +10 -10
  477. package/lib/utils/string-utils.d.ts +38 -38
  478. package/package.json +6 -6
  479. package/public-api.d.ts +27 -27
@@ -1,469 +1,469 @@
1
- import { __awaiter, __decorate } from "tslib";
2
- import { ComponentFactoryResolver, Directive, EventEmitter, HostBinding, HostListener, Input, Output, ViewContainerRef } from "@angular/core";
3
- import { TableName } from "../../../enum/table-name.enum";
4
- import { DictionaryService } from "../../../service/dictionary.service";
5
- import { FileType } from "@colijnit/mainapi/build/enum/file-type.enum";
6
- import { OperationWithAlwaysSuccessCallback } from "../../../interface/operation-callback-simple-function";
7
- import { ArrayUtils } from "../../../utils/array-utils";
8
- import { RefCodeUtils } from "../../../utils/ref-code-utils";
9
- import { CoDocumentSharedFieldLogic } from "../../../utils/co-document-shared-field-logic";
10
- import { ObjectRightType } from "@colijnit/sharedapi/build/enum/object-right-type.enum";
11
- import { InputBoolean } from "../../../decorator/input-boolean.decorator";
12
- import { AppFileDropzoneComponent } from "../../app-file-dropzone/app-file-dropzone.component";
13
- import { FileUtils } from "@colijnit/mainapi/build/utils/file-utils";
14
- import { CoDocument } from "@colijnit/mainapi/build/model/co-document";
15
- import { CoDocumentType } from "@colijnit/mainapi/build/enum/co-document-type.enum";
16
- import { FileUploadPopupComponent } from "../../file-upload-popup/file-upload-popup.component";
17
- // A base component that lets the user make a list of files from its device. Doesn't actually upload, but outputs chosen files as filesChanged.
18
- export class BaseFileUploadComponent {
19
- // private static readonly _dummyTrueFunction: OperationCallbackSimpleFunction = (object: any) => Promise.resolve(true);
20
- constructor(
21
- //protected _promptService: PromptService,
22
- _dictionaryService,
23
- //protected _userService: UserService,
24
- _container, _factory) {
25
- this._dictionaryService = _dictionaryService;
26
- this._container = _container;
27
- this._factory = _factory;
28
- this.documents = [];
29
- // The ability to drop files on the page
30
- this.fullPageDrop = false;
31
- // If user gets the ability of adding files.
32
- this.canAdd = true;
33
- // Show add button
34
- this.addWithButton = true;
35
- // If user gets the ability of deleting files.
36
- this.canDelete = true;
37
- this.noDragDropOrdering = false;
38
- this.askBeforeDelete = true;
39
- this.resizeImages = false;
40
- this.lockOperation = OperationWithAlwaysSuccessCallback;
41
- this.unlockOperation = OperationWithAlwaysSuccessCallback;
42
- this.beforeDeleteOperation = OperationWithAlwaysSuccessCallback;
43
- this.afterDeleteOperation = OperationWithAlwaysSuccessCallback;
44
- this.beforeCreateOperation = OperationWithAlwaysSuccessCallback;
45
- this.afterCreateOperation = OperationWithAlwaysSuccessCallback;
46
- this.beforeEditOperation = OperationWithAlwaysSuccessCallback;
47
- this.dontAskBeforeDelete = false;
48
- this.noOwnDeleteOperation = false;
49
- this.useWithoutSettingProps = false;
50
- this.medicalUserGroups = false;
51
- // Use with customFileDropEvent
52
- this.useCustomFileDropEvent = false;
53
- // Use in conjunction with useCustomFileDropEvent
54
- this.customFileDropEvent = new EventEmitter();
55
- // Emits if user wants to add multiple documents at once
56
- this.documentsAdded = new EventEmitter();
57
- this.documentDeleted = new EventEmitter();
58
- // Emits every time the order of documents was changed
59
- this.sortableListChanged = new EventEmitter();
60
- this.documentChangeEvent = new EventEmitter();
61
- // Use this if consumer requires to perform extra actions, like locking a parent businessObject if it contains the collection of documents. Emit with true when popup opened, false for close
62
- this.popupOpenedStateChange = new EventEmitter();
63
- this._documentKey = "";
64
- this._readonly = false;
65
- }
66
- // The fileType that the documents should be saved as, leave empty to automatically detect filetype. Also determines file picker filter
67
- set fileType(value) {
68
- if (value) {
69
- this._fileType = value;
70
- //TODO Documentdataloader fix
71
- //this._coDocumentDataLoader.loadAllowedTypes().then(() => {this.handleAcceptedFileTypesLoaded(value)});
72
- }
73
- }
74
- get fileType() {
75
- return this._fileType;
76
- }
77
- set documentKey(value) {
78
- this._documentKey = value + ""; // force string
79
- }
80
- get documentKey() {
81
- return this._documentKey;
82
- }
83
- set readonly(value) {
84
- this._readonly = value;
85
- if (this._popup && this._popup.instance) {
86
- this._popup.instance.readonly = value;
87
- }
88
- }
89
- get readonly() {
90
- return this._readonly;
91
- }
92
- set maxUploadSizeParam(value) {
93
- if (value) {
94
- this._setInternalParamObj(value);
95
- }
96
- }
97
- onDrop(event) {
98
- event.preventDefault();
99
- event.stopPropagation();
100
- if (!this.useCustomFileDropEvent) {
101
- this.filesPicked(event.dataTransfer.files);
102
- }
103
- else {
104
- this.customFileDropEvent.emit(event.dataTransfer.files);
105
- }
106
- this._clearDropzone();
107
- }
108
- onDragEnd(event) {
109
- event.dataTransfer.clearData();
110
- this._clearDropzone();
111
- }
112
- onDragOver(event) {
113
- event.preventDefault();
114
- }
115
- onDragEnter(event) {
116
- this._dragEnterTarget = event.target;
117
- this._showDropzone();
118
- }
119
- onDragLeave(event) {
120
- if (event.target === this._dragEnterTarget) {
121
- this._clearDropzone();
122
- }
123
- }
124
- ngOnDestroy() {
125
- this._clearDropzone();
126
- }
127
- _showDropzone() {
128
- if (!this._dropZone) {
129
- const fact = this._factory.resolveComponentFactory(AppFileDropzoneComponent);
130
- this._dropZone = this._container.createComponent(fact);
131
- this._dropZone.instance.customDropActionMessage = this.dropMessage;
132
- }
133
- }
134
- _clearDropzone() {
135
- this._container.clear();
136
- if (this._dropZone) {
137
- this._dropZone.destroy();
138
- this._dropZone = undefined;
139
- }
140
- }
141
- // Remove file from upload array.
142
- handleDelete(file) {
143
- return __awaiter(this, void 0, void 0, function* () {
144
- let success = yield this.beforeDeleteOperation(file);
145
- try {
146
- if (success) {
147
- yield this._delete(file);
148
- success = true;
149
- }
150
- }
151
- finally {
152
- yield this.afterDeleteOperation(file);
153
- }
154
- return Promise.resolve(success);
155
- });
156
- }
157
- _delete(file) {
158
- return __awaiter(this, void 0, void 0, function* () {
159
- let doDelete = true;
160
- if (!this.dontAskBeforeDelete) {
161
- //TODO make dialogService
162
- //doDelete = await this._promptService.showYesNo("MESSAGE_DELETE_RECORD_QUESTION");
163
- }
164
- if (doDelete) {
165
- if (!this.noOwnDeleteOperation) {
166
- ArrayUtils.RemoveElement(file, this.documents);
167
- }
168
- this.documentDeleted.emit(file);
169
- }
170
- });
171
- }
172
- handleSortingChange(docs) {
173
- this.sortableListChanged.emit(docs);
174
- }
175
- handleFileChange(event) {
176
- return __awaiter(this, void 0, void 0, function* () {
177
- if (event && event.target && event.target.files && event.target.files.length > 0) {
178
- // check file sizes and extension
179
- //Todo: fix this
180
- //const allowedExtensions = await this._baseDataDalRepository.getAllowedExtensions();
181
- let allFilesAreSmallEnough = true;
182
- let allFilesHaveAllowedExtensions = true;
183
- const sizeToCompare = this._maxUploadFileSize ? this._maxUploadFileSize : undefined;
184
- const len = event.target.files.length;
185
- for (let i = 0; i < len; i++) {
186
- const uploadSizeAllowed = FileUtils.CheckMaxUploadSize(event.target.files[i], sizeToCompare);
187
- if (!uploadSizeAllowed) {
188
- allFilesAreSmallEnough = false;
189
- break;
190
- }
191
- const extensionAllowed = true; //FileUtils.CheckExtension(event.target.files[i], allowedExtensions);
192
- if (!extensionAllowed) {
193
- allFilesHaveAllowedExtensions = false;
194
- break;
195
- }
196
- }
197
- if (!allFilesAreSmallEnough) {
198
- //TODO make dialogService
199
- //this._promptService.showWarning(this._dictionaryService.get("FILE_TOO_LARGE_TO_UPLOAD", true, "" + [FileUtils.getMaxUploadSizeInMb(sizeToCompare)]));
200
- }
201
- else if (!allFilesHaveAllowedExtensions) {
202
- //const extensionsList = allowedExtensions.map(allowedExtension => allowedExtension.extension).sort().join(", ");
203
- //this._promptService.showWarning(this._dictionaryService.get("FILE_HAS_DISALLOWED_EXTENSION", false, extensionsList));
204
- }
205
- else {
206
- const filesToAdd = yield this.convertFilesIntoCoDocuments(event.target.files);
207
- if (filesToAdd.length > 1) {
208
- this.documentsAdded.emit(filesToAdd);
209
- }
210
- else {
211
- if (this.useWithoutSettingProps) {
212
- this.documentsAdded.next(filesToAdd);
213
- }
214
- else {
215
- this.documentUnderEdit = filesToAdd[0];
216
- this.openPopup();
217
- }
218
- }
219
- }
220
- }
221
- });
222
- }
223
- handleEditDocumentClick(docToEdit) {
224
- return __awaiter(this, void 0, void 0, function* () {
225
- this.documentUnderEdit = docToEdit;
226
- const showPopup = yield this.beforeEditOperation(docToEdit);
227
- if (showPopup) {
228
- this.openPopup();
229
- }
230
- });
231
- }
232
- openPopup() {
233
- return __awaiter(this, void 0, void 0, function* () {
234
- this._createAndFillPopupInstance();
235
- this._docChangeSub = this._popup.instance.documentChangeEvent.subscribe((doc) => {
236
- this.documentChangeEvent.emit(doc);
237
- });
238
- });
239
- }
240
- openPopupToAddDocumentByUrl() {
241
- this._createDocumentToAddByUrl();
242
- this._createAndFillPopupInstance(true);
243
- this._docChangeSub = this._popup.instance.documentChangeEvent.subscribe((doc) => {
244
- doc.fileName = doc.filePath;
245
- this.documentChangeEvent.emit(doc);
246
- });
247
- }
248
- _createDocumentToAddByUrl() {
249
- this.documentUnderEdit = new CoDocument();
250
- this.documentUnderEdit.table = this.documentTable;
251
- this.documentUnderEdit.key = this.documentKey;
252
- this.documentUnderEdit.fileType = this.fileType;
253
- this.documentUnderEdit.documentType = CoDocumentType.SaveAsLinkOnRandomLocation;
254
- this.documentUnderEdit.pathIsUrl = true;
255
- //TODO Fix user Input
256
- //this.documentUnderEdit.creationUser = this._userService.userName.toUpperCase();
257
- //this.documentUnderEdit.modifiedUser = this._userService.userName.toUpperCase();
258
- this.documentUnderEdit.creationDate = new Date();
259
- this.documentUnderEdit.modifiedDate = new Date();
260
- }
261
- _createAndFillPopupInstance(addDocumentByUrl = false) {
262
- this.popupOpenedStateChange.emit(true);
263
- const factory = this._factory.resolveComponentFactory(FileUploadPopupComponent);
264
- this._popup = this._container.createComponent(factory);
265
- this._popup.instance.readonly = this._readonly;
266
- this._popup.instance.addDocumentByUrl = addDocumentByUrl;
267
- this._popup.instance.hasPublicAccessVisible = this.documentTable === TableName.Goods;
268
- this._popup.instance.showDocumentReportPicker = (this.documentTable === TableName.Transactions || this.documentTable === TableName.TransactionLines);
269
- this._popup.instance.documentUnderEdit = this.documentUnderEdit;
270
- this._popup.instance.filesUploadConfigObjects = this.filesUploadConfigObjects;
271
- this._popup.instance.medicalUserGroups = this.medicalUserGroups;
272
- this._popup.instance.tagCategory = this.tagCategory;
273
- this._popup.instance.displayReadWriteAccess = this.displayReadWriteAccess;
274
- this._popup.instance.tagReferenceTable = this.tagReferenceTable;
275
- this._popup.instance.publicationIds = RefCodeUtils.GetMultiRefCodeChoices(this.documentUnderEdit.publication);
276
- this._popup.instance.storeGroupIds = this.documentUnderEdit.retailFormulas;
277
- this._popup.instance.fileType = this.fileType;
278
- this._prepareFileRights();
279
- this._popupCloseSub = this._popup.instance.popupCloseEvent.subscribe(() => {
280
- this._unlockDocument();
281
- this.popupOpenedStateChange.emit(false);
282
- this._popupCloseSub.unsubscribe();
283
- this._docChangeSub.unsubscribe();
284
- this._popup.destroy();
285
- this._popup = undefined;
286
- });
287
- }
288
- convertFilesIntoCoDocuments(files) {
289
- return __awaiter(this, void 0, void 0, function* () {
290
- const amountOfFiles = files.length;
291
- const filesToAdd = [];
292
- for (let i = 0; i < amountOfFiles; i++) {
293
- const fileAsDocument = yield this._getFileAsDocument(files[i]);
294
- fileAsDocument.index = CoDocumentSharedFieldLogic.GenerateAvailableIndexNr(this.documents || []) + i;
295
- filesToAdd.push(fileAsDocument);
296
- }
297
- return filesToAdd;
298
- });
299
- }
300
- filesPicked(files) {
301
- return __awaiter(this, void 0, void 0, function* () {
302
- if (files && files.length) {
303
- let allFilesAreValid = true;
304
- const amountOfFiles = files.length;
305
- for (let i = 0; i < amountOfFiles; i++) {
306
- if (!FileUtils.CheckMaxUploadSize(files[i], this._maxUploadFileSize)) {
307
- allFilesAreValid = false;
308
- break;
309
- }
310
- }
311
- if (!allFilesAreValid) {
312
- //TODO make dialogService
313
- //this._promptService.showWarning(this._dictionaryService.get("FILE_TOO_LARGE_TO_UPLOAD", true, "" + FileUtils.getMaxUploadSizeInMb(this._maxUploadFileSize).toString()));
314
- }
315
- else {
316
- const filesToAdd = yield this.convertFilesIntoCoDocuments(files);
317
- if (filesToAdd.length > 1 || this.useWithoutSettingProps) {
318
- this.documentsAdded.emit(filesToAdd);
319
- }
320
- else {
321
- this.documentUnderEdit = filesToAdd[0]; // Setting docUnderEdit opens the popup window
322
- this.openPopup();
323
- }
324
- }
325
- }
326
- });
327
- }
328
- handleAcceptedFileTypesLoaded(value) {
329
- //TODO fix loading
330
- //this.acceptedUploadFormats = this._coDocumentDataLoader.getAllowedExtensionsForType(value);
331
- }
332
- _getFileAsDocument(file) {
333
- return __awaiter(this, void 0, void 0, function* () {
334
- const fileAsCoDocument = yield FileUtils.ReadFileAsNewCoDocument(file, this.resizeImages);
335
- // set some extra known fields for the codocument:
336
- fileAsCoDocument.table = this.documentTable;
337
- fileAsCoDocument.key = this.documentKey;
338
- //TODO fix add users
339
- //fileAsCoDocument.creationUser = this._userService.userName.toUpperCase();
340
- //fileAsCoDocument.modifiedUser = this._userService.userName.toUpperCase();
341
- fileAsCoDocument.creationDate = new Date();
342
- fileAsCoDocument.modifiedDate = new Date();
343
- fileAsCoDocument.fileType = this.fileType ? this.fileType : FileUtils.IsImageFile(file) ? FileType.Image : FileType.Document;
344
- if (fileAsCoDocument) {
345
- return fileAsCoDocument;
346
- }
347
- });
348
- }
349
- _setInternalParamObj(value) {
350
- return __awaiter(this, void 0, void 0, function* () {
351
- //TODO fix params
352
- //const param: InternalParameterObject = await this._generalDalRepository.getInternalParamObject(value);
353
- //this._maxUploadFileSize = isNaN(parseInt(param.value, 0)) ? undefined : parseInt(param.value, 0);
354
- });
355
- }
356
- _lockDocument() {
357
- return __awaiter(this, void 0, void 0, function* () {
358
- if (!this.documentUnderEdit.documentId) {
359
- return true; // New document does not have an ID and therefore does not have to be locked
360
- }
361
- const lockOk = yield this.lockOperation(CoDocument);
362
- return lockOk;
363
- });
364
- }
365
- _unlockDocument() {
366
- return __awaiter(this, void 0, void 0, function* () {
367
- if (!this.documentUnderEdit.documentId) {
368
- return true; // New document does not have an ID and therefore does not have to be locked
369
- }
370
- const unlockOk = yield this.unlockOperation(CoDocument);
371
- return unlockOk;
372
- });
373
- }
374
- _prepareFileRights() {
375
- const len = this.documentUnderEdit.rights.length;
376
- for (let i = 0; i < len; i++) {
377
- const right = this.documentUnderEdit.rights[i];
378
- if (right.rightLevel === ObjectRightType.ReadWrite) {
379
- this._popup.instance.userGroupsForWrite.push(right.userGroupId);
380
- }
381
- if (right.rightLevel === ObjectRightType.ReadOnly) {
382
- this._popup.instance.userGroupsForRead.push(right.userGroupId);
383
- }
384
- }
385
- }
386
- }
387
- BaseFileUploadComponent.decorators = [
388
- { type: Directive }
389
- ];
390
- BaseFileUploadComponent.ctorParameters = () => [
391
- { type: DictionaryService },
392
- { type: ViewContainerRef },
393
- { type: ComponentFactoryResolver }
394
- ];
395
- BaseFileUploadComponent.propDecorators = {
396
- fileType: [{ type: Input }],
397
- documents: [{ type: Input }],
398
- documentTable: [{ type: Input }],
399
- documentKey: [{ type: Input }],
400
- fullPageDrop: [{ type: Input }],
401
- canAdd: [{ type: Input }],
402
- dropMessage: [{ type: Input }],
403
- addWithButton: [{ type: Input }],
404
- canDelete: [{ type: Input }],
405
- noDragDropOrdering: [{ type: Input }],
406
- readonly: [{ type: Input }],
407
- askBeforeDelete: [{ type: Input }],
408
- resizeImages: [{ type: Input }],
409
- lockOperation: [{ type: Input }],
410
- unlockOperation: [{ type: Input }],
411
- beforeDeleteOperation: [{ type: Input }],
412
- afterDeleteOperation: [{ type: Input }],
413
- beforeCreateOperation: [{ type: Input }],
414
- afterCreateOperation: [{ type: Input }],
415
- beforeEditOperation: [{ type: Input }],
416
- dontAskBeforeDelete: [{ type: Input }],
417
- noOwnDeleteOperation: [{ type: Input }],
418
- maxUploadSizeParam: [{ type: Input }],
419
- useWithoutSettingProps: [{ type: Input }],
420
- filesUploadConfigObjects: [{ type: Input }],
421
- medicalUserGroups: [{ type: Input }],
422
- tagCategory: [{ type: Input }],
423
- tagReferenceTable: [{ type: Input }],
424
- displayReadWriteAccess: [{ type: Input }],
425
- useCustomFileDropEvent: [{ type: Input }],
426
- customFileDropEvent: [{ type: Output }],
427
- documentsAdded: [{ type: Output }],
428
- documentDeleted: [{ type: Output }],
429
- sortableListChanged: [{ type: Output }],
430
- documentChangeEvent: [{ type: Output }],
431
- popupOpenedStateChange: [{ type: Output }],
432
- hidden: [{ type: HostBinding, args: ["class.hidden",] }],
433
- onDrop: [{ type: HostListener, args: ["drop", ["$event"],] }],
434
- onDragEnd: [{ type: HostListener, args: ["dragend", ["$event"],] }],
435
- onDragOver: [{ type: HostListener, args: ["dragover", ["$event"],] }],
436
- onDragEnter: [{ type: HostListener, args: ["dragenter", ["$event"],] }],
437
- onDragLeave: [{ type: HostListener, args: ["dragleave", ["$event"],] }]
438
- };
439
- __decorate([
440
- InputBoolean()
441
- ], BaseFileUploadComponent.prototype, "noDragDropOrdering", void 0);
442
- __decorate([
443
- InputBoolean()
444
- ], BaseFileUploadComponent.prototype, "readonly", null);
445
- __decorate([
446
- InputBoolean()
447
- ], BaseFileUploadComponent.prototype, "askBeforeDelete", void 0);
448
- __decorate([
449
- InputBoolean()
450
- ], BaseFileUploadComponent.prototype, "resizeImages", void 0);
451
- __decorate([
452
- InputBoolean()
453
- ], BaseFileUploadComponent.prototype, "dontAskBeforeDelete", void 0);
454
- __decorate([
455
- InputBoolean()
456
- ], BaseFileUploadComponent.prototype, "noOwnDeleteOperation", void 0);
457
- __decorate([
458
- InputBoolean()
459
- ], BaseFileUploadComponent.prototype, "useWithoutSettingProps", void 0);
460
- __decorate([
461
- InputBoolean()
462
- ], BaseFileUploadComponent.prototype, "medicalUserGroups", void 0);
463
- __decorate([
464
- InputBoolean()
465
- ], BaseFileUploadComponent.prototype, "displayReadWriteAccess", void 0);
466
- __decorate([
467
- InputBoolean()
468
- ], BaseFileUploadComponent.prototype, "useCustomFileDropEvent", void 0);
469
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1maWxlLXVwbG9hZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWRjb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9maWxlcy11cGxvYWQvY29tcG9uZW50cy9iYXNlLWZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVILHdCQUF3QixFQUV4QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSw2Q0FBNkMsQ0FBQztBQUNyRSxPQUFPLEVBRUgsa0NBQWtDLEVBQ3JDLE1BQU0sdURBQXVELENBQUM7QUFJL0QsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUV6RixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdURBQXVELENBQUM7QUFDdEYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBQzdGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUNuRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFDckUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQ2xGLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBSTdGLCtJQUErSTtBQUUvSSxNQUFNLE9BQWdCLHVCQUF1QjtJQWdPekMsd0hBQXdIO0lBRXhIO0lBRUksMENBQTBDO0lBQ2hDLGtCQUFxQztJQUMvQyxzQ0FBc0M7SUFDNUIsVUFBNEIsRUFDNUIsUUFBa0M7UUFIbEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUVyQyxlQUFVLEdBQVYsVUFBVSxDQUFrQjtRQUM1QixhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQWpOekMsY0FBUyxHQUFpQixFQUFFLENBQUM7UUFjcEMsd0NBQXdDO1FBRWpDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRXJDLDRDQUE0QztRQUVyQyxXQUFNLEdBQVksSUFBSSxDQUFDO1FBSzlCLGtCQUFrQjtRQUVYLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBRXJDLDhDQUE4QztRQUV2QyxjQUFTLEdBQVksSUFBSSxDQUFDO1FBSTFCLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQWtCcEMsb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFJaEMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFHOUIsa0JBQWEsR0FBb0Msa0NBQWtDLENBQUM7UUFHcEYsb0JBQWUsR0FBb0Msa0NBQWtDLENBQUM7UUFNdEYsMEJBQXFCLEdBQW9DLGtDQUFrQyxDQUFDO1FBRzVGLHlCQUFvQixHQUFvQyxrQ0FBa0MsQ0FBQztRQUczRiwwQkFBcUIsR0FBb0Msa0NBQWtDLENBQUM7UUFHNUYseUJBQW9CLEdBQW9DLGtDQUFrQyxDQUFDO1FBRzNGLHdCQUFtQixHQUFvQyxrQ0FBa0MsQ0FBQztRQUkxRix3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFJckMseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBYXRDLDJCQUFzQixHQUFZLEtBQUssQ0FBQztRQU94QyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFZMUMsK0JBQStCO1FBRXhCLDJCQUFzQixHQUFZLEtBQUssQ0FBQztRQUUvQyxpREFBaUQ7UUFFMUMsd0JBQW1CLEdBQTJCLElBQUksWUFBWSxFQUFZLENBQUM7UUFFbEYsd0RBQXdEO1FBRXhDLG1CQUFjLEdBQStCLElBQUksWUFBWSxFQUFnQixDQUFDO1FBRzlFLG9CQUFlLEdBQTZCLElBQUksWUFBWSxFQUFjLENBQUM7UUFFM0Ysc0RBQXNEO1FBRXRDLHdCQUFtQixHQUErQixJQUFJLFlBQVksRUFBZ0IsQ0FBQztRQUc1Rix3QkFBbUIsR0FBNkIsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUV0Riw2TEFBNkw7UUFFdEwsMkJBQXNCLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFpRDNFLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBSzFCLGNBQVMsR0FBWSxLQUFLLENBQUM7SUFpQm5DLENBQUM7SUF2T0QsdUlBQXVJO0lBQ3ZJLElBQ1csUUFBUSxDQUFDLEtBQWU7UUFDL0IsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2Qiw2QkFBNkI7WUFDN0Isd0dBQXdHO1NBQzNHO0lBQ0wsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBUUQsSUFDVyxXQUFXLENBQUMsS0FBYTtRQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxlQUFlO0lBQ25ELENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUEyQkQsSUFBVyxRQUFRLENBQUMsS0FBYztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUV2QixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN6QztJQUNMLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQTRDRCxJQUNXLGtCQUFrQixDQUFDLEtBQW9CO1FBQzlDLElBQUksS0FBSyxFQUFFO1lBQ1AsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BDO0lBQ0wsQ0FBQztJQXFETSxNQUFNLENBQUMsS0FBZ0I7UUFDMUIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM5QzthQUFNO1lBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNEO1FBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFHTSxTQUFTLENBQUMsS0FBZ0I7UUFDN0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUdNLFVBQVUsQ0FBQyxLQUFnQjtRQUM5QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUdNLFdBQVcsQ0FBQyxLQUFnQjtRQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUdNLFdBQVcsQ0FBQyxLQUFnQjtRQUMvQixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3hDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN6QjtJQUNMLENBQUM7SUFnQ0QsV0FBVztRQUNQLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sYUFBYTtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNqQixNQUFNLElBQUksR0FBK0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQ3pILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUN0RTtJQUNMLENBQUM7SUFFTyxjQUFjO1FBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7U0FDOUI7SUFDTCxDQUFDO0lBRUQsaUNBQWlDO0lBQ3BCLFlBQVksQ0FBQyxJQUFnQjs7WUFDdEMsSUFBSSxPQUFPLEdBQVksTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUQsSUFBSTtnQkFDQSxJQUFJLE9BQU8sRUFBRTtvQkFDVCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pCLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQ2xCO2FBQ0o7b0JBQVM7Z0JBQ04sTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDekM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsQ0FBQztLQUFBO0lBRWEsT0FBTyxDQUFDLElBQWdCOztZQUNsQyxJQUFJLFFBQVEsR0FBWSxJQUFJLENBQUM7WUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDN0IseUJBQXlCO2dCQUN2QixtRkFBbUY7YUFDdEY7WUFDRCxJQUFJLFFBQVEsRUFBRTtnQkFDVixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO29CQUM1QixVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ2xEO2dCQUNELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25DO1FBQ0wsQ0FBQztLQUFBO0lBRU0sbUJBQW1CLENBQUMsSUFBa0I7UUFDekMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRVksZ0JBQWdCLENBQUMsS0FBVTs7WUFDcEMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUM5RSxpQ0FBaUM7Z0JBQ2pDLGdCQUFnQjtnQkFDaEIscUZBQXFGO2dCQUNyRixJQUFJLHNCQUFzQixHQUFZLElBQUksQ0FBQztnQkFDM0MsSUFBSSw2QkFBNkIsR0FBWSxJQUFJLENBQUM7Z0JBQ2xELE1BQU0sYUFBYSxHQUFXLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQzVGLE1BQU0sR0FBRyxHQUFXLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztnQkFDOUMsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDbEMsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7b0JBQzdGLElBQUksQ0FBQyxpQkFBaUIsRUFBRTt3QkFDcEIsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO3dCQUMvQixNQUFNO3FCQUNUO29CQUNELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFBLENBQUEscUVBQXFFO29CQUNsRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7d0JBQ25CLDZCQUE2QixHQUFHLEtBQUssQ0FBQzt3QkFDdEMsTUFBTTtxQkFDVDtpQkFDSjtnQkFFRCxJQUFJLENBQUMsc0JBQXNCLEVBQUU7b0JBQzNCLHlCQUF5QjtvQkFDdkIsdUpBQXVKO2lCQUMxSjtxQkFBTSxJQUFJLENBQUMsNkJBQTZCLEVBQUU7b0JBQ3ZDLGlIQUFpSDtvQkFDakgsdUhBQXVIO2lCQUMxSDtxQkFBTTtvQkFDSCxNQUFNLFVBQVUsR0FBaUIsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFFNUYsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ3hDO3lCQUFNO3dCQUNILElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFOzRCQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzt5QkFDeEM7NkJBQU07NEJBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDdkMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3lCQUNwQjtxQkFDSjtpQkFDSjthQUNKO1FBQ0wsQ0FBQztLQUFBO0lBRVksdUJBQXVCLENBQUMsU0FBcUI7O1lBQ3RELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7WUFDbkMsTUFBTSxTQUFTLEdBQVksTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckUsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ3BCO1FBQ0wsQ0FBQztLQUFBO0lBRVksU0FBUzs7WUFDbEIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFFbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFlLEVBQUUsRUFBRTtnQkFDeEYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7S0FBQTtJQUVNLDJCQUEyQjtRQUM5QixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFlLEVBQUUsRUFBRTtZQUN4RixHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyx5QkFBeUI7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ2xELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM5QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDaEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksR0FBRyxjQUFjLENBQUMsMEJBQTBCLENBQUM7UUFDaEYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDeEMscUJBQXFCO1FBQ3JCLGlGQUFpRjtRQUNqRixpRkFBaUY7UUFDakYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRU8sMkJBQTJCLENBQUMsbUJBQTRCLEtBQUs7UUFDakUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2QyxNQUFNLE9BQU8sR0FBK0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRTVILElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHdCQUF3QixHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDckosSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztRQUM5RSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDaEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQzFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5RyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQztRQUMzRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUU5QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3RFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVlLDJCQUEyQixDQUFDLEtBQWU7O1lBQ3ZELE1BQU0sYUFBYSxHQUFXLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDM0MsTUFBTSxVQUFVLEdBQWlCLEVBQUUsQ0FBQztZQUVwQyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM1QyxNQUFNLGNBQWMsR0FBZSxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0UsY0FBYyxDQUFDLEtBQUssR0FBRywwQkFBMEIsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckcsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUNuQztZQUNELE9BQU8sVUFBVSxDQUFDO1FBQ3RCLENBQUM7S0FBQTtJQUVZLFdBQVcsQ0FBQyxLQUFlOztZQUNwQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUN2QixJQUFJLGdCQUFnQixHQUFZLElBQUksQ0FBQztnQkFDckMsTUFBTSxhQUFhLEdBQVcsS0FBSyxDQUFDLE1BQU0sQ0FBQztnQkFDM0MsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7d0JBQ2xFLGdCQUFnQixHQUFHLEtBQUssQ0FBQzt3QkFDekIsTUFBTTtxQkFDVDtpQkFDSjtnQkFFRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ3JCLHlCQUF5QjtvQkFDdkIsMEtBQTBLO2lCQUM3SztxQkFBTTtvQkFDSCxNQUFNLFVBQVUsR0FBaUIsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBRS9FLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO3dCQUN0RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztxQkFDeEM7eUJBQU07d0JBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDhDQUE4Qzt3QkFDdEYsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3FCQUNwQjtpQkFDSjthQUNKO1FBQ0wsQ0FBQztLQUFBO0lBRU0sNkJBQTZCLENBQUMsS0FBZTtRQUNoRCxrQkFBa0I7UUFDbEIsNkZBQTZGO0lBQ2pHLENBQUM7SUFFYSxrQkFBa0IsQ0FBQyxJQUFVOztZQUN2QyxNQUFNLGdCQUFnQixHQUFlLE1BQU0sU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdEcsa0RBQWtEO1lBQ2xELGdCQUFnQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQzVDLGdCQUFnQixDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ3hDLG9CQUFvQjtZQUNwQiwyRUFBMkU7WUFDM0UsMkVBQTJFO1lBQzNFLGdCQUFnQixDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzNDLGdCQUFnQixDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzNDLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBRTdILElBQUksZ0JBQWdCLEVBQUU7Z0JBQ2xCLE9BQU8sZ0JBQWdCLENBQUM7YUFDM0I7UUFDTCxDQUFDO0tBQUE7SUFFYSxvQkFBb0IsQ0FBQyxLQUFvQjs7WUFDbkQsaUJBQWlCO1lBQ2pCLHdHQUF3RztZQUN4RyxtR0FBbUc7UUFDdkcsQ0FBQztLQUFBO0lBRWEsYUFBYTs7WUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BDLE9BQU8sSUFBSSxDQUFDLENBQUMsNEVBQTRFO2FBQzVGO1lBRUQsTUFBTSxNQUFNLEdBQVksTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdELE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUM7S0FBQTtJQUVhLGVBQWU7O1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFO2dCQUN0QyxPQUFPLElBQUksQ0FBQyxDQUFDLDRFQUE0RTthQUMxRjtZQUVELE1BQU0sUUFBUSxHQUFZLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRSxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO0tBQUE7SUFFTyxrQkFBa0I7UUFDdEIsTUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDekQsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxNQUFNLEtBQUssR0FBb0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRSxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssZUFBZSxDQUFDLFNBQVMsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNuRTtZQUNELElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxlQUFlLENBQUMsUUFBUSxFQUFFO2dCQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ2xFO1NBQ0o7SUFDTCxDQUFDOzs7WUE1ZkosU0FBUzs7O1lBeEJGLGlCQUFpQjtZQUxyQixnQkFBZ0I7WUFUaEIsd0JBQXdCOzs7dUJBZ0R2QixLQUFLO3dCQWFMLEtBQUs7NEJBR0wsS0FBSzswQkFHTCxLQUFLOzJCQVVMLEtBQUs7cUJBSUwsS0FBSzswQkFHTCxLQUFLOzRCQUlMLEtBQUs7d0JBSUwsS0FBSztpQ0FHTCxLQUFLO3VCQUlMLEtBQUs7OEJBY0wsS0FBSzsyQkFJTCxLQUFLOzRCQUlMLEtBQUs7OEJBR0wsS0FBSztvQ0FNTCxLQUFLO21DQUdMLEtBQUs7b0NBR0wsS0FBSzttQ0FHTCxLQUFLO2tDQUdMLEtBQUs7a0NBR0wsS0FBSzttQ0FJTCxLQUFLO2lDQU1MLEtBQUs7cUNBT0wsS0FBSzt1Q0FJTCxLQUFLO2dDQUdMLEtBQUs7MEJBSUwsS0FBSztnQ0FHTCxLQUFLO3FDQUdMLEtBQUs7cUNBS0wsS0FBSztrQ0FJTCxNQUFNOzZCQUlOLE1BQU07OEJBR04sTUFBTTtrQ0FJTixNQUFNO2tDQUdOLE1BQU07cUNBSU4sTUFBTTtxQkFHTixXQUFXLFNBQUMsY0FBYztxQkFHMUIsWUFBWSxTQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQzt3QkFjL0IsWUFBWSxTQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQzt5QkFNbEMsWUFBWSxTQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQzswQkFLbkMsWUFBWSxTQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQzswQkFNcEMsWUFBWSxTQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7QUFsSnJDO0lBREMsWUFBWSxFQUFFO21FQUM0QjtBQUkzQztJQURDLFlBQVksRUFBRTt1REFPZDtBQVFEO0lBREMsWUFBWSxFQUFFO2dFQUN3QjtBQUl2QztJQURDLFlBQVksRUFBRTs2REFDc0I7QUE0QnJDO0lBREMsWUFBWSxFQUFFO29FQUM2QjtBQUk1QztJQURDLFlBQVksRUFBRTtxRUFDOEI7QUFhN0M7SUFEQyxZQUFZLEVBQUU7dUVBQ2dDO0FBTy9DO0lBREMsWUFBWSxFQUFFO2tFQUMyQjtBQVUxQztJQURDLFlBQVksRUFBRTt1RUFDd0I7QUFJdkM7SUFEVSxZQUFZLEVBQUU7dUVBQ3VCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnRGYWN0b3J5LFxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBDb21wb25lbnRSZWYsXG4gICAgRGlyZWN0aXZlLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1NjcmVlbkNvbmZpZ0FkYXB0ZXJDb21wb25lbnR9IGZyb20gXCJAY29saWpuaXQvY29yZWNvbXBvbmVudHNfdjEyXCI7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7VGFibGVOYW1lfSBmcm9tIFwiLi4vLi4vLi4vZW51bS90YWJsZS1uYW1lLmVudW1cIjtcbmltcG9ydCB7RGljdGlvbmFyeVNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlL2RpY3Rpb25hcnkuc2VydmljZVwiO1xuaW1wb3J0IHtGaWxlVHlwZX0gZnJvbSBcIkBjb2xpam5pdC9tYWluYXBpL2J1aWxkL2VudW0vZmlsZS10eXBlLmVudW1cIjtcbmltcG9ydCB7XG4gICAgT3BlcmF0aW9uQ2FsbGJhY2tTaW1wbGVGdW5jdGlvbixcbiAgICBPcGVyYXRpb25XaXRoQWx3YXlzU3VjY2Vzc0NhbGxiYWNrXG59IGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2Uvb3BlcmF0aW9uLWNhbGxiYWNrLXNpbXBsZS1mdW5jdGlvblwiO1xuaW1wb3J0IHtJbnRlcm5hbFBhcmFtfSBmcm9tIFwiLi4vLi4vLi4vZW51bS9pbnRlcm5hbC1wYXJhbS5lbnVtXCI7XG5pbXBvcnQge0ZpbGVzVXBsb2FkQ29uZmlnT2JqZWN0c30gZnJvbSBcIi4uLy4uLy4uL2VudW0vZmlsZXMtdXBsb2FkLWNvbmZpZy1vYmplY3RzXCI7XG5pbXBvcnQge1RhZ0NhdGVnb3J5fSBmcm9tIFwiLi4vLi4vLi4vZW51bS90YWctY2F0ZWdvcnkuZW51bVwiO1xuaW1wb3J0IHtBcnJheVV0aWxzfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvYXJyYXktdXRpbHNcIjtcbmltcG9ydCB7UmVmQ29kZVV0aWxzfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVmLWNvZGUtdXRpbHNcIjtcbmltcG9ydCB7Q29Eb2N1bWVudFNoYXJlZEZpZWxkTG9naWN9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jby1kb2N1bWVudC1zaGFyZWQtZmllbGQtbG9naWNcIjtcbmltcG9ydCB7Q29Eb2N1bWVudFJpZ2h0fSBmcm9tIFwiLi4vLi4vLi4vYnVzaW5lc3NvYmplY3QvY28tZG9jdW1lbnQtcmlnaHQuYm9cIjtcbmltcG9ydCB7T2JqZWN0UmlnaHRUeXBlfSBmcm9tIFwiQGNvbGlqbml0L3NoYXJlZGFwaS9idWlsZC9lbnVtL29iamVjdC1yaWdodC10eXBlLmVudW1cIjtcbmltcG9ydCB7SW5wdXRCb29sZWFufSBmcm9tIFwiLi4vLi4vLi4vZGVjb3JhdG9yL2lucHV0LWJvb2xlYW4uZGVjb3JhdG9yXCI7XG5pbXBvcnQge0FwcEZpbGVEcm9wem9uZUNvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2FwcC1maWxlLWRyb3B6b25lL2FwcC1maWxlLWRyb3B6b25lLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtGaWxlVXRpbHN9IGZyb20gXCJAY29saWpuaXQvbWFpbmFwaS9idWlsZC91dGlscy9maWxlLXV0aWxzXCI7XG5pbXBvcnQge0NvRG9jdW1lbnR9IGZyb20gXCJAY29saWpuaXQvbWFpbmFwaS9idWlsZC9tb2RlbC9jby1kb2N1bWVudFwiO1xuaW1wb3J0IHtDb0RvY3VtZW50VHlwZX0gZnJvbSBcIkBjb2xpam5pdC9tYWluYXBpL2J1aWxkL2VudW0vY28tZG9jdW1lbnQtdHlwZS5lbnVtXCI7XG5pbXBvcnQge0ZpbGVVcGxvYWRQb3B1cENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2ZpbGUtdXBsb2FkLXBvcHVwL2ZpbGUtdXBsb2FkLXBvcHVwLmNvbXBvbmVudFwiO1xuXG5cblxuLy8gQSBiYXNlIGNvbXBvbmVudCB0aGF0IGxldHMgdGhlIHVzZXIgbWFrZSBhIGxpc3Qgb2YgZmlsZXMgZnJvbSBpdHMgZGV2aWNlLiBEb2Vzbid0IGFjdHVhbGx5IHVwbG9hZCwgYnV0IG91dHB1dHMgY2hvc2VuIGZpbGVzIGFzIGZpbGVzQ2hhbmdlZC5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VGaWxlVXBsb2FkQ29tcG9uZW50IGltcGxlbWVudHMgU2NyZWVuQ29uZmlnQWRhcHRlckNvbXBvbmVudCwgT25EZXN0cm95IHtcbiAgICBkZWNpbWFsczogbnVtYmVyO1xuICAgIGZvcmNlUmVhZG9ubHk6IGJvb2xlYW47XG4gICAgbWF4TGVuZ3RoOiBudW1iZXI7XG4gICAgb2JqZWN0Q29uZmlnTmFtZTogc3RyaW5nO1xuICAgIHJlZEVycm9yQmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICByZXF1aXJlZDogYm9vbGVhbjtcblxuICAgIC8vIFRoZSBmaWxlVHlwZSB0aGF0IHRoZSBkb2N1bWVudHMgc2hvdWxkIGJlIHNhdmVkIGFzLCBsZWF2ZSBlbXB0eSB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBmaWxldHlwZS4gQWxzbyBkZXRlcm1pbmVzIGZpbGUgcGlja2VyIGZpbHRlclxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBmaWxlVHlwZSh2YWx1ZTogRmlsZVR5cGUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9maWxlVHlwZSA9IHZhbHVlO1xuICAgICAgICAgICAgLy9UT0RPIERvY3VtZW50ZGF0YWxvYWRlciBmaXhcbiAgICAgICAgICAgIC8vdGhpcy5fY29Eb2N1bWVudERhdGFMb2FkZXIubG9hZEFsbG93ZWRUeXBlcygpLnRoZW4oKCkgPT4ge3RoaXMuaGFuZGxlQWNjZXB0ZWRGaWxlVHlwZXNMb2FkZWQodmFsdWUpfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbGVUeXBlKCk6IEZpbGVUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVUeXBlO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRvY3VtZW50czogQ29Eb2N1bWVudFtdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkb2N1bWVudFRhYmxlOiBUYWJsZU5hbWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZG9jdW1lbnRLZXkodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kb2N1bWVudEtleSA9IHZhbHVlICsgXCJcIjsgLy8gZm9yY2Ugc3RyaW5nXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkb2N1bWVudEtleSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jdW1lbnRLZXk7XG4gICAgfVxuXG4gICAgLy8gVGhlIGFiaWxpdHkgdG8gZHJvcCBmaWxlcyBvbiB0aGUgcGFnZVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGZ1bGxQYWdlRHJvcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gSWYgdXNlciBnZXRzIHRoZSBhYmlsaXR5IG9mIGFkZGluZyBmaWxlcy5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjYW5BZGQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZHJvcE1lc3NhZ2U6IHN0cmluZztcblxuICAgIC8vIFNob3cgYWRkIGJ1dHRvblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFkZFdpdGhCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLy8gSWYgdXNlciBnZXRzIHRoZSBhYmlsaXR5IG9mIGRlbGV0aW5nIGZpbGVzLlxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNhbkRlbGV0ZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIEBJbnB1dEJvb2xlYW4oKVxuICAgIHB1YmxpYyBub0RyYWdEcm9wT3JkZXJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgQElucHV0Qm9vbGVhbigpXG4gICAgcHVibGljIHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9yZWFkb25seSA9IHZhbHVlO1xuXG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCAmJiB0aGlzLl9wb3B1cC5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UucmVhZG9ubHkgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkb25seTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIEBJbnB1dEJvb2xlYW4oKVxuICAgIHB1YmxpYyBhc2tCZWZvcmVEZWxldGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBASW5wdXRCb29sZWFuKClcbiAgICBwdWJsaWMgcmVzaXplSW1hZ2VzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsb2NrT3BlcmF0aW9uOiBPcGVyYXRpb25DYWxsYmFja1NpbXBsZUZ1bmN0aW9uID0gT3BlcmF0aW9uV2l0aEFsd2F5c1N1Y2Nlc3NDYWxsYmFjaztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHVubG9ja09wZXJhdGlvbjogT3BlcmF0aW9uQ2FsbGJhY2tTaW1wbGVGdW5jdGlvbiA9IE9wZXJhdGlvbldpdGhBbHdheXNTdWNjZXNzQ2FsbGJhY2s7XG5cblxuXG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBiZWZvcmVEZWxldGVPcGVyYXRpb246IE9wZXJhdGlvbkNhbGxiYWNrU2ltcGxlRnVuY3Rpb24gPSBPcGVyYXRpb25XaXRoQWx3YXlzU3VjY2Vzc0NhbGxiYWNrO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYWZ0ZXJEZWxldGVPcGVyYXRpb246IE9wZXJhdGlvbkNhbGxiYWNrU2ltcGxlRnVuY3Rpb24gPSBPcGVyYXRpb25XaXRoQWx3YXlzU3VjY2Vzc0NhbGxiYWNrO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYmVmb3JlQ3JlYXRlT3BlcmF0aW9uOiBPcGVyYXRpb25DYWxsYmFja1NpbXBsZUZ1bmN0aW9uID0gT3BlcmF0aW9uV2l0aEFsd2F5c1N1Y2Nlc3NDYWxsYmFjaztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFmdGVyQ3JlYXRlT3BlcmF0aW9uOiBPcGVyYXRpb25DYWxsYmFja1NpbXBsZUZ1bmN0aW9uID0gT3BlcmF0aW9uV2l0aEFsd2F5c1N1Y2Nlc3NDYWxsYmFjaztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGJlZm9yZUVkaXRPcGVyYXRpb246IE9wZXJhdGlvbkNhbGxiYWNrU2ltcGxlRnVuY3Rpb24gPSBPcGVyYXRpb25XaXRoQWx3YXlzU3VjY2Vzc0NhbGxiYWNrO1xuXG4gICAgQElucHV0KClcbiAgICBASW5wdXRCb29sZWFuKClcbiAgICBwdWJsaWMgZG9udEFza0JlZm9yZURlbGV0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBASW5wdXRCb29sZWFuKClcbiAgICBwdWJsaWMgbm9Pd25EZWxldGVPcGVyYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHByaXZhdGUgX2ZpbGVUeXBlOiBGaWxlVHlwZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBtYXhVcGxvYWRTaXplUGFyYW0odmFsdWU6IEludGVybmFsUGFyYW0pIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRJbnRlcm5hbFBhcmFtT2JqKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgQElucHV0Qm9vbGVhbigpXG4gICAgcHVibGljIHVzZVdpdGhvdXRTZXR0aW5nUHJvcHM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGZpbGVzVXBsb2FkQ29uZmlnT2JqZWN0czogRmlsZXNVcGxvYWRDb25maWdPYmplY3RzO1xuXG4gICAgQElucHV0KClcbiAgICBASW5wdXRCb29sZWFuKClcbiAgICBwdWJsaWMgbWVkaWNhbFVzZXJHcm91cHM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRhZ0NhdGVnb3J5OiBUYWdDYXRlZ29yeTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRhZ1JlZmVyZW5jZVRhYmxlOiBUYWJsZU5hbWU7XG5cbiAgICBASW5wdXQoKVxuICAgIEBJbnB1dEJvb2xlYW4oKVxuICAgIHB1YmxpYyBkaXNwbGF5UmVhZFdyaXRlQWNjZXNzOiBib29sZWFuO1xuXG4gICAgLy8gVXNlIHdpdGggY3VzdG9tRmlsZURyb3BFdmVudFxuICAgIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKVxuICAgIHB1YmxpYyB1c2VDdXN0b21GaWxlRHJvcEV2ZW50OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBVc2UgaW4gY29uanVuY3Rpb24gd2l0aCB1c2VDdXN0b21GaWxlRHJvcEV2ZW50XG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGN1c3RvbUZpbGVEcm9wRXZlbnQ6IEV2ZW50RW1pdHRlcjxGaWxlTGlzdD4gPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVMaXN0PigpO1xuXG4gICAgLy8gRW1pdHMgaWYgdXNlciB3YW50cyB0byBhZGQgbXVsdGlwbGUgZG9jdW1lbnRzIGF0IG9uY2VcbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnRzQWRkZWQ6IEV2ZW50RW1pdHRlcjxDb0RvY3VtZW50W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxDb0RvY3VtZW50W10+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnREZWxldGVkOiBFdmVudEVtaXR0ZXI8Q29Eb2N1bWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPENvRG9jdW1lbnQ+KCk7XG5cbiAgICAvLyBFbWl0cyBldmVyeSB0aW1lIHRoZSBvcmRlciBvZiBkb2N1bWVudHMgd2FzIGNoYW5nZWRcbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgc29ydGFibGVMaXN0Q2hhbmdlZDogRXZlbnRFbWl0dGVyPENvRG9jdW1lbnRbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPENvRG9jdW1lbnRbXT4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBkb2N1bWVudENoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8Q29Eb2N1bWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPENvRG9jdW1lbnQ+KCk7XG5cbiAgICAvLyBVc2UgdGhpcyBpZiBjb25zdW1lciByZXF1aXJlcyB0byBwZXJmb3JtIGV4dHJhIGFjdGlvbnMsIGxpa2UgbG9ja2luZyBhIHBhcmVudCBidXNpbmVzc09iamVjdCBpZiBpdCBjb250YWlucyB0aGUgY29sbGVjdGlvbiBvZiBkb2N1bWVudHMuIEVtaXQgd2l0aCB0cnVlIHdoZW4gcG9wdXAgb3BlbmVkLCBmYWxzZSBmb3IgY2xvc2VcbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcG9wdXBPcGVuZWRTdGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuaGlkZGVuXCIpXG4gICAgcHVibGljIGhpZGRlbjogYm9vbGVhbjtcblxuICAgIEBIb3N0TGlzdGVuZXIoXCJkcm9wXCIsIFtcIiRldmVudFwiXSlcbiAgICBwdWJsaWMgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnVzZUN1c3RvbUZpbGVEcm9wRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZXNQaWNrZWQoZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRmlsZURyb3BFdmVudC5lbWl0KGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jbGVhckRyb3B6b25lKCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcImRyYWdlbmRcIiwgW1wiJGV2ZW50XCJdKVxuICAgIHB1YmxpYyBvbkRyYWdFbmQoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuY2xlYXJEYXRhKCk7XG4gICAgICAgIHRoaXMuX2NsZWFyRHJvcHpvbmUoKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwiZHJhZ292ZXJcIiwgW1wiJGV2ZW50XCJdKVxuICAgIHB1YmxpYyBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwiZHJhZ2VudGVyXCIsIFtcIiRldmVudFwiXSlcbiAgICBwdWJsaWMgb25EcmFnRW50ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9kcmFnRW50ZXJUYXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgIHRoaXMuX3Nob3dEcm9wem9uZSgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoXCJkcmFnbGVhdmVcIiwgW1wiJGV2ZW50XCJdKVxuICAgIHB1YmxpYyBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuX2RyYWdFbnRlclRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5fY2xlYXJEcm9wem9uZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRvY3VtZW50VW5kZXJFZGl0OiBDb0RvY3VtZW50O1xuICAgIHB1YmxpYyBhY2NlcHRlZFVwbG9hZEZvcm1hdHM6IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfbWF4VXBsb2FkRmlsZVNpemU6IG51bWJlcjtcblxuICAgIHByaXZhdGUgX2RyYWdFbnRlclRhcmdldDogRXZlbnRUYXJnZXQ7XG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRLZXk6IHN0cmluZyA9IFwiXCI7XG4gICAgcHJpdmF0ZSBfZHJvcFpvbmU6IENvbXBvbmVudFJlZjxBcHBGaWxlRHJvcHpvbmVDb21wb25lbnQ+O1xuICAgIHByaXZhdGUgX3BvcHVwOiBDb21wb25lbnRSZWY8RmlsZVVwbG9hZFBvcHVwQ29tcG9uZW50PjtcbiAgICBwcml2YXRlIF9kb2NDaGFuZ2VTdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIF9wb3B1cENsb3NlU3ViOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBfcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IF9kdW1teVRydWVGdW5jdGlvbjogT3BlcmF0aW9uQ2FsbGJhY2tTaW1wbGVGdW5jdGlvbiA9IChvYmplY3Q6IGFueSkgPT4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXG4gICAgY29uc3RydWN0b3IoXG5cbiAgICAgICAgLy9wcm90ZWN0ZWQgX3Byb21wdFNlcnZpY2U6IFByb21wdFNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfZGljdGlvbmFyeVNlcnZpY2U6IERpY3Rpb25hcnlTZXJ2aWNlLFxuICAgICAgICAvL3Byb3RlY3RlZCBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX2NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgcHJvdGVjdGVkIF9mYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIC8vcHJvdGVjdGVkIF9nZW5lcmFsRGFsUmVwb3NpdG9yeTogR2VuZXJhbERhbFJlcG9zaXRvcnksXG4gICAgICAgIC8vcHJvdGVjdGVkIF9kYXRhU2VydmljZTogRGF0YVNlcnZpY2UsXG4gICAgICAgIC8vcHJvdGVjdGVkIF9iYXNlRGF0YURhbFJlcG9zaXRvcnk6IEJhc2VEYXRhRGFsUmVwb3NpdG9yeSxcbiAgICAgICAgLy9wcm90ZWN0ZWQgX2NvRG9jdW1lbnREYXRhTG9hZGVyOiBDb0RvY3VtZW50RGF0YUxvYWRlclNlcnZpY2VcbiAgICApIHtcblxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jbGVhckRyb3B6b25lKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2hvd0Ryb3B6b25lKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX2Ryb3Bab25lKSB7XG4gICAgICAgICAgICBjb25zdCBmYWN0OiBDb21wb25lbnRGYWN0b3J5PEFwcEZpbGVEcm9wem9uZUNvbXBvbmVudD4gPSB0aGlzLl9mYWN0b3J5LnJlc29sdmVDb21wb25lbnRGYWN0b3J5KEFwcEZpbGVEcm9wem9uZUNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLl9kcm9wWm9uZSA9IHRoaXMuX2NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoZmFjdCk7XG4gICAgICAgICAgICB0aGlzLl9kcm9wWm9uZS5pbnN0YW5jZS5jdXN0b21Ecm9wQWN0aW9uTWVzc2FnZSA9IHRoaXMuZHJvcE1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9jbGVhckRyb3B6b25lKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jb250YWluZXIuY2xlYXIoKTtcbiAgICAgICAgaWYgKHRoaXMuX2Ryb3Bab25lKSB7XG4gICAgICAgICAgICB0aGlzLl9kcm9wWm9uZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl9kcm9wWm9uZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBmaWxlIGZyb20gdXBsb2FkIGFycmF5LlxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVEZWxldGUoZmlsZTogQ29Eb2N1bWVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBsZXQgc3VjY2VzczogYm9vbGVhbiA9IGF3YWl0IHRoaXMuYmVmb3JlRGVsZXRlT3BlcmF0aW9uKGZpbGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWxldGUoZmlsZSk7XG4gICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFmdGVyRGVsZXRlT3BlcmF0aW9uKGZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3VjY2Vzcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZGVsZXRlKGZpbGU6IENvRG9jdW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGRvRGVsZXRlOiBib29sZWFuID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmRvbnRBc2tCZWZvcmVEZWxldGUpIHtcbiAgICAgICAgICAvL1RPRE8gbWFrZSBkaWFsb2dTZXJ2aWNlXG4gICAgICAgICAgICAvL2RvRGVsZXRlID0gYXdhaXQgdGhpcy5fcHJvbXB0U2VydmljZS5zaG93WWVzTm8oXCJNRVNTQUdFX0RFTEVURV9SRUNPUkRfUVVFU1RJT05cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvRGVsZXRlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubm9Pd25EZWxldGVPcGVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBBcnJheVV0aWxzLlJlbW92ZUVsZW1lbnQoZmlsZSwgdGhpcy5kb2N1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudERlbGV0ZWQuZW1pdChmaWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVTb3J0aW5nQ2hhbmdlKGRvY3M6IENvRG9jdW1lbnRbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNvcnRhYmxlTGlzdENoYW5nZWQuZW1pdChkb2NzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlRmlsZUNoYW5nZShldmVudDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LmZpbGVzICYmIGV2ZW50LnRhcmdldC5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBmaWxlIHNpemVzIGFuZCBleHRlbnNpb25cbiAgICAgICAgICAgIC8vVG9kbzogZml4IHRoaXNcbiAgICAgICAgICAgIC8vY29uc3QgYWxsb3dlZEV4dGVuc2lvbnMgPSBhd2FpdCB0aGlzLl9iYXNlRGF0YURhbFJlcG9zaXRvcnkuZ2V0QWxsb3dlZEV4dGVuc2lvbnMoKTtcbiAgICAgICAgICAgIGxldCBhbGxGaWxlc0FyZVNtYWxsRW5vdWdoOiBib29sZWFuID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBhbGxGaWxlc0hhdmVBbGxvd2VkRXh0ZW5zaW9uczogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBzaXplVG9Db21wYXJlOiBudW1iZXIgPSB0aGlzLl9tYXhVcGxvYWRGaWxlU2l6ZSA/IHRoaXMuX21heFVwbG9hZEZpbGVTaXplIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSBldmVudC50YXJnZXQuZmlsZXMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXBsb2FkU2l6ZUFsbG93ZWQgPSBGaWxlVXRpbHMuQ2hlY2tNYXhVcGxvYWRTaXplKGV2ZW50LnRhcmdldC5maWxlc1tpXSwgc2l6ZVRvQ29tcGFyZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF1cGxvYWRTaXplQWxsb3dlZCkge1xuICAgICAgICAgICAgICAgICAgICBhbGxGaWxlc0FyZVNtYWxsRW5vdWdoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBleHRlbnNpb25BbGxvd2VkID0gdHJ1ZS8vRmlsZVV0aWxzLkNoZWNrRXh0ZW5zaW9uKGV2ZW50LnRhcmdldC5maWxlc1tpXSwgYWxsb3dlZEV4dGVuc2lvbnMpO1xuICAgICAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uQWxsb3dlZCkge1xuICAgICAgICAgICAgICAgICAgICBhbGxGaWxlc0hhdmVBbGxvd2VkRXh0ZW5zaW9ucyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghYWxsRmlsZXNBcmVTbWFsbEVub3VnaCkge1xuICAgICAgICAgICAgICAvL1RPRE8gbWFrZSBkaWFsb2dTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLy90aGlzLl9wcm9tcHRTZXJ2aWNlLnNob3dXYXJuaW5nKHRoaXMuX2RpY3Rpb25hcnlTZXJ2aWNlLmdldChcIkZJTEVfVE9PX0xBUkdFX1RPX1VQTE9BRFwiLCB0cnVlLCBcIlwiICsgW0ZpbGVVdGlscy5nZXRNYXhVcGxvYWRTaXplSW5NYihzaXplVG9Db21wYXJlKV0pKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFsbEZpbGVzSGF2ZUFsbG93ZWRFeHRlbnNpb25zKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zdCBleHRlbnNpb25zTGlzdCA9IGFsbG93ZWRFeHRlbnNpb25zLm1hcChhbGxvd2VkRXh0ZW5zaW9uID0+IGFsbG93ZWRFeHRlbnNpb24uZXh0ZW5zaW9uKS5zb3J0KCkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgIC8vdGhpcy5fcHJvbXB0U2VydmljZS5zaG93V2FybmluZyh0aGlzLl9kaWN0aW9uYXJ5U2VydmljZS5nZXQoXCJGSUxFX0hBU19ESVNBTExPV0VEX0VYVEVOU0lPTlwiLCBmYWxzZSwgZXh0ZW5zaW9uc0xpc3QpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZXNUb0FkZDogQ29Eb2N1bWVudFtdID0gYXdhaXQgdGhpcy5jb252ZXJ0RmlsZXNJbnRvQ29Eb2N1bWVudHMoZXZlbnQudGFyZ2V0LmZpbGVzKTtcblxuICAgICAgICAgICAgICAgIGlmIChmaWxlc1RvQWRkLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudHNBZGRlZC5lbWl0KGZpbGVzVG9BZGQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzZVdpdGhvdXRTZXR0aW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRzQWRkZWQubmV4dChmaWxlc1RvQWRkKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRVbmRlckVkaXQgPSBmaWxlc1RvQWRkWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuUG9wdXAoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVFZGl0RG9jdW1lbnRDbGljayhkb2NUb0VkaXQ6IENvRG9jdW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5kb2N1bWVudFVuZGVyRWRpdCA9IGRvY1RvRWRpdDtcbiAgICAgICAgY29uc3Qgc2hvd1BvcHVwOiBib29sZWFuID0gYXdhaXQgdGhpcy5iZWZvcmVFZGl0T3BlcmF0aW9uKGRvY1RvRWRpdCk7XG4gICAgICAgIGlmIChzaG93UG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMub3BlblBvcHVwKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb3BlblBvcHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLl9jcmVhdGVBbmRGaWxsUG9wdXBJbnN0YW5jZSgpO1xuXG4gICAgICAgIHRoaXMuX2RvY0NoYW5nZVN1YiA9IHRoaXMuX3BvcHVwLmluc3RhbmNlLmRvY3VtZW50Q2hhbmdlRXZlbnQuc3Vic2NyaWJlKChkb2M6IENvRG9jdW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRDaGFuZ2VFdmVudC5lbWl0KGRvYyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuUG9wdXBUb0FkZERvY3VtZW50QnlVcmwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NyZWF0ZURvY3VtZW50VG9BZGRCeVVybCgpO1xuICAgICAgICB0aGlzLl9jcmVhdGVBbmRGaWxsUG9wdXBJbnN0YW5jZSh0cnVlKTtcblxuICAgICAgICB0aGlzLl9kb2NDaGFuZ2VTdWIgPSB0aGlzLl9wb3B1cC5pbnN0YW5jZS5kb2N1bWVudENoYW5nZUV2ZW50LnN1YnNjcmliZSgoZG9jOiBDb0RvY3VtZW50KSA9PiB7XG4gICAgICAgICAgICBkb2MuZmlsZU5hbWUgPSBkb2MuZmlsZVBhdGg7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50Q2hhbmdlRXZlbnQuZW1pdChkb2MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jcmVhdGVEb2N1bWVudFRvQWRkQnlVcmwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRVbmRlckVkaXQgPSBuZXcgQ29Eb2N1bWVudCgpO1xuICAgICAgICB0aGlzLmRvY3VtZW50VW5kZXJFZGl0LnRhYmxlID0gdGhpcy5kb2N1bWVudFRhYmxlO1xuICAgICAgICB0aGlzLmRvY3VtZW50VW5kZXJFZGl0LmtleSA9IHRoaXMuZG9jdW1lbnRLZXk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRVbmRlckVkaXQuZmlsZVR5cGUgPSB0aGlzLmZpbGVUeXBlO1xuICAgICAgICB0aGlzLmRvY3VtZW50VW5kZXJFZGl0LmRvY3VtZW50VHlwZSA9IENvRG9jdW1lbnRUeXBlLlNhdmVBc0xpbmtPblJhbmRvbUxvY2F0aW9uO1xuICAgICAgICB0aGlzLmRvY3VtZW50VW5kZXJFZGl0LnBhdGhJc1VybCA9IHRydWU7XG4gICAgICAgIC8vVE9ETyBGaXggdXNlciBJbnB1dFxuICAgICAgICAvL3RoaXMuZG9jdW1lbnRVbmRlckVkaXQuY3JlYXRpb25Vc2VyID0gdGhpcy5fdXNlclNlcnZpY2UudXNlck5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgLy90aGlzLmRvY3VtZW50VW5kZXJFZGl0Lm1vZGlmaWVkVXNlciA9IHRoaXMuX3VzZXJTZXJ2aWNlLnVzZXJOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRVbmRlckVkaXQuY3JlYXRpb25EYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5tb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NyZWF0ZUFuZEZpbGxQb3B1cEluc3RhbmNlKGFkZERvY3VtZW50QnlVcmw6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnBvcHVwT3BlbmVkU3RhdGVDaGFuZ2UuZW1pdCh0cnVlKTtcblxuICAgICAgICBjb25zdCBmYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5PEZpbGVVcGxvYWRQb3B1cENvbXBvbmVudD4gPSB0aGlzLl9mYWN0b3J5LnJlc29sdmVDb21wb25lbnRGYWN0b3J5KEZpbGVVcGxvYWRQb3B1cENvbXBvbmVudCk7XG5cbiAgICAgICAgdGhpcy5fcG9wdXAgPSB0aGlzLl9jb250YWluZXIuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnkpO1xuXG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLnJlYWRvbmx5ID0gdGhpcy5fcmVhZG9ubHk7XG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLmFkZERvY3VtZW50QnlVcmwgPSBhZGREb2N1bWVudEJ5VXJsO1xuICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS5oYXNQdWJsaWNBY2Nlc3NWaXNpYmxlID0gdGhpcy5kb2N1bWVudFRhYmxlID09PSBUYWJsZU5hbWUuR29vZHM7XG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLnNob3dEb2N1bWVudFJlcG9ydFBpY2tlciA9ICh0aGlzLmRvY3VtZW50VGFibGUgPT09IFRhYmxlTmFtZS5UcmFuc2FjdGlvbnMgfHwgdGhpcy5kb2N1bWVudFRhYmxlID09PSBUYWJsZU5hbWUuVHJhbnNhY3Rpb25MaW5lcyk7XG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLmRvY3VtZW50VW5kZXJFZGl0ID0gdGhpcy5kb2N1bWVudFVuZGVyRWRpdDtcbiAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UuZmlsZXNVcGxvYWRDb25maWdPYmplY3RzID0gdGhpcy5maWxlc1VwbG9hZENvbmZpZ09iamVjdHM7XG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLm1lZGljYWxVc2VyR3JvdXBzID0gdGhpcy5tZWRpY2FsVXNlckdyb3VwcztcbiAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UudGFnQ2F0ZWdvcnkgPSB0aGlzLnRhZ0NhdGVnb3J5O1xuICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS5kaXNwbGF5UmVhZFdyaXRlQWNjZXNzID0gdGhpcy5kaXNwbGF5UmVhZFdyaXRlQWNjZXNzO1xuICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS50YWdSZWZlcmVuY2VUYWJsZSA9IHRoaXMudGFnUmVmZXJlbmNlVGFibGU7XG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLnB1YmxpY2F0aW9uSWRzID0gUmVmQ29kZVV0aWxzLkdldE11bHRpUmVmQ29kZUNob2ljZXModGhpcy5kb2N1bWVudFVuZGVyRWRpdC5wdWJsaWNhdGlvbik7XG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLnN0b3JlR3JvdXBJZHMgPSB0aGlzLmRvY3VtZW50VW5kZXJFZGl0LnJldGFpbEZvcm11bGFzO1xuICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS5maWxlVHlwZSA9IHRoaXMuZmlsZVR5cGU7XG5cbiAgICAgICAgdGhpcy5fcHJlcGFyZUZpbGVSaWdodHMoKTtcblxuICAgICAgICB0aGlzLl9wb3B1cENsb3NlU3ViID0gdGhpcy5fcG9wdXAuaW5zdGFuY2UucG9wdXBDbG9zZUV2ZW50LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl91bmxvY2tEb2N1bWVudCgpO1xuICAgICAgICAgICAgdGhpcy5wb3B1cE9wZW5lZFN0YXRlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5fcG9wdXBDbG9zZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5fZG9jQ2hhbmdlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGNvbnZlcnRGaWxlc0ludG9Db0RvY3VtZW50cyhmaWxlczogRmlsZUxpc3QpOiBQcm9taXNlPENvRG9jdW1lbnRbXT4ge1xuICAgICAgICBjb25zdCBhbW91bnRPZkZpbGVzOiBudW1iZXIgPSBmaWxlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZpbGVzVG9BZGQ6IENvRG9jdW1lbnRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBhbW91bnRPZkZpbGVzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVBc0RvY3VtZW50OiBDb0RvY3VtZW50ID0gYXdhaXQgdGhpcy5fZ2V0RmlsZUFzRG9jdW1lbnQoZmlsZXNbaV0pO1xuICAgICAgICAgICAgZmlsZUFzRG9jdW1lbnQuaW5kZXggPSBDb0RvY3VtZW50U2hhcmVkRmllbGRMb2dpYy5HZW5lcmF0ZUF2YWlsYWJsZUluZGV4TnIodGhpcy5kb2N1bWVudHMgfHwgW10pICsgaTtcbiAgICAgICAgICAgIGZpbGVzVG9BZGQucHVzaChmaWxlQXNEb2N1bWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGVzVG9BZGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbGVzUGlja2VkKGZpbGVzOiBGaWxlTGlzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgYWxsRmlsZXNBcmVWYWxpZDogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBhbW91bnRPZkZpbGVzOiBudW1iZXIgPSBmaWxlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYW1vdW50T2ZGaWxlczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFGaWxlVXRpbHMuQ2hlY2tNYXhVcGxvYWRTaXplKGZpbGVzW2ldLCB0aGlzLl9tYXhVcGxvYWRGaWxlU2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRmlsZXNBcmVWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghYWxsRmlsZXNBcmVWYWxpZCkge1xuICAgICAgICAgICAgICAvL1RPRE8gbWFrZSBkaWFsb2dTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLy90aGlzLl9wcm9tcHRTZXJ2aWNlLnNob3dXYXJuaW5nKHRoaXMuX2RpY3Rpb25hcnlTZXJ2aWNlLmdldChcIkZJTEVfVE9PX0xBUkdFX1RPX1VQTE9BRFwiLCB0cnVlLCBcIlwiICsgRmlsZVV0aWxzLmdldE1heFVwbG9hZFNpemVJbk1iKHRoaXMuX21heFVwbG9hZEZpbGVTaXplKS50b1N0cmluZygpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVzVG9BZGQ6IENvRG9jdW1lbnRbXSA9IGF3YWl0IHRoaXMuY29udmVydEZpbGVzSW50b0NvRG9jdW1lbnRzKGZpbGVzKTtcblxuICAgICAgICAgICAgICAgIGlmIChmaWxlc1RvQWRkLmxlbmd0aCA+IDEgfHwgdGhpcy51c2VXaXRob3V0U2V0dGluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRzQWRkZWQuZW1pdChmaWxlc1RvQWRkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VW5kZXJFZGl0ID0gZmlsZXNUb0FkZFswXTsgLy8gU2V0dGluZyBkb2NVbmRlckVkaXQgb3BlbnMgdGhlIHBvcHVwIHdpbmRvd1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5Qb3B1cCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVBY2NlcHRlZEZpbGVUeXBlc0xvYWRlZCh2YWx1ZTogRmlsZVR5cGUpOiB2b2lkIHtcbiAgICAgICAgLy9UT0RPIGZpeCBsb2FkaW5nXG4gICAgICAgIC8vdGhpcy5hY2NlcHRlZFVwbG9hZEZvcm1hdHMgPSB0aGlzLl9jb0RvY3VtZW50RGF0YUxvYWRlci5nZXRBbGxvd2VkRXh0ZW5zaW9uc0ZvclR5cGUodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2dldEZpbGVBc0RvY3VtZW50KGZpbGU6IEZpbGUpOiBQcm9taXNlPENvRG9jdW1lbnQ+IHtcbiAgICAgICAgY29uc3QgZmlsZUFzQ29Eb2N1bWVudDogQ29Eb2N1bWVudCA9IGF3YWl0IEZpbGVVdGlscy5SZWFkRmlsZUFzTmV3Q29Eb2N1bWVudChmaWxlLCB0aGlzLnJlc2l6ZUltYWdlcyk7XG4gICAgICAgIC8vIHNldCBzb21lIGV4dHJhIGtub3duIGZpZWxkcyBmb3IgdGhlIGNvZG9jdW1lbnQ6XG4gICAgICAgIGZpbGVBc0NvRG9jdW1lbnQudGFibGUgPSB0aGlzLmRvY3VtZW50VGFibGU7XG4gICAgICAgIGZpbGVBc0NvRG9jdW1lbnQua2V5ID0gdGhpcy5kb2N1bWVudEtleTtcbiAgICAgICAgLy9UT0RPIGZpeCBhZGQgdXNlcnNcbiAgICAgICAgLy9maWxlQXNDb0RvY3VtZW50LmNyZWF0aW9uVXNlciA9IHRoaXMuX3VzZXJTZXJ2aWNlLnVzZXJOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIC8vZmlsZUFzQ29Eb2N1bWVudC5tb2RpZmllZFVzZXIgPSB0aGlzLl91c2VyU2VydmljZS51c2VyTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBmaWxlQXNDb0RvY3VtZW50LmNyZWF0aW9uRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGZpbGVBc0NvRG9jdW1lbnQubW9kaWZpZWREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgZmlsZUFzQ29Eb2N1bWVudC5maWxlVHlwZSA9IHRoaXMuZmlsZVR5cGUgPyB0aGlzLmZpbGVUeXBlIDogRmlsZVV0aWxzLklzSW1hZ2VGaWxlKGZpbGUpID8gRmlsZVR5cGUuSW1hZ2UgOiBGaWxlVHlwZS5Eb2N1bWVudDtcblxuICAgICAgICBpZiAoZmlsZUFzQ29Eb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbGVBc0NvRG9jdW1lbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9zZXRJbnRlcm5hbFBhcmFtT2JqKHZhbHVlOiBJbnRlcm5hbFBhcmFtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vVE9ETyBmaXggcGFyYW1zXG4gICAgICAgIC8vY29uc3QgcGFyYW06IEludGVybmFsUGFyYW1ldGVyT2JqZWN0ID0gYXdhaXQgdGhpcy5fZ2VuZXJhbERhbFJlcG9zaXRvcnkuZ2V0SW50ZXJuYWxQYXJhbU9iamVjdCh2YWx1ZSk7XG4gICAgICAgIC8vdGhpcy5fbWF4VXBsb2FkRmlsZVNpemUgPSBpc05hTihwYXJzZUludChwYXJhbS52YWx1ZSwgMCkpID8gdW5kZWZpbmVkIDogcGFyc2VJbnQocGFyYW0udmFsdWUsIDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2xvY2tEb2N1bWVudCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKCF0aGlzLmRvY3VtZW50VW5kZXJFZGl0LmRvY3VtZW50SWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBOZXcgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBJRCBhbmQgdGhlcmVmb3JlIGRvZXMgbm90IGhhdmUgdG8gYmUgbG9ja2VkXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrT2s6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmxvY2tPcGVyYXRpb24oQ29Eb2N1bWVudCk7XG4gICAgICAgIHJldHVybiBsb2NrT2s7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfdW5sb2NrRG9jdW1lbnQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBpZiAoIXRoaXMuZG9jdW1lbnRVbmRlckVkaXQuZG9jdW1lbnRJZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gTmV3IGRvY3VtZW50IGRvZXMgbm90IGhhdmUgYW4gSUQgYW5kIHRoZXJlZm9yZSBkb2VzIG5vdCBoYXZlIHRvIGJlIGxvY2tlZFxuICAgICAgfVxuXG4gICAgICBjb25zdCB1bmxvY2tPazogYm9vbGVhbiA9IGF3YWl0IHRoaXMudW5sb2NrT3BlcmF0aW9uKENvRG9jdW1lbnQpO1xuICAgICAgcmV0dXJuIHVubG9ja09rO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVGaWxlUmlnaHRzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMuZG9jdW1lbnRVbmRlckVkaXQucmlnaHRzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByaWdodDogQ29Eb2N1bWVudFJpZ2h0ID0gdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5yaWdodHNbaV07XG4gICAgICAgICAgICBpZiAocmlnaHQucmlnaHRMZXZlbCA9PT0gT2JqZWN0UmlnaHRUeXBlLlJlYWRXcml0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLnVzZXJHcm91cHNGb3JXcml0ZS5wdXNoKHJpZ2h0LnVzZXJHcm91cElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyaWdodC5yaWdodExldmVsID09PSBPYmplY3RSaWdodFR5cGUuUmVhZE9ubHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS51c2VyR3JvdXBzRm9yUmVhZC5wdXNoKHJpZ2h0LnVzZXJHcm91cElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
1
+ import { __awaiter, __decorate } from "tslib";
2
+ import { ComponentFactoryResolver, Directive, EventEmitter, HostBinding, HostListener, Input, Output, ViewContainerRef } from "@angular/core";
3
+ import { TableName } from "../../../enum/table-name.enum";
4
+ import { DictionaryService } from "../../../service/dictionary.service";
5
+ import { FileType } from "@colijnit/mainapi/build/enum/file-type.enum";
6
+ import { OperationWithAlwaysSuccessCallback } from "../../../interface/operation-callback-simple-function";
7
+ import { ArrayUtils } from "../../../utils/array-utils";
8
+ import { RefCodeUtils } from "../../../utils/ref-code-utils";
9
+ import { CoDocumentSharedFieldLogic } from "../../../utils/co-document-shared-field-logic";
10
+ import { ObjectRightType } from "@colijnit/sharedapi/build/enum/object-right-type.enum";
11
+ import { InputBoolean } from "../../../decorator/input-boolean.decorator";
12
+ import { AppFileDropzoneComponent } from "../../app-file-dropzone/app-file-dropzone.component";
13
+ import { FileUtils } from "@colijnit/mainapi/build/utils/file-utils";
14
+ import { CoDocument } from "@colijnit/mainapi/build/model/co-document";
15
+ import { CoDocumentType } from "@colijnit/mainapi/build/enum/co-document-type.enum";
16
+ import { FileUploadPopupComponent } from "../../file-upload-popup/file-upload-popup.component";
17
+ // A base component that lets the user make a list of files from its device. Doesn't actually upload, but outputs chosen files as filesChanged.
18
+ export class BaseFileUploadComponent {
19
+ // private static readonly _dummyTrueFunction: OperationCallbackSimpleFunction = (object: any) => Promise.resolve(true);
20
+ constructor(
21
+ //protected _promptService: PromptService,
22
+ _dictionaryService,
23
+ //protected _userService: UserService,
24
+ _container, _factory) {
25
+ this._dictionaryService = _dictionaryService;
26
+ this._container = _container;
27
+ this._factory = _factory;
28
+ this.documents = [];
29
+ // The ability to drop files on the page
30
+ this.fullPageDrop = false;
31
+ // If user gets the ability of adding files.
32
+ this.canAdd = true;
33
+ // Show add button
34
+ this.addWithButton = true;
35
+ // If user gets the ability of deleting files.
36
+ this.canDelete = true;
37
+ this.noDragDropOrdering = false;
38
+ this.askBeforeDelete = true;
39
+ this.resizeImages = false;
40
+ this.lockOperation = OperationWithAlwaysSuccessCallback;
41
+ this.unlockOperation = OperationWithAlwaysSuccessCallback;
42
+ this.beforeDeleteOperation = OperationWithAlwaysSuccessCallback;
43
+ this.afterDeleteOperation = OperationWithAlwaysSuccessCallback;
44
+ this.beforeCreateOperation = OperationWithAlwaysSuccessCallback;
45
+ this.afterCreateOperation = OperationWithAlwaysSuccessCallback;
46
+ this.beforeEditOperation = OperationWithAlwaysSuccessCallback;
47
+ this.dontAskBeforeDelete = false;
48
+ this.noOwnDeleteOperation = false;
49
+ this.useWithoutSettingProps = false;
50
+ this.medicalUserGroups = false;
51
+ // Use with customFileDropEvent
52
+ this.useCustomFileDropEvent = false;
53
+ // Use in conjunction with useCustomFileDropEvent
54
+ this.customFileDropEvent = new EventEmitter();
55
+ // Emits if user wants to add multiple documents at once
56
+ this.documentsAdded = new EventEmitter();
57
+ this.documentDeleted = new EventEmitter();
58
+ // Emits every time the order of documents was changed
59
+ this.sortableListChanged = new EventEmitter();
60
+ this.documentChangeEvent = new EventEmitter();
61
+ // Use this if consumer requires to perform extra actions, like locking a parent businessObject if it contains the collection of documents. Emit with true when popup opened, false for close
62
+ this.popupOpenedStateChange = new EventEmitter();
63
+ this._documentKey = "";
64
+ this._readonly = false;
65
+ }
66
+ // The fileType that the documents should be saved as, leave empty to automatically detect filetype. Also determines file picker filter
67
+ set fileType(value) {
68
+ if (value) {
69
+ this._fileType = value;
70
+ //TODO Documentdataloader fix
71
+ //this._coDocumentDataLoader.loadAllowedTypes().then(() => {this.handleAcceptedFileTypesLoaded(value)});
72
+ }
73
+ }
74
+ get fileType() {
75
+ return this._fileType;
76
+ }
77
+ set documentKey(value) {
78
+ this._documentKey = value + ""; // force string
79
+ }
80
+ get documentKey() {
81
+ return this._documentKey;
82
+ }
83
+ set readonly(value) {
84
+ this._readonly = value;
85
+ if (this._popup && this._popup.instance) {
86
+ this._popup.instance.readonly = value;
87
+ }
88
+ }
89
+ get readonly() {
90
+ return this._readonly;
91
+ }
92
+ set maxUploadSizeParam(value) {
93
+ if (value) {
94
+ this._setInternalParamObj(value);
95
+ }
96
+ }
97
+ onDrop(event) {
98
+ event.preventDefault();
99
+ event.stopPropagation();
100
+ if (!this.useCustomFileDropEvent) {
101
+ this.filesPicked(event.dataTransfer.files);
102
+ }
103
+ else {
104
+ this.customFileDropEvent.emit(event.dataTransfer.files);
105
+ }
106
+ this._clearDropzone();
107
+ }
108
+ onDragEnd(event) {
109
+ event.dataTransfer.clearData();
110
+ this._clearDropzone();
111
+ }
112
+ onDragOver(event) {
113
+ event.preventDefault();
114
+ }
115
+ onDragEnter(event) {
116
+ this._dragEnterTarget = event.target;
117
+ this._showDropzone();
118
+ }
119
+ onDragLeave(event) {
120
+ if (event.target === this._dragEnterTarget) {
121
+ this._clearDropzone();
122
+ }
123
+ }
124
+ ngOnDestroy() {
125
+ this._clearDropzone();
126
+ }
127
+ _showDropzone() {
128
+ if (!this._dropZone) {
129
+ const fact = this._factory.resolveComponentFactory(AppFileDropzoneComponent);
130
+ this._dropZone = this._container.createComponent(fact);
131
+ this._dropZone.instance.customDropActionMessage = this.dropMessage;
132
+ }
133
+ }
134
+ _clearDropzone() {
135
+ this._container.clear();
136
+ if (this._dropZone) {
137
+ this._dropZone.destroy();
138
+ this._dropZone = undefined;
139
+ }
140
+ }
141
+ // Remove file from upload array.
142
+ handleDelete(file) {
143
+ return __awaiter(this, void 0, void 0, function* () {
144
+ let success = yield this.beforeDeleteOperation(file);
145
+ try {
146
+ if (success) {
147
+ yield this._delete(file);
148
+ success = true;
149
+ }
150
+ }
151
+ finally {
152
+ yield this.afterDeleteOperation(file);
153
+ }
154
+ return Promise.resolve(success);
155
+ });
156
+ }
157
+ _delete(file) {
158
+ return __awaiter(this, void 0, void 0, function* () {
159
+ let doDelete = true;
160
+ if (!this.dontAskBeforeDelete) {
161
+ //TODO make dialogService
162
+ //doDelete = await this._promptService.showYesNo("MESSAGE_DELETE_RECORD_QUESTION");
163
+ }
164
+ if (doDelete) {
165
+ if (!this.noOwnDeleteOperation) {
166
+ ArrayUtils.RemoveElement(file, this.documents);
167
+ }
168
+ this.documentDeleted.emit(file);
169
+ }
170
+ });
171
+ }
172
+ handleSortingChange(docs) {
173
+ this.sortableListChanged.emit(docs);
174
+ }
175
+ handleFileChange(event) {
176
+ return __awaiter(this, void 0, void 0, function* () {
177
+ if (event && event.target && event.target.files && event.target.files.length > 0) {
178
+ // check file sizes and extension
179
+ //Todo: fix this
180
+ //const allowedExtensions = await this._baseDataDalRepository.getAllowedExtensions();
181
+ let allFilesAreSmallEnough = true;
182
+ let allFilesHaveAllowedExtensions = true;
183
+ const sizeToCompare = this._maxUploadFileSize ? this._maxUploadFileSize : undefined;
184
+ const len = event.target.files.length;
185
+ for (let i = 0; i < len; i++) {
186
+ const uploadSizeAllowed = FileUtils.CheckMaxUploadSize(event.target.files[i], sizeToCompare);
187
+ if (!uploadSizeAllowed) {
188
+ allFilesAreSmallEnough = false;
189
+ break;
190
+ }
191
+ const extensionAllowed = true; //FileUtils.CheckExtension(event.target.files[i], allowedExtensions);
192
+ if (!extensionAllowed) {
193
+ allFilesHaveAllowedExtensions = false;
194
+ break;
195
+ }
196
+ }
197
+ if (!allFilesAreSmallEnough) {
198
+ //TODO make dialogService
199
+ //this._promptService.showWarning(this._dictionaryService.get("FILE_TOO_LARGE_TO_UPLOAD", true, "" + [FileUtils.getMaxUploadSizeInMb(sizeToCompare)]));
200
+ }
201
+ else if (!allFilesHaveAllowedExtensions) {
202
+ //const extensionsList = allowedExtensions.map(allowedExtension => allowedExtension.extension).sort().join(", ");
203
+ //this._promptService.showWarning(this._dictionaryService.get("FILE_HAS_DISALLOWED_EXTENSION", false, extensionsList));
204
+ }
205
+ else {
206
+ const filesToAdd = yield this.convertFilesIntoCoDocuments(event.target.files);
207
+ if (filesToAdd.length > 1) {
208
+ this.documentsAdded.emit(filesToAdd);
209
+ }
210
+ else {
211
+ if (this.useWithoutSettingProps) {
212
+ this.documentsAdded.next(filesToAdd);
213
+ }
214
+ else {
215
+ this.documentUnderEdit = filesToAdd[0];
216
+ this.openPopup();
217
+ }
218
+ }
219
+ }
220
+ }
221
+ });
222
+ }
223
+ handleEditDocumentClick(docToEdit) {
224
+ return __awaiter(this, void 0, void 0, function* () {
225
+ this.documentUnderEdit = docToEdit;
226
+ const showPopup = yield this.beforeEditOperation(docToEdit);
227
+ if (showPopup) {
228
+ this.openPopup();
229
+ }
230
+ });
231
+ }
232
+ openPopup() {
233
+ return __awaiter(this, void 0, void 0, function* () {
234
+ this._createAndFillPopupInstance();
235
+ this._docChangeSub = this._popup.instance.documentChangeEvent.subscribe((doc) => {
236
+ this.documentChangeEvent.emit(doc);
237
+ });
238
+ });
239
+ }
240
+ openPopupToAddDocumentByUrl() {
241
+ this._createDocumentToAddByUrl();
242
+ this._createAndFillPopupInstance(true);
243
+ this._docChangeSub = this._popup.instance.documentChangeEvent.subscribe((doc) => {
244
+ doc.fileName = doc.filePath;
245
+ this.documentChangeEvent.emit(doc);
246
+ });
247
+ }
248
+ _createDocumentToAddByUrl() {
249
+ this.documentUnderEdit = new CoDocument();
250
+ this.documentUnderEdit.table = this.documentTable;
251
+ this.documentUnderEdit.key = this.documentKey;
252
+ this.documentUnderEdit.fileType = this.fileType;
253
+ this.documentUnderEdit.documentType = CoDocumentType.SaveAsLinkOnRandomLocation;
254
+ this.documentUnderEdit.pathIsUrl = true;
255
+ //TODO Fix user Input
256
+ //this.documentUnderEdit.creationUser = this._userService.userName.toUpperCase();
257
+ //this.documentUnderEdit.modifiedUser = this._userService.userName.toUpperCase();
258
+ this.documentUnderEdit.creationDate = new Date();
259
+ this.documentUnderEdit.modifiedDate = new Date();
260
+ }
261
+ _createAndFillPopupInstance(addDocumentByUrl = false) {
262
+ this.popupOpenedStateChange.emit(true);
263
+ const factory = this._factory.resolveComponentFactory(FileUploadPopupComponent);
264
+ this._popup = this._container.createComponent(factory);
265
+ this._popup.instance.readonly = this._readonly;
266
+ this._popup.instance.addDocumentByUrl = addDocumentByUrl;
267
+ this._popup.instance.hasPublicAccessVisible = this.documentTable === TableName.Goods;
268
+ this._popup.instance.showDocumentReportPicker = (this.documentTable === TableName.Transactions || this.documentTable === TableName.TransactionLines);
269
+ this._popup.instance.documentUnderEdit = this.documentUnderEdit;
270
+ this._popup.instance.filesUploadConfigObjects = this.filesUploadConfigObjects;
271
+ this._popup.instance.medicalUserGroups = this.medicalUserGroups;
272
+ this._popup.instance.tagCategory = this.tagCategory;
273
+ this._popup.instance.displayReadWriteAccess = this.displayReadWriteAccess;
274
+ this._popup.instance.tagReferenceTable = this.tagReferenceTable;
275
+ this._popup.instance.publicationIds = RefCodeUtils.GetMultiRefCodeChoices(this.documentUnderEdit.publication);
276
+ this._popup.instance.storeGroupIds = this.documentUnderEdit.retailFormulas;
277
+ this._popup.instance.fileType = this.fileType;
278
+ this._prepareFileRights();
279
+ this._popupCloseSub = this._popup.instance.popupCloseEvent.subscribe(() => {
280
+ this._unlockDocument();
281
+ this.popupOpenedStateChange.emit(false);
282
+ this._popupCloseSub.unsubscribe();
283
+ this._docChangeSub.unsubscribe();
284
+ this._popup.destroy();
285
+ this._popup = undefined;
286
+ });
287
+ }
288
+ convertFilesIntoCoDocuments(files) {
289
+ return __awaiter(this, void 0, void 0, function* () {
290
+ const amountOfFiles = files.length;
291
+ const filesToAdd = [];
292
+ for (let i = 0; i < amountOfFiles; i++) {
293
+ const fileAsDocument = yield this._getFileAsDocument(files[i]);
294
+ fileAsDocument.index = CoDocumentSharedFieldLogic.GenerateAvailableIndexNr(this.documents || []) + i;
295
+ filesToAdd.push(fileAsDocument);
296
+ }
297
+ return filesToAdd;
298
+ });
299
+ }
300
+ filesPicked(files) {
301
+ return __awaiter(this, void 0, void 0, function* () {
302
+ if (files && files.length) {
303
+ let allFilesAreValid = true;
304
+ const amountOfFiles = files.length;
305
+ for (let i = 0; i < amountOfFiles; i++) {
306
+ if (!FileUtils.CheckMaxUploadSize(files[i], this._maxUploadFileSize)) {
307
+ allFilesAreValid = false;
308
+ break;
309
+ }
310
+ }
311
+ if (!allFilesAreValid) {
312
+ //TODO make dialogService
313
+ //this._promptService.showWarning(this._dictionaryService.get("FILE_TOO_LARGE_TO_UPLOAD", true, "" + FileUtils.getMaxUploadSizeInMb(this._maxUploadFileSize).toString()));
314
+ }
315
+ else {
316
+ const filesToAdd = yield this.convertFilesIntoCoDocuments(files);
317
+ if (filesToAdd.length > 1 || this.useWithoutSettingProps) {
318
+ this.documentsAdded.emit(filesToAdd);
319
+ }
320
+ else {
321
+ this.documentUnderEdit = filesToAdd[0]; // Setting docUnderEdit opens the popup window
322
+ this.openPopup();
323
+ }
324
+ }
325
+ }
326
+ });
327
+ }
328
+ handleAcceptedFileTypesLoaded(value) {
329
+ //TODO fix loading
330
+ //this.acceptedUploadFormats = this._coDocumentDataLoader.getAllowedExtensionsForType(value);
331
+ }
332
+ _getFileAsDocument(file) {
333
+ return __awaiter(this, void 0, void 0, function* () {
334
+ const fileAsCoDocument = yield FileUtils.ReadFileAsNewCoDocument(file, this.resizeImages);
335
+ // set some extra known fields for the codocument:
336
+ fileAsCoDocument.table = this.documentTable;
337
+ fileAsCoDocument.key = this.documentKey;
338
+ //TODO fix add users
339
+ //fileAsCoDocument.creationUser = this._userService.userName.toUpperCase();
340
+ //fileAsCoDocument.modifiedUser = this._userService.userName.toUpperCase();
341
+ fileAsCoDocument.creationDate = new Date();
342
+ fileAsCoDocument.modifiedDate = new Date();
343
+ fileAsCoDocument.fileType = this.fileType ? this.fileType : FileUtils.IsImageFile(file) ? FileType.Image : FileType.Document;
344
+ if (fileAsCoDocument) {
345
+ return fileAsCoDocument;
346
+ }
347
+ });
348
+ }
349
+ _setInternalParamObj(value) {
350
+ return __awaiter(this, void 0, void 0, function* () {
351
+ //TODO fix params
352
+ //const param: InternalParameterObject = await this._generalDalRepository.getInternalParamObject(value);
353
+ //this._maxUploadFileSize = isNaN(parseInt(param.value, 0)) ? undefined : parseInt(param.value, 0);
354
+ });
355
+ }
356
+ _lockDocument() {
357
+ return __awaiter(this, void 0, void 0, function* () {
358
+ if (!this.documentUnderEdit.documentId) {
359
+ return true; // New document does not have an ID and therefore does not have to be locked
360
+ }
361
+ const lockOk = yield this.lockOperation(CoDocument);
362
+ return lockOk;
363
+ });
364
+ }
365
+ _unlockDocument() {
366
+ return __awaiter(this, void 0, void 0, function* () {
367
+ if (!this.documentUnderEdit.documentId) {
368
+ return true; // New document does not have an ID and therefore does not have to be locked
369
+ }
370
+ const unlockOk = yield this.unlockOperation(CoDocument);
371
+ return unlockOk;
372
+ });
373
+ }
374
+ _prepareFileRights() {
375
+ const len = this.documentUnderEdit.rights.length;
376
+ for (let i = 0; i < len; i++) {
377
+ const right = this.documentUnderEdit.rights[i];
378
+ if (right.rightLevel === ObjectRightType.ReadWrite) {
379
+ this._popup.instance.userGroupsForWrite.push(right.userGroupId);
380
+ }
381
+ if (right.rightLevel === ObjectRightType.ReadOnly) {
382
+ this._popup.instance.userGroupsForRead.push(right.userGroupId);
383
+ }
384
+ }
385
+ }
386
+ }
387
+ BaseFileUploadComponent.decorators = [
388
+ { type: Directive }
389
+ ];
390
+ BaseFileUploadComponent.ctorParameters = () => [
391
+ { type: DictionaryService },
392
+ { type: ViewContainerRef },
393
+ { type: ComponentFactoryResolver }
394
+ ];
395
+ BaseFileUploadComponent.propDecorators = {
396
+ fileType: [{ type: Input }],
397
+ documents: [{ type: Input }],
398
+ documentTable: [{ type: Input }],
399
+ documentKey: [{ type: Input }],
400
+ fullPageDrop: [{ type: Input }],
401
+ canAdd: [{ type: Input }],
402
+ dropMessage: [{ type: Input }],
403
+ addWithButton: [{ type: Input }],
404
+ canDelete: [{ type: Input }],
405
+ noDragDropOrdering: [{ type: Input }],
406
+ readonly: [{ type: Input }],
407
+ askBeforeDelete: [{ type: Input }],
408
+ resizeImages: [{ type: Input }],
409
+ lockOperation: [{ type: Input }],
410
+ unlockOperation: [{ type: Input }],
411
+ beforeDeleteOperation: [{ type: Input }],
412
+ afterDeleteOperation: [{ type: Input }],
413
+ beforeCreateOperation: [{ type: Input }],
414
+ afterCreateOperation: [{ type: Input }],
415
+ beforeEditOperation: [{ type: Input }],
416
+ dontAskBeforeDelete: [{ type: Input }],
417
+ noOwnDeleteOperation: [{ type: Input }],
418
+ maxUploadSizeParam: [{ type: Input }],
419
+ useWithoutSettingProps: [{ type: Input }],
420
+ filesUploadConfigObjects: [{ type: Input }],
421
+ medicalUserGroups: [{ type: Input }],
422
+ tagCategory: [{ type: Input }],
423
+ tagReferenceTable: [{ type: Input }],
424
+ displayReadWriteAccess: [{ type: Input }],
425
+ useCustomFileDropEvent: [{ type: Input }],
426
+ customFileDropEvent: [{ type: Output }],
427
+ documentsAdded: [{ type: Output }],
428
+ documentDeleted: [{ type: Output }],
429
+ sortableListChanged: [{ type: Output }],
430
+ documentChangeEvent: [{ type: Output }],
431
+ popupOpenedStateChange: [{ type: Output }],
432
+ hidden: [{ type: HostBinding, args: ["class.hidden",] }],
433
+ onDrop: [{ type: HostListener, args: ["drop", ["$event"],] }],
434
+ onDragEnd: [{ type: HostListener, args: ["dragend", ["$event"],] }],
435
+ onDragOver: [{ type: HostListener, args: ["dragover", ["$event"],] }],
436
+ onDragEnter: [{ type: HostListener, args: ["dragenter", ["$event"],] }],
437
+ onDragLeave: [{ type: HostListener, args: ["dragleave", ["$event"],] }]
438
+ };
439
+ __decorate([
440
+ InputBoolean()
441
+ ], BaseFileUploadComponent.prototype, "noDragDropOrdering", void 0);
442
+ __decorate([
443
+ InputBoolean()
444
+ ], BaseFileUploadComponent.prototype, "readonly", null);
445
+ __decorate([
446
+ InputBoolean()
447
+ ], BaseFileUploadComponent.prototype, "askBeforeDelete", void 0);
448
+ __decorate([
449
+ InputBoolean()
450
+ ], BaseFileUploadComponent.prototype, "resizeImages", void 0);
451
+ __decorate([
452
+ InputBoolean()
453
+ ], BaseFileUploadComponent.prototype, "dontAskBeforeDelete", void 0);
454
+ __decorate([
455
+ InputBoolean()
456
+ ], BaseFileUploadComponent.prototype, "noOwnDeleteOperation", void 0);
457
+ __decorate([
458
+ InputBoolean()
459
+ ], BaseFileUploadComponent.prototype, "useWithoutSettingProps", void 0);
460
+ __decorate([
461
+ InputBoolean()
462
+ ], BaseFileUploadComponent.prototype, "medicalUserGroups", void 0);
463
+ __decorate([
464
+ InputBoolean()
465
+ ], BaseFileUploadComponent.prototype, "displayReadWriteAccess", void 0);
466
+ __decorate([
467
+ InputBoolean()
468
+ ], BaseFileUploadComponent.prototype, "useCustomFileDropEvent", void 0);
469
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1maWxlLXVwbG9hZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWRjb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9maWxlcy11cGxvYWQvY29tcG9uZW50cy9iYXNlLWZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVILHdCQUF3QixFQUV4QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSw2Q0FBNkMsQ0FBQztBQUNyRSxPQUFPLEVBRUgsa0NBQWtDLEVBQ3JDLE1BQU0sdURBQXVELENBQUM7QUFJL0QsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUV6RixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdURBQXVELENBQUM7QUFDdEYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBQzdGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUNuRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFDckUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9E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REMsWUFBWSxFQUFFO2dFQUN3QjtBQUl2QztJQURDLFlBQVksRUFBRTs2REFDc0I7QUE0QnJDO0lBREMsWUFBWSxFQUFFO29FQUM2QjtBQUk1QztJQURDLFlBQVksRUFBRTtxRUFDOEI7QUFhN0M7SUFEQyxZQUFZLEVBQUU7dUVBQ2dDO0FBTy9DO0lBREMsWUFBWSxFQUFFO2tFQUMyQjtBQVUxQztJQURDLFlBQVksRUFBRTt1RUFDd0I7QUFJdkM7SUFEVSxZQUFZLEVBQUU7dUVBQ3VCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudEZhY3RvcnksXHJcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBDb21wb25lbnRSZWYsXHJcbiAgICBEaXJlY3RpdmUsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBIb3N0QmluZGluZyxcclxuICAgIEhvc3RMaXN0ZW5lcixcclxuICAgIElucHV0LFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgVmlld0NvbnRhaW5lclJlZlxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7U2NyZWVuQ29uZmlnQWRhcHRlckNvbXBvbmVudH0gZnJvbSBcIkBjb2xpam5pdC9jb3JlY29tcG9uZW50c192MTJcIjtcclxuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7VGFibGVOYW1lfSBmcm9tIFwiLi4vLi4vLi4vZW51bS90YWJsZS1uYW1lLmVudW1cIjtcclxuaW1wb3J0IHtEaWN0aW9uYXJ5U2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2UvZGljdGlvbmFyeS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7RmlsZVR5cGV9IGZyb20gXCJAY29saWpuaXQvbWFpbmFwaS9idWlsZC9lbnVtL2ZpbGUtdHlwZS5lbnVtXCI7XHJcbmltcG9ydCB7XHJcbiAgICBPcGVyYXRpb25DYWxsYmFja1NpbXBsZUZ1bmN0aW9uLFxyXG4gICAgT3BlcmF0aW9uV2l0aEFsd2F5c1N1Y2Nlc3NDYWxsYmFja1xyXG59IGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2Uvb3BlcmF0aW9uLWNhbGxiYWNrLXNpbXBsZS1mdW5jdGlvblwiO1xyXG5pbXBvcnQge0ludGVybmFsUGFyYW19IGZyb20gXCIuLi8uLi8uLi9lbnVtL2ludGVybmFsLXBhcmFtLmVudW1cIjtcclxuaW1wb3J0IHtGaWxlc1VwbG9hZENvbmZpZ09iamVjdHN9IGZyb20gXCIuLi8uLi8uLi9lbnVtL2ZpbGVzLXVwbG9hZC1jb25maWctb2JqZWN0c1wiO1xyXG5pbXBvcnQge1RhZ0NhdGVnb3J5fSBmcm9tIFwiLi4vLi4vLi4vZW51bS90YWctY2F0ZWdvcnkuZW51bVwiO1xyXG5pbXBvcnQge0FycmF5VXRpbHN9IGZyb20gXCIuLi8uLi8uLi91dGlscy9hcnJheS11dGlsc1wiO1xyXG5pbXBvcnQge1JlZkNvZGVVdGlsc30gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3JlZi1jb2RlLXV0aWxzXCI7XHJcbmltcG9ydCB7Q29Eb2N1bWVudFNoYXJlZEZpZWxkTG9naWN9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jby1kb2N1bWVudC1zaGFyZWQtZmllbGQtbG9naWNcIjtcclxuaW1wb3J0IHtDb0RvY3VtZW50UmlnaHR9IGZyb20gXCIuLi8uLi8uLi9idXNpbmVzc29iamVjdC9jby1kb2N1bWVudC1yaWdodC5ib1wiO1xyXG5pbXBvcnQge09iamVjdFJpZ2h0VHlwZX0gZnJvbSBcIkBjb2xpam5pdC9zaGFyZWRhcGkvYnVpbGQvZW51bS9vYmplY3QtcmlnaHQtdHlwZS5lbnVtXCI7XHJcbmltcG9ydCB7SW5wdXRCb29sZWFufSBmcm9tIFwiLi4vLi4vLi4vZGVjb3JhdG9yL2lucHV0LWJvb2xlYW4uZGVjb3JhdG9yXCI7XHJcbmltcG9ydCB7QXBwRmlsZURyb3B6b25lQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vYXBwLWZpbGUtZHJvcHpvbmUvYXBwLWZpbGUtZHJvcHpvbmUuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7RmlsZVV0aWxzfSBmcm9tIFwiQGNvbGlqbml0L21haW5hcGkvYnVpbGQvdXRpbHMvZmlsZS11dGlsc1wiO1xyXG5pbXBvcnQge0NvRG9jdW1lbnR9IGZyb20gXCJAY29saWpuaXQvbWFpbmFwaS9idWlsZC9tb2RlbC9jby1kb2N1bWVudFwiO1xyXG5pbXBvcnQge0NvRG9jdW1lbnRUeXBlfSBmcm9tIFwiQGNvbGlqbml0L21haW5hcGkvYnVpbGQvZW51bS9jby1kb2N1bWVudC10eXBlLmVudW1cIjtcclxuaW1wb3J0IHtGaWxlVXBsb2FkUG9wdXBDb21wb25lbnR9IGZyb20gXCIuLi8uLi9maWxlLXVwbG9hZC1wb3B1cC9maWxlLXVwbG9hZC1wb3B1cC5jb21wb25lbnRcIjtcclxuXHJcblxyXG5cclxuLy8gQSBiYXNlIGNvbXBvbmVudCB0aGF0IGxldHMgdGhlIHVzZXIgbWFrZSBhIGxpc3Qgb2YgZmlsZXMgZnJvbSBpdHMgZGV2aWNlLiBEb2Vzbid0IGFjdHVhbGx5IHVwbG9hZCwgYnV0IG91dHB1dHMgY2hvc2VuIGZpbGVzIGFzIGZpbGVzQ2hhbmdlZC5cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRmlsZVVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIFNjcmVlbkNvbmZpZ0FkYXB0ZXJDb21wb25lbnQsIE9uRGVzdHJveSB7XHJcbiAgICBkZWNpbWFsczogbnVtYmVyO1xyXG4gICAgZm9yY2VSZWFkb25seTogYm9vbGVhbjtcclxuICAgIG1heExlbmd0aDogbnVtYmVyO1xyXG4gICAgb2JqZWN0Q29uZmlnTmFtZTogc3RyaW5nO1xyXG4gICAgcmVkRXJyb3JCYWNrZ3JvdW5kOiBib29sZWFuO1xyXG4gICAgcmVxdWlyZWQ6IGJvb2xlYW47XHJcblxyXG4gICAgLy8gVGhlIGZpbGVUeXBlIHRoYXQgdGhlIGRvY3VtZW50cyBzaG91bGQgYmUgc2F2ZWQgYXMsIGxlYXZlIGVtcHR5IHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGZpbGV0eXBlLiBBbHNvIGRldGVybWluZXMgZmlsZSBwaWNrZXIgZmlsdGVyXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNldCBmaWxlVHlwZSh2YWx1ZTogRmlsZVR5cGUpIHtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZmlsZVR5cGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgLy9UT0RPIERvY3VtZW50ZGF0YWxvYWRlciBmaXhcclxuICAgICAgICAgICAgLy90aGlzLl9jb0RvY3VtZW50RGF0YUxvYWRlci5sb2FkQWxsb3dlZFR5cGVzKCkudGhlbigoKSA9PiB7dGhpcy5oYW5kbGVBY2NlcHRlZEZpbGVUeXBlc0xvYWRlZCh2YWx1ZSl9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBmaWxlVHlwZSgpOiBGaWxlVHlwZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZG9jdW1lbnRzOiBDb0RvY3VtZW50W10gPSBbXTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRvY3VtZW50VGFibGU6IFRhYmxlTmFtZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNldCBkb2N1bWVudEtleSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fZG9jdW1lbnRLZXkgPSB2YWx1ZSArIFwiXCI7IC8vIGZvcmNlIHN0cmluZ1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgZG9jdW1lbnRLZXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZG9jdW1lbnRLZXk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhlIGFiaWxpdHkgdG8gZHJvcCBmaWxlcyBvbiB0aGUgcGFnZVxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBmdWxsUGFnZURyb3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBJZiB1c2VyIGdldHMgdGhlIGFiaWxpdHkgb2YgYWRkaW5nIGZpbGVzLlxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBjYW5BZGQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZHJvcE1lc3NhZ2U6IHN0cmluZztcclxuXHJcbiAgICAvLyBTaG93IGFkZCBidXR0b25cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYWRkV2l0aEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLy8gSWYgdXNlciBnZXRzIHRoZSBhYmlsaXR5IG9mIGRlbGV0aW5nIGZpbGVzLlxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBjYW5EZWxldGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBASW5wdXRCb29sZWFuKClcclxuICAgIHB1YmxpYyBub0RyYWdEcm9wT3JkZXJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQElucHV0Qm9vbGVhbigpXHJcbiAgICBwdWJsaWMgc2V0IHJlYWRvbmx5KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fcmVhZG9ubHkgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwICYmIHRoaXMuX3BvcHVwLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLnJlYWRvbmx5ID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBASW5wdXRCb29sZWFuKClcclxuICAgIHB1YmxpYyBhc2tCZWZvcmVEZWxldGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBASW5wdXRCb29sZWFuKClcclxuICAgIHB1YmxpYyByZXNpemVJbWFnZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxvY2tPcGVyYXRpb246IE9wZXJhdGlvbkNhbGxiYWNrU2ltcGxlRnVuY3Rpb24gPSBPcGVyYXRpb25XaXRoQWx3YXlzU3VjY2Vzc0NhbGxiYWNrO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdW5sb2NrT3BlcmF0aW9uOiBPcGVyYXRpb25DYWxsYmFja1NpbXBsZUZ1bmN0aW9uID0gT3BlcmF0aW9uV2l0aEFsd2F5c1N1Y2Nlc3NDYWxsYmFjaztcclxuXHJcblxyXG5cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGJlZm9yZURlbGV0ZU9wZXJhdGlvbjogT3BlcmF0aW9uQ2FsbGJhY2tTaW1wbGVGdW5jdGlvbiA9IE9wZXJhdGlvbldpdGhBbHdheXNTdWNjZXNzQ2FsbGJhY2s7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBhZnRlckRlbGV0ZU9wZXJhdGlvbjogT3BlcmF0aW9uQ2FsbGJhY2tTaW1wbGVGdW5jdGlvbiA9IE9wZXJhdGlvbldpdGhBbHdheXNTdWNjZXNzQ2FsbGJhY2s7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBiZWZvcmVDcmVhdGVPcGVyYXRpb246IE9wZXJhdGlvbkNhbGxiYWNrU2ltcGxlRnVuY3Rpb24gPSBPcGVyYXRpb25XaXRoQWx3YXlzU3VjY2Vzc0NhbGxiYWNrO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYWZ0ZXJDcmVhdGVPcGVyYXRpb246IE9wZXJhdGlvbkNhbGxiYWNrU2ltcGxlRnVuY3Rpb24gPSBPcGVyYXRpb25XaXRoQWx3YXlzU3VjY2Vzc0NhbGxiYWNrO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYmVmb3JlRWRpdE9wZXJhdGlvbjogT3BlcmF0aW9uQ2FsbGJhY2tTaW1wbGVGdW5jdGlvbiA9IE9wZXJhdGlvbldpdGhBbHdheXNTdWNjZXNzQ2FsbGJhY2s7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIEBJbnB1dEJvb2xlYW4oKVxyXG4gICAgcHVibGljIGRvbnRBc2tCZWZvcmVEZWxldGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQElucHV0Qm9vbGVhbigpXHJcbiAgICBwdWJsaWMgbm9Pd25EZWxldGVPcGVyYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIF9maWxlVHlwZTogRmlsZVR5cGU7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZXQgbWF4VXBsb2FkU2l6ZVBhcmFtKHZhbHVlOiBJbnRlcm5hbFBhcmFtKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldEludGVybmFsUGFyYW1PYmoodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQElucHV0Qm9vbGVhbigpXHJcbiAgICBwdWJsaWMgdXNlV2l0aG91dFNldHRpbmdQcm9wczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZmlsZXNVcGxvYWRDb25maWdPYmplY3RzOiBGaWxlc1VwbG9hZENvbmZpZ09iamVjdHM7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIEBJbnB1dEJvb2xlYW4oKVxyXG4gICAgcHVibGljIG1lZGljYWxVc2VyR3JvdXBzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB0YWdDYXRlZ29yeTogVGFnQ2F0ZWdvcnk7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB0YWdSZWZlcmVuY2VUYWJsZTogVGFibGVOYW1lO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBASW5wdXRCb29sZWFuKClcclxuICAgIHB1YmxpYyBkaXNwbGF5UmVhZFdyaXRlQWNjZXNzOiBib29sZWFuO1xyXG5cclxuICAgIC8vIFVzZSB3aXRoIGN1c3RvbUZpbGVEcm9wRXZlbnRcclxuICAgIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKVxyXG4gICAgcHVibGljIHVzZUN1c3RvbUZpbGVEcm9wRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBVc2UgaW4gY29uanVuY3Rpb24gd2l0aCB1c2VDdXN0b21GaWxlRHJvcEV2ZW50XHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBjdXN0b21GaWxlRHJvcEV2ZW50OiBFdmVudEVtaXR0ZXI8RmlsZUxpc3Q+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlTGlzdD4oKTtcclxuXHJcbiAgICAvLyBFbWl0cyBpZiB1c2VyIHdhbnRzIHRvIGFkZCBtdWx0aXBsZSBkb2N1bWVudHMgYXQgb25jZVxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnRzQWRkZWQ6IEV2ZW50RW1pdHRlcjxDb0RvY3VtZW50W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxDb0RvY3VtZW50W10+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnREZWxldGVkOiBFdmVudEVtaXR0ZXI8Q29Eb2N1bWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPENvRG9jdW1lbnQ+KCk7XHJcblxyXG4gICAgLy8gRW1pdHMgZXZlcnkgdGltZSB0aGUgb3JkZXIgb2YgZG9jdW1lbnRzIHdhcyBjaGFuZ2VkXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyByZWFkb25seSBzb3J0YWJsZUxpc3RDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8Q29Eb2N1bWVudFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29Eb2N1bWVudFtdPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGRvY3VtZW50Q2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxDb0RvY3VtZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29Eb2N1bWVudD4oKTtcclxuXHJcbiAgICAvLyBVc2UgdGhpcyBpZiBjb25zdW1lciByZXF1aXJlcyB0byBwZXJmb3JtIGV4dHJhIGFjdGlvbnMsIGxpa2UgbG9ja2luZyBhIHBhcmVudCBidXNpbmVzc09iamVjdCBpZiBpdCBjb250YWlucyB0aGUgY29sbGVjdGlvbiBvZiBkb2N1bWVudHMuIEVtaXQgd2l0aCB0cnVlIHdoZW4gcG9wdXAgb3BlbmVkLCBmYWxzZSBmb3IgY2xvc2VcclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHBvcHVwT3BlbmVkU3RhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICBASG9zdEJpbmRpbmcoXCJjbGFzcy5oaWRkZW5cIilcclxuICAgIHB1YmxpYyBoaWRkZW46IGJvb2xlYW47XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcihcImRyb3BcIiwgW1wiJGV2ZW50XCJdKVxyXG4gICAgcHVibGljIG9uRHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZUN1c3RvbUZpbGVEcm9wRXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlc1BpY2tlZChldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRmlsZURyb3BFdmVudC5lbWl0KGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jbGVhckRyb3B6b25lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcihcImRyYWdlbmRcIiwgW1wiJGV2ZW50XCJdKVxyXG4gICAgcHVibGljIG9uRHJhZ0VuZChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmNsZWFyRGF0YSgpO1xyXG4gICAgICAgIHRoaXMuX2NsZWFyRHJvcHpvbmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKFwiZHJhZ292ZXJcIiwgW1wiJGV2ZW50XCJdKVxyXG4gICAgcHVibGljIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcihcImRyYWdlbnRlclwiLCBbXCIkZXZlbnRcIl0pXHJcbiAgICBwdWJsaWMgb25EcmFnRW50ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RyYWdFbnRlclRhcmdldCA9IGV2ZW50LnRhcmdldDtcclxuICAgICAgICB0aGlzLl9zaG93RHJvcHpvbmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKFwiZHJhZ2xlYXZlXCIsIFtcIiRldmVudFwiXSlcclxuICAgIHB1YmxpYyBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZHJhZ0VudGVyVGFyZ2V0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsZWFyRHJvcHpvbmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRvY3VtZW50VW5kZXJFZGl0OiBDb0RvY3VtZW50O1xyXG4gICAgcHVibGljIGFjY2VwdGVkVXBsb2FkRm9ybWF0czogc3RyaW5nO1xyXG5cclxuICAgIHByb3RlY3RlZCBfbWF4VXBsb2FkRmlsZVNpemU6IG51bWJlcjtcclxuXHJcbiAgICBwcml2YXRlIF9kcmFnRW50ZXJUYXJnZXQ6IEV2ZW50VGFyZ2V0O1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRLZXk6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9kcm9wWm9uZTogQ29tcG9uZW50UmVmPEFwcEZpbGVEcm9wem9uZUNvbXBvbmVudD47XHJcbiAgICBwcml2YXRlIF9wb3B1cDogQ29tcG9uZW50UmVmPEZpbGVVcGxvYWRQb3B1cENvbXBvbmVudD47XHJcbiAgICBwcml2YXRlIF9kb2NDaGFuZ2VTdWI6IFN1YnNjcmlwdGlvbjtcclxuICAgIHByaXZhdGUgX3BvcHVwQ2xvc2VTdWI6IFN1YnNjcmlwdGlvbjtcclxuICAgIHByaXZhdGUgX3JlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgX2R1bW15VHJ1ZUZ1bmN0aW9uOiBPcGVyYXRpb25DYWxsYmFja1NpbXBsZUZ1bmN0aW9uID0gKG9iamVjdDogYW55KSA9PiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcblxyXG4gICAgICAgIC8vcHJvdGVjdGVkIF9wcm9tcHRTZXJ2aWNlOiBQcm9tcHRTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBfZGljdGlvbmFyeVNlcnZpY2U6IERpY3Rpb25hcnlTZXJ2aWNlLFxyXG4gICAgICAgIC8vcHJvdGVjdGVkIF91c2VyU2VydmljZTogVXNlclNlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9jb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9mYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICAgICAgLy9wcm90ZWN0ZWQgX2dlbmVyYWxEYWxSZXBvc2l0b3J5OiBHZW5lcmFsRGFsUmVwb3NpdG9yeSxcclxuICAgICAgICAvL3Byb3RlY3RlZCBfZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLFxyXG4gICAgICAgIC8vcHJvdGVjdGVkIF9iYXNlRGF0YURhbFJlcG9zaXRvcnk6IEJhc2VEYXRhRGFsUmVwb3NpdG9yeSxcclxuICAgICAgICAvL3Byb3RlY3RlZCBfY29Eb2N1bWVudERhdGFMb2FkZXI6IENvRG9jdW1lbnREYXRhTG9hZGVyU2VydmljZVxyXG4gICAgKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NsZWFyRHJvcHpvbmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9zaG93RHJvcHpvbmUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcm9wWm9uZSkge1xyXG4gICAgICAgICAgICBjb25zdCBmYWN0OiBDb21wb25lbnRGYWN0b3J5PEFwcEZpbGVEcm9wem9uZUNvbXBvbmVudD4gPSB0aGlzLl9mYWN0b3J5LnJlc29sdmVDb21wb25lbnRGYWN0b3J5KEFwcEZpbGVEcm9wem9uZUNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2Ryb3Bab25lID0gdGhpcy5fY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChmYWN0KTtcclxuICAgICAgICAgICAgdGhpcy5fZHJvcFpvbmUuaW5zdGFuY2UuY3VzdG9tRHJvcEFjdGlvbk1lc3NhZ2UgPSB0aGlzLmRyb3BNZXNzYWdlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jbGVhckRyb3B6b25lKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGVhcigpO1xyXG4gICAgICAgIGlmICh0aGlzLl9kcm9wWm9uZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcm9wWm9uZS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2Ryb3Bab25lID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmUgZmlsZSBmcm9tIHVwbG9hZCBhcnJheS5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVEZWxldGUoZmlsZTogQ29Eb2N1bWVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGxldCBzdWNjZXNzOiBib29sZWFuID0gYXdhaXQgdGhpcy5iZWZvcmVEZWxldGVPcGVyYXRpb24oZmlsZSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlbGV0ZShmaWxlKTtcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZnRlckRlbGV0ZU9wZXJhdGlvbihmaWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdWNjZXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9kZWxldGUoZmlsZTogQ29Eb2N1bWVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGxldCBkb0RlbGV0ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRvbnRBc2tCZWZvcmVEZWxldGUpIHtcclxuICAgICAgICAgIC8vVE9ETyBtYWtlIGRpYWxvZ1NlcnZpY2VcclxuICAgICAgICAgICAgLy9kb0RlbGV0ZSA9IGF3YWl0IHRoaXMuX3Byb21wdFNlcnZpY2Uuc2hvd1llc05vKFwiTUVTU0FHRV9ERUxFVEVfUkVDT1JEX1FVRVNUSU9OXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZG9EZWxldGUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm5vT3duRGVsZXRlT3BlcmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBBcnJheVV0aWxzLlJlbW92ZUVsZW1lbnQoZmlsZSwgdGhpcy5kb2N1bWVudHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnREZWxldGVkLmVtaXQoZmlsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVTb3J0aW5nQ2hhbmdlKGRvY3M6IENvRG9jdW1lbnRbXSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc29ydGFibGVMaXN0Q2hhbmdlZC5lbWl0KGRvY3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlKGV2ZW50OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5maWxlcyAmJiBldmVudC50YXJnZXQuZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvLyBjaGVjayBmaWxlIHNpemVzIGFuZCBleHRlbnNpb25cclxuICAgICAgICAgICAgLy9Ub2RvOiBmaXggdGhpc1xyXG4gICAgICAgICAgICAvL2NvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gYXdhaXQgdGhpcy5fYmFzZURhdGFEYWxSZXBvc2l0b3J5LmdldEFsbG93ZWRFeHRlbnNpb25zKCk7XHJcbiAgICAgICAgICAgIGxldCBhbGxGaWxlc0FyZVNtYWxsRW5vdWdoOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgbGV0IGFsbEZpbGVzSGF2ZUFsbG93ZWRFeHRlbnNpb25zOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZVRvQ29tcGFyZTogbnVtYmVyID0gdGhpcy5fbWF4VXBsb2FkRmlsZVNpemUgPyB0aGlzLl9tYXhVcGxvYWRGaWxlU2l6ZSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSBldmVudC50YXJnZXQuZmlsZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVwbG9hZFNpemVBbGxvd2VkID0gRmlsZVV0aWxzLkNoZWNrTWF4VXBsb2FkU2l6ZShldmVudC50YXJnZXQuZmlsZXNbaV0sIHNpemVUb0NvbXBhcmUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF1cGxvYWRTaXplQWxsb3dlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsbEZpbGVzQXJlU21hbGxFbm91Z2ggPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbkFsbG93ZWQgPSB0cnVlLy9GaWxlVXRpbHMuQ2hlY2tFeHRlbnNpb24oZXZlbnQudGFyZ2V0LmZpbGVzW2ldLCBhbGxvd2VkRXh0ZW5zaW9ucyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWV4dGVuc2lvbkFsbG93ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhbGxGaWxlc0hhdmVBbGxvd2VkRXh0ZW5zaW9ucyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWFsbEZpbGVzQXJlU21hbGxFbm91Z2gpIHtcclxuICAgICAgICAgICAgICAvL1RPRE8gbWFrZSBkaWFsb2dTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuX3Byb21wdFNlcnZpY2Uuc2hvd1dhcm5pbmcodGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KFwiRklMRV9UT09fTEFSR0VfVE9fVVBMT0FEXCIsIHRydWUsIFwiXCIgKyBbRmlsZVV0aWxzLmdldE1heFVwbG9hZFNpemVJbk1iKHNpemVUb0NvbXBhcmUpXSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFhbGxGaWxlc0hhdmVBbGxvd2VkRXh0ZW5zaW9ucykge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zdCBleHRlbnNpb25zTGlzdCA9IGFsbG93ZWRFeHRlbnNpb25zLm1hcChhbGxvd2VkRXh0ZW5zaW9uID0+IGFsbG93ZWRFeHRlbnNpb24uZXh0ZW5zaW9uKS5zb3J0KCkuam9pbihcIiwgXCIpO1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLl9wcm9tcHRTZXJ2aWNlLnNob3dXYXJuaW5nKHRoaXMuX2RpY3Rpb25hcnlTZXJ2aWNlLmdldChcIkZJTEVfSEFTX0RJU0FMTE9XRURfRVhURU5TSU9OXCIsIGZhbHNlLCBleHRlbnNpb25zTGlzdCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZXNUb0FkZDogQ29Eb2N1bWVudFtdID0gYXdhaXQgdGhpcy5jb252ZXJ0RmlsZXNJbnRvQ29Eb2N1bWVudHMoZXZlbnQudGFyZ2V0LmZpbGVzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsZXNUb0FkZC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudHNBZGRlZC5lbWl0KGZpbGVzVG9BZGQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51c2VXaXRob3V0U2V0dGluZ1Byb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRzQWRkZWQubmV4dChmaWxlc1RvQWRkKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VW5kZXJFZGl0ID0gZmlsZXNUb0FkZFswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuUG9wdXAoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZUVkaXREb2N1bWVudENsaWNrKGRvY1RvRWRpdDogQ29Eb2N1bWVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMuZG9jdW1lbnRVbmRlckVkaXQgPSBkb2NUb0VkaXQ7XHJcbiAgICAgICAgY29uc3Qgc2hvd1BvcHVwOiBib29sZWFuID0gYXdhaXQgdGhpcy5iZWZvcmVFZGl0T3BlcmF0aW9uKGRvY1RvRWRpdCk7XHJcbiAgICAgICAgaWYgKHNob3dQb3B1cCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5Qb3B1cCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlblBvcHVwKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZUFuZEZpbGxQb3B1cEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RvY0NoYW5nZVN1YiA9IHRoaXMuX3BvcHVwLmluc3RhbmNlLmRvY3VtZW50Q2hhbmdlRXZlbnQuc3Vic2NyaWJlKChkb2M6IENvRG9jdW1lbnQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudENoYW5nZUV2ZW50LmVtaXQoZG9jKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlblBvcHVwVG9BZGREb2N1bWVudEJ5VXJsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZURvY3VtZW50VG9BZGRCeVVybCgpO1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZUFuZEZpbGxQb3B1cEluc3RhbmNlKHRydWUpO1xyXG5cclxuICAgICAgICB0aGlzLl9kb2NDaGFuZ2VTdWIgPSB0aGlzLl9wb3B1cC5pbnN0YW5jZS5kb2N1bWVudENoYW5nZUV2ZW50LnN1YnNjcmliZSgoZG9jOiBDb0RvY3VtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGRvYy5maWxlTmFtZSA9IGRvYy5maWxlUGF0aDtcclxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudENoYW5nZUV2ZW50LmVtaXQoZG9jKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVEb2N1bWVudFRvQWRkQnlVcmwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudFVuZGVyRWRpdCA9IG5ldyBDb0RvY3VtZW50KCk7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudFVuZGVyRWRpdC50YWJsZSA9IHRoaXMuZG9jdW1lbnRUYWJsZTtcclxuICAgICAgICB0aGlzLmRvY3VtZW50VW5kZXJFZGl0LmtleSA9IHRoaXMuZG9jdW1lbnRLZXk7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5maWxlVHlwZSA9IHRoaXMuZmlsZVR5cGU7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5kb2N1bWVudFR5cGUgPSBDb0RvY3VtZW50VHlwZS5TYXZlQXNMaW5rT25SYW5kb21Mb2NhdGlvbjtcclxuICAgICAgICB0aGlzLmRvY3VtZW50VW5kZXJFZGl0LnBhdGhJc1VybCA9IHRydWU7XHJcbiAgICAgICAgLy9UT0RPIEZpeCB1c2VyIElucHV0XHJcbiAgICAgICAgLy90aGlzLmRvY3VtZW50VW5kZXJFZGl0LmNyZWF0aW9uVXNlciA9IHRoaXMuX3VzZXJTZXJ2aWNlLnVzZXJOYW1lLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgLy90aGlzLmRvY3VtZW50VW5kZXJFZGl0Lm1vZGlmaWVkVXNlciA9IHRoaXMuX3VzZXJTZXJ2aWNlLnVzZXJOYW1lLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5jcmVhdGlvbkRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuZG9jdW1lbnRVbmRlckVkaXQubW9kaWZpZWREYXRlID0gbmV3IERhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVBbmRGaWxsUG9wdXBJbnN0YW5jZShhZGREb2N1bWVudEJ5VXJsOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBvcHVwT3BlbmVkU3RhdGVDaGFuZ2UuZW1pdCh0cnVlKTtcclxuXHJcbiAgICAgICAgY29uc3QgZmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxGaWxlVXBsb2FkUG9wdXBDb21wb25lbnQ+ID0gdGhpcy5fZmFjdG9yeS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShGaWxlVXBsb2FkUG9wdXBDb21wb25lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLl9wb3B1cCA9IHRoaXMuX2NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLnJlYWRvbmx5ID0gdGhpcy5fcmVhZG9ubHk7XHJcbiAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UuYWRkRG9jdW1lbnRCeVVybCA9IGFkZERvY3VtZW50QnlVcmw7XHJcbiAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UuaGFzUHVibGljQWNjZXNzVmlzaWJsZSA9IHRoaXMuZG9jdW1lbnRUYWJsZSA9PT0gVGFibGVOYW1lLkdvb2RzO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLnNob3dEb2N1bWVudFJlcG9ydFBpY2tlciA9ICh0aGlzLmRvY3VtZW50VGFibGUgPT09IFRhYmxlTmFtZS5UcmFuc2FjdGlvbnMgfHwgdGhpcy5kb2N1bWVudFRhYmxlID09PSBUYWJsZU5hbWUuVHJhbnNhY3Rpb25MaW5lcyk7XHJcbiAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UuZG9jdW1lbnRVbmRlckVkaXQgPSB0aGlzLmRvY3VtZW50VW5kZXJFZGl0O1xyXG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLmZpbGVzVXBsb2FkQ29uZmlnT2JqZWN0cyA9IHRoaXMuZmlsZXNVcGxvYWRDb25maWdPYmplY3RzO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLm1lZGljYWxVc2VyR3JvdXBzID0gdGhpcy5tZWRpY2FsVXNlckdyb3VwcztcclxuICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS50YWdDYXRlZ29yeSA9IHRoaXMudGFnQ2F0ZWdvcnk7XHJcbiAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UuZGlzcGxheVJlYWRXcml0ZUFjY2VzcyA9IHRoaXMuZGlzcGxheVJlYWRXcml0ZUFjY2VzcztcclxuICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS50YWdSZWZlcmVuY2VUYWJsZSA9IHRoaXMudGFnUmVmZXJlbmNlVGFibGU7XHJcbiAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UucHVibGljYXRpb25JZHMgPSBSZWZDb2RlVXRpbHMuR2V0TXVsdGlSZWZDb2RlQ2hvaWNlcyh0aGlzLmRvY3VtZW50VW5kZXJFZGl0LnB1YmxpY2F0aW9uKTtcclxuICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS5zdG9yZUdyb3VwSWRzID0gdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5yZXRhaWxGb3JtdWxhcztcclxuICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS5maWxlVHlwZSA9IHRoaXMuZmlsZVR5cGU7XHJcblxyXG4gICAgICAgIHRoaXMuX3ByZXBhcmVGaWxlUmlnaHRzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcHVwQ2xvc2VTdWIgPSB0aGlzLl9wb3B1cC5pbnN0YW5jZS5wb3B1cENsb3NlRXZlbnQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fdW5sb2NrRG9jdW1lbnQoKTtcclxuICAgICAgICAgICAgdGhpcy5wb3B1cE9wZW5lZFN0YXRlQ2hhbmdlLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cENsb3NlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY0NoYW5nZVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyBjb252ZXJ0RmlsZXNJbnRvQ29Eb2N1bWVudHMoZmlsZXM6IEZpbGVMaXN0KTogUHJvbWlzZTxDb0RvY3VtZW50W10+IHtcclxuICAgICAgICBjb25zdCBhbW91bnRPZkZpbGVzOiBudW1iZXIgPSBmaWxlcy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgZmlsZXNUb0FkZDogQ29Eb2N1bWVudFtdID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBhbW91bnRPZkZpbGVzOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZUFzRG9jdW1lbnQ6IENvRG9jdW1lbnQgPSBhd2FpdCB0aGlzLl9nZXRGaWxlQXNEb2N1bWVudChmaWxlc1tpXSk7XHJcbiAgICAgICAgICAgIGZpbGVBc0RvY3VtZW50LmluZGV4ID0gQ29Eb2N1bWVudFNoYXJlZEZpZWxkTG9naWMuR2VuZXJhdGVBdmFpbGFibGVJbmRleE5yKHRoaXMuZG9jdW1lbnRzIHx8IFtdKSArIGk7XHJcbiAgICAgICAgICAgIGZpbGVzVG9BZGQucHVzaChmaWxlQXNEb2N1bWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaWxlc1RvQWRkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBmaWxlc1BpY2tlZChmaWxlczogRmlsZUxpc3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxldCBhbGxGaWxlc0FyZVZhbGlkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3QgYW1vdW50T2ZGaWxlczogbnVtYmVyID0gZmlsZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYW1vdW50T2ZGaWxlczsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIUZpbGVVdGlscy5DaGVja01heFVwbG9hZFNpemUoZmlsZXNbaV0sIHRoaXMuX21heFVwbG9hZEZpbGVTaXplKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsbEZpbGVzQXJlVmFsaWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFhbGxGaWxlc0FyZVZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgLy9UT0RPIG1ha2UgZGlhbG9nU2VydmljZVxyXG4gICAgICAgICAgICAgICAgLy90aGlzLl9wcm9tcHRTZXJ2aWNlLnNob3dXYXJuaW5nKHRoaXMuX2RpY3Rpb25hcnlTZXJ2aWNlLmdldChcIkZJTEVfVE9PX0xBUkdFX1RPX1VQTE9BRFwiLCB0cnVlLCBcIlwiICsgRmlsZVV0aWxzLmdldE1heFVwbG9hZFNpemVJbk1iKHRoaXMuX21heFVwbG9hZEZpbGVTaXplKS50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlc1RvQWRkOiBDb0RvY3VtZW50W10gPSBhd2FpdCB0aGlzLmNvbnZlcnRGaWxlc0ludG9Db0RvY3VtZW50cyhmaWxlcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbGVzVG9BZGQubGVuZ3RoID4gMSB8fCB0aGlzLnVzZVdpdGhvdXRTZXR0aW5nUHJvcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50c0FkZGVkLmVtaXQoZmlsZXNUb0FkZCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRVbmRlckVkaXQgPSBmaWxlc1RvQWRkWzBdOyAvLyBTZXR0aW5nIGRvY1VuZGVyRWRpdCBvcGVucyB0aGUgcG9wdXAgd2luZG93XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuUG9wdXAoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlQWNjZXB0ZWRGaWxlVHlwZXNMb2FkZWQodmFsdWU6IEZpbGVUeXBlKTogdm9pZCB7XHJcbiAgICAgICAgLy9UT0RPIGZpeCBsb2FkaW5nXHJcbiAgICAgICAgLy90aGlzLmFjY2VwdGVkVXBsb2FkRm9ybWF0cyA9IHRoaXMuX2NvRG9jdW1lbnREYXRhTG9hZGVyLmdldEFsbG93ZWRFeHRlbnNpb25zRm9yVHlwZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0RmlsZUFzRG9jdW1lbnQoZmlsZTogRmlsZSk6IFByb21pc2U8Q29Eb2N1bWVudD4ge1xyXG4gICAgICAgIGNvbnN0IGZpbGVBc0NvRG9jdW1lbnQ6IENvRG9jdW1lbnQgPSBhd2FpdCBGaWxlVXRpbHMuUmVhZEZpbGVBc05ld0NvRG9jdW1lbnQoZmlsZSwgdGhpcy5yZXNpemVJbWFnZXMpO1xyXG4gICAgICAgIC8vIHNldCBzb21lIGV4dHJhIGtub3duIGZpZWxkcyBmb3IgdGhlIGNvZG9jdW1lbnQ6XHJcbiAgICAgICAgZmlsZUFzQ29Eb2N1bWVudC50YWJsZSA9IHRoaXMuZG9jdW1lbnRUYWJsZTtcclxuICAgICAgICBmaWxlQXNDb0RvY3VtZW50LmtleSA9IHRoaXMuZG9jdW1lbnRLZXk7XHJcbiAgICAgICAgLy9UT0RPIGZpeCBhZGQgdXNlcnNcclxuICAgICAgICAvL2ZpbGVBc0NvRG9jdW1lbnQuY3JlYXRpb25Vc2VyID0gdGhpcy5fdXNlclNlcnZpY2UudXNlck5hbWUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAvL2ZpbGVBc0NvRG9jdW1lbnQubW9kaWZpZWRVc2VyID0gdGhpcy5fdXNlclNlcnZpY2UudXNlck5hbWUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICBmaWxlQXNDb0RvY3VtZW50LmNyZWF0aW9uRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgZmlsZUFzQ29Eb2N1bWVudC5tb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGZpbGVBc0NvRG9jdW1lbnQuZmlsZVR5cGUgPSB0aGlzLmZpbGVUeXBlID8gdGhpcy5maWxlVHlwZSA6IEZpbGVVdGlscy5Jc0ltYWdlRmlsZShmaWxlKSA/IEZpbGVUeXBlLkltYWdlIDogRmlsZVR5cGUuRG9jdW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChmaWxlQXNDb0RvY3VtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmaWxlQXNDb0RvY3VtZW50O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9zZXRJbnRlcm5hbFBhcmFtT2JqKHZhbHVlOiBJbnRlcm5hbFBhcmFtKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgLy9UT0RPIGZpeCBwYXJhbXNcclxuICAgICAgICAvL2NvbnN0IHBhcmFtOiBJbnRlcm5hbFBhcmFtZXRlck9iamVjdCA9IGF3YWl0IHRoaXMuX2dlbmVyYWxEYWxSZXBvc2l0b3J5LmdldEludGVybmFsUGFyYW1PYmplY3QodmFsdWUpO1xyXG4gICAgICAgIC8vdGhpcy5fbWF4VXBsb2FkRmlsZVNpemUgPSBpc05hTihwYXJzZUludChwYXJhbS52YWx1ZSwgMCkpID8gdW5kZWZpbmVkIDogcGFyc2VJbnQocGFyYW0udmFsdWUsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgX2xvY2tEb2N1bWVudCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBpZiAoIXRoaXMuZG9jdW1lbnRVbmRlckVkaXQuZG9jdW1lbnRJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gTmV3IGRvY3VtZW50IGRvZXMgbm90IGhhdmUgYW4gSUQgYW5kIHRoZXJlZm9yZSBkb2VzIG5vdCBoYXZlIHRvIGJlIGxvY2tlZFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbG9ja09rOiBib29sZWFuID0gYXdhaXQgdGhpcy5sb2NrT3BlcmF0aW9uKENvRG9jdW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBsb2NrT2s7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfdW5sb2NrRG9jdW1lbnQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgIGlmICghdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5kb2N1bWVudElkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIE5ldyBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGFuIElEIGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgaGF2ZSB0byBiZSBsb2NrZWRcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdW5sb2NrT2s6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLnVubG9ja09wZXJhdGlvbihDb0RvY3VtZW50KTtcclxuICAgICAgcmV0dXJuIHVubG9ja09rO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3ByZXBhcmVGaWxlUmlnaHRzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxlbjogbnVtYmVyID0gdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5yaWdodHMubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByaWdodDogQ29Eb2N1bWVudFJpZ2h0ID0gdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5yaWdodHNbaV07XHJcbiAgICAgICAgICAgIGlmIChyaWdodC5yaWdodExldmVsID09PSBPYmplY3RSaWdodFR5cGUuUmVhZFdyaXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS51c2VyR3JvdXBzRm9yV3JpdGUucHVzaChyaWdodC51c2VyR3JvdXBJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJpZ2h0LnJpZ2h0TGV2ZWwgPT09IE9iamVjdFJpZ2h0VHlwZS5SZWFkT25seSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UudXNlckdyb3Vwc0ZvclJlYWQucHVzaChyaWdodC51c2VyR3JvdXBJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19