Anmeldung erforderlich
Bitte melde dich zuerst im Kurs an, um die Pruefung zu starten.
Zur Anmeldung🔒
Abschlusspruefung gesperrt
Alle Module muessen zu mindestens 95 % angesehen werden.
Zurueck zum Kurs
← Zurueck zum Kurs
Abschlusspruefung
Beantworte alle Fragen. Unbegrenzte Versuche. Fuer die Teilnahmebestaetigung sind mindestens 70 % erforderlich.
Fragen werden geladen …
🎉
Pruefung abgeschlossen
Dein Ergebnis wird in der Teilnahmebestaetigung vermerkt.
–
–
Mindestens 70 % erforderlich. Du kannst die Pruefung unbegrenzt wiederholen.
KGZ1bmN0aW9uKCl7CiAgdmFyIEtVUlNfSUQgPSAiMjkiOwogIHZhciBRVUlaX0FQSSA9ICJodHRwczovL2FwaS5kamliaW5oby5jb20vcHJveHkucGhwP1NlcnZpY2U9IjsKICB2YXIgU0VDUkVUX1BBUlRTID0gWyJESklCSU5IT0FQUCIsIFN0cmluZy5mcm9tQ2hhckNvZGUoNjQpLCAiR0syNzA5IiwgU3RyaW5nLmZyb21DaGFyQ29kZSgzNSldOwogIHZhciBBUFBfU0VDUkVUID0gU0VDUkVUX1BBUlRTLmpvaW4oIiIpOwoKICB2YXIgJCA9IGZ1bmN0aW9uKGlkKXsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsgfTsKICB2YXIgcXVlc3Rpb25zID0gW107CiAgdmFyIGFuc3dlcnMgPSB7fTsKCiAgZnVuY3Rpb24gZ2V0VXNlcigpewogICAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oImRqYl91c2VyIikgfHwgIm51bGwiKTsgfQogICAgY2F0Y2goZSl7IHJldHVybiBudWxsOyB9CiAgfQoKICAvLyBEZW5ldGNpIChQcnVlZmVyKTogNjc1NiBpbGUgQVlOSSBsaXN0ZS4gRS1wb3N0YSBidSBsaXN0ZWRleXNlIG1lZHlhIGthcGlzaSBhdGxhbmlyLgogIHZhciBBVURJVE9SX0VNQUlMUyA9IFsicHJ1ZWZlbkBkamliaW5oby5jb20iXTsKICBmdW5jdGlvbiBpc0F1ZGl0b3IodXNlcil7CiAgICB2YXIgZSA9ICh1c2VyICYmIHVzZXIuZW1haWwgPyB1c2VyLmVtYWlsIDogIiIpLnRvTG93ZXJDYXNlKCk7CiAgICByZXR1cm4gQVVESVRPUl9FTUFJTFMuaW5kZXhPZihlKSA+PSAwOwogIH0KCiAgZnVuY3Rpb24gcXVpekZldGNoKHNlcnZpY2UsIHBheWxvYWQpewogICAgdmFyIHVzZXIgPSBnZXRVc2VyKCkgfHwge307CiAgICByZXR1cm4gZmV0Y2goUVVJWl9BUEkgKyBzZXJ2aWNlLCB7CiAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICBoZWFkZXJzOiB7CiAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAiQXV0aC1Ub2tlbiI6IHVzZXIuYXV0aF90b2tlbiB8fCAiIgogICAgICB9LAogICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKQogICAgfSkudGhlbihmdW5jdGlvbihyKXsgcmV0dXJuIHIuanNvbigpOyB9KTsKICB9CgogIGZ1bmN0aW9uIHNob3dFcnJvcihtc2cpewogICAgdmFyIGUgPSAkKCJoa3AtZXJyb3IiKTsKICAgIGUudGV4dENvbnRlbnQgPSBtc2c7CiAgICBlLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogIH0KICBmdW5jdGlvbiBoaWRlRXJyb3IoKXsgJCgiaGtwLWVycm9yIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsgfQoKICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpewogICAgcmV0dXJuIFN0cmluZyhzID09IG51bGwgPyAiIiA6IHMpCiAgICAgIC5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7Iik7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRTY29yZShzKXsKICAgIHZhciBuID0gcGFyc2VGbG9hdChzKTsKICAgIGlmKGlzTmFOKG4pKSByZXR1cm4gIjAiOwogICAgcmV0dXJuIChuICUgMSA9PT0gMCkgPyBuLnRvRml4ZWQoMCkgOiBuLnRvRml4ZWQoMSk7CiAgfQoKICBmdW5jdGlvbiBsb2FkUXVlc3Rpb25zKCl7CiAgICBoaWRlRXJyb3IoKTsKICAgIGFuc3dlcnMgPSB7fTsKICAgICQoImhrcC1xdWVzdGlvbnMiKS5pbm5lckhUTUwgPSAiIjsKICAgICQoImhrcC1zdWJtaXQtd3JhcCIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAkKCJoa3AtcmVzdWx0Iikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICQoImhrcC1tYWluIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CiAgICAkKCJoa3AtbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwoKICAgIHF1aXpGZXRjaCgiZ2V0UXVpelF1ZXN0aW9ucyIsIHsga3Vyc19pZDogS1VSU19JRCB9KQogICAgICAudGhlbihmdW5jdGlvbihyZXMpewogICAgICAgICQoImhrcC1sb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICB2YXIgbGlzdCA9IEFycmF5LmlzQXJyYXkocmVzKSA/IHJlcyA6IChyZXMgJiYgcmVzLmRhdGEgJiYgcmVzLmRhdGEubGVuZ3RoID8gcmVzLmRhdGEgOiBudWxsKTsKICAgICAgICBpZihsaXN0ICYmIGxpc3QubGVuZ3RoKXsKICAgICAgICAgIHF1ZXN0aW9ucyA9IGxpc3Q7CiAgICAgICAgICByZW5kZXJRdWVzdGlvbnMoKTsKICAgICAgICAgICQoImhrcC1zdWJtaXQtd3JhcCIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzaG93RXJyb3IoIkZ1ZXIgZGllc2VuIEt1cnMgc2luZCBub2NoIGtlaW5lIFBydWVmdW5nc2ZyYWdlbiBoaW50ZXJsZWd0LiIpOwogICAgICAgIH0KICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uKCl7CiAgICAgICAgJCgiaGtwLWxvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIHNob3dFcnJvcigiVmVyYmluZHVuZ3NmZWhsZXIuIEZyYWdlbiBrb25udGVuIG5pY2h0IGdlbGFkZW4gd2VyZGVuLiIpOwogICAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlbmRlclF1ZXN0aW9ucygpewogICAgdmFyIGJveCA9ICQoImhrcC1xdWVzdGlvbnMiKTsKICAgIGJveC5pbm5lckhUTUwgPSAiIjsKICAgIHF1ZXN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHEsIGlkeCl7CiAgICAgIHZhciBjYXJkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgIGNhcmQuc3R5bGUuY3NzVGV4dCA9ICJiYWNrZ3JvdW5kOiMxNzE3MWI7Ym9yZGVyOjFweCBzb2xpZCAjMmEyYTMxO2JvcmRlci1yYWRpdXM6MTRweDtwYWRkaW5nOjIwcHg7Y29sb3I6I2ZmZjsiOwogICAgICB2YXIgb3B0cyA9IFsKICAgICAgICBbImEiLCBxLm9wdGlvbl9hXSwgWyJiIiwgcS5vcHRpb25fYl0sCiAgICAgICAgWyJjIiwgcS5vcHRpb25fY10sIFsiZCIsIHEub3B0aW9uX2RdCiAgICAgIF07CiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9ImZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjEycHg7Y29sb3I6I2ZmZjsiPicKICAgICAgICArIChpZHgrMSkgKyAnLiAnICsgZXNjYXBlSHRtbChxLnF1ZXN0aW9uX3RleHQpICsgJzwvZGl2PicKICAgICAgICArICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDo4cHg7Ij4nOwogICAgICBvcHRzLmZvckVhY2goZnVuY3Rpb24obyl7CiAgICAgICAgaWYob1sxXSA9PSBudWxsIHx8IG9bMV0gPT09ICIiKSByZXR1cm47CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iaGtwLW9wdCIgZGF0YS1xaWQ9IicgKyBxLnF1ZXN0aW9uX2lkICsgJyIgZGF0YS1vcHQ9IicgKyBvWzBdICsgJyIgJwogICAgICAgICAgKyAnc3R5bGU9InBhZGRpbmc6MTFweCAxNHB4O2JvcmRlci1yYWRpdXM6OXB4O2N1cnNvcjpwb2ludGVyO2JvcmRlcjoxcHggc29saWQgIzJhMmEzMTtmb250LXNpemU6MTRweDtjb2xvcjojZmZmOyI+JwogICAgICAgICAgKyAnPGIgc3R5bGU9ImNvbG9yOiNmNDdiMjA7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO21hcmdpbi1yaWdodDo4cHg7Ij4nICsgb1swXSArICc8L2I+JwogICAgICAgICAgKyBlc2NhcGVIdG1sKG9bMV0pICsgJzwvZGl2Pic7CiAgICAgIH0pOwogICAgICBodG1sICs9ICc8L2Rpdj4nOwogICAgICBjYXJkLmlubmVySFRNTCA9IGh0bWw7CiAgICAgIGJveC5hcHBlbmRDaGlsZChjYXJkKTsKICAgIH0pOwoKICAgIHZhciBvcHRpb25FbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaGtwLW9wdCIpOwogICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvcHRpb25FbHMsIGZ1bmN0aW9uKGVsKXsKICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbigpewogICAgICAgIHZhciBxaWQgPSBlbC5nZXRBdHRyaWJ1dGUoImRhdGEtcWlkIik7CiAgICAgICAgdmFyIG9wdCA9IGVsLmdldEF0dHJpYnV0ZSgiZGF0YS1vcHQiKTsKICAgICAgICBhbnN3ZXJzW3FpZF0gPSBvcHQ7CiAgICAgICAgdmFyIHNpYmxpbmdzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhrcC1vcHRbZGF0YS1xaWQ9IicgKyBxaWQgKyAnIl0nKTsKICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHNpYmxpbmdzLCBmdW5jdGlvbihzaWIpewogICAgICAgICAgc2liLnN0eWxlLmJvcmRlciA9ICIxcHggc29saWQgIzJhMmEzMSI7CiAgICAgICAgICBzaWIuc3R5bGUuYmFja2dyb3VuZCA9ICJ0cmFuc3BhcmVudCI7CiAgICAgICAgfSk7CiAgICAgICAgZWwuc3R5bGUuYm9yZGVyID0gIjFweCBzb2xpZCAjZjQ3YjIwIjsKICAgICAgICBlbC5zdHlsZS5iYWNrZ3JvdW5kID0gIiM1YTNhMWM0NCI7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzdWJtaXRFeGFtKCl7CiAgICBpZihPYmplY3Qua2V5cyhhbnN3ZXJzKS5sZW5ndGggPCBxdWVzdGlvbnMubGVuZ3RoKXsKICAgICAgc2hvd0Vycm9yKCJCaXR0ZSBiZWFudHdvcnRlIGFsbGUgRnJhZ2VuLCBiZXZvciBkdSBhYmdpYnN0LiIpOwogICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwwKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaGlkZUVycm9yKCk7CgogICAgdmFyIHBheWxvYWQgPSBxdWVzdGlvbnMubWFwKGZ1bmN0aW9uKHEpewogICAgICByZXR1cm4gewogICAgICAgIHF1ZXN0aW9uX2lkOiBwYXJzZUludChxLnF1ZXN0aW9uX2lkLCAxMCksCiAgICAgICAgc2VsZWN0ZWRfb3B0aW9uOiBhbnN3ZXJzW3EucXVlc3Rpb25faWRdCiAgICAgIH07CiAgICB9KTsKCiAgICB2YXIgYnRuID0gJCgiaGtwLXN1Ym1pdC1idG4iKTsKICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICBidG4uc3R5bGUub3BhY2l0eSA9ICIwLjciOwogICAgYnRuLnRleHRDb250ZW50ID0gIldpcmQgYWJnZWdlYmVuIC4uLiI7CgogICAgcXVpekZldGNoKCJzdWJtaXRRdWl6IiwgeyBrdXJzX2lkOiBLVVJTX0lELCBhbnN3ZXJzOiBwYXlsb2FkIH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAiMSI7CiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gIlBydWVmdW5nIGFiZ2ViZW4iOwogICAgICAgIHZhciByZXN1bHQgPSAocmVzICYmIHJlcy5kYXRhKSA/IHJlcy5kYXRhIDogcmVzOwogICAgICAgIGlmKHJlc3VsdCAmJiByZXN1bHQuc2NvcmVfcGVyY2VudGFnZSAhPSBudWxsKXsKICAgICAgICAgIHNob3dSZXN1bHQocmVzdWx0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2hvd0Vycm9yKChyZXMgJiYgcmVzLm1lc3NhZ2UpID8gcmVzLm1lc3NhZ2UgOiAiQWJnYWJlIGZlaGxnZXNjaGxhZ2VuLiIpOwogICAgICAgIH0KICAgICAgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9uKCl7CiAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAiMSI7CiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gIlBydWVmdW5nIGFiZ2ViZW4iOwogICAgICAgIHNob3dFcnJvcigiVmVyYmluZHVuZ3NmZWhsZXIgYmVpIGRlciBBYmdhYmUuIik7CiAgICAgIH0pOwogIH0KCiAgdmFyIGxhc3RSZXN1bHQgPSBudWxsOwoKICBmdW5jdGlvbiBzaG93UmVzdWx0KGQpewogICAgbGFzdFJlc3VsdCA9IGQ7CiAgICAkKCJoa3AtbWFpbiIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAkKCJoa3AtcmVzdWx0Iikuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CiAgICAkKCJoa3Atc2NvcmUiKS50ZXh0Q29udGVudCA9IGZvcm1hdFNjb3JlKGQuc2NvcmVfcGVyY2VudGFnZSkgKyAiJSI7CiAgICAkKCJoa3Atc2NvcmUtZGV0YWlsIikudGV4dENvbnRlbnQgPSBkLmNvcnJlY3RfYW5zd2VycyArICIgdm9uICIgKyBkLnRvdGFsX3F1ZXN0aW9ucyArICIgcmljaHRpZyI7CiAgICBhcHBseUNlcnRHYXRlKGQpOwogICAgLy8gYmFyYWogYWx0aW5kYSBiZWxnZSBpbm1peW9yIC0+IG1ldGluIHlhbmlsdG1hc2luIChoYXNQYXNzZWQ6IEdvcmV2IDYpCiAgICB2YXIgcm4gPSAkKCJoa3AtcmVzdWx0LW5vdGUiKTsKICAgIGlmKHJuKXsKICAgICAgcm4udGV4dENvbnRlbnQgPSBoYXNQYXNzZWQoZCkKICAgICAgICA/ICJEZWluIEVyZ2VibmlzIHdpcmQgaW4gZGVyIFRlaWxuYWhtZWJlc3RhZXRpZ3VuZyB2ZXJtZXJrdC4iCiAgICAgICAgOiAiRGVpbiBFcmdlYm5pcyB3aXJkIG5vY2ggbmljaHQgaW4gZGVyIFRlaWxuYWhtZWJlc3RhZXRpZ3VuZyB2ZXJtZXJrdC4iOwogICAgfQogICAgd2luZG93LnNjcm9sbFRvKDAsMCk7CiAgfQoKICAvLyAtLS0tIEJFTEdFIEtBUElTSTogc2VydGlmaWthL0dLViB5YWxuaXpjYSBiYXJhamluIHVzdHVuZGUgLS0tLQogIC8vIE9uY2Ugc3VibWl0UXVpeidpbiAicGFzc2VkIiBhbGFuaTsgeW9rc2Egc2NvcmVfcGVyY2VudGFnZSBpbGUgcGFzc190aHJlc2hvbGQga2Fyc2lsYXN0aXJpbGlyLgogIGZ1bmN0aW9uIGhhc1Bhc3NlZChkKXsKICAgIGlmKGQgJiYgZC5wYXNzZWQgIT0gbnVsbCl7CiAgICAgIHJldHVybiAoZC5wYXNzZWQgPT09IHRydWUgfHwgZC5wYXNzZWQgPT09IDEgfHwgZC5wYXNzZWQgPT09ICIxIiB8fCBkLnBhc3NlZCA9PT0gInRydWUiKTsKICAgIH0KICAgIHZhciBuID0gcGFyc2VGbG9hdChkID8gZC5zY29yZV9wZXJjZW50YWdlIDogbnVsbCk7CiAgICByZXR1cm4gaXNGaW5pdGUobikgJiYgbiA+PSBwYXNzVGhyZXNob2xkOwogIH0KCiAgZnVuY3Rpb24gYXBwbHlDZXJ0R2F0ZShkKXsKICAgIHZhciBvayA9IGhhc1Bhc3NlZChkKTsKICAgIHZhciBjYiA9ICQoImhrcC1jZXJ0LWJ0biIpLCB6YiA9ICQoImhrcC16cHAtYnRuIiksIG5vdGUgPSAkKCJoa3AtY2VydC1sb2NrZWQiKTsKICAgIGlmKGNiKXsgY2Iuc3R5bGUuZGlzcGxheSA9IG9rID8gIiIgOiAibm9uZSI7IH0KICAgIGlmKHpiKXsgemIuc3R5bGUuZGlzcGxheSA9IG9rID8gIiIgOiAibm9uZSI7IH0KICAgIGlmKG5vdGUpewogICAgICBpZihvayl7CiAgICAgICAgbm90ZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICB9IGVsc2UgewogICAgICAgIG5vdGUudGV4dENvbnRlbnQgPSAiTWluZGVzdGVucyAiICsgZm9ybWF0U2NvcmUocGFzc1RocmVzaG9sZCkgKyAiICUgZXJmb3JkZXJsaWNoLiBEdSBrYW5uc3QgZGllIFBydWVmdW5nIHVuYmVncmVuenQgd2llZGVyaG9sZW4uIjsKICAgICAgICBub3RlLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYWQyKG4peyByZXR1cm4gKG4gPCAxMCA/ICIwIiA6ICIiKSArIG47IH0KCiAgZnVuY3Rpb24gdG9kYXlTdHIoKXsKICAgIHZhciB0ID0gbmV3IERhdGUoKTsKICAgIHJldHVybiBwYWQyKHQuZ2V0RGF0ZSgpKSArICIuIiArIHBhZDIodC5nZXRNb250aCgpKzEpICsgIi4iICsgdC5nZXRGdWxsWWVhcigpOwogIH0KCiAgZnVuY3Rpb24gcGFyc2VEYXRlKHMpewogICAgaWYoIXMpIHJldHVybiB0b2RheVN0cigpOwogICAgdmFyIGQgPSBTdHJpbmcocykuc3BsaXQoIiAiKVswXTsKICAgIHZhciBwID0gZC5zcGxpdCgiLSIpOwogICAgaWYocC5sZW5ndGggPT09IDMpIHJldHVybiBwWzJdICsgIi4iICsgcFsxXSArICIuIiArIHBbMF07CiAgICByZXR1cm4gdG9kYXlTdHIoKTsKICB9CgogIGZ1bmN0aW9uIG1ha2VWZXJpZnlJZCgpewogICAgdmFyIHQgPSAiSEstIiArIEtVUlNfSUQgKyAiLSI7CiAgICB2YXIgY2hhcnMgPSAiQUJDREVGR0hKS0xNTlBRUlNUVVZXWFlaMjM0NTY3ODkiOwogICAgZm9yKHZhciBpPTA7aTw2O2krKyl7IHQgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjaGFycy5sZW5ndGgpKTsgfQogICAgcmV0dXJuIHQ7CiAgfQoKICBmdW5jdGlvbiBsb2FkU2NyaXB0KHNyYyl7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgcy5zcmMgPSBzcmM7CiAgICAgIHMub25sb2FkID0gcmVzb2x2ZTsKICAgICAgcy5vbmVycm9yID0gcmVqZWN0OwogICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBnZW5lcmF0ZUNlcnRpZmljYXRlKCl7CiAgICB2YXIgdXNlciA9IGdldFVzZXIoKSB8fCB7fTsKICAgIHZhciBuYW1lID0gdXNlci5mdWxsX25hbWUgfHwgIlRlaWxuZWhtZXIiOwogICAgdmFyIGNvdXJzZSA9ICJIZWxkZW4tVHJhaW5pbmc6IE1lbnRhbGUgU3RhZXJrZSI7CiAgICB2YXIgc2NvcmUgPSBsYXN0UmVzdWx0ID8gZm9ybWF0U2NvcmUobGFzdFJlc3VsdC5zY29yZV9wZXJjZW50YWdlKSA6ICIwIjsKICAgIHZhciBkYXRlU3RyID0gbGFzdFJlc3VsdCA/IHBhcnNlRGF0ZShsYXN0UmVzdWx0LmNvbXBsZXRlZF9hdCkgOiB0b2RheVN0cigpOwogICAgdmFyIHZlcmlmeUlkID0gbWFrZVZlcmlmeUlkKCk7CgogICAgdmFyIGJ0biA9ICQoImhrcC1jZXJ0LWJ0biIpOwogICAgaWYoYnRuKXsgYnRuLmRpc2FibGVkID0gdHJ1ZTsgYnRuLnRleHRDb250ZW50ID0gIlplcnRpZmlrYXQgd2lyZCBlcnN0ZWxsdCAuLi4iOyB9CgogICAgdmFyIHJlYWR5ID0gKHR5cGVvZiB3aW5kb3cuanNwZGYgIT09ICJ1bmRlZmluZWQiICYmIHdpbmRvdy5qc3BkZi5qc1BERikKICAgICAgPyBQcm9taXNlLnJlc29sdmUoKQogICAgICA6IGxvYWRTY3JpcHQoImh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2pzcGRmLzIuNS4xL2pzcGRmLnVtZC5taW4uanMiKTsKCiAgICByZWFkeS50aGVuKGZ1bmN0aW9uKCl7CiAgICAgIHZhciBqc1BERiA9IHdpbmRvdy5qc3BkZi5qc1BERjsKICAgICAgdmFyIGRvYyA9IG5ldyBqc1BERih7IG9yaWVudGF0aW9uOiAibGFuZHNjYXBlIiwgdW5pdDogIm1tIiwgZm9ybWF0OiAiYTQiIH0pOwogICAgICB2YXIgVyA9IDI5NywgSCA9IDIxMDsKCiAgICAgIC8vIGFya2EgcGxhbgogICAgICBkb2Muc2V0RmlsbENvbG9yKDI1MCwgMjQ4LCAyNDMpOwogICAgICBkb2MucmVjdCgwLCAwLCBXLCBILCAiRiIpOwoKICAgICAgLy8gZGlzIGNlcmNldmUgKHR1cnVuY3UpCiAgICAgIGRvYy5zZXREcmF3Q29sb3IoMjQ0LCAxMjMsIDMyKTsKICAgICAgZG9jLnNldExpbmVXaWR0aCgyKTsKICAgICAgZG9jLnJlY3QoMTAsIDEwLCBXLTIwLCBILTIwKTsKICAgICAgZG9jLnNldExpbmVXaWR0aCgwLjQpOwogICAgICBkb2MucmVjdCgxNCwgMTQsIFctMjgsIEgtMjgpOwoKICAgICAgLy8gdXN0IGV0aWtldAogICAgICBkb2Muc2V0VGV4dENvbG9yKDE1NCwgMTIzLCA3OSk7CiAgICAgIGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAibm9ybWFsIik7CiAgICAgIGRvYy5zZXRGb250U2l6ZSgxMSk7CiAgICAgIGRvYy50ZXh0KCJESklCSU5ITyAgLSAgSEVMREVOIEtVUlNFIiwgVy8yLCAzNCwgeyBhbGlnbjogImNlbnRlciIgfSk7CgogICAgICAvLyBiYXNsaWsKICAgICAgZG9jLnNldFRleHRDb2xvcigyNiwgMjYsIDI2KTsKICAgICAgZG9jLnNldEZvbnQoImhlbHZldGljYSIsICJib2xkIik7CiAgICAgIGRvYy5zZXRGb250U2l6ZSgzMik7CiAgICAgIGRvYy50ZXh0KCJUZWlsbmFobWViZXN0YWV0aWd1bmciLCBXLzIsIDUyLCB7IGFsaWduOiAiY2VudGVyIiB9KTsKCiAgICAgIC8vIGF5cmFjCiAgICAgIGRvYy5zZXREcmF3Q29sb3IoMjE2LCAyMDEsIDE3Nik7CiAgICAgIGRvYy5zZXRMaW5lV2lkdGgoMC42KTsKICAgICAgZG9jLmxpbmUoVy8yLTQwLCA1OCwgVy8yKzQwLCA1OCk7CgogICAgICAvLyBtZXRpbgogICAgICBkb2Muc2V0VGV4dENvbG9yKDg1LCA4NSwgODUpOwogICAgICBkb2Muc2V0Rm9udCgiaGVsdmV0aWNhIiwgIm5vcm1hbCIpOwogICAgICBkb2Muc2V0Rm9udFNpemUoMTQpOwogICAgICBkb2MudGV4dCgiSGllcm1pdCB3aXJkIGJlc3RhZXRpZ3QsIGRhc3MiLCBXLzIsIDc0LCB7IGFsaWduOiAiY2VudGVyIiB9KTsKCiAgICAgIC8vIGFkCiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMjYsIDI2LCAyNik7CiAgICAgIGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAiYm9sZCIpOwogICAgICBkb2Muc2V0Rm9udFNpemUoMjYpOwogICAgICBkb2MudGV4dChuYW1lLCBXLzIsIDg4LCB7IGFsaWduOiAiY2VudGVyIiB9KTsKCiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoODUsIDg1LCA4NSk7CiAgICAgIGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAibm9ybWFsIik7CiAgICAgIGRvYy5zZXRGb250U2l6ZSgxNCk7CiAgICAgIGRvYy50ZXh0KCJkZW4gZm9sZ2VuZGVuIEt1cnMgZXJmb2xncmVpY2ggYWJzb2x2aWVydCBoYXQ6IiwgVy8yLCAxMDAsIHsgYWxpZ246ICJjZW50ZXIiIH0pOwoKICAgICAgLy8ga3VycyBhZGkKICAgICAgZG9jLnNldFRleHRDb2xvcigyNiwgMjYsIDI2KTsKICAgICAgZG9jLnNldEZvbnQoImhlbHZldGljYSIsICJib2xkIik7CiAgICAgIGRvYy5zZXRGb250U2l6ZSgxOCk7CiAgICAgIGRvYy50ZXh0KGNvdXJzZSwgVy8yLCAxMTQsIHsgYWxpZ246ICJjZW50ZXIiIH0pOwoKICAgICAgLy8gYWx0IGJpbGdpIHNhdGlyaSAoc2tvciAvIHRhcmloIC8gaWQpCiAgICAgIHZhciB5ID0gMTQyOwogICAgICBkb2Muc2V0RHJhd0NvbG9yKDIxNiwgMjAxLCAxNzYpOwogICAgICBkb2Muc2V0TGluZVdpZHRoKDAuNCk7CiAgICAgIGRvYy5saW5lKDQwLCB5LTgsIFctNDAsIHktOCk7CgogICAgICBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgICBkb2Muc2V0VGV4dENvbG9yKDE1NCwgMTIzLCA3OSk7CiAgICAgIGRvYy50ZXh0KCJFUkdFQk5JUyIsIDcwLCB5LCB7IGFsaWduOiAiY2VudGVyIiB9KTsKICAgICAgZG9jLnRleHQoIkRBVFVNIiwgVy8yLCB5LCB7IGFsaWduOiAiY2VudGVyIiB9KTsKICAgICAgZG9jLnRleHQoIkJFU1RBRVRJR1VOR1MtSUQiLCBXLTcwLCB5LCB7IGFsaWduOiAiY2VudGVyIiB9KTsKCiAgICAgIGRvYy5zZXRGb250U2l6ZSgxNCk7CiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMjYsIDI2LCAyNik7CiAgICAgIGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAiYm9sZCIpOwogICAgICBkb2MudGV4dChzY29yZSArICIlIiwgNzAsIHkrOCwgeyBhbGlnbjogImNlbnRlciIgfSk7CiAgICAgIGRvYy50ZXh0KGRhdGVTdHIsIFcvMiwgeSs4LCB7IGFsaWduOiAiY2VudGVyIiB9KTsKICAgICAgZG9jLnRleHQodmVyaWZ5SWQsIFctNzAsIHkrOCwgeyBhbGlnbjogImNlbnRlciIgfSk7CgogICAgICAvLyBhbHQgbm90CiAgICAgIGRvYy5zZXRGb250KCJoZWx2ZXRpY2EiLCAibm9ybWFsIik7CiAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgZG9jLnNldFRleHRDb2xvcigxNDAsIDE0MCwgMTQwKTsKICAgICAgZG9jLnRleHQoIktlaW5lIEJld2VydHVuZyBpbSBTaW5uZSBlaW5lciBQcnVlZnVuZ3Nub3RlLiBCZXNjaGVpbmlndCBkaWUgVGVpbG5haG1lLiIsIFcvMiwgSC0yNiwgeyBhbGlnbjogImNlbnRlciIgfSk7CgogICAgICB2YXIgZmlsZU5hbWUgPSAiVGVpbG5haG1lYmVzdGFldGlndW5nXyIgKyBuYW1lLnJlcGxhY2UoL1teQS1aYS16MC05XS9nLCAiXyIpICsgIi5wZGYiOwogICAgICBkb2Muc2F2ZShmaWxlTmFtZSk7CgogICAgICBpZihidG4peyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLnRleHRDb250ZW50ID0gIlplcnRpZmlrYXQgaGVydW50ZXJsYWRlbiI7IH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmKGJ0bil7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBidG4udGV4dENvbnRlbnQgPSAiWmVydGlmaWthdCBoZXJ1bnRlcmxhZGVuIjsgfQogICAgICBzaG93RXJyb3IoIlplcnRpZmlrYXQga29ubnRlIG5pY2h0IGVyc3RlbGx0IHdlcmRlbi4iKTsKICAgIH0pOwogIH0KCiAgLy8gLS0tLSBTSU5BViBLQVBJU0k6IHR1bSBtb2R1bGxlciA+PSAlOTUgaXpsZW5tZWRlbiBzb3J1bGFyaSB5dWtsZW1lIC0tLS0KICB2YXIgR0FURV9QRVJDRU5UID0gOTU7ICAgLy8ga3VycyBzYXlmYXNpbmRha2kgVU5MT0NLX1BFUkNFTlQgaWxlIGF5bmkgZXNpawoKICAvLyAtLS0tIEJlbGdlIGJhcmFqaTogZ2V0SGVsZGVuS3Vyc2UucGFzc190aHJlc2hvbGQgKCI3MC4wMCIpOyBnZWxtZXovYm96dWtzYSA3MCAtLS0tCiAgdmFyIHBhc3NUaHJlc2hvbGQgPSA3MDsKCiAgLy8gIjk5IiAvICI5OS4wMCIgLyAiOTksNSIgLT4gIjk5LDAwIiAoMiBoYW5lLCBvbmRhbGlrIGF5cmFjaSB2aXJndWwpLgogIC8vIEdlY2Vyc2l6L2Jvcy8wL251bGwgLT4gIiIgKEdLViBmb3JtdW5kYSB1Y3JldCBhbGFuaSBCT1Mga2FsaXIsIGtpc2kgZWxsZSBkb2xkdXJ1cikuCiAgZnVuY3Rpb24gZm9ybWF0UHJpemUocCl7CiAgICBpZihwID09IG51bGwpIHJldHVybiAiIjsKICAgIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcocCkudHJpbSgpLnJlcGxhY2UoIiwiLCAiLiIpKTsKICAgIGlmKCFpc0Zpbml0ZShuKSB8fCBuIDw9IDApIHJldHVybiAiIjsKICAgIHJldHVybiBuLnRvRml4ZWQoMikucmVwbGFjZSgiLiIsICIsIik7CiAgfQoKICBmdW5jdGlvbiBsb2FkUGFzc1RocmVzaG9sZCgpewogICAgcXVpekZldGNoKCJnZXRIZWxkZW5LdXJzZSIsIHt9KQogICAgICAudGhlbihmdW5jdGlvbihyZXMpewogICAgICAgIHZhciB0ID0gbnVsbDsKICAgICAgICBpZihyZXMgJiYgcmVzLnBhc3NfdGhyZXNob2xkICE9IG51bGwpeyB0ID0gcmVzLnBhc3NfdGhyZXNob2xkOyB9CiAgICAgICAgZWxzZSBpZihyZXMgJiYgcmVzLmRhdGEgJiYgcmVzLmRhdGEucGFzc190aHJlc2hvbGQgIT0gbnVsbCl7IHQgPSByZXMuZGF0YS5wYXNzX3RocmVzaG9sZDsgfQogICAgICAgIHZhciBuID0gcGFyc2VGbG9hdCh0KTsKICAgICAgICBpZihpc0Zpbml0ZShuKSAmJiBuID4gMCAmJiBuIDw9IDEwMCl7IHBhc3NUaHJlc2hvbGQgPSBuOyB9CiAgICAgICAgLy8gNGI6IEFZTkkgeWFuaXR0YW4gZml5YXRpIGFsIChpa2luY2kgaXN0ZWsgeW9rKSAtPiBHS1YgZm9ybXVuZGFraSB1Y3JldAogICAgICAgIFpQUC5nZWJ1ZWhyID0gZm9ybWF0UHJpemUocmVzICYmIHJlcy5kYXRhID8gcmVzLmRhdGEucHJpemUgOiBudWxsKTsKICAgICAgICAvLyBnaXJpcyBtZXRuaW5kZWtpIGJhcmFqaSBnZXJjZWsgZXNpa2xlIGd1bmNlbGxlIChoYXJkY29kZSB5b2spCiAgICAgICAgdmFyIGludHJvID0gJCgiaGtwLWludHJvLW5vdGUiKTsKICAgICAgICBpZihpbnRybyl7IGludHJvLnRleHRDb250ZW50ID0gIkJlYW50d29ydGUgYWxsZSBGcmFnZW4uIFVuYmVncmVuenRlIFZlcnN1Y2hlLiBGdWVyIGRpZSBUZWlsbmFobWViZXN0YWV0aWd1bmcgc2luZCBtaW5kZXN0ZW5zICIgKyBmb3JtYXRTY29yZShwYXNzVGhyZXNob2xkKSArICIgJSBlcmZvcmRlcmxpY2guIjsgfQogICAgICB9KQogICAgICAuY2F0Y2goZnVuY3Rpb24oKXsgLyogZmFsbGJhY2sgNzAga2FsaXIgKi8gfSk7CiAgfQoKICAvLyBtaXNzaW5nOiBbe25vLCBwY3R9XSAtPiBla3NpayBtb2R1bCBsaXN0ZXNpOyBudWxsIC0+IGtvbnRyb2wgZWRpbGVtZWRpIChrYXBhbGkga2FsKQogIGZ1bmN0aW9uIHNob3dHYXRlTG9ja2VkKG1pc3NpbmcpewogICAgdmFyIGdhdGUgPSAkKCJoa3AtZ2F0ZSIpOwogICAgdmFyIG1zZyA9ICQoImhrcC1nYXRlLW1zZyIpOwogICAgdmFyIGxpc3QgPSAkKCJoa3AtZ2F0ZS1saXN0Iik7CiAgICBpZighZ2F0ZSkgcmV0dXJuOwogICAgaWYobWlzc2luZyA9PT0gbnVsbCl7CiAgICAgIGlmKG1zZyl7IG1zZy50ZXh0Q29udGVudCA9ICJGb3J0c2Nocml0dCBrb25udGUgbmljaHQgZ2VwcnVlZnQgd2VyZGVuLiBCaXR0ZSBzcGFldGVyIGVybmV1dCB2ZXJzdWNoZW4uIjsgfQogICAgICBpZihsaXN0KXsgbGlzdC5pbm5lckhUTUwgPSAiIjsgfQogICAgfSBlbHNlIHsKICAgICAgaWYobXNnKXsgbXNnLnRleHRDb250ZW50ID0gIkFsbGUgTW9kdWxlIG11ZXNzZW4genUgbWluZGVzdGVucyA5NSAlIGFuZ2VzZWhlbiB3ZXJkZW4uIjsgfQogICAgICBpZihsaXN0KXsKICAgICAgICB2YXIgaHRtbCA9ICIiOwogICAgICAgIG1pc3NpbmcuZm9yRWFjaChmdW5jdGlvbihtbyl7CiAgICAgICAgICBodG1sICs9ICc8ZGl2PiYjMTI4Mjc0OyBNb2R1bCAnICsgbW8ubm8gKyAnOiAnICsgbW8ucGN0ICsgJyAlPC9kaXY+JzsKICAgICAgICB9KTsKICAgICAgICBsaXN0LmlubmVySFRNTCA9IGh0bWw7CiAgICAgIH0KICAgIH0KICAgIGdhdGUuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CiAgfQoKICBmdW5jdGlvbiBjaGVja1Byb2dyZXNzR2F0ZSgpewogICAgcXVpekZldGNoKCJnZXRLdXJzU2Vzc2lvblByb2dyZXNzIiwgeyBrdXJzX2lkOiBLVVJTX0lEIH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgaWYocmVzICYmIHJlcy5zdGF0dXMgPT0gMSAmJiByZXMuZGF0YSAmJiByZXMuZGF0YS5sZW5ndGgpewogICAgICAgICAgdmFyIG1pc3NpbmcgPSBbXTsKICAgICAgICAgIHJlcy5kYXRhLmZvckVhY2goZnVuY3Rpb24oZCwgaSl7CiAgICAgICAgICAgIHZhciBwY3QgPSAoZC5jb21wbGV0aW9uX3BlcmNlbnRhZ2UgPT0gbnVsbCA/IDAgOiBOdW1iZXIoZC5jb21wbGV0aW9uX3BlcmNlbnRhZ2UpKTsKICAgICAgICAgICAgaWYoIShwY3QgPj0gR0FURV9QRVJDRU5UKSl7CiAgICAgICAgICAgICAgbWlzc2luZy5wdXNoKHsgbm86IGkgKyAxLCBwY3Q6IE1hdGgucm91bmQocGN0KSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBpZihtaXNzaW5nLmxlbmd0aCA9PT0gMCl7CiAgICAgICAgICAgIGxvYWRRdWVzdGlvbnMoKTsgICAvLyBrYXBpIGFjaWsgLT4gbm9ybWFsIHNpbmF2IGFraXNpIChkb2t1bnVsbWFkaSkKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNob3dHYXRlTG9ja2VkKG1pc3NpbmcpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzaG93R2F0ZUxvY2tlZChudWxsKTsgICAvLyBiZWtsZW5tZWRpayB5YW5pdCAtPiBrYXBhbGkga2FsCiAgICAgICAgfQogICAgICB9KQogICAgICAuY2F0Y2goZnVuY3Rpb24oKXsgc2hvd0dhdGVMb2NrZWQobnVsbCk7IH0pOyAgIC8vIGFnIGhhdGFzaSAtPiBrYXBhbGkga2FsCiAgfQoKICBmdW5jdGlvbiBpbml0KCl7CiAgICB2YXIgdXNlciA9IGdldFVzZXIoKTsKICAgIGlmKCF1c2VyIHx8ICF1c2VyLmF1dGhfdG9rZW4pewogICAgICAkKCJoa3AtbmVlZC1sb2dpbiIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgICByZXR1cm47CiAgICB9CiAgICBsb2FkUGFzc1RocmVzaG9sZCgpOwogICAgaWYoaXNBdWRpdG9yKHVzZXIpKXsKICAgICAgbG9hZFF1ZXN0aW9ucygpOyAgIC8vIGRlbmV0Y2k6IG1lZHlhIGthcGlzaW5pIGF0bGEsIHNpbmF2aSBkb2dydWRhbiBnb3N0ZXIKICAgIH0gZWxzZSB7CiAgICAgIGNoZWNrUHJvZ3Jlc3NHYXRlKCk7CiAgICB9CiAgfQoKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gIFpQUCAvIEdLViBGT1JNVSAgKHJlc21pIFBERidpIHBkZi1saWIgaWxlIGRvbGR1cikKICAvLyAgTk9UOiBaUFAgYmlsZ2lsZXJpIChLdXJzLUlELCBQcmFldmVudGlvbnNwcmluemlwLAogIC8vICBLdXJzbGVpdHVuZykgc2ltZGlsaWsgeWVyIHR1dHVjdSAtIGdlcmNlZ2kgc29ucmEuCiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIHZhciBaUFBfUERGX1VSTCA9ICJodHRwczovL2RqaWJpbmhvLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wNi96cHAtZm9ybXVsYXIucGRmIjsKCiAgLy8gWWVyIHR1dHVjdSBrdXJ1bS9rdXJzIGJpbGdpbGVyaSAoc29ucmEgZ2VyY2VnaXlsZSBkZWdpc3RpcikKICB2YXIgWlBQID0gewogICAga3Vyc19pZF96cHA6ICJaUFAtWFhYWFgiLAogICAgcHJhZXZlbnRpb25zcHJpbnppcDogIlN0cmVzc21hbmFnZW1lbnQgLyBNZW50YWxlIEdlc3VuZGhlaXQiLAogICAga3Vyc2xlaXR1bmc6ICJTeWxsYSwgRGppYnJpbCIsCiAgICBhbmJpZXRlcl9uYW1lOiAiREpJQklOSE8iLAogICAgYW5iaWV0ZXJfYWRyZXNzZTogIk11c3RlcnN0cmFzc2UgMSwgNTA2NjcgS29lbG4iLAogICAga3Vyc2VpbmhlaXRlbjogIjgiLAogICAgbWludXRlbjogIjYwIiwKICAgIGdlYnVlaHI6ICIiICAgICAgICAgICAgICAvLyBBUEkgZ2V0SGVsZGVuS3Vyc2UgLT4gZGF0YS5wcml6ZSBkb2xkdXJ1cjsgZ2VsbWV6c2UgQk9TIGthbGlyCiAgfTsKCiAgZnVuY3Rpb24gZ2VuZXJhdGVacHBGb3JtKCl7CiAgICB2YXIgdXNlciA9IGdldFVzZXIoKSB8fCB7fTsKICAgIHZhciBuYW1lID0gdXNlci5mdWxsX25hbWUgfHwgIlRlaWxuZWhtZXIiOwogICAgdmFyIGJ0biA9ICQoImhrcC16cHAtYnRuIik7CiAgICBpZihidG4peyBidG4uZGlzYWJsZWQgPSB0cnVlOyBidG4udGV4dENvbnRlbnQgPSAiR0tWLUZvcm11bGFyIHdpcmQgZXJzdGVsbHQgLi4uIjsgfQoKICAgIHZhciByZWFkeSA9ICh0eXBlb2Ygd2luZG93LlBERkxpYiAhPT0gInVuZGVmaW5lZCIpCiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKCkKICAgICAgOiBsb2FkU2NyaXB0KCJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9wZGYtbGliLzEuMTcuMS9wZGYtbGliLm1pbi5qcyIpOwoKICAgIHJlYWR5LnRoZW4oZnVuY3Rpb24oKXsKICAgICAgcmV0dXJuIGZldGNoKFpQUF9QREZfVVJMKS50aGVuKGZ1bmN0aW9uKHIpewogICAgICAgIGlmKCFyLm9rKSB0aHJvdyBuZXcgRXJyb3IoIlBERiBuaWNodCBnZWZ1bmRlbiIpOwogICAgICAgIHJldHVybiByLmFycmF5QnVmZmVyKCk7CiAgICAgIH0pOwogICAgfSkudGhlbihmdW5jdGlvbihieXRlcyl7CiAgICAgIHJldHVybiB3aW5kb3cuUERGTGliLlBERkRvY3VtZW50LmxvYWQoYnl0ZXMpOwogICAgfSkudGhlbihmdW5jdGlvbihwZGZEb2MpewogICAgICB2YXIgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKCk7CgogICAgICBmdW5jdGlvbiBzZXRGaWVsZChmaWVsZE5hbWUsIHZhbHVlKXsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIGYgPSBmb3JtLmdldFRleHRGaWVsZChmaWVsZE5hbWUpOwogICAgICAgICAgaWYoZil7IGYuc2V0VGV4dChTdHJpbmcodmFsdWUpKTsgfQogICAgICAgIH0gY2F0Y2goZSl7IC8qIGFsYW4geW9rc2EgZ2VjICovIH0KICAgICAgfQoKICAgICAgLy8gLS0tIFRlaWwgMTogc2lzdGVtaW4gZG9sZHVyZHVndSBhbGFubGFyIC0tLQogICAgICBzZXRGaWVsZCgiVm9yIHVuZCBOYWNobmFtZSBkZXIgdGVpbG5laG1lbmRlbiBQZXJzb24iLCBuYW1lKTsKICAgICAgc2V0RmllbGQoIkRhdGVuYmFuayBkZXIgWmVudHJhbGUiLCBaUFAua3Vyc19pZF96cHApOwogICAgICBzZXRGaWVsZCgiUHJhZXZlbnRpb25zcHJpbnppcCIsIFpQUC5wcmFldmVudGlvbnNwcmluemlwKTsKICAgICAgc2V0RmllbGQoIlByw6R2ZW50aW9uc3ByaW56aXAiLCBaUFAucHJhZXZlbnRpb25zcHJpbnppcCk7CiAgICAgIHNldEZpZWxkKCJLdXJzbGVpdHVuZyIsIFpQUC5rdXJzbGVpdHVuZyk7CiAgICAgIHNldEZpZWxkKCJhbiIsIFpQUC5rdXJzZWluaGVpdGVuKTsKICAgICAgc2V0RmllbGQoIkt1cnNlaW5oZWl0ZW4gw6QiLCBaUFAubWludXRlbik7CiAgICAgIHNldEZpZWxkKCJEaWUgVGVpbG5haG1lZ2Viw7xociB2b24iLCBaUFAuZ2VidWVocik7CiAgICAgIHNldEZpZWxkKCJOYW1lIGRlcyBhbmJpZXRlbmRlbiBVbnRlcm5laG1lbnMgZGVyIGFuYmlldGVuZGVuIiwgWlBQLmFuYmlldGVyX25hbWUpOwogICAgICBzZXRGaWVsZCgiQWRyZXNzZSBkZXMgYW5iaWV0ZW5kZW4gVW50ZXJuZWhtZW5zIGRlciBhbmJpZXRlbmQiLCBaUFAuYW5iaWV0ZXJfYWRyZXNzZSk7CgogICAgICAvLyBUZWlsIDInZGUga2F0aWxpbWNpbmluIGFkaSAoa2VuZGkgZG9sZHVyYWJpbGlyIGFtYSBvbi1kb2xkdXJhbFx1MDEzMW0pCiAgICAgIHNldEZpZWxkKCJWb3IgdW5kIE5hY2huYW1lIGRlciBHS1Z2ZXJzaWNoZXJ0ZW4gUGVyc29uIiwgbmFtZSk7CgogICAgICAvLyBOT1Q6IEdlYnVydHNkYXR1bSwgVmVyc2ljaGVydGVuTnIsIElCQU4sIGltemFsYXIsIE9ydC9EYXR1bQogICAgICAvLyBiaWxlcmVrIEJPUyAtIGtpc2kgZWxsZSBkb2xkdXJtYWxpIChoYXNzYXMva2lzaXNlbCB2ZXJpKS4KCiAgICAgIHJldHVybiBwZGZEb2Muc2F2ZSgpOwogICAgfSkudGhlbihmdW5jdGlvbihvdXQpewogICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtvdXRdLCB7IHR5cGU6ICJhcHBsaWNhdGlvbi9wZGYiIH0pOwogICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICAgIGEuaHJlZiA9IHVybDsKICAgICAgYS5kb3dubG9hZCA9ICJHS1YtVGVpbG5haG1lYmVzY2hlaW5pZ3VuZ18iICsgbmFtZS5yZXBsYWNlKC9bXkEtWmEtejAtOV0vZywiXyIpICsgIi5wZGYiOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwogICAgICBhLmNsaWNrKCk7CiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7CiAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsKICAgICAgaWYoYnRuKXsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi50ZXh0Q29udGVudCA9ICJHS1YtRm9ybXVsYXIgaGVydW50ZXJsYWRlbiI7IH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIGlmKGJ0bil7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBidG4udGV4dENvbnRlbnQgPSAiR0tWLUZvcm11bGFyIGhlcnVudGVybGFkZW4iOyB9CiAgICAgIHNob3dFcnJvcigiR0tWLUZvcm11bGFyIGtvbm50ZSBuaWNodCBlcnN0ZWxsdCB3ZXJkZW4uICgiICsgKGVyciAmJiBlcnIubWVzc2FnZSA/IGVyci5tZXNzYWdlIDogIkZlaGxlciIpICsgIikiKTsKICAgIH0pOwogIH0KCiAgdmFyIHN1Ym1pdEJ0biA9ICQoImhrcC1zdWJtaXQtYnRuIik7CiAgaWYoc3VibWl0QnRuKXsgc3VibWl0QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgc3VibWl0RXhhbSk7IH0KICB2YXIgcmV0cnlCdG4gPSAkKCJoa3AtcmV0cnktYnRuIik7CiAgaWYocmV0cnlCdG4peyByZXRyeUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGxvYWRRdWVzdGlvbnMpOyB9CiAgdmFyIGNlcnRCdG4gPSAkKCJoa3AtY2VydC1idG4iKTsKICBpZihjZXJ0QnRuKXsgY2VydEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGdlbmVyYXRlQ2VydGlmaWNhdGUpOyB9CiAgdmFyIHpwcEJ0biA9ICQoImhrcC16cHAtYnRuIik7CiAgaWYoenBwQnRuKXsgenBwQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZ2VuZXJhdGVacHBGb3JtKTsgfQoKICBpbml0KCk7Cn0pKCk7Cg==