@openziti/ziti-console-lib 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (705) hide show
  1. package/README.md +24 -0
  2. package/assets/animations/ConstructionZiggy.json +15233 -0
  3. package/assets/animations/HelloZiggy.json +10008 -0
  4. package/assets/animations/SmartZiggy.json +9488 -0
  5. package/assets/components/add.html +1 -0
  6. package/assets/components/api.html +12 -0
  7. package/assets/components/customtags.html +4 -0
  8. package/assets/components/line.html +1 -0
  9. package/assets/components/noitems.html +1 -0
  10. package/assets/components/save.html +4 -0
  11. package/assets/components/search.html +8 -0
  12. package/assets/components/tabIdentities.html +6 -0
  13. package/assets/components/tabPolicies.html +7 -0
  14. package/assets/components/tabRouters.html +5 -0
  15. package/assets/components/tabServers.html +4 -0
  16. package/assets/components/tabServices.html +5 -0
  17. package/assets/components/tabSessions.html +4 -0
  18. package/assets/data/mail.json +0 -0
  19. package/assets/data/services.json +6 -0
  20. package/assets/data/settings.json +25 -0
  21. package/assets/data/site.json +31 -0
  22. package/assets/data/tags.json +7 -0
  23. package/assets/data/templates.json +1 -0
  24. package/assets/fonts/OpenSans-Regular.ttf +0 -0
  25. package/assets/fonts/OpenSans-Regular.woff +0 -0
  26. package/assets/fonts/OpenSans-Regular.woff2 +0 -0
  27. package/assets/fonts/RussoOne-Regular.ttf +0 -0
  28. package/assets/fonts/RussoOne-Regular.woff +0 -0
  29. package/assets/fonts/RussoOne-Regular.woff2 +0 -0
  30. package/assets/fonts/zac.eot +0 -0
  31. package/assets/fonts/zac.svg +55 -0
  32. package/assets/fonts/zac.ttf +0 -0
  33. package/assets/fonts/zac.woff +0 -0
  34. package/assets/fonts/zac.woff2 +0 -0
  35. package/assets/html/api-sessions.htm +153 -0
  36. package/assets/html/attributes.htm +260 -0
  37. package/assets/html/auth-policies.htm +410 -0
  38. package/assets/html/cas.htm +445 -0
  39. package/assets/html/config-types.htm +168 -0
  40. package/assets/html/configs.htm +238 -0
  41. package/assets/html/deprecated/fabric-links.htm +336 -0
  42. package/assets/html/deprecated/fabric-routers.htm +72 -0
  43. package/assets/html/deprecated/fabric-services.htm +494 -0
  44. package/assets/html/identities.htm +934 -0
  45. package/assets/html/index.htm +161 -0
  46. package/assets/html/jwt-signers.htm +260 -0
  47. package/assets/html/known.htm +115 -0
  48. package/assets/html/login.htm +131 -0
  49. package/assets/html/organization.htm +223 -0
  50. package/assets/html/posture-checks.htm +393 -0
  51. package/assets/html/profile.htm +52 -0
  52. package/assets/html/recipes.htm +455 -0
  53. package/assets/html/router-policies.htm +168 -0
  54. package/assets/html/routers.htm +323 -0
  55. package/assets/html/servers.htm +236 -0
  56. package/assets/html/service-policies.htm +197 -0
  57. package/assets/html/service-router-policies.htm +170 -0
  58. package/assets/html/services.htm +634 -0
  59. package/assets/html/sessions.htm +157 -0
  60. package/assets/html/settings.htm +146 -0
  61. package/assets/html/terminators.htm +244 -0
  62. package/assets/html/transit-routers.htm +173 -0
  63. package/assets/icons/android-icon-192x192.png +0 -0
  64. package/assets/icons/apple-icon-114x114.png +0 -0
  65. package/assets/icons/apple-icon-120x120.png +0 -0
  66. package/assets/icons/apple-icon-144x144.png +0 -0
  67. package/assets/icons/apple-icon-152x152.png +0 -0
  68. package/assets/icons/apple-icon-180x180.png +0 -0
  69. package/assets/icons/apple-icon-57x57.png +0 -0
  70. package/assets/icons/apple-icon-60x60.png +0 -0
  71. package/assets/icons/apple-icon-72x72.png +0 -0
  72. package/assets/icons/apple-icon-76x76.png +0 -0
  73. package/assets/icons/apple-icon-precomposed.png +0 -0
  74. package/assets/icons/favicon-16x16.png +0 -0
  75. package/assets/icons/favicon-32x32.png +0 -0
  76. package/assets/icons/favicon-96x96.png +0 -0
  77. package/assets/icons/favicon.ico +0 -0
  78. package/assets/icons/ms-icon-144x144.png +0 -0
  79. package/assets/images/Filter.png +0 -0
  80. package/assets/images/Login.jpg +0 -0
  81. package/assets/images/SortDown.png +0 -0
  82. package/assets/images/SortUp.png +0 -0
  83. package/assets/images/android.png +0 -0
  84. package/assets/images/anywhere.png +0 -0
  85. package/assets/images/apple.png +0 -0
  86. package/assets/images/bug.png +0 -0
  87. package/assets/images/check.png +0 -0
  88. package/assets/images/error.png +0 -0
  89. package/assets/images/info.png +0 -0
  90. package/assets/images/linux.png +0 -0
  91. package/assets/images/other.png +0 -0
  92. package/assets/images/scrollbar.png +0 -0
  93. package/assets/images/select.png +0 -0
  94. package/assets/images/success.png +0 -0
  95. package/assets/images/visualizer/ER.png +0 -0
  96. package/assets/images/visualizer/Routers.png +0 -0
  97. package/assets/images/visualizer/er_error.png +0 -0
  98. package/assets/images/visualizer/error_er.png +0 -0
  99. package/assets/images/visualizer/host-error.png +0 -0
  100. package/assets/images/visualizer/host.png +0 -0
  101. package/assets/images/visualizer/host_unregistered.png +0 -0
  102. package/assets/images/visualizer/link-cut.png +0 -0
  103. package/assets/images/visualizer/service.png +0 -0
  104. package/assets/images/visualizer/unregistered.png +0 -0
  105. package/assets/images/warning.png +0 -0
  106. package/assets/images/windows.png +0 -0
  107. package/assets/languages/en-us.json +330 -0
  108. package/assets/resources/avatar/man.svg +78 -0
  109. package/assets/resources/avatar/woman.svg +96 -0
  110. package/assets/resources/icon/analysis.svg +104 -0
  111. package/assets/resources/icon/appwans.svg +20 -0
  112. package/assets/resources/icon/architecture.svg +1 -0
  113. package/assets/resources/icon/bike.svg +94 -0
  114. package/assets/resources/icon/bus.svg +64 -0
  115. package/assets/resources/icon/cas.svg +46 -0
  116. package/assets/resources/icon/clusters.svg +28 -0
  117. package/assets/resources/icon/computer.svg +1 -0
  118. package/assets/resources/icon/data.svg +1 -0
  119. package/assets/resources/icon/delivery-truck.svg +1 -0
  120. package/assets/resources/icon/explosion.svg +81 -0
  121. package/assets/resources/icon/fabricServices.svg +31 -0
  122. package/assets/resources/icon/fabrics.svg +136 -0
  123. package/assets/resources/icon/front.svg +83 -0
  124. package/assets/resources/icon/gateway.svg +49 -0
  125. package/assets/resources/icon/gear.svg +122 -0
  126. package/assets/resources/icon/house.svg +72 -0
  127. package/assets/resources/icon/language.svg +1 -0
  128. package/assets/resources/icon/objective.svg +55 -0
  129. package/assets/resources/icon/route.svg +97 -0
  130. package/assets/resources/icon/routers.svg +27 -0
  131. package/assets/resources/icon/startup.svg +112 -0
  132. package/assets/resources/icon/switch.svg +101 -0
  133. package/assets/scripts/chart.min.js +7 -0
  134. package/assets/scripts/commands.js +112 -0
  135. package/assets/scripts/components/codemirror/codemirror.css +356 -0
  136. package/assets/scripts/components/codemirror/codemirror.js +9741 -0
  137. package/assets/scripts/components/codemirror/modes/addons/closetags.js +200 -0
  138. package/assets/scripts/components/codemirror/modes/addons/colorize.js +40 -0
  139. package/assets/scripts/components/codemirror/modes/addons/css-hint.js +66 -0
  140. package/assets/scripts/components/codemirror/modes/addons/formatting.js +124 -0
  141. package/assets/scripts/components/codemirror/modes/addons/html-hint.js +366 -0
  142. package/assets/scripts/components/codemirror/modes/addons/javascript-hint.js +159 -0
  143. package/assets/scripts/components/codemirror/modes/addons/show-hint.css +36 -0
  144. package/assets/scripts/components/codemirror/modes/addons/show-hint.js +482 -0
  145. package/assets/scripts/components/codemirror/modes/css.js +831 -0
  146. package/assets/scripts/components/codemirror/modes/htmlmixed.js +152 -0
  147. package/assets/scripts/components/codemirror/modes/javascript.js +930 -0
  148. package/assets/scripts/components/codemirror/modes/xml.js +413 -0
  149. package/assets/scripts/components/column.css +184 -0
  150. package/assets/scripts/components/column.js +165 -0
  151. package/assets/scripts/components/flows.css +0 -0
  152. package/assets/scripts/components/flows.js +48 -0
  153. package/assets/scripts/components/leaflet/images/layers-2x.png +0 -0
  154. package/assets/scripts/components/leaflet/images/layers.png +0 -0
  155. package/assets/scripts/components/leaflet/images/marker-icon-2x.png +0 -0
  156. package/assets/scripts/components/leaflet/images/marker-icon.png +0 -0
  157. package/assets/scripts/components/leaflet/images/marker-shadow.png +0 -0
  158. package/assets/scripts/components/leaflet/leaflet-src.esm.js +13926 -0
  159. package/assets/scripts/components/leaflet/leaflet-src.esm.js.map +1 -0
  160. package/assets/scripts/components/leaflet/leaflet-src.js +14020 -0
  161. package/assets/scripts/components/leaflet/leaflet-src.js.map +1 -0
  162. package/assets/scripts/components/leaflet/leaflet.css +640 -0
  163. package/assets/scripts/components/leaflet/leaflet.js +5 -0
  164. package/assets/scripts/components/leaflet/leaflet.js.map +1 -0
  165. package/assets/scripts/components/moment.js +4602 -0
  166. package/assets/scripts/components/multiselect.js +333 -0
  167. package/assets/scripts/components/network/img/network/acceptDeleteIcon.png +0 -0
  168. package/assets/scripts/components/network/img/network/addNodeIcon.png +0 -0
  169. package/assets/scripts/components/network/img/network/backIcon.png +0 -0
  170. package/assets/scripts/components/network/img/network/connectIcon.png +0 -0
  171. package/assets/scripts/components/network/img/network/cross.png +0 -0
  172. package/assets/scripts/components/network/img/network/cross2.png +0 -0
  173. package/assets/scripts/components/network/img/network/deleteIcon.png +0 -0
  174. package/assets/scripts/components/network/img/network/downArrow.png +0 -0
  175. package/assets/scripts/components/network/img/network/editIcon.png +0 -0
  176. package/assets/scripts/components/network/img/network/leftArrow.png +0 -0
  177. package/assets/scripts/components/network/img/network/minus.png +0 -0
  178. package/assets/scripts/components/network/img/network/plus.png +0 -0
  179. package/assets/scripts/components/network/img/network/rightArrow.png +0 -0
  180. package/assets/scripts/components/network/img/network/upArrow.png +0 -0
  181. package/assets/scripts/components/network/img/network/zoomExtends.png +0 -0
  182. package/assets/scripts/components/network/types/DOMutil.d.ts +99 -0
  183. package/assets/scripts/components/network/types/index-legacy-bundle.d.ts +4 -0
  184. package/assets/scripts/components/network/types/index-legacy-bundle.d.ts.map +1 -0
  185. package/assets/scripts/components/network/types/index-legacy.d.ts +24 -0
  186. package/assets/scripts/components/network/types/index-legacy.d.ts.map +1 -0
  187. package/assets/scripts/components/network/types/index-peer.d.ts +11 -0
  188. package/assets/scripts/components/network/types/index-peer.d.ts.map +1 -0
  189. package/assets/scripts/components/network/types/index-standalone.d.ts +7 -0
  190. package/assets/scripts/components/network/types/index-standalone.d.ts.map +1 -0
  191. package/assets/scripts/components/network/types/module/hammer.d.ts +2 -0
  192. package/assets/scripts/components/network/types/module/moment.d.ts +2 -0
  193. package/assets/scripts/components/network/types/network/Images.d.ts +2 -0
  194. package/assets/scripts/components/network/types/network/Network.d.ts +1030 -0
  195. package/assets/scripts/components/network/types/network/dotparser.d.ts +2 -0
  196. package/assets/scripts/components/network/types/network/gephiParser.d.ts +80 -0
  197. package/assets/scripts/components/network/types/network/gephiParser.d.ts.map +1 -0
  198. package/assets/scripts/components/network/types/network/modules/components/edges/bezier-edge-dynamic.d.ts +55 -0
  199. package/assets/scripts/components/network/types/network/modules/components/edges/bezier-edge-dynamic.d.ts.map +1 -0
  200. package/assets/scripts/components/network/types/network/modules/components/edges/bezier-edge-static.d.ts +37 -0
  201. package/assets/scripts/components/network/types/network/modules/components/edges/bezier-edge-static.d.ts.map +1 -0
  202. package/assets/scripts/components/network/types/network/modules/components/edges/cubic-bezier-edge.d.ts +32 -0
  203. package/assets/scripts/components/network/types/network/modules/components/edges/cubic-bezier-edge.d.ts.map +1 -0
  204. package/assets/scripts/components/network/types/network/modules/components/edges/index.d.ts +10 -0
  205. package/assets/scripts/components/network/types/network/modules/components/edges/index.d.ts.map +1 -0
  206. package/assets/scripts/components/network/types/network/modules/components/edges/straight-edge.d.ts +26 -0
  207. package/assets/scripts/components/network/types/network/modules/components/edges/straight-edge.d.ts.map +1 -0
  208. package/assets/scripts/components/network/types/network/modules/components/edges/util/bezier-edge-base.d.ts +68 -0
  209. package/assets/scripts/components/network/types/network/modules/components/edges/util/bezier-edge-base.d.ts.map +1 -0
  210. package/assets/scripts/components/network/types/network/modules/components/edges/util/cubic-bezier-edge-base.d.ts +38 -0
  211. package/assets/scripts/components/network/types/network/modules/components/edges/util/cubic-bezier-edge-base.d.ts.map +1 -0
  212. package/assets/scripts/components/network/types/network/modules/components/edges/util/edge-base.d.ts +248 -0
  213. package/assets/scripts/components/network/types/network/modules/components/edges/util/edge-base.d.ts.map +1 -0
  214. package/assets/scripts/components/network/types/network/modules/components/edges/util/end-points.d.ts +58 -0
  215. package/assets/scripts/components/network/types/network/modules/components/edges/util/end-points.d.ts.map +1 -0
  216. package/assets/scripts/components/network/types/network/modules/components/edges/util/types.d.ts +196 -0
  217. package/assets/scripts/components/network/types/network/modules/components/edges/util/types.d.ts.map +1 -0
  218. package/assets/scripts/components/network/types/network/modules/layout-engine/index.d.ts +32 -0
  219. package/assets/scripts/components/network/types/network/modules/layout-engine/index.d.ts.map +1 -0
  220. package/assets/scripts/components/network/types/network/options.d.ts +2 -0
  221. package/assets/scripts/components/network/types/network/shapes.d.ts +122 -0
  222. package/assets/scripts/components/network/types/network/shapes.d.ts.map +1 -0
  223. package/assets/scripts/components/network/vis-network.css +716 -0
  224. package/assets/scripts/components/network/vis-network.esm.js +58974 -0
  225. package/assets/scripts/components/network/vis-network.esm.js.map +1 -0
  226. package/assets/scripts/components/network/vis-network.esm.min.js +53 -0
  227. package/assets/scripts/components/network/vis-network.esm.min.js.map +1 -0
  228. package/assets/scripts/components/network/vis-network.js +58994 -0
  229. package/assets/scripts/components/network/vis-network.js.map +1 -0
  230. package/assets/scripts/components/network/vis-network.min.css +1 -0
  231. package/assets/scripts/components/network/vis-network.min.js +53 -0
  232. package/assets/scripts/components/network/vis-network.min.js.map +1 -0
  233. package/assets/scripts/components/qrcode.min.js +1 -0
  234. package/assets/scripts/components/resources.js +26 -0
  235. package/assets/scripts/components/selector-new.js +300 -0
  236. package/assets/scripts/components/selector.js +300 -0
  237. package/assets/scripts/components/spectrum.js +2323 -0
  238. package/assets/scripts/components/timezone.js +1545 -0
  239. package/assets/scripts/components/uploader.js +74 -0
  240. package/assets/scripts/context.js +177 -0
  241. package/assets/scripts/dragging.js +58 -0
  242. package/assets/scripts/forms/forms.js +74 -0
  243. package/assets/scripts/forms/host.v1.htm +43 -0
  244. package/assets/scripts/forms/intercept.v1.htm +0 -0
  245. package/assets/scripts/forms/schema.js +693 -0
  246. package/assets/scripts/growler.js +133 -0
  247. package/assets/scripts/header.js +163 -0
  248. package/assets/scripts/jquery-3.6.3.min.js +2 -0
  249. package/assets/scripts/jquery.datetimepicker.js +2930 -0
  250. package/assets/scripts/locale.js +47 -0
  251. package/assets/scripts/modal.js +65 -0
  252. package/assets/scripts/model/data.js +558 -0
  253. package/assets/scripts/model/fabric.js +55 -0
  254. package/assets/scripts/model/fabricServices.js +45 -0
  255. package/assets/scripts/model/known.js +43 -0
  256. package/assets/scripts/model/links.js +44 -0
  257. package/assets/scripts/model/routers.js +51 -0
  258. package/assets/scripts/model/series.js +70 -0
  259. package/assets/scripts/model/sessions.js +61 -0
  260. package/assets/scripts/model/settings.js +60 -0
  261. package/assets/scripts/model/summary.js +49 -0
  262. package/assets/scripts/model/tags.js +330 -0
  263. package/assets/scripts/model/templates.js +42 -0
  264. package/assets/scripts/model/user.js +40 -0
  265. package/assets/scripts/restrictions.js +34 -0
  266. package/assets/scripts/service.js +76 -0
  267. package/assets/scripts/validation-tools.js +5119 -0
  268. package/assets/scripts/ziti.js +372 -0
  269. package/assets/styles/chart.min.css +1 -0
  270. package/assets/styles/dark.css +52 -0
  271. package/assets/styles/datetimepicker.css +1 -0
  272. package/assets/styles/forms.css +521 -0
  273. package/assets/styles/global.scss +890 -0
  274. package/assets/styles/growler.css +190 -0
  275. package/assets/styles/header.css +232 -0
  276. package/assets/styles/icons.css +160 -0
  277. package/assets/styles/navigation.css +183 -0
  278. package/assets/styles/select2.css +481 -0
  279. package/assets/styles/spectrum.css +507 -0
  280. package/assets/styles/tables.css +424 -0
  281. package/assets/styles/tooltip.css +134 -0
  282. package/assets/styles/ziti.css +3216 -0
  283. package/assets/svgs/Advanced.svg +89 -0
  284. package/assets/svgs/ArrowDown.svg +15 -0
  285. package/assets/svgs/ArrowDownDark.svg +15 -0
  286. package/assets/svgs/Confirm_Trash.svg +42 -0
  287. package/assets/svgs/DownloadKey.svg +50 -0
  288. package/assets/svgs/Filter.svg +13 -0
  289. package/assets/svgs/Growl_Bug.svg +47 -0
  290. package/assets/svgs/Growl_Error.svg +41 -0
  291. package/assets/svgs/Growl_Info.svg +45 -0
  292. package/assets/svgs/Growl_Success.svg +34 -0
  293. package/assets/svgs/Growl_Warning.svg +44 -0
  294. package/assets/svgs/MainMenuBlankUser.svg +14 -0
  295. package/assets/svgs/MainMenuNetworks.svg +37 -0
  296. package/assets/svgs/MainMenuNotifications.svg +32 -0
  297. package/assets/svgs/MainMenuOrg.svg +68 -0
  298. package/assets/svgs/MainMenuPlus.svg +13 -0
  299. package/assets/svgs/MainMenuSearch.svg +22 -0
  300. package/assets/svgs/MainMenuSupport.svg +417 -0
  301. package/assets/svgs/No_Clients.svg +94 -0
  302. package/assets/svgs/No_Plus.svg +30 -0
  303. package/assets/svgs/No_Routers.svg +56 -0
  304. package/assets/svgs/Resize.svg +33 -0
  305. package/assets/svgs/Simple.svg +62 -0
  306. package/assets/svgs/appwans.svg +20 -0
  307. package/assets/svgs/cas.svg +46 -0
  308. package/assets/svgs/cert.svg +69 -0
  309. package/assets/svgs/clear.svg +13 -0
  310. package/assets/svgs/close.svg +14 -0
  311. package/assets/svgs/clusters.svg +28 -0
  312. package/assets/svgs/copy.svg +64 -0
  313. package/assets/svgs/dashboard.svg +32 -0
  314. package/assets/svgs/dial.svg +83 -0
  315. package/assets/svgs/docs.svg +95 -0
  316. package/assets/svgs/downloads.svg +74 -0
  317. package/assets/svgs/fabricServices.svg +31 -0
  318. package/assets/svgs/fabrics.svg +134 -0
  319. package/assets/svgs/gateways.svg +49 -0
  320. package/assets/svgs/heart.svg +1 -0
  321. package/assets/svgs/ids.svg +20 -0
  322. package/assets/svgs/infoicon.svg +14 -0
  323. package/assets/svgs/lock.svg +12 -0
  324. package/assets/svgs/minus.svg +11 -0
  325. package/assets/svgs/nodata.svg +27 -0
  326. package/assets/svgs/qr.svg +56 -0
  327. package/assets/svgs/refresh.svg +24 -0
  328. package/assets/svgs/routers.svg +31 -0
  329. package/assets/svgs/select.svg +18 -0
  330. package/assets/svgs/services.svg +19 -0
  331. package/assets/svgs/settings.svg +1 -0
  332. package/assets/svgs/upload.svg +55 -0
  333. package/assets/templates/footer.htm +183 -0
  334. package/assets/templates/header.htm +298 -0
  335. package/assets/vectors/certificates.svg +1 -0
  336. package/assets/vectors/change.svg +1 -0
  337. package/assets/vectors/configuration.svg +2 -0
  338. package/assets/vectors/customize.svg +1 -0
  339. package/assets/vectors/dashboard.svg +1 -0
  340. package/assets/vectors/edgepolicies.svg +2 -0
  341. package/assets/vectors/globe.svg +63 -0
  342. package/assets/vectors/help.svg +48 -0
  343. package/assets/vectors/identity.svg +1 -0
  344. package/assets/vectors/notify.svg +1 -0
  345. package/assets/vectors/plus.svg +1 -0
  346. package/assets/vectors/posture.svg +1 -0
  347. package/assets/vectors/profile.svg +1 -0
  348. package/assets/vectors/router.svg +1 -0
  349. package/assets/vectors/routerpolicies.svg +1 -0
  350. package/assets/vectors/schema.svg +1 -0
  351. package/assets/vectors/server (1).svg +293 -0
  352. package/assets/vectors/servers.svg +103 -0
  353. package/assets/vectors/servicepolicy.svg +1 -0
  354. package/assets/vectors/services.svg +126 -0
  355. package/assets/vectors/settings.svg +130 -0
  356. package/assets/vectors/terminators.svg +1 -0
  357. package/assets/vectors/transitrouter.svg +1 -0
  358. package/esm2022/lib/app.initializer.mjs +24 -0
  359. package/esm2022/lib/features/card/card.component.mjs +29 -0
  360. package/esm2022/lib/features/card-list/card-list.component.mjs +50 -0
  361. package/esm2022/lib/features/config-editor/config-editor.component.mjs +239 -0
  362. package/esm2022/lib/features/confirm/confirm.component.mjs +59 -0
  363. package/esm2022/lib/features/creation-summary-dialog/creation-summary-dialog.component.mjs +92 -0
  364. package/esm2022/lib/features/custom-tags/custom-tags.component.mjs +77 -0
  365. package/esm2022/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.mjs +47 -0
  366. package/esm2022/lib/features/data-table/cells/table-cell-select/table-cell-select.component.mjs +46 -0
  367. package/esm2022/lib/features/data-table/cells/table-cell-token/table-cell-token.component.mjs +124 -0
  368. package/esm2022/lib/features/data-table/column-headers/table-column-default/table-column-default.component.mjs +269 -0
  369. package/esm2022/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.mjs +94 -0
  370. package/esm2022/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.mjs +38 -0
  371. package/esm2022/lib/features/data-table/column-headers/table-column-select/table-column-select.component.mjs +34 -0
  372. package/esm2022/lib/features/data-table/data-table-filter.service.mjs +66 -0
  373. package/esm2022/lib/features/data-table/data-table.component.mjs +848 -0
  374. package/esm2022/lib/features/data-table/data-table.service.mjs +99 -0
  375. package/esm2022/lib/features/data-table/table-filter-bar/filter-bar.component.mjs +95 -0
  376. package/esm2022/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.mjs +27 -0
  377. package/esm2022/lib/features/data-table/tooltips/os-tooltip.component.mjs +30 -0
  378. package/esm2022/lib/features/data-table/tooltips/sdk-tooltip.component.mjs +35 -0
  379. package/esm2022/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.mjs +73 -0
  380. package/esm2022/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.mjs +131 -0
  381. package/esm2022/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.mjs +169 -0
  382. package/esm2022/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.mjs +51 -0
  383. package/esm2022/lib/features/dynamic-widgets/number/number-input.component.mjs +74 -0
  384. package/esm2022/lib/features/dynamic-widgets/object/object.component.mjs +122 -0
  385. package/esm2022/lib/features/dynamic-widgets/password/password-input.component.mjs +72 -0
  386. package/esm2022/lib/features/dynamic-widgets/port-ranges/port-ranges.component.mjs +98 -0
  387. package/esm2022/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.mjs +180 -0
  388. package/esm2022/lib/features/dynamic-widgets/selector/selector-input.component.mjs +104 -0
  389. package/esm2022/lib/features/dynamic-widgets/string/string-input.component.mjs +72 -0
  390. package/esm2022/lib/features/dynamic-widgets/text-list/text-list-input.component.mjs +119 -0
  391. package/esm2022/lib/features/extendable/extendable.component.mjs +56 -0
  392. package/esm2022/lib/features/extendable/extensions-noop.service.mjs +50 -0
  393. package/esm2022/lib/features/json-view/json-view.component.mjs +197 -0
  394. package/esm2022/lib/features/list-page-features/list-page-form/list-page-form.component.mjs +139 -0
  395. package/esm2022/lib/features/list-page-features/list-page-header/list-page-header.component.mjs +48 -0
  396. package/esm2022/lib/features/loading-indicator/loading-indicator.component.mjs +21 -0
  397. package/esm2022/lib/features/messaging/growler.component.mjs +63 -0
  398. package/esm2022/lib/features/messaging/growler.model.mjs +24 -0
  399. package/esm2022/lib/features/messaging/growler.module.mjs +35 -0
  400. package/esm2022/lib/features/messaging/growler.service.mjs +72 -0
  401. package/esm2022/lib/features/messaging/logger.service.mjs +175 -0
  402. package/esm2022/lib/features/no-items/no-items.component.mjs +47 -0
  403. package/esm2022/lib/features/overrides/overrides.component.mjs +119 -0
  404. package/esm2022/lib/features/overrides/overrides.service.mjs +115 -0
  405. package/esm2022/lib/features/preview-list/preview-list.component.mjs +91 -0
  406. package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +223 -0
  407. package/esm2022/lib/features/projectable-forms/configuration/configuration.service.mjs +150 -0
  408. package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +188 -0
  409. package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.service.mjs +131 -0
  410. package/esm2022/lib/features/projectable-forms/form-field-container/form-field-container.component.mjs +72 -0
  411. package/esm2022/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.mjs +55 -0
  412. package/esm2022/lib/features/projectable-forms/form-header/form-header.component.mjs +96 -0
  413. package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +322 -0
  414. package/esm2022/lib/features/projectable-forms/identity/identity-form.service.mjs +144 -0
  415. package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +172 -0
  416. package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +240 -0
  417. package/esm2022/lib/features/projectable-forms/service/service-form.service.mjs +453 -0
  418. package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +680 -0
  419. package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +252 -0
  420. package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.service.mjs +214 -0
  421. package/esm2022/lib/features/qr-code/qr-code.component.mjs +143 -0
  422. package/esm2022/lib/features/reset-enrollment/reset-enrollment.component.mjs +87 -0
  423. package/esm2022/lib/features/reset-enrollment/reset-enrollment.service.mjs +62 -0
  424. package/esm2022/lib/features/side-modal/side-modal.component.mjs +46 -0
  425. package/esm2022/lib/features/sidebars/side-banner/side-banner.component.mjs +17 -0
  426. package/esm2022/lib/features/sidebars/side-navbar/side-navbar.component.mjs +55 -0
  427. package/esm2022/lib/features/sidebars/side-toolbar/side-toolbar.component.mjs +128 -0
  428. package/esm2022/lib/features/tag-selector/tag-selector.component.mjs +292 -0
  429. package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.component.mjs +588 -0
  430. package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.helper.mjs +370 -0
  431. package/esm2022/lib/features/wrappers/node-wrapper.service.mjs +51 -0
  432. package/esm2022/lib/features/wrappers/zac-wrapper-service.class.mjs +92 -0
  433. package/esm2022/lib/features/wrappers/zac-wrapper.component.mjs +147 -0
  434. package/esm2022/lib/features/wrappers/zac-wrapper.service.mjs +937 -0
  435. package/esm2022/lib/models/config.mjs +9 -0
  436. package/esm2022/lib/models/edge-router.mjs +13 -0
  437. package/esm2022/lib/models/identity.mjs +34 -0
  438. package/esm2022/lib/models/service-policy.mjs +12 -0
  439. package/esm2022/lib/models/service.mjs +12 -0
  440. package/esm2022/lib/pages/configurations/configurations-page.component.mjs +102 -0
  441. package/esm2022/lib/pages/configurations/configurations-page.service.mjs +246 -0
  442. package/esm2022/lib/pages/edge-routers/edge-routers-page.component.mjs +149 -0
  443. package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +361 -0
  444. package/esm2022/lib/pages/identities/identities-page.component.mjs +233 -0
  445. package/esm2022/lib/pages/identities/identities-page.service.mjs +498 -0
  446. package/esm2022/lib/pages/service-policies/service-policies-page.component.mjs +132 -0
  447. package/esm2022/lib/pages/service-policies/service-policies-page.service.mjs +457 -0
  448. package/esm2022/lib/pages/services/services-page.component.mjs +141 -0
  449. package/esm2022/lib/pages/services/services-page.service.mjs +215 -0
  450. package/esm2022/lib/safe.pipe.mjs +19 -0
  451. package/esm2022/lib/services/console-events.service.mjs +32 -0
  452. package/esm2022/lib/services/csv-download.service.mjs +92 -0
  453. package/esm2022/lib/services/deactivate-guard.service.mjs +18 -0
  454. package/esm2022/lib/services/login-service.class.mjs +28 -0
  455. package/esm2022/lib/services/node-data.service.mjs +292 -0
  456. package/esm2022/lib/services/noop-login.service.mjs +45 -0
  457. package/esm2022/lib/services/schema.service.mjs +808 -0
  458. package/esm2022/lib/services/settings-service.class.mjs +131 -0
  459. package/esm2022/lib/services/settings.service.mjs +193 -0
  460. package/esm2022/lib/services/tab-name.service.mjs +65 -0
  461. package/esm2022/lib/services/validation.service.mjs +124 -0
  462. package/esm2022/lib/services/ziti-controller-data.service.mjs +260 -0
  463. package/esm2022/lib/services/ziti-data.service.mjs +54 -0
  464. package/esm2022/lib/services/ziti-domain-controller.service.mjs +3 -0
  465. package/esm2022/lib/shared/list-page-component.class.mjs +145 -0
  466. package/esm2022/lib/shared/list-page-service.class.mjs +151 -0
  467. package/esm2022/lib/version.mjs +4 -0
  468. package/esm2022/lib/zac-routing.module.mjs +41 -0
  469. package/esm2022/lib/ziti-console-lib.module.mjs +364 -0
  470. package/esm2022/lib/ziti-console.constants.mjs +19 -0
  471. package/esm2022/openziti-ziti-console-lib.mjs +5 -0
  472. package/esm2022/public-api.mjs +71 -0
  473. package/fesm2022/openziti-ziti-console-lib.mjs +15813 -0
  474. package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -0
  475. package/index.d.ts +6 -0
  476. package/lib/app.initializer.d.ts +3 -0
  477. package/lib/app.initializer.d.ts.map +1 -0
  478. package/lib/features/card/card.component.d.ts +11 -0
  479. package/lib/features/card/card.component.d.ts.map +1 -0
  480. package/lib/features/card-list/card-list.component.d.ts +23 -0
  481. package/lib/features/card-list/card-list.component.d.ts.map +1 -0
  482. package/lib/features/config-editor/config-editor.component.d.ts +39 -0
  483. package/lib/features/config-editor/config-editor.component.d.ts.map +1 -0
  484. package/lib/features/confirm/confirm.component.d.ts +23 -0
  485. package/lib/features/confirm/confirm.component.d.ts.map +1 -0
  486. package/lib/features/creation-summary-dialog/creation-summary-dialog.component.d.ts +31 -0
  487. package/lib/features/creation-summary-dialog/creation-summary-dialog.component.d.ts.map +1 -0
  488. package/lib/features/custom-tags/custom-tags.component.d.ts +20 -0
  489. package/lib/features/custom-tags/custom-tags.component.d.ts.map +1 -0
  490. package/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.d.ts +16 -0
  491. package/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.d.ts.map +1 -0
  492. package/lib/features/data-table/cells/table-cell-select/table-cell-select.component.d.ts +19 -0
  493. package/lib/features/data-table/cells/table-cell-select/table-cell-select.component.d.ts.map +1 -0
  494. package/lib/features/data-table/cells/table-cell-token/table-cell-token.component.d.ts +22 -0
  495. package/lib/features/data-table/cells/table-cell-token/table-cell-token.component.d.ts.map +1 -0
  496. package/lib/features/data-table/column-headers/table-column-default/table-column-default.component.d.ts +52 -0
  497. package/lib/features/data-table/column-headers/table-column-default/table-column-default.component.d.ts.map +1 -0
  498. package/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.d.ts +27 -0
  499. package/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.d.ts.map +1 -0
  500. package/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.d.ts +19 -0
  501. package/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.d.ts.map +1 -0
  502. package/lib/features/data-table/column-headers/table-column-select/table-column-select.component.d.ts +15 -0
  503. package/lib/features/data-table/column-headers/table-column-select/table-column-select.component.d.ts.map +1 -0
  504. package/lib/features/data-table/data-table-filter.service.d.ts +24 -0
  505. package/lib/features/data-table/data-table-filter.service.d.ts.map +1 -0
  506. package/lib/features/data-table/data-table.component.d.ts +154 -0
  507. package/lib/features/data-table/data-table.component.d.ts.map +1 -0
  508. package/lib/features/data-table/data-table.service.d.ts +20 -0
  509. package/lib/features/data-table/data-table.service.d.ts.map +1 -0
  510. package/lib/features/data-table/table-filter-bar/filter-bar.component.d.ts +22 -0
  511. package/lib/features/data-table/table-filter-bar/filter-bar.component.d.ts.map +1 -0
  512. package/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.d.ts +10 -0
  513. package/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.d.ts.map +1 -0
  514. package/lib/features/data-table/tooltips/os-tooltip.component.d.ts +15 -0
  515. package/lib/features/data-table/tooltips/os-tooltip.component.d.ts.map +1 -0
  516. package/lib/features/data-table/tooltips/sdk-tooltip.component.d.ts +15 -0
  517. package/lib/features/data-table/tooltips/sdk-tooltip.component.d.ts.map +1 -0
  518. package/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.d.ts +19 -0
  519. package/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.d.ts.map +1 -0
  520. package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts +26 -0
  521. package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts.map +1 -0
  522. package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts +45 -0
  523. package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts.map +1 -0
  524. package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.d.ts +14 -0
  525. package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.d.ts.map +1 -0
  526. package/lib/features/dynamic-widgets/number/number-input.component.d.ts +20 -0
  527. package/lib/features/dynamic-widgets/number/number-input.component.d.ts.map +1 -0
  528. package/lib/features/dynamic-widgets/object/object.component.d.ts +26 -0
  529. package/lib/features/dynamic-widgets/object/object.component.d.ts.map +1 -0
  530. package/lib/features/dynamic-widgets/password/password-input.component.d.ts +20 -0
  531. package/lib/features/dynamic-widgets/password/password-input.component.d.ts.map +1 -0
  532. package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts +21 -0
  533. package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts.map +1 -0
  534. package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts +58 -0
  535. package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts.map +1 -0
  536. package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts +23 -0
  537. package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts.map +1 -0
  538. package/lib/features/dynamic-widgets/string/string-input.component.d.ts +20 -0
  539. package/lib/features/dynamic-widgets/string/string-input.component.d.ts.map +1 -0
  540. package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts +23 -0
  541. package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts.map +1 -0
  542. package/lib/features/extendable/extendable.component.d.ts +15 -0
  543. package/lib/features/extendable/extendable.component.d.ts.map +1 -0
  544. package/lib/features/extendable/extensions-noop.service.d.ts +31 -0
  545. package/lib/features/extendable/extensions-noop.service.d.ts.map +1 -0
  546. package/lib/features/json-view/json-view.component.d.ts +37 -0
  547. package/lib/features/json-view/json-view.component.d.ts.map +1 -0
  548. package/lib/features/list-page-features/list-page-form/list-page-form.component.d.ts +35 -0
  549. package/lib/features/list-page-features/list-page-form/list-page-form.component.d.ts.map +1 -0
  550. package/lib/features/list-page-features/list-page-header/list-page-header.component.d.ts +13 -0
  551. package/lib/features/list-page-features/list-page-header/list-page-header.component.d.ts.map +1 -0
  552. package/lib/features/loading-indicator/loading-indicator.component.d.ts +9 -0
  553. package/lib/features/loading-indicator/loading-indicator.component.d.ts.map +1 -0
  554. package/lib/features/messaging/growler.component.d.ts +19 -0
  555. package/lib/features/messaging/growler.component.d.ts.map +1 -0
  556. package/lib/features/messaging/growler.model.d.ts +8 -0
  557. package/lib/features/messaging/growler.model.d.ts.map +1 -0
  558. package/lib/features/messaging/growler.module.d.ts +10 -0
  559. package/lib/features/messaging/growler.module.d.ts.map +1 -0
  560. package/lib/features/messaging/growler.service.d.ts +18 -0
  561. package/lib/features/messaging/growler.service.d.ts.map +1 -0
  562. package/lib/features/messaging/logger.service.d.ts +27 -0
  563. package/lib/features/messaging/logger.service.d.ts.map +1 -0
  564. package/lib/features/no-items/no-items.component.d.ts +19 -0
  565. package/lib/features/no-items/no-items.component.d.ts.map +1 -0
  566. package/lib/features/overrides/overrides.component.d.ts +33 -0
  567. package/lib/features/overrides/overrides.component.d.ts.map +1 -0
  568. package/lib/features/overrides/overrides.service.d.ts +18 -0
  569. package/lib/features/overrides/overrides.service.d.ts.map +1 -0
  570. package/lib/features/preview-list/preview-list.component.d.ts +24 -0
  571. package/lib/features/preview-list/preview-list.component.d.ts.map +1 -0
  572. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +52 -0
  573. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +1 -0
  574. package/lib/features/projectable-forms/configuration/configuration.service.d.ts +33 -0
  575. package/lib/features/projectable-forms/configuration/configuration.service.d.ts.map +1 -0
  576. package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts +45 -0
  577. package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts.map +1 -0
  578. package/lib/features/projectable-forms/edge-router/edge-router-form.service.d.ts +29 -0
  579. package/lib/features/projectable-forms/edge-router/edge-router-form.service.d.ts.map +1 -0
  580. package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts +22 -0
  581. package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts.map +1 -0
  582. package/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.d.ts +15 -0
  583. package/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.d.ts.map +1 -0
  584. package/lib/features/projectable-forms/form-header/form-header.component.d.ts +23 -0
  585. package/lib/features/projectable-forms/form-header/form-header.component.d.ts.map +1 -0
  586. package/lib/features/projectable-forms/identity/identity-form.component.d.ts +70 -0
  587. package/lib/features/projectable-forms/identity/identity-form.component.d.ts.map +1 -0
  588. package/lib/features/projectable-forms/identity/identity-form.service.d.ts +20 -0
  589. package/lib/features/projectable-forms/identity/identity-form.service.d.ts.map +1 -0
  590. package/lib/features/projectable-forms/projectable-form.class.d.ts +39 -0
  591. package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -0
  592. package/lib/features/projectable-forms/service/service-form.component.d.ts +62 -0
  593. package/lib/features/projectable-forms/service/service-form.component.d.ts.map +1 -0
  594. package/lib/features/projectable-forms/service/service-form.service.d.ts +96 -0
  595. package/lib/features/projectable-forms/service/service-form.service.d.ts.map +1 -0
  596. package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts +140 -0
  597. package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts.map +1 -0
  598. package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +58 -0
  599. package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts.map +1 -0
  600. package/lib/features/projectable-forms/service-policy/service-policy-form.service.d.ts +37 -0
  601. package/lib/features/projectable-forms/service-policy/service-policy-form.service.d.ts.map +1 -0
  602. package/lib/features/qr-code/qr-code.component.d.ts +40 -0
  603. package/lib/features/qr-code/qr-code.component.d.ts.map +1 -0
  604. package/lib/features/reset-enrollment/reset-enrollment.component.d.ts +27 -0
  605. package/lib/features/reset-enrollment/reset-enrollment.component.d.ts.map +1 -0
  606. package/lib/features/reset-enrollment/reset-enrollment.service.d.ts +13 -0
  607. package/lib/features/reset-enrollment/reset-enrollment.service.d.ts.map +1 -0
  608. package/lib/features/side-modal/side-modal.component.d.ts +15 -0
  609. package/lib/features/side-modal/side-modal.component.d.ts.map +1 -0
  610. package/lib/features/sidebars/side-banner/side-banner.component.d.ts +7 -0
  611. package/lib/features/sidebars/side-banner/side-banner.component.d.ts.map +1 -0
  612. package/lib/features/sidebars/side-navbar/side-navbar.component.d.ts +16 -0
  613. package/lib/features/sidebars/side-navbar/side-navbar.component.d.ts.map +1 -0
  614. package/lib/features/sidebars/side-toolbar/side-toolbar.component.d.ts +34 -0
  615. package/lib/features/sidebars/side-toolbar/side-toolbar.component.d.ts.map +1 -0
  616. package/lib/features/tag-selector/tag-selector.component.d.ts +59 -0
  617. package/lib/features/tag-selector/tag-selector.component.d.ts.map +1 -0
  618. package/lib/features/visualizer/identity-service-path/identity-service-path.component.d.ts +53 -0
  619. package/lib/features/visualizer/identity-service-path/identity-service-path.component.d.ts.map +1 -0
  620. package/lib/features/visualizer/identity-service-path/identity-service-path.helper.d.ts +21 -0
  621. package/lib/features/visualizer/identity-service-path/identity-service-path.helper.d.ts.map +1 -0
  622. package/lib/features/wrappers/node-wrapper.service.d.ts +24 -0
  623. package/lib/features/wrappers/node-wrapper.service.d.ts.map +1 -0
  624. package/lib/features/wrappers/zac-wrapper-service.class.d.ts +38 -0
  625. package/lib/features/wrappers/zac-wrapper-service.class.d.ts.map +1 -0
  626. package/lib/features/wrappers/zac-wrapper.component.d.ts +31 -0
  627. package/lib/features/wrappers/zac-wrapper.component.d.ts.map +1 -0
  628. package/lib/features/wrappers/zac-wrapper.service.d.ts +56 -0
  629. package/lib/features/wrappers/zac-wrapper.service.d.ts.map +1 -0
  630. package/lib/models/config.d.ts +6 -0
  631. package/lib/models/config.d.ts.map +1 -0
  632. package/lib/models/edge-router.d.ts +10 -0
  633. package/lib/models/edge-router.d.ts.map +1 -0
  634. package/lib/models/identity.d.ts +16 -0
  635. package/lib/models/identity.d.ts.map +1 -0
  636. package/lib/models/service-policy.d.ts +9 -0
  637. package/lib/models/service-policy.d.ts.map +1 -0
  638. package/lib/models/service.d.ts +9 -0
  639. package/lib/models/service.d.ts.map +1 -0
  640. package/lib/pages/configurations/configurations-page.component.d.ts +29 -0
  641. package/lib/pages/configurations/configurations-page.component.d.ts.map +1 -0
  642. package/lib/pages/configurations/configurations-page.service.d.ts +78 -0
  643. package/lib/pages/configurations/configurations-page.service.d.ts.map +1 -0
  644. package/lib/pages/edge-routers/edge-routers-page.component.d.ts +38 -0
  645. package/lib/pages/edge-routers/edge-routers-page.component.d.ts.map +1 -0
  646. package/lib/pages/edge-routers/edge-routers-page.service.d.ts +47 -0
  647. package/lib/pages/edge-routers/edge-routers-page.service.d.ts.map +1 -0
  648. package/lib/pages/identities/identities-page.component.d.ts +44 -0
  649. package/lib/pages/identities/identities-page.component.d.ts.map +1 -0
  650. package/lib/pages/identities/identities-page.service.d.ts +54 -0
  651. package/lib/pages/identities/identities-page.service.d.ts.map +1 -0
  652. package/lib/pages/service-policies/service-policies-page.component.d.ts +36 -0
  653. package/lib/pages/service-policies/service-policies-page.component.d.ts.map +1 -0
  654. package/lib/pages/service-policies/service-policies-page.service.d.ts +63 -0
  655. package/lib/pages/service-policies/service-policies-page.service.d.ts.map +1 -0
  656. package/lib/pages/services/services-page.component.d.ts +37 -0
  657. package/lib/pages/services/services-page.component.d.ts.map +1 -0
  658. package/lib/pages/services/services-page.service.d.ts +46 -0
  659. package/lib/pages/services/services-page.service.d.ts.map +1 -0
  660. package/lib/safe.pipe.d.ts +11 -0
  661. package/lib/safe.pipe.d.ts.map +1 -0
  662. package/lib/services/console-events.service.d.ts +12 -0
  663. package/lib/services/console-events.service.d.ts.map +1 -0
  664. package/lib/services/csv-download.service.d.ts +11 -0
  665. package/lib/services/csv-download.service.d.ts.map +1 -0
  666. package/lib/services/deactivate-guard.service.d.ts +14 -0
  667. package/lib/services/deactivate-guard.service.d.ts.map +1 -0
  668. package/lib/services/login-service.class.d.ts +22 -0
  669. package/lib/services/login-service.class.d.ts.map +1 -0
  670. package/lib/services/node-data.service.d.ts +32 -0
  671. package/lib/services/node-data.service.d.ts.map +1 -0
  672. package/lib/services/noop-login.service.d.ts +23 -0
  673. package/lib/services/noop-login.service.d.ts.map +1 -0
  674. package/lib/services/schema.service.d.ts +63 -0
  675. package/lib/services/schema.service.d.ts.map +1 -0
  676. package/lib/services/settings-service.class.d.ts +35 -0
  677. package/lib/services/settings-service.class.d.ts.map +1 -0
  678. package/lib/services/settings.service.d.ts +18 -0
  679. package/lib/services/settings.service.d.ts.map +1 -0
  680. package/lib/services/tab-name.service.d.ts +20 -0
  681. package/lib/services/tab-name.service.d.ts.map +1 -0
  682. package/lib/services/validation.service.d.ts +13 -0
  683. package/lib/services/validation.service.d.ts.map +1 -0
  684. package/lib/services/ziti-controller-data.service.d.ts +32 -0
  685. package/lib/services/ziti-controller-data.service.d.ts.map +1 -0
  686. package/lib/services/ziti-data.service.d.ts +40 -0
  687. package/lib/services/ziti-data.service.d.ts.map +1 -0
  688. package/lib/services/ziti-domain-controller.service.d.ts +13 -0
  689. package/lib/services/ziti-domain-controller.service.d.ts.map +1 -0
  690. package/lib/shared/list-page-component.class.d.ts +52 -0
  691. package/lib/shared/list-page-component.class.d.ts.map +1 -0
  692. package/lib/shared/list-page-service.class.d.ts +47 -0
  693. package/lib/shared/list-page-service.class.d.ts.map +1 -0
  694. package/lib/version.d.ts +4 -0
  695. package/lib/version.d.ts.map +1 -0
  696. package/lib/zac-routing.module.d.ts +8 -0
  697. package/lib/zac-routing.module.d.ts.map +1 -0
  698. package/lib/ziti-console-lib.module.d.ts +85 -0
  699. package/lib/ziti-console-lib.module.d.ts.map +1 -0
  700. package/lib/ziti-console.constants.d.ts +4 -0
  701. package/lib/ziti-console.constants.d.ts.map +1 -0
  702. package/openziti-ziti-console-lib.d.ts.map +1 -0
  703. package/package.json +48 -0
  704. package/public-api.d.ts +68 -0
  705. package/public-api.d.ts.map +1 -0
@@ -0,0 +1,937 @@
1
+ /*
2
+ Copyright NetFoundry Inc.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ https://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+ import { Inject, Injectable } from '@angular/core';
17
+ import { NavigationEnd } from "@angular/router";
18
+ import { Resolver } from "@stoplight/json-ref-resolver";
19
+ import { get, isEmpty, set } from 'lodash';
20
+ import $ from 'jquery';
21
+ import { ZITI_DOMAIN_CONTROLLER } from "../../services/ziti-domain-controller.service";
22
+ import { ZITI_URLS } from "../../ziti-console.constants";
23
+ import { SETTINGS_SERVICE } from "../../services/settings.service";
24
+ import { ZacWrapperServiceClass } from "./zac-wrapper-service.class";
25
+ import { VERSION } from "../../version";
26
+ import * as i0 from "@angular/core";
27
+ import * as i1 from "@angular/common/http";
28
+ import * as i2 from "@angular/router";
29
+ import * as i3 from "../messaging/growler.service";
30
+ import * as i4 from "../messaging/logger.service";
31
+ import * as i5 from "../../services/validation.service";
32
+ import * as i6 from "../../services/settings.service";
33
+ // @ts-ignore
34
+ const { modal, growler } = window;
35
+ export const COMPONENTS = {
36
+ api: `<label data-i18n="APICalls"></label>
37
+ <div class="configBox">
38
+ <div class="related">
39
+ <input id="ApiUrl" type="text" readonly />
40
+ <div class="icon-copy copy" data-copy="ApiUrl"></div>
41
+ </div>
42
+ <div class="related">
43
+ <textarea id="ApiParams" autocapitalize="off" style="height:500px"></textarea>
44
+ <div class="icon-copy copy swap" data-copy="ApiParams"></div>
45
+ </div>
46
+ </div>`,
47
+ add: `<div class="action icon-plus" data-action="add"></div>`,
48
+ line: `<div class="line"></div>`,
49
+ noitems: `<div class="noitems"></div>`,
50
+ save: `<div class="buttons">
51
+ <div class="linkButton closer" data-i18n="Oops"></div>
52
+ <div id="SaveButton" class="button" data-defined="save" data-i18n="Save"></div>
53
+ </div>`,
54
+ search: `<div class="filters">
55
+ <input id="SearchFilter" data-defined="search" type="text" class="search" data-i18n="EnterFilter" />
56
+ <div class="clear icon-clear" data-defined="clear"></div>
57
+ <div class="searchButton icon-search"></div>
58
+ <div class="counters"><span id="Start">-</span>-<span id="End">-</span> <span data-i18n="Of"></span> <span id="Total">-</span></div>
59
+ <div class="navigate prev icon-prev disabled"></div>
60
+ <div class="navigate next icon-next disabled"></div>
61
+ </div>`,
62
+ tabIdentities: `<div class="tabs">
63
+ <div class="tab" data-go="/identities" data-i18n="Identities"></div>
64
+ <div class="tab" data-go="/recipes" data-i18n="Recipes"></div>
65
+ <div class="tab" data-go="/terminators" data-i18n="Terminators"></div>
66
+ <div class="tab" data-go="/posture-checks" data-i18n="PostureChecks"></div>
67
+ </div>`,
68
+ tabPolicies: `<div class="tabs">
69
+ <div class="tab" data-go="/service-policies" data-i18n="ServicePolicies"></div>
70
+ <div class="tab" data-go="/router-policies" data-i18n="EdgeRouterPolicies"></div>
71
+ <div class="tab" data-go="/service-router-policies" data-i18n="ServiceRouterPolicies"></div>
72
+ <div class="tab" data-go="/auth-policies" data-i18n="AuthPolicies"></div>
73
+ <div class="tab" data-go="/jwt-signers" data-i18n="JwtSigners"></div>
74
+ </div>`,
75
+ tabRouters: `<div class="tabs">
76
+ <div class="tab" data-go="/routers" data-i18n="EdgeRouters"></div>
77
+ <div class="tab" data-go="/transit-routers" data-i18n="TransitRouters"></div>
78
+ <div class="tab" data-go="/router-policies" data-i18n="EdgeRouterPolicies"></div>
79
+ </div>`,
80
+ tabServers: `<div class="tabs">
81
+ <div class="tab" data-go="/servers" data-i18n="ManageServers">Manage Servers</div>
82
+ <div class="tab" data-go="/organization" data-i18n="ManageFields">Manage Custom Fields</div>
83
+ </div>`,
84
+ tabServices: `<div class="tabs">
85
+ <div class="tab" data-go="/services" data-i18n="Services"></div>
86
+ <div class="tab" data-go="/configs" data-i18n="Configurations"></div>
87
+ <div class="tab" data-go="/config-types" data-i18n="ConfigTypes"></div>
88
+ </div>`,
89
+ tabSessions: `<div class="tabs">
90
+ <div class="tab" data-go="/sessions" data-i18n="Sessions"></div>
91
+ <div class="tab" data-go="/api-sessions" data-i18n="APISessions"></div>
92
+ </div>`,
93
+ customtags: `<label data-i18n="Tags"></label>
94
+ <div class="configBox">
95
+ <div id="TagExtended"></div>
96
+ </div>`
97
+ };
98
+ class ZacWrapperService extends ZacWrapperServiceClass {
99
+ constructor(zitiDomainController, URLS, settingsService, http, router, growlerService, loggerService, validationService) {
100
+ super(zitiDomainController, URLS, settingsService, http, router, growlerService, loggerService, validationService);
101
+ this.zitiDomainController = zitiDomainController;
102
+ this.URLS = URLS;
103
+ this.settingsService = settingsService;
104
+ this.http = http;
105
+ this.router = router;
106
+ this.growlerService = growlerService;
107
+ this.loggerService = loggerService;
108
+ this.validationService = validationService;
109
+ this.getCurrentPage(this.router.url);
110
+ this.initRouteListener();
111
+ }
112
+ initZac() {
113
+ if (this.zacInit) {
114
+ return;
115
+ }
116
+ const appInit = get(window, 'app.init');
117
+ this.settingsService.settingsChange.subscribe((settings) => {
118
+ set(window, 'service.call', this.handleServiceCall.bind(this));
119
+ });
120
+ this.initZacListeners();
121
+ this.zacInit = true;
122
+ }
123
+ initZacListeners() {
124
+ set(window, 'header.goto', (event) => {
125
+ const url = $(event.currentTarget).data("go");
126
+ let route = this.getCurrentPage(url);
127
+ this.router.navigate([route]);
128
+ });
129
+ }
130
+ getCurrentPage(url) {
131
+ let route = '';
132
+ switch (url) {
133
+ case '':
134
+ this.page = 'index';
135
+ route = this.URLS.ZITI_DASHBOARD;
136
+ break;
137
+ case '/identities':
138
+ case 'identities':
139
+ this.page = 'identities';
140
+ route = this.URLS.ZITI_IDENTITIES;
141
+ break;
142
+ case '/attributes':
143
+ case 'attributes':
144
+ this.page = 'attributes';
145
+ route = this.URLS.ZITI_ATTRIBUTES;
146
+ break;
147
+ case '/jwt-signers':
148
+ case 'jwt-signers':
149
+ this.page = 'jwt-signers';
150
+ route = this.URLS.ZITI_JWT_SIGNERS;
151
+ break;
152
+ case '/services':
153
+ case 'services':
154
+ this.page = 'services';
155
+ route = this.URLS.ZITI_SERVICES;
156
+ break;
157
+ case '/routers':
158
+ case 'routers':
159
+ this.page = 'routers';
160
+ route = this.URLS.ZITI_ROUTERS;
161
+ break;
162
+ case '/transit-routers':
163
+ case 'transit-routers':
164
+ this.page = 'transit-routers';
165
+ route = this.URLS.ZITI_TRANSIT_ROUTERS;
166
+ break;
167
+ case '/configs':
168
+ case 'configs':
169
+ this.page = 'configs';
170
+ route = this.URLS.ZITI_CONFIGS;
171
+ break;
172
+ case '/config-types':
173
+ case 'config-types':
174
+ this.page = 'config-types';
175
+ route = this.URLS.ZITI_CONFIG_TYPES;
176
+ break;
177
+ case '/recipes':
178
+ case 'recipes':
179
+ this.page = 'recipes';
180
+ route = this.URLS.ZITI_RECIPES;
181
+ break;
182
+ case '/terminators':
183
+ case 'terminators':
184
+ this.page = 'terminators';
185
+ route = this.URLS.ZITI_TERMINATORS;
186
+ break;
187
+ case '/config-terminators':
188
+ case 'config-terminators':
189
+ this.page = 'config-terminators';
190
+ route = this.URLS.ZITI_CONFIG_TERMINATORS;
191
+ break;
192
+ case '/auth-policies':
193
+ case 'auth-policies':
194
+ this.page = 'auth-policies';
195
+ route = this.URLS.ZITI_AUTH_POLICIES;
196
+ break;
197
+ case '/service-policies':
198
+ case 'service-policies':
199
+ this.page = 'service-policies';
200
+ route = this.URLS.ZITI_SERVICE_POLICIES;
201
+ break;
202
+ case '/router-policies':
203
+ case 'router-policies':
204
+ this.page = 'router-policies';
205
+ route = this.URLS.ZITI_ROUTER_POLICIES;
206
+ break;
207
+ case '/service-router-policies':
208
+ case 'service-router-policies':
209
+ this.page = 'service-router-policies';
210
+ route = this.URLS.ZITI_SERVICE_ROUTER_POLICIES;
211
+ break;
212
+ case '/posture-checks':
213
+ case 'posture-checks':
214
+ this.page = 'posture-checks';
215
+ route = this.URLS.ZITI_POSTURE_CHECKS;
216
+ break;
217
+ case '/certificate-authorities':
218
+ case 'certificate-authorities':
219
+ case '/cas':
220
+ case 'cas':
221
+ this.page = 'cas';
222
+ route = this.URLS.ZITI_CERT_AUTHORITIES;
223
+ break;
224
+ case '/sessions':
225
+ case 'sessions':
226
+ this.page = 'sessions';
227
+ route = this.URLS.ZITI_SESSIONS;
228
+ break;
229
+ case '/api-sessions':
230
+ case 'api-sessions':
231
+ this.page = 'api-sessions';
232
+ route = this.URLS.ZITI_API_SESSIONS;
233
+ break;
234
+ case '/servers':
235
+ case 'servers':
236
+ this.page = 'servers';
237
+ route = this.URLS.ZITI_SERVERS;
238
+ break;
239
+ case '/login':
240
+ case 'login':
241
+ this.page = 'login';
242
+ route = this.URLS.ZAC_LOGIN;
243
+ break;
244
+ case '/organization':
245
+ case 'organization':
246
+ this.page = 'organization';
247
+ route = this.URLS.ZITI_CUSTOM_FIELDS;
248
+ break;
249
+ case '/profile':
250
+ case 'profile':
251
+ this.page = 'profile';
252
+ route = this.URLS.ZITI_PROFILE;
253
+ break;
254
+ case '/settings':
255
+ case 'settings':
256
+ this.page = 'settings';
257
+ route = this.URLS.ZITI_SETTINGS;
258
+ break;
259
+ default:
260
+ this.page = 'index';
261
+ route = this.URLS.ZITI_DASHBOARD;
262
+ break;
263
+ }
264
+ return route;
265
+ }
266
+ initRouteListener() {
267
+ this.router.events.subscribe((event) => {
268
+ if (event['routerEvent'] instanceof NavigationEnd) {
269
+ const oldPage = this.page;
270
+ const page = event['routerEvent']['url'].split(';')[0].split('?')[0];
271
+ let doPageLoad = false;
272
+ switch (page) {
273
+ case this.URLS.ZITI_DASHBOARD:
274
+ this.page = 'index';
275
+ doPageLoad = true;
276
+ break;
277
+ case this.URLS.ZITI_SERVICES:
278
+ this.page = 'services';
279
+ break;
280
+ case this.URLS.ZITI_IDENTITIES:
281
+ this.page = 'identities';
282
+ break;
283
+ case this.URLS.ZITI_JWT_SIGNERS:
284
+ this.page = 'jwt-signers';
285
+ break;
286
+ case this.URLS.ZITI_CONFIGS:
287
+ this.page = 'configs';
288
+ break;
289
+ case this.URLS.ZITI_CONFIG_TYPES:
290
+ this.page = 'config-types';
291
+ break;
292
+ case this.URLS.ZITI_ROUTERS:
293
+ this.page = 'routers';
294
+ break;
295
+ case this.URLS.ZITI_TRANSIT_ROUTERS:
296
+ this.page = 'transit-routers';
297
+ break;
298
+ case this.URLS.ZITI_RECIPES:
299
+ this.page = 'recipes';
300
+ break;
301
+ case this.URLS.ZITI_TERMINATORS:
302
+ this.page = 'terminators';
303
+ break;
304
+ case this.URLS.ZITI_AUTH_POLICIES:
305
+ this.page = 'auth-policies';
306
+ break;
307
+ case this.URLS.ZITI_SERVICE_POLICIES:
308
+ this.page = 'service-policies';
309
+ break;
310
+ case this.URLS.ZITI_ROUTER_POLICIES:
311
+ this.page = 'router-policies';
312
+ break;
313
+ case this.URLS.ZITI_SERVICE_ROUTER_POLICIES:
314
+ this.page = 'service-router-policies';
315
+ break;
316
+ case this.URLS.ZITI_POSTURE_CHECKS:
317
+ this.page = 'posture-checks';
318
+ break;
319
+ case this.URLS.ZITI_BROWZER_CAS:
320
+ case this.URLS.ZITI_CERT_AUTHORITIES:
321
+ this.page = 'cas';
322
+ break;
323
+ case this.URLS.ZITI_SESSIONS:
324
+ this.page = 'sessions';
325
+ break;
326
+ case this.URLS.ZITI_API_SESSIONS:
327
+ this.page = 'api-sessions';
328
+ break;
329
+ case this.URLS.ZITI_ATTRIBUTES:
330
+ this.page = 'attributes';
331
+ break;
332
+ case this.URLS.ZAC_LOGIN:
333
+ this.page = 'login';
334
+ break;
335
+ case this.URLS.ZITI_SERVERS:
336
+ this.page = 'servers';
337
+ break;
338
+ case this.URLS.ZITI_CUSTOM_FIELDS:
339
+ this.page = 'organization';
340
+ break;
341
+ case this.URLS.ZITI_PROFILE:
342
+ this.page = 'profile';
343
+ break;
344
+ case this.URLS.ZITI_SETTINGS:
345
+ this.page = 'settings';
346
+ break;
347
+ default:
348
+ this.page = 'index';
349
+ doPageLoad = true;
350
+ break;
351
+ }
352
+ if (oldPage !== this.page || doPageLoad) {
353
+ this.pageChanged.emit();
354
+ }
355
+ }
356
+ });
357
+ }
358
+ loadCurrentPage() {
359
+ this.getCurrentPage(this.router.url);
360
+ if (isEmpty(this.page)) {
361
+ this.page = 'index';
362
+ }
363
+ const path = 'assets/html/' + this.page + '.htm';
364
+ return this.http.get(path, { responseType: "text" }).toPromise().then((html) => {
365
+ for (const prop in COMPONENTS) {
366
+ html = html.split('{{html.' + prop + '}}').join(COMPONENTS[prop]);
367
+ }
368
+ return html;
369
+ });
370
+ }
371
+ handleServiceCall(name, params, returnTo, type) {
372
+ const controllerDomain = this.settingsService?.settings?.selectedEdgeController || '';
373
+ switch (name) {
374
+ case 'data':
375
+ this.getZitiEntities(params.type, params.paging).then((result) => {
376
+ this.handleServiceResult(result, returnTo);
377
+ });
378
+ break;
379
+ case 'subdata':
380
+ this.getZitiEntity(params).then((result) => {
381
+ this.handleServiceResult(result, returnTo);
382
+ });
383
+ break;
384
+ case 'dataSave':
385
+ this.saveZitiEntity(params, returnTo);
386
+ break;
387
+ case 'identity':
388
+ this.createSimpleIdentity(params).then((result) => {
389
+ this.handleServiceResult(result, returnTo);
390
+ });
391
+ break;
392
+ case 'service':
393
+ this.createSimpleService(params).then((result) => {
394
+ this.handleServiceResult(result, returnTo);
395
+ });
396
+ break;
397
+ case 'subSave':
398
+ this.saveZitiSubData(params, returnTo);
399
+ break;
400
+ case 'delete':
401
+ this.deleteZitiEntities(params, returnTo);
402
+ break;
403
+ case 'call':
404
+ this.callZitiEdge(`${controllerDomain}/edge/management/v1/${params.url}`, {}).then((result) => {
405
+ this.handleServiceResult(result, returnTo);
406
+ });
407
+ break;
408
+ case 'schema':
409
+ this.dereferenceJSONSchema(params.schema).then((schema) => {
410
+ this.handleServiceResult({ data: schema }, returnTo);
411
+ });
412
+ break;
413
+ case 'template':
414
+ case 'language':
415
+ this.getLocaleFile(params.locale).then((result) => {
416
+ this.handleServiceResult(result, returnTo);
417
+ });
418
+ break;
419
+ case 'settings':
420
+ this.http.get("assets/data/settings.json", {}).toPromise().then((result) => {
421
+ returnTo(result);
422
+ });
423
+ break;
424
+ case 'version':
425
+ this.callZitiEdge(`${controllerDomain}/edge/management/v1/version`, {}).then((result) => {
426
+ const versionData = {
427
+ "data": result.data,
428
+ "serviceUrl": "/edge/management/v1",
429
+ "zac": VERSION.version,
430
+ "baseUrl": this.settingsService?.settings?.selectedEdgeController
431
+ };
432
+ returnTo(versionData);
433
+ });
434
+ break;
435
+ case 'controllerSave':
436
+ this.callZitiEdge("/api/controllerSave", {}).then((result) => {
437
+ this.handleServiceResult(result, returnTo);
438
+ });
439
+ break;
440
+ case 'server':
441
+ this.callZitiEdge("/api/server", {}).then((result) => {
442
+ this.handleServiceResult(result, returnTo);
443
+ });
444
+ break;
445
+ case 'tags':
446
+ // For no this is a no-op
447
+ break;
448
+ }
449
+ }
450
+ handleServiceResult(result, returnTo) {
451
+ if (result?.error) {
452
+ result = this.handleError(result);
453
+ }
454
+ returnTo(result);
455
+ }
456
+ async createSimpleIdentity(params) {
457
+ params = {
458
+ name: params.name,
459
+ roleAttributes: params.roles,
460
+ enrollment: { ott: true },
461
+ isAdmin: false,
462
+ type: "Device"
463
+ };
464
+ const controllerDomain = this.settingsService?.settings?.selectedEdgeController || '';
465
+ const url = `${controllerDomain}/edge/management/v1/identities`;
466
+ const id = await this.callZitiEdge(url, params, 'POST').then((result) => {
467
+ return result?.data?.id;
468
+ });
469
+ const entityParams = {
470
+ name: 'identities',
471
+ type: '',
472
+ url: './identities/' + id
473
+ };
474
+ return this.getZitiEntity(entityParams).then((results) => {
475
+ results.cli = [];
476
+ results.services = [];
477
+ let cli = "ziti edge create identity device \'" + params.name + "\'";
478
+ if (params.roleAttributes)
479
+ cli += " -a \'" + params.roleAttributes.toString() + "\'";
480
+ results.cli.push(cli);
481
+ let serviceCall = {
482
+ url: url,
483
+ params: params
484
+ };
485
+ results.services.push(serviceCall);
486
+ return results;
487
+ });
488
+ }
489
+ async createSimpleService(params) {
490
+ const name = params.name;
491
+ const protocol = params.protocol;
492
+ const host = params.host;
493
+ const port = Number(params.port);
494
+ const useEncrypt = params.encrypt;
495
+ const zitiHost = params.zitiHost;
496
+ const zitiPort = Number(params.zitiPort);
497
+ const hosted = params.hosted;
498
+ const access = params.access;
499
+ const rootName = name.trim().replace(/[^a-z0-9 ]/gi, '').split(' ').join('-');
500
+ const clientName = rootName + "-Client";
501
+ const serverName = rootName + "-Server";
502
+ const dialPolicyName = rootName + "-DialPolicy";
503
+ const bindPolicyName = rootName + "-BindPolicy";
504
+ const serverConfig = {
505
+ hostname: host,
506
+ port: port,
507
+ protocol: protocol
508
+ };
509
+ const clientConfig = {
510
+ hostname: zitiHost,
511
+ port: zitiPort
512
+ };
513
+ const paging = {
514
+ filter: "ziti-tunneler-client.v1",
515
+ noSearch: false,
516
+ order: "asc",
517
+ page: 1,
518
+ searchOn: "name",
519
+ sort: "name",
520
+ total: 50
521
+ };
522
+ let configTypeResult = await this.getZitiEntities('config-types', paging);
523
+ const clientConfigId = configTypeResult.data[0]?.id;
524
+ paging.filter = 'ziti-tunneler-server.v1';
525
+ configTypeResult = await this.getZitiEntities('config-types', paging);
526
+ const serverConfigId = configTypeResult.data[0]?.id;
527
+ const serverData = await this.createConfig(serverConfigId, serverName, serverConfig);
528
+ const clientData = await this.createConfig(clientConfigId, clientName, clientConfig);
529
+ const serverId = serverData.id;
530
+ const clientId = clientData.id;
531
+ const serviceData = await this.createService(name, serverId, clientId, useEncrypt);
532
+ const serviceId = serviceData.id;
533
+ const bindData = await this.createServicePolicy(bindPolicyName, "@" + serviceId, hosted);
534
+ const dialData = await this.createServicePolicy(dialPolicyName, "@" + serviceId, access);
535
+ const bindId = bindData.id;
536
+ const dialId = dialData.id;
537
+ const toReturn = {
538
+ data: [],
539
+ cli: [],
540
+ services: []
541
+ };
542
+ const logs = [];
543
+ logs.push({ name: serverName, id: serverId, type: "Config" });
544
+ logs.push({ name: clientName, id: clientId, type: "Config" });
545
+ logs.push({ name: name, id: serviceId, type: "Service" });
546
+ logs.push({ name: bindPolicyName, id: bindId, type: "Policy" });
547
+ logs.push({ name: dialPolicyName, id: dialId, type: "Policy" });
548
+ toReturn.data = logs;
549
+ toReturn.cli.push(serverData.cli);
550
+ toReturn.cli.push(clientData.cli);
551
+ toReturn.cli.push(serviceData.cli);
552
+ toReturn.cli.push(bindData.cli);
553
+ toReturn.cli.push(dialData.cli);
554
+ toReturn.services.push(serverData.service);
555
+ toReturn.services.push(clientData.service);
556
+ toReturn.services.push(serviceData.service);
557
+ toReturn.services.push(bindData.service);
558
+ toReturn.services.push(dialData.service);
559
+ return toReturn;
560
+ }
561
+ async createService(name, serverId, clientId, encrypt) {
562
+ const params = {
563
+ name: name,
564
+ configs: [serverId, clientId],
565
+ encryptionRequired: encrypt,
566
+ };
567
+ const controllerDomain = this.settingsService?.settings?.selectedEdgeController || '';
568
+ const url = `${controllerDomain}/edge/management/v1/services`;
569
+ return this.callZitiEdge(url, params, 'POST').then((result) => {
570
+ let cli = "ziti edge create service '" + name + "' --configs '" + serverId + "," + clientId + "'";
571
+ let serviceCall = {
572
+ url: url + "/services",
573
+ params: params
574
+ };
575
+ var item = {
576
+ id: result?.data?.id || '',
577
+ cli: cli,
578
+ service: serviceCall
579
+ };
580
+ return item;
581
+ });
582
+ }
583
+ async createServicePolicy(name, serviceId, hosted) {
584
+ const params = {
585
+ name: name,
586
+ type: "Bind",
587
+ semantic: "AnyOf",
588
+ serviceRoles: [serviceId],
589
+ identityRoles: hosted,
590
+ };
591
+ const controllerDomain = this.settingsService?.settings?.selectedEdgeController || '';
592
+ const url = `${controllerDomain}/edge/management/v1/service-policies`;
593
+ return this.callZitiEdge(url, params, 'POST').then((result) => {
594
+ let cli = "ziti edge create service-policy '" + name + "' Bind --semantic AnyOf --service-roles '" + serviceId + "' --identity-roles '" + hosted.toString() + "'";
595
+ let serviceCall = {
596
+ url: url + "/service-policies",
597
+ params: params
598
+ };
599
+ var item = {
600
+ id: result?.data?.id || '',
601
+ cli: cli,
602
+ service: serviceCall
603
+ };
604
+ return item;
605
+ });
606
+ }
607
+ async createConfig(configId, name, data, index = 0) {
608
+ const params = {
609
+ name: name + ((index > 0) ? "-" + index : ""),
610
+ configTypeId: configId,
611
+ data: data
612
+ };
613
+ const controllerDomain = this.settingsService?.settings?.selectedEdgeController || '';
614
+ const url = `${controllerDomain}/edge/management/v1/configs`;
615
+ return this.callZitiEdge(url, params, 'POST').then((result) => {
616
+ const cli = "ziti edge create config '" + params.name + "' '" + configId + "' '" + JSON.stringify(data).split('"').join('\\"') + "'";
617
+ const serviceCall = {
618
+ url: url + "/configs",
619
+ params: params
620
+ };
621
+ const item = {
622
+ id: result?.data?.id || '',
623
+ cli: cli,
624
+ service: serviceCall
625
+ };
626
+ return item;
627
+ });
628
+ }
629
+ async dereferenceJSONSchema(data) {
630
+ const resolver = new Resolver();
631
+ const schema = await resolver.resolve(data);
632
+ return schema.result;
633
+ }
634
+ async getLocaleFile(locale = 'en-us') {
635
+ locale = locale.toLowerCase();
636
+ let path = 'assets/languages/' + locale + '.json';
637
+ let localeFile = await this.http.get(path, { responseType: "text" }).toPromise().then((result) => {
638
+ return JSON.parse(result);
639
+ }).catch((error) => {
640
+ this.loggerService.error(error);
641
+ return;
642
+ });
643
+ if (!localeFile) {
644
+ path = 'assets/languages/en-us.json';
645
+ localeFile = await this.http.get(path, { responseType: "text" }).toPromise().then((result) => {
646
+ return JSON.parse(result);
647
+ });
648
+ }
649
+ return localeFile;
650
+ }
651
+ getZitiEntities(type, paging) {
652
+ const controllerDomain = this.settingsService?.settings?.selectedEdgeController || '';
653
+ const serviceUrl = `${controllerDomain}/edge/management/v1`;
654
+ let urlFilter = "";
655
+ let toSearchOn = "name";
656
+ let noSearch = false;
657
+ if (paging && paging.sort != null) {
658
+ if (paging.searchOn)
659
+ toSearchOn = paging.searchOn;
660
+ if (paging.noSearch)
661
+ noSearch = true;
662
+ if (!paging.filter)
663
+ paging.filter = "";
664
+ paging.filter = paging.filter.split('#').join('');
665
+ if (noSearch) {
666
+ if (paging.page !== -1)
667
+ urlFilter = "?limit=" + paging.total + "&offset=" + ((paging.page - 1) * paging.total);
668
+ }
669
+ else {
670
+ if (paging.page !== -1)
671
+ urlFilter = "?filter=(" + toSearchOn + " contains \"" + paging.filter + "\")&limit=" + paging.total + "&offset=" + ((paging.page - 1) * paging.total) + "&sort=" + paging.sort + " " + paging.order;
672
+ if (paging.params) {
673
+ for (const key in paging.params) {
674
+ urlFilter += ((urlFilter.length === 0) ? "?" : "&") + key + "=" + paging.params[key];
675
+ }
676
+ }
677
+ }
678
+ }
679
+ return this.callZitiEdge(serviceUrl + "/" + type + urlFilter, {});
680
+ }
681
+ getZitiEntity(params) {
682
+ const controllerDomain = this.settingsService?.settings?.selectedEdgeController || '';
683
+ const serviceUrl = `${controllerDomain}/edge/management/v1`;
684
+ const url = params.url.split("./").join("");
685
+ const id = params.id;
686
+ const type = params.type;
687
+ const parentType = params.name;
688
+ return this.callZitiEdge(serviceUrl + "/" + url, {}, 'GET').then((result) => {
689
+ return {
690
+ id: id,
691
+ parent: parentType,
692
+ type: type,
693
+ data: result.data
694
+ };
695
+ });
696
+ }
697
+ deleteZitiEntities(params, returnTo) {
698
+ const controllerDomain = this.settingsService?.settings?.selectedEdgeController || '';
699
+ const serviceUrl = `${controllerDomain}/edge/management/v1`;
700
+ const promises = [];
701
+ params.ids.forEach((id) => {
702
+ const type = params.type;
703
+ const parentType = params.name;
704
+ promises.push(this.callZitiEdge(serviceUrl + "/" + type + "/" + id.trim() + "/", {}, 'DELETE').then((result) => {
705
+ return {
706
+ id: id,
707
+ parent: parentType,
708
+ type: type,
709
+ data: result.data
710
+ };
711
+ }));
712
+ });
713
+ return Promise.all(promises).then(() => {
714
+ this.getZitiEntities(params.type, params.paging).then((result) => {
715
+ returnTo(result);
716
+ });
717
+ });
718
+ }
719
+ saveZitiEntity(params, returnTo) {
720
+ const controllerDomain = this.settingsService?.settings?.selectedEdgeController || '';
721
+ const serviceUrl = `${controllerDomain}/edge/management/v1`;
722
+ const saveParams = params.save;
723
+ const additional = params.additional;
724
+ const removal = params.removal;
725
+ const type = params.type;
726
+ const paging = params.paging;
727
+ let method = "POST";
728
+ let id = params.id;
729
+ let url = serviceUrl + "/" + type;
730
+ let chained = false;
731
+ if (params.chained)
732
+ chained = params.chained;
733
+ if (id && id.trim().length > 0) {
734
+ method = "PATCH";
735
+ url += "/" + id.trim();
736
+ if (removal) {
737
+ let objects = Object.entries(removal);
738
+ if (objects.length > 0) {
739
+ for (let i = 0; i < objects.length; i++) {
740
+ const parameters = {};
741
+ parameters.ids = objects[i][1];
742
+ return this.callZitiEdge(serviceUrl + "/" + type + "/" + id.trim() + "/" + objects[i][0], parameters, 'DELETE');
743
+ }
744
+ }
745
+ }
746
+ }
747
+ saveParams.data = this.validationService.redefineObject(saveParams.data);
748
+ for (const prop in saveParams.data) {
749
+ if (Array.isArray(saveParams.data[prop]) && saveParams.data[prop].length == 0) {
750
+ delete saveParams.data[prop];
751
+ }
752
+ else {
753
+ //console.log("Not Array: "+prop+" "+saveParams.data[prop].length);
754
+ }
755
+ }
756
+ return this.callZitiEdge(url, saveParams, method).then((result) => {
757
+ if (result?.error) {
758
+ returnTo(this.handleError(result.error));
759
+ }
760
+ else if (result?.data) {
761
+ if (additional) {
762
+ let objects = Object.entries(additional);
763
+ let index = 0;
764
+ if (objects.length > 0) {
765
+ if (method === "POST")
766
+ id = result?.data?.id;
767
+ for (let i = 0; i < objects.length; i++) {
768
+ this.callZitiEdge(serviceUrl + "/" + type + "/" + id + "/" + objects[i][0], { ids: objects[i][1] }, 'PUT').then((res) => {
769
+ index++;
770
+ if (index === objects.length) {
771
+ if (chained)
772
+ returnTo(res.data);
773
+ else
774
+ this.getZitiEntities(type, paging).then((result) => {
775
+ returnTo(result);
776
+ });
777
+ }
778
+ });
779
+ }
780
+ }
781
+ else {
782
+ if (chained)
783
+ returnTo(result.data);
784
+ else
785
+ this.getZitiEntities(type, paging).then((result) => {
786
+ returnTo(result);
787
+ });
788
+ }
789
+ }
790
+ else {
791
+ if (chained)
792
+ returnTo(result.data);
793
+ else
794
+ this.getZitiEntities(type, paging).then((result) => {
795
+ returnTo(result);
796
+ });
797
+ }
798
+ }
799
+ else
800
+ returnTo({ error: "Unable to save data" });
801
+ });
802
+ }
803
+ redefineObject(obj) {
804
+ for (let prop in obj) {
805
+ if (Array.isArray(obj[prop]) && obj[prop].length == 0) {
806
+ delete obj[prop];
807
+ }
808
+ else {
809
+ if (typeof obj[prop] === "string" && obj[prop].trim().length == 0) {
810
+ delete obj[prop];
811
+ }
812
+ else {
813
+ if (typeof obj[prop] === "object") {
814
+ obj[prop] = this.redefineObject(obj[prop]);
815
+ if (Object.keys(obj[prop]).length == 0) {
816
+ delete obj[prop];
817
+ }
818
+ }
819
+ }
820
+ }
821
+ }
822
+ return obj;
823
+ }
824
+ saveZitiSubData(params, returnTo) {
825
+ const controllerDomain = this.settingsService?.settings?.selectedEdgeController || '';
826
+ const serviceUrl = `${controllerDomain}/edge/management/v1`;
827
+ const id = params.id;
828
+ const type = params.type;
829
+ const doing = params.doing || 'POST';
830
+ const parentType = params.parentType;
831
+ const fullType = parentType + "/" + id + "/" + type;
832
+ const url = serviceUrl + "/" + fullType;
833
+ const saveParams = params.save;
834
+ this.callZitiEdge(url, saveParams, doing).then((result) => {
835
+ this.getZitiEntities(fullType, params.paging).then((data) => {
836
+ returnTo(data);
837
+ });
838
+ });
839
+ }
840
+ callZitiEdge(url, body, method = 'GET') {
841
+ const options = this.getHttpOptions();
842
+ let prom;
843
+ switch (method) {
844
+ case 'GET':
845
+ prom = this.http.get(url, options).toPromise();
846
+ break;
847
+ case 'POST':
848
+ prom = this.http.post(url, body, options).toPromise();
849
+ break;
850
+ case 'PUT':
851
+ prom = this.http.put(url, body, options).toPromise();
852
+ break;
853
+ case 'PATCH':
854
+ prom = this.http.patch(url, body, options).toPromise();
855
+ break;
856
+ case 'DELETE':
857
+ prom = this.http.delete(url, options).toPromise();
858
+ break;
859
+ default:
860
+ prom = this.http.get(url, options).toPromise();
861
+ break;
862
+ }
863
+ return prom.catch((result) => {
864
+ if (result?.error?.error?.code === 'UNAUTHORIZED') {
865
+ this.zitiDomainController.handleUnauthorized();
866
+ }
867
+ return result?.error;
868
+ });
869
+ }
870
+ initZACButtonListener() {
871
+ if (this.modalClose && this.modalShow) {
872
+ return;
873
+ }
874
+ this.modalShow = modal.show;
875
+ this.modalClose = modal.close;
876
+ if (!this.modalShow || !this.modalClose) {
877
+ return;
878
+ }
879
+ const modalIds = ['DetailModal', 'AddMessageModal', 'QRModal', 'ResetModal', 'OverrideModal', 'AddModal'];
880
+ modal.show = (id, readOnly) => {
881
+ this.modalShow(id, readOnly);
882
+ if (modalIds.includes(id)) {
883
+ $('body').addClass('updateModalOpen');
884
+ }
885
+ };
886
+ modal.close = (event) => {
887
+ this.modalClose(event);
888
+ $('body').removeClass('updateModalOpen');
889
+ };
890
+ if (!this.settingsService?.supportedFeatures?.recipes) {
891
+ $('.tab[data-go="/recipes"]').hide();
892
+ }
893
+ }
894
+ getHttpOptions(useZitiCreds = false) {
895
+ const options = {
896
+ headers: {
897
+ accept: 'application/json',
898
+ },
899
+ params: {},
900
+ responseType: 'json',
901
+ };
902
+ return options;
903
+ }
904
+ handleError(result) {
905
+ this.loggerService.error(result);
906
+ const error = result;
907
+ let message = '';
908
+ if (error.cause && error.causeMessage && error.causeMessage.length > 0)
909
+ message = error.causeMessage;
910
+ else if (error.cause && error.cause.message && error.cause.message.length > 0)
911
+ message = error.cause.message;
912
+ else if (error.cause && error.cause.reason && error.cause.reason.length > 0)
913
+ message = error.cause.reason;
914
+ else if (error.message && error.message.length > 0)
915
+ message = error.message;
916
+ else
917
+ message = error;
918
+ return { error: message };
919
+ }
920
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ZacWrapperService, deps: [{ token: ZITI_DOMAIN_CONTROLLER }, { token: ZITI_URLS }, { token: SETTINGS_SERVICE }, { token: i1.HttpClient }, { token: i2.Router }, { token: i3.GrowlerService }, { token: i4.LoggerService }, { token: i5.ValidationService }], target: i0.ɵɵFactoryTarget.Injectable }); }
921
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ZacWrapperService, providedIn: 'root' }); }
922
+ }
923
+ export { ZacWrapperService };
924
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ZacWrapperService, decorators: [{
925
+ type: Injectable,
926
+ args: [{ providedIn: 'root' }]
927
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
928
+ type: Inject,
929
+ args: [ZITI_DOMAIN_CONTROLLER]
930
+ }] }, { type: undefined, decorators: [{
931
+ type: Inject,
932
+ args: [ZITI_URLS]
933
+ }] }, { type: i6.SettingsService, decorators: [{
934
+ type: Inject,
935
+ args: [SETTINGS_SERVICE]
936
+ }] }, { type: i1.HttpClient }, { type: i2.Router }, { type: i3.GrowlerService }, { type: i4.LoggerService }, { type: i5.ValidationService }]; } });
937
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemFjLXdyYXBwZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy93cmFwcGVycy96YWMtd3JhcHBlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztFQWNFO0FBRUYsT0FBTyxFQUFlLE1BQU0sRUFBRSxVQUFVLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBRy9FLE9BQU8sRUFBQyxhQUFhLEVBQVMsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDdEQsT0FBTyxFQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFRLE1BQU0sUUFBUSxDQUFDO0FBQ2hELE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUMsc0JBQXNCLEVBQThCLE1BQU0sK0NBQStDLENBQUM7QUFDbEgsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxnQkFBZ0IsRUFBa0IsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRixPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUluRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQUl0QyxhQUFhO0FBQ2IsTUFBTSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUM7QUFFaEMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFRO0lBQzNCLEdBQUcsRUFBRTs7Ozs7Ozs7OztpQkFVUTtJQUNiLEdBQUcsRUFBRSx3REFBd0Q7SUFDN0QsSUFBSSxFQUFFLDBCQUEwQjtJQUNoQyxPQUFPLEVBQUUsNkJBQTZCO0lBQ3RDLElBQUksRUFBRTs7O29CQUdVO0lBQ2hCLE1BQU0sRUFB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RixJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFDLENBQUM7WUFBRSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7YUFDbEcsSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBQyxDQUFDO1lBQUUsT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO2FBQy9GLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBQyxDQUFDO1lBQUUsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7O1lBQ25FLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsT0FBTyxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsQ0FBQztJQUM1QixDQUFDOytHQXQwQlEsaUJBQWlCLGtCQU1kLHNCQUFzQixhQUN0QixTQUFTLGFBQ1QsZ0JBQWdCO21IQVJuQixpQkFBaUIsY0FETCxNQUFNOztTQUNsQixpQkFBaUI7NEZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7OzBCQU92QixNQUFNOzJCQUFDLHNCQUFzQjs7MEJBQzdCLE1BQU07MkJBQUMsU0FBUzs7MEJBQ2hCLE1BQU07MkJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgICBDb3B5cmlnaHQgTmV0Rm91bmRyeSBJbmMuXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IHtFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIdHRwQ2xpZW50fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7U3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtOYXZpZ2F0aW9uRW5kLCBSb3V0ZXJ9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7UmVzb2x2ZXJ9IGZyb20gXCJAc3RvcGxpZ2h0L2pzb24tcmVmLXJlc29sdmVyXCI7XG5pbXBvcnQge2dldCwgaXNFbXB0eSwgc2V0LCB1bnNldH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQge1pJVElfRE9NQUlOX0NPTlRST0xMRVIsIFppdGlEb21haW5Db250cm9sbGVyU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3ppdGktZG9tYWluLWNvbnRyb2xsZXIuc2VydmljZVwiO1xuaW1wb3J0IHtaSVRJX1VSTFN9IGZyb20gXCIuLi8uLi96aXRpLWNvbnNvbGUuY29uc3RhbnRzXCI7XG5pbXBvcnQge1NFVFRJTkdTX1NFUlZJQ0UsIFNldHRpbmdzU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3NldHRpbmdzLnNlcnZpY2VcIjtcbmltcG9ydCB7WmFjV3JhcHBlclNlcnZpY2VDbGFzc30gZnJvbSBcIi4vemFjLXdyYXBwZXItc2VydmljZS5jbGFzc1wiO1xuaW1wb3J0IHtHcm93bGVyU2VydmljZX0gZnJvbSBcIi4uL21lc3NhZ2luZy9ncm93bGVyLnNlcnZpY2VcIjtcbmltcG9ydCB7R3Jvd2xlck1vZGVsfSBmcm9tIFwiLi4vbWVzc2FnaW5nL2dyb3dsZXIubW9kZWxcIjtcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSBcIi4uL21lc3NhZ2luZy9sb2dnZXIuc2VydmljZVwiO1xuaW1wb3J0IHtWRVJTSU9OfSBmcm9tIFwiLi4vLi4vdmVyc2lvblwiO1xuaW1wb3J0IHtWYWxpZGF0aW9uU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24uc2VydmljZVwiO1xuaW1wb3J0IHtaSVRJX0RBVEFfU0VSVklDRSwgWml0aURhdGFTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXMveml0aS1kYXRhLnNlcnZpY2VcIjtcblxuLy8gQHRzLWlnbm9yZVxuY29uc3Qge21vZGFsLCBncm93bGVyfSA9IHdpbmRvdztcblxuZXhwb3J0IGNvbnN0IENPTVBPTkVOVFM6IGFueSA9IHtcbiAgICBhcGk6IGA8bGFiZWwgZGF0YS1pMThuPVwiQVBJQ2FsbHNcIj48L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWdCb3hcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGVkXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiQXBpVXJsXCIgdHlwZT1cInRleHRcIiByZWFkb25seSAvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvcHkgY29weVwiIGRhdGEtY29weT1cIkFwaVVybFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRlZFwiPlxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cIkFwaVBhcmFtc1wiIGF1dG9jYXBpdGFsaXplPVwib2ZmXCIgc3R5bGU9XCJoZWlnaHQ6NTAwcHhcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvcHkgY29weSBzd2FwXCIgZGF0YS1jb3B5PVwiQXBpUGFyYW1zXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4gXG4gICAgICAgICAgPC9kaXY+YCxcbiAgICBhZGQ6IGA8ZGl2IGNsYXNzPVwiYWN0aW9uIGljb24tcGx1c1wiIGRhdGEtYWN0aW9uPVwiYWRkXCI+PC9kaXY+YCxcbiAgICBsaW5lOiBgPGRpdiBjbGFzcz1cImxpbmVcIj48L2Rpdj5gLFxuICAgIG5vaXRlbXM6IGA8ZGl2IGNsYXNzPVwibm9pdGVtc1wiPjwvZGl2PmAsXG4gICAgc2F2ZTogYDxkaXYgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5rQnV0dG9uIGNsb3NlclwiIGRhdGEtaTE4bj1cIk9vcHNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgPGRpdiBpZD1cIlNhdmVCdXR0b25cIiBjbGFzcz1cImJ1dHRvblwiIGRhdGEtZGVmaW5lZD1cInNhdmVcIiBkYXRhLWkxOG49XCJTYXZlXCI+PC9kaXY+XG4gICAgICAgICAgICAgPC9kaXY+YCxcbiAgICBzZWFyY2g6IGA8ZGl2IGNsYXNzPVwiZmlsdGVyc1wiPlxuICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJTZWFyY2hGaWx0ZXJcIiBkYXRhLWRlZmluZWQ9XCJzZWFyY2hcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2VhcmNoXCIgZGF0YS1pMThuPVwiRW50ZXJGaWx0ZXJcIiAvPlxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXIgaWNvbi1jbGVhclwiIGRhdGEtZGVmaW5lZD1cImNsZWFyXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2hCdXR0b24gaWNvbi1zZWFyY2hcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXJzXCI+PHNwYW4gaWQ9XCJTdGFydFwiPi08L3NwYW4+LTxzcGFuIGlkPVwiRW5kXCI+LTwvc3Bhbj4gPHNwYW4gZGF0YS1pMThuPVwiT2ZcIj48L3NwYW4+IDxzcGFuIGlkPVwiVG90YWxcIj4tPC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2aWdhdGUgcHJldiBpY29uLXByZXYgZGlzYWJsZWRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdmlnYXRlIG5leHQgaWNvbi1uZXh0IGRpc2FibGVkXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gLFxuICAgIHRhYklkZW50aXRpZXM6IGA8ZGl2IGNsYXNzPVwidGFic1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJcIiBkYXRhLWdvPVwiL2lkZW50aXRpZXNcIiBkYXRhLWkxOG49XCJJZGVudGl0aWVzXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYlwiIGRhdGEtZ289XCIvcmVjaXBlc1wiIGRhdGEtaTE4bj1cIlJlY2lwZXNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiXCIgZGF0YS1nbz1cIi90ZXJtaW5hdG9yc1wiIGRhdGEtaTE4bj1cIlRlcm1pbmF0b3JzXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYlwiIGRhdGEtZ289XCIvcG9zdHVyZS1jaGVja3NcIiBkYXRhLWkxOG49XCJQb3N0dXJlQ2hlY2tzXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5gLFxuICAgIHRhYlBvbGljaWVzOiBgPGRpdiBjbGFzcz1cInRhYnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYlwiIGRhdGEtZ289XCIvc2VydmljZS1wb2xpY2llc1wiIGRhdGEtaTE4bj1cIlNlcnZpY2VQb2xpY2llc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiXCIgZGF0YS1nbz1cIi9yb3V0ZXItcG9saWNpZXNcIiBkYXRhLWkxOG49XCJFZGdlUm91dGVyUG9saWNpZXNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYlwiIGRhdGEtZ289XCIvc2VydmljZS1yb3V0ZXItcG9saWNpZXNcIiBkYXRhLWkxOG49XCJTZXJ2aWNlUm91dGVyUG9saWNpZXNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYlwiIGRhdGEtZ289XCIvYXV0aC1wb2xpY2llc1wiIGRhdGEtaTE4bj1cIkF1dGhQb2xpY2llc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiXCIgZGF0YS1nbz1cIi9qd3Qtc2lnbmVyc1wiIGRhdGEtaTE4bj1cIkp3dFNpZ25lcnNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gLFxuICAgIHRhYlJvdXRlcnM6IGA8ZGl2IGNsYXNzPVwidGFic1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiXCIgZGF0YS1nbz1cIi9yb3V0ZXJzXCIgZGF0YS1pMThuPVwiRWRnZVJvdXRlcnNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYlwiIGRhdGEtZ289XCIvdHJhbnNpdC1yb3V0ZXJzXCIgZGF0YS1pMThuPVwiVHJhbnNpdFJvdXRlcnNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYlwiIGRhdGEtZ289XCIvcm91dGVyLXBvbGljaWVzXCIgZGF0YS1pMThuPVwiRWRnZVJvdXRlclBvbGljaWVzXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+YCxcbiAgICB0YWJTZXJ2ZXJzOiBgPGRpdiBjbGFzcz1cInRhYnNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJcIiBkYXRhLWdvPVwiL3NlcnZlcnNcIiBkYXRhLWkxOG49XCJNYW5hZ2VTZXJ2ZXJzXCI+TWFuYWdlIFNlcnZlcnM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJcIiBkYXRhLWdvPVwiL29yZ2FuaXphdGlvblwiIGRhdGEtaTE4bj1cIk1hbmFnZUZpZWxkc1wiPk1hbmFnZSBDdXN0b20gRmllbGRzPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PmAsXG4gICAgdGFiU2VydmljZXM6IGA8ZGl2IGNsYXNzPVwidGFic1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYlwiIGRhdGEtZ289XCIvc2VydmljZXNcIiBkYXRhLWkxOG49XCJTZXJ2aWNlc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYlwiIGRhdGEtZ289XCIvY29uZmlnc1wiIGRhdGEtaTE4bj1cIkNvbmZpZ3VyYXRpb25zXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiXCIgZGF0YS1nbz1cIi9jb25maWctdHlwZXNcIiBkYXRhLWkxOG49XCJDb25maWdUeXBlc1wiPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5gLFxuICAgIHRhYlNlc3Npb25zOiBgPGRpdiBjbGFzcz1cInRhYnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYlwiIGRhdGEtZ289XCIvc2Vzc2lvbnNcIiBkYXRhLWkxOG49XCJTZXNzaW9uc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiXCIgZGF0YS1nbz1cIi9hcGktc2Vzc2lvbnNcIiBkYXRhLWkxOG49XCJBUElTZXNzaW9uc1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PmAsXG4gICAgY3VzdG9tdGFnczogYDxsYWJlbCBkYXRhLWkxOG49XCJUYWdzXCI+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnQm94XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJUYWdFeHRlbmRlZFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PmBcbn1cblxuXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBaYWNXcmFwcGVyU2VydmljZSBleHRlbmRzIFphY1dyYXBwZXJTZXJ2aWNlQ2xhc3Mge1xuXG4gICAgbW9kYWxTaG93O1xuICAgIG1vZGFsQ2xvc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChaSVRJX0RPTUFJTl9DT05UUk9MTEVSKSBvdmVycmlkZSB6aXRpRG9tYWluQ29udHJvbGxlcjogWml0aURvbWFpbkNvbnRyb2xsZXJTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KFpJVElfVVJMUykgb3ZlcnJpZGUgVVJMUzphbnksXG4gICAgICAgIEBJbmplY3QoU0VUVElOR1NfU0VSVklDRSkgb3ZlcnJpZGUgc2V0dGluZ3NTZXJ2aWNlOiBTZXR0aW5nc1NlcnZpY2UsXG4gICAgICAgIG92ZXJyaWRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgIG92ZXJyaWRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBvdmVycmlkZSBncm93bGVyU2VydmljZTogR3Jvd2xlclNlcnZpY2UsXG4gICAgICAgIG92ZXJyaWRlIGxvZ2dlclNlcnZpY2U6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgIG92ZXJyaWRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcih6aXRpRG9tYWluQ29udHJvbGxlciwgVVJMUywgc2V0dGluZ3NTZXJ2aWNlLCBodHRwLCByb3V0ZXIsIGdyb3dsZXJTZXJ2aWNlLCBsb2dnZXJTZXJ2aWNlLCB2YWxpZGF0aW9uU2VydmljZSk7XG4gICAgICAgIHRoaXMuZ2V0Q3VycmVudFBhZ2UodGhpcy5yb3V0ZXIudXJsKTtcbiAgICAgICAgdGhpcy5pbml0Um91dGVMaXN0ZW5lcigpO1xuICAgIH1cblxuICAgIGluaXRaYWMoKSB7XG4gICAgICAgIGlmICh0aGlzLnphY0luaXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcHBJbml0ID0gZ2V0KHdpbmRvdywgJ2FwcC5pbml0Jyk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzQ2hhbmdlLnN1YnNjcmliZSgoc2V0dGluZ3MpID0+IHtcbiAgICAgICAgICAgIHNldCh3aW5kb3csICdzZXJ2aWNlLmNhbGwnLCB0aGlzLmhhbmRsZVNlcnZpY2VDYWxsLmJpbmQodGhpcykpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbml0WmFjTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuemFjSW5pdCA9IHRydWU7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgaW5pdFphY0xpc3RlbmVycygpIHtcbiAgICAgICAgc2V0KHdpbmRvdywgJ2hlYWRlci5nb3RvJywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShcImdvXCIpO1xuICAgICAgICAgICAgbGV0IHJvdXRlID0gdGhpcy5nZXRDdXJyZW50UGFnZSh1cmwpO1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3JvdXRlXSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q3VycmVudFBhZ2UodXJsKSB7XG4gICAgICAgIGxldCByb3V0ZSA9ICcnO1xuICAgICAgICBzd2l0Y2ggKHVybCkge1xuICAgICAgICAgICAgY2FzZSAnJzpcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAnaW5kZXgnO1xuICAgICAgICAgICAgICAgIHJvdXRlID0gdGhpcy5VUkxTLlpJVElfREFTSEJPQVJEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnL2lkZW50aXRpZXMnOlxuICAgICAgICAgICAgY2FzZSAnaWRlbnRpdGllcyc6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ2lkZW50aXRpZXMnO1xuICAgICAgICAgICAgICAgIHJvdXRlID0gdGhpcy5VUkxTLlpJVElfSURFTlRJVElFUztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJy9hdHRyaWJ1dGVzJzpcbiAgICAgICAgICAgIGNhc2UgJ2F0dHJpYnV0ZXMnOlxuICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICdhdHRyaWJ1dGVzJztcbiAgICAgICAgICAgICAgICByb3V0ZSA9IHRoaXMuVVJMUy5aSVRJX0FUVFJJQlVURVM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcvand0LXNpZ25lcnMnOlxuICAgICAgICAgICAgY2FzZSAnand0LXNpZ25lcnMnOlxuICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICdqd3Qtc2lnbmVycyc7XG4gICAgICAgICAgICAgICAgcm91dGUgPSB0aGlzLlVSTFMuWklUSV9KV1RfU0lHTkVSUztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJy9zZXJ2aWNlcyc6XG4gICAgICAgICAgICBjYXNlICdzZXJ2aWNlcyc6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ3NlcnZpY2VzJztcbiAgICAgICAgICAgICAgICByb3V0ZSA9IHRoaXMuVVJMUy5aSVRJX1NFUlZJQ0VTO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnL3JvdXRlcnMnOlxuICAgICAgICAgICAgY2FzZSAncm91dGVycyc6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ3JvdXRlcnMnO1xuICAgICAgICAgICAgICAgIHJvdXRlID0gdGhpcy5VUkxTLlpJVElfUk9VVEVSUztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJy90cmFuc2l0LXJvdXRlcnMnOlxuICAgICAgICAgICAgY2FzZSAndHJhbnNpdC1yb3V0ZXJzJzpcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAndHJhbnNpdC1yb3V0ZXJzJztcbiAgICAgICAgICAgICAgICByb3V0ZSA9IHRoaXMuVVJMUy5aSVRJX1RSQU5TSVRfUk9VVEVSUztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJy9jb25maWdzJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbmZpZ3MnOlxuICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICdjb25maWdzJztcbiAgICAgICAgICAgICAgICByb3V0ZSA9IHRoaXMuVVJMUy5aSVRJX0NPTkZJR1M7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcvY29uZmlnLXR5cGVzJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbmZpZy10eXBlcyc6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ2NvbmZpZy10eXBlcyc7XG4gICAgICAgICAgICAgICAgcm91dGUgPSB0aGlzLlVSTFMuWklUSV9DT05GSUdfVFlQRVM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcvcmVjaXBlcyc6XG4gICAgICAgICAgICBjYXNlICdyZWNpcGVzJzpcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAncmVjaXBlcyc7XG4gICAgICAgICAgICAgICAgcm91dGUgPSB0aGlzLlVSTFMuWklUSV9SRUNJUEVTO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnL3Rlcm1pbmF0b3JzJzpcbiAgICAgICAgICAgIGNhc2UgJ3Rlcm1pbmF0b3JzJzpcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAndGVybWluYXRvcnMnO1xuICAgICAgICAgICAgICAgIHJvdXRlID0gdGhpcy5VUkxTLlpJVElfVEVSTUlOQVRPUlM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcvY29uZmlnLXRlcm1pbmF0b3JzJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbmZpZy10ZXJtaW5hdG9ycyc6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ2NvbmZpZy10ZXJtaW5hdG9ycyc7XG4gICAgICAgICAgICAgICAgcm91dGUgPSB0aGlzLlVSTFMuWklUSV9DT05GSUdfVEVSTUlOQVRPUlM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcvYXV0aC1wb2xpY2llcyc6XG4gICAgICAgICAgICBjYXNlICdhdXRoLXBvbGljaWVzJzpcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAnYXV0aC1wb2xpY2llcyc7XG4gICAgICAgICAgICAgICAgcm91dGUgPSB0aGlzLlVSTFMuWklUSV9BVVRIX1BPTElDSUVTO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnL3NlcnZpY2UtcG9saWNpZXMnOlxuICAgICAgICAgICAgY2FzZSAnc2VydmljZS1wb2xpY2llcyc6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ3NlcnZpY2UtcG9saWNpZXMnO1xuICAgICAgICAgICAgICAgIHJvdXRlID0gdGhpcy5VUkxTLlpJVElfU0VSVklDRV9QT0xJQ0lFUztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJy9yb3V0ZXItcG9saWNpZXMnOlxuICAgICAgICAgICAgY2FzZSAncm91dGVyLXBvbGljaWVzJzpcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAncm91dGVyLXBvbGljaWVzJztcbiAgICAgICAgICAgICAgICByb3V0ZSA9IHRoaXMuVVJMUy5aSVRJX1JPVVRFUl9QT0xJQ0lFUztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJy9zZXJ2aWNlLXJvdXRlci1wb2xpY2llcyc6XG4gICAgICAgICAgICBjYXNlICdzZXJ2aWNlLXJvdXRlci1wb2xpY2llcyc6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ3NlcnZpY2Utcm91dGVyLXBvbGljaWVzJztcbiAgICAgICAgICAgICAgICByb3V0ZSA9IHRoaXMuVVJMUy5aSVRJX1NFUlZJQ0VfUk9VVEVSX1BPTElDSUVTO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnL3Bvc3R1cmUtY2hlY2tzJzpcbiAgICAgICAgICAgIGNhc2UgJ3Bvc3R1cmUtY2hlY2tzJzpcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAncG9zdHVyZS1jaGVja3MnO1xuICAgICAgICAgICAgICAgIHJvdXRlID0gdGhpcy5VUkxTLlpJVElfUE9TVFVSRV9DSEVDS1M7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcvY2VydGlmaWNhdGUtYXV0aG9yaXRpZXMnOlxuICAgICAgICAgICAgY2FzZSAnY2VydGlmaWNhdGUtYXV0aG9yaXRpZXMnOlxuICAgICAgICAgICAgY2FzZSAnL2Nhcyc6XG4gICAgICAgICAgICBjYXNlICdjYXMnOlxuICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICdjYXMnO1xuICAgICAgICAgICAgICAgIHJvdXRlID0gdGhpcy5VUkxTLlpJVElfQ0VSVF9BVVRIT1JJVElFUztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJy9zZXNzaW9ucyc6XG4gICAgICAgICAgICBjYXNlICdzZXNzaW9ucyc6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ3Nlc3Npb25zJztcbiAgICAgICAgICAgICAgICByb3V0ZSA9IHRoaXMuVVJMUy5aSVRJX1NFU1NJT05TO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnL2FwaS1zZXNzaW9ucyc6XG4gICAgICAgICAgICBjYXNlICdhcGktc2Vzc2lvbnMnOlxuICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICdhcGktc2Vzc2lvbnMnO1xuICAgICAgICAgICAgICAgIHJvdXRlID0gdGhpcy5VUkxTLlpJVElfQVBJX1NFU1NJT05TO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnL3NlcnZlcnMnOlxuICAgICAgICAgICAgY2FzZSAnc2VydmVycyc6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ3NlcnZlcnMnO1xuICAgICAgICAgICAgICAgIHJvdXRlID0gdGhpcy5VUkxTLlpJVElfU0VSVkVSUztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJy9sb2dpbic6XG4gICAgICAgICAgICBjYXNlICdsb2dpbic6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ2xvZ2luJztcbiAgICAgICAgICAgICAgICByb3V0ZSA9IHRoaXMuVVJMUy5aQUNfTE9HSU47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcvb3JnYW5pemF0aW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ29yZ2FuaXphdGlvbic6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ29yZ2FuaXphdGlvbic7XG4gICAgICAgICAgICAgICAgcm91dGUgPSB0aGlzLlVSTFMuWklUSV9DVVNUT01fRklFTERTO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnL3Byb2ZpbGUnOlxuICAgICAgICAgICAgY2FzZSAncHJvZmlsZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ3Byb2ZpbGUnO1xuICAgICAgICAgICAgICAgIHJvdXRlID0gdGhpcy5VUkxTLlpJVElfUFJPRklMRTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJy9zZXR0aW5ncyc6XG4gICAgICAgICAgICBjYXNlICdzZXR0aW5ncyc6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ3NldHRpbmdzJztcbiAgICAgICAgICAgICAgICByb3V0ZSA9IHRoaXMuVVJMUy5aSVRJX1NFVFRJTkdTO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAnaW5kZXgnO1xuICAgICAgICAgICAgICAgIHJvdXRlID0gdGhpcy5VUkxTLlpJVElfREFTSEJPQVJEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3V0ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRSb3V0ZUxpc3RlbmVyKCkge1xuICAgICAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKChldmVudCBhcyBhbnkpWydyb3V0ZXJFdmVudCddIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9sZFBhZ2UgPSB0aGlzLnBhZ2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IChldmVudCBhcyBhbnkpWydyb3V0ZXJFdmVudCddWyd1cmwnXS5zcGxpdCgnOycpWzBdLnNwbGl0KCc/JylbMF07XG4gICAgICAgICAgICAgICAgbGV0IGRvUGFnZUxvYWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlVSTFMuWklUSV9EQVNIQk9BUkQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAnaW5kZXgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9QYWdlTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlVSTFMuWklUSV9TRVJWSUNFUzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICdzZXJ2aWNlcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlVSTFMuWklUSV9JREVOVElUSUVTOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ2lkZW50aXRpZXMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5VUkxTLlpJVElfSldUX1NJR05FUlM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAnand0LXNpZ25lcnMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5VUkxTLlpJVElfQ09ORklHUzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICdjb25maWdzJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuVVJMUy5aSVRJX0NPTkZJR19UWVBFUzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICdjb25maWctdHlwZXMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5VUkxTLlpJVElfUk9VVEVSUzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICdyb3V0ZXJzJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuVVJMUy5aSVRJX1RSQU5TSVRfUk9VVEVSUzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICd0cmFuc2l0LXJvdXRlcnMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5VUkxTLlpJVElfUkVDSVBFUzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICdyZWNpcGVzJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuVVJMUy5aSVRJX1RFUk1JTkFUT1JTOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ3Rlcm1pbmF0b3JzJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuVVJMUy5aSVRJX0FVVEhfUE9MSUNJRVM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAnYXV0aC1wb2xpY2llcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlVSTFMuWklUSV9TRVJWSUNFX1BPTElDSUVTOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ3NlcnZpY2UtcG9saWNpZXMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5VUkxTLlpJVElfUk9VVEVSX1BPTElDSUVTOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ3JvdXRlci1wb2xpY2llcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlVSTFMuWklUSV9TRVJWSUNFX1JPVVRFUl9QT0xJQ0lFUzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICdzZXJ2aWNlLXJvdXRlci1wb2xpY2llcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlVSTFMuWklUSV9QT1NUVVJFX0NIRUNLUzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICdwb3N0dXJlLWNoZWNrcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlVSTFMuWklUSV9CUk9XWkVSX0NBUzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlVSTFMuWklUSV9DRVJUX0FVVEhPUklUSUVTOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ2Nhcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlVSTFMuWklUSV9TRVNTSU9OUzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9ICdzZXNzaW9ucyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlVSTFMuWklUSV9BUElfU0VTU0lPTlM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAnYXBpLXNlc3Npb25zJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuVVJMUy5aSVRJX0FUVFJJQlVURVM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAnYXR0cmlidXRlcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlVSTFMuWkFDX0xPR0lOOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ2xvZ2luJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuVVJMUy5aSVRJX1NFUlZFUlM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAnc2VydmVycyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlVSTFMuWklUSV9DVVNUT01fRklFTERTOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ29yZ2FuaXphdGlvbic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlVSTFMuWklUSV9QUk9GSUxFOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlID0gJ3Byb2ZpbGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5VUkxTLlpJVElfU0VUVElOR1M6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAnc2V0dGluZ3MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAnaW5kZXgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9QYWdlTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9sZFBhZ2UgIT09IHRoaXMucGFnZSB8fCBkb1BhZ2VMb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgbG9hZEN1cnJlbnRQYWdlKCkge1xuICAgICAgICB0aGlzLmdldEN1cnJlbnRQYWdlKHRoaXMucm91dGVyLnVybCk7XG4gICAgICAgIGlmIChpc0VtcHR5KHRoaXMucGFnZSkpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZSA9ICdpbmRleCdcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXRoID0gJ2Fzc2V0cy9odG1sLycgKyB0aGlzLnBhZ2UgKyAnLmh0bSc7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHBhdGgsIHtyZXNwb25zZVR5cGU6IFwidGV4dFwifSkudG9Qcm9taXNlKCkudGhlbigoaHRtbDogYW55KSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gQ09NUE9ORU5UUykge1xuICAgICAgICAgICAgICAgIGh0bWwgPSBodG1sLnNwbGl0KCd7e2h0bWwuJyArIHByb3AgKyAnfX0nKS5qb2luKENPTVBPTkVOVFNbcHJvcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhbmRsZVNlcnZpY2VDYWxsKG5hbWU6IHN0cmluZywgcGFyYW1zOiBhbnksIHJldHVyblRvOiBhbnksIHR5cGU6IGFueSkge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyRG9tYWluID0gdGhpcy5zZXR0aW5nc1NlcnZpY2U/LnNldHRpbmdzPy5zZWxlY3RlZEVkZ2VDb250cm9sbGVyIHx8ICcnO1xuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Wml0aUVudGl0aWVzKHBhcmFtcy50eXBlLCBwYXJhbXMucGFnaW5nKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTZXJ2aWNlUmVzdWx0KHJlc3VsdCwgcmV0dXJuVG8pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc3ViZGF0YSc6XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRaaXRpRW50aXR5KHBhcmFtcykudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VydmljZVJlc3VsdChyZXN1bHQsIHJldHVyblRvKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGFTYXZlJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVaaXRpRW50aXR5KHBhcmFtcywgcmV0dXJuVG8pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaWRlbnRpdHknOlxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU2ltcGxlSWRlbnRpdHkocGFyYW1zKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTZXJ2aWNlUmVzdWx0KHJlc3VsdCwgcmV0dXJuVG8pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2VydmljZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHBhcmFtcykudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VydmljZVJlc3VsdChyZXN1bHQsIHJldHVyblRvKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3N1YlNhdmUnOlxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVppdGlTdWJEYXRhKHBhcmFtcywgcmV0dXJuVG8pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVppdGlFbnRpdGllcyhwYXJhbXMsIHJldHVyblRvKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NhbGwnOlxuICAgICAgICAgICAgICAgIHRoaXMuY2FsbFppdGlFZGdlKGAke2NvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MS8ke3BhcmFtcy51cmx9YCwge30pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNlcnZpY2VSZXN1bHQocmVzdWx0LCByZXR1cm5Ubyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzY2hlbWEnOlxuICAgICAgICAgICAgICAgIHRoaXMuZGVyZWZlcmVuY2VKU09OU2NoZW1hKHBhcmFtcy5zY2hlbWEpLnRoZW4oKHNjaGVtYSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNlcnZpY2VSZXN1bHQoe2RhdGE6IHNjaGVtYX0sIHJldHVyblRvKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndGVtcGxhdGUnOlxuICAgICAgICAgICAgY2FzZSAnbGFuZ3VhZ2UnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TG9jYWxlRmlsZShwYXJhbXMubG9jYWxlKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTZXJ2aWNlUmVzdWx0KHJlc3VsdCwgcmV0dXJuVG8pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2V0dGluZ3MnOlxuICAgICAgICAgICAgICAgIHRoaXMuaHR0cC5nZXQoXCJhc3NldHMvZGF0YS9zZXR0aW5ncy5qc29uXCIsIHt9KS50b1Byb21pc2UoKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVG8ocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3ZlcnNpb24nOlxuICAgICAgICAgICAgICAgIHRoaXMuY2FsbFppdGlFZGdlKGAke2NvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MS92ZXJzaW9uYCwge30pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF0YVwiOiByZXN1bHQuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic2VydmljZVVybFwiOiBcIi9lZGdlL21hbmFnZW1lbnQvdjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiemFjXCI6IFZFUlNJT04udmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFzZVVybFwiOiB0aGlzLnNldHRpbmdzU2VydmljZT8uc2V0dGluZ3M/LnNlbGVjdGVkRWRnZUNvbnRyb2xsZXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm5Ubyh2ZXJzaW9uRGF0YSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb250cm9sbGVyU2F2ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsWml0aUVkZ2UoXCIvYXBpL2NvbnRyb2xsZXJTYXZlXCIsIHt9KS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTZXJ2aWNlUmVzdWx0KHJlc3VsdCwgcmV0dXJuVG8pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2VydmVyJzpcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxaaXRpRWRnZShcIi9hcGkvc2VydmVyXCIsIHt9KS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTZXJ2aWNlUmVzdWx0KHJlc3VsdCwgcmV0dXJuVG8pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndGFncyc6XG4gICAgICAgICAgICAgICAgLy8gRm9yIG5vIHRoaXMgaXMgYSBuby1vcFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlU2VydmljZVJlc3VsdChyZXN1bHQsIHJldHVyblRvKSB7XG4gICAgICAgIGlmIChyZXN1bHQ/LmVycm9yKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmhhbmRsZUVycm9yKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuVG8ocmVzdWx0KTtcbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGVTaW1wbGVJZGVudGl0eShwYXJhbXMpIHtcbiAgICAgICAgcGFyYW1zID0ge1xuICAgICAgICAgICAgbmFtZTogcGFyYW1zLm5hbWUsXG4gICAgICAgICAgICByb2xlQXR0cmlidXRlczogcGFyYW1zLnJvbGVzLFxuICAgICAgICAgICAgZW5yb2xsbWVudDogeyBvdHQ6IHRydWUgfSxcbiAgICAgICAgICAgIGlzQWRtaW46IGZhbHNlLFxuICAgICAgICAgICAgdHlwZTogXCJEZXZpY2VcIlxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXJEb21haW4gPSB0aGlzLnNldHRpbmdzU2VydmljZT8uc2V0dGluZ3M/LnNlbGVjdGVkRWRnZUNvbnRyb2xsZXIgfHwgJyc7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke2NvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MS9pZGVudGl0aWVzYDtcbiAgICAgICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLmNhbGxaaXRpRWRnZSh1cmwsIHBhcmFtcywgJ1BPU1QnKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ/LmRhdGE/LmlkO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZW50aXR5UGFyYW1zID0ge1xuICAgICAgICAgICAgbmFtZTogJ2lkZW50aXRpZXMnLFxuICAgICAgICAgICAgdHlwZTogJycsXG4gICAgICAgICAgICB1cmw6ICcuL2lkZW50aXRpZXMvJyArIGlkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Wml0aUVudGl0eShlbnRpdHlQYXJhbXMpLnRoZW4oKHJlc3VsdHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0cy5jbGkgPSBbXTtcbiAgICAgICAgICAgIHJlc3VsdHMuc2VydmljZXMgPSBbXTtcblxuICAgICAgICAgICAgbGV0IGNsaSA9IFwieml0aSBlZGdlIGNyZWF0ZSBpZGVudGl0eSBkZXZpY2UgXFwnXCIrcGFyYW1zLm5hbWUrXCJcXCdcIjtcbiAgICAgICAgICAgIGlmIChwYXJhbXMucm9sZUF0dHJpYnV0ZXMpIGNsaSArPSBcIiAtYSBcXCdcIitwYXJhbXMucm9sZUF0dHJpYnV0ZXMudG9TdHJpbmcoKStcIlxcJ1wiO1xuICAgICAgICAgICAgcmVzdWx0cy5jbGkucHVzaChjbGkpO1xuXG4gICAgICAgICAgICBsZXQgc2VydmljZUNhbGwgPSB7XG4gICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXN1bHRzLnNlcnZpY2VzLnB1c2goc2VydmljZUNhbGwpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgYXN5bmMgY3JlYXRlU2ltcGxlU2VydmljZShwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHBhcmFtcy5uYW1lO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHBhcmFtcy5wcm90b2NvbDtcbiAgICAgICAgY29uc3QgaG9zdCA9IHBhcmFtcy5ob3N0O1xuICAgICAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHBhcmFtcy5wb3J0KTtcbiAgICAgICAgY29uc3QgdXNlRW5jcnlwdCA9IHBhcmFtcy5lbmNyeXB0O1xuICAgICAgICBjb25zdCB6aXRpSG9zdCA9IHBhcmFtcy56aXRpSG9zdDtcbiAgICAgICAgY29uc3Qgeml0aVBvcnQgPSBOdW1iZXIocGFyYW1zLnppdGlQb3J0KTtcbiAgICAgICAgY29uc3QgaG9zdGVkID0gcGFyYW1zLmhvc3RlZDtcbiAgICAgICAgY29uc3QgYWNjZXNzID0gcGFyYW1zLmFjY2VzcztcblxuICAgICAgICBjb25zdCByb290TmFtZSA9IG5hbWUudHJpbSgpLnJlcGxhY2UoL1teYS16MC05IF0vZ2ksICcnKS5zcGxpdCgnICcpLmpvaW4oJy0nKTtcbiAgICAgICAgY29uc3QgY2xpZW50TmFtZSA9IHJvb3ROYW1lK1wiLUNsaWVudFwiO1xuICAgICAgICBjb25zdCBzZXJ2ZXJOYW1lID0gcm9vdE5hbWUrXCItU2VydmVyXCI7XG4gICAgICAgIGNvbnN0IGRpYWxQb2xpY3lOYW1lID0gcm9vdE5hbWUrXCItRGlhbFBvbGljeVwiO1xuICAgICAgICBjb25zdCBiaW5kUG9saWN5TmFtZSA9IHJvb3ROYW1lK1wiLUJpbmRQb2xpY3lcIjtcblxuICAgICAgICBjb25zdCBzZXJ2ZXJDb25maWcgPSB7XG4gICAgICAgICAgICBob3N0bmFtZTogaG9zdCxcbiAgICAgICAgICAgIHBvcnQ6IHBvcnQsXG4gICAgICAgICAgICBwcm90b2NvbDogcHJvdG9jb2xcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2xpZW50Q29uZmlnID0ge1xuICAgICAgICAgICAgaG9zdG5hbWU6IHppdGlIb3N0LFxuICAgICAgICAgICAgcG9ydDogeml0aVBvcnRcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBwYWdpbmcgPSB7XG4gICAgICAgICAgICBmaWx0ZXI6IFwieml0aS10dW5uZWxlci1jbGllbnQudjFcIixcbiAgICAgICAgICAgIG5vU2VhcmNoOiBmYWxzZSxcbiAgICAgICAgICAgIG9yZGVyOiBcImFzY1wiLFxuICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICAgIHNlYXJjaE9uOiBcIm5hbWVcIixcbiAgICAgICAgICAgIHNvcnQ6IFwibmFtZVwiLFxuICAgICAgICAgICAgdG90YWw6IDUwXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbmZpZ1R5cGVSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFppdGlFbnRpdGllcygnY29uZmlnLXR5cGVzJywgcGFnaW5nKTtcbiAgICAgICAgY29uc3QgY2xpZW50Q29uZmlnSWQgPSBjb25maWdUeXBlUmVzdWx0LmRhdGFbMF0/LmlkO1xuICAgICAgICBwYWdpbmcuZmlsdGVyID0gJ3ppdGktdHVubmVsZXItc2VydmVyLnYxJztcbiAgICAgICAgY29uZmlnVHlwZVJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0Wml0aUVudGl0aWVzKCdjb25maWctdHlwZXMnLCBwYWdpbmcpO1xuICAgICAgICBjb25zdCBzZXJ2ZXJDb25maWdJZCA9IGNvbmZpZ1R5cGVSZXN1bHQuZGF0YVswXT8uaWQ7XG5cbiAgICAgICAgY29uc3Qgc2VydmVyRGF0YSA9IGF3YWl0IHRoaXMuY3JlYXRlQ29uZmlnKHNlcnZlckNvbmZpZ0lkLCBzZXJ2ZXJOYW1lLCBzZXJ2ZXJDb25maWcpO1xuICAgICAgICBjb25zdCBjbGllbnREYXRhID0gYXdhaXQgdGhpcy5jcmVhdGVDb25maWcoY2xpZW50Q29uZmlnSWQsIGNsaWVudE5hbWUsIGNsaWVudENvbmZpZyk7XG4gICAgICAgIGNvbnN0IHNlcnZlcklkID0gc2VydmVyRGF0YS5pZDtcbiAgICAgICAgY29uc3QgY2xpZW50SWQgPSBjbGllbnREYXRhLmlkO1xuXG4gICAgICAgIGNvbnN0IHNlcnZpY2VEYXRhID0gYXdhaXQgdGhpcy5jcmVhdGVTZXJ2aWNlKG5hbWUsIHNlcnZlcklkLCBjbGllbnRJZCwgdXNlRW5jcnlwdCk7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VJZCA9IHNlcnZpY2VEYXRhLmlkO1xuXG4gICAgICAgIGNvbnN0IGJpbmREYXRhID0gYXdhaXQgdGhpcy5jcmVhdGVTZXJ2aWNlUG9saWN5KGJpbmRQb2xpY3lOYW1lLCBcIkBcIitzZXJ2aWNlSWQsIGhvc3RlZCk7XG4gICAgICAgIGNvbnN0IGRpYWxEYXRhID0gYXdhaXQgdGhpcy5jcmVhdGVTZXJ2aWNlUG9saWN5KGRpYWxQb2xpY3lOYW1lLCBcIkBcIitzZXJ2aWNlSWQsIGFjY2Vzcyk7XG5cbiAgICAgICAgY29uc3QgYmluZElkID0gYmluZERhdGEuaWQ7XG4gICAgICAgIGNvbnN0IGRpYWxJZCA9IGRpYWxEYXRhLmlkO1xuXG4gICAgICAgIGNvbnN0IHRvUmV0dXJuID0ge1xuICAgICAgICAgICAgZGF0YTogW10sXG4gICAgICAgICAgICBjbGk6IFtdLFxuICAgICAgICAgICAgc2VydmljZXM6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbG9ncyA9IFtdO1xuICAgICAgICBsb2dzLnB1c2goe25hbWU6IHNlcnZlck5hbWUsIGlkOiBzZXJ2ZXJJZCwgdHlwZTogXCJDb25maWdcIn0pO1xuICAgICAgICBsb2dzLnB1c2goe25hbWU6IGNsaWVudE5hbWUsIGlkOiBjbGllbnRJZCwgdHlwZTogXCJDb25maWdcIn0pO1xuICAgICAgICBsb2dzLnB1c2goe25hbWU6IG5hbWUsIGlkOiBzZXJ2aWNlSWQsIHR5cGU6IFwiU2VydmljZVwifSk7XG4gICAgICAgIGxvZ3MucHVzaCh7bmFtZTogYmluZFBvbGljeU5hbWUsIGlkOiBiaW5kSWQsIHR5cGU6IFwiUG9saWN5XCJ9KTtcbiAgICAgICAgbG9ncy5wdXNoKHtuYW1lOiBkaWFsUG9saWN5TmFtZSwgaWQ6IGRpYWxJZCwgdHlwZTogXCJQb2xpY3lcIn0pO1xuICAgICAgICB0b1JldHVybi5kYXRhID0gbG9ncztcbiAgICAgICAgdG9SZXR1cm4uY2xpLnB1c2goc2VydmVyRGF0YS5jbGkpO1xuICAgICAgICB0b1JldHVybi5jbGkucHVzaChjbGllbnREYXRhLmNsaSk7XG4gICAgICAgIHRvUmV0dXJuLmNsaS5wdXNoKHNlcnZpY2VEYXRhLmNsaSk7XG4gICAgICAgIHRvUmV0dXJuLmNsaS5wdXNoKGJpbmREYXRhLmNsaSk7XG4gICAgICAgIHRvUmV0dXJuLmNsaS5wdXNoKGRpYWxEYXRhLmNsaSk7XG5cbiAgICAgICAgdG9SZXR1cm4uc2VydmljZXMucHVzaChzZXJ2ZXJEYXRhLnNlcnZpY2UpO1xuICAgICAgICB0b1JldHVybi5zZXJ2aWNlcy5wdXNoKGNsaWVudERhdGEuc2VydmljZSk7XG4gICAgICAgIHRvUmV0dXJuLnNlcnZpY2VzLnB1c2goc2VydmljZURhdGEuc2VydmljZSk7XG4gICAgICAgIHRvUmV0dXJuLnNlcnZpY2VzLnB1c2goYmluZERhdGEuc2VydmljZSk7XG4gICAgICAgIHRvUmV0dXJuLnNlcnZpY2VzLnB1c2goZGlhbERhdGEuc2VydmljZSk7XG5cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZVNlcnZpY2UobmFtZSwgc2VydmVySWQsIGNsaWVudElkLCBlbmNyeXB0KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBjb25maWdzOiBbc2VydmVySWQsIGNsaWVudElkXSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25SZXF1aXJlZDogZW5jcnlwdCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY29udHJvbGxlckRvbWFpbiA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlPy5zZXR0aW5ncz8uc2VsZWN0ZWRFZGdlQ29udHJvbGxlciB8fCAnJztcbiAgICAgICAgY29uc3QgdXJsID0gYCR7Y29udHJvbGxlckRvbWFpbn0vZWRnZS9tYW5hZ2VtZW50L3YxL3NlcnZpY2VzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbFppdGlFZGdlKHVybCwgcGFyYW1zLCAnUE9TVCcpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNsaSA9IFwieml0aSBlZGdlIGNyZWF0ZSBzZXJ2aWNlICdcIituYW1lK1wiJyAtLWNvbmZpZ3MgJ1wiK3NlcnZlcklkK1wiLFwiK2NsaWVudElkK1wiJ1wiO1xuICAgICAgICAgICAgbGV0IHNlcnZpY2VDYWxsID0ge1xuICAgICAgICAgICAgICAgIHVybDogdXJsK1wiL3NlcnZpY2VzXCIsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICBpZDogcmVzdWx0Py5kYXRhPy5pZCB8fCAnJyxcbiAgICAgICAgICAgICAgICBjbGk6IGNsaSxcbiAgICAgICAgICAgICAgICBzZXJ2aWNlOiBzZXJ2aWNlQ2FsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZVNlcnZpY2VQb2xpY3kobmFtZSwgc2VydmljZUlkLCBob3N0ZWQpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIHR5cGU6IFwiQmluZFwiLFxuICAgICAgICAgICAgc2VtYW50aWM6IFwiQW55T2ZcIixcbiAgICAgICAgICAgIHNlcnZpY2VSb2xlczogW3NlcnZpY2VJZF0sXG4gICAgICAgICAgICBpZGVudGl0eVJvbGVzOiBob3N0ZWQsXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udHJvbGxlckRvbWFpbiA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlPy5zZXR0aW5ncz8uc2VsZWN0ZWRFZGdlQ29udHJvbGxlciB8fCAnJztcbiAgICAgICAgY29uc3QgdXJsID0gYCR7Y29udHJvbGxlckRvbWFpbn0vZWRnZS9tYW5hZ2VtZW50L3YxL3NlcnZpY2UtcG9saWNpZXNgO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsWml0aUVkZ2UodXJsLCBwYXJhbXMsICdQT1NUJykudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBsZXQgY2xpID0gXCJ6aXRpIGVkZ2UgY3JlYXRlIHNlcnZpY2UtcG9saWN5ICdcIituYW1lK1wiJyBCaW5kIC0tc2VtYW50aWMgQW55T2YgLS1zZXJ2aWNlLXJvbGVzICdcIitzZXJ2aWNlSWQrXCInIC0taWRlbnRpdHktcm9sZXMgJ1wiK2hvc3RlZC50b1N0cmluZygpK1wiJ1wiO1xuICAgICAgICAgICAgbGV0IHNlcnZpY2VDYWxsID0ge1xuICAgICAgICAgICAgICAgIHVybDogdXJsK1wiL3NlcnZpY2UtcG9saWNpZXNcIixcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBpdGVtID0ge1xuICAgICAgICAgICAgICAgIGlkOiByZXN1bHQ/LmRhdGE/LmlkIHx8ICcnLFxuICAgICAgICAgICAgICAgIGNsaTogY2xpLFxuICAgICAgICAgICAgICAgIHNlcnZpY2U6IHNlcnZpY2VDYWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY3JlYXRlQ29uZmlnKGNvbmZpZ0lkLCBuYW1lLCBkYXRhLCBpbmRleCA9IDApIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgbmFtZTogbmFtZSsoKGluZGV4PjApP1wiLVwiK2luZGV4OlwiXCIpLFxuICAgICAgICAgICAgY29uZmlnVHlwZUlkOiBjb25maWdJZCxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY29udHJvbGxlckRvbWFpbiA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlPy5zZXR0aW5ncz8uc2VsZWN0ZWRFZGdlQ29udHJvbGxlciB8fCAnJztcbiAgICAgICAgY29uc3QgdXJsID0gYCR7Y29udHJvbGxlckRvbWFpbn0vZWRnZS9tYW5hZ2VtZW50L3YxL2NvbmZpZ3NgO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsWml0aUVkZ2UodXJsLCBwYXJhbXMsICdQT1NUJykudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjbGkgPSBcInppdGkgZWRnZSBjcmVhdGUgY29uZmlnICdcIitwYXJhbXMubmFtZStcIicgJ1wiK2NvbmZpZ0lkK1wiJyAnXCIrSlNPTi5zdHJpbmdpZnkoZGF0YSkuc3BsaXQoJ1wiJykuam9pbignXFxcXFwiJykrXCInXCI7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlQ2FsbCA9IHtcbiAgICAgICAgICAgICAgICB1cmw6IHVybCtcIi9jb25maWdzXCIsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IHJlc3VsdD8uZGF0YT8uaWQgfHwgJycsXG4gICAgICAgICAgICAgICAgY2xpOiBjbGksXG4gICAgICAgICAgICAgICAgc2VydmljZTogc2VydmljZUNhbGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBkZXJlZmVyZW5jZUpTT05TY2hlbWEoZGF0YTogYW55KSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gbmV3IFJlc29sdmVyKCk7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IHJlc29sdmVyLnJlc29sdmUoZGF0YSk7XG4gICAgICAgIHJldHVybiBzY2hlbWEucmVzdWx0O1xuICAgIH1cblxuICAgIGFzeW5jIGdldExvY2FsZUZpbGUobG9jYWxlOiBzdHJpbmcgPSAnZW4tdXMnKSB7XG4gICAgICAgIGxvY2FsZSA9IGxvY2FsZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGF0aCA9ICdhc3NldHMvbGFuZ3VhZ2VzLycgKyBsb2NhbGUgKyAnLmpzb24nO1xuICAgICAgICBsZXQgbG9jYWxlRmlsZSA9IGF3YWl0IHRoaXMuaHR0cC5nZXQocGF0aCwge3Jlc3BvbnNlVHlwZTogXCJ0ZXh0XCJ9KS50b1Byb21pc2UoKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFsb2NhbGVGaWxlKSB7XG4gICAgICAgICAgICBwYXRoID0gJ2Fzc2V0cy9sYW5ndWFnZXMvZW4tdXMuanNvbic7XG4gICAgICAgICAgICBsb2NhbGVGaWxlID0gYXdhaXQgdGhpcy5odHRwLmdldChwYXRoLCB7cmVzcG9uc2VUeXBlOiBcInRleHRcIn0pLnRvUHJvbWlzZSgpLnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZUZpbGU7XG4gICAgfVxuXG4gICAgZ2V0Wml0aUVudGl0aWVzKHR5cGU6IHN0cmluZywgcGFnaW5nOiBhbnkpIHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlckRvbWFpbiA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlPy5zZXR0aW5ncz8uc2VsZWN0ZWRFZGdlQ29udHJvbGxlciB8fCAnJztcbiAgICAgICAgY29uc3Qgc2VydmljZVVybCA9IGAke2NvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MWA7XG4gICAgICAgIGxldCB1cmxGaWx0ZXIgPSBcIlwiO1xuICAgICAgICBsZXQgdG9TZWFyY2hPbiA9IFwibmFtZVwiO1xuICAgICAgICBsZXQgbm9TZWFyY2ggPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhZ2luZyAmJiBwYWdpbmcuc29ydCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocGFnaW5nLnNlYXJjaE9uKSB0b1NlYXJjaE9uID0gcGFnaW5nLnNlYXJjaE9uO1xuICAgICAgICAgICAgaWYgKHBhZ2luZy5ub1NlYXJjaCkgbm9TZWFyY2ggPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCFwYWdpbmcuZmlsdGVyKSBwYWdpbmcuZmlsdGVyID0gXCJcIjtcbiAgICAgICAgICAgIHBhZ2luZy5maWx0ZXIgPSBwYWdpbmcuZmlsdGVyLnNwbGl0KCcjJykuam9pbignJyk7XG4gICAgICAgICAgICBpZiAobm9TZWFyY2gpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFnaW5nLnBhZ2UgIT09IC0xKSB1cmxGaWx0ZXIgPSBcIj9saW1pdD1cIiArIHBhZ2luZy50b3RhbCArIFwiJm9mZnNldD1cIiArICgocGFnaW5nLnBhZ2UgLSAxKSAqIHBhZ2luZy50b3RhbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChwYWdpbmcucGFnZSAhPT0gLTEpIHVybEZpbHRlciA9IFwiP2ZpbHRlcj0oXCIgKyB0b1NlYXJjaE9uICsgXCIgY29udGFpbnMgXFxcIlwiICsgcGFnaW5nLmZpbHRlciArIFwiXFxcIikmbGltaXQ9XCIgKyBwYWdpbmcudG90YWwgKyBcIiZvZmZzZXQ9XCIgKyAoKHBhZ2luZy5wYWdlIC0gMSkgKiBwYWdpbmcudG90YWwpICsgXCImc29ydD1cIiArIHBhZ2luZy5zb3J0ICsgXCIgXCIgKyBwYWdpbmcub3JkZXI7XG4gICAgICAgICAgICAgICAgaWYgKHBhZ2luZy5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcGFnaW5nLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsRmlsdGVyICs9ICgodXJsRmlsdGVyLmxlbmd0aCA9PT0gMCkgPyBcIj9cIiA6IFwiJlwiKSArIGtleSArIFwiPVwiICsgcGFnaW5nLnBhcmFtc1trZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxaaXRpRWRnZShzZXJ2aWNlVXJsICsgXCIvXCIgKyB0eXBlICsgdXJsRmlsdGVyLCB7fSk7XG4gICAgfVxuXG4gICAgZ2V0Wml0aUVudGl0eShwYXJhbXM6IGFueSkge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyRG9tYWluID0gdGhpcy5zZXR0aW5nc1NlcnZpY2U/LnNldHRpbmdzPy5zZWxlY3RlZEVkZ2VDb250cm9sbGVyIHx8ICcnO1xuICAgICAgICBjb25zdCBzZXJ2aWNlVXJsID0gYCR7Y29udHJvbGxlckRvbWFpbn0vZWRnZS9tYW5hZ2VtZW50L3YxYDtcbiAgICAgICAgY29uc3QgdXJsID0gcGFyYW1zLnVybC5zcGxpdChcIi4vXCIpLmpvaW4oXCJcIik7XG4gICAgICAgIGNvbnN0IGlkID0gcGFyYW1zLmlkO1xuICAgICAgICBjb25zdCB0eXBlID0gcGFyYW1zLnR5cGU7XG4gICAgICAgIGNvbnN0IHBhcmVudFR5cGUgPSBwYXJhbXMubmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbFppdGlFZGdlKHNlcnZpY2VVcmwgKyBcIi9cIiArIHVybCwge30sICdHRVQnKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBwYXJlbnRUeXBlLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVsZXRlWml0aUVudGl0aWVzKHBhcmFtcywgcmV0dXJuVG8pIHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlckRvbWFpbiA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlPy5zZXR0aW5ncz8uc2VsZWN0ZWRFZGdlQ29udHJvbGxlciB8fCAnJztcbiAgICAgICAgY29uc3Qgc2VydmljZVVybCA9IGAke2NvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MWA7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIHBhcmFtcy5pZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBwYXJhbXMudHlwZTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFR5cGUgPSBwYXJhbXMubmFtZTtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5jYWxsWml0aUVkZ2Uoc2VydmljZVVybCArIFwiL1wiICsgdHlwZSArIFwiL1wiICsgaWQudHJpbSgpICsgXCIvXCIsIHt9LCAnREVMRVRFJykudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogcGFyZW50VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXRaaXRpRW50aXRpZXMocGFyYW1zLnR5cGUsIHBhcmFtcy5wYWdpbmcpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVyblRvKHJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2F2ZVppdGlFbnRpdHkocGFyYW1zOiBhbnksIHJldHVyblRvOiBhbnkpIHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlckRvbWFpbiA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlPy5zZXR0aW5ncz8uc2VsZWN0ZWRFZGdlQ29udHJvbGxlciB8fCAnJztcbiAgICAgICAgY29uc3Qgc2VydmljZVVybCA9IGAke2NvbnRyb2xsZXJEb21haW59L2VkZ2UvbWFuYWdlbWVudC92MWA7XG4gICAgICAgIGNvbnN0IHNhdmVQYXJhbXMgPSBwYXJhbXMuc2F2ZTtcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbCA9IHBhcmFtcy5hZGRpdGlvbmFsO1xuICAgICAgICBjb25zdCByZW1vdmFsID0gcGFyYW1zLnJlbW92YWw7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBwYXJhbXMudHlwZTtcbiAgICAgICAgY29uc3QgcGFnaW5nID0gcGFyYW1zLnBhZ2luZztcbiAgICAgICAgbGV0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgICAgICBsZXQgaWQgPSBwYXJhbXMuaWQ7XG4gICAgICAgIGxldCB1cmwgPSBzZXJ2aWNlVXJsICsgXCIvXCIgKyB0eXBlO1xuICAgICAgICBsZXQgY2hhaW5lZCA9IGZhbHNlO1xuICAgICAgICBpZiAocGFyYW1zLmNoYWluZWQpIGNoYWluZWQgPSBwYXJhbXMuY2hhaW5lZDtcbiAgICAgICAgaWYgKGlkICYmIGlkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBtZXRob2QgPSBcIlBBVENIXCI7XG4gICAgICAgICAgICB1cmwgKz0gXCIvXCIgKyBpZC50cmltKCk7XG4gICAgICAgICAgICBpZiAocmVtb3ZhbCkge1xuICAgICAgICAgICAgICAgIGxldCBvYmplY3RzID0gT2JqZWN0LmVudHJpZXMocmVtb3ZhbCk7XG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5pZHMgPSBvYmplY3RzW2ldWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FsbFppdGlFZGdlKHNlcnZpY2VVcmwgKyBcIi9cIiArIHR5cGUgKyBcIi9cIiArIGlkLnRyaW0oKSArIFwiL1wiICsgb2JqZWN0c1tpXVswXSwgcGFyYW1ldGVycywgJ0RFTEVURScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNhdmVQYXJhbXMuZGF0YSA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UucmVkZWZpbmVPYmplY3Qoc2F2ZVBhcmFtcy5kYXRhKTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHNhdmVQYXJhbXMuZGF0YSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2F2ZVBhcmFtcy5kYXRhW3Byb3BdKSAmJiBzYXZlUGFyYW1zLmRhdGFbcHJvcF0ubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgc2F2ZVBhcmFtcy5kYXRhW3Byb3BdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiTm90IEFycmF5OiBcIitwcm9wK1wiIFwiK3NhdmVQYXJhbXMuZGF0YVtwcm9wXS5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbFppdGlFZGdlKHVybCwgc2F2ZVBhcmFtcywgbWV0aG9kKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdD8uZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5Ubyh0aGlzLmhhbmRsZUVycm9yKHJlc3VsdC5lcnJvcikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQ/LmRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0cyA9IE9iamVjdC5lbnRyaWVzKGFkZGl0aW9uYWwpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIikgaWQgPSByZXN1bHQ/LmRhdGE/LmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsWml0aUVkZ2Uoc2VydmljZVVybCArIFwiL1wiICsgdHlwZSArIFwiL1wiICsgaWQgKyBcIi9cIiArIG9iamVjdHNbaV1bMF0sIHtpZHM6IG9iamVjdHNbaV1bMV19LCAnUFVUJykudGhlbigocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSBvYmplY3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYWluZWQpIHJldHVyblRvKHJlcy5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5nZXRaaXRpRW50aXRpZXModHlwZSwgcGFnaW5nKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UbyhyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYWluZWQpIHJldHVyblRvKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5nZXRaaXRpRW50aXRpZXModHlwZSwgcGFnaW5nKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UbyhyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFpbmVkKSByZXR1cm5UbyhyZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5nZXRaaXRpRW50aXRpZXModHlwZSwgcGFnaW5nKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblRvKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHJldHVyblRvKHtlcnJvcjogXCJVbmFibGUgdG8gc2F2ZSBkYXRhXCJ9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVkZWZpbmVPYmplY3Qob2JqKSB7XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmpbcHJvcF0pICYmIG9ialtwcm9wXS5sZW5ndGg9PTApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgb2JqW3Byb3BdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ialtwcm9wXSA9PT0gXCJzdHJpbmdcIiAmJiBvYmpbcHJvcF0udHJpbSgpLmxlbmd0aD09MCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb2JqW3Byb3BdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqW3Byb3BdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpbcHJvcF0gPSB0aGlzLnJlZGVmaW5lT2JqZWN0KG9ialtwcm9wXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMob2JqW3Byb3BdKS5sZW5ndGg9PTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgb2JqW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgc2F2ZVppdGlTdWJEYXRhKHBhcmFtczogYW55LCByZXR1cm5UbzogYW55KSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXJEb21haW4gPSB0aGlzLnNldHRpbmdzU2VydmljZT8uc2V0dGluZ3M/LnNlbGVjdGVkRWRnZUNvbnRyb2xsZXIgfHwgJyc7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VVcmwgPSBgJHtjb250cm9sbGVyRG9tYWlufS9lZGdlL21hbmFnZW1lbnQvdjFgO1xuXG4gICAgICAgIGNvbnN0IGlkID0gcGFyYW1zLmlkO1xuICAgICAgICBjb25zdCB0eXBlID0gcGFyYW1zLnR5cGU7XG4gICAgICAgIGNvbnN0IGRvaW5nID0gcGFyYW1zLmRvaW5nIHx8ICdQT1NUJztcbiAgICAgICAgY29uc3QgcGFyZW50VHlwZSA9IHBhcmFtcy5wYXJlbnRUeXBlO1xuICAgICAgICBjb25zdCBmdWxsVHlwZSA9IHBhcmVudFR5cGUrXCIvXCIraWQrXCIvXCIrdHlwZTtcbiAgICAgICAgY29uc3QgdXJsID0gc2VydmljZVVybCtcIi9cIitmdWxsVHlwZTtcbiAgICAgICAgY29uc3Qgc2F2ZVBhcmFtcyA9IHBhcmFtcy5zYXZlO1xuXG4gICAgICAgIHRoaXMuY2FsbFppdGlFZGdlKHVybCwgc2F2ZVBhcmFtcywgZG9pbmcpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXRaaXRpRW50aXRpZXMoZnVsbFR5cGUsIHBhcmFtcy5wYWdpbmcpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm5UbyhkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjYWxsWml0aUVkZ2UodXJsOiBzdHJpbmcsIGJvZHk6IGFueSwgbWV0aG9kOiBzdHJpbmcgPSAnR0VUJykge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5nZXRIdHRwT3B0aW9ucygpO1xuICAgICAgICBsZXQgcHJvbTtcbiAgICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgJ0dFVCc6XG4gICAgICAgICAgICAgICAgcHJvbSA9IHRoaXMuaHR0cC5nZXQodXJsLCBvcHRpb25zKS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1BPU1QnOlxuICAgICAgICAgICAgICAgIHByb20gPSB0aGlzLmh0dHAucG9zdCh1cmwsIGJvZHksIG9wdGlvbnMpLnRvUHJvbWlzZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnUFVUJzpcbiAgICAgICAgICAgICAgICBwcm9tID0gdGhpcy5odHRwLnB1dCh1cmwsIGJvZHksIG9wdGlvbnMpLnRvUHJvbWlzZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnUEFUQ0gnOlxuICAgICAgICAgICAgICAgIHByb20gPSB0aGlzLmh0dHAucGF0Y2godXJsLCBib2R5LCBvcHRpb25zKS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0RFTEVURSc6XG4gICAgICAgICAgICAgICAgcHJvbSA9IHRoaXMuaHR0cC5kZWxldGUodXJsLCBvcHRpb25zKS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcHJvbSA9IHRoaXMuaHR0cC5nZXQodXJsLCBvcHRpb25zKS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbS5jYXRjaCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0Py5lcnJvcj8uZXJyb3I/LmNvZGUgPT09ICdVTkFVVEhPUklaRUQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy56aXRpRG9tYWluQ29udHJvbGxlci5oYW5kbGVVbmF1dGhvcml6ZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ/LmVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBpbml0WkFDQnV0dG9uTGlzdGVuZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLm1vZGFsQ2xvc2UgJiYgdGhpcy5tb2RhbFNob3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vZGFsU2hvdyA9IG1vZGFsLnNob3c7XG4gICAgICAgIHRoaXMubW9kYWxDbG9zZSA9IG1vZGFsLmNsb3NlO1xuICAgICAgICBpZiAoIXRoaXMubW9kYWxTaG93IHx8ICF0aGlzLm1vZGFsQ2xvc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RhbElkcyA9IFsnRGV0YWlsTW9kYWwnLCAnQWRkTWVzc2FnZU1vZGFsJywgJ1FSTW9kYWwnLCAnUmVzZXRNb2RhbCcsICdPdmVycmlkZU1vZGFsJywgJ0FkZE1vZGFsJ107XG4gICAgICAgIG1vZGFsLnNob3cgPSAoaWQsIHJlYWRPbmx5KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vZGFsU2hvdyhpZCwgcmVhZE9ubHkpO1xuICAgICAgICAgICAgaWYgKG1vZGFsSWRzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygndXBkYXRlTW9kYWxPcGVuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIG1vZGFsLmNsb3NlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vZGFsQ2xvc2UoZXZlbnQpO1xuICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCd1cGRhdGVNb2RhbE9wZW4nKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzU2VydmljZT8uc3VwcG9ydGVkRmVhdHVyZXM/LnJlY2lwZXMpIHtcbiAgICAgICAgICAgICQoJy50YWJbZGF0YS1nbz1cIi9yZWNpcGVzXCJdJykuaGlkZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0SHR0cE9wdGlvbnModXNlWml0aUNyZWRzID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhcmFtczoge30sXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyBhcyBjb25zdCxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgaGFuZGxlRXJyb3IocmVzdWx0OiBhbnkpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmVycm9yKHJlc3VsdCk7XG4gICAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0O1xuICAgICAgICBsZXQgbWVzc2FnZSA9ICcnO1xuICAgICAgICBpZiAoZXJyb3IuY2F1c2UmJmVycm9yLmNhdXNlTWVzc2FnZSYmZXJyb3IuY2F1c2VNZXNzYWdlLmxlbmd0aD4wKSBtZXNzYWdlID0gZXJyb3IuY2F1c2VNZXNzYWdlO1xuICAgICAgICBlbHNlIGlmIChlcnJvci5jYXVzZSYmZXJyb3IuY2F1c2UubWVzc2FnZSYmZXJyb3IuY2F1c2UubWVzc2FnZS5sZW5ndGg+MCkgbWVzc2FnZSA9IGVycm9yLmNhdXNlLm1lc3NhZ2U7XG4gICAgICAgIGVsc2UgaWYgKGVycm9yLmNhdXNlJiZlcnJvci5jYXVzZS5yZWFzb24mJmVycm9yLmNhdXNlLnJlYXNvbi5sZW5ndGg+MCkgbWVzc2FnZSA9IGVycm9yLmNhdXNlLnJlYXNvbjtcbiAgICAgICAgZWxzZSBpZiAoZXJyb3IubWVzc2FnZSYmZXJyb3IubWVzc2FnZS5sZW5ndGg+MCkgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgIGVsc2UgbWVzc2FnZSA9IGVycm9yO1xuICAgICAgICByZXR1cm4ge2Vycm9yOiBtZXNzYWdlfTtcbiAgICB9XG59XG4iXX0=