Ihr Bauforum: Bauberatung von WeberHaus
Ob bei der Grundstückssuche oder -beurteilung, bei der Umsetzung Ihrer architektonischen Ideen oder bei Fragen zu Energiekonzepten und Fördermöglichkeiten: Ihr persönlicher Bauberater im WeberHaus Bauforum in Ihrer Nähe berät Sie gerne in einem persönlichen Gespräch. Einfach telefonisch einen Termin vereinbaren!
CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3aC1iYXVmb3J1bS1nb29nbGUtbWFwcy1jb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imhlcm8taW1hZ2UtY29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2gtYmF1Zm9ydW0tZmlsdGVyLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBuYW1lPSJiYXVmb3J1bVNlYXJjaEZvcm0iIGlkPSJiYXVmb3J1bVNlYXJjaEZvcm0iIGFjdGlvbj0iL2FqYXgvP3NlYXJjaC1iYXVmb3J1bT0xIiBtZXRob2Q9IlBPU1QiIGRhdGEtcGFyc2xleS12YWxpZGF0ZT0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0icmVxdWVzdC1kYXRhIiBjbGFzcz0iZC1ub25lIiBkYXRhLXppcD0iIiBkYXRhLWNvdW50cnk9IkNIIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZpbHRlci1pdGVtcy13cmFwcGVyIGhpZGUtcmFkaXVzLXNlYXJjaCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWRkcmVzcy1zZWFyY2gtd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImFkZHJlc3NTZWFyY2giIGNsYXNzPSJmb3JtLWxhYmVsIj5BZHJlc3NlPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWRkcmVzcy1zZWFyY2gtcGFyc2xleS13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ0eF93aGJhdWZvcnVtX21hcHNfYWRkcmVzcyIgaWQ9ImFkZHJlc3NTZWFyY2giIGlucHV0bW9kZT0ibnVtZXJpYyIgYXV0b2NvbXBsZXRlPSJwb3N0YWwtY29kZSIgcGxhY2Vob2xkZXI9IlBMWiAuLi4iIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGRhdGEtcGFyc2xleS1lcnJvcnMtY29udGFpbmVyPSIjYWRkcmVzcy1zZWFyY2gtZXJyb3ItY29udGFpbmVyIiBkYXRhLXBhcnNsZXktY3VzdG9tMTAzPSIxIiBkYXRhLXBhcnNsZXktZXJyb3ItbWVzc2FnZT0iQml0dGUgZ8O8bHRpZ2UgUExaIGVpbmdlYmVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImFkZHJlc3Mtc2VhcmNoLWVycm9yLWNvbnRhaW5lciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdW50cnktc2VhcmNoLXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjb3VudHJ5U2VhcmNoIiBjbGFzcz0iZm9ybS1sYWJlbCI+TGFuZDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9ImNvdW50cnlTZWFyY2giIGNsYXNzPSJmb3JtLXNlbGVjdCIgbmFtZT0idHhfd2hiYXVmb3J1bV9tYXBzX2NvdW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iRCI+RGV1dHNjaGxhbmQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkwiPkx1eGVtYnVyZzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iQ0giPlNjaHdlaXo8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ2VvbG9jYXRpb24tc2VhcmNoLXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tY2hlY2stbGFiZWwiIGZvcj0iZ2VvbG9jYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuZW4gU3RhbmRvcnQgdmVyd2VuZGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iZ2VvbG9jYXRpb24iIG5hbWU9Imdlb2xvY2F0aW9uIiB2YWx1ZT0iMSIgY2xhc3M9ImZvcm0tY2hlY2staW5wdXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjaGVja21hcmsiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idHhfd2hiYXVmb3J1bV9tYXBzX2xhdCIgaWQ9ImxhdCIgdmFsdWU9IjAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InR4X3doYmF1Zm9ydW1fbWFwc19sb24iIGlkPSJsb24iIHZhbHVlPSIwIiAvPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZ2VvbG9jYXRpb24tbG9hZCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPlN0YW5kb3J0IHdpcmQgZXJtaXR0ZWx0Li4uPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Imdlb2xvY2F0aW9uLWVycm9yIiByb2xlPSJzdGF0dXMiIGRhdGEtZGVuaWVkPSJCaXR0ZSBlcmxhdWJlbiBTaWUgZGVuIFp1Z3JpZmYgYXVmIElocmVuIFN0YW5kb3J0IG9kZXIgZ2ViZW4gU2llIElocmUgUExaIGVpbi4iIGRhdGEtdW5hdmFpbGFibGU9IklociBTdGFuZG9ydCBrb25udGUgbmljaHQgZXJtaXR0ZWx0IHdlcmRlbi4gQml0dGUgZ2ViZW4gU2llIElocmUgUExaIGVpbi4iIGRhdGEtdGltZW91dD0iRGllIFN0YW5kb3J0ZXJtaXR0bHVuZyBkYXVlcnQgenUgbGFuZ2UuIEJpdHRlIGdlYmVuIFNpZSBJaHJlIFBMWiBlaW4uIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InR4X3doYmF1Zm9ydW1fbWFwc19yYWRpdXMiIGlkPSJyYWRpdXMiIHZhbHVlPSIwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJtaXQtYnV0dG9uLXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgdGl0bGU9IkJhdWZvcnVtIHN1Y2hlbiIgYXJpYS1sYWJlbD0iQmF1Zm9ydW0gc3VjaGVuIiBjbGFzcz0iYnRuLXByaW1hcnkiIGlkPSJzZWFyY2hMb2NhdGlvbiI+QmF1Zm9ydW0gc3VjaGVuPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtYXAtYW5jaG9yIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2gtY29udGVudC1jb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJnb29nbGUtbWFwcy1ncmlkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hcC1jb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1hcCI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhdWZvcmVuLWFqYXgtbGlzdC13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJiYXVmb3JlbkFqYXhMaXN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoLWluaXQtaW5mbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbml0LWluZm8taWNvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNBMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMjEgMTBjMCA3LTkgMTMtOSAxM3MtOS02LTktMTNhOSA5IDAgMCAxIDE4IDB6IiAvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTAiIHI9IjMiIC8+PC9zdmc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluaXQtaW5mby10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXR0ZSBnZWJlbiBTaWUgZsO8ciBlaW5lIEF1Zmxpc3R1bmcgdm9uIEJhdWZvcmVuIGluIElocmVyIE7DpGhlIElocmUgPHN0cm9uZz5QTFo8L3N0cm9uZz4gdW5kIGRlbiBnZXfDvG5zY2h0ZW4gPHN0cm9uZz5VbWtyZWlzPC9zdHJvbmc+IGFuLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im5vLXJlc3VsdHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZWluZSBFcmdlYm5pc3NlIGdlZnVuZGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibG9hZGluZy1hbmltYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPSJsb2FkaW5nLWFuaW1hdGlvbiIgYWx0PSJXZWJlckhhdXMgTG9nbyBMYWRlLUFuaW1hdGlvbiIgdGl0bGU9IldlYmVySGF1cyBMb2dvIExhZGUtQW5pbWF0aW9uIiBzcmM9Ii9fYXNzZXRzL2EwNmRhOGQ5M2UzYmM4MzcyMmE3MjgyZGZlNjg0NDc3L0ltYWdlcy9naWZfV2ViZXJIYXVzLWljb24tbG9hZGluZy5naWYiIHdpZHRoPSI4MCIgaGVpZ2h0PSI4MCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzP2tleT1BSXphU3lBTFBjZTFDWVF2TlI0V0x0WG9kNUZWMVFDQlo2OXkyTFEmbG9hZGluZz1hc3luYyZjYWxsYmFjaz1pbml0TWFwIj48L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2NyaXB0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWFya2VycyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnRlZCBvbiBldmVyeSBjaGVja2JveCBjaGFuZ2UsIHNvIGEgbGF0ZSBnZW9sb2NhdGlvbiBvciBnZW9jb2RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnN3ZXIgZnJvbSBhbiBlYXJsaWVyIGF0dGVtcHQgaXMgaWdub3JlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdlb2xvY2F0aW9uUmVxdWVzdElkID0gMDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub1Jlc3VsdHNTdHJpbmcgPSAkKCcjbm8tcmVzdWx0cycpLmh0bWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBjYWxscyB0aGlzIGdsb2JhbCB3aGVuIHRoZSBBUEkga2V5IGlzIGludmFsaWQgb3IgdGhlIEhUVFAgcmVmZXJyZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90IGFsbG93ZWQgKFJlZmVyZXJOb3RBbGxvd2VkTWFwRXJyb3IpLiBJbiB0aGF0IGNhc2UgZ29vZ2xlLm1hcHMgc3RpbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZHMsIHNvIHdlIGZsYWcgdGhlIGZhaWx1cmUgZXhwbGljaXRseSBhbmQgZGVncmFkZSB0byBhIGxpc3Qtb25seSBzZWFyY2guCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5nbV9hdXRoRmFpbHVyZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fd2hNYXBzQXV0aEZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiR29vZ2xlIE1hcHMgYXV0aCBmYWlsZWQgKGludmFsaWQga2V5IG9yIHJlZmVycmVyKS4gRmFsbGluZyBiYWNrIHRvIGxpc3Qtb25seSBzZWFyY2guIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaXRoIGxvYWRpbmc9YXN5bmMgdGhlIGNhbGxiYWNrIG9ubHkgc2lnbmFscyB0aGF0IHRoZSBsb2FkZXIgaXMgcmVhZHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaWJyYXJpZXMgd2UgdXNlIChNYXAsIEdlb2NvZGVyLCBNYXJrZXIpIGFyZSBpbXBvcnRlZCBleHBsaWNpdGx5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBpbml0TWFwKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS5tYXBzLmltcG9ydExpYnJhcnkoJ21hcHMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlLm1hcHMuaW1wb3J0TGlicmFyeSgnZ2VvY29kaW5nJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS5tYXBzLmltcG9ydExpYnJhcnkoJ21hcmtlcicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJHb29nbGUgTWFwcyBsaWJyYXJpZXMgY291bGQgbm90IGJlIGxvYWRlZC4gRmFsbGluZyBiYWNrIHRvIGxpc3Qtb25seSBzZWFyY2guIiwgZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hcCcpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyOiB7bGF0OiA0OC42MTg2ODU0LCBsbmc6IDcuODkwODA2Nn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fd2hNYXBzUmVhZHkgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtYXBzQXZhaWxhYmxlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5fX3doTWFwc1JlYWR5ID09PSB0cnVlICYmICF3aW5kb3cuX193aE1hcHNBdXRoRmFpbGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjbGVhck1hcmtlcnMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFya2Vyc1tpXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJzW2ldLnNldE1hcChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0SHRtbFRlbXBsYXRlKGl0ZW0sIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYW5nTGFiZWxzID0gJCgnI2xhbmctbGFiZWxzJykuZGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1OYW1lMSA9IGl0ZW0udGVhbU5hbWUxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1OYW1lMiA9IGl0ZW0udGVhbU5hbWUyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1OYW1lMyA9IGl0ZW0udGVhbU5hbWUzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1DaXR5ID0gaXRlbS50ZWFtQ2l0eTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtUGhvbmUxID0gaXRlbS50ZWFtUGhvbmUxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1QaG9uZUhyZWYgPSBpdGVtLnRlYW1QaG9uZTEucmVwbGFjZSgvXHMvZywnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbVppcENvZGUgPSBpdGVtLnRlYW1aaXBDb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1TdHJlZXQgPSBpdGVtLnRlYW1TdHJlZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9ydW1VaWQgPSBpdGVtLmZvcnVtVWlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvcnVtVXJsID0gaXRlbS5mb3J1bVBhZ2VVcmk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvbiA9ICc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI0EwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yMSAxMGMwIDctOSAxMy05IDEzcy05LTYtOS0xM2E5IDkgMCAwIDEgMTggMHoiIC8+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMCIgcj0iMyIgLz48L3N2Zz4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpc3RhbmNlID0gaXRlbS5kaXN0YW5jZSArICcga20nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpc3RhbmNlVmlzaWJpbGl0eUNsYXNzID0gJ2QtYmxvY2snOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5kaXN0YW5jZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlVmlzaWJpbGl0eUNsYXNzID0gJ2Qtbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbHN0cmluZyA9ICcnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxzdHJpbmcgKz0gJycgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJnbS1iYXVmb3J1bS1pdGVtIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZ20tYmF1Zm9ydW0taXRlbS1jb250ZW50Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idGVhbS1uYW1lLTEiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3J1bVVybCAhPT0gIiIgPyAnPGEgaHJlZj0iJyArIGZvcnVtVXJsICsgJyIgY2xhc3M9ImdtLWJhdWZvcnVtLWxpbmsiIHRpdGxlPSInICsgdGVhbU5hbWUxICsgJyI+JyArIHRlYW1OYW1lMSArICc8L2E+JyA6ICcnICsgdGVhbU5hbWUxICsgJycpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InRlYW0tbmFtZS0yIj4nICsgdGVhbU5hbWUyICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ0ZWFtLW5hbWUtMyI+JyArIHRlYW1OYW1lMyArICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idGVhbS1zdHJlZXQiPicgKyB0ZWFtU3RyZWV0ICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ0ZWFtLWFkZHJlc3MiPicgKyB0ZWFtWmlwQ29kZSArICcgJyArIHRlYW1DaXR5ICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ0ZWFtLXBob25lLWNvbnRhaW5lciI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InBob25lLWxhYmVsIj5UZWw6PC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InBob25lLW51bWJlcnMiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YSBocmVmPSJ0ZWw6JyArIHRlYW1QaG9uZUhyZWYgKyAnIiBjbGFzcz0iZ20tYmF1Zm9ydW0tbGluayIgdGl0bGU9IicgKyB0ZWFtUGhvbmUxICsgJyI+JyArIHRlYW1QaG9uZTEgKyAnPC9hPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJnbS1iYXVmb3J1bS1pdGVtLWRpc3RhbmNlIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZGlzdGFuY2UtbGFiZWwgJyArIGRpc3RhbmNlVmlzaWJpbGl0eUNsYXNzICsgJyI+JytsYW5nTGFiZWxzWyJkaXN0YW5jZSJdKyc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZGlzdGFuY2UtdmFsdWUgJyArIGRpc3RhbmNlVmlzaWJpbGl0eUNsYXNzICsgJyI+JyArIGRpc3RhbmNlLnJlcGxhY2UoIi4iLCAiLCIpICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZ20tYmF1Zm9ydW0taXRlbS1pY29uIiBpZD0iYmF1Zm9ydW0taXRlbS0nICsgZm9ydW1VaWQgKyAnIj4nICsgaWNvbiArICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbHN0cmluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0SW5mb1dpbmRvd0h0bWwoaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1OYW1lMSA9IGl0ZW0udGVhbU5hbWUxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1OYW1lMiA9IGl0ZW0udGVhbU5hbWUyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1OYW1lMyA9IGl0ZW0udGVhbU5hbWUzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1DaXR5ID0gaXRlbS50ZWFtQ2l0eTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtUGhvbmUxID0gaXRlbS50ZWFtUGhvbmUxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1QaG9uZUhyZWYgPSBpdGVtLnRlYW1QaG9uZTEucmVwbGFjZSgvXHMvZywnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbVppcENvZGUgPSBpdGVtLnRlYW1aaXBDb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1TdHJlZXQgPSBpdGVtLnRlYW1TdHJlZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9ydW1VcmwgPSBpdGVtLmZvcnVtUGFnZVVyaTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5mb1dpbmRvd0h0bWwgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9XaW5kb3dIdG1sICs9ICc8ZGl2IGNsYXNzPSJpbmZvLXdpbmRvdy13cmFwcGVyIj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1dpbmRvd0h0bWwgKz0gJzxkaXYgY2xhc3M9ImluZm8tdGVhbS1uYW1lLTEiPicgKyAoZm9ydW1VcmwgIT09ICIiID8gJzxhIGhyZWY9IicgKyBmb3J1bVVybCArICciIGNsYXNzPSJnbS1iYXVmb3J1bS1saW5rIiB0aXRsZT0iJyArIHRlYW1OYW1lMSArICciPicgKyB0ZWFtTmFtZTEgKyAnPC9hPicgOiAnJyArIHRlYW1OYW1lMSArICcnKSArICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1dpbmRvd0h0bWwgKz0gJzxkaXYgY2xhc3M9ImluZm8tdGVhbS1uYW1lLTIiPicgKyB0ZWFtTmFtZTIgKyAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9XaW5kb3dIdG1sICs9ICc8ZGl2IGNsYXNzPSJpbmZvLXRlYW0tbmFtZS0zIj4nICsgdGVhbU5hbWUzICsgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvV2luZG93SHRtbCArPSAnPGRpdiBjbGFzcz0iaW5mby10ZWFtLXN0cmVldCI+JyArIHRlYW1TdHJlZXQgKyAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9XaW5kb3dIdG1sICs9ICc8ZGl2IGNsYXNzPSJpbmZvLXRlYW0tYWRkcmVzcyI+JyArIHRlYW1aaXBDb2RlICsgJyAnICsgdGVhbUNpdHkgKyAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9XaW5kb3dIdG1sICs9ICc8ZGl2IGNsYXNzPSJpbmZvLXRlYW0tcGhvbmUtY29udGFpbmVyIj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1dpbmRvd0h0bWwgKz0gJzxkaXYgY2xhc3M9ImluZm8tcGhvbmUtbGFiZWwiPlRlbDo8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1dpbmRvd0h0bWwgKz0gJzxkaXYgY2xhc3M9ImluZm8tcGhvbmUtbnVtYmVycyI+PGEgaHJlZj0idGVsOicgKyB0ZWFtUGhvbmVIcmVmICsgJyIgY2xhc3M9ImdtLWJhdWZvcnVtLWxpbmsiIHRpdGxlPSInICsgdGVhbVBob25lMSArICciPicgKyB0ZWFtUGhvbmUxICsgJzwvYT48L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1dpbmRvd0h0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvV2luZG93SHRtbCArPSAnPC9kaXY+JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mb1dpbmRvd0h0bWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHN0YXJ0U2VhcmNoKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvcm0gPSAkKCcjYmF1Zm9ydW1TZWFyY2hGb3JtJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmF1Zm9yZW5BamF4TGlzdCA9ICQoJyNiYXVmb3JlbkFqYXhMaXN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9SZXN1bHRzQ29udGFpbmVyID0gJCgnI25vLXJlc3VsdHMnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXVmb3JlbkFqYXhMaXN0Lmh0bWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xvYWRpbmctYW5pbWF0aW9uJykuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWxvYWQnKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgTWFwcyBtYXkgYmUgdW5hdmFpbGFibGUgKGUuZy4gdGhlIEFQSSBrZXkgaXMgbm90IHZhbGlkIGZvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZG9tYWluKS4gVGhlIGZvcnVtIHNlYXJjaCBpdHNlbGYgaXMgc2VydmVyLXNpZGUgYW5kIGRvZXMgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIE1hcHMsIHNvIHdlIGRlZ3JhZGUgZ3JhY2VmdWxseTogcmVuZGVyIHRoZSByZXN1bHQgbGlzdCB3aXRob3V0IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFwLCBtYXJrZXJzIGFuZCBkaXN0YW5jZSBzb3J0aW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVzZU1hcHMgPSBtYXBzQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5mb3dpbmRvdyA9IHVzZU1hcHMgPyBuZXcgZ29vZ2xlLm1hcHMuSW5mb1dpbmRvdyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxPZmZzZXQ6IG5ldyBnb29nbGUubWFwcy5TaXplKC01LCAtMjApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck1hcmtlcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQucG9zdChmb3JtLmF0dHIoJ2FjdGlvbicpLCBmb3JtLnNlcmlhbGl6ZSgpLCBmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2VbJ2VtcHR5J10gPT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xvYWRpbmctYW5pbWF0aW9uJykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25vUmVzdWx0c0NvbnRhaW5lci5jc3MoJ2Rpc3BsYXknLCdmbGV4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYmF1Zm9yZW5BamF4TGlzdC5hcHBlbmQobm9SZXN1bHRzQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF1Zm9yZW5BamF4TGlzdC5odG1sKCc8ZGl2IGNsYXNzPSJuby1yZXN1bHRzIj4nICsgbm9SZXN1bHRzU3RyaW5nICsgJzwvZGl2PicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXBCb3VuZHMgPSB1c2VNYXBzID8gbmV3IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kcygpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGggIT09IDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9SZXN1bHRzQ29udGFpbmVyLmNzcygnZGlzcGxheScsJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChyZXNwb25zZSwgZnVuY3Rpb24oaSwgaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsb2FkaW5nLWFuaW1hdGlvbicpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXVmb3JlbkFqYXhMaXN0LmFwcGVuZChnZXRIdG1sVGVtcGxhdGUoaXRlbSwgaSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdXNlTWFwcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBtYXA6IGxpc3QgZW50cnkgaXMgZW5vdWdoLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IG5ldyBnb29nbGUubWFwcy5MYXRMbmcoaXRlbS5sYXQsIGl0ZW0ubG9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwOiBtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICcvX2Fzc2V0cy9hMDZkYThkOTNlM2JjODM3MjJhNzI4MmRmZTY4NDQ3Ny9JbWFnZXMvaWNvbl9tYXAtcGluLXNvbGlkLnBuZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkRST1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX2lkOiBpdGVtLmZvcnVtVWlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Vycy5wdXNoKG1hcmtlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwQm91bmRzLmV4dGVuZChtYXJrZXIucG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvV2luZG93Q29udGVudCA9IGdldEluZm9XaW5kb3dIdG1sKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiYXVGb3J1bUl0ZW0gPSAkKCcjYmF1Zm9ydW0taXRlbS0nICsgaXRlbS5mb3J1bVVpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF1Rm9ydW1JdGVtLmJpbmQoJ2NsaWNrJywgbWFya2VyLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gobWFya2VycywgZnVuY3Rpb24oaSwgbWFya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0QW5pbWF0aW9uKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRBbmltYXRpb24oZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkJPVU5DRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm93aW5kb3cuc2V0Q29udGVudChpbmZvV2luZG93Q29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm93aW5kb3cub3BlbihtYXAsIG1hcmtlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXBFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1hcC1hbmNob3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7YmVoYXZpb3I6ICJzbW9vdGgiLCBibG9jazogInN0YXJ0In0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS5tYXBzLmV2ZW50LmFkZExpc3RlbmVyKG1hcmtlciwgJ2NsaWNrJywgKGZ1bmN0aW9uKG1hcmtlciwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gobWFya2VycywgZnVuY3Rpb24oaSwgbWFya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldEFuaW1hdGlvbihudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldEFuaW1hdGlvbihnb29nbGUubWFwcy5BbmltYXRpb24uQk9VTkNFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm93aW5kb3cuc2V0Q29udGVudChpbmZvV2luZG93Q29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvd2luZG93Lm9wZW4obWFwLCBtYXJrZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkobWFya2VyLCBpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VNYXBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmZpdEJvdW5kcyhtYXBCb3VuZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGggPT09IDEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0T3B0aW9ucyh7IHpvb206IDE2IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXJjaEZvcm0gPSAkKCcjYmF1Zm9ydW1TZWFyY2hGb3JtJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdERhdGEgPSAkKCcjcmVxdWVzdC1kYXRhJykuZGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHppcENvZGUgPSByZXF1ZXN0RGF0YVsnemlwJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY291bnRyeVNob3J0Q29kZSA9IHJlcXVlc3REYXRhWydjb3VudHJ5J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb3VudHJ5U2hvcnRDb2RlICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNjb3VudHJ5U2VhcmNoJykudmFsKGNvdW50cnlTaG9ydENvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWmlwIGNvZGUgaGFuZGVkIG92ZXIgZnJvbSB0aGUgbWVudSBzZWFyY2gsIG5vcm1hbGl6ZWQgbGlrZSB0aGUgZm9ybSBpbnB1dC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByYXdaaXBDb2RlID0gU3RyaW5nKHppcENvZGUgPz8gJycpLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcENvZGUgPSB3aW5kb3cud2hOb3JtYWxpemVaaXBDb2RlKHJhd1ppcENvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoemlwQ29kZSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjYWRkcmVzc1NlYXJjaCcpLnZhbCh6aXBDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VhcmNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMzAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3WmlwQ29kZSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbnVzYWJsZSBpbnB1dDogc2hvdyBpdCB3aXRoIHRoZSB2YWxpZGF0aW9uIGhpbnQgaW5zdGVhZCBvZiBzZWFyY2hpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2FkZHJlc3NTZWFyY2gnKS52YWwocmF3WmlwQ29kZSkucGFyc2xleSgpLnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXJjaEluZm9IdG1sID0gJCgnI2JhdWZvcmVuQWpheExpc3QnKS5odG1sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vbignc3VibWl0Jywgc2VhcmNoRm9ybSxmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCB0eXBpbmcgdmFyaWFudHMgKHNwYWNlcywgY291bnRyeSBwcmVmaXgsIHBsYWNlIG5hbWUpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBwbGFpbiB6aXAgY29kZSBiYWNrLCBzbyBnZW9jb2RlciBhbmQgc2VydmVyIGdldCB0aGUgc2FtZSB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgemlwQ29kZVN0cmluZyA9IHdpbmRvdy53aE5vcm1hbGl6ZVppcENvZGUoJCgnI2FkZHJlc3NTZWFyY2gnKS52YWwoKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6aXBDb2RlU3RyaW5nICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjYWRkcmVzc1NlYXJjaCcpLnZhbCh6aXBDb2RlU3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHNBdmFpbGFibGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRkcmVzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhZGRyZXNzU2VhcmNoIikudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9jb2Rlci5nZW9jb2RlKCB7ICdhZGRyZXNzJzogYWRkcmVzc30sIGZ1bmN0aW9uKHJlc3VsdHMsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IGdvb2dsZS5tYXBzLkdlb2NvZGVyU3RhdHVzLk9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsYXQnKS52YWwocmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbi5sYXQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsb24nKS52YWwocmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbi5sbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VhcmNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiR2VvY29kZSB3YXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29uOiAiICsgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWFyY2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFwcyB1bmF2YWlsYWJsZTogc2VhcmNoIGJ5IHppcCBjb2RlIG9ubHkgKG5vIGRpc3RhbmNlIHNvcnRpbmcpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xhdCcpLnZhbCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsb24nKS52YWwoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNlYXJjaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xhdCcpLnZhbCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xvbicpLnZhbCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWFyY2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZWF2ZXMgdGhlIGdlb2xvY2F0aW9uIG1vZGUgc28gdGhlIHVzZXIgY2FuIHR5cGUgYSB6aXAgY29kZSByaWdodCBhd2F5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2VvbG9jYXRpb25GYWlsZWQobWVzc2FnZUtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvckNvbnRhaW5lciA9ICQoJyNnZW9sb2NhdGlvbi1lcnJvcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZW9sb2NhdGlvbi1sb2FkJykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZW9sb2NhdGlvbicpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2FkZHJlc3NTZWFyY2gnKS5hdHRyKCJyZWFkb25seSIsIGZhbHNlKS50cmlnZ2VyKCdmb2N1cycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29udGFpbmVyLnRleHQoZXJyb3JDb250YWluZXIuZGF0YShtZXNzYWdlS2V5KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZmluZEFkZHJlc3NDb21wb25lbnQocmVzdWx0LCB0eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5hZGRyZXNzX2NvbXBvbmVudHMuZmluZChmdW5jdGlvbiAoY29tcG9uZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQudHlwZXMuaW5kZXhPZih0eXBlKSAhPT0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkub24oJ2NoYW5nZScsICcjZ2VvbG9jYXRpb24nLGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdElkID0gKytnZW9sb2NhdGlvblJlcXVlc3RJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNDdXJyZW50UmVxdWVzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RJZCA9PT0gZ2VvbG9jYXRpb25SZXF1ZXN0SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tZXJyb3InKS50ZXh0KCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5pcygnOmNoZWNrZWQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjYWRkcmVzc1NlYXJjaCcpLmF0dHIoInJlYWRvbmx5IiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZW9sb2NhdGlvbi1sb2FkJykuY3NzKCdkaXNwbGF5JywnZmxleCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoJ2dlb2xvY2F0aW9uJyBpbiBuYXZpZ2F0b3IpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9sb2NhdGlvbkZhaWxlZCgndW5hdmFpbGFibGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihmdW5jdGlvbihwb3NpdGlvbil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudFJlcXVlc3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWFwc0F2YWlsYWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV2ZXJzZSBnZW9jb2RpbmcgKGNvb3JkcyAtPiB6aXApIG5lZWRzIE1hcHM7IGNhbm5vdCBjb250aW51ZSB3aXRob3V0IGl0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJNYXBzIHVuYXZhaWxhYmxlOiBnZW9sb2NhdGlvbiBzZWFyY2ggbmVlZHMgdGhlIE1hcHMgQVBJLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2xvY2F0aW9uRmFpbGVkKCd1bmF2YWlsYWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvaW50ID0gbmV3IGdvb2dsZS5tYXBzLkxhdExuZyhwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUsIHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydsb2NhdGlvbic6IHBvaW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0cywgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50UmVxdWVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHJlc3VsdCBpcyBub3QgYWx3YXlzIHRoZSBvbmUgY2FycnlpbmcgdGhlIHppcCBjb2RlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gKHN0YXR1cyA9PT0gZ29vZ2xlLm1hcHMuR2VvY29kZXJTdGF0dXMuT0sgJiYgcmVzdWx0cykgPyByZXN1bHRzLmZpbmQoZnVuY3Rpb24gKGNhbmRpZGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhZmluZEFkZHJlc3NDb21wb25lbnQoY2FuZGlkYXRlLCAncG9zdGFsX2NvZGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3N0YWxDb2RlID0gZmluZEFkZHJlc3NDb21wb25lbnQocmVzdWx0LCAncG9zdGFsX2NvZGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudHJ5Q29kZSA9IGZpbmRBZGRyZXNzQ29tcG9uZW50KHJlc3VsdCwgJ2NvdW50cnknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudHJ5U2VsZWN0ID0gJCgnI2NvdW50cnlTZWFyY2gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChjb3VudHJ5Q29kZSA/IGNvdW50cnlDb2RlLnNob3J0X25hbWUgOiAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RFJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeVNlbGVjdC52YWwoJ0QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ0gnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5U2VsZWN0LnZhbCgnQ0gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTFUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5U2VsZWN0LnZhbCgnTCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5U2VsZWN0LnZhbCgnRCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI2FkZHJlc3NTZWFyY2giKS52YWwocG9zdGFsQ29kZS5sb25nX25hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWxvYWQnKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjbGF0JykudmFsKHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjbG9uJykudmFsKHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VhcmNoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIlJldmVyc2UgZ2VvY29kaW5nIGZvdW5kIG5vIHppcCBjb2RlLiBTdGF0dXM6ICIgKyBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbG9jYXRpb25GYWlsZWQoJ3VuYXZhaWxhYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50UmVxdWVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlcnJvci5jb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlcnJvci5QRVJNSVNTSU9OX0RFTklFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbG9jYXRpb25GYWlsZWQoJ2RlbmllZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVycm9yLlRJTUVPVVQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2xvY2F0aW9uRmFpbGVkKCd0aW1lb3V0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBPU0lUSU9OX1VOQVZBSUxBQkxFLCBlLmcuIENvcmVMb2NhdGlvbiBrQ0xFcnJvckxvY2F0aW9uVW5rbm93biBvbiBtYWNPUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9sb2NhdGlvbkZhaWxlZCgndW5hdmFpbGFibGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSB6aXAgY29kZSBpcyBhbGwgd2UgbmVlZCwgc28gYSBjb2Fyc2Ugb3IgY2FjaGVkIHBvc2l0aW9uIGlzIGZpbmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogMTAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtQWdlOiAzMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjYWRkcmVzc1NlYXJjaCcpLmF0dHIoInJlYWRvbmx5IiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tbG9hZCcpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLm1lbnVCYXVmb3J1bVNlYXJjaCcpLm9uKCdzdWJtaXQnLGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNhZGRyZXNzU2VhcmNoJykudmFsKCQodGhpcykuZmluZCgnLnppcC1zZWFyY2gtaW5wdXQnKS52YWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLm5hdi1vdmVybGF5JykucmVtb3ZlQ2xhc3MoJ29wZW4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ25vc2Nyb2xsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNjcm9sbFRvID0gJCgnI3ppcC1hbmNob3InKS5vZmZzZXQoKS50b3AgLSAkKCcuaGVhZGVyLXdyYXBwZXInKS5vdXRlckhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7dG9wOiBzY3JvbGxUbywgYmVoYXZpb3I6ICdzbW9vdGgnfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dFJhbmdlU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJhZGl1cyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2VWYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyYW5nZVZhbHVlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbml0VmFsUGVyY2VudCA9IChpbnB1dFJhbmdlU2xpZGVyLnZhbHVlQXNOdW1iZXIgIC0gcGFyc2VJbnQoaW5wdXRSYW5nZVNsaWRlci5taW4pKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyc2VJbnQoaW5wdXRSYW5nZVNsaWRlci5tYXgpIC0gcGFyc2VJbnQoaW5wdXRSYW5nZVNsaWRlci5taW4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRSYW5nZVNsaWRlci5zdHlsZSA9ICdiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgMCUgMCUsIDEwMCUgMCUsIGNvbG9yLXN0b3AoJyArIGluaXRWYWxQZXJjZW50ICsgJywgI0EwMDAwMCksIGNvbG9yLXN0b3AoJyArIGluaXRWYWxQZXJjZW50ICsgJywgI2U1ZTVlMykpOyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVZhbHVlLmlubmVySFRNTCA9IGlucHV0UmFuZ2VTbGlkZXIudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UmFuZ2VTbGlkZXIuaW5uZXJIVE1MID0gaW5wdXRSYW5nZVNsaWRlci52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRSYW5nZVNsaWRlci5vbmlucHV0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVZhbHVlLmlubmVySFRNTCA9IHRoaXMudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbFBlcmNlbnQgPSAoaW5wdXRSYW5nZVNsaWRlci52YWx1ZUFzTnVtYmVyICAtIHBhcnNlSW50KGlucHV0UmFuZ2VTbGlkZXIubWluKSkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJzZUludChpbnB1dFJhbmdlU2xpZGVyLm1heCkgLSBwYXJzZUludChpbnB1dFJhbmdlU2xpZGVyLm1pbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRSYW5nZVNsaWRlci5zdHlsZSA9ICdiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgMCUgMCUsIDEwMCUgMCUsIGNvbG9yLXN0b3AoJyArIHZhbFBlcmNlbnQgKyAnLCAjQTAwMDAwKSwgY29sb3Itc3RvcCgnICsgdmFsUGVyY2VudCArICcsICNlNWU1ZTMpKTsnOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIA==
Mit Klick auf Google Maps willige ich in die Verarbeitung meiner Daten durch Google ein. Diese Einwilligung kann jederzeit mit Wirkung für die Zukunft widerrufen werden. Weitere Informationen können unserer Datenschutzerklärung entnommen werden.
Alle Bauforen auf einen Blick
Montreux
Agence Suisse Romande
Avenue des Alpes 80 B
1820 Montreux
Tel:
079 9372180
Zum Bauforum
Thun
Zelglistrasse 6
3608 Thun
Tel:
078 8809001
Zum Bauforum
Zofingen
Brühlstrasse 5
4800 Zofingen
Tel:
079 502 77 19
Zum Bauforum
Kreuzlingen
Müligässli 1
8598 Bottighofen
Tel:
044 945 27 27
Zum Bauforum
