@simpleangularcontrols/sac-common 10.0.0-rc.21 → 10.0.0-rc.23

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 (539) hide show
  1. package/README.md +16 -16
  2. package/bundles/simpleangularcontrols-sac-common.umd.js +12400 -12358
  3. package/bundles/simpleangularcontrols-sac-common.umd.js.map +1 -1
  4. package/bundles/simpleangularcontrols-sac-common.umd.min.js +1 -1
  5. package/bundles/simpleangularcontrols-sac-common.umd.min.js.map +1 -1
  6. package/common/basedatetimecontrol.d.ts +169 -169
  7. package/common/basedatetimecontrol.ngfactory.d.ts +1 -1
  8. package/common/baseinputcontrol.d.ts +38 -38
  9. package/common/baseinputcontrol.ngfactory.d.ts +1 -1
  10. package/common/baselistcontrol.d.ts +43 -43
  11. package/common/baselistcontrol.ngfactory.d.ts +1 -1
  12. package/common/basemodelcontrol.d.ts +280 -280
  13. package/common/basemodelcontrol.ngfactory.d.ts +1 -1
  14. package/common/baseselectcontrol.d.ts +14 -14
  15. package/common/baseselectcontrol.ngfactory.d.ts +1 -1
  16. package/common/baseuploadcontrol.d.ts +300 -300
  17. package/common/baseuploadcontrol.ngfactory.d.ts +1 -1
  18. package/components/browser/browser.d.ts +267 -267
  19. package/components/browser/browser.ngfactory.d.ts +1 -1
  20. package/components/browser/models/browserfile.d.ts +17 -17
  21. package/components/browser/models/browserfile.ngfactory.d.ts +1 -1
  22. package/components/browser/models/browserfiledeleterequest.d.ts +18 -18
  23. package/components/browser/models/browserfiledeleterequest.ngfactory.d.ts +1 -1
  24. package/components/browser/models/browserfilerenamerequest.d.ts +22 -22
  25. package/components/browser/models/browserfilerenamerequest.ngfactory.d.ts +1 -1
  26. package/components/browser/models/browserfileresponse.d.ts +10 -10
  27. package/components/browser/models/browserfileresponse.ngfactory.d.ts +1 -1
  28. package/components/browser/models/browserfilesaverequest.d.ts +22 -22
  29. package/components/browser/models/browserfilesaverequest.ngfactory.d.ts +1 -1
  30. package/components/browser/models/browsernode.d.ts +34 -34
  31. package/components/browser/models/browsernode.ngfactory.d.ts +1 -1
  32. package/components/browser/models/browsernodedeleterequest.d.ts +14 -14
  33. package/components/browser/models/browsernodedeleterequest.ngfactory.d.ts +1 -1
  34. package/components/browser/models/browsernodenewrequest.d.ts +18 -18
  35. package/components/browser/models/browsernodenewrequest.ngfactory.d.ts +1 -1
  36. package/components/browser/models/browsernoderenamerequest.d.ts +18 -18
  37. package/components/browser/models/browsernoderenamerequest.ngfactory.d.ts +1 -1
  38. package/components/browser/models/browsernoderequest.d.ts +18 -18
  39. package/components/browser/models/browsernoderequest.ngfactory.d.ts +1 -1
  40. package/components/browser/models/browsernoderesponse.d.ts +10 -10
  41. package/components/browser/models/browsernoderesponse.ngfactory.d.ts +1 -1
  42. package/controls/buttons/button.d.ts +70 -70
  43. package/controls/buttons/button.ngfactory.d.ts +1 -1
  44. package/controls/checkbox/checkbox.d.ts +32 -32
  45. package/controls/checkbox/checkbox.ngfactory.d.ts +1 -1
  46. package/controls/checkbox/radiobutton.d.ts +114 -114
  47. package/controls/checkbox/radiobutton.ngfactory.d.ts +1 -1
  48. package/controls/checkbox/radiobuttons.d.ts +60 -60
  49. package/controls/checkbox/radiobuttons.ngfactory.d.ts +1 -1
  50. package/controls/confirm/confirm.button.d.ts +25 -25
  51. package/controls/confirm/confirm.button.ngfactory.d.ts +1 -1
  52. package/controls/confirm/confirm.d.ts +49 -49
  53. package/controls/confirm/confirm.ngfactory.d.ts +1 -1
  54. package/controls/confirm/confirm.service.d.ts +63 -63
  55. package/controls/confirm/confirm.service.ngfactory.d.ts +1 -1
  56. package/controls/contextmenu/contextmenu.d.ts +120 -120
  57. package/controls/contextmenu/contextmenu.interface.d.ts +3 -3
  58. package/controls/contextmenu/contextmenu.interface.ngfactory.d.ts +1 -1
  59. package/controls/contextmenu/contextmenu.ngfactory.d.ts +1 -1
  60. package/controls/contextmenu/contextmenuanchor.d.ts +15 -15
  61. package/controls/contextmenu/contextmenuanchor.ngfactory.d.ts +1 -1
  62. package/controls/contextmenu/contextmenucontainer.d.ts +15 -15
  63. package/controls/contextmenu/contextmenucontainer.ngfactory.d.ts +1 -1
  64. package/controls/contextmenu/contextmenuitem.d.ts +10 -10
  65. package/controls/contextmenu/contextmenuitem.ngfactory.d.ts +1 -1
  66. package/controls/contextmenu/contextmenuitembutton.d.ts +67 -67
  67. package/controls/contextmenu/contextmenuitembutton.ngfactory.d.ts +1 -1
  68. package/controls/datetime/date.d.ts +117 -117
  69. package/controls/datetime/date.ngfactory.d.ts +1 -1
  70. package/controls/datetime/dateselector.d.ts +161 -161
  71. package/controls/datetime/dateselector.ngfactory.d.ts +1 -1
  72. package/controls/datetime/datetime.d.ts +131 -131
  73. package/controls/datetime/datetime.ngfactory.d.ts +1 -1
  74. package/controls/datetime/time.d.ts +111 -111
  75. package/controls/datetime/time.ngfactory.d.ts +1 -1
  76. package/controls/dialog/dialog.d.ts +93 -93
  77. package/controls/dialog/dialog.ngfactory.d.ts +1 -1
  78. package/controls/form/form.d.ts +47 -47
  79. package/controls/form/form.ngfactory.d.ts +1 -1
  80. package/controls/grid/grid.d.ts +127 -127
  81. package/controls/grid/grid.ngfactory.d.ts +1 -1
  82. package/controls/grid/gridbutton.d.ts +33 -33
  83. package/controls/grid/gridbutton.ngfactory.d.ts +1 -1
  84. package/controls/grid/gridcolumn.d.ts +28 -28
  85. package/controls/grid/gridcolumn.ngfactory.d.ts +1 -1
  86. package/controls/grid/gridcolumnaction.d.ts +15 -15
  87. package/controls/grid/gridcolumnaction.ngfactory.d.ts +1 -1
  88. package/controls/grid/gridcolumnbase.d.ts +94 -94
  89. package/controls/grid/gridcolumnbase.ngfactory.d.ts +1 -1
  90. package/controls/grid/gridimage.d.ts +9 -9
  91. package/controls/grid/gridimage.ngfactory.d.ts +1 -1
  92. package/controls/grid/model.d.ts +92 -92
  93. package/controls/grid/model.ngfactory.d.ts +1 -1
  94. package/controls/grid/paging.d.ts +145 -145
  95. package/controls/grid/paging.ngfactory.d.ts +1 -1
  96. package/controls/input/input.d.ts +35 -35
  97. package/controls/input/input.ngfactory.d.ts +1 -1
  98. package/controls/input/inputarea.d.ts +26 -26
  99. package/controls/input/inputarea.ngfactory.d.ts +1 -1
  100. package/controls/input/inputcurrency.d.ts +11 -11
  101. package/controls/input/inputcurrency.ngfactory.d.ts +1 -1
  102. package/controls/input/inputdecimal.d.ts +59 -59
  103. package/controls/input/inputdecimal.ngfactory.d.ts +1 -1
  104. package/controls/input/inputemail.d.ts +19 -19
  105. package/controls/input/inputemail.ngfactory.d.ts +1 -1
  106. package/controls/input/inputinteger.d.ts +59 -59
  107. package/controls/input/inputinteger.ngfactory.d.ts +1 -1
  108. package/controls/input/inputpassword.d.ts +23 -23
  109. package/controls/input/inputpassword.ngfactory.d.ts +1 -1
  110. package/controls/input/inputsearch.d.ts +32 -32
  111. package/controls/input/inputsearch.ngfactory.d.ts +1 -1
  112. package/controls/layout/formlayout.d.ts +62 -62
  113. package/controls/layout/formlayout.ngfactory.d.ts +1 -1
  114. package/controls/list/buildvaluestring.d.ts +6 -6
  115. package/controls/list/buildvaluestring.ngfactory.d.ts +1 -1
  116. package/controls/list/dropdown.d.ts +96 -96
  117. package/controls/list/dropdown.ngfactory.d.ts +1 -1
  118. package/controls/list/dropdownoptions.d.ts +38 -38
  119. package/controls/list/dropdownoptions.ngfactory.d.ts +1 -1
  120. package/controls/list/list.module.d.ts +2 -2
  121. package/controls/list/list.module.ngfactory.d.ts +3 -3
  122. package/controls/list/listbox.d.ts +86 -86
  123. package/controls/list/listbox.ngfactory.d.ts +1 -1
  124. package/controls/multilanguage/multilanguageinput.d.ts +102 -102
  125. package/controls/multilanguage/multilanguageinput.ngfactory.d.ts +1 -1
  126. package/controls/multilanguage/multilanguageinputarea.d.ts +107 -107
  127. package/controls/multilanguage/multilanguageinputarea.ngfactory.d.ts +1 -1
  128. package/controls/static/formcontainer.d.ts +35 -35
  129. package/controls/static/formcontainer.ngfactory.d.ts +1 -1
  130. package/controls/static/staticlabel.d.ts +18 -18
  131. package/controls/static/staticlabel.ngfactory.d.ts +1 -1
  132. package/controls/tabs/tab.d.ts +45 -45
  133. package/controls/tabs/tab.ngfactory.d.ts +1 -1
  134. package/controls/tabs/tabitem.d.ts +30 -30
  135. package/controls/tabs/tabitem.ngfactory.d.ts +1 -1
  136. package/controls/tinymce/tinymce.d.ts +149 -149
  137. package/controls/tinymce/tinymce.ngfactory.d.ts +1 -1
  138. package/controls/tinymce/tinymcedialogsettings.d.ts +27 -27
  139. package/controls/tinymce/tinymcedialogsettings.ngfactory.d.ts +1 -1
  140. package/controls/tinymce/tinymcedialogsettingsmeta.d.ts +9 -9
  141. package/controls/tinymce/tinymcedialogsettingsmeta.ngfactory.d.ts +1 -1
  142. package/controls/tinymce/tinymceinstance.d.ts +10 -10
  143. package/controls/tinymce/tinymceinstance.ngfactory.d.ts +1 -1
  144. package/controls/tooltip/tooltip.d.ts +145 -145
  145. package/controls/tooltip/tooltip.ngfactory.d.ts +1 -1
  146. package/controls/treeview/treeview.d.ts +185 -185
  147. package/controls/treeview/treeview.ngfactory.d.ts +1 -1
  148. package/controls/upload/dropzonemultiple.d.ts +70 -70
  149. package/controls/upload/dropzonemultiple.ngfactory.d.ts +1 -1
  150. package/controls/upload/dropzonesingle.d.ts +47 -47
  151. package/controls/upload/dropzonesingle.ngfactory.d.ts +1 -1
  152. package/controls/upload/uploadmultiple.d.ts +50 -50
  153. package/controls/upload/uploadmultiple.ngfactory.d.ts +1 -1
  154. package/controls/upload/uploadsingle.d.ts +27 -27
  155. package/controls/upload/uploadsingle.ngfactory.d.ts +1 -1
  156. package/controls/validation/validationsummary.d.ts +60 -60
  157. package/controls/validation/validationsummary.ngfactory.d.ts +1 -1
  158. package/controls/wizard/wizard.d.ts +73 -73
  159. package/controls/wizard/wizard.ngfactory.d.ts +1 -1
  160. package/controls/wizard/wizarditem.d.ts +25 -25
  161. package/controls/wizard/wizarditem.ngfactory.d.ts +1 -1
  162. package/enums/ButtonRoleType.d.ts +1 -1
  163. package/enums/ButtonRoleType.ngfactory.d.ts +1 -1
  164. package/enums/ControlHeight.d.ts +17 -17
  165. package/enums/ControlHeight.ngfactory.d.ts +1 -1
  166. package/enums/IconType.d.ts +7 -7
  167. package/enums/IconType.ngfactory.d.ts +1 -1
  168. package/esm2015/common/basedatetimecontrol.js +329 -319
  169. package/esm2015/common/basedatetimecontrol.ngfactory.js +7 -7
  170. package/esm2015/common/baseinputcontrol.js +73 -73
  171. package/esm2015/common/baseinputcontrol.ngfactory.js +7 -7
  172. package/esm2015/common/baselistcontrol.js +55 -55
  173. package/esm2015/common/baselistcontrol.ngfactory.js +7 -7
  174. package/esm2015/common/basemodelcontrol.js +535 -535
  175. package/esm2015/common/basemodelcontrol.ngfactory.js +7 -7
  176. package/esm2015/common/baseselectcontrol.js +26 -26
  177. package/esm2015/common/baseselectcontrol.ngfactory.js +7 -7
  178. package/esm2015/common/baseuploadcontrol.js +490 -490
  179. package/esm2015/common/baseuploadcontrol.ngfactory.js +7 -7
  180. package/esm2015/components/browser/browser.js +545 -545
  181. package/esm2015/components/browser/browser.ngfactory.js +7 -7
  182. package/esm2015/components/browser/models/browserfile.js +1 -1
  183. package/esm2015/components/browser/models/browserfile.ngfactory.js +7 -7
  184. package/esm2015/components/browser/models/browserfiledeleterequest.js +13 -13
  185. package/esm2015/components/browser/models/browserfiledeleterequest.ngfactory.js +7 -7
  186. package/esm2015/components/browser/models/browserfilerenamerequest.js +13 -13
  187. package/esm2015/components/browser/models/browserfilerenamerequest.ngfactory.js +7 -7
  188. package/esm2015/components/browser/models/browserfileresponse.js +1 -1
  189. package/esm2015/components/browser/models/browserfileresponse.ngfactory.js +7 -7
  190. package/esm2015/components/browser/models/browserfilesaverequest.js +13 -13
  191. package/esm2015/components/browser/models/browserfilesaverequest.ngfactory.js +7 -7
  192. package/esm2015/components/browser/models/browsernode.js +1 -1
  193. package/esm2015/components/browser/models/browsernode.ngfactory.js +7 -7
  194. package/esm2015/components/browser/models/browsernodedeleterequest.js +13 -13
  195. package/esm2015/components/browser/models/browsernodedeleterequest.ngfactory.js +7 -7
  196. package/esm2015/components/browser/models/browsernodenewrequest.js +13 -13
  197. package/esm2015/components/browser/models/browsernodenewrequest.ngfactory.js +7 -7
  198. package/esm2015/components/browser/models/browsernoderenamerequest.js +13 -13
  199. package/esm2015/components/browser/models/browsernoderenamerequest.ngfactory.js +7 -7
  200. package/esm2015/components/browser/models/browsernoderequest.js +13 -13
  201. package/esm2015/components/browser/models/browsernoderequest.ngfactory.js +7 -7
  202. package/esm2015/components/browser/models/browsernoderesponse.js +1 -1
  203. package/esm2015/components/browser/models/browsernoderesponse.ngfactory.js +7 -7
  204. package/esm2015/controls/buttons/button.js +141 -141
  205. package/esm2015/controls/buttons/button.ngfactory.js +7 -7
  206. package/esm2015/controls/checkbox/checkbox.js +56 -56
  207. package/esm2015/controls/checkbox/checkbox.ngfactory.js +7 -7
  208. package/esm2015/controls/checkbox/radiobutton.js +164 -164
  209. package/esm2015/controls/checkbox/radiobutton.ngfactory.js +7 -7
  210. package/esm2015/controls/checkbox/radiobuttons.js +113 -113
  211. package/esm2015/controls/checkbox/radiobuttons.ngfactory.js +7 -7
  212. package/esm2015/controls/confirm/confirm.button.js +32 -32
  213. package/esm2015/controls/confirm/confirm.button.ngfactory.js +7 -7
  214. package/esm2015/controls/confirm/confirm.js +75 -75
  215. package/esm2015/controls/confirm/confirm.ngfactory.js +7 -7
  216. package/esm2015/controls/confirm/confirm.service.js +87 -87
  217. package/esm2015/controls/confirm/confirm.service.ngfactory.js +7 -7
  218. package/esm2015/controls/contextmenu/contextmenu.interface.js +1 -1
  219. package/esm2015/controls/contextmenu/contextmenu.interface.ngfactory.js +7 -7
  220. package/esm2015/controls/contextmenu/contextmenu.js +193 -193
  221. package/esm2015/controls/contextmenu/contextmenu.ngfactory.js +7 -7
  222. package/esm2015/controls/contextmenu/contextmenuanchor.js +22 -22
  223. package/esm2015/controls/contextmenu/contextmenuanchor.ngfactory.js +7 -7
  224. package/esm2015/controls/contextmenu/contextmenucontainer.js +22 -22
  225. package/esm2015/controls/contextmenu/contextmenucontainer.ngfactory.js +7 -7
  226. package/esm2015/controls/contextmenu/contextmenuitem.js +21 -21
  227. package/esm2015/controls/contextmenu/contextmenuitem.ngfactory.js +7 -7
  228. package/esm2015/controls/contextmenu/contextmenuitembutton.js +106 -106
  229. package/esm2015/controls/contextmenu/contextmenuitembutton.ngfactory.js +7 -7
  230. package/esm2015/controls/datetime/date.js +213 -213
  231. package/esm2015/controls/datetime/date.ngfactory.js +7 -7
  232. package/esm2015/controls/datetime/dateselector.js +458 -458
  233. package/esm2015/controls/datetime/dateselector.ngfactory.js +7 -7
  234. package/esm2015/controls/datetime/datetime.js +229 -229
  235. package/esm2015/controls/datetime/datetime.ngfactory.js +7 -7
  236. package/esm2015/controls/datetime/time.js +212 -212
  237. package/esm2015/controls/datetime/time.ngfactory.js +7 -7
  238. package/esm2015/controls/dialog/dialog.js +165 -165
  239. package/esm2015/controls/dialog/dialog.ngfactory.js +7 -7
  240. package/esm2015/controls/form/form.js +110 -110
  241. package/esm2015/controls/form/form.ngfactory.js +7 -7
  242. package/esm2015/controls/grid/grid.js +144 -144
  243. package/esm2015/controls/grid/grid.ngfactory.js +7 -7
  244. package/esm2015/controls/grid/gridbutton.js +60 -60
  245. package/esm2015/controls/grid/gridbutton.ngfactory.js +7 -7
  246. package/esm2015/controls/grid/gridcolumn.js +56 -56
  247. package/esm2015/controls/grid/gridcolumn.ngfactory.js +7 -7
  248. package/esm2015/controls/grid/gridcolumnaction.js +27 -27
  249. package/esm2015/controls/grid/gridcolumnaction.ngfactory.js +7 -7
  250. package/esm2015/controls/grid/gridcolumnbase.js +138 -138
  251. package/esm2015/controls/grid/gridcolumnbase.ngfactory.js +7 -7
  252. package/esm2015/controls/grid/gridimage.js +13 -13
  253. package/esm2015/controls/grid/gridimage.ngfactory.js +7 -7
  254. package/esm2015/controls/grid/model.js +100 -100
  255. package/esm2015/controls/grid/model.ngfactory.js +7 -7
  256. package/esm2015/controls/grid/paging.js +252 -252
  257. package/esm2015/controls/grid/paging.ngfactory.js +7 -7
  258. package/esm2015/controls/input/input.js +64 -64
  259. package/esm2015/controls/input/input.ngfactory.js +7 -7
  260. package/esm2015/controls/input/inputarea.js +61 -61
  261. package/esm2015/controls/input/inputarea.ngfactory.js +7 -7
  262. package/esm2015/controls/input/inputcurrency.js +31 -31
  263. package/esm2015/controls/input/inputcurrency.ngfactory.js +7 -7
  264. package/esm2015/controls/input/inputdecimal.js +146 -146
  265. package/esm2015/controls/input/inputdecimal.ngfactory.js +7 -7
  266. package/esm2015/controls/input/inputemail.js +41 -41
  267. package/esm2015/controls/input/inputemail.ngfactory.js +7 -7
  268. package/esm2015/controls/input/inputinteger.js +130 -130
  269. package/esm2015/controls/input/inputinteger.ngfactory.js +7 -7
  270. package/esm2015/controls/input/inputpassword.js +46 -46
  271. package/esm2015/controls/input/inputpassword.ngfactory.js +7 -7
  272. package/esm2015/controls/input/inputsearch.js +66 -66
  273. package/esm2015/controls/input/inputsearch.ngfactory.js +7 -7
  274. package/esm2015/controls/layout/formlayout.js +82 -82
  275. package/esm2015/controls/layout/formlayout.ngfactory.js +7 -7
  276. package/esm2015/controls/list/buildvaluestring.js +18 -18
  277. package/esm2015/controls/list/buildvaluestring.ngfactory.js +7 -7
  278. package/esm2015/controls/list/dropdown.js +172 -172
  279. package/esm2015/controls/list/dropdown.ngfactory.js +7 -7
  280. package/esm2015/controls/list/dropdownoptions.js +72 -72
  281. package/esm2015/controls/list/dropdownoptions.ngfactory.js +7 -7
  282. package/esm2015/controls/list/list.module.js +11 -11
  283. package/esm2015/controls/list/list.module.ngfactory.js +7 -7
  284. package/esm2015/controls/list/listbox.js +187 -187
  285. package/esm2015/controls/list/listbox.ngfactory.js +7 -7
  286. package/esm2015/controls/multilanguage/multilanguageinput.js +224 -224
  287. package/esm2015/controls/multilanguage/multilanguageinput.ngfactory.js +7 -7
  288. package/esm2015/controls/multilanguage/multilanguageinputarea.js +225 -225
  289. package/esm2015/controls/multilanguage/multilanguageinputarea.ngfactory.js +7 -7
  290. package/esm2015/controls/static/formcontainer.js +61 -61
  291. package/esm2015/controls/static/formcontainer.ngfactory.js +7 -7
  292. package/esm2015/controls/static/staticlabel.js +31 -31
  293. package/esm2015/controls/static/staticlabel.ngfactory.js +7 -7
  294. package/esm2015/controls/tabs/tab.js +72 -72
  295. package/esm2015/controls/tabs/tab.ngfactory.js +7 -7
  296. package/esm2015/controls/tabs/tabitem.js +32 -32
  297. package/esm2015/controls/tabs/tabitem.ngfactory.js +7 -7
  298. package/esm2015/controls/tinymce/tinymce.js +238 -238
  299. package/esm2015/controls/tinymce/tinymce.ngfactory.js +7 -7
  300. package/esm2015/controls/tinymce/tinymcedialogsettings.js +13 -13
  301. package/esm2015/controls/tinymce/tinymcedialogsettings.ngfactory.js +7 -7
  302. package/esm2015/controls/tinymce/tinymcedialogsettingsmeta.js +4 -4
  303. package/esm2015/controls/tinymce/tinymcedialogsettingsmeta.ngfactory.js +7 -7
  304. package/esm2015/controls/tinymce/tinymceinstance.js +1 -1
  305. package/esm2015/controls/tinymce/tinymceinstance.ngfactory.js +7 -7
  306. package/esm2015/controls/tooltip/tooltip.js +242 -242
  307. package/esm2015/controls/tooltip/tooltip.ngfactory.js +7 -7
  308. package/esm2015/controls/treeview/treeview.js +367 -367
  309. package/esm2015/controls/treeview/treeview.ngfactory.js +7 -7
  310. package/esm2015/controls/upload/dropzonemultiple.js +161 -163
  311. package/esm2015/controls/upload/dropzonemultiple.ngfactory.js +7 -7
  312. package/esm2015/controls/upload/dropzonesingle.js +108 -108
  313. package/esm2015/controls/upload/dropzonesingle.ngfactory.js +7 -7
  314. package/esm2015/controls/upload/uploadmultiple.js +121 -121
  315. package/esm2015/controls/upload/uploadmultiple.ngfactory.js +7 -7
  316. package/esm2015/controls/upload/uploadsingle.js +59 -55
  317. package/esm2015/controls/upload/uploadsingle.ngfactory.js +7 -7
  318. package/esm2015/controls/validation/validationsummary.js +133 -133
  319. package/esm2015/controls/validation/validationsummary.ngfactory.js +7 -7
  320. package/esm2015/controls/wizard/wizard.js +139 -139
  321. package/esm2015/controls/wizard/wizard.ngfactory.js +7 -7
  322. package/esm2015/controls/wizard/wizarditem.js +27 -27
  323. package/esm2015/controls/wizard/wizarditem.ngfactory.js +7 -7
  324. package/esm2015/enums/ButtonRoleType.js +1 -1
  325. package/esm2015/enums/ButtonRoleType.ngfactory.js +7 -7
  326. package/esm2015/enums/ControlHeight.js +19 -19
  327. package/esm2015/enums/ControlHeight.ngfactory.js +7 -7
  328. package/esm2015/enums/IconType.js +9 -9
  329. package/esm2015/enums/IconType.ngfactory.js +7 -7
  330. package/esm2015/interfaces/ISacConfigurationService.js +1 -1
  331. package/esm2015/interfaces/ISacConfigurationService.ngfactory.js +7 -7
  332. package/esm2015/interfaces/ISacFileBrowserService.js +1 -1
  333. package/esm2015/interfaces/ISacFileBrowserService.ngfactory.js +7 -7
  334. package/esm2015/interfaces/ISacIconService.js +1 -1
  335. package/esm2015/interfaces/ISacIconService.ngfactory.js +7 -7
  336. package/esm2015/interfaces/ISacLabelSizes.js +1 -1
  337. package/esm2015/interfaces/ISacLabelSizes.ngfactory.js +7 -7
  338. package/esm2015/interfaces/ISacLanguageService.js +1 -1
  339. package/esm2015/interfaces/ISacLanguageService.ngfactory.js +7 -7
  340. package/esm2015/interfaces/ISacLocalisationService.js +1 -1
  341. package/esm2015/interfaces/ISacLocalisationService.ngfactory.js +7 -7
  342. package/esm2015/interfaces/ISacUploadEventCompleteState.js +1 -1
  343. package/esm2015/interfaces/ISacUploadEventCompleteState.ngfactory.js +7 -7
  344. package/esm2015/interfaces/ISacValidationKeyService.js +1 -1
  345. package/esm2015/interfaces/ISacValidationKeyService.ngfactory.js +7 -7
  346. package/esm2015/interfaces/iabstractcontrollabel.js +1 -1
  347. package/esm2015/interfaces/iabstractcontrollabel.ngfactory.js +7 -7
  348. package/esm2015/interfaces/iconfirmcomponent.js +1 -1
  349. package/esm2015/interfaces/iconfirmcomponent.ngfactory.js +7 -7
  350. package/esm2015/interfaces/idatetimecontrol.js +1 -1
  351. package/esm2015/interfaces/idatetimecontrol.ngfactory.js +7 -7
  352. package/esm2015/interfaces/iuploadcontrol.js +1 -1
  353. package/esm2015/interfaces/iuploadcontrol.ngfactory.js +7 -7
  354. package/esm2015/interfaces/treeviewaction.interface.js +1 -1
  355. package/esm2015/interfaces/treeviewaction.interface.ngfactory.js +7 -7
  356. package/esm2015/models/languagemodel.js +13 -13
  357. package/esm2015/models/languagemodel.ngfactory.js +7 -7
  358. package/esm2015/public_api.js +108 -108
  359. package/esm2015/public_api.ngfactory.js +7 -7
  360. package/esm2015/services/index.js +7 -7
  361. package/esm2015/services/index.ngfactory.js +7 -7
  362. package/esm2015/services/sac-configuration.service.js +103 -103
  363. package/esm2015/services/sac-configuration.service.ngfactory.js +7 -7
  364. package/esm2015/services/sac-filebrowser.service.js +203 -203
  365. package/esm2015/services/sac-filebrowser.service.ngfactory.js +7 -7
  366. package/esm2015/services/sac-icon.service.js +191 -191
  367. package/esm2015/services/sac-icon.service.ngfactory.js +7 -7
  368. package/esm2015/services/sac-language.service.js +43 -43
  369. package/esm2015/services/sac-language.service.ngfactory.js +7 -7
  370. package/esm2015/services/sac-localisation.service.js +349 -349
  371. package/esm2015/services/sac-localisation.service.ngfactory.js +7 -7
  372. package/esm2015/services/sac-validationkey.service.js +159 -159
  373. package/esm2015/services/sac-validationkey.service.ngfactory.js +7 -7
  374. package/esm2015/simpleangularcontrols-sac-common.js +5 -5
  375. package/esm2015/simpleangularcontrols-sac-common.ngfactory.js +7 -7
  376. package/esm2015/utilities/convertion.js +32 -32
  377. package/esm2015/utilities/convertion.ngfactory.js +7 -7
  378. package/esm2015/utilities/datatypes.js +9 -9
  379. package/esm2015/utilities/datatypes.ngfactory.js +7 -7
  380. package/esm2015/utilities/enums.js +20 -20
  381. package/esm2015/utilities/enums.ngfactory.js +7 -7
  382. package/esm2015/utilities/guid.js +18 -18
  383. package/esm2015/utilities/guid.ngfactory.js +7 -7
  384. package/esm2015/utilities/interpolation.js +50 -50
  385. package/esm2015/utilities/interpolation.ngfactory.js +7 -7
  386. package/esm2015/utilities/popuphelper.js +343 -343
  387. package/esm2015/utilities/popuphelper.ngfactory.js +7 -7
  388. package/esm2015/utilities/positioning.js +301 -301
  389. package/esm2015/utilities/positioning.ngfactory.js +7 -7
  390. package/esm2015/validation/email.validator.js +13 -13
  391. package/esm2015/validation/email.validator.ngfactory.js +7 -7
  392. package/esm2015/validation/equals.validator.js +14 -14
  393. package/esm2015/validation/equals.validator.ngfactory.js +7 -7
  394. package/esm2015/validation/index.js +3 -3
  395. package/esm2015/validation/index.ngfactory.js +7 -7
  396. package/esm2015/validation/invaliddate.validator.js +14 -14
  397. package/esm2015/validation/invaliddate.validator.ngfactory.js +7 -7
  398. package/esm2015/validation/isDateValid.js +23 -23
  399. package/esm2015/validation/isDateValid.ngfactory.js +7 -7
  400. package/esm2015/validation/maxdate.validator.js +21 -21
  401. package/esm2015/validation/maxdate.validator.ngfactory.js +7 -7
  402. package/esm2015/validation/maxtime.validator.js +21 -21
  403. package/esm2015/validation/maxtime.validator.ngfactory.js +7 -7
  404. package/esm2015/validation/maxvalue.validator.js +16 -16
  405. package/esm2015/validation/maxvalue.validator.ngfactory.js +7 -7
  406. package/esm2015/validation/mindate.validator.js +21 -21
  407. package/esm2015/validation/mindate.validator.ngfactory.js +7 -7
  408. package/esm2015/validation/minfiles.validator.js +19 -19
  409. package/esm2015/validation/minfiles.validator.ngfactory.js +7 -7
  410. package/esm2015/validation/mintextlength.validator.js +23 -23
  411. package/esm2015/validation/mintextlength.validator.ngfactory.js +7 -7
  412. package/esm2015/validation/mintime.validator.js +21 -21
  413. package/esm2015/validation/mintime.validator.ngfactory.js +7 -7
  414. package/esm2015/validation/minvalue.validator.js +16 -16
  415. package/esm2015/validation/minvalue.validator.ngfactory.js +7 -7
  416. package/esm2015/validation/multilanguagerequired.validator.js +22 -22
  417. package/esm2015/validation/multilanguagerequired.validator.ngfactory.js +7 -7
  418. package/esm2015/validation/multilanguagerequiredany.validator.js +22 -22
  419. package/esm2015/validation/multilanguagerequiredany.validator.ngfactory.js +7 -7
  420. package/esm2015/validation/notequals.validator.js +14 -14
  421. package/esm2015/validation/notequals.validator.ngfactory.js +7 -7
  422. package/esm2015/validation/pattern.validator.js +16 -16
  423. package/esm2015/validation/pattern.validator.ngfactory.js +7 -7
  424. package/esm2015/validation/required.validator.js +13 -13
  425. package/esm2015/validation/required.validator.ngfactory.js +7 -7
  426. package/esm2015/validation/validation.class.js +218 -218
  427. package/esm2015/validation/validation.class.ngfactory.js +7 -7
  428. package/esm2015/validation/validationerrorcreator.js +11 -11
  429. package/esm2015/validation/validationerrorcreator.ngfactory.js +7 -7
  430. package/esm2015/validation/validationerroritem.js +27 -27
  431. package/esm2015/validation/validationerroritem.ngfactory.js +7 -7
  432. package/fesm2015/simpleangularcontrols-sac-common.js +10674 -10662
  433. package/fesm2015/simpleangularcontrols-sac-common.js.map +1 -1
  434. package/interfaces/ISacConfigurationService.d.ts +58 -58
  435. package/interfaces/ISacConfigurationService.ngfactory.d.ts +1 -1
  436. package/interfaces/ISacFileBrowserService.d.ts +65 -65
  437. package/interfaces/ISacFileBrowserService.ngfactory.d.ts +1 -1
  438. package/interfaces/ISacIconService.d.ts +113 -113
  439. package/interfaces/ISacIconService.ngfactory.d.ts +1 -1
  440. package/interfaces/ISacLabelSizes.d.ts +26 -26
  441. package/interfaces/ISacLabelSizes.ngfactory.d.ts +1 -1
  442. package/interfaces/ISacLanguageService.d.ts +12 -12
  443. package/interfaces/ISacLanguageService.ngfactory.d.ts +1 -1
  444. package/interfaces/ISacLocalisationService.d.ts +10 -10
  445. package/interfaces/ISacLocalisationService.ngfactory.d.ts +1 -1
  446. package/interfaces/ISacUploadEventCompleteState.d.ts +5 -5
  447. package/interfaces/ISacUploadEventCompleteState.ngfactory.d.ts +1 -1
  448. package/interfaces/ISacValidationKeyService.d.ts +52 -52
  449. package/interfaces/ISacValidationKeyService.ngfactory.d.ts +1 -1
  450. package/interfaces/iabstractcontrollabel.d.ts +6 -6
  451. package/interfaces/iabstractcontrollabel.ngfactory.d.ts +1 -1
  452. package/interfaces/iconfirmcomponent.d.ts +18 -18
  453. package/interfaces/iconfirmcomponent.ngfactory.d.ts +1 -1
  454. package/interfaces/idatetimecontrol.d.ts +7 -7
  455. package/interfaces/idatetimecontrol.ngfactory.d.ts +1 -1
  456. package/interfaces/iuploadcontrol.d.ts +9 -9
  457. package/interfaces/iuploadcontrol.ngfactory.d.ts +1 -1
  458. package/interfaces/treeviewaction.interface.d.ts +4 -4
  459. package/interfaces/treeviewaction.interface.ngfactory.d.ts +1 -1
  460. package/models/languagemodel.d.ts +22 -22
  461. package/models/languagemodel.ngfactory.d.ts +1 -1
  462. package/package.json +1 -1
  463. package/public_api.d.ts +86 -86
  464. package/public_api.ngfactory.d.ts +1 -1
  465. package/services/index.d.ts +6 -6
  466. package/services/index.ngfactory.d.ts +1 -1
  467. package/services/sac-configuration.service.d.ts +121 -121
  468. package/services/sac-configuration.service.ngfactory.d.ts +1 -1
  469. package/services/sac-filebrowser.service.d.ts +140 -140
  470. package/services/sac-filebrowser.service.ngfactory.d.ts +1 -1
  471. package/services/sac-icon.service.d.ts +232 -232
  472. package/services/sac-icon.service.ngfactory.d.ts +1 -1
  473. package/services/sac-language.service.d.ts +26 -26
  474. package/services/sac-language.service.ngfactory.d.ts +1 -1
  475. package/services/sac-localisation.service.d.ts +137 -137
  476. package/services/sac-localisation.service.ngfactory.d.ts +1 -1
  477. package/services/sac-validationkey.service.d.ts +55 -55
  478. package/services/sac-validationkey.service.ngfactory.d.ts +1 -1
  479. package/simpleangularcontrols-sac-common-10.0.0-rc.23.tgz +0 -0
  480. package/simpleangularcontrols-sac-common.d.ts +4 -4
  481. package/simpleangularcontrols-sac-common.metadata.json +1 -1
  482. package/simpleangularcontrols-sac-common.ngfactory.d.ts +1 -1
  483. package/utilities/convertion.d.ts +15 -15
  484. package/utilities/convertion.ngfactory.d.ts +1 -1
  485. package/utilities/datatypes.d.ts +6 -6
  486. package/utilities/datatypes.ngfactory.d.ts +1 -1
  487. package/utilities/enums.d.ts +12 -12
  488. package/utilities/enums.ngfactory.d.ts +1 -1
  489. package/utilities/guid.d.ts +4 -4
  490. package/utilities/guid.ngfactory.d.ts +1 -1
  491. package/utilities/interpolation.d.ts +21 -21
  492. package/utilities/interpolation.ngfactory.d.ts +1 -1
  493. package/utilities/popuphelper.d.ts +83 -83
  494. package/utilities/popuphelper.ngfactory.d.ts +1 -1
  495. package/utilities/positioning.d.ts +82 -82
  496. package/utilities/positioning.ngfactory.d.ts +1 -1
  497. package/validation/email.validator.d.ts +2 -2
  498. package/validation/email.validator.ngfactory.d.ts +1 -1
  499. package/validation/equals.validator.d.ts +2 -2
  500. package/validation/equals.validator.ngfactory.d.ts +1 -1
  501. package/validation/index.d.ts +2 -2
  502. package/validation/index.ngfactory.d.ts +1 -1
  503. package/validation/invaliddate.validator.d.ts +2 -2
  504. package/validation/invaliddate.validator.ngfactory.d.ts +1 -1
  505. package/validation/isDateValid.d.ts +5 -5
  506. package/validation/isDateValid.ngfactory.d.ts +1 -1
  507. package/validation/maxdate.validator.d.ts +2 -2
  508. package/validation/maxdate.validator.ngfactory.d.ts +1 -1
  509. package/validation/maxtime.validator.d.ts +2 -2
  510. package/validation/maxtime.validator.ngfactory.d.ts +1 -1
  511. package/validation/maxvalue.validator.d.ts +2 -2
  512. package/validation/maxvalue.validator.ngfactory.d.ts +1 -1
  513. package/validation/mindate.validator.d.ts +2 -2
  514. package/validation/mindate.validator.ngfactory.d.ts +1 -1
  515. package/validation/minfiles.validator.d.ts +2 -2
  516. package/validation/minfiles.validator.ngfactory.d.ts +1 -1
  517. package/validation/mintextlength.validator.d.ts +2 -2
  518. package/validation/mintextlength.validator.ngfactory.d.ts +1 -1
  519. package/validation/mintime.validator.d.ts +2 -2
  520. package/validation/mintime.validator.ngfactory.d.ts +1 -1
  521. package/validation/minvalue.validator.d.ts +2 -2
  522. package/validation/minvalue.validator.ngfactory.d.ts +1 -1
  523. package/validation/multilanguagerequired.validator.d.ts +3 -3
  524. package/validation/multilanguagerequired.validator.ngfactory.d.ts +1 -1
  525. package/validation/multilanguagerequiredany.validator.d.ts +3 -3
  526. package/validation/multilanguagerequiredany.validator.ngfactory.d.ts +1 -1
  527. package/validation/notequals.validator.d.ts +2 -2
  528. package/validation/notequals.validator.ngfactory.d.ts +1 -1
  529. package/validation/pattern.validator.d.ts +2 -2
  530. package/validation/pattern.validator.ngfactory.d.ts +1 -1
  531. package/validation/required.validator.d.ts +2 -2
  532. package/validation/required.validator.ngfactory.d.ts +1 -1
  533. package/validation/validation.class.d.ts +158 -158
  534. package/validation/validation.class.ngfactory.d.ts +1 -1
  535. package/validation/validationerrorcreator.d.ts +1 -1
  536. package/validation/validationerrorcreator.ngfactory.d.ts +1 -1
  537. package/validation/validationerroritem.d.ts +33 -33
  538. package/validation/validationerroritem.ngfactory.d.ts +1 -1
  539. package/simpleangularcontrols-sac-common-10.0.0-rc.21.tgz +0 -0
@@ -1,535 +1,535 @@
1
- import { SacFormLayoutCommon } from '../controls/layout/formlayout';
2
- import { ControlHeight } from '../enums/ControlHeight';
3
- import { SACICON_SERVICE, SACVALIDATIONKEY_SERVICE, SacDefaultIconService, SacDefaultValidationKeyService, } from '../services';
4
- import { SACCONFIGURATION_SERVICE, SacDefaultConfigurationService } from '../services/sac-configuration.service';
5
- import { SACLOCALISATION_SERVICE, SacDefaultLocalisationService } from '../services/sac-localisation.service';
6
- import { convertToBoolean } from '../utilities/convertion';
7
- import { createGuid } from '../utilities/guid';
8
- import { Directive, Host, Injector, Input } from '@angular/core';
9
- import { FormControlName, FormGroupDirective, NgControl, } from '@angular/forms';
10
- import { Observable } from 'rxjs';
11
- /**
12
- * Abstract Klasse für SacBaseModelControl. Implements ControlValueAccessor, Validator, OnInit
13
- */
14
- export class SacBaseModelControl {
15
- // #endregion Properties
16
- // #region Constructors
17
- /**
18
- * Constructor
19
- * @param formlayout SacFormLayoutCommon to define scoped layout settings
20
- * @param injector Injector for injecting services
21
- */
22
- constructor(formlayout, injector) {
23
- this.injector = injector;
24
- // #region Properties
25
- /**
26
- * Inline Errors für das Control
27
- */
28
- this._inlineerrorenabled = null;
29
- /**
30
- * Label Text
31
- */
32
- this._label = '';
33
- /**
34
- * Boolean Property dirty; default Wert - false
35
- */
36
- this._dirty = false;
37
- /**
38
- * SacModel Form ist disabled
39
- */
40
- this._disabledForm = false;
41
- /**
42
- * Boolean Property touched; default Wert - false
43
- */
44
- this._touched = false;
45
- /**
46
- * Interne Variable, die den Wert des Controls hält
47
- */
48
- this._value = null;
49
- /**
50
- * Form layout instance if exists
51
- */
52
- this.formlayout = null;
53
- /**
54
- * ControlHeight enum for use in HTML markup
55
- */
56
- this.ControlHeight = ControlHeight;
57
- /**
58
- * Defines the standard height of the components
59
- */
60
- this.componentHeight = null;
61
- /**
62
- * Deaktiviert das Input Control
63
- */
64
- this.disabled = false;
65
- /**
66
- * Deaktiviert das Label im Template
67
- */
68
- this.disablelabel = false;
69
- /**
70
- * Text to support the user during input.
71
- */
72
- this.helptext = '';
73
- /**
74
- * defines that error messages are displayed under the controls
75
- */
76
- this.inlineError = true;
77
- /**
78
- * defines that the labels are displayed as adaptive labels
79
- */
80
- this.isAdaptiveLabel = false;
81
- /**
82
- * default labe size for large devices
83
- */
84
- this.labelSizeLg = null;
85
- /**
86
- * default label size for medium devices
87
- */
88
- this.labelSizeMd = null;
89
- /**
90
- * default label size for small devices
91
- */
92
- this.labelSizeSm = null;
93
- /**
94
- * default label size for extra large devices
95
- */
96
- this.labelSizeXl = null;
97
- /**
98
- * default label column size
99
- */
100
- this.labelSizeXs = null;
101
- /**
102
- * default label size for extra extra large devices
103
- */
104
- this.labelSizeXxl = null;
105
- /**
106
- * Name des Controls
107
- */
108
- this.name = createGuid();
109
- /**
110
- * Leere Implementation von "propagateChange". Muss gemacht werden, damit kein Fehler entsteht
111
- */
112
- this.propagateChange = () => { };
113
- /**
114
- * Leere Implementation von "propagateTouch". Muss gemacht werden, damit kein Fehler entsteht
115
- */
116
- this.propagateTouch = () => { };
117
- /**
118
- * Detach label text and tooltip from each other in Label so that label and tooltip can be aligned differently. This is in Bootstrap 3 not supported!
119
- */
120
- this.splitlabelandhelptext = null;
121
- this.formlayout = formlayout;
122
- this.validationKeyService = injector.get(SACVALIDATIONKEY_SERVICE, new SacDefaultValidationKeyService());
123
- this.lngResourceService = injector.get(SACLOCALISATION_SERVICE, new SacDefaultLocalisationService(this.validationKeyService));
124
- this.configurationService = injector.get(SACCONFIGURATION_SERVICE, new SacDefaultConfigurationService());
125
- this.iconService = injector.get(SACICON_SERVICE, new SacDefaultIconService());
126
- }
127
- // #endregion Constructors
128
- // #region Public Getters And Setters
129
- /**
130
- * Get Icon for Helptext Tooltip
131
- */
132
- get HelptextTooltipIcon() {
133
- return this.iconService.GenericHelptextIcon;
134
- }
135
- /**
136
- * Methode ergibt Boolean Wert für dirty
137
- */
138
- get dirty() {
139
- if (this.ngControl !== null && this.ngControl !== undefined) {
140
- this._dirty = this.ngControl.dirty;
141
- }
142
- return this._dirty;
143
- }
144
- /**
145
- * Show error messages inline
146
- */
147
- get inlineerrorenabled() {
148
- return this._inlineerrorenabled;
149
- }
150
- /**
151
- * Aktiviert oder Deaktiviert die Inline Errors für das Control
152
- */
153
- set inlineerrorenabled(value) {
154
- if (value === null || value === undefined) {
155
- this._inlineerrorenabled = null;
156
- }
157
- else {
158
- this._inlineerrorenabled = convertToBoolean(value);
159
- }
160
- }
161
- /**
162
- * Methode ergibt boolean Wert wenn Form invalid oder nicht invalid ist
163
- */
164
- get invalid() {
165
- return this.ngControl !== undefined && this.ngControl !== null && this.ngControl.invalid;
166
- }
167
- /**
168
- * Definiert ob das Control disabled ist
169
- */
170
- get isdisabled() {
171
- return this._disabledForm || this.disabled;
172
- }
173
- /**
174
- * Returns whether the inline error messages are active for this control.
175
- */
176
- get isinlineerrorenabled() {
177
- var _a;
178
- if (this._inlineerrorenabled !== null) {
179
- return this._inlineerrorenabled;
180
- }
181
- if (this.formlayout !== null && this.formlayout.IsInlineErrorEnabled !== null) {
182
- return (_a = this.formlayout) === null || _a === void 0 ? void 0 : _a.IsInlineErrorEnabled;
183
- }
184
- if (this.configurationService.InlineErrorEnabled !== null) {
185
- return this.configurationService.InlineErrorEnabled;
186
- }
187
- return true;
188
- }
189
- /**
190
- * Definiert den Label Text
191
- */
192
- get label() {
193
- return this._label;
194
- }
195
- /**
196
- * Definiert den Label Text
197
- */
198
- set label(v) {
199
- this._label = v;
200
- this.UpdateLabelToControl();
201
- }
202
- /**
203
- * returns an object with all label sizes. These values can then be transferred to corresponding CSS classes using a pipe
204
- */
205
- get labelSizes() {
206
- return {
207
- labelSizeSm: this.labelSizeSm,
208
- labelSizeMd: this.labelSizeMd,
209
- labelSizeXs: this.labelSizeXs,
210
- labelSizeXl: this.labelSizeXl,
211
- labelSizeXxl: this.labelSizeXxl,
212
- labelSizeLg: this.labelSizeLg,
213
- };
214
- }
215
- /**
216
- * Methode ergibt Boolean Wert für touched
217
- */
218
- get touched() {
219
- if (this.ngControl !== null && this.ngControl !== undefined) {
220
- this._touched = this.ngControl.touched;
221
- }
222
- return this._touched;
223
- }
224
- /**
225
- * Get Methode für NgModel Binding in Html Markup
226
- */
227
- get value() {
228
- return this._value;
229
- }
230
- /**
231
- * Set Methode für NgModel Binding in Html Markup
232
- * Input wird benötigt, damit der Wert auch über das Markup gesetzt werden kann.
233
- */
234
- set value(v) {
235
- if (this.disabled) {
236
- return;
237
- }
238
- this._value = this.ConvertInputValue(v);
239
- this.propagateChange(this._value);
240
- }
241
- // #endregion Public Getters And Setters
242
- // #region Public Methods
243
- /**
244
- * Methode ergibt Error anhand von gegebenen Kriterien
245
- */
246
- GetErrorMessage() {
247
- if (this.ngControl.errors === undefined || this.ngControl.errors === null) {
248
- return new Observable((observer) => {
249
- observer.next('');
250
- observer.complete();
251
- });
252
- }
253
- const errors = this.ngControl.errors;
254
- if (errors.length === 0) {
255
- return new Observable((observer) => {
256
- observer.next('');
257
- observer.complete();
258
- });
259
- }
260
- const keys = Object.keys(errors);
261
- if (keys.length <= 0) {
262
- return new Observable((observer) => {
263
- observer.next('');
264
- observer.complete();
265
- });
266
- }
267
- const errorItem = errors[keys[0]];
268
- // Validation Parameters
269
- const parameters = {};
270
- if (errorItem.parameters !== null && errorItem.parameters !== undefined) {
271
- errorItem.parameters.forEach((v, k) => {
272
- parameters[k] = v;
273
- });
274
- }
275
- parameters['FIELD'] = errorItem.fieldName;
276
- return this.lngResourceService.GetString(errorItem.errorMessageKey, parameters);
277
- }
278
- /**
279
- * Init Event
280
- */
281
- ngOnInit() {
282
- // receive form via formcontrolname or formcontrol instance
283
- const formControl = this.injector.get(NgControl, null);
284
- if (formControl instanceof FormControlName) {
285
- const form = this.injector.get(FormGroupDirective, null);
286
- this.ngControl = form.getControl(formControl);
287
- }
288
- else {
289
- if (formControl) {
290
- this.ngControl = formControl.control;
291
- }
292
- }
293
- this.UpdateLabelToControl();
294
- // set label sizes from formlayout directive
295
- this.setLabelSizes();
296
- // set component heigth from fromlayout directive
297
- this.setComponentHeight();
298
- // set adaptive label property from formlayout directive
299
- this.setIsAdaptiveLabel();
300
- // set method to display helptext
301
- this.setHelpTextMode();
302
- // set SplitMode for Labels
303
- this.setLabelSplitMode();
304
- this.OnClassInit();
305
- }
306
- /**
307
- * Methode ergibt boolean touched = true
308
- */
309
- onTouch() {
310
- this._touched = true;
311
- this.propagateTouch();
312
- }
313
- /**
314
- * Methode, damit andere Controls änderungen im Control mitbekommen können
315
- * Zur Änderungsinfo die Methode propagateChange aufrufen.
316
- */
317
- registerOnChange(fn) {
318
- this.propagateChange = (obj) => fn(obj);
319
- }
320
- /**
321
- * Methode, damit andere Controls änderungen mitbekommen, wenn das Control aktiviert (Focus) wird.
322
- */
323
- registerOnTouched(fn) {
324
- this.propagateTouch = (obj) => fn(obj);
325
- }
326
- /**
327
- * Methode registriert Änderungen bei der Validierung
328
- */
329
- registerOnValidatorChange(fn) {
330
- this._onChange = fn;
331
- }
332
- /**
333
- * Setzt das Control auf Disabled
334
- */
335
- setDisabledState(isDisabled) {
336
- this._disabledForm = isDisabled;
337
- }
338
- /**
339
- * Methode die den Wert des Inputs setzt
340
- */
341
- setValue(v) {
342
- this.value = v;
343
- }
344
- /**
345
- * Validator Methode
346
- */
347
- validate(c) {
348
- const error = this.validateData(c);
349
- return error;
350
- }
351
- /**
352
- * Methode zum schreiben von Werten aus dem Model in das Control
353
- */
354
- writeValue(value) {
355
- this._value = value;
356
- }
357
- // #endregion Public Methods
358
- // #region Protected Methods
359
- /**
360
- * Method can Overwriten in Parent Classes
361
- * @param value Wert welcher in den korrekten Typ konvertiert werden soll
362
- * @returns Wert im korrekten Typ
363
- */
364
- ConvertInputValue(value) {
365
- return value;
366
- }
367
- /**
368
- * Methode ergibt Decimal Symbol
369
- */
370
- GetDecimalSymbol() {
371
- return '.';
372
- }
373
- /**
374
- * Method can be used to Set Properties at Class Init
375
- */
376
- OnClassInit() { }
377
- /**
378
- * Aktualisiert den NgModel Wert und die Gültigkeit des Validators des Controls
379
- */
380
- UpdateValueAndValidity() {
381
- if (this.ngControl) {
382
- this.ngControl.updateValueAndValidity({ onlySelf: true });
383
- }
384
- }
385
- // #endregion Protected Methods
386
- // #region Private Methods
387
- UpdateLabelToControl() {
388
- // HACK: Add addition property to FormControl. Can be fixed if solution for ticket: https://github.com/angular/angular/issues/19686
389
- if (this.ngControl) {
390
- this.ngControl.controllabel = this.label;
391
- }
392
- }
393
- /**
394
- * Set component height from property or parent layout control
395
- */
396
- setComponentHeight() {
397
- var _a;
398
- // set size extra small
399
- if (!this.componentHeight) {
400
- if ((_a = this.formlayout) === null || _a === void 0 ? void 0 : _a.componentHeight) {
401
- this.componentHeight = this.formlayout.componentHeight;
402
- }
403
- else {
404
- this.componentHeight = this.configurationService.ComponentHeight;
405
- }
406
- }
407
- }
408
- /**
409
- * Set mode for helptext. Can be tooltip or text
410
- */
411
- setHelpTextMode() {
412
- var _a;
413
- if (!this.helptextmode) {
414
- if ((_a = this.formlayout) === null || _a === void 0 ? void 0 : _a.helptextmode) {
415
- this.helptextmode = this.formlayout.helptextmode;
416
- }
417
- else {
418
- this.helptextmode = this.configurationService.HelptextMode;
419
- }
420
- }
421
- }
422
- /**
423
- * Set adaptive label property from parent layout control
424
- */
425
- setIsAdaptiveLabel() {
426
- var _a;
427
- if (!this.isAdaptiveLabel) {
428
- if (((_a = this.formlayout) === null || _a === void 0 ? void 0 : _a.isAdaptiveLabel) !== undefined) {
429
- this.isAdaptiveLabel = this.formlayout.isAdaptiveLabel;
430
- }
431
- else {
432
- this.isAdaptiveLabel = false;
433
- }
434
- }
435
- }
436
- /**
437
- * Set label sizes from property or parent layout control
438
- */
439
- setLabelSizes() {
440
- var _a, _b, _c, _d, _e, _f;
441
- // set size extra small
442
- if (!this.labelSizeXs) {
443
- if ((_a = this.formlayout) === null || _a === void 0 ? void 0 : _a.labelSizeXs) {
444
- this.labelSizeXs = this.formlayout.labelSizeXs;
445
- }
446
- else {
447
- this.labelSizeXs = this.configurationService.LabelSizeXs;
448
- }
449
- }
450
- // set size small
451
- if (!this.labelSizeSm) {
452
- if ((_b = this.formlayout) === null || _b === void 0 ? void 0 : _b.labelSizeSm) {
453
- this.labelSizeSm = this.formlayout.labelSizeSm;
454
- }
455
- else {
456
- this.labelSizeSm = this.configurationService.LabelSizeSm;
457
- }
458
- }
459
- // set size medium
460
- if (!this.labelSizeMd) {
461
- if ((_c = this.formlayout) === null || _c === void 0 ? void 0 : _c.labelSizeMd) {
462
- this.labelSizeMd = this.formlayout.labelSizeMd;
463
- }
464
- else {
465
- this.labelSizeMd = this.configurationService.LabelSizeMd;
466
- }
467
- }
468
- // set size large
469
- if (!this.labelSizeLg) {
470
- if ((_d = this.formlayout) === null || _d === void 0 ? void 0 : _d.labelSizeLg) {
471
- this.labelSizeLg = this.formlayout.labelSizeLg;
472
- }
473
- else {
474
- this.labelSizeLg = this.configurationService.LabelSizeLg;
475
- }
476
- }
477
- // set size extra large
478
- if (!this.labelSizeXl) {
479
- if ((_e = this.formlayout) === null || _e === void 0 ? void 0 : _e.labelSizeXl) {
480
- this.labelSizeXl = this.formlayout.labelSizeXl;
481
- }
482
- else {
483
- this.labelSizeXl = this.configurationService.LabelSizeXl;
484
- }
485
- }
486
- // set size extra extra large
487
- if (!this.labelSizeXxl) {
488
- if ((_f = this.formlayout) === null || _f === void 0 ? void 0 : _f.labelSizeXxl) {
489
- this.labelSizeXxl = this.formlayout.labelSizeXxl;
490
- }
491
- else {
492
- this.labelSizeXxl = this.configurationService.LabelSizeXxl;
493
- }
494
- }
495
- }
496
- setLabelSplitMode() {
497
- var _a;
498
- if (!this.splitlabelandhelptext) {
499
- if ((_a = this.formlayout) === null || _a === void 0 ? void 0 : _a.splitlabelandhelptext) {
500
- this.splitlabelandhelptext = this.formlayout.splitlabelandhelptext;
501
- }
502
- else {
503
- this.splitlabelandhelptext = this.configurationService.SplitLabelAndHelptext;
504
- }
505
- }
506
- }
507
- }
508
- SacBaseModelControl.decorators = [
509
- { type: Directive }
510
- ];
511
- SacBaseModelControl.ctorParameters = () => [
512
- { type: SacFormLayoutCommon, decorators: [{ type: Host }] },
513
- { type: Injector }
514
- ];
515
- SacBaseModelControl.propDecorators = {
516
- componentHeight: [{ type: Input }],
517
- disabled: [{ type: Input }],
518
- disablelabel: [{ type: Input }],
519
- helptext: [{ type: Input }],
520
- helptextmode: [{ type: Input }],
521
- inlineError: [{ type: Input }],
522
- isAdaptiveLabel: [{ type: Input }],
523
- labelSizeLg: [{ type: Input }],
524
- labelSizeMd: [{ type: Input }],
525
- labelSizeSm: [{ type: Input }],
526
- labelSizeXl: [{ type: Input }],
527
- labelSizeXs: [{ type: Input }],
528
- labelSizeXxl: [{ type: Input }],
529
- name: [{ type: Input }],
530
- splitlabelandhelptext: [{ type: Input }],
531
- inlineerrorenabled: [{ type: Input }],
532
- label: [{ type: Input }],
533
- value: [{ type: Input }]
534
- };
535
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZW1vZGVsY29udHJvbC5qcyIsInNvdXJjZVJvb3QiOiJDOi9Qcm9qZWt0ZS9zaW1wbGVhbmd1bGFyY29udHJvbHMtbmcxMC9jaC5qbmV0d29yay5zYWMtY29udHJvbHMvcHJvamVjdHMvc2FjLWNvbW1vbi9zcmMvIiwic291cmNlcyI6WyJjb21tb24vYmFzZW1vZGVsY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFPdkQsT0FBTyxFQUNILGVBQWUsRUFDZix3QkFBd0IsRUFDeEIscUJBQXFCLEVBQ3JCLDhCQUE4QixHQUNqQyxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqSCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN6RSxPQUFPLEVBSUgsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixTQUFTLEdBR1osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxDOztHQUVHO0FBRUgsTUFBTSxPQUFnQixtQkFBbUI7SUF1S3JDLHdCQUF3QjtJQUV4Qix1QkFBdUI7SUFFdkI7Ozs7T0FJRztJQUNILFlBQW9CLFVBQStCLEVBQW1CLFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUEvS3hGLHFCQUFx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QUM7OztZQS9tQkosU0FBUzs7O1lBbkNELG1CQUFtQix1QkFvTlgsSUFBSTtZQWpNSyxRQUFROzs7OEJBd0Y3QixLQUFLO3VCQU1MLEtBQUs7MkJBS0wsS0FBSzt1QkFLTCxLQUFLOzJCQUtMLEtBQUs7MEJBTUwsS0FBSzs4QkFLTCxLQUFLOzBCQUtMLEtBQUs7MEJBTUwsS0FBSzswQkFNTCxLQUFLOzBCQU1MLEtBQUs7MEJBTUwsS0FBSzsyQkFNTCxLQUFLO21CQU1MLEtBQUs7b0NBZUwsS0FBSztpQ0E4REwsS0FBSztvQkFvREwsS0FBSztvQkF5Q0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNhY0Zvcm1MYXlvdXRDb21tb24gfSBmcm9tICcuLi9jb250cm9scy9sYXlvdXQvZm9ybWxheW91dCc7XHJcbmltcG9ydCB7IENvbnRyb2xIZWlnaHQgfSBmcm9tICcuLi9lbnVtcy9Db250cm9sSGVpZ2h0JztcclxuaW1wb3J0IHsgSVNhY0NvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JU2FjQ29uZmlndXJhdGlvblNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJU2FjSWNvblNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lTYWNJY29uU2VydmljZSc7XHJcbmltcG9ydCB7IElTYWNMYWJlbFNpemVzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JU2FjTGFiZWxTaXplcyc7XHJcbmltcG9ydCB7IElTYWNMb2NhbGlzYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JU2FjTG9jYWxpc2F0aW9uU2VydmljZSc7XHJcbmltcG9ydCB7IElTYWNWYWxpZGF0aW9uS2V5U2VydmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVNhY1ZhbGlkYXRpb25LZXlTZXJ2aWNlJztcclxuaW1wb3J0IHsgSUFic3RyYWN0Q29udHJvbExhYmVsRXh0ZW5zaW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pYWJzdHJhY3Rjb250cm9sbGFiZWwnO1xyXG5pbXBvcnQge1xyXG4gICAgU0FDSUNPTl9TRVJWSUNFLFxyXG4gICAgU0FDVkFMSURBVElPTktFWV9TRVJWSUNFLFxyXG4gICAgU2FjRGVmYXVsdEljb25TZXJ2aWNlLFxyXG4gICAgU2FjRGVmYXVsdFZhbGlkYXRpb25LZXlTZXJ2aWNlLFxyXG59IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgU0FDQ09ORklHVVJBVElPTl9TRVJWSUNFLCBTYWNEZWZhdWx0Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zYWMtY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU0FDTE9DQUxJU0FUSU9OX1NFUlZJQ0UsIFNhY0RlZmF1bHRMb2NhbGlzYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc2FjLWxvY2FsaXNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgY29udmVydFRvQm9vbGVhbiB9IGZyb20gJy4uL3V0aWxpdGllcy9jb252ZXJ0aW9uJztcclxuaW1wb3J0IHsgY3JlYXRlR3VpZCB9IGZyb20gJy4uL3V0aWxpdGllcy9ndWlkJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9ySXRlbSB9IGZyb20gJy4uL3ZhbGlkYXRpb24nO1xyXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3QsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcclxuICAgIEZvcm1Db250cm9sLFxyXG4gICAgRm9ybUNvbnRyb2xOYW1lLFxyXG4gICAgRm9ybUdyb3VwRGlyZWN0aXZlLFxyXG4gICAgTmdDb250cm9sLFxyXG4gICAgVmFsaWRhdGlvbkVycm9ycyxcclxuICAgIFZhbGlkYXRvcixcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuXHJcbi8qKlxyXG4gKiBBYnN0cmFjdCBLbGFzc2UgZsO8ciBTYWNCYXNlTW9kZWxDb250cm9sLiBJbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3IsIE9uSW5pdFxyXG4gKi9cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTYWNCYXNlTW9kZWxDb250cm9sPFZBTFVFPiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3IsIE9uSW5pdCB7XHJcbiAgICAvLyAjcmVnaW9uIFByb3BlcnRpZXNcclxuXHJcbiAgICAvKipcclxuICAgICAqIElubGluZSBFcnJvcnMgZsO8ciBkYXMgQ29udHJvbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9pbmxpbmVlcnJvcmVuYWJsZWQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIExhYmVsIFRleHRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbGFiZWw6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VydmljZSBmb3IgbG9hZGluZyBkZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgY29udHJvbHNcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZ3VyYXRpb25TZXJ2aWNlOiBJU2FjQ29uZmlndXJhdGlvblNlcnZpY2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCb29sZWFuIFByb3BlcnR5IGRpcnR5OyBkZWZhdWx0IFdlcnQgLSBmYWxzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgX2RpcnR5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTYWNNb2RlbCBGb3JtIGlzdCBkaXNhYmxlZFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgX2Rpc2FibGVkRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdG9yXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBfb25DaGFuZ2U6ICgpID0+IHZvaWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCb29sZWFuIFByb3BlcnR5IHRvdWNoZWQ7IGRlZmF1bHQgV2VydCAtIGZhbHNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBfdG91Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuZSBWYXJpYWJsZSwgZGllIGRlbiBXZXJ0IGRlcyBDb250cm9scyBow6RsdFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgX3ZhbHVlOiBWQUxVRSA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JtIGxheW91dCBpbnN0YW5jZSBpZiBleGlzdHNcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGZvcm1sYXlvdXQ6IFNhY0Zvcm1MYXlvdXRDb21tb24gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogaWNvbiBzZXJ2aWNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBpY29uU2VydmljZTogSVNhY0ljb25TZXJ2aWNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VydmljZSBmw7xyIEVycm9yIExvY2FsaXNhdGlvblxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgbG5nUmVzb3VyY2VTZXJ2aWNlOiBJU2FjTG9jYWxpc2F0aW9uU2VydmljZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIG5nQ29udHJvbFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgbmdDb250cm9sOiBGb3JtQ29udHJvbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRyb2xIZWlnaHQgZW51bSBmb3IgdXNlIGluIEhUTUwgbWFya3VwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDb250cm9sSGVpZ2h0OiB0eXBlb2YgQ29udHJvbEhlaWdodCA9IENvbnRyb2xIZWlnaHQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHRoZSBzdGFuZGFyZCBoZWlnaHQgb2YgdGhlIGNvbXBvbmVudHNcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBjb21wb25lbnRIZWlnaHQ6IENvbnRyb2xIZWlnaHQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlYWt0aXZpZXJ0IGRhcyBJbnB1dCBDb250cm9sXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVha3RpdmllcnQgZGFzIExhYmVsIGltIFRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlbGFiZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRleHQgdG8gc3VwcG9ydCB0aGUgdXNlciBkdXJpbmcgaW5wdXQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwdGV4dDogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb2RlIGZvciBkaXNwbGF5IGhlbHB0ZXh0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaGVscHRleHRtb2RlOiAndG9vbHRpcCcgfCAndGV4dCcgfCBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogZGVmaW5lcyB0aGF0IGVycm9yIG1lc3NhZ2VzIGFyZSBkaXNwbGF5ZWQgdW5kZXIgdGhlIGNvbnRyb2xzXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpbmxpbmVFcnJvcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBkZWZpbmVzIHRoYXQgdGhlIGxhYmVscyBhcmUgZGlzcGxheWVkIGFzIGFkYXB0aXZlIGxhYmVsc1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNBZGFwdGl2ZUxhYmVsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBkZWZhdWx0IGxhYmUgc2l6ZSBmb3IgbGFyZ2UgZGV2aWNlc1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxhYmVsU2l6ZUxnOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGRlZmF1bHQgbGFiZWwgc2l6ZSBmb3IgbWVkaXVtIGRldmljZXNcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBsYWJlbFNpemVNZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBkZWZhdWx0IGxhYmVsIHNpemUgZm9yIHNtYWxsIGRldmljZXNcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBsYWJlbFNpemVTbTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBkZWZhdWx0IGxhYmVsIHNpemUgZm9yIGV4dHJhIGxhcmdlIGRldmljZXNcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBsYWJlbFNpemVYbDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBkZWZhdWx0IGxhYmVsIGNvbHVtbiBzaXplXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbGFiZWxTaXplWHM6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogZGVmYXVsdCBsYWJlbCBzaXplIGZvciBleHRyYSBleHRyYSBsYXJnZSBkZXZpY2VzXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbGFiZWxTaXplWHhsOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE5hbWUgZGVzIENvbnRyb2xzXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBjcmVhdGVHdWlkKCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMZWVyZSBJbXBsZW1lbnRhdGlvbiB2b24gXCJwcm9wYWdhdGVDaGFuZ2VcIi4gTXVzcyBnZW1hY2h0IHdlcmRlbiwgZGFtaXQga2VpbiBGZWhsZXIgZW50c3RlaHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByb3BhZ2F0ZUNoYW5nZTogYW55ID0gKCkgPT4ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMZWVyZSBJbXBsZW1lbnRhdGlvbiB2b24gXCJwcm9wYWdhdGVUb3VjaFwiLiBNdXNzIGdlbWFjaHQgd2VyZGVuLCBkYW1pdCBrZWluIEZlaGxlciBlbnRzdGVodFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvcGFnYXRlVG91Y2g6IGFueSA9ICgpID0+IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0YWNoIGxhYmVsIHRleHQgYW5kIHRvb2x0aXAgZnJvbSBlYWNoIG90aGVyIGluIExhYmVsIHNvIHRoYXQgbGFiZWwgYW5kIHRvb2x0aXAgY2FuIGJlIGFsaWduZWQgZGlmZmVyZW50bHkuIFRoaXMgaXMgaW4gQm9vdHN0cmFwIDMgbm90IHN1cHBvcnRlZCFcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzcGxpdGxhYmVsYW5kaGVscHRleHQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcnZpY2UgdG8gcmVjZWl2ZSBzdGFuZGFyZCB2YWxpZGF0aW9uIG1lc3NhZ2Uga2V5cyBhbmQgdGV4dHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHZhbGlkYXRpb25LZXlTZXJ2aWNlOiBJU2FjVmFsaWRhdGlvbktleVNlcnZpY2U7XHJcblxyXG4gICAgLy8gI2VuZHJlZ2lvbiBQcm9wZXJ0aWVzXHJcblxyXG4gICAgLy8gI3JlZ2lvbiBDb25zdHJ1Y3RvcnNcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yXHJcbiAgICAgKiBAcGFyYW0gZm9ybWxheW91dCBTYWNGb3JtTGF5b3V0Q29tbW9uIHRvIGRlZmluZSBzY29wZWQgbGF5b3V0IHNldHRpbmdzXHJcbiAgICAgKiBAcGFyYW0gaW5qZWN0b3IgSW5qZWN0b3IgZm9yIGluamVjdGluZyBzZXJ2aWNlc1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihASG9zdCgpIGZvcm1sYXlvdXQ6IFNhY0Zvcm1MYXlvdXRDb21tb24sIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtbGF5b3V0ID0gZm9ybWxheW91dDtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25LZXlTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KFNBQ1ZBTElEQVRJT05LRVlfU0VSVklDRSwgbmV3IFNhY0RlZmF1bHRWYWxpZGF0aW9uS2V5U2VydmljZSgpKTtcclxuICAgICAgICB0aGlzLmxuZ1Jlc291cmNlU2VydmljZSA9IGluamVjdG9yLmdldChcclxuICAgICAgICAgICAgU0FDTE9DQUxJU0FUSU9OX1NFUlZJQ0UsXHJcbiAgICAgICAgICAgIG5ldyBTYWNEZWZhdWx0TG9jYWxpc2F0aW9uU2VydmljZSh0aGlzLnZhbGlkYXRpb25LZXlTZXJ2aWNlKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UgPSBpbmplY3Rvci5nZXQoU0FDQ09ORklHVVJBVElPTl9TRVJWSUNFLCBuZXcgU2FjRGVmYXVsdENvbmZpZ3VyYXRpb25TZXJ2aWNlKCkpO1xyXG5cclxuICAgICAgICB0aGlzLmljb25TZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KFNBQ0lDT05fU0VSVklDRSwgbmV3IFNhY0RlZmF1bHRJY29uU2VydmljZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAjZW5kcmVnaW9uIENvbnN0cnVjdG9yc1xyXG5cclxuICAgIC8vICNyZWdpb24gUHVibGljIEdldHRlcnMgQW5kIFNldHRlcnNcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBJY29uIGZvciBIZWxwdGV4dCBUb29sdGlwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgSGVscHRleHRUb29sdGlwSWNvbigpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLkdlbmVyaWNIZWxwdGV4dEljb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2RlIGVyZ2lidCBCb29sZWFuIFdlcnQgZsO8ciBkaXJ0eVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGRpcnR5KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCAhPT0gbnVsbCAmJiB0aGlzLm5nQ29udHJvbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdGhpcy5uZ0NvbnRyb2wuZGlydHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fZGlydHk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93IGVycm9yIG1lc3NhZ2VzIGlubGluZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGlubGluZWVycm9yZW5hYmxlZCgpOiBib29sZWFuIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lubGluZWVycm9yZW5hYmxlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFrdGl2aWVydCBvZGVyIERlYWt0aXZpZXJ0IGRpZSBJbmxpbmUgRXJyb3JzIGbDvHIgZGFzIENvbnRyb2xcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZXQgaW5saW5lZXJyb3JlbmFibGVkKHZhbHVlOiBib29sZWFuIHwgbnVsbCkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lubGluZWVycm9yZW5hYmxlZCA9IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5faW5saW5lZXJyb3JlbmFibGVkID0gY29udmVydFRvQm9vbGVhbih2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kZSBlcmdpYnQgYm9vbGVhbiBXZXJ0IHdlbm4gRm9ybSBpbnZhbGlkIG9kZXIgbmljaHQgaW52YWxpZCBpc3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpbnZhbGlkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5nQ29udHJvbCAhPT0gdW5kZWZpbmVkICYmIHRoaXMubmdDb250cm9sICE9PSBudWxsICYmIHRoaXMubmdDb250cm9sLmludmFsaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmllcnQgb2IgZGFzIENvbnRyb2wgZGlzYWJsZWQgaXN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaXNkaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWRGb3JtIHx8IHRoaXMuZGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGlubGluZSBlcnJvciBtZXNzYWdlcyBhcmUgYWN0aXZlIGZvciB0aGlzIGNvbnRyb2wuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaXNpbmxpbmVlcnJvcmVuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lubGluZWVycm9yZW5hYmxlZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW5saW5lZXJyb3JlbmFibGVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybWxheW91dCAhPT0gbnVsbCAmJiB0aGlzLmZvcm1sYXlvdXQuSXNJbmxpbmVFcnJvckVuYWJsZWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWxheW91dD8uSXNJbmxpbmVFcnJvckVuYWJsZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5JbmxpbmVFcnJvckVuYWJsZWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuSW5saW5lRXJyb3JFbmFibGVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmllcnQgZGVuIExhYmVsIFRleHRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBsYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluaWVydCBkZW4gTGFiZWwgVGV4dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2V0IGxhYmVsKHY6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX2xhYmVsID0gdjtcclxuICAgICAgICB0aGlzLlVwZGF0ZUxhYmVsVG9Db250cm9sKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGFsbCBsYWJlbCBzaXplcy4gVGhlc2UgdmFsdWVzIGNhbiB0aGVuIGJlIHRyYW5zZmVycmVkIHRvIGNvcnJlc3BvbmRpbmcgQ1NTIGNsYXNzZXMgdXNpbmcgYSBwaXBlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgbGFiZWxTaXplcygpOiBJU2FjTGFiZWxTaXplcyB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGFiZWxTaXplU206IHRoaXMubGFiZWxTaXplU20sXHJcbiAgICAgICAgICAgIGxhYmVsU2l6ZU1kOiB0aGlzLmxhYmVsU2l6ZU1kLFxyXG4gICAgICAgICAgICBsYWJlbFNpemVYczogdGhpcy5sYWJlbFNpemVYcyxcclxuICAgICAgICAgICAgbGFiZWxTaXplWGw6IHRoaXMubGFiZWxTaXplWGwsXHJcbiAgICAgICAgICAgIGxhYmVsU2l6ZVh4bDogdGhpcy5sYWJlbFNpemVYeGwsXHJcbiAgICAgICAgICAgIGxhYmVsU2l6ZUxnOiB0aGlzLmxhYmVsU2l6ZUxnLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2RlIGVyZ2lidCBCb29sZWFuIFdlcnQgZsO8ciB0b3VjaGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgdG91Y2hlZCgpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT09IG51bGwgJiYgdGhpcy5uZ0NvbnRyb2wgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl90b3VjaGVkID0gdGhpcy5uZ0NvbnRyb2wudG91Y2hlZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl90b3VjaGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IE1ldGhvZGUgZsO8ciBOZ01vZGVsIEJpbmRpbmcgaW4gSHRtbCBNYXJrdXBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBWQUxVRSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IE1ldGhvZGUgZsO8ciBOZ01vZGVsIEJpbmRpbmcgaW4gSHRtbCBNYXJrdXBcclxuICAgICAqIElucHV0IHdpcmQgYmVuw7Z0aWd0LCBkYW1pdCBkZXIgV2VydCBhdWNoIMO8YmVyIGRhcyBNYXJrdXAgZ2VzZXR6dCB3ZXJkZW4ga2Fubi5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZXQgdmFsdWUodjogVkFMVUUpIHtcclxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl92YWx1ZSA9IHRoaXMuQ29udmVydElucHV0VmFsdWUodik7XHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5fdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICNlbmRyZWdpb24gUHVibGljIEdldHRlcnMgQW5kIFNldHRlcnNcclxuXHJcbiAgICAvLyAjcmVnaW9uIFB1YmxpYyBNZXRob2RzXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2RlIGVyZ2lidCBFcnJvciBhbmhhbmQgdm9uIGdlZ2ViZW5lbiBLcml0ZXJpZW5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldEVycm9yTWVzc2FnZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbC5lcnJvcnMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLm5nQ29udHJvbC5lcnJvcnMgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHN0cmluZz4oKG9ic2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzID0gdGhpcy5uZ0NvbnRyb2wuZXJyb3JzO1xyXG5cclxuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8c3RyaW5nPigob2JzZXJ2ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoJycpO1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGVycm9ycyk7XHJcblxyXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxzdHJpbmc+KChvYnNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVycm9ySXRlbTogVmFsaWRhdGlvbkVycm9ySXRlbSA9IGVycm9yc1trZXlzWzBdXTtcclxuXHJcbiAgICAgICAgLy8gVmFsaWRhdGlvbiBQYXJhbWV0ZXJzXHJcbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHt9O1xyXG4gICAgICAgIGlmIChlcnJvckl0ZW0ucGFyYW1ldGVycyAhPT0gbnVsbCAmJiBlcnJvckl0ZW0ucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGVycm9ySXRlbS5wYXJhbWV0ZXJzLmZvckVhY2goKHYsIGspID0+IHtcclxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNba10gPSB2O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGFyYW1ldGVyc1snRklFTEQnXSA9IGVycm9ySXRlbS5maWVsZE5hbWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmxuZ1Jlc291cmNlU2VydmljZS5HZXRTdHJpbmcoZXJyb3JJdGVtLmVycm9yTWVzc2FnZUtleSwgcGFyYW1ldGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0IEV2ZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICAvLyByZWNlaXZlIGZvcm0gdmlhIGZvcm1jb250cm9sbmFtZSBvciBmb3JtY29udHJvbCBpbnN0YW5jZVxyXG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sLCBudWxsKTtcclxuICAgICAgICBpZiAoZm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbE5hbWUpIHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuaW5qZWN0b3IuZ2V0KEZvcm1Hcm91cERpcmVjdGl2ZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMubmdDb250cm9sID0gZm9ybS5nZXRDb250cm9sKGZvcm1Db250cm9sKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmdDb250cm9sID0gZm9ybUNvbnRyb2wuY29udHJvbCBhcyBGb3JtQ29udHJvbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5VcGRhdGVMYWJlbFRvQ29udHJvbCgpO1xyXG5cclxuICAgICAgICAvLyBzZXQgbGFiZWwgc2l6ZXMgZnJvbSBmb3JtbGF5b3V0IGRpcmVjdGl2ZVxyXG4gICAgICAgIHRoaXMuc2V0TGFiZWxTaXplcygpO1xyXG5cclxuICAgICAgICAvLyBzZXQgY29tcG9uZW50IGhlaWd0aCBmcm9tIGZyb21sYXlvdXQgZGlyZWN0aXZlXHJcbiAgICAgICAgdGhpcy5zZXRDb21wb25lbnRIZWlnaHQoKTtcclxuXHJcbiAgICAgICAgLy8gc2V0IGFkYXB0aXZlIGxhYmVsIHByb3BlcnR5IGZyb20gZm9ybWxheW91dCBkaXJlY3RpdmVcclxuICAgICAgICB0aGlzLnNldElzQWRhcHRpdmVMYWJlbCgpO1xyXG5cclxuICAgICAgICAvLyBzZXQgbWV0aG9kIHRvIGRpc3BsYXkgaGVscHRleHRcclxuICAgICAgICB0aGlzLnNldEhlbHBUZXh0TW9kZSgpO1xyXG5cclxuICAgICAgICAvLyBzZXQgU3BsaXRNb2RlIGZvciBMYWJlbHNcclxuICAgICAgICB0aGlzLnNldExhYmVsU3BsaXRNb2RlKCk7XHJcblxyXG4gICAgICAgIHRoaXMuT25DbGFzc0luaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZGUgZXJnaWJ0IGJvb2xlYW4gdG91Y2hlZCA9IHRydWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uVG91Y2goKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdG91Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVUb3VjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kZSwgZGFtaXQgYW5kZXJlIENvbnRyb2xzIMOkbmRlcnVuZ2VuIGltIENvbnRyb2wgbWl0YmVrb21tZW4ga8O2bm5lblxyXG4gICAgICogWnVyIMOEbmRlcnVuZ3NpbmZvIGRpZSBNZXRob2RlIHByb3BhZ2F0ZUNoYW5nZSBhdWZydWZlbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gKG9iaikgPT4gZm4ob2JqKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZGUsIGRhbWl0IGFuZGVyZSBDb250cm9scyDDpG5kZXJ1bmdlbiBtaXRiZWtvbW1lbiwgd2VubiBkYXMgQ29udHJvbCBha3RpdmllcnQgKEZvY3VzKSB3aXJkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlVG91Y2ggPSAob2JqKSA9PiBmbihvYmopO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kZSByZWdpc3RyaWVydCDDhG5kZXJ1bmdlbiBiZWkgZGVyIFZhbGlkaWVydW5nXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHp0IGRhcyBDb250cm9sIGF1ZiBEaXNhYmxlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZGlzYWJsZWRGb3JtID0gaXNEaXNhYmxlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZGUgZGllIGRlbiBXZXJ0IGRlcyBJbnB1dHMgc2V0enRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFZhbHVlKHY6IFZBTFVFKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0b3IgTWV0aG9kZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsaWRhdGUoYzogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGVycm9yOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IHRoaXMudmFsaWRhdGVEYXRhKGMpO1xyXG4gICAgICAgIHJldHVybiBlcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFic3RyYWt0ZSBWYWxpZGF0b3IgTWV0aG9kZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWJzdHJhY3QgdmFsaWRhdGVEYXRhKGM6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kZSB6dW0gc2NocmVpYmVuIHZvbiBXZXJ0ZW4gYXVzIGRlbSBNb2RlbCBpbiBkYXMgQ29udHJvbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogVkFMVUUpIHtcclxuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICNlbmRyZWdpb24gUHVibGljIE1ldGhvZHNcclxuXHJcbiAgICAvLyAjcmVnaW9uIFByb3RlY3RlZCBNZXRob2RzXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgY2FuIE92ZXJ3cml0ZW4gaW4gUGFyZW50IENsYXNzZXNcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBXZXJ0IHdlbGNoZXIgaW4gZGVuIGtvcnJla3RlbiBUeXAga29udmVydGllcnQgd2VyZGVuIHNvbGxcclxuICAgICAqIEByZXR1cm5zIFdlcnQgaW0ga29ycmVrdGVuIFR5cFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgQ29udmVydElucHV0VmFsdWUodmFsdWU6IFZBTFVFKTogVkFMVUUge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZGUgZXJnaWJ0IERlY2ltYWwgU3ltYm9sXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBHZXREZWNpbWFsU3ltYm9sKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICcuJztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCBjYW4gYmUgdXNlZCB0byBTZXQgUHJvcGVydGllcyBhdCBDbGFzcyBJbml0XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBPbkNsYXNzSW5pdCgpOiB2b2lkIHt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBa3R1YWxpc2llcnQgZGVuIE5nTW9kZWwgV2VydCB1bmQgZGllIEfDvGx0aWdrZWl0IGRlcyBWYWxpZGF0b3JzIGRlcyBDb250cm9sc1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgVXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAjZW5kcmVnaW9uIFByb3RlY3RlZCBNZXRob2RzXHJcblxyXG4gICAgLy8gI3JlZ2lvbiBQcml2YXRlIE1ldGhvZHNcclxuXHJcbiAgICBwcml2YXRlIFVwZGF0ZUxhYmVsVG9Db250cm9sKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIEhBQ0s6IEFkZCBhZGRpdGlvbiBwcm9wZXJ0eSB0byBGb3JtQ29udHJvbC4gQ2FuIGJlIGZpeGVkIGlmIHNvbHV0aW9uIGZvciB0aWNrZXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE5Njg2XHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7XHJcbiAgICAgICAgICAgICh0aGlzLm5nQ29udHJvbCBhcyB1bmtub3duIGFzIElBYnN0cmFjdENvbnRyb2xMYWJlbEV4dGVuc2lvbikuY29udHJvbGxhYmVsID0gdGhpcy5sYWJlbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgY29tcG9uZW50IGhlaWdodCBmcm9tIHByb3BlcnR5IG9yIHBhcmVudCBsYXlvdXQgY29udHJvbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldENvbXBvbmVudEhlaWdodCgpIHtcclxuICAgICAgICAvLyBzZXQgc2l6ZSBleHRyYSBzbWFsbFxyXG4gICAgICAgIGlmICghdGhpcy5jb21wb25lbnRIZWlnaHQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWxheW91dD8uY29tcG9uZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEhlaWdodCA9IHRoaXMuZm9ybWxheW91dC5jb21wb25lbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEhlaWdodCA9IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuQ29tcG9uZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IG1vZGUgZm9yIGhlbHB0ZXh0LiBDYW4gYmUgdG9vbHRpcCBvciB0ZXh0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0SGVscFRleHRNb2RlKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5oZWxwdGV4dG1vZGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWxheW91dD8uaGVscHRleHRtb2RlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlbHB0ZXh0bW9kZSA9IHRoaXMuZm9ybWxheW91dC5oZWxwdGV4dG1vZGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlbHB0ZXh0bW9kZSA9IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuSGVscHRleHRNb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGFkYXB0aXZlIGxhYmVsIHByb3BlcnR5IGZyb20gcGFyZW50IGxheW91dCBjb250cm9sXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0SXNBZGFwdGl2ZUxhYmVsKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0FkYXB0aXZlTGFiZWwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWxheW91dD8uaXNBZGFwdGl2ZUxhYmVsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNBZGFwdGl2ZUxhYmVsID0gdGhpcy5mb3JtbGF5b3V0LmlzQWRhcHRpdmVMYWJlbDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNBZGFwdGl2ZUxhYmVsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgbGFiZWwgc2l6ZXMgZnJvbSBwcm9wZXJ0eSBvciBwYXJlbnQgbGF5b3V0IGNvbnRyb2xcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXRMYWJlbFNpemVzKCkge1xyXG4gICAgICAgIC8vIHNldCBzaXplIGV4dHJhIHNtYWxsXHJcbiAgICAgICAgaWYgKCF0aGlzLmxhYmVsU2l6ZVhzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1sYXlvdXQ/LmxhYmVsU2l6ZVhzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsU2l6ZVhzID0gdGhpcy5mb3JtbGF5b3V0LmxhYmVsU2l6ZVhzO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbFNpemVYcyA9IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuTGFiZWxTaXplWHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHNldCBzaXplIHNtYWxsXHJcbiAgICAgICAgaWYgKCF0aGlzLmxhYmVsU2l6ZVNtKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1sYXlvdXQ/LmxhYmVsU2l6ZVNtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsU2l6ZVNtID0gdGhpcy5mb3JtbGF5b3V0LmxhYmVsU2l6ZVNtO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbFNpemVTbSA9IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuTGFiZWxTaXplU207XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHNldCBzaXplIG1lZGl1bVxyXG4gICAgICAgIGlmICghdGhpcy5sYWJlbFNpemVNZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtbGF5b3V0Py5sYWJlbFNpemVNZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbFNpemVNZCA9IHRoaXMuZm9ybWxheW91dC5sYWJlbFNpemVNZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxTaXplTWQgPSB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLkxhYmVsU2l6ZU1kO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzZXQgc2l6ZSBsYXJnZVxyXG4gICAgICAgIGlmICghdGhpcy5sYWJlbFNpemVMZykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtbGF5b3V0Py5sYWJlbFNpemVMZykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbFNpemVMZyA9IHRoaXMuZm9ybWxheW91dC5sYWJlbFNpemVMZztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxTaXplTGcgPSB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLkxhYmVsU2l6ZUxnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzZXQgc2l6ZSBleHRyYSBsYXJnZVxyXG4gICAgICAgIGlmICghdGhpcy5sYWJlbFNpemVYbCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtbGF5b3V0Py5sYWJlbFNpemVYbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbFNpemVYbCA9IHRoaXMuZm9ybWxheW91dC5sYWJlbFNpemVYbDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxTaXplWGwgPSB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLkxhYmVsU2l6ZVhsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzZXQgc2l6ZSBleHRyYSBleHRyYSBsYXJnZVxyXG4gICAgICAgIGlmICghdGhpcy5sYWJlbFNpemVYeGwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWxheW91dD8ubGFiZWxTaXplWHhsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsU2l6ZVh4bCA9IHRoaXMuZm9ybWxheW91dC5sYWJlbFNpemVYeGw7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsU2l6ZVh4bCA9IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuTGFiZWxTaXplWHhsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0TGFiZWxTcGxpdE1vZGUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNwbGl0bGFiZWxhbmRoZWxwdGV4dCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtbGF5b3V0Py5zcGxpdGxhYmVsYW5kaGVscHRleHQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3BsaXRsYWJlbGFuZGhlbHB0ZXh0ID0gdGhpcy5mb3JtbGF5b3V0LnNwbGl0bGFiZWxhbmRoZWxwdGV4dDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3BsaXRsYWJlbGFuZGhlbHB0ZXh0ID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5TcGxpdExhYmVsQW5kSGVscHRleHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gI2VuZHJlZ2lvbiBQcml2YXRlIE1ldGhvZHNcclxufVxyXG4iXX0=
1
+ import { SacFormLayoutCommon } from '../controls/layout/formlayout';
2
+ import { ControlHeight } from '../enums/ControlHeight';
3
+ import { SACICON_SERVICE, SACVALIDATIONKEY_SERVICE, SacDefaultIconService, SacDefaultValidationKeyService, } from '../services';
4
+ import { SACCONFIGURATION_SERVICE, SacDefaultConfigurationService } from '../services/sac-configuration.service';
5
+ import { SACLOCALISATION_SERVICE, SacDefaultLocalisationService } from '../services/sac-localisation.service';
6
+ import { convertToBoolean } from '../utilities/convertion';
7
+ import { createGuid } from '../utilities/guid';
8
+ import { Directive, Host, Injector, Input } from '@angular/core';
9
+ import { FormControlName, FormGroupDirective, NgControl, } from '@angular/forms';
10
+ import { Observable } from 'rxjs';
11
+ /**
12
+ * Abstract Klasse für SacBaseModelControl. Implements ControlValueAccessor, Validator, OnInit
13
+ */
14
+ export class SacBaseModelControl {
15
+ // #endregion Properties
16
+ // #region Constructors
17
+ /**
18
+ * Constructor
19
+ * @param formlayout SacFormLayoutCommon to define scoped layout settings
20
+ * @param injector Injector for injecting services
21
+ */
22
+ constructor(formlayout, injector) {
23
+ this.injector = injector;
24
+ // #region Properties
25
+ /**
26
+ * Inline Errors für das Control
27
+ */
28
+ this._inlineerrorenabled = null;
29
+ /**
30
+ * Label Text
31
+ */
32
+ this._label = '';
33
+ /**
34
+ * Boolean Property dirty; default Wert - false
35
+ */
36
+ this._dirty = false;
37
+ /**
38
+ * SacModel Form ist disabled
39
+ */
40
+ this._disabledForm = false;
41
+ /**
42
+ * Boolean Property touched; default Wert - false
43
+ */
44
+ this._touched = false;
45
+ /**
46
+ * Interne Variable, die den Wert des Controls hält
47
+ */
48
+ this._value = null;
49
+ /**
50
+ * Form layout instance if exists
51
+ */
52
+ this.formlayout = null;
53
+ /**
54
+ * ControlHeight enum for use in HTML markup
55
+ */
56
+ this.ControlHeight = ControlHeight;
57
+ /**
58
+ * Defines the standard height of the components
59
+ */
60
+ this.componentHeight = null;
61
+ /**
62
+ * Deaktiviert das Input Control
63
+ */
64
+ this.disabled = false;
65
+ /**
66
+ * Deaktiviert das Label im Template
67
+ */
68
+ this.disablelabel = false;
69
+ /**
70
+ * Text to support the user during input.
71
+ */
72
+ this.helptext = '';
73
+ /**
74
+ * defines that error messages are displayed under the controls
75
+ */
76
+ this.inlineError = true;
77
+ /**
78
+ * defines that the labels are displayed as adaptive labels
79
+ */
80
+ this.isAdaptiveLabel = false;
81
+ /**
82
+ * default labe size for large devices
83
+ */
84
+ this.labelSizeLg = null;
85
+ /**
86
+ * default label size for medium devices
87
+ */
88
+ this.labelSizeMd = null;
89
+ /**
90
+ * default label size for small devices
91
+ */
92
+ this.labelSizeSm = null;
93
+ /**
94
+ * default label size for extra large devices
95
+ */
96
+ this.labelSizeXl = null;
97
+ /**
98
+ * default label column size
99
+ */
100
+ this.labelSizeXs = null;
101
+ /**
102
+ * default label size for extra extra large devices
103
+ */
104
+ this.labelSizeXxl = null;
105
+ /**
106
+ * Name des Controls
107
+ */
108
+ this.name = createGuid();
109
+ /**
110
+ * Leere Implementation von "propagateChange". Muss gemacht werden, damit kein Fehler entsteht
111
+ */
112
+ this.propagateChange = () => { };
113
+ /**
114
+ * Leere Implementation von "propagateTouch". Muss gemacht werden, damit kein Fehler entsteht
115
+ */
116
+ this.propagateTouch = () => { };
117
+ /**
118
+ * Detach label text and tooltip from each other in Label so that label and tooltip can be aligned differently. This is in Bootstrap 3 not supported!
119
+ */
120
+ this.splitlabelandhelptext = null;
121
+ this.formlayout = formlayout;
122
+ this.validationKeyService = injector.get(SACVALIDATIONKEY_SERVICE, new SacDefaultValidationKeyService());
123
+ this.lngResourceService = injector.get(SACLOCALISATION_SERVICE, new SacDefaultLocalisationService(this.validationKeyService));
124
+ this.configurationService = injector.get(SACCONFIGURATION_SERVICE, new SacDefaultConfigurationService());
125
+ this.iconService = injector.get(SACICON_SERVICE, new SacDefaultIconService());
126
+ }
127
+ // #endregion Constructors
128
+ // #region Public Getters And Setters
129
+ /**
130
+ * Get Icon for Helptext Tooltip
131
+ */
132
+ get HelptextTooltipIcon() {
133
+ return this.iconService.GenericHelptextIcon;
134
+ }
135
+ /**
136
+ * Methode ergibt Boolean Wert für dirty
137
+ */
138
+ get dirty() {
139
+ if (this.ngControl !== null && this.ngControl !== undefined) {
140
+ this._dirty = this.ngControl.dirty;
141
+ }
142
+ return this._dirty;
143
+ }
144
+ /**
145
+ * Show error messages inline
146
+ */
147
+ get inlineerrorenabled() {
148
+ return this._inlineerrorenabled;
149
+ }
150
+ /**
151
+ * Aktiviert oder Deaktiviert die Inline Errors für das Control
152
+ */
153
+ set inlineerrorenabled(value) {
154
+ if (value === null || value === undefined) {
155
+ this._inlineerrorenabled = null;
156
+ }
157
+ else {
158
+ this._inlineerrorenabled = convertToBoolean(value);
159
+ }
160
+ }
161
+ /**
162
+ * Methode ergibt boolean Wert wenn Form invalid oder nicht invalid ist
163
+ */
164
+ get invalid() {
165
+ return this.ngControl !== undefined && this.ngControl !== null && this.ngControl.invalid;
166
+ }
167
+ /**
168
+ * Definiert ob das Control disabled ist
169
+ */
170
+ get isdisabled() {
171
+ return this._disabledForm || this.disabled;
172
+ }
173
+ /**
174
+ * Returns whether the inline error messages are active for this control.
175
+ */
176
+ get isinlineerrorenabled() {
177
+ var _a;
178
+ if (this._inlineerrorenabled !== null) {
179
+ return this._inlineerrorenabled;
180
+ }
181
+ if (this.formlayout !== null && this.formlayout.IsInlineErrorEnabled !== null) {
182
+ return (_a = this.formlayout) === null || _a === void 0 ? void 0 : _a.IsInlineErrorEnabled;
183
+ }
184
+ if (this.configurationService.InlineErrorEnabled !== null) {
185
+ return this.configurationService.InlineErrorEnabled;
186
+ }
187
+ return true;
188
+ }
189
+ /**
190
+ * Definiert den Label Text
191
+ */
192
+ get label() {
193
+ return this._label;
194
+ }
195
+ /**
196
+ * Definiert den Label Text
197
+ */
198
+ set label(v) {
199
+ this._label = v;
200
+ this.UpdateLabelToControl();
201
+ }
202
+ /**
203
+ * returns an object with all label sizes. These values can then be transferred to corresponding CSS classes using a pipe
204
+ */
205
+ get labelSizes() {
206
+ return {
207
+ labelSizeSm: this.labelSizeSm,
208
+ labelSizeMd: this.labelSizeMd,
209
+ labelSizeXs: this.labelSizeXs,
210
+ labelSizeXl: this.labelSizeXl,
211
+ labelSizeXxl: this.labelSizeXxl,
212
+ labelSizeLg: this.labelSizeLg,
213
+ };
214
+ }
215
+ /**
216
+ * Methode ergibt Boolean Wert für touched
217
+ */
218
+ get touched() {
219
+ if (this.ngControl !== null && this.ngControl !== undefined) {
220
+ this._touched = this.ngControl.touched;
221
+ }
222
+ return this._touched;
223
+ }
224
+ /**
225
+ * Get Methode für NgModel Binding in Html Markup
226
+ */
227
+ get value() {
228
+ return this._value;
229
+ }
230
+ /**
231
+ * Set Methode für NgModel Binding in Html Markup
232
+ * Input wird benötigt, damit der Wert auch über das Markup gesetzt werden kann.
233
+ */
234
+ set value(v) {
235
+ if (this.disabled) {
236
+ return;
237
+ }
238
+ this._value = this.ConvertInputValue(v);
239
+ this.propagateChange(this._value);
240
+ }
241
+ // #endregion Public Getters And Setters
242
+ // #region Public Methods
243
+ /**
244
+ * Methode ergibt Error anhand von gegebenen Kriterien
245
+ */
246
+ GetErrorMessage() {
247
+ if (this.ngControl.errors === undefined || this.ngControl.errors === null) {
248
+ return new Observable((observer) => {
249
+ observer.next('');
250
+ observer.complete();
251
+ });
252
+ }
253
+ const errors = this.ngControl.errors;
254
+ if (errors.length === 0) {
255
+ return new Observable((observer) => {
256
+ observer.next('');
257
+ observer.complete();
258
+ });
259
+ }
260
+ const keys = Object.keys(errors);
261
+ if (keys.length <= 0) {
262
+ return new Observable((observer) => {
263
+ observer.next('');
264
+ observer.complete();
265
+ });
266
+ }
267
+ const errorItem = errors[keys[0]];
268
+ // Validation Parameters
269
+ const parameters = {};
270
+ if (errorItem.parameters !== null && errorItem.parameters !== undefined) {
271
+ errorItem.parameters.forEach((v, k) => {
272
+ parameters[k] = v;
273
+ });
274
+ }
275
+ parameters['FIELD'] = errorItem.fieldName;
276
+ return this.lngResourceService.GetString(errorItem.errorMessageKey, parameters);
277
+ }
278
+ /**
279
+ * Init Event
280
+ */
281
+ ngOnInit() {
282
+ // receive form via formcontrolname or formcontrol instance
283
+ const formControl = this.injector.get(NgControl, null);
284
+ if (formControl instanceof FormControlName) {
285
+ const form = this.injector.get(FormGroupDirective, null);
286
+ this.ngControl = form.getControl(formControl);
287
+ }
288
+ else {
289
+ if (formControl) {
290
+ this.ngControl = formControl.control;
291
+ }
292
+ }
293
+ this.UpdateLabelToControl();
294
+ // set label sizes from formlayout directive
295
+ this.setLabelSizes();
296
+ // set component heigth from fromlayout directive
297
+ this.setComponentHeight();
298
+ // set adaptive label property from formlayout directive
299
+ this.setIsAdaptiveLabel();
300
+ // set method to display helptext
301
+ this.setHelpTextMode();
302
+ // set SplitMode for Labels
303
+ this.setLabelSplitMode();
304
+ this.OnClassInit();
305
+ }
306
+ /**
307
+ * Methode ergibt boolean touched = true
308
+ */
309
+ onTouch() {
310
+ this._touched = true;
311
+ this.propagateTouch();
312
+ }
313
+ /**
314
+ * Methode, damit andere Controls änderungen im Control mitbekommen können
315
+ * Zur Änderungsinfo die Methode propagateChange aufrufen.
316
+ */
317
+ registerOnChange(fn) {
318
+ this.propagateChange = (obj) => fn(obj);
319
+ }
320
+ /**
321
+ * Methode, damit andere Controls änderungen mitbekommen, wenn das Control aktiviert (Focus) wird.
322
+ */
323
+ registerOnTouched(fn) {
324
+ this.propagateTouch = (obj) => fn(obj);
325
+ }
326
+ /**
327
+ * Methode registriert Änderungen bei der Validierung
328
+ */
329
+ registerOnValidatorChange(fn) {
330
+ this._onChange = fn;
331
+ }
332
+ /**
333
+ * Setzt das Control auf Disabled
334
+ */
335
+ setDisabledState(isDisabled) {
336
+ this._disabledForm = isDisabled;
337
+ }
338
+ /**
339
+ * Methode die den Wert des Inputs setzt
340
+ */
341
+ setValue(v) {
342
+ this.value = v;
343
+ }
344
+ /**
345
+ * Validator Methode
346
+ */
347
+ validate(c) {
348
+ const error = this.validateData(c);
349
+ return error;
350
+ }
351
+ /**
352
+ * Methode zum schreiben von Werten aus dem Model in das Control
353
+ */
354
+ writeValue(value) {
355
+ this._value = value;
356
+ }
357
+ // #endregion Public Methods
358
+ // #region Protected Methods
359
+ /**
360
+ * Method can Overwriten in Parent Classes
361
+ * @param value Wert welcher in den korrekten Typ konvertiert werden soll
362
+ * @returns Wert im korrekten Typ
363
+ */
364
+ ConvertInputValue(value) {
365
+ return value;
366
+ }
367
+ /**
368
+ * Methode ergibt Decimal Symbol
369
+ */
370
+ GetDecimalSymbol() {
371
+ return '.';
372
+ }
373
+ /**
374
+ * Method can be used to Set Properties at Class Init
375
+ */
376
+ OnClassInit() { }
377
+ /**
378
+ * Aktualisiert den NgModel Wert und die Gültigkeit des Validators des Controls
379
+ */
380
+ UpdateValueAndValidity() {
381
+ if (this.ngControl) {
382
+ this.ngControl.updateValueAndValidity({ onlySelf: true });
383
+ }
384
+ }
385
+ // #endregion Protected Methods
386
+ // #region Private Methods
387
+ UpdateLabelToControl() {
388
+ // HACK: Add addition property to FormControl. Can be fixed if solution for ticket: https://github.com/angular/angular/issues/19686
389
+ if (this.ngControl) {
390
+ this.ngControl.controllabel = this.label;
391
+ }
392
+ }
393
+ /**
394
+ * Set component height from property or parent layout control
395
+ */
396
+ setComponentHeight() {
397
+ var _a;
398
+ // set size extra small
399
+ if (!this.componentHeight) {
400
+ if ((_a = this.formlayout) === null || _a === void 0 ? void 0 : _a.componentHeight) {
401
+ this.componentHeight = this.formlayout.componentHeight;
402
+ }
403
+ else {
404
+ this.componentHeight = this.configurationService.ComponentHeight;
405
+ }
406
+ }
407
+ }
408
+ /**
409
+ * Set mode for helptext. Can be tooltip or text
410
+ */
411
+ setHelpTextMode() {
412
+ var _a;
413
+ if (!this.helptextmode) {
414
+ if ((_a = this.formlayout) === null || _a === void 0 ? void 0 : _a.helptextmode) {
415
+ this.helptextmode = this.formlayout.helptextmode;
416
+ }
417
+ else {
418
+ this.helptextmode = this.configurationService.HelptextMode;
419
+ }
420
+ }
421
+ }
422
+ /**
423
+ * Set adaptive label property from parent layout control
424
+ */
425
+ setIsAdaptiveLabel() {
426
+ var _a;
427
+ if (!this.isAdaptiveLabel) {
428
+ if (((_a = this.formlayout) === null || _a === void 0 ? void 0 : _a.isAdaptiveLabel) !== undefined) {
429
+ this.isAdaptiveLabel = this.formlayout.isAdaptiveLabel;
430
+ }
431
+ else {
432
+ this.isAdaptiveLabel = false;
433
+ }
434
+ }
435
+ }
436
+ /**
437
+ * Set label sizes from property or parent layout control
438
+ */
439
+ setLabelSizes() {
440
+ var _a, _b, _c, _d, _e, _f;
441
+ // set size extra small
442
+ if (!this.labelSizeXs) {
443
+ if ((_a = this.formlayout) === null || _a === void 0 ? void 0 : _a.labelSizeXs) {
444
+ this.labelSizeXs = this.formlayout.labelSizeXs;
445
+ }
446
+ else {
447
+ this.labelSizeXs = this.configurationService.LabelSizeXs;
448
+ }
449
+ }
450
+ // set size small
451
+ if (!this.labelSizeSm) {
452
+ if ((_b = this.formlayout) === null || _b === void 0 ? void 0 : _b.labelSizeSm) {
453
+ this.labelSizeSm = this.formlayout.labelSizeSm;
454
+ }
455
+ else {
456
+ this.labelSizeSm = this.configurationService.LabelSizeSm;
457
+ }
458
+ }
459
+ // set size medium
460
+ if (!this.labelSizeMd) {
461
+ if ((_c = this.formlayout) === null || _c === void 0 ? void 0 : _c.labelSizeMd) {
462
+ this.labelSizeMd = this.formlayout.labelSizeMd;
463
+ }
464
+ else {
465
+ this.labelSizeMd = this.configurationService.LabelSizeMd;
466
+ }
467
+ }
468
+ // set size large
469
+ if (!this.labelSizeLg) {
470
+ if ((_d = this.formlayout) === null || _d === void 0 ? void 0 : _d.labelSizeLg) {
471
+ this.labelSizeLg = this.formlayout.labelSizeLg;
472
+ }
473
+ else {
474
+ this.labelSizeLg = this.configurationService.LabelSizeLg;
475
+ }
476
+ }
477
+ // set size extra large
478
+ if (!this.labelSizeXl) {
479
+ if ((_e = this.formlayout) === null || _e === void 0 ? void 0 : _e.labelSizeXl) {
480
+ this.labelSizeXl = this.formlayout.labelSizeXl;
481
+ }
482
+ else {
483
+ this.labelSizeXl = this.configurationService.LabelSizeXl;
484
+ }
485
+ }
486
+ // set size extra extra large
487
+ if (!this.labelSizeXxl) {
488
+ if ((_f = this.formlayout) === null || _f === void 0 ? void 0 : _f.labelSizeXxl) {
489
+ this.labelSizeXxl = this.formlayout.labelSizeXxl;
490
+ }
491
+ else {
492
+ this.labelSizeXxl = this.configurationService.LabelSizeXxl;
493
+ }
494
+ }
495
+ }
496
+ setLabelSplitMode() {
497
+ var _a;
498
+ if (!this.splitlabelandhelptext) {
499
+ if ((_a = this.formlayout) === null || _a === void 0 ? void 0 : _a.splitlabelandhelptext) {
500
+ this.splitlabelandhelptext = this.formlayout.splitlabelandhelptext;
501
+ }
502
+ else {
503
+ this.splitlabelandhelptext = this.configurationService.SplitLabelAndHelptext;
504
+ }
505
+ }
506
+ }
507
+ }
508
+ SacBaseModelControl.decorators = [
509
+ { type: Directive }
510
+ ];
511
+ SacBaseModelControl.ctorParameters = () => [
512
+ { type: SacFormLayoutCommon, decorators: [{ type: Host }] },
513
+ { type: Injector }
514
+ ];
515
+ SacBaseModelControl.propDecorators = {
516
+ componentHeight: [{ type: Input }],
517
+ disabled: [{ type: Input }],
518
+ disablelabel: [{ type: Input }],
519
+ helptext: [{ type: Input }],
520
+ helptextmode: [{ type: Input }],
521
+ inlineError: [{ type: Input }],
522
+ isAdaptiveLabel: [{ type: Input }],
523
+ labelSizeLg: [{ type: Input }],
524
+ labelSizeMd: [{ type: Input }],
525
+ labelSizeSm: [{ type: Input }],
526
+ labelSizeXl: [{ type: Input }],
527
+ labelSizeXs: [{ type: Input }],
528
+ labelSizeXxl: [{ type: Input }],
529
+ name: [{ type: Input }],
530
+ splitlabelandhelptext: [{ type: Input }],
531
+ inlineerrorenabled: [{ type: Input }],
532
+ label: [{ type: Input }],
533
+ value: [{ type: Input }]
534
+ };
535
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZW1vZGVsY29udHJvbC5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9zaW1wbGVhbmd1bGFyY29udHJvbHMvc2ltcGxlYW5ndWxhcmNvbnRyb2xzL2NoLmpuZXR3b3JrLnNhYy1jb250cm9scy9wcm9qZWN0cy9zYWMtY29tbW9uL3NyYy8iLCJzb3VyY2VzIjpbImNvbW1vbi9iYXNlbW9kZWxjb250cm9sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU92RCxPQUFPLEVBQ0gsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsOEJBQThCLEdBQ2pDLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2pILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzlHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pFLE9BQU8sRUFJSCxlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLFNBQVMsR0FHWixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEM7O0dBRUc7QUFFSCxNQUFNLE9BQWdCLG1CQUFtQjtJQXVLckMsd0JBQXdCO0lBRXhCLHVCQUF1QjtJQUV2Qjs7OztPQUlHO0lBQ0gsWUFBb0IsVUFBK0IsRUFBbUIsUUFBa0I7UUFBbEIsYUFBUSxHQUFS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Q0FBQzthQUNoRjtTQUNKO0lBQ0wsQ0FBQzs7O1lBL21CSixTQUFTOzs7WUFuQ0QsbUJBQW1CLHVCQW9OWCxJQUFJO1lBak1LLFFBQVE7Ozs4QkF3RjdCLEtBQUs7dUJBTUwsS0FBSzsyQkFLTCxLQUFLO3VCQUtMLEtBQUs7MkJBS0wsS0FBSzswQkFNTCxLQUFLOzhCQUtMLEtBQUs7MEJBS0wsS0FBSzswQkFNTCxLQUFLOzBCQU1MLEtBQUs7MEJBTUwsS0FBSzswQkFNTCxLQUFLOzJCQU1MLEtBQUs7bUJBTUwsS0FBSztvQ0FlTCxLQUFLO2lDQThETCxLQUFLO29CQW9ETCxLQUFLO29CQXlDTCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2FjRm9ybUxheW91dENvbW1vbiB9IGZyb20gJy4uL2NvbnRyb2xzL2xheW91dC9mb3JtbGF5b3V0JztcbmltcG9ydCB7IENvbnRyb2xIZWlnaHQgfSBmcm9tICcuLi9lbnVtcy9Db250cm9sSGVpZ2h0JztcbmltcG9ydCB7IElTYWNDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVNhY0NvbmZpZ3VyYXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IElTYWNJY29uU2VydmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVNhY0ljb25TZXJ2aWNlJztcbmltcG9ydCB7IElTYWNMYWJlbFNpemVzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JU2FjTGFiZWxTaXplcyc7XG5pbXBvcnQgeyBJU2FjTG9jYWxpc2F0aW9uU2VydmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVNhY0xvY2FsaXNhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgSVNhY1ZhbGlkYXRpb25LZXlTZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JU2FjVmFsaWRhdGlvbktleVNlcnZpY2UnO1xuaW1wb3J0IHsgSUFic3RyYWN0Q29udHJvbExhYmVsRXh0ZW5zaW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pYWJzdHJhY3Rjb250cm9sbGFiZWwnO1xuaW1wb3J0IHtcbiAgICBTQUNJQ09OX1NFUlZJQ0UsXG4gICAgU0FDVkFMSURBVElPTktFWV9TRVJWSUNFLFxuICAgIFNhY0RlZmF1bHRJY29uU2VydmljZSxcbiAgICBTYWNEZWZhdWx0VmFsaWRhdGlvbktleVNlcnZpY2UsXG59IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IFNBQ0NPTkZJR1VSQVRJT05fU0VSVklDRSwgU2FjRGVmYXVsdENvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc2FjLWNvbmZpZ3VyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBTQUNMT0NBTElTQVRJT05fU0VSVklDRSwgU2FjRGVmYXVsdExvY2FsaXNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zYWMtbG9jYWxpc2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgY29udmVydFRvQm9vbGVhbiB9IGZyb20gJy4uL3V0aWxpdGllcy9jb252ZXJ0aW9uJztcbmltcG9ydCB7IGNyZWF0ZUd1aWQgfSBmcm9tICcuLi91dGlsaXRpZXMvZ3VpZCc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3JJdGVtIH0gZnJvbSAnLi4vdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3QsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFic3RyYWN0Q29udHJvbCxcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBGb3JtQ29udHJvbCxcbiAgICBGb3JtQ29udHJvbE5hbWUsXG4gICAgRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgIE5nQ29udHJvbCxcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxuICAgIFZhbGlkYXRvcixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIEFic3RyYWN0IEtsYXNzZSBmw7xyIFNhY0Jhc2VNb2RlbENvbnRyb2wuIEltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25Jbml0XG4gKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNhY0Jhc2VNb2RlbENvbnRyb2w8VkFMVUU+IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25Jbml0IHtcbiAgICAvLyAjcmVnaW9uIFByb3BlcnRpZXNcblxuICAgIC8qKlxuICAgICAqIElubGluZSBFcnJvcnMgZsO8ciBkYXMgQ29udHJvbFxuICAgICAqL1xuICAgIHByaXZhdGUgX2lubGluZWVycm9yZW5hYmxlZDogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogTGFiZWwgVGV4dFxuICAgICAqL1xuICAgIHByaXZhdGUgX2xhYmVsOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKlxuICAgICAqIFNlcnZpY2UgZm9yIGxvYWRpbmcgZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhlIGNvbnRyb2xzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZ3VyYXRpb25TZXJ2aWNlOiBJU2FjQ29uZmlndXJhdGlvblNlcnZpY2U7XG5cbiAgICAvKipcbiAgICAgKiBCb29sZWFuIFByb3BlcnR5IGRpcnR5OyBkZWZhdWx0IFdlcnQgLSBmYWxzZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZGlydHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNhY01vZGVsIEZvcm0gaXN0IGRpc2FibGVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kaXNhYmxlZEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRvclxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfb25DaGFuZ2U6ICgpID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBCb29sZWFuIFByb3BlcnR5IHRvdWNoZWQ7IGRlZmF1bHQgV2VydCAtIGZhbHNlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF90b3VjaGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5lIFZhcmlhYmxlLCBkaWUgZGVuIFdlcnQgZGVzIENvbnRyb2xzIGjDpGx0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIF92YWx1ZTogVkFMVUUgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogRm9ybSBsYXlvdXQgaW5zdGFuY2UgaWYgZXhpc3RzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGZvcm1sYXlvdXQ6IFNhY0Zvcm1MYXlvdXRDb21tb24gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogaWNvbiBzZXJ2aWNlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGljb25TZXJ2aWNlOiBJU2FjSWNvblNlcnZpY2U7XG5cbiAgICAvKipcbiAgICAgKiBTZXJ2aWNlIGbDvHIgRXJyb3IgTG9jYWxpc2F0aW9uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGxuZ1Jlc291cmNlU2VydmljZTogSVNhY0xvY2FsaXNhdGlvblNlcnZpY2U7XG5cbiAgICAvKipcbiAgICAgKiBuZ0NvbnRyb2xcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbmdDb250cm9sOiBGb3JtQ29udHJvbDtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xIZWlnaHQgZW51bSBmb3IgdXNlIGluIEhUTUwgbWFya3VwXG4gICAgICovXG4gICAgcHVibGljIENvbnRyb2xIZWlnaHQ6IHR5cGVvZiBDb250cm9sSGVpZ2h0ID0gQ29udHJvbEhlaWdodDtcblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIHN0YW5kYXJkIGhlaWdodCBvZiB0aGUgY29tcG9uZW50c1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNvbXBvbmVudEhlaWdodDogQ29udHJvbEhlaWdodCB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogRGVha3RpdmllcnQgZGFzIElucHV0IENvbnRyb2xcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIERlYWt0aXZpZXJ0IGRhcyBMYWJlbCBpbSBUZW1wbGF0ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlbGFiZWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFRleHQgdG8gc3VwcG9ydCB0aGUgdXNlciBkdXJpbmcgaW5wdXQuXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGhlbHB0ZXh0OiBzdHJpbmcgPSAnJztcblxuICAgIC8qKlxuICAgICAqIE1vZGUgZm9yIGRpc3BsYXkgaGVscHRleHRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBoZWxwdGV4dG1vZGU6ICd0b29sdGlwJyB8ICd0ZXh0JyB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBkZWZpbmVzIHRoYXQgZXJyb3IgbWVzc2FnZXMgYXJlIGRpc3BsYXllZCB1bmRlciB0aGUgY29udHJvbHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgaW5saW5lRXJyb3I6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogZGVmaW5lcyB0aGF0IHRoZSBsYWJlbHMgYXJlIGRpc3BsYXllZCBhcyBhZGFwdGl2ZSBsYWJlbHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgaXNBZGFwdGl2ZUxhYmVsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBkZWZhdWx0IGxhYmUgc2l6ZSBmb3IgbGFyZ2UgZGV2aWNlc1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxhYmVsU2l6ZUxnOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIGRlZmF1bHQgbGFiZWwgc2l6ZSBmb3IgbWVkaXVtIGRldmljZXNcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsYWJlbFNpemVNZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBkZWZhdWx0IGxhYmVsIHNpemUgZm9yIHNtYWxsIGRldmljZXNcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsYWJlbFNpemVTbTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBkZWZhdWx0IGxhYmVsIHNpemUgZm9yIGV4dHJhIGxhcmdlIGRldmljZXNcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsYWJlbFNpemVYbDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBkZWZhdWx0IGxhYmVsIGNvbHVtbiBzaXplXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbGFiZWxTaXplWHM6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogZGVmYXVsdCBsYWJlbCBzaXplIGZvciBleHRyYSBleHRyYSBsYXJnZSBkZXZpY2VzXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbGFiZWxTaXplWHhsOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIE5hbWUgZGVzIENvbnRyb2xzXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIG5hbWU6IHN0cmluZyA9IGNyZWF0ZUd1aWQoKTtcblxuICAgIC8qKlxuICAgICAqIExlZXJlIEltcGxlbWVudGF0aW9uIHZvbiBcInByb3BhZ2F0ZUNoYW5nZVwiLiBNdXNzIGdlbWFjaHQgd2VyZGVuLCBkYW1pdCBrZWluIEZlaGxlciBlbnRzdGVodFxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9wYWdhdGVDaGFuZ2U6IGFueSA9ICgpID0+IHt9O1xuXG4gICAgLyoqXG4gICAgICogTGVlcmUgSW1wbGVtZW50YXRpb24gdm9uIFwicHJvcGFnYXRlVG91Y2hcIi4gTXVzcyBnZW1hY2h0IHdlcmRlbiwgZGFtaXQga2VpbiBGZWhsZXIgZW50c3RlaHRcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvcGFnYXRlVG91Y2g6IGFueSA9ICgpID0+IHt9O1xuXG4gICAgLyoqXG4gICAgICogRGV0YWNoIGxhYmVsIHRleHQgYW5kIHRvb2x0aXAgZnJvbSBlYWNoIG90aGVyIGluIExhYmVsIHNvIHRoYXQgbGFiZWwgYW5kIHRvb2x0aXAgY2FuIGJlIGFsaWduZWQgZGlmZmVyZW50bHkuIFRoaXMgaXMgaW4gQm9vdHN0cmFwIDMgbm90IHN1cHBvcnRlZCFcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzcGxpdGxhYmVsYW5kaGVscHRleHQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFNlcnZpY2UgdG8gcmVjZWl2ZSBzdGFuZGFyZCB2YWxpZGF0aW9uIG1lc3NhZ2Uga2V5cyBhbmQgdGV4dHNcbiAgICAgKi9cbiAgICBwdWJsaWMgdmFsaWRhdGlvbktleVNlcnZpY2U6IElTYWNWYWxpZGF0aW9uS2V5U2VydmljZTtcblxuICAgIC8vICNlbmRyZWdpb24gUHJvcGVydGllc1xuXG4gICAgLy8gI3JlZ2lvbiBDb25zdHJ1Y3RvcnNcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIGZvcm1sYXlvdXQgU2FjRm9ybUxheW91dENvbW1vbiB0byBkZWZpbmUgc2NvcGVkIGxheW91dCBzZXR0aW5nc1xuICAgICAqIEBwYXJhbSBpbmplY3RvciBJbmplY3RvciBmb3IgaW5qZWN0aW5nIHNlcnZpY2VzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoQEhvc3QoKSBmb3JtbGF5b3V0OiBTYWNGb3JtTGF5b3V0Q29tbW9uLCBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgICAgICB0aGlzLmZvcm1sYXlvdXQgPSBmb3JtbGF5b3V0O1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25LZXlTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KFNBQ1ZBTElEQVRJT05LRVlfU0VSVklDRSwgbmV3IFNhY0RlZmF1bHRWYWxpZGF0aW9uS2V5U2VydmljZSgpKTtcbiAgICAgICAgdGhpcy5sbmdSZXNvdXJjZVNlcnZpY2UgPSBpbmplY3Rvci5nZXQoXG4gICAgICAgICAgICBTQUNMT0NBTElTQVRJT05fU0VSVklDRSxcbiAgICAgICAgICAgIG5ldyBTYWNEZWZhdWx0TG9jYWxpc2F0aW9uU2VydmljZSh0aGlzLnZhbGlkYXRpb25LZXlTZXJ2aWNlKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UgPSBpbmplY3Rvci5nZXQoU0FDQ09ORklHVVJBVElPTl9TRVJWSUNFLCBuZXcgU2FjRGVmYXVsdENvbmZpZ3VyYXRpb25TZXJ2aWNlKCkpO1xuXG4gICAgICAgIHRoaXMuaWNvblNlcnZpY2UgPSBpbmplY3Rvci5nZXQoU0FDSUNPTl9TRVJWSUNFLCBuZXcgU2FjRGVmYXVsdEljb25TZXJ2aWNlKCkpO1xuICAgIH1cblxuICAgIC8vICNlbmRyZWdpb24gQ29uc3RydWN0b3JzXG5cbiAgICAvLyAjcmVnaW9uIFB1YmxpYyBHZXR0ZXJzIEFuZCBTZXR0ZXJzXG5cbiAgICAvKipcbiAgICAgKiBHZXQgSWNvbiBmb3IgSGVscHRleHQgVG9vbHRpcFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgSGVscHRleHRUb29sdGlwSWNvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5HZW5lcmljSGVscHRleHRJY29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ldGhvZGUgZXJnaWJ0IEJvb2xlYW4gV2VydCBmw7xyIGRpcnR5XG4gICAgICovXG4gICAgcHVibGljIGdldCBkaXJ0eSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sICE9PSBudWxsICYmIHRoaXMubmdDb250cm9sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdGhpcy5uZ0NvbnRyb2wuZGlydHk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZGlydHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdyBlcnJvciBtZXNzYWdlcyBpbmxpbmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlubGluZWVycm9yZW5hYmxlZCgpOiBib29sZWFuIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmxpbmVlcnJvcmVuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWt0aXZpZXJ0IG9kZXIgRGVha3RpdmllcnQgZGllIElubGluZSBFcnJvcnMgZsO8ciBkYXMgQ29udHJvbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBpbmxpbmVlcnJvcmVuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBudWxsKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmxpbmVlcnJvcmVuYWJsZWQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faW5saW5lZXJyb3JlbmFibGVkID0gY29udmVydFRvQm9vbGVhbih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2RlIGVyZ2lidCBib29sZWFuIFdlcnQgd2VubiBGb3JtIGludmFsaWQgb2RlciBuaWNodCBpbnZhbGlkIGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW52YWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdDb250cm9sICE9PSB1bmRlZmluZWQgJiYgdGhpcy5uZ0NvbnRyb2wgIT09IG51bGwgJiYgdGhpcy5uZ0NvbnRyb2wuaW52YWxpZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmllcnQgb2IgZGFzIENvbnRyb2wgZGlzYWJsZWQgaXN0XG4gICAgICovXG4gICAgcHVibGljIGdldCBpc2Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWRGb3JtIHx8IHRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpbmxpbmUgZXJyb3IgbWVzc2FnZXMgYXJlIGFjdGl2ZSBmb3IgdGhpcyBjb250cm9sLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNpbmxpbmVlcnJvcmVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9pbmxpbmVlcnJvcmVuYWJsZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbmxpbmVlcnJvcmVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mb3JtbGF5b3V0ICE9PSBudWxsICYmIHRoaXMuZm9ybWxheW91dC5Jc0lubGluZUVycm9yRW5hYmxlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWxheW91dD8uSXNJbmxpbmVFcnJvckVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5JbmxpbmVFcnJvckVuYWJsZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLklubGluZUVycm9yRW5hYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluaWVydCBkZW4gTGFiZWwgVGV4dFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluaWVydCBkZW4gTGFiZWwgVGV4dFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZXQgbGFiZWwodjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2xhYmVsID0gdjtcbiAgICAgICAgdGhpcy5VcGRhdGVMYWJlbFRvQ29udHJvbCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYWxsIGxhYmVsIHNpemVzLiBUaGVzZSB2YWx1ZXMgY2FuIHRoZW4gYmUgdHJhbnNmZXJyZWQgdG8gY29ycmVzcG9uZGluZyBDU1MgY2xhc3NlcyB1c2luZyBhIHBpcGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxhYmVsU2l6ZXMoKTogSVNhY0xhYmVsU2l6ZXMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWxTaXplU206IHRoaXMubGFiZWxTaXplU20sXG4gICAgICAgICAgICBsYWJlbFNpemVNZDogdGhpcy5sYWJlbFNpemVNZCxcbiAgICAgICAgICAgIGxhYmVsU2l6ZVhzOiB0aGlzLmxhYmVsU2l6ZVhzLFxuICAgICAgICAgICAgbGFiZWxTaXplWGw6IHRoaXMubGFiZWxTaXplWGwsXG4gICAgICAgICAgICBsYWJlbFNpemVYeGw6IHRoaXMubGFiZWxTaXplWHhsLFxuICAgICAgICAgICAgbGFiZWxTaXplTGc6IHRoaXMubGFiZWxTaXplTGcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kZSBlcmdpYnQgQm9vbGVhbiBXZXJ0IGbDvHIgdG91Y2hlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG91Y2hlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sICE9PSBudWxsICYmIHRoaXMubmdDb250cm9sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RvdWNoZWQgPSB0aGlzLm5nQ29udHJvbC50b3VjaGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdWNoZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IE1ldGhvZGUgZsO8ciBOZ01vZGVsIEJpbmRpbmcgaW4gSHRtbCBNYXJrdXBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCk6IFZBTFVFIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBNZXRob2RlIGbDvHIgTmdNb2RlbCBCaW5kaW5nIGluIEh0bWwgTWFya3VwXG4gICAgICogSW5wdXQgd2lyZCBiZW7DtnRpZ3QsIGRhbWl0IGRlciBXZXJ0IGF1Y2ggw7xiZXIgZGFzIE1hcmt1cCBnZXNldHp0IHdlcmRlbiBrYW5uLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCB2YWx1ZSh2OiBWQUxVRSkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLkNvbnZlcnRJbnB1dFZhbHVlKHYpO1xuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLl92YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gI2VuZHJlZ2lvbiBQdWJsaWMgR2V0dGVycyBBbmQgU2V0dGVyc1xuXG4gICAgLy8gI3JlZ2lvbiBQdWJsaWMgTWV0aG9kc1xuXG4gICAgLyoqXG4gICAgICogTWV0aG9kZSBlcmdpYnQgRXJyb3IgYW5oYW5kIHZvbiBnZWdlYmVuZW4gS3JpdGVyaWVuXG4gICAgICovXG4gICAgcHVibGljIEdldEVycm9yTWVzc2FnZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wuZXJyb3JzID09PSB1bmRlZmluZWQgfHwgdGhpcy5uZ0NvbnRyb2wuZXJyb3JzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8c3RyaW5nPigob2JzZXJ2ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KCcnKTtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgPSB0aGlzLm5nQ29udHJvbC5lcnJvcnM7XG5cbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxzdHJpbmc+KChvYnNlcnZlcikgPT4ge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoJycpO1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMoZXJyb3JzKTtcblxuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHN0cmluZz4oKG9ic2VydmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCgnJyk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXJyb3JJdGVtOiBWYWxpZGF0aW9uRXJyb3JJdGVtID0gZXJyb3JzW2tleXNbMF1dO1xuXG4gICAgICAgIC8vIFZhbGlkYXRpb24gUGFyYW1ldGVyc1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0ge307XG4gICAgICAgIGlmIChlcnJvckl0ZW0ucGFyYW1ldGVycyAhPT0gbnVsbCAmJiBlcnJvckl0ZW0ucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlcnJvckl0ZW0ucGFyYW1ldGVycy5mb3JFYWNoKCh2LCBrKSA9PiB7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyc1trXSA9IHY7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBwYXJhbWV0ZXJzWydGSUVMRCddID0gZXJyb3JJdGVtLmZpZWxkTmFtZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5sbmdSZXNvdXJjZVNlcnZpY2UuR2V0U3RyaW5nKGVycm9ySXRlbS5lcnJvck1lc3NhZ2VLZXksIHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXQgRXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIC8vIHJlY2VpdmUgZm9ybSB2aWEgZm9ybWNvbnRyb2xuYW1lIG9yIGZvcm1jb250cm9sIGluc3RhbmNlXG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sLCBudWxsKTtcbiAgICAgICAgaWYgKGZvcm1Db250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2xOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5pbmplY3Rvci5nZXQoRm9ybUdyb3VwRGlyZWN0aXZlLCBudWxsKTtcbiAgICAgICAgICAgIHRoaXMubmdDb250cm9sID0gZm9ybS5nZXRDb250cm9sKGZvcm1Db250cm9sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubmdDb250cm9sID0gZm9ybUNvbnRyb2wuY29udHJvbCBhcyBGb3JtQ29udHJvbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuVXBkYXRlTGFiZWxUb0NvbnRyb2woKTtcblxuICAgICAgICAvLyBzZXQgbGFiZWwgc2l6ZXMgZnJvbSBmb3JtbGF5b3V0IGRpcmVjdGl2ZVxuICAgICAgICB0aGlzLnNldExhYmVsU2l6ZXMoKTtcblxuICAgICAgICAvLyBzZXQgY29tcG9uZW50IGhlaWd0aCBmcm9tIGZyb21sYXlvdXQgZGlyZWN0aXZlXG4gICAgICAgIHRoaXMuc2V0Q29tcG9uZW50SGVpZ2h0KCk7XG5cbiAgICAgICAgLy8gc2V0IGFkYXB0aXZlIGxhYmVsIHByb3BlcnR5IGZyb20gZm9ybWxheW91dCBkaXJlY3RpdmVcbiAgICAgICAgdGhpcy5zZXRJc0FkYXB0aXZlTGFiZWwoKTtcblxuICAgICAgICAvLyBzZXQgbWV0aG9kIHRvIGRpc3BsYXkgaGVscHRleHRcbiAgICAgICAgdGhpcy5zZXRIZWxwVGV4dE1vZGUoKTtcblxuICAgICAgICAvLyBzZXQgU3BsaXRNb2RlIGZvciBMYWJlbHNcbiAgICAgICAgdGhpcy5zZXRMYWJlbFNwbGl0TW9kZSgpO1xuXG4gICAgICAgIHRoaXMuT25DbGFzc0luaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2RlIGVyZ2lidCBib29sZWFuIHRvdWNoZWQgPSB0cnVlXG4gICAgICovXG4gICAgcHVibGljIG9uVG91Y2goKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3RvdWNoZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnByb3BhZ2F0ZVRvdWNoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kZSwgZGFtaXQgYW5kZXJlIENvbnRyb2xzIMOkbmRlcnVuZ2VuIGltIENvbnRyb2wgbWl0YmVrb21tZW4ga8O2bm5lblxuICAgICAqIFp1ciDDhG5kZXJ1bmdzaW5mbyBkaWUgTWV0aG9kZSBwcm9wYWdhdGVDaGFuZ2UgYXVmcnVmZW4uXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IChvYmopID0+IGZuKG9iaik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kZSwgZGFtaXQgYW5kZXJlIENvbnRyb2xzIMOkbmRlcnVuZ2VuIG1pdGJla29tbWVuLCB3ZW5uIGRhcyBDb250cm9sIGFrdGl2aWVydCAoRm9jdXMpIHdpcmQuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVUb3VjaCA9IChvYmopID0+IGZuKG9iaik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kZSByZWdpc3RyaWVydCDDhG5kZXJ1bmdlbiBiZWkgZGVyIFZhbGlkaWVydW5nXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXR6dCBkYXMgQ29udHJvbCBhdWYgRGlzYWJsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkRm9ybSA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kZSBkaWUgZGVuIFdlcnQgZGVzIElucHV0cyBzZXR6dFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRWYWx1ZSh2OiBWQUxVRSk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gdjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0b3IgTWV0aG9kZVxuICAgICAqL1xuICAgIHB1YmxpYyB2YWxpZGF0ZShjOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IHRoaXMudmFsaWRhdGVEYXRhKGMpO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWJzdHJha3RlIFZhbGlkYXRvciBNZXRob2RlXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IHZhbGlkYXRlRGF0YShjOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIE1ldGhvZGUgenVtIHNjaHJlaWJlbiB2b24gV2VydGVuIGF1cyBkZW0gTW9kZWwgaW4gZGFzIENvbnRyb2xcbiAgICAgKi9cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogVkFMVUUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyAjZW5kcmVnaW9uIFB1YmxpYyBNZXRob2RzXG5cbiAgICAvLyAjcmVnaW9uIFByb3RlY3RlZCBNZXRob2RzXG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgY2FuIE92ZXJ3cml0ZW4gaW4gUGFyZW50IENsYXNzZXNcbiAgICAgKiBAcGFyYW0gdmFsdWUgV2VydCB3ZWxjaGVyIGluIGRlbiBrb3JyZWt0ZW4gVHlwIGtvbnZlcnRpZXJ0IHdlcmRlbiBzb2xsXG4gICAgICogQHJldHVybnMgV2VydCBpbSBrb3JyZWt0ZW4gVHlwXG4gICAgICovXG4gICAgcHJvdGVjdGVkIENvbnZlcnRJbnB1dFZhbHVlKHZhbHVlOiBWQUxVRSk6IFZBTFVFIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ldGhvZGUgZXJnaWJ0IERlY2ltYWwgU3ltYm9sXG4gICAgICovXG4gICAgcHJvdGVjdGVkIEdldERlY2ltYWxTeW1ib2woKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICcuJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgY2FuIGJlIHVzZWQgdG8gU2V0IFByb3BlcnRpZXMgYXQgQ2xhc3MgSW5pdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBPbkNsYXNzSW5pdCgpOiB2b2lkIHt9XG5cbiAgICAvKipcbiAgICAgKiBBa3R1YWxpc2llcnQgZGVuIE5nTW9kZWwgV2VydCB1bmQgZGllIEfDvGx0aWdrZWl0IGRlcyBWYWxpZGF0b3JzIGRlcyBDb250cm9sc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBVcGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMubmdDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICNlbmRyZWdpb24gUHJvdGVjdGVkIE1ldGhvZHNcblxuICAgIC8vICNyZWdpb24gUHJpdmF0ZSBNZXRob2RzXG5cbiAgICBwcml2YXRlIFVwZGF0ZUxhYmVsVG9Db250cm9sKCk6IHZvaWQge1xuICAgICAgICAvLyBIQUNLOiBBZGQgYWRkaXRpb24gcHJvcGVydHkgdG8gRm9ybUNvbnRyb2wuIENhbiBiZSBmaXhlZCBpZiBzb2x1dGlvbiBmb3IgdGlja2V0OiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xOTY4NlxuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcbiAgICAgICAgICAgICh0aGlzLm5nQ29udHJvbCBhcyB1bmtub3duIGFzIElBYnN0cmFjdENvbnRyb2xMYWJlbEV4dGVuc2lvbikuY29udHJvbGxhYmVsID0gdGhpcy5sYWJlbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBjb21wb25lbnQgaGVpZ2h0IGZyb20gcHJvcGVydHkgb3IgcGFyZW50IGxheW91dCBjb250cm9sXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRDb21wb25lbnRIZWlnaHQoKSB7XG4gICAgICAgIC8vIHNldCBzaXplIGV4dHJhIHNtYWxsXG4gICAgICAgIGlmICghdGhpcy5jb21wb25lbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1sYXlvdXQ/LmNvbXBvbmVudEhlaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SGVpZ2h0ID0gdGhpcy5mb3JtbGF5b3V0LmNvbXBvbmVudEhlaWdodDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRIZWlnaHQgPSB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLkNvbXBvbmVudEhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBtb2RlIGZvciBoZWxwdGV4dC4gQ2FuIGJlIHRvb2x0aXAgb3IgdGV4dFxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0SGVscFRleHRNb2RlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaGVscHRleHRtb2RlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtbGF5b3V0Py5oZWxwdGV4dG1vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlbHB0ZXh0bW9kZSA9IHRoaXMuZm9ybWxheW91dC5oZWxwdGV4dG1vZGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVscHRleHRtb2RlID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5IZWxwdGV4dE1vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYWRhcHRpdmUgbGFiZWwgcHJvcGVydHkgZnJvbSBwYXJlbnQgbGF5b3V0IGNvbnRyb2xcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldElzQWRhcHRpdmVMYWJlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQWRhcHRpdmVMYWJlbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWxheW91dD8uaXNBZGFwdGl2ZUxhYmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQWRhcHRpdmVMYWJlbCA9IHRoaXMuZm9ybWxheW91dC5pc0FkYXB0aXZlTGFiZWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNBZGFwdGl2ZUxhYmVsID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbGFiZWwgc2l6ZXMgZnJvbSBwcm9wZXJ0eSBvciBwYXJlbnQgbGF5b3V0IGNvbnRyb2xcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldExhYmVsU2l6ZXMoKSB7XG4gICAgICAgIC8vIHNldCBzaXplIGV4dHJhIHNtYWxsXG4gICAgICAgIGlmICghdGhpcy5sYWJlbFNpemVYcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWxheW91dD8ubGFiZWxTaXplWHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsU2l6ZVhzID0gdGhpcy5mb3JtbGF5b3V0LmxhYmVsU2l6ZVhzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsU2l6ZVhzID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5MYWJlbFNpemVYcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCBzaXplIHNtYWxsXG4gICAgICAgIGlmICghdGhpcy5sYWJlbFNpemVTbSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWxheW91dD8ubGFiZWxTaXplU20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsU2l6ZVNtID0gdGhpcy5mb3JtbGF5b3V0LmxhYmVsU2l6ZVNtO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsU2l6ZVNtID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5MYWJlbFNpemVTbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCBzaXplIG1lZGl1bVxuICAgICAgICBpZiAoIXRoaXMubGFiZWxTaXplTWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1sYXlvdXQ/LmxhYmVsU2l6ZU1kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbFNpemVNZCA9IHRoaXMuZm9ybWxheW91dC5sYWJlbFNpemVNZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbFNpemVNZCA9IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuTGFiZWxTaXplTWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgc2l6ZSBsYXJnZVxuICAgICAgICBpZiAoIXRoaXMubGFiZWxTaXplTGcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1sYXlvdXQ/LmxhYmVsU2l6ZUxnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbFNpemVMZyA9IHRoaXMuZm9ybWxheW91dC5sYWJlbFNpemVMZztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbFNpemVMZyA9IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuTGFiZWxTaXplTGc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgc2l6ZSBleHRyYSBsYXJnZVxuICAgICAgICBpZiAoIXRoaXMubGFiZWxTaXplWGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1sYXlvdXQ/LmxhYmVsU2l6ZVhsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbFNpemVYbCA9IHRoaXMuZm9ybWxheW91dC5sYWJlbFNpemVYbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbFNpemVYbCA9IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuTGFiZWxTaXplWGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgc2l6ZSBleHRyYSBleHRyYSBsYXJnZVxuICAgICAgICBpZiAoIXRoaXMubGFiZWxTaXplWHhsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtbGF5b3V0Py5sYWJlbFNpemVYeGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsU2l6ZVh4bCA9IHRoaXMuZm9ybWxheW91dC5sYWJlbFNpemVYeGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxTaXplWHhsID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5MYWJlbFNpemVYeGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldExhYmVsU3BsaXRNb2RlKCkge1xuICAgICAgICBpZiAoIXRoaXMuc3BsaXRsYWJlbGFuZGhlbHB0ZXh0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtbGF5b3V0Py5zcGxpdGxhYmVsYW5kaGVscHRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNwbGl0bGFiZWxhbmRoZWxwdGV4dCA9IHRoaXMuZm9ybWxheW91dC5zcGxpdGxhYmVsYW5kaGVscHRleHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc3BsaXRsYWJlbGFuZGhlbHB0ZXh0ID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5TcGxpdExhYmVsQW5kSGVscHRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAjZW5kcmVnaW9uIFByaXZhdGUgTWV0aG9kc1xufVxuIl19