ato-water-lib 0.0.0-watch

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 (391) hide show
  1. package/README.md +24 -0
  2. package/esm2020/ato-water-lib.mjs +5 -0
  3. package/esm2020/lib/ato-water-lib.component.mjs +19 -0
  4. package/esm2020/lib/ato-water-lib.module.mjs +26 -0
  5. package/esm2020/lib/ato-water-lib.service.mjs +14 -0
  6. package/esm2020/lib/components/flow-diagram-lib/flow-diagram-lib.component.mjs +71 -0
  7. package/esm2020/lib/constants/applicable-prefixes-const.mjs +441 -0
  8. package/esm2020/lib/constants/key.const.mjs +4 -0
  9. package/esm2020/lib/constants/plant.constant.mjs +51 -0
  10. package/esm2020/lib/constants/value.const.mjs +782 -0
  11. package/esm2020/lib/models/default-gojs-editor.model.mjs +3148 -0
  12. package/esm2020/lib/models/gojs-editor.model.mjs +1743 -0
  13. package/esm2020/lib/services/utils/utils.service.mjs +133 -0
  14. package/esm2020/public-api.mjs +8 -0
  15. package/fesm2015/ato-water-lib.mjs +6448 -0
  16. package/fesm2015/ato-water-lib.mjs.map +1 -0
  17. package/fesm2020/ato-water-lib.mjs +6419 -0
  18. package/fesm2020/ato-water-lib.mjs.map +1 -0
  19. package/index.d.ts +5 -0
  20. package/lib/assets/.gitkeep +0 -0
  21. package/lib/assets/files/campaign-data.csv +6 -0
  22. package/lib/assets/files/campaign-templates/campaign-data.csv +6 -0
  23. package/lib/assets/files/campaign-templates/campaign-tracking.csv +6 -0
  24. package/lib/assets/files/campaign-templates/category-log-sample.txt +129 -0
  25. package/lib/assets/files/campaign-templates/contact-template.csv +1 -0
  26. package/lib/assets/files/campaign-templates/question-template.csv +3 -0
  27. package/lib/assets/files/campaign-tracking.csv +6 -0
  28. package/lib/assets/files/category-log-sample.txt +129 -0
  29. package/lib/assets/files/contact-template.csv +1 -0
  30. package/lib/assets/files/question-template.csv +3 -0
  31. package/lib/assets/images/boiler/boiler.gif +0 -0
  32. package/lib/assets/images/boiler/cms_boiler.gif +0 -0
  33. package/lib/assets/images/boiler/cms_boiler.png +0 -0
  34. package/lib/assets/images/boiler/cms_boiler2.gif +0 -0
  35. package/lib/assets/images/boiler/cms_boiler_3.png +0 -0
  36. package/lib/assets/images/boiler/cms_sample.gif +0 -0
  37. package/lib/assets/images/coming-soon/coming_soon1.PNG +0 -0
  38. package/lib/assets/images/coming-soon/coming_soon2.PNG +0 -0
  39. package/lib/assets/images/coming-soon/coming_soon3.png +0 -0
  40. package/lib/assets/images/coming-soon/coming_soon_icon.png +0 -0
  41. package/lib/assets/images/coming-soon/net_carbon.png +0 -0
  42. package/lib/assets/images/coming-soon/ws-emission-graph.PNG +0 -0
  43. package/lib/assets/images/editor/Fresh Water Treatment.svg +6 -0
  44. package/lib/assets/images/editor/Heat Changer.svg +6 -0
  45. package/lib/assets/images/editor/Heating.svg +6 -0
  46. package/lib/assets/images/editor/No_Image_Available.jpeg +0 -0
  47. package/lib/assets/images/editor/Process.svg +6 -0
  48. package/lib/assets/images/editor/Treatment.svg +6 -0
  49. package/lib/assets/images/editor/Water Cooling.svg +6 -0
  50. package/lib/assets/images/editor/Water Storage.svg +6 -0
  51. package/lib/assets/images/editor/data-box/data_box.svg +94 -0
  52. package/lib/assets/images/editor/energy/Battery.svg +107 -0
  53. package/lib/assets/images/editor/energy/Compressed air.svg +211 -0
  54. package/lib/assets/images/editor/energy/Diesel Barrels.png +0 -0
  55. package/lib/assets/images/editor/energy/Diesel Dispenser.png +0 -0
  56. package/lib/assets/images/editor/energy/Diesel Fleet.png +0 -0
  57. package/lib/assets/images/editor/energy/Diesel Generators.svg +219 -0
  58. package/lib/assets/images/editor/energy/Diesel Meter.png +0 -0
  59. package/lib/assets/images/editor/energy/Diesel Tank.png +0 -0
  60. package/lib/assets/images/editor/energy/Diesel Tanker.png +0 -0
  61. package/lib/assets/images/editor/energy/Electric_Panel.svg +1776 -0
  62. package/lib/assets/images/editor/energy/Flywheel energy storage systems.svg +45 -0
  63. package/lib/assets/images/editor/energy/Gas Dryer.png +0 -0
  64. package/lib/assets/images/editor/energy/Gas Flare.png +0 -0
  65. package/lib/assets/images/editor/energy/Gas HVAC.svg +103 -0
  66. package/lib/assets/images/editor/energy/Gas Meter.png +0 -0
  67. package/lib/assets/images/editor/energy/Gas Utility.png +0 -0
  68. package/lib/assets/images/editor/energy/Grid.svg +829 -0
  69. package/lib/assets/images/editor/energy/Grounding systems.svg +58 -0
  70. package/lib/assets/images/editor/energy/Industrial motors.svg +74 -0
  71. package/lib/assets/images/editor/energy/Inverter.svg +20 -0
  72. package/lib/assets/images/editor/energy/Lighting systems.svg +106 -0
  73. package/lib/assets/images/editor/energy/Lights.svg +106 -0
  74. package/lib/assets/images/editor/energy/Material handling equipment.svg +687 -0
  75. package/lib/assets/images/editor/energy/Meter.svg +83 -0
  76. package/lib/assets/images/editor/energy/Motor control centers (MCCs).svg +241 -0
  77. package/lib/assets/images/editor/energy/Natural gas generators.svg +414 -0
  78. package/lib/assets/images/editor/energy/Office equipment.svg +333 -0
  79. package/lib/assets/images/editor/energy/Power conditioning unit (PCU).svg +125 -0
  80. package/lib/assets/images/editor/energy/Power distribution and control systems.svg +1776 -0
  81. package/lib/assets/images/editor/energy/Power distribution systems.svg +1776 -0
  82. package/lib/assets/images/editor/energy/Process control and automation systems.svg +87 -0
  83. package/lib/assets/images/editor/energy/Process equipment and machines.svg +366 -0
  84. package/lib/assets/images/editor/energy/Pumped hydro storage systems.svg +480 -0
  85. package/lib/assets/images/editor/energy/Refrigeration and cooling systems.svg +243 -0
  86. package/lib/assets/images/editor/energy/Solar.svg +176 -0
  87. package/lib/assets/images/editor/energy/Supercapacitor energy storage systems.svg +982 -0
  88. package/lib/assets/images/editor/energy/Switchgear.svg +123 -0
  89. package/lib/assets/images/editor/energy/Thermal energy storage systems.svg +137 -0
  90. package/lib/assets/images/editor/energy/Transformer.svg +1111 -0
  91. package/lib/assets/images/editor/energy/Variable frequency drives (VFDs).svg +186 -0
  92. package/lib/assets/images/editor/energy/Wind Power.svg +139 -0
  93. package/lib/assets/images/editor/fuel/Biodiesel.png +0 -0
  94. package/lib/assets/images/editor/fuel/Biodiesel.svg +48 -0
  95. package/lib/assets/images/editor/fuel/Diesel fuel.png +0 -0
  96. package/lib/assets/images/editor/fuel/Diesel fuel.svg +135 -0
  97. package/lib/assets/images/editor/fuel/Fuel dispensers.svg +228 -0
  98. package/lib/assets/images/editor/fuel/Fuel filtration systems.svg +50 -0
  99. package/lib/assets/images/editor/fuel/Fuel management systems.svg +166 -0
  100. package/lib/assets/images/editor/fuel/Fuel meters.svg +81 -0
  101. package/lib/assets/images/editor/fuel/Fuel storage tanks.svg +355 -0
  102. package/lib/assets/images/editor/fuel/Gasoline.png +0 -0
  103. package/lib/assets/images/editor/fuel/Gasoline.svg +56 -0
  104. package/lib/assets/images/editor/fuel/Generators.png +0 -0
  105. package/lib/assets/images/editor/fuel/Generators.svg +219 -0
  106. package/lib/assets/images/editor/fuel/Industrial boilers.png +0 -0
  107. package/lib/assets/images/editor/fuel/Industrial boilers.svg +337 -0
  108. package/lib/assets/images/editor/fuel/Industrial furnaces.png +0 -0
  109. package/lib/assets/images/editor/fuel/Industrial furnaces.svg +179 -0
  110. package/lib/assets/images/editor/fuel/Industrial ovens.png +0 -0
  111. package/lib/assets/images/editor/fuel/Industrial ovens.svg +118 -0
  112. equipment.png +0 -0
  113. package/lib/assets/images/editor/fuel/Industrial vehicles and equipment.svg +276 -0
  114. package/lib/assets/images/editor/fuel/Kerosene.png +0 -0
  115. package/lib/assets/images/editor/fuel/Kerosene.svg +140 -0
  116. package/lib/assets/images/editor/fuel/Pipeline.png +0 -0
  117. package/lib/assets/images/editor/fuel/Pipeline.svg +50 -0
  118. package/lib/assets/images/editor/fuel/Propane.png +0 -0
  119. package/lib/assets/images/editor/fuel/Propane.svg +96 -0
  120. package/lib/assets/images/editor/fuel/Tanker Trucks.png +0 -0
  121. package/lib/assets/images/editor/fuel/Tanker Trucks.svg +1107 -0
  122. heaters.png +0 -0
  123. package/lib/assets/images/editor/gas/Boilers and heaters.svg +22 -0
  124. package/lib/assets/images/editor/gas/Burners.png +0 -0
  125. package/lib/assets/images/editor/gas/Burners.svg +49 -0
  126. package/lib/assets/images/editor/gas/Cogeneration.png +0 -0
  127. package/lib/assets/images/editor/gas/Cogeneration.svg +440 -0
  128. package/lib/assets/images/editor/gas/Combined cycle power plants.png +0 -0
  129. package/lib/assets/images/editor/gas/Combined cycle power plants.svg +5570 -0
  130. package/lib/assets/images/editor/gas/Combustion control systems.svg +10 -0
  131. package/lib/assets/images/editor/gas/Compressed natural gas pipeline (CNG).png +0 -0
  132. package/lib/assets/images/editor/gas/Compressed natural gas pipeline (CNG).svg +150 -0
  133. package/lib/assets/images/editor/gas/Flue gas analyzers.png +0 -0
  134. package/lib/assets/images/editor/gas/Flue gas analyzers.svg +32 -0
  135. equipment.png +0 -0
  136. package/lib/assets/images/editor/gas/Fuel for vehicles and equipment.svg +46 -0
  137. package/lib/assets/images/editor/gas/Furnaces.png +0 -0
  138. package/lib/assets/images/editor/gas/Furnaces.svg +224 -0
  139. package/lib/assets/images/editor/gas/Gas meters.png +0 -0
  140. package/lib/assets/images/editor/gas/Gas meters.svg +128 -0
  141. package/lib/assets/images/editor/gas/Gas pressure regulators.png +0 -0
  142. package/lib/assets/images/editor/gas/Gas pressure regulators.svg +1159 -0
  143. package/lib/assets/images/editor/gas/Gas storage tanks.png +0 -0
  144. package/lib/assets/images/editor/gas/Gas storage tanks.svg +257 -0
  145. package/lib/assets/images/editor/gas/Liquefied natural gas (LNG) shipments.png +0 -0
  146. package/lib/assets/images/editor/gas/Liquefied natural gas (LNG) shipments.svg +262 -0
  147. package/lib/assets/images/editor/gas/Natural Gas.svg +57 -0
  148. package/lib/assets/images/editor/gas/Natural gas pipelines.png +0 -0
  149. package/lib/assets/images/editor/gas/Natural gas pipelines.svg +68 -0
  150. package/lib/assets/images/editor/gas/On-site production.png +0 -0
  151. package/lib/assets/images/editor/gas/On-site production.svg +3629 -0
  152. package/lib/assets/images/editor/gas/Power generation.png +0 -0
  153. package/lib/assets/images/editor/gas/Power generation.svg +112 -0
  154. package/lib/assets/images/editor/help/component.png +0 -0
  155. package/lib/assets/images/editor/help/inflow.png +0 -0
  156. package/lib/assets/images/editor/help/inflow_only.png +0 -0
  157. package/lib/assets/images/editor/help/outflow.png +0 -0
  158. package/lib/assets/images/editor/help/outflow_only.png +0 -0
  159. package/lib/assets/images/editor/icons/Boiler.png +0 -0
  160. package/lib/assets/images/editor/icons/Boiler.svg +75 -0
  161. package/lib/assets/images/editor/icons/Brackish_surface_water.svg +2016 -0
  162. package/lib/assets/images/editor/icons/Brackisk Surface Water Seawater.svg +197 -0
  163. package/lib/assets/images/editor/icons/DAF.svg +352 -0
  164. package/lib/assets/images/editor/icons/Demin.svg +227 -0
  165. package/lib/assets/images/editor/icons/Diesel.svg +128 -0
  166. package/lib/assets/images/editor/icons/Domestic.png +0 -0
  167. package/lib/assets/images/editor/icons/Domestic_new.svg +71 -0
  168. package/lib/assets/images/editor/icons/Electricity.svg +63 -0
  169. package/lib/assets/images/editor/icons/Fresh Surface Water.svg +85 -0
  170. package/lib/assets/images/editor/icons/Gas.svg +58 -0
  171. package/lib/assets/images/editor/icons/Generic Process.svg +85 -0
  172. package/lib/assets/images/editor/icons/Groundwater - Non-Renewable.svg +104 -0
  173. package/lib/assets/images/editor/icons/Groundwater - Renewable.svg +1944 -0
  174. package/lib/assets/images/editor/icons/Intake.png +0 -0
  175. package/lib/assets/images/editor/icons/Intake.svg +8 -0
  176. package/lib/assets/images/editor/icons/Irrigation.png +0 -0
  177. package/lib/assets/images/editor/icons/Irrigation.svg +545 -0
  178. package/lib/assets/images/editor/icons/Landscaping.png +0 -0
  179. package/lib/assets/images/editor/icons/Landscaping.svg +3 -0
  180. package/lib/assets/images/editor/icons/MBR.svg +403 -0
  181. package/lib/assets/images/editor/icons/Other.png +0 -0
  182. package/lib/assets/images/editor/icons/Process.png +0 -0
  183. package/lib/assets/images/editor/icons/Produced Entrained Water.svg +97 -0
  184. package/lib/assets/images/editor/icons/ProducedEntrained_water.svg +103 -0
  185. package/lib/assets/images/editor/icons/RO.svg +8 -0
  186. package/lib/assets/images/editor/icons/Raw Water Tank.svg +30 -0
  187. package/lib/assets/images/editor/icons/Recirculation.png +0 -0
  188. package/lib/assets/images/editor/icons/Recirculation.svg +8 -0
  189. package/lib/assets/images/editor/icons/Solar.svg +120 -0
  190. package/lib/assets/images/editor/icons/Swater.svg +202 -0
  191. package/lib/assets/images/editor/icons/Third Party Sources.svg +1421 -0
  192. package/lib/assets/images/editor/icons/Third party destinations.svg +251 -0
  193. package/lib/assets/images/editor/icons/Utility.png +0 -0
  194. package/lib/assets/images/editor/icons/Utility.svg +151 -0
  195. package/lib/assets/images/editor/icons/Wastewater Treatment.png +0 -0
  196. package/lib/assets/images/editor/icons/Wastewater Treatment.svg +8 -0
  197. package/lib/assets/images/editor/icons/ZLD.svg +27 -0
  198. package/lib/assets/images/editor/icons/cooling.png +0 -0
  199. package/lib/assets/images/editor/icons/cooling.svg +17 -0
  200. package/lib/assets/images/editor/icons/cooling_tower.svg +17 -0
  201. package/lib/assets/images/editor/icons/domestic.svg +82 -0
  202. package/lib/assets/images/editor/icons/embodied.svg +8 -0
  203. package/lib/assets/images/editor/icons/non_Renewable.svg +775 -0
  204. package/lib/assets/images/editor/icons/other.svg +47 -0
  205. package/lib/assets/images/editor/icons/process.svg +8 -0
  206. package/lib/assets/images/editor/icons/rain.svg +20 -0
  207. package/lib/assets/images/editor/icons/storage.svg +31 -0
  208. package/lib/assets/images/editor/icons/wastewater_treatment.svg +8 -0
  209. package/lib/assets/images/editor/icons/water tank.png +0 -0
  210. package/lib/assets/images/editor/icons/water tank.svg +31 -0
  211. package/lib/assets/images/editor/icons/water treatment.png +0 -0
  212. package/lib/assets/images/editor/icons/water treatment.svg +41 -0
  213. package/lib/assets/images/editor/icons/water_treatment.svg +41 -0
  214. package/lib/assets/images/editor/plant-cell/Cell.svg +66 -0
  215. package/lib/assets/images/editor/special/Discharge.svg +6 -0
  216. package/lib/assets/images/editor/special/process.svg +3 -0
  217. package/lib/assets/images/editor/steam/Blowdown tank.png +0 -0
  218. package/lib/assets/images/editor/steam/Condensate Return System.png +0 -0
  219. package/lib/assets/images/editor/steam/Deaerators.png +0 -0
  220. package/lib/assets/images/editor/steam/Expansion Tanks.png +0 -0
  221. package/lib/assets/images/editor/steam/Feed Water Pump.png +0 -0
  222. package/lib/assets/images/editor/steam/Pressure_Regulator.png +0 -0
  223. package/lib/assets/images/editor/steam/Steam_Valve.png +0 -0
  224. package/lib/assets/images/editor/steam/Trap.png +0 -0
  225. package/lib/assets/images/editor/steam/heat exchangers.png +0 -0
  226. package/lib/assets/images/editor/steam/safety valve.png +0 -0
  227. package/lib/assets/images/editor/steam/steam turbine.png +0 -0
  228. package/lib/assets/images/formula-image/WQI.png +0 -0
  229. package/lib/assets/images/formula.png +0 -0
  230. package/lib/assets/images/icons/Discharge destination.svg +6 -0
  231. package/lib/assets/images/icons/Station.svg +3 -0
  232. package/lib/assets/images/icons/arrow-gray.svg +7 -0
  233. package/lib/assets/images/icons/arrow.gif +0 -0
  234. package/lib/assets/images/icons/arrow.svg +7 -0
  235. package/lib/assets/images/icons/asset_1.png +0 -0
  236. package/lib/assets/images/icons/asset_2.png +0 -0
  237. package/lib/assets/images/icons/asset_3.png +0 -0
  238. package/lib/assets/images/icons/asset_4.png +0 -0
  239. package/lib/assets/images/icons/asset_5.png +0 -0
  240. package/lib/assets/images/icons/asset_6.png +0 -0
  241. package/lib/assets/images/icons/asset_7.png +0 -0
  242. package/lib/assets/images/icons/basic-plant-white.svg +6 -0
  243. package/lib/assets/images/icons/basic-plant.svg +6 -0
  244. package/lib/assets/images/icons/hoskote_plant/Brackish surface - Duo.svg +24 -0
  245. package/lib/assets/images/icons/hoskote_plant/Brackish surface.svg +7 -0
  246. package/lib/assets/images/icons/hoskote_plant/Fresh surface water - Duo.svg +24 -0
  247. package/lib/assets/images/icons/hoskote_plant/Fresh surface water.svg +6 -0
  248. package/lib/assets/images/icons/hoskote_plant/Groundwater - non-renewable - Duo.svg +31 -0
  249. package/lib/assets/images/icons/hoskote_plant/Groundwater - non-renewable.svg +6 -0
  250. package/lib/assets/images/icons/hoskote_plant/Groundwater - renewable - Duo.svg +23 -0
  251. package/lib/assets/images/icons/hoskote_plant/Groundwater - renewable.svg +6 -0
  252. package/lib/assets/images/icons/hoskote_plant/Produced entrained water - Duo.svg +22 -0
  253. package/lib/assets/images/icons/hoskote_plant/Produced entrained water.svg +3 -0
  254. package/lib/assets/images/icons/hoskote_plant/Third party sources - Duo.svg +19 -0
  255. package/lib/assets/images/icons/hoskote_plant/Third party sources.svg +3 -0
  256. package/lib/assets/images/icons/icon_grey1.png +0 -0
  257. package/lib/assets/images/icons/icon_grey2.png +0 -0
  258. package/lib/assets/images/icons/icon_marker.png +0 -0
  259. package/lib/assets/images/icons/left_cexpand.svg +6 -0
  260. package/lib/assets/images/icons/loading (2).gif +0 -0
  261. package/lib/assets/images/icons/loading (3).gif +0 -0
  262. package/lib/assets/images/icons/loading.gif +0 -0
  263. package/lib/assets/images/icons/loading.svg +23 -0
  264. package/lib/assets/images/icons/loading_4.gif +0 -0
  265. package/lib/assets/images/icons/outflow_line_dirty.png +0 -0
  266. package/lib/assets/images/icons/plant-data-active.svg +8 -0
  267. package/lib/assets/images/icons/plant-data.svg +8 -0
  268. package/lib/assets/images/icons/recommendation.svg +1 -0
  269. package/lib/assets/images/icons/recommendation1.svg +1 -0
  270. package/lib/assets/images/icons/recommendations/(.svg +3 -0
  271. package/lib/assets/images/icons/recommendations/).svg +3 -0
  272. package/lib/assets/images/icons/recommendations/Multiply.svg +3 -0
  273. package/lib/assets/images/icons/right_cexpand.svg +6 -0
  274. package/lib/assets/images/icons/ro_line_dirty.svg +7 -0
  275. package/lib/assets/images/icons/roadmap-target.png +0 -0
  276. package/lib/assets/images/icons/steam/Mass flow rate.svg +8 -0
  277. package/lib/assets/images/icons/steam/Mass flow.svg +3 -0
  278. package/lib/assets/images/logos/Group 299.png +0 -0
  279. package/lib/assets/images/logos/Logo_Hubgrade_Water_Footprint.png +0 -0
  280. package/lib/assets/images/logos/atomiton_logo.png +0 -0
  281. package/lib/assets/images/logos/atomiton_logo_mobile.png +0 -0
  282. package/lib/assets/images/logos/suez.png +0 -0
  283. package/lib/assets/images/logos/suez_2.png +0 -0
  284. package/lib/assets/images/logos/suez_small.png +0 -0
  285. package/lib/assets/images/logos/suez_small_2.png +0 -0
  286. package/lib/assets/images/logos/veolia.png +0 -0
  287. package/lib/assets/images/logos/veolia_small.png +0 -0
  288. package/lib/assets/images/logout/logging.png +0 -0
  289. package/lib/assets/images/plant/bg-2.png +0 -0
  290. package/lib/assets/images/plant/bg-old.png +0 -0
  291. package/lib/assets/images/plant/bg.png +0 -0
  292. package/lib/assets/images/plant/bg3.png +0 -0
  293. package/lib/assets/images/plant/dollar.png +0 -0
  294. package/lib/assets/images/plant/eva_pipe.png +0 -0
  295. package/lib/assets/images/plant/icon1.png +0 -0
  296. package/lib/assets/images/plant/icon2.png +0 -0
  297. package/lib/assets/images/plant/on-site_pipe.png +0 -0
  298. package/lib/assets/images/plant/product_pipe.png +0 -0
  299. package/lib/assets/images/plant/unknown_pipe.png +0 -0
  300. package/lib/assets/images/process-water/cooling_tower.gif +0 -0
  301. package/lib/assets/images/process-water/cooling_tower.png +0 -0
  302. package/lib/assets/images/process-water/cooling_tower_1.png +0 -0
  303. package/lib/assets/images/process-water/cooling_tower_3.gif +0 -0
  304. package/lib/assets/images/ro-water-treatment/RO_WATER_TREATMENT_BG.png +0 -0
  305. package/lib/assets/images/tmp/boiler.png +0 -0
  306. package/lib/assets/images/tmp/chart1.PNG +0 -0
  307. package/lib/assets/images/tmp/chart2.PNG +0 -0
  308. package/lib/assets/images/tmp/chart3.PNG +0 -0
  309. package/lib/assets/images/tmp/chart4.PNG +0 -0
  310. package/lib/assets/images/tmp/chart5.PNG +0 -0
  311. package/lib/assets/images/tmp/chart6.PNG +0 -0
  312. package/lib/assets/images/tmp/chart7.PNG +0 -0
  313. package/lib/assets/images/tmp/cooling.png +0 -0
  314. package/lib/assets/images/tmp/discharge.png +0 -0
  315. package/lib/assets/images/tmp/discoveries_water_cost.png +0 -0
  316. package/lib/assets/images/tmp/gauge1.PNG +0 -0
  317. package/lib/assets/images/tmp/gauge2.PNG +0 -0
  318. package/lib/assets/images/tmp/gauge3.PNG +0 -0
  319. package/lib/assets/images/tmp/loss.png +0 -0
  320. package/lib/assets/images/tmp/net.png +0 -0
  321. package/lib/assets/images/tmp/process.png +0 -0
  322. package/lib/assets/images/tmp/truck.png +0 -0
  323. package/lib/assets/images/ui-tmp/ SITICLab.png +0 -0
  324. package/lib/assets/images/ui-tmp/All_Energy_And_Emissions.png +0 -0
  325. package/lib/assets/images/ui-tmp/CMS.png +0 -0
  326. package/lib/assets/images/ui-tmp/Domestic_Use.png +0 -0
  327. package/lib/assets/images/ui-tmp/ETP.png +0 -0
  328. package/lib/assets/images/ui-tmp/F&M.png +0 -0
  329. package/lib/assets/images/ui-tmp/Group 356.png +0 -0
  330. package/lib/assets/images/ui-tmp/Group 357.png +0 -0
  331. package/lib/assets/images/ui-tmp/Group 358.png +0 -0
  332. package/lib/assets/images/ui-tmp/Group 359.png +0 -0
  333. package/lib/assets/images/ui-tmp/Group 360.png +0 -0
  334. package/lib/assets/images/ui-tmp/Group 361.png +0 -0
  335. package/lib/assets/images/ui-tmp/Group 397.png +0 -0
  336. package/lib/assets/images/ui-tmp/Onsite_Generation.png +0 -0
  337. package/lib/assets/images/ui-tmp/Power_Meters.png +0 -0
  338. package/lib/assets/images/ui-tmp/RO.png +0 -0
  339. package/lib/assets/images/ui-tmp/Steam_Flow_Network.png +0 -0
  340. package/lib/assets/images/ui-tmp/Steam_Flow_Network_1.png +0 -0
  341. package/lib/assets/images/ui-tmp/Total_Water_Balance.png +0 -0
  342. package/lib/assets/images/ui-tmp/WaterCircularity.png +0 -0
  343. package/lib/assets/images/ui-tmp/ZLD.png +0 -0
  344. package/lib/assets/images/ui-tmp/campaign_configuration.png +0 -0
  345. package/lib/assets/images/ui-tmp/campaign_overview.png +0 -0
  346. package/lib/assets/images/ui-tmp/campaign_tracking.png +0 -0
  347. package/lib/assets/images/ui-tmp/emisssion_pages.png +0 -0
  348. package/lib/assets/images/ui-tmp/map.png +0 -0
  349. package/lib/assets/images/ui-tmp/roadmap-details_manage.png +0 -0
  350. package/lib/assets/images/ui-tmp/roadmap-details_overview.png +0 -0
  351. package/lib/assets/images/ui-tmp/roadmap_page.png +0 -0
  352. package/lib/assets/images/ui-tmp/roadmap_plan.png +0 -0
  353. package/lib/assets/images/ui-tmp/roadmap_target1.png +0 -0
  354. package/lib/assets/images/ui-tmp/roadmap_target2.png +0 -0
  355. package/lib/assets/images/ui-tmp/roadmap_target3.png +0 -0
  356. package/lib/assets/images/ui-tmp/water_balance_plan.png +0 -0
  357. package/lib/assets/images/ui-tmp/water_page.png +0 -0
  358. package/lib/assets/images/users/avatar-default.svg.png +0 -0
  359. package/lib/assets/images/water-risk/Group 28490.png +0 -0
  360. package/lib/assets/images/water-risk/Group 28680.png +0 -0
  361. package/lib/assets/map/1_active.svg +7 -0
  362. package/lib/assets/map/aqueduct_features.json +326818 -0
  363. package/lib/assets/map/countries.json +79446 -0
  364. package/lib/assets/map/empty.svg +0 -0
  365. package/lib/assets/map/icons/marker_1.png +0 -0
  366. package/lib/assets/map/icons/marker_2.png +0 -0
  367. package/lib/assets/map/icons/marker_3.png +0 -0
  368. package/lib/assets/map/icons/marker_4.png +0 -0
  369. package/lib/assets/map/icons/marker_5.png +0 -0
  370. package/lib/assets/map/map-test.json +5810 -0
  371. package/lib/assets/map/marker.svg +19 -0
  372. package/lib/assets/map/top-water-use.svg +20 -0
  373. package/lib/assets/map/water-deprived.svg +20 -0
  374. package/lib/assets/map/water-moderate-stress.svg +20 -0
  375. package/lib/assets/map/water-non-stress.svg +20 -0
  376. package/lib/assets/map/water-stress.svg +20 -0
  377. package/lib/assets/map-style.json +192 -0
  378. package/lib/assets/worker/app.worker.ts +346 -0
  379. package/lib/ato-water-lib.component.d.ts +5 -0
  380. package/lib/ato-water-lib.module.d.ts +8 -0
  381. package/lib/ato-water-lib.service.d.ts +6 -0
  382. package/lib/components/flow-diagram-lib/flow-diagram-lib.component.d.ts +17 -0
  383. package/lib/constants/applicable-prefixes-const.d.ts +162 -0
  384. package/lib/constants/key.const.d.ts +1 -0
  385. package/lib/constants/plant.constant.d.ts +7 -0
  386. package/lib/constants/value.const.d.ts +71 -0
  387. package/lib/models/default-gojs-editor.model.d.ts +184 -0
  388. package/lib/models/gojs-editor.model.d.ts +432 -0
  389. package/lib/services/utils/utils.service.d.ts +24 -0
  390. package/package.json +31 -0
  391. package/public-api.d.ts +4 -0
@@ -0,0 +1,3148 @@
1
+ import { Directive, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { GojsEditorModel } from './gojs-editor.model';
3
+ import * as go from 'gojs';
4
+ import _ from 'lodash';
5
+ import moment from 'moment';
6
+ import { GO_LICENSE_KEY } from '../constants/key.const';
7
+ import { Subject } from 'rxjs';
8
+ import { UtilsService } from '../services/utils/utils.service';
9
+ import { ATO_ENUM_FLOW_DIRECTION, ATO_ECOMPONENT_PLANT_TYPE, NO_DATA, TEXT_UNKNOWN, VALUE_NA, } from '../constants/value.const';
10
+ import { ATO_EPlantType } from '../constants/plant.constant';
11
+ import { Subscription } from 'rxjs';
12
+ import * as i0 from "@angular/core";
13
+ const ICON_ALERT = '../assets/images/icons/Station.svg';
14
+ const ARROW = '../assets/images/icons/arrow.svg';
15
+ const ARROW_GRAY = '../assets/images/icons/arrow-gray.svg';
16
+ const RO_LINE_DIRTY = '../assets/images/icons/ro_line_dirty.svg';
17
+ const OUTFLOW_LINE_DIRTY = '../assets/images/icons/outflow_line_dirty.png';
18
+ export class AtoDefaultGojsEditor {
19
+ checkLinkCondition(fromNode, fromPort, toNode, toPort, link) {
20
+ if (this.linkValidation) {
21
+ return this.linkValidation(fromNode, fromPort, toNode, toPort, link);
22
+ }
23
+ return true; // Mặc định cho trường hợp không có hàm linkValidation được truyền vào
24
+ }
25
+ set initialOptions(v) {
26
+ this._initialOptions = _.merge(this._initialOptions, v);
27
+ // _.extend(v, this._initialOptions);
28
+ }
29
+ get initialOptions() {
30
+ return this._initialOptions;
31
+ }
32
+ set editor(v) {
33
+ this._editor = v;
34
+ if (v) {
35
+ setTimeout(() => {
36
+ this.initDiagram();
37
+ }, 100);
38
+ }
39
+ }
40
+ get editor() {
41
+ return this._editor;
42
+ }
43
+ constructor() {
44
+ this.actions = [];
45
+ this.actionMenuId = 'actionMenuId';
46
+ this.myDiagramDiv = this.constructor.name + '-' + moment().valueOf();
47
+ this.$ = go.GraphObject.make;
48
+ this._initialOptions = {
49
+ 'toolManager.hoverDelay': 200,
50
+ // 'draggingTool.isEnabled': false,
51
+ // initialAutoScale: go.Diagram.UniformToFill,
52
+ // autoScrollRegion: GojsEditorModel.GRID_SIZE * 5,
53
+ layout: this.$(go.LayeredDigraphLayout, { direction: 0 }),
54
+ initialContentAlignment: go.Spot.Center,
55
+ initialAutoScale: go.Diagram.Uniform,
56
+ // contentAlignment: go.Spot.Center,
57
+ // this.$(go.ForceDirectedLayout),
58
+ 'undoManager.isEnabled': true,
59
+ // "animationManager.isInitial": false,
60
+ // "animationManager.isEnabled": false,
61
+ // "draggingTool.isGridSnapEnabled": true
62
+ dragSelectingTool: this.$(go.DragSelectingTool, { isPartialInclusion: true, delay: 50 }, {
63
+ box: this.$(go.Part, // replace the magenta box with a red one
64
+ { layerName: 'Tool', selectable: false }, this.$(go.Shape, {
65
+ name: 'SHAPE',
66
+ fill: 'rgba(255,0,0,0)',
67
+ stroke: '#E95F47',
68
+ strokeWidth: 2,
69
+ })),
70
+ }),
71
+ 'linkingTool.linkValidation': this.checkLinkCondition.bind(this),
72
+ 'draggingTool.doMouseMove': function () {
73
+ // do the standard behavior by calling the super method
74
+ go.DraggingTool.prototype.doMouseMove.call(this);
75
+ // if dragging-out from the diagram is not allowed, and
76
+ // if mouse is outside of viewport
77
+ if (!this.diagram.allowDragOut &&
78
+ !this.diagram.viewportBounds.containsPoint(this.diagram.lastInput.documentPoint)) {
79
+ this.diagram.ensureBounds();
80
+ const vp = this.diagram.lastInput.viewPoint;
81
+ const dp = this.diagram.position.copy();
82
+ if (vp.x < 0)
83
+ dp.x -= 10;
84
+ else if (vp.x > 0)
85
+ dp.x += 10;
86
+ if (vp.y < 0)
87
+ dp.y -= 10;
88
+ else if (vp.y > 0)
89
+ dp.y += 10;
90
+ this.diagram.position = dp; // scroll in the direction of the mouse
91
+ }
92
+ },
93
+ // LayoutCompleted: () => {
94
+ // this.myDiagram.zoomToFit();
95
+ // this.defaultScaleZoomToFit = this.myDiagram.scale;
96
+ // if (!this.initialOptions.isReadOnly) {
97
+ // const sizeMargin = GojsEditorModel.GRID_SIZE * 15;
98
+ // this.myDiagram.padding = new go.Margin(sizeMargin);
99
+ // }
100
+ // },
101
+ };
102
+ this.isShowNodeInfo = false;
103
+ this.onModelChangeListenerEvent = new EventEmitter();
104
+ this.onClickInfoButton = new EventEmitter();
105
+ this.onOpenWizard = new EventEmitter();
106
+ this.onOpenDetail = new EventEmitter();
107
+ this.onOpenAssetParameter = new EventEmitter();
108
+ this.onOpenInsightMapping = new EventEmitter();
109
+ this.onHoverInfoButton = new EventEmitter();
110
+ this.onHoverAlert = new EventEmitter();
111
+ this.onDoubleClickNode = new EventEmitter();
112
+ this.onOpenChangeIcon = new EventEmitter();
113
+ // Click component
114
+ this.onClickCompoent = new EventEmitter();
115
+ this.callbackImageTopology = new EventEmitter();
116
+ // Click param on ParamTable
117
+ this.onClikParamOfTable = new EventEmitter();
118
+ // Delete Node
119
+ this.onDeleteNode = new EventEmitter();
120
+ this.onUndo = new EventEmitter();
121
+ // Rename
122
+ this.onRename = new EventEmitter();
123
+ this.committedTransactionSubject = new Subject();
124
+ // AddSub and UnSub
125
+ this._subscriptionList = new Subscription();
126
+ go.Diagram.licenseKey = GO_LICENSE_KEY;
127
+ }
128
+ ngOnDestroy() {
129
+ this.unsubscribeAll();
130
+ this.stopAnimation();
131
+ // this.myDiagram?.clear();
132
+ if (!!this.myDiagram?.div) {
133
+ this.myDiagram.div = null;
134
+ }
135
+ if (this.myDiagram) {
136
+ this.myDiagram.clear();
137
+ }
138
+ if (this.myDiagram != null && this.myDiagram.nodeTemplateMap != null) {
139
+ this.myDiagram.nodeTemplateMap.clear();
140
+ }
141
+ if (this.myDiagram != null && this.myDiagram.groupTemplateMap != null) {
142
+ this.myDiagram.groupTemplateMap.clear();
143
+ }
144
+ if (this.myDiagram != null && this.myDiagram.linkTemplate != null) {
145
+ for (var key in this.myDiagram.linkTemplateMap.toArray()) {
146
+ this.myDiagram.linkTemplateMap.remove(key);
147
+ }
148
+ }
149
+ this.myDiagram = null;
150
+ }
151
+ addOrRemoveCompoentTemplate() {
152
+ // Add Node and Node Group
153
+ _.forEach(this.editor.data?.nodeDataArray, (node) => {
154
+ this.addTemplate(node);
155
+ });
156
+ // Remove Node and Node Group
157
+ _.forEach(this.myDiagram.nodeTemplateMap?.Hb, (temp) => {
158
+ if (temp?.key && !this.editor.data?.nodeDataArray?.some((node) => node?.type === temp?.key)) {
159
+ this.myDiagram.nodeTemplateMap.remove(temp?.key);
160
+ }
161
+ });
162
+ _.forEach(this.myDiagram.groupTemplateMap?.Hb, (temp) => {
163
+ if (temp?.key && !this.editor.data?.nodeDataArray?.some((node) => node?.type === temp?.key)) {
164
+ this.myDiagram.groupTemplateMap.remove(temp?.key);
165
+ }
166
+ });
167
+ }
168
+ addTemplate(node) {
169
+ this.addNodeTemplate(node);
170
+ this.addGroupTemplate(node);
171
+ }
172
+ addGroupTemplate(node) {
173
+ if (this.myDiagram.groupTemplateMap?.Hb?.[node?.type] || !node?.isGroup) {
174
+ return;
175
+ }
176
+ // Group
177
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.RO_WATER_TREATMENT) {
178
+ this.makeGroupROPlantTemplate(GojsEditorModel.NODE_TEMPLATES[node?.type].icon, GojsEditorModel.NODE_TEMPLATES[node?.type].name);
179
+ return;
180
+ }
181
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.BOILER) {
182
+ this.makeGroupBoilerTemplate(GojsEditorModel.NODE_TEMPLATES[node?.type].icon, GojsEditorModel.NODE_TEMPLATES[node?.type].name);
183
+ return;
184
+ }
185
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.COOLING_TOWER) {
186
+ this.makeGroupCoolingTowerTemplate(GojsEditorModel.NODE_TEMPLATES[node?.type].icon, GojsEditorModel.NODE_TEMPLATES[node?.type].name);
187
+ return;
188
+ }
189
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.ZONE) {
190
+ this.makeGroupZoneTemplate();
191
+ return;
192
+ }
193
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.PLANT_CELL && node?.isGroup) {
194
+ this.groupPlantCellTemplate(GojsEditorModel.NODE_TEMPLATES[node?.type].icon, GojsEditorModel.NODE_TEMPLATES[node?.type].name);
195
+ return;
196
+ }
197
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.PLANT_CELL_INPUT_GROUP) {
198
+ this.groupPCInputOrOutTemplate(GojsEditorModel.NODE_TEMPLATES[node?.type].icon, GojsEditorModel.NODE_TEMPLATES[node?.type].name, new go.Margin(0, 50, 0, 0));
199
+ return;
200
+ }
201
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.PLANT_CELL_OUTPUT_GROUP) {
202
+ this.groupPCInputOrOutTemplate(GojsEditorModel.NODE_TEMPLATES[node?.type].icon, GojsEditorModel.NODE_TEMPLATES[node?.type].name, new go.Margin(0, 0, 0, 50));
203
+ return;
204
+ }
205
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.GROUP_BASIC_COMPONENT) {
206
+ this.makeGroupBasicComponent(GojsEditorModel.NODE_TEMPLATES[node?.type].icon, GojsEditorModel.NODE_TEMPLATES[node?.type].name);
207
+ return;
208
+ }
209
+ this.makeGroupTemplate(GojsEditorModel.NODE_TEMPLATES[node?.type].icon, GojsEditorModel.NODE_TEMPLATES[node?.type].name);
210
+ }
211
+ addNodeTemplate(node) {
212
+ if (this.myDiagram.nodeTemplateMap?.Hb?.[node?.type] || node?.isGroup) {
213
+ return;
214
+ }
215
+ // Not Group
216
+ // Component Water Normal
217
+ if (GojsEditorModel.TYPE_TEMPLATE_WATER_NORMAL?.includes(node?.type) && !node?.isGroup) {
218
+ this.makeEntityTemplate(GojsEditorModel.NODE_TEMPLATES[node?.type].icon ?? '', GojsEditorModel.NODE_TEMPLATES[node?.type].name ?? '');
219
+ }
220
+ // Component Water Withdraw Or Discharge
221
+ if (GojsEditorModel.TYPE_TEMPLATE_WATER_WITHDRAW_OR_DISCHARGE?.includes(node?.type) && !node?.isGroup) {
222
+ this.makeEntityWithdrawOrDischarge(GojsEditorModel.NODE_TEMPLATES[node?.type].icon ?? '', GojsEditorModel.NODE_TEMPLATES[node?.type].name ?? '');
223
+ }
224
+ // Component Energy Normal
225
+ if ((GojsEditorModel.TYPE_TEMPLATE_ELECTRICITY?.includes(node?.type) ||
226
+ GojsEditorModel.TYPE_TEMPLATE_NATURAL_GAS?.includes(node?.type) ||
227
+ GojsEditorModel.TYPE_TEMPLATE_FUEL?.includes(node?.type) ||
228
+ GojsEditorModel.TYPE_TEMPLATE_STEAM?.includes(node?.type)) &&
229
+ !node?.isGroup) {
230
+ this.makeEntityTemplateEnergy(GojsEditorModel.NODE_TEMPLATES[node?.type].icon ?? '', GojsEditorModel.NODE_TEMPLATES[node?.type].name ?? '');
231
+ }
232
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.IMAGE_TEMPLATE) {
233
+ this.makeImageTemplate();
234
+ }
235
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.PARAM_TABLE) {
236
+ this.makeParamTable();
237
+ }
238
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.MASS_BALANCE) {
239
+ this.makeMassBalance();
240
+ }
241
+ // Text Node
242
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.TEXT_NODE) {
243
+ this.makeTextTemplate();
244
+ }
245
+ // Value Node
246
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.VALUE_NODE) {
247
+ this.makeValueNodeTemplate();
248
+ }
249
+ // Value Node
250
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.EMPTY) {
251
+ this.makeEmptyNodeTemplate();
252
+ }
253
+ // Value Label
254
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.VALUE_LABEL) {
255
+ this.makeValueLabelTemplate();
256
+ }
257
+ // Zone item
258
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.ZONE_ENERGY_ITEM) {
259
+ this.makeZoneItemTemplate();
260
+ }
261
+ // data box
262
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.DATA_BOX) {
263
+ this.makeDataBoxTemplate();
264
+ }
265
+ // Special template
266
+ if (GojsEditorModel.TYPE_TEMPLATE_SPECIAL?.includes(node?.type)) {
267
+ this.makeSpecialTemplate(GojsEditorModel.NODE_TEMPLATES[node?.type].icon, GojsEditorModel.NODE_TEMPLATES[node?.type].name);
268
+ }
269
+ // Plant Cell
270
+ if (node?.type === GojsEditorModel.ENUM_TEMPLATES.PLANT_CELL && !node?.isGroup) {
271
+ this.plantCellTemplate(GojsEditorModel.NODE_TEMPLATES[node?.type].icon, GojsEditorModel.NODE_TEMPLATES[node?.type].name);
272
+ }
273
+ }
274
+ initDiagram() {
275
+ if (!!this.myDiagram?.div) {
276
+ // this.myDiagram.div = null;
277
+ if (this.initialOptions?.grid) {
278
+ this.myDiagram['grid'] = this.initialOptions?.grid;
279
+ }
280
+ else {
281
+ this.myDiagram['grid'] = this.$(go.Panel, 'Grid');
282
+ }
283
+ if (this.initialOptions?.LayoutCompleted) {
284
+ this.myDiagram.addDiagramListener('LayoutCompleted', this.initialOptions?.LayoutCompleted);
285
+ }
286
+ if (this.initialOptions?.LinkReshaped) {
287
+ this.myDiagram.addDiagramListener('LinkReshaped', this.initialOptions?.LinkReshaped);
288
+ }
289
+ if (this.initialOptions?.SelectionMoved) {
290
+ this.myDiagram.addDiagramListener('SelectionMoved', this.initialOptions?.SelectionMoved);
291
+ }
292
+ if (this.initialOptions?.ChangedSelection) {
293
+ this.myDiagram.addDiagramListener('ChangedSelection', this.initialOptions?.ChangedSelection);
294
+ }
295
+ this.myDiagram.dragSelectingTool = this.initialOptions?.dragSelectingTool;
296
+ this.myDiagram.toolManager.draggingTool.isGridSnapEnabled =
297
+ this.initialOptions?.['draggingTool.isGridSnapEnabled'] ?? false;
298
+ if (this.myDiagram.toolManager && this.myDiagram.toolManager.draggingTool) {
299
+ if (this.initialOptions?.['draggingTool.gridSnapCellSize']) {
300
+ this.myDiagram.toolManager.draggingTool.gridSnapCellSize =
301
+ this.initialOptions?.['draggingTool.gridSnapCellSize'];
302
+ }
303
+ // if (this.initialOptions?.['draggingTool.isGridSnapEnabled']) {
304
+ // this.myDiagram.toolManager.draggingTool.isGridSnapEnabled =
305
+ // this.initialOptions?.['draggingTool.isGridSnapEnabled'];
306
+ // }
307
+ if (this.initialOptions?.['draggingTool.doMouseMove']) {
308
+ this.myDiagram.toolManager.draggingTool.doMouseMove =
309
+ this.initialOptions?.['draggingTool.doMouseMove'];
310
+ }
311
+ if (this.initialOptions?.['linkingTool.linkValidation']) {
312
+ this.myDiagram.toolManager.linkingTool.linkValidation =
313
+ this.initialOptions?.['linkingTool.linkValidation'];
314
+ }
315
+ }
316
+ this.myDiagram.contentAlignment = this.initialOptions?.contentAlignment ?? go.Spot.Center;
317
+ this.myDiagram.layout = this.initialOptions?.layout;
318
+ // this.myDiagram.minViewportBounds = new go.Rect(0, 0, 1200, 1200);
319
+ if (!!this.editor?.data) {
320
+ this.addOrRemoveCompoentTemplate();
321
+ this.myDiagram.model = go.Model.fromJson(this.editor.data);
322
+ }
323
+ return;
324
+ }
325
+ if (this.animationInterval) {
326
+ clearInterval(this.animationInterval);
327
+ }
328
+ this.myDiagram = this.$(go.Diagram, this.myDiagramDiv, this.initialOptions);
329
+ // this.myDiagram.initialPosition = new go.Point(0, 0);
330
+ this.addOrRemoveCompoentTemplate();
331
+ this.makeLinkTemplate();
332
+ // animation
333
+ this.startAnimation();
334
+ setTimeout(() => {
335
+ const self = this;
336
+ // if (!this.isAddedModelChangedListeners) {
337
+ this.isAddedModelChangedListeners = true;
338
+ this.myDiagram.addModelChangedListener(function (e) {
339
+ if (e.change === go.ChangedEvent.Remove && e.propertyName === 'nodeDataArray') {
340
+ const data = e.oldValue;
341
+ self.onDeleteNode.emit(data);
342
+ }
343
+ if (e.isTransactionFinished) {
344
+ self.committedTransactionSubject?.next(e);
345
+ }
346
+ });
347
+ this.myDiagram.commandHandler.undo = function () {
348
+ self.onUndo.emit();
349
+ };
350
+ });
351
+ if (!!this.editor) {
352
+ this.myDiagram.model = go.Model.fromJson(this.editor.data);
353
+ }
354
+ }
355
+ initGroupTemplateEnergy() {
356
+ // for water
357
+ const { STORAGE, WATER_TREATMENT, DEMIN_WATER_TREATMENT,
358
+ // RO_WATER_TREATMENT,
359
+ PROCESS, WASTEWATER_TREATMENT, DAF_WASTEWATER_TREATMENT, ETP_WASTEWATER_TREATMENT, MBR_WASTEWATER_TREATMENT, ZLD_WASTEWATER_TREATMENT, COOLING_TOWER, BOILER, OTHER, LANDSCAPING_IRRIGATION, } = GojsEditorModel.ENUM_TEMPLATES;
360
+ const waterGroups = [
361
+ STORAGE,
362
+ WATER_TREATMENT,
363
+ DEMIN_WATER_TREATMENT,
364
+ // RO_WATER_TREATMENT,
365
+ PROCESS,
366
+ WASTEWATER_TREATMENT,
367
+ DAF_WASTEWATER_TREATMENT,
368
+ ETP_WASTEWATER_TREATMENT,
369
+ MBR_WASTEWATER_TREATMENT,
370
+ ZLD_WASTEWATER_TREATMENT,
371
+ COOLING_TOWER,
372
+ BOILER,
373
+ OTHER,
374
+ LANDSCAPING_IRRIGATION,
375
+ ];
376
+ waterGroups.map((e) => {
377
+ if (!!GojsEditorModel.NODE_TEMPLATES[e]) {
378
+ this.makeGroupTemplate(GojsEditorModel.NODE_TEMPLATES[e].icon, GojsEditorModel.NODE_TEMPLATES[e].name);
379
+ }
380
+ });
381
+ // electrical
382
+ this.initElectricGroupTemplate();
383
+ // Fuel
384
+ this.initFuelGroupTemplate();
385
+ // Gas
386
+ this.initGasGroupTemplate();
387
+ }
388
+ initElectricDiagram() {
389
+ const { GRID, DIESEL_GENERATORS, BATTERY_ENERGY_STORAGE, LIGHTING_SYSTEMS, LIGHTINGS, ELECTRIC_METERS, TRANSFORMERS, ELECTRIC_FLYWHEEL_ENERGY_STORAGE, PUMPED_HYDRO_STORAGE, THERMAL_ENERGY_STORAGE, SUPER_CAPACITOR_ENERGY_STORAGE, SWITCH_GEARS, PROCESS_CONTROL_AUTOMATION_SYSTEMS, PROCESS_EQUIPMENT_MACHINES, OFFICE_EQUIPMENT, POWER_DISTRIBUTION_CONTROL_SYSTEMS, POWER_DISTRIBUTION_SYSTEMS, NATURAL_GAS_GENERATORS, MOTOR_CONTROLS, VARIABLE_FREQUENCY_DRIVERS, ELECTRIC_HVAC, COMPRESSED_AIR_SYSTEMS, REFRIGERATION_COOLING_SYSTEMS, MATERIAL_HANDLING_EQUIPMENT, WIND_POWER, ELECTRIC_INDUSTRIAL_MOTORS, GROUNDING, } = GojsEditorModel.ENUM_TEMPLATES;
390
+ const ListItemsCreateEntityTemplate = [
391
+ GRID,
392
+ DIESEL_GENERATORS,
393
+ BATTERY_ENERGY_STORAGE,
394
+ LIGHTING_SYSTEMS,
395
+ LIGHTINGS,
396
+ ELECTRIC_METERS,
397
+ TRANSFORMERS,
398
+ ELECTRIC_FLYWHEEL_ENERGY_STORAGE,
399
+ PUMPED_HYDRO_STORAGE,
400
+ THERMAL_ENERGY_STORAGE,
401
+ SUPER_CAPACITOR_ENERGY_STORAGE,
402
+ SWITCH_GEARS,
403
+ PROCESS_CONTROL_AUTOMATION_SYSTEMS,
404
+ PROCESS_EQUIPMENT_MACHINES,
405
+ OFFICE_EQUIPMENT,
406
+ POWER_DISTRIBUTION_CONTROL_SYSTEMS,
407
+ POWER_DISTRIBUTION_SYSTEMS,
408
+ NATURAL_GAS_GENERATORS,
409
+ MOTOR_CONTROLS,
410
+ VARIABLE_FREQUENCY_DRIVERS,
411
+ ELECTRIC_HVAC,
412
+ COMPRESSED_AIR_SYSTEMS,
413
+ REFRIGERATION_COOLING_SYSTEMS,
414
+ MATERIAL_HANDLING_EQUIPMENT,
415
+ WIND_POWER,
416
+ ELECTRIC_INDUSTRIAL_MOTORS,
417
+ GROUNDING,
418
+ ];
419
+ ListItemsCreateEntityTemplate.map((e) => {
420
+ if (!!GojsEditorModel.NODE_TEMPLATES[e]) {
421
+ this.makeEntityTemplateEnergy(GojsEditorModel.NODE_TEMPLATES[e].icon, GojsEditorModel.NODE_TEMPLATES[e].name);
422
+ }
423
+ });
424
+ }
425
+ initElectricGroupTemplate() {
426
+ const listItems = [
427
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.BATTERY_ENERGY_STORAGE],
428
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.TRANSFORMERS],
429
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.ELECTRIC_METERS],
430
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.LIGHTINGS],
431
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.POWER_DISTRIBUTION_SYSTEMS],
432
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.SWITCH_GEARS],
433
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.ELECTRIC_INDUSTRIAL_MOTORS],
434
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.GROUNDING],
435
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.MOTOR_CONTROLS],
436
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.LIGHTING_SYSTEMS],
437
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.ELECTRIC_HVAC],
438
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.REFRIGERATION_COOLING_SYSTEMS],
439
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.PROCESS_CONTROL_AUTOMATION_SYSTEMS],
440
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.OFFICE_EQUIPMENT],
441
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.COMPRESSED_AIR_SYSTEMS],
442
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.PROCESS_EQUIPMENT_MACHINES],
443
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.MATERIAL_HANDLING_EQUIPMENT],
444
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.POWER_DISTRIBUTION_CONTROL_SYSTEMS],
445
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.BATTERIES],
446
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.VARIABLE_FREQUENCY_DRIVERS],
447
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.ELECTRIC_FLYWHEEL_ENERGY_STORAGE],
448
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.PUMPED_HYDRO_STORAGE],
449
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.THERMAL_ENERGY_STORAGE],
450
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.SUPER_CAPACITOR_ENERGY_STORAGE],
451
+ ];
452
+ listItems.forEach((e) => {
453
+ this.makeGroupTemplate(e?.icon, e.name);
454
+ });
455
+ }
456
+ initFuelGroupTemplate() {
457
+ const listItems = [
458
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.DIESEL_FUELS],
459
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.GASON_LINES],
460
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.BIODIESELS],
461
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.KEROSENSE],
462
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.PROPANES],
463
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.TANKER_TRUCKS],
464
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.PIPELINE],
465
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.INDUSTRIAL_BOILERS],
466
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.GENERATORS],
467
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.INDUSTRIAL_FURNACES],
468
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.INDUSTRIAL_OVENS],
469
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.INDUSTRIAL_VEHICLES_AND_EQUIPMENT],
470
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_METERS],
471
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_DISPENSERS],
472
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_STRORAGE_TANKS],
473
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.ELECTRIC_HVAC],
474
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_FILTRATIONS],
475
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_MANAGEMENTS],
476
+ ];
477
+ this.makeGroupTemplate(GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_DISPENSERS].icon, GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_DISPENSERS].name);
478
+ this.makeGroupTemplate(GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_STRORAGE_TANKS].icon, GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_STRORAGE_TANKS].name);
479
+ this.makeGroupTemplate(GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_FILTRATIONS].icon, GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_FILTRATIONS].name);
480
+ this.makeGroupTemplate(GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_MANAGEMENTS].icon, GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_MANAGEMENTS].name);
481
+ listItems.forEach((e) => {
482
+ this.makeGroupTemplate(e?.icon, e.name);
483
+ });
484
+ }
485
+ initGasGroupTemplate() {
486
+ const listItems = [
487
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.COMPRESSED_NATURAL_GAS_PIPELINE],
488
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.BOILERS_AND_HEATERS],
489
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FURNACES],
490
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.POWER_GENERATION],
491
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.COGENERATION],
492
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.COMBINED_CYCLE_POWER_PLANTS],
493
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_FOR_VEHICLES_AND_EQUIPMENT],
494
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.GAS_METERS],
495
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.BURNERS],
496
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FLUE_GAS_ANALYZERS],
497
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.COMBUSTION_CONTROL_SYSTEMS],
498
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.GAS_STORAGE_TANKS],
499
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.GAS_PRESSURE_REGULATORS],
500
+ ];
501
+ this.makeGroupTemplate(GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_DISPENSERS].icon, GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_DISPENSERS].name);
502
+ this.makeGroupTemplate(GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_STRORAGE_TANKS].icon, GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_STRORAGE_TANKS].name);
503
+ this.makeGroupTemplate(GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_FILTRATIONS].icon, GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_FILTRATIONS].name);
504
+ this.makeGroupTemplate(GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_MANAGEMENTS].icon, GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.FUEL_MANAGEMENTS].name);
505
+ listItems.forEach((e) => {
506
+ this.makeGroupTemplate(e?.icon, e.name);
507
+ });
508
+ }
509
+ initGasDiagram() {
510
+ const { NATURAL_GAS_PIPELINES, LIQUEFIED_NATURAL_GAS, COMPRESSED_NATURAL_GAS_PIPELINE, COMPRESSED_NATURAL_GAS_PRODUCTION, BOILERS_AND_HEATERS, FURNACES, POWER_GENERATION, COGENERATION, COMBINED_CYCLE_POWER_PLANTS, FUEL_FOR_VEHICLES_AND_EQUIPMENT, GAS_METERS, BURNERS, FLUE_GAS_ANALYZERS, COMBUSTION_CONTROL_SYSTEMS, GAS_STORAGE_TANKS, GAS_PRESSURE_REGULATORS, NATURAL_GAS, } = GojsEditorModel.ENUM_TEMPLATES;
511
+ const ListItemsCreateEntityTemplate = [
512
+ NATURAL_GAS_PIPELINES,
513
+ LIQUEFIED_NATURAL_GAS,
514
+ COMPRESSED_NATURAL_GAS_PIPELINE,
515
+ COMPRESSED_NATURAL_GAS_PRODUCTION,
516
+ BOILERS_AND_HEATERS,
517
+ FURNACES,
518
+ POWER_GENERATION,
519
+ COGENERATION,
520
+ COMBINED_CYCLE_POWER_PLANTS,
521
+ FUEL_FOR_VEHICLES_AND_EQUIPMENT,
522
+ GAS_METERS,
523
+ BURNERS,
524
+ FLUE_GAS_ANALYZERS,
525
+ COMBUSTION_CONTROL_SYSTEMS,
526
+ GAS_STORAGE_TANKS,
527
+ GAS_PRESSURE_REGULATORS,
528
+ NATURAL_GAS,
529
+ ];
530
+ ListItemsCreateEntityTemplate.map((e) => {
531
+ if (!!GojsEditorModel.NODE_TEMPLATES[e]) {
532
+ this.makeEntityTemplateEnergy(GojsEditorModel.NODE_TEMPLATES[e].icon, GojsEditorModel.NODE_TEMPLATES[e].name);
533
+ }
534
+ });
535
+ }
536
+ initFuelDiagram() {
537
+ const { DIESEL_FUELS, GASON_LINES, BIODIESELS, KEROSENSE, PROPANES, TANKER_TRUCKS, PIPELINE, INDUSTRIAL_BOILERS, GENERATORS, INDUSTRIAL_FURNACES, INDUSTRIAL_OVENS, INDUSTRIAL_VEHICLES_AND_EQUIPMENT, FUEL_METERS, FUEL_DISPENSERS, FUEL_STRORAGE_TANKS, FUEL_FILTRATIONS, FUEL_MANAGEMENTS, FUELS, } = GojsEditorModel.ENUM_TEMPLATES;
538
+ const ListItemsCreateEntityTemplate = [
539
+ DIESEL_FUELS,
540
+ GASON_LINES,
541
+ BIODIESELS,
542
+ KEROSENSE,
543
+ PROPANES,
544
+ TANKER_TRUCKS,
545
+ PIPELINE,
546
+ INDUSTRIAL_BOILERS,
547
+ GENERATORS,
548
+ INDUSTRIAL_FURNACES,
549
+ INDUSTRIAL_OVENS,
550
+ INDUSTRIAL_VEHICLES_AND_EQUIPMENT,
551
+ FUEL_METERS,
552
+ FUEL_DISPENSERS,
553
+ FUEL_STRORAGE_TANKS,
554
+ FUEL_FILTRATIONS,
555
+ FUEL_MANAGEMENTS,
556
+ FUELS,
557
+ ];
558
+ ListItemsCreateEntityTemplate.map((e) => {
559
+ if (!!GojsEditorModel.NODE_TEMPLATES[e]) {
560
+ this.makeEntityTemplateEnergy(GojsEditorModel.NODE_TEMPLATES[e].icon, GojsEditorModel.NODE_TEMPLATES[e].name);
561
+ }
562
+ });
563
+ }
564
+ initSolarDiagram() {
565
+ const { SOLAR_POWER, POWER_CONDITIONING_UNIT, BATTERIES: BATTERY, INVERTERS: INVERTER, } = GojsEditorModel.ENUM_TEMPLATES;
566
+ const ListItemsCreateEntityTemplate = [SOLAR_POWER, POWER_CONDITIONING_UNIT, BATTERY, INVERTER];
567
+ ListItemsCreateEntityTemplate.map((e) => {
568
+ if (!!GojsEditorModel.NODE_TEMPLATES[e]) {
569
+ this.makeEntityTemplateEnergy(GojsEditorModel.NODE_TEMPLATES[e].icon, GojsEditorModel.NODE_TEMPLATES[e].name);
570
+ }
571
+ });
572
+ }
573
+ initSteamDiagram() {
574
+ const { VALUES, STEAM_TRAPS, PRESSURE_REGULATORS, SAFETY_VALUES_AND_EQUIPMENT, CONDENSATE_RETURN_SYSTEM, DEAERATORS, FEEDWATER_PUMPS, BLOWDOWN_TANKS, EXPANSION_TANKS, HEAT_EXCHANGERS, TURBINES, } = GojsEditorModel.ENUM_TEMPLATES;
575
+ const ListItemsCreateEntityTemplate = [
576
+ VALUES,
577
+ STEAM_TRAPS,
578
+ PRESSURE_REGULATORS,
579
+ SAFETY_VALUES_AND_EQUIPMENT,
580
+ CONDENSATE_RETURN_SYSTEM,
581
+ DEAERATORS,
582
+ FEEDWATER_PUMPS,
583
+ BLOWDOWN_TANKS,
584
+ EXPANSION_TANKS,
585
+ HEAT_EXCHANGERS,
586
+ TURBINES,
587
+ ];
588
+ ListItemsCreateEntityTemplate.map((e) => {
589
+ if (!!GojsEditorModel.NODE_TEMPLATES[e]) {
590
+ this.makeEntityTemplateEnergy(GojsEditorModel.NODE_TEMPLATES[e].icon, GojsEditorModel.NODE_TEMPLATES[e].name);
591
+ }
592
+ });
593
+ }
594
+ onModelChangeListener(e) {
595
+ // this.onModelChangeListenerEvent.emit(e);
596
+ }
597
+ makeLinkTemplate() {
598
+ const elements = [];
599
+ // line
600
+ elements.push(this.$(go.Shape, {
601
+ isPanelMain: true,
602
+ stroke: GojsEditorModel.ENUM_COLORS.GRAY,
603
+ strokeWidth: GojsEditorModel.LINK_TEMPLATES[GojsEditorModel.ENUM_LINK_TYPES.SIMPLE]?.strokeWidth,
604
+ // strokeWidth: 0,
605
+ }, new go.Binding('stroke', 'color'), new go.Binding('selectable', 'selectable'), new go.Binding('strokeWidth', 'type', (x) => GojsEditorModel.LINK_TEMPLATES[x]?.strokeWidth)));
606
+ // animation
607
+ elements.push(this.$(go.Shape, {
608
+ ...GojsEditorModel.LINK_TEMPLATES[GojsEditorModel.ENUM_LINK_TYPES.PIPE_ANIMATION]?.animation,
609
+ visible: true,
610
+ fill: 'transparent',
611
+ }));
612
+ elements.push(this.$(go.Panel, 'Top', {
613
+ height: 38,
614
+ // maxSize: new go.Size(NaN, 36),
615
+ // width: 100,
616
+ // minSize: new go.Size(100, 5), // Đặt kích thước tối thiểu là 100x50
617
+ background: 'transparent',
618
+ // layerName: 'BackgroundLayer',
619
+ // alignment: go.Spot.Top,
620
+ // alignmentFocus: go.Spot.Left,
621
+ // margin: new go.Margin(0, 0, 50, 0),
622
+ // selectable: false,
623
+ }, new go.Binding('visible', 'textComponent', (x) => {
624
+ return x ? true : false;
625
+ }),
626
+ // this.$(go.Shape, {
627
+ // height: 30,
628
+ // background: 'transparent',
629
+ // fill: 'transparent',
630
+ // // visible: false,
631
+ // }),
632
+ this.$(go.TextBlock, {
633
+ // margin: new go.Margin(0, 0, 50, 0),
634
+ stroke: '#444444',
635
+ font: 'normal 10pt Arial',
636
+ textAlign: 'left',
637
+ background: 'transparent',
638
+ // editable: false,
639
+ // alignment: go.Spot.Center, // Đảm bảo văn bản nằm ở trung tâm của nút
640
+ // alignmentFocus: go.Spot.Center, // Đảm bảo văn bản không bị dịch chuyển ra khỏi trung tâm
641
+ wrap: go.TextBlock.WrapFit,
642
+ // selectable: true,
643
+ overflow: go.TextBlock.OverflowEllipsis,
644
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
645
+ margin: 4,
646
+ }, new go.Binding('text', 'textComponent'))),
647
+ }, new go.Binding('text', 'textComponent'), new go.Binding('background', 'textComponent', (x) => (x ? 'white' : 'transparent')))));
648
+ // arrow
649
+ elements.push(this.$(go.Shape, // the "from" arrowhead
650
+ { ...GojsEditorModel.LINK_TEMPLATES[GojsEditorModel.ENUM_LINK_TYPES.SIMPLE]?.arrow }, new go.Binding('visible', 'type', (x) => ![
651
+ GojsEditorModel.ENUM_LINK_TYPES.PIPE_ANIMATION,
652
+ GojsEditorModel.ENUM_LINK_TYPES.PIPE,
653
+ GojsEditorModel.ENUM_LINK_TYPES.PIPE_HIDDEN,
654
+ ].includes(x)), new go.Binding('fill', 'color'), new go.Binding('stroke', 'color')));
655
+ // TODO fix link cannot selected inside group template
656
+ this.myDiagram.linkTemplate = this.$(go.Link, go.Link.Orthogonal, {
657
+ // layerName: 'Background', // link cannot select inside group template
658
+ // curviness: 20,
659
+ // corner: 5,
660
+ routing: go.Link.AvoidsNodes,
661
+ reshapable: true,
662
+ resegmentable: true,
663
+ relinkableFrom: true,
664
+ relinkableTo: true,
665
+ selectable: true,
666
+ toShortLength: GojsEditorModel.LINK_TEMPLATES[GojsEditorModel.ENUM_LINK_TYPES.SIMPLE].toShortLength, // assume arrowhead at "to" end, need to avoid bad appearance when path is thick
667
+ }, new go.Binding('layerName', '', (data) => {
668
+ return data?.textComponent ? 'Background' : '';
669
+ }), new go.Binding('zOrder', 'type', (x) => (x === GojsEditorModel.ENUM_LINK_TYPES.PIPE_ANIMATION ? 11 : 10)), new go.Binding('toShortLength', 'type', (x) => GojsEditorModel.LINK_TEMPLATES[x].toShortLength || 0), new go.Binding('selectable', 'selectable'), new go.Binding('visible', 'visible'),
670
+ // make sure links come in from the proper direction and go out appropriately
671
+ ...elements);
672
+ }
673
+ makeValueNodeTemplate(size = { w: 82, h: 36 }) {
674
+ const self = this;
675
+ const node = this.$(go.Node, 'Spot', {}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { minSize: new go.Size(size.w, size.h) }, this.$(go.Shape, 'Rectangle', {
676
+ fill: GojsEditorModel.ENUM_COLORS.LIGHT_BLUE,
677
+ stroke: 'transparent',
678
+ }), this.$(go.Panel, 'Horizontal', this.$(go.TextBlock, {
679
+ row: 2,
680
+ font: 'bold 14px Arial',
681
+ textAlign: 'center',
682
+ stroke: GojsEditorModel.ENUM_COLORS.CERULEAN,
683
+ }, new go.Binding('editable', 'isEditable'), new go.Binding('text', 'shortenedNumber').makeTwoWay(), new go.Binding('stroke', 'color'), new go.Binding('margin', 'isFormat', (x) => x ? new go.Margin(5, 0, 5, 5) : new go.Margin(5, 5, 5, 5)), new go.Binding('visible', '', function (data) {
684
+ return data.value !== VALUE_NA;
685
+ })),
686
+ // Icon Err when lack of value
687
+ this.$(go.TextBlock, {
688
+ margin: new go.Margin(10, 10, 10, 10),
689
+ text: VALUE_NA,
690
+ textAlign: 'center',
691
+ font: 'bold 10pt sans-serif',
692
+ stroke: GojsEditorModel.ENUM_COLORS.SALMON,
693
+ wrap: go.TextBlock.WrapFit,
694
+ editable: false,
695
+ isMultiline: false,
696
+ }, new go.Binding('visible', '', function (data) {
697
+ return data.value === VALUE_NA;
698
+ })))));
699
+ this.myDiagram.nodeTemplateMap.set(GojsEditorModel.ENUM_TEMPLATES.VALUE_NODE, node);
700
+ }
701
+ makeEmptyNodeTemplate(size = { w: 0, h: 0 }) {
702
+ const node = this.$(go.Node, 'Spot', {}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify));
703
+ this.myDiagram.nodeTemplateMap.set(GojsEditorModel.ENUM_TEMPLATES.EMPTY, node);
704
+ }
705
+ makeValueLabelTemplate(size = { w: 82, h: 36 }) {
706
+ const node = this.$(go.Node, 'Auto', {
707
+ movable: false,
708
+ }, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { minSize: new go.Size(size.w, size.h) }, this.$(go.Panel, 'Horizontal', {
709
+ margin: new go.Margin(0, 10, 0, 10),
710
+ }, this.$(go.TextBlock, {
711
+ margin: new go.Margin(0, 5, 10, 0),
712
+ textAlign: 'center',
713
+ font: 'bold 15px sans-serif',
714
+ wrap: go.TextBlock.WrapFit,
715
+ stroke: GojsEditorModel.ENUM_COLORS.CERULEAN,
716
+ minSize: new go.Size(150, 30), // Set the width of the text block
717
+ }, new go.Binding('stroke', 'color'), new go.Binding('text', 'data', (x) => {
718
+ if (typeof x?.quantity !== 'number') {
719
+ return '';
720
+ }
721
+ const formatted = UtilsService.convertPrefixesData({
722
+ value: x?.quantity,
723
+ unit: UtilsService.convertSpecialUnit(x?.unit),
724
+ });
725
+ let retValue = formatted.shortenedNumber +
726
+ ' ' +
727
+ formatted.unitPrefixes +
728
+ UtilsService.convertSpecialUnit(x?.unit) ?? '';
729
+ if (x?.percent) {
730
+ retValue += ` (${x?.percent}%)`;
731
+ }
732
+ return retValue;
733
+ }), new go.Binding('visible', 'data', (x) => typeof x?.quantity === 'number')))));
734
+ this.myDiagram.nodeTemplateMap.set(GojsEditorModel.ENUM_TEMPLATES.VALUE_LABEL, node);
735
+ }
736
+ makeTextTemplate(size = { w: GojsEditorModel.GRID_SIZE * 5, h: GojsEditorModel.GRID_SIZE * 2 }) {
737
+ const self = this;
738
+ const contextMenu = this.$(go.Adornment, 'Vertical', this.$('ContextMenuButton', this.$(go.TextBlock, 'Option 1'), {
739
+ click: function (e, obj) {
740
+ alert('Option 1 clicked!');
741
+ },
742
+ }), this.$('ContextMenuButton', this.$(go.TextBlock, 'Option 2'), {
743
+ click: function (e, obj) {
744
+ alert('Option 2 clicked!');
745
+ },
746
+ }));
747
+ const node = this.$(go.Node, 'Spot', {
748
+ // fromSpot: go.Spot.RightSide,
749
+ // toSpot: go.Spot.LeftSide,
750
+ locationSpot: go.Spot.Center,
751
+ // selectionChanged: (e) => {
752
+ // if (e?.data.onSelected) {
753
+ // e?.data.onSelected(e?.data);
754
+ // }
755
+ // },
756
+ // mouseHover: (e, obj) => {
757
+ // const node = obj.part;
758
+ // if ((obj as any).part?.ob?.value === VALUE_NA) {
759
+ // self.onHoverInfoButton.emit({
760
+ // left: e?.['Wr']?.x + 8,
761
+ // top: e?.['Wr']?.y,
762
+ // node: node,
763
+ // });
764
+ // }
765
+ // },
766
+ // mouseLeave: (e, obj) => {
767
+ // if ((obj as any).part?.ob?.value === VALUE_NA) {
768
+ // self.onHoverInfoButton.emit(null);
769
+ // }
770
+ // },
771
+ click: (e, obj) => {
772
+ const node = obj.part;
773
+ if (node?.ob?.isTypeInflowOfPlantCell) {
774
+ // obj?.data?.onSelected(node?.ob?.nodePlantCellParent);
775
+ // self.onClickCompoent.emit({
776
+ // left: e?.['Wr']?.x,
777
+ // top: e?.['Wr']?.y,
778
+ // node: {
779
+ // ob: node?.ob?.nodePlantCellParent,
780
+ // },
781
+ // component: node?.ob?.nodePlantCellParent,
782
+ // });
783
+ return;
784
+ }
785
+ if (this._initialOptions?.isReadOnly) {
786
+ this.isShowNodeInfo
787
+ ? self.onClickInfoButton.emit({
788
+ left: e?.['Wr']?.x,
789
+ top: e?.['Wr']?.y,
790
+ node: node,
791
+ })
792
+ : null;
793
+ }
794
+ },
795
+ doubleClick: (e, obj) => {
796
+ const node = obj.part;
797
+ if (node?.ob?.isTypeInflowOfPlantCell && !this._initialOptions?.isReadOnly) {
798
+ // obj?.data?.onSelected(node?.ob?.nodePlantCellParent);
799
+ // this.isShowNodeInfo
800
+ // ? self.onDoubleClickNode.emit({
801
+ // left: e?.['Wr']?.x,
802
+ // top: e?.['Wr']?.y,
803
+ // node: {
804
+ // ob: node?.ob?.nodePlantCellParent,
805
+ // },
806
+ // })
807
+ // : null;
808
+ return;
809
+ }
810
+ if (!this._initialOptions?.isReadOnly) {
811
+ this.isShowNodeInfo
812
+ ? self.onClickInfoButton.emit({
813
+ left: e?.['Wr']?.x,
814
+ top: e?.['Wr']?.y,
815
+ node: node,
816
+ })
817
+ : null;
818
+ }
819
+ },
820
+ selectionAdornmentTemplate: this.$(go.Adornment, 'Spot', this.$(go.Panel, 'Auto',
821
+ // { height: 62 },
822
+ this.$(go.Shape, { fill: null, stroke: 'dodgerblue', strokeWidth: 4 }), this.$(go.Placeholder,
823
+ // { padding: new go.Margin(8, 3, 0, 3) },
824
+ new go.Binding('padding', '', (x) => {
825
+ return x?.isTypeInflowOfPlantCell
826
+ ? x?.flowOfPlantCell === ATO_ENUM_FLOW_DIRECTION.INFLOW
827
+ ? new go.Margin(0, 0, 0, 20)
828
+ : new go.Margin(0, 20, 0, 0)
829
+ : null;
830
+ })),
831
+ // this.$(go.Placeholder, { padding: 3 }),
832
+ new go.Binding('height', '', (x) => {
833
+ return x?.isTypeInflowOfPlantCell ? x?.height + 10 : null;
834
+ }), new go.Binding('width', '', (x) => {
835
+ return x?.isTypeInflowOfPlantCell ? x?.width + 12 : null;
836
+ })), this.$(go.Panel, 'Horizontal', { alignment: go.Spot.TopRight, alignmentFocus: go.Spot.Bottom },
837
+ // more
838
+ !this._initialOptions.isReadOnly
839
+ ? this.generateActionGroup([
840
+ AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
841
+ AtoDefaultGojsEditor.ENUM_ACTIONS.INSIGHT,
842
+ AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
843
+ AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
844
+ ])
845
+ : {})),
846
+ }, new go.Binding('fromSpot', 'fromSpot'), new go.Binding('toSpot', 'toSpot'), new go.Binding('movable', 'movable'), new go.Binding('selectable', 'selectable'), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify),
847
+ // new go.Binding('alignment', 'alignment', function(loc) {
848
+ // return new go.Spot(0, 0, loc.x, 0);
849
+ // }).ofObject(),
850
+ this.$(go.Panel, 'Auto', {
851
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
852
+ margin: 2,
853
+ }, new go.Binding('text', '', function (data) {
854
+ if (!self._initialOptions.isReadOnly) {
855
+ return data?.name ?? VALUE_NA;
856
+ }
857
+ if (data?.value === VALUE_NA || _.isNil(data?.value)) {
858
+ return NO_DATA;
859
+ // return TEXT_UNKNOWN;
860
+ }
861
+ return _.round(data?.value, 2).toFixed(2);
862
+ }).makeTwoWay())),
863
+ }, this.$(go.Panel, 'Table', this.arrowForPlantCell(size, ATO_ENUM_FLOW_DIRECTION.OUTFLOW), this.$(go.Panel, 'Auto',
864
+ // { width: size.w, height: size.h },
865
+ {
866
+ // minSize: new go.Size(size.w, size.h),
867
+ // maxSize: new go.Size(size.w, size.h),
868
+ desiredSize: new go.Size(size.w, size.h),
869
+ column: 1,
870
+ row: 2,
871
+ }, new go.Binding('width', 'width'), new go.Binding('height', 'height'), this.$(go.Shape, 'RoundedRectangle', {
872
+ fill: GojsEditorModel.ENUM_COLORS.LIGHT_BLUE,
873
+ stroke: GojsEditorModel.ENUM_COLORS.LINK_WATER,
874
+ name: 'textNodeShape',
875
+ }, new go.Binding('fill', 'fill'), new go.Binding('stroke', 'stroke')), this.$(go.Panel, 'Vertical', this.$(go.Panel, 'Horizontal', { alignment: go.Spot.Center },
876
+ // Alert
877
+ this.$(go.Panel, 'Auto', {
878
+ margin: new go.Margin(0, 0, 0, 5),
879
+ visible: false,
880
+ }, new go.Binding('visible', 'recommendation'), this.$(go.Shape, 'Circle', {
881
+ fill: '#E95F47',
882
+ stroke: '#E95F47',
883
+ width: 15,
884
+ height: 15,
885
+ }), this.$(go.TextBlock, {
886
+ text: '\uf649',
887
+ margin: new go.Margin(1.5, 0, 0, 0),
888
+ font: '8px "Font Awesome 6 Pro"',
889
+ stroke: '#fff',
890
+ })), this._initialOptions.isReadOnly
891
+ ? this.$(go.Panel, 'Position', {
892
+ width: 18,
893
+ height: 15,
894
+ visible: false,
895
+ alignment: go.Spot.Center,
896
+ margin: new go.Margin(0, 0, 0, 5),
897
+ mouseEnter: (e, obj) => {
898
+ self.onHoverAlert.emit({
899
+ left: e?.['Wr']?.x + 8,
900
+ top: e?.['Wr']?.y,
901
+ messageAlert: obj.part?.ob?.messageAlert,
902
+ });
903
+ },
904
+ mouseLeave: (e, obj) => {
905
+ self.onHoverAlert.emit(null);
906
+ },
907
+ }, new go.Binding('visible', 'alert'), this.$(go.Picture, ICON_ALERT, {
908
+ alignment: go.Spot.Center,
909
+ maxSize: new go.Size(30, 30),
910
+ imageStretch: go.GraphObject.Uniform,
911
+ }))
912
+ : ''), this.$(go.Panel, 'Auto', this.$(go.TextBlock, {
913
+ name: 'textBlockValue',
914
+ row: 2,
915
+ editable: false,
916
+ desiredSize: new go.Size(size.w - 8, 18),
917
+ font: 'bold 22px Arial',
918
+ textAlign: 'center',
919
+ stroke: GojsEditorModel.ENUM_COLORS.GRAY,
920
+ overflow: go.TextBlock.OverflowEllipsis,
921
+ },
922
+ // new go.Binding('editable', 'isEditable'),
923
+ new go.Binding('angle', 'angle'), new go.Binding('margin', '', (data) => {
924
+ if (data?.alert) {
925
+ return new go.Margin(0, 0, 0, 0);
926
+ }
927
+ return new go.Margin(0, 0, 0, 0);
928
+ }), new go.Binding('stroke', 'color'), new go.Binding('text', '', function (data) {
929
+ return self.getTextDataBox(data);
930
+ }).makeTwoWay(), new go.Binding('visible', '', (data) => !data?.isHiddenValue)))), this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, false, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, false), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false)), this.arrowForPlantCell(size, ATO_ENUM_FLOW_DIRECTION.INFLOW))));
931
+ this.myDiagram.nodeTemplateMap.set(GojsEditorModel.ENUM_TEMPLATES.TEXT_NODE, node);
932
+ }
933
+ arrowForPlantCell(size, flowDirection) {
934
+ return this.$(go.Panel, 'Table', {
935
+ height: size.h,
936
+ }, new go.Binding('height', 'height'), new go.Binding('visible', '', (data) => data?.flowOfPlantCell === flowDirection), {
937
+ column: flowDirection === ATO_ENUM_FLOW_DIRECTION.OUTFLOW ? 0 : 2,
938
+ row: 2,
939
+ }, new go.Binding('itemArray', 'dataLinkArray'), {
940
+ itemTemplate: this.$(go.Panel, new go.Binding('row', 'indexRow'),
941
+ // new go.Binding('height', 'height'),
942
+ this.$(go.Picture, ARROW, {
943
+ alignment: go.Spot.Center,
944
+ maxSize: new go.Size(20, 40),
945
+ // imageStretch: go.GraphObject.Uniform,
946
+ }, new go.Binding('source', '', (data, panel) => {
947
+ // panel.part?.data?.id
948
+ return data?.isCreated ? panel?.$p : ARROW_GRAY;
949
+ }))),
950
+ });
951
+ }
952
+ getTextDataBox(data) {
953
+ if (data?.value === VALUE_NA) {
954
+ return TEXT_UNKNOWN;
955
+ }
956
+ return `${data?.shortenedNumber}${data?.unitPrefixes ? ' ' + data?.unitPrefixes : ''}`;
957
+ }
958
+ makeDataBoxTemplate(size = { w: GojsEditorModel.GRID_SIZE * 5, h: GojsEditorModel.GRID_SIZE * 5 }) {
959
+ const self = this;
960
+ let node = this.$(go.Node, 'Spot', {
961
+ locationSpot: go.Spot.Center,
962
+ mouseOver: function (e, obj) { },
963
+ click: (e, obj) => {
964
+ if (obj?.data?.onSelected) {
965
+ obj?.data?.onSelected(obj?.data);
966
+ }
967
+ },
968
+ selectionChanged: (e) => {
969
+ if (!e.isSelected && e?.data?.onSelected) {
970
+ e?.data?.onSelected(null);
971
+ }
972
+ },
973
+ }, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', this.$(go.Panel, 'Table', {
974
+ mouseHover: (e, obj) => {
975
+ if (obj.part?.ob?.value === VALUE_NA) {
976
+ self.onHoverInfoButton.emit({
977
+ left: e?.['Wr']?.x + 8,
978
+ top: e?.['Wr']?.y,
979
+ node: node,
980
+ });
981
+ }
982
+ },
983
+ mouseLeave: (e, obj) => {
984
+ if (obj.part?.ob?.value === VALUE_NA) {
985
+ self.onHoverInfoButton.emit(null);
986
+ }
987
+ },
988
+ }, this.$(go.Panel, 'Auto', { row: 0, stretch: go.GraphObject.Horizontal }, this.$(go.Shape, 'Rectangle', {
989
+ fill: GojsEditorModel.ENUM_COLORS.LIGHT_BLUE,
990
+ stroke: GojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
991
+ }, new go.Binding('fill', 'color')), this.$(go.TextBlock, {
992
+ row: 0,
993
+ margin: new go.Margin(10, 10, 5, 10),
994
+ maxSize: new go.Size(size.w, NaN),
995
+ stroke: 'white',
996
+ font: 'normal 10pt Arial',
997
+ textAlign: 'center',
998
+ spacingBelow: 5,
999
+ }, new go.Binding('text', 'name').makeTwoWay())), this.$(go.Panel, 'Auto', { row: 1, stretch: go.GraphObject.Horizontal }, this.$(go.Shape, 'Rectangle', {
1000
+ fill: GojsEditorModel.ENUM_COLORS.LIGHT_BLUE,
1001
+ stroke: GojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
1002
+ }), this.$(go.Panel, 'Horizontal', this.$(go.TextBlock, {
1003
+ row: 2,
1004
+ // editable: true,
1005
+ // maxSize: new go.Size(size.w - 10, 40),
1006
+ // minSize: new go.Size(size.w - 10, size.h),
1007
+ margin: new go.Margin(5, 0, 5, 5),
1008
+ font: 'bold 12pt Arial',
1009
+ textAlign: 'center',
1010
+ stroke: GojsEditorModel.ENUM_COLORS.GRAY,
1011
+ }, new go.Binding('editable', 'isEditable'), new go.Binding('text', 'shortenedNumber').makeTwoWay(), new go.Binding('stroke', 'color'), new go.Binding('visible', '', function (data) {
1012
+ return data.value !== VALUE_NA;
1013
+ })), this.$(go.TextBlock, {
1014
+ row: 2,
1015
+ // editable: true,
1016
+ // maxSize: new go.Size(size.w - 10, 40),
1017
+ // minSize: new go.Size(size.w - 10, size.h),
1018
+ margin: new go.Margin(5, 5, 5, 0),
1019
+ font: 'bold 12pt Arial',
1020
+ textAlign: 'center',
1021
+ stroke: GojsEditorModel.ENUM_COLORS.GRAY,
1022
+ }, new go.Binding('visible', '', function (data) {
1023
+ return data.value !== VALUE_NA;
1024
+ }), new go.Binding('text', 'unitPrefixes'), new go.Binding('stroke', 'color')),
1025
+ // Icon Err when lack of value
1026
+ this.$(go.TextBlock, {
1027
+ margin: new go.Margin(10, 10, 10, 10),
1028
+ text: VALUE_NA,
1029
+ textAlign: 'center',
1030
+ font: 'bold 10pt sans-serif',
1031
+ stroke: GojsEditorModel.ENUM_COLORS.SALMON,
1032
+ wrap: go.TextBlock.WrapFit,
1033
+ editable: false,
1034
+ isMultiline: false,
1035
+ }, new go.Binding('visible', '', function (data) {
1036
+ return data.value === VALUE_NA;
1037
+ })))))), this.$(go.Panel, 'Vertical', {
1038
+ alignment: go.Spot.Left,
1039
+ alignmentFocus: new go.Spot(0, 0.5, 8, 0),
1040
+ }), this.$(go.Panel, 'Vertical', {
1041
+ alignment: go.Spot.Right,
1042
+ alignmentFocus: new go.Spot(1, 0.5, -8, 0),
1043
+ }),
1044
+ // four named ports, one on each side:
1045
+ this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, true, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, true), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false));
1046
+ this.myDiagram.nodeTemplateMap.set(GojsEditorModel.ENUM_TEMPLATES.DATA_BOX, node);
1047
+ }
1048
+ showPoint(loc) {
1049
+ const docLoc = this.myDiagram.transformDocToView(loc);
1050
+ }
1051
+ makeEntityTemplate(icon, title, size = { w: GojsEditorModel.GRID_SIZE * 5, h: GojsEditorModel.GRID_SIZE * 5 }) {
1052
+ const self = this;
1053
+ let node = this.$(go.Node, 'Spot', {
1054
+ locationSpot: go.Spot.Center,
1055
+ mouseOver: function (e, obj) {
1056
+ // self.showPoint(obj?.part?.location);
1057
+ },
1058
+ click: (e, obj) => {
1059
+ if (obj?.data?.onSelected) {
1060
+ obj?.data?.onSelected(obj?.data);
1061
+ self.onClickCompoent.emit({
1062
+ left: e?.['Wr']?.x,
1063
+ top: e?.['Wr']?.y,
1064
+ node: node,
1065
+ component: obj?.data,
1066
+ });
1067
+ }
1068
+ },
1069
+ selectionChanged: (e) => {
1070
+ if (!e.isSelected && e?.data?.onSelected) {
1071
+ e?.data?.onSelected(null);
1072
+ }
1073
+ },
1074
+ selectionAdornmentTemplate: this._initialOptions.isReadOnly
1075
+ ? null
1076
+ : this.$(go.Adornment, 'Spot', {
1077
+ shadowVisible: true,
1078
+ shadowBlur: 6,
1079
+ shadowOffset: new go.Point(0, 2),
1080
+ shadowColor: '#00000029',
1081
+ }, this.$(go.Panel, 'Auto', this.$(go.Shape, { fill: null, stroke: 'dodgerblue', strokeWidth: 4 }), this.$(go.Placeholder, { padding: 3 })), this.$(go.Panel, 'Horizontal', {
1082
+ alignment: go.Spot.TopRight,
1083
+ alignmentFocus: go.Spot.Bottom,
1084
+ background: 'white',
1085
+ },
1086
+ // more
1087
+ !this._initialOptions.isReadOnly
1088
+ ? this.generateActionGroup(title ===
1089
+ GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.RO_WATER_TREATMENT].name
1090
+ ? [
1091
+ AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
1092
+ AtoDefaultGojsEditor.ENUM_ACTIONS.FLOW_DETAILS,
1093
+ AtoDefaultGojsEditor.ENUM_ACTIONS.ASSET_PARAMETERS,
1094
+ AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
1095
+ AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
1096
+ ]
1097
+ : [
1098
+ AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
1099
+ AtoDefaultGojsEditor.ENUM_ACTIONS.DETAILS,
1100
+ AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
1101
+ AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
1102
+ ])
1103
+ : {})),
1104
+ },
1105
+ // new go.Binding('location', 'loc', go.Point.parse),
1106
+ new go.Binding('movable', 'movable'), new go.Binding('selectable', 'selectable'), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'RoundedRectangle', {
1107
+ fill: 'white',
1108
+ stroke: GojsEditorModel.ENUM_COLORS.LINK_WATER,
1109
+ strokeWidth: 1,
1110
+ // strokeDashArray: [5, 5],
1111
+ }), this.$(go.Panel, 'Table', this.$(go.Picture, icon, {
1112
+ row: 1,
1113
+ alignment: go.Spot.Center,
1114
+ desiredSize: new go.Size(size.w - 20, size.h - 50),
1115
+ // maxSize: new go.Size(60, 60),
1116
+ imageStretch: go.GraphObject.Uniform,
1117
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
1118
+ margin: 4,
1119
+ text: title,
1120
+ })),
1121
+ }), this.$(go.TextBlock, {
1122
+ row: 2,
1123
+ margin: new go.Margin(10, 0, 3, 0),
1124
+ editable: true,
1125
+ desiredSize: new go.Size(size.w - 20, 15),
1126
+ stroke: '#000D42',
1127
+ font: 'bold 10pt Arial',
1128
+ textAlign: 'center',
1129
+ // wrap: go.TextBlock.None,
1130
+ overflow: go.TextBlock.OverflowEllipsis,
1131
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, { margin: 4 }, new go.Binding('text', 'name'))),
1132
+ }, new go.Binding('text', 'name').makeTwoWay(), new go.Binding('editable', '', (data) => {
1133
+ return !(GojsEditorModel.TYPE_COMPONENT_WATER?.includes(data?.systemType) &&
1134
+ data?.topologyType !== ATO_ECOMPONENT_PLANT_TYPE.WATER &&
1135
+ data?.topologyType !== ATO_ECOMPONENT_PLANT_TYPE.WATER_PLANT_CELL);
1136
+ })))), this.$(go.Panel, 'Vertical', {
1137
+ alignment: go.Spot.Left,
1138
+ alignmentFocus: new go.Spot(0, 0.5, 8, 0),
1139
+ }), this.$(go.Panel, 'Vertical', {
1140
+ alignment: go.Spot.Right,
1141
+ alignmentFocus: new go.Spot(1, 0.5, -8, 0),
1142
+ }), this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, false, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, false), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false));
1143
+ this.myDiagram.nodeTemplateMap.set(title, node);
1144
+ }
1145
+ makeEntityTemplateEnergy(icon, title, size = { w: GojsEditorModel.GRID_SIZE * 5, h: GojsEditorModel.GRID_SIZE * 5 }) {
1146
+ const self = this;
1147
+ let node = this.$(go.Node, 'Spot', {
1148
+ locationSpot: go.Spot.Center,
1149
+ mouseOver: function (e, obj) {
1150
+ // self.showPoint(obj?.part?.location);
1151
+ },
1152
+ click: (e, obj) => {
1153
+ if (obj?.data?.onSelected) {
1154
+ obj?.data?.onSelected(obj?.data);
1155
+ }
1156
+ },
1157
+ selectionChanged: (e) => {
1158
+ if (!e.isSelected && e?.data?.onSelected) {
1159
+ e?.data?.onSelected(null);
1160
+ }
1161
+ },
1162
+ selectionAdornmentTemplate: this._initialOptions.isReadOnly
1163
+ ? null
1164
+ : this.$(go.Adornment, 'Spot', {
1165
+ shadowVisible: true,
1166
+ shadowBlur: 6,
1167
+ shadowOffset: new go.Point(0, 2),
1168
+ shadowColor: '#00000029',
1169
+ }, this.$(go.Panel, 'Auto', this.$(go.Shape, { fill: null, stroke: 'dodgerblue', strokeWidth: 4 }), this.$(go.Placeholder, { padding: 3 })), this.$(go.Panel, 'Horizontal', {
1170
+ alignment: go.Spot.TopRight,
1171
+ alignmentFocus: go.Spot.Bottom,
1172
+ background: 'white',
1173
+ },
1174
+ // more
1175
+ this.generateActionGroup([
1176
+ AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
1177
+ AtoDefaultGojsEditor.ENUM_ACTIONS.DETAILS,
1178
+ AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
1179
+ AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
1180
+ ]))),
1181
+ }, new go.Binding('movable', 'movable'), new go.Binding('selectable', 'selectable'), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'RoundedRectangle', {
1182
+ fill: 'white',
1183
+ stroke: GojsEditorModel.ENUM_COLORS.LINK_WATER,
1184
+ // strokeDashArray: [5, 5],
1185
+ }), this.$(go.Panel, 'Table', this.$(go.TextBlock, title, {
1186
+ row: 0,
1187
+ margin: new go.Margin(3, 3, 10, 3),
1188
+ maxSize: new go.Size(size.w - 20, 15),
1189
+ stroke: '#444444',
1190
+ font: 'normal 10pt Arial',
1191
+ textAlign: 'center',
1192
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
1193
+ margin: 4,
1194
+ text: title,
1195
+ })),
1196
+ }), this.$(go.Picture, icon, {
1197
+ row: 1,
1198
+ alignment: go.Spot.Center,
1199
+ desiredSize: new go.Size(size.w - 20, size.h - 65),
1200
+ imageStretch: go.GraphObject.Uniform,
1201
+ }), this.$(go.TextBlock, {
1202
+ row: 2,
1203
+ margin: new go.Margin(10, 3, 3, 3),
1204
+ editable: true,
1205
+ maxSize: new go.Size(size.w - 20, 15),
1206
+ stroke: '#2C2C2C',
1207
+ font: 'bold 10pt Arial',
1208
+ textAlign: 'center',
1209
+ // wrap: go.TextBlock.None,
1210
+ overflow: go.TextBlock.OverflowEllipsis,
1211
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
1212
+ margin: 4,
1213
+ }, new go.Binding('text', 'name').makeTwoWay())),
1214
+ }, new go.Binding('text', 'name').makeTwoWay()))), this.$(go.Panel, 'Vertical', {
1215
+ alignment: go.Spot.Left,
1216
+ alignmentFocus: new go.Spot(0, 0.5, 8, 0),
1217
+ }), this.$(go.Panel, 'Vertical', {
1218
+ alignment: go.Spot.Right,
1219
+ alignmentFocus: new go.Spot(1, 0.5, -8, 0),
1220
+ }),
1221
+ // four named ports, one on each side:
1222
+ this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, false, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, false), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false));
1223
+ this.myDiagram.nodeTemplateMap.set(title, node);
1224
+ }
1225
+ // Plant Cell
1226
+ plantCellTemplate(icon, title, size = { w: 260, h: GojsEditorModel.PLANT_CELL_HEIGHT }) {
1227
+ const self = this;
1228
+ let node = this.$(go.Group, 'Spot', {
1229
+ locationSpot: go.Spot.Center,
1230
+ mouseOver: function (e, obj) {
1231
+ // self.showPoint(obj?.part?.location);
1232
+ },
1233
+ mouseEnter: (e, obj) => {
1234
+ // self.onHoverAlert.emit({
1235
+ // left: e?.['Wr']?.x + 8,
1236
+ // top: e?.['Wr']?.y,
1237
+ // messageAlert: (obj as any).part?.ob?.messageAlert,
1238
+ // });
1239
+ const node = obj.part;
1240
+ self.onHoverInfoButton.emit({
1241
+ left: e?.['Wr']?.x + 8,
1242
+ top: e?.['Wr']?.y,
1243
+ node: node,
1244
+ });
1245
+ let shape = node?.findObject('SHAPE_KEY'); // Thay 'SHAPE_KEY' bằng khóa bạn đặt cho hình Shape
1246
+ // debugger;
1247
+ if (shape) {
1248
+ shape.stroke = 'blue'; // Thay đổi màu stroke thành blue
1249
+ }
1250
+ },
1251
+ mouseLeave: (e, obj) => {
1252
+ self.onHoverInfoButton.emit(null);
1253
+ // self.onHoverAlert.emit(null);
1254
+ },
1255
+ click: (e, obj) => {
1256
+ if (obj?.data?.onSelected) {
1257
+ obj?.data?.onSelected(obj?.data);
1258
+ self.onClickCompoent.emit({
1259
+ left: e?.['Wr']?.x,
1260
+ top: e?.['Wr']?.y,
1261
+ node: node,
1262
+ component: obj?.data,
1263
+ });
1264
+ }
1265
+ },
1266
+ doubleClick: (e, obj) => {
1267
+ if (!this._initialOptions?.isReadOnly) {
1268
+ const node = obj.part;
1269
+ this.isShowNodeInfo
1270
+ ? self.onDoubleClickNode.emit({
1271
+ left: e?.['Wr']?.x,
1272
+ top: e?.['Wr']?.y,
1273
+ node: node,
1274
+ })
1275
+ : null;
1276
+ }
1277
+ },
1278
+ // Todo
1279
+ selectionChanged: (e) => {
1280
+ if (!e.isSelected && e?.data?.onSelected) {
1281
+ e?.data?.onSelected(null);
1282
+ }
1283
+ },
1284
+ selectionAdornmentTemplate: this._initialOptions.isReadOnly
1285
+ ? null
1286
+ : this.$(go.Adornment, 'Spot', {
1287
+ shadowVisible: true,
1288
+ shadowBlur: 6,
1289
+ shadowOffset: new go.Point(0, 2),
1290
+ shadowColor: '#00000029',
1291
+ }, this.$(go.Panel, 'Auto', { width: 170 }, this.$(go.Shape, { fill: null, stroke: 'dodgerblue', strokeWidth: 4 }), this.$(go.Placeholder, { padding: 3 })), this.$(go.Panel, 'Horizontal', { alignment: go.Spot.TopRight, alignmentFocus: go.Spot.Bottom },
1292
+ // more
1293
+ this.generateActionGroup([
1294
+ AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
1295
+ AtoDefaultGojsEditor.ENUM_ACTIONS.CHANGE_ICON,
1296
+ AtoDefaultGojsEditor.ENUM_ACTIONS.ONLY_DETAILS,
1297
+ // DefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
1298
+ AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
1299
+ ]))),
1300
+ }, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h },
1301
+ // this.$(go.Shape, 'RoundedRectangle', {
1302
+ // fill: 'white',
1303
+ // stroke: GojsEditorModel.ENUM_COLORS.LINK_WATER,
1304
+ // // strokeDashArray: [5, 5],
1305
+ // }),
1306
+ // this.$(go.Placeholder, { padding: new go.Margin(0, 0, 0, 0), visible: false }),
1307
+ this.$(go.Panel, 'Auto', {
1308
+ alignmentFocus: go.Spot.Center,
1309
+ margin: new go.Margin(0, 50, 0, 50),
1310
+ }, this.$(go.Shape, 'RoundedRectangle', {
1311
+ fill: 'white',
1312
+ stroke: GojsEditorModel.ENUM_COLORS.LINK_WATER,
1313
+ strokeDashArray: [5, 5],
1314
+ }), this.$(go.Panel, 'Table', this.$(go.TextBlock, title, {
1315
+ row: 0,
1316
+ margin: new go.Margin(3, 0, 10, 0),
1317
+ desiredSize: new go.Size(size.w - 20, 15),
1318
+ stroke: '#444444',
1319
+ font: 'normal 10pt Arial',
1320
+ textAlign: 'center',
1321
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
1322
+ margin: 4,
1323
+ text: title,
1324
+ })),
1325
+ }), this.$(go.Picture, icon, {
1326
+ row: 1,
1327
+ alignment: go.Spot.Center,
1328
+ desiredSize: new go.Size(size.w - 20, size.h - 65),
1329
+ imageStretch: go.GraphObject.Uniform,
1330
+ }, new go.Binding('source', 'pathImage', (x) => x ?? GojsEditorModel.NODE_TEMPLATES[GojsEditorModel.ENUM_TEMPLATES.PLANT_CELL].icon)), this.$(go.TextBlock, {
1331
+ row: 2,
1332
+ margin: new go.Margin(10, 0, 3, 0),
1333
+ editable: true,
1334
+ desiredSize: new go.Size(size.w - 20, 15),
1335
+ stroke: '#2C2C2C',
1336
+ font: 'bold 10pt Arial',
1337
+ textAlign: 'center',
1338
+ // wrap: go.TextBlock.None,
1339
+ overflow: go.TextBlock.OverflowEllipsis,
1340
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
1341
+ margin: 4,
1342
+ }, new go.Binding('text', 'name').makeTwoWay())),
1343
+ }, new go.Binding('text', 'name').makeTwoWay())))), this.$(go.Panel, 'Vertical', {
1344
+ alignment: go.Spot.Left,
1345
+ alignmentFocus: new go.Spot(0, 0.5, 8, 0),
1346
+ }), this.$(go.Panel, 'Vertical', {
1347
+ alignment: go.Spot.Right,
1348
+ alignmentFocus: new go.Spot(1, 0.5, -8, 0),
1349
+ }));
1350
+ this.myDiagram.nodeTemplateMap.set(title, node);
1351
+ }
1352
+ makeEntityWithdrawOrDischarge(icon, title, size = { w: GojsEditorModel.GRID_SIZE * 5, h: GojsEditorModel.GRID_SIZE * 5 }) {
1353
+ const self = this;
1354
+ let node = this.$(go.Node, 'Spot', {
1355
+ locationSpot: go.Spot.Center,
1356
+ mouseOver: function (e, obj) {
1357
+ // self.showPoint(obj?.part?.location);
1358
+ },
1359
+ click: (e, obj) => {
1360
+ if (obj?.data?.onSelected) {
1361
+ obj?.data?.onSelected(obj?.data);
1362
+ }
1363
+ },
1364
+ selectionChanged: (e) => {
1365
+ if (!e.isSelected && e?.data?.onSelected) {
1366
+ e?.data?.onSelected(null);
1367
+ }
1368
+ },
1369
+ selectionAdornmentTemplate: this._initialOptions.isReadOnly
1370
+ ? null
1371
+ : this.$(go.Adornment, 'Spot', this.$(go.Panel, 'Auto', this.$(go.Shape, { fill: null, stroke: 'dodgerblue', strokeWidth: 4 }), this.$(go.Placeholder, { padding: 3 })), this.$(go.Panel, 'Horizontal', { alignment: go.Spot.TopRight, alignmentFocus: go.Spot.Bottom }, this.generateActionGroup([
1372
+ AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
1373
+ AtoDefaultGojsEditor.ENUM_ACTIONS.DETAILS,
1374
+ AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
1375
+ AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
1376
+ ]))),
1377
+ },
1378
+ // new go.Binding('location', 'loc', go.Point.parse),
1379
+ new go.Binding('movable', 'movable'), new go.Binding('selectable', 'selectable'), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'RoundedRectangle', {
1380
+ fill: 'white',
1381
+ stroke: GojsEditorModel.ENUM_COLORS.LINK_WATER,
1382
+ // strokeDashArray: [5, 5],
1383
+ }), this.$(go.Panel, 'Table',
1384
+ // this.$(go.TextBlock, title, {
1385
+ // row: 0,
1386
+ // margin: new go.Margin(3, 3, 10, 3),
1387
+ // maxSize: new go.Size(size.w - 20, NaN),
1388
+ // stroke: '#444444',
1389
+ // font: 'normal 10pt Arial',
1390
+ // textAlign: 'center',
1391
+ // }),
1392
+ this.$(go.Picture, icon, {
1393
+ row: 1,
1394
+ alignment: go.Spot.Center,
1395
+ desiredSize: new go.Size(size.w - 20, size.h - 50),
1396
+ imageStretch: go.GraphObject.Uniform,
1397
+ }), this.$(go.TextBlock, {
1398
+ row: 2,
1399
+ margin: new go.Margin(10, 0, 3, 0),
1400
+ editable: true,
1401
+ desiredSize: new go.Size(size.w - 20, 15),
1402
+ stroke: '#000D42',
1403
+ font: 'bold 10pt Arial',
1404
+ textAlign: 'center',
1405
+ // wrap: go.TextBlock.None,
1406
+ overflow: go.TextBlock.OverflowEllipsis,
1407
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
1408
+ margin: 4,
1409
+ }, new go.Binding('text', 'name').makeTwoWay())),
1410
+ }, new go.Binding('text', 'name').makeTwoWay()))), this.$(go.Panel, 'Vertical', {
1411
+ alignment: go.Spot.Left,
1412
+ alignmentFocus: new go.Spot(0, 0.5, 8, 0),
1413
+ }), this.$(go.Panel, 'Vertical', {
1414
+ alignment: go.Spot.Right,
1415
+ alignmentFocus: new go.Spot(1, 0.5, -8, 0),
1416
+ }),
1417
+ // four named ports, one on each side:
1418
+ this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, false, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, false), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false));
1419
+ this.myDiagram.nodeTemplateMap.set(title, node);
1420
+ }
1421
+ editTextGroupZone(e, button) {
1422
+ const nodeGroup = button.part.adornedPart;
1423
+ const diagram = nodeGroup.diagram;
1424
+ e.diagram.commandHandler.editTextBlock(nodeGroup.findObject('TEXTBLOCK'));
1425
+ }
1426
+ editText(e, button) {
1427
+ const node = button.part.adornedPart;
1428
+ e.diagram.commandHandler.editTextBlock(node.findObject('TEXTBLOCK'));
1429
+ }
1430
+ async dragNewNode(e, button) {
1431
+ const tool = e.diagram.toolManager.draggingTool;
1432
+ if (tool.isBeyondDragSize()) {
1433
+ const data = button._dragData;
1434
+ if (!data)
1435
+ return;
1436
+ e.diagram.startTransaction('button drag'); // see doDeactivate, below
1437
+ const fromnode = button.part.adornedPart;
1438
+ const diagram = fromnode.diagram;
1439
+ const model = diagram.model;
1440
+ const nodedata = { ...model.copyNodeData(data), key: UtilsService.generateUUID() };
1441
+ model.addNodeData(nodedata);
1442
+ const newnode = diagram.findNodeForData(nodedata);
1443
+ const linkdata = model.copyLinkData({});
1444
+ model.setFromKeyForLinkData(linkdata, model.getKeyForNodeData(fromnode.data));
1445
+ model.setToKeyForLinkData(linkdata, model.getKeyForNodeData(newnode.data));
1446
+ model.addLinkData(linkdata);
1447
+ diagram.select(newnode);
1448
+ // this.createNodeAndLink(data, button.part.adornedPart);
1449
+ newnode.location = e.diagram.lastInput.documentPoint;
1450
+ // don't commitTransaction here, but in tool.doDeactivate, after drag operation finished
1451
+ // set tool.currentPart to a selected movable Part and then activate the DraggingTool
1452
+ tool.currentPart = newnode;
1453
+ e.diagram.currentTool = tool;
1454
+ tool.doActivate();
1455
+ }
1456
+ }
1457
+ addItemOnGroupZone(e, button) {
1458
+ const data = button._dragData;
1459
+ if (!data)
1460
+ return;
1461
+ e.diagram.startTransaction('Add Item On Group Zone');
1462
+ const fromnode = button.part.adornedPart;
1463
+ const dragData = button._dragData;
1464
+ const diagram = fromnode.diagram;
1465
+ const model = diagram.model;
1466
+ const nodedata = model.copyNodeData(dragData);
1467
+ model.addNodeData({
1468
+ ...nodedata,
1469
+ type: 'SubSystem',
1470
+ name: '[Title...]',
1471
+ nameItem: '[Name...]',
1472
+ group: fromnode?.ob?.key,
1473
+ });
1474
+ e.diagram.commitTransaction('Add Item On Group Zone');
1475
+ // const newnode = diagram.findNodeForData(nodedata);
1476
+ // const linkdata = model.copyLinkData({});
1477
+ // model.setFromKeyForLinkData(linkdata, model.getKeyForNodeData(fromnode.data));
1478
+ // model.setToKeyForLinkData(linkdata, model.getKeyForNodeData(newnode.data));
1479
+ // model.addLinkData(linkdata);
1480
+ // diagram.select(newnode);
1481
+ // newnode.location = new go.Point(fromnode.location.x + 200, fromnode.location.y);
1482
+ // e.diagram.commitTransaction('Create Node and Link');
1483
+ }
1484
+ generateActionGroup(actions) {
1485
+ const self = this;
1486
+ return this.$('Button', {
1487
+ click: function (e, obj) {
1488
+ self.openActionMenu();
1489
+ const filteredActions = _.filter(obj.part?.['ob']?.actions ?? actions, (action) => {
1490
+ // Filter Insight button
1491
+ if (action === AtoDefaultGojsEditor.ENUM_ACTIONS.INSIGHT) {
1492
+ return !!obj.part?.['ob']?.id;
1493
+ }
1494
+ if (action === AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME &&
1495
+ obj.part?.['ob']?.type !== GojsEditorModel.ENUM_TEMPLATES.TEXT_NODE &&
1496
+ GojsEditorModel.TYPE_COMPONENT_WATER?.includes(obj.part?.['ob']?.systemType) &&
1497
+ obj.part?.['ob']?.topologyType !== ATO_ECOMPONENT_PLANT_TYPE.WATER &&
1498
+ obj.part?.['ob']?.topologyType !== ATO_ECOMPONENT_PLANT_TYPE.WATER_PLANT_CELL) {
1499
+ return false;
1500
+ }
1501
+ return true;
1502
+ }).map((e) => {
1503
+ if (ATO_ECOMPONENT_PLANT_TYPE.STEAM === obj.part?.['ob']?.topologyType &&
1504
+ e === AtoDefaultGojsEditor.ENUM_ACTIONS.INSIGHT) {
1505
+ return AtoDefaultGojsEditor.ENUM_ACTIONS.DATA_MAPPING;
1506
+ }
1507
+ return e;
1508
+ });
1509
+ self.actions = filteredActions.map((action) => {
1510
+ let onClickFn = () => { };
1511
+ switch (action) {
1512
+ case AtoDefaultGojsEditor.ENUM_ACTIONS.INSIGHT:
1513
+ case AtoDefaultGojsEditor.ENUM_ACTIONS.DATA_MAPPING:
1514
+ onClickFn = () => {
1515
+ self.onOpenInsightMapping.emit({
1516
+ node: obj.part,
1517
+ });
1518
+ };
1519
+ break;
1520
+ case AtoDefaultGojsEditor.ENUM_ACTIONS.DETAILS:
1521
+ case AtoDefaultGojsEditor.ENUM_ACTIONS.FLOW_DETAILS:
1522
+ onClickFn = () => {
1523
+ self.onOpenDetail.emit({
1524
+ node: obj.part,
1525
+ });
1526
+ };
1527
+ break;
1528
+ case AtoDefaultGojsEditor.ENUM_ACTIONS.ONLY_DETAILS:
1529
+ onClickFn = () => {
1530
+ self.onOpenDetail.emit({
1531
+ node: obj.part,
1532
+ });
1533
+ };
1534
+ break;
1535
+ case AtoDefaultGojsEditor.ENUM_ACTIONS.ASSET_PARAMETERS:
1536
+ onClickFn = () => {
1537
+ self.onOpenAssetParameter.emit({
1538
+ node: obj.part,
1539
+ });
1540
+ };
1541
+ break;
1542
+ case AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME:
1543
+ onClickFn = () => {
1544
+ if (obj.part?.data?.type === GojsEditorModel.ENUM_TEMPLATES.TEXT_NODE) {
1545
+ self.onRename.emit({
1546
+ left: e?.['Wr']?.x - 50,
1547
+ top: e?.['Wr']?.y,
1548
+ ...obj.part?.data,
1549
+ });
1550
+ // LayoutService.setToolTipComponentDataStatic({
1551
+ // component: RenameBoxComponent,
1552
+ // data: {
1553
+ // left: e?.['Wr']?.x - 50,
1554
+ // top: e?.['Wr']?.y,
1555
+ // ...obj.part?.data,
1556
+ // },
1557
+ // });
1558
+ }
1559
+ else {
1560
+ self.editText(e, obj);
1561
+ }
1562
+ };
1563
+ break;
1564
+ case AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW:
1565
+ onClickFn = () => {
1566
+ self.clickNewNode(e, _.merge(obj, {
1567
+ actionMove: self.dragNewNode,
1568
+ _dragData: {
1569
+ type: GojsEditorModel.ENUM_TEMPLATES.TEXT_NODE,
1570
+ name: `${GojsEditorModel.ACTION_RIGHT_MENU_GROUP.DATA_BOX}_${moment().valueOf()}`,
1571
+ color: GojsEditorModel.ENUM_COLORS.BLUE,
1572
+ movable: self.plantSatus === ATO_EPlantType.BASIC_PLANT ? false : null,
1573
+ isNotAllowConnect: self.plantSatus === ATO_EPlantType.BASIC_PLANT ? true : null,
1574
+ },
1575
+ }));
1576
+ };
1577
+ break;
1578
+ case AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE:
1579
+ onClickFn = () => {
1580
+ self.deleteNode(e);
1581
+ };
1582
+ break;
1583
+ case AtoDefaultGojsEditor.ENUM_ACTIONS.CHANGE_ICON:
1584
+ onClickFn = () => {
1585
+ self.onOpenChangeIcon.emit({
1586
+ node: obj.part,
1587
+ });
1588
+ };
1589
+ break;
1590
+ }
1591
+ return {
1592
+ ...AtoDefaultGojsEditor.ACTIONS[action],
1593
+ onClick: () => {
1594
+ onClickFn();
1595
+ },
1596
+ };
1597
+ });
1598
+ },
1599
+ 'ButtonBorder.strokeWidth': 0,
1600
+ 'ButtonBorder.fill': 'white',
1601
+ },
1602
+ // new go.Binding('visible', 'isNotDragNewNode', (x) => !x),
1603
+ // new go.Binding('visible', 'isNotDelete', (x) => !x),
1604
+ new go.Binding('visible', 'isNotAction', (x) => !x), this.$(go.TextBlock, {
1605
+ margin: 4,
1606
+ text: '\ue489',
1607
+ font: '20px "Font Awesome 6 Pro"',
1608
+ cursor: 'pointer',
1609
+ }));
1610
+ }
1611
+ async clickNewNode(e, button) {
1612
+ const data = button._dragData;
1613
+ if (!data)
1614
+ return;
1615
+ e.diagram.startTransaction('Create Node and Link');
1616
+ const fromnode = button.part.adornedPart;
1617
+ // this.createNodeAndLink(button._dragData, fromnode);
1618
+ const dragData = button._dragData;
1619
+ const diagram = fromnode.diagram;
1620
+ const model = diagram.model;
1621
+ const nodedata = { ...model.copyNodeData(dragData), key: UtilsService.generateUUID() };
1622
+ model.addNodeData({
1623
+ ...nodedata,
1624
+ isEditable: true,
1625
+ shortenedNumber: 0,
1626
+ isFormat: false,
1627
+ dataCollectionMethod: GojsEditorModel.DATA_COLLECTION_METHOD.MANUAL,
1628
+ color: GojsEditorModel.COLOR_COLLECTION_METHOD[GojsEditorModel.DATA_COLLECTION_METHOD.MANUAL].color,
1629
+ group: fromnode?.ob?.group,
1630
+ value: 0,
1631
+ });
1632
+ const newnode = diagram.findNodeForData(nodedata);
1633
+ const linkdata = model.copyLinkData({});
1634
+ model.setFromKeyForLinkData(linkdata, model.getKeyForNodeData(fromnode.data));
1635
+ model.setToKeyForLinkData(linkdata, model.getKeyForNodeData(newnode.data));
1636
+ model.addLinkData(linkdata);
1637
+ diagram.select(newnode);
1638
+ if (nodedata?.movable !== undefined && nodedata?.movable !== null) {
1639
+ newnode.movable = nodedata?.movable;
1640
+ }
1641
+ newnode.location = new go.Point(fromnode.location.x + 160, fromnode.location.y + this.findLocYFromnode(fromnode) * AtoDefaultGojsEditor.DISTANCE_2_OUTPUT);
1642
+ e.diagram.commitTransaction('Create Node and Link');
1643
+ }
1644
+ findLocYFromnode(fromnode) {
1645
+ // Find location auto right
1646
+ const locYFromnode = fromnode.data?.loc?.split(' ')?.[1];
1647
+ const locYAlreadyExist = [];
1648
+ fromnode.findLinksOutOf().each(function (link) {
1649
+ const targetNode = link.toNode;
1650
+ if (targetNode) {
1651
+ locYAlreadyExist.push(targetNode.data?.loc?.split(' ')?.[1] - locYFromnode);
1652
+ }
1653
+ });
1654
+ let i = 0;
1655
+ while (this.isEmptyYLoc(locYAlreadyExist, i) === null && i < 100) {
1656
+ i++;
1657
+ }
1658
+ return this.isEmptyYLoc(locYAlreadyExist, i);
1659
+ }
1660
+ isEmptyYLoc(locYAlreadyExist, i) {
1661
+ if (!_.some(locYAlreadyExist, (x) => x < i * AtoDefaultGojsEditor.DISTANCE_2_OUTPUT + AtoDefaultGojsEditor.DISTANCE_2_OUTPUT / 2 &&
1662
+ x > i * AtoDefaultGojsEditor.DISTANCE_2_OUTPUT - AtoDefaultGojsEditor.DISTANCE_2_OUTPUT / 2)) {
1663
+ return i;
1664
+ }
1665
+ if (!_.some(locYAlreadyExist, (x) => x < -i * AtoDefaultGojsEditor.DISTANCE_2_OUTPUT + AtoDefaultGojsEditor.DISTANCE_2_OUTPUT / 2 &&
1666
+ x > -i * AtoDefaultGojsEditor.DISTANCE_2_OUTPUT - AtoDefaultGojsEditor.DISTANCE_2_OUTPUT / 2)) {
1667
+ return -i;
1668
+ }
1669
+ return null;
1670
+ }
1671
+ createNewNode(newnode) {
1672
+ this.addTemplate(newnode);
1673
+ this.myDiagram.startTransaction('add group node');
1674
+ this.myDiagram.model.addNodeData(newnode);
1675
+ this.myDiagram.commitTransaction('add group node');
1676
+ }
1677
+ deleteNode(e) {
1678
+ e.diagram.startTransaction('Delete group node');
1679
+ e.diagram.removeParts(e.diagram.selection);
1680
+ e.diagram.commitTransaction('Delete group node');
1681
+ }
1682
+ deleteNodeOnDiagram(e) {
1683
+ e.startTransaction('Delete group node');
1684
+ e.removeParts(e.selection);
1685
+ e.commitTransaction('Delete group node');
1686
+ }
1687
+ insightNode(e) { }
1688
+ drawLink(e, button) {
1689
+ const node = button.part.adornedPart;
1690
+ const tool = e.diagram.toolManager.linkingTool;
1691
+ tool.startObject = node.port;
1692
+ e.diagram.currentTool = tool;
1693
+ tool.doActivate();
1694
+ }
1695
+ makePortGroup(name, align, spot, output, input) {
1696
+ const horizontal = align.equals(go.Spot.Top) || align.equals(go.Spot.Bottom);
1697
+ return this.$(go.Panel, 'Table', {
1698
+ background: '#919CA5',
1699
+ width: 40,
1700
+ height: 40,
1701
+ alignment: align,
1702
+ stretch: horizontal ? go.GraphObject.Horizontal : go.GraphObject.Vertical,
1703
+ portId: name,
1704
+ fromSpot: spot,
1705
+ fromLinkable: output,
1706
+ toSpot: spot,
1707
+ toLinkable: input,
1708
+ cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
1709
+ alignmentFocus: go.Spot.Center, // tập trung vào trung tâm của Panel
1710
+ // mouseEnter: this._initialOptions.isReadOnly
1711
+ // ? null
1712
+ // : (e, panel) => {
1713
+ // const textBlock = (panel as any)?.findObject('textBlock') as go.TextBlock | null;
1714
+ // if (textBlock) {
1715
+ // // && output
1716
+ // textBlock.visible = true;
1717
+ // switch (name) {
1718
+ // case 'B':
1719
+ // case 'R': {
1720
+ // panel.background = 'rgb(243 144 171)';
1721
+ // break;
1722
+ // }
1723
+ // case 'T':
1724
+ // case 'L': {
1725
+ // panel.background = 'rgb(103,151,207)';
1726
+ // break;
1727
+ // }
1728
+ // default: {
1729
+ // panel.background = 'rgb(243 144 171)';
1730
+ // }
1731
+ // }
1732
+ // }
1733
+ // },
1734
+ // mouseLeave: this._initialOptions.isReadOnly
1735
+ // ? null
1736
+ // : (e, panel) => {
1737
+ // const textBlock = (panel as any).findObject('textBlock') as go.TextBlock | null;
1738
+ // if (textBlock) {
1739
+ // textBlock.visible = false; // Ẩn TextBlock khi rời khỏi Panel
1740
+ // }
1741
+ // panel.background = 'transparent';
1742
+ // },
1743
+ }, this.$(go.Shape, 'Ellipse', {
1744
+ fill: 'white',
1745
+ strokeWidth: 2,
1746
+ stroke: '#919CA5',
1747
+ width: 40,
1748
+ height: 40, // Match the panel's height
1749
+ }));
1750
+ }
1751
+ makePort(name, align, spot, output, input) {
1752
+ // if (this._initialOptions.isReadOnly) {
1753
+ // return {};
1754
+ // }
1755
+ const horizontal = align.equals(go.Spot.Top) || align.equals(go.Spot.Bottom);
1756
+ // const vertical = align.equals(go.Spot.Left) || align.equals(go.Spot.Right);
1757
+ // the port is basically just a transparent rectangle that stretches along the side of the node,
1758
+ // and becomes colored when the mouse passes over it
1759
+ return this.$(go.Panel, 'Table', {
1760
+ background: 'transparent',
1761
+ width: horizontal ? NaN : 8,
1762
+ height: !horizontal ? NaN : 8,
1763
+ alignment: align,
1764
+ stretch: horizontal ? go.GraphObject.Horizontal : go.GraphObject.Vertical,
1765
+ portId: name,
1766
+ fromSpot: spot,
1767
+ fromLinkable: output,
1768
+ toSpot: spot,
1769
+ toLinkable: input,
1770
+ cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
1771
+ alignmentFocus: go.Spot.Center,
1772
+ mouseEnter: this._initialOptions.isReadOnly
1773
+ ? null
1774
+ : (e, panel) => {
1775
+ const textBlock = panel?.findObject('textBlock');
1776
+ if (textBlock) {
1777
+ // && output
1778
+ textBlock.visible = true;
1779
+ switch (name) {
1780
+ case 'B':
1781
+ case 'R': {
1782
+ panel.background = 'rgb(243 144 171)';
1783
+ break;
1784
+ }
1785
+ case 'T':
1786
+ case 'L': {
1787
+ panel.background = 'rgb(103,151,207)';
1788
+ break;
1789
+ }
1790
+ default: {
1791
+ panel.background = 'rgb(243 144 171)';
1792
+ }
1793
+ }
1794
+ }
1795
+ },
1796
+ mouseLeave: this._initialOptions.isReadOnly
1797
+ ? null
1798
+ : (e, panel) => {
1799
+ const textBlock = panel.findObject('textBlock');
1800
+ if (textBlock) {
1801
+ textBlock.visible = false; // Ẩn TextBlock khi rời khỏi Panel
1802
+ }
1803
+ panel.background = 'transparent';
1804
+ },
1805
+ }, new go.Binding('visible', '', function (data) {
1806
+ if (data?.isNotAllowConnect) {
1807
+ return false;
1808
+ }
1809
+ if (data?.selectable === false && !data?.isAllowConnect) {
1810
+ return false;
1811
+ }
1812
+ if (data?.flowOfPlantCell) {
1813
+ if (data?.flowOfPlantCell === ATO_ENUM_FLOW_DIRECTION.INFLOW && name === 'L') {
1814
+ return true;
1815
+ }
1816
+ if (data?.flowOfPlantCell === ATO_ENUM_FLOW_DIRECTION.OUTFLOW && name === 'R') {
1817
+ return true;
1818
+ }
1819
+ return false;
1820
+ }
1821
+ switch (name) {
1822
+ case 'B':
1823
+ case 'R': {
1824
+ return !data?.isNotSelectOutput;
1825
+ }
1826
+ case 'T':
1827
+ case 'L': {
1828
+ return !data?.isNotSelectInput;
1829
+ }
1830
+ default: {
1831
+ return true;
1832
+ }
1833
+ }
1834
+ }), this.$(go.TextBlock, {
1835
+ name: 'textBlock',
1836
+ margin: 4,
1837
+ text: '\uf0da',
1838
+ font: '900 12px "Font Awesome 6 Pro"',
1839
+ stroke: 'white',
1840
+ cursor: 'pointer',
1841
+ visible: false,
1842
+ }, new go.Binding('text', 'name', (_) => {
1843
+ switch (name) {
1844
+ case 'T':
1845
+ case 'B': {
1846
+ return '\uf0d7';
1847
+ }
1848
+ case 'L':
1849
+ case 'R': {
1850
+ return '\uf0da';
1851
+ }
1852
+ default: {
1853
+ return '\uf0d7';
1854
+ }
1855
+ }
1856
+ })));
1857
+ // return this.$(go.Shape, {
1858
+ // fill: 'transparent', // changed to a color in the mouseEnter event handler
1859
+ // strokeWidth: 0, // no stroke
1860
+ // width: horizontal ? NaN : 8, // if not stretching horizontally, just 8 wide
1861
+ // height: !horizontal ? NaN : 8, // if not stretching vertically, just 8 tall
1862
+ // alignment: align, // align the port on the main Shape
1863
+ // stretch: horizontal ? go.GraphObject.Horizontal : go.GraphObject.Vertical,
1864
+ // portId: name, // declare this object to be a "port"
1865
+ // fromSpot: spot, // declare where links may connect at this port
1866
+ // fromLinkable: output, // declare whether the user may draw links from here
1867
+ // toSpot: spot, // declare where links may connect at this port
1868
+ // toLinkable: input, // declare whether the user may draw links to here
1869
+ // cursor: 'pointer', // show a different cursor to indicate potential link point
1870
+ // mouseEnter: (e, port) => {
1871
+ // // the PORT argument will be this Shape
1872
+ // if (!e.diagram.isReadOnly && output) {
1873
+ // port.fill = 'rgba(255,0,255,0.5)'
1874
+ // };
1875
+ // },
1876
+ // mouseLeave: (e, port) => {
1877
+ // return (port.fill = 'transparent');
1878
+ // },
1879
+ // });
1880
+ }
1881
+ makeGroupBasicComponent(icon, title, size = { w: 80, h: 80 }) {
1882
+ let node = this.$(go.Group, 'Spot', {
1883
+ // layout: this.$(go.LayeredDigraphLayout, { direction: 0 }),
1884
+ alignment: go.Spot.Center,
1885
+ layout: this.$(go.Layout),
1886
+ movable: false,
1887
+ selectable: false,
1888
+ // movable: true,
1889
+ // selectable: true,
1890
+ dragComputation: (node, pt, gridpt) => {
1891
+ pt.x =
1892
+ Math.round(pt.x / GojsEditorModel.BASIC_GRID_SIZE_WIDTH) *
1893
+ GojsEditorModel.BASIC_GRID_SIZE_WIDTH;
1894
+ pt.y =
1895
+ Math.round(pt.y / GojsEditorModel.BASIC_GRID_SIZE_HEIGHT) *
1896
+ GojsEditorModel.BASIC_GRID_SIZE_HEIGHT;
1897
+ return pt;
1898
+ },
1899
+ }, {
1900
+ // minSize: new go.Size(GojsEditorModel.BASIC_GRID_SIZE_WIDTH, GojsEditorModel.BASIC_GRID_SIZE_HEIGHT),
1901
+ minSize: new go.Size(1, 1),
1902
+ maxSize: new go.Size(1, 1),
1903
+ // minSize: new go.Size(100, 100),
1904
+ }, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', this.$(go.Shape, 'RoundedRectangle', {
1905
+ fill: 'transparent',
1906
+ stroke: 'transparent',
1907
+ // stroke: GojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
1908
+ strokeWidth: 2,
1909
+ // strokeDashArray: [5, 5],
1910
+ })));
1911
+ this.myDiagram.groupTemplateMap.set(title, node);
1912
+ }
1913
+ makeGroupTemplate(icon, title, size = { w: 80, h: 80 }) {
1914
+ let node = this.$(go.Group, 'Spot', {
1915
+ // // layout: this.$(go.ForceDirectedLayout , {
1916
+ // // direction: 0,
1917
+ // // setsPortSpots: false,
1918
+ // // }),
1919
+ // layout: this.$(go.LayeredDigraphLayout, {
1920
+ // direction: 0,
1921
+ // setsPortSpots: false,
1922
+ // }),
1923
+ layout: this.$(go.Layout),
1924
+ // // // adornment when a group is selected
1925
+ // // // selectionAdornmentTemplate: this.$(
1926
+ // // // go.Adornment,
1927
+ // // // 'Auto',
1928
+ // // // this.$(go.Shape, 'Rectangle', { fill: null, stroke: 'dodgerblue', strokeWidth: 8 }),
1929
+ // // // this.$(go.Placeholder),
1930
+ // // // ),
1931
+ },
1932
+ // new go.Binding('layout', 'layout', (x) =>
1933
+ // {
1934
+ // return this.$(go.ForceDirectedLayout , {
1935
+ // direction: 0,
1936
+ // setsPortSpots: false,
1937
+ // });
1938
+ // }
1939
+ // ),
1940
+ {
1941
+ minSize: new go.Size(400, 400),
1942
+ },
1943
+ // new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify),
1944
+ this.$(go.Panel, 'Auto', this.$(go.Shape, 'RoundedRectangle', {
1945
+ fill: 'transparent',
1946
+ stroke: GojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
1947
+ strokeWidth: 2,
1948
+ // strokeDashArray: [5, 5],
1949
+ }), this.$(go.Placeholder, { padding: new go.Margin(60, 20, 20, 20) })),
1950
+ // this.$(
1951
+ // go.Panel,
1952
+ // 'Table',
1953
+ // {
1954
+ // alignment: go.Spot.TopLeft,
1955
+ // alignmentFocus: new go.Spot(0, 0, -10, -10),
1956
+ // },
1957
+ // this.$(go.TextBlock, title, {
1958
+ // row: 0,
1959
+ // margin: new go.Margin(3, 3, 5, 3),
1960
+ // maxSize: new go.Size(size.w - 20, NaN),
1961
+ // stroke: '#444444',
1962
+ // font: 'normal 8pt Arial',
1963
+ // textAlign: 'center',
1964
+ // }),
1965
+ // this.$(go.Picture, icon, {
1966
+ // row: 1,
1967
+ // alignment: go.Spot.Center,
1968
+ // maxSize: new go.Size(40, 40),
1969
+ // imageStretch: go.GraphObject.Uniform,
1970
+ // }),
1971
+ // this.$(
1972
+ // go.TextBlock,
1973
+ // {
1974
+ // row: 2,
1975
+ // margin: new go.Margin(10, 3, 3, 3),
1976
+ // editable: true,
1977
+ // maxSize: new go.Size(size.w - 20, 40),
1978
+ // stroke: '#000D42',
1979
+ // font: 'bold 8pt Arial',
1980
+ // textAlign: 'center',
1981
+ // wrap: go.TextBlock.None,
1982
+ // overflow: go.TextBlock.OverflowEllipsis,
1983
+ // },
1984
+ // new go.Binding('text', 'name').makeTwoWay(),
1985
+ // {
1986
+ // // define a tooltip for each node that displays the color as text
1987
+ // toolTip: this.$('ToolTip', this.$(go.TextBlock, { margin: 4 }, new go.Binding('text', 'name'))), // end of Adornment
1988
+ // },
1989
+ // ),
1990
+ // // new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify),
1991
+ // ),
1992
+ this.$(go.Panel, 'Table', {
1993
+ alignment: go.Spot.TopLeft,
1994
+ alignmentFocus: new go.Spot(0, 0, -10, -10),
1995
+ // padding: new go.Margin(0, 0, 50, 0),
1996
+ }, this.$(go.Panel, 'Horizontal', {
1997
+ row: 0,
1998
+ alignment: go.Spot.Left,
1999
+ }, this.$(go.Picture, icon, {
2000
+ row: 0,
2001
+ // alignment: go.Spot.Center,
2002
+ alignment: go.Spot.Left,
2003
+ maxSize: new go.Size(40, 40),
2004
+ imageStretch: go.GraphObject.Uniform,
2005
+ }), this.$(go.Panel, 'Table', {
2006
+ column: 1,
2007
+ defaultAlignment: go.Spot.Left,
2008
+ alignmentFocus: new go.Spot(0, 0, 0, 20),
2009
+ }, this.$(go.TextBlock, title, {
2010
+ row: 0,
2011
+ margin: new go.Margin(3, 3, 5, 10),
2012
+ // maxSize: new go.Size(size.w - 20, NaN),
2013
+ stroke: '#444444',
2014
+ font: 'normal 10pt Arial',
2015
+ textAlign: 'center',
2016
+ alignment: go.Spot.Left,
2017
+ }), this.$(go.TextBlock, {
2018
+ row: 1,
2019
+ margin: new go.Margin(0, 3, 3, 10),
2020
+ editable: true,
2021
+ // maxSize: new go.Size(size.w - 20, 40),
2022
+ stroke: '#000D42',
2023
+ font: 'bold 10pt Arial',
2024
+ textAlign: 'center',
2025
+ wrap: go.TextBlock.None,
2026
+ overflow: go.TextBlock.OverflowEllipsis,
2027
+ }, new go.Binding('text', 'name').makeTwoWay(), {
2028
+ // define a tooltip for each node that displays the color as text
2029
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, { margin: 4 }, new go.Binding('text', 'name'))), // end of Adornment
2030
+ })))));
2031
+ this.myDiagram.groupTemplateMap.set(title, node);
2032
+ }
2033
+ makeImageTemplate() {
2034
+ const node = this.$(go.Node, 'Spot', {
2035
+ zOrder: 1,
2036
+ }, new go.Binding('selectable', 'selectable'), this.$(go.Panel, 'Horizontal', {
2037
+ row: 0,
2038
+ alignment: go.Spot.Left,
2039
+ }, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Picture, GojsEditorModel.IMAGE_RO_WATER_TREATMENT_PATH, {
2040
+ alignment: go.Spot.Center,
2041
+ // maxSize: new go.Size(500, 500),
2042
+ // imageStretch: go.GraphObject.Uniform,
2043
+ // margin: new go.Margin(130, 0, 0, 0),
2044
+ }, new go.Binding('margin', 'margin'), new go.Binding('width', 'width'), new go.Binding('height', 'height'), new go.Binding('source', '', (data) => {
2045
+ return data?.source ? data?.source : GojsEditorModel.IMAGE_RO_WATER_TREATMENT_PATH;
2046
+ }))));
2047
+ this.myDiagram.nodeTemplateMap.set(GojsEditorModel.ENUM_TEMPLATES.IMAGE_TEMPLATE, node);
2048
+ }
2049
+ makeParamTable() {
2050
+ const self = this;
2051
+ const node = this.$(go.Part, 'Auto',
2052
+ // this.$(go.Shape, { fill: '#E6F0F7', stroke: '#0063A9', strokeWidth: 3, geometryString: 'M 5 0 L 95 0 Q 100 0 100 5 L 100 95 Q 100 100 95 100 L 5 100 Q 0 100 0 95 L 0 5 Q 0 0 5 0' }),
2053
+ {
2054
+ zOrder: 2,
2055
+ // padding: new go.Margin(0, 0, 0, 200),
2056
+ }, this.$(go.Shape, { fill: '#E6F0F7', stroke: '#0063A9', strokeWidth: 3 }, new go.Binding('fill', 'bgColor'), new go.Binding('stroke', 'borderTable')), new go.Binding('padding', 'padding'), new go.Binding('selectable', 'selectable'), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify),
2057
+ // this.$(go.Shape, 'RoundedRectangle', {
2058
+ // fill: '#E6F0F7',
2059
+ // stroke: '#0063A9',
2060
+ // strokeWidth: 3,
2061
+ // // strokeDashArray: [5, 5],
2062
+ // }),
2063
+ this.$(go.Panel, 'Table',
2064
+ // Set defaults for all rows and columns:
2065
+ {
2066
+ padding: 1.5,
2067
+ defaultRowSeparatorStroke: '#0062A9',
2068
+ defaultColumnSeparatorStroke: '#0062A9',
2069
+ defaultSeparatorPadding: new go.Margin(5, 10, 5, 10),
2070
+ }, new go.Binding('defaultRowSeparatorStroke', 'borderTable'), new go.Binding('defaultColumnSeparatorStroke', 'borderTable'),
2071
+ // this.$(
2072
+ // go.Panel,
2073
+ // 'TableRow',
2074
+ // { row: 0 },
2075
+ // this.$(go.TextBlock, 'row 1 col 1', { column: 0, margin: 2 }),
2076
+ // this.$(go.TextBlock, 'row 1 col 2', { column: 1, margin: 2 }),
2077
+ // ),
2078
+ // this.$(
2079
+ // go.Panel,
2080
+ // 'TableRow',
2081
+ // { row: 1 },
2082
+ // this.$(go.TextBlock, 'row 2 col 1', { column: 0, margin: 2 }),
2083
+ // this.$(go.TextBlock, 'row 2 col 2', { column: 1, margin: 2 }),
2084
+ // ),
2085
+ new go.Binding('itemArray', 'dataTable'), {
2086
+ // itemTemplate: this.$(
2087
+ // go.Panel,
2088
+ // new go.Binding('row', 'indexRow'),
2089
+ // // new go.Binding('height', 'height'),
2090
+ // this.$(
2091
+ // go.Picture,
2092
+ // ARROW,
2093
+ // {
2094
+ // alignment: go.Spot.Center,
2095
+ // maxSize: new go.Size(20, 40),
2096
+ // // imageStretch: go.GraphObject.Uniform,
2097
+ // },
2098
+ // new go.Binding('source', '', (data, panel) => {
2099
+ // // panel.part?.data?.id
2100
+ // return data?.isCreated ? panel?.$p : ARROW_GRAY;
2101
+ // }),
2102
+ // ),
2103
+ // ),
2104
+ itemTemplate: this.$(go.Panel, 'TableRow', this.$(go.TextBlock, '', { column: 0, margin: 2, textAlign: 'left', alignment: go.Spot.Left }, new go.Binding('text', '', (data, panel) => {
2105
+ return data?.name;
2106
+ })), this.$(go.Panel, 'Table', {
2107
+ column: 1,
2108
+ margin: 2,
2109
+ padding: 0,
2110
+ defaultSeparatorPadding: new go.Margin(0, 0, 0, 0),
2111
+ stretch: go.GraphObject.Fill,
2112
+ }, new go.Binding('minSize', '', (data, panel) => {
2113
+ return panel.part?.data?.minSizeValue;
2114
+ }), this.$(go.TextBlock, '', {
2115
+ column: 0,
2116
+ margin: 0,
2117
+ alignment: go.Spot.Left,
2118
+ maxSize: new go.Size(190, 14),
2119
+ overflow: go.TextBlock.OverflowEllipsis,
2120
+ cursor: 'pointer',
2121
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
2122
+ margin: 4,
2123
+ }, new go.Binding('text', '', (data, panel) => {
2124
+ return `${!!this._initialOptions.isReadOnly ? `${data?.tagName || ''} ` : ''}${data?.value}`;
2125
+ }))),
2126
+ }, {
2127
+ click: (e, obj) => {
2128
+ self.onClikParamOfTable.emit({
2129
+ pramTable: obj.panel.part.data,
2130
+ ...obj.panel.part.data?.dataTable[obj?.panel.row],
2131
+ });
2132
+ },
2133
+ }, new go.Binding('text', '', (data, panel) => {
2134
+ return data?.value;
2135
+ }), new go.Binding('stroke', '', (data) => {
2136
+ if (!this._initialOptions.isReadOnly) {
2137
+ return;
2138
+ }
2139
+ return data.color;
2140
+ })), this.$(go.TextBlock, {
2141
+ alignment: go.Spot.Right,
2142
+ column: 1,
2143
+ margin: new go.Margin(0, 0, 0, 5),
2144
+ text: '\uf044',
2145
+ font: '13px "Font Awesome 6 Pro"',
2146
+ cursor: 'pointer',
2147
+ visible: false,
2148
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
2149
+ margin: 4,
2150
+ }, new go.Binding('text', '', (data, panel) => {
2151
+ return data?.toolTipAction;
2152
+ }))),
2153
+ }, {
2154
+ click: (e, obj) => {
2155
+ if (obj.panel.part.data?.dataTable[obj?.panel.row]?.isEditable === false) {
2156
+ return;
2157
+ }
2158
+ self.onClikParamOfTable.emit({
2159
+ pramTable: obj.panel.part.data,
2160
+ ...obj.panel.part.data?.dataTable[obj?.panel.row],
2161
+ });
2162
+ },
2163
+ }, new go.Binding('visible', '', (data, panel) => {
2164
+ return !this._initialOptions.isReadOnly;
2165
+ }), new go.Binding('opacity', '', (data, panel) => {
2166
+ return data?.isEditable === false ? 0.6 : 1;
2167
+ })))),
2168
+ }));
2169
+ this.myDiagram.nodeTemplateMap.set(GojsEditorModel.ENUM_TEMPLATES.PARAM_TABLE, node);
2170
+ }
2171
+ makeMassBalance() {
2172
+ const self = this;
2173
+ const node = this.$(go.Part, 'Auto', {}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), new go.Binding('selectable', 'selectable'), this.$(go.Panel, 'Horizontal',
2174
+ // Set defaults for all rows and columns:
2175
+ {
2176
+ padding: 4,
2177
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
2178
+ margin: 4,
2179
+ maxSize: new go.Size(450, 30),
2180
+ }, new go.Binding('text', 'tooltip'))),
2181
+ visible: this._initialOptions.isReadOnly,
2182
+ }, this.$(go.TextBlock, '', {
2183
+ margin: new go.Margin(0, 5, 0, 0),
2184
+ text: 'Mass Balance:',
2185
+ }, new go.Binding('font', 'font')), this.$(go.TextBlock, '', {
2186
+ stroke: GojsEditorModel.ENUM_COLORS.ALIZARIN,
2187
+ }, new go.Binding('font', 'font'), new go.Binding('stroke', 'colorValue'), new go.Binding('text', '', (data, panel) => {
2188
+ return data?.value;
2189
+ }))));
2190
+ this.myDiagram.nodeTemplateMap.set(GojsEditorModel.ENUM_TEMPLATES.MASS_BALANCE, node);
2191
+ }
2192
+ makeGroupROPlantTemplate(icon, title, size = { w: 80, h: 80 }) {
2193
+ let node = this.$(go.Group, 'Spot', {
2194
+ layout: this.$(go.Layout),
2195
+ }, {
2196
+ // minSize: new go.Size(NaN, 600),
2197
+ }, new go.Binding('selectable', 'selectable'), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Table', this.$(go.Panel, 'Auto', {
2198
+ row: 0,
2199
+ padding: new go.Margin(0, 0, 0, 0),
2200
+ }, this.$(go.Shape, 'RoundedRectangle', {
2201
+ name: 'SHAPE_KEY',
2202
+ fill: '#FCFCFD',
2203
+ stroke: GojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
2204
+ strokeWidth: 2,
2205
+ // strokeDashArray: [5, 5],
2206
+ }), this.$(go.Placeholder, { padding: new go.Margin(15, 0, 0, 0) })), this.$(go.Picture, RO_LINE_DIRTY, {
2207
+ row: 1,
2208
+ }, new go.Binding('visible', '', (x) => {
2209
+ return x?.isViewGeneral && x?.hasOutFlow ? true : false;
2210
+ }))), this.$(go.Panel, 'Table', {
2211
+ width: 0,
2212
+ height: 0,
2213
+ alignment: new go.Spot(0, 0, 0, 183),
2214
+ alignmentFocus: go.Spot.Left,
2215
+ // stretch: go.GraphObject.Vertical,
2216
+ portId: 'Inflow',
2217
+ cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
2218
+ // alignmentFocus: new go.Spot(0, 0, 0, 150),
2219
+ fromSpot: go.Spot.Left,
2220
+ toSpot: go.Spot.Left,
2221
+ fromLinkable: true,
2222
+ toLinkable: true,
2223
+ }), this.$(go.Panel, 'Table', {
2224
+ width: 0,
2225
+ height: 0,
2226
+ alignment: new go.Spot(0, 0, 970, 315),
2227
+ alignmentFocus: go.Spot.Bottom,
2228
+ portId: 'OutFlow_Clean',
2229
+ cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
2230
+ fromSpot: go.Spot.Bottom,
2231
+ toSpot: go.Spot.Bottom,
2232
+ fromLinkable: true,
2233
+ toLinkable: true,
2234
+ }), this.$(go.Panel, 'Table', {
2235
+ width: 0,
2236
+ height: 0,
2237
+ // alignment: new go.Spot(0, 0, 480, 525),
2238
+ // alignment: new go.Spot(0, 0, 475, 552),
2239
+ alignmentFocus: go.Spot.Bottom,
2240
+ portId: 'OutFlow_Dirty',
2241
+ cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
2242
+ fromSpot: go.Spot.Bottom,
2243
+ toSpot: go.Spot.Bottom,
2244
+ fromLinkable: true,
2245
+ toLinkable: true,
2246
+ }, new go.Binding('alignment', '', (x) => {
2247
+ return x?.isViewGeneral && x?.hasOutFlow
2248
+ ? new go.Spot(0, 0, 475, 552)
2249
+ : new go.Spot(0, 0, 480, 525);
2250
+ })));
2251
+ this.myDiagram.groupTemplateMap.set(title, node);
2252
+ }
2253
+ makeGroupBoilerTemplate(icon, title, size = { w: 80, h: 80 }) {
2254
+ let node = this.$(go.Group, 'Spot', {
2255
+ selectable: false,
2256
+ }, {
2257
+ // minSize: new go.Size(NaN, 600),
2258
+ }, new go.Binding('selectable', 'selectable'), this.$(go.Panel, 'Auto', {
2259
+ padding: new go.Margin(0, 0, 0, 0),
2260
+ }, this.$(go.Shape, 'RoundedRectangle', {
2261
+ name: 'SHAPE_KEY',
2262
+ fill: '#FCFCFD',
2263
+ stroke: GojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
2264
+ strokeWidth: 2,
2265
+ }), this.$(go.Placeholder, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), { padding: new go.Margin(0, 0, 0, 0) })), this.$(go.Panel, 'Spot', {
2266
+ width: 0,
2267
+ height: 0,
2268
+ alignment: new go.Spot(0, 0.5, 0, 83),
2269
+ alignmentFocus: go.Spot.Left,
2270
+ portId: 'Inflow',
2271
+ cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
2272
+ fromSpot: go.Spot.Left,
2273
+ toSpot: go.Spot.Left,
2274
+ fromLinkable: true,
2275
+ toLinkable: true,
2276
+ }), this.$(go.Panel, 'Spot', {
2277
+ alignmentFocus: go.Spot.Top,
2278
+ alignment: new go.Spot(1, 1, -215, 0),
2279
+ }, this.$(go.Picture, OUTFLOW_LINE_DIRTY, {
2280
+ width: 10,
2281
+ height: 20,
2282
+ }, new go.Binding('visible', '', (x) => {
2283
+ return x?.isViewGeneral && x?.hasOutFlow ? true : false;
2284
+ })), this.$(go.Panel, {
2285
+ alignment: go.Spot.BottomLeft,
2286
+ alignmentFocus: go.Spot.Top,
2287
+ portId: 'OutFlow',
2288
+ cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
2289
+ fromSpot: go.Spot.Bottom,
2290
+ fromLinkable: true,
2291
+ toLinkable: true,
2292
+ })));
2293
+ this.myDiagram.groupTemplateMap.set(title, node);
2294
+ }
2295
+ makeGroupCoolingTowerTemplate(icon, title, size = { w: 80, h: 80 }) {
2296
+ let node = this.$(go.Group, 'Spot', {
2297
+ selectable: false,
2298
+ }, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', {
2299
+ row: 0,
2300
+ padding: new go.Margin(0, 0, 0, 0),
2301
+ }, this.$(go.Shape, 'RoundedRectangle', {
2302
+ name: 'SHAPE_KEY',
2303
+ fill: '#FCFCFD',
2304
+ stroke: GojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
2305
+ strokeWidth: 2,
2306
+ }), this.$(go.Placeholder, { padding: new go.Margin(0, 0, 0, 0) })), this.$(go.Panel, 'Table', {
2307
+ width: 0,
2308
+ height: 0,
2309
+ alignment: new go.Spot(0, 0, 0, 348),
2310
+ alignmentFocus: go.Spot.Bottom,
2311
+ portId: 'Inflow',
2312
+ cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
2313
+ fromSpot: go.Spot.Left,
2314
+ toSpot: go.Spot.Left,
2315
+ fromLinkable: true,
2316
+ toLinkable: true,
2317
+ }), this.$(go.Panel, 'Spot', {
2318
+ alignmentFocus: go.Spot.Top,
2319
+ alignment: new go.Spot(0.5, 1, -16, 0),
2320
+ }, this.$(go.Picture, OUTFLOW_LINE_DIRTY, {
2321
+ width: 10,
2322
+ height: 20,
2323
+ }, new go.Binding('visible', '', (x) => {
2324
+ return x?.isViewGeneral && x?.hasOutFlow ? true : false;
2325
+ })), this.$(go.Panel, {
2326
+ alignment: go.Spot.BottomLeft,
2327
+ alignmentFocus: go.Spot.Top,
2328
+ portId: 'OutFlow',
2329
+ cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
2330
+ fromSpot: go.Spot.Bottom,
2331
+ fromLinkable: true,
2332
+ toLinkable: true,
2333
+ })));
2334
+ this.myDiagram.groupTemplateMap.set(title, node);
2335
+ }
2336
+ groupPlantCellTemplate(icon, title, size = { w: 80, h: 80 }) {
2337
+ const self = this;
2338
+ let node = this.$(go.Group, 'Spot', {
2339
+ // layout: this.$(go.Layout),
2340
+ // layout: this.$(go.LayeredDigraphLayout, { direction: 0 }),
2341
+ // isSubGraphExpanded: false,
2342
+ // background: 'transparent',
2343
+ // layerName: 'Foreground',
2344
+ // wasSubGraphExpanded: false,
2345
+ movable: false,
2346
+ selectable: false,
2347
+ avoidable: false,
2348
+ // resizable: true,
2349
+ // resizable: false,
2350
+ // width: data?.ob?.minWith ?? 50,
2351
+ // height: 500,
2352
+ // isSubGraphExpanded: true, // ensure the group is always expanded
2353
+ // computesBoundsAfterDrag: true,
2354
+ // handlesDragDropForMembers: true, // handle drag-and-drop events for its member nodes
2355
+ // maxSize: new go.Size(500, 500),
2356
+ // minSize: new go.Size(500, 500),
2357
+ // isSubGraphExpanded: true,
2358
+ // layerName: DIAGRAM.LAYERS.BACKGROUND,
2359
+ // mouseDrop: function (e, grp) {
2360
+ // // disallow dropping anything onto an Adornment
2361
+ // if (grp instanceof go.Adornment) return;
2362
+ // },
2363
+ // dragComputation: function (node, pt, gridPt) {
2364
+ // let grp = node.containingGroup;
2365
+ // if (grp !== null) {
2366
+ // let rect = grp.actualBounds;
2367
+ // pt.x = Math.max(rect.left, Math.min(pt.x, rect.right));
2368
+ // pt.y = Math.max(rect.top, Math.min(pt.y, rect.bottom));
2369
+ // }
2370
+ // return pt;
2371
+ // },
2372
+ // dropComputation: function (node, pt, gridPt) {
2373
+ // let grp = node.containingGroup;
2374
+ // if (grp !== null) {
2375
+ // let rect = grp.actualBounds;
2376
+ // pt.x = Math.max(rect.left, Math.min(pt.x, rect.right));
2377
+ // pt.y = Math.max(rect.top, Math.min(pt.y, rect.bottom));
2378
+ // }
2379
+ // return pt;
2380
+ // },
2381
+ // dragComputation: function (part, pt, gridpt) {
2382
+ // // Get the current group's actual bounds
2383
+ // const grp = part.containingGroup;
2384
+ // if (grp) {
2385
+ // const bnds = grp.actualBounds;
2386
+ // const loc = part.location;
2387
+ // // See if the part's new location would be out of bounds
2388
+ // const newx = Math.max(bnds.x, Math.min(pt.x, bnds.right - part.actualBounds.width / 2));
2389
+ // const newy = Math.max(bnds.y, Math.min(pt.y, bnds.bottom - part.actualBounds.height / 2));
2390
+ // // Modify the result point to keep the Part inside the Group
2391
+ // return new go.Point(newx, newy);
2392
+ // }
2393
+ // return pt;
2394
+ // },
2395
+ click: (e, obj) => {
2396
+ self.myDiagram?.clearSelection();
2397
+ },
2398
+ }, {
2399
+ // mouseDragEnter: (e, obj) => {
2400
+ // },
2401
+ // mouseDrop: (e, obj) => {
2402
+ // },
2403
+ // mouseEnter: (e, obj) => {
2404
+ // const node = obj.part;
2405
+ // self.onHoverInfoButton.emit({
2406
+ // left: e?.['Wr']?.x + 8,
2407
+ // top: e?.['Wr']?.y,
2408
+ // node: node,
2409
+ // });
2410
+ // // let shape = (node as any)?.findObject('SHAPE_KEY');
2411
+ // // if (shape) {
2412
+ // // shape.stroke = 'blue';
2413
+ // // }
2414
+ // },
2415
+ // mouseLeave: (e, obj) => {
2416
+ // self.onHoverInfoButton.emit(null);
2417
+ // // let shape = (node as any)?.findObject('SHAPE_KEY');
2418
+ // // if (shape) {
2419
+ // // shape.stroke = GojsEditorModel.ENUM_COLORS.WHITE;
2420
+ // // }
2421
+ // },
2422
+ }, new go.Binding('layout', '', function (data, node) {
2423
+ // return data?.layoutValue === GojsEditorModel.ENUM_LAYOUT_EDITOR.AUTO
2424
+ // ? self.$(go.LayeredDigraphLayout, { direction: 0 })
2425
+ // : node?.layout;
2426
+ if (data?.layoutValue !== data?.layoutValueClone) {
2427
+ data.layoutValueClone = data?.layoutValue;
2428
+ return data?.layoutValue === GojsEditorModel.ENUM_LAYOUT_EDITOR.AUTO
2429
+ ? self.$(go.LayeredDigraphLayout, { direction: 0 })
2430
+ : self.$(go.Layout);
2431
+ }
2432
+ else {
2433
+ return node?.layout;
2434
+ }
2435
+ // : self.$(go.Layout);
2436
+ // return data?.layout;
2437
+ // return data?.previousLayout || self.$(go.LayeredDigraphLayout, { direction: 0 });
2438
+ // return self.$(go.LayeredDigraphLayout, { direction: 0 });
2439
+ }),
2440
+ // new go.Binding('grid', 'grid'),
2441
+ new go.Binding('selectable', 'selectable'),
2442
+ // new go.Binding('width', '', function (data) {
2443
+ // return data?.ob?.minWith ?? 50;
2444
+ // }),
2445
+ new go.Binding('minSize', '', function (data) {
2446
+ return new go.Size(data?.ob?.minWith ?? 50, data?.ob?.minHeight ?? 50); // Customize minSize based on data
2447
+ }).ofObject(),
2448
+ // new go.Binding('width', '', function (data) {
2449
+ // return data?.ob?.minWith ?? 50; // Customize minSize based on data
2450
+ // }).ofObject(),
2451
+ // new go.Binding('height', '', function (data) {
2452
+ // return data?.ob?.minHeight ?? 50; // Customize minSize based on data
2453
+ // }).ofObject(),
2454
+ new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify),
2455
+ // new go.Binding('isSubGraphExpanded', 'expanded').makeTwoWay(),
2456
+ this.$(go.Panel, 'Auto', {
2457
+ padding: new go.Margin(0, 0, 0, 0),
2458
+ // margin:new go.Margin(0, 50, 0, 50),
2459
+ }, this.$(go.Shape, 'RoundedRectangle', {
2460
+ name: 'SHAPE_KEY',
2461
+ fill: 'transparent',
2462
+ stroke: GojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
2463
+ strokeWidth: 2,
2464
+ strokeDashArray: [5, 5],
2465
+ }), this.$(go.Placeholder, { padding: new go.Margin(0, 0, 0, 0) })));
2466
+ // node.memberValidation = function (node, group) {
2467
+ // if (!group) return true; // allow ungrouping
2468
+ // const groupBounds = group.actualBounds;
2469
+ // const nodeBounds = node.actualBounds;
2470
+ // return groupBounds.containsRect(nodeBounds);
2471
+ // };
2472
+ this.myDiagram.groupTemplateMap.set(title, node);
2473
+ }
2474
+ groupPCInputOrOutTemplate(icon, title, padding) {
2475
+ // let node = this.$(
2476
+ // go.Group,
2477
+ // 'Spot',
2478
+ // {
2479
+ // layout: this.$(go.Layout),
2480
+ // movable: false,
2481
+ // selectable: false,
2482
+ // },
2483
+ // // {
2484
+ // // // minSize: new go.Size(500, 500),
2485
+ // // movable: false,
2486
+ // // ariaReadOnly: true,
2487
+ // // },
2488
+ // this.$(
2489
+ // go.Panel,
2490
+ // 'Auto',
2491
+ // {
2492
+ // padding: new go.Margin(0, 0, 0, 0),
2493
+ // },
2494
+ // this.$(go.Shape, 'RoundedRectangle', {
2495
+ // fill: 'transparent',
2496
+ // // stroke: GojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
2497
+ // stroke: GojsEditorModel.ENUM_COLORS.WHITE,
2498
+ // strokeWidth: 2,
2499
+ // strokeDashArray: [5, 5],
2500
+ // }),
2501
+ // this.$(go.Placeholder, {
2502
+ // padding: new go.Margin(0, 0, 0, 0),
2503
+ // }),
2504
+ // ),
2505
+ // );
2506
+ let node = this.$(go.Group, 'Spot', {
2507
+ layout: this.$(go.LayeredDigraphLayout, { direction: 0 }),
2508
+ movable: false,
2509
+ selectable: false,
2510
+ avoidable: false,
2511
+ // isSubGraphExpanded: false,
2512
+ // isSubGraphExpanded: false,
2513
+ // layerName: 'Foreground',
2514
+ }, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', {
2515
+ padding: padding ?? new go.Margin(0, 0, 0, 0),
2516
+ }, this.$(go.Shape, 'RoundedRectangle', {
2517
+ fill: 'transparent',
2518
+ stroke: GojsEditorModel.ENUM_COLORS.WHITE,
2519
+ // stroke: GojsEditorModel.ENUM_COLORS.ALIZARIN,
2520
+ strokeWidth: 2,
2521
+ // strokeDashArray: [5, 5],
2522
+ }), this.$(go.Placeholder, {
2523
+ padding: new go.Margin(0, 0, 0, 0),
2524
+ })));
2525
+ this.myDiagram.groupTemplateMap.set(title, node);
2526
+ }
2527
+ makeGroupZoneTemplate(size = { w: GojsEditorModel.GRID_SIZE * 14, h: GojsEditorModel.GRID_SIZE * 5 }) {
2528
+ const self = this;
2529
+ let node = this.$(go.Group, 'Vertical', {
2530
+ layout: this.$(go.GridLayout, { wrappingColumn: 1, spacing: new go.Size(0, 0) }),
2531
+ }, {
2532
+ locationSpot: go.Spot.Center,
2533
+ mouseOver: function (e, obj) {
2534
+ // self.showPoint(obj?.part?.location);
2535
+ },
2536
+ click: (e, obj) => {
2537
+ if (obj?.data?.onSelected) {
2538
+ obj?.data?.onSelected(obj?.data);
2539
+ }
2540
+ },
2541
+ selectionChanged: (e) => {
2542
+ if (!e.isSelected && e?.data?.onSelected) {
2543
+ e?.data?.onSelected(null);
2544
+ }
2545
+ },
2546
+ selectionAdornmentTemplate: this._initialOptions.isReadOnly
2547
+ ? null
2548
+ : this.$(go.Adornment, 'Spot', {
2549
+ shadowVisible: true,
2550
+ shadowBlur: 6,
2551
+ shadowOffset: new go.Point(0, 2),
2552
+ shadowColor: '#00000029',
2553
+ }, this.$(go.Panel, 'Auto', this.$(go.Shape, { fill: null, stroke: 'dodgerblue', strokeWidth: 4 }), this.$(go.Placeholder, { padding: 3 })), this.$(go.Panel, 'Horizontal', {
2554
+ alignment: go.Spot.TopRight,
2555
+ alignmentFocus: go.Spot.Bottom,
2556
+ background: 'white',
2557
+ }, this.$('Button', {
2558
+ _dragData: {
2559
+ type: GojsEditorModel.ENUM_TEMPLATES.TEXT_NODE,
2560
+ name: 0,
2561
+ color: GojsEditorModel.ENUM_COLORS.BLUE,
2562
+ },
2563
+ click: self.addItemOnGroupZone,
2564
+ 'ButtonBorder.strokeWidth': 0,
2565
+ 'ButtonBorder.fill': 'white',
2566
+ }, this.$(go.TextBlock, {
2567
+ margin: 4,
2568
+ text: '\uf055',
2569
+ font: '20px "Font Awesome 6 Pro"',
2570
+ cursor: 'pointer',
2571
+ stroke: '#2c2c2c',
2572
+ })),
2573
+ // more
2574
+ this.generateActionGroup([
2575
+ AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
2576
+ AtoDefaultGojsEditor.ENUM_ACTIONS.DETAILS,
2577
+ AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
2578
+ AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
2579
+ ]))),
2580
+ }, this.$(go.Panel, 'Auto', this.$(go.Shape, 'RoundedRectangle', {
2581
+ fill: 'transparent',
2582
+ stroke: GojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
2583
+ strokeWidth: 2,
2584
+ strokeDashArray: [5, 5],
2585
+ maxSize: new go.Size(size.w, NaN),
2586
+ }), this.$(go.Panel, 'Table', {
2587
+ alignment: go.Spot.Top,
2588
+ padding: new go.Margin(17, 10, 16, 10),
2589
+ }, this.$(go.TextBlock, {
2590
+ row: 0,
2591
+ margin: new go.Margin(5, 0, 10, 0),
2592
+ editable: true,
2593
+ desiredSize: new go.Size(size.w - 20, 25),
2594
+ stroke: GojsEditorModel.ENUM_COLORS.NIGHT_RIDER,
2595
+ font: 'bold 16px Arial',
2596
+ textAlign: 'center',
2597
+ wrap: go.TextBlock.None,
2598
+ overflow: go.TextBlock.OverflowEllipsis,
2599
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
2600
+ margin: 4,
2601
+ }, new go.Binding('text', 'name').makeTwoWay())),
2602
+ }, new go.Binding('text', 'name').makeTwoWay()), this.$(go.Placeholder, 'Vertical', {
2603
+ row: 1,
2604
+ })), this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, true, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, true), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false)), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify));
2605
+ this.myDiagram.groupTemplateMap.set(GojsEditorModel.ENUM_TEMPLATES.ZONE, node);
2606
+ }
2607
+ makeZoneItemTemplate(size = { w: GojsEditorModel.GRID_SIZE * 12, h: GojsEditorModel.GRID_SIZE * 2 }) {
2608
+ const self = this;
2609
+ const node = this.$(go.Node, 'Auto',
2610
+ // {
2611
+ // mouseHover: (e, obj) => {
2612
+ // const node = obj.part;
2613
+ // if ((obj as any).part?.ob?.value === VALUE_NA) {
2614
+ // self.onHoverInfoButton.emit({
2615
+ // left: e?.['Wr']?.x + 8,
2616
+ // top: e?.['Wr']?.y,
2617
+ // node: node
2618
+ // });
2619
+ // }
2620
+ // },
2621
+ // mouseLeave: (e, obj) => {
2622
+ // if ((obj as any).part?.ob?.value === VALUE_NA) {
2623
+ // self.onHoverInfoButton.emit(null);
2624
+ // }
2625
+ // },
2626
+ // click: (e, obj: any) => {
2627
+ // const node = obj.part;
2628
+ // this.isShowNodeInfo ? self.onClickInfoButton.emit({
2629
+ // left: e?.['Wr']?.x,
2630
+ // top: e?.['Wr']?.y,
2631
+ // node: node
2632
+ // }) : null;
2633
+ // },
2634
+ // },
2635
+ // new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify),
2636
+ {
2637
+ movable: false,
2638
+ }, this.$(go.Panel, 'Auto', {
2639
+ width: size.w,
2640
+ height: size.h,
2641
+ }, this.$(go.Shape, 'Rectangle', {
2642
+ fill: GojsEditorModel.ENUM_COLORS.LIGHT_BLUE,
2643
+ stroke: GojsEditorModel.ENUM_COLORS.LINK_WATER,
2644
+ }), this.$(go.Panel, 'Vertical', this.$(go.TextBlock, {
2645
+ editable: true,
2646
+ row: 2,
2647
+ margin: new go.Margin(10, 0, 5, 0),
2648
+ font: 'bold 12px Arial',
2649
+ textAlign: 'center',
2650
+ stroke: GojsEditorModel.ENUM_COLORS.NIGHT_RIDER,
2651
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
2652
+ margin: 4,
2653
+ }, new go.Binding('text', 'name').makeTwoWay())),
2654
+ }, new go.Binding('text', 'name').makeTwoWay(), new go.Binding('visible', 'name', (x) => !!x)), this.$(go.Panel, 'Horizontal', {
2655
+ margin: new go.Margin(0, 10, 0, 10),
2656
+ }, this.$(go.TextBlock, {
2657
+ margin: new go.Margin(0, 5, 10, 0),
2658
+ textAlign: 'center',
2659
+ font: '12px sans-serif',
2660
+ stroke: GojsEditorModel.ENUM_COLORS.NIGHT_RIDER,
2661
+ wrap: go.TextBlock.WrapFit,
2662
+ editable: true,
2663
+ isMultiline: false,
2664
+ maxSize: new go.Size(size.w - 100, 15),
2665
+ overflow: go.TextBlock.OverflowEllipsis,
2666
+ toolTip: this.$('ToolTip', this.$(go.TextBlock, {
2667
+ margin: 4,
2668
+ }, new go.Binding('text', 'nameItem').makeTwoWay())),
2669
+ }, new go.Binding('text', 'nameItem').makeTwoWay(), new go.Binding('visible', 'nameItem', (x) => !!x)), this.$(go.TextBlock, {
2670
+ margin: new go.Margin(0, 5, 10, 0),
2671
+ textAlign: 'center',
2672
+ font: '12px sans-serif',
2673
+ stroke: GojsEditorModel.ENUM_COLORS.CERULEAN,
2674
+ wrap: go.TextBlock.WrapFit,
2675
+ text: '< ',
2676
+ }, new go.Binding('visible', 'data', (x) => typeof x?.quantity === 'number')), this.$(go.TextBlock, {
2677
+ margin: new go.Margin(0, 5, 10, 0),
2678
+ textAlign: 'center',
2679
+ font: '12px sans-serif',
2680
+ stroke: GojsEditorModel.ENUM_COLORS.CERULEAN,
2681
+ wrap: go.TextBlock.WrapFit,
2682
+ }, new go.Binding('text', 'data', (x) => {
2683
+ if (typeof x?.quantity !== 'number') {
2684
+ return '';
2685
+ }
2686
+ const formatted = UtilsService.convertPrefixesData({
2687
+ value: x?.quantity,
2688
+ unit: x?.unit,
2689
+ });
2690
+ return formatted.shortenedNumber + ' ' + formatted.unitPrefixes + x?.unit ?? '';
2691
+ }), new go.Binding('visible', 'data', (x) => typeof x?.quantity === 'number')), this.$(go.TextBlock, {
2692
+ margin: new go.Margin(0, 5, 10, 0),
2693
+ textAlign: 'center',
2694
+ font: '12px sans-serif',
2695
+ stroke: GojsEditorModel.ENUM_COLORS.CERULEAN,
2696
+ wrap: go.TextBlock.WrapFit,
2697
+ text: ' >',
2698
+ }, new go.Binding('visible', 'data', (x) => typeof x?.quantity === 'number'))))));
2699
+ this.myDiagram.nodeTemplateMap.set(GojsEditorModel.ENUM_TEMPLATES.ZONE_ENERGY_ITEM, node);
2700
+ }
2701
+ makeSpecialTemplate(icon, title, size = { w: GojsEditorModel.GRID_SIZE * 5, h: GojsEditorModel.GRID_SIZE * 5 }) {
2702
+ let node = null;
2703
+ switch (title) {
2704
+ case GojsEditorModel.ENUM_TEMPLATES.SPECIAL_PROCESS:
2705
+ node = this.$(go.Node, 'Spot',
2706
+ // {
2707
+ // fromSpot: go.Spot.Right, // coming out from middle-right
2708
+ // toSpot: go.Spot.Left
2709
+ // },
2710
+ {
2711
+ click: (e, obj) => {
2712
+ if (obj?.data?.onSelected) {
2713
+ obj?.data?.onSelected(obj?.data);
2714
+ }
2715
+ },
2716
+ selectionChanged: (e) => {
2717
+ if (!e.isSelected && e?.data?.onSelected) {
2718
+ e?.data?.onSelected(null);
2719
+ }
2720
+ },
2721
+ }, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'Circle', {
2722
+ fill: 'white',
2723
+ stroke: '#2D3B77',
2724
+ strokeWidth: 2,
2725
+ // strokeDashArray: [5, 5],
2726
+ }), this.$(go.Panel, 'Table', this.$(go.TextBlock, GojsEditorModel.ENUM_TEMPLATES.PROCESS, {
2727
+ row: 0,
2728
+ margin: new go.Margin(3, 3, 10, 3),
2729
+ maxSize: new go.Size(size.w - 20, NaN),
2730
+ stroke: '#444444',
2731
+ font: 'normal 10pt Arial',
2732
+ textAlign: 'center',
2733
+ }), this.$(go.Picture, icon, {
2734
+ row: 1,
2735
+ margin: new go.Margin(0, 0, 10, 0),
2736
+ alignment: go.Spot.Center,
2737
+ maxSize: new go.Size(60, 60),
2738
+ imageStretch: go.GraphObject.Uniform,
2739
+ }))), this.$(go.Panel, 'Vertical', {
2740
+ alignment: go.Spot.Left,
2741
+ alignmentFocus: new go.Spot(0, 0.5, 8, 0),
2742
+ }), this.$(go.Panel, 'Vertical', {
2743
+ alignment: go.Spot.Right,
2744
+ alignmentFocus: new go.Spot(1, 0.5, -8, 0),
2745
+ }),
2746
+ // four named ports, one on each side:
2747
+ this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, true, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, true), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false));
2748
+ break;
2749
+ case GojsEditorModel.ENUM_TEMPLATES.SPECIAL_STORAGE:
2750
+ node = this.$(go.Node, 'Spot', {
2751
+ click: (e, obj) => {
2752
+ if (obj?.data?.onSelected) {
2753
+ obj?.data?.onSelected(obj?.data);
2754
+ }
2755
+ },
2756
+ selectionChanged: (e) => {
2757
+ if (!e.isSelected && e?.data?.onSelected) {
2758
+ e?.data?.onSelected(null);
2759
+ }
2760
+ },
2761
+ }, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'Circle', {
2762
+ fill: 'white',
2763
+ stroke: '#2D3B77',
2764
+ strokeWidth: 2,
2765
+ // strokeDashArray: [5, 5],
2766
+ }), this.$(go.Panel, 'Table', this.$(go.TextBlock, GojsEditorModel.ENUM_TEMPLATES.STORAGE, {
2767
+ row: 0,
2768
+ margin: new go.Margin(3, 3, 10, 3),
2769
+ maxSize: new go.Size(size.w - 20, NaN),
2770
+ stroke: '#444444',
2771
+ font: 'normal 10pt Arial',
2772
+ textAlign: 'center',
2773
+ }), this.$(go.Picture, icon, {
2774
+ row: 1,
2775
+ margin: new go.Margin(0, 0, 10, 0),
2776
+ alignment: go.Spot.Center,
2777
+ minSize: new go.Size(40, 40),
2778
+ maxSize: new go.Size(50, 50),
2779
+ imageStretch: go.GraphObject.Uniform,
2780
+ }, new go.Binding('source', 'icon').makeTwoWay()))), this.$(go.Panel, 'Vertical', {
2781
+ alignment: go.Spot.Left,
2782
+ alignmentFocus: new go.Spot(0, 0.5, 8, 0),
2783
+ }), this.$(go.Panel, 'Vertical', {
2784
+ alignment: go.Spot.Right,
2785
+ alignmentFocus: new go.Spot(1, 0.5, -8, 0),
2786
+ }),
2787
+ // four named ports, one on each side:
2788
+ this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, true, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, true), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false));
2789
+ break;
2790
+ case GojsEditorModel.ENUM_TEMPLATES.SPECIAL_STORE:
2791
+ node = this.$(go.Node, 'Spot', {
2792
+ click: (e, obj) => {
2793
+ if (obj?.data?.onSelected) {
2794
+ obj?.data?.onSelected(obj?.data);
2795
+ }
2796
+ },
2797
+ selectionChanged: (e) => {
2798
+ if (!e.isSelected && e?.data?.onSelected) {
2799
+ e?.data?.onSelected(null);
2800
+ }
2801
+ },
2802
+ }, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'Circle', {
2803
+ fill: 'white',
2804
+ stroke: '#2D3B77',
2805
+ strokeWidth: 2,
2806
+ // strokeDashArray: [5, 5],
2807
+ }), this.$(go.Panel, 'Table', this.$(go.TextBlock, 'Store', {
2808
+ row: 0,
2809
+ margin: new go.Margin(3, 3, 10, 3),
2810
+ maxSize: new go.Size(size.w - 20, NaN),
2811
+ stroke: '#444444',
2812
+ font: 'normal 10pt Arial',
2813
+ textAlign: 'center',
2814
+ }), this.$(go.Picture, icon, {
2815
+ row: 1,
2816
+ margin: new go.Margin(0, 0, 10, 0),
2817
+ alignment: go.Spot.Center,
2818
+ maxSize: new go.Size(60, 60),
2819
+ imageStretch: go.GraphObject.Uniform,
2820
+ }))));
2821
+ break;
2822
+ case GojsEditorModel.ENUM_TEMPLATES.SPECIAL_DISCHARGE:
2823
+ node = this.$(go.Node, 'Spot', {
2824
+ click: (e, obj) => {
2825
+ if (obj?.data?.onSelected) {
2826
+ obj?.data?.onSelected(obj?.data);
2827
+ }
2828
+ },
2829
+ selectionChanged: (e) => {
2830
+ if (!e.isSelected && e?.data?.onSelected) {
2831
+ e?.data?.onSelected(null);
2832
+ }
2833
+ },
2834
+ }, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'Circle', {
2835
+ fill: 'white',
2836
+ stroke: '#2D3B77',
2837
+ strokeWidth: 2,
2838
+ // strokeDashArray: [5, 5],
2839
+ }), this.$(go.Panel, 'Table', this.$(go.TextBlock, 'Discharge', {
2840
+ row: 0,
2841
+ margin: new go.Margin(3, 3, 10, 3),
2842
+ maxSize: new go.Size(size.w - 20, NaN),
2843
+ stroke: '#444444',
2844
+ font: 'normal 10pt Arial',
2845
+ textAlign: 'center',
2846
+ }), this.$(go.Picture, icon, {
2847
+ row: 1,
2848
+ margin: new go.Margin(0, 0, 10, 0),
2849
+ alignment: go.Spot.Center,
2850
+ maxSize: new go.Size(60, 60),
2851
+ imageStretch: go.GraphObject.Uniform,
2852
+ }))));
2853
+ break;
2854
+ case GojsEditorModel.ENUM_TEMPLATES.SPECIAL_OTHER:
2855
+ node = this.$(go.Node, 'Spot', {
2856
+ click: (e, obj) => {
2857
+ if (obj?.data?.onSelected) {
2858
+ obj?.data?.onSelected(obj?.data);
2859
+ }
2860
+ },
2861
+ selectionChanged: (e) => {
2862
+ if (!e.isSelected && e?.data?.onSelected) {
2863
+ e?.data?.onSelected(null);
2864
+ }
2865
+ },
2866
+ }, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'Circle', {
2867
+ fill: 'white',
2868
+ stroke: '#2D3B77',
2869
+ strokeWidth: 2,
2870
+ // strokeDashArray: [5, 5],
2871
+ }), this.$(go.Panel, 'Table', this.$(go.TextBlock, 'Other', {
2872
+ row: 0,
2873
+ margin: new go.Margin(3, 3, 10, 3),
2874
+ maxSize: new go.Size(size.w - 20, NaN),
2875
+ stroke: '#444444',
2876
+ font: 'normal 10pt Arial',
2877
+ textAlign: 'center',
2878
+ }), this.$(go.Picture, icon, {
2879
+ row: 1,
2880
+ margin: new go.Margin(0, 0, 10, 0),
2881
+ alignment: go.Spot.Center,
2882
+ maxSize: new go.Size(60, 60),
2883
+ imageStretch: go.GraphObject.Uniform,
2884
+ }))));
2885
+ break;
2886
+ }
2887
+ if (node) {
2888
+ this.myDiagram.nodeTemplateMap.set(title, node);
2889
+ }
2890
+ }
2891
+ startAnimation() {
2892
+ const diagram = this.myDiagram;
2893
+ // setTimeout(() => {
2894
+ // diagram.links.each((link) => {
2895
+ // });
2896
+ // });
2897
+ try {
2898
+ this.animationInterval = setInterval(() => {
2899
+ const oldskips = diagram.skipsUndoManager;
2900
+ diagram.skipsUndoManager = true;
2901
+ diagram.links.each((link) => {
2902
+ const shape = link.findObject('PIPE');
2903
+ if (!!shape) {
2904
+ // const off = shape?.strokeDashOffset - 3;
2905
+ const off = shape?.strokeDashOffset - 9;
2906
+ // animate (move) the stroke dash
2907
+ shape.strokeDashOffset = off <= 0 ? 60 : off;
2908
+ }
2909
+ });
2910
+ diagram.skipsUndoManager = oldskips;
2911
+ }, 600);
2912
+ // 60
2913
+ }
2914
+ catch (e) { }
2915
+ }
2916
+ stopAnimation() {
2917
+ if (this.animationInterval) {
2918
+ clearInterval(this.animationInterval);
2919
+ }
2920
+ }
2921
+ toDataURL(url, callback) {
2922
+ const xhr = new XMLHttpRequest();
2923
+ xhr.onload = function () {
2924
+ const reader = new FileReader();
2925
+ reader.onloadend = function () {
2926
+ callback(reader.result);
2927
+ };
2928
+ reader.readAsDataURL(xhr.response);
2929
+ };
2930
+ xhr.open('GET', url);
2931
+ xhr.responseType = 'blob';
2932
+ xhr.send();
2933
+ }
2934
+ getBase64DiagramWithEmptyData() {
2935
+ const self = this;
2936
+ // Test
2937
+ // const newWindow = window.open('', 'newWindow');
2938
+ // if (!newWindow) {
2939
+ // return;
2940
+ // }
2941
+ // const newDocument = newWindow?.document;
2942
+ if (!this.myDiagram?.model?.nodeDataArray?.length && !this.myDiagram?.model?.linkDataArray?.length) {
2943
+ return;
2944
+ }
2945
+ const svg = this.myDiagram.makeSvg({
2946
+ scale: this.defaultScaleZoomToFit,
2947
+ maxSize: new go.Size(1200, NaN),
2948
+ background: 'white',
2949
+ padding: 20,
2950
+ elementFinished: function (graphObject, svgElement) {
2951
+ svgElement.removeAttribute('clip-path');
2952
+ // Replace Image URL to base64 -> For showing Picture element
2953
+ if (graphObject instanceof go.Picture) {
2954
+ self.toDataURL(svgElement.href.baseVal, function (dataUrl) {
2955
+ svgElement.setAttribute('href', dataUrl);
2956
+ });
2957
+ }
2958
+ // Make Text Node Shape Border
2959
+ if (graphObject?.name === 'textNodeShape') {
2960
+ svgElement.setAttribute('stroke', 'rgba(64, 181, 206, 0.6)');
2961
+ }
2962
+ // Empty Value
2963
+ if (graphObject?.name === 'textBlockValue' || graphObject?.name === 'textBlockUnitPrefixes') {
2964
+ svgElement.textContent = '';
2965
+ }
2966
+ if (svgElement.clipPath) {
2967
+ svgElement.clipPath = null;
2968
+ }
2969
+ },
2970
+ callback: (svg) => {
2971
+ setTimeout(() => {
2972
+ const svgStr = new XMLSerializer().serializeToString(svg);
2973
+ // For Test
2974
+ // newDocument?.body?.appendChild(svg);
2975
+ const base64Svg = `data:image/svg+xml;base64,${window.btoa(unescape(encodeURIComponent(svgStr)))}`;
2976
+ const img = new Image();
2977
+ img.src = base64Svg;
2978
+ const canvas = document.createElement('canvas');
2979
+ // get canvas context for drawing on canvas
2980
+ const context = canvas.getContext('2d');
2981
+ img.onload = function () {
2982
+ const svgWidth = img.width;
2983
+ const svgHeight = img.height;
2984
+ canvas.width = svgWidth;
2985
+ canvas.height = svgHeight;
2986
+ if (context) {
2987
+ context.drawImage(img, 0, 0);
2988
+ const base64PNG = canvas.toDataURL('image/jpeg');
2989
+ self.emitImageTopology(base64PNG.replace('data:image/jpeg;base64,', ''));
2990
+ }
2991
+ };
2992
+ }, 1000);
2993
+ },
2994
+ });
2995
+ }
2996
+ emitImageTopology(base64) {
2997
+ this.callbackImageTopology.emit(base64);
2998
+ }
2999
+ openActionMenu() {
3000
+ // When this node is clicked, adjust the menu position
3001
+ const mousePt = this.myDiagram.lastInput.viewPoint;
3002
+ // // When this node is clicked, display the dropdown menu
3003
+ const menu = document.getElementById(this.actionMenuId);
3004
+ if (menu) {
3005
+ menu.style.display = '';
3006
+ menu.style.position = 'absolute';
3007
+ menu.style.left = mousePt.x + 'px';
3008
+ menu.style.top = mousePt.y + 'px';
3009
+ this.menuTrigger.openMenu();
3010
+ }
3011
+ }
3012
+ unsubscribeAll() {
3013
+ if (this._subscriptionList) {
3014
+ this._subscriptionList.unsubscribe();
3015
+ }
3016
+ this._subscriptionList = new Subscription();
3017
+ }
3018
+ addSubscribes(...subscriptions) {
3019
+ subscriptions.forEach((el) => {
3020
+ this._subscriptionList.add(el);
3021
+ });
3022
+ }
3023
+ }
3024
+ AtoDefaultGojsEditor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AtoDefaultGojsEditor, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3025
+ AtoDefaultGojsEditor.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: AtoDefaultGojsEditor, inputs: { linkValidation: "linkValidation", initialOptions: "initialOptions", editor: "editor", isShowNodeInfo: "isShowNodeInfo", plantSatus: "plantSatus" }, outputs: { onModelChangeListenerEvent: "onModelChangeListenerEvent", onClickInfoButton: "onClickInfoButton", onOpenWizard: "onOpenWizard", onOpenDetail: "onOpenDetail", onOpenAssetParameter: "onOpenAssetParameter", onOpenInsightMapping: "onOpenInsightMapping", onHoverInfoButton: "onHoverInfoButton", onHoverAlert: "onHoverAlert", onDoubleClickNode: "onDoubleClickNode", onOpenChangeIcon: "onOpenChangeIcon", onClickCompoent: "onClickCompoent", callbackImageTopology: "callbackImageTopology", onClikParamOfTable: "onClikParamOfTable", onDeleteNode: "onDeleteNode", onUndo: "onUndo", onRename: "onRename" }, viewQueries: [{ propertyName: "menuTrigger", first: true, predicate: ["menuTrigger"], descendants: true }], ngImport: i0 });
3026
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AtoDefaultGojsEditor, decorators: [{
3027
+ type: Directive
3028
+ }], ctorParameters: function () { return []; }, propDecorators: { menuTrigger: [{
3029
+ type: ViewChild,
3030
+ args: ['menuTrigger']
3031
+ }], linkValidation: [{
3032
+ type: Input
3033
+ }], initialOptions: [{
3034
+ type: Input
3035
+ }], editor: [{
3036
+ type: Input
3037
+ }], isShowNodeInfo: [{
3038
+ type: Input
3039
+ }], plantSatus: [{
3040
+ type: Input
3041
+ }], onModelChangeListenerEvent: [{
3042
+ type: Output
3043
+ }], onClickInfoButton: [{
3044
+ type: Output
3045
+ }], onOpenWizard: [{
3046
+ type: Output
3047
+ }], onOpenDetail: [{
3048
+ type: Output
3049
+ }], onOpenAssetParameter: [{
3050
+ type: Output
3051
+ }], onOpenInsightMapping: [{
3052
+ type: Output
3053
+ }], onHoverInfoButton: [{
3054
+ type: Output
3055
+ }], onHoverAlert: [{
3056
+ type: Output
3057
+ }], onDoubleClickNode: [{
3058
+ type: Output
3059
+ }], onOpenChangeIcon: [{
3060
+ type: Output
3061
+ }], onClickCompoent: [{
3062
+ type: Output
3063
+ }], callbackImageTopology: [{
3064
+ type: Output
3065
+ }], onClikParamOfTable: [{
3066
+ type: Output
3067
+ }], onDeleteNode: [{
3068
+ type: Output
3069
+ }], onUndo: [{
3070
+ type: Output
3071
+ }], onRename: [{
3072
+ type: Output
3073
+ }] } });
3074
+ (function (AtoDefaultGojsEditor) {
3075
+ let ENUM_ACTIONS;
3076
+ (function (ENUM_ACTIONS) {
3077
+ ENUM_ACTIONS["DETAILS"] = "Open details & wizard";
3078
+ ENUM_ACTIONS["ONLY_DETAILS"] = "Open details";
3079
+ ENUM_ACTIONS["RENAME"] = "Rename this box";
3080
+ ENUM_ACTIONS["OUTFLOW"] = "Create an outflow";
3081
+ ENUM_ACTIONS["DELETE"] = "Delete";
3082
+ ENUM_ACTIONS["INSIGHT"] = "Insight tag mapping";
3083
+ ENUM_ACTIONS["DATA_MAPPING"] = "Data Mapping";
3084
+ ENUM_ACTIONS["MORE"] = "More";
3085
+ ENUM_ACTIONS["FLOW_DETAILS"] = "Flow details";
3086
+ ENUM_ACTIONS["ASSET_PARAMETERS"] = "Asset parameters";
3087
+ ENUM_ACTIONS["CHANGE_ICON"] = "Change icon";
3088
+ })(ENUM_ACTIONS = AtoDefaultGojsEditor.ENUM_ACTIONS || (AtoDefaultGojsEditor.ENUM_ACTIONS = {}));
3089
+ AtoDefaultGojsEditor.ACTIONS = {
3090
+ [ENUM_ACTIONS.DETAILS]: {
3091
+ name: ENUM_ACTIONS.DETAILS,
3092
+ iconClassName: 'far fa-memo-circle-info',
3093
+ onClick: () => { },
3094
+ },
3095
+ [ENUM_ACTIONS.FLOW_DETAILS]: {
3096
+ name: ENUM_ACTIONS.FLOW_DETAILS,
3097
+ iconClassName: 'far fa-arrow-progress',
3098
+ onClick: () => { },
3099
+ },
3100
+ [ENUM_ACTIONS.ASSET_PARAMETERS]: {
3101
+ name: ENUM_ACTIONS.ASSET_PARAMETERS,
3102
+ iconClassName: 'far fa-box-archive',
3103
+ onClick: () => { },
3104
+ },
3105
+ [ENUM_ACTIONS.ONLY_DETAILS]: {
3106
+ name: ENUM_ACTIONS.ONLY_DETAILS,
3107
+ iconClassName: 'far fa-memo-circle-info',
3108
+ onClick: () => { },
3109
+ },
3110
+ [ENUM_ACTIONS.RENAME]: {
3111
+ name: ENUM_ACTIONS.RENAME,
3112
+ iconClassName: 'far fa-input-text',
3113
+ onClick: () => { },
3114
+ },
3115
+ [ENUM_ACTIONS.OUTFLOW]: {
3116
+ name: ENUM_ACTIONS.OUTFLOW,
3117
+ iconClassName: 'far fa-diagram-nested',
3118
+ onClick: () => { },
3119
+ },
3120
+ [ENUM_ACTIONS.DELETE]: {
3121
+ name: ENUM_ACTIONS.DELETE,
3122
+ iconClassName: 'fal fa-trash-can',
3123
+ onClick: () => { },
3124
+ },
3125
+ [ENUM_ACTIONS.INSIGHT]: {
3126
+ name: ENUM_ACTIONS.INSIGHT,
3127
+ iconClassName: 'far fa-tag',
3128
+ onClick: () => { },
3129
+ },
3130
+ [ENUM_ACTIONS.DATA_MAPPING]: {
3131
+ name: ENUM_ACTIONS.DATA_MAPPING,
3132
+ iconClassName: 'far fa-tag',
3133
+ onClick: () => { },
3134
+ },
3135
+ [ENUM_ACTIONS.MORE]: {
3136
+ name: ENUM_ACTIONS.MORE,
3137
+ iconClassName: 'fal fa-memo-circle-info',
3138
+ onClick: () => { },
3139
+ },
3140
+ [ENUM_ACTIONS.CHANGE_ICON]: {
3141
+ name: ENUM_ACTIONS.CHANGE_ICON,
3142
+ iconClassName: 'far fa-image',
3143
+ onClick: () => { },
3144
+ },
3145
+ };
3146
+ AtoDefaultGojsEditor.DISTANCE_2_OUTPUT = 60;
3147
+ })(AtoDefaultGojsEditor || (AtoDefaultGojsEditor = {}));
3148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1nb2pzLWVkaXRvci5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F0by13YXRlci1saWIvc3JjL2xpYi9tb2RlbHMvZGVmYXVsdC1nb2pzLWVkaXRvci5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0IsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFHLHVCQUF1QixFQUFFLHlCQUF5QixFQUN4RCxPQUFPLEVBQ1AsWUFBWSxFQUNaLFFBQVEsR0FBRyxNQUFNLDBCQUEwQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQU83RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUxwQyxNQUFNLFVBQVUsR0FBRyxvQ0FBb0MsQ0FBQztBQUN4RCxNQUFNLEtBQUssR0FBRyxrQ0FBa0MsQ0FBQztBQUNqRCxNQUFNLFVBQVUsR0FBRyx1Q0FBdUMsQ0FBQztBQUMzRCxNQUFNLGFBQWEsR0FBRywwQ0FBMEMsQ0FBQztBQUNqRSxNQUFNLGtCQUFrQixHQUFHLCtDQUErQyxDQUFDO0FBSTNFLE1BQU0sT0FBTyxvQkFBb0I7SUEr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QVksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuQixJQUFJLEVBQUUsWUFBWSxDQUFDLE1BQU07WUFDekIsYUFBYSxFQUFFLGtCQUFrQjtZQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztTQUNwQjtRQUNELENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3BCLElBQUksRUFBRSxZQUFZLENBQUMsT0FBTztZQUMxQixhQUFhLEVBQUUsWUFBWTtZQUMzQixPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztTQUNwQjtRQUNELENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3pCLElBQUksRUFBRSxZQUFZLENBQUMsWUFBWTtZQUMvQixhQUFhLEVBQUUsWUFBWTtZQUMzQixPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztTQUNwQjtRQUNELENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pCLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSTtZQUN2QixhQUFhLEVBQUUseUJBQXlCO1lBQ3hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDO1NBQ3BCO1FBQ0QsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDeEIsSUFBSSxFQUFFLFlBQVksQ0FBQyxXQUFXO1lBQzlCLGFBQWEsRUFBRSxjQUFjO1lBQzdCLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDO1NBQ3BCO0tBQ0osQ0FBQztJQUVXLHNDQUFpQixHQUFHLEVBQUUsQ0FBQztBQUN4QyxDQUFDLEVBMUVnQixvQkFBb0IsS0FBcEIsb0JBQW9CLFFBMEVwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgR29qc0VkaXRvck1vZGVsIH0gZnJvbSAnLi9nb2pzLWVkaXRvci5tb2RlbCc7XG5pbXBvcnQgKiBhcyBnbyBmcm9tICdnb2pzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBHT19MSUNFTlNFX0tFWSB9IGZyb20gJy4uL2NvbnN0YW50cy9rZXkuY29uc3QnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdXRpbHMvdXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyAgQVRPX0VOVU1fRkxPV19ESVJFQ1RJT04sIEFUT19FQ09NUE9ORU5UX1BMQU5UX1RZUEUsXG4gICAgTk9fREFUQSxcbiAgICBURVhUX1VOS05PV04sXG4gICAgVkFMVUVfTkEsIH0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlLmNvbnN0JztcbmltcG9ydCB7IEFUT19FUGxhbnRUeXBlIH0gZnJvbSAnLi4vY29uc3RhbnRzL3BsYW50LmNvbnN0YW50JztcblxuY29uc3QgSUNPTl9BTEVSVCA9ICcuLi9hc3NldHMvaW1hZ2VzL2ljb25zL1N0YXRpb24uc3ZnJztcbmNvbnN0IEFSUk9XID0gJy4uL2Fzc2V0cy9pbWFnZXMvaWNvbnMvYXJyb3cuc3ZnJztcbmNvbnN0IEFSUk9XX0dSQVkgPSAnLi4vYXNzZXRzL2ltYWdlcy9pY29ucy9hcnJvdy1ncmF5LnN2Zyc7XG5jb25zdCBST19MSU5FX0RJUlRZID0gJy4uL2Fzc2V0cy9pbWFnZXMvaWNvbnMvcm9fbGluZV9kaXJ0eS5zdmcnO1xuY29uc3QgT1VURkxPV19MSU5FX0RJUlRZID0gJy4uL2Fzc2V0cy9pbWFnZXMvaWNvbnMvb3V0Zmxvd19saW5lX2RpcnR5LnBuZyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgQXRvRGVmYXVsdEdvanNFZGl0b3IgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoJ21lbnVUcmlnZ2VyJykgbWVudVRyaWdnZXI6IGFueTtcbiAgICBASW5wdXQoKSBsaW5rVmFsaWRhdGlvbjogKFxuICAgICAgICBmcm9tTm9kZTogZ28uTm9kZSxcbiAgICAgICAgZnJvbVBvcnQ6IGdvLkdyYXBoT2JqZWN0LFxuICAgICAgICB0b05vZGU6IGdvLk5vZGUsXG4gICAgICAgIHRvUG9ydDogZ28uR3JhcGhPYmplY3QsXG4gICAgICAgIGxpbms6IGdvLkxpbmssXG4gICAgKSA9PiBib29sZWFuO1xuXG4gICAgYWN0aW9uczogYW55W10gPSBbXTtcbiAgICBhY3Rpb25NZW51SWQ6IHN0cmluZyA9ICdhY3Rpb25NZW51SWQnO1xuXG4gICAgbXlEaWFncmFtRGl2OiBhbnkgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLScgKyBtb21lbnQoKS52YWx1ZU9mKCk7XG4gICAgbXlEaWFncmFtOiBhbnk7XG4gICAgJCA9IGdvLkdyYXBoT2JqZWN0Lm1ha2U7XG4gICAgYW5pbWF0aW9uSW50ZXJ2YWw6IGFueTtcbiAgICBkZWZhdWx0U2NhbGVab29tVG9GaXQ/OiBudW1iZXI7XG5cbiAgICBwcml2YXRlIF9pbml0aWFsT3B0aW9uczogYW55ID0ge1xuICAgICAgICAndG9vbE1hbmFnZXIuaG92ZXJEZWxheSc6IDIwMCxcbiAgICAgICAgLy8gJ2RyYWdnaW5nVG9vbC5pc0VuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gaW5pdGlhbEF1dG9TY2FsZTogZ28uRGlhZ3JhbS5Vbmlmb3JtVG9GaWxsLFxuICAgICAgICAvLyBhdXRvU2Nyb2xsUmVnaW9uOiBHb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSxcbiAgICAgICAgbGF5b3V0OiB0aGlzLiQoZ28uTGF5ZXJlZERpZ3JhcGhMYXlvdXQsIHsgZGlyZWN0aW9uOiAwIH0pLFxuICAgICAgICBpbml0aWFsQ29udGVudEFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgIGluaXRpYWxBdXRvU2NhbGU6IGdvLkRpYWdyYW0uVW5pZm9ybSxcbiAgICAgICAgLy8gY29udGVudEFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgIC8vIHRoaXMuJChnby5Gb3JjZURpcmVjdGVkTGF5b3V0KSxcbiAgICAgICAgJ3VuZG9NYW5hZ2VyLmlzRW5hYmxlZCc6IHRydWUsIC8vIGVuYWJsZSB1bmRvICYgcmVkb1xuICAgICAgICAvLyBcImFuaW1hdGlvbk1hbmFnZXIuaXNJbml0aWFsXCI6IGZhbHNlLFxuICAgICAgICAvLyBcImFuaW1hdGlvbk1hbmFnZXIuaXNFbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAvLyBcImRyYWdnaW5nVG9vbC5pc0dyaWRTbmFwRW5hYmxlZFwiOiB0cnVlXG4gICAgICAgIGRyYWdTZWxlY3RpbmdUb29sOiB0aGlzLiQoXG4gICAgICAgICAgICBnby5EcmFnU2VsZWN0aW5nVG9vbCxcbiAgICAgICAgICAgIHsgaXNQYXJ0aWFsSW5jbHVzaW9uOiB0cnVlLCBkZWxheTogNTAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBib3g6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgZ28uUGFydCwgLy8gcmVwbGFjZSB0aGUgbWFnZW50YSBib3ggd2l0aCBhIHJlZCBvbmVcbiAgICAgICAgICAgICAgICAgICAgeyBsYXllck5hbWU6ICdUb29sJywgc2VsZWN0YWJsZTogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU0hBUEUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogJ3JnYmEoMjU1LDAsMCwwKScsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6ICcjRTk1RjQ3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgJ2xpbmtpbmdUb29sLmxpbmtWYWxpZGF0aW9uJzogdGhpcy5jaGVja0xpbmtDb25kaXRpb24uYmluZCh0aGlzKSxcbiAgICAgICAgJ2RyYWdnaW5nVG9vbC5kb01vdXNlTW92ZSc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGRvIHRoZSBzdGFuZGFyZCBiZWhhdmlvciBieSBjYWxsaW5nIHRoZSBzdXBlciBtZXRob2RcbiAgICAgICAgICAgIGdvLkRyYWdnaW5nVG9vbC5wcm90b3R5cGUuZG9Nb3VzZU1vdmUuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIC8vIGlmIGRyYWdnaW5nLW91dCBmcm9tIHRoZSBkaWFncmFtIGlzIG5vdCBhbGxvd2VkLCBhbmRcbiAgICAgICAgICAgIC8vIGlmIG1vdXNlIGlzIG91dHNpZGUgb2Ygdmlld3BvcnRcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhdGhpcy5kaWFncmFtLmFsbG93RHJhZ091dCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLmRpYWdyYW0udmlld3BvcnRCb3VuZHMuY29udGFpbnNQb2ludCh0aGlzLmRpYWdyYW0ubGFzdElucHV0LmRvY3VtZW50UG9pbnQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpYWdyYW0uZW5zdXJlQm91bmRzKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdnAgPSB0aGlzLmRpYWdyYW0ubGFzdElucHV0LnZpZXdQb2ludDtcbiAgICAgICAgICAgICAgICBjb25zdCBkcCA9IHRoaXMuZGlhZ3JhbS5wb3NpdGlvbi5jb3B5KCk7XG4gICAgICAgICAgICAgICAgaWYgKHZwLnggPCAwKSBkcC54IC09IDEwO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZwLnggPiAwKSBkcC54ICs9IDEwO1xuICAgICAgICAgICAgICAgIGlmICh2cC55IDwgMCkgZHAueSAtPSAxMDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2cC55ID4gMCkgZHAueSArPSAxMDtcbiAgICAgICAgICAgICAgICB0aGlzLmRpYWdyYW0ucG9zaXRpb24gPSBkcDsgLy8gc2Nyb2xsIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1vdXNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIExheW91dENvbXBsZXRlZDogKCkgPT4ge1xuICAgICAgICAvLyAgICAgdGhpcy5teURpYWdyYW0uem9vbVRvRml0KCk7XG4gICAgICAgIC8vICAgICB0aGlzLmRlZmF1bHRTY2FsZVpvb21Ub0ZpdCA9IHRoaXMubXlEaWFncmFtLnNjYWxlO1xuICAgICAgICAvLyAgICAgaWYgKCF0aGlzLmluaXRpYWxPcHRpb25zLmlzUmVhZE9ubHkpIHtcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBzaXplTWFyZ2luID0gR29qc0VkaXRvck1vZGVsLkdSSURfU0laRSAqIDE1O1xuICAgICAgICAvLyAgICAgICAgIHRoaXMubXlEaWFncmFtLnBhZGRpbmcgPSBuZXcgZ28uTWFyZ2luKHNpemVNYXJnaW4pO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9LFxuICAgIH07XG5cbiAgICBjaGVja0xpbmtDb25kaXRpb24oXG4gICAgICAgIGZyb21Ob2RlOiBnby5Ob2RlLFxuICAgICAgICBmcm9tUG9ydDogZ28uR3JhcGhPYmplY3QsXG4gICAgICAgIHRvTm9kZTogZ28uTm9kZSxcbiAgICAgICAgdG9Qb3J0OiBnby5HcmFwaE9iamVjdCxcbiAgICAgICAgbGluazogZ28uTGluayxcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubGlua1ZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpbmtWYWxpZGF0aW9uKGZyb21Ob2RlLCBmcm9tUG9ydCwgdG9Ob2RlLCB0b1BvcnQsIGxpbmspO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBN4bq3YyDEkeG7i25oIGNobyB0csaw4budbmcgaOG7o3Aga2jDtG5nIGPDsyBow6BtIGxpbmtWYWxpZGF0aW9uIMSRxrDhu6NjIHRydXnhu4FuIHbDoG9cbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgaW5pdGlhbE9wdGlvbnModjogYW55KSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zID0gXy5tZXJnZSh0aGlzLl9pbml0aWFsT3B0aW9ucywgdik7XG4gICAgICAgIC8vIF8uZXh0ZW5kKHYsIHRoaXMuX2luaXRpYWxPcHRpb25zKTtcbiAgICB9XG5cbiAgICBnZXQgaW5pdGlhbE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbml0aWFsT3B0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9lZGl0b3I6IEdvanNFZGl0b3JNb2RlbDtcbiAgICBASW5wdXQoKSBzZXQgZWRpdG9yKHY6IEdvanNFZGl0b3JNb2RlbCkge1xuICAgICAgICB0aGlzLl9lZGl0b3IgPSB2O1xuICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0RGlhZ3JhbSgpO1xuICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBlZGl0b3IoKTogR29qc0VkaXRvck1vZGVsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRvcjtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBpc1Nob3dOb2RlSW5mbzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHBsYW50U2F0dXM6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBnby5EaWFncmFtLmxpY2Vuc2VLZXkgPSBHT19MSUNFTlNFX0tFWTtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgb25Nb2RlbENoYW5nZUxpc3RlbmVyRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uQ2xpY2tJbmZvQnV0dG9uOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbk9wZW5XaXphcmQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uT3BlbkRldGFpbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25PcGVuQXNzZXRQYXJhbWV0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uT3Blbkluc2lnaHRNYXBwaW5nOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbkhvdmVySW5mb0J1dHRvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25Ib3ZlckFsZXJ0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbkRvdWJsZUNsaWNrTm9kZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25PcGVuQ2hhbmdlSWNvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICAvLyBDbGljayBjb21wb25lbnRcbiAgICBAT3V0cHV0KCkgb25DbGlja0NvbXBvZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBjYWxsYmFja0ltYWdlVG9wb2xvZ3k6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvLyBDbGljayBwYXJhbSBvbiBQYXJhbVRhYmxlXG4gICAgQE91dHB1dCgpIG9uQ2xpa1BhcmFtT2ZUYWJsZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIC8vIERlbGV0ZSBOb2RlXG4gICAgQE91dHB1dCgpIG9uRGVsZXRlTm9kZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25VbmRvOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIC8vIFJlbmFtZVxuICAgIEBPdXRwdXQoKSBvblJlbmFtZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIGlzQWRkZWRNb2RlbENoYW5nZWRMaXN0ZW5lcnM6IGJvb2xlYW47XG4gICAgY29tbWl0dGVkVHJhbnNhY3Rpb25TdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gICAgLy8gQWRkU3ViIGFuZCBVblN1YlxuICAgIF9zdWJzY3JpcHRpb25MaXN0OiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZUFsbCgpO1xuICAgICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcbiAgICAgICAgLy8gdGhpcy5teURpYWdyYW0/LmNsZWFyKCk7XG4gICAgICAgIGlmICghIXRoaXMubXlEaWFncmFtPy5kaXYpIHtcbiAgICAgICAgICAgIHRoaXMubXlEaWFncmFtLmRpdiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubXlEaWFncmFtKSB7XG4gICAgICAgICAgICB0aGlzLm15RGlhZ3JhbS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm15RGlhZ3JhbSAhPSBudWxsICYmIHRoaXMubXlEaWFncmFtLm5vZGVUZW1wbGF0ZU1hcCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm15RGlhZ3JhbS5ub2RlVGVtcGxhdGVNYXAuY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm15RGlhZ3JhbSAhPSBudWxsICYmIHRoaXMubXlEaWFncmFtLmdyb3VwVGVtcGxhdGVNYXAgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5teURpYWdyYW0uZ3JvdXBUZW1wbGF0ZU1hcC5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm15RGlhZ3JhbSAhPSBudWxsICYmIHRoaXMubXlEaWFncmFtLmxpbmtUZW1wbGF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5teURpYWdyYW0ubGlua1RlbXBsYXRlTWFwLnRvQXJyYXkoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubXlEaWFncmFtLmxpbmtUZW1wbGF0ZU1hcC5yZW1vdmUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm15RGlhZ3JhbSA9IG51bGw7XG4gICAgfVxuXG4gICAgYWRkT3JSZW1vdmVDb21wb2VudFRlbXBsYXRlKCkge1xuICAgICAgICAvLyBBZGQgTm9kZSBhbmQgTm9kZSBHcm91cFxuICAgICAgICBfLmZvckVhY2godGhpcy5lZGl0b3IuZGF0YT8ubm9kZURhdGFBcnJheSwgKG5vZGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkVGVtcGxhdGUobm9kZSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBSZW1vdmUgTm9kZSBhbmQgTm9kZSBHcm91cFxuICAgICAgICBfLmZvckVhY2godGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwPy5IYiwgKHRlbXApID0+IHtcbiAgICAgICAgICAgIGlmICh0ZW1wPy5rZXkgJiYgIXRoaXMuZWRpdG9yLmRhdGE/Lm5vZGVEYXRhQXJyYXk/LnNvbWUoKG5vZGU6IGFueSkgPT4gbm9kZT8udHlwZSA9PT0gdGVtcD8ua2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMubXlEaWFncmFtLm5vZGVUZW1wbGF0ZU1hcC5yZW1vdmUodGVtcD8ua2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIF8uZm9yRWFjaCh0aGlzLm15RGlhZ3JhbS5ncm91cFRlbXBsYXRlTWFwPy5IYiwgKHRlbXApID0+IHtcbiAgICAgICAgICAgIGlmICh0ZW1wPy5rZXkgJiYgIXRoaXMuZWRpdG9yLmRhdGE/Lm5vZGVEYXRhQXJyYXk/LnNvbWUoKG5vZGU6IGFueSkgPT4gbm9kZT8udHlwZSA9PT0gdGVtcD8ua2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMubXlEaWFncmFtLmdyb3VwVGVtcGxhdGVNYXAucmVtb3ZlKHRlbXA/LmtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZFRlbXBsYXRlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hZGROb2RlVGVtcGxhdGUobm9kZSk7XG4gICAgICAgIHRoaXMuYWRkR3JvdXBUZW1wbGF0ZShub2RlKTtcbiAgICB9XG5cbiAgICBhZGRHcm91cFRlbXBsYXRlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMubXlEaWFncmFtLmdyb3VwVGVtcGxhdGVNYXA/LkhiPy5bbm9kZT8udHlwZV0gfHwgIW5vZGU/LmlzR3JvdXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBHcm91cFxuICAgICAgICBpZiAobm9kZT8udHlwZSA9PT0gR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlJPX1dBVEVSX1RSRUFUTUVOVCkge1xuICAgICAgICAgICAgdGhpcy5tYWtlR3JvdXBST1BsYW50VGVtcGxhdGUoXG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLmljb24sXG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLm5hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGU/LnR5cGUgPT09IEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5CT0lMRVIpIHtcbiAgICAgICAgICAgIHRoaXMubWFrZUdyb3VwQm9pbGVyVGVtcGxhdGUoXG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLmljb24sXG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLm5hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGU/LnR5cGUgPT09IEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5DT09MSU5HX1RPV0VSKSB7XG4gICAgICAgICAgICB0aGlzLm1ha2VHcm91cENvb2xpbmdUb3dlclRlbXBsYXRlKFxuICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5pY29uLFxuICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5uYW1lLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlPy50eXBlID09PSBHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuWk9ORSkge1xuICAgICAgICAgICAgdGhpcy5tYWtlR3JvdXBab25lVGVtcGxhdGUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlPy50eXBlID09PSBHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuUExBTlRfQ0VMTCAmJiBub2RlPy5pc0dyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwUGxhbnRDZWxsVGVtcGxhdGUoXG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLmljb24sXG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLm5hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlPy50eXBlID09PSBHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuUExBTlRfQ0VMTF9JTlBVVF9HUk9VUCkge1xuICAgICAgICAgICAgdGhpcy5ncm91cFBDSW5wdXRPck91dFRlbXBsYXRlKFxuICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5pY29uLFxuICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5uYW1lLFxuICAgICAgICAgICAgICAgIG5ldyBnby5NYXJnaW4oMCwgNTAsIDAsIDApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZT8udHlwZSA9PT0gR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlBMQU5UX0NFTExfT1VUUFVUX0dST1VQKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwUENJbnB1dE9yT3V0VGVtcGxhdGUoXG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLmljb24sXG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLm5hbWUsXG4gICAgICAgICAgICAgICAgbmV3IGdvLk1hcmdpbigwLCAwLCAwLCA1MCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlPy50eXBlID09PSBHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuR1JPVVBfQkFTSUNfQ09NUE9ORU5UKSB7XG4gICAgICAgICAgICB0aGlzLm1ha2VHcm91cEJhc2ljQ29tcG9uZW50KFxuICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5pY29uLFxuICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5uYW1lLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFrZUdyb3VwVGVtcGxhdGUoXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbbm9kZT8udHlwZV0uaWNvbixcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5uYW1lLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGFkZE5vZGVUZW1wbGF0ZShub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLm15RGlhZ3JhbS5ub2RlVGVtcGxhdGVNYXA/LkhiPy5bbm9kZT8udHlwZV0gfHwgbm9kZT8uaXNHcm91cCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdCBHcm91cFxuICAgICAgICAvLyBDb21wb25lbnQgV2F0ZXIgTm9ybWFsXG4gICAgICAgIGlmIChHb2pzRWRpdG9yTW9kZWwuVFlQRV9URU1QTEFURV9XQVRFUl9OT1JNQUw/LmluY2x1ZGVzKG5vZGU/LnR5cGUpICYmICFub2RlPy5pc0dyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLm1ha2VFbnRpdHlUZW1wbGF0ZShcbiAgICAgICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbbm9kZT8udHlwZV0uaWNvbiA/PyAnJyxcbiAgICAgICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbbm9kZT8udHlwZV0ubmFtZSA/PyAnJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29tcG9uZW50IFdhdGVyIFdpdGhkcmF3IE9yIERpc2NoYXJnZVxuICAgICAgICBpZiAoR29qc0VkaXRvck1vZGVsLlRZUEVfVEVNUExBVEVfV0FURVJfV0lUSERSQVdfT1JfRElTQ0hBUkdFPy5pbmNsdWRlcyhub2RlPy50eXBlKSAmJiAhbm9kZT8uaXNHcm91cCkge1xuICAgICAgICAgICAgdGhpcy5tYWtlRW50aXR5V2l0aGRyYXdPckRpc2NoYXJnZShcbiAgICAgICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbbm9kZT8udHlwZV0uaWNvbiA/PyAnJyxcbiAgICAgICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbbm9kZT8udHlwZV0ubmFtZSA/PyAnJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21wb25lbnQgRW5lcmd5IE5vcm1hbFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoR29qc0VkaXRvck1vZGVsLlRZUEVfVEVNUExBVEVfRUxFQ1RSSUNJVFk/LmluY2x1ZGVzKG5vZGU/LnR5cGUpIHx8XG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLlRZUEVfVEVNUExBVEVfTkFUVVJBTF9HQVM/LmluY2x1ZGVzKG5vZGU/LnR5cGUpIHx8XG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLlRZUEVfVEVNUExBVEVfRlVFTD8uaW5jbHVkZXMobm9kZT8udHlwZSkgfHxcbiAgICAgICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuVFlQRV9URU1QTEFURV9TVEVBTT8uaW5jbHVkZXMobm9kZT8udHlwZSkpICYmXG4gICAgICAgICAgICAhbm9kZT8uaXNHcm91cFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMubWFrZUVudGl0eVRlbXBsYXRlRW5lcmd5KFxuICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5pY29uID8/ICcnLFxuICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5uYW1lID8/ICcnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlPy50eXBlID09PSBHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuSU1BR0VfVEVNUExBVEUpIHtcbiAgICAgICAgICAgIHRoaXMubWFrZUltYWdlVGVtcGxhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZT8udHlwZSA9PT0gR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlBBUkFNX1RBQkxFKSB7XG4gICAgICAgICAgICB0aGlzLm1ha2VQYXJhbVRhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGU/LnR5cGUgPT09IEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5NQVNTX0JBTEFOQ0UpIHtcbiAgICAgICAgICAgIHRoaXMubWFrZU1hc3NCYWxhbmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGV4dCBOb2RlXG4gICAgICAgIGlmIChub2RlPy50eXBlID09PSBHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICB0aGlzLm1ha2VUZXh0VGVtcGxhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWYWx1ZSBOb2RlXG4gICAgICAgIGlmIChub2RlPy50eXBlID09PSBHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuVkFMVUVfTk9ERSkge1xuICAgICAgICAgICAgdGhpcy5tYWtlVmFsdWVOb2RlVGVtcGxhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbHVlIE5vZGVcbiAgICAgICAgaWYgKG5vZGU/LnR5cGUgPT09IEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5FTVBUWSkge1xuICAgICAgICAgICAgdGhpcy5tYWtlRW1wdHlOb2RlVGVtcGxhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbHVlIExhYmVsXG4gICAgICAgIGlmIChub2RlPy50eXBlID09PSBHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuVkFMVUVfTEFCRUwpIHtcbiAgICAgICAgICAgIHRoaXMubWFrZVZhbHVlTGFiZWxUZW1wbGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFpvbmUgaXRlbVxuICAgICAgICBpZiAobm9kZT8udHlwZSA9PT0gR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlpPTkVfRU5FUkdZX0lURU0pIHtcbiAgICAgICAgICAgIHRoaXMubWFrZVpvbmVJdGVtVGVtcGxhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkYXRhIGJveFxuICAgICAgICBpZiAobm9kZT8udHlwZSA9PT0gR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkRBVEFfQk9YKSB7XG4gICAgICAgICAgICB0aGlzLm1ha2VEYXRhQm94VGVtcGxhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNwZWNpYWwgdGVtcGxhdGVcbiAgICAgICAgaWYgKEdvanNFZGl0b3JNb2RlbC5UWVBFX1RFTVBMQVRFX1NQRUNJQUw/LmluY2x1ZGVzKG5vZGU/LnR5cGUpKSB7XG4gICAgICAgICAgICB0aGlzLm1ha2VTcGVjaWFsVGVtcGxhdGUoXG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLmljb24sXG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLm5hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGxhbnQgQ2VsbFxuICAgICAgICBpZiAobm9kZT8udHlwZSA9PT0gR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlBMQU5UX0NFTEwgJiYgIW5vZGU/LmlzR3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMucGxhbnRDZWxsVGVtcGxhdGUoXG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLmljb24sXG4gICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLm5hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdERpYWdyYW0oKSB7XG4gICAgICAgIGlmICghIXRoaXMubXlEaWFncmFtPy5kaXYpIHtcbiAgICAgICAgICAgIC8vIHRoaXMubXlEaWFncmFtLmRpdiA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5pbml0aWFsT3B0aW9ucz8uZ3JpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubXlEaWFncmFtWydncmlkJ10gPSB0aGlzLmluaXRpYWxPcHRpb25zPy5ncmlkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm15RGlhZ3JhbVsnZ3JpZCddID0gdGhpcy4kKGdvLlBhbmVsLCAnR3JpZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaW5pdGlhbE9wdGlvbnM/LkxheW91dENvbXBsZXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubXlEaWFncmFtLmFkZERpYWdyYW1MaXN0ZW5lcignTGF5b3V0Q29tcGxldGVkJywgdGhpcy5pbml0aWFsT3B0aW9ucz8uTGF5b3V0Q29tcGxldGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxPcHRpb25zPy5MaW5rUmVzaGFwZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm15RGlhZ3JhbS5hZGREaWFncmFtTGlzdGVuZXIoJ0xpbmtSZXNoYXBlZCcsIHRoaXMuaW5pdGlhbE9wdGlvbnM/LkxpbmtSZXNoYXBlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pbml0aWFsT3B0aW9ucz8uU2VsZWN0aW9uTW92ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm15RGlhZ3JhbS5hZGREaWFncmFtTGlzdGVuZXIoJ1NlbGVjdGlvbk1vdmVkJywgdGhpcy5pbml0aWFsT3B0aW9ucz8uU2VsZWN0aW9uTW92ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaW5pdGlhbE9wdGlvbnM/LkNoYW5nZWRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm15RGlhZ3JhbS5hZGREaWFncmFtTGlzdGVuZXIoJ0NoYW5nZWRTZWxlY3Rpb24nLCB0aGlzLmluaXRpYWxPcHRpb25zPy5DaGFuZ2VkU2VsZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubXlEaWFncmFtLmRyYWdTZWxlY3RpbmdUb29sID0gdGhpcy5pbml0aWFsT3B0aW9ucz8uZHJhZ1NlbGVjdGluZ1Rvb2w7XG4gICAgICAgICAgICB0aGlzLm15RGlhZ3JhbS50b29sTWFuYWdlci5kcmFnZ2luZ1Rvb2wuaXNHcmlkU25hcEVuYWJsZWQgPVxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbE9wdGlvbnM/LlsnZHJhZ2dpbmdUb29sLmlzR3JpZFNuYXBFbmFibGVkJ10gPz8gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5teURpYWdyYW0udG9vbE1hbmFnZXIgJiYgdGhpcy5teURpYWdyYW0udG9vbE1hbmFnZXIuZHJhZ2dpbmdUb29sKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5pdGlhbE9wdGlvbnM/LlsnZHJhZ2dpbmdUb29sLmdyaWRTbmFwQ2VsbFNpemUnXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm15RGlhZ3JhbS50b29sTWFuYWdlci5kcmFnZ2luZ1Rvb2wuZ3JpZFNuYXBDZWxsU2l6ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxPcHRpb25zPy5bJ2RyYWdnaW5nVG9vbC5ncmlkU25hcENlbGxTaXplJ107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmICh0aGlzLmluaXRpYWxPcHRpb25zPy5bJ2RyYWdnaW5nVG9vbC5pc0dyaWRTbmFwRW5hYmxlZCddKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMubXlEaWFncmFtLnRvb2xNYW5hZ2VyLmRyYWdnaW5nVG9vbC5pc0dyaWRTbmFwRW5hYmxlZCA9XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLmluaXRpYWxPcHRpb25zPy5bJ2RyYWdnaW5nVG9vbC5pc0dyaWRTbmFwRW5hYmxlZCddO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0aWFsT3B0aW9ucz8uWydkcmFnZ2luZ1Rvb2wuZG9Nb3VzZU1vdmUnXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm15RGlhZ3JhbS50b29sTWFuYWdlci5kcmFnZ2luZ1Rvb2wuZG9Nb3VzZU1vdmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsT3B0aW9ucz8uWydkcmFnZ2luZ1Rvb2wuZG9Nb3VzZU1vdmUnXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0aWFsT3B0aW9ucz8uWydsaW5raW5nVG9vbC5saW5rVmFsaWRhdGlvbiddKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubXlEaWFncmFtLnRvb2xNYW5hZ2VyLmxpbmtpbmdUb29sLmxpbmtWYWxpZGF0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbE9wdGlvbnM/LlsnbGlua2luZ1Rvb2wubGlua1ZhbGlkYXRpb24nXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm15RGlhZ3JhbS5jb250ZW50QWxpZ25tZW50ID0gdGhpcy5pbml0aWFsT3B0aW9ucz8uY29udGVudEFsaWdubWVudCA/PyBnby5TcG90LkNlbnRlcjtcbiAgICAgICAgICAgIHRoaXMubXlEaWFncmFtLmxheW91dCA9IHRoaXMuaW5pdGlhbE9wdGlvbnM/LmxheW91dDtcbiAgICAgICAgICAgIC8vIHRoaXMubXlEaWFncmFtLm1pblZpZXdwb3J0Qm91bmRzID0gbmV3IGdvLlJlY3QoMCwgMCwgMTIwMCwgMTIwMCk7XG4gICAgICAgICAgICBpZiAoISF0aGlzLmVkaXRvcj8uZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDb21wb2VudFRlbXBsYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5teURpYWdyYW0ubW9kZWwgPSBnby5Nb2RlbC5mcm9tSnNvbih0aGlzLmVkaXRvci5kYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGlvbkludGVydmFsKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuYW5pbWF0aW9uSW50ZXJ2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubXlEaWFncmFtID0gdGhpcy4kKGdvLkRpYWdyYW0sIHRoaXMubXlEaWFncmFtRGl2LCB0aGlzLmluaXRpYWxPcHRpb25zKTtcbiAgICAgICAgLy8gdGhpcy5teURpYWdyYW0uaW5pdGlhbFBvc2l0aW9uID0gbmV3IGdvLlBvaW50KDAsIDApO1xuICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ29tcG9lbnRUZW1wbGF0ZSgpO1xuXG4gICAgICAgIHRoaXMubWFrZUxpbmtUZW1wbGF0ZSgpO1xuICAgICAgICAvLyBhbmltYXRpb25cbiAgICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICAvLyBpZiAoIXRoaXMuaXNBZGRlZE1vZGVsQ2hhbmdlZExpc3RlbmVycykge1xuICAgICAgICAgICAgdGhpcy5pc0FkZGVkTW9kZWxDaGFuZ2VkTGlzdGVuZXJzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubXlEaWFncmFtLmFkZE1vZGVsQ2hhbmdlZExpc3RlbmVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY2hhbmdlID09PSBnby5DaGFuZ2VkRXZlbnQuUmVtb3ZlICYmIGUucHJvcGVydHlOYW1lID09PSAnbm9kZURhdGFBcnJheScpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGUub2xkVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25EZWxldGVOb2RlLmVtaXQoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmlzVHJhbnNhY3Rpb25GaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbW1pdHRlZFRyYW5zYWN0aW9uU3ViamVjdD8ubmV4dChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMubXlEaWFncmFtLmNvbW1hbmRIYW5kbGVyLnVuZG8gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5vblVuZG8uZW1pdCgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCEhdGhpcy5lZGl0b3IpIHtcbiAgICAgICAgICAgIHRoaXMubXlEaWFncmFtLm1vZGVsID0gZ28uTW9kZWwuZnJvbUpzb24odGhpcy5lZGl0b3IuZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0R3JvdXBUZW1wbGF0ZUVuZXJneSgpIHtcbiAgICAgICAgLy8gZm9yIHdhdGVyXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIFNUT1JBR0UsXG4gICAgICAgICAgICBXQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBERU1JTl9XQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICAvLyBST19XQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBQUk9DRVNTLFxuICAgICAgICAgICAgV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBEQUZfV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBFVFBfV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBNQlJfV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBaTERfV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBDT09MSU5HX1RPV0VSLFxuICAgICAgICAgICAgQk9JTEVSLFxuICAgICAgICAgICAgT1RIRVIsXG4gICAgICAgICAgICBMQU5EU0NBUElOR19JUlJJR0FUSU9OLFxuICAgICAgICB9ID0gR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTO1xuICAgICAgICBjb25zdCB3YXRlckdyb3VwcyA9IFtcbiAgICAgICAgICAgIFNUT1JBR0UsXG4gICAgICAgICAgICBXQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBERU1JTl9XQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICAvLyBST19XQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBQUk9DRVNTLFxuICAgICAgICAgICAgV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBEQUZfV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBFVFBfV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBNQlJfV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBaTERfV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICAgICAgICBDT09MSU5HX1RPV0VSLFxuICAgICAgICAgICAgQk9JTEVSLFxuICAgICAgICAgICAgT1RIRVIsXG4gICAgICAgICAgICBMQU5EU0NBUElOR19JUlJJR0FUSU9OLFxuICAgICAgICBdO1xuICAgICAgICB3YXRlckdyb3Vwcy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgIGlmICghIUdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tlXSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFrZUdyb3VwVGVtcGxhdGUoR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW2VdLmljb24sIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tlXS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZWxlY3RyaWNhbFxuICAgICAgICB0aGlzLmluaXRFbGVjdHJpY0dyb3VwVGVtcGxhdGUoKTtcblxuICAgICAgICAvLyBGdWVsXG4gICAgICAgIHRoaXMuaW5pdEZ1ZWxHcm91cFRlbXBsYXRlKCk7XG5cbiAgICAgICAgLy8gR2FzXG4gICAgICAgIHRoaXMuaW5pdEdhc0dyb3VwVGVtcGxhdGUoKTtcbiAgICB9XG5cbiAgICBpbml0RWxlY3RyaWNEaWFncmFtKCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBHUklELFxuICAgICAgICAgICAgRElFU0VMX0dFTkVSQVRPUlMsXG4gICAgICAgICAgICBCQVRURVJZX0VORVJHWV9TVE9SQUdFLFxuICAgICAgICAgICAgTElHSFRJTkdfU1lTVEVNUyxcbiAgICAgICAgICAgIExJR0hUSU5HUyxcbiAgICAgICAgICAgIEVMRUNUUklDX01FVEVSUyxcbiAgICAgICAgICAgIFRSQU5TRk9STUVSUyxcbiAgICAgICAgICAgIEVMRUNUUklDX0ZMWVdIRUVMX0VORVJHWV9TVE9SQUdFLFxuICAgICAgICAgICAgUFVNUEVEX0hZRFJPX1NUT1JBR0UsXG4gICAgICAgICAgICBUSEVSTUFMX0VORVJHWV9TVE9SQUdFLFxuICAgICAgICAgICAgU1VQRVJfQ0FQQUNJVE9SX0VORVJHWV9TVE9SQUdFLFxuICAgICAgICAgICAgU1dJVENIX0dFQVJTLFxuICAgICAgICAgICAgUFJPQ0VTU19DT05UUk9MX0FVVE9NQVRJT05fU1lTVEVNUyxcbiAgICAgICAgICAgIFBST0NFU1NfRVFVSVBNRU5UX01BQ0hJTkVTLFxuICAgICAgICAgICAgT0ZGSUNFX0VRVUlQTUVOVCxcbiAgICAgICAgICAgIFBPV0VSX0RJU1RSSUJVVElPTl9DT05UUk9MX1NZU1RFTVMsXG4gICAgICAgICAgICBQT1dFUl9ESVNUUklCVVRJT05fU1lTVEVNUyxcbiAgICAgICAgICAgIE5BVFVSQUxfR0FTX0dFTkVSQVRPUlMsXG4gICAgICAgICAgICBNT1RPUl9DT05UUk9MUyxcbiAgICAgICAgICAgIFZBUklBQkxFX0ZSRVFVRU5DWV9EUklWRVJTLFxuICAgICAgICAgICAgRUxFQ1RSSUNfSFZBQyxcbiAgICAgICAgICAgIENPTVBSRVNTRURfQUlSX1NZU1RFTVMsXG4gICAgICAgICAgICBSRUZSSUdFUkFUSU9OX0NPT0xJTkdfU1lTVEVNUyxcbiAgICAgICAgICAgIE1BVEVSSUFMX0hBTkRMSU5HX0VRVUlQTUVOVCxcbiAgICAgICAgICAgIFdJTkRfUE9XRVIsXG4gICAgICAgICAgICBFTEVDVFJJQ19JTkRVU1RSSUFMX01PVE9SUyxcbiAgICAgICAgICAgIEdST1VORElORyxcbiAgICAgICAgfSA9IEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUztcbiAgICAgICAgY29uc3QgTGlzdEl0ZW1zQ3JlYXRlRW50aXR5VGVtcGxhdGUgPSBbXG4gICAgICAgICAgICBHUklELFxuICAgICAgICAgICAgRElFU0VMX0dFTkVSQVRPUlMsXG4gICAgICAgICAgICBCQVRURVJZX0VORVJHWV9TVE9SQUdFLFxuICAgICAgICAgICAgTElHSFRJTkdfU1lTVEVNUyxcbiAgICAgICAgICAgIExJR0hUSU5HUyxcbiAgICAgICAgICAgIEVMRUNUUklDX01FVEVSUyxcbiAgICAgICAgICAgIFRSQU5TRk9STUVSUyxcbiAgICAgICAgICAgIEVMRUNUUklDX0ZMWVdIRUVMX0VORVJHWV9TVE9SQUdFLFxuICAgICAgICAgICAgUFVNUEVEX0hZRFJPX1NUT1JBR0UsXG4gICAgICAgICAgICBUSEVSTUFMX0VORVJHWV9TVE9SQUdFLFxuICAgICAgICAgICAgU1VQRVJfQ0FQQUNJVE9SX0VORVJHWV9TVE9SQUdFLFxuICAgICAgICAgICAgU1dJVENIX0dFQVJTLFxuICAgICAgICAgICAgUFJPQ0VTU19DT05UUk9MX0FVVE9NQVRJT05fU1lTVEVNUyxcbiAgICAgICAgICAgIFBST0NFU1NfRVFVSVBNRU5UX01BQ0hJTkVTLFxuICAgICAgICAgICAgT0ZGSUNFX0VRVUlQTUVOVCxcbiAgICAgICAgICAgIFBPV0VSX0RJU1RSSUJVVElPTl9DT05UUk9MX1NZU1RFTVMsXG4gICAgICAgICAgICBQT1dFUl9ESVNUUklCVVRJT05fU1lTVEVNUyxcbiAgICAgICAgICAgIE5BVFVSQUxfR0FTX0dFTkVSQVRPUlMsXG4gICAgICAgICAgICBNT1RPUl9DT05UUk9MUyxcbiAgICAgICAgICAgIFZBUklBQkxFX0ZSRVFVRU5DWV9EUklWRVJTLFxuICAgICAgICAgICAgRUxFQ1RSSUNfSFZBQyxcbiAgICAgICAgICAgIENPTVBSRVNTRURfQUlSX1NZU1RFTVMsXG4gICAgICAgICAgICBSRUZSSUdFUkFUSU9OX0NPT0xJTkdfU1lTVEVNUyxcbiAgICAgICAgICAgIE1BVEVSSUFMX0hBTkRMSU5HX0VRVUlQTUVOVCxcbiAgICAgICAgICAgIFdJTkRfUE9XRVIsXG4gICAgICAgICAgICBFTEVDVFJJQ19JTkRVU1RSSUFMX01PVE9SUyxcbiAgICAgICAgICAgIEdST1VORElORyxcbiAgICAgICAgXTtcbiAgICAgICAgTGlzdEl0ZW1zQ3JlYXRlRW50aXR5VGVtcGxhdGUubWFwKChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoISFHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VFbnRpdHlUZW1wbGF0ZUVuZXJneShcbiAgICAgICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW2VdLmljb24sXG4gICAgICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tlXS5uYW1lLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXRFbGVjdHJpY0dyb3VwVGVtcGxhdGUoKSB7XG4gICAgICAgIGNvbnN0IGxpc3RJdGVtcyA9IFtcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuQkFUVEVSWV9FTkVSR1lfU1RPUkFHRV0sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlRSQU5TRk9STUVSU10sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkVMRUNUUklDX01FVEVSU10sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkxJR0hUSU5HU10sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlBPV0VSX0RJU1RSSUJVVElPTl9TWVNURU1TXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuU1dJVENIX0dFQVJTXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRUxFQ1RSSUNfSU5EVVNUUklBTF9NT1RPUlNdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5HUk9VTkRJTkddLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5NT1RPUl9DT05UUk9MU10sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkxJR0hUSU5HX1NZU1RFTVNdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5FTEVDVFJJQ19IVkFDXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuUkVGUklHRVJBVElPTl9DT09MSU5HX1NZU1RFTVNdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QUk9DRVNTX0NPTlRST0xfQVVUT01BVElPTl9TWVNURU1TXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuT0ZGSUNFX0VRVUlQTUVOVF0sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkNPTVBSRVNTRURfQUlSX1NZU1RFTVNdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QUk9DRVNTX0VRVUlQTUVOVF9NQUNISU5FU10sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLk1BVEVSSUFMX0hBTkRMSU5HX0VRVUlQTUVOVF0sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlBPV0VSX0RJU1RSSUJVVElPTl9DT05UUk9MX1NZU1RFTVNdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5CQVRURVJJRVNdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5WQVJJQUJMRV9GUkVRVUVOQ1lfRFJJVkVSU10sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkVMRUNUUklDX0ZMWVdIRUVMX0VORVJHWV9TVE9SQUdFXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuUFVNUEVEX0hZRFJPX1NUT1JBR0VdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5USEVSTUFMX0VORVJHWV9TVE9SQUdFXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuU1VQRVJfQ0FQQUNJVE9SX0VORVJHWV9TVE9SQUdFXSxcbiAgICAgICAgXTtcbiAgICAgICAgbGlzdEl0ZW1zLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWFrZUdyb3VwVGVtcGxhdGUoZT8uaWNvbiwgZS5uYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5pdEZ1ZWxHcm91cFRlbXBsYXRlKCkge1xuICAgICAgICBjb25zdCBsaXN0SXRlbXMgPSBbXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkRJRVNFTF9GVUVMU10sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkdBU09OX0xJTkVTXSxcblxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5CSU9ESUVTRUxTXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuS0VST1NFTlNFXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuUFJPUEFORVNdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5UQU5LRVJfVFJVQ0tTXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuUElQRUxJTkVdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5JTkRVU1RSSUFMX0JPSUxFUlNdLFxuXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkdFTkVSQVRPUlNdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5JTkRVU1RSSUFMX0ZVUk5BQ0VTXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuSU5EVVNUUklBTF9PVkVOU10sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLklORFVTVFJJQUxfVkVISUNMRVNfQU5EX0VRVUlQTUVOVF0sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfTUVURVJTXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9ESVNQRU5TRVJTXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9TVFJPUkFHRV9UQU5LU10sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkVMRUNUUklDX0hWQUNdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5GVUVMX0ZJTFRSQVRJT05TXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9NQU5BR0VNRU5UU10sXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5tYWtlR3JvdXBUZW1wbGF0ZShcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9ESVNQRU5TRVJTXS5pY29uLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5GVUVMX0RJU1BFTlNFUlNdLm5hbWUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWFrZUdyb3VwVGVtcGxhdGUoXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfU1RST1JBR0VfVEFOS1NdLmljb24sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfU1RST1JBR0VfVEFOS1NdLm5hbWUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWFrZUdyb3VwVGVtcGxhdGUoXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfRklMVFJBVElPTlNdLmljb24sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfRklMVFJBVElPTlNdLm5hbWUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWFrZUdyb3VwVGVtcGxhdGUoXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfTUFOQUdFTUVOVFNdLmljb24sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfTUFOQUdFTUVOVFNdLm5hbWUsXG4gICAgICAgICk7XG4gICAgICAgIGxpc3RJdGVtcy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1ha2VHcm91cFRlbXBsYXRlKGU/Lmljb24sIGUubmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXRHYXNHcm91cFRlbXBsYXRlKCkge1xuICAgICAgICBjb25zdCBsaXN0SXRlbXMgPSBbXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkNPTVBSRVNTRURfTkFUVVJBTF9HQVNfUElQRUxJTkVdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5CT0lMRVJTX0FORF9IRUFURVJTXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVSTkFDRVNdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QT1dFUl9HRU5FUkFUSU9OXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuQ09HRU5FUkFUSU9OXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuQ09NQklORURfQ1lDTEVfUE9XRVJfUExBTlRTXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9GT1JfVkVISUNMRVNfQU5EX0VRVUlQTUVOVF0sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkdBU19NRVRFUlNdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5CVVJORVJTXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRkxVRV9HQVNfQU5BTFlaRVJTXSxcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuQ09NQlVTVElPTl9DT05UUk9MX1NZU1RFTVNdLFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5HQVNfU1RPUkFHRV9UQU5LU10sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkdBU19QUkVTU1VSRV9SRUdVTEFUT1JTXSxcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLm1ha2VHcm91cFRlbXBsYXRlKFxuICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5GVUVMX0RJU1BFTlNFUlNdLmljb24sXG4gICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfRElTUEVOU0VSU10ubmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tYWtlR3JvdXBUZW1wbGF0ZShcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9TVFJPUkFHRV9UQU5LU10uaWNvbixcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9TVFJPUkFHRV9UQU5LU10ubmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tYWtlR3JvdXBUZW1wbGF0ZShcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9GSUxUUkFUSU9OU10uaWNvbixcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9GSUxUUkFUSU9OU10ubmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tYWtlR3JvdXBUZW1wbGF0ZShcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9NQU5BR0VNRU5UU10uaWNvbixcbiAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9NQU5BR0VNRU5UU10ubmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgbGlzdEl0ZW1zLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWFrZUdyb3VwVGVtcGxhdGUoZT8uaWNvbiwgZS5uYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5pdEdhc0RpYWdyYW0oKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIE5BVFVSQUxfR0FTX1BJUEVMSU5FUyxcbiAgICAgICAgICAgIExJUVVFRklFRF9OQVRVUkFMX0dBUyxcbiAgICAgICAgICAgIENPTVBSRVNTRURfTkFUVVJBTF9HQVNfUElQRUxJTkUsXG4gICAgICAgICAgICBDT01QUkVTU0VEX05BVFVSQUxfR0FTX1BST0RVQ1RJT04sXG4gICAgICAgICAgICBCT0lMRVJTX0FORF9IRUFURVJTLFxuICAgICAgICAgICAgRlVSTkFDRVMsXG4gICAgICAgICAgICBQT1dFUl9HRU5FUkFUSU9OLFxuICAgICAgICAgICAgQ09HRU5FUkFUSU9OLFxuICAgICAgICAgICAgQ09NQklORURfQ1lDTEVfUE9XRVJfUExBTlRTLFxuICAgICAgICAgICAgRlVFTF9GT1JfVkVISUNMRVNfQU5EX0VRVUlQTUVOVCxcbiAgICAgICAgICAgIEdBU19NRVRFUlMsXG4gICAgICAgICAgICBCVVJORVJTLFxuICAgICAgICAgICAgRkxVRV9HQVNfQU5BTFlaRVJTLFxuICAgICAgICAgICAgQ09NQlVTVElPTl9DT05UUk9MX1NZU1RFTVMsXG4gICAgICAgICAgICBHQVNfU1RPUkFHRV9UQU5LUyxcbiAgICAgICAgICAgIEdBU19QUkVTU1VSRV9SRUdVTEFUT1JTLFxuICAgICAgICAgICAgTkFUVVJBTF9HQVMsXG4gICAgICAgIH0gPSBHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVM7XG4gICAgICAgIGNvbnN0IExpc3RJdGVtc0NyZWF0ZUVudGl0eVRlbXBsYXRlID0gW1xuICAgICAgICAgICAgTkFUVVJBTF9HQVNfUElQRUxJTkVTLFxuICAgICAgICAgICAgTElRVUVGSUVEX05BVFVSQUxfR0FTLFxuICAgICAgICAgICAgQ09NUFJFU1NFRF9OQVRVUkFMX0dBU19QSVBFTElORSxcbiAgICAgICAgICAgIENPTVBSRVNTRURfTkFUVVJBTF9HQVNfUFJPRFVDVElPTixcbiAgICAgICAgICAgIEJPSUxFUlNfQU5EX0hFQVRFUlMsXG4gICAgICAgICAgICBGVVJOQUNFUyxcbiAgICAgICAgICAgIFBPV0VSX0dFTkVSQVRJT04sXG4gICAgICAgICAgICBDT0dFTkVSQVRJT04sXG4gICAgICAgICAgICBDT01CSU5FRF9DWUNMRV9QT1dFUl9QTEFOVFMsXG4gICAgICAgICAgICBGVUVMX0ZPUl9WRUhJQ0xFU19BTkRfRVFVSVBNRU5ULFxuICAgICAgICAgICAgR0FTX01FVEVSUyxcbiAgICAgICAgICAgIEJVUk5FUlMsXG4gICAgICAgICAgICBGTFVFX0dBU19BTkFMWVpFUlMsXG4gICAgICAgICAgICBDT01CVVNUSU9OX0NPTlRST0xfU1lTVEVNUyxcbiAgICAgICAgICAgIEdBU19TVE9SQUdFX1RBTktTLFxuICAgICAgICAgICAgR0FTX1BSRVNTVVJFX1JFR1VMQVRPUlMsXG4gICAgICAgICAgICBOQVRVUkFMX0dBUyxcbiAgICAgICAgXTtcbiAgICAgICAgTGlzdEl0ZW1zQ3JlYXRlRW50aXR5VGVtcGxhdGUubWFwKChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoISFHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VFbnRpdHlUZW1wbGF0ZUVuZXJneShcbiAgICAgICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW2VdLmljb24sXG4gICAgICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tlXS5uYW1lLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXRGdWVsRGlhZ3JhbSgpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgRElFU0VMX0ZVRUxTLFxuICAgICAgICAgICAgR0FTT05fTElORVMsXG4gICAgICAgICAgICBCSU9ESUVTRUxTLFxuICAgICAgICAgICAgS0VST1NFTlNFLFxuICAgICAgICAgICAgUFJPUEFORVMsXG4gICAgICAgICAgICBUQU5LRVJfVFJVQ0tTLFxuICAgICAgICAgICAgUElQRUxJTkUsXG4gICAgICAgICAgICBJTkRVU1RSSUFMX0JPSUxFUlMsXG4gICAgICAgICAgICBHRU5FUkFUT1JTLFxuICAgICAgICAgICAgSU5EVVNUUklBTF9GVVJOQUNFUyxcbiAgICAgICAgICAgIElORFVTVFJJQUxfT1ZFTlMsXG4gICAgICAgICAgICBJTkRVU1RSSUFMX1ZFSElDTEVTX0FORF9FUVVJUE1FTlQsXG4gICAgICAgICAgICBGVUVMX01FVEVSUyxcbiAgICAgICAgICAgIEZVRUxfRElTUEVOU0VSUyxcbiAgICAgICAgICAgIEZVRUxfU1RST1JBR0VfVEFOS1MsXG4gICAgICAgICAgICBGVUVMX0ZJTFRSQVRJT05TLFxuICAgICAgICAgICAgRlVFTF9NQU5BR0VNRU5UUyxcbiAgICAgICAgICAgIEZVRUxTLFxuICAgICAgICB9ID0gR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTO1xuICAgICAgICBjb25zdCBMaXN0SXRlbXNDcmVhdGVFbnRpdHlUZW1wbGF0ZSA9IFtcbiAgICAgICAgICAgIERJRVNFTF9GVUVMUyxcbiAgICAgICAgICAgIEdBU09OX0xJTkVTLFxuICAgICAgICAgICAgQklPRElFU0VMUyxcbiAgICAgICAgICAgIEtFUk9TRU5TRSxcbiAgICAgICAgICAgIFBST1BBTkVTLFxuICAgICAgICAgICAgVEFOS0VSX1RSVUNLUyxcbiAgICAgICAgICAgIFBJUEVMSU5FLFxuICAgICAgICAgICAgSU5EVVNUUklBTF9CT0lMRVJTLFxuICAgICAgICAgICAgR0VORVJBVE9SUyxcbiAgICAgICAgICAgIElORFVTVFJJQUxfRlVSTkFDRVMsXG4gICAgICAgICAgICBJTkRVU1RSSUFMX09WRU5TLFxuICAgICAgICAgICAgSU5EVVNUUklBTF9WRUhJQ0xFU19BTkRfRVFVSVBNRU5ULFxuICAgICAgICAgICAgRlVFTF9NRVRFUlMsXG4gICAgICAgICAgICBGVUVMX0RJU1BFTlNFUlMsXG4gICAgICAgICAgICBGVUVMX1NUUk9SQUdFX1RBTktTLFxuICAgICAgICAgICAgRlVFTF9GSUxUUkFUSU9OUyxcbiAgICAgICAgICAgIEZVRUxfTUFOQUdFTUVOVFMsXG4gICAgICAgICAgICBGVUVMUyxcbiAgICAgICAgXTtcbiAgICAgICAgTGlzdEl0ZW1zQ3JlYXRlRW50aXR5VGVtcGxhdGUubWFwKChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoISFHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VFbnRpdHlUZW1wbGF0ZUVuZXJneShcbiAgICAgICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW2VdLmljb24sXG4gICAgICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tlXS5uYW1lLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXRTb2xhckRpYWdyYW0oKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIFNPTEFSX1BPV0VSLFxuICAgICAgICAgICAgUE9XRVJfQ09ORElUSU9OSU5HX1VOSVQsXG4gICAgICAgICAgICBCQVRURVJJRVM6IEJBVFRFUlksXG4gICAgICAgICAgICBJTlZFUlRFUlM6IElOVkVSVEVSLFxuICAgICAgICB9ID0gR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTO1xuICAgICAgICBjb25zdCBMaXN0SXRlbXNDcmVhdGVFbnRpdHlUZW1wbGF0ZSA9IFtTT0xBUl9QT1dFUiwgUE9XRVJfQ09ORElUSU9OSU5HX1VOSVQsIEJBVFRFUlksIElOVkVSVEVSXTtcbiAgICAgICAgTGlzdEl0ZW1zQ3JlYXRlRW50aXR5VGVtcGxhdGUubWFwKChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoISFHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VFbnRpdHlUZW1wbGF0ZUVuZXJneShcbiAgICAgICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW2VdLmljb24sXG4gICAgICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tlXS5uYW1lLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXRTdGVhbURpYWdyYW0oKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIFZBTFVFUyxcbiAgICAgICAgICAgIFNURUFNX1RSQVBTLFxuICAgICAgICAgICAgUFJFU1NVUkVfUkVHVUxBVE9SUyxcbiAgICAgICAgICAgIFNBRkVUWV9WQUxVRVNfQU5EX0VRVUlQTUVOVCxcbiAgICAgICAgICAgIENPTkRFTlNBVEVfUkVUVVJOX1NZU1RFTSxcbiAgICAgICAgICAgIERFQUVSQVRPUlMsXG4gICAgICAgICAgICBGRUVEV0FURVJfUFVNUFMsXG4gICAgICAgICAgICBCTE9XRE9XTl9UQU5LUyxcbiAgICAgICAgICAgIEVYUEFOU0lPTl9UQU5LUyxcbiAgICAgICAgICAgIEhFQVRfRVhDSEFOR0VSUyxcbiAgICAgICAgICAgIFRVUkJJTkVTLFxuICAgICAgICB9ID0gR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTO1xuICAgICAgICBjb25zdCBMaXN0SXRlbXNDcmVhdGVFbnRpdHlUZW1wbGF0ZSA9IFtcbiAgICAgICAgICAgIFZBTFVFUyxcbiAgICAgICAgICAgIFNURUFNX1RSQVBTLFxuICAgICAgICAgICAgUFJFU1NVUkVfUkVHVUxBVE9SUyxcbiAgICAgICAgICAgIFNBRkVUWV9WQUxVRVNfQU5EX0VRVUlQTUVOVCxcbiAgICAgICAgICAgIENPTkRFTlNBVEVfUkVUVVJOX1NZU1RFTSxcbiAgICAgICAgICAgIERFQUVSQVRPUlMsXG4gICAgICAgICAgICBGRUVEV0FURVJfUFVNUFMsXG4gICAgICAgICAgICBCTE9XRE9XTl9UQU5LUyxcbiAgICAgICAgICAgIEVYUEFOU0lPTl9UQU5LUyxcbiAgICAgICAgICAgIEhFQVRfRVhDSEFOR0VSUyxcbiAgICAgICAgICAgIFRVUkJJTkVTLFxuICAgICAgICBdO1xuICAgICAgICBMaXN0SXRlbXNDcmVhdGVFbnRpdHlUZW1wbGF0ZS5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgIGlmICghIUdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tlXSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFrZUVudGl0eVRlbXBsYXRlRW5lcmd5KFxuICAgICAgICAgICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0uaWNvbixcbiAgICAgICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW2VdLm5hbWUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Nb2RlbENoYW5nZUxpc3RlbmVyKGU6IGdvLkNoYW5nZWRFdmVudCkge1xuICAgICAgICAvLyB0aGlzLm9uTW9kZWxDaGFuZ2VMaXN0ZW5lckV2ZW50LmVtaXQoZSk7XG4gICAgfVxuXG4gICAgbWFrZUxpbmtUZW1wbGF0ZSgpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHM6IGFueVtdID0gW107XG4gICAgICAgIC8vIGxpbmVcbiAgICAgICAgZWxlbWVudHMucHVzaChcbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICBnby5TaGFwZSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlzUGFuZWxNYWluOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5HUkFZLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogR29qc0VkaXRvck1vZGVsLkxJTktfVEVNUExBVEVTW0dvanNFZGl0b3JNb2RlbC5FTlVNX0xJTktfVFlQRVMuU0lNUExFXT8uc3Ryb2tlV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0cm9rZVdpZHRoOiAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3N0cm9rZScsICdjb2xvcicpLFxuICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzZWxlY3RhYmxlJywgJ3NlbGVjdGFibGUnKSxcbiAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnc3Ryb2tlV2lkdGgnLCAndHlwZScsICh4KSA9PiBHb2pzRWRpdG9yTW9kZWwuTElOS19URU1QTEFURVNbeF0/LnN0cm9rZVdpZHRoKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gYW5pbWF0aW9uXG4gICAgICAgIGVsZW1lbnRzLnB1c2goXG4gICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsIHtcbiAgICAgICAgICAgICAgICAuLi5Hb2pzRWRpdG9yTW9kZWwuTElOS19URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fTElOS19UWVBFUy5QSVBFX0FOSU1BVElPTl0/LmFuaW1hdGlvbixcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBlbGVtZW50cy5wdXNoKFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdUb3AnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAzOCxcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF4U2l6ZTogbmV3IGdvLlNpemUoTmFOLCAzNiksXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpZHRoOiAxMDAsXG4gICAgICAgICAgICAgICAgICAgIC8vIG1pblNpemU6IG5ldyBnby5TaXplKDEwMCwgNSksIC8vIMSQ4bq3dCBrw61jaCB0aMaw4bubYyB04buRaSB0aGnhu4N1IGzDoCAxMDB4NTBcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgLy8gbGF5ZXJOYW1lOiAnQmFja2dyb3VuZExheWVyJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxpZ25tZW50OiBnby5TcG90LlRvcCxcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxpZ25tZW50Rm9jdXM6IGdvLlNwb3QuTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDUwLCAwKSxcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICd0ZXh0Q29tcG9uZW50JywgKHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgLy8gdGhpcy4kKGdvLlNoYXBlLCB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGhlaWdodDogMzAsXG4gICAgICAgICAgICAgICAgLy8gICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgLy8gICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgLy8gICAgIC8vIHZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJnaW46IG5ldyBnby5NYXJnaW4oMCwgMCwgNTAsIDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzQ0NDQ0NCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnbm9ybWFsIDEwcHQgQXJpYWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnbGVmdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWRpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxpZ25tZW50OiBnby5TcG90LkNlbnRlciwgLy8gxJDhuqNtIGLhuqNvIHbEg24gYuG6o24gbuG6sW0g4bufIHRydW5nIHTDom0gY+G7p2EgbsO6dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxpZ25tZW50Rm9jdXM6IGdvLlNwb3QuQ2VudGVyLCAvLyDEkOG6o20gYuG6o28gdsSDbiBi4bqjbiBraMO0bmcgYuG7iyBk4buLY2ggY2h1eeG7g24gcmEga2jhu49pIHRydW5nIHTDom1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdyYXA6IGdvLlRleHRCbG9jay5XcmFwRml0LCAvLyBDaHV54buDbiBkw7JuZyDEkeG7gyB2xINuIGLhuqNuIGtow7RuZyB2xrDhu6N0IHJhIG5nb8OgaVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBnby5UZXh0QmxvY2suT3ZlcmZsb3dFbGxpcHNpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xUaXA6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVG9vbFRpcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAndGV4dENvbXBvbmVudCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICd0ZXh0Q29tcG9uZW50JyksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdiYWNrZ3JvdW5kJywgJ3RleHRDb21wb25lbnQnLCAoeCkgPT4gKHggPyAnd2hpdGUnIDogJ3RyYW5zcGFyZW50JykpLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgbmV3IGdvLkJpbmRpbmcoJ21hcmdpbicsICdpc0Zvcm1hdCcsICh4KSA9PlxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgeCA/IG5ldyBnby5NYXJnaW4oNSwgMCwgNSwgNSkgOiBuZXcgZ28uTWFyZ2luKDUsIDUsIDUsIDUpLFxuICAgICAgICAgICAgICAgICAgICAvLyApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGFycm93XG4gICAgICAgIGVsZW1lbnRzLnB1c2goXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uU2hhcGUsIC8vIHRoZSBcImZyb21cIiBhcnJvd2hlYWRcbiAgICAgICAgICAgICAgICB7IC4uLkdvanNFZGl0b3JNb2RlbC5MSU5LX1RFTVBMQVRFU1tHb2pzRWRpdG9yTW9kZWwuRU5VTV9MSU5LX1RZUEVTLlNJTVBMRV0/LmFycm93IH0sXG4gICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoXG4gICAgICAgICAgICAgICAgICAgICd2aXNpYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICFbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLkVOVU1fTElOS19UWVBFUy5QSVBFX0FOSU1BVElPTixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuRU5VTV9MSU5LX1RZUEVTLlBJUEUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLkVOVU1fTElOS19UWVBFUy5QSVBFX0hJRERFTixcbiAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5jbHVkZXMoeCksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnZmlsbCcsICdjb2xvcicpLFxuICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzdHJva2UnLCAnY29sb3InKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVE9ETyBmaXggbGluayBjYW5ub3Qgc2VsZWN0ZWQgaW5zaWRlIGdyb3VwIHRlbXBsYXRlXG4gICAgICAgIHRoaXMubXlEaWFncmFtLmxpbmtUZW1wbGF0ZSA9IHRoaXMuJChcbiAgICAgICAgICAgIGdvLkxpbmssXG4gICAgICAgICAgICBnby5MaW5rLk9ydGhvZ29uYWwsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gbGF5ZXJOYW1lOiAnQmFja2dyb3VuZCcsIC8vIGxpbmsgY2Fubm90IHNlbGVjdCBpbnNpZGUgZ3JvdXAgdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAvLyBjdXJ2aW5lc3M6IDIwLFxuICAgICAgICAgICAgICAgIC8vIGNvcm5lcjogNSxcbiAgICAgICAgICAgICAgICByb3V0aW5nOiBnby5MaW5rLkF2b2lkc05vZGVzLFxuICAgICAgICAgICAgICAgIHJlc2hhcGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVzZWdtZW50YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZWxpbmthYmxlRnJvbTogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZWxpbmthYmxlVG86IHRydWUsXG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b1Nob3J0TGVuZ3RoOiBHb2pzRWRpdG9yTW9kZWwuTElOS19URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fTElOS19UWVBFUy5TSU1QTEVdLnRvU2hvcnRMZW5ndGgsIC8vIGFzc3VtZSBhcnJvd2hlYWQgYXQgXCJ0b1wiIGVuZCwgbmVlZCB0byBhdm9pZCBiYWQgYXBwZWFyYW5jZSB3aGVuIHBhdGggaXMgdGhpY2tcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnbGF5ZXJOYW1lJywgJycsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE/LnRleHRDb21wb25lbnQgPyAnQmFja2dyb3VuZCcgOiAnJztcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3pPcmRlcicsICd0eXBlJywgKHgpID0+ICh4ID09PSBHb2pzRWRpdG9yTW9kZWwuRU5VTV9MSU5LX1RZUEVTLlBJUEVfQU5JTUFUSU9OID8gMTEgOiAxMCkpLFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RvU2hvcnRMZW5ndGgnLCAndHlwZScsICh4KSA9PiBHb2pzRWRpdG9yTW9kZWwuTElOS19URU1QTEFURVNbeF0udG9TaG9ydExlbmd0aCB8fCAwKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzZWxlY3RhYmxlJywgJ3NlbGVjdGFibGUnKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJ3Zpc2libGUnKSxcblxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGxpbmtzIGNvbWUgaW4gZnJvbSB0aGUgcHJvcGVyIGRpcmVjdGlvbiBhbmQgZ28gb3V0IGFwcHJvcHJpYXRlbHlcbiAgICAgICAgICAgIC4uLmVsZW1lbnRzLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIG1ha2VWYWx1ZU5vZGVUZW1wbGF0ZShzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7IHc6IDgyLCBoOiAzNiB9KSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy4kKFxuICAgICAgICAgICAgZ28uTm9kZSxcbiAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KGdvLlBvaW50LnN0cmluZ2lmeSksXG5cbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAgICAgeyBtaW5TaXplOiBuZXcgZ28uU2l6ZShzaXplLncsIHNpemUuaCkgfSxcbiAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdSZWN0YW5nbGUnLCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGw6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5MSUdIVF9CTFVFLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgJ0hvcml6b250YWwnLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ6ICdib2xkIDE0cHggQXJpYWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBHb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuQ0VSVUxFQU4sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2VkaXRhYmxlJywgJ2lzRWRpdGFibGUnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ3Nob3J0ZW5lZE51bWJlcicpLm1ha2VUd29XYXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzdHJva2UnLCAnY29sb3InKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdtYXJnaW4nLCAnaXNGb3JtYXQnLCAoeCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID8gbmV3IGdvLk1hcmdpbig1LCAwLCA1LCA1KSA6IG5ldyBnby5NYXJnaW4oNSwgNSwgNSwgNSksXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS52YWx1ZSAhPT0gVkFMVUVfTkE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgLy8gSWNvbiBFcnIgd2hlbiBsYWNrIG9mIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMTAsIDEwLCAxMCwgMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IFZBTFVFX05BLCAvLyBPbGQgdmVyc2lvbjogVEVYVF9FUlJPUlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogJ2JvbGQgMTBwdCBzYW5zLXNlcmlmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5TQUxNT04sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcDogZ28uVGV4dEJsb2NrLldyYXBGaXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTXVsdGlsaW5lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICcnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLnZhbHVlID09PSBWQUxVRV9OQTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm15RGlhZ3JhbS5ub2RlVGVtcGxhdGVNYXAuc2V0KEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5WQUxVRV9OT0RFLCBub2RlKTtcbiAgICB9XG5cbiAgICBtYWtlRW1wdHlOb2RlVGVtcGxhdGUoc2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9ID0geyB3OiAwLCBoOiAwIH0pIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuJChcbiAgICAgICAgICAgIGdvLk5vZGUsXG4gICAgICAgICAgICAnU3BvdCcsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShnby5Qb2ludC5zdHJpbmdpZnkpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm15RGlhZ3JhbS5ub2RlVGVtcGxhdGVNYXAuc2V0KEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5FTVBUWSwgbm9kZSk7XG4gICAgfVxuXG4gICAgbWFrZVZhbHVlTGFiZWxUZW1wbGF0ZShzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7IHc6IDgyLCBoOiAzNiB9KSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLiQoXG4gICAgICAgICAgICBnby5Ob2RlLFxuICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1vdmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShnby5Qb2ludC5zdHJpbmdpZnkpLFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgICAgICB7IG1pblNpemU6IG5ldyBnby5TaXplKHNpemUudywgc2l6ZS5oKSB9LFxuICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICdIb3Jpem9udGFsJyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDEwLCAwLCAxMCksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMCwgNSwgMTAsIDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogJ2JvbGQgMTVweCBzYW5zLXNlcmlmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwOiBnby5UZXh0QmxvY2suV3JhcEZpdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5DRVJVTEVBTixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TaXplOiBuZXcgZ28uU2l6ZSgxNTAsIDMwKSwgLy8gU2V0IHRoZSB3aWR0aCBvZiB0aGUgdGV4dCBibG9ja1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzdHJva2UnLCAnY29sb3InKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ2RhdGEnLCAoeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgeD8ucXVhbnRpdHkgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkOiBhbnkgPSBVdGlsc1NlcnZpY2UuY29udmVydFByZWZpeGVzRGF0YSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4Py5xdWFudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdDogVXRpbHNTZXJ2aWNlLmNvbnZlcnRTcGVjaWFsVW5pdCh4Py51bml0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXRWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZC5zaG9ydGVuZWROdW1iZXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZC51bml0UHJlZml4ZXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHNTZXJ2aWNlLmNvbnZlcnRTcGVjaWFsVW5pdCh4Py51bml0KSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeD8ucGVyY2VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZSArPSBgICgke3g/LnBlcmNlbnR9JSlgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJ2RhdGEnLCAoeCkgPT4gdHlwZW9mIHg/LnF1YW50aXR5ID09PSAnbnVtYmVyJyksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubXlEaWFncmFtLm5vZGVUZW1wbGF0ZU1hcC5zZXQoR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlZBTFVFX0xBQkVMLCBub2RlKTtcbiAgICB9XG5cbiAgICBtYWtlVGV4dFRlbXBsYXRlKFxuICAgICAgICBzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7IHc6IEdvanNFZGl0b3JNb2RlbC5HUklEX1NJWkUgKiA1LCBoOiBHb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogMiB9LFxuICAgICkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3QgY29udGV4dE1lbnUgPSB0aGlzLiQoXG4gICAgICAgICAgICBnby5BZG9ybm1lbnQsXG4gICAgICAgICAgICAnVmVydGljYWwnLFxuICAgICAgICAgICAgdGhpcy4kKCdDb250ZXh0TWVudUJ1dHRvbicsIHRoaXMuJChnby5UZXh0QmxvY2ssICdPcHRpb24gMScpLCB7XG4gICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlLCBvYmopIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ09wdGlvbiAxIGNsaWNrZWQhJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhpcy4kKCdDb250ZXh0TWVudUJ1dHRvbicsIHRoaXMuJChnby5UZXh0QmxvY2ssICdPcHRpb24gMicpLCB7XG4gICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlLCBvYmopIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ09wdGlvbiAyIGNsaWNrZWQhJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLy8gLi4uIGFkZCBtb3JlIG9wdGlvbnMgYXMgbmVlZGVkIC4uLlxuICAgICAgICApO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy4kKFxuICAgICAgICAgICAgZ28uTm9kZSxcbiAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tU3BvdDogZ28uU3BvdC5SaWdodFNpZGUsXG4gICAgICAgICAgICAgICAgLy8gdG9TcG90OiBnby5TcG90LkxlZnRTaWRlLFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uU3BvdDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgaWYgKGU/LmRhdGEub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgZT8uZGF0YS5vblNlbGVjdGVkKGU/LmRhdGEpO1xuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgICAgICAvLyBtb3VzZUhvdmVyOiAoZSwgb2JqKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnN0IG5vZGUgPSBvYmoucGFydDtcbiAgICAgICAgICAgICAgICAvLyAgICAgaWYgKChvYmogYXMgYW55KS5wYXJ0Py5vYj8udmFsdWUgPT09IFZBTFVFX05BKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBzZWxmLm9uSG92ZXJJbmZvQnV0dG9uLmVtaXQoe1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGxlZnQ6IGU/LlsnV3InXT8ueCArIDgsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgICAgICAvLyBtb3VzZUxlYXZlOiAoZSwgb2JqKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGlmICgob2JqIGFzIGFueSkucGFydD8ub2I/LnZhbHVlID09PSBWQUxVRV9OQSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgc2VsZi5vbkhvdmVySW5mb0J1dHRvbi5lbWl0KG51bGwpO1xuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgICAgICBjbGljazogKGUsIG9iajogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBvYmoucGFydDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGU/Lm9iPy5pc1R5cGVJbmZsb3dPZlBsYW50Q2VsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JqPy5kYXRhPy5vblNlbGVjdGVkKG5vZGU/Lm9iPy5ub2RlUGxhbnRDZWxsUGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGYub25DbGlja0NvbXBvZW50LmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxlZnQ6IGU/LlsnV3InXT8ueCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0b3A6IGU/LlsnV3InXT8ueSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBub2RlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIG9iOiBub2RlPy5vYj8ubm9kZVBsYW50Q2VsbFBhcmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudDogbm9kZT8ub2I/Lm5vZGVQbGFudENlbGxQYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5pdGlhbE9wdGlvbnM/LmlzUmVhZE9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTaG93Tm9kZUluZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNlbGYub25DbGlja0luZm9CdXR0b24uZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogZT8uWydXciddPy54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogZT8uWydXciddPy55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZG91YmxlQ2xpY2s6IChlLCBvYmo6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gb2JqLnBhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlPy5vYj8uaXNUeXBlSW5mbG93T2ZQbGFudENlbGwgJiYgIXRoaXMuX2luaXRpYWxPcHRpb25zPy5pc1JlYWRPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmo/LmRhdGE/Lm9uU2VsZWN0ZWQobm9kZT8ub2I/Lm5vZGVQbGFudENlbGxQYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5pc1Nob3dOb2RlSW5mb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgID8gc2VsZi5vbkRvdWJsZUNsaWNrTm9kZS5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICBsZWZ0OiBlPy5bJ1dyJ10/LngsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgbm9kZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBvYjogbm9kZT8ub2I/Lm5vZGVQbGFudENlbGxQYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5faW5pdGlhbE9wdGlvbnM/LmlzUmVhZE9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTaG93Tm9kZUluZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNlbGYub25DbGlja0luZm9CdXR0b24uZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogZT8uWydXciddPy54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogZT8uWydXciddPy55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGU6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgZ28uQWRvcm5tZW50LFxuICAgICAgICAgICAgICAgICAgICAnU3BvdCcsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8geyBoZWlnaHQ6IDYyIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsIHsgZmlsbDogbnVsbCwgc3Ryb2tlOiAnZG9kZ2VyYmx1ZScsIHN0cm9rZVdpZHRoOiA0IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHsgcGFkZGluZzogbmV3IGdvLk1hcmdpbig4LCAzLCAwLCAzKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdwYWRkaW5nJywgJycsICh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Py5pc1R5cGVJbmZsb3dPZlBsYW50Q2VsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB4Py5mbG93T2ZQbGFudENlbGwgPT09IEFUT19FTlVNX0ZMT1dfRElSRUNUSU9OLklORkxPV1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAyMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBnby5NYXJnaW4oMCwgMjAsIDAsIDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy4kKGdvLlBsYWNlaG9sZGVyLCB7IHBhZGRpbmc6IDMgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnaGVpZ2h0JywgJycsICh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg/LmlzVHlwZUluZmxvd09mUGxhbnRDZWxsID8geD8uaGVpZ2h0ICsgMTAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnd2lkdGgnLCAnJywgKHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geD8uaXNUeXBlSW5mbG93T2ZQbGFudENlbGwgPyB4Py53aWR0aCArIDEyIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdIb3Jpem9udGFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgYWxpZ25tZW50OiBnby5TcG90LlRvcFJpZ2h0LCBhbGlnbm1lbnRGb2N1czogZ28uU3BvdC5Cb3R0b20gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmdlbmVyYXRlQWN0aW9uR3JvdXAoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuUkVOQU1FLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuSU5TSUdIVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLk9VVEZMT1csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5ERUxFVEUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30sXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnZnJvbVNwb3QnLCAnZnJvbVNwb3QnKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0b1Nwb3QnLCAndG9TcG90JyksXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnbW92YWJsZScsICdtb3ZhYmxlJyksXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnc2VsZWN0YWJsZScsICdzZWxlY3RhYmxlJyksXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoZ28uUG9pbnQuc3RyaW5naWZ5KSxcbiAgICAgICAgICAgIC8vIG5ldyBnby5CaW5kaW5nKCdhbGlnbm1lbnQnLCAnYWxpZ25tZW50JywgZnVuY3Rpb24obG9jKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIG5ldyBnby5TcG90KDAsIDAsIGxvYy54LCAwKTtcbiAgICAgICAgICAgIC8vIH0pLm9mT2JqZWN0KCksXG5cbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0b29sVGlwOiB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAnVG9vbFRpcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YT8ubmFtZSA/PyBWQUxVRV9OQTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YT8udmFsdWUgPT09IFZBTFVFX05BIHx8IF8uaXNOaWwoZGF0YT8udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fREFUQTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBURVhUX1VOS05PV047XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8ucm91bmQoZGF0YT8udmFsdWUsIDIpLnRvRml4ZWQoMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFrZVR3b1dheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICdUYWJsZScsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXJyb3dGb3JQbGFudENlbGwoc2l6ZSwgQVRPX0VOVU1fRkxPV19ESVJFQ1RJT04uT1VURkxPVyksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8geyB3aWR0aDogc2l6ZS53LCBoZWlnaHQ6IHNpemUuaCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pblNpemU6IG5ldyBnby5TaXplKHNpemUudywgc2l6ZS5oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncsIHNpemUuaCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKHNpemUudywgc2l6ZS5oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd3aWR0aCcsICd3aWR0aCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2hlaWdodCcsICdoZWlnaHQnKSxcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlNoYXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSb3VuZGVkUmVjdGFuZ2xlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5MSUdIVF9CTFVFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5MSU5LX1dBVEVSLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAndGV4dE5vZGVTaGFwZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnZmlsbCcsICdmaWxsJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3N0cm9rZScsICdzdHJva2UnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZlcnRpY2FsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSG9yaXpvbnRhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlciB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGVydFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCA1KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICdyZWNvbW1lbmRhdGlvbicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnQ2lyY2xlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICcjRTk1RjQ3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6ICcjRTk1RjQ3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcXHVmNjQ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMS41LCAwLCAwLCAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnOHB4IFwiRm9udCBBd2Vzb21lIDYgUHJvXCInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogJyNmZmYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUG9zaXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxOCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDE1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlRW50ZXI6IChlLCBvYmopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkhvdmVyQWxlcnQuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBlPy5bJ1dyJ10/LnggKyA4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQWxlcnQ6IChvYmogYXMgYW55KS5wYXJ0Py5vYj8ubWVzc2FnZUFsZXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlTGVhdmU6IChlLCBvYmopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkhvdmVyQWxlcnQuZW1pdChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJ2FsZXJ0JyksXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5QaWN0dXJlLCBJQ09OX0FMRVJULCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZSgzMCwgMzApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlU3RyZXRjaDogZ28uR3JhcGhPYmplY3QuVW5pZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAndGV4dEJsb2NrVmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDgsIDE4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnYm9sZCAyMnB4IEFyaWFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkdSQVksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGdvLlRleHRCbG9jay5PdmVyZmxvd0VsbGlwc2lzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBnby5CaW5kaW5nKCdlZGl0YWJsZScsICdpc0VkaXRhYmxlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnYW5nbGUnLCAnYW5nbGUnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdtYXJnaW4nLCAnJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YT8uYWxlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBnby5NYXJnaW4oMCwgMCwgMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnc3Ryb2tlJywgJ2NvbG9yJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICcnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmdldFRleHREYXRhQm94KGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFrZVR3b1dheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnJywgKGRhdGEpID0+ICFkYXRhPy5pc0hpZGRlblZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWtlUG9ydCgnVCcsIGdvLlNwb3QuVG9wLCBnby5TcG90LlRvcFNpZGUsIGZhbHNlLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFrZVBvcnQoJ0wnLCBnby5TcG90LkxlZnQsIGdvLlNwb3QuTGVmdFNpZGUsIGZhbHNlLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFrZVBvcnQoJ1InLCBnby5TcG90LlJpZ2h0LCBnby5TcG90LlJpZ2h0U2lkZSwgdHJ1ZSwgZmFsc2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWtlUG9ydCgnQicsIGdvLlNwb3QuQm90dG9tLCBnby5TcG90LkJvdHRvbVNpZGUsIHRydWUsIGZhbHNlKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcnJvd0ZvclBsYW50Q2VsbChzaXplLCAgQVRPX0VOVU1fRkxPV19ESVJFQ1RJT04uSU5GTE9XKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwLnNldChHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuVEVYVF9OT0RFLCBub2RlKTtcbiAgICB9XG5cbiAgICBhcnJvd0ZvclBsYW50Q2VsbChzaXplLCBmbG93RGlyZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiQoXG4gICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICdUYWJsZScsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBzaXplLmgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2hlaWdodCcsICdoZWlnaHQnKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJycsIChkYXRhKSA9PiBkYXRhPy5mbG93T2ZQbGFudENlbGwgPT09IGZsb3dEaXJlY3Rpb24pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbHVtbjogZmxvd0RpcmVjdGlvbiA9PT0gIEFUT19FTlVNX0ZMT1dfRElSRUNUSU9OLk9VVEZMT1cgPyAwIDogMixcbiAgICAgICAgICAgICAgICByb3c6IDIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2l0ZW1BcnJheScsICdkYXRhTGlua0FycmF5JyksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaXRlbVRlbXBsYXRlOiB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygncm93JywgJ2luZGV4Um93JyksXG4gICAgICAgICAgICAgICAgICAgIC8vIG5ldyBnby5CaW5kaW5nKCdoZWlnaHQnLCAnaGVpZ2h0JyksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBpY3R1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBBUlJPVyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKDIwLCA0MCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2VTdHJldGNoOiBnby5HcmFwaE9iamVjdC5Vbmlmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzb3VyY2UnLCAnJywgKGRhdGEsIHBhbmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFuZWwucGFydD8uZGF0YT8uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YT8uaXNDcmVhdGVkID8gcGFuZWw/LiRwIDogQVJST1dfR1JBWTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldFRleHREYXRhQm94KGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGE/LnZhbHVlID09PSBWQUxVRV9OQSkge1xuICAgICAgICAgICAgcmV0dXJuIFRFWFRfVU5LTk9XTjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7ZGF0YT8uc2hvcnRlbmVkTnVtYmVyfSR7ZGF0YT8udW5pdFByZWZpeGVzID8gJyAnICsgZGF0YT8udW5pdFByZWZpeGVzIDogJyd9YDtcbiAgICB9XG5cbiAgICBtYWtlRGF0YUJveFRlbXBsYXRlKFxuICAgICAgICBzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7IHc6IEdvanNFZGl0b3JNb2RlbC5HUklEX1NJWkUgKiA1LCBoOiBHb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSB9LFxuICAgICkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLiQoXG4gICAgICAgICAgICBnby5Ob2RlLFxuICAgICAgICAgICAgJ1Nwb3QnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uU3BvdDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgICAgICAgICAgbW91c2VPdmVyOiBmdW5jdGlvbiAoZSwgb2JqKSB7fSxcbiAgICAgICAgICAgICAgICBjbGljazogKGUsIG9iajogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmo/LmRhdGE/Lm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaj8uZGF0YT8ub25TZWxlY3RlZChvYmo/LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWUuaXNTZWxlY3RlZCAmJiBlPy5kYXRhPy5vblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlPy5kYXRhPy5vblNlbGVjdGVkKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShnby5Qb2ludC5zdHJpbmdpZnkpLFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3VzZUhvdmVyOiAoZSwgb2JqKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvYmogYXMgYW55KS5wYXJ0Py5vYj8udmFsdWUgPT09IFZBTFVFX05BKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25Ib3ZlckluZm9CdXR0b24uZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBlPy5bJ1dyJ10/LnggKyA4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VMZWF2ZTogKGUsIG9iaikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgob2JqIGFzIGFueSkucGFydD8ub2I/LnZhbHVlID09PSBWQUxVRV9OQSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uSG92ZXJJbmZvQnV0dG9uLmVtaXQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcm93OiAwLCBzdHJldGNoOiBnby5HcmFwaE9iamVjdC5Ib3Jpem9udGFsIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uU2hhcGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlY3RhbmdsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsOiBHb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuTElHSFRfQkxVRSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBHb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuUkVTT0xVVElPTl9CTFVFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2ZpbGwnLCAnY29sb3InKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMTAsIDEwLCA1LCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKHNpemUudywgTmFOKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnd2hpdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnbm9ybWFsIDEwcHQgQXJpYWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nQmVsb3c6IDUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykubWFrZVR3b1dheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHJvdzogMSwgc3RyZXRjaDogZ28uR3JhcGhPYmplY3QuSG9yaXpvbnRhbCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnUmVjdGFuZ2xlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5MSUdIVF9CTFVFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLlJFU09MVVRJT05fQkxVRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIb3Jpem9udGFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAxMCwgNDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWluU2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMTAsIHNpemUuaCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oNSwgMCwgNSwgNSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnYm9sZCAxMnB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5HUkFZLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnZWRpdGFibGUnLCAnaXNFZGl0YWJsZScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICdzaG9ydGVuZWROdW1iZXInKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzdHJva2UnLCAnY29sb3InKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLnZhbHVlICE9PSBWQUxVRV9OQTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAxMCwgNDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWluU2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMTAsIHNpemUuaCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oNSwgNSwgNSwgMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnYm9sZCAxMnB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5HUkFZLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICcnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEudmFsdWUgIT09IFZBTFVFX05BO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAndW5pdFByZWZpeGVzJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzdHJva2UnLCAnY29sb3InKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEljb24gRXJyIHdoZW4gbGFjayBvZiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMTAsIDEwLCAxMCwgMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogVkFMVUVfTkEsIC8vIE9sZCB2ZXJzaW9uOiBURVhUX0VSUk9SXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogJ2JvbGQgMTBwdCBzYW5zLXNlcmlmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLlNBTE1PTixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXA6IGdvLlRleHRCbG9jay5XcmFwRml0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNdWx0aWxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICcnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEudmFsdWUgPT09IFZBTFVFX05BO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRoaXMuJChnby5QYW5lbCwgJ1ZlcnRpY2FsJywge1xuICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgwLCAwLjUsIDgsIDApLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLiQoZ28uUGFuZWwsICdWZXJ0aWNhbCcsIHtcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuUmlnaHQsXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IG5ldyBnby5TcG90KDEsIDAuNSwgLTgsIDApLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAvLyBmb3VyIG5hbWVkIHBvcnRzLCBvbmUgb24gZWFjaCBzaWRlOlxuXG4gICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdUJywgZ28uU3BvdC5Ub3AsIGdvLlNwb3QuVG9wU2lkZSwgZmFsc2UsIHRydWUpLFxuICAgICAgICAgICAgdGhpcy5tYWtlUG9ydCgnTCcsIGdvLlNwb3QuTGVmdCwgZ28uU3BvdC5MZWZ0U2lkZSwgdHJ1ZSwgdHJ1ZSksXG4gICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdSJywgZ28uU3BvdC5SaWdodCwgZ28uU3BvdC5SaWdodFNpZGUsIHRydWUsIHRydWUpLFxuICAgICAgICAgICAgdGhpcy5tYWtlUG9ydCgnQicsIGdvLlNwb3QuQm90dG9tLCBnby5TcG90LkJvdHRvbVNpZGUsIHRydWUsIGZhbHNlKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwLnNldChHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuREFUQV9CT1gsIG5vZGUpO1xuICAgIH1cblxuICAgIHNob3dQb2ludChsb2MpIHtcbiAgICAgICAgY29uc3QgZG9jTG9jID0gdGhpcy5teURpYWdyYW0udHJhbnNmb3JtRG9jVG9WaWV3KGxvYyk7XG4gICAgfVxuXG4gICAgbWFrZUVudGl0eVRlbXBsYXRlKFxuICAgICAgICBpY29uLFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgc2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9ID0geyB3OiBHb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSwgaDogR29qc0VkaXRvck1vZGVsLkdSSURfU0laRSAqIDUgfSxcbiAgICApIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCBub2RlID0gdGhpcy4kKFxuICAgICAgICAgICAgZ28uTm9kZSxcbiAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvblNwb3Q6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgIG1vdXNlT3ZlcjogZnVuY3Rpb24gKGUsIG9iaikge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZWxmLnNob3dQb2ludChvYmo/LnBhcnQ/LmxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iaj8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqPy5kYXRhPy5vblNlbGVjdGVkKG9iaj8uZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2tDb21wb2VudC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBlPy5bJ1dyJ10/LngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IG9iaj8uZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWUuaXNTZWxlY3RlZCAmJiBlPy5kYXRhPy5vblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlPy5kYXRhPy5vblNlbGVjdGVkKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZTogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seVxuICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdvLkFkb3JubWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Nwb3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dWaXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93Qmx1cjogNixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd09mZnNldDogbmV3IGdvLlBvaW50KDAsIDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93Q29sb3I6ICcjMDAwMDAwMjknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5TaGFwZSwgeyBmaWxsOiBudWxsLCBzdHJva2U6ICdkb2RnZXJibHVlJywgc3Ryb2tlV2lkdGg6IDQgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uUGxhY2Vob2xkZXIsIHsgcGFkZGluZzogMyB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSG9yaXpvbnRhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LlRvcFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBnby5TcG90LkJvdHRvbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnd2hpdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmdlbmVyYXRlQWN0aW9uR3JvdXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5ST19XQVRFUl9UUkVBVE1FTlRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLlJFTkFNRSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkZMT1dfREVUQUlMUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkFTU0VUX1BBUkFNRVRFUlMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5PVVRGTE9XLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuREVMRVRFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuUkVOQU1FLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkRFVEFJTFMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuT1VURkxPVyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5ERUxFVEUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdtb3ZhYmxlJywgJ21vdmFibGUnKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzZWxlY3RhYmxlJywgJ3NlbGVjdGFibGUnKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShnby5Qb2ludC5zdHJpbmdpZnkpLFxuXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgIHsgd2lkdGg6IHNpemUudywgaGVpZ2h0OiBzaXplLmggfSxcbiAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdSb3VuZGVkUmVjdGFuZ2xlJywge1xuICAgICAgICAgICAgICAgICAgICBmaWxsOiAnd2hpdGUnLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5MSU5LX1dBVEVSLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgLy8gc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgJ1RhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlBpY3R1cmUsIGljb24sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkU2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMjAsIHNpemUuaCAtIDUwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heFNpemU6IG5ldyBnby5TaXplKDYwLCA2MCksXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVN0cmV0Y2g6IGdvLkdyYXBoT2JqZWN0LlVuaWZvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sVGlwOiB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Rvb2xUaXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5UZXh0QmxvY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigxMCwgMCwgMywgMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCAxNSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzAwMEQ0MicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogJ2JvbGQgMTBwdCBBcmlhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cmFwOiBnby5UZXh0QmxvY2suTm9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogZ28uVGV4dEJsb2NrLk92ZXJmbG93RWxsaXBzaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVG9vbFRpcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5UZXh0QmxvY2ssIHsgbWFyZ2luOiA0IH0sIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykubWFrZVR3b1dheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2VkaXRhYmxlJywgJycsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5UWVBFX0NPTVBPTkVOVF9XQVRFUj8uaW5jbHVkZXMoZGF0YT8uc3lzdGVtVHlwZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT8udG9wb2xvZ3lUeXBlICE9PSBBVE9fRUNPTVBPTkVOVF9QTEFOVF9UWVBFLldBVEVSICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE/LnRvcG9sb2d5VHlwZSAhPT0gQVRPX0VDT01QT05FTlRfUExBTlRfVFlQRS5XQVRFUl9QTEFOVF9DRUxMXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuXG4gICAgICAgICAgICB0aGlzLiQoZ28uUGFuZWwsICdWZXJ0aWNhbCcsIHtcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuTGVmdCxcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnRGb2N1czogbmV3IGdvLlNwb3QoMCwgMC41LCA4LCAwKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhpcy4kKGdvLlBhbmVsLCAnVmVydGljYWwnLCB7XG4gICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LlJpZ2h0LFxuICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgxLCAwLjUsIC04LCAwKSxcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdUJywgZ28uU3BvdC5Ub3AsIGdvLlNwb3QuVG9wU2lkZSwgZmFsc2UsIHRydWUpLFxuICAgICAgICAgICAgdGhpcy5tYWtlUG9ydCgnTCcsIGdvLlNwb3QuTGVmdCwgZ28uU3BvdC5MZWZ0U2lkZSwgZmFsc2UsIHRydWUpLFxuICAgICAgICAgICAgdGhpcy5tYWtlUG9ydCgnUicsIGdvLlNwb3QuUmlnaHQsIGdvLlNwb3QuUmlnaHRTaWRlLCB0cnVlLCBmYWxzZSksXG4gICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdCJywgZ28uU3BvdC5Cb3R0b20sIGdvLlNwb3QuQm90dG9tU2lkZSwgdHJ1ZSwgZmFsc2UpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm15RGlhZ3JhbS5ub2RlVGVtcGxhdGVNYXAuc2V0KHRpdGxlLCBub2RlKTtcbiAgICB9XG5cbiAgICBtYWtlRW50aXR5VGVtcGxhdGVFbmVyZ3koXG4gICAgICAgIGljb24sXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7IHc6IEdvanNFZGl0b3JNb2RlbC5HUklEX1NJWkUgKiA1LCBoOiBHb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSB9LFxuICAgICkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLiQoXG4gICAgICAgICAgICBnby5Ob2RlLFxuICAgICAgICAgICAgJ1Nwb3QnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uU3BvdDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgICAgICAgICAgbW91c2VPdmVyOiBmdW5jdGlvbiAoZSwgb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlbGYuc2hvd1BvaW50KG9iaj8ucGFydD8ubG9jYXRpb24pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xpY2s6IChlLCBvYmo6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAob2JqPy5kYXRhPy5vblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmo/LmRhdGE/Lm9uU2VsZWN0ZWQob2JqPy5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlLmlzU2VsZWN0ZWQgJiYgZT8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZT8uZGF0YT8ub25TZWxlY3RlZChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGU6IHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHlcbiAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnby5BZG9ybm1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93VmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0JsdXI6IDYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dPZmZzZXQ6IG5ldyBnby5Qb2ludCgwLCAyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0NvbG9yOiAnIzAwMDAwMDI5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsIHsgZmlsbDogbnVsbCwgc3Ryb2tlOiAnZG9kZ2VyYmx1ZScsIHN0cm9rZVdpZHRoOiA0IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlBsYWNlaG9sZGVyLCB7IHBhZGRpbmc6IDMgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hvcml6b250YWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5Ub3BSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnRGb2N1czogZ28uU3BvdC5Cb3R0b20sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlQWN0aW9uR3JvdXAoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuUkVOQU1FLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuREVUQUlMUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLk9VVEZMT1csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5ERUxFVEUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdtb3ZhYmxlJywgJ21vdmFibGUnKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzZWxlY3RhYmxlJywgJ3NlbGVjdGFibGUnKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShnby5Qb2ludC5zdHJpbmdpZnkpLFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgICAgICB7IHdpZHRoOiBzaXplLncsIGhlaWdodDogc2l6ZS5oIH0sXG4gICAgICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnUm91bmRlZFJlY3RhbmdsZScsIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBHb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuTElOS19XQVRFUixcbiAgICAgICAgICAgICAgICAgICAgLy8gc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgJ1RhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywgdGl0bGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigzLCAzLCAxMCwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgMTUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzQ0NDQ0NCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnbm9ybWFsIDEwcHQgQXJpYWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xUaXA6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVG9vbFRpcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5QaWN0dXJlLCBpY29uLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3c6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCBzaXplLmggLSA2NSksXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVN0cmV0Y2g6IGdvLkdyYXBoT2JqZWN0LlVuaWZvcm0sXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigxMCwgMywgMywgMyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMjAsIDE1KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6ICcjMkMyQzJDJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnYm9sZCAxMHB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyYXA6IGdvLlRleHRCbG9jay5Ob25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBnby5UZXh0QmxvY2suT3ZlcmZsb3dFbGxpcHNpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVGlwOiB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykubWFrZVR3b1dheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZScpLm1ha2VUd29XYXkoKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRoaXMuJChnby5QYW5lbCwgJ1ZlcnRpY2FsJywge1xuICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgwLCAwLjUsIDgsIDApLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLiQoZ28uUGFuZWwsICdWZXJ0aWNhbCcsIHtcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuUmlnaHQsXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IG5ldyBnby5TcG90KDEsIDAuNSwgLTgsIDApLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAvLyBmb3VyIG5hbWVkIHBvcnRzLCBvbmUgb24gZWFjaCBzaWRlOlxuXG4gICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdUJywgZ28uU3BvdC5Ub3AsIGdvLlNwb3QuVG9wU2lkZSwgZmFsc2UsIHRydWUpLFxuICAgICAgICAgICAgdGhpcy5tYWtlUG9ydCgnTCcsIGdvLlNwb3QuTGVmdCwgZ28uU3BvdC5MZWZ0U2lkZSwgZmFsc2UsIHRydWUpLFxuICAgICAgICAgICAgdGhpcy5tYWtlUG9ydCgnUicsIGdvLlNwb3QuUmlnaHQsIGdvLlNwb3QuUmlnaHRTaWRlLCB0cnVlLCBmYWxzZSksXG4gICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdCJywgZ28uU3BvdC5Cb3R0b20sIGdvLlNwb3QuQm90dG9tU2lkZSwgdHJ1ZSwgZmFsc2UpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm15RGlhZ3JhbS5ub2RlVGVtcGxhdGVNYXAuc2V0KHRpdGxlLCBub2RlKTtcbiAgICB9XG5cbiAgICAvLyBQbGFudCBDZWxsXG4gICAgcGxhbnRDZWxsVGVtcGxhdGUoaWNvbiwgdGl0bGUsIHNpemU6IHsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSA9IHsgdzogMjYwLCBoOiBHb2pzRWRpdG9yTW9kZWwuUExBTlRfQ0VMTF9IRUlHSFQgfSkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLiQoXG4gICAgICAgICAgICBnby5Hcm91cCxcbiAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvblNwb3Q6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgIG1vdXNlT3ZlcjogZnVuY3Rpb24gKGUsIG9iaikge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZWxmLnNob3dQb2ludChvYmo/LnBhcnQ/LmxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgbW91c2VFbnRlcjogKGUsIG9iaikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZWxmLm9uSG92ZXJBbGVydC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxlZnQ6IGU/LlsnV3InXT8ueCArIDgsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0b3A6IGU/LlsnV3InXT8ueSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIG1lc3NhZ2VBbGVydDogKG9iaiBhcyBhbnkpLnBhcnQ/Lm9iPy5tZXNzYWdlQWxlcnQsXG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gb2JqLnBhcnQ7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25Ib3ZlckluZm9CdXR0b24uZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBlPy5bJ1dyJ10/LnggKyA4LFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgc2hhcGUgPSAobm9kZSBhcyBhbnkpPy5maW5kT2JqZWN0KCdTSEFQRV9LRVknKTsgLy8gVGhheSAnU0hBUEVfS0VZJyBi4bqxbmcga2jDs2EgYuG6oW4gxJHhurd0IGNobyBow6xuaCBTaGFwZVxuICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNoYXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFwZS5zdHJva2UgPSAnYmx1ZSc7IC8vIFRoYXkgxJHhu5VpIG3DoHUgc3Ryb2tlIHRow6BuaCBibHVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1vdXNlTGVhdmU6IChlLCBvYmopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkhvdmVySW5mb0J1dHRvbi5lbWl0KG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzZWxmLm9uSG92ZXJBbGVydC5lbWl0KG51bGwpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBjbGljazogKGUsIG9iajogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmo/LmRhdGE/Lm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaj8uZGF0YT8ub25TZWxlY3RlZChvYmo/LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrQ29tcG9lbnQuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogZT8uWydXciddPy54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogZT8uWydXciddPy55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiBvYmo/LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBkb3VibGVDbGljazogKGUsIG9iajogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5faW5pdGlhbE9wdGlvbnM/LmlzUmVhZE9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBvYmoucGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTaG93Tm9kZUluZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNlbGYub25Eb3VibGVDbGlja05vZGUuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogZT8uWydXciddPy54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogZT8uWydXciddPy55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAvLyBUb2RvXG5cbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWUuaXNTZWxlY3RlZCAmJiBlPy5kYXRhPy5vblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlPy5kYXRhPy5vblNlbGVjdGVkKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlOiB0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5XG4gICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uQWRvcm5tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnU3BvdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd1Zpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dCbHVyOiA2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93T2Zmc2V0OiBuZXcgZ28uUG9pbnQoMCwgMiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dDb2xvcjogJyMwMDAwMDAyOScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3aWR0aDogMTcwIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsIHsgZmlsbDogbnVsbCwgc3Ryb2tlOiAnZG9kZ2VyYmx1ZScsIHN0cm9rZVdpZHRoOiA0IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlBsYWNlaG9sZGVyLCB7IHBhZGRpbmc6IDMgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hvcml6b250YWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBhbGlnbm1lbnQ6IGdvLlNwb3QuVG9wUmlnaHQsIGFsaWdubWVudEZvY3VzOiBnby5TcG90LkJvdHRvbSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUFjdGlvbkdyb3VwKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLlJFTkFNRSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkNIQU5HRV9JQ09OLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuT05MWV9ERVRBSUxTLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLk9VVEZMT1csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkRFTEVURSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICdpc05vdEFjdGlvbicsICh4KSA9PiAheCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAnSG9yaXpvbnRhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHsgYWxpZ25tZW50OiBnby5TcG90LlRvcFJpZ2h0LCBhbGlnbm1lbnRGb2N1czogZ28uU3BvdC5Cb3R0b20gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgdGhpcy5nZW5lcmF0ZUFjdGlvbkdyb3VwKFtEZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuT05MWV9ERVRBSUxTXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJycsICh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICByZXR1cm4geD8uaXNPbmx5RGV0YWlscyAmJiAheD8uaXNOb3RBY3Rpb24gPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICksXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoZ28uUG9pbnQuc3RyaW5naWZ5KSxcbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAgICAgeyB3aWR0aDogc2l6ZS53LCBoZWlnaHQ6IHNpemUuaCB9LFxuICAgICAgICAgICAgICAgIC8vIHRoaXMuJChnby5TaGFwZSwgJ1JvdW5kZWRSZWN0YW5nbGUnLCB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGZpbGw6ICd3aGl0ZScsXG4gICAgICAgICAgICAgICAgLy8gICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkxJTktfV0FURVIsXG4gICAgICAgICAgICAgICAgLy8gICAgIC8vIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICAgICAgICAgIC8vIH0pLFxuICAgICAgICAgICAgICAgIC8vIHRoaXMuJChnby5QbGFjZWhvbGRlciwgeyBwYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDApLCB2aXNpYmxlOiBmYWxzZSB9KSxcbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigwLCA1MCwgMCwgNTApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdSb3VuZGVkUmVjdGFuZ2xlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkxJTktfV0FURVIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VEYXNoQXJyYXk6IFs1LCA1XSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1RhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5UZXh0QmxvY2ssIHRpdGxlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigzLCAwLCAxMCwgMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCAxNSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzQ0NDQ0NCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogJ25vcm1hbCAxMHB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xUaXA6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Rvb2xUaXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBpY3R1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCBzaXplLmggLSA2NSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlU3RyZXRjaDogZ28uR3JhcGhPYmplY3QuVW5pZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhJbWFnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh4KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA/PyBHb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlBMQU5UX0NFTExdLmljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMTAsIDAsIDMsIDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCAxNSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogJyMyQzJDMkMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnYm9sZCAxMHB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JhcDogZ28uVGV4dEJsb2NrLk5vbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBnby5UZXh0QmxvY2suT3ZlcmZsb3dFbGxpcHNpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Rvb2xUaXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZScpLm1ha2VUd29XYXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgIHRoaXMuJChnby5QYW5lbCwgJ1ZlcnRpY2FsJywge1xuICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgwLCAwLjUsIDgsIDApLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLiQoZ28uUGFuZWwsICdWZXJ0aWNhbCcsIHtcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuUmlnaHQsXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IG5ldyBnby5TcG90KDEsIDAuNSwgLTgsIDApLFxuICAgICAgICAgICAgfSksXG5cbiAgICAgICAgICAgIC8vIHRoaXMubWFrZVBvcnQoJ1QnLCBnby5TcG90LlRvcCwgZ28uU3BvdC5Ub3BTaWRlLCBmYWxzZSwgdHJ1ZSksXG4gICAgICAgICAgICAvLyB0aGlzLm1ha2VQb3J0KCdMJywgZ28uU3BvdC5MZWZ0LCBnby5TcG90LkxlZnRTaWRlLCBmYWxzZSwgdHJ1ZSksXG4gICAgICAgICAgICAvLyB0aGlzLm1ha2VQb3J0KCdSJywgZ28uU3BvdC5SaWdodCwgZ28uU3BvdC5SaWdodFNpZGUsIHRydWUsIGZhbHNlKSxcbiAgICAgICAgICAgIC8vIHRoaXMubWFrZVBvcnQoJ0InLCBnby5TcG90LkJvdHRvbSwgZ28uU3BvdC5Cb3R0b21TaWRlLCB0cnVlLCBmYWxzZSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubXlEaWFncmFtLm5vZGVUZW1wbGF0ZU1hcC5zZXQodGl0bGUsIG5vZGUpO1xuICAgIH1cblxuICAgIG1ha2VFbnRpdHlXaXRoZHJhd09yRGlzY2hhcmdlKFxuICAgICAgICBpY29uLFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgc2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9ID0geyB3OiBHb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSwgaDogR29qc0VkaXRvck1vZGVsLkdSSURfU0laRSAqIDUgfSxcbiAgICApIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCBub2RlID0gdGhpcy4kKFxuICAgICAgICAgICAgZ28uTm9kZSxcbiAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvblNwb3Q6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgIG1vdXNlT3ZlcjogZnVuY3Rpb24gKGUsIG9iaikge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZWxmLnNob3dQb2ludChvYmo/LnBhcnQ/LmxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iaj8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqPy5kYXRhPy5vblNlbGVjdGVkKG9iaj8uZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZS5pc1NlbGVjdGVkICYmIGU/LmRhdGE/Lm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGU/LmRhdGE/Lm9uU2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlOiB0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5XG4gICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uQWRvcm5tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnU3BvdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCB7IGZpbGw6IG51bGwsIHN0cm9rZTogJ2RvZGdlcmJsdWUnLCBzdHJva2VXaWR0aDogNCB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5QbGFjZWhvbGRlciwgeyBwYWRkaW5nOiAzIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIb3Jpem9udGFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYWxpZ25tZW50OiBnby5TcG90LlRvcFJpZ2h0LCBhbGlnbm1lbnRGb2N1czogZ28uU3BvdC5Cb3R0b20gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVBY3Rpb25Hcm91cChbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5SRU5BTUUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5ERVRBSUxTLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuT1VURkxPVyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkRFTEVURSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdtb3ZhYmxlJywgJ21vdmFibGUnKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzZWxlY3RhYmxlJywgJ3NlbGVjdGFibGUnKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShnby5Qb2ludC5zdHJpbmdpZnkpLFxuXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgIHsgd2lkdGg6IHNpemUudywgaGVpZ2h0OiBzaXplLmggfSxcbiAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdSb3VuZGVkUmVjdGFuZ2xlJywge1xuICAgICAgICAgICAgICAgICAgICBmaWxsOiAnd2hpdGUnLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5MSU5LX1dBVEVSLFxuICAgICAgICAgICAgICAgICAgICAvLyBzdHJva2VEYXNoQXJyYXk6IFs1LCA1XSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLiQoZ28uVGV4dEJsb2NrLCB0aXRsZSwge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDMsIDMsIDEwLCAzKSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIG1heFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCBOYU4pLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3Ryb2tlOiAnIzQ0NDQ0NCcsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBmb250OiAnbm9ybWFsIDEwcHQgQXJpYWwnLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gfSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5QaWN0dXJlLCBpY29uLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3c6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCBzaXplLmggLSA1MCksXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVN0cmV0Y2g6IGdvLkdyYXBoT2JqZWN0LlVuaWZvcm0sXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigxMCwgMCwgMywgMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCAxNSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzAwMEQ0MicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogJ2JvbGQgMTBwdCBBcmlhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cmFwOiBnby5UZXh0QmxvY2suTm9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogZ28uVGV4dEJsb2NrLk92ZXJmbG93RWxsaXBzaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVG9vbFRpcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZScpLm1ha2VUd29XYXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgLy8gZGVmaW5lIGEgdG9vbHRpcCBmb3IgZWFjaCBub2RlIHRoYXQgZGlzcGxheXMgdGhlIGNvbG9yIGFzIHRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0b29sVGlwOiB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywgeyBtYXJnaW46IDQgfSwgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZScpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICApLCAvLyBlbmQgb2YgQWRvcm5tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy4kKGdvLlBhbmVsLCAnVmVydGljYWwnLCB7XG4gICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IG5ldyBnby5TcG90KDAsIDAuNSwgOCwgMCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuJChnby5QYW5lbCwgJ1ZlcnRpY2FsJywge1xuICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5SaWdodCxcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnRGb2N1czogbmV3IGdvLlNwb3QoMSwgMC41LCAtOCwgMCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC8vIGZvdXIgbmFtZWQgcG9ydHMsIG9uZSBvbiBlYWNoIHNpZGU6XG5cbiAgICAgICAgICAgIHRoaXMubWFrZVBvcnQoJ1QnLCBnby5TcG90LlRvcCwgZ28uU3BvdC5Ub3BTaWRlLCBmYWxzZSwgdHJ1ZSksXG4gICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdMJywgZ28uU3BvdC5MZWZ0LCBnby5TcG90LkxlZnRTaWRlLCBmYWxzZSwgdHJ1ZSksXG4gICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdSJywgZ28uU3BvdC5SaWdodCwgZ28uU3BvdC5SaWdodFNpZGUsIHRydWUsIGZhbHNlKSxcbiAgICAgICAgICAgIHRoaXMubWFrZVBvcnQoJ0InLCBnby5TcG90LkJvdHRvbSwgZ28uU3BvdC5Cb3R0b21TaWRlLCB0cnVlLCBmYWxzZSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubXlEaWFncmFtLm5vZGVUZW1wbGF0ZU1hcC5zZXQodGl0bGUsIG5vZGUpO1xuICAgIH1cblxuICAgIGVkaXRUZXh0R3JvdXBab25lKGUsIGJ1dHRvbikge1xuICAgICAgICBjb25zdCBub2RlR3JvdXAgPSBidXR0b24ucGFydC5hZG9ybmVkUGFydDtcbiAgICAgICAgY29uc3QgZGlhZ3JhbSA9IG5vZGVHcm91cC5kaWFncmFtO1xuICAgICAgICBlLmRpYWdyYW0uY29tbWFuZEhhbmRsZXIuZWRpdFRleHRCbG9jayhub2RlR3JvdXAuZmluZE9iamVjdCgnVEVYVEJMT0NLJykpO1xuICAgIH1cblxuICAgIGVkaXRUZXh0KGUsIGJ1dHRvbikge1xuICAgICAgICBjb25zdCBub2RlID0gYnV0dG9uLnBhcnQuYWRvcm5lZFBhcnQ7XG4gICAgICAgIGUuZGlhZ3JhbS5jb21tYW5kSGFuZGxlci5lZGl0VGV4dEJsb2NrKG5vZGUuZmluZE9iamVjdCgnVEVYVEJMT0NLJykpO1xuICAgIH1cblxuICAgIGFzeW5jIGRyYWdOZXdOb2RlKGUsIGJ1dHRvbikge1xuICAgICAgICBjb25zdCB0b29sID0gZS5kaWFncmFtLnRvb2xNYW5hZ2VyLmRyYWdnaW5nVG9vbDtcblxuICAgICAgICBpZiAodG9vbC5pc0JleW9uZERyYWdTaXplKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBidXR0b24uX2RyYWdEYXRhO1xuICAgICAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgICAgICAgICBlLmRpYWdyYW0uc3RhcnRUcmFuc2FjdGlvbignYnV0dG9uIGRyYWcnKTsgLy8gc2VlIGRvRGVhY3RpdmF0ZSwgYmVsb3dcblxuICAgICAgICAgICAgY29uc3QgZnJvbW5vZGUgPSBidXR0b24ucGFydC5hZG9ybmVkUGFydDtcbiAgICAgICAgICAgIGNvbnN0IGRpYWdyYW0gPSBmcm9tbm9kZS5kaWFncmFtO1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSBkaWFncmFtLm1vZGVsO1xuICAgICAgICAgICAgY29uc3Qgbm9kZWRhdGEgPSB7IC4uLm1vZGVsLmNvcHlOb2RlRGF0YShkYXRhKSwga2V5OiBVdGlsc1NlcnZpY2UuZ2VuZXJhdGVVVUlEKCkgfTtcbiAgICAgICAgICAgIG1vZGVsLmFkZE5vZGVEYXRhKG5vZGVkYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld25vZGUgPSBkaWFncmFtLmZpbmROb2RlRm9yRGF0YShub2RlZGF0YSk7XG4gICAgICAgICAgICBjb25zdCBsaW5rZGF0YSA9IG1vZGVsLmNvcHlMaW5rRGF0YSh7fSk7XG4gICAgICAgICAgICBtb2RlbC5zZXRGcm9tS2V5Rm9yTGlua0RhdGEobGlua2RhdGEsIG1vZGVsLmdldEtleUZvck5vZGVEYXRhKGZyb21ub2RlLmRhdGEpKTtcbiAgICAgICAgICAgIG1vZGVsLnNldFRvS2V5Rm9yTGlua0RhdGEobGlua2RhdGEsIG1vZGVsLmdldEtleUZvck5vZGVEYXRhKG5ld25vZGUuZGF0YSkpO1xuICAgICAgICAgICAgbW9kZWwuYWRkTGlua0RhdGEobGlua2RhdGEpO1xuICAgICAgICAgICAgZGlhZ3JhbS5zZWxlY3QobmV3bm9kZSk7XG4gICAgICAgICAgICAvLyAgIHRoaXMuY3JlYXRlTm9kZUFuZExpbmsoZGF0YSwgYnV0dG9uLnBhcnQuYWRvcm5lZFBhcnQpO1xuXG4gICAgICAgICAgICBuZXdub2RlLmxvY2F0aW9uID0gZS5kaWFncmFtLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50O1xuICAgICAgICAgICAgLy8gZG9uJ3QgY29tbWl0VHJhbnNhY3Rpb24gaGVyZSwgYnV0IGluIHRvb2wuZG9EZWFjdGl2YXRlLCBhZnRlciBkcmFnIG9wZXJhdGlvbiBmaW5pc2hlZFxuICAgICAgICAgICAgLy8gc2V0IHRvb2wuY3VycmVudFBhcnQgdG8gYSBzZWxlY3RlZCBtb3ZhYmxlIFBhcnQgYW5kIHRoZW4gYWN0aXZhdGUgdGhlIERyYWdnaW5nVG9vbFxuICAgICAgICAgICAgdG9vbC5jdXJyZW50UGFydCA9IG5ld25vZGU7XG4gICAgICAgICAgICBlLmRpYWdyYW0uY3VycmVudFRvb2wgPSB0b29sO1xuICAgICAgICAgICAgdG9vbC5kb0FjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRJdGVtT25Hcm91cFpvbmUoZSwgYnV0dG9uKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBidXR0b24uX2RyYWdEYXRhO1xuICAgICAgICBpZiAoIWRhdGEpIHJldHVybjtcbiAgICAgICAgZS5kaWFncmFtLnN0YXJ0VHJhbnNhY3Rpb24oJ0FkZCBJdGVtIE9uIEdyb3VwIFpvbmUnKTtcbiAgICAgICAgY29uc3QgZnJvbW5vZGUgPSBidXR0b24ucGFydC5hZG9ybmVkUGFydDtcbiAgICAgICAgY29uc3QgZHJhZ0RhdGEgPSBidXR0b24uX2RyYWdEYXRhO1xuICAgICAgICBjb25zdCBkaWFncmFtID0gZnJvbW5vZGUuZGlhZ3JhbTtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBkaWFncmFtLm1vZGVsO1xuICAgICAgICBjb25zdCBub2RlZGF0YSA9IG1vZGVsLmNvcHlOb2RlRGF0YShkcmFnRGF0YSk7XG4gICAgICAgIG1vZGVsLmFkZE5vZGVEYXRhKHtcbiAgICAgICAgICAgIC4uLm5vZGVkYXRhLFxuICAgICAgICAgICAgdHlwZTogJ1N1YlN5c3RlbScsXG4gICAgICAgICAgICBuYW1lOiAnW1RpdGxlLi4uXScsXG4gICAgICAgICAgICBuYW1lSXRlbTogJ1tOYW1lLi4uXScsXG4gICAgICAgICAgICBncm91cDogZnJvbW5vZGU/Lm9iPy5rZXksXG4gICAgICAgIH0pO1xuICAgICAgICBlLmRpYWdyYW0uY29tbWl0VHJhbnNhY3Rpb24oJ0FkZCBJdGVtIE9uIEdyb3VwIFpvbmUnKTtcbiAgICAgICAgLy8gY29uc3QgbmV3bm9kZSA9IGRpYWdyYW0uZmluZE5vZGVGb3JEYXRhKG5vZGVkYXRhKTtcbiAgICAgICAgLy8gY29uc3QgbGlua2RhdGEgPSBtb2RlbC5jb3B5TGlua0RhdGEoe30pO1xuICAgICAgICAvLyBtb2RlbC5zZXRGcm9tS2V5Rm9yTGlua0RhdGEobGlua2RhdGEsIG1vZGVsLmdldEtleUZvck5vZGVEYXRhKGZyb21ub2RlLmRhdGEpKTtcbiAgICAgICAgLy8gbW9kZWwuc2V0VG9LZXlGb3JMaW5rRGF0YShsaW5rZGF0YSwgbW9kZWwuZ2V0S2V5Rm9yTm9kZURhdGEobmV3bm9kZS5kYXRhKSk7XG4gICAgICAgIC8vIG1vZGVsLmFkZExpbmtEYXRhKGxpbmtkYXRhKTtcbiAgICAgICAgLy8gZGlhZ3JhbS5zZWxlY3QobmV3bm9kZSk7XG5cbiAgICAgICAgLy8gbmV3bm9kZS5sb2NhdGlvbiA9IG5ldyBnby5Qb2ludChmcm9tbm9kZS5sb2NhdGlvbi54ICsgMjAwLCBmcm9tbm9kZS5sb2NhdGlvbi55KTtcbiAgICAgICAgLy8gZS5kaWFncmFtLmNvbW1pdFRyYW5zYWN0aW9uKCdDcmVhdGUgTm9kZSBhbmQgTGluaycpO1xuICAgIH1cblxuICAgIGdlbmVyYXRlQWN0aW9uR3JvdXAoYWN0aW9uczogQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TW10pIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLiQoXG4gICAgICAgICAgICAnQnV0dG9uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24gKGUsIG9iaikge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm9wZW5BY3Rpb25NZW51KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkQWN0aW9ucyA9IF8uZmlsdGVyKG9iai5wYXJ0Py5bJ29iJ10/LmFjdGlvbnMgPz8gYWN0aW9ucywgKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyIEluc2lnaHQgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuSU5TSUdIVCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIW9iai5wYXJ0Py5bJ29iJ10/LmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9PT0gQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLlJFTkFNRSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5wYXJ0Py5bJ29iJ10/LnR5cGUgIT09IEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5URVhUX05PREUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb2pzRWRpdG9yTW9kZWwuVFlQRV9DT01QT05FTlRfV0FURVI/LmluY2x1ZGVzKG9iai5wYXJ0Py5bJ29iJ10/LnN5c3RlbVR5cGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnBhcnQ/Llsnb2InXT8udG9wb2xvZ3lUeXBlICE9PSBBVE9fRUNPTVBPTkVOVF9QTEFOVF9UWVBFLldBVEVSICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnBhcnQ/Llsnb2InXT8udG9wb2xvZ3lUeXBlICE9PSBBVE9fRUNPTVBPTkVOVF9QTEFOVF9UWVBFLldBVEVSX1BMQU5UX0NFTExcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE9fRUNPTVBPTkVOVF9QTEFOVF9UWVBFLlNURUFNID09PSBvYmoucGFydD8uWydvYiddPy50b3BvbG9neVR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID09PSBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuSU5TSUdIVFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5EQVRBX01BUFBJTkc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9ucyA9IGZpbHRlcmVkQWN0aW9ucy5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9uQ2xpY2tGbiA9ICgpID0+IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5JTlNJR0hUOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkRBVEFfTUFQUElORzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGlja0ZuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbk9wZW5JbnNpZ2h0TWFwcGluZy5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBvYmoucGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5ERVRBSUxTOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkZMT1dfREVUQUlMUzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGlja0ZuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbk9wZW5EZXRhaWwuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogb2JqLnBhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuT05MWV9ERVRBSUxTOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uT3BlbkRldGFpbC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBvYmoucGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5BU1NFVF9QQVJBTUVURVJTOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uT3BlbkFzc2V0UGFyYW1ldGVyLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IG9iai5wYXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLlJFTkFNRTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGlja0ZuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5wYXJ0Py5kYXRhPy50eXBlID09PSBHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vblJlbmFtZS5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogZT8uWydXciddPy54IC0gNTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogZT8uWydXciddPy55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vYmoucGFydD8uZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExheW91dFNlcnZpY2Uuc2V0VG9vbFRpcENvbXBvbmVudERhdGFTdGF0aWMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQ6IFJlbmFtZUJveENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgbGVmdDogZT8uWydXciddPy54IC0gNTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB0b3A6IGU/LlsnV3InXT8ueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIC4uLm9iai5wYXJ0Py5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXRUZXh0KGUsIG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLk9VVEZMT1c6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tGbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpY2tOZXdOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5tZXJnZShvYmosIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uTW92ZTogc2VsZi5kcmFnTmV3Tm9kZSwgLy8gZGVmaW5lZCBiZWxvdywgdG8gc3VwcG9ydCBkcmFnZ2luZyBmcm9tIHRoZSBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RyYWdEYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuVEVYVF9OT0RFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYCR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLkFDVElPTl9SSUdIVF9NRU5VX0dST1VQLkRBVEFfQk9YXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XyR7bW9tZW50KCkudmFsdWVPZigpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkJMVUUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZhYmxlOiBzZWxmLnBsYW50U2F0dXMgPT09IEFUT19FUGxhbnRUeXBlLkJBU0lDX1BMQU5UID8gZmFsc2UgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOb3RBbGxvd0Nvbm5lY3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wbGFudFNhdHVzID09PSBBVE9fRVBsYW50VHlwZS5CQVNJQ19QTEFOVCA/IHRydWUgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuREVMRVRFOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZU5vZGUoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkNIQU5HRV9JQ09OOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uT3BlbkNoYW5nZUljb24uZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogb2JqLnBhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0b0RlZmF1bHRHb2pzRWRpdG9yLkFDVElPTlNbYWN0aW9uXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tGbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICdCdXR0b25Cb3JkZXIuc3Ryb2tlV2lkdGgnOiAwLFxuICAgICAgICAgICAgICAgICdCdXR0b25Cb3JkZXIuZmlsbCc6ICd3aGl0ZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnaXNOb3REcmFnTmV3Tm9kZScsICh4KSA9PiAheCksXG4gICAgICAgICAgICAvLyBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICdpc05vdERlbGV0ZScsICh4KSA9PiAheCksXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICdpc05vdEFjdGlvbicsICh4KSA9PiAheCksXG4gICAgICAgICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiA0LFxuICAgICAgICAgICAgICAgIHRleHQ6ICdcXHVlNDg5JyxcbiAgICAgICAgICAgICAgICBmb250OiAnMjBweCBcIkZvbnQgQXdlc29tZSA2IFByb1wiJyxcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGFzeW5jIGNsaWNrTmV3Tm9kZShlLCBidXR0b24pIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGJ1dHRvbi5fZHJhZ0RhdGE7XG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgICAgICBlLmRpYWdyYW0uc3RhcnRUcmFuc2FjdGlvbignQ3JlYXRlIE5vZGUgYW5kIExpbmsnKTtcbiAgICAgICAgY29uc3QgZnJvbW5vZGUgPSBidXR0b24ucGFydC5hZG9ybmVkUGFydDtcblxuICAgICAgICAvLyB0aGlzLmNyZWF0ZU5vZGVBbmRMaW5rKGJ1dHRvbi5fZHJhZ0RhdGEsIGZyb21ub2RlKTtcbiAgICAgICAgY29uc3QgZHJhZ0RhdGEgPSBidXR0b24uX2RyYWdEYXRhO1xuICAgICAgICBjb25zdCBkaWFncmFtID0gZnJvbW5vZGUuZGlhZ3JhbTtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBkaWFncmFtLm1vZGVsO1xuICAgICAgICBjb25zdCBub2RlZGF0YSA9IHsgLi4ubW9kZWwuY29weU5vZGVEYXRhKGRyYWdEYXRhKSwga2V5OiBVdGlsc1NlcnZpY2UuZ2VuZXJhdGVVVUlEKCkgfTtcbiAgICAgICAgbW9kZWwuYWRkTm9kZURhdGEoe1xuICAgICAgICAgICAgLi4ubm9kZWRhdGEsXG4gICAgICAgICAgICBpc0VkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc2hvcnRlbmVkTnVtYmVyOiAwLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IGZhbHNlLFxuICAgICAgICAgICAgZGF0YUNvbGxlY3Rpb25NZXRob2Q6IEdvanNFZGl0b3JNb2RlbC5EQVRBX0NPTExFQ1RJT05fTUVUSE9ELk1BTlVBTCxcbiAgICAgICAgICAgIGNvbG9yOiBHb2pzRWRpdG9yTW9kZWwuQ09MT1JfQ09MTEVDVElPTl9NRVRIT0RbR29qc0VkaXRvck1vZGVsLkRBVEFfQ09MTEVDVElPTl9NRVRIT0QuTUFOVUFMXS5jb2xvcixcbiAgICAgICAgICAgIGdyb3VwOiBmcm9tbm9kZT8ub2I/Lmdyb3VwLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBuZXdub2RlID0gZGlhZ3JhbS5maW5kTm9kZUZvckRhdGEobm9kZWRhdGEpO1xuXG4gICAgICAgIGNvbnN0IGxpbmtkYXRhID0gbW9kZWwuY29weUxpbmtEYXRhKHt9KTtcbiAgICAgICAgbW9kZWwuc2V0RnJvbUtleUZvckxpbmtEYXRhKGxpbmtkYXRhLCBtb2RlbC5nZXRLZXlGb3JOb2RlRGF0YShmcm9tbm9kZS5kYXRhKSk7XG4gICAgICAgIG1vZGVsLnNldFRvS2V5Rm9yTGlua0RhdGEobGlua2RhdGEsIG1vZGVsLmdldEtleUZvck5vZGVEYXRhKG5ld25vZGUuZGF0YSkpO1xuICAgICAgICBtb2RlbC5hZGRMaW5rRGF0YShsaW5rZGF0YSk7XG4gICAgICAgIGRpYWdyYW0uc2VsZWN0KG5ld25vZGUpO1xuICAgICAgICBpZiAobm9kZWRhdGE/Lm1vdmFibGUgIT09IHVuZGVmaW5lZCAmJiBub2RlZGF0YT8ubW92YWJsZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3bm9kZS5tb3ZhYmxlID0gbm9kZWRhdGE/Lm1vdmFibGU7XG4gICAgICAgIH1cblxuICAgICAgICBuZXdub2RlLmxvY2F0aW9uID0gbmV3IGdvLlBvaW50KFxuICAgICAgICAgICAgZnJvbW5vZGUubG9jYXRpb24ueCArIDE2MCxcbiAgICAgICAgICAgIGZyb21ub2RlLmxvY2F0aW9uLnkgKyB0aGlzLmZpbmRMb2NZRnJvbW5vZGUoZnJvbW5vZGUpICogQXRvRGVmYXVsdEdvanNFZGl0b3IuRElTVEFOQ0VfMl9PVVRQVVQsXG4gICAgICAgICk7XG4gICAgICAgIGUuZGlhZ3JhbS5jb21taXRUcmFuc2FjdGlvbignQ3JlYXRlIE5vZGUgYW5kIExpbmsnKTtcbiAgICB9XG5cbiAgICBmaW5kTG9jWUZyb21ub2RlKGZyb21ub2RlKSB7XG4gICAgICAgIC8vIEZpbmQgbG9jYXRpb24gYXV0byByaWdodFxuICAgICAgICBjb25zdCBsb2NZRnJvbW5vZGUgPSBmcm9tbm9kZS5kYXRhPy5sb2M/LnNwbGl0KCcgJyk/LlsxXTtcbiAgICAgICAgY29uc3QgbG9jWUFscmVhZHlFeGlzdDogYW55ID0gW107XG4gICAgICAgIGZyb21ub2RlLmZpbmRMaW5rc091dE9mKCkuZWFjaChmdW5jdGlvbiAobGluaykge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZSA9IGxpbmsudG9Ob2RlO1xuICAgICAgICAgICAgaWYgKHRhcmdldE5vZGUpIHtcbiAgICAgICAgICAgICAgICBsb2NZQWxyZWFkeUV4aXN0LnB1c2godGFyZ2V0Tm9kZS5kYXRhPy5sb2M/LnNwbGl0KCcgJyk/LlsxXSAtIGxvY1lGcm9tbm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgd2hpbGUgKHRoaXMuaXNFbXB0eVlMb2MobG9jWUFscmVhZHlFeGlzdCwgaSkgPT09IG51bGwgJiYgaSA8IDEwMCkge1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmlzRW1wdHlZTG9jKGxvY1lBbHJlYWR5RXhpc3QsIGkpO1xuICAgIH1cblxuICAgIGlzRW1wdHlZTG9jKGxvY1lBbHJlYWR5RXhpc3QsIGkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIV8uc29tZShcbiAgICAgICAgICAgICAgICBsb2NZQWxyZWFkeUV4aXN0LFxuICAgICAgICAgICAgICAgICh4KSA9PlxuICAgICAgICAgICAgICAgICAgICB4IDwgaSAqIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkRJU1RBTkNFXzJfT1VUUFVUICsgQXRvRGVmYXVsdEdvanNFZGl0b3IuRElTVEFOQ0VfMl9PVVRQVVQgLyAyICYmXG4gICAgICAgICAgICAgICAgICAgIHggPiBpICogQXRvRGVmYXVsdEdvanNFZGl0b3IuRElTVEFOQ0VfMl9PVVRQVVQgLSBBdG9EZWZhdWx0R29qc0VkaXRvci5ESVNUQU5DRV8yX09VVFBVVCAvIDIsXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIV8uc29tZShcbiAgICAgICAgICAgICAgICBsb2NZQWxyZWFkeUV4aXN0LFxuICAgICAgICAgICAgICAgICh4KSA9PlxuICAgICAgICAgICAgICAgICAgICB4IDwgLWkgKiBBdG9EZWZhdWx0R29qc0VkaXRvci5ESVNUQU5DRV8yX09VVFBVVCArIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkRJU1RBTkNFXzJfT1VUUFVUIC8gMiAmJlxuICAgICAgICAgICAgICAgICAgICB4ID4gLWkgKiBBdG9EZWZhdWx0R29qc0VkaXRvci5ESVNUQU5DRV8yX09VVFBVVCAtIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkRJU1RBTkNFXzJfT1VUUFVUIC8gMixcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gLWk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY3JlYXRlTmV3Tm9kZShuZXdub2RlKSB7XG4gICAgICAgIHRoaXMuYWRkVGVtcGxhdGUobmV3bm9kZSk7XG4gICAgICAgIHRoaXMubXlEaWFncmFtLnN0YXJ0VHJhbnNhY3Rpb24oJ2FkZCBncm91cCBub2RlJyk7XG4gICAgICAgIHRoaXMubXlEaWFncmFtLm1vZGVsLmFkZE5vZGVEYXRhKG5ld25vZGUpO1xuICAgICAgICB0aGlzLm15RGlhZ3JhbS5jb21taXRUcmFuc2FjdGlvbignYWRkIGdyb3VwIG5vZGUnKTtcbiAgICB9XG5cbiAgICBkZWxldGVOb2RlKGUpIHtcbiAgICAgICAgZS5kaWFncmFtLnN0YXJ0VHJhbnNhY3Rpb24oJ0RlbGV0ZSBncm91cCBub2RlJyk7XG4gICAgICAgIGUuZGlhZ3JhbS5yZW1vdmVQYXJ0cyhlLmRpYWdyYW0uc2VsZWN0aW9uKTtcbiAgICAgICAgZS5kaWFncmFtLmNvbW1pdFRyYW5zYWN0aW9uKCdEZWxldGUgZ3JvdXAgbm9kZScpO1xuICAgIH1cblxuICAgIGRlbGV0ZU5vZGVPbkRpYWdyYW0oZSkge1xuICAgICAgICBlLnN0YXJ0VHJhbnNhY3Rpb24oJ0RlbGV0ZSBncm91cCBub2RlJyk7XG4gICAgICAgIGUucmVtb3ZlUGFydHMoZS5zZWxlY3Rpb24pO1xuICAgICAgICBlLmNvbW1pdFRyYW5zYWN0aW9uKCdEZWxldGUgZ3JvdXAgbm9kZScpO1xuICAgIH1cblxuICAgIGluc2lnaHROb2RlKGUpIHt9XG5cbiAgICBkcmF3TGluayhlLCBidXR0b24pIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGJ1dHRvbi5wYXJ0LmFkb3JuZWRQYXJ0O1xuICAgICAgICBjb25zdCB0b29sID0gZS5kaWFncmFtLnRvb2xNYW5hZ2VyLmxpbmtpbmdUb29sO1xuICAgICAgICB0b29sLnN0YXJ0T2JqZWN0ID0gbm9kZS5wb3J0O1xuICAgICAgICBlLmRpYWdyYW0uY3VycmVudFRvb2wgPSB0b29sO1xuICAgICAgICB0b29sLmRvQWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICBtYWtlUG9ydEdyb3VwKG5hbWUsIGFsaWduLCBzcG90LCBvdXRwdXQsIGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWwgPSBhbGlnbi5lcXVhbHMoZ28uU3BvdC5Ub3ApIHx8IGFsaWduLmVxdWFscyhnby5TcG90LkJvdHRvbSk7XG4gICAgICAgIHJldHVybiB0aGlzLiQoXG4gICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICdUYWJsZScsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJyM5MTlDQTUnLFxuICAgICAgICAgICAgICAgIHdpZHRoOiA0MCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDQwLFxuICAgICAgICAgICAgICAgIGFsaWdubWVudDogYWxpZ24sXG4gICAgICAgICAgICAgICAgc3RyZXRjaDogaG9yaXpvbnRhbCA/IGdvLkdyYXBoT2JqZWN0Lkhvcml6b250YWwgOiBnby5HcmFwaE9iamVjdC5WZXJ0aWNhbCxcbiAgICAgICAgICAgICAgICBwb3J0SWQ6IG5hbWUsXG4gICAgICAgICAgICAgICAgZnJvbVNwb3Q6IHNwb3QsXG4gICAgICAgICAgICAgICAgZnJvbUxpbmthYmxlOiBvdXRwdXQsXG4gICAgICAgICAgICAgICAgdG9TcG90OiBzcG90LFxuICAgICAgICAgICAgICAgIHRvTGlua2FibGU6IGlucHV0LFxuICAgICAgICAgICAgICAgIGN1cnNvcjogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seSA/ICcnIDogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBnby5TcG90LkNlbnRlciwgLy8gdOG6rXAgdHJ1bmcgdsOgbyB0cnVuZyB0w6JtIGPhu6dhIFBhbmVsXG4gICAgICAgICAgICAgICAgLy8gbW91c2VFbnRlcjogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seVxuICAgICAgICAgICAgICAgIC8vICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAvLyAgICAgOiAoZSwgcGFuZWwpID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgY29uc3QgdGV4dEJsb2NrID0gKHBhbmVsIGFzIGFueSk/LmZpbmRPYmplY3QoJ3RleHRCbG9jaycpIGFzIGdvLlRleHRCbG9jayB8IG51bGw7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgIGlmICh0ZXh0QmxvY2spIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIC8vICYmIG91dHB1dFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgdGV4dEJsb2NrLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgY2FzZSAnQic6XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgY2FzZSAnUic6IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9ICdyZ2IoMjQzIDE0NCAxNzEpJztcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIGNhc2UgJ1QnOlxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIGNhc2UgJ0wnOiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSAncmdiKDEwMywxNTEsMjA3KSc7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSAncmdiKDI0MyAxNDQgMTcxKSc7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8vIG1vdXNlTGVhdmU6IHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHlcbiAgICAgICAgICAgICAgICAvLyAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgLy8gICAgIDogKGUsIHBhbmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgIGNvbnN0IHRleHRCbG9jayA9IChwYW5lbCBhcyBhbnkpLmZpbmRPYmplY3QoJ3RleHRCbG9jaycpIGFzIGdvLlRleHRCbG9jayB8IG51bGw7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgIGlmICh0ZXh0QmxvY2spIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIHRleHRCbG9jay52aXNpYmxlID0gZmFsc2U7IC8vIOG6qG4gVGV4dEJsb2NrIGtoaSBy4budaSBraOG7j2kgUGFuZWxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgICAgICAgICAvLyAgICAgICB9LFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnRWxsaXBzZScsIHtcbiAgICAgICAgICAgICAgICBmaWxsOiAnd2hpdGUnLCAvLyBCYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBjaXJjbGVcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMixcbiAgICAgICAgICAgICAgICBzdHJva2U6ICcjOTE5Q0E1JywgLy8gQm9yZGVyIGNvbG9yIG9mIHRoZSBjaXJjbGVcbiAgICAgICAgICAgICAgICB3aWR0aDogNDAsIC8vIE1hdGNoIHRoZSBwYW5lbCdzIHdpZHRoXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiA0MCwgLy8gTWF0Y2ggdGhlIHBhbmVsJ3MgaGVpZ2h0XG4gICAgICAgICAgICB9KSxcblxuICAgICAgICAgICAgLy8gdGhpcy4kKFxuICAgICAgICAgICAgLy8gICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgIC8vICAgICB7XG4gICAgICAgICAgICAvLyAgICAgICAgIG5hbWU6ICd0ZXh0QmxvY2snLFxuICAgICAgICAgICAgLy8gICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAvLyAgICAgICAgIHRleHQ6ICdcXHVmMGRhJywgLy8gTcOjIFVuaWNvZGUgdMawxqFuZyDhu6luZyB24bubaSBmYS1jYXJldC1sZWZ0XG4gICAgICAgICAgICAvLyAgICAgICAgIGZvbnQ6ICc5MDAgMTJweCBcIkZvbnQgQXdlc29tZSA2IFByb1wiJyxcbiAgICAgICAgICAgIC8vICAgICAgICAgc3Ryb2tlOiAnd2hpdGUnLCAvLyDEkOG6t3QgbcOgdSBjaOG7ryB0aMOgbmggbcOgdSB0cuG6r25nXG4gICAgICAgICAgICAvLyAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgICAgLy8gICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgICAgLy8gICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnLCAoXykgPT4ge1xuICAgICAgICAgICAgLy8gICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGNhc2UgJ1QnOlxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgY2FzZSAnQic6IHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICByZXR1cm4gJ1xcdWYwZDcnO1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBjYXNlICdSJzoge1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHJldHVybiAnXFx1ZjBkYSc7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgcmV0dXJuICdcXHVmMGQ3JztcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH0pLFxuICAgICAgICAgICAgLy8gKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBtYWtlUG9ydChuYW1lLCBhbGlnbiwgc3BvdCwgb3V0cHV0LCBpbnB1dCkge1xuICAgICAgICAvLyBpZiAodGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seSkge1xuICAgICAgICAvLyAgICAgcmV0dXJuIHt9O1xuICAgICAgICAvLyB9XG4gICAgICAgIGNvbnN0IGhvcml6b250YWwgPSBhbGlnbi5lcXVhbHMoZ28uU3BvdC5Ub3ApIHx8IGFsaWduLmVxdWFscyhnby5TcG90LkJvdHRvbSk7XG4gICAgICAgIC8vIGNvbnN0IHZlcnRpY2FsID0gYWxpZ24uZXF1YWxzKGdvLlNwb3QuTGVmdCkgfHwgYWxpZ24uZXF1YWxzKGdvLlNwb3QuUmlnaHQpO1xuICAgICAgICAvLyB0aGUgcG9ydCBpcyBiYXNpY2FsbHkganVzdCBhIHRyYW5zcGFyZW50IHJlY3RhbmdsZSB0aGF0IHN0cmV0Y2hlcyBhbG9uZyB0aGUgc2lkZSBvZiB0aGUgbm9kZSxcbiAgICAgICAgLy8gYW5kIGJlY29tZXMgY29sb3JlZCB3aGVuIHRoZSBtb3VzZSBwYXNzZXMgb3ZlciBpdFxuICAgICAgICByZXR1cm4gdGhpcy4kKFxuICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGhvcml6b250YWwgPyBOYU4gOiA4LFxuICAgICAgICAgICAgICAgIGhlaWdodDogIWhvcml6b250YWwgPyBOYU4gOiA4LFxuICAgICAgICAgICAgICAgIGFsaWdubWVudDogYWxpZ24sXG4gICAgICAgICAgICAgICAgc3RyZXRjaDogaG9yaXpvbnRhbCA/IGdvLkdyYXBoT2JqZWN0Lkhvcml6b250YWwgOiBnby5HcmFwaE9iamVjdC5WZXJ0aWNhbCxcbiAgICAgICAgICAgICAgICBwb3J0SWQ6IG5hbWUsXG4gICAgICAgICAgICAgICAgZnJvbVNwb3Q6IHNwb3QsXG4gICAgICAgICAgICAgICAgZnJvbUxpbmthYmxlOiBvdXRwdXQsXG4gICAgICAgICAgICAgICAgdG9TcG90OiBzcG90LFxuICAgICAgICAgICAgICAgIHRvTGlua2FibGU6IGlucHV0LFxuICAgICAgICAgICAgICAgIGN1cnNvcjogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seSA/ICcnIDogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBnby5TcG90LkNlbnRlciwgLy8gdOG6rXAgdHJ1bmcgdsOgbyB0cnVuZyB0w6JtIGPhu6dhIFBhbmVsXG4gICAgICAgICAgICAgICAgbW91c2VFbnRlcjogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seVxuICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgOiAoZSwgcGFuZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEJsb2NrID0gKHBhbmVsIGFzIGFueSk/LmZpbmRPYmplY3QoJ3RleHRCbG9jaycpIGFzIGdvLlRleHRCbG9jayB8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0QmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICYmIG91dHB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEJsb2NrLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUic6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9ICdyZ2IoMjQzIDE0NCAxNzEpJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0wnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSAncmdiKDEwMywxNTEsMjA3KSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSAncmdiKDI0MyAxNDQgMTcxKSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIG1vdXNlTGVhdmU6IHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHlcbiAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgIDogKGUsIHBhbmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRCbG9jayA9IChwYW5lbCBhcyBhbnkpLmZpbmRPYmplY3QoJ3RleHRCbG9jaycpIGFzIGdvLlRleHRCbG9jayB8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0QmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRCbG9jay52aXNpYmxlID0gZmFsc2U7IC8vIOG6qG4gVGV4dEJsb2NrIGtoaSBy4budaSBraOG7j2kgUGFuZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YT8uaXNOb3RBbGxvd0Nvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGF0YT8uc2VsZWN0YWJsZSA9PT0gZmFsc2UgJiYgIWRhdGE/LmlzQWxsb3dDb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRhdGE/LmZsb3dPZlBsYW50Q2VsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YT8uZmxvd09mUGxhbnRDZWxsID09PSAgQVRPX0VOVU1fRkxPV19ESVJFQ1RJT04uSU5GTE9XICYmIG5hbWUgPT09ICdMJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGE/LmZsb3dPZlBsYW50Q2VsbCA9PT0gIEFUT19FTlVNX0ZMT1dfRElSRUNUSU9OLk9VVEZMT1cgJiYgbmFtZSA9PT0gJ1InKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdCJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUic6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhZGF0YT8uaXNOb3RTZWxlY3RPdXRwdXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0wnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWRhdGE/LmlzTm90U2VsZWN0SW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcblxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICd0ZXh0QmxvY2snLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcXHVmMGRhJywgLy8gTcOjIFVuaWNvZGUgdMawxqFuZyDhu6luZyB24bubaSBmYS1jYXJldC1sZWZ0XG4gICAgICAgICAgICAgICAgICAgIGZvbnQ6ICc5MDAgMTJweCBcIkZvbnQgQXdlc29tZSA2IFByb1wiJyxcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnd2hpdGUnLCAvLyDEkOG6t3QgbcOgdSBjaOG7ryB0aMOgbmggbcOgdSB0cuG6r25nXG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnLCAoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQic6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1xcdWYwZDcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdSJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnXFx1ZjBkYSc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdcXHVmMGQ3JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyByZXR1cm4gdGhpcy4kKGdvLlNoYXBlLCB7XG4gICAgICAgIC8vICAgICBmaWxsOiAndHJhbnNwYXJlbnQnLCAvLyBjaGFuZ2VkIHRvIGEgY29sb3IgaW4gdGhlIG1vdXNlRW50ZXIgZXZlbnQgaGFuZGxlclxuICAgICAgICAvLyAgICAgc3Ryb2tlV2lkdGg6IDAsIC8vIG5vIHN0cm9rZVxuICAgICAgICAvLyAgICAgd2lkdGg6IGhvcml6b250YWwgPyBOYU4gOiA4LCAvLyBpZiBub3Qgc3RyZXRjaGluZyBob3Jpem9udGFsbHksIGp1c3QgOCB3aWRlXG4gICAgICAgIC8vICAgICBoZWlnaHQ6ICFob3Jpem9udGFsID8gTmFOIDogOCwgLy8gaWYgbm90IHN0cmV0Y2hpbmcgdmVydGljYWxseSwganVzdCA4IHRhbGxcbiAgICAgICAgLy8gICAgIGFsaWdubWVudDogYWxpZ24sIC8vIGFsaWduIHRoZSBwb3J0IG9uIHRoZSBtYWluIFNoYXBlXG4gICAgICAgIC8vICAgICBzdHJldGNoOiBob3Jpem9udGFsID8gZ28uR3JhcGhPYmplY3QuSG9yaXpvbnRhbCA6IGdvLkdyYXBoT2JqZWN0LlZlcnRpY2FsLFxuICAgICAgICAvLyAgICAgcG9ydElkOiBuYW1lLCAvLyBkZWNsYXJlIHRoaXMgb2JqZWN0IHRvIGJlIGEgXCJwb3J0XCJcbiAgICAgICAgLy8gICAgIGZyb21TcG90OiBzcG90LCAvLyBkZWNsYXJlIHdoZXJlIGxpbmtzIG1heSBjb25uZWN0IGF0IHRoaXMgcG9ydFxuICAgICAgICAvLyAgICAgZnJvbUxpbmthYmxlOiBvdXRwdXQsIC8vIGRlY2xhcmUgd2hldGhlciB0aGUgdXNlciBtYXkgZHJhdyBsaW5rcyBmcm9tIGhlcmVcbiAgICAgICAgLy8gICAgIHRvU3BvdDogc3BvdCwgLy8gZGVjbGFyZSB3aGVyZSBsaW5rcyBtYXkgY29ubmVjdCBhdCB0aGlzIHBvcnRcbiAgICAgICAgLy8gICAgIHRvTGlua2FibGU6IGlucHV0LCAvLyBkZWNsYXJlIHdoZXRoZXIgdGhlIHVzZXIgbWF5IGRyYXcgbGlua3MgdG8gaGVyZVxuICAgICAgICAvLyAgICAgY3Vyc29yOiAncG9pbnRlcicsIC8vIHNob3cgYSBkaWZmZXJlbnQgY3Vyc29yIHRvIGluZGljYXRlIHBvdGVudGlhbCBsaW5rIHBvaW50XG4gICAgICAgIC8vICAgICBtb3VzZUVudGVyOiAoZSwgcG9ydCkgPT4ge1xuICAgICAgICAvLyAgICAgICAgIC8vIHRoZSBQT1JUIGFyZ3VtZW50IHdpbGwgYmUgdGhpcyBTaGFwZVxuICAgICAgICAvLyAgICAgICAgIGlmICghZS5kaWFncmFtLmlzUmVhZE9ubHkgJiYgb3V0cHV0KSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIHBvcnQuZmlsbCA9ICdyZ2JhKDI1NSwwLDI1NSwwLjUpJ1xuICAgICAgICAvLyAgICAgICAgIH07XG4gICAgICAgIC8vICAgICB9LFxuICAgICAgICAvLyAgICAgbW91c2VMZWF2ZTogKGUsIHBvcnQpID0+IHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gKHBvcnQuZmlsbCA9ICd0cmFuc3BhcmVudCcpO1xuICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgbWFrZUdyb3VwQmFzaWNDb21wb25lbnQoaWNvbiwgdGl0bGUsIHNpemU6IHsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSA9IHsgdzogODAsIGg6IDgwIH0pIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLiQoXG4gICAgICAgICAgICBnby5Hcm91cCxcbiAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBsYXlvdXQ6IHRoaXMuJChnby5MYXllcmVkRGlncmFwaExheW91dCwgeyBkaXJlY3Rpb246IDAgfSksXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgICAgICAgICBsYXlvdXQ6IHRoaXMuJChnby5MYXlvdXQpLFxuICAgICAgICAgICAgICAgIG1vdmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vIG1vdmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgLy8gc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkcmFnQ29tcHV0YXRpb246IChub2RlLCBwdCwgZ3JpZHB0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHB0LnggPVxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChwdC54IC8gR29qc0VkaXRvck1vZGVsLkJBU0lDX0dSSURfU0laRV9XSURUSCkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLkJBU0lDX0dSSURfU0laRV9XSURUSDtcbiAgICAgICAgICAgICAgICAgICAgcHQueSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHB0LnkgLyBHb2pzRWRpdG9yTW9kZWwuQkFTSUNfR1JJRF9TSVpFX0hFSUdIVCkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgR29qc0VkaXRvck1vZGVsLkJBU0lDX0dSSURfU0laRV9IRUlHSFQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwdDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBtaW5TaXplOiBuZXcgZ28uU2l6ZShHb2pzRWRpdG9yTW9kZWwuQkFTSUNfR1JJRF9TSVpFX1dJRFRILCBHb2pzRWRpdG9yTW9kZWwuQkFTSUNfR1JJRF9TSVpFX0hFSUdIVCksXG4gICAgICAgICAgICAgICAgbWluU2l6ZTogbmV3IGdvLlNpemUoMSwgMSksXG4gICAgICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoMSwgMSksXG4gICAgICAgICAgICAgICAgLy8gbWluU2l6ZTogbmV3IGdvLlNpemUoMTAwLCAxMDApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShnby5Qb2ludC5zdHJpbmdpZnkpLFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdSb3VuZGVkUmVjdGFuZ2xlJywge1xuICAgICAgICAgICAgICAgICAgICBmaWxsOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLlJFU09MVVRJT05fQkxVRSxcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC8vIHRoaXMuJChnby5QbGFjZWhvbGRlciksXG4gICAgICAgICAgICAgICAgLy8gdGhpcy4kKGdvLlBsYWNlaG9sZGVyLCB7IHBhZGRpbmc6IG5ldyBnby5NYXJnaW4oMCwgMCwgMCwgMCkgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgLy8gdGhpcy4kKGdvLlRleHRCbG9jaywgdGl0bGUsIHtcbiAgICAgICAgICAgIC8vICAgICByb3c6IDAsXG4gICAgICAgICAgICAvLyAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDApLFxuICAgICAgICAgICAgLy8gICAgIHN0cm9rZTogJyM0NDQ0NDQnLFxuICAgICAgICAgICAgLy8gICAgIGZvbnQ6ICdub3JtYWwgMTBwdCBBcmlhbCcsXG4gICAgICAgICAgICAvLyAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIC8vICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuTGVmdCxcbiAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICAvLyBuZXcgZ28uQmluZGluZygndGV4dCcsICdrZXknKS5tYWtlVHdvV2F5KCksKSxcblxuICAgICAgICAgICAgLy8gdGhpcy4kKFxuICAgICAgICAgICAgLy8gICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgLy8gICAgICdUYWJsZScsXG4gICAgICAgICAgICAvLyAgICAge1xuICAgICAgICAgICAgLy8gICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuVG9wTGVmdCxcbiAgICAgICAgICAgIC8vICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IG5ldyBnby5TcG90KDAsIDAsIC0xMCwgLTEwKSxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCA1MCwgMCksXG4gICAgICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgICAgIC8vICAgICB0aGlzLiQoXG4gICAgICAgICAgICAvLyAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgLy8gICAgICAgICAnSG9yaXpvbnRhbCcsXG4gICAgICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICAgICAgLy8gICAgICAgICB9LFxuICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLiQoZ28uUGljdHVyZSwgaWNvbiwge1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgLy8gYWxpZ25tZW50OiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoNDAsIDQwKSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGltYWdlU3RyZXRjaDogZ28uR3JhcGhPYmplY3QuVW5pZm9ybSxcbiAgICAgICAgICAgIC8vICAgICAgICAgfSksXG4gICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgJ1RhYmxlJyxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBjb2x1bW46IDEsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgZGVmYXVsdEFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgwLCAwLCAwLCAyMCksXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywgdGl0bGUsIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICByb3c6IDAsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDMsIDMsIDUsIDEwKSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAvLyBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgTmFOKSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBzdHJva2U6ICcjNDQ0NDQ0JyxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBmb250OiAnbm9ybWFsIDEwcHQgQXJpYWwnLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICByb3c6IDEsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigwLCAzLCAzLCAxMCksXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgNDApLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBzdHJva2U6ICcjMDAwRDQyJyxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgZm9udDogJ2JvbGQgMTBwdCBBcmlhbCcsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHdyYXA6IGdvLlRleHRCbG9jay5Ob25lLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogZ28uVGV4dEJsb2NrLk92ZXJmbG93RWxsaXBzaXMsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykubWFrZVR3b1dheSgpLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lIGEgdG9vbHRpcCBmb3IgZWFjaCBub2RlIHRoYXQgZGlzcGxheXMgdGhlIGNvbG9yIGFzIHRleHRcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgJ1Rvb2xUaXAnLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywgeyBtYXJnaW46IDQgfSwgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZScpKSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgKSwgLy8gZW5kIG9mIEFkb3JubWVudFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICApLFxuICAgICAgICAgICAgLy8gICAgICAgICApLFxuICAgICAgICAgICAgLy8gICAgICksXG4gICAgICAgICAgICAvLyApLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm15RGlhZ3JhbS5ncm91cFRlbXBsYXRlTWFwLnNldCh0aXRsZSwgbm9kZSk7XG4gICAgfVxuXG4gICAgbWFrZUdyb3VwVGVtcGxhdGUoaWNvbiwgdGl0bGUsIHNpemU6IHsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSA9IHsgdzogODAsIGg6IDgwIH0pIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLiQoXG4gICAgICAgICAgICBnby5Hcm91cCxcbiAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy8gbGF5b3V0OiB0aGlzLiQoZ28uRm9yY2VEaXJlY3RlZExheW91dCAsIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy8gICAgIGRpcmVjdGlvbjogMCxcbiAgICAgICAgICAgICAgICAvLyAgICAgLy8gICAgIHNldHNQb3J0U3BvdHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vICAgICAvLyB9KSxcblxuICAgICAgICAgICAgICAgIC8vIGxheW91dDogdGhpcy4kKGdvLkxheWVyZWREaWdyYXBoTGF5b3V0LCB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGRpcmVjdGlvbjogMCxcbiAgICAgICAgICAgICAgICAvLyAgICAgc2V0c1BvcnRTcG90czogZmFsc2UsXG4gICAgICAgICAgICAgICAgLy8gfSksXG5cbiAgICAgICAgICAgICAgICBsYXlvdXQ6IHRoaXMuJChnby5MYXlvdXQpLFxuXG4gICAgICAgICAgICAgICAgLy8gLy8gICAgIC8vIGFkb3JubWVudCB3aGVuIGEgZ3JvdXAgaXMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAvLyAvLyAgICAgLy8gc2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGU6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAvLyAvLyAgICAgLy8gICAgIGdvLkFkb3JubWVudCxcbiAgICAgICAgICAgICAgICAvLyAvLyAgICAgLy8gICAgICdBdXRvJyxcbiAgICAgICAgICAgICAgICAvLyAvLyAgICAgLy8gICAgIHRoaXMuJChnby5TaGFwZSwgJ1JlY3RhbmdsZScsIHsgZmlsbDogbnVsbCwgc3Ryb2tlOiAnZG9kZ2VyYmx1ZScsIHN0cm9rZVdpZHRoOiA4IH0pLFxuICAgICAgICAgICAgICAgIC8vIC8vICAgICAvLyAgICAgdGhpcy4kKGdvLlBsYWNlaG9sZGVyKSxcbiAgICAgICAgICAgICAgICAvLyAvLyAgICAgLy8gKSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIG5ldyBnby5CaW5kaW5nKCdsYXlvdXQnLCAnbGF5b3V0JywgKHgpID0+XG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIHRoaXMuJChnby5Gb3JjZURpcmVjdGVkTGF5b3V0ICwge1xuICAgICAgICAgICAgLy8gICAgICAgICBkaXJlY3Rpb246IDAsXG4gICAgICAgICAgICAvLyAgICAgICAgIHNldHNQb3J0U3BvdHM6IGZhbHNlLFxuICAgICAgICAgICAgLy8gICAgIH0pO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgLy8gKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtaW5TaXplOiBuZXcgZ28uU2l6ZSg0MDAsIDQwMCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KGdvLlBvaW50LnN0cmluZ2lmeSksXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgIHRoaXMuJChnby5TaGFwZSwgJ1JvdW5kZWRSZWN0YW5nbGUnLCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLlJFU09MVVRJT05fQkxVRSxcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuJChnby5QbGFjZWhvbGRlciwgeyBwYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDYwLCAyMCwgMjAsIDIwKSB9KSxcbiAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgIC8vIHRoaXMuJChcbiAgICAgICAgICAgIC8vICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgIC8vICAgICAnVGFibGUnLFxuICAgICAgICAgICAgLy8gICAgIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LlRvcExlZnQsXG4gICAgICAgICAgICAvLyAgICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgwLCAwLCAtMTAsIC0xMCksXG4gICAgICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgICAgIC8vICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB0aXRsZSwge1xuICAgICAgICAgICAgLy8gICAgICAgICByb3c6IDAsXG4gICAgICAgICAgICAvLyAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigzLCAzLCA1LCAzKSxcbiAgICAgICAgICAgIC8vICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMjAsIE5hTiksXG4gICAgICAgICAgICAvLyAgICAgICAgIHN0cm9rZTogJyM0NDQ0NDQnLFxuICAgICAgICAgICAgLy8gICAgICAgICBmb250OiAnbm9ybWFsIDhwdCBBcmlhbCcsXG4gICAgICAgICAgICAvLyAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAvLyAgICAgfSksXG4gICAgICAgICAgICAvLyAgICAgdGhpcy4kKGdvLlBpY3R1cmUsIGljb24sIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgcm93OiAxLFxuICAgICAgICAgICAgLy8gICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgLy8gICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZSg0MCwgNDApLFxuICAgICAgICAgICAgLy8gICAgICAgICBpbWFnZVN0cmV0Y2g6IGdvLkdyYXBoT2JqZWN0LlVuaWZvcm0sXG4gICAgICAgICAgICAvLyAgICAgfSksXG4gICAgICAgICAgICAvLyAgICAgdGhpcy4kKFxuICAgICAgICAgICAgLy8gICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIHJvdzogMixcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigxMCwgMywgMywgMyksXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCA0MCksXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBzdHJva2U6ICcjMDAwRDQyJyxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGZvbnQ6ICdib2xkIDhwdCBBcmlhbCcsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgd3JhcDogZ28uVGV4dEJsb2NrLk5vbmUsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBvdmVyZmxvdzogZ28uVGV4dEJsb2NrLk92ZXJmbG93RWxsaXBzaXMsXG4gICAgICAgICAgICAvLyAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIC8vIGRlZmluZSBhIHRvb2x0aXAgZm9yIGVhY2ggbm9kZSB0aGF0IGRpc3BsYXlzIHRoZSBjb2xvciBhcyB0ZXh0XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB0b29sVGlwOiB0aGlzLiQoJ1Rvb2xUaXAnLCB0aGlzLiQoZ28uVGV4dEJsb2NrLCB7IG1hcmdpbjogNCB9LCBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykpKSwgLy8gZW5kIG9mIEFkb3JubWVudFxuICAgICAgICAgICAgLy8gICAgICAgICB9LFxuICAgICAgICAgICAgLy8gICAgICksXG4gICAgICAgICAgICAvLyAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KGdvLlBvaW50LnN0cmluZ2lmeSksXG4gICAgICAgICAgICAvLyApLFxuXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgJ1RhYmxlJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5Ub3BMZWZ0LFxuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnRGb2N1czogbmV3IGdvLlNwb3QoMCwgMCwgLTEwLCAtMTApLFxuICAgICAgICAgICAgICAgICAgICAvLyBwYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDUwLCAwKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICdIb3Jpem9udGFsJyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5QaWN0dXJlLCBpY29uLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3c6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZSg0MCwgNDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VTdHJldGNoOiBnby5HcmFwaE9iamVjdC5Vbmlmb3JtLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0QWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IG5ldyBnby5TcG90KDAsIDAsIDAsIDIwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB0aXRsZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMywgMywgNSwgMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCBOYU4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogJyM0NDQ0NDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ6ICdub3JtYWwgMTBwdCBBcmlhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDMsIDMsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCA0MCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogJyMwMDBENDInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnYm9sZCAxMHB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcDogZ28uVGV4dEJsb2NrLk5vbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBnby5UZXh0QmxvY2suT3ZlcmZsb3dFbGxpcHNpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmUgYSB0b29sdGlwIGZvciBlYWNoIG5vZGUgdGhhdCBkaXNwbGF5cyB0aGUgY29sb3IgYXMgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVGlwOiB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVG9vbFRpcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB7IG1hcmdpbjogNCB9LCBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLCAvLyBlbmQgb2YgQWRvcm5tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5teURpYWdyYW0uZ3JvdXBUZW1wbGF0ZU1hcC5zZXQodGl0bGUsIG5vZGUpO1xuICAgIH1cblxuICAgIG1ha2VJbWFnZVRlbXBsYXRlKCkge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy4kKFxuICAgICAgICAgICAgZ28uTm9kZSxcbiAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB6T3JkZXI6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3NlbGVjdGFibGUnLCAnc2VsZWN0YWJsZScpLFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdIb3Jpem9udGFsJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoZ28uUG9pbnQuc3RyaW5naWZ5KSxcbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIGdvLlBpY3R1cmUsXG4gICAgICAgICAgICAgICAgICAgIEdvanNFZGl0b3JNb2RlbC5JTUFHRV9ST19XQVRFUl9UUkVBVE1FTlRfUEFUSCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heFNpemU6IG5ldyBnby5TaXplKDUwMCwgNTAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlU3RyZXRjaDogZ28uR3JhcGhPYmplY3QuVW5pZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmdpbjogbmV3IGdvLk1hcmdpbigxMzAsIDAsIDAsIDApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnbWFyZ2luJywgJ21hcmdpbicpLFxuICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnd2lkdGgnLCAnd2lkdGgnKSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2hlaWdodCcsICdoZWlnaHQnKSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3NvdXJjZScsICcnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE/LnNvdXJjZSA/IGRhdGE/LnNvdXJjZSA6IEdvanNFZGl0b3JNb2RlbC5JTUFHRV9ST19XQVRFUl9UUkVBVE1FTlRfUEFUSDtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubXlEaWFncmFtLm5vZGVUZW1wbGF0ZU1hcC5zZXQoR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLklNQUdFX1RFTVBMQVRFLCBub2RlKTtcbiAgICB9XG5cbiAgICBtYWtlUGFyYW1UYWJsZSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLiQoXG4gICAgICAgICAgICBnby5QYXJ0LFxuICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgLy8gdGhpcy4kKGdvLlNoYXBlLCB7IGZpbGw6ICcjRTZGMEY3Jywgc3Ryb2tlOiAnIzAwNjNBOScsIHN0cm9rZVdpZHRoOiAzLCBnZW9tZXRyeVN0cmluZzogJ00gNSAwIEwgOTUgMCBRIDEwMCAwIDEwMCA1IEwgMTAwIDk1IFEgMTAwIDEwMCA5NSAxMDAgTCA1IDEwMCBRIDAgMTAwIDAgOTUgTCAwIDUgUSAwIDAgNSAwJyAgfSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgek9yZGVyOiAyLFxuICAgICAgICAgICAgICAgIC8vIHBhZGRpbmc6IG5ldyBnby5NYXJnaW4oMCwgMCwgMCwgMjAwKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uU2hhcGUsXG4gICAgICAgICAgICAgICAgeyBmaWxsOiAnI0U2RjBGNycsIHN0cm9rZTogJyMwMDYzQTknLCBzdHJva2VXaWR0aDogMyB9LFxuICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdmaWxsJywgJ2JnQ29sb3InKSxcbiAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnc3Ryb2tlJywgJ2JvcmRlclRhYmxlJyksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3BhZGRpbmcnLCAncGFkZGluZycpLFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3NlbGVjdGFibGUnLCAnc2VsZWN0YWJsZScpLFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KGdvLlBvaW50LnN0cmluZ2lmeSksXG4gICAgICAgICAgICAvLyB0aGlzLiQoZ28uU2hhcGUsICdSb3VuZGVkUmVjdGFuZ2xlJywge1xuICAgICAgICAgICAgLy8gICAgIGZpbGw6ICcjRTZGMEY3JyxcbiAgICAgICAgICAgIC8vICAgICBzdHJva2U6ICcjMDA2M0E5JyxcbiAgICAgICAgICAgIC8vICAgICBzdHJva2VXaWR0aDogMyxcbiAgICAgICAgICAgIC8vICAgICAvLyBzdHJva2VEYXNoQXJyYXk6IFs1LCA1XSxcbiAgICAgICAgICAgIC8vIH0pLFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdUYWJsZScsXG4gICAgICAgICAgICAgICAgLy8gU2V0IGRlZmF1bHRzIGZvciBhbGwgcm93cyBhbmQgY29sdW1uczpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEuNSxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFJvd1NlcGFyYXRvclN0cm9rZTogJyMwMDYyQTknLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29sdW1uU2VwYXJhdG9yU3Ryb2tlOiAnIzAwNjJBOScsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTZXBhcmF0b3JQYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDUsIDEwLCA1LCAxMCksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnZGVmYXVsdFJvd1NlcGFyYXRvclN0cm9rZScsICdib3JkZXJUYWJsZScpLFxuICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdkZWZhdWx0Q29sdW1uU2VwYXJhdG9yU3Ryb2tlJywgJ2JvcmRlclRhYmxlJyksXG4gICAgICAgICAgICAgICAgLy8gdGhpcy4kKFxuICAgICAgICAgICAgICAgIC8vICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAvLyAgICAgJ1RhYmxlUm93JyxcbiAgICAgICAgICAgICAgICAvLyAgICAgeyByb3c6IDAgfSxcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywgJ3JvdyAxIGNvbCAxJywgeyBjb2x1bW46IDAsIG1hcmdpbjogMiB9KSxcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywgJ3JvdyAxIGNvbCAyJywgeyBjb2x1bW46IDEsIG1hcmdpbjogMiB9KSxcbiAgICAgICAgICAgICAgICAvLyApLFxuICAgICAgICAgICAgICAgIC8vIHRoaXMuJChcbiAgICAgICAgICAgICAgICAvLyAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgLy8gICAgICdUYWJsZVJvdycsXG4gICAgICAgICAgICAgICAgLy8gICAgIHsgcm93OiAxIH0sXG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuJChnby5UZXh0QmxvY2ssICdyb3cgMiBjb2wgMScsIHsgY29sdW1uOiAwLCBtYXJnaW46IDIgfSksXG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuJChnby5UZXh0QmxvY2ssICdyb3cgMiBjb2wgMicsIHsgY29sdW1uOiAxLCBtYXJnaW46IDIgfSksXG4gICAgICAgICAgICAgICAgLy8gKSxcbiAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnaXRlbUFycmF5JywgJ2RhdGFUYWJsZScpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaXRlbVRlbXBsYXRlOiB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIG5ldyBnby5CaW5kaW5nKCdyb3cnLCAnaW5kZXhSb3cnKSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vIG5ldyBnby5CaW5kaW5nKCdoZWlnaHQnLCAnaGVpZ2h0JyksXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgZ28uUGljdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBBUlJPVyxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKDIwLCA0MCksXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIC8vIGltYWdlU3RyZXRjaDogZ28uR3JhcGhPYmplY3QuVW5pZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzb3VyY2UnLCAnJywgKGRhdGEsIHBhbmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIC8vIHBhbmVsLnBhcnQ/LmRhdGE/LmlkXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHJldHVybiBkYXRhPy5pc0NyZWF0ZWQgPyBwYW5lbD8uJHAgOiBBUlJPV19HUkFZO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgLy8gKSxcblxuICAgICAgICAgICAgICAgICAgICBpdGVtVGVtcGxhdGU6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1RhYmxlUm93JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjb2x1bW46IDAsIG1hcmdpbjogMiwgdGV4dEFsaWduOiAnbGVmdCcsIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnJywgKGRhdGEsIHBhbmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhPy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTZXBhcmF0b3JQYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJldGNoOiBnby5HcmFwaE9iamVjdC5GaWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ21pblNpemUnLCAnJywgKGRhdGEsIHBhbmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYW5lbC5wYXJ0Py5kYXRhPy5taW5TaXplVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKDE5MCwgMTQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGdvLlRleHRCbG9jay5PdmVyZmxvd0VsbGlwc2lzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVGlwOiB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Rvb2xUaXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJycsIChkYXRhLCBwYW5lbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seSA/IGAke2RhdGE/LnRhZ05hbWUgfHwgJyd9IGAgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSR7ZGF0YT8udmFsdWV9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpa1BhcmFtT2ZUYWJsZS5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJhbVRhYmxlOiBvYmoucGFuZWwucGFydC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vYmoucGFuZWwucGFydC5kYXRhPy5kYXRhVGFibGVbb2JqPy5wYW5lbC5yb3ddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICcnLCAoZGF0YSwgcGFuZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhPy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzdHJva2UnLCAnJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmNvbG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMCwgMCwgMCwgNSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnXFx1ZjA0NCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnMTNweCBcIkZvbnQgQXdlc29tZSA2IFByb1wiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVGlwOiB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Rvb2xUaXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJycsIChkYXRhLCBwYW5lbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE/LnRvb2xUaXBBY3Rpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogKGUsIG9iajogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5wYW5lbC5wYXJ0LmRhdGE/LmRhdGFUYWJsZVtvYmo/LnBhbmVsLnJvd10/LmlzRWRpdGFibGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWtQYXJhbU9mVGFibGUuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByYW1UYWJsZTogb2JqLnBhbmVsLnBhcnQuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub2JqLnBhbmVsLnBhcnQuZGF0YT8uZGF0YVRhYmxlW29iaj8ucGFuZWwucm93XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJycsIChkYXRhLCBwYW5lbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ29wYWNpdHknLCAnJywgKGRhdGEsIHBhbmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YT8uaXNFZGl0YWJsZSA9PT0gZmFsc2UgPyAwLjYgOiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwLnNldChHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuUEFSQU1fVEFCTEUsIG5vZGUpO1xuICAgIH1cblxuICAgIG1ha2VNYXNzQmFsYW5jZSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLiQoXG4gICAgICAgICAgICBnby5QYXJ0LFxuICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoZ28uUG9pbnQuc3RyaW5naWZ5KSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzZWxlY3RhYmxlJywgJ3NlbGVjdGFibGUnKSxcbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAnSG9yaXpvbnRhbCcsXG4gICAgICAgICAgICAgICAgLy8gU2V0IGRlZmF1bHRzIGZvciBhbGwgcm93cyBhbmQgY29sdW1uczpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDQsXG4gICAgICAgICAgICAgICAgICAgIHRvb2xUaXA6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKDQ1MCwgMzApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAndG9vbHRpcCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDUsIDAsIDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ01hc3MgQmFsYW5jZTonLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnZm9udCcsICdmb250JyksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkFMSVpBUklOLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnZm9udCcsICdmb250JyksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzdHJva2UnLCAnY29sb3JWYWx1ZScpLFxuICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICcnLCAoZGF0YSwgcGFuZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhPy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubXlEaWFncmFtLm5vZGVUZW1wbGF0ZU1hcC5zZXQoR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLk1BU1NfQkFMQU5DRSwgbm9kZSk7XG4gICAgfVxuXG4gICAgbWFrZUdyb3VwUk9QbGFudFRlbXBsYXRlKGljb24sIHRpdGxlLCBzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7IHc6IDgwLCBoOiA4MCB9KSB7XG4gICAgICAgIGxldCBub2RlID0gdGhpcy4kKFxuICAgICAgICAgICAgZ28uR3JvdXAsXG4gICAgICAgICAgICAnU3BvdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGF5b3V0OiB0aGlzLiQoZ28uTGF5b3V0KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gbWluU2l6ZTogbmV3IGdvLlNpemUoTmFOLCA2MDApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzZWxlY3RhYmxlJywgJ3NlbGVjdGFibGUnKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShnby5Qb2ludC5zdHJpbmdpZnkpLFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdUYWJsZScsXG5cbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IG5ldyBnby5NYXJnaW4oMCwgMCwgMCwgMCksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5TaGFwZSwgJ1JvdW5kZWRSZWN0YW5nbGUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU0hBUEVfS0VZJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICcjRkNGQ0ZEJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLlJFU09MVVRJT05fQkxVRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5QbGFjZWhvbGRlciwgeyBwYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDE1LCAwLCAwLCAwKSB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgZ28uUGljdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgUk9fTElORV9ESVJUWSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAxLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICcnLCAoeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg/LmlzVmlld0dlbmVyYWwgJiYgeD8uaGFzT3V0RmxvdyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgIHRoaXMuJChnby5QYW5lbCwgJ1RhYmxlJywge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IG5ldyBnby5TcG90KDAsIDAsIDAsIDE4MyksXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IGdvLlNwb3QuTGVmdCxcbiAgICAgICAgICAgICAgICAvLyBzdHJldGNoOiBnby5HcmFwaE9iamVjdC5WZXJ0aWNhbCxcbiAgICAgICAgICAgICAgICBwb3J0SWQ6ICdJbmZsb3cnLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seSA/ICcnIDogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgIC8vIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgwLCAwLCAwLCAxNTApLFxuICAgICAgICAgICAgICAgIGZyb21TcG90OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgICAgdG9TcG90OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgICAgZnJvbUxpbmthYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRvTGlua2FibGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuJChnby5QYW5lbCwgJ1RhYmxlJywge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IG5ldyBnby5TcG90KDAsIDAsIDk3MCwgMzE1KSxcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnRGb2N1czogZ28uU3BvdC5Cb3R0b20sXG4gICAgICAgICAgICAgICAgcG9ydElkOiAnT3V0Rmxvd19DbGVhbicsXG4gICAgICAgICAgICAgICAgY3Vyc29yOiB0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5ID8gJycgOiAncG9pbnRlcicsXG4gICAgICAgICAgICAgICAgZnJvbVNwb3Q6IGdvLlNwb3QuQm90dG9tLFxuICAgICAgICAgICAgICAgIHRvU3BvdDogZ28uU3BvdC5Cb3R0b20sXG4gICAgICAgICAgICAgICAgZnJvbUxpbmthYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRvTGlua2FibGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxpZ25tZW50OiBuZXcgZ28uU3BvdCgwLCAwLCA0ODAsIDUyNSksXG4gICAgICAgICAgICAgICAgICAgIC8vIGFsaWdubWVudDogbmV3IGdvLlNwb3QoMCwgMCwgNDc1LCA1NTIpLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnRGb2N1czogZ28uU3BvdC5Cb3R0b20sXG4gICAgICAgICAgICAgICAgICAgIHBvcnRJZDogJ091dEZsb3dfRGlydHknLFxuICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHkgPyAnJyA6ICdwb2ludGVyJyxcbiAgICAgICAgICAgICAgICAgICAgZnJvbVNwb3Q6IGdvLlNwb3QuQm90dG9tLFxuICAgICAgICAgICAgICAgICAgICB0b1Nwb3Q6IGdvLlNwb3QuQm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBmcm9tTGlua2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRvTGlua2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnYWxpZ25tZW50JywgJycsICh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4Py5pc1ZpZXdHZW5lcmFsICYmIHg/Lmhhc091dEZsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IGdvLlNwb3QoMCwgMCwgNDc1LCA1NTIpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBnby5TcG90KDAsIDAsIDQ4MCwgNTI1KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5teURpYWdyYW0uZ3JvdXBUZW1wbGF0ZU1hcC5zZXQodGl0bGUsIG5vZGUpO1xuICAgIH1cblxuICAgIG1ha2VHcm91cEJvaWxlclRlbXBsYXRlKGljb24sIHRpdGxlLCBzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7IHc6IDgwLCBoOiA4MCB9KSB7XG4gICAgICAgIGxldCBub2RlID0gdGhpcy4kKFxuICAgICAgICAgICAgZ28uR3JvdXAsXG4gICAgICAgICAgICAnU3BvdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIG1pblNpemU6IG5ldyBnby5TaXplKE5hTiwgNjAwKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnc2VsZWN0YWJsZScsICdzZWxlY3RhYmxlJyksXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMuJChnby5TaGFwZSwgJ1JvdW5kZWRSZWN0YW5nbGUnLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdTSEFQRV9LRVknLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiAnI0ZDRkNGRCcsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLlJFU09MVVRJT05fQkxVRSxcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICAgICAgfSksXG5cbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIGdvLlBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoZ28uUG9pbnQuc3RyaW5naWZ5KSxcbiAgICAgICAgICAgICAgICAgICAgeyBwYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDApIH0sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgIHRoaXMuJChnby5QYW5lbCwgJ1Nwb3QnLCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgICAgIGFsaWdubWVudDogbmV3IGdvLlNwb3QoMCwgMC41LCAwLCA4MyksXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IGdvLlNwb3QuTGVmdCxcbiAgICAgICAgICAgICAgICBwb3J0SWQ6ICdJbmZsb3cnLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seSA/ICcnIDogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgIGZyb21TcG90OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgICAgdG9TcG90OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgICAgZnJvbUxpbmthYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRvTGlua2FibGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAnU3BvdCcsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnRGb2N1czogZ28uU3BvdC5Ub3AsXG4gICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogbmV3IGdvLlNwb3QoMSwgMSwgLTIxNSwgMCksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIGdvLlBpY3R1cmUsXG4gICAgICAgICAgICAgICAgICAgIE9VVEZMT1dfTElORV9ESVJUWSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnJywgKHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Py5pc1ZpZXdHZW5lcmFsICYmIHg/Lmhhc091dEZsb3cgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGhpcy4kKGdvLlBhbmVsLCB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5Cb3R0b21MZWZ0LFxuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnRGb2N1czogZ28uU3BvdC5Ub3AsXG4gICAgICAgICAgICAgICAgICAgIHBvcnRJZDogJ091dEZsb3cnLFxuICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHkgPyAnJyA6ICdwb2ludGVyJyxcbiAgICAgICAgICAgICAgICAgICAgZnJvbVNwb3Q6IGdvLlNwb3QuQm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBmcm9tTGlua2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRvTGlua2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMubXlEaWFncmFtLmdyb3VwVGVtcGxhdGVNYXAuc2V0KHRpdGxlLCBub2RlKTtcbiAgICB9XG5cbiAgICBtYWtlR3JvdXBDb29saW5nVG93ZXJUZW1wbGF0ZShpY29uLCB0aXRsZSwgc2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9ID0geyB3OiA4MCwgaDogODAgfSkge1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMuJChcbiAgICAgICAgICAgIGdvLkdyb3VwLFxuICAgICAgICAgICAgJ1Nwb3QnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShnby5Qb2ludC5zdHJpbmdpZnkpLFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMuJChnby5TaGFwZSwgJ1JvdW5kZWRSZWN0YW5nbGUnLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdTSEFQRV9LRVknLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiAnI0ZDRkNGRCcsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLlJFU09MVVRJT05fQkxVRSxcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICAgICAgfSksXG5cbiAgICAgICAgICAgICAgICB0aGlzLiQoZ28uUGxhY2Vob2xkZXIsIHsgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0aGlzLiQoZ28uUGFuZWwsICdUYWJsZScsIHtcbiAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50OiBuZXcgZ28uU3BvdCgwLCAwLCAwLCAzNDgpLFxuICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBnby5TcG90LkJvdHRvbSxcbiAgICAgICAgICAgICAgICBwb3J0SWQ6ICdJbmZsb3cnLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seSA/ICcnIDogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgIGZyb21TcG90OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgICAgdG9TcG90OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgICAgZnJvbUxpbmthYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRvTGlua2FibGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAnU3BvdCcsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnRGb2N1czogZ28uU3BvdC5Ub3AsXG4gICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogbmV3IGdvLlNwb3QoMC41LCAxLCAtMTYsIDApLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICBnby5QaWN0dXJlLFxuICAgICAgICAgICAgICAgICAgICBPVVRGTE9XX0xJTkVfRElSVFksXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMjAsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJycsICh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geD8uaXNWaWV3R2VuZXJhbCAmJiB4Py5oYXNPdXRGbG93ID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHRoaXMuJChnby5QYW5lbCwge1xuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQm90dG9tTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IGdvLlNwb3QuVG9wLFxuICAgICAgICAgICAgICAgICAgICBwb3J0SWQ6ICdPdXRGbG93JyxcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiB0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5ID8gJycgOiAncG9pbnRlcicsXG4gICAgICAgICAgICAgICAgICAgIGZyb21TcG90OiBnby5TcG90LkJvdHRvbSxcbiAgICAgICAgICAgICAgICAgICAgZnJvbUxpbmthYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0b0xpbmthYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLm15RGlhZ3JhbS5ncm91cFRlbXBsYXRlTWFwLnNldCh0aXRsZSwgbm9kZSk7XG4gICAgfVxuXG4gICAgZ3JvdXBQbGFudENlbGxUZW1wbGF0ZShpY29uLCB0aXRsZSwgc2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9ID0geyB3OiA4MCwgaDogODAgfSkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLiQoXG4gICAgICAgICAgICBnby5Hcm91cCxcbiAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBsYXlvdXQ6IHRoaXMuJChnby5MYXlvdXQpLFxuICAgICAgICAgICAgICAgIC8vIGxheW91dDogdGhpcy4kKGdvLkxheWVyZWREaWdyYXBoTGF5b3V0LCB7IGRpcmVjdGlvbjogMCB9KSxcbiAgICAgICAgICAgICAgICAvLyBpc1N1YkdyYXBoRXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgLy8gbGF5ZXJOYW1lOiAnRm9yZWdyb3VuZCcsXG4gICAgICAgICAgICAgICAgLy8gd2FzU3ViR3JhcGhFeHBhbmRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbW92YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgYXZvaWRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAvLyByZXNpemFibGU6IHRydWUsXG5cbiAgICAgICAgICAgICAgICAvLyByZXNpemFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vIHdpZHRoOiBkYXRhPy5vYj8ubWluV2l0aCA/PyA1MCxcbiAgICAgICAgICAgICAgICAvLyBoZWlnaHQ6IDUwMCxcblxuICAgICAgICAgICAgICAgIC8vIGlzU3ViR3JhcGhFeHBhbmRlZDogdHJ1ZSwgLy8gZW5zdXJlIHRoZSBncm91cCBpcyBhbHdheXMgZXhwYW5kZWRcbiAgICAgICAgICAgICAgICAvLyBjb21wdXRlc0JvdW5kc0FmdGVyRHJhZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGVzRHJhZ0Ryb3BGb3JNZW1iZXJzOiB0cnVlLCAvLyBoYW5kbGUgZHJhZy1hbmQtZHJvcCBldmVudHMgZm9yIGl0cyBtZW1iZXIgbm9kZXNcblxuICAgICAgICAgICAgICAgIC8vIG1heFNpemU6IG5ldyBnby5TaXplKDUwMCwgNTAwKSxcbiAgICAgICAgICAgICAgICAvLyBtaW5TaXplOiBuZXcgZ28uU2l6ZSg1MDAsIDUwMCksXG5cbiAgICAgICAgICAgICAgICAvLyBpc1N1YkdyYXBoRXhwYW5kZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgLy8gbGF5ZXJOYW1lOiBESUFHUkFNLkxBWUVSUy5CQUNLR1JPVU5ELFxuXG4gICAgICAgICAgICAgICAgLy8gbW91c2VEcm9wOiBmdW5jdGlvbiAoZSwgZ3JwKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vIGRpc2FsbG93IGRyb3BwaW5nIGFueXRoaW5nIG9udG8gYW4gQWRvcm5tZW50XG4gICAgICAgICAgICAgICAgLy8gICAgIGlmIChncnAgaW5zdGFuY2VvZiBnby5BZG9ybm1lbnQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgICAgIC8vIGRyYWdDb21wdXRhdGlvbjogZnVuY3Rpb24gKG5vZGUsIHB0LCBncmlkUHQpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgbGV0IGdycCA9IG5vZGUuY29udGFpbmluZ0dyb3VwO1xuICAgICAgICAgICAgICAgIC8vICAgICBpZiAoZ3JwICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBsZXQgcmVjdCA9IGdycC5hY3R1YWxCb3VuZHM7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBwdC54ID0gTWF0aC5tYXgocmVjdC5sZWZ0LCBNYXRoLm1pbihwdC54LCByZWN0LnJpZ2h0KSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBwdC55ID0gTWF0aC5tYXgocmVjdC50b3AsIE1hdGgubWluKHB0LnksIHJlY3QuYm90dG9tKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuIHB0O1xuICAgICAgICAgICAgICAgIC8vIH0sXG5cbiAgICAgICAgICAgICAgICAvLyBkcm9wQ29tcHV0YXRpb246IGZ1bmN0aW9uIChub2RlLCBwdCwgZ3JpZFB0KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCBncnAgPSBub2RlLmNvbnRhaW5pbmdHcm91cDtcbiAgICAgICAgICAgICAgICAvLyAgICAgaWYgKGdycCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgbGV0IHJlY3QgPSBncnAuYWN0dWFsQm91bmRzO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgcHQueCA9IE1hdGgubWF4KHJlY3QubGVmdCwgTWF0aC5taW4ocHQueCwgcmVjdC5yaWdodCkpO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgcHQueSA9IE1hdGgubWF4KHJlY3QudG9wLCBNYXRoLm1pbihwdC55LCByZWN0LmJvdHRvbSkpO1xuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiBwdDtcbiAgICAgICAgICAgICAgICAvLyB9LFxuXG4gICAgICAgICAgICAgICAgLy8gZHJhZ0NvbXB1dGF0aW9uOiBmdW5jdGlvbiAocGFydCwgcHQsIGdyaWRwdCkge1xuICAgICAgICAgICAgICAgIC8vICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgZ3JvdXAncyBhY3R1YWwgYm91bmRzXG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnN0IGdycCA9IHBhcnQuY29udGFpbmluZ0dyb3VwO1xuICAgICAgICAgICAgICAgIC8vICAgICBpZiAoZ3JwKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBjb25zdCBibmRzID0gZ3JwLmFjdHVhbEJvdW5kcztcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGNvbnN0IGxvYyA9IHBhcnQubG9jYXRpb247XG5cbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIC8vIFNlZSBpZiB0aGUgcGFydCdzIG5ldyBsb2NhdGlvbiB3b3VsZCBiZSBvdXQgb2YgYm91bmRzXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBjb25zdCBuZXd4ID0gTWF0aC5tYXgoYm5kcy54LCBNYXRoLm1pbihwdC54LCBibmRzLnJpZ2h0IC0gcGFydC5hY3R1YWxCb3VuZHMud2lkdGggLyAyKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBjb25zdCBuZXd5ID0gTWF0aC5tYXgoYm5kcy55LCBNYXRoLm1pbihwdC55LCBibmRzLmJvdHRvbSAtIHBhcnQuYWN0dWFsQm91bmRzLmhlaWdodCAvIDIpKTtcblxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgLy8gTW9kaWZ5IHRoZSByZXN1bHQgcG9pbnQgdG8ga2VlcCB0aGUgUGFydCBpbnNpZGUgdGhlIEdyb3VwXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICByZXR1cm4gbmV3IGdvLlBvaW50KG5ld3gsIG5ld3kpO1xuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiBwdDtcbiAgICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5teURpYWdyYW0/LmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gbW91c2VEcmFnRW50ZXI6IChlLCAgb2JqKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgICAgICAvLyBtb3VzZURyb3A6IChlLCAgb2JqKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgICAgICAvLyBtb3VzZUVudGVyOiAoZSwgb2JqKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnN0IG5vZGUgPSBvYmoucGFydDtcbiAgICAgICAgICAgICAgICAvLyAgICAgc2VsZi5vbkhvdmVySW5mb0J1dHRvbi5lbWl0KHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGxlZnQ6IGU/LlsnV3InXT8ueCArIDgsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB0b3A6IGU/LlsnV3InXT8ueSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgICAgLy8gICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vICAgICAvLyBsZXQgc2hhcGUgPSAobm9kZSBhcyBhbnkpPy5maW5kT2JqZWN0KCdTSEFQRV9LRVknKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy8gaWYgKHNoYXBlKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vICAgICBzaGFwZS5zdHJva2UgPSAnYmx1ZSc7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vIH1cbiAgICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgICAgIC8vIG1vdXNlTGVhdmU6IChlLCBvYmopID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgc2VsZi5vbkhvdmVySW5mb0J1dHRvbi5lbWl0KG51bGwpO1xuICAgICAgICAgICAgICAgIC8vICAgICAvLyBsZXQgc2hhcGUgPSAobm9kZSBhcyBhbnkpPy5maW5kT2JqZWN0KCdTSEFQRV9LRVknKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy8gaWYgKHNoYXBlKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vICAgICBzaGFwZS5zdHJva2UgPSBHb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuV0hJVEU7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vIH1cbiAgICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdsYXlvdXQnLCAnJywgZnVuY3Rpb24gKGRhdGEsIG5vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZGF0YT8ubGF5b3V0VmFsdWUgPT09IEdvanNFZGl0b3JNb2RlbC5FTlVNX0xBWU9VVF9FRElUT1IuQVVUT1xuICAgICAgICAgICAgICAgIC8vICAgICA/IHNlbGYuJChnby5MYXllcmVkRGlncmFwaExheW91dCwgeyBkaXJlY3Rpb246IDAgfSlcbiAgICAgICAgICAgICAgICAvLyAgICAgOiBub2RlPy5sYXlvdXQ7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGE/LmxheW91dFZhbHVlICE9PSBkYXRhPy5sYXlvdXRWYWx1ZUNsb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEubGF5b3V0VmFsdWVDbG9uZSA9IGRhdGE/LmxheW91dFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YT8ubGF5b3V0VmFsdWUgPT09IEdvanNFZGl0b3JNb2RlbC5FTlVNX0xBWU9VVF9FRElUT1IuQVVUT1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBzZWxmLiQoZ28uTGF5ZXJlZERpZ3JhcGhMYXlvdXQsIHsgZGlyZWN0aW9uOiAwIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHNlbGYuJChnby5MYXlvdXQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlPy5sYXlvdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIDogc2VsZi4kKGdvLkxheW91dCk7XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIGRhdGE/LmxheW91dDtcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZGF0YT8ucHJldmlvdXNMYXlvdXQgfHwgc2VsZi4kKGdvLkxheWVyZWREaWdyYXBoTGF5b3V0LCB7IGRpcmVjdGlvbjogMCB9KTtcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gc2VsZi4kKGdvLkxheWVyZWREaWdyYXBoTGF5b3V0LCB7IGRpcmVjdGlvbjogMCB9KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ2dyaWQnLCAnZ3JpZCcpLFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3NlbGVjdGFibGUnLCAnc2VsZWN0YWJsZScpLFxuICAgICAgICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ3dpZHRoJywgJycsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIGRhdGE/Lm9iPy5taW5XaXRoID8/IDUwO1xuICAgICAgICAgICAgLy8gfSksXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnbWluU2l6ZScsICcnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZ28uU2l6ZShkYXRhPy5vYj8ubWluV2l0aCA/PyA1MCwgZGF0YT8ub2I/Lm1pbkhlaWdodCA/PyA1MCk7IC8vIEN1c3RvbWl6ZSBtaW5TaXplIGJhc2VkIG9uIGRhdGFcbiAgICAgICAgICAgIH0pLm9mT2JqZWN0KCksXG4gICAgICAgICAgICAvLyBuZXcgZ28uQmluZGluZygnd2lkdGgnLCAnJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gZGF0YT8ub2I/Lm1pbldpdGggPz8gNTA7IC8vIEN1c3RvbWl6ZSBtaW5TaXplIGJhc2VkIG9uIGRhdGFcbiAgICAgICAgICAgIC8vIH0pLm9mT2JqZWN0KCksXG4gICAgICAgICAgICAvLyBuZXcgZ28uQmluZGluZygnaGVpZ2h0JywgJycsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIGRhdGE/Lm9iPy5taW5IZWlnaHQgPz8gNTA7IC8vIEN1c3RvbWl6ZSBtaW5TaXplIGJhc2VkIG9uIGRhdGFcbiAgICAgICAgICAgIC8vIH0pLm9mT2JqZWN0KCksXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoZ28uUG9pbnQuc3RyaW5naWZ5KSxcbiAgICAgICAgICAgIC8vIG5ldyBnby5CaW5kaW5nKCdpc1N1YkdyYXBoRXhwYW5kZWQnLCAnZXhwYW5kZWQnKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSxcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFyZ2luOm5ldyBnby5NYXJnaW4oMCwgNTAsIDAsIDUwKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMuJChnby5TaGFwZSwgJ1JvdW5kZWRSZWN0YW5nbGUnLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdTSEFQRV9LRVknLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5SRVNPTFVUSU9OX0JMVUUsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2VEYXNoQXJyYXk6IFs1LCA1XSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0aGlzLiQoZ28uUGxhY2Vob2xkZXIsIHsgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gbm9kZS5tZW1iZXJWYWxpZGF0aW9uID0gZnVuY3Rpb24gKG5vZGUsIGdyb3VwKSB7XG4gICAgICAgIC8vICAgICBpZiAoIWdyb3VwKSByZXR1cm4gdHJ1ZTsgLy8gYWxsb3cgdW5ncm91cGluZ1xuICAgICAgICAvLyAgICAgY29uc3QgZ3JvdXBCb3VuZHMgPSBncm91cC5hY3R1YWxCb3VuZHM7XG4gICAgICAgIC8vICAgICBjb25zdCBub2RlQm91bmRzID0gbm9kZS5hY3R1YWxCb3VuZHM7XG4gICAgICAgIC8vICAgICByZXR1cm4gZ3JvdXBCb3VuZHMuY29udGFpbnNSZWN0KG5vZGVCb3VuZHMpO1xuICAgICAgICAvLyB9O1xuICAgICAgICB0aGlzLm15RGlhZ3JhbS5ncm91cFRlbXBsYXRlTWFwLnNldCh0aXRsZSwgbm9kZSk7XG4gICAgfVxuXG4gICAgZ3JvdXBQQ0lucHV0T3JPdXRUZW1wbGF0ZShpY29uLCB0aXRsZSwgcGFkZGluZzogZ28uTWFyZ2luKSB7XG4gICAgICAgIC8vIGxldCBub2RlID0gdGhpcy4kKFxuICAgICAgICAvLyAgICAgZ28uR3JvdXAsXG4gICAgICAgIC8vICAgICAnU3BvdCcsXG4gICAgICAgIC8vICAgICB7XG4gICAgICAgIC8vICAgICAgICAgbGF5b3V0OiB0aGlzLiQoZ28uTGF5b3V0KSxcbiAgICAgICAgLy8gICAgICAgICBtb3ZhYmxlOiBmYWxzZSxcbiAgICAgICAgLy8gICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgLy8gICAgIH0sXG4gICAgICAgIC8vICAgICAvLyB7XG4gICAgICAgIC8vICAgICAvLyAgICAgLy8gbWluU2l6ZTogbmV3IGdvLlNpemUoNTAwLCA1MDApLFxuICAgICAgICAvLyAgICAgLy8gICAgIG1vdmFibGU6IGZhbHNlLFxuICAgICAgICAvLyAgICAgLy8gICAgIGFyaWFSZWFkT25seTogdHJ1ZSxcbiAgICAgICAgLy8gICAgIC8vIH0sXG4gICAgICAgIC8vICAgICB0aGlzLiQoXG4gICAgICAgIC8vICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgIC8vICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSxcbiAgICAgICAgLy8gICAgICAgICB9LFxuICAgICAgICAvLyAgICAgICAgIHRoaXMuJChnby5TaGFwZSwgJ1JvdW5kZWRSZWN0YW5nbGUnLCB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgIC8vICAgICAgICAgICAgIC8vIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLlJFU09MVVRJT05fQkxVRSxcbiAgICAgICAgLy8gICAgICAgICAgICAgc3Ryb2tlOiBHb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuV0hJVEUsXG4gICAgICAgIC8vICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICAvLyAgICAgICAgICAgICBzdHJva2VEYXNoQXJyYXk6IFs1LCA1XSxcbiAgICAgICAgLy8gICAgICAgICB9KSxcbiAgICAgICAgLy8gICAgICAgICB0aGlzLiQoZ28uUGxhY2Vob2xkZXIsIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSxcbiAgICAgICAgLy8gICAgICAgICB9KSxcbiAgICAgICAgLy8gICAgICksXG4gICAgICAgIC8vICk7XG4gICAgICAgIGxldCBub2RlID0gdGhpcy4kKFxuICAgICAgICAgICAgZ28uR3JvdXAsXG4gICAgICAgICAgICAnU3BvdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGF5b3V0OiB0aGlzLiQoZ28uTGF5ZXJlZERpZ3JhcGhMYXlvdXQsIHsgZGlyZWN0aW9uOiAwIH0pLFxuICAgICAgICAgICAgICAgIG1vdmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGF2b2lkYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgLy8gaXNTdWJHcmFwaEV4cGFuZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAvLyBpc1N1YkdyYXBoRXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vIGxheWVyTmFtZTogJ0ZvcmVncm91bmQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShnby5Qb2ludC5zdHJpbmdpZnkpLFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IHBhZGRpbmcgPz8gbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMuJChnby5TaGFwZSwgJ1JvdW5kZWRSZWN0YW5nbGUnLCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLldISVRFLFxuICAgICAgICAgICAgICAgICAgICAvLyBzdHJva2U6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5BTElaQVJJTixcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuJChnby5QbGFjZWhvbGRlciwge1xuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDApLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5teURpYWdyYW0uZ3JvdXBUZW1wbGF0ZU1hcC5zZXQodGl0bGUsIG5vZGUpO1xuICAgIH1cblxuICAgIG1ha2VHcm91cFpvbmVUZW1wbGF0ZShcbiAgICAgICAgc2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9ID0geyB3OiBHb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogMTQsIGg6IEdvanNFZGl0b3JNb2RlbC5HUklEX1NJWkUgKiA1IH0sXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMuJChcbiAgICAgICAgICAgIGdvLkdyb3VwLFxuICAgICAgICAgICAgJ1ZlcnRpY2FsJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQ6IHRoaXMuJChnby5HcmlkTGF5b3V0LCB7IHdyYXBwaW5nQ29sdW1uOiAxLCBzcGFjaW5nOiBuZXcgZ28uU2l6ZSgwLCAwKSB9KSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvblNwb3Q6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgIG1vdXNlT3ZlcjogZnVuY3Rpb24gKGUsIG9iaikge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZWxmLnNob3dQb2ludChvYmo/LnBhcnQ/LmxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iaj8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqPy5kYXRhPy5vblNlbGVjdGVkKG9iaj8uZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZS5pc1NlbGVjdGVkICYmIGU/LmRhdGE/Lm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGU/LmRhdGE/Lm9uU2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGU6IHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHlcbiAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnby5BZG9ybm1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93VmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0JsdXI6IDYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dPZmZzZXQ6IG5ldyBnby5Qb2ludCgwLCAyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0NvbG9yOiAnIzAwMDAwMDI5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsIHsgZmlsbDogbnVsbCwgc3Ryb2tlOiAnZG9kZ2VyYmx1ZScsIHN0cm9rZVdpZHRoOiA0IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlBsYWNlaG9sZGVyLCB7IHBhZGRpbmc6IDMgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hvcml6b250YWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5Ub3BSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnRGb2N1czogZ28uU3BvdC5Cb3R0b20sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0J1dHRvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHJhZ0RhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5URVhUX05PREUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5CTFVFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogc2VsZi5hZGRJdGVtT25Hcm91cFpvbmUsIC8vIGRlZmluZWQgYmVsb3csIHRvIHN1cHBvcnQgYSBjbGljayBvbiB0aGUgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCdXR0b25Cb3JkZXIuc3Ryb2tlV2lkdGgnOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQnV0dG9uQm9yZGVyLmZpbGwnOiAnd2hpdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdcXHVmMDU1JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogJzIwcHggXCJGb250IEF3ZXNvbWUgNiBQcm9cIicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6ICcjMmMyYzJjJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlQWN0aW9uR3JvdXAoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuUkVOQU1FLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuREVUQUlMUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLk9VVEZMT1csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5ERUxFVEUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAvLyBFZGl0IFRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAnQnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGNsaWNrOiBzZWxmLmVkaXRUZXh0R3JvdXBab25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAnQnV0dG9uQm9yZGVyLnN0cm9rZVdpZHRoJzogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgJ0J1dHRvbkJvcmRlci5maWxsJzogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuJChnby5UZXh0QmxvY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgbWFyZ2luOiA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB0ZXh0OiAnXFx1ZTFiZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGZvbnQ6ICcyMHB4IFwiRm9udCBBd2Vzb21lIDYgUHJvXCInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgc3Ryb2tlOiAnIzJjMmMyYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vIE9wZW4gRGV0YWlsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgJ0J1dHRvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBjbGljazogKGUsIG9iajogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBjb25zdCBub2RlID0gb2JqLnBhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBzZWxmLm9uT3BlbkRldGFpbC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICdCdXR0b25Cb3JkZXIuc3Ryb2tlV2lkdGgnOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAnQnV0dG9uQm9yZGVyLmZpbGwnOiAnd2hpdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuJChnby5UZXh0QmxvY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgbWFyZ2luOiA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB0ZXh0OiAnXFx1ZTQ5YScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGZvbnQ6ICcyMHB4IFwiRm9udCBBd2Vzb21lIDYgUHJvXCInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAhdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgID8gdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICdCdXR0b24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgYWN0aW9uTW92ZTogc2VsZi5kcmFnTmV3Tm9kZSwgLy8gZGVmaW5lZCBiZWxvdywgdG8gc3VwcG9ydCBkcmFnZ2luZyBmcm9tIHRoZSBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgX2RyYWdEYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICB0eXBlOiBHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuVEVYVF9OT0RFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgbmFtZTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIGNvbG9yOiBHb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuQkxVRSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgY2xpY2s6IHNlbGYuY2xpY2tOZXdOb2RlLCAvLyBkZWZpbmVkIGJlbG93LCB0byBzdXBwb3J0IGEgY2xpY2sgb24gdGhlIGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAnQnV0dG9uQm9yZGVyLnN0cm9rZVdpZHRoJzogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgJ0J1dHRvbkJvcmRlci5maWxsJzogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIHRoaXMuJChnby5UZXh0QmxvY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgbWFyZ2luOiA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICB0ZXh0OiAnXFx1ZTE1NycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIGZvbnQ6ICcyMHB4IFwiRm9udCBBd2Vzb21lIDYgUHJvXCInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzJjMmMyYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgOiB7fSxcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICdCdXR0b24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgY2xpY2s6IHNlbGYuZGVsZXRlTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgJ0J1dHRvbkJvcmRlci5zdHJva2VXaWR0aCc6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICdCdXR0b25Cb3JkZXIuZmlsbCc6ICd3aGl0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIG1hcmdpbjogNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgdGV4dDogJ1xcdWYyZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBmb250OiAnMjBweCBcIkZvbnQgQXdlc29tZSA2IFByb1wiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgIHRoaXMuJChnby5TaGFwZSwgJ1JvdW5kZWRSZWN0YW5nbGUnLCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLlJFU09MVVRJT05fQkxVRSxcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncsIE5hTiksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgJ1RhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LlRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IG5ldyBnby5NYXJnaW4oMTcsIDEwLCAxNiwgMTApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbig1LCAwLCAxMCwgMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCAyNSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBHb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuTklHSFRfUklERVIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogJ2JvbGQgMTZweCBBcmlhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwOiBnby5UZXh0QmxvY2suTm9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogZ28uVGV4dEJsb2NrLk92ZXJmbG93RWxsaXBzaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVG9vbFRpcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZScpLm1ha2VUd29XYXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5QbGFjZWhvbGRlciwgJ1ZlcnRpY2FsJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAxLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUG9ydCgnVCcsIGdvLlNwb3QuVG9wLCBnby5TcG90LlRvcFNpZGUsIGZhbHNlLCB0cnVlKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdMJywgZ28uU3BvdC5MZWZ0LCBnby5TcG90LkxlZnRTaWRlLCB0cnVlLCB0cnVlKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdSJywgZ28uU3BvdC5SaWdodCwgZ28uU3BvdC5SaWdodFNpZGUsIHRydWUsIHRydWUpLFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBvcnQoJ0InLCBnby5TcG90LkJvdHRvbSwgZ28uU3BvdC5Cb3R0b21TaWRlLCB0cnVlLCBmYWxzZSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KGdvLlBvaW50LnN0cmluZ2lmeSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubXlEaWFncmFtLmdyb3VwVGVtcGxhdGVNYXAuc2V0KEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5aT05FLCBub2RlKTtcbiAgICB9XG5cbiAgICBtYWtlWm9uZUl0ZW1UZW1wbGF0ZShcbiAgICAgICAgc2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9ID0geyB3OiBHb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogMTIsIGg6IEdvanNFZGl0b3JNb2RlbC5HUklEX1NJWkUgKiAyIH0sXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy4kKFxuICAgICAgICAgICAgZ28uTm9kZSxcbiAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgIC8vICAgICBtb3VzZUhvdmVyOiAoZSwgb2JqKSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbnN0IG5vZGUgPSBvYmoucGFydDtcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYgKChvYmogYXMgYW55KS5wYXJ0Py5vYj8udmFsdWUgPT09IFZBTFVFX05BKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBzZWxmLm9uSG92ZXJJbmZvQnV0dG9uLmVtaXQoe1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIGxlZnQ6IGU/LlsnV3InXT8ueCArIDgsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgbm9kZTogbm9kZVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgICAgLy8gICAgIG1vdXNlTGVhdmU6IChlLCBvYmopID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYgKChvYmogYXMgYW55KS5wYXJ0Py5vYj8udmFsdWUgPT09IFZBTFVFX05BKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBzZWxmLm9uSG92ZXJJbmZvQnV0dG9uLmVtaXQobnVsbCk7XG4gICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgICAgLy8gICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY29uc3Qgbm9kZSA9IG9iai5wYXJ0O1xuICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLmlzU2hvd05vZGVJbmZvID8gc2VsZi5vbkNsaWNrSW5mb0J1dHRvbi5lbWl0KHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGxlZnQ6IGU/LlsnV3InXT8ueCxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIHRvcDogZT8uWydXciddPy55LFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgbm9kZTogbm9kZVxuICAgICAgICAgICAgLy8gICAgICAgICB9KSA6IG51bGw7XG4gICAgICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICAvLyBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoZ28uUG9pbnQuc3RyaW5naWZ5KSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtb3ZhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHNpemUudyxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzaXplLmgsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdSZWN0YW5nbGUnLCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGw6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5MSUdIVF9CTFVFLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IEdvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5MSU5LX1dBVEVSLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICdWZXJ0aWNhbCcsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3c6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDEwLCAwLCA1LCAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnYm9sZCAxMnB4IEFyaWFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLk5JR0hUX1JJREVSLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xUaXA6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Rvb2xUaXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykubWFrZVR3b1dheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnbmFtZScsICh4KSA9PiAhIXgpLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdIb3Jpem9udGFsJyxcblxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigwLCAxMCwgMCwgMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMCwgNSwgMTAsIDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnMTJweCBzYW5zLXNlcmlmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBHb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuTklHSFRfUklERVIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXA6IGdvLlRleHRCbG9jay5XcmFwRml0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNdWx0aWxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAxMDAsIDE1KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGdvLlRleHRCbG9jay5PdmVyZmxvd0VsbGlwc2lzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVGlwOiB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVG9vbFRpcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZUl0ZW0nKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZUl0ZW0nKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnbmFtZUl0ZW0nLCAoeCkgPT4gISF4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDUsIDEwLCAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogJzEycHggc2Fucy1zZXJpZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkNFUlVMRUFOLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwOiBnby5UZXh0QmxvY2suV3JhcEZpdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJzwgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnZGF0YScsICh4KSA9PiB0eXBlb2YgeD8ucXVhbnRpdHkgPT09ICdudW1iZXInKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDUsIDEwLCAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogJzEycHggc2Fucy1zZXJpZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkNFUlVMRUFOLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwOiBnby5UZXh0QmxvY2suV3JhcEZpdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ2RhdGEnLCAoeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHg/LnF1YW50aXR5ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZDogYW55ID0gVXRpbHNTZXJ2aWNlLmNvbnZlcnRQcmVmaXhlc0RhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHg/LnF1YW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdDogeD8udW5pdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZWQuc2hvcnRlbmVkTnVtYmVyICsgJyAnICsgZm9ybWF0dGVkLnVuaXRQcmVmaXhlcyArIHg/LnVuaXQgPz8gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnZGF0YScsICh4KSA9PiB0eXBlb2YgeD8ucXVhbnRpdHkgPT09ICdudW1iZXInKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMCwgNSwgMTAsIDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnMTJweCBzYW5zLXNlcmlmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBHb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuQ0VSVUxFQU4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXA6IGdvLlRleHRCbG9jay5XcmFwRml0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnID4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnZGF0YScsICh4KSA9PiB0eXBlb2YgeD8ucXVhbnRpdHkgPT09ICdudW1iZXInKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubXlEaWFncmFtLm5vZGVUZW1wbGF0ZU1hcC5zZXQoR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlpPTkVfRU5FUkdZX0lURU0sIG5vZGUpO1xuICAgIH1cblxuICAgIG1ha2VTcGVjaWFsVGVtcGxhdGUoXG4gICAgICAgIGljb24sXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7IHc6IEdvanNFZGl0b3JNb2RlbC5HUklEX1NJWkUgKiA1LCBoOiBHb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSB9LFxuICAgICkge1xuICAgICAgICBsZXQgbm9kZTogYW55ID0gbnVsbDtcbiAgICAgICAgc3dpdGNoICh0aXRsZSkge1xuICAgICAgICAgICAgY2FzZSBHb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuU1BFQ0lBTF9QUk9DRVNTOlxuICAgICAgICAgICAgICAgIG5vZGUgPSB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIGdvLk5vZGUsXG4gICAgICAgICAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgICAgICAgICAgLy8ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgZnJvbVNwb3Q6IGdvLlNwb3QuUmlnaHQsICAvLyBjb21pbmcgb3V0IGZyb20gbWlkZGxlLXJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0b1Nwb3Q6IGdvLlNwb3QuTGVmdFxuICAgICAgICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGljazogKGUsIG9iajogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iaj8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmo/LmRhdGE/Lm9uU2VsZWN0ZWQob2JqPy5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUuaXNTZWxlY3RlZCAmJiBlPy5kYXRhPy5vblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU/LmRhdGE/Lm9uU2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KGdvLlBvaW50LnN0cmluZ2lmeSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyB3aWR0aDogc2l6ZS53LCBoZWlnaHQ6IHNpemUuaCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnQ2lyY2xlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICd3aGl0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzJEM0I3NycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5UZXh0QmxvY2ssIEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QUk9DRVNTLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDMsIDMsIDEwLCAzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMjAsIE5hTiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogJyM0NDQ0NDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnbm9ybWFsIDEwcHQgQXJpYWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5QaWN0dXJlLCBpY29uLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDEwLCAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoNjAsIDYwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VTdHJldGNoOiBnby5HcmFwaE9iamVjdC5Vbmlmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uUGFuZWwsICdWZXJ0aWNhbCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IG5ldyBnby5TcG90KDAsIDAuNSwgOCwgMCksXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uUGFuZWwsICdWZXJ0aWNhbCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5SaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgxLCAwLjUsIC04LCAwKSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvdXIgbmFtZWQgcG9ydHMsIG9uZSBvbiBlYWNoIHNpZGU6XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWtlUG9ydCgnVCcsIGdvLlNwb3QuVG9wLCBnby5TcG90LlRvcFNpZGUsIGZhbHNlLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWtlUG9ydCgnTCcsIGdvLlNwb3QuTGVmdCwgZ28uU3BvdC5MZWZ0U2lkZSwgdHJ1ZSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFrZVBvcnQoJ1InLCBnby5TcG90LlJpZ2h0LCBnby5TcG90LlJpZ2h0U2lkZSwgdHJ1ZSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFrZVBvcnQoJ0InLCBnby5TcG90LkJvdHRvbSwgZ28uU3BvdC5Cb3R0b21TaWRlLCB0cnVlLCBmYWxzZSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlNQRUNJQUxfU1RPUkFHRTpcbiAgICAgICAgICAgICAgICBub2RlID0gdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICBnby5Ob2RlLFxuICAgICAgICAgICAgICAgICAgICAnU3BvdCcsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqPy5kYXRhPy5vblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaj8uZGF0YT8ub25TZWxlY3RlZChvYmo/LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5pc1NlbGVjdGVkICYmIGU/LmRhdGE/Lm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZT8uZGF0YT8ub25TZWxlY3RlZChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoZ28uUG9pbnQuc3RyaW5naWZ5KSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHdpZHRoOiBzaXplLncsIGhlaWdodDogc2l6ZS5oIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdDaXJjbGUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6ICcjMkQzQjc3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJva2VEYXNoQXJyYXk6IFs1LCA1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUYWJsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywgR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlNUT1JBR0UsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMywgMywgMTAsIDMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgTmFOKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzQ0NDQ0NCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ6ICdub3JtYWwgMTBwdCBBcmlhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnby5QaWN0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3c6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMCwgMCwgMTAsIDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblNpemU6IG5ldyBnby5TaXplKDQwLCA0MCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZSg1MCwgNTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VTdHJldGNoOiBnby5HcmFwaE9iamVjdC5Vbmlmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnc291cmNlJywgJ2ljb24nKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlBhbmVsLCAnVmVydGljYWwnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgwLCAwLjUsIDgsIDApLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlBhbmVsLCAnVmVydGljYWwnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnRGb2N1czogbmV3IGdvLlNwb3QoMSwgMC41LCAtOCwgMCksXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3VyIG5hbWVkIHBvcnRzLCBvbmUgb24gZWFjaCBzaWRlOlxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFrZVBvcnQoJ1QnLCBnby5TcG90LlRvcCwgZ28uU3BvdC5Ub3BTaWRlLCBmYWxzZSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFrZVBvcnQoJ0wnLCBnby5TcG90LkxlZnQsIGdvLlNwb3QuTGVmdFNpZGUsIHRydWUsIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdSJywgZ28uU3BvdC5SaWdodCwgZ28uU3BvdC5SaWdodFNpZGUsIHRydWUsIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdCJywgZ28uU3BvdC5Cb3R0b20sIGdvLlNwb3QuQm90dG9tU2lkZSwgdHJ1ZSwgZmFsc2UpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5TUEVDSUFMX1NUT1JFOlxuICAgICAgICAgICAgICAgIG5vZGUgPSB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIGdvLk5vZGUsXG4gICAgICAgICAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IChlLCBvYmo6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmo/LmRhdGE/Lm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqPy5kYXRhPy5vblNlbGVjdGVkKG9iaj8uZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlLmlzU2VsZWN0ZWQgJiYgZT8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlPy5kYXRhPy5vblNlbGVjdGVkKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShnby5Qb2ludC5zdHJpbmdpZnkpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgd2lkdGg6IHNpemUudywgaGVpZ2h0OiBzaXplLmggfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5TaGFwZSwgJ0NpcmNsZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsOiAnd2hpdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogJyMyRDNCNzcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCAnU3RvcmUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDMsIDMsIDEwLCAzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMjAsIE5hTiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogJyM0NDQ0NDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiAnbm9ybWFsIDEwcHQgQXJpYWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5QaWN0dXJlLCBpY29uLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDEwLCAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoNjAsIDYwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VTdHJldGNoOiBnby5HcmFwaE9iamVjdC5Vbmlmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEdvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5TUEVDSUFMX0RJU0NIQVJHRTpcbiAgICAgICAgICAgICAgICBub2RlID0gdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICBnby5Ob2RlLFxuICAgICAgICAgICAgICAgICAgICAnU3BvdCcsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqPy5kYXRhPy5vblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaj8uZGF0YT8ub25TZWxlY3RlZChvYmo/LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5pc1NlbGVjdGVkICYmIGU/LmRhdGE/Lm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZT8uZGF0YT8ub25TZWxlY3RlZChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoZ28uUG9pbnQuc3RyaW5naWZ5KSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHdpZHRoOiBzaXplLncsIGhlaWdodDogc2l6ZS5oIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdDaXJjbGUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6ICcjMkQzQjc3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJva2VEYXNoQXJyYXk6IFs1LCA1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUYWJsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywgJ0Rpc2NoYXJnZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMywgMywgMTAsIDMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgTmFOKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzQ0NDQ0NCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ6ICdub3JtYWwgMTBwdCBBcmlhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlBpY3R1cmUsIGljb24sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMCwgMCwgMTAsIDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZSg2MCwgNjApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVN0cmV0Y2g6IGdvLkdyYXBoT2JqZWN0LlVuaWZvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlNQRUNJQUxfT1RIRVI6XG4gICAgICAgICAgICAgICAgbm9kZSA9IHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgZ28uTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgJ1Nwb3QnLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGljazogKGUsIG9iajogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iaj8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmo/LmRhdGE/Lm9uU2VsZWN0ZWQob2JqPy5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUuaXNTZWxlY3RlZCAmJiBlPy5kYXRhPy5vblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU/LmRhdGE/Lm9uU2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KGdvLlBvaW50LnN0cmluZ2lmeSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyB3aWR0aDogc2l6ZS53LCBoZWlnaHQ6IHNpemUuaCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnQ2lyY2xlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICd3aGl0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzJEM0I3NycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5UZXh0QmxvY2ssICdPdGhlcicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMywgMywgMTAsIDMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgTmFOKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzQ0NDQ0NCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ6ICdub3JtYWwgMTBwdCBBcmlhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlBpY3R1cmUsIGljb24sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMCwgMCwgMTAsIDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZSg2MCwgNjApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVN0cmV0Y2g6IGdvLkdyYXBoT2JqZWN0LlVuaWZvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgdGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwLnNldCh0aXRsZSwgbm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGFydEFuaW1hdGlvbigpIHtcbiAgICAgICAgY29uc3QgZGlhZ3JhbSA9IHRoaXMubXlEaWFncmFtO1xuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gICAgIGRpYWdyYW0ubGlua3MuZWFjaCgobGluaykgPT4ge1xuICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgIC8vIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5hbmltYXRpb25JbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRza2lwcyA9IGRpYWdyYW0uc2tpcHNVbmRvTWFuYWdlcjtcbiAgICAgICAgICAgICAgICBkaWFncmFtLnNraXBzVW5kb01hbmFnZXIgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgZGlhZ3JhbS5saW5rcy5lYWNoKChsaW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gbGluay5maW5kT2JqZWN0KCdQSVBFJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIXNoYXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBvZmYgPSBzaGFwZT8uc3Ryb2tlRGFzaE9mZnNldCAtIDM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmYgPSBzaGFwZT8uc3Ryb2tlRGFzaE9mZnNldCAtIDk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmltYXRlIChtb3ZlKSB0aGUgc3Ryb2tlIGRhc2hcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlLnN0cm9rZURhc2hPZmZzZXQgPSBvZmYgPD0gMCA/IDYwIDogb2ZmO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGlhZ3JhbS5za2lwc1VuZG9NYW5hZ2VyID0gb2xkc2tpcHM7XG4gICAgICAgICAgICB9LCA2MDApO1xuICAgICAgICAgICAgLy8gNjBcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG5cbiAgICBzdG9wQW5pbWF0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5hbmltYXRpb25JbnRlcnZhbCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmFuaW1hdGlvbkludGVydmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvRGF0YVVSTCh1cmwsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2socmVhZGVyLnJlc3VsdCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCk7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYic7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfVxuXG4gICAgZ2V0QmFzZTY0RGlhZ3JhbVdpdGhFbXB0eURhdGEoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICAvLyBUZXN0XG4gICAgICAgIC8vIGNvbnN0IG5ld1dpbmRvdyA9IHdpbmRvdy5vcGVuKCcnLCAnbmV3V2luZG93Jyk7XG4gICAgICAgIC8vIGlmICghbmV3V2luZG93KSB7XG4gICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gY29uc3QgbmV3RG9jdW1lbnQgPSBuZXdXaW5kb3c/LmRvY3VtZW50O1xuICAgICAgICBpZiAoIXRoaXMubXlEaWFncmFtPy5tb2RlbD8ubm9kZURhdGFBcnJheT8ubGVuZ3RoICYmICF0aGlzLm15RGlhZ3JhbT8ubW9kZWw/LmxpbmtEYXRhQXJyYXk/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ZnID0gdGhpcy5teURpYWdyYW0ubWFrZVN2Zyh7XG4gICAgICAgICAgICBzY2FsZTogdGhpcy5kZWZhdWx0U2NhbGVab29tVG9GaXQsXG4gICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZSgxMjAwLCBOYU4pLFxuICAgICAgICAgICAgYmFja2dyb3VuZDogJ3doaXRlJyxcbiAgICAgICAgICAgIHBhZGRpbmc6IDIwLFxuICAgICAgICAgICAgZWxlbWVudEZpbmlzaGVkOiBmdW5jdGlvbiAoZ3JhcGhPYmplY3QsIHN2Z0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBzdmdFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnY2xpcC1wYXRoJyk7XG4gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBJbWFnZSBVUkwgdG8gYmFzZTY0IC0+IEZvciBzaG93aW5nIFBpY3R1cmUgZWxlbWVudFxuICAgICAgICAgICAgICAgIGlmIChncmFwaE9iamVjdCBpbnN0YW5jZW9mIGdvLlBpY3R1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi50b0RhdGFVUkwoc3ZnRWxlbWVudC5ocmVmLmJhc2VWYWwsIGZ1bmN0aW9uIChkYXRhVXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdmdFbGVtZW50LnNldEF0dHJpYnV0ZSgnaHJlZicsIGRhdGFVcmwpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTWFrZSBUZXh0IE5vZGUgU2hhcGUgQm9yZGVyXG4gICAgICAgICAgICAgICAgaWYgKGdyYXBoT2JqZWN0Py5uYW1lID09PSAndGV4dE5vZGVTaGFwZScpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ZnRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICdyZ2JhKDY0LCAxODEsIDIwNiwgMC42KScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBFbXB0eSBWYWx1ZVxuICAgICAgICAgICAgICAgIGlmIChncmFwaE9iamVjdD8ubmFtZSA9PT0gJ3RleHRCbG9ja1ZhbHVlJyB8fCBncmFwaE9iamVjdD8ubmFtZSA9PT0gJ3RleHRCbG9ja1VuaXRQcmVmaXhlcycpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ZnRWxlbWVudC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3ZnRWxlbWVudC5jbGlwUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICBzdmdFbGVtZW50LmNsaXBQYXRoID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FsbGJhY2s6IChzdmcpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ZnU3RyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhzdmcpO1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgVGVzdFxuICAgICAgICAgICAgICAgICAgICAvLyBuZXdEb2N1bWVudD8uYm9keT8uYXBwZW5kQ2hpbGQoc3ZnKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlNjRTdmcgPSBgZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwke3dpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdmdTdHIpKSl9YDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgIGltZy5zcmMgPSBiYXNlNjRTdmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgY2FudmFzIGNvbnRleHQgZm9yIGRyYXdpbmcgb24gY2FudmFzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgICAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN2Z1dpZHRoID0gaW1nLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ZnSGVpZ2h0ID0gaW1nLmhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLndpZHRoID0gc3ZnV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gc3ZnSGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTY0UE5HID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW1pdEltYWdlVG9wb2xvZ3koYmFzZTY0UE5HLnJlcGxhY2UoJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJywgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGVtaXRJbWFnZVRvcG9sb2d5KGJhc2U2NCkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrSW1hZ2VUb3BvbG9neS5lbWl0KGJhc2U2NCk7XG4gICAgfVxuXG4gICAgb3BlbkFjdGlvbk1lbnUoKSB7XG4gICAgICAgIC8vIFdoZW4gdGhpcyBub2RlIGlzIGNsaWNrZWQsIGFkanVzdCB0aGUgbWVudSBwb3NpdGlvblxuICAgICAgICBjb25zdCBtb3VzZVB0ID0gdGhpcy5teURpYWdyYW0ubGFzdElucHV0LnZpZXdQb2ludDtcblxuICAgICAgICAvLyAvLyBXaGVuIHRoaXMgbm9kZSBpcyBjbGlja2VkLCBkaXNwbGF5IHRoZSBkcm9wZG93biBtZW51XG4gICAgICAgIGNvbnN0IG1lbnUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmFjdGlvbk1lbnVJZCk7XG4gICAgICAgIGlmIChtZW51KSB7XG4gICAgICAgICAgICBtZW51LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICAgIG1lbnUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgICAgbWVudS5zdHlsZS5sZWZ0ID0gbW91c2VQdC54ICsgJ3B4JztcbiAgICAgICAgICAgIG1lbnUuc3R5bGUudG9wID0gbW91c2VQdC55ICsgJ3B4JztcblxuICAgICAgICAgICAgdGhpcy5tZW51VHJpZ2dlci5vcGVuTWVudSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgICAgdW5zdWJzY3JpYmVBbGwoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdWJzY3JpcHRpb25MaXN0KSB7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25MaXN0LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uTGlzdCA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICB9XG4gICAgXG4gICAgICBhZGRTdWJzY3JpYmVzKC4uLnN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbkxpc3QuYWRkKGVsKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIEF0b0RlZmF1bHRHb2pzRWRpdG9yIHtcbiAgICBleHBvcnQgZW51bSBFTlVNX0FDVElPTlMge1xuICAgICAgICBERVRBSUxTID0gJ09wZW4gZGV0YWlscyAmIHdpemFyZCcsXG4gICAgICAgIE9OTFlfREVUQUlMUyA9ICdPcGVuIGRldGFpbHMnLFxuICAgICAgICBSRU5BTUUgPSAnUmVuYW1lIHRoaXMgYm94JyxcbiAgICAgICAgT1VURkxPVyA9ICdDcmVhdGUgYW4gb3V0ZmxvdycsXG4gICAgICAgIERFTEVURSA9ICdEZWxldGUnLFxuICAgICAgICBJTlNJR0hUID0gJ0luc2lnaHQgdGFnIG1hcHBpbmcnLFxuICAgICAgICBEQVRBX01BUFBJTkcgPSAnRGF0YSBNYXBwaW5nJyxcbiAgICAgICAgTU9SRSA9ICdNb3JlJyxcbiAgICAgICAgRkxPV19ERVRBSUxTID0gJ0Zsb3cgZGV0YWlscycsXG4gICAgICAgIEFTU0VUX1BBUkFNRVRFUlMgPSAnQXNzZXQgcGFyYW1ldGVycycsXG4gICAgICAgIENIQU5HRV9JQ09OID0gJ0NoYW5nZSBpY29uJyxcbiAgICB9XG5cbiAgICBleHBvcnQgY29uc3QgQUNUSU9OUzogYW55ID0ge1xuICAgICAgICBbRU5VTV9BQ1RJT05TLkRFVEFJTFNdOiB7XG4gICAgICAgICAgICBuYW1lOiBFTlVNX0FDVElPTlMuREVUQUlMUyxcbiAgICAgICAgICAgIGljb25DbGFzc05hbWU6ICdmYXIgZmEtbWVtby1jaXJjbGUtaW5mbycsXG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgW0VOVU1fQUNUSU9OUy5GTE9XX0RFVEFJTFNdOiB7XG4gICAgICAgICAgICBuYW1lOiBFTlVNX0FDVElPTlMuRkxPV19ERVRBSUxTLFxuICAgICAgICAgICAgaWNvbkNsYXNzTmFtZTogJ2ZhciBmYS1hcnJvdy1wcm9ncmVzcycsXG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgW0VOVU1fQUNUSU9OUy5BU1NFVF9QQVJBTUVURVJTXToge1xuICAgICAgICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLkFTU0VUX1BBUkFNRVRFUlMsXG4gICAgICAgICAgICBpY29uQ2xhc3NOYW1lOiAnZmFyIGZhLWJveC1hcmNoaXZlJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgICBbRU5VTV9BQ1RJT05TLk9OTFlfREVUQUlMU106IHtcbiAgICAgICAgICAgIG5hbWU6IEVOVU1fQUNUSU9OUy5PTkxZX0RFVEFJTFMsXG4gICAgICAgICAgICBpY29uQ2xhc3NOYW1lOiAnZmFyIGZhLW1lbW8tY2lyY2xlLWluZm8nLFxuICAgICAgICAgICAgb25DbGljazogKCkgPT4ge30sXG4gICAgICAgIH0sXG4gICAgICAgIFtFTlVNX0FDVElPTlMuUkVOQU1FXToge1xuICAgICAgICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLlJFTkFNRSxcbiAgICAgICAgICAgIGljb25DbGFzc05hbWU6ICdmYXIgZmEtaW5wdXQtdGV4dCcsXG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgW0VOVU1fQUNUSU9OUy5PVVRGTE9XXToge1xuICAgICAgICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLk9VVEZMT1csXG4gICAgICAgICAgICBpY29uQ2xhc3NOYW1lOiAnZmFyIGZhLWRpYWdyYW0tbmVzdGVkJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgICBbRU5VTV9BQ1RJT05TLkRFTEVURV06IHtcbiAgICAgICAgICAgIG5hbWU6IEVOVU1fQUNUSU9OUy5ERUxFVEUsXG4gICAgICAgICAgICBpY29uQ2xhc3NOYW1lOiAnZmFsIGZhLXRyYXNoLWNhbicsXG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgW0VOVU1fQUNUSU9OUy5JTlNJR0hUXToge1xuICAgICAgICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLklOU0lHSFQsXG4gICAgICAgICAgICBpY29uQ2xhc3NOYW1lOiAnZmFyIGZhLXRhZycsXG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgW0VOVU1fQUNUSU9OUy5EQVRBX01BUFBJTkddOiB7XG4gICAgICAgICAgICBuYW1lOiBFTlVNX0FDVElPTlMuREFUQV9NQVBQSU5HLFxuICAgICAgICAgICAgaWNvbkNsYXNzTmFtZTogJ2ZhciBmYS10YWcnLFxuICAgICAgICAgICAgb25DbGljazogKCkgPT4ge30sXG4gICAgICAgIH0sXG4gICAgICAgIFtFTlVNX0FDVElPTlMuTU9SRV06IHtcbiAgICAgICAgICAgIG5hbWU6IEVOVU1fQUNUSU9OUy5NT1JFLFxuICAgICAgICAgICAgaWNvbkNsYXNzTmFtZTogJ2ZhbCBmYS1tZW1vLWNpcmNsZS1pbmZvJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgICBbRU5VTV9BQ1RJT05TLkNIQU5HRV9JQ09OXToge1xuICAgICAgICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLkNIQU5HRV9JQ09OLFxuICAgICAgICAgICAgaWNvbkNsYXNzTmFtZTogJ2ZhciBmYS1pbWFnZScsXG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IERJU1RBTkNFXzJfT1VUUFVUID0gNjA7XG59XG4iXX0=