<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (dtdversion,name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT dtdversion (#PCDATA)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT mincmsversion (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT help (#PCDATA)>
  <!ELEMENT about (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
	<dtdversion>1.3</dtdversion>
	<name>Parser</name>
	<version>1.0.0</version>
  <mincmsversion>1.11.13</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPm1vcmUgaW5mb3JtYXRpb25zIG9uIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvbWFya2Rvd24iIHRhcmdldD0iX2JsYW5rIj5odHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9tYXJrZG93bjwvYT48L3A+CjxoMz5QYXJhbWV0ZXJzPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gUGFyYW1ldGVyIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGF0IGxhbmd1YWdlIHRvIHVzZSBmb3IgZGlzcGxheSBvbiB0aGUgZnJvbnRlbmQuIE5vdCBhbGwgbW9kdWxlcyBzdXBwb3J0IG9yIG5lZWQgdGhpcy48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBLZXZpbiBEYW5lemlzIChha2EgQmVzcykgJmx0O2NvbnRhY3QgYXQgZnVyaWUgcG9pbnQgYmUmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMS4wLjA8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz5zZWUgY2hhbmdlbG9nIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvbWFya2Rvd24iIHRhcmdldD0iX2JsYW5rIj5odHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9tYXJrZG93bjwvYT48YnIgLz4=]]></about>
	<description><![CDATA[This module is a Markdown Parser for CmsMadeSimple]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.admin_save.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwppZihpc3NldCgkcGFyYW1zWydkZWZhdWx0X2VuZ2luZSddKSl7CgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9lbmdpbmUnLCRwYXJhbXNbJ2RlZmF1bHRfZW5naW5lJ10pOwp9CmlmKGlzc2V0KCRwYXJhbXNbJ3Byb2Nlc3Nfc21hcnR5X3NlY3VyaXR5J10pKXsKCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwcm9jZXNzX3NtYXJ0eV9zZWN1cml0eScsJHBhcmFtc1sncHJvY2Vzc19zbWFydHlfc2VjdXJpdHknXSk7Cn0KaWYoaXNzZXQoJHBhcmFtc1sncHJvY2Vzc19xdW90ZSddKSl7CgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgncHJvY2Vzc19xdW90ZScsJHBhcmFtc1sncHJvY2Vzc19xdW90ZSddKTsKfQppZihpc3NldCgkcGFyYW1zWydwcm9jZXNzX2ltZyddKSl7CgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgncHJvY2Vzc19pbWcnLCRwYXJhbXNbJ3Byb2Nlc3NfaW1nJ10pOwp9CmlmKGlzc2V0KCRwYXJhbXNbJ3Byb2Nlc3Nfc2VjdXJpdHknXSkpewoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ3Byb2Nlc3Nfc2VjdXJpdHknLCRwYXJhbXNbJ3Byb2Nlc3Nfc2VjdXJpdHknXSk7Cn0KaWYoaXNzZXQoJHBhcmFtc1sncHJvY2Vzc19jb2RlcHJlJ10pKXsKCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwcm9jZXNzX2NvZGVwcmUnLCRwYXJhbXNbJ3Byb2Nlc3NfY29kZXByZSddKTsKfQoKCiR0aGlzLT5yZWRpcmVjdCgkaWQsJ2RlZmF1bHRhZG1pbicpOw==]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2Ntc21zJykpIGV4aXQ7CgokaXRlbXNFbmdpbmUgPSBhcnJheSgiTUlDSEVMRiI9PkVuZ2luZTo6JE1JQ0hFTEYsICJNSUNIRUxGX0VYVFJBIj0+RW5naW5lOjokTUlDSEVMRl9FWFRSQSwgIlBBUlNET1dOIj0+RW5naW5lOjokUEFSU0RPV04pOwoKCiRkZWZhdWx0X2VuZ2luZSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdkZWZhdWx0X2VuZ2luZScsRW5naW5lOjokUEFSU0RPV04pOwovLyRwcm9jZXNzX3NtYXJ0eV9zZWN1cml0eSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdwcm9jZXNzX3NtYXJ0eV9zZWN1cml0eScsdHJ1ZSk7CiRwcm9jZXNzX3F1b3RlID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3Byb2Nlc3NfcXVvdGUnLHRydWUpOwokcHJvY2Vzc19pbWcgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncHJvY2Vzc19pbWcnLHRydWUpOwokcHJvY2Vzc19zZWN1cml0eSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdwcm9jZXNzX3NlY3VyaXR5Jyx0cnVlKTsKJHByb2Nlc3NfY29kZXByZSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdwcm9jZXNzX2NvZGVwcmUnLHRydWUpOwoKJHNtYXJ0eS0+YXNzaWduKCJpdGVtc0VuZ2luZSIsICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duICgkaWQsICdkZWZhdWx0X2VuZ2luZScsICRpdGVtc0VuZ2luZSwgLTEsICRkZWZhdWx0X2VuZ2luZSkpOwovLyRzbWFydHktPmFzc2lnbigncHJvY2Vzc19zbWFydHlfc2VjdXJpdHknLCRwcm9jZXNzX3NtYXJ0eV9zZWN1cml0eSk7CiRzbWFydHktPmFzc2lnbigncHJvY2Vzc19xdW90ZScsJHByb2Nlc3NfcXVvdGUpOwokc21hcnR5LT5hc3NpZ24oJ3Byb2Nlc3NfaW1nJywkcHJvY2Vzc19pbWcpOwokc21hcnR5LT5hc3NpZ24oJ3Byb2Nlc3Nfc2VjdXJpdHknLCRwcm9jZXNzX3NlY3VyaXR5KTsKJHNtYXJ0eS0+YXNzaWduKCdwcm9jZXNzX2NvZGVwcmUnLCRwcm9jZXNzX2NvZGVwcmUpOwoKCiRzbWFydHktPmFzc2lnbignZm9ybV9zYXZlJywkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwnYWRtaW5fc2F2ZScpKTsKCgokdGV4dCA9IGZpbGVfZ2V0X2NvbnRlbnRzKGRpcm5hbWUoX19GSUxFX18pLicvZGVmYXVsdC5tZCcpOwovL2VjaG8gJHRoaXMtPkdldFBhcnNlckluc3RhbmNlKCktPnByb2Nlc3MoJHRleHQsIHRydWUpOwokdGV4dCA9IEVuZ2luZTo6aW5pdEluc3RhbmNlKCktPnByb2Nlc3MoJHRleHQsIHRydWUpOyAvL0FjdGl2YXRlIGRlYnVnIGluIGFkbWluIHBhcnQKJHNtYXJ0eS0+YXNzaWduKCd0ZXh0JywkdGV4dCk7CgoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZG1pbi50cGwnKTsKCj8+]]></data>
	</file>
	<file>
	  <filename>/default.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyMgU29tZSBFeGFtcGxlcyBvZiB0aGUgTWFya2Rvd24gUmVzdWx0LgoKV2VsY29tZSBvbiB0aGlzIGxpdHRsZSBwcmVzZW50YXRpb24uIFtZb3UgY2FuIHJlYWQgdGhlIG9yaWdpbmFsIHRleHQgaGVyZV0oLi4vbW9kdWxlcy9QYXJzZXIvZGVmYXVsdC5tZCkuCgpTb21lIHRpcHMgOiAKCiogICBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyAiTWFya0Rvd24iLiBJZiBpdCdzIHRoZSBmaXJzdCB0aW1lIGZvciB5b3UgdG8gd3JpdGUgaW4gIk1hcmtkb3duIiBtb2RlLCB0YWtlIGEgZmV3IG1vbWVudCBbdG8gcmVhZCB0aGlzXShodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCkKKiAgIEhUTUwgdGFncyBsaWtlIGA8Yj5ib2xkPC9iPmAgb3IgYDxhIGhyZWY9JyMnPmxpbmtzPC9hPmBjb3VsZCBiZSBwcm9jZXNzZWQgYnkgdGhlIGVuZ2luZSAiTWFya0Rvd24iIGluIGEgbm9ybWFsIGNhc2UgYnV0IGFyZSBkaXNhYmxlZCBpbiB0aGUgbW9kdWxlIE1BUktET1cgYnkgZGVmYXVsdCBmb3Igc2VjdXJpdHkgcmVhc29ucyAoZXggOiA8c2NyaXB0PmFsZXJ0KCd0aGlzIGphdmFzY3JpcHQgc2hvdWxkblwndCBiZSBleGVjdXRlZCcpOzwvc2NyaXB0PikuCiogICBJdCdzIHByZXR0eSBlYXN5IHRvIGVtYmVkZGVkIHNvbWUgY29kZSBpbnNpZGUgdGhlIHRleHQuLiB5b3UgY2FuIGRvIGl0IGlubGluZSBgYGBwaHAgPD9waHAgZWNobyAiaGVsbG8gd29ybGQiID8+IGBgYCBvciB3aXRoIGEgYmxvYyBvZiBjb2RlIDogCgpgYGBwaHAgCjw/cGhwIAogIGVjaG8gImhlbGxvIHdvcmxkIiAKPz4gCmBgYAoKKiAgIFNtYXJ0eSB0YWdzIGFuZCBDbXNNYWRlU2ltcGxlIHRhZ3MgbGlrZSBgeyJoZWxsbyJ8Y2FwaXRhbGl6ZX1gIG9yIGB7TmV3c31gIGFyZSBub3QgcHJvY2Vzc2VkIGJ5IHRoZSBlbmdpbmUgIk1hcmtEb3duIi4gSXQncyB5b3VyIGpvYiB0byBkbyBpdCAhIAoKCkluIGZhY3QsIHRoZSAiTWFya0Rvd24iIGxhbmd1YWdlIGlzIGEgKiplZGl0b3JpYWwgbGFuZ3VhZ2UqKiBhbmQgbm90IGEgKipwcm9ncmFtbWF0aWMgbGFuZ3VhZ2UqKiAobGlrZSBTbWFydHkgaXMpCiAKQW5kIGZpbmFsbHksIGhlcmUgc29tZSBhZHZpY2UgYnkgIkR1a3kiLCB0aGUgbG95YWwgRHVjay4KCiFbcXVhY2tdKGh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi9kL2Q1L0dyYXZlX2VlbmRfbWFhc211dXIuanBnLzI1NnB4LUdyYXZlX2VlbmRfbWFhc211dXIuanBnKQoKPiBRdWFjaywgcXVhY2sgcXVhY2sgcXVhY2suLi4gIAoKPiA+IE8nIHJlYWxseSA/Cgo+ID4gTXkgR29kICEKCioqVGhlIEVORCAhKioKClBTIDogWW91IGNhbiBjYWxsIHRoZSBwYXJzZXIgbGlrZSB0aGlzIAoKYGBgcGhwIAo8P3BocCAKICBlY2hvICR0aGlzLT5HZXRQYXJzZXJJbnN0YW5jZSgpLT5wcm9jZXNzKCR0ZXh0KTsKPz4gCmBgYApvcgoKYGBgcGhwIAo8P3BocCAKICAkY29uZmlnID0gY21zbXMoKS0+R2V0Q29uZmlnKCk7CiAgaW5jbHVkZV9vbmNlKCRjb25maWdbJ3Jvb3RfcGF0aCddLicvbW9kdWxlcy9QYXJzZXIvbGliL2NsYXNzLkVuZ2luZS5waHAnKTsKICBlY2hvIEVuZ2luZTo6aW5pdEluc3RhbmNlKCktPnByb2Nlc3MoJHRleHQpOwo/PiAKYGBgCm9yIGluIHlvdXIgU21hcnR5IHRlbXBsYXRlcyA6IAoKYGBgc21hcnR5CnskdW50cnVzdGVkVGV4dHxtYXJrZG93bn0KYGBgCgpUaGVyZSBpcyBhbHNvIG1vcmUgb3B0aW9ucyA6IApgYGBwaHAgCjw/cGhwIAogICRjb25maWcgPSBjbXNtcygpLT5HZXRDb25maWcoKTsKICBpbmNsdWRlX29uY2UoJGNvbmZpZ1sncm9vdF9wYXRoJ10uJy9tb2R1bGVzL1BhcnNlci9saWIvY2xhc3MuRW5naW5lLnBocCcpOwogIGVjaG8gRW5naW5lOjppbml0SW5zdGFuY2UoRW5naW5lOjokUEFSU0RPV04pLT5wcm9jZXNzKCR0ZXh0LCB0cnVlKTsgCiAgLy8gd2lsbCB1c2UgUEFSU0RPV04gYW5kIHdpbGwgcHJvZHVjZSBzb21lIGRlYnVnIHRyYWNlLgo/PiAKYGBgCioqVGhlIEVORCAoMikgISoq]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhaABAAIABAAAAAP///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEALAAAAABoAEAAAAL+jA2py+0Po5xUnRuq3rx37IXi+CHkiaZWprYuxy7YTNf2jec6Lu3+DwzuIsKi8ZgjIpdMo7IJjfIg0qr18rxqm9mt10n9iovdsTkZrpWHafYDuD704HFbXd2eTX57fh79ZtcHeEdTqPeHNTg153MIkihHQfioGOgYaTIpuIl56eZws4FXQfepcwcDqWEa6ne6WhrbCdrQasvJKjn66urpa1jicctALJP7gvurXFuMnHy87CwdHQzNjJpJCoz49lG5y005bR36rV2OPV7d7coLrinOKB+uLBtD75JO3s68WKdimzpLwP5pQ/GM3Sx+XQqREHXwD6xDIuYNrMcvXoKYfQr76YIIi+DFjvguLqQlMKNIlfhSkvTYCCQ9jSxZJFyRDeXNjTsBkEF30iRMnByJ9hJa1KjFmiWZykSa1JjSlS+XVk0YJBVQl1Nz8pT6NalPIfBW/QyJ8WrPI2PJRkS7ruuXsmfE0K3r5S5eLXr3WunrVwrgwFAGE2Zi+DCSxIrBbG1cxda1yZRpUr6M0DLmzSXScv48qAAAOw==]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ01hcmtkb3duIFBhcnNlcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJyc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnTW9kdWxlIHVuaW5zdGFsbGVkLCBieWUgISInOwokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ1JlYWxseT8gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHVuaW5zdGFsbCB0aGlzIGZpbmUgbW9kdWxlPyc7CiRsYW5nWyd1bmluc3RhbGxlZCddID0gJ01vZHVsZSBVbmluc3RhbGxlZC4nOwokbGFuZ1snaW5zdGFsbGVkJ10gPSAnTW9kdWxlIHZlcnNpb24gJXMgaW5zdGFsbGVkLic7CiRsYW5nWydyZXNldGVkICddID0gJ01vZHVsZSB2ZXJzaW9uICVzIHJlc2V0ZWQgd2l0aCBzdWNjZXNzICc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ1RoaXMgbW9kdWxlIGlzIGEgTWFya2Rvd24gUGFyc2VyIGZvciBDbXNNYWRlU2ltcGxlJzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJ3NlZSBjaGFuZ2Vsb2cgOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9tYXJrZG93biIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vZ2l0aHViLmNvbS9iZXNzdGlvbGxlL21hcmtkb3duPC9hPic7CiRsYW5nWydoZWxwJ10gPSAnPGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPm1vcmUgaW5mb3JtYXRpb25zIG9uIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvbWFya2Rvd24iIHRhcmdldD0iX2JsYW5rIj5odHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9tYXJrZG93bjwvYT48L3A+Cic7CgoKJGxhbmdbJ3NhdmVfc3VjY2VzcyddID0gJ1BhcmFtZXRlcnMgc2F2ZWQgd2l0aCBzdWNjZXNzLic7Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.Engine.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCgpjbGFzcyBFbmdpbmV7CgoKCXB1YmxpYyBzdGF0aWMgJE1JQ0hFTEYgPSAxOwoJcHVibGljIHN0YXRpYyAkTUlDSEVMRl9FWFRSQSA9IDI7CglwdWJsaWMgc3RhdGljICRQQVJTRE9XTiA9IDM7CgoJcHJvdGVjdGVkIHN0YXRpYyAkZW5naW5lOwoKCXByb3RlY3RlZCBzdGF0aWMgJHByb2Nlc3Nfc2VjdXJpdHkgPSBmYWxzZTsKCXByb3RlY3RlZCBzdGF0aWMgJHByb2Nlc3Nfc21hcnR5X3NlY3VyaXR5ID0gZmFsc2U7Cglwcm90ZWN0ZWQgc3RhdGljICRwcm9jZXNzX3F1b3RlID0gZmFsc2U7Cglwcm90ZWN0ZWQgc3RhdGljICRwcm9jZXNzX2ltZyA9IGZhbHNlOwoJcHJvdGVjdGVkIHN0YXRpYyAkcHJvY2Vzc19jb2RlcHJlID0gZmFsc2U7CgoKCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGluaXRJbnN0YW5jZSgkZW5naW5lVHlwZSA9IG51bGwpewoKCQlpZihzZWxmOjokZW5naW5lICE9IG51bGwpewoJCQlyZXR1cm4gc2VsZjo6JGVuZ2luZTsKCQl9CgoJCSRwYXJzZXIgPSBNb2R1bGVPcGVyYXRpb25zOjpnZXRfaW5zdGFuY2UoKS0+Z2V0X21vZHVsZV9pbnN0YW5jZSgnUGFyc2VyJyk7CgkJaWYoJGVuZ2luZVR5cGUgPT0gbnVsbCl7CgkJCSRlbmdpbmVUeXBlID0gJHBhcnNlci0+R2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9lbmdpbmUnLEVuZ2luZTo6JFBBUlNET1dOKTsKCQl9CgkJCgkJc2VsZjo6JHByb2Nlc3Nfc21hcnR5X3NlY3VyaXR5ID0gJHBhcnNlci0+R2V0UHJlZmVyZW5jZSgncHJvY2Vzc19zbWFydHlfc2VjdXJpdHknLHRydWUpOwoJCXNlbGY6OiRwcm9jZXNzX3NlY3VyaXR5ID0gJHBhcnNlci0+R2V0UHJlZmVyZW5jZSgncHJvY2Vzc19zZWN1cml0eScsdHJ1ZSk7CgkJc2VsZjo6JHByb2Nlc3NfcXVvdGUgPSAkcGFyc2VyLT5HZXRQcmVmZXJlbmNlKCdwcm9jZXNzX3F1b3RlJyx0cnVlKTsKCQlzZWxmOjokcHJvY2Vzc19pbWcgPSAkcGFyc2VyLT5HZXRQcmVmZXJlbmNlKCdwcm9jZXNzX2ltZycsdHJ1ZSk7CgkJc2VsZjo6JHByb2Nlc3NfY29kZXByZSA9ICRwYXJzZXItPkdldFByZWZlcmVuY2UoJ3Byb2Nlc3NfY29kZXByZScsdHJ1ZSk7CgkJCgoJCWlmKEVuZ2luZTo6JE1JQ0hFTEYgPT0gJGVuZ2luZVR5cGUpIHsKCQkJaW5jbHVkZV9vbmNlKGRpcm5hbWUoX19GSUxFX18pLicvRW5naW5lcy9jbGFzcy5NaWNoZWxmRW5naW5lLnBocCcpOwoJCQlzZWxmOjokZW5naW5lID0gbmV3IE1pY2hlbGZFbmdpbmUoKTsKCQkKCQl9IGVsc2UgaWYoRW5naW5lOjokTUlDSEVMRl9FWFRSQSA9PSAkZW5naW5lVHlwZSkgewoJCQlpbmNsdWRlX29uY2UoZGlybmFtZShfX0ZJTEVfXykuJy9FbmdpbmVzL2NsYXNzLk1pY2hlbGZFeHRyYUVuZ2luZS5waHAnKTsKCQkJc2VsZjo6JGVuZ2luZSA9IG5ldyBNaWNoZWxmRXh0cmFFbmdpbmUoKTsKCQkKCQl9IGVsc2UgaWYoRW5naW5lOjokUEFSU0RPV04gPT0gJGVuZ2luZVR5cGUpIHsKCQkJaW5jbHVkZV9vbmNlKGRpcm5hbWUoX19GSUxFX18pLicvRW5naW5lcy9jbGFzcy5QYXJzZWRvd25FbmdpbmUucGhwJyk7CgkJCXNlbGY6OiRlbmdpbmUgPSBuZXcgUGFyc2Vkb3duRW5naW5lKCk7CgkJfSAKCgkJcmV0dXJuIHNlbGY6OiRlbmdpbmU7CgoJfQoKCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpewoJfQoKCXB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCR0ZXh0LCAkZGVidWcgPSBmYWxzZSl7CgoJCSRzdGFydCA9IG1pY3JvdGltZSh0cnVlKTsKCgkJLy8gTWFpbiBzZWN1cml0eSBlbnRyeQoJCWlmKHNlbGY6OiRwcm9jZXNzX3NlY3VyaXR5KXsKCQkJJHRleHQgPSBodG1sZW50aXRpZXMoJHRleHQpOwoJCX0KCgkJLy9XaWxsIHJlcGxhY2UgPiA+ID4gaW50byAgdGFiIHRhYiB0YWIKCQlpZihzZWxmOjokcHJvY2Vzc19xdW90ZSl7CgkJCSR0ZXh0ID0gc2VsZjo6Zml4UXVvdGVCbG9jKCR0ZXh0KTsKCQl9CgoJCS8vV2lsbCBmaXggISBzeW1ib2wgZm9yIGltZy9saW5rCgkJaWYoc2VsZjo6JHByb2Nlc3NfaW1nKXsKCQkJJHRleHQgPSBzZWxmOjpmaXhJbWFnZVVybCgkdGV4dCk7CgkJfQkJCgoJCSRzdGFydFAgPSBtaWNyb3RpbWUodHJ1ZSk7CgkJJHRleHQgPSBzZWxmOjokZW5naW5lLT5wYXJzaW5nKCR0ZXh0KTsKCQkkZW5kUCA9IG1pY3JvdGltZSh0cnVlKTsKCgkJLy9XaWxsIGZpeCBIVE1MIHN5bWJvbCBpbnNpZGUgPGNvZGU+ICYgPHByZT4KCQlpZihzZWxmOjokcHJvY2Vzc19jb2RlcHJlKXsKCQkJJHRleHQgPSBzZWxmOjpmaXhDb2RlUHJlQmxvYygkdGV4dCk7CgkJfQoKCQkvL1dpbGwgZW5hYmxlIFNNQVJUWSB0YWdzCgkJLyppZihzZWxmOjokcHJvY2Vzc19zbWFydHlfc2VjdXJpdHkpewoJCQkkdGV4dCA9IHNlbGY6OmZpeFNtYXJ0eSgkdGV4dCk7CgkJfSovCgkJCgkJJGVuZCA9IG1pY3JvdGltZSh0cnVlKTsKCQkKCgkJaWYoJGRlYnVnKXsKCQkJJHRleHQgLj0gIjxoMT4gREVCVUcgOiBUaW1lIG9mIGV4ZWN1dGlvbiA6ICIucm91bmQoKCRlbmQtJHN0YXJ0KSAqIDEwMDAsMikuIm1zICgiLnJvdW5kKCgkZW5kUC0kc3RhcnRQKSAqIDEwMDAsMikuIm1zIGZvciBwYXJzaW5nKTwvaDE+IjsKCQl9CgoJCXJldHVybiAkdGV4dDsKCX0KCglwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGZpeFF1b3RlQmxvYygkdGV4dCl7CgkJLy8gYmxvY3F1b3RlCgkJJHNlYXJjaCA9IGFycmF5KCdgXG4gPyZndDsgJmd0OyAmZ3Q7ICZndDsgJmd0OyAmZ3Q7IGAnLCdgXG4gPyZndDsgJmd0OyAmZ3Q7ICZndDsgJmd0OyBgJywnYFxuID8mZ3Q7ICZndDsgJmd0OyAmZ3Q7IGAnLCdgXG4gPyZndDsgJmd0OyAmZ3Q7IGAnLCdgXG4gPyZndDsgJmd0OyBgJywnYFxuID8mZ3Q7IGAnKTsKCQkkcmVwbGFjZSA9IGFycmF5KCc+ID4gPiA+ID4gPicsICc+ID4gPiA+ID4gJywnPiA+ID4gPiAnLCc+ID4gPiAnLCc+ID4gJywnPiAnKTsKCQkkdGV4dCA9IHByZWdfcmVwbGFjZSgkc2VhcmNoLCAkcmVwbGFjZSwgJHRleHQpOwoJCSRzZWFyY2ggPSBhcnJheSgnYF4gPyZndDsgJmd0OyAmZ3Q7ICZndDsgJmd0OyAmZ3Q7IGAnLCdgXiA/Jmd0OyAmZ3Q7ICZndDsgJmd0OyAmZ3Q7IGAnLCdgXiA/Jmd0OyAmZ3Q7ICZndDsgJmd0OyBgJywnYF4gPyZndDsgJmd0OyAmZ3Q7IGAnLCdgXiA/Jmd0OyAmZ3Q7IGAnLCdgXiA/Jmd0OyBgJyk7CgkJJHRleHQgPSBwcmVnX3JlcGxhY2UoJHNlYXJjaCwgJHJlcGxhY2UsICR0ZXh0KTsKCgkJLy8kc2VhcmNoID0gYXJyYXkoIiMgPygmZ3Q7ICk/KCZndDsgKT8oJmd0OyApPygmZ3Q7ICk/KCZndDsgKT8jbXNpIik7ICAvLyAjMiAtPiA1IGxldmVsIG9mIHF1b3RlCgkJLy8gJHNlYXJjaCA9IGFycmF5KCIjID8oJmd0OyApPygmZ3Q7ICk/KCZndDsgKT8oJmd0OyApPygmZ3Q7ICk/I21zaSIpOyAgLy8gIzIgLT4gNSBsZXZlbCBvZiBxdW90ZQoJCS8vICRyZXBsYWNlID0gYXJyYXkoJz4nKTsKCQkvLyAkdGV4dCA9IHByZWdfcmVwbGFjZSgkc2VhcmNoLCAkcmVwbGFjZSwgJHRleHQpOwoJCXJldHVybiAkdGV4dDsKCX0KCgkvKnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gZml4U21hcnR5KCR0ZXh0KXsKCQkvL1RyYW5zZm9ybSBzbWFydHkgdGFncwoJCSRzZWFyY2ggPSBhcnJheSgne3Jvb3RfdXJsfScpOyAKCQkkcmVwbGFjZSA9IGFycmF5KHNlbGY6OiRjb25maWdbJ3Jvb3RfdXJsJ10pOyAKCQkkdGV4dCA9IHN0cl9yZXBsYWNlKCRzZWFyY2gsICRyZXBsYWNlLCAkdGV4dCk7CgkJcmV0dXJuICR0ZXh0OwoJfSovCgoJcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBmaXhJbWFnZVVybCgkdGV4dCl7CgkJLy9UcmFuc2Zvcm0gc3BlY2lmaWMgdGFncwoJCSRzZWFyY2ggPSBhcnJheSgnJiMzMzsnKTsgCgkJJHJlcGxhY2UgPSBhcnJheSgnIScpOyAKCQkkdGV4dCA9IHN0cl9yZXBsYWNlKCRzZWFyY2gsICRyZXBsYWNlLCAkdGV4dCk7CgkJcmV0dXJuICR0ZXh0OwoJfQoKCglwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGZpeENvZGVQcmVCbG9jKCR0ZXh0KXsKCQkvL0ZpeCBpbmxpbmUvYmxvYyA8Y29kZT48L2NvZGU+IGFuZCA8Y29kZSBjbGFzcz0neHh4Jz48L2NvZGU+IGJ5IGRlY29kaW5nIEhUTUwgZW50aXR5CgkJJHBhdHRlcm5TID0gJ2A8Y29kZSg/OltePl0qKT4oW148XSopPFwvY29kZT5gaSc7CgkJcHJlZ19tYXRjaF9hbGwoICRwYXR0ZXJuUywgJHRleHQsICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUik7CgkJJHNlYXJjaCA9IGFycmF5KCk7CgkJJHJlcGxhY2UgPSBhcnJheSgpOwoJCWZvcmVhY2goJG1hdGNoZXMgYXMgJG1hdGNoKSB7CgkJCSRzZWFyY2hbXSA9ICRtYXRjaFswXTsKCQkJJHJlcGxhY2VbXSA9IGh0bWxfZW50aXR5X2RlY29kZSgkbWF0Y2hbMF0pOwoJCX0KCQkkdGV4dCA9IHN0cl9yZXBsYWNlKCRzZWFyY2gsJHJlcGxhY2UsJHRleHQpOwoJCXJldHVybiAkdGV4dDsKCX0KfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.forge_smarty_plugins.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmZpbmFsIGNsYXNzIGZvcmdlX3NtYXJ0eV9wbHVnaW5zCnsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHt9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzbWFydHlfaXNfcHJvamVjdF9hZG1pbigkcGFyYW1zLCRzbWFydHkpIHsKICAgICAgICAvKiRkYiA9IFxjZ2VfdXRpbHM6OmdldF9kYigpOwogICAgICAgICRvYmogPSBjZ2VfdXRpbHM6OmdldF9tb2R1bGUoJ0NHRXh0ZW5zaW9ucycpOwoKICAgICAgICAkcXVlcnkgPSAnU0VMRUNUICogRlJPTSAnLkNHRVhURU5TSU9OU19UQUJMRV9TVEFURVMuJyBPUkRFUiBCWSBzb3J0aW5nIERFU0MsbmFtZSBBU0MnOwogICAgICAgICR0bXAgPSAkZGItPkdldEFsbCgkcXVlcnkpOwogICAgICAgICRvdXRwdXQgPSAnJzsKICAgICAgICBpZiggaXNzZXQoJHBhcmFtc1snc2VsZWN0b25lJ10pICkgJG91dHB1dCAuPSAnPG9wdGlvbiB2YWx1ZT0iIj4nLnRyaW0oJHBhcmFtc1snc2VsZWN0b25lJ10pLiI8L29wdGlvbj5cbiI7CiAgICAgICAgZm9yZWFjaCggJHRtcCBhcyAkcm93ICkgewogICAgICAgICAgICAkb3V0cHV0IC49ICI8b3B0aW9uIHZhbHVlPVwieyRyb3dbJ2NvZGUnXX1cIiI7CiAgICAgICAgICAgIGlmKCBpc3NldCgkcGFyYW1zWydzZWxlY3RlZCddKSAmJiAkcGFyYW1zWydzZWxlY3RlZCddID09ICRyb3dbJ2NvZGUnXSApICRvdXRwdXQgLj0gJyBzZWxlY3RlZD0ic2VsZWN0ZWQiJzsKICAgICAgICAgICAgJG91dHB1dCAuPSAiPnskcm93WyduYW1lJ119PC9vcHRpb24+XG4iOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJG91dHB1dDsqLwoKICAgICAgICAvL3ByaW50X3IoJHNtYXJ0eS0+Z2V0X3RlbXBsYXRlX3ZhcnMoJ3Byb2plY3QnKSk7CgogICAgICAgICRwcm9qZWN0ID0gJHBhcmFtc1sncHJvamVjdCddOwogICAgICAgICR1c2VyX2lkID0gJHBhcmFtc1sndXNlcl9pZCddOwogICAgICAgICRhc3NpZ24gPSAkcGFyYW1zWydhc3NpZ24nXTsKCiAgICAgICAgaWYoZW1wdHkoJHByb2plY3QpIHx8IGVtcHR5KCR1c2VyX2lkKSB8fCBlbXB0eSgkYXNzaWduKSl7CiAgICAgICAgICAgIGlmKGVtcHR5KCRwcm9qZWN0KSl7CiAgICAgICAgICAgICAgICBlY2hvICc8cD5QQVJBTUVURVIgJHByb2plY3Qgd2FzIG51bGwgaW4ge2ZnX2lzX3Byb2plY3RfYWRtaW59PC9wPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAvKiBpZihlbXB0eSgkdXNlcl9pZCkpewogICAgICAgICAgICAgICAgZWNobyAnPHA+UEFSQU1FVEVSICR1c2VyX2lkIHdhcyBudWxsIGluIHtmZ19pc19wcm9qZWN0X2FkbWlufTwvcD4nOwogICAgICAgICAgICB9Ki8KICAgICAgICAgICAgaWYoZW1wdHkoJGFzc2lnbikpewogICAgICAgICAgICAgICAgZWNobyAnPHA+UEFSQU1FVEVSICRhc3NpZ24gd2FzIG51bGwgaW4ge2ZnX2lzX3Byb2plY3RfYWRtaW59PC9wPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCRhc3NpZ24sIGZhbHNlKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCRhc3NpZ24sIGZvcmdlX3V0aWxzOjppc19wcm9qZWN0X2FkbWluKCRwcm9qZWN0LCAkdXNlcl9pZCkpOwogICAgfQogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzbWFydHlfaXNfcHJvamVjdF9tKCRwYXJhbXMsJHNtYXJ0eSkgewogICAgICAgIHJldHVybiBmb3JnZV9zbWFydHlfcGx1Z2luczo6c21hcnR5X2lzX3Byb2plY3RfYWRtaW4oJHBhcmFtcywkc21hcnR5KTsKICAgICAgICAkcHJvamVjdCA9ICRwYXJhbXNbJ3Byb2plY3QnXTsKICAgICAgICAkdXNlcl9pZCA9ICRwYXJhbXNbJ3VzZXJfaWQnXTsKICAgICAgICAkYXNzaWduID0gJHBhcmFtc1snYXNzaWduJ107CgogICAgICAgIGlmKGVtcHR5KCRwcm9qZWN0KSB8fCBlbXB0eSgkdXNlcl9pZCkgfHwgZW1wdHkoJGFzc2lnbikpewogICAgICAgICAgICBpZihlbXB0eSgkcHJvamVjdCkpewogICAgICAgICAgICAgICAgZWNobyAnPHA+UEFSQU1FVEVSICRwcm9qZWN0IHdhcyBudWxsIGluIHtmZ19pc19wcm9qZWN0X2FkbWlufTwvcD4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgLyogaWYoZW1wdHkoJHVzZXJfaWQpKXsKICAgICAgICAgICAgICAgIGVjaG8gJzxwPlBBUkFNRVRFUiAkdXNlcl9pZCB3YXMgbnVsbCBpbiB7ZmdfaXNfcHJvamVjdF9hZG1pbn08L3A+JzsKICAgICAgICAgICAgfSovCiAgICAgICAgICAgIGlmKGVtcHR5KCRhc3NpZ24pKXsKICAgICAgICAgICAgICAgIGVjaG8gJzxwPlBBUkFNRVRFUiAkYXNzaWduIHdhcyBudWxsIGluIHtmZ19pc19wcm9qZWN0X2FkbWlufTwvcD4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzbWFydHktPmFzc2lnbigkYXNzaWduLCBmYWxzZSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRzbWFydHktPmFzc2lnbigkYXNzaWduLCBmb3JnZV91dGlsczo6aXNfcHJvamVjdF9tZW1iZXIoJHByb2plY3QsICR1c2VyX2lkKSk7CiAgICB9Cn0=]]></data>
	</file>
	<file>
	  <filename>/lib/Engines/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Engines/class.MichelfEngine.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCnJlcXVpcmVfb25jZShkaXJuYW1lKF9fRklMRV9fKS4nL01pY2hlbGYvTWFya2Rvd24uaW5jLnBocCcpOwoKY2xhc3MgTWljaGVsZkVuZ2luZSBleHRlbmRzIEVuZ2luZXsKCglwdWJsaWMgZnVuY3Rpb24gcGFyc2luZygkdGV4dCl7CgkJJHBhcnNlciA9IG5ldyBNaWNoZWxmXE1hcmtkb3duKCk7CgkJJHRleHQgPSAkcGFyc2VyLT5kZWZhdWx0VHJhbnNmb3JtKCR0ZXh0KTsKCgkJcmV0dXJuICR0ZXh0OwoJfQp9Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Engines/class.MichelfExtraEngine.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmluY2x1ZGVfb25jZShkaXJuYW1lKF9fRklMRV9fKS4nL01pY2hlbGYvTWFya2Rvd25FeHRyYS5pbmMucGhwJyk7CgpjbGFzcyBNaWNoZWxmRXh0cmFFbmdpbmUgZXh0ZW5kcyBFbmdpbmV7CgoJcHVibGljIGZ1bmN0aW9uIHBhcnNpbmcoJHRleHQpewoJCSRwYXJzZXIgPSBuZXcgTWljaGVsZlxNYXJrZG93bkV4dHJhOwoJCSR0ZXh0ID0gJHBhcnNlci0+ZGVmYXVsdFRyYW5zZm9ybSgkdGV4dCk7CgoJCXJldHVybiAkdGV4dDsKCX0KfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/Engines/class.ParsedownEngine.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmluY2x1ZGVfb25jZShkaXJuYW1lKF9fRklMRV9fKS4nL1BhcnNlZG93bi9QYXJzZWRvd24ucGhwJyk7CgpjbGFzcyBQYXJzZWRvd25FbmdpbmUgZXh0ZW5kcyBFbmdpbmV7CgoJcHVibGljIGZ1bmN0aW9uIHBhcnNpbmcoJHRleHQpewoJCSRwYXJzZXIgPSBuZXcgUGFyc2Vkb3duOwoJCSR0ZXh0ID0gJHBhcnNlci0+dGV4dCgkdGV4dCk7CgoJCXJldHVybiAkdGV4dDsKCX0KfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/Engines/Michelf/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Engines/Michelf/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/lib/Engines/Michelf/Markdown.inc.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMgVXNlIHRoaXMgZmlsZSBpZiB5b3UgY2Fubm90IHVzZSBjbGFzcyBhdXRvbG9hZGluZy4gSXQgd2lsbCBpbmNsdWRlIGFsbCB0aGUKIyBmaWxlcyBuZWVkZWQgZm9yIHRoZSBNYXJrZG93biBwYXJzZXIuCiMKIyBUYWtlIGEgbG9vayBhdCB0aGUgUFNSLTAtY29tcGF0aWJsZSBjbGFzcyBhdXRvbG9hZGluZyBpbXBsZW1lbnRhdGlvbgojIGluIHRoZSBSZWFkbWUucGhwIGZpbGUgaWYgeW91IHdhbnQgYSBzaW1wbGUgYXV0b2xvYWRlciBzZXR1cC4KCnJlcXVpcmVfb25jZSBkaXJuYW1lKF9fRklMRV9fKSAuICcvTWFya2Rvd25JbnRlcmZhY2UucGhwJzsKcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pIC4gJy9NYXJrZG93bi5waHAnOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/Engines/Michelf/Markdown.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIwojIE1hcmtkb3duICAtICBBIHRleHQtdG8tSFRNTCBjb252ZXJzaW9uIHRvb2wgZm9yIHdlYiB3cml0ZXJzCiMKIyBQSFAgTWFya2Rvd24gIAojIENvcHlyaWdodCAoYykgMjAwNC0yMDE1IE1pY2hlbCBGb3J0aW4gIAojIDxodHRwczovL21pY2hlbGYuY2EvcHJvamVjdHMvcGhwLW1hcmtkb3duLz4KIwojIE9yaWdpbmFsIE1hcmtkb3duICAKIyBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBKb2huIEdydWJlciAgCiMgPGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vPgojCm5hbWVzcGFjZSBNaWNoZWxmOwoKCiMKIyBNYXJrZG93biBQYXJzZXIgQ2xhc3MKIwoKY2xhc3MgTWFya2Rvd24gaW1wbGVtZW50cyBNYXJrZG93bkludGVyZmFjZSB7CgoJIyMjIFZlcnNpb24gIyMjCgoJY29uc3QgIE1BUktET1dOTElCX1ZFUlNJT04gID0gICIxLjUuMCI7CgoJIyMjIFNpbXBsZSBGdW5jdGlvbiBJbnRlcmZhY2UgIyMjCgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZWZhdWx0VHJhbnNmb3JtKCR0ZXh0KSB7CgkjCgkjIEluaXRpYWxpemUgdGhlIHBhcnNlciBhbmQgcmV0dXJuIHRoZSByZXN1bHQgb2YgaXRzIHRyYW5zZm9ybSBtZXRob2QuCgkjIFRoaXMgd2lsbCB3b3JrIGZpbmUgZm9yIGRlcml2ZWQgY2xhc3NlcyB0b28uCgkjCgkJIyBUYWtlIHBhcnNlciBjbGFzcyBvbiB3aGljaCB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQuCgkJJHBhcnNlcl9jbGFzcyA9IFxnZXRfY2FsbGVkX2NsYXNzKCk7CgoJCSMgdHJ5IHRvIHRha2UgcGFyc2VyIGZyb20gdGhlIHN0YXRpYyBwYXJzZXIgbGlzdAoJCXN0YXRpYyAkcGFyc2VyX2xpc3Q7CgkJJHBhcnNlciA9JiAkcGFyc2VyX2xpc3RbJHBhcnNlcl9jbGFzc107CgoJCSMgY3JlYXRlIHRoZSBwYXJzZXIgaXQgbm90IGFscmVhZHkgc2V0CgkJaWYgKCEkcGFyc2VyKQoJCQkkcGFyc2VyID0gbmV3ICRwYXJzZXJfY2xhc3M7CgoJCSMgVHJhbnNmb3JtIHRleHQgdXNpbmcgcGFyc2VyLgoJCXJldHVybiAkcGFyc2VyLT50cmFuc2Zvcm0oJHRleHQpOwoJfQoKCSMjIyBDb25maWd1cmF0aW9uIFZhcmlhYmxlcyAjIyMKCgkjIENoYW5nZSB0byAiPiIgZm9yIEhUTUwgb3V0cHV0LgoJcHVibGljICRlbXB0eV9lbGVtZW50X3N1ZmZpeCA9ICIgLz4iOwoJcHVibGljICR0YWJfd2lkdGggPSA0OwoJCgkjIENoYW5nZSB0byBgdHJ1ZWAgdG8gZGlzYWxsb3cgbWFya3VwIG9yIGVudGl0aWVzLgoJcHVibGljICRub19tYXJrdXAgPSBmYWxzZTsKCXB1YmxpYyAkbm9fZW50aXRpZXMgPSBmYWxzZTsKCQoJIyBQcmVkZWZpbmVkIHVybHMgYW5kIHRpdGxlcyBmb3IgcmVmZXJlbmNlIGxpbmtzIGFuZCBpbWFnZXMuCglwdWJsaWMgJHByZWRlZl91cmxzID0gYXJyYXkoKTsKCXB1YmxpYyAkcHJlZGVmX3RpdGxlcyA9IGFycmF5KCk7CgoJIyBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gZm9yIFVSTHMKCXB1YmxpYyAkdXJsX2ZpbHRlcl9mdW5jID0gbnVsbDsKCgkjIE9wdGlvbmFsIGhlYWRlciBpZD0iIiBnZW5lcmF0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uLgoJcHVibGljICRoZWFkZXJfaWRfZnVuYyA9IG51bGw7CgoJIyBDbGFzcyBhdHRyaWJ1dGUgdG8gdG9nZ2xlICJlbmhhbmNlZCBvcmRlcmVkIGxpc3QiIGJlaGF2aW91cgoJIyBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSB3aWxsIGFsbG93IG9yZGVyZWQgbGlzdHMgdG8gc3RhcnQgZnJvbSB0aGUgaW5kZXgKCSMgbnVtYmVyIHRoYXQgaXMgZGVmaW5lZCBmaXJzdC4gIEZvciBleGFtcGxlOgoJIyAyLiBMaXN0IGl0ZW0gdHdvCgkjIDMuIExpc3QgaXRlbSB0aHJlZQoJIyAKCSMgYmVjb21lcwoJIyA8b2wgc3RhcnQ9IjIiPgoJIyA8bGk+TGlzdCBpdGVtIHR3bzwvbGk+CgkjIDxsaT5MaXN0IGl0ZW0gdGhyZWU8L2xpPgoJIyA8L29sPgoJcHVibGljICRlbmhhbmNlZF9vcmRlcmVkX2xpc3QgPSBmYWxzZTsKCgkjIyMgUGFyc2VyIEltcGxlbWVudGF0aW9uICMjIwoKCSMgUmVnZXggdG8gbWF0Y2ggYmFsYW5jZWQgW2JyYWNrZXRzXS4KCSMgTmVlZGVkIHRvIGluc2VydCBhIG1heGltdW0gYnJhY2tlZCBkZXB0aCB3aGlsZSBjb252ZXJ0aW5nIHRvIFBIUC4KCXByb3RlY3RlZCAkbmVzdGVkX2JyYWNrZXRzX2RlcHRoID0gNjsKCXByb3RlY3RlZCAkbmVzdGVkX2JyYWNrZXRzX3JlOwoJCglwcm90ZWN0ZWQgJG5lc3RlZF91cmxfcGFyZW50aGVzaXNfZGVwdGggPSA0OwoJcHJvdGVjdGVkICRuZXN0ZWRfdXJsX3BhcmVudGhlc2lzX3JlOwoKCSMgVGFibGUgb2YgaGFzaCB2YWx1ZXMgZm9yIGVzY2FwZWQgY2hhcmFjdGVyczoKCXByb3RlY3RlZCAkZXNjYXBlX2NoYXJzID0gJ1xgKl97fVtdKCk+IystLiEnOwoJcHJvdGVjdGVkICRlc2NhcGVfY2hhcnNfcmU7CgoKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCSMKCSMgQ29uc3RydWN0b3IgZnVuY3Rpb24uIEluaXRpYWxpemUgYXBwcm9wcmlhdGUgbWVtYmVyIHZhcmlhYmxlcy4KCSMKCQkkdGhpcy0+X2luaXREZXRhYigpOwoJCSR0aGlzLT5wcmVwYXJlSXRhbGljc0FuZEJvbGQoKTsKCQoJCSR0aGlzLT5uZXN0ZWRfYnJhY2tldHNfcmUgPSAKCQkJc3RyX3JlcGVhdCgnKD8+W15cW1xdXSt8XFsnLCAkdGhpcy0+bmVzdGVkX2JyYWNrZXRzX2RlcHRoKS4KCQkJc3RyX3JlcGVhdCgnXF0pKicsICR0aGlzLT5uZXN0ZWRfYnJhY2tldHNfZGVwdGgpOwoJCgkJJHRoaXMtPm5lc3RlZF91cmxfcGFyZW50aGVzaXNfcmUgPSAKCQkJc3RyX3JlcGVhdCgnKD8+W14oKVxzXSt8XCgnLCAkdGhpcy0+bmVzdGVkX3VybF9wYXJlbnRoZXNpc19kZXB0aCkuCgkJCXN0cl9yZXBlYXQoJyg/PlwpKSkqJywgJHRoaXMtPm5lc3RlZF91cmxfcGFyZW50aGVzaXNfZGVwdGgpOwoJCQoJCSR0aGlzLT5lc2NhcGVfY2hhcnNfcmUgPSAnWycucHJlZ19xdW90ZSgkdGhpcy0+ZXNjYXBlX2NoYXJzKS4nXSc7CgkJCgkJIyBTb3J0IGRvY3VtZW50LCBibG9jaywgYW5kIHNwYW4gZ2FtdXQgaW4gYXNjZW5kZW50IHByaW9yaXR5IG9yZGVyLgoJCWFzb3J0KCR0aGlzLT5kb2N1bWVudF9nYW11dCk7CgkJYXNvcnQoJHRoaXMtPmJsb2NrX2dhbXV0KTsKCQlhc29ydCgkdGhpcy0+c3Bhbl9nYW11dCk7Cgl9CgoKCSMgSW50ZXJuYWwgaGFzaGVzIHVzZWQgZHVyaW5nIHRyYW5zZm9ybWF0aW9uLgoJcHJvdGVjdGVkICR1cmxzID0gYXJyYXkoKTsKCXByb3RlY3RlZCAkdGl0bGVzID0gYXJyYXkoKTsKCXByb3RlY3RlZCAkaHRtbF9oYXNoZXMgPSBhcnJheSgpOwoJCgkjIFN0YXR1cyBmbGFnIHRvIGF2b2lkIGludmFsaWQgbmVzdGluZy4KCXByb3RlY3RlZCAkaW5fYW5jaG9yID0gZmFsc2U7CgkKCQoJcHJvdGVjdGVkIGZ1bmN0aW9uIHNldHVwKCkgewoJIwoJIyBDYWxsZWQgYmVmb3JlIHRoZSB0cmFuc2Zvcm1hdGlvbiBwcm9jZXNzIHN0YXJ0cyB0byBzZXR1cCBwYXJzZXIgCgkjIHN0YXRlcy4KCSMKCQkjIENsZWFyIGdsb2JhbCBoYXNoZXMuCgkJJHRoaXMtPnVybHMgPSAkdGhpcy0+cHJlZGVmX3VybHM7CgkJJHRoaXMtPnRpdGxlcyA9ICR0aGlzLT5wcmVkZWZfdGl0bGVzOwoJCSR0aGlzLT5odG1sX2hhc2hlcyA9IGFycmF5KCk7CgkJCgkJJHRoaXMtPmluX2FuY2hvciA9IGZhbHNlOwoJfQoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gdGVhcmRvd24oKSB7CgkjCgkjIENhbGxlZCBhZnRlciB0aGUgdHJhbnNmb3JtYXRpb24gcHJvY2VzcyB0byBjbGVhciBhbnkgdmFyaWFibGUgCgkjIHdoaWNoIG1heSBiZSB0YWtpbmcgdXAgbWVtb3J5IHVubmVjZXNzYXJseS4KCSMKCQkkdGhpcy0+dXJscyA9IGFycmF5KCk7CgkJJHRoaXMtPnRpdGxlcyA9IGFycmF5KCk7CgkJJHRoaXMtPmh0bWxfaGFzaGVzID0gYXJyYXkoKTsKCX0KCgoJcHVibGljIGZ1bmN0aW9uIHRyYW5zZm9ybSgkdGV4dCkgewoJIwoJIyBNYWluIGZ1bmN0aW9uLiBQZXJmb3JtcyBzb21lIHByZXByb2Nlc3Npbmcgb24gdGhlIGlucHV0IHRleHQKCSMgYW5kIHBhc3MgaXQgdGhyb3VnaCB0aGUgZG9jdW1lbnQgZ2FtdXQuCgkjCgkJJHRoaXMtPnNldHVwKCk7CgkKCQkjIFJlbW92ZSBVVEYtOCBCT00gYW5kIG1hcmtlciBjaGFyYWN0ZXIgaW4gaW5wdXQsIGlmIHByZXNlbnQuCgkJJHRleHQgPSBwcmVnX3JlcGxhY2UoJ3teXHhFRlx4QkJceEJGfFx4MUF9JywgJycsICR0ZXh0KTsKCgkJIyBTdGFuZGFyZGl6ZSBsaW5lIGVuZGluZ3M6CgkJIyAgIERPUyB0byBVbml4IGFuZCBNYWMgdG8gVW5peAoJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlKCd7XHJcbj99JywgIlxuIiwgJHRleHQpOwoKCQkjIE1ha2Ugc3VyZSAkdGV4dCBlbmRzIHdpdGggYSBjb3VwbGUgb2YgbmV3bGluZXM6CgkJJHRleHQgLj0gIlxuXG4iOwoKCQkjIENvbnZlcnQgYWxsIHRhYnMgdG8gc3BhY2VzLgoJCSR0ZXh0ID0gJHRoaXMtPmRldGFiKCR0ZXh0KTsKCgkJIyBUdXJuIGJsb2NrLWxldmVsIEhUTUwgYmxvY2tzIGludG8gaGFzaCBlbnRyaWVzCgkJJHRleHQgPSAkdGhpcy0+aGFzaEhUTUxCbG9ja3MoJHRleHQpOwoKCQkjIFN0cmlwIGFueSBsaW5lcyBjb25zaXN0aW5nIG9ubHkgb2Ygc3BhY2VzIGFuZCB0YWJzLgoJCSMgVGhpcyBtYWtlcyBzdWJzZXF1ZW50IHJlZ2V4ZW4gZWFzaWVyIHRvIHdyaXRlLCBiZWNhdXNlIHdlIGNhbgoJCSMgbWF0Y2ggY29uc2VjdXRpdmUgYmxhbmsgbGluZXMgd2l0aCAvXG4rLyBpbnN0ZWFkIG9mIHNvbWV0aGluZwoJCSMgY29udG9ydGVkIGxpa2UgL1sgXSpcbisvIC4KCQkkdGV4dCA9IHByZWdfcmVwbGFjZSgnL15bIF0rJC9tJywgJycsICR0ZXh0KTsKCgkJIyBSdW4gZG9jdW1lbnQgZ2FtdXQgbWV0aG9kcy4KCQlmb3JlYWNoICgkdGhpcy0+ZG9jdW1lbnRfZ2FtdXQgYXMgJG1ldGhvZCA9PiAkcHJpb3JpdHkpIHsKCQkJJHRleHQgPSAkdGhpcy0+JG1ldGhvZCgkdGV4dCk7CgkJfQoJCQoJCSR0aGlzLT50ZWFyZG93bigpOwoKCQlyZXR1cm4gJHRleHQgLiAiXG4iOwoJfQoJCglwcm90ZWN0ZWQgJGRvY3VtZW50X2dhbXV0ID0gYXJyYXkoCgkJIyBTdHJpcCBsaW5rIGRlZmluaXRpb25zLCBzdG9yZSBpbiBoYXNoZXMuCgkJInN0cmlwTGlua0RlZmluaXRpb25zIiA9PiAyMCwKCQkKCQkicnVuQmFzaWNCbG9ja0dhbXV0IiAgID0+IDMwLAoJCSk7CgoKCXByb3RlY3RlZCBmdW5jdGlvbiBzdHJpcExpbmtEZWZpbml0aW9ucygkdGV4dCkgewoJIwoJIyBTdHJpcHMgbGluayBkZWZpbml0aW9ucyBmcm9tIHRleHQsIHN0b3JlcyB0aGUgVVJMcyBhbmQgdGl0bGVzIGluCgkjIGhhc2ggcmVmZXJlbmNlcy4KCSMKCQkkbGVzc190aGFuX3RhYiA9ICR0aGlzLT50YWJfd2lkdGggLSAxOwoKCQkjIExpbmsgZGVmcyBhcmUgaW4gdGhlIGZvcm06IF5baWRdOiB1cmwgIm9wdGlvbmFsIHRpdGxlIgoJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CgkJCQkJCQleWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfVxbKC4rKVxdWyBdPzoJIyBpZCA9ICQxCgkJCQkJCQkgIFsgXSoKCQkJCQkJCSAgXG4/CQkJCSMgbWF5YmUgKm9uZSogbmV3bGluZQoJCQkJCQkJICBbIF0qCgkJCQkJCQkoPzoKCQkJCQkJCSAgPCguKz8pPgkJCSMgdXJsID0gJDIKCQkJCQkJCXwKCQkJCQkJCSAgKFxTKz8pCQkJIyB1cmwgPSAkMwoJCQkJCQkJKQoJCQkJCQkJICBbIF0qCgkJCQkJCQkgIFxuPwkJCQkjIG1heWJlIG9uZSBuZXdsaW5lCgkJCQkJCQkgIFsgXSoKCQkJCQkJCSg/OgoJCQkJCQkJCSg/PD1ccykJCQkjIGxvb2tiZWhpbmQgZm9yIHdoaXRlc3BhY2UKCQkJCQkJCQlbIihdCgkJCQkJCQkJKC4qPykJCQkjIHRpdGxlID0gJDQKCQkJCQkJCQlbIildCgkJCQkJCQkJWyBdKgoJCQkJCQkJKT8JIyB0aXRsZSBpcyBvcHRpb25hbAoJCQkJCQkJKD86XG4rfFxaKQoJCQl9eG0nLAoJCQlhcnJheSgkdGhpcywgJ19zdHJpcExpbmtEZWZpbml0aW9uc19jYWxsYmFjaycpLAoJCQkkdGV4dCk7CgkJcmV0dXJuICR0ZXh0OwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9zdHJpcExpbmtEZWZpbml0aW9uc19jYWxsYmFjaygkbWF0Y2hlcykgewoJCSRsaW5rX2lkID0gc3RydG9sb3dlcigkbWF0Y2hlc1sxXSk7CgkJJHVybCA9ICRtYXRjaGVzWzJdID09ICcnID8gJG1hdGNoZXNbM10gOiAkbWF0Y2hlc1syXTsKCQkkdGhpcy0+dXJsc1skbGlua19pZF0gPSAkdXJsOwoJCSR0aGlzLT50aXRsZXNbJGxpbmtfaWRdID0mICRtYXRjaGVzWzRdOwoJCXJldHVybiAnJzsgIyBTdHJpbmcgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIGJsb2NrCgl9CgoKCXByb3RlY3RlZCBmdW5jdGlvbiBoYXNoSFRNTEJsb2NrcygkdGV4dCkgewoJCWlmICgkdGhpcy0+bm9fbWFya3VwKSAgcmV0dXJuICR0ZXh0OwoKCQkkbGVzc190aGFuX3RhYiA9ICR0aGlzLT50YWJfd2lkdGggLSAxOwoKCQkjIEhhc2hpZnkgSFRNTCBibG9ja3M6CgkJIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBmb3IgYmxvY2stbGV2ZWwgSFRNTCB0YWdzLCBzdWNoIGFzIGhlYWRlcnMsCgkJIyBsaXN0cywgYW5kIHRhYmxlcy4gVGhhdCdzIGJlY2F1c2Ugd2Ugc3RpbGwgd2FudCB0byB3cmFwIDxwPnMgYXJvdW5kCgkJIyAicGFyYWdyYXBocyIgdGhhdCBhcmUgd3JhcHBlZCBpbiBub24tYmxvY2stbGV2ZWwgdGFncywgc3VjaCBhcyBhbmNob3JzLAoJCSMgcGhyYXNlIGVtcGhhc2lzLCBhbmQgc3BhbnMuIFRoZSBsaXN0IG9mIHRhZ3Mgd2UncmUgbG9va2luZyBmb3IgaXMKCQkjIGhhcmQtY29kZWQ6CgkJIwoJCSMgKiAgTGlzdCAiYSIgaXMgbWFkZSBvZiB0YWdzIHdoaWNoIGNhbiBiZSBib3RoIGlubGluZSBvciBibG9jay1sZXZlbC4KCQkjICAgIFRoZXNlIHdpbGwgYmUgdHJlYXRlZCBibG9jay1sZXZlbCB3aGVuIHRoZSBzdGFydCB0YWcgaXMgYWxvbmUgb24gCgkJIyAgICBpdHMgbGluZSwgb3RoZXJ3aXNlIHRoZXkncmUgbm90IG1hdGNoZWQgaGVyZSBhbmQgd2lsbCBiZSB0YWtlbiBhcyAKCQkjICAgIGlubGluZSBsYXRlci4KCQkjICogIExpc3QgImIiIGlzIG1hZGUgb2YgdGFncyB3aGljaCBhcmUgYWx3YXlzIGJsb2NrLWxldmVsOwoJCSMKCQkkYmxvY2tfdGFnc19hX3JlID0gJ2luc3xkZWwnOwoJCSRibG9ja190YWdzX2JfcmUgPSAncHxkaXZ8aFsxLTZdfGJsb2NrcXVvdGV8cHJlfHRhYmxlfGRsfG9sfHVsfGFkZHJlc3N8Jy4KCQkJCQkJICAgJ3NjcmlwdHxub3NjcmlwdHxzdHlsZXxmb3JtfGZpZWxkc2V0fGlmcmFtZXxtYXRofHN2Z3wnLgoJCQkJCQkgICAnYXJ0aWNsZXxzZWN0aW9ufG5hdnxhc2lkZXxoZ3JvdXB8aGVhZGVyfGZvb3RlcnwnLgoJCQkJCQkgICAnZmlndXJlJzsKCgkJIyBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoZSBjb250ZW50IG9mIGEgYmxvY2sgdGFnLgoJCSRuZXN0ZWRfdGFnc19sZXZlbCA9IDQ7CgkJJGF0dHIgPSAnCgkJCSg/PgkJCQkjIG9wdGlvbmFsIHRhZyBhdHRyaWJ1dGVzCgkJCSAgXHMJCQkjIHN0YXJ0cyB3aXRoIHdoaXRlc3BhY2UKCQkJICAoPz4KCQkJCVtePiIvXSsJCSMgdGV4dCBvdXRzaWRlIHF1b3RlcwoJCQkgIHwKCQkJCS8rKD8hPikJCSMgc2xhc2ggbm90IGZvbGxvd2VkIGJ5ICI+IgoJCQkgIHwKCQkJCSJbXiJdKiIJCSMgdGV4dCBpbnNpZGUgZG91YmxlIHF1b3RlcyAodG9sZXJhdGUgIj4iKQoJCQkgIHwKCQkJCVwnW15cJ10qXCcJIyB0ZXh0IGluc2lkZSBzaW5nbGUgcXVvdGVzICh0b2xlcmF0ZSAiPiIpCgkJCSAgKSoKCQkJKT8JCgkJCSc7CgkJJGNvbnRlbnQgPQoJCQlzdHJfcmVwZWF0KCcKCQkJCSg/PgoJCQkJICBbXjxdKwkJCSMgY29udGVudCB3aXRob3V0IHRhZwoJCQkJfAoJCQkJICA8XDIJCQkjIG5lc3RlZCBvcGVuaW5nIHRhZwoJCQkJCScuJGF0dHIuJwkjIGF0dHJpYnV0ZXMKCQkJCQkoPz4KCQkJCQkgIC8+CgkJCQkJfAoJCQkJCSAgPicsICRuZXN0ZWRfdGFnc19sZXZlbCkuCSMgZW5kIG9mIG9wZW5pbmcgdGFnCgkJCQkJICAnLio/Jy4JCQkJCSMgbGFzdCBsZXZlbCBuZXN0ZWQgdGFnIGNvbnRlbnQKCQkJc3RyX3JlcGVhdCgnCgkJCQkJICA8L1wyXHMqPgkjIGNsb3NpbmcgbmVzdGVkIHRhZwoJCQkJCSkKCQkJCSAgfAkJCQkKCQkJCQk8KD8hL1wyXHMqPgkjIG90aGVyIHRhZ3Mgd2l0aCBhIGRpZmZlcmVudCBuYW1lCgkJCQkgICkKCQkJCSkqJywKCQkJCSRuZXN0ZWRfdGFnc19sZXZlbCk7CgkJJGNvbnRlbnQyID0gc3RyX3JlcGxhY2UoJ1wyJywgJ1wzJywgJGNvbnRlbnQpOwoKCQkjIEZpcnN0LCBsb29rIGZvciBuZXN0ZWQgYmxvY2tzLCBlLmcuOgoJCSMgCTxkaXY+CgkJIyAJCTxkaXY+CgkJIyAJCXRhZ3MgZm9yIGlubmVyIGJsb2NrIG11c3QgYmUgaW5kZW50ZWQuCgkJIyAJCTwvZGl2PgoJCSMgCTwvZGl2PgoJCSMKCQkjIFRoZSBvdXRlcm1vc3QgdGFncyBtdXN0IHN0YXJ0IGF0IHRoZSBsZWZ0IG1hcmdpbiBmb3IgdGhpcyB0byBtYXRjaCwgYW5kCgkJIyB0aGUgaW5uZXIgbmVzdGVkIGRpdnMgbXVzdCBiZSBpbmRlbnRlZC4KCQkjIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgdGhlIG5leHQsIG1vcmUgbGliZXJhbCBtYXRjaCwgYmVjYXVzZSB0aGUgbmV4dAoJCSMgbWF0Y2ggd2lsbCBzdGFydCBhdCB0aGUgZmlyc3QgYDxkaXY+YCBhbmQgc3RvcCBhdCB0aGUgZmlyc3QgYDwvZGl2PmAuCgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3soPz4KCQkJKD8+CgkJCQkoPzw9XG4pCQkJIyBTdGFydGluZyBvbiBpdHMgb3duIGxpbmUKCQkJCXwJCQkJIyBvcgoJCQkJXEFcbj8JCQkjIHRoZSBhdCBiZWdpbm5pbmcgb2YgdGhlIGRvYwoJCQkpCgkJCSgJCQkJCQkjIHNhdmUgaW4gJDEKCgkJCSAgIyBNYXRjaCBmcm9tIGBcbjx0YWc+YCB0byBgPC90YWc+XG5gLCBoYW5kbGluZyBuZXN0ZWQgdGFncyAKCQkJICAjIGluIGJldHdlZW4uCgkJCQkJCgkJCQkJCVsgXXswLCcuJGxlc3NfdGhhbl90YWIuJ30KCQkJCQkJPCgnLiRibG9ja190YWdzX2JfcmUuJykjIHN0YXJ0IHRhZyA9ICQyCgkJCQkJCScuJGF0dHIuJz4JCQkjIGF0dHJpYnV0ZXMgZm9sbG93ZWQgYnkgPiBhbmQgXG4KCQkJCQkJJy4kY29udGVudC4nCQkjIGNvbnRlbnQsIHN1cHBvcnQgbmVzdGluZwoJCQkJCQk8L1wyPgkJCQkjIHRoZSBtYXRjaGluZyBlbmQgdGFnCgkJCQkJCVsgXSoJCQkJIyB0cmFpbGluZyBzcGFjZXMvdGFicwoJCQkJCQkoPz1cbit8XFopCSMgZm9sbG93ZWQgYnkgYSBuZXdsaW5lIG9yIGVuZCBvZiBkb2N1bWVudAoKCQkJfCAjIFNwZWNpYWwgdmVyc2lvbiBmb3IgdGFncyBvZiBncm91cCBhLgoKCQkJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfQoJCQkJCQk8KCcuJGJsb2NrX3RhZ3NfYV9yZS4nKSMgc3RhcnQgdGFnID0gJDMKCQkJCQkJJy4kYXR0ci4nPlsgXSpcbgkjIGF0dHJpYnV0ZXMgZm9sbG93ZWQgYnkgPgoJCQkJCQknLiRjb250ZW50Mi4nCQkjIGNvbnRlbnQsIHN1cHBvcnQgbmVzdGluZwoJCQkJCQk8L1wzPgkJCQkjIHRoZSBtYXRjaGluZyBlbmQgdGFnCgkJCQkJCVsgXSoJCQkJIyB0cmFpbGluZyBzcGFjZXMvdGFicwoJCQkJCQkoPz1cbit8XFopCSMgZm9sbG93ZWQgYnkgYSBuZXdsaW5lIG9yIGVuZCBvZiBkb2N1bWVudAoJCQkJCQoJCQl8ICMgU3BlY2lhbCBjYXNlIGp1c3QgZm9yIDxociAvPi4gSXQgd2FzIGVhc2llciB0byBtYWtlIGEgc3BlY2lhbCAKCQkJICAjIGNhc2UgdGhhbiB0byBtYWtlIHRoZSBvdGhlciByZWdleCBtb3JlIGNvbXBsaWNhdGVkLgoJCQkKCQkJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfQoJCQkJCQk8KGhyKQkJCQkjIHN0YXJ0IHRhZyA9ICQyCgkJCQkJCScuJGF0dHIuJwkJCSMgYXR0cmlidXRlcwoJCQkJCQkvPz4JCQkJCSMgdGhlIG1hdGNoaW5nIGVuZCB0YWcKCQkJCQkJWyBdKgoJCQkJCQkoPz1cbnsyLH18XFopCQkjIGZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSBvciBlbmQgb2YgZG9jdW1lbnQKCQkJCgkJCXwgIyBTcGVjaWFsIGNhc2UgZm9yIHN0YW5kYWxvbmUgSFRNTCBjb21tZW50czoKCQkJCgkJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfQoJCQkJCSg/czoKCQkJCQkJPCEtLSAuKj8gLS0+CgkJCQkJKQoJCQkJCVsgXSoKCQkJCQkoPz1cbnsyLH18XFopCQkjIGZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSBvciBlbmQgb2YgZG9jdW1lbnQKCQkJCgkJCXwgIyBQSFAgYW5kIEFTUC1zdHlsZSBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICg8PyBhbmQgPCUpCgkJCQoJCQkJCVsgXXswLCcuJGxlc3NfdGhhbl90YWIuJ30KCQkJCQkoP3M6CgkJCQkJCTwoWz8lXSkJCQkjICQyCgkJCQkJCS4qPwoJCQkJCQlcMj4KCQkJCQkpCgkJCQkJWyBdKgoJCQkJCSg/PVxuezIsfXxcWikJCSMgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lIG9yIGVuZCBvZiBkb2N1bWVudAoJCQkJCQoJCQkpCgkJCSl9U3htaScsCgkJCWFycmF5KCR0aGlzLCAnX2hhc2hIVE1MQmxvY2tzX2NhbGxiYWNrJyksCgkJCSR0ZXh0KTsKCgkJcmV0dXJuICR0ZXh0OwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9oYXNoSFRNTEJsb2Nrc19jYWxsYmFjaygkbWF0Y2hlcykgewoJCSR0ZXh0ID0gJG1hdGNoZXNbMV07CgkJJGtleSAgPSAkdGhpcy0+aGFzaEJsb2NrKCR0ZXh0KTsKCQlyZXR1cm4gIlxuXG4ka2V5XG5cbiI7Cgl9CgkKCQoJcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc2hQYXJ0KCR0ZXh0LCAkYm91bmRhcnkgPSAnWCcpIHsKCSMKCSMgQ2FsbGVkIHdoZW5ldmVyIGEgdGFnIG11c3QgYmUgaGFzaGVkIHdoZW4gYSBmdW5jdGlvbiBpbnNlcnQgYW4gYXRvbWljIAoJIyBlbGVtZW50IGluIHRoZSB0ZXh0IHN0cmVhbS4gUGFzc2luZyAkdGV4dCB0byB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gZ2l2ZXMKCSMgYSB1bmlxdWUgdGV4dC10b2tlbiB3aGljaCB3aWxsIGJlIHJldmVydGVkIGJhY2sgd2hlbiBjYWxsaW5nIHVuaGFzaC4KCSMKCSMgVGhlICRib3VuZGFyeSBhcmd1bWVudCBzcGVjaWZ5IHdoYXQgY2hhcmFjdGVyIHNob3VsZCBiZSB1c2VkIHRvIHN1cnJvdW5kCgkjIHRoZSB0b2tlbi4gQnkgY29udmVuc2lvbiwgIkIiIGlzIHVzZWQgZm9yIGJsb2NrIGVsZW1lbnRzIHRoYXQgbmVlZHMgbm90CgkjIHRvIGJlIHdyYXBwZWQgaW50byBwYXJhZ3JhcGggdGFncyBhdCB0aGUgZW5kLCAiOiIgaXMgdXNlZCBmb3IgZWxlbWVudHMKCSMgdGhhdCBhcmUgd29yZCBzZXBhcmF0b3JzIGFuZCAiWCIgaXMgdXNlZCBpbiB0aGUgZ2VuZXJhbCBjYXNlLgoJIwoJCSMgU3dhcCBiYWNrIGFueSB0YWcgaGFzaCBmb3VuZCBpbiAkdGV4dCBzbyB3ZSBkbyBub3QgaGF2ZSB0byBgdW5oYXNoYAoJCSMgbXVsdGlwbGUgdGltZXMgYXQgdGhlIGVuZC4KCQkkdGV4dCA9ICR0aGlzLT51bmhhc2goJHRleHQpOwoJCQoJCSMgVGhlbiBoYXNoIHRoZSBibG9jay4KCQlzdGF0aWMgJGkgPSAwOwoJCSRrZXkgPSAiJGJvdW5kYXJ5XHgxQSIgLiArKyRpIC4gJGJvdW5kYXJ5OwoJCSR0aGlzLT5odG1sX2hhc2hlc1ska2V5XSA9ICR0ZXh0OwoJCXJldHVybiAka2V5OyAjIFN0cmluZyB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgdGFnLgoJfQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzaEJsb2NrKCR0ZXh0KSB7CgkjCgkjIFNob3J0Y3V0IGZ1bmN0aW9uIGZvciBoYXNoUGFydCB3aXRoIGJsb2NrLWxldmVsIGJvdW5kYXJpZXMuCgkjCgkJcmV0dXJuICR0aGlzLT5oYXNoUGFydCgkdGV4dCwgJ0InKTsKCX0KCgoJcHJvdGVjdGVkICRibG9ja19nYW11dCA9IGFycmF5KAoJIwoJIyBUaGVzZSBhcmUgYWxsIHRoZSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBmb3JtIGJsb2NrLWxldmVsCgkjIHRhZ3MgbGlrZSBwYXJhZ3JhcGhzLCBoZWFkZXJzLCBhbmQgbGlzdCBpdGVtcy4KCSMKCQkiZG9IZWFkZXJzIiAgICAgICAgID0+IDEwLAoJCSJkb0hvcml6b250YWxSdWxlcyIgPT4gMjAsCgkJCgkJImRvTGlzdHMiICAgICAgICAgICA9PiA0MCwKCQkiZG9Db2RlQmxvY2tzIiAgICAgID0+IDUwLAoJCSJkb0Jsb2NrUXVvdGVzIiAgICAgPT4gNjAsCgkJKTsKCglwcm90ZWN0ZWQgZnVuY3Rpb24gcnVuQmxvY2tHYW11dCgkdGV4dCkgewoJIwoJIyBSdW4gYmxvY2sgZ2FtdXQgdHJhbmZvcm1hdGlvbnMuCgkjCgkJIyBXZSBuZWVkIHRvIGVzY2FwZSByYXcgSFRNTCBpbiBNYXJrZG93biBzb3VyY2UgYmVmb3JlIGRvaW5nIGFueXRoaW5nIAoJCSMgZWxzZS4gVGhpcyBuZWVkIHRvIGJlIGRvbmUgZm9yIGVhY2ggYmxvY2ssIGFuZCBub3Qgb25seSBhdCB0aGUgCgkJIyBiZWdpbmluZyBpbiB0aGUgTWFya2Rvd24gZnVuY3Rpb24gc2luY2UgaGFzaGVkIGJsb2NrcyBjYW4gYmUgcGFydCBvZgoJCSMgbGlzdCBpdGVtcyBhbmQgY291bGQgaGF2ZSBiZWVuIGluZGVudGVkLiBJbmRlbnRlZCBibG9ja3Mgd291bGQgaGF2ZSAKCQkjIGJlZW4gc2VlbiBhcyBhIGNvZGUgYmxvY2sgaW4gYSBwcmV2aW91cyBwYXNzIG9mIGhhc2hIVE1MQmxvY2tzLgoJCSR0ZXh0ID0gJHRoaXMtPmhhc2hIVE1MQmxvY2tzKCR0ZXh0KTsKCQkKCQlyZXR1cm4gJHRoaXMtPnJ1bkJhc2ljQmxvY2tHYW11dCgkdGV4dCk7Cgl9CgkKCXByb3RlY3RlZCBmdW5jdGlvbiBydW5CYXNpY0Jsb2NrR2FtdXQoJHRleHQpIHsKCSMKCSMgUnVuIGJsb2NrIGdhbXV0IHRyYW5mb3JtYXRpb25zLCB3aXRob3V0IGhhc2hpbmcgSFRNTCBibG9ja3MuIFRoaXMgaXMgCgkjIHVzZWZ1bCB3aGVuIEhUTUwgYmxvY2tzIGFyZSBrbm93biB0byBiZSBhbHJlYWR5IGhhc2hlZCwgbGlrZSBpbiB0aGUgZmlyc3QKCSMgd2hvbGUtZG9jdW1lbnQgcGFzcy4KCSMKCQlmb3JlYWNoICgkdGhpcy0+YmxvY2tfZ2FtdXQgYXMgJG1ldGhvZCA9PiAkcHJpb3JpdHkpIHsKCQkJJHRleHQgPSAkdGhpcy0+JG1ldGhvZCgkdGV4dCk7CgkJfQoJCQoJCSMgRmluYWxseSBmb3JtIHBhcmFncmFwaCBhbmQgcmVzdG9yZSBoYXNoZWQgYmxvY2tzLgoJCSR0ZXh0ID0gJHRoaXMtPmZvcm1QYXJhZ3JhcGhzKCR0ZXh0KTsKCgkJcmV0dXJuICR0ZXh0OwoJfQoJCgkKCXByb3RlY3RlZCBmdW5jdGlvbiBkb0hvcml6b250YWxSdWxlcygkdGV4dCkgewoJCSMgRG8gSG9yaXpvbnRhbCBSdWxlczoKCQlyZXR1cm4gcHJlZ19yZXBsYWNlKAoJCQknewoJCQkJXlsgXXswLDN9CSMgTGVhZGluZyBzcGFjZQoJCQkJKFstKl9dKQkJIyAkMTogRmlyc3QgbWFya2VyCgkJCQkoPz4JCQkjIFJlcGVhdGVkIG1hcmtlciBncm91cAoJCQkJCVsgXXswLDJ9CSMgWmVybywgb25lLCBvciB0d28gc3BhY2VzLgoJCQkJCVwxCQkJIyBNYXJrZXIgY2hhcmFjdGVyCgkJCQkpezIsfQkJIyBHcm91cCByZXBlYXRlZCBhdCBsZWFzdCB0d2ljZQoJCQkJWyBdKgkJIyBUYWlsaW5nIHNwYWNlcwoJCQkJJAkJCSMgRW5kIG9mIGxpbmUuCgkJCX1teCcsCgkJCSJcbiIuJHRoaXMtPmhhc2hCbG9jaygiPGhyJHRoaXMtPmVtcHR5X2VsZW1lbnRfc3VmZml4IikuIlxuIiwgCgkJCSR0ZXh0KTsKCX0KCgoJcHJvdGVjdGVkICRzcGFuX2dhbXV0ID0gYXJyYXkoCgkjCgkjIFRoZXNlIGFyZSBhbGwgdGhlIHRyYW5zZm9ybWF0aW9ucyB0aGF0IG9jY3VyICp3aXRoaW4qIGJsb2NrLWxldmVsCgkjIHRhZ3MgbGlrZSBwYXJhZ3JhcGhzLCBoZWFkZXJzLCBhbmQgbGlzdCBpdGVtcy4KCSMKCQkjIFByb2Nlc3MgY2hhcmFjdGVyIGVzY2FwZXMsIGNvZGUgc3BhbnMsIGFuZCBpbmxpbmUgSFRNTAoJCSMgaW4gb25lIHNob3QuCgkJInBhcnNlU3BhbiIgICAgICAgICAgID0+IC0zMCwKCgkJIyBQcm9jZXNzIGFuY2hvciBhbmQgaW1hZ2UgdGFncy4gSW1hZ2VzIG11c3QgY29tZSBmaXJzdCwKCQkjIGJlY2F1c2UgIVtmb29dW2ZdIGxvb2tzIGxpa2UgYW4gYW5jaG9yLgoJCSJkb0ltYWdlcyIgICAgICAgICAgICA9PiAgMTAsCgkJImRvQW5jaG9ycyIgICAgICAgICAgID0+ICAyMCwKCQkKCQkjIE1ha2UgbGlua3Mgb3V0IG9mIHRoaW5ncyBsaWtlIGA8aHR0cDovL2V4YW1wbGUuY29tLz5gCgkJIyBNdXN0IGNvbWUgYWZ0ZXIgZG9BbmNob3JzLCBiZWNhdXNlIHlvdSBjYW4gdXNlIDwgYW5kID4KCQkjIGRlbGltaXRlcnMgaW4gaW5saW5lIGxpbmtzIGxpa2UgW3RoaXNdKDx1cmw+KS4KCQkiZG9BdXRvTGlua3MiICAgICAgICAgPT4gIDMwLAoJCSJlbmNvZGVBbXBzQW5kQW5nbGVzIiA9PiAgNDAsCgoJCSJkb0l0YWxpY3NBbmRCb2xkIiAgICA9PiAgNTAsCgkJImRvSGFyZEJyZWFrcyIgICAgICAgID0+ICA2MCwKCQkpOwoKCXByb3RlY3RlZCBmdW5jdGlvbiBydW5TcGFuR2FtdXQoJHRleHQpIHsKCSMKCSMgUnVuIHNwYW4gZ2FtdXQgdHJhbmZvcm1hdGlvbnMuCgkjCgkJZm9yZWFjaCAoJHRoaXMtPnNwYW5fZ2FtdXQgYXMgJG1ldGhvZCA9PiAkcHJpb3JpdHkpIHsKCQkJJHRleHQgPSAkdGhpcy0+JG1ldGhvZCgkdGV4dCk7CgkJfQoKCQlyZXR1cm4gJHRleHQ7Cgl9CgkKCQoJcHJvdGVjdGVkIGZ1bmN0aW9uIGRvSGFyZEJyZWFrcygkdGV4dCkgewoJCSMgRG8gaGFyZCBicmVha3M6CgkJcmV0dXJuIHByZWdfcmVwbGFjZV9jYWxsYmFjaygnLyB7Mix9XG4vJywgCgkJCWFycmF5KCR0aGlzLCAnX2RvSGFyZEJyZWFrc19jYWxsYmFjaycpLCAkdGV4dCk7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX2RvSGFyZEJyZWFrc19jYWxsYmFjaygkbWF0Y2hlcykgewoJCXJldHVybiAkdGhpcy0+aGFzaFBhcnQoIjxiciR0aGlzLT5lbXB0eV9lbGVtZW50X3N1ZmZpeFxuIik7Cgl9CgoKCXByb3RlY3RlZCBmdW5jdGlvbiBkb0FuY2hvcnMoJHRleHQpIHsKCSMKCSMgVHVybiBNYXJrZG93biBsaW5rIHNob3J0Y3V0cyBpbnRvIFhIVE1MIDxhPiB0YWdzLgoJIwoJCWlmICgkdGhpcy0+aW5fYW5jaG9yKSByZXR1cm4gJHRleHQ7CgkJJHRoaXMtPmluX2FuY2hvciA9IHRydWU7CgkJCgkJIwoJCSMgRmlyc3QsIGhhbmRsZSByZWZlcmVuY2Utc3R5bGUgbGlua3M6IFtsaW5rIHRleHRdIFtpZF0KCQkjCgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKCQkJKAkJCQkJIyB3cmFwIHdob2xlIG1hdGNoIGluICQxCgkJCSAgXFsKCQkJCSgnLiR0aGlzLT5uZXN0ZWRfYnJhY2tldHNfcmUuJykJIyBsaW5rIHRleHQgPSAkMgoJCQkgIFxdCgoJCQkgIFsgXT8JCQkJIyBvbmUgb3B0aW9uYWwgc3BhY2UKCQkJICAoPzpcblsgXSopPwkJIyBvbmUgb3B0aW9uYWwgbmV3bGluZSBmb2xsb3dlZCBieSBzcGFjZXMKCgkJCSAgXFsKCQkJCSguKj8pCQkjIGlkID0gJDMKCQkJICBcXQoJCQkpCgkJCX14cycsCgkJCWFycmF5KCR0aGlzLCAnX2RvQW5jaG9yc19yZWZlcmVuY2VfY2FsbGJhY2snKSwgJHRleHQpOwoKCQkjCgkJIyBOZXh0LCBpbmxpbmUtc3R5bGUgbGlua3M6IFtsaW5rIHRleHRdKHVybCAib3B0aW9uYWwgdGl0bGUiKQoJCSMKCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnewoJCQkoCQkJCSMgd3JhcCB3aG9sZSBtYXRjaCBpbiAkMQoJCQkgIFxbCgkJCQkoJy4kdGhpcy0+bmVzdGVkX2JyYWNrZXRzX3JlLicpCSMgbGluayB0ZXh0ID0gJDIKCQkJICBcXQoJCQkgIFwoCQkJIyBsaXRlcmFsIHBhcmVuCgkJCQlbIFxuXSoKCQkJCSg/OgoJCQkJCTwoLis/KT4JIyBocmVmID0gJDMKCQkJCXwKCQkJCQkoJy4kdGhpcy0+bmVzdGVkX3VybF9wYXJlbnRoZXNpc19yZS4nKQkjIGhyZWYgPSAkNAoJCQkJKQoJCQkJWyBcbl0qCgkJCQkoCQkJIyAkNQoJCQkJICAoW1wnIl0pCSMgcXVvdGUgY2hhciA9ICQ2CgkJCQkgICguKj8pCQkjIFRpdGxlID0gJDcKCQkJCSAgXDYJCSMgbWF0Y2hpbmcgcXVvdGUKCQkJCSAgWyBcbl0qCSMgaWdub3JlIGFueSBzcGFjZXMvdGFicyBiZXR3ZWVuIGNsb3NpbmcgcXVvdGUgYW5kICkKCQkJCSk/CQkJIyB0aXRsZSBpcyBvcHRpb25hbAoJCQkgIFwpCgkJCSkKCQkJfXhzJywKCQkJYXJyYXkoJHRoaXMsICdfZG9BbmNob3JzX2lubGluZV9jYWxsYmFjaycpLCAkdGV4dCk7CgoJCSMKCQkjIExhc3QsIGhhbmRsZSByZWZlcmVuY2Utc3R5bGUgc2hvcnRjdXRzOiBbbGluayB0ZXh0XQoJCSMgVGhlc2UgbXVzdCBjb21lIGxhc3QgaW4gY2FzZSB5b3UndmUgYWxzbyBnb3QgW2xpbmsgdGV4dF1bMV0KCQkjIG9yIFtsaW5rIHRleHRdKC9mb28pCgkJIwoJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CgkJCSgJCQkJCSMgd3JhcCB3aG9sZSBtYXRjaCBpbiAkMQoJCQkgIFxbCgkJCQkoW15cW1xdXSspCQkjIGxpbmsgdGV4dCA9ICQyOyBjYW5cJ3QgY29udGFpbiBbIG9yIF0KCQkJICBcXQoJCQkpCgkJCX14cycsCgkJCWFycmF5KCR0aGlzLCAnX2RvQW5jaG9yc19yZWZlcmVuY2VfY2FsbGJhY2snKSwgJHRleHQpOwoKCQkkdGhpcy0+aW5fYW5jaG9yID0gZmFsc2U7CgkJcmV0dXJuICR0ZXh0OwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9kb0FuY2hvcnNfcmVmZXJlbmNlX2NhbGxiYWNrKCRtYXRjaGVzKSB7CgkJJHdob2xlX21hdGNoID0gICRtYXRjaGVzWzFdOwoJCSRsaW5rX3RleHQgICA9ICAkbWF0Y2hlc1syXTsKCQkkbGlua19pZCAgICAgPSYgJG1hdGNoZXNbM107CgoJCWlmICgkbGlua19pZCA9PSAiIikgewoJCQkjIGZvciBzaG9ydGN1dCBsaW5rcyBsaWtlIFt0aGlzXVtdIG9yIFt0aGlzXS4KCQkJJGxpbmtfaWQgPSAkbGlua190ZXh0OwoJCX0KCQkKCQkjIGxvd2VyLWNhc2UgYW5kIHR1cm4gZW1iZWRkZWQgbmV3bGluZXMgaW50byBzcGFjZXMKCQkkbGlua19pZCA9IHN0cnRvbG93ZXIoJGxpbmtfaWQpOwoJCSRsaW5rX2lkID0gcHJlZ19yZXBsYWNlKCd7WyBdP1xufScsICcgJywgJGxpbmtfaWQpOwoKCQlpZiAoaXNzZXQoJHRoaXMtPnVybHNbJGxpbmtfaWRdKSkgewoJCQkkdXJsID0gJHRoaXMtPnVybHNbJGxpbmtfaWRdOwoJCQkkdXJsID0gJHRoaXMtPmVuY29kZVVSTEF0dHJpYnV0ZSgkdXJsKTsKCQkJCgkJCSRyZXN1bHQgPSAiPGEgaHJlZj1cIiR1cmxcIiI7CgkJCWlmICggaXNzZXQoICR0aGlzLT50aXRsZXNbJGxpbmtfaWRdICkgKSB7CgkJCQkkdGl0bGUgPSAkdGhpcy0+dGl0bGVzWyRsaW5rX2lkXTsKCQkJCSR0aXRsZSA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJHRpdGxlKTsKCQkJCSRyZXN1bHQgLj0gICIgdGl0bGU9XCIkdGl0bGVcIiI7CgkJCX0KCQkKCQkJJGxpbmtfdGV4dCA9ICR0aGlzLT5ydW5TcGFuR2FtdXQoJGxpbmtfdGV4dCk7CgkJCSRyZXN1bHQgLj0gIj4kbGlua190ZXh0PC9hPiI7CgkJCSRyZXN1bHQgPSAkdGhpcy0+aGFzaFBhcnQoJHJlc3VsdCk7CgkJfQoJCWVsc2UgewoJCQkkcmVzdWx0ID0gJHdob2xlX21hdGNoOwoJCX0KCQlyZXR1cm4gJHJlc3VsdDsKCX0KCXByb3RlY3RlZCBmdW5jdGlvbiBfZG9BbmNob3JzX2lubGluZV9jYWxsYmFjaygkbWF0Y2hlcykgewoJCSR3aG9sZV9tYXRjaAk9ICAkbWF0Y2hlc1sxXTsKCQkkbGlua190ZXh0CQk9ICAkdGhpcy0+cnVuU3BhbkdhbXV0KCRtYXRjaGVzWzJdKTsKCQkkdXJsCQkJPSAgJG1hdGNoZXNbM10gPT0gJycgPyAkbWF0Y2hlc1s0XSA6ICRtYXRjaGVzWzNdOwoJCSR0aXRsZQkJCT0mICRtYXRjaGVzWzddOwoKCQkvLyBpZiB0aGUgVVJMIHdhcyBvZiB0aGUgZm9ybSA8cyBwIGEgYyBlIHM+IGl0IGdvdCBjYXVnaHQgYnkgdGhlIEhUTUwKCQkvLyB0YWcgcGFyc2VyIGFuZCBoYXNoZWQuIE5lZWQgdG8gcmV2ZXJzZSB0aGUgcHJvY2VzcyBiZWZvcmUgdXNpbmcgdGhlIFVSTC4KCQkkdW5oYXNoZWQgPSAkdGhpcy0+dW5oYXNoKCR1cmwpOwoJCWlmICgkdW5oYXNoZWQgIT0gJHVybCkKCQkJJHVybCA9IHByZWdfcmVwbGFjZSgnL148KC4qKT4kLycsICdcMScsICR1bmhhc2hlZCk7CgoJCSR1cmwgPSAkdGhpcy0+ZW5jb2RlVVJMQXR0cmlidXRlKCR1cmwpOwoKCQkkcmVzdWx0ID0gIjxhIGhyZWY9XCIkdXJsXCIiOwoJCWlmIChpc3NldCgkdGl0bGUpKSB7CgkJCSR0aXRsZSA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJHRpdGxlKTsKCQkJJHJlc3VsdCAuPSAgIiB0aXRsZT1cIiR0aXRsZVwiIjsKCQl9CgkJCgkJJGxpbmtfdGV4dCA9ICR0aGlzLT5ydW5TcGFuR2FtdXQoJGxpbmtfdGV4dCk7CgkJJHJlc3VsdCAuPSAiPiRsaW5rX3RleHQ8L2E+IjsKCgkJcmV0dXJuICR0aGlzLT5oYXNoUGFydCgkcmVzdWx0KTsKCX0KCgoJcHJvdGVjdGVkIGZ1bmN0aW9uIGRvSW1hZ2VzKCR0ZXh0KSB7CgkjCgkjIFR1cm4gTWFya2Rvd24gaW1hZ2Ugc2hvcnRjdXRzIGludG8gPGltZz4gdGFncy4KCSMKCQkjCgkJIyBGaXJzdCwgaGFuZGxlIHJlZmVyZW5jZS1zdHlsZSBsYWJlbGVkIGltYWdlczogIVthbHQgdGV4dF1baWRdCgkJIwoJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CgkJCSgJCQkJIyB3cmFwIHdob2xlIG1hdGNoIGluICQxCgkJCSAgIVxbCgkJCQkoJy4kdGhpcy0+bmVzdGVkX2JyYWNrZXRzX3JlLicpCQkjIGFsdCB0ZXh0ID0gJDIKCQkJICBcXQoKCQkJICBbIF0/CQkJCSMgb25lIG9wdGlvbmFsIHNwYWNlCgkJCSAgKD86XG5bIF0qKT8JCSMgb25lIG9wdGlvbmFsIG5ld2xpbmUgZm9sbG93ZWQgYnkgc3BhY2VzCgoJCQkgIFxbCgkJCQkoLio/KQkJIyBpZCA9ICQzCgkJCSAgXF0KCgkJCSkKCQkJfXhzJywgCgkJCWFycmF5KCR0aGlzLCAnX2RvSW1hZ2VzX3JlZmVyZW5jZV9jYWxsYmFjaycpLCAkdGV4dCk7CgoJCSMKCQkjIE5leHQsIGhhbmRsZSBpbmxpbmUgaW1hZ2VzOiAgIVthbHQgdGV4dF0odXJsICJvcHRpb25hbCB0aXRsZSIpCgkJIyBEb24ndCBmb3JnZXQ6IGVuY29kZSAqIGFuZCBfCgkJIwoJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CgkJCSgJCQkJIyB3cmFwIHdob2xlIG1hdGNoIGluICQxCgkJCSAgIVxbCgkJCQkoJy4kdGhpcy0+bmVzdGVkX2JyYWNrZXRzX3JlLicpCQkjIGFsdCB0ZXh0ID0gJDIKCQkJICBcXQoJCQkgIFxzPwkJCSMgT25lIG9wdGlvbmFsIHdoaXRlc3BhY2UgY2hhcmFjdGVyCgkJCSAgXCgJCQkjIGxpdGVyYWwgcGFyZW4KCQkJCVsgXG5dKgoJCQkJKD86CgkJCQkJPChcUyopPgkjIHNyYyB1cmwgPSAkMwoJCQkJfAoJCQkJCSgnLiR0aGlzLT5uZXN0ZWRfdXJsX3BhcmVudGhlc2lzX3JlLicpCSMgc3JjIHVybCA9ICQ0CgkJCQkpCgkJCQlbIFxuXSoKCQkJCSgJCQkjICQ1CgkJCQkgIChbXCciXSkJIyBxdW90ZSBjaGFyID0gJDYKCQkJCSAgKC4qPykJCSMgdGl0bGUgPSAkNwoJCQkJICBcNgkJIyBtYXRjaGluZyBxdW90ZQoJCQkJICBbIFxuXSoKCQkJCSk/CQkJIyB0aXRsZSBpcyBvcHRpb25hbAoJCQkgIFwpCgkJCSkKCQkJfXhzJywKCQkJYXJyYXkoJHRoaXMsICdfZG9JbWFnZXNfaW5saW5lX2NhbGxiYWNrJyksICR0ZXh0KTsKCgkJcmV0dXJuICR0ZXh0OwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9kb0ltYWdlc19yZWZlcmVuY2VfY2FsbGJhY2soJG1hdGNoZXMpIHsKCQkkd2hvbGVfbWF0Y2ggPSAkbWF0Y2hlc1sxXTsKCQkkYWx0X3RleHQgICAgPSAkbWF0Y2hlc1syXTsKCQkkbGlua19pZCAgICAgPSBzdHJ0b2xvd2VyKCRtYXRjaGVzWzNdKTsKCgkJaWYgKCRsaW5rX2lkID09ICIiKSB7CgkJCSRsaW5rX2lkID0gc3RydG9sb3dlcigkYWx0X3RleHQpOyAjIGZvciBzaG9ydGN1dCBsaW5rcyBsaWtlICFbdGhpc11bXS4KCQl9CgoJCSRhbHRfdGV4dCA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJGFsdF90ZXh0KTsKCQlpZiAoaXNzZXQoJHRoaXMtPnVybHNbJGxpbmtfaWRdKSkgewoJCQkkdXJsID0gJHRoaXMtPmVuY29kZVVSTEF0dHJpYnV0ZSgkdGhpcy0+dXJsc1skbGlua19pZF0pOwoJCQkkcmVzdWx0ID0gIjxpbWcgc3JjPVwiJHVybFwiIGFsdD1cIiRhbHRfdGV4dFwiIjsKCQkJaWYgKGlzc2V0KCR0aGlzLT50aXRsZXNbJGxpbmtfaWRdKSkgewoJCQkJJHRpdGxlID0gJHRoaXMtPnRpdGxlc1skbGlua19pZF07CgkJCQkkdGl0bGUgPSAkdGhpcy0+ZW5jb2RlQXR0cmlidXRlKCR0aXRsZSk7CgkJCQkkcmVzdWx0IC49ICAiIHRpdGxlPVwiJHRpdGxlXCIiOwoJCQl9CgkJCSRyZXN1bHQgLj0gJHRoaXMtPmVtcHR5X2VsZW1lbnRfc3VmZml4OwoJCQkkcmVzdWx0ID0gJHRoaXMtPmhhc2hQYXJ0KCRyZXN1bHQpOwoJCX0KCQllbHNlIHsKCQkJIyBJZiB0aGVyZSdzIG5vIHN1Y2ggbGluayBJRCwgbGVhdmUgaW50YWN0OgoJCQkkcmVzdWx0ID0gJHdob2xlX21hdGNoOwoJCX0KCgkJcmV0dXJuICRyZXN1bHQ7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX2RvSW1hZ2VzX2lubGluZV9jYWxsYmFjaygkbWF0Y2hlcykgewoJCSR3aG9sZV9tYXRjaAk9ICRtYXRjaGVzWzFdOwoJCSRhbHRfdGV4dAkJPSAkbWF0Y2hlc1syXTsKCQkkdXJsCQkJPSAkbWF0Y2hlc1szXSA9PSAnJyA/ICRtYXRjaGVzWzRdIDogJG1hdGNoZXNbM107CgkJJHRpdGxlCQkJPSYgJG1hdGNoZXNbN107CgoJCSRhbHRfdGV4dCA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJGFsdF90ZXh0KTsKCQkkdXJsID0gJHRoaXMtPmVuY29kZVVSTEF0dHJpYnV0ZSgkdXJsKTsKCQkkcmVzdWx0ID0gIjxpbWcgc3JjPVwiJHVybFwiIGFsdD1cIiRhbHRfdGV4dFwiIjsKCQlpZiAoaXNzZXQoJHRpdGxlKSkgewoJCQkkdGl0bGUgPSAkdGhpcy0+ZW5jb2RlQXR0cmlidXRlKCR0aXRsZSk7CgkJCSRyZXN1bHQgLj0gICIgdGl0bGU9XCIkdGl0bGVcIiI7ICMgJHRpdGxlIGFscmVhZHkgcXVvdGVkCgkJfQoJCSRyZXN1bHQgLj0gJHRoaXMtPmVtcHR5X2VsZW1lbnRfc3VmZml4OwoKCQlyZXR1cm4gJHRoaXMtPmhhc2hQYXJ0KCRyZXN1bHQpOwoJfQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gZG9IZWFkZXJzKCR0ZXh0KSB7CgkJIyBTZXRleHQtc3R5bGUgaGVhZGVyczoKCQkjCSAgSGVhZGVyIDEKCQkjCSAgPT09PT09PT0KCQkjICAKCQkjCSAgSGVhZGVyIDIKCQkjCSAgLS0tLS0tLS0KCQkjCgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sgXiguKz8pWyBdKlxuKD0rfC0rKVsgXSpcbisgfW14JywKCQkJYXJyYXkoJHRoaXMsICdfZG9IZWFkZXJzX2NhbGxiYWNrX3NldGV4dCcpLCAkdGV4dCk7CgoJCSMgYXR4LXN0eWxlIGhlYWRlcnM6CgkJIwkjIEhlYWRlciAxCgkJIwkjIyBIZWFkZXIgMgoJCSMJIyMgSGVhZGVyIDIgd2l0aCBjbG9zaW5nIGhhc2hlcyAjIwoJCSMJLi4uCgkJIwkjIyMjIyMgSGVhZGVyIDYKCQkjCgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKCQkJCV4oXCN7MSw2fSkJIyAkMSA9IHN0cmluZyBvZiAjXCdzCgkJCQlbIF0qCgkJCQkoLis/KQkJIyAkMiA9IEhlYWRlciB0ZXh0CgkJCQlbIF0qCgkJCQlcIyoJCQkjIG9wdGlvbmFsIGNsb3NpbmcgI1wncyAobm90IGNvdW50ZWQpCgkJCQlcbisKCQkJfXhtJywKCQkJYXJyYXkoJHRoaXMsICdfZG9IZWFkZXJzX2NhbGxiYWNrX2F0eCcpLCAkdGV4dCk7CgoJCXJldHVybiAkdGV4dDsKCX0KCglwcm90ZWN0ZWQgZnVuY3Rpb24gX2RvSGVhZGVyc19jYWxsYmFja19zZXRleHQoJG1hdGNoZXMpIHsKCQkjIFRlcnJpYmxlIGhhY2sgdG8gY2hlY2sgd2UgaGF2ZW4ndCBmb3VuZCBhbiBlbXB0eSBsaXN0IGl0ZW0uCgkJaWYgKCRtYXRjaGVzWzJdID09ICctJyAmJiBwcmVnX21hdGNoKCd7Xi0oPzogfCQpfScsICRtYXRjaGVzWzFdKSkKCQkJcmV0dXJuICRtYXRjaGVzWzBdOwoJCQoJCSRsZXZlbCA9ICRtYXRjaGVzWzJdezB9ID09ICc9JyA/IDEgOiAyOwoKCQkjIGlkIGF0dHJpYnV0ZSBnZW5lcmF0aW9uCgkJJGlkQXR0ID0gJHRoaXMtPl9nZW5lcmF0ZUlkRnJvbUhlYWRlclZhbHVlKCRtYXRjaGVzWzFdKTsKCgkJJGJsb2NrID0gIjxoJGxldmVsJGlkQXR0PiIuJHRoaXMtPnJ1blNwYW5HYW11dCgkbWF0Y2hlc1sxXSkuIjwvaCRsZXZlbD4iOwoJCXJldHVybiAiXG4iIC4gJHRoaXMtPmhhc2hCbG9jaygkYmxvY2spIC4gIlxuXG4iOwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9kb0hlYWRlcnNfY2FsbGJhY2tfYXR4KCRtYXRjaGVzKSB7CgoJCSMgaWQgYXR0cmlidXRlIGdlbmVyYXRpb24KCQkkaWRBdHQgPSAkdGhpcy0+X2dlbmVyYXRlSWRGcm9tSGVhZGVyVmFsdWUoJG1hdGNoZXNbMl0pOwoKCQkkbGV2ZWwgPSBzdHJsZW4oJG1hdGNoZXNbMV0pOwoJCSRibG9jayA9ICI8aCRsZXZlbCRpZEF0dD4iLiR0aGlzLT5ydW5TcGFuR2FtdXQoJG1hdGNoZXNbMl0pLiI8L2gkbGV2ZWw+IjsKCQlyZXR1cm4gIlxuIiAuICR0aGlzLT5oYXNoQmxvY2soJGJsb2NrKSAuICJcblxuIjsKCX0KCglwcm90ZWN0ZWQgZnVuY3Rpb24gX2dlbmVyYXRlSWRGcm9tSGVhZGVyVmFsdWUoJGhlYWRlclZhbHVlKSB7CgoJCSMgaWYgYSBoZWFkZXJfaWRfZnVuYyBwcm9wZXJ0eSBpcyBzZXQsIHdlIGNhbiB1c2UgaXQgdG8gYXV0b21hdGljYWxseQoJCSMgZ2VuZXJhdGUgYW4gaWQgYXR0cmlidXRlLgoJCSMKCQkjIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdHJpbmcgaW4gdGhlIGZvcm0gaWQ9ImZvbyIsIG9yIGFuIGVtcHR5IHN0cmluZwoJCSMgb3RoZXJ3aXNlLgoJCWlmICghaXNfY2FsbGFibGUoJHRoaXMtPmhlYWRlcl9pZF9mdW5jKSkgewoJCQlyZXR1cm4gIiI7CgkJfQoJCSRpZFZhbHVlID0gY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmhlYWRlcl9pZF9mdW5jLCAkaGVhZGVyVmFsdWUpOwoJCWlmICghJGlkVmFsdWUpIHJldHVybiAiIjsKCgkJcmV0dXJuICcgaWQ9IicgLiAkdGhpcy0+ZW5jb2RlQXR0cmlidXRlKCRpZFZhbHVlKSAuICciJzsKCgl9CgoJcHJvdGVjdGVkIGZ1bmN0aW9uIGRvTGlzdHMoJHRleHQpIHsKCSMKCSMgRm9ybSBIVE1MIG9yZGVyZWQgKG51bWJlcmVkKSBhbmQgdW5vcmRlcmVkIChidWxsZXRlZCkgbGlzdHMuCgkjCgkJJGxlc3NfdGhhbl90YWIgPSAkdGhpcy0+dGFiX3dpZHRoIC0gMTsKCgkJIyBSZS11c2FibGUgcGF0dGVybnMgdG8gbWF0Y2ggbGlzdCBpdGVtIGJ1bGxldHMgYW5kIG51bWJlciBtYXJrZXJzOgoJCSRtYXJrZXJfdWxfcmUgID0gJ1sqKy1dJzsKCQkkbWFya2VyX29sX3JlICA9ICdcZCtbXC5dJzsKCgkJJG1hcmtlcnNfcmVsaXN0ID0gYXJyYXkoCgkJCSRtYXJrZXJfdWxfcmUgPT4gJG1hcmtlcl9vbF9yZSwKCQkJJG1hcmtlcl9vbF9yZSA9PiAkbWFya2VyX3VsX3JlLAoJCQkpOwoKCQlmb3JlYWNoICgkbWFya2Vyc19yZWxpc3QgYXMgJG1hcmtlcl9yZSA9PiAkb3RoZXJfbWFya2VyX3JlKSB7CgkJCSMgUmUtdXNhYmxlIHBhdHRlcm4gdG8gbWF0Y2ggYW55IGVudGlyZWwgdWwgb3Igb2wgbGlzdDoKCQkJJHdob2xlX2xpc3RfcmUgPSAnCgkJCQkoCQkJCQkJCQkjICQxID0gd2hvbGUgbGlzdAoJCQkJICAoCQkJCQkJCQkjICQyCgkJCQkJKFsgXXswLCcuJGxlc3NfdGhhbl90YWIuJ30pCSMgJDMgPSBudW1iZXIgb2Ygc3BhY2VzCgkJCQkJKCcuJG1hcmtlcl9yZS4nKQkJCSMgJDQgPSBmaXJzdCBsaXN0IGl0ZW0gbWFya2VyCgkJCQkJWyBdKwoJCQkJICApCgkJCQkgICg/czouKz8pCgkJCQkgICgJCQkJCQkJCSMgJDUKCQkJCQkgIFx6CgkJCQkJfAoJCQkJCSAgXG57Mix9CgkJCQkJICAoPz1cUykKCQkJCQkgICg/IQkJCQkJCSMgTmVnYXRpdmUgbG9va2FoZWFkIGZvciBhbm90aGVyIGxpc3QgaXRlbSBtYXJrZXIKCQkJCQkJWyBdKgoJCQkJCQknLiRtYXJrZXJfcmUuJ1sgXSsKCQkJCQkgICkKCQkJCQl8CgkJCQkJICAoPz0JCQkJCQkjIExvb2thaGVhZCBmb3IgYW5vdGhlciBraW5kIG9mIGxpc3QKCQkJCQkgICAgXG4KCQkJCQkJXDMJCQkJCQkjIE11c3QgaGF2ZSB0aGUgc2FtZSBpbmRlbnRhdGlvbgoJCQkJCQknLiRvdGhlcl9tYXJrZXJfcmUuJ1sgXSsKCQkJCQkgICkKCQkJCSAgKQoJCQkJKQoJCQknOyAvLyBteAoJCQkKCQkJIyBXZSB1c2UgYSBkaWZmZXJlbnQgcHJlZml4IGJlZm9yZSBuZXN0ZWQgbGlzdHMgdGhhbiB0b3AtbGV2ZWwgbGlzdHMuCgkJCSMgU2VlIGV4dGVuZGVkIGNvbW1lbnQgaW4gX1Byb2Nlc3NMaXN0SXRlbXMoKS4KCQkKCQkJaWYgKCR0aGlzLT5saXN0X2xldmVsKSB7CgkJCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnewoJCQkJCQleCgkJCQkJCScuJHdob2xlX2xpc3RfcmUuJwoJCQkJCX1teCcsCgkJCQkJYXJyYXkoJHRoaXMsICdfZG9MaXN0c19jYWxsYmFjaycpLCAkdGV4dCk7CgkJCX0KCQkJZWxzZSB7CgkJCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnewoJCQkJCQkoPzooPzw9XG4pXG58XEFcbj8pICMgTXVzdCBlYXQgdGhlIG5ld2xpbmUKCQkJCQkJJy4kd2hvbGVfbGlzdF9yZS4nCgkJCQkJfW14JywKCQkJCQlhcnJheSgkdGhpcywgJ19kb0xpc3RzX2NhbGxiYWNrJyksICR0ZXh0KTsKCQkJfQoJCX0KCgkJcmV0dXJuICR0ZXh0OwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9kb0xpc3RzX2NhbGxiYWNrKCRtYXRjaGVzKSB7CgkJIyBSZS11c2FibGUgcGF0dGVybnMgdG8gbWF0Y2ggbGlzdCBpdGVtIGJ1bGxldHMgYW5kIG51bWJlciBtYXJrZXJzOgoJCSRtYXJrZXJfdWxfcmUgID0gJ1sqKy1dJzsKCQkkbWFya2VyX29sX3JlICA9ICdcZCtbXC5dJzsKCQkkbWFya2VyX2FueV9yZSA9ICIoPzokbWFya2VyX3VsX3JlfCRtYXJrZXJfb2xfcmUpIjsKCQkkbWFya2VyX29sX3N0YXJ0X3JlID0gJ1swLTldKyc7CgoJCSRsaXN0ID0gJG1hdGNoZXNbMV07CgkJJGxpc3RfdHlwZSA9IHByZWdfbWF0Y2goIi8kbWFya2VyX3VsX3JlLyIsICRtYXRjaGVzWzRdKSA/ICJ1bCIgOiAib2wiOwoKCQkkbWFya2VyX2FueV9yZSA9ICggJGxpc3RfdHlwZSA9PSAidWwiID8gJG1hcmtlcl91bF9yZSA6ICRtYXJrZXJfb2xfcmUgKTsKCgkJJGxpc3QgLj0gIlxuIjsKCQkkcmVzdWx0ID0gJHRoaXMtPnByb2Nlc3NMaXN0SXRlbXMoJGxpc3QsICRtYXJrZXJfYW55X3JlKTsKCgkJJG9sX3N0YXJ0ID0gMTsKCQlpZiAoJHRoaXMtPmVuaGFuY2VkX29yZGVyZWRfbGlzdCkgewoJCQkjIEdldCB0aGUgc3RhcnQgbnVtYmVyIGZvciBvcmRlcmVkIGxpc3QuCgkJCWlmICgkbGlzdF90eXBlID09ICdvbCcpIHsKCQkJCSRvbF9zdGFydF9hcnJheSA9IGFycmF5KCk7CgkJCQkkb2xfc3RhcnRfY2hlY2sgPSBwcmVnX21hdGNoKCIvJG1hcmtlcl9vbF9zdGFydF9yZS8iLCAkbWF0Y2hlc1s0XSwgJG9sX3N0YXJ0X2FycmF5KTsKCQkJCWlmICgkb2xfc3RhcnRfY2hlY2spewoJCQkJCSRvbF9zdGFydCA9ICRvbF9zdGFydF9hcnJheVswXTsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKCRvbF9zdGFydCA+IDEgJiYgJGxpc3RfdHlwZSA9PSAnb2wnKXsKCQkJJHJlc3VsdCA9ICR0aGlzLT5oYXNoQmxvY2soIjwkbGlzdF90eXBlIHN0YXJ0PVwiJG9sX3N0YXJ0XCI+XG4iIC4gJHJlc3VsdCAuICI8LyRsaXN0X3R5cGU+Iik7CgkJfSBlbHNlIHsKCQkJJHJlc3VsdCA9ICR0aGlzLT5oYXNoQmxvY2soIjwkbGlzdF90eXBlPlxuIiAuICRyZXN1bHQgLiAiPC8kbGlzdF90eXBlPiIpOwoJCX0KCQlyZXR1cm4gIlxuIi4gJHJlc3VsdCAuIlxuXG4iOwoJfQoKCXByb3RlY3RlZCAkbGlzdF9sZXZlbCA9IDA7CgoJcHJvdGVjdGVkIGZ1bmN0aW9uIHByb2Nlc3NMaXN0SXRlbXMoJGxpc3Rfc3RyLCAkbWFya2VyX2FueV9yZSkgewoJIwoJIwlQcm9jZXNzIHRoZSBjb250ZW50cyBvZiBhIHNpbmdsZSBvcmRlcmVkIG9yIHVub3JkZXJlZCBsaXN0LCBzcGxpdHRpbmcgaXQKCSMJaW50byBpbmRpdmlkdWFsIGxpc3QgaXRlbXMuCgkjCgkJIyBUaGUgJHRoaXMtPmxpc3RfbGV2ZWwgZ2xvYmFsIGtlZXBzIHRyYWNrIG9mIHdoZW4gd2UncmUgaW5zaWRlIGEgbGlzdC4KCQkjIEVhY2ggdGltZSB3ZSBlbnRlciBhIGxpc3QsIHdlIGluY3JlbWVudCBpdDsgd2hlbiB3ZSBsZWF2ZSBhIGxpc3QsCgkJIyB3ZSBkZWNyZW1lbnQuIElmIGl0J3MgemVybywgd2UncmUgbm90IGluIGEgbGlzdCBhbnltb3JlLgoJCSMKCQkjIFdlIGRvIHRoaXMgYmVjYXVzZSB3aGVuIHdlJ3JlIG5vdCBpbnNpZGUgYSBsaXN0LCB3ZSB3YW50IHRvIHRyZWF0CgkJIyBzb21ldGhpbmcgbGlrZSB0aGlzOgoJCSMKCQkjCQlJIHJlY29tbWVuZCB1cGdyYWRpbmcgdG8gdmVyc2lvbgoJCSMJCTguIE9vcHMsIG5vdyB0aGlzIGxpbmUgaXMgdHJlYXRlZAoJCSMJCWFzIGEgc3ViLWxpc3QuCgkJIwoJCSMgQXMgYSBzaW5nbGUgcGFyYWdyYXBoLCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlIHNlY29uZCBsaW5lIHN0YXJ0cwoJCSMgd2l0aCBhIGRpZ2l0LXBlcmlvZC1zcGFjZSBzZXF1ZW5jZS4KCQkjCgkJIyBXaGVyZWFzIHdoZW4gd2UncmUgaW5zaWRlIGEgbGlzdCAob3Igc3ViLWxpc3QpLCB0aGF0IGxpbmUgd2lsbCBiZQoJCSMgdHJlYXRlZCBhcyB0aGUgc3RhcnQgb2YgYSBzdWItbGlzdC4gV2hhdCBhIGtsdWRnZSwgaHVoPyBUaGlzIGlzCgkJIyBhbiBhc3BlY3Qgb2YgTWFya2Rvd24ncyBzeW50YXggdGhhdCdzIGhhcmQgdG8gcGFyc2UgcGVyZmVjdGx5CgkJIyB3aXRob3V0IHJlc29ydGluZyB0byBtaW5kLXJlYWRpbmcuIFBlcmhhcHMgdGhlIHNvbHV0aW9uIGlzIHRvCgkJIyBjaGFuZ2UgdGhlIHN5bnRheCBydWxlcyBzdWNoIHRoYXQgc3ViLWxpc3RzIG11c3Qgc3RhcnQgd2l0aCBhCgkJIyBzdGFydGluZyBjYXJkaW5hbCBudW1iZXI7IGUuZy4gIjEuIiBvciAiYS4iLgoJCQoJCSR0aGlzLT5saXN0X2xldmVsKys7CgoJCSMgdHJpbSB0cmFpbGluZyBibGFuayBsaW5lczoKCQkkbGlzdF9zdHIgPSBwcmVnX3JlcGxhY2UoIi9cbnsyLH1cXHovIiwgIlxuIiwgJGxpc3Rfc3RyKTsKCgkJJGxpc3Rfc3RyID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CgkJCShcbik/CQkJCQkJCSMgbGVhZGluZyBsaW5lID0gJDEKCQkJKF5bIF0qKQkJCQkJCQkjIGxlYWRpbmcgd2hpdGVzcGFjZSA9ICQyCgkJCSgnLiRtYXJrZXJfYW55X3JlLicJCQkJIyBsaXN0IG1hcmtlciBhbmQgc3BhY2UgPSAkMwoJCQkJKD86WyBdK3woPz1cbikpCSMgc3BhY2Ugb25seSByZXF1aXJlZCBpZiBpdGVtIGlzIG5vdCBlbXB0eQoJCQkpCgkJCSgoP3M6Lio/KSkJCQkJCQkjIGxpc3QgaXRlbSB0ZXh0ICAgPSAkNAoJCQkoPzooXG4rKD89XG4pKXxcbikJCQkJIyB0YWlsaW5nIGJsYW5rIGxpbmUgPSAkNQoJCQkoPz0gXG4qIChceiB8IFwyICgnLiRtYXJrZXJfYW55X3JlLicpICg/OlsgXSt8KD89XG4pKSkpCgkJCX14bScsCgkJCWFycmF5KCR0aGlzLCAnX3Byb2Nlc3NMaXN0SXRlbXNfY2FsbGJhY2snKSwgJGxpc3Rfc3RyKTsKCgkJJHRoaXMtPmxpc3RfbGV2ZWwtLTsKCQlyZXR1cm4gJGxpc3Rfc3RyOwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9wcm9jZXNzTGlzdEl0ZW1zX2NhbGxiYWNrKCRtYXRjaGVzKSB7CgkJJGl0ZW0gPSAkbWF0Y2hlc1s0XTsKCQkkbGVhZGluZ19saW5lID0mICRtYXRjaGVzWzFdOwoJCSRsZWFkaW5nX3NwYWNlID0mICRtYXRjaGVzWzJdOwoJCSRtYXJrZXJfc3BhY2UgPSAkbWF0Y2hlc1szXTsKCQkkdGFpbGluZ19ibGFua19saW5lID0mICRtYXRjaGVzWzVdOwoKCQlpZiAoJGxlYWRpbmdfbGluZSB8fCAkdGFpbGluZ19ibGFua19saW5lIHx8IAoJCQlwcmVnX21hdGNoKCcvXG57Mix9LycsICRpdGVtKSkKCQl7CgkJCSMgUmVwbGFjZSBtYXJrZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgd2hpdGVzcGFjZSBpbmRlbnRhdGlvbgoJCQkkaXRlbSA9ICRsZWFkaW5nX3NwYWNlIC4gc3RyX3JlcGVhdCgnICcsIHN0cmxlbigkbWFya2VyX3NwYWNlKSkgLiAkaXRlbTsKCQkJJGl0ZW0gPSAkdGhpcy0+cnVuQmxvY2tHYW11dCgkdGhpcy0+b3V0ZGVudCgkaXRlbSkuIlxuIik7CgkJfQoJCWVsc2UgewoJCQkjIFJlY3Vyc2lvbiBmb3Igc3ViLWxpc3RzOgoJCQkkaXRlbSA9ICR0aGlzLT5kb0xpc3RzKCR0aGlzLT5vdXRkZW50KCRpdGVtKSk7CgkJCSRpdGVtID0gcHJlZ19yZXBsYWNlKCcvXG4rJC8nLCAnJywgJGl0ZW0pOwoJCQkkaXRlbSA9ICR0aGlzLT5ydW5TcGFuR2FtdXQoJGl0ZW0pOwoJCX0KCgkJcmV0dXJuICI8bGk+IiAuICRpdGVtIC4gIjwvbGk+XG4iOwoJfQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gZG9Db2RlQmxvY2tzKCR0ZXh0KSB7CgkjCgkjCVByb2Nlc3MgTWFya2Rvd24gYDxwcmU+PGNvZGU+YCBibG9ja3MuCgkjCgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKCQkJCSg/OlxuXG58XEFcbj8pCgkJCQkoCSAgICAgICAgICAgICMgJDEgPSB0aGUgY29kZSBibG9jayAtLSBvbmUgb3IgbW9yZSBsaW5lcywgc3RhcnRpbmcgd2l0aCBhIHNwYWNlL3RhYgoJCQkJICAoPz4KCQkJCQlbIF17Jy4kdGhpcy0+dGFiX3dpZHRoLid9ICAjIExpbmVzIG11c3Qgc3RhcnQgd2l0aCBhIHRhYiBvciBhIHRhYi13aWR0aCBvZiBzcGFjZXMKCQkJCQkuKlxuKwoJCQkJICApKwoJCQkJKQoJCQkJKCg/PV5bIF17MCwnLiR0aGlzLT50YWJfd2lkdGguJ31cUyl8XFopCSMgTG9va2FoZWFkIGZvciBub24tc3BhY2UgYXQgbGluZS1zdGFydCwgb3IgZW5kIG9mIGRvYwoJCQl9eG0nLAoJCQlhcnJheSgkdGhpcywgJ19kb0NvZGVCbG9ja3NfY2FsbGJhY2snKSwgJHRleHQpOwoKCQlyZXR1cm4gJHRleHQ7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX2RvQ29kZUJsb2Nrc19jYWxsYmFjaygkbWF0Y2hlcykgewoJCSRjb2RlYmxvY2sgPSAkbWF0Y2hlc1sxXTsKCgkJJGNvZGVibG9jayA9ICR0aGlzLT5vdXRkZW50KCRjb2RlYmxvY2spOwoJCSRjb2RlYmxvY2sgPSBodG1sc3BlY2lhbGNoYXJzKCRjb2RlYmxvY2ssIEVOVF9OT1FVT1RFUyk7CgoJCSMgdHJpbSBsZWFkaW5nIG5ld2xpbmVzIGFuZCB0cmFpbGluZyBuZXdsaW5lcwoJCSRjb2RlYmxvY2sgPSBwcmVnX3JlcGxhY2UoJy9cQVxuK3xcbitcei8nLCAnJywgJGNvZGVibG9jayk7CgoJCSRjb2RlYmxvY2sgPSAiPHByZT48Y29kZT4kY29kZWJsb2NrXG48L2NvZGU+PC9wcmU+IjsKCQlyZXR1cm4gIlxuXG4iLiR0aGlzLT5oYXNoQmxvY2soJGNvZGVibG9jaykuIlxuXG4iOwoJfQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gbWFrZUNvZGVTcGFuKCRjb2RlKSB7CgkjCgkjIENyZWF0ZSBhIGNvZGUgc3BhbiBtYXJrdXAgZm9yICRjb2RlLiBDYWxsZWQgZnJvbSBoYW5kbGVTcGFuVG9rZW4uCgkjCgkJJGNvZGUgPSBodG1sc3BlY2lhbGNoYXJzKHRyaW0oJGNvZGUpLCBFTlRfTk9RVU9URVMpOwoJCXJldHVybiAkdGhpcy0+aGFzaFBhcnQoIjxjb2RlPiRjb2RlPC9jb2RlPiIpOwoJfQoKCglwcm90ZWN0ZWQgJGVtX3JlbGlzdCA9IGFycmF5KAoJCScnICA9PiAnKD86KD88IVwqKVwqKD8hXCopfCg/PCFfKV8oPyFfKSkoPyFbXC4sOjtdP1xzKScsCgkJJyonID0+ICcoPzwhW1xzKl0pXCooPyFcKiknLAoJCSdfJyA9PiAnKD88IVtcc19dKV8oPyFfKScsCgkJKTsKCXByb3RlY3RlZCAkc3Ryb25nX3JlbGlzdCA9IGFycmF5KAoJCScnICAgPT4gJyg/Oig/PCFcKilcKlwqKD8hXCopfCg/PCFfKV9fKD8hXykpKD8hW1wuLDo7XT9ccyknLAoJCScqKicgPT4gJyg/PCFbXHMqXSlcKlwqKD8hXCopJywKCQknX18nID0+ICcoPzwhW1xzX10pX18oPyFfKScsCgkJKTsKCXByb3RlY3RlZCAkZW1fc3Ryb25nX3JlbGlzdCA9IGFycmF5KAoJCScnICAgID0+ICcoPzooPzwhXCopXCpcKlwqKD8hXCopfCg/PCFfKV9fXyg/IV8pKSg/IVtcLiw6O10/XHMpJywKCQknKioqJyA9PiAnKD88IVtccypdKVwqXCpcKig/IVwqKScsCgkJJ19fXycgPT4gJyg/PCFbXHNfXSlfX18oPyFfKScsCgkJKTsKCXByb3RlY3RlZCAkZW1fc3Ryb25nX3ByZXBhcmVkX3JlbGlzdDsKCQoJcHJvdGVjdGVkIGZ1bmN0aW9uIHByZXBhcmVJdGFsaWNzQW5kQm9sZCgpIHsKCSMKCSMgUHJlcGFyZSByZWd1bGFyIGV4cHJlc3Npb25zIGZvciBzZWFyY2hpbmcgZW1waGFzaXMgdG9rZW5zIGluIGFueQoJIyBjb250ZXh0LgoJIwoJCWZvcmVhY2ggKCR0aGlzLT5lbV9yZWxpc3QgYXMgJGVtID0+ICRlbV9yZSkgewoJCQlmb3JlYWNoICgkdGhpcy0+c3Ryb25nX3JlbGlzdCBhcyAkc3Ryb25nID0+ICRzdHJvbmdfcmUpIHsKCQkJCSMgQ29uc3RydWN0IGxpc3Qgb2YgYWxsb3dlZCB0b2tlbiBleHByZXNzaW9ucy4KCQkJCSR0b2tlbl9yZWxpc3QgPSBhcnJheSgpOwoJCQkJaWYgKGlzc2V0KCR0aGlzLT5lbV9zdHJvbmdfcmVsaXN0WyIkZW0kc3Ryb25nIl0pKSB7CgkJCQkJJHRva2VuX3JlbGlzdFtdID0gJHRoaXMtPmVtX3N0cm9uZ19yZWxpc3RbIiRlbSRzdHJvbmciXTsKCQkJCX0KCQkJCSR0b2tlbl9yZWxpc3RbXSA9ICRlbV9yZTsKCQkJCSR0b2tlbl9yZWxpc3RbXSA9ICRzdHJvbmdfcmU7CgkJCQkKCQkJCSMgQ29uc3RydWN0IG1hc3RlciBleHByZXNzaW9uIGZyb20gbGlzdC4KCQkJCSR0b2tlbl9yZSA9ICd7KCcuIGltcGxvZGUoJ3wnLCAkdG9rZW5fcmVsaXN0KSAuJyl9JzsKCQkJCSR0aGlzLT5lbV9zdHJvbmdfcHJlcGFyZWRfcmVsaXN0WyIkZW0kc3Ryb25nIl0gPSAkdG9rZW5fcmU7CgkJCX0KCQl9Cgl9CgkKCXByb3RlY3RlZCBmdW5jdGlvbiBkb0l0YWxpY3NBbmRCb2xkKCR0ZXh0KSB7CgkJJHRva2VuX3N0YWNrID0gYXJyYXkoJycpOwoJCSR0ZXh0X3N0YWNrID0gYXJyYXkoJycpOwoJCSRlbSA9ICcnOwoJCSRzdHJvbmcgPSAnJzsKCQkkdHJlZV9jaGFyX2VtID0gZmFsc2U7CgkJCgkJd2hpbGUgKDEpIHsKCQkJIwoJCQkjIEdldCBwcmVwYXJlZCByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNlcmFjaGluZyBlbXBoYXNpcyB0b2tlbnMKCQkJIyBpbiBjdXJyZW50IGNvbnRleHQuCgkJCSMKCQkJJHRva2VuX3JlID0gJHRoaXMtPmVtX3N0cm9uZ19wcmVwYXJlZF9yZWxpc3RbIiRlbSRzdHJvbmciXTsKCQkJCgkJCSMKCQkJIyBFYWNoIGxvb3AgaXRlcmF0aW9uIHNlYXJjaCBmb3IgdGhlIG5leHQgZW1waGFzaXMgdG9rZW4uIAoJCQkjIEVhY2ggdG9rZW4gaXMgdGhlbiBwYXNzZWQgdG8gaGFuZGxlU3BhblRva2VuLgoJCQkjCgkJCSRwYXJ0cyA9IHByZWdfc3BsaXQoJHRva2VuX3JlLCAkdGV4dCwgMiwgUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFKTsKCQkJJHRleHRfc3RhY2tbMF0gLj0gJHBhcnRzWzBdOwoJCQkkdG9rZW4gPSYgJHBhcnRzWzFdOwoJCQkkdGV4dCA9JiAkcGFydHNbMl07CgkJCQoJCQlpZiAoZW1wdHkoJHRva2VuKSkgewoJCQkJIyBSZWFjaGVkIGVuZCBvZiB0ZXh0IHNwYW46IGVtcHR5IHN0YWNrIHdpdGhvdXQgZW1pdHRpbmcuCgkJCQkjIGFueSBtb3JlIGVtcGhhc2lzLgoJCQkJd2hpbGUgKCR0b2tlbl9zdGFja1swXSkgewoJCQkJCSR0ZXh0X3N0YWNrWzFdIC49IGFycmF5X3NoaWZ0KCR0b2tlbl9zdGFjayk7CgkJCQkJJHRleHRfc3RhY2tbMF0gLj0gYXJyYXlfc2hpZnQoJHRleHRfc3RhY2spOwoJCQkJfQoJCQkJYnJlYWs7CgkJCX0KCQkJCgkJCSR0b2tlbl9sZW4gPSBzdHJsZW4oJHRva2VuKTsKCQkJaWYgKCR0cmVlX2NoYXJfZW0pIHsKCQkJCSMgUmVhY2hlZCBjbG9zaW5nIG1hcmtlciB3aGlsZSBpbnNpZGUgYSB0aHJlZS1jaGFyIGVtcGhhc2lzLgoJCQkJaWYgKCR0b2tlbl9sZW4gPT0gMykgewoJCQkJCSMgVGhyZWUtY2hhciBjbG9zaW5nIG1hcmtlciwgY2xvc2UgZW0gYW5kIHN0cm9uZy4KCQkJCQlhcnJheV9zaGlmdCgkdG9rZW5fc3RhY2spOwoJCQkJCSRzcGFuID0gYXJyYXlfc2hpZnQoJHRleHRfc3RhY2spOwoJCQkJCSRzcGFuID0gJHRoaXMtPnJ1blNwYW5HYW11dCgkc3Bhbik7CgkJCQkJJHNwYW4gPSAiPHN0cm9uZz48ZW0+JHNwYW48L2VtPjwvc3Ryb25nPiI7CgkJCQkJJHRleHRfc3RhY2tbMF0gLj0gJHRoaXMtPmhhc2hQYXJ0KCRzcGFuKTsKCQkJCQkkZW0gPSAnJzsKCQkJCQkkc3Ryb25nID0gJyc7CgkJCQl9IGVsc2UgewoJCQkJCSMgT3RoZXIgY2xvc2luZyBtYXJrZXI6IGNsb3NlIG9uZSBlbSBvciBzdHJvbmcgYW5kCgkJCQkJIyBjaGFuZ2UgY3VycmVudCB0b2tlbiBzdGF0ZSB0byBtYXRjaCB0aGUgb3RoZXIKCQkJCQkkdG9rZW5fc3RhY2tbMF0gPSBzdHJfcmVwZWF0KCR0b2tlbnswfSwgMy0kdG9rZW5fbGVuKTsKCQkJCQkkdGFnID0gJHRva2VuX2xlbiA9PSAyID8gInN0cm9uZyIgOiAiZW0iOwoJCQkJCSRzcGFuID0gJHRleHRfc3RhY2tbMF07CgkJCQkJJHNwYW4gPSAkdGhpcy0+cnVuU3BhbkdhbXV0KCRzcGFuKTsKCQkJCQkkc3BhbiA9ICI8JHRhZz4kc3BhbjwvJHRhZz4iOwoJCQkJCSR0ZXh0X3N0YWNrWzBdID0gJHRoaXMtPmhhc2hQYXJ0KCRzcGFuKTsKCQkJCQkkJHRhZyA9ICcnOyAjICQkdGFnIHN0YW5kcyBmb3IgJGVtIG9yICRzdHJvbmcKCQkJCX0KCQkJCSR0cmVlX2NoYXJfZW0gPSBmYWxzZTsKCQkJfSBlbHNlIGlmICgkdG9rZW5fbGVuID09IDMpIHsKCQkJCWlmICgkZW0pIHsKCQkJCQkjIFJlYWNoZWQgY2xvc2luZyBtYXJrZXIgZm9yIGJvdGggZW0gYW5kIHN0cm9uZy4KCQkJCQkjIENsb3Npbmcgc3Ryb25nIG1hcmtlcjoKCQkJCQlmb3IgKCRpID0gMDsgJGkgPCAyOyArKyRpKSB7CgkJCQkJCSRzaGlmdGVkX3Rva2VuID0gYXJyYXlfc2hpZnQoJHRva2VuX3N0YWNrKTsKCQkJCQkJJHRhZyA9IHN0cmxlbigkc2hpZnRlZF90b2tlbikgPT0gMiA/ICJzdHJvbmciIDogImVtIjsKCQkJCQkJJHNwYW4gPSBhcnJheV9zaGlmdCgkdGV4dF9zdGFjayk7CgkJCQkJCSRzcGFuID0gJHRoaXMtPnJ1blNwYW5HYW11dCgkc3Bhbik7CgkJCQkJCSRzcGFuID0gIjwkdGFnPiRzcGFuPC8kdGFnPiI7CgkJCQkJCSR0ZXh0X3N0YWNrWzBdIC49ICR0aGlzLT5oYXNoUGFydCgkc3Bhbik7CgkJCQkJCSQkdGFnID0gJyc7ICMgJCR0YWcgc3RhbmRzIGZvciAkZW0gb3IgJHN0cm9uZwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJIyBSZWFjaGVkIG9wZW5pbmcgdGhyZWUtY2hhciBlbXBoYXNpcyBtYXJrZXIuIFB1c2ggb24gdG9rZW4gCgkJCQkJIyBzdGFjazsgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBzcGVjaWFsIGNvbmRpdGlvbiBhYm92ZS4KCQkJCQkkZW0gPSAkdG9rZW57MH07CgkJCQkJJHN0cm9uZyA9ICIkZW0kZW0iOwoJCQkJCWFycmF5X3Vuc2hpZnQoJHRva2VuX3N0YWNrLCAkdG9rZW4pOwoJCQkJCWFycmF5X3Vuc2hpZnQoJHRleHRfc3RhY2ssICcnKTsKCQkJCQkkdHJlZV9jaGFyX2VtID0gdHJ1ZTsKCQkJCX0KCQkJfSBlbHNlIGlmICgkdG9rZW5fbGVuID09IDIpIHsKCQkJCWlmICgkc3Ryb25nKSB7CgkJCQkJIyBVbndpbmQgYW55IGRhbmdsaW5nIGVtcGhhc2lzIG1hcmtlcjoKCQkJCQlpZiAoc3RybGVuKCR0b2tlbl9zdGFja1swXSkgPT0gMSkgewoJCQkJCQkkdGV4dF9zdGFja1sxXSAuPSBhcnJheV9zaGlmdCgkdG9rZW5fc3RhY2spOwoJCQkJCQkkdGV4dF9zdGFja1swXSAuPSBhcnJheV9zaGlmdCgkdGV4dF9zdGFjayk7CgkJCQkJfQoJCQkJCSMgQ2xvc2luZyBzdHJvbmcgbWFya2VyOgoJCQkJCWFycmF5X3NoaWZ0KCR0b2tlbl9zdGFjayk7CgkJCQkJJHNwYW4gPSBhcnJheV9zaGlmdCgkdGV4dF9zdGFjayk7CgkJCQkJJHNwYW4gPSAkdGhpcy0+cnVuU3BhbkdhbXV0KCRzcGFuKTsKCQkJCQkkc3BhbiA9ICI8c3Ryb25nPiRzcGFuPC9zdHJvbmc+IjsKCQkJCQkkdGV4dF9zdGFja1swXSAuPSAkdGhpcy0+aGFzaFBhcnQoJHNwYW4pOwoJCQkJCSRzdHJvbmcgPSAnJzsKCQkJCX0gZWxzZSB7CgkJCQkJYXJyYXlfdW5zaGlmdCgkdG9rZW5fc3RhY2ssICR0b2tlbik7CgkJCQkJYXJyYXlfdW5zaGlmdCgkdGV4dF9zdGFjaywgJycpOwoJCQkJCSRzdHJvbmcgPSAkdG9rZW47CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkjIEhlcmUgJHRva2VuX2xlbiA9PSAxCgkJCQlpZiAoJGVtKSB7CgkJCQkJaWYgKHN0cmxlbigkdG9rZW5fc3RhY2tbMF0pID09IDEpIHsKCQkJCQkJIyBDbG9zaW5nIGVtcGhhc2lzIG1hcmtlcjoKCQkJCQkJYXJyYXlfc2hpZnQoJHRva2VuX3N0YWNrKTsKCQkJCQkJJHNwYW4gPSBhcnJheV9zaGlmdCgkdGV4dF9zdGFjayk7CgkJCQkJCSRzcGFuID0gJHRoaXMtPnJ1blNwYW5HYW11dCgkc3Bhbik7CgkJCQkJCSRzcGFuID0gIjxlbT4kc3BhbjwvZW0+IjsKCQkJCQkJJHRleHRfc3RhY2tbMF0gLj0gJHRoaXMtPmhhc2hQYXJ0KCRzcGFuKTsKCQkJCQkJJGVtID0gJyc7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHRleHRfc3RhY2tbMF0gLj0gJHRva2VuOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJYXJyYXlfdW5zaGlmdCgkdG9rZW5fc3RhY2ssICR0b2tlbik7CgkJCQkJYXJyYXlfdW5zaGlmdCgkdGV4dF9zdGFjaywgJycpOwoJCQkJCSRlbSA9ICR0b2tlbjsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gJHRleHRfc3RhY2tbMF07Cgl9CgoKCXByb3RlY3RlZCBmdW5jdGlvbiBkb0Jsb2NrUXVvdGVzKCR0ZXh0KSB7CgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy8KCQkJICAoCQkJCQkJCQkjIFdyYXAgd2hvbGUgbWF0Y2ggaW4gJDEKCQkJCSg/PgoJCQkJICBeWyBdKj5bIF0/CQkJIyAiPiIgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZQoJCQkJCS4rXG4JCQkJCSMgcmVzdCBvZiB0aGUgZmlyc3QgbGluZQoJCQkJICAoLitcbikqCQkJCQkjIHN1YnNlcXVlbnQgY29uc2VjdXRpdmUgbGluZXMKCQkJCSAgXG4qCQkJCQkJIyBibGFua3MKCQkJCSkrCgkJCSAgKQoJCQkveG0nLAoJCQlhcnJheSgkdGhpcywgJ19kb0Jsb2NrUXVvdGVzX2NhbGxiYWNrJyksICR0ZXh0KTsKCgkJcmV0dXJuICR0ZXh0OwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9kb0Jsb2NrUXVvdGVzX2NhbGxiYWNrKCRtYXRjaGVzKSB7CgkJJGJxID0gJG1hdGNoZXNbMV07CgkJIyB0cmltIG9uZSBsZXZlbCBvZiBxdW90aW5nIC0gdHJpbSB3aGl0ZXNwYWNlLW9ubHkgbGluZXMKCQkkYnEgPSBwcmVnX3JlcGxhY2UoJy9eWyBdKj5bIF0/fF5bIF0rJC9tJywgJycsICRicSk7CgkJJGJxID0gJHRoaXMtPnJ1bkJsb2NrR2FtdXQoJGJxKTsJCSMgcmVjdXJzZQoKCQkkYnEgPSBwcmVnX3JlcGxhY2UoJy9eL20nLCAiICAiLCAkYnEpOwoJCSMgVGhlc2UgbGVhZGluZyBzcGFjZXMgY2F1c2UgcHJvYmxlbSB3aXRoIDxwcmU+IGNvbnRlbnQsIAoJCSMgc28gd2UgbmVlZCB0byBmaXggdGhhdDoKCQkkYnEgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3soXHMqPHByZT4uKz88L3ByZT4pfXN4JywgCgkJCWFycmF5KCR0aGlzLCAnX2RvQmxvY2tRdW90ZXNfY2FsbGJhY2syJyksICRicSk7CgoJCXJldHVybiAiXG4iLiAkdGhpcy0+aGFzaEJsb2NrKCI8YmxvY2txdW90ZT5cbiRicVxuPC9ibG9ja3F1b3RlPiIpLiJcblxuIjsKCX0KCXByb3RlY3RlZCBmdW5jdGlvbiBfZG9CbG9ja1F1b3Rlc19jYWxsYmFjazIoJG1hdGNoZXMpIHsKCQkkcHJlID0gJG1hdGNoZXNbMV07CgkJJHByZSA9IHByZWdfcmVwbGFjZSgnL14gIC9tJywgJycsICRwcmUpOwoJCXJldHVybiAkcHJlOwoJfQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gZm9ybVBhcmFncmFwaHMoJHRleHQpIHsKCSMKCSMJUGFyYW1zOgoJIwkJJHRleHQgLSBzdHJpbmcgdG8gcHJvY2VzcyB3aXRoIGh0bWwgPHA+IHRhZ3MKCSMKCQkjIFN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGxpbmVzOgoJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlKCcvXEFcbit8XG4rXHovJywgJycsICR0ZXh0KTsKCgkJJGdyYWZzID0gcHJlZ19zcGxpdCgnL1xuezIsfS8nLCAkdGV4dCwgLTEsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOwoKCQkjCgkJIyBXcmFwIDxwPiB0YWdzIGFuZCB1bmhhc2hpZnkgSFRNTCBibG9ja3MKCQkjCgkJZm9yZWFjaCAoJGdyYWZzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCWlmICghcHJlZ19tYXRjaCgnL15CXHgxQVswLTldK0IkLycsICR2YWx1ZSkpIHsKCQkJCSMgSXMgYSBwYXJhZ3JhcGguCgkJCQkkdmFsdWUgPSAkdGhpcy0+cnVuU3BhbkdhbXV0KCR2YWx1ZSk7CgkJCQkkdmFsdWUgPSBwcmVnX3JlcGxhY2UoJy9eKFsgXSopLycsICI8cD4iLCAkdmFsdWUpOwoJCQkJJHZhbHVlIC49ICI8L3A+IjsKCQkJCSRncmFmc1ska2V5XSA9ICR0aGlzLT51bmhhc2goJHZhbHVlKTsKCQkJfQoJCQllbHNlIHsKCQkJCSMgSXMgYSBibG9jay4KCQkJCSMgTW9kaWZ5IGVsZW1lbnRzIG9mIEBncmFmcyBpbi1wbGFjZS4uLgoJCQkJJGdyYWYgPSAkdmFsdWU7CgkJCQkkYmxvY2sgPSAkdGhpcy0+aHRtbF9oYXNoZXNbJGdyYWZdOwoJCQkJJGdyYWYgPSAkYmxvY2s7Ci8vCQkJCWlmIChwcmVnX21hdGNoKCd7Ci8vCQkJCQlcQQovLwkJCQkJKAkJCQkJCQkjICQxID0gPGRpdj4gdGFnCi8vCQkJCQkgIDxkaXYgIFxzKwovLwkJCQkJICBbXj5dKgovLwkJCQkJICBcYgovLwkJCQkJICBtYXJrZG93blxzKj1ccyogIChbXCciXSkJIwkkMiA9IGF0dHIgcXVvdGUgY2hhcgovLwkJCQkJICAxCi8vCQkJCQkgIFwyCi8vCQkJCQkgIFtePl0qCi8vCQkJCQkgID4KLy8JCQkJCSkKLy8JCQkJCSgJCQkJCQkJIyAkMyA9IGNvbnRlbnRzCi8vCQkJCQkuKgovLwkJCQkJKQovLwkJCQkJKDwvZGl2PikJCQkJCSMgJDQgPSBjbG9zaW5nIHRhZwovLwkJCQkJXHoKLy8JCQkJCX14cycsICRibG9jaywgJG1hdGNoZXMpKQovLwkJCQl7Ci8vCQkJCQlsaXN0KCwgJGRpdl9vcGVuLCAsICRkaXZfY29udGVudCwgJGRpdl9jbG9zZSkgPSAkbWF0Y2hlczsKLy8KLy8JCQkJCSMgV2UgY2FuJ3QgY2FsbCBNYXJrZG93bigpLCBiZWNhdXNlIHRoYXQgcmVzZXRzIHRoZSBoYXNoOwovLwkJCQkJIyB0aGF0IGluaXRpYWxpemF0aW9uIGNvZGUgc2hvdWxkIGJlIHB1bGxlZCBpbnRvIGl0cyBvd24gc3ViLCB0aG91Z2guCi8vCQkJCQkkZGl2X2NvbnRlbnQgPSAkdGhpcy0+aGFzaEhUTUxCbG9ja3MoJGRpdl9jb250ZW50KTsKLy8JCQkJCQovLwkJCQkJIyBSdW4gZG9jdW1lbnQgZ2FtdXQgbWV0aG9kcyBvbiB0aGUgY29udGVudC4KLy8JCQkJCWZvcmVhY2ggKCR0aGlzLT5kb2N1bWVudF9nYW11dCBhcyAkbWV0aG9kID0+ICRwcmlvcml0eSkgewovLwkJCQkJCSRkaXZfY29udGVudCA9ICR0aGlzLT4kbWV0aG9kKCRkaXZfY29udGVudCk7Ci8vCQkJCQl9Ci8vCi8vCQkJCQkkZGl2X29wZW4gPSBwcmVnX3JlcGxhY2UoCi8vCQkJCQkJJ3tcc21hcmtkb3duXHMqPVxzKihbXCciXSkuKz9cMX0nLCAnJywgJGRpdl9vcGVuKTsKLy8KLy8JCQkJCSRncmFmID0gJGRpdl9vcGVuIC4gIlxuIiAuICRkaXZfY29udGVudCAuICJcbiIgLiAkZGl2X2Nsb3NlOwovLwkJCQl9CgkJCQkkZ3JhZnNbJGtleV0gPSAkZ3JhZjsKCQkJfQoJCX0KCgkJcmV0dXJuIGltcGxvZGUoIlxuXG4iLCAkZ3JhZnMpOwoJfQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gZW5jb2RlQXR0cmlidXRlKCR0ZXh0KSB7CgkjCgkjIEVuY29kZSB0ZXh0IGZvciBhIGRvdWJsZS1xdW90ZWQgSFRNTCBhdHRyaWJ1dGUuIFRoaXMgZnVuY3Rpb24KCSMgaXMgKm5vdCogc3VpdGFibGUgZm9yIGF0dHJpYnV0ZXMgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3Rlcy4KCSMKCQkkdGV4dCA9ICR0aGlzLT5lbmNvZGVBbXBzQW5kQW5nbGVzKCR0ZXh0KTsKCQkkdGV4dCA9IHN0cl9yZXBsYWNlKCciJywgJyZxdW90OycsICR0ZXh0KTsKCQlyZXR1cm4gJHRleHQ7Cgl9CgoKCXByb3RlY3RlZCBmdW5jdGlvbiBlbmNvZGVVUkxBdHRyaWJ1dGUoJHVybCwgJiR0ZXh0ID0gbnVsbCkgewoJIwoJIyBFbmNvZGUgdGV4dCBmb3IgYSBkb3VibGUtcXVvdGVkIEhUTUwgYXR0cmlidXRlIGNvbnRhaW5pbmcgYSBVUkwsCgkjIGFwcGx5aW5nIHRoZSBVUkwgZmlsdGVyIGlmIHNldC4gQWxzbyBnZW5lcmF0ZXMgdGhlIHRleHR1YWwKCSMgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBVUkwgKHJlbW92aW5nIG1haWx0bzogb3IgdGVsOikgc3RvcmluZyBpdCBpbiAkdGV4dC4KCSMgVGhpcyBmdW5jdGlvbiBpcyAqbm90KiBzdWl0YWJsZSBmb3IgYXR0cmlidXRlcyBlbmNsb3NlZCBpbiBzaW5nbGUgcXVvdGVzLgoJIwoJCWlmICgkdGhpcy0+dXJsX2ZpbHRlcl9mdW5jKQoJCQkkdXJsID0gY2FsbF91c2VyX2Z1bmMoJHRoaXMtPnVybF9maWx0ZXJfZnVuYywgJHVybCk7CgoJCWlmIChwcmVnX21hdGNoKCd7Xm1haWx0bzp9aScsICR1cmwpKQoJCQkkdXJsID0gJHRoaXMtPmVuY29kZUVudGl0eU9iZnVzY2F0ZWRBdHRyaWJ1dGUoJHVybCwgJHRleHQsIDcpOwoJCWVsc2UgaWYgKHByZWdfbWF0Y2goJ3tedGVsOn1pJywgJHVybCkpCgkJewoJCQkkdXJsID0gJHRoaXMtPmVuY29kZUF0dHJpYnV0ZSgkdXJsKTsKCQkJJHRleHQgPSBzdWJzdHIoJHVybCwgNCk7CgkJfQoJCWVsc2UKCQl7CgkJCSR1cmwgPSAkdGhpcy0+ZW5jb2RlQXR0cmlidXRlKCR1cmwpOwoJCQkkdGV4dCA9ICR1cmw7CgkJfQoKCQlyZXR1cm4gJHVybDsKCX0KCQoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gZW5jb2RlQW1wc0FuZEFuZ2xlcygkdGV4dCkgewoJIwoJIyBTbWFydCBwcm9jZXNzaW5nIGZvciBhbXBlcnNhbmRzIGFuZCBhbmdsZSBicmFja2V0cyB0aGF0IG5lZWQgdG8gCgkjIGJlIGVuY29kZWQuIFZhbGlkIGNoYXJhY3RlciBlbnRpdGllcyBhcmUgbGVmdCBhbG9uZSB1bmxlc3MgdGhlCgkjIG5vLWVudGl0aWVzIG1vZGUgaXMgc2V0LgoJIwoJCWlmICgkdGhpcy0+bm9fZW50aXRpZXMpIHsKCQkJJHRleHQgPSBzdHJfcmVwbGFjZSgnJicsICcmYW1wOycsICR0ZXh0KTsKCQl9IGVsc2UgewoJCQkjIEFtcGVyc2FuZC1lbmNvZGluZyBiYXNlZCBlbnRpcmVseSBvbiBOYXQgSXJvbnMncyBBbXB1dGF0b3IKCQkJIyBNVCBwbHVnaW46IDxodHRwOi8vYnVtcHBvLm5ldC9wcm9qZWN0cy9hbXB1dGF0b3IvPgoJCQkkdGV4dCA9IHByZWdfcmVwbGFjZSgnLyYoPyEjP1t4WF0/KD86WzAtOWEtZkEtRl0rfFx3Kyk7KS8nLCAKCQkJCQkJCQknJmFtcDsnLCAkdGV4dCk7CgkJfQoJCSMgRW5jb2RlIHJlbWFpbmluZyA8J3MKCQkkdGV4dCA9IHN0cl9yZXBsYWNlKCc8JywgJyZsdDsnLCAkdGV4dCk7CgoJCXJldHVybiAkdGV4dDsKCX0KCgoJcHJvdGVjdGVkIGZ1bmN0aW9uIGRvQXV0b0xpbmtzKCR0ZXh0KSB7CgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3s8KChodHRwcz98ZnRwfGRpY3R8dGVsKTpbXlwnIj5cc10rKT59aScsCgkJCWFycmF5KCR0aGlzLCAnX2RvQXV0b0xpbmtzX3VybF9jYWxsYmFjaycpLCAkdGV4dCk7CgoJCSMgRW1haWwgYWRkcmVzc2VzOiA8YWRkcmVzc0Bkb21haW4uZm9vPgoJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CgkJCTwKCQkJKD86bWFpbHRvOik/CgkJCSgKCQkJCSg/OgoJCQkJCVstISMkJSZcJyorLz0/Xl9gLnt8fX5cd1x4ODAtXHhGRl0rCgkJCQl8CgkJCQkJIi4qPyIKCQkJCSkKCQkJCVxACgkJCQkoPzoKCQkJCQlbLWEtejAtOVx4ODAtXHhGRl0rKFwuWy1hLXowLTlceDgwLVx4RkZdKykqXC5bYS16XSsKCQkJCXwKCQkJCQlcW1tcZC5hLWZBLUY6XStcXQkjIElQdjQgJiBJUHY2CgkJCQkpCgkJCSkKCQkJPgoJCQl9eGknLAoJCQlhcnJheSgkdGhpcywgJ19kb0F1dG9MaW5rc19lbWFpbF9jYWxsYmFjaycpLCAkdGV4dCk7CgoJCXJldHVybiAkdGV4dDsKCX0KCXByb3RlY3RlZCBmdW5jdGlvbiBfZG9BdXRvTGlua3NfdXJsX2NhbGxiYWNrKCRtYXRjaGVzKSB7CgkJJHVybCA9ICR0aGlzLT5lbmNvZGVVUkxBdHRyaWJ1dGUoJG1hdGNoZXNbMV0sICR0ZXh0KTsKCQkkbGluayA9ICI8YSBocmVmPVwiJHVybFwiPiR0ZXh0PC9hPiI7CgkJcmV0dXJuICR0aGlzLT5oYXNoUGFydCgkbGluayk7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX2RvQXV0b0xpbmtzX2VtYWlsX2NhbGxiYWNrKCRtYXRjaGVzKSB7CgkJJGFkZHIgPSAkbWF0Y2hlc1sxXTsKCQkkdXJsID0gJHRoaXMtPmVuY29kZVVSTEF0dHJpYnV0ZSgibWFpbHRvOiRhZGRyIiwgJHRleHQpOwoJCSRsaW5rID0gIjxhIGhyZWY9XCIkdXJsXCI+JHRleHQ8L2E+IjsKCQlyZXR1cm4gJHRoaXMtPmhhc2hQYXJ0KCRsaW5rKTsKCX0KCgoJcHJvdGVjdGVkIGZ1bmN0aW9uIGVuY29kZUVudGl0eU9iZnVzY2F0ZWRBdHRyaWJ1dGUoJHRleHQsICYkdGFpbCA9IG51bGwsICRoZWFkX2xlbmd0aCA9IDApIHsKCSMKCSMJSW5wdXQ6IHNvbWUgdGV4dCB0byBvYmZ1c2NhdGUsIGUuZy4gIm1haWx0bzpmb29AZXhhbXBsZS5jb20iCgkjCgkjCU91dHB1dDogdGhlIHNhbWUgdGV4dCBidXQgd2l0aCBtb3N0IGNoYXJhY3RlcnMgZW5jb2RlZCBhcyBlaXRoZXIgYQoJIwkJZGVjaW1hbCBvciBoZXggZW50aXR5LCBpbiB0aGUgaG9wZXMgb2YgZm9pbGluZyBtb3N0IGFkZHJlc3MKCSMJCWhhcnZlc3Rpbmcgc3BhbSBib3RzLiBFLmcuOgoJIwoJIyAgICAgICAgJiMxMDk7JiN4NjE7JiMxMDU7JiN4NmM7JiMxMTY7JiN4NmY7JiM1ODsmI3g2NjtvJiMxMTE7CgkjICAgICAgICAmI3g0MDsmIzEwMTsmI3g3ODsmIzk3OyYjeDZkOyYjMTEyOyYjeDZjOyYjMTAxOyYjNDY7JiN4NjM7JiMxMTE7CgkjICAgICAgICAmI3g2ZDsKCSMKCSMJTm90ZTogdGhlIGFkZGl0aW9uYWwgb3V0cHV0ICR0YWlsIGlzIGFzc2lnbmVkIHRoZSBzYW1lIHZhbHVlIGFzIHRoZQoJIwlvdXB1dCwgbWludXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHNwZWNpZmllZCBieSAkaGVhZF9sZW5ndGguCgkjCgkjCUJhc2VkIGJ5IGEgZmlsdGVyIGJ5IE1hdHRoZXcgV2lja2xpbmUsIHBvc3RlZCB0byBCQkVkaXQtVGFsay4KCSMgICBXaXRoIHNvbWUgb3B0aW1pemF0aW9ucyBieSBNaWxpYW4gV29sZmYuIEZvcmNlZCBlbmNvZGluZyBvZiBIVE1MCgkjCWF0dHJpYnV0ZSBzcGVjaWFsIGNoYXJhY3RlcnMgYnkgQWxsYW4gT2RnYWFyZC4KCSMKCQlpZiAoJHRleHQgPT0gIiIpIHJldHVybiAkdGFpbCA9ICIiOwoKCQkkY2hhcnMgPSBwcmVnX3NwbGl0KCcvKD88IV4pKD8hJCkvJywgJHRleHQpOwoJCSRzZWVkID0gKGludClhYnMoY3JjMzIoJHRleHQpIC8gc3RybGVuKCR0ZXh0KSk7ICMgRGV0ZXJtaW5pc3RpYyBzZWVkLgoKCQlmb3JlYWNoICgkY2hhcnMgYXMgJGtleSA9PiAkY2hhcikgewoJCQkkb3JkID0gb3JkKCRjaGFyKTsKCQkJIyBJZ25vcmUgbm9uLWFzY2lpIGNoYXJzLgoJCQlpZiAoJG9yZCA8IDEyOCkgewoJCQkJJHIgPSAoJHNlZWQgKiAoMSArICRrZXkpKSAlIDEwMDsgIyBQc2V1ZG8tcmFuZG9tIGZ1bmN0aW9uLgoJCQkJIyByb3VnaGx5IDEwJSByYXcsIDQ1JSBoZXgsIDQ1JSBkZWMKCQkJCSMgJ0AnICptdXN0KiBiZSBlbmNvZGVkLiBJIGluc2lzdC4KCQkJCSMgJyInIGFuZCAnPicgaGF2ZSB0byBiZSBlbmNvZGVkIGluc2lkZSB0aGUgYXR0cmlidXRlCgkJCQlpZiAoJHIgPiA5MCAmJiBzdHJwb3MoJ0AiJj4nLCAkY2hhcikgPT09IGZhbHNlKSAvKiBkbyBub3RoaW5nICovOwoJCQkJZWxzZSBpZiAoJHIgPCA0NSkgJGNoYXJzWyRrZXldID0gJyYjeCcuZGVjaGV4KCRvcmQpLic7JzsKCQkJCWVsc2UgICAgICAgICAgICAgICRjaGFyc1ska2V5XSA9ICcmIycuJG9yZC4nOyc7CgkJCX0KCQl9CgoJCSR0ZXh0ID0gaW1wbG9kZSgnJywgJGNoYXJzKTsKCQkkdGFpbCA9ICRoZWFkX2xlbmd0aCA/IGltcGxvZGUoJycsIGFycmF5X3NsaWNlKCRjaGFycywgJGhlYWRfbGVuZ3RoKSkgOiAkdGV4dDsKCgkJcmV0dXJuICR0ZXh0OwoJfQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2VTcGFuKCRzdHIpIHsKCSMKCSMgVGFrZSB0aGUgc3RyaW5nICRzdHIgYW5kIHBhcnNlIGl0IGludG8gdG9rZW5zLCBoYXNoaW5nIGVtYmVkZWQgSFRNTCwKCSMgZXNjYXBlZCBjaGFyYWN0ZXJzIGFuZCBoYW5kbGluZyBjb2RlIHNwYW5zLgoJIwoJCSRvdXRwdXQgPSAnJzsKCQkKCQkkc3Bhbl9yZSA9ICd7CgkJCQkoCgkJCQkJXFxcXCcuJHRoaXMtPmVzY2FwZV9jaGFyc19yZS4nCgkJCQl8CgkJCQkJKD88IVtgXFxcXF0pCgkJCQkJYCsJCQkJCQkjIGNvZGUgc3BhbiBtYXJrZXIKCQkJJy4oICR0aGlzLT5ub19tYXJrdXAgPyAnJyA6ICcKCQkJCXwKCQkJCQk8IS0tICAgIC4qPyAgICAgLS0+CQkjIGNvbW1lbnQKCQkJCXwKCQkJCQk8XD8uKj9cPz4gfCA8JS4qPyU+CQkjIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KCQkJCXwKCQkJCQk8WyEkXT9bLWEtekEtWjAtOTpfXSsJIyByZWd1bGFyIHRhZ3MKCQkJCQkoPz4KCQkJCQkJXHMKCQkJCQkJKD8+W14iXCc+XSt8IlteIl0qInxcJ1teXCddKlwnKSoKCQkJCQkpPwoJCQkJCT4KCQkJCXwKCQkJCQk8Wy1hLXpBLVowLTk6X10rXHMqLz4gIyB4bWwtc3R5bGUgZW1wdHkgdGFnCgkJCQl8CgkJCQkJPC9bLWEtekEtWjAtOTpfXStccyo+ICMgY2xvc2luZyB0YWcKCQkJJykuJwoJCQkJKQoJCQkJfXhzJzsKCgkJd2hpbGUgKDEpIHsKCQkJIwoJCQkjIEVhY2ggbG9vcCBpdGVyYXRpb24gc2VhY2ggZm9yIGVpdGhlciB0aGUgbmV4dCB0YWcsIHRoZSBuZXh0IAoJCQkjIG9wZW5uaW5nIGNvZGUgc3BhbiBtYXJrZXIsIG9yIHRoZSBuZXh0IGVzY2FwZWQgY2hhcmFjdGVyLiAKCQkJIyBFYWNoIHRva2VuIGlzIHRoZW4gcGFzc2VkIHRvIGhhbmRsZVNwYW5Ub2tlbi4KCQkJIwoJCQkkcGFydHMgPSBwcmVnX3NwbGl0KCRzcGFuX3JlLCAkc3RyLCAyLCBQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUpOwoJCQkKCQkJIyBDcmVhdGUgdG9rZW4gZnJvbSB0ZXh0IHByZWNlZGluZyB0YWcuCgkJCWlmICgkcGFydHNbMF0gIT0gIiIpIHsKCQkJCSRvdXRwdXQgLj0gJHBhcnRzWzBdOwoJCQl9CgkJCQoJCQkjIENoZWNrIGlmIHdlIHJlYWNoIHRoZSBlbmQuCgkJCWlmIChpc3NldCgkcGFydHNbMV0pKSB7CgkJCQkkb3V0cHV0IC49ICR0aGlzLT5oYW5kbGVTcGFuVG9rZW4oJHBhcnRzWzFdLCAkcGFydHNbMl0pOwoJCQkJJHN0ciA9ICRwYXJ0c1syXTsKCQkJfQoJCQllbHNlIHsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCQoJCXJldHVybiAkb3V0cHV0OwoJfQoJCgkKCXByb3RlY3RlZCBmdW5jdGlvbiBoYW5kbGVTcGFuVG9rZW4oJHRva2VuLCAmJHN0cikgewoJIwoJIyBIYW5kbGUgJHRva2VuIHByb3ZpZGVkIGJ5IHBhcnNlU3BhbiBieSBkZXRlcm1pbmluZyBpdHMgbmF0dXJlIGFuZCAKCSMgcmV0dXJuaW5nIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIHRoYXQgc2hvdWxkIHJlcGxhY2UgaXQuCgkjCgkJc3dpdGNoICgkdG9rZW57MH0pIHsKCQkJY2FzZSAiXFwiOgoJCQkJcmV0dXJuICR0aGlzLT5oYXNoUGFydCgiJiMiLiBvcmQoJHRva2VuezF9KS4gIjsiKTsKCQkJY2FzZSAiYCI6CgkJCQkjIFNlYXJjaCBmb3IgZW5kIG1hcmtlciBpbiByZW1haW5pbmcgdGV4dC4KCQkJCWlmIChwcmVnX21hdGNoKCcvXiguKj9bXmBdKScucHJlZ19xdW90ZSgkdG9rZW4pLicoPyFgKSguKikkL3NtJywgCgkJCQkJJHN0ciwgJG1hdGNoZXMpKQoJCQkJewoJCQkJCSRzdHIgPSAkbWF0Y2hlc1syXTsKCQkJCQkkY29kZXNwYW4gPSAkdGhpcy0+bWFrZUNvZGVTcGFuKCRtYXRjaGVzWzFdKTsKCQkJCQlyZXR1cm4gJHRoaXMtPmhhc2hQYXJ0KCRjb2Rlc3Bhbik7CgkJCQl9CgkJCQlyZXR1cm4gJHRva2VuOyAvLyByZXR1cm4gYXMgdGV4dCBzaW5jZSBubyBlbmRpbmcgbWFya2VyIGZvdW5kLgoJCQlkZWZhdWx0OgoJCQkJcmV0dXJuICR0aGlzLT5oYXNoUGFydCgkdG9rZW4pOwoJCX0KCX0KCgoJcHJvdGVjdGVkIGZ1bmN0aW9uIG91dGRlbnQoJHRleHQpIHsKCSMKCSMgUmVtb3ZlIG9uZSBsZXZlbCBvZiBsaW5lLWxlYWRpbmcgdGFicyBvciBzcGFjZXMKCSMKCQlyZXR1cm4gcHJlZ19yZXBsYWNlKCcvXihcdHxbIF17MSwnLiR0aGlzLT50YWJfd2lkdGguJ30pL20nLCAnJywgJHRleHQpOwoJfQoKCgkjIFN0cmluZyBsZW5ndGggZnVuY3Rpb24gZm9yIGRldGFiLiBgX2luaXREZXRhYmAgd2lsbCBjcmVhdGUgYSBmdW5jdGlvbiB0byAKCSMgaGFubGRlIFVURi04IGlmIHRoZSBkZWZhdWx0IGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0LgoJcHJvdGVjdGVkICR1dGY4X3N0cmxlbiA9ICdtYl9zdHJsZW4nOwoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gZGV0YWIoJHRleHQpIHsKCSMKCSMgUmVwbGFjZSB0YWJzIHdpdGggdGhlIGFwcHJvcHJpYXRlIGFtb3VudCBvZiBzcGFjZS4KCSMKCQkjIEZvciBlYWNoIGxpbmUgd2Ugc2VwYXJhdGUgdGhlIGxpbmUgaW4gYmxvY2tzIGRlbGVtaXRlZCBieQoJCSMgdGFiIGNoYXJhY3RlcnMuIFRoZW4gd2UgcmVjb25zdHJ1Y3QgZXZlcnkgbGluZSBieSBhZGRpbmcgdGhlIAoJCSMgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIHNwYWNlIGJldHdlZW4gZWFjaCBibG9ja3MuCgkJCgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9eLipcdC4qJC9tJywKCQkJYXJyYXkoJHRoaXMsICdfZGV0YWJfY2FsbGJhY2snKSwgJHRleHQpOwoKCQlyZXR1cm4gJHRleHQ7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX2RldGFiX2NhbGxiYWNrKCRtYXRjaGVzKSB7CgkJJGxpbmUgPSAkbWF0Y2hlc1swXTsKCQkkc3RybGVuID0gJHRoaXMtPnV0Zjhfc3RybGVuOyAjIHN0cmxlbiBmdW5jdGlvbiBmb3IgVVRGLTguCgkJCgkJIyBTcGxpdCBpbiBibG9ja3MuCgkJJGJsb2NrcyA9IGV4cGxvZGUoIlx0IiwgJGxpbmUpOwoJCSMgQWRkIGVhY2ggYmxvY2tzIHRvIHRoZSBsaW5lLgoJCSRsaW5lID0gJGJsb2Nrc1swXTsKCQl1bnNldCgkYmxvY2tzWzBdKTsgIyBEbyBub3QgYWRkIGZpcnN0IGJsb2NrIHR3aWNlLgoJCWZvcmVhY2ggKCRibG9ja3MgYXMgJGJsb2NrKSB7CgkJCSMgQ2FsY3VsYXRlIGFtb3VudCBvZiBzcGFjZSwgaW5zZXJ0IHNwYWNlcywgaW5zZXJ0IGJsb2NrLgoJCQkkYW1vdW50ID0gJHRoaXMtPnRhYl93aWR0aCAtIAoJCQkJJHN0cmxlbigkbGluZSwgJ1VURi04JykgJSAkdGhpcy0+dGFiX3dpZHRoOwoJCQkkbGluZSAuPSBzdHJfcmVwZWF0KCIgIiwgJGFtb3VudCkgLiAkYmxvY2s7CgkJfQoJCXJldHVybiAkbGluZTsKCX0KCXByb3RlY3RlZCBmdW5jdGlvbiBfaW5pdERldGFiKCkgewoJIwoJIyBDaGVjayBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGB1dGY4X3N0cmxlbmAgcHJvcGVydHkKCSMgKGluaXRpYWxseSBgbWJfc3RybGVuYCkuIElmIHRoZSBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlLCBjcmVhdGUgYSAKCSMgZnVuY3Rpb24gdGhhdCB3aWxsIGxvb3NlbHkgY291bnQgdGhlIG51bWJlciBvZiBVVEYtOCBjaGFyYWN0ZXJzIHdpdGggYQoJIyByZWd1bGFyIGV4cHJlc3Npb24uCgkjCgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygkdGhpcy0+dXRmOF9zdHJsZW4pKSByZXR1cm47CgkJJHRoaXMtPnV0Zjhfc3RybGVuID0gY3JlYXRlX2Z1bmN0aW9uKCckdGV4dCcsICdyZXR1cm4gcHJlZ19tYXRjaF9hbGwoCgkJCSIvW1xcXFx4MDAtXFxcXHhCRl18W1xcXFx4QzAtXFxcXHhGRl1bXFxcXHg4MC1cXFxceEJGXSovIiwgCgkJCSR0ZXh0LCAkbSk7Jyk7Cgl9CgoKCXByb3RlY3RlZCBmdW5jdGlvbiB1bmhhc2goJHRleHQpIHsKCSMKCSMgU3dhcCBiYWNrIGluIGFsbCB0aGUgdGFncyBoYXNoZWQgYnkgX0hhc2hIVE1MQmxvY2tzLgoJIwoJCXJldHVybiBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy8oLilceDFBWzAtOV0rXDEvJywgCgkJCWFycmF5KCR0aGlzLCAnX3VuaGFzaF9jYWxsYmFjaycpLCAkdGV4dCk7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX3VuaGFzaF9jYWxsYmFjaygkbWF0Y2hlcykgewoJCXJldHVybiAkdGhpcy0+aHRtbF9oYXNoZXNbJG1hdGNoZXNbMF1dOwoJfQoKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/Engines/Michelf/MarkdownExtra.inc.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMgVXNlIHRoaXMgZmlsZSBpZiB5b3UgY2Fubm90IHVzZSBjbGFzcyBhdXRvbG9hZGluZy4gSXQgd2lsbCBpbmNsdWRlIGFsbCB0aGUKIyBmaWxlcyBuZWVkZWQgZm9yIHRoZSBNYXJrZG93bkV4dHJhIHBhcnNlci4KIwojIFRha2UgYSBsb29rIGF0IHRoZSBQU1ItMC1jb21wYXRpYmxlIGNsYXNzIGF1dG9sb2FkaW5nIGltcGxlbWVudGF0aW9uCiMgaW4gdGhlIFJlYWRtZS5waHAgZmlsZSBpZiB5b3Ugd2FudCBhIHNpbXBsZSBhdXRvbG9hZGVyIHNldHVwLgoKcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pIC4gJy9NYXJrZG93bkludGVyZmFjZS5waHAnOwpyZXF1aXJlX29uY2UgZGlybmFtZShfX0ZJTEVfXykgLiAnL01hcmtkb3duLnBocCc7CnJlcXVpcmVfb25jZSBkaXJuYW1lKF9fRklMRV9fKSAuICcvTWFya2Rvd25FeHRyYS5waHAnOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/Engines/Michelf/MarkdownExtra.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIwojIE1hcmtkb3duIEV4dHJhICAtICBBIHRleHQtdG8tSFRNTCBjb252ZXJzaW9uIHRvb2wgZm9yIHdlYiB3cml0ZXJzCiMKIyBQSFAgTWFya2Rvd24gRXh0cmEKIyBDb3B5cmlnaHQgKGMpIDIwMDQtMjAxNSBNaWNoZWwgRm9ydGluICAKIyA8aHR0cHM6Ly9taWNoZWxmLmNhL3Byb2plY3RzL3BocC1tYXJrZG93bi8+CiMKIyBPcmlnaW5hbCBNYXJrZG93bgojIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IEpvaG4gR3J1YmVyICAKIyA8aHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8+CiMKbmFtZXNwYWNlIE1pY2hlbGY7CgoKIwojIE1hcmtkb3duIEV4dHJhIFBhcnNlciBDbGFzcwojCgpjbGFzcyBNYXJrZG93bkV4dHJhIGV4dGVuZHMgXE1pY2hlbGZcTWFya2Rvd24gewoKCSMjIyBDb25maWd1cmF0aW9uIFZhcmlhYmxlcyAjIyMKCgkjIFByZWZpeCBmb3IgZm9vdG5vdGUgaWRzLgoJcHVibGljICRmbl9pZF9wcmVmaXggPSAiIjsKCQoJIyBPcHRpb25hbCB0aXRsZSBhdHRyaWJ1dGUgZm9yIGZvb3Rub3RlIGxpbmtzIGFuZCBiYWNrbGlua3MuCglwdWJsaWMgJGZuX2xpbmtfdGl0bGUgPSAiIjsKCXB1YmxpYyAkZm5fYmFja2xpbmtfdGl0bGUgPSAiIjsKCQoJIyBPcHRpb25hbCBjbGFzcyBhdHRyaWJ1dGUgZm9yIGZvb3Rub3RlIGxpbmtzIGFuZCBiYWNrbGlua3MuCglwdWJsaWMgJGZuX2xpbmtfY2xhc3MgPSAiZm9vdG5vdGUtcmVmIjsKCXB1YmxpYyAkZm5fYmFja2xpbmtfY2xhc3MgPSAiZm9vdG5vdGUtYmFja3JlZiI7CgoJIyBDbGFzcyBuYW1lIGZvciB0YWJsZSBjZWxsIGFsaWdubWVudCAoJSUgcmVwbGFjZWQgbGVmdC9jZW50ZXIvcmlnaHQpCgkjIEZvciBpbnN0YW5jZTogJ2dvLSUlJyBiZWNvbWVzICdnby1sZWZ0JyBvciAnZ28tcmlnaHQnIG9yICdnby1jZW50ZXInCgkjIElmIGVtcHR5LCB0aGUgYWxpZ24gYXR0cmlidXRlIGlzIHVzZWQgaW5zdGVhZCBvZiBhIGNsYXNzIG5hbWUuCglwdWJsaWMgJHRhYmxlX2FsaWduX2NsYXNzX3RtcGwgPSAnJzsKCgkjIE9wdGlvbmFsIGNsYXNzIHByZWZpeCBmb3IgZmVuY2VkIGNvZGUgYmxvY2suCglwdWJsaWMgJGNvZGVfY2xhc3NfcHJlZml4ID0gIiI7CgkjIENsYXNzIGF0dHJpYnV0ZSBmb3IgY29kZSBibG9ja3MgZ29lcyBvbiB0aGUgYGNvZGVgIHRhZzsKCSMgc2V0dGluZyB0aGlzIHRvIHRydWUgd2lsbCBwdXQgYXR0cmlidXRlcyBvbiB0aGUgYHByZWAgdGFnIGluc3RlYWQuCglwdWJsaWMgJGNvZGVfYXR0cl9vbl9wcmUgPSBmYWxzZTsKCQoJIyBQcmVkZWZpbmVkIGFiYnJldmlhdGlvbnMuCglwdWJsaWMgJHByZWRlZl9hYmJyID0gYXJyYXkoKTsKCgkjIyMgUGFyc2VyIEltcGxlbWVudGF0aW9uICMjIwoKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCSMKCSMgQ29uc3RydWN0b3IgZnVuY3Rpb24uIEluaXRpYWxpemUgdGhlIHBhcnNlciBvYmplY3QuCgkjCgkJIyBBZGQgZXh0cmEgZXNjYXBhYmxlIGNoYXJhY3RlcnMgYmVmb3JlIHBhcmVudCBjb25zdHJ1Y3RvciAKCQkjIGluaXRpYWxpemUgdGhlIHRhYmxlLgoJCSR0aGlzLT5lc2NhcGVfY2hhcnMgLj0gJzp8JzsKCQkKCQkjIEluc2VydCBleHRyYSBkb2N1bWVudCwgYmxvY2ssIGFuZCBzcGFuIHRyYW5zZm9ybWF0aW9ucy4gCgkJIyBQYXJlbnQgY29uc3RydWN0b3Igd2lsbCBkbyB0aGUgc29ydGluZy4KCQkkdGhpcy0+ZG9jdW1lbnRfZ2FtdXQgKz0gYXJyYXkoCgkJCSJkb0ZlbmNlZENvZGVCbG9ja3MiID0+IDUsCgkJCSJzdHJpcEZvb3Rub3RlcyIgICAgID0+IDE1LAoJCQkic3RyaXBBYmJyZXZpYXRpb25zIiA9PiAyNSwKCQkJImFwcGVuZEZvb3Rub3RlcyIgICAgPT4gNTAsCgkJCSk7CgkJJHRoaXMtPmJsb2NrX2dhbXV0ICs9IGFycmF5KAoJCQkiZG9GZW5jZWRDb2RlQmxvY2tzIiA9PiA1LAoJCQkiZG9UYWJsZXMiICAgICAgICAgICA9PiAxNSwKCQkJImRvRGVmTGlzdHMiICAgICAgICAgPT4gNDUsCgkJCSk7CgkJJHRoaXMtPnNwYW5fZ2FtdXQgKz0gYXJyYXkoCgkJCSJkb0Zvb3Rub3RlcyIgICAgICAgID0+IDUsCgkJCSJkb0FiYnJldmlhdGlvbnMiICAgID0+IDcwLAoJCQkpOwoJCQoJCSR0aGlzLT5lbmhhbmNlZF9vcmRlcmVkX2xpc3QgPSB0cnVlOwoJCXBhcmVudDo6X19jb25zdHJ1Y3QoKTsKCX0KCQoJCgkjIEV4dHJhIHZhcmlhYmxlcyB1c2VkIGR1cmluZyBleHRyYSB0cmFuc2Zvcm1hdGlvbnMuCglwcm90ZWN0ZWQgJGZvb3Rub3RlcyA9IGFycmF5KCk7Cglwcm90ZWN0ZWQgJGZvb3Rub3Rlc19vcmRlcmVkID0gYXJyYXkoKTsKCXByb3RlY3RlZCAkZm9vdG5vdGVzX3JlZl9jb3VudCA9IGFycmF5KCk7Cglwcm90ZWN0ZWQgJGZvb3Rub3Rlc19udW1iZXJzID0gYXJyYXkoKTsKCXByb3RlY3RlZCAkYWJicl9kZXNjaXB0aW9ucyA9IGFycmF5KCk7Cglwcm90ZWN0ZWQgJGFiYnJfd29yZF9yZSA9ICcnOwoJCgkjIEdpdmUgdGhlIGN1cnJlbnQgZm9vdG5vdGUgbnVtYmVyLgoJcHJvdGVjdGVkICRmb290bm90ZV9jb3VudGVyID0gMTsKCQoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0dXAoKSB7CgkjCgkjIFNldHRpbmcgdXAgRXh0cmEtc3BlY2lmaWMgdmFyaWFibGVzLgoJIwoJCXBhcmVudDo6c2V0dXAoKTsKCQkKCQkkdGhpcy0+Zm9vdG5vdGVzID0gYXJyYXkoKTsKCQkkdGhpcy0+Zm9vdG5vdGVzX29yZGVyZWQgPSBhcnJheSgpOwoJCSR0aGlzLT5mb290bm90ZXNfcmVmX2NvdW50ID0gYXJyYXkoKTsKCQkkdGhpcy0+Zm9vdG5vdGVzX251bWJlcnMgPSBhcnJheSgpOwoJCSR0aGlzLT5hYmJyX2Rlc2NpcHRpb25zID0gYXJyYXkoKTsKCQkkdGhpcy0+YWJicl93b3JkX3JlID0gJyc7CgkJJHRoaXMtPmZvb3Rub3RlX2NvdW50ZXIgPSAxOwoJCQoJCWZvcmVhY2ggKCR0aGlzLT5wcmVkZWZfYWJiciBhcyAkYWJicl93b3JkID0+ICRhYmJyX2Rlc2MpIHsKCQkJaWYgKCR0aGlzLT5hYmJyX3dvcmRfcmUpCgkJCQkkdGhpcy0+YWJicl93b3JkX3JlIC49ICd8JzsKCQkJJHRoaXMtPmFiYnJfd29yZF9yZSAuPSBwcmVnX3F1b3RlKCRhYmJyX3dvcmQpOwoJCQkkdGhpcy0+YWJicl9kZXNjaXB0aW9uc1skYWJicl93b3JkXSA9IHRyaW0oJGFiYnJfZGVzYyk7CgkJfQoJfQoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gdGVhcmRvd24oKSB7CgkjCgkjIENsZWFyaW5nIEV4dHJhLXNwZWNpZmljIHZhcmlhYmxlcy4KCSMKCQkkdGhpcy0+Zm9vdG5vdGVzID0gYXJyYXkoKTsKCQkkdGhpcy0+Zm9vdG5vdGVzX29yZGVyZWQgPSBhcnJheSgpOwoJCSR0aGlzLT5mb290bm90ZXNfcmVmX2NvdW50ID0gYXJyYXkoKTsKCQkkdGhpcy0+Zm9vdG5vdGVzX251bWJlcnMgPSBhcnJheSgpOwoJCSR0aGlzLT5hYmJyX2Rlc2NpcHRpb25zID0gYXJyYXkoKTsKCQkkdGhpcy0+YWJicl93b3JkX3JlID0gJyc7CgkJCgkJcGFyZW50Ojp0ZWFyZG93bigpOwoJfQoJCgkKCSMjIyBFeHRyYSBBdHRyaWJ1dGUgUGFyc2VyICMjIwoKCSMgRXhwcmVzc2lvbiB0byB1c2UgdG8gY2F0Y2ggYXR0cmlidXRlcyAoaW5jbHVkZXMgdGhlIGJyYWNlcykKCXByb3RlY3RlZCAkaWRfY2xhc3NfYXR0cl9jYXRjaF9yZSA9ICdceygoPzpbIF0qWyMuYS16XVstXzphLXpBLVowLTk9XSspezEsfSlbIF0qXH0nOwoJIyBFeHByZXNzaW9uIHRvIHVzZSB3aGVuIHBhcnNpbmcgaW4gYSBjb250ZXh0IHdoZW4gbm8gY2FwdHVyZSBpcyBkZXNpcmVkCglwcm90ZWN0ZWQgJGlkX2NsYXNzX2F0dHJfbm9jYXRjaF9yZSA9ICdceyg/OlsgXSpbIy5hLXpdWy1fOmEtekEtWjAtOT1dKyl7MSx9WyBdKlx9JzsKCglwcm90ZWN0ZWQgZnVuY3Rpb24gZG9FeHRyYUF0dHJpYnV0ZXMoJHRhZ19uYW1lLCAkYXR0ciwgJGRlZmF1bHRJZFZhbHVlID0gbnVsbCkgewoJIwoJIyBQYXJzZSBhdHRyaWJ1dGVzIGNhdWdodCBieSB0aGUgJHRoaXMtPmlkX2NsYXNzX2F0dHJfY2F0Y2hfcmUgZXhwcmVzc2lvbgoJIyBhbmQgcmV0dXJuIHRoZSBIVE1MLWZvcm1hdHRlZCBsaXN0IG9mIGF0dHJpYnV0ZXMuCgkjCgkjIEN1cnJlbnRseSBzdXBwb3J0ZWQgYXR0cmlidXRlcyBhcmUgLmNsYXNzIGFuZCAjaWQuCgkjCgkjIEluIGFkZGl0aW9uLCB0aGlzIG1ldGhvZCBhbHNvIHN1cHBvcnRzIHN1cHBseWluZyBhIGRlZmF1bHQgSWQgdmFsdWUsCgkjIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBwb3B1bGF0ZSB0aGUgaWQgYXR0cmlidXRlIGluIGNhc2UgaXQgd2FzIG5vdAoJIyBvdmVycmlkZGVuLgoJCWlmIChlbXB0eSgkYXR0cikgJiYgISRkZWZhdWx0SWRWYWx1ZSkgcmV0dXJuICIiOwoJCQoJCSMgU3BsaXQgb24gY29tcG9uZW50cwoJCXByZWdfbWF0Y2hfYWxsKCcvWyMuYS16XVstXzphLXpBLVowLTk9XSsvJywgJGF0dHIsICRtYXRjaGVzKTsKCQkkZWxlbWVudHMgPSAkbWF0Y2hlc1swXTsKCgkJIyBoYW5kbGUgY2xhc3NlcyBhbmQgaWRzIChvbmx5IGZpcnN0IGlkIHRha2VuIGludG8gYWNjb3VudCkKCQkkY2xhc3NlcyA9IGFycmF5KCk7CgkJJGF0dHJpYnV0ZXMgPSBhcnJheSgpOwoJCSRpZCA9IGZhbHNlOwoJCWZvcmVhY2ggKCRlbGVtZW50cyBhcyAkZWxlbWVudCkgewoJCQlpZiAoJGVsZW1lbnR7MH0gPT0gJy4nKSB7CgkJCQkkY2xhc3Nlc1tdID0gc3Vic3RyKCRlbGVtZW50LCAxKTsKCQkJfSBlbHNlIGlmICgkZWxlbWVudHswfSA9PSAnIycpIHsKCQkJCWlmICgkaWQgPT09IGZhbHNlKSAkaWQgPSBzdWJzdHIoJGVsZW1lbnQsIDEpOwoJCQl9IGVsc2UgaWYgKHN0cnBvcygkZWxlbWVudCwgJz0nKSA+IDApIHsKCQkJCSRwYXJ0cyA9IGV4cGxvZGUoJz0nLCAkZWxlbWVudCwgMik7CgkJCQkkYXR0cmlidXRlc1tdID0gJHBhcnRzWzBdIC4gJz0iJyAuICRwYXJ0c1sxXSAuICciJzsKCQkJfQoJCX0KCgkJaWYgKCEkaWQpICRpZCA9ICRkZWZhdWx0SWRWYWx1ZTsKCgkJIyBjb21wb3NlIGF0dHJpYnV0ZXMgYXMgc3RyaW5nCgkJJGF0dHJfc3RyID0gIiI7CgkJaWYgKCFlbXB0eSgkaWQpKSB7CgkJCSRhdHRyX3N0ciAuPSAnIGlkPSInLiR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJGlkKSAuJyInOwoJCX0KCQlpZiAoIWVtcHR5KCRjbGFzc2VzKSkgewoJCQkkYXR0cl9zdHIgLj0gJyBjbGFzcz0iJy4gaW1wbG9kZSgiICIsICRjbGFzc2VzKSAuICciJzsKCQl9CgkJaWYgKCEkdGhpcy0+bm9fbWFya3VwICYmICFlbXB0eSgkYXR0cmlidXRlcykpIHsKCQkJJGF0dHJfc3RyIC49ICcgJy5pbXBsb2RlKCIgIiwgJGF0dHJpYnV0ZXMpOwoJCX0KCQlyZXR1cm4gJGF0dHJfc3RyOwoJfQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gc3RyaXBMaW5rRGVmaW5pdGlvbnMoJHRleHQpIHsKCSMKCSMgU3RyaXBzIGxpbmsgZGVmaW5pdGlvbnMgZnJvbSB0ZXh0LCBzdG9yZXMgdGhlIFVSTHMgYW5kIHRpdGxlcyBpbgoJIyBoYXNoIHJlZmVyZW5jZXMuCgkjCgkJJGxlc3NfdGhhbl90YWIgPSAkdGhpcy0+dGFiX3dpZHRoIC0gMTsKCgkJIyBMaW5rIGRlZnMgYXJlIGluIHRoZSBmb3JtOiBeW2lkXTogdXJsICJvcHRpb25hbCB0aXRsZSIKCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnewoJCQkJCQkJXlsgXXswLCcuJGxlc3NfdGhhbl90YWIuJ31cWyguKylcXVsgXT86CSMgaWQgPSAkMQoJCQkJCQkJICBbIF0qCgkJCQkJCQkgIFxuPwkJCQkjIG1heWJlICpvbmUqIG5ld2xpbmUKCQkJCQkJCSAgWyBdKgoJCQkJCQkJKD86CgkJCQkJCQkgIDwoLis/KT4JCQkjIHVybCA9ICQyCgkJCQkJCQl8CgkJCQkJCQkgIChcUys/KQkJCSMgdXJsID0gJDMKCQkJCQkJCSkKCQkJCQkJCSAgWyBdKgoJCQkJCQkJICBcbj8JCQkJIyBtYXliZSBvbmUgbmV3bGluZQoJCQkJCQkJICBbIF0qCgkJCQkJCQkoPzoKCQkJCQkJCQkoPzw9XHMpCQkJIyBsb29rYmVoaW5kIGZvciB3aGl0ZXNwYWNlCgkJCQkJCQkJWyIoXQoJCQkJCQkJCSguKj8pCQkJIyB0aXRsZSA9ICQ0CgkJCQkJCQkJWyIpXQoJCQkJCQkJCVsgXSoKCQkJCQkJCSk/CSMgdGl0bGUgaXMgb3B0aW9uYWwKCQkJCQkoPzpbIF0qICcuJHRoaXMtPmlkX2NsYXNzX2F0dHJfY2F0Y2hfcmUuJyApPyAgIyAkNSA9IGV4dHJhIGlkICYgY2xhc3MgYXR0cgoJCQkJCQkJKD86XG4rfFxaKQoJCQl9eG0nLAoJCQlhcnJheSgkdGhpcywgJ19zdHJpcExpbmtEZWZpbml0aW9uc19jYWxsYmFjaycpLAoJCQkkdGV4dCk7CgkJcmV0dXJuICR0ZXh0OwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9zdHJpcExpbmtEZWZpbml0aW9uc19jYWxsYmFjaygkbWF0Y2hlcykgewoJCSRsaW5rX2lkID0gc3RydG9sb3dlcigkbWF0Y2hlc1sxXSk7CgkJJHVybCA9ICRtYXRjaGVzWzJdID09ICcnID8gJG1hdGNoZXNbM10gOiAkbWF0Y2hlc1syXTsKCQkkdGhpcy0+dXJsc1skbGlua19pZF0gPSAkdXJsOwoJCSR0aGlzLT50aXRsZXNbJGxpbmtfaWRdID0mICRtYXRjaGVzWzRdOwoJCSR0aGlzLT5yZWZfYXR0clskbGlua19pZF0gPSAkdGhpcy0+ZG9FeHRyYUF0dHJpYnV0ZXMoIiIsICRkdW1teSA9JiAkbWF0Y2hlc1s1XSk7CgkJcmV0dXJuICcnOyAjIFN0cmluZyB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgYmxvY2sKCX0KCgoJIyMjIEhUTUwgQmxvY2sgUGFyc2VyICMjIwoJCgkjIFRhZ3MgdGhhdCBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYmxvY2sgdGFnczoKCXByb3RlY3RlZCAkYmxvY2tfdGFnc19yZSA9ICdwfGRpdnxoWzEtNl18YmxvY2txdW90ZXxwcmV8dGFibGV8ZGx8b2x8dWx8YWRkcmVzc3xmb3JtfGZpZWxkc2V0fGlmcmFtZXxocnxsZWdlbmR8YXJ0aWNsZXxzZWN0aW9ufG5hdnxhc2lkZXxoZ3JvdXB8aGVhZGVyfGZvb3RlcnxmaWdjYXB0aW9ufGZpZ3VyZSc7CgkJCQkJCSAgIAoJIyBUYWdzIHRyZWF0ZWQgYXMgYmxvY2sgdGFncyBvbmx5IGlmIHRoZSBvcGVuaW5nIHRhZyBpcyBhbG9uZSBvbiBpdHMgbGluZToKCXByb3RlY3RlZCAkY29udGV4dF9ibG9ja190YWdzX3JlID0gJ3NjcmlwdHxub3NjcmlwdHxzdHlsZXxpbnN8ZGVsfGlmcmFtZXxvYmplY3R8c291cmNlfHRyYWNrfHBhcmFtfG1hdGh8c3ZnfGNhbnZhc3xhdWRpb3x2aWRlbyc7CgkKCSMgVGFncyB3aGVyZSBtYXJrZG93bj0iMSIgZGVmYXVsdCB0byBzcGFuIG1vZGU6Cglwcm90ZWN0ZWQgJGNvbnRhaW5fc3Bhbl90YWdzX3JlID0gJ3B8aFsxLTZdfGxpfGRkfGR0fHRkfHRofGxlZ2VuZHxhZGRyZXNzJzsKCQoJIyBUYWdzIHdoaWNoIG11c3Qgbm90IGhhdmUgdGhlaXIgY29udGVudHMgbW9kaWZpZWQsIG5vIG1hdHRlciB3aGVyZSAKCSMgdGhleSBhcHBlYXI6Cglwcm90ZWN0ZWQgJGNsZWFuX3RhZ3NfcmUgPSAnc2NyaXB0fHN0eWxlfG1hdGh8c3ZnJzsKCQoJIyBUYWdzIHRoYXQgZG8gbm90IG5lZWQgdG8gYmUgY2xvc2VkLgoJcHJvdGVjdGVkICRhdXRvX2Nsb3NlX3RhZ3NfcmUgPSAnaHJ8aW1nfHBhcmFtfHNvdXJjZXx0cmFjayc7CgkKCglwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzaEhUTUxCbG9ja3MoJHRleHQpIHsKCSMKCSMgSGFzaGlmeSBIVE1MIEJsb2NrcyBhbmQgImNsZWFuIHRhZ3MiLgoJIwoJIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBmb3IgYmxvY2stbGV2ZWwgSFRNTCB0YWdzLCBzdWNoIGFzIGhlYWRlcnMsCgkjIGxpc3RzLCBhbmQgdGFibGVzLiBUaGF0J3MgYmVjYXVzZSB3ZSBzdGlsbCB3YW50IHRvIHdyYXAgPHA+cyBhcm91bmQKCSMgInBhcmFncmFwaHMiIHRoYXQgYXJlIHdyYXBwZWQgaW4gbm9uLWJsb2NrLWxldmVsIHRhZ3MsIHN1Y2ggYXMgYW5jaG9ycywKCSMgcGhyYXNlIGVtcGhhc2lzLCBhbmQgc3BhbnMuIFRoZSBsaXN0IG9mIHRhZ3Mgd2UncmUgbG9va2luZyBmb3IgaXMKCSMgaGFyZC1jb2RlZC4KCSMKCSMgVGhpcyB3b3JrcyBieSBjYWxsaW5nIF9IYXNoSFRNTEJsb2Nrc19Jbk1hcmtkb3duLCB3aGljaCB0aGVuIGNhbGxzCgkjIF9IYXNoSFRNTEJsb2Nrc19JbkhUTUwgd2hlbiBpdCBlbmNvdW50ZXIgYmxvY2sgdGFncy4gV2hlbiB0aGUgbWFya2Rvd249IjEiIAoJIyBhdHRyaWJ1dGUgaXMgZm91bmQgd2l0aGluIGEgdGFnLCBfSGFzaEhUTUxCbG9ja3NfSW5IVE1MIGNhbGxzIGJhY2sKCSMgIF9IYXNoSFRNTEJsb2Nrc19Jbk1hcmtkb3duIHRvIGhhbmRsZSB0aGUgTWFya2Rvd24gc3ludGF4IHdpdGhpbiB0aGUgdGFnLgoJIyBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSBjYWxsaW5nIGVhY2ggb3RoZXIuIEl0J3MgcmVjdXJzaXZlIQoJIwoJCWlmICgkdGhpcy0+bm9fbWFya3VwKSAgcmV0dXJuICR0ZXh0OwoKCQkjCgkJIyBDYWxsIHRoZSBIVE1MLWluLU1hcmtkb3duIGhhc2hlci4KCQkjCgkJbGlzdCgkdGV4dCwgKSA9ICR0aGlzLT5faGFzaEhUTUxCbG9ja3NfaW5NYXJrZG93bigkdGV4dCk7CgkJCgkJcmV0dXJuICR0ZXh0OwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9oYXNoSFRNTEJsb2Nrc19pbk1hcmtkb3duKCR0ZXh0LCAkaW5kZW50ID0gMCwKCQkJCQkJCQkJCSRlbmNsb3NpbmdfdGFnX3JlID0gJycsICRzcGFuID0gZmFsc2UpCgl7CgkjCgkjIFBhcnNlIG1hcmtkb3duIHRleHQsIGNhbGxpbmcgX0hhc2hIVE1MQmxvY2tzX0luSFRNTCBmb3IgYmxvY2sgdGFncy4KCSMKCSMgKiAgICRpbmRlbnQgaXMgdGhlIG51bWJlciBvZiBzcGFjZSB0byBiZSBpZ25vcmVkIHdoZW4gY2hlY2tpbmcgZm9yIGNvZGUgCgkjICAgICBibG9ja3MuIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgaWYgd2UgZG9uJ3QgdGFrZSB0aGUgaW5kZW50IGludG8gCgkjICAgICBhY2NvdW50LCBzb21ldGhpbmcgbGlrZSB0aGlzICh3aGljaCBsb29rcyByaWdodCkgd29uJ3Qgd29yayBhcyBleHBlY3RlZDoKCSMKCSMgICAgIDxkaXY+CgkjICAgICAgICAgPGRpdiBtYXJrZG93bj0iMSI+CgkjICAgICAgICAgSGVsbG8gV29ybGQuICA8LS0gSXMgdGhpcyBhIE1hcmtkb3duIGNvZGUgYmxvY2sgb3IgdGV4dD8KCSMgICAgICAgICA8L2Rpdj4gIDwtLSBJcyB0aGlzIGEgTWFya2Rvd24gY29kZSBibG9jayBvciBhIHJlYWwgdGFnPwoJIyAgICAgPGRpdj4KCSMKCSMgICAgIElmIHlvdSBkb24ndCBsaWtlIHRoaXMsIGp1c3QgZG9uJ3QgaW5kZW50IHRoZSB0YWcgb24gd2hpY2gKCSMgICAgIHlvdSBhcHBseSB0aGUgbWFya2Rvd249IjEiIGF0dHJpYnV0ZS4KCSMKCSMgKiAgIElmICRlbmNsb3NpbmdfdGFnX3JlIGlzIG5vdCBlbXB0eSwgc3RvcHMgYXQgdGhlIGZpcnN0IHVubWF0Y2hlZCBjbG9zaW5nIAoJIyAgICAgdGFnIHdpdGggdGhhdCBuYW1lLiBOZXN0ZWQgdGFncyBzdXBwb3J0ZWQuCgkjCgkjICogICBJZiAkc3BhbiBpcyB0cnVlLCB0ZXh0IGluc2lkZSBtdXN0IHRyZWF0ZWQgYXMgc3Bhbi4gU28gYW55IGRvdWJsZSAKCSMgICAgIG5ld2xpbmUgd2lsbCBiZSByZXBsYWNlZCBieSBhIHNpbmdsZSBuZXdsaW5lIHNvIHRoYXQgaXQgZG9lcyBub3QgY3JlYXRlIAoJIyAgICAgcGFyYWdyYXBocy4KCSMKCSMgUmV0dXJucyBhbiBhcnJheSBvZiB0aGF0IGZvcm06ICggcHJvY2Vzc2VkIHRleHQgLCByZW1haW5pbmcgdGV4dCApCgkjCgkJaWYgKCR0ZXh0ID09PSAnJykgcmV0dXJuIGFycmF5KCcnLCAnJyk7CgoJCSMgUmVnZXggdG8gY2hlY2sgZm9yIHRoZSBwcmVzZW5zZSBvZiBuZXdsaW5lcyBhcm91bmQgYSBibG9jayB0YWcuCgkJJG5ld2xpbmVfYmVmb3JlX3JlID0gJy8oPzpeXG4/fFxuXG4pKiQvJzsKCQkkbmV3bGluZV9hZnRlcl9yZSA9IAoJCQknewoJCQkJXgkJCQkJCSMgU3RhcnQgb2YgdGV4dCBmb2xsb3dpbmcgdGhlIHRhZy4KCQkJCSg/PlsgXSo8IS0tLio/LS0+KT8JCSMgT3B0aW9uYWwgY29tbWVudC4KCQkJCVsgXSpcbgkJCQkJIyBNdXN0IGJlIGZvbGxvd2VkIGJ5IG5ld2xpbmUuCgkJCX14cyc7CgkJCgkJIyBSZWdleCB0byBtYXRjaCBhbnkgdGFnLgoJCSRibG9ja190YWdfcmUgPQoJCQknewoJCQkJKAkJCQkJIyAkMjogQ2FwdHVyZSB3aG9sZSB0YWcuCgkJCQkJPC8/CQkJCQkjIEFueSBvcGVuaW5nIG9yIGNsb3NpbmcgdGFnLgoJCQkJCQkoPz4JCQkJIyBUYWcgbmFtZS4KCQkJCQkJCScuJHRoaXMtPmJsb2NrX3RhZ3NfcmUuJwkJCXwKCQkJCQkJCScuJHRoaXMtPmNvbnRleHRfYmxvY2tfdGFnc19yZS4nCXwKCQkJCQkJCScuJHRoaXMtPmNsZWFuX3RhZ3NfcmUuJyAgICAgICAgCXwKCQkJCQkJCSg/IVxzKScuJGVuY2xvc2luZ190YWdfcmUuJwoJCQkJCQkpCgkJCQkJCSg/OgoJCQkJCQkJKD89W1xzIlwnL2EtekEtWjAtOV0pCSMgQWxsb3dlZCBjaGFyYWN0ZXJzIGFmdGVyIHRhZyBuYW1lLgoJCQkJCQkJKD8+CgkJCQkJCQkJIi4qPyIJCXwJIyBEb3VibGUgcXVvdGVzIChjYW4gY29udGFpbiBgPmApCgkJCQkJCQkJXCcuKj9cJyAgIAl8CSMgU2luZ2xlIHF1b3RlcyAoY2FuIGNvbnRhaW4gYD5gKQoJCQkJCQkJCS4rPwkJCQkjIEFueXRoaW5nIGJ1dCBxdW90ZXMgYW5kIGA+YC4KCQkJCQkJCSkqPwoJCQkJCQkpPwoJCQkJCT4JCQkJCSMgRW5kIG9mIHRhZy4KCQkJCXwKCQkJCQk8IS0tICAgIC4qPyAgICAgLS0+CSMgSFRNTCBDb21tZW50CgkJCQl8CgkJCQkJPFw/Lio/XD8+IHwgPCUuKj8lPgkjIFByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KCQkJCXwKCQkJCQk8IVxbQ0RBVEFcWy4qP1xdXF0+CSMgQ0RhdGEgQmxvY2sKCQkJCScuICggISRzcGFuID8gJyAjIElmIG5vdCBpbiBzcGFuLgoJCQkJfAoJCQkJCSMgSW5kZW50ZWQgY29kZSBibG9jawoJCQkJCSg/OiBeWyBdKlxuIHwgXiB8IFxuWyBdKlxuICkKCQkJCQlbIF17Jy4oJGluZGVudCs0KS4nfVteXG5dKiBcbgoJCQkJCSg/PgoJCQkJCQkoPzogWyBdeycuKCRpbmRlbnQrNCkuJ31bXlxuXSogfCBbIF0qICkgXG4KCQkJCQkpKgoJCQkJfAoJCQkJCSMgRmVuY2VkIGNvZGUgYmxvY2sgbWFya2VyCgkJCQkJKD88PSBeIHwgXG4gKQoJCQkJCVsgXXswLCcuKCRpbmRlbnQrMykuJ30oPzp+ezMsfXxgezMsfSkKCQkJCQkJCQkJWyBdKgoJCQkJCSg/OgoJCQkJCVwuP1stXzphLXpBLVowLTldKyAjIHN0YW5kYWxvbmUgY2xhc3MgbmFtZQoJCQkJCXwKCQkJCQkJJy4kdGhpcy0+aWRfY2xhc3NfYXR0cl9ub2NhdGNoX3JlLicgIyBleHRyYSBhdHRyaWJ1dGVzCgkJCQkJKT8KCQkJCQlbIF0qCgkJCQkJKD89IFxuICkKCQkJCScgOiAnJyApLiAnICMgRW5kIChpZiBub3QgaXMgc3BhbikuCgkJCQl8CgkJCQkJIyBDb2RlIHNwYW4gbWFya2VyCgkJCQkJIyBOb3RlLCB0aGlzIHJlZ2V4IG5lZWRzIHRvIGdvIGFmdGVyIGJhY2t0aWNrIGZlbmNlZAoJCQkJCSMgY29kZSBibG9ja3MgYnV0IGl0IHNob3VsZCBhbHNvIGJlIGtlcHQgb3V0c2lkZSBvZiB0aGUKCQkJCQkjICJpZiBub3QgaW4gc3BhbiIgY29uZGl0aW9uIGFkZGluZyBiYWNrdGlja3MgdG8gdGhlIHBhcnNlcgoJCQkJCWArCgkJCQkpCgkJCX14cyc7CgoJCQoJCSRkZXB0aCA9IDA7CQkjIEN1cnJlbnQgZGVwdGggaW5zaWRlIHRoZSB0YWcgdHJlZS4KCQkkcGFyc2VkID0gIiI7CSMgUGFyc2VkIHRleHQgdGhhdCB3aWxsIGJlIHJldHVybmVkLgoKCQkjCgkJIyBMb29wIHRocm91Z2ggZXZlcnkgdGFnIHVudGlsIHdlIGZpbmQgdGhlIGNsb3NpbmcgdGFnIG9mIHRoZSBwYXJlbnQKCQkjIG9yIGxvb3AgdW50aWwgcmVhY2hpbmcgdGhlIGVuZCBvZiB0ZXh0IGlmIG5vIHBhcmVudCB0YWcgc3BlY2lmaWVkLgoJCSMKCQlkbyB7CgkJCSMKCQkJIyBTcGxpdCB0aGUgdGV4dCB1c2luZyB0aGUgZmlyc3QgJHRhZ19tYXRjaCBwYXR0ZXJuIGZvdW5kLgoJCQkjIFRleHQgYmVmb3JlICBwYXR0ZXJuIHdpbGwgYmUgZmlyc3QgaW4gdGhlIGFycmF5LCB0ZXh0IGFmdGVyCgkJCSMgcGF0dGVybiB3aWxsIGJlIGF0IHRoZSBlbmQsIGFuZCBiZXR3ZWVuIHdpbGwgYmUgYW55IGNhdGNoZXMgbWFkZSAKCQkJIyBieSB0aGUgcGF0dGVybi4KCQkJIwoJCQkkcGFydHMgPSBwcmVnX3NwbGl0KCRibG9ja190YWdfcmUsICR0ZXh0LCAyLCAKCQkJCQkJCQlQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUpOwoJCQkKCQkJIyBJZiBpbiBNYXJrZG93biBzcGFuIG1vZGUsIGFkZCBhIGVtcHR5LXN0cmluZyBzcGFuLWxldmVsIGhhc2ggCgkJCSMgYWZ0ZXIgZWFjaCBuZXdsaW5lIHRvIHByZXZlbnQgdHJpZ2dlcmluZyBhbnkgYmxvY2sgZWxlbWVudC4KCQkJaWYgKCRzcGFuKSB7CgkJCQkkdm9pZCA9ICR0aGlzLT5oYXNoUGFydCgiIiwgJzonKTsKCQkJCSRuZXdsaW5lID0gIiR2b2lkXG4iOwoJCQkJJHBhcnRzWzBdID0gJHZvaWQgLiBzdHJfcmVwbGFjZSgiXG4iLCAkbmV3bGluZSwgJHBhcnRzWzBdKSAuICR2b2lkOwoJCQl9CgkJCQoJCQkkcGFyc2VkIC49ICRwYXJ0c1swXTsgIyBUZXh0IGJlZm9yZSBjdXJyZW50IHRhZy4KCQkJCgkJCSMgSWYgZW5kIG9mICR0ZXh0IGhhcyBiZWVuIHJlYWNoZWQuIFN0b3AgbG9vcC4KCQkJaWYgKGNvdW50KCRwYXJ0cykgPCAzKSB7CgkJCQkkdGV4dCA9ICIiOwoJCQkJYnJlYWs7CgkJCX0KCQkJCgkJCSR0YWcgID0gJHBhcnRzWzFdOyAjIFRhZyB0byBoYW5kbGUuCgkJCSR0ZXh0ID0gJHBhcnRzWzJdOyAjIFJlbWFpbmluZyB0ZXh0IGFmdGVyIGN1cnJlbnQgdGFnLgoJCQkkdGFnX3JlID0gcHJlZ19xdW90ZSgkdGFnKTsgIyBGb3IgdXNlIGluIGEgcmVndWxhciBleHByZXNzaW9uLgoJCQkKCQkJIwoJCQkjIENoZWNrIGZvcjogRmVuY2VkIGNvZGUgYmxvY2sgbWFya2VyLgoJCQkjIE5vdGU6IG5lZWQgdG8gcmVjaGVjayB0aGUgd2hvbGUgdGFnIHRvIGRpc2FtYmlndWF0ZSBiYWNrdGljawoJCQkjIGZlbmNlcyBmcm9tIGNvZGUgc3BhbnMKCQkJIwoJCQlpZiAocHJlZ19tYXRjaCgne15cbj8oWyBdezAsJy4oJGluZGVudCszKS4nfSkofnszLH18YHszLH0pWyBdKig/OlwuP1stXzphLXpBLVowLTldK3wnLiR0aGlzLT5pZF9jbGFzc19hdHRyX25vY2F0Y2hfcmUuJyk/WyBdKlxuPyR9JywgJHRhZywgJGNhcHR1cmUpKSB7CgkJCQkjIEZlbmNlZCBjb2RlIGJsb2NrIG1hcmtlcjogZmluZCBtYXRjaGluZyBlbmQgbWFya2VyLgoJCQkJJGZlbmNlX2luZGVudCA9IHN0cmxlbigkY2FwdHVyZVsxXSk7ICMgdXNlIGNhcHR1cmVkIGluZGVudCBpbiByZQoJCQkJJGZlbmNlX3JlID0gJGNhcHR1cmVbMl07ICMgdXNlIGNhcHR1cmVkIGZlbmNlIGluIHJlCgkJCQlpZiAocHJlZ19tYXRjaCgne14oPz4uKlxuKSo/WyBdeycuKCRmZW5jZV9pbmRlbnQpLid9Jy4kZmVuY2VfcmUuJ1sgXSooPzpcbnwkKX0nLCAkdGV4dCwKCQkJCQkkbWF0Y2hlcykpIAoJCQkJewoJCQkJCSMgRW5kIG1hcmtlciBmb3VuZDogcGFzcyB0ZXh0IHVuY2hhbmdlZCB1bnRpbCBtYXJrZXIuCgkJCQkJJHBhcnNlZCAuPSAkdGFnIC4gJG1hdGNoZXNbMF07CgkJCQkJJHRleHQgPSBzdWJzdHIoJHRleHQsIHN0cmxlbigkbWF0Y2hlc1swXSkpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJIyBObyBlbmQgbWFya2VyOiBqdXN0IHNraXAgaXQuCgkJCQkJJHBhcnNlZCAuPSAkdGFnOwoJCQkJfQoJCQl9CgkJCSMKCQkJIyBDaGVjayBmb3I6IEluZGVudGVkIGNvZGUgYmxvY2suCgkJCSMKCQkJZWxzZSBpZiAoJHRhZ3swfSA9PSAiXG4iIHx8ICR0YWd7MH0gPT0gIiAiKSB7CgkJCQkjIEluZGVudGVkIGNvZGUgYmxvY2s6IHBhc3MgaXQgdW5jaGFuZ2VkLCB3aWxsIGJlIGhhbmRsZWQgCgkJCQkjIGxhdGVyLgoJCQkJJHBhcnNlZCAuPSAkdGFnOwoJCQl9CgkJCSMKCQkJIyBDaGVjayBmb3I6IENvZGUgc3BhbiBtYXJrZXIKCQkJIyBOb3RlOiBuZWVkIHRvIGNoZWNrIHRoaXMgYWZ0ZXIgYmFja3RpY2sgZmVuY2VkIGNvZGUgYmxvY2tzCgkJCSMKCQkJZWxzZSBpZiAoJHRhZ3swfSA9PSAiYCIpIHsKCQkJCSMgRmluZCBjb3JyZXNwb25kaW5nIGVuZCBtYXJrZXIuCgkJCQkkdGFnX3JlID0gcHJlZ19xdW90ZSgkdGFnKTsKCQkJCWlmIChwcmVnX21hdGNoKCd7Xig/Pi4rP3xcbig/IVxuKSkqPyg/PCFgKScuJHRhZ19yZS4nKD8hYCl9JywKCQkJCQkkdGV4dCwgJG1hdGNoZXMpKQoJCQkJewoJCQkJCSMgRW5kIG1hcmtlciBmb3VuZDogcGFzcyB0ZXh0IHVuY2hhbmdlZCB1bnRpbCBtYXJrZXIuCgkJCQkJJHBhcnNlZCAuPSAkdGFnIC4gJG1hdGNoZXNbMF07CgkJCQkJJHRleHQgPSBzdWJzdHIoJHRleHQsIHN0cmxlbigkbWF0Y2hlc1swXSkpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJIyBVbm1hdGNoZWQgbWFya2VyOiBqdXN0IHNraXAgaXQuCgkJCQkJJHBhcnNlZCAuPSAkdGFnOwoJCQkJfQoJCQl9CgkJCSMKCQkJIyBDaGVjayBmb3I6IE9wZW5pbmcgQmxvY2sgbGV2ZWwgdGFnIG9yCgkJCSMgICAgICAgICAgICBPcGVuaW5nIENvbnRleHQgQmxvY2sgdGFnIChsaWtlIGlucyBhbmQgZGVsKSAKCQkJIyAgICAgICAgICAgICAgIHVzZWQgYXMgYSBibG9jayB0YWcgKHRhZyBpcyBhbG9uZSBvbiBpdCdzIGxpbmUpLgoJCQkjCgkJCWVsc2UgaWYgKHByZWdfbWF0Y2goJ3tePCg/OicuJHRoaXMtPmJsb2NrX3RhZ3NfcmUuJylcYn0nLCAkdGFnKSB8fAoJCQkJKAlwcmVnX21hdGNoKCd7XjwoPzonLiR0aGlzLT5jb250ZXh0X2Jsb2NrX3RhZ3NfcmUuJylcYn0nLCAkdGFnKSAmJgoJCQkJCXByZWdfbWF0Y2goJG5ld2xpbmVfYmVmb3JlX3JlLCAkcGFyc2VkKSAmJgoJCQkJCXByZWdfbWF0Y2goJG5ld2xpbmVfYWZ0ZXJfcmUsICR0ZXh0KQkpCgkJCQkpCgkJCXsKCQkJCSMgTmVlZCB0byBwYXJzZSB0YWcgYW5kIGZvbGxvd2luZyB0ZXh0IHVzaW5nIHRoZSBIVE1MIHBhcnNlci4KCQkJCWxpc3QoJGJsb2NrX3RleHQsICR0ZXh0KSA9IAoJCQkJCSR0aGlzLT5faGFzaEhUTUxCbG9ja3NfaW5IVE1MKCR0YWcgLiAkdGV4dCwgImhhc2hCbG9jayIsIHRydWUpOwoJCQkJCgkJCQkjIE1ha2Ugc3VyZSBpdCBzdGF5cyBvdXRzaWRlIG9mIGFueSBwYXJhZ3JhcGggYnkgYWRkaW5nIG5ld2xpbmVzLgoJCQkJJHBhcnNlZCAuPSAiXG5cbiRibG9ja190ZXh0XG5cbiI7CgkJCX0KCQkJIwoJCQkjIENoZWNrIGZvcjogQ2xlYW4gdGFnIChsaWtlIHNjcmlwdCwgbWF0aCkKCQkJIyAgICAgICAgICAgIEhUTUwgQ29tbWVudHMsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLgoJCQkjCgkJCWVsc2UgaWYgKHByZWdfbWF0Y2goJ3tePCg/OicuJHRoaXMtPmNsZWFuX3RhZ3NfcmUuJylcYn0nLCAkdGFnKSB8fAoJCQkJJHRhZ3sxfSA9PSAnIScgfHwgJHRhZ3sxfSA9PSAnPycpCgkJCXsKCQkJCSMgTmVlZCB0byBwYXJzZSB0YWcgYW5kIGZvbGxvd2luZyB0ZXh0IHVzaW5nIHRoZSBIVE1MIHBhcnNlci4KCQkJCSMgKGRvbid0IGNoZWNrIGZvciBtYXJrZG93biBhdHRyaWJ1dGUpCgkJCQlsaXN0KCRibG9ja190ZXh0LCAkdGV4dCkgPSAKCQkJCQkkdGhpcy0+X2hhc2hIVE1MQmxvY2tzX2luSFRNTCgkdGFnIC4gJHRleHQsICJoYXNoQ2xlYW4iLCBmYWxzZSk7CgkJCQkKCQkJCSRwYXJzZWQgLj0gJGJsb2NrX3RleHQ7CgkJCX0KCQkJIwoJCQkjIENoZWNrIGZvcjogVGFnIHdpdGggc2FtZSBuYW1lIGFzIGVuY2xvc2luZyB0YWcuCgkJCSMKCQkJZWxzZSBpZiAoJGVuY2xvc2luZ190YWdfcmUgIT09ICcnICYmCgkJCQkjIFNhbWUgbmFtZSBhcyBlbmNsb3NpbmcgdGFnLgoJCQkJcHJlZ19tYXRjaCgne148Lz8oPzonLiRlbmNsb3NpbmdfdGFnX3JlLicpXGJ9JywgJHRhZykpCgkJCXsKCQkJCSMKCQkJCSMgSW5jcmVhc2UvZGVjcmVhc2UgbmVzdGVkIHRhZyBjb3VudC4KCQkJCSMKCQkJCWlmICgkdGFnezF9ID09ICcvJykJCQkJCQkkZGVwdGgtLTsKCQkJCWVsc2UgaWYgKCR0YWd7c3RybGVuKCR0YWcpLTJ9ICE9ICcvJykJJGRlcHRoKys7CgoJCQkJaWYgKCRkZXB0aCA8IDApIHsKCQkJCQkjCgkJCQkJIyBHb2luZyBvdXQgb2YgcGFyZW50IGVsZW1lbnQuIENsZWFuIHVwIGFuZCBicmVhayBzbyB3ZQoJCQkJCSMgcmV0dXJuIHRvIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLgoJCQkJCSMKCQkJCQkkdGV4dCA9ICR0YWcgLiAkdGV4dDsKCQkJCQlicmVhazsKCQkJCX0KCQkJCQoJCQkJJHBhcnNlZCAuPSAkdGFnOwoJCQl9CgkJCWVsc2UgewoJCQkJJHBhcnNlZCAuPSAkdGFnOwoJCQl9CgkJfSB3aGlsZSAoJGRlcHRoID49IDApOwoJCQoJCXJldHVybiBhcnJheSgkcGFyc2VkLCAkdGV4dCk7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX2hhc2hIVE1MQmxvY2tzX2luSFRNTCgkdGV4dCwgJGhhc2hfbWV0aG9kLCAkbWRfYXR0cikgewoJIwoJIyBQYXJzZSBIVE1MLCBjYWxsaW5nIF9IYXNoSFRNTEJsb2Nrc19Jbk1hcmtkb3duIGZvciBibG9jayB0YWdzLgoJIwoJIyAqICAgQ2FsbHMgJGhhc2hfbWV0aG9kIHRvIGNvbnZlcnQgYW55IGJsb2Nrcy4KCSMgKiAgIFN0b3BzIHdoZW4gdGhlIGZpcnN0IG9wZW5pbmcgdGFnIGNsb3Nlcy4KCSMgKiAgICRtZF9hdHRyIGluZGljYXRlIGlmIHRoZSB1c2Ugb2YgdGhlIGBtYXJrZG93bj0iMSJgIGF0dHJpYnV0ZSBpcyBhbGxvd2VkLgoJIyAgICAgKGl0IGlzIG5vdCBpbnNpZGUgY2xlYW4gdGFncykKCSMKCSMgUmV0dXJucyBhbiBhcnJheSBvZiB0aGF0IGZvcm06ICggcHJvY2Vzc2VkIHRleHQgLCByZW1haW5pbmcgdGV4dCApCgkjCgkJaWYgKCR0ZXh0ID09PSAnJykgcmV0dXJuIGFycmF5KCcnLCAnJyk7CgkJCgkJIyBSZWdleCB0byBtYXRjaCBgbWFya2Rvd25gIGF0dHJpYnV0ZSBpbnNpZGUgb2YgYSB0YWcuCgkJJG1hcmtkb3duX2F0dHJfcmUgPSAnCgkJCXsKCQkJCVxzKgkJCSMgRWF0IHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBgbWFya2Rvd25gIGF0dHJpYnV0ZQoJCQkJbWFya2Rvd24KCQkJCVxzKj1ccyoKCQkJCSg/PgoJCQkJCShbIlwnXSkJCSMgJDE6IHF1b3RlIGRlbGltaXRlcgkJCgkJCQkJKC4qPykJCSMgJDI6IGF0dHJpYnV0ZSB2YWx1ZQoJCQkJCVwxCQkJIyBtYXRjaGluZyBkZWxpbWl0ZXIJCgkJCQl8CgkJCQkJKFteXHM+XSopCSMgJDM6IHVucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZQoJCQkJKQoJCQkJKCkJCQkJIyAkNDogbWFrZSAkMyBhbHdheXMgZGVmaW5lZCAoYXZvaWQgd2FybmluZ3MpCgkJCX14cyc7CgkJCgkJIyBSZWdleCB0byBtYXRjaCBhbnkgdGFnLgoJCSR0YWdfcmUgPSAnewoJCQkJKAkJCQkJIyAkMjogQ2FwdHVyZSB3aG9sZSB0YWcuCgkJCQkJPC8/CQkJCQkjIEFueSBvcGVuaW5nIG9yIGNsb3NpbmcgdGFnLgoJCQkJCQlbXHc6JF0rCQkJIyBUYWcgbmFtZS4KCQkJCQkJKD86CgkJCQkJCQkoPz1bXHMiXCcvYS16QS1aMC05XSkJIyBBbGxvd2VkIGNoYXJhY3RlcnMgYWZ0ZXIgdGFnIG5hbWUuCgkJCQkJCQkoPz4KCQkJCQkJCQkiLio/IgkJfAkjIERvdWJsZSBxdW90ZXMgKGNhbiBjb250YWluIGA+YCkKCQkJCQkJCQlcJy4qP1wnICAgCXwJIyBTaW5nbGUgcXVvdGVzIChjYW4gY29udGFpbiBgPmApCgkJCQkJCQkJLis/CQkJCSMgQW55dGhpbmcgYnV0IHF1b3RlcyBhbmQgYD5gLgoJCQkJCQkJKSo/CgkJCQkJCSk/CgkJCQkJPgkJCQkJIyBFbmQgb2YgdGFnLgoJCQkJfAoJCQkJCTwhLS0gICAgLio/ICAgICAtLT4JIyBIVE1MIENvbW1lbnQKCQkJCXwKCQkJCQk8XD8uKj9cPz4gfCA8JS4qPyU+CSMgUHJvY2Vzc2luZyBpbnN0cnVjdGlvbgoJCQkJfAoJCQkJCTwhXFtDREFUQVxbLio/XF1cXT4JIyBDRGF0YSBCbG9jawoJCQkJKQoJCQl9eHMnOwoJCQoJCSRvcmlnaW5hbF90ZXh0ID0gJHRleHQ7CQkjIFNhdmUgb3JpZ2luYWwgdGV4dCBpbiBjYXNlIG9mIGZhbGl1cmUuCgkJCgkJJGRlcHRoCQk9IDA7CSMgQ3VycmVudCBkZXB0aCBpbnNpZGUgdGhlIHRhZyB0cmVlLgoJCSRibG9ja190ZXh0CT0gIiI7CSMgVGVtcG9yYXJ5IHRleHQgaG9sZGVyIGZvciBjdXJyZW50IHRleHQuCgkJJHBhcnNlZAkJPSAiIjsJIyBQYXJzZWQgdGV4dCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQuCgoJCSMKCQkjIEdldCB0aGUgbmFtZSBvZiB0aGUgc3RhcnRpbmcgdGFnLgoJCSMgKFRoaXMgcGF0dGVybiBtYWtlcyAkYmFzZV90YWdfbmFtZV9yZSBzYWZlIHdpdGhvdXQgcXVvdGluZy4pCgkJIwoJCWlmIChwcmVnX21hdGNoKCcvXjwoW1x3OiRdKilcYi8nLCAkdGV4dCwgJG1hdGNoZXMpKQoJCQkkYmFzZV90YWdfbmFtZV9yZSA9ICRtYXRjaGVzWzFdOwoKCQkjCgkJIyBMb29wIHRocm91Z2ggZXZlcnkgdGFnIHVudGlsIHdlIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2xvc2luZyB0YWcuCgkJIwoJCWRvIHsKCQkJIwoJCQkjIFNwbGl0IHRoZSB0ZXh0IHVzaW5nIHRoZSBmaXJzdCAkdGFnX21hdGNoIHBhdHRlcm4gZm91bmQuCgkJCSMgVGV4dCBiZWZvcmUgIHBhdHRlcm4gd2lsbCBiZSBmaXJzdCBpbiB0aGUgYXJyYXksIHRleHQgYWZ0ZXIKCQkJIyBwYXR0ZXJuIHdpbGwgYmUgYXQgdGhlIGVuZCwgYW5kIGJldHdlZW4gd2lsbCBiZSBhbnkgY2F0Y2hlcyBtYWRlIAoJCQkjIGJ5IHRoZSBwYXR0ZXJuLgoJCQkjCgkJCSRwYXJ0cyA9IHByZWdfc3BsaXQoJHRhZ19yZSwgJHRleHQsIDIsIFBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRSk7CgkJCQoJCQlpZiAoY291bnQoJHBhcnRzKSA8IDMpIHsKCQkJCSMKCQkJCSMgRW5kIG9mICR0ZXh0IHJlYWNoZWQgd2l0aCB1bmJhbGVuY2VkIHRhZyhzKS4KCQkJCSMgSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gb3JpZ2luYWwgdGV4dCB1bmNoYW5nZWQgYW5kIHBhc3MgdGhlCgkJCQkjIGZpcnN0IGNoYXJhY3RlciBhcyBmaWx0ZXJlZCB0byBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3AgaW4gdGhlIAoJCQkJIyBwYXJlbnQgZnVuY3Rpb24uCgkJCQkjCgkJCQlyZXR1cm4gYXJyYXkoJG9yaWdpbmFsX3RleHR7MH0sIHN1YnN0cigkb3JpZ2luYWxfdGV4dCwgMSkpOwoJCQl9CgkJCQoJCQkkYmxvY2tfdGV4dCAuPSAkcGFydHNbMF07ICMgVGV4dCBiZWZvcmUgY3VycmVudCB0YWcuCgkJCSR0YWcgICAgICAgICA9ICRwYXJ0c1sxXTsgIyBUYWcgdG8gaGFuZGxlLgoJCQkkdGV4dCAgICAgICAgPSAkcGFydHNbMl07ICMgUmVtYWluaW5nIHRleHQgYWZ0ZXIgY3VycmVudCB0YWcuCgkJCQoJCQkjCgkJCSMgQ2hlY2sgZm9yOiBBdXRvLWNsb3NlIHRhZyAobGlrZSA8aHIvPikKCQkJIwkJCSBDb21tZW50cyBhbmQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbnMuCgkJCSMKCQkJaWYgKHByZWdfbWF0Y2goJ3tePC8/KD86Jy4kdGhpcy0+YXV0b19jbG9zZV90YWdzX3JlLicpXGJ9JywgJHRhZykgfHwKCQkJCSR0YWd7MX0gPT0gJyEnIHx8ICR0YWd7MX0gPT0gJz8nKQoJCQl7CgkJCQkjIEp1c3QgYWRkIHRoZSB0YWcgdG8gdGhlIGJsb2NrIGFzIGlmIGl0IHdhcyB0ZXh0LgoJCQkJJGJsb2NrX3RleHQgLj0gJHRhZzsKCQkJfQoJCQllbHNlIHsKCQkJCSMKCQkJCSMgSW5jcmVhc2UvZGVjcmVhc2UgbmVzdGVkIHRhZyBjb3VudC4gT25seSBkbyBzbyBpZgoJCQkJIyB0aGUgdGFnJ3MgbmFtZSBtYXRjaCBiYXNlIHRhZydzLgoJCQkJIwoJCQkJaWYgKHByZWdfbWF0Y2goJ3tePC8/Jy4kYmFzZV90YWdfbmFtZV9yZS4nXGJ9JywgJHRhZykpIHsKCQkJCQlpZiAoJHRhZ3sxfSA9PSAnLycpCQkJCQkJJGRlcHRoLS07CgkJCQkJZWxzZSBpZiAoJHRhZ3tzdHJsZW4oJHRhZyktMn0gIT0gJy8nKQkkZGVwdGgrKzsKCQkJCX0KCQkJCQoJCQkJIwoJCQkJIyBDaGVjayBmb3IgYG1hcmtkb3duPSIxImAgYXR0cmlidXRlIGFuZCBoYW5kbGUgaXQuCgkJCQkjCgkJCQlpZiAoJG1kX2F0dHIgJiYgCgkJCQkJcHJlZ19tYXRjaCgkbWFya2Rvd25fYXR0cl9yZSwgJHRhZywgJGF0dHJfbSkgJiYKCQkJCQlwcmVnX21hdGNoKCcvXjF8YmxvY2t8c3BhbiQvJywgJGF0dHJfbVsyXSAuICRhdHRyX21bM10pKQoJCQkJewoJCQkJCSMgUmVtb3ZlIGBtYXJrZG93bmAgYXR0cmlidXRlIGZyb20gb3BlbmluZyB0YWcuCgkJCQkJJHRhZyA9IHByZWdfcmVwbGFjZSgkbWFya2Rvd25fYXR0cl9yZSwgJycsICR0YWcpOwoJCQkJCQoJCQkJCSMgQ2hlY2sgaWYgdGV4dCBpbnNpZGUgdGhpcyB0YWcgbXVzdCBiZSBwYXJzZWQgaW4gc3BhbiBtb2RlLgoJCQkJCSR0aGlzLT5tb2RlID0gJGF0dHJfbVsyXSAuICRhdHRyX21bM107CgkJCQkJJHNwYW5fbW9kZSA9ICR0aGlzLT5tb2RlID09ICdzcGFuJyB8fCAkdGhpcy0+bW9kZSAhPSAnYmxvY2snICYmCgkJCQkJCXByZWdfbWF0Y2goJ3tePCg/OicuJHRoaXMtPmNvbnRhaW5fc3Bhbl90YWdzX3JlLicpXGJ9JywgJHRhZyk7CgkJCQkJCgkJCQkJIyBDYWxjdWxhdGUgaW5kZW50IGJlZm9yZSB0YWcuCgkJCQkJaWYgKHByZWdfbWF0Y2goJy8oPzpefFxuKSggKj8pKD8hICkuKj8kLycsICRibG9ja190ZXh0LCAkbWF0Y2hlcykpIHsKCQkJCQkJJHN0cmxlbiA9ICR0aGlzLT51dGY4X3N0cmxlbjsKCQkJCQkJJGluZGVudCA9ICRzdHJsZW4oJG1hdGNoZXNbMV0sICdVVEYtOCcpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRpbmRlbnQgPSAwOwoJCQkJCX0KCQkJCQkKCQkJCQkjIEVuZCBwcmVjZWRpbmcgYmxvY2sgd2l0aCB0aGlzIHRhZy4KCQkJCQkkYmxvY2tfdGV4dCAuPSAkdGFnOwoJCQkJCSRwYXJzZWQgLj0gJHRoaXMtPiRoYXNoX21ldGhvZCgkYmxvY2tfdGV4dCk7CgkJCQkJCgkJCQkJIyBHZXQgZW5jbG9zaW5nIHRhZyBuYW1lIGZvciB0aGUgUGFyc2VNYXJrZG93biBmdW5jdGlvbi4KCQkJCQkjIChUaGlzIHBhdHRlcm4gbWFrZXMgJHRhZ19uYW1lX3JlIHNhZmUgd2l0aG91dCBxdW90aW5nLikKCQkJCQlwcmVnX21hdGNoKCcvXjwoW1x3OiRdKilcYi8nLCAkdGFnLCAkbWF0Y2hlcyk7CgkJCQkJJHRhZ19uYW1lX3JlID0gJG1hdGNoZXNbMV07CgkJCQkJCgkJCQkJIyBQYXJzZSB0aGUgY29udGVudCB1c2luZyB0aGUgSFRNTC1pbi1NYXJrZG93biBwYXJzZXIuCgkJCQkJbGlzdCAoJGJsb2NrX3RleHQsICR0ZXh0KQoJCQkJCQk9ICR0aGlzLT5faGFzaEhUTUxCbG9ja3NfaW5NYXJrZG93bigkdGV4dCwgJGluZGVudCwgCgkJCQkJCQkkdGFnX25hbWVfcmUsICRzcGFuX21vZGUpOwoJCQkJCQoJCQkJCSMgT3V0ZGVudCBtYXJrZG93biB0ZXh0LgoJCQkJCWlmICgkaW5kZW50ID4gMCkgewoJCQkJCQkkYmxvY2tfdGV4dCA9IHByZWdfcmVwbGFjZSgiL15bIF17MSwkaW5kZW50fS9tIiwgIiIsIAoJCQkJCQkJCQkJCQkJJGJsb2NrX3RleHQpOwoJCQkJCX0KCQkJCQkKCQkJCQkjIEFwcGVuZCB0YWcgY29udGVudCB0byBwYXJzZWQgdGV4dC4KCQkJCQlpZiAoISRzcGFuX21vZGUpCSRwYXJzZWQgLj0gIlxuXG4kYmxvY2tfdGV4dFxuXG4iOwoJCQkJCWVsc2UJCQkJJHBhcnNlZCAuPSAiJGJsb2NrX3RleHQiOwoJCQkJCQoJCQkJCSMgU3RhcnQgb3ZlciB3aXRoIGEgbmV3IGJsb2NrLgoJCQkJCSRibG9ja190ZXh0ID0gIiI7CgkJCQl9CgkJCQllbHNlICRibG9ja190ZXh0IC49ICR0YWc7CgkJCX0KCQkJCgkJfSB3aGlsZSAoJGRlcHRoID4gMCk7CgkJCgkJIwoJCSMgSGFzaCBsYXN0IGJsb2NrIHRleHQgdGhhdCB3YXNuJ3QgcHJvY2Vzc2VkIGluc2lkZSB0aGUgbG9vcC4KCQkjCgkJJHBhcnNlZCAuPSAkdGhpcy0+JGhhc2hfbWV0aG9kKCRibG9ja190ZXh0KTsKCQkKCQlyZXR1cm4gYXJyYXkoJHBhcnNlZCwgJHRleHQpOwoJfQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzaENsZWFuKCR0ZXh0KSB7CgkjCgkjIENhbGxlZCB3aGVuZXZlciBhIHRhZyBtdXN0IGJlIGhhc2hlZCB3aGVuIGEgZnVuY3Rpb24gaW5zZXJ0cyBhICJjbGVhbiIgdGFnCgkjIGluICR0ZXh0LCBpdCBwYXNzZXMgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIGFuZCBpcyBhdXRvbWF0aWNhbHkgZXNjYXBlZCwgCgkjIGJsb2NraW5nIGludmFsaWQgbmVzdGVkIG92ZXJsYXAuCgkjCgkJcmV0dXJuICR0aGlzLT5oYXNoUGFydCgkdGV4dCwgJ0MnKTsKCX0KCgoJcHJvdGVjdGVkIGZ1bmN0aW9uIGRvQW5jaG9ycygkdGV4dCkgewoJIwoJIyBUdXJuIE1hcmtkb3duIGxpbmsgc2hvcnRjdXRzIGludG8gWEhUTUwgPGE+IHRhZ3MuCgkjCgkJaWYgKCR0aGlzLT5pbl9hbmNob3IpIHJldHVybiAkdGV4dDsKCQkkdGhpcy0+aW5fYW5jaG9yID0gdHJ1ZTsKCQkKCQkjCgkJIyBGaXJzdCwgaGFuZGxlIHJlZmVyZW5jZS1zdHlsZSBsaW5rczogW2xpbmsgdGV4dF0gW2lkXQoJCSMKCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnewoJCQkoCQkJCQkjIHdyYXAgd2hvbGUgbWF0Y2ggaW4gJDEKCQkJICBcWwoJCQkJKCcuJHRoaXMtPm5lc3RlZF9icmFja2V0c19yZS4nKQkjIGxpbmsgdGV4dCA9ICQyCgkJCSAgXF0KCgkJCSAgWyBdPwkJCQkjIG9uZSBvcHRpb25hbCBzcGFjZQoJCQkgICg/OlxuWyBdKik/CQkjIG9uZSBvcHRpb25hbCBuZXdsaW5lIGZvbGxvd2VkIGJ5IHNwYWNlcwoKCQkJICBcWwoJCQkJKC4qPykJCSMgaWQgPSAkMwoJCQkgIFxdCgkJCSkKCQkJfXhzJywKCQkJYXJyYXkoJHRoaXMsICdfZG9BbmNob3JzX3JlZmVyZW5jZV9jYWxsYmFjaycpLCAkdGV4dCk7CgoJCSMKCQkjIE5leHQsIGlubGluZS1zdHlsZSBsaW5rczogW2xpbmsgdGV4dF0odXJsICJvcHRpb25hbCB0aXRsZSIpCgkJIwoJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CgkJCSgJCQkJIyB3cmFwIHdob2xlIG1hdGNoIGluICQxCgkJCSAgXFsKCQkJCSgnLiR0aGlzLT5uZXN0ZWRfYnJhY2tldHNfcmUuJykJIyBsaW5rIHRleHQgPSAkMgoJCQkgIFxdCgkJCSAgXCgJCQkjIGxpdGVyYWwgcGFyZW4KCQkJCVsgXG5dKgoJCQkJKD86CgkJCQkJPCguKz8pPgkjIGhyZWYgPSAkMwoJCQkJfAoJCQkJCSgnLiR0aGlzLT5uZXN0ZWRfdXJsX3BhcmVudGhlc2lzX3JlLicpCSMgaHJlZiA9ICQ0CgkJCQkpCgkJCQlbIFxuXSoKCQkJCSgJCQkjICQ1CgkJCQkgIChbXCciXSkJIyBxdW90ZSBjaGFyID0gJDYKCQkJCSAgKC4qPykJCSMgVGl0bGUgPSAkNwoJCQkJICBcNgkJIyBtYXRjaGluZyBxdW90ZQoJCQkJICBbIFxuXSoJIyBpZ25vcmUgYW55IHNwYWNlcy90YWJzIGJldHdlZW4gY2xvc2luZyBxdW90ZSBhbmQgKQoJCQkJKT8JCQkjIHRpdGxlIGlzIG9wdGlvbmFsCgkJCSAgXCkKCQkJICAoPzpbIF0/ICcuJHRoaXMtPmlkX2NsYXNzX2F0dHJfY2F0Y2hfcmUuJyApPwkgIyAkOCA9IGlkL2NsYXNzIGF0dHJpYnV0ZXMKCQkJKQoJCQl9eHMnLAoJCQlhcnJheSgkdGhpcywgJ19kb0FuY2hvcnNfaW5saW5lX2NhbGxiYWNrJyksICR0ZXh0KTsKCgkJIwoJCSMgTGFzdCwgaGFuZGxlIHJlZmVyZW5jZS1zdHlsZSBzaG9ydGN1dHM6IFtsaW5rIHRleHRdCgkJIyBUaGVzZSBtdXN0IGNvbWUgbGFzdCBpbiBjYXNlIHlvdSd2ZSBhbHNvIGdvdCBbbGluayB0ZXh0XVsxXQoJCSMgb3IgW2xpbmsgdGV4dF0oL2ZvbykKCQkjCgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKCQkJKAkJCQkJIyB3cmFwIHdob2xlIG1hdGNoIGluICQxCgkJCSAgXFsKCQkJCShbXlxbXF1dKykJCSMgbGluayB0ZXh0ID0gJDI7IGNhblwndCBjb250YWluIFsgb3IgXQoJCQkgIFxdCgkJCSkKCQkJfXhzJywKCQkJYXJyYXkoJHRoaXMsICdfZG9BbmNob3JzX3JlZmVyZW5jZV9jYWxsYmFjaycpLCAkdGV4dCk7CgoJCSR0aGlzLT5pbl9hbmNob3IgPSBmYWxzZTsKCQlyZXR1cm4gJHRleHQ7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX2RvQW5jaG9yc19yZWZlcmVuY2VfY2FsbGJhY2soJG1hdGNoZXMpIHsKCQkkd2hvbGVfbWF0Y2ggPSAgJG1hdGNoZXNbMV07CgkJJGxpbmtfdGV4dCAgID0gICRtYXRjaGVzWzJdOwoJCSRsaW5rX2lkICAgICA9JiAkbWF0Y2hlc1szXTsKCgkJaWYgKCRsaW5rX2lkID09ICIiKSB7CgkJCSMgZm9yIHNob3J0Y3V0IGxpbmtzIGxpa2UgW3RoaXNdW10gb3IgW3RoaXNdLgoJCQkkbGlua19pZCA9ICRsaW5rX3RleHQ7CgkJfQoJCQoJCSMgbG93ZXItY2FzZSBhbmQgdHVybiBlbWJlZGRlZCBuZXdsaW5lcyBpbnRvIHNwYWNlcwoJCSRsaW5rX2lkID0gc3RydG9sb3dlcigkbGlua19pZCk7CgkJJGxpbmtfaWQgPSBwcmVnX3JlcGxhY2UoJ3tbIF0/XG59JywgJyAnLCAkbGlua19pZCk7CgoJCWlmIChpc3NldCgkdGhpcy0+dXJsc1skbGlua19pZF0pKSB7CgkJCSR1cmwgPSAkdGhpcy0+dXJsc1skbGlua19pZF07CgkJCSR1cmwgPSAkdGhpcy0+ZW5jb2RlVVJMQXR0cmlidXRlKCR1cmwpOwoJCQkKCQkJJHJlc3VsdCA9ICI8YSBocmVmPVwiJHVybFwiIjsKCQkJaWYgKCBpc3NldCggJHRoaXMtPnRpdGxlc1skbGlua19pZF0gKSApIHsKCQkJCSR0aXRsZSA9ICR0aGlzLT50aXRsZXNbJGxpbmtfaWRdOwoJCQkJJHRpdGxlID0gJHRoaXMtPmVuY29kZUF0dHJpYnV0ZSgkdGl0bGUpOwoJCQkJJHJlc3VsdCAuPSAgIiB0aXRsZT1cIiR0aXRsZVwiIjsKCQkJfQoJCQlpZiAoaXNzZXQoJHRoaXMtPnJlZl9hdHRyWyRsaW5rX2lkXSkpCgkJCQkkcmVzdWx0IC49ICR0aGlzLT5yZWZfYXR0clskbGlua19pZF07CgkJCgkJCSRsaW5rX3RleHQgPSAkdGhpcy0+cnVuU3BhbkdhbXV0KCRsaW5rX3RleHQpOwoJCQkkcmVzdWx0IC49ICI+JGxpbmtfdGV4dDwvYT4iOwoJCQkkcmVzdWx0ID0gJHRoaXMtPmhhc2hQYXJ0KCRyZXN1bHQpOwoJCX0KCQllbHNlIHsKCQkJJHJlc3VsdCA9ICR3aG9sZV9tYXRjaDsKCQl9CgkJcmV0dXJuICRyZXN1bHQ7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX2RvQW5jaG9yc19pbmxpbmVfY2FsbGJhY2soJG1hdGNoZXMpIHsKCQkkd2hvbGVfbWF0Y2gJPSAgJG1hdGNoZXNbMV07CgkJJGxpbmtfdGV4dAkJPSAgJHRoaXMtPnJ1blNwYW5HYW11dCgkbWF0Y2hlc1syXSk7CgkJJHVybAkJCT0gICRtYXRjaGVzWzNdID09ICcnID8gJG1hdGNoZXNbNF0gOiAkbWF0Y2hlc1szXTsKCQkkdGl0bGUJCQk9JiAkbWF0Y2hlc1s3XTsKCQkkYXR0ciAgPSAkdGhpcy0+ZG9FeHRyYUF0dHJpYnV0ZXMoImEiLCAkZHVtbXkgPSYgJG1hdGNoZXNbOF0pOwoKCQkvLyBpZiB0aGUgVVJMIHdhcyBvZiB0aGUgZm9ybSA8cyBwIGEgYyBlIHM+IGl0IGdvdCBjYXVnaHQgYnkgdGhlIEhUTUwKCQkvLyB0YWcgcGFyc2VyIGFuZCBoYXNoZWQuIE5lZWQgdG8gcmV2ZXJzZSB0aGUgcHJvY2VzcyBiZWZvcmUgdXNpbmcgdGhlIFVSTC4KCQkkdW5oYXNoZWQgPSAkdGhpcy0+dW5oYXNoKCR1cmwpOwoJCWlmICgkdW5oYXNoZWQgIT0gJHVybCkKCQkJJHVybCA9IHByZWdfcmVwbGFjZSgnL148KC4qKT4kLycsICdcMScsICR1bmhhc2hlZCk7CgoJCSR1cmwgPSAkdGhpcy0+ZW5jb2RlVVJMQXR0cmlidXRlKCR1cmwpOwoKCQkkcmVzdWx0ID0gIjxhIGhyZWY9XCIkdXJsXCIiOwoJCWlmIChpc3NldCgkdGl0bGUpKSB7CgkJCSR0aXRsZSA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJHRpdGxlKTsKCQkJJHJlc3VsdCAuPSAgIiB0aXRsZT1cIiR0aXRsZVwiIjsKCQl9CgkJJHJlc3VsdCAuPSAkYXR0cjsKCQkKCQkkbGlua190ZXh0ID0gJHRoaXMtPnJ1blNwYW5HYW11dCgkbGlua190ZXh0KTsKCQkkcmVzdWx0IC49ICI+JGxpbmtfdGV4dDwvYT4iOwoKCQlyZXR1cm4gJHRoaXMtPmhhc2hQYXJ0KCRyZXN1bHQpOwoJfQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gZG9JbWFnZXMoJHRleHQpIHsKCSMKCSMgVHVybiBNYXJrZG93biBpbWFnZSBzaG9ydGN1dHMgaW50byA8aW1nPiB0YWdzLgoJIwoJCSMKCQkjIEZpcnN0LCBoYW5kbGUgcmVmZXJlbmNlLXN0eWxlIGxhYmVsZWQgaW1hZ2VzOiAhW2FsdCB0ZXh0XVtpZF0KCQkjCgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKCQkJKAkJCQkjIHdyYXAgd2hvbGUgbWF0Y2ggaW4gJDEKCQkJICAhXFsKCQkJCSgnLiR0aGlzLT5uZXN0ZWRfYnJhY2tldHNfcmUuJykJCSMgYWx0IHRleHQgPSAkMgoJCQkgIFxdCgoJCQkgIFsgXT8JCQkJIyBvbmUgb3B0aW9uYWwgc3BhY2UKCQkJICAoPzpcblsgXSopPwkJIyBvbmUgb3B0aW9uYWwgbmV3bGluZSBmb2xsb3dlZCBieSBzcGFjZXMKCgkJCSAgXFsKCQkJCSguKj8pCQkjIGlkID0gJDMKCQkJICBcXQoKCQkJKQoJCQl9eHMnLCAKCQkJYXJyYXkoJHRoaXMsICdfZG9JbWFnZXNfcmVmZXJlbmNlX2NhbGxiYWNrJyksICR0ZXh0KTsKCgkJIwoJCSMgTmV4dCwgaGFuZGxlIGlubGluZSBpbWFnZXM6ICAhW2FsdCB0ZXh0XSh1cmwgIm9wdGlvbmFsIHRpdGxlIikKCQkjIERvbid0IGZvcmdldDogZW5jb2RlICogYW5kIF8KCQkjCgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKCQkJKAkJCQkjIHdyYXAgd2hvbGUgbWF0Y2ggaW4gJDEKCQkJICAhXFsKCQkJCSgnLiR0aGlzLT5uZXN0ZWRfYnJhY2tldHNfcmUuJykJCSMgYWx0IHRleHQgPSAkMgoJCQkgIFxdCgkJCSAgXHM/CQkJIyBPbmUgb3B0aW9uYWwgd2hpdGVzcGFjZSBjaGFyYWN0ZXIKCQkJICBcKAkJCSMgbGl0ZXJhbCBwYXJlbgoJCQkJWyBcbl0qCgkJCQkoPzoKCQkJCQk8KFxTKik+CSMgc3JjIHVybCA9ICQzCgkJCQl8CgkJCQkJKCcuJHRoaXMtPm5lc3RlZF91cmxfcGFyZW50aGVzaXNfcmUuJykJIyBzcmMgdXJsID0gJDQKCQkJCSkKCQkJCVsgXG5dKgoJCQkJKAkJCSMgJDUKCQkJCSAgKFtcJyJdKQkjIHF1b3RlIGNoYXIgPSAkNgoJCQkJICAoLio/KQkJIyB0aXRsZSA9ICQ3CgkJCQkgIFw2CQkjIG1hdGNoaW5nIHF1b3RlCgkJCQkgIFsgXG5dKgoJCQkJKT8JCQkjIHRpdGxlIGlzIG9wdGlvbmFsCgkJCSAgXCkKCQkJICAoPzpbIF0/ICcuJHRoaXMtPmlkX2NsYXNzX2F0dHJfY2F0Y2hfcmUuJyApPwkgIyAkOCA9IGlkL2NsYXNzIGF0dHJpYnV0ZXMKCQkJKQoJCQl9eHMnLAoJCQlhcnJheSgkdGhpcywgJ19kb0ltYWdlc19pbmxpbmVfY2FsbGJhY2snKSwgJHRleHQpOwoKCQlyZXR1cm4gJHRleHQ7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX2RvSW1hZ2VzX3JlZmVyZW5jZV9jYWxsYmFjaygkbWF0Y2hlcykgewoJCSR3aG9sZV9tYXRjaCA9ICRtYXRjaGVzWzFdOwoJCSRhbHRfdGV4dCAgICA9ICRtYXRjaGVzWzJdOwoJCSRsaW5rX2lkICAgICA9IHN0cnRvbG93ZXIoJG1hdGNoZXNbM10pOwoKCQlpZiAoJGxpbmtfaWQgPT0gIiIpIHsKCQkJJGxpbmtfaWQgPSBzdHJ0b2xvd2VyKCRhbHRfdGV4dCk7ICMgZm9yIHNob3J0Y3V0IGxpbmtzIGxpa2UgIVt0aGlzXVtdLgoJCX0KCgkJJGFsdF90ZXh0ID0gJHRoaXMtPmVuY29kZUF0dHJpYnV0ZSgkYWx0X3RleHQpOwoJCWlmIChpc3NldCgkdGhpcy0+dXJsc1skbGlua19pZF0pKSB7CgkJCSR1cmwgPSAkdGhpcy0+ZW5jb2RlVVJMQXR0cmlidXRlKCR0aGlzLT51cmxzWyRsaW5rX2lkXSk7CgkJCSRyZXN1bHQgPSAiPGltZyBzcmM9XCIkdXJsXCIgYWx0PVwiJGFsdF90ZXh0XCIiOwoJCQlpZiAoaXNzZXQoJHRoaXMtPnRpdGxlc1skbGlua19pZF0pKSB7CgkJCQkkdGl0bGUgPSAkdGhpcy0+dGl0bGVzWyRsaW5rX2lkXTsKCQkJCSR0aXRsZSA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJHRpdGxlKTsKCQkJCSRyZXN1bHQgLj0gICIgdGl0bGU9XCIkdGl0bGVcIiI7CgkJCX0KCQkJaWYgKGlzc2V0KCR0aGlzLT5yZWZfYXR0clskbGlua19pZF0pKQoJCQkJJHJlc3VsdCAuPSAkdGhpcy0+cmVmX2F0dHJbJGxpbmtfaWRdOwoJCQkkcmVzdWx0IC49ICR0aGlzLT5lbXB0eV9lbGVtZW50X3N1ZmZpeDsKCQkJJHJlc3VsdCA9ICR0aGlzLT5oYXNoUGFydCgkcmVzdWx0KTsKCQl9CgkJZWxzZSB7CgkJCSMgSWYgdGhlcmUncyBubyBzdWNoIGxpbmsgSUQsIGxlYXZlIGludGFjdDoKCQkJJHJlc3VsdCA9ICR3aG9sZV9tYXRjaDsKCQl9CgoJCXJldHVybiAkcmVzdWx0OwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9kb0ltYWdlc19pbmxpbmVfY2FsbGJhY2soJG1hdGNoZXMpIHsKCQkkd2hvbGVfbWF0Y2gJPSAkbWF0Y2hlc1sxXTsKCQkkYWx0X3RleHQJCT0gJG1hdGNoZXNbMl07CgkJJHVybAkJCT0gJG1hdGNoZXNbM10gPT0gJycgPyAkbWF0Y2hlc1s0XSA6ICRtYXRjaGVzWzNdOwoJCSR0aXRsZQkJCT0mICRtYXRjaGVzWzddOwoJCSRhdHRyICA9ICR0aGlzLT5kb0V4dHJhQXR0cmlidXRlcygiaW1nIiwgJGR1bW15ID0mICRtYXRjaGVzWzhdKTsKCgkJJGFsdF90ZXh0ID0gJHRoaXMtPmVuY29kZUF0dHJpYnV0ZSgkYWx0X3RleHQpOwoJCSR1cmwgPSAkdGhpcy0+ZW5jb2RlVVJMQXR0cmlidXRlKCR1cmwpOwoJCSRyZXN1bHQgPSAiPGltZyBzcmM9XCIkdXJsXCIgYWx0PVwiJGFsdF90ZXh0XCIiOwoJCWlmIChpc3NldCgkdGl0bGUpKSB7CgkJCSR0aXRsZSA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJHRpdGxlKTsKCQkJJHJlc3VsdCAuPSAgIiB0aXRsZT1cIiR0aXRsZVwiIjsgIyAkdGl0bGUgYWxyZWFkeSBxdW90ZWQKCQl9CgkJJHJlc3VsdCAuPSAkYXR0cjsKCQkkcmVzdWx0IC49ICR0aGlzLT5lbXB0eV9lbGVtZW50X3N1ZmZpeDsKCgkJcmV0dXJuICR0aGlzLT5oYXNoUGFydCgkcmVzdWx0KTsKCX0KCgoJcHJvdGVjdGVkIGZ1bmN0aW9uIGRvSGVhZGVycygkdGV4dCkgewoJIwoJIyBSZWRlZmluZWQgdG8gYWRkIGlkIGFuZCBjbGFzcyBhdHRyaWJ1dGUgc3VwcG9ydC4KCSMKCQkjIFNldGV4dC1zdHlsZSBoZWFkZXJzOgoJCSMJICBIZWFkZXIgMSAgeyNoZWFkZXIxfQoJCSMJICA9PT09PT09PQoJCSMgIAoJCSMJICBIZWFkZXIgMiAgeyNoZWFkZXIyIC5jbGFzczEgLmNsYXNzMn0KCQkjCSAgLS0tLS0tLS0KCQkjCgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soCgkJCSd7CgkJCQkoXi4rPykJCQkJCQkJCSMgJDE6IEhlYWRlciB0ZXh0CgkJCQkoPzpbIF0rICcuJHRoaXMtPmlkX2NsYXNzX2F0dHJfY2F0Y2hfcmUuJyApPwkgIyAkMyA9IGlkL2NsYXNzIGF0dHJpYnV0ZXMKCQkJCVsgXSpcbig9K3wtKylbIF0qXG4rCQkJCSMgJDM6IEhlYWRlciBmb290ZXIKCQkJfW14JywKCQkJYXJyYXkoJHRoaXMsICdfZG9IZWFkZXJzX2NhbGxiYWNrX3NldGV4dCcpLCAkdGV4dCk7CgoJCSMgYXR4LXN0eWxlIGhlYWRlcnM6CgkJIwkjIEhlYWRlciAxICAgICAgICB7I2hlYWRlcjF9CgkJIwkjIyBIZWFkZXIgMiAgICAgICB7I2hlYWRlcjJ9CgkJIwkjIyBIZWFkZXIgMiB3aXRoIGNsb3NpbmcgaGFzaGVzICMjICB7I2hlYWRlcjMuY2xhc3MxLmNsYXNzMn0KCQkjCS4uLgoJCSMJIyMjIyMjIEhlYWRlciA2ICAgey5jbGFzczJ9CgkJIwoJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CgkJCQleKFwjezEsNn0pCSMgJDEgPSBzdHJpbmcgb2YgI1wncwoJCQkJWyBdKgoJCQkJKC4rPykJCSMgJDIgPSBIZWFkZXIgdGV4dAoJCQkJWyBdKgoJCQkJXCMqCQkJIyBvcHRpb25hbCBjbG9zaW5nICNcJ3MgKG5vdCBjb3VudGVkKQoJCQkJKD86WyBdKyAnLiR0aGlzLT5pZF9jbGFzc19hdHRyX2NhdGNoX3JlLicgKT8JICMgJDMgPSBpZC9jbGFzcyBhdHRyaWJ1dGVzCgkJCQlbIF0qCgkJCQlcbisKCQkJfXhtJywKCQkJYXJyYXkoJHRoaXMsICdfZG9IZWFkZXJzX2NhbGxiYWNrX2F0eCcpLCAkdGV4dCk7CgoJCXJldHVybiAkdGV4dDsKCX0KCXByb3RlY3RlZCBmdW5jdGlvbiBfZG9IZWFkZXJzX2NhbGxiYWNrX3NldGV4dCgkbWF0Y2hlcykgewoJCWlmICgkbWF0Y2hlc1szXSA9PSAnLScgJiYgcHJlZ19tYXRjaCgne14tIH0nLCAkbWF0Y2hlc1sxXSkpCgkJCXJldHVybiAkbWF0Y2hlc1swXTsKCgkJJGxldmVsID0gJG1hdGNoZXNbM117MH0gPT0gJz0nID8gMSA6IDI7CgoJCSRkZWZhdWx0SWQgPSBpc19jYWxsYWJsZSgkdGhpcy0+aGVhZGVyX2lkX2Z1bmMpID8gY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmhlYWRlcl9pZF9mdW5jLCAkbWF0Y2hlc1sxXSkgOiBudWxsOwoKCQkkYXR0ciAgPSAkdGhpcy0+ZG9FeHRyYUF0dHJpYnV0ZXMoImgkbGV2ZWwiLCAkZHVtbXkgPSYgJG1hdGNoZXNbMl0sICRkZWZhdWx0SWQpOwoJCSRibG9jayA9ICI8aCRsZXZlbCRhdHRyPiIuJHRoaXMtPnJ1blNwYW5HYW11dCgkbWF0Y2hlc1sxXSkuIjwvaCRsZXZlbD4iOwoJCXJldHVybiAiXG4iIC4gJHRoaXMtPmhhc2hCbG9jaygkYmxvY2spIC4gIlxuXG4iOwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9kb0hlYWRlcnNfY2FsbGJhY2tfYXR4KCRtYXRjaGVzKSB7CgkJJGxldmVsID0gc3RybGVuKCRtYXRjaGVzWzFdKTsKCgkJJGRlZmF1bHRJZCA9IGlzX2NhbGxhYmxlKCR0aGlzLT5oZWFkZXJfaWRfZnVuYykgPyBjYWxsX3VzZXJfZnVuYygkdGhpcy0+aGVhZGVyX2lkX2Z1bmMsICRtYXRjaGVzWzJdKSA6IG51bGw7CgkJJGF0dHIgID0gJHRoaXMtPmRvRXh0cmFBdHRyaWJ1dGVzKCJoJGxldmVsIiwgJGR1bW15ID0mICRtYXRjaGVzWzNdLCAkZGVmYXVsdElkKTsKCQkkYmxvY2sgPSAiPGgkbGV2ZWwkYXR0cj4iLiR0aGlzLT5ydW5TcGFuR2FtdXQoJG1hdGNoZXNbMl0pLiI8L2gkbGV2ZWw+IjsKCQlyZXR1cm4gIlxuIiAuICR0aGlzLT5oYXNoQmxvY2soJGJsb2NrKSAuICJcblxuIjsKCX0KCgoJcHJvdGVjdGVkIGZ1bmN0aW9uIGRvVGFibGVzKCR0ZXh0KSB7CgkjCgkjIEZvcm0gSFRNTCB0YWJsZXMuCgkjCgkJJGxlc3NfdGhhbl90YWIgPSAkdGhpcy0+dGFiX3dpZHRoIC0gMTsKCQkjCgkJIyBGaW5kIHRhYmxlcyB3aXRoIGxlYWRpbmcgcGlwZS4KCQkjCgkJIwl8IEhlYWRlciAxIHwgSGVhZGVyIDIKCQkjCXwgLS0tLS0tLS0gfCAtLS0tLS0tLQoJCSMJfCBDZWxsIDEgICB8IENlbGwgMgoJCSMJfCBDZWxsIDMgICB8IENlbGwgNAoJCSMKCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnCgkJCXsKCQkJCV4JCQkJCQkJIyBTdGFydCBvZiBhIGxpbmUKCQkJCVsgXXswLCcuJGxlc3NfdGhhbl90YWIuJ30JIyBBbGxvd2VkIHdoaXRlc3BhY2UuCgkJCQlbfF0JCQkJCQkJIyBPcHRpb25hbCBsZWFkaW5nIHBpcGUgKHByZXNlbnQpCgkJCQkoLispIFxuCQkJCQkJIyAkMTogSGVhZGVyIHJvdyAoYXQgbGVhc3Qgb25lIHBpcGUpCgkJCQkKCQkJCVsgXXswLCcuJGxlc3NfdGhhbl90YWIuJ30JIyBBbGxvd2VkIHdoaXRlc3BhY2UuCgkJCQlbfF0gKFsgXSpbLTpdK1stfCA6XSopIFxuCSMgJDI6IEhlYWRlciB1bmRlcmxpbmUKCQkJCQoJCQkJKAkJCQkJCQkjICQzOiBDZWxscwoJCQkJCSg/PgoJCQkJCQlbIF0qCQkJCSMgQWxsb3dlZCB3aGl0ZXNwYWNlLgoJCQkJCQlbfF0gLiogXG4JCQkjIFJvdyBjb250ZW50LgoJCQkJCSkqCgkJCQkpCgkJCQkoPz1cbnxcWikJCQkJCSMgU3RvcCBhdCBmaW5hbCBkb3VibGUgbmV3bGluZS4KCQkJfXhtJywKCQkJYXJyYXkoJHRoaXMsICdfZG9UYWJsZV9sZWFkaW5nUGlwZV9jYWxsYmFjaycpLCAkdGV4dCk7CgkJCgkJIwoJCSMgRmluZCB0YWJsZXMgd2l0aG91dCBsZWFkaW5nIHBpcGUuCgkJIwoJCSMJSGVhZGVyIDEgfCBIZWFkZXIgMgoJCSMJLS0tLS0tLS0gfCAtLS0tLS0tLQoJCSMJQ2VsbCAxICAgfCBDZWxsIDIKCQkjCUNlbGwgMyAgIHwgQ2VsbCA0CgkJIwoJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcKCQkJewoJCQkJXgkJCQkJCQkjIFN0YXJ0IG9mIGEgbGluZQoJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfQkjIEFsbG93ZWQgd2hpdGVzcGFjZS4KCQkJCShcUy4qW3xdLiopIFxuCQkJCSMgJDE6IEhlYWRlciByb3cgKGF0IGxlYXN0IG9uZSBwaXBlKQoJCQkJCgkJCQlbIF17MCwnLiRsZXNzX3RoYW5fdGFiLid9CSMgQWxsb3dlZCB3aGl0ZXNwYWNlLgoJCQkJKFstOl0rWyBdKlt8XVstfCA6XSopIFxuCSMgJDI6IEhlYWRlciB1bmRlcmxpbmUKCQkJCQoJCQkJKAkJCQkJCQkjICQzOiBDZWxscwoJCQkJCSg/PgoJCQkJCQkuKiBbfF0gLiogXG4JCSMgUm93IGNvbnRlbnQKCQkJCQkpKgoJCQkJKQoJCQkJKD89XG58XFopCQkJCQkjIFN0b3AgYXQgZmluYWwgZG91YmxlIG5ld2xpbmUuCgkJCX14bScsCgkJCWFycmF5KCR0aGlzLCAnX0RvVGFibGVfY2FsbGJhY2snKSwgJHRleHQpOwoKCQlyZXR1cm4gJHRleHQ7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX2RvVGFibGVfbGVhZGluZ1BpcGVfY2FsbGJhY2soJG1hdGNoZXMpIHsKCQkkaGVhZAkJPSAkbWF0Y2hlc1sxXTsKCQkkdW5kZXJsaW5lCT0gJG1hdGNoZXNbMl07CgkJJGNvbnRlbnQJPSAkbWF0Y2hlc1szXTsKCQkKCQkjIFJlbW92ZSBsZWFkaW5nIHBpcGUgZm9yIGVhY2ggcm93LgoJCSRjb250ZW50CT0gcHJlZ19yZXBsYWNlKCcvXiAqW3xdL20nLCAnJywgJGNvbnRlbnQpOwoJCQoJCXJldHVybiAkdGhpcy0+X2RvVGFibGVfY2FsbGJhY2soYXJyYXkoJG1hdGNoZXNbMF0sICRoZWFkLCAkdW5kZXJsaW5lLCAkY29udGVudCkpOwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9kb1RhYmxlX21ha2VBbGlnbkF0dHIoJGFsaWdubmFtZSkKCXsKCQlpZiAoZW1wdHkoJHRoaXMtPnRhYmxlX2FsaWduX2NsYXNzX3RtcGwpKQoJCQlyZXR1cm4gIiBhbGlnbj1cIiRhbGlnbm5hbWVcIiI7CgoJCSRjbGFzc25hbWUgPSBzdHJfcmVwbGFjZSgnJSUnLCAkYWxpZ25uYW1lLCAkdGhpcy0+dGFibGVfYWxpZ25fY2xhc3NfdG1wbCk7CgkJcmV0dXJuICIgY2xhc3M9XCIkY2xhc3NuYW1lXCIiOwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9kb1RhYmxlX2NhbGxiYWNrKCRtYXRjaGVzKSB7CgkJJGhlYWQJCT0gJG1hdGNoZXNbMV07CgkJJHVuZGVybGluZQk9ICRtYXRjaGVzWzJdOwoJCSRjb250ZW50CT0gJG1hdGNoZXNbM107CgoJCSMgUmVtb3ZlIGFueSB0YWlsaW5nIHBpcGVzIGZvciBlYWNoIGxpbmUuCgkJJGhlYWQJCT0gcHJlZ19yZXBsYWNlKCcvW3xdICokL20nLCAnJywgJGhlYWQpOwoJCSR1bmRlcmxpbmUJPSBwcmVnX3JlcGxhY2UoJy9bfF0gKiQvbScsICcnLCAkdW5kZXJsaW5lKTsKCQkkY29udGVudAk9IHByZWdfcmVwbGFjZSgnL1t8XSAqJC9tJywgJycsICRjb250ZW50KTsKCQkKCQkjIFJlYWRpbmcgYWxpZ25lbWVudCBmcm9tIGhlYWRlciB1bmRlcmxpbmUuCgkJJHNlcGFyYXRvcnMJPSBwcmVnX3NwbGl0KCcvICpbfF0gKi8nLCAkdW5kZXJsaW5lKTsKCQlmb3JlYWNoICgkc2VwYXJhdG9ycyBhcyAkbiA9PiAkcykgewoJCQlpZiAocHJlZ19tYXRjaCgnL14gKi0rOiAqJC8nLCAkcykpCgkJCQkkYXR0clskbl0gPSAkdGhpcy0+X2RvVGFibGVfbWFrZUFsaWduQXR0cigncmlnaHQnKTsKCQkJZWxzZSBpZiAocHJlZ19tYXRjaCgnL14gKjotKzogKiQvJywgJHMpKQoJCQkJJGF0dHJbJG5dID0gJHRoaXMtPl9kb1RhYmxlX21ha2VBbGlnbkF0dHIoJ2NlbnRlcicpOwoJCQllbHNlIGlmIChwcmVnX21hdGNoKCcvXiAqOi0rICokLycsICRzKSkKCQkJCSRhdHRyWyRuXSA9ICR0aGlzLT5fZG9UYWJsZV9tYWtlQWxpZ25BdHRyKCdsZWZ0Jyk7CgkJCWVsc2UKCQkJCSRhdHRyWyRuXSA9ICcnOwoJCX0KCQkKCQkjIFBhcnNpbmcgc3BhbiBlbGVtZW50cywgaW5jbHVkaW5nIGNvZGUgc3BhbnMsIGNoYXJhY3RlciBlc2NhcGVzLCAKCQkjIGFuZCBpbmxpbmUgSFRNTCB0YWdzLCBzbyB0aGF0IHBpcGVzIGluc2lkZSB0aG9zZSBnZXRzIGlnbm9yZWQuCgkJJGhlYWQJCT0gJHRoaXMtPnBhcnNlU3BhbigkaGVhZCk7CgkJJGhlYWRlcnMJPSBwcmVnX3NwbGl0KCcvICpbfF0gKi8nLCAkaGVhZCk7CgkJJGNvbF9jb3VudAk9IGNvdW50KCRoZWFkZXJzKTsKCQkkYXR0ciAgICAgICA9IGFycmF5X3BhZCgkYXR0ciwgJGNvbF9jb3VudCwgJycpOwoJCQoJCSMgV3JpdGUgY29sdW1uIGhlYWRlcnMuCgkJJHRleHQgPSAiPHRhYmxlPlxuIjsKCQkkdGV4dCAuPSAiPHRoZWFkPlxuIjsKCQkkdGV4dCAuPSAiPHRyPlxuIjsKCQlmb3JlYWNoICgkaGVhZGVycyBhcyAkbiA9PiAkaGVhZGVyKQoJCQkkdGV4dCAuPSAiICA8dGgkYXR0clskbl0+Ii4kdGhpcy0+cnVuU3BhbkdhbXV0KHRyaW0oJGhlYWRlcikpLiI8L3RoPlxuIjsKCQkkdGV4dCAuPSAiPC90cj5cbiI7CgkJJHRleHQgLj0gIjwvdGhlYWQ+XG4iOwoJCQoJCSMgU3BsaXQgY29udGVudCBieSByb3cuCgkJJHJvd3MgPSBleHBsb2RlKCJcbiIsIHRyaW0oJGNvbnRlbnQsICJcbiIpKTsKCQkKCQkkdGV4dCAuPSAiPHRib2R5PlxuIjsKCQlmb3JlYWNoICgkcm93cyBhcyAkcm93KSB7CgkJCSMgUGFyc2luZyBzcGFuIGVsZW1lbnRzLCBpbmNsdWRpbmcgY29kZSBzcGFucywgY2hhcmFjdGVyIGVzY2FwZXMsIAoJCQkjIGFuZCBpbmxpbmUgSFRNTCB0YWdzLCBzbyB0aGF0IHBpcGVzIGluc2lkZSB0aG9zZSBnZXRzIGlnbm9yZWQuCgkJCSRyb3cgPSAkdGhpcy0+cGFyc2VTcGFuKCRyb3cpOwoJCQkKCQkJIyBTcGxpdCByb3cgYnkgY2VsbC4KCQkJJHJvd19jZWxscyA9IHByZWdfc3BsaXQoJy8gKlt8XSAqLycsICRyb3csICRjb2xfY291bnQpOwoJCQkkcm93X2NlbGxzID0gYXJyYXlfcGFkKCRyb3dfY2VsbHMsICRjb2xfY291bnQsICcnKTsKCQkJCgkJCSR0ZXh0IC49ICI8dHI+XG4iOwoJCQlmb3JlYWNoICgkcm93X2NlbGxzIGFzICRuID0+ICRjZWxsKQoJCQkJJHRleHQgLj0gIiAgPHRkJGF0dHJbJG5dPiIuJHRoaXMtPnJ1blNwYW5HYW11dCh0cmltKCRjZWxsKSkuIjwvdGQ+XG4iOwoJCQkkdGV4dCAuPSAiPC90cj5cbiI7CgkJfQoJCSR0ZXh0IC49ICI8L3Rib2R5PlxuIjsKCQkkdGV4dCAuPSAiPC90YWJsZT4iOwoJCQoJCXJldHVybiAkdGhpcy0+aGFzaEJsb2NrKCR0ZXh0KSAuICJcbiI7Cgl9CgoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gZG9EZWZMaXN0cygkdGV4dCkgewoJIwoJIyBGb3JtIEhUTUwgZGVmaW5pdGlvbiBsaXN0cy4KCSMKCQkkbGVzc190aGFuX3RhYiA9ICR0aGlzLT50YWJfd2lkdGggLSAxOwoKCQkjIFJlLXVzYWJsZSBwYXR0ZXJuIHRvIG1hdGNoIGFueSBlbnRpcmUgZGwgbGlzdDoKCQkkd2hvbGVfbGlzdF9yZSA9ICcoPz4KCQkJKAkJCQkJCQkJIyAkMSA9IHdob2xlIGxpc3QKCQkJICAoCQkJCQkJCQkjICQyCgkJCQlbIF17MCwnLiRsZXNzX3RoYW5fdGFiLid9CgkJCQkoKD8+LipcUy4qXG4pKykJCQkJIyAkMyA9IGRlZmluZWQgdGVybQoJCQkJXG4/CgkJCQlbIF17MCwnLiRsZXNzX3RoYW5fdGFiLid9OlsgXSsgIyBjb2xvbiBzdGFydGluZyBkZWZpbml0aW9uCgkJCSAgKQoJCQkgICg/czouKz8pCgkJCSAgKAkJCQkJCQkJIyAkNAoJCQkJICBcegoJCQkJfAoJCQkJICBcbnsyLH0KCQkJCSAgKD89XFMpCgkJCQkgICg/IQkJCQkJCSMgTmVnYXRpdmUgbG9va2FoZWFkIGZvciBhbm90aGVyIHRlcm0KCQkJCQlbIF17MCwnLiRsZXNzX3RoYW5fdGFiLid9CgkJCQkJKD86IFxTLipcbiApKz8JCQkjIGRlZmluZWQgdGVybQoJCQkJCVxuPwoJCQkJCVsgXXswLCcuJGxlc3NfdGhhbl90YWIuJ306WyBdKyAjIGNvbG9uIHN0YXJ0aW5nIGRlZmluaXRpb24KCQkJCSAgKQoJCQkJICAoPyEJCQkJCQkjIE5lZ2F0aXZlIGxvb2thaGVhZCBmb3IgYW5vdGhlciBkZWZpbml0aW9uCgkJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfTpbIF0rICMgY29sb24gc3RhcnRpbmcgZGVmaW5pdGlvbgoJCQkJICApCgkJCSAgKQoJCQkpCgkJKSc7IC8vIG14CgoJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CgkJCQkoPz5cQVxuP3woPzw9XG5cbikpCgkJCQknLiR3aG9sZV9saXN0X3JlLicKCQkJfW14JywKCQkJYXJyYXkoJHRoaXMsICdfZG9EZWZMaXN0c19jYWxsYmFjaycpLCAkdGV4dCk7CgoJCXJldHVybiAkdGV4dDsKCX0KCXByb3RlY3RlZCBmdW5jdGlvbiBfZG9EZWZMaXN0c19jYWxsYmFjaygkbWF0Y2hlcykgewoJCSMgUmUtdXNhYmxlIHBhdHRlcm5zIHRvIG1hdGNoIGxpc3QgaXRlbSBidWxsZXRzIGFuZCBudW1iZXIgbWFya2VyczoKCQkkbGlzdCA9ICRtYXRjaGVzWzFdOwoJCQoJCSMgVHVybiBkb3VibGUgcmV0dXJucyBpbnRvIHRyaXBsZSByZXR1cm5zLCBzbyB0aGF0IHdlIGNhbiBtYWtlIGEKCQkjIHBhcmFncmFwaCBmb3IgdGhlIGxhc3QgaXRlbSBpbiBhIGxpc3QsIGlmIG5lY2Vzc2FyeToKCQkkcmVzdWx0ID0gdHJpbSgkdGhpcy0+cHJvY2Vzc0RlZkxpc3RJdGVtcygkbGlzdCkpOwoJCSRyZXN1bHQgPSAiPGRsPlxuIiAuICRyZXN1bHQgLiAiXG48L2RsPiI7CgkJcmV0dXJuICR0aGlzLT5oYXNoQmxvY2soJHJlc3VsdCkgLiAiXG5cbiI7Cgl9CgoKCXByb3RlY3RlZCBmdW5jdGlvbiBwcm9jZXNzRGVmTGlzdEl0ZW1zKCRsaXN0X3N0cikgewoJIwoJIwlQcm9jZXNzIHRoZSBjb250ZW50cyBvZiBhIHNpbmdsZSBkZWZpbml0aW9uIGxpc3QsIHNwbGl0dGluZyBpdAoJIwlpbnRvIGluZGl2aWR1YWwgdGVybSBhbmQgZGVmaW5pdGlvbiBsaXN0IGl0ZW1zLgoJIwoJCSRsZXNzX3RoYW5fdGFiID0gJHRoaXMtPnRhYl93aWR0aCAtIDE7CgkJCgkJIyB0cmltIHRyYWlsaW5nIGJsYW5rIGxpbmVzOgoJCSRsaXN0X3N0ciA9IHByZWdfcmVwbGFjZSgiL1xuezIsfVxcei8iLCAiXG4iLCAkbGlzdF9zdHIpOwoKCQkjIFByb2Nlc3MgZGVmaW5pdGlvbiB0ZXJtcy4KCQkkbGlzdF9zdHIgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKCQkJKD8+XEFcbj98XG5cbispCQkJCQkjIGxlYWRpbmcgbGluZQoJCQkoCQkJCQkJCQkjIGRlZmluaXRpb24gdGVybXMgPSAkMQoJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfQkjIGxlYWRpbmcgd2hpdGVzcGFjZQoJCQkJKD8hXDpbIF18WyBdKQkJCQkjIG5lZ2F0aXZlIGxvb2thaGVhZCBmb3IgYSBkZWZpbml0aW9uCgkJCQkJCQkJCQkJIyAgIG1hcmsgKGNvbG9uKSBvciBtb3JlIHdoaXRlc3BhY2UuCgkJCQkoPz4gXFMuKiBcbikrPwkJCQkjIGFjdHVhbCB0ZXJtIChub3Qgd2hpdGVzcGFjZSkuCQoJCQkpCQkJCgkJCSg/PVxuP1sgXXswLDN9OlsgXSkJCQkJIyBsb29rYWhlYWQgZm9yIGZvbGxvd2luZyBsaW5lIGZlZWQgCgkJCQkJCQkJCQkJIyAgIHdpdGggYSBkZWZpbml0aW9uIG1hcmsuCgkJCX14bScsCgkJCWFycmF5KCR0aGlzLCAnX3Byb2Nlc3NEZWZMaXN0SXRlbXNfY2FsbGJhY2tfZHQnKSwgJGxpc3Rfc3RyKTsKCgkJIyBQcm9jZXNzIGFjdHVhbCBkZWZpbml0aW9ucy4KCQkkbGlzdF9zdHIgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKCQkJXG4oXG4rKT8JCQkJCQkjIGxlYWRpbmcgbGluZSA9ICQxCgkJCSgJCQkJCQkJCSMgbWFya2VyIHNwYWNlID0gJDIKCQkJCVsgXXswLCcuJGxlc3NfdGhhbl90YWIuJ30JIyB3aGl0ZXNwYWNlIGJlZm9yZSBjb2xvbgoJCQkJXDpbIF0rCQkJCQkJIyBkZWZpbml0aW9uIG1hcmsgKGNvbG9uKQoJCQkpCgkJCSgoP3M6Lis/KSkJCQkJCQkjIGRlZmluaXRpb24gdGV4dCA9ICQzCgkJCSg/PSBcbisgCQkJCQkJIyBzdG9wIGF0IG5leHQgZGVmaW5pdGlvbiBtYXJrLAoJCQkJKD86CQkJCQkJCSMgbmV4dCB0ZXJtIG9yIGVuZCBvZiB0ZXh0CgkJCQkJWyBdezAsJy4kbGVzc190aGFuX3RhYi4nfSBcOlsgXQl8CgkJCQkJPGR0PiB8IFx6CgkJCQkpCQkJCQkJCgkJCSkJCQkJCQoJCQl9eG0nLAoJCQlhcnJheSgkdGhpcywgJ19wcm9jZXNzRGVmTGlzdEl0ZW1zX2NhbGxiYWNrX2RkJyksICRsaXN0X3N0cik7CgoJCXJldHVybiAkbGlzdF9zdHI7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX3Byb2Nlc3NEZWZMaXN0SXRlbXNfY2FsbGJhY2tfZHQoJG1hdGNoZXMpIHsKCQkkdGVybXMgPSBleHBsb2RlKCJcbiIsIHRyaW0oJG1hdGNoZXNbMV0pKTsKCQkkdGV4dCA9ICcnOwoJCWZvcmVhY2ggKCR0ZXJtcyBhcyAkdGVybSkgewoJCQkkdGVybSA9ICR0aGlzLT5ydW5TcGFuR2FtdXQodHJpbSgkdGVybSkpOwoJCQkkdGV4dCAuPSAiXG48ZHQ+IiAuICR0ZXJtIC4gIjwvZHQ+IjsKCQl9CgkJcmV0dXJuICR0ZXh0IC4gIlxuIjsKCX0KCXByb3RlY3RlZCBmdW5jdGlvbiBfcHJvY2Vzc0RlZkxpc3RJdGVtc19jYWxsYmFja19kZCgkbWF0Y2hlcykgewoJCSRsZWFkaW5nX2xpbmUJPSAkbWF0Y2hlc1sxXTsKCQkkbWFya2VyX3NwYWNlCT0gJG1hdGNoZXNbMl07CgkJJGRlZgkJCT0gJG1hdGNoZXNbM107CgoJCWlmICgkbGVhZGluZ19saW5lIHx8IHByZWdfbWF0Y2goJy9cbnsyLH0vJywgJGRlZikpIHsKCQkJIyBSZXBsYWNlIG1hcmtlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSB3aGl0ZXNwYWNlIGluZGVudGF0aW9uCgkJCSRkZWYgPSBzdHJfcmVwZWF0KCcgJywgc3RybGVuKCRtYXJrZXJfc3BhY2UpKSAuICRkZWY7CgkJCSRkZWYgPSAkdGhpcy0+cnVuQmxvY2tHYW11dCgkdGhpcy0+b3V0ZGVudCgkZGVmIC4gIlxuXG4iKSk7CgkJCSRkZWYgPSAiXG4iLiAkZGVmIC4iXG4iOwoJCX0KCQllbHNlIHsKCQkJJGRlZiA9IHJ0cmltKCRkZWYpOwoJCQkkZGVmID0gJHRoaXMtPnJ1blNwYW5HYW11dCgkdGhpcy0+b3V0ZGVudCgkZGVmKSk7CgkJfQoKCQlyZXR1cm4gIlxuPGRkPiIgLiAkZGVmIC4gIjwvZGQ+XG4iOwoJfQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gZG9GZW5jZWRDb2RlQmxvY2tzKCR0ZXh0KSB7CgkjCgkjIEFkZGluZyB0aGUgZmVuY2VkIGNvZGUgYmxvY2sgc3ludGF4IHRvIHJlZ3VsYXIgTWFya2Rvd246CgkjCgkjIH5+fgoJIyBDb2RlIGJsb2NrCgkjIH5+fgoJIwoJCSRsZXNzX3RoYW5fdGFiID0gJHRoaXMtPnRhYl93aWR0aDsKCQkKCQkkdGV4dCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnewoJCQkJKD86XG58XEEpCgkJCQkjIDE6IE9wZW5pbmcgbWFya2VyCgkJCQkoCgkJCQkJKD86fnszLH18YHszLH0pICMgMyBvciBtb3JlIHRpbGRlcy9iYWNrdGlja3MuCgkJCQkpCgkJCQlbIF0qCgkJCQkoPzoKCQkJCQlcLj8oWy1fOmEtekEtWjAtOV0rKSAjIDI6IHN0YW5kYWxvbmUgY2xhc3MgbmFtZQoJCQkJfAoJCQkJCScuJHRoaXMtPmlkX2NsYXNzX2F0dHJfY2F0Y2hfcmUuJyAjIDM6IEV4dHJhIGF0dHJpYnV0ZXMKCQkJCSk/CgkJCQlbIF0qIFxuICMgV2hpdGVzcGFjZSBhbmQgbmV3bGluZSBmb2xsb3dpbmcgbWFya2VyLgoJCQkJCgkJCQkjIDQ6IENvbnRlbnQKCQkJCSgKCQkJCQkoPz4KCQkJCQkJKD8hXDEgWyBdKiBcbikJIyBOb3QgYSBjbG9zaW5nIG1hcmtlci4KCQkJCQkJLipcbisKCQkJCQkpKwoJCQkJKQoJCQkJCgkJCQkjIENsb3NpbmcgbWFya2VyLgoJCQkJXDEgWyBdKiAoPz0gXG4gKQoJCQl9eG0nLAoJCQlhcnJheSgkdGhpcywgJ19kb0ZlbmNlZENvZGVCbG9ja3NfY2FsbGJhY2snKSwgJHRleHQpOwoKCQlyZXR1cm4gJHRleHQ7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX2RvRmVuY2VkQ29kZUJsb2Nrc19jYWxsYmFjaygkbWF0Y2hlcykgewoJCSRjbGFzc25hbWUgPSYgJG1hdGNoZXNbMl07CgkJJGF0dHJzICAgICA9JiAkbWF0Y2hlc1szXTsKCQkkY29kZWJsb2NrID0gJG1hdGNoZXNbNF07CgkJJGNvZGVibG9jayA9IGh0bWxzcGVjaWFsY2hhcnMoJGNvZGVibG9jaywgRU5UX05PUVVPVEVTKTsKCQkkY29kZWJsb2NrID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvXlxuKy8nLAoJCQlhcnJheSgkdGhpcywgJ19kb0ZlbmNlZENvZGVCbG9ja3NfbmV3bGluZXMnKSwgJGNvZGVibG9jayk7CgoJCWlmICgkY2xhc3NuYW1lICE9ICIiKSB7CgkJCWlmICgkY2xhc3NuYW1lezB9ID09ICcuJykKCQkJCSRjbGFzc25hbWUgPSBzdWJzdHIoJGNsYXNzbmFtZSwgMSk7CgkJCSRhdHRyX3N0ciA9ICcgY2xhc3M9IicuJHRoaXMtPmNvZGVfY2xhc3NfcHJlZml4LiRjbGFzc25hbWUuJyInOwoJCX0gZWxzZSB7CgkJCSRhdHRyX3N0ciA9ICR0aGlzLT5kb0V4dHJhQXR0cmlidXRlcygkdGhpcy0+Y29kZV9hdHRyX29uX3ByZSA/ICJwcmUiIDogImNvZGUiLCAkYXR0cnMpOwoJCX0KCQkkcHJlX2F0dHJfc3RyICA9ICR0aGlzLT5jb2RlX2F0dHJfb25fcHJlID8gJGF0dHJfc3RyIDogJyc7CgkJJGNvZGVfYXR0cl9zdHIgPSAkdGhpcy0+Y29kZV9hdHRyX29uX3ByZSA/ICcnIDogJGF0dHJfc3RyOwoJCSRjb2RlYmxvY2sgID0gIjxwcmUkcHJlX2F0dHJfc3RyPjxjb2RlJGNvZGVfYXR0cl9zdHI+JGNvZGVibG9jazwvY29kZT48L3ByZT4iOwoJCQoJCXJldHVybiAiXG5cbiIuJHRoaXMtPmhhc2hCbG9jaygkY29kZWJsb2NrKS4iXG5cbiI7Cgl9Cglwcm90ZWN0ZWQgZnVuY3Rpb24gX2RvRmVuY2VkQ29kZUJsb2Nrc19uZXdsaW5lcygkbWF0Y2hlcykgewoJCXJldHVybiBzdHJfcmVwZWF0KCI8YnIkdGhpcy0+ZW1wdHlfZWxlbWVudF9zdWZmaXgiLCAKCQkJc3RybGVuKCRtYXRjaGVzWzBdKSk7Cgl9CgoKCSMKCSMgUmVkZWZpbmluZyBlbXBoYXNpcyBtYXJrZXJzIHNvIHRoYXQgZW1waGFzaXMgYnkgdW5kZXJzY29yZSBkb2VzIG5vdAoJIyB3b3JrIGluIHRoZSBtaWRkbGUgb2YgYSB3b3JkLgoJIwoJcHJvdGVjdGVkICRlbV9yZWxpc3QgPSBhcnJheSgKCQknJyAgPT4gJyg/Oig/PCFcKilcKig/IVwqKXwoPzwhW2EtekEtWjAtOV9dKV8oPyFfKSkoPyFbXC4sOjtdP1xzKScsCgkJJyonID0+ICcoPzwhW1xzKl0pXCooPyFcKiknLAoJCSdfJyA9PiAnKD88IVtcc19dKV8oPyFbYS16QS1aMC05X10pJywKCQkpOwoJcHJvdGVjdGVkICRzdHJvbmdfcmVsaXN0ID0gYXJyYXkoCgkJJycgICA9PiAnKD86KD88IVwqKVwqXCooPyFcKil8KD88IVthLXpBLVowLTlfXSlfXyg/IV8pKSg/IVtcLiw6O10/XHMpJywKCQknKionID0+ICcoPzwhW1xzKl0pXCpcKig/IVwqKScsCgkJJ19fJyA9PiAnKD88IVtcc19dKV9fKD8hW2EtekEtWjAtOV9dKScsCgkJKTsKCXByb3RlY3RlZCAkZW1fc3Ryb25nX3JlbGlzdCA9IGFycmF5KAoJCScnICAgID0+ICcoPzooPzwhXCopXCpcKlwqKD8hXCopfCg/PCFbYS16QS1aMC05X10pX19fKD8hXykpKD8hW1wuLDo7XT9ccyknLAoJCScqKionID0+ICcoPzwhW1xzKl0pXCpcKlwqKD8hXCopJywKCQknX19fJyA9PiAnKD88IVtcc19dKV9fXyg/IVthLXpBLVowLTlfXSknLAoJCSk7CgoKCXByb3RlY3RlZCBmdW5jdGlvbiBmb3JtUGFyYWdyYXBocygkdGV4dCkgewoJIwoJIwlQYXJhbXM6CgkjCQkkdGV4dCAtIHN0cmluZyB0byBwcm9jZXNzIHdpdGggaHRtbCA8cD4gdGFncwoJIwoJCSMgU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgbGluZXM6CgkJJHRleHQgPSBwcmVnX3JlcGxhY2UoJy9cQVxuK3xcbitcei8nLCAnJywgJHRleHQpOwoJCQoJCSRncmFmcyA9IHByZWdfc3BsaXQoJy9cbnsyLH0vJywgJHRleHQsIC0xLCBQUkVHX1NQTElUX05PX0VNUFRZKTsKCgkJIwoJCSMgV3JhcCA8cD4gdGFncyBhbmQgdW5oYXNoaWZ5IEhUTUwgYmxvY2tzCgkJIwoJCWZvcmVhY2ggKCRncmFmcyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQkkdmFsdWUgPSB0cmltKCR0aGlzLT5ydW5TcGFuR2FtdXQoJHZhbHVlKSk7CgkJCQoJCQkjIENoZWNrIGlmIHRoaXMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIGEgcGFyYWdyYXBoLgoJCQkjIENsZWFuIHRhZyBoYXNoZXMgJiBibG9jayB0YWcgaGFzaGVzIGFyZSBsZWZ0IGFsb25lLgoJCQkkaXNfcCA9ICFwcmVnX21hdGNoKCcvXkJceDFBWzAtOV0rQnxeQ1x4MUFbMC05XStDJC8nLCAkdmFsdWUpOwoJCQkKCQkJaWYgKCRpc19wKSB7CgkJCQkkdmFsdWUgPSAiPHA+JHZhbHVlPC9wPiI7CgkJCX0KCQkJJGdyYWZzWyRrZXldID0gJHZhbHVlOwoJCX0KCQkKCQkjIEpvaW4gZ3JhZnMgaW4gb25lIHRleHQsIHRoZW4gdW5oYXNoIEhUTUwgdGFncy4gCgkJJHRleHQgPSBpbXBsb2RlKCJcblxuIiwgJGdyYWZzKTsKCQkKCQkjIEZpbmlzaCBieSByZW1vdmluZyBhbnkgdGFnIGhhc2hlcyBzdGlsbCBwcmVzZW50IGluICR0ZXh0LgoJCSR0ZXh0ID0gJHRoaXMtPnVuaGFzaCgkdGV4dCk7CgkJCgkJcmV0dXJuICR0ZXh0OwoJfQoJCgkKCSMjIyBGb290bm90ZXMKCQoJcHJvdGVjdGVkIGZ1bmN0aW9uIHN0cmlwRm9vdG5vdGVzKCR0ZXh0KSB7CgkjCgkjIFN0cmlwcyBsaW5rIGRlZmluaXRpb25zIGZyb20gdGV4dCwgc3RvcmVzIHRoZSBVUkxzIGFuZCB0aXRsZXMgaW4KCSMgaGFzaCByZWZlcmVuY2VzLgoJIwoJCSRsZXNzX3RoYW5fdGFiID0gJHRoaXMtPnRhYl93aWR0aCAtIDE7CgoJCSMgTGluayBkZWZzIGFyZSBpbiB0aGUgZm9ybTogW15pZF06IHVybCAib3B0aW9uYWwgdGl0bGUiCgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3sKCQkJXlsgXXswLCcuJGxlc3NfdGhhbl90YWIuJ31cW1xeKC4rPylcXVsgXT86CSMgbm90ZV9pZCA9ICQxCgkJCSAgWyBdKgoJCQkgIFxuPwkJCQkJIyBtYXliZSAqb25lKiBuZXdsaW5lCgkJCSgJCQkJCQkjIHRleHQgPSAkMiAobm8gYmxhbmsgbGluZXMgYWxsb3dlZCkKCQkJCSg/OgkJCQkJCgkJCQkJLisJCQkJIyBhY3R1YWwgdGV4dAoJCQkJfAoJCQkJCVxuCQkJCSMgbmV3bGluZXMgYnV0IAoJCQkJCSg/IVxbLis/XF1bIF0/OlxzKSMgbmVnYXRpdmUgbG9va2FoZWFkIGZvciBmb290bm90ZSBvciBsaW5rIGRlZmluaXRpb24gbWFya2VyLgoJCQkJCSg/IVxuK1sgXXswLDN9XFMpIyBlbnN1cmUgbGluZSBpcyBub3QgYmxhbmsgYW5kIGZvbGxvd2VkIAoJCQkJCQkJCQkjIGJ5IG5vbi1pbmRlbnRlZCBjb250ZW50CgkJCQkpKgoJCQkpCQkKCQkJfXhtJywKCQkJYXJyYXkoJHRoaXMsICdfc3RyaXBGb290bm90ZXNfY2FsbGJhY2snKSwKCQkJJHRleHQpOwoJCXJldHVybiAkdGV4dDsKCX0KCXByb3RlY3RlZCBmdW5jdGlvbiBfc3RyaXBGb290bm90ZXNfY2FsbGJhY2soJG1hdGNoZXMpIHsKCQkkbm90ZV9pZCA9ICR0aGlzLT5mbl9pZF9wcmVmaXggLiAkbWF0Y2hlc1sxXTsKCQkkdGhpcy0+Zm9vdG5vdGVzWyRub3RlX2lkXSA9ICR0aGlzLT5vdXRkZW50KCRtYXRjaGVzWzJdKTsKCQlyZXR1cm4gJyc7ICMgU3RyaW5nIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBibG9jawoJfQoKCglwcm90ZWN0ZWQgZnVuY3Rpb24gZG9Gb290bm90ZXMoJHRleHQpIHsKCSMKCSMgUmVwbGFjZSBmb290bm90ZSByZWZlcmVuY2VzIGluICR0ZXh0IFteaWRdIHdpdGggYSBzcGVjaWFsIHRleHQtdG9rZW4gCgkjIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGFjdHVhbCBmb290bm90ZSBtYXJrZXIgaW4gYXBwZW5kRm9vdG5vdGVzLgoJIwoJCWlmICghJHRoaXMtPmluX2FuY2hvcikgewoJCQkkdGV4dCA9IHByZWdfcmVwbGFjZSgne1xbXF4oLis/KVxdfScsICJGXHgxQWZuOlxcMVx4MUE6IiwgJHRleHQpOwoJCX0KCQlyZXR1cm4gJHRleHQ7Cgl9CgoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gYXBwZW5kRm9vdG5vdGVzKCR0ZXh0KSB7CgkjCgkjIEFwcGVuZCBmb290bm90ZSBsaXN0IHRvIHRleHQuCgkjCgkJJHRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3tGXHgxQWZuOiguKj8pXHgxQTp9JywgCgkJCWFycmF5KCR0aGlzLCAnX2FwcGVuZEZvb3Rub3Rlc19jYWxsYmFjaycpLCAkdGV4dCk7CgkKCQlpZiAoIWVtcHR5KCR0aGlzLT5mb290bm90ZXNfb3JkZXJlZCkpIHsKCQkJJHRleHQgLj0gIlxuXG4iOwoJCQkkdGV4dCAuPSAiPGRpdiBjbGFzcz1cImZvb3Rub3Rlc1wiPlxuIjsKCQkJJHRleHQgLj0gIjxociIuICR0aGlzLT5lbXB0eV9lbGVtZW50X3N1ZmZpeCAuIlxuIjsKCQkJJHRleHQgLj0gIjxvbD5cblxuIjsKCgkJCSRhdHRyID0gIiI7CgkJCWlmICgkdGhpcy0+Zm5fYmFja2xpbmtfY2xhc3MgIT0gIiIpIHsKCQkJCSRjbGFzcyA9ICR0aGlzLT5mbl9iYWNrbGlua19jbGFzczsKCQkJCSRjbGFzcyA9ICR0aGlzLT5lbmNvZGVBdHRyaWJ1dGUoJGNsYXNzKTsKCQkJCSRhdHRyIC49ICIgY2xhc3M9XCIkY2xhc3NcIiI7CgkJCX0KCQkJaWYgKCR0aGlzLT5mbl9iYWNrbGlua190aXRsZSAhPSAiIikgewoJCQkJJHRpdGxlID0gJHRoaXMtPmZuX2JhY2tsaW5rX3RpdGxlOwoJCQkJJHRpdGxlID0gJHRoaXMtPmVuY29kZUF0dHJpYnV0ZSgkdGl0bGUpOwoJCQkJJGF0dHIgLj0gIiB0aXRsZT1cIiR0aXRsZVwiIjsKCQkJfQoJCQkkbnVtID0gMDsKCQkJCgkJCXdoaWxlICghZW1wdHkoJHRoaXMtPmZvb3Rub3Rlc19vcmRlcmVkKSkgewoJCQkJJGZvb3Rub3RlID0gcmVzZXQoJHRoaXMtPmZvb3Rub3Rlc19vcmRlcmVkKTsKCQkJCSRub3RlX2lkID0ga2V5KCR0aGlzLT5mb290bm90ZXNfb3JkZXJlZCk7CgkJCQl1bnNldCgkdGhpcy0+Zm9vdG5vdGVzX29yZGVyZWRbJG5vdGVfaWRdKTsKCQkJCSRyZWZfY291bnQgPSAkdGhpcy0+Zm9vdG5vdGVzX3JlZl9jb3VudFskbm90ZV9pZF07CgkJCQl1bnNldCgkdGhpcy0+Zm9vdG5vdGVzX3JlZl9jb3VudFskbm90ZV9pZF0pOwoJCQkJdW5zZXQoJHRoaXMtPmZvb3Rub3Rlc1skbm90ZV9pZF0pOwoJCQkJCgkJCQkkZm9vdG5vdGUgLj0gIlxuIjsgIyBOZWVkIHRvIGFwcGVuZCBuZXdsaW5lIGJlZm9yZSBwYXJzaW5nLgoJCQkJJGZvb3Rub3RlID0gJHRoaXMtPnJ1bkJsb2NrR2FtdXQoIiRmb290bm90ZVxuIik7CQkJCQoJCQkJJGZvb3Rub3RlID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7Rlx4MUFmbjooLio/KVx4MUE6fScsIAoJCQkJCWFycmF5KCR0aGlzLCAnX2FwcGVuZEZvb3Rub3Rlc19jYWxsYmFjaycpLCAkZm9vdG5vdGUpOwoJCQkJCgkJCQkkYXR0ciA9IHN0cl9yZXBsYWNlKCIlJSIsICsrJG51bSwgJGF0dHIpOwoJCQkJJG5vdGVfaWQgPSAkdGhpcy0+ZW5jb2RlQXR0cmlidXRlKCRub3RlX2lkKTsKCgkJCQkjIFByZXBhcmUgYmFja2xpbmssIG11bHRpcGxlIGJhY2tsaW5rcyBpZiBtdWx0aXBsZSByZWZlcmVuY2VzCgkJCQkkYmFja2xpbmsgPSAiPGEgaHJlZj1cIiNmbnJlZjokbm90ZV9pZFwiJGF0dHI+JiM4NjE3OzwvYT4iOwoJCQkJZm9yICgkcmVmX251bSA9IDI7ICRyZWZfbnVtIDw9ICRyZWZfY291bnQ7ICsrJHJlZl9udW0pIHsKCQkJCQkkYmFja2xpbmsgLj0gIiA8YSBocmVmPVwiI2ZucmVmJHJlZl9udW06JG5vdGVfaWRcIiRhdHRyPiYjODYxNzs8L2E+IjsKCQkJCX0KCQkJCSMgQWRkIGJhY2tsaW5rIHRvIGxhc3QgcGFyYWdyYXBoOyBjcmVhdGUgbmV3IHBhcmFncmFwaCBpZiBuZWVkZWQuCgkJCQlpZiAocHJlZ19tYXRjaCgnezwvcD4kfScsICRmb290bm90ZSkpIHsKCQkJCQkkZm9vdG5vdGUgPSBzdWJzdHIoJGZvb3Rub3RlLCAwLCAtNCkgLiAiJiMxNjA7JGJhY2tsaW5rPC9wPiI7CgkJCQl9IGVsc2UgewoJCQkJCSRmb290bm90ZSAuPSAiXG5cbjxwPiRiYWNrbGluazwvcD4iOwoJCQkJfQoJCQkJCgkJCQkkdGV4dCAuPSAiPGxpIGlkPVwiZm46JG5vdGVfaWRcIj5cbiI7CgkJCQkkdGV4dCAuPSAkZm9vdG5vdGUgLiAiXG4iOwoJCQkJJHRleHQgLj0gIjwvbGk+XG5cbiI7CgkJCX0KCQkJCgkJCSR0ZXh0IC49ICI8L29sPlxuIjsKCQkJJHRleHQgLj0gIjwvZGl2PiI7CgkJfQoJCXJldHVybiAkdGV4dDsKCX0KCXByb3RlY3RlZCBmdW5jdGlvbiBfYXBwZW5kRm9vdG5vdGVzX2NhbGxiYWNrKCRtYXRjaGVzKSB7CgkJJG5vZGVfaWQgPSAkdGhpcy0+Zm5faWRfcHJlZml4IC4gJG1hdGNoZXNbMV07CgkJCgkJIyBDcmVhdGUgZm9vdG5vdGUgbWFya2VyIG9ubHkgaWYgaXQgaGFzIGEgY29ycmVzcG9uZGluZyBmb290bm90ZSAqYW5kKgoJCSMgdGhlIGZvb3Rub3RlIGhhc24ndCBiZWVuIHVzZWQgYnkgYW5vdGhlciBtYXJrZXIuCgkJaWYgKGlzc2V0KCR0aGlzLT5mb290bm90ZXNbJG5vZGVfaWRdKSkgewoJCQkkbnVtID0mICR0aGlzLT5mb290bm90ZXNfbnVtYmVyc1skbm9kZV9pZF07CgkJCWlmICghaXNzZXQoJG51bSkpIHsKCQkJCSMgVHJhbnNmZXIgZm9vdG5vdGUgY29udGVudCB0byB0aGUgb3JkZXJlZCBsaXN0IGFuZCBnaXZlIGl0IGl0cwoJCQkJIyBudW1iZXIKCQkJCSR0aGlzLT5mb290bm90ZXNfb3JkZXJlZFskbm9kZV9pZF0gPSAkdGhpcy0+Zm9vdG5vdGVzWyRub2RlX2lkXTsKCQkJCSR0aGlzLT5mb290bm90ZXNfcmVmX2NvdW50WyRub2RlX2lkXSA9IDE7CgkJCQkkbnVtID0gJHRoaXMtPmZvb3Rub3RlX2NvdW50ZXIrKzsKCQkJCSRyZWZfY291bnRfbWFyayA9ICcnOwoJCQl9IGVsc2UgewoJCQkJJHJlZl9jb3VudF9tYXJrID0gJHRoaXMtPmZvb3Rub3Rlc19yZWZfY291bnRbJG5vZGVfaWRdICs9IDE7CgkJCX0KCgkJCSRhdHRyID0gIiI7CgkJCWlmICgkdGhpcy0+Zm5fbGlua19jbGFzcyAhPSAiIikgewoJCQkJJGNsYXNzID0gJHRoaXMtPmZuX2xpbmtfY2xhc3M7CgkJCQkkY2xhc3MgPSAkdGhpcy0+ZW5jb2RlQXR0cmlidXRlKCRjbGFzcyk7CgkJCQkkYXR0ciAuPSAiIGNsYXNzPVwiJGNsYXNzXCIiOwoJCQl9CgkJCWlmICgkdGhpcy0+Zm5fbGlua190aXRsZSAhPSAiIikgewoJCQkJJHRpdGxlID0gJHRoaXMtPmZuX2xpbmtfdGl0bGU7CgkJCQkkdGl0bGUgPSAkdGhpcy0+ZW5jb2RlQXR0cmlidXRlKCR0aXRsZSk7CgkJCQkkYXR0ciAuPSAiIHRpdGxlPVwiJHRpdGxlXCIiOwoJCQl9CgkJCQoJCQkkYXR0ciA9IHN0cl9yZXBsYWNlKCIlJSIsICRudW0sICRhdHRyKTsKCQkJJG5vZGVfaWQgPSAkdGhpcy0+ZW5jb2RlQXR0cmlidXRlKCRub2RlX2lkKTsKCQkJCgkJCXJldHVybgoJCQkJIjxzdXAgaWQ9XCJmbnJlZiRyZWZfY291bnRfbWFyazokbm9kZV9pZFwiPiIuCgkJCQkiPGEgaHJlZj1cIiNmbjokbm9kZV9pZFwiJGF0dHI+JG51bTwvYT4iLgoJCQkJIjwvc3VwPiI7CgkJfQoJCQoJCXJldHVybiAiW14iLiRtYXRjaGVzWzFdLiJdIjsKCX0KCQkKCQoJIyMjIEFiYnJldmlhdGlvbnMgIyMjCgkKCXByb3RlY3RlZCBmdW5jdGlvbiBzdHJpcEFiYnJldmlhdGlvbnMoJHRleHQpIHsKCSMKCSMgU3RyaXBzIGFiYnJldmlhdGlvbnMgZnJvbSB0ZXh0LCBzdG9yZXMgdGl0bGVzIGluIGhhc2ggcmVmZXJlbmNlcy4KCSMKCQkkbGVzc190aGFuX3RhYiA9ICR0aGlzLT50YWJfd2lkdGggLSAxOwoKCQkjIExpbmsgZGVmcyBhcmUgaW4gdGhlIGZvcm06IFtpZF0qOiB1cmwgIm9wdGlvbmFsIHRpdGxlIgoJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7CgkJCV5bIF17MCwnLiRsZXNzX3RoYW5fdGFiLid9XCpcWyguKz8pXF1bIF0/OgkjIGFiYnJfaWQgPSAkMQoJCQkoLiopCQkJCQkjIHRleHQgPSAkMiAobm8gYmxhbmsgbGluZXMgYWxsb3dlZCkJCgkJCX14bScsCgkJCWFycmF5KCR0aGlzLCAnX3N0cmlwQWJicmV2aWF0aW9uc19jYWxsYmFjaycpLAoJCQkkdGV4dCk7CgkJcmV0dXJuICR0ZXh0OwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9zdHJpcEFiYnJldmlhdGlvbnNfY2FsbGJhY2soJG1hdGNoZXMpIHsKCQkkYWJicl93b3JkID0gJG1hdGNoZXNbMV07CgkJJGFiYnJfZGVzYyA9ICRtYXRjaGVzWzJdOwoJCWlmICgkdGhpcy0+YWJicl93b3JkX3JlKQoJCQkkdGhpcy0+YWJicl93b3JkX3JlIC49ICd8JzsKCQkkdGhpcy0+YWJicl93b3JkX3JlIC49IHByZWdfcXVvdGUoJGFiYnJfd29yZCk7CgkJJHRoaXMtPmFiYnJfZGVzY2lwdGlvbnNbJGFiYnJfd29yZF0gPSB0cmltKCRhYmJyX2Rlc2MpOwoJCXJldHVybiAnJzsgIyBTdHJpbmcgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIGJsb2NrCgl9CgkKCQoJcHJvdGVjdGVkIGZ1bmN0aW9uIGRvQWJicmV2aWF0aW9ucygkdGV4dCkgewoJIwoJIyBGaW5kIGRlZmluZWQgYWJicmV2aWF0aW9ucyBpbiB0ZXh0IGFuZCB3cmFwIHRoZW0gaW4gPGFiYnI+IGVsZW1lbnRzLgoJIwoJCWlmICgkdGhpcy0+YWJicl93b3JkX3JlKSB7CgkJCS8vIGNhbm5vdCB1c2UgdGhlIC94IG1vZGlmaWVyIGJlY2F1c2UgYWJicl93b3JkX3JlIG1heSAKCQkJLy8gY29udGFpbiBzaWduaWZpY2FudCBzcGFjZXM6CgkJCSR0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7Jy4KCQkJCScoPzwhW1x3XHgxQV0pJy4KCQkJCScoPzonLiR0aGlzLT5hYmJyX3dvcmRfcmUuJyknLgoJCQkJJyg/IVtcd1x4MUFdKScuCgkJCQknfScsIAoJCQkJYXJyYXkoJHRoaXMsICdfZG9BYmJyZXZpYXRpb25zX2NhbGxiYWNrJyksICR0ZXh0KTsKCQl9CgkJcmV0dXJuICR0ZXh0OwoJfQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9kb0FiYnJldmlhdGlvbnNfY2FsbGJhY2soJG1hdGNoZXMpIHsKCQkkYWJiciA9ICRtYXRjaGVzWzBdOwoJCWlmIChpc3NldCgkdGhpcy0+YWJicl9kZXNjaXB0aW9uc1skYWJicl0pKSB7CgkJCSRkZXNjID0gJHRoaXMtPmFiYnJfZGVzY2lwdGlvbnNbJGFiYnJdOwoJCQlpZiAoZW1wdHkoJGRlc2MpKSB7CgkJCQlyZXR1cm4gJHRoaXMtPmhhc2hQYXJ0KCI8YWJicj4kYWJicjwvYWJicj4iKTsKCQkJfSBlbHNlIHsKCQkJCSRkZXNjID0gJHRoaXMtPmVuY29kZUF0dHJpYnV0ZSgkZGVzYyk7CgkJCQlyZXR1cm4gJHRoaXMtPmhhc2hQYXJ0KCI8YWJiciB0aXRsZT1cIiRkZXNjXCI+JGFiYnI8L2FiYnI+Iik7CgkJCX0KCQl9IGVsc2UgewoJCQlyZXR1cm4gJG1hdGNoZXNbMF07CgkJfQoJfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Engines/Michelf/MarkdownInterface.inc.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMgVXNlIHRoaXMgZmlsZSBpZiB5b3UgY2Fubm90IHVzZSBjbGFzcyBhdXRvbG9hZGluZy4gSXQgd2lsbCBpbmNsdWRlIGFsbCB0aGUKIyBmaWxlcyBuZWVkZWQgZm9yIHRoZSBNYXJrZG93bkludGVyZmFjZSBpbnRlcmZhY2UuCiMKIyBUYWtlIGEgbG9vayBhdCB0aGUgUFNSLTAtY29tcGF0aWJsZSBjbGFzcyBhdXRvbG9hZGluZyBpbXBsZW1lbnRhdGlvbgojIGluIHRoZSBSZWFkbWUucGhwIGZpbGUgaWYgeW91IHdhbnQgYSBzaW1wbGUgYXV0b2xvYWRlciBzZXR1cC4KCnJlcXVpcmVfb25jZSBkaXJuYW1lKF9fRklMRV9fKSAuICcvTWFya2Rvd25JbnRlcmZhY2UucGhwJzsK]]></data>
	</file>
	<file>
	  <filename>/lib/Engines/Michelf/MarkdownInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIwojIE1hcmtkb3duICAtICBBIHRleHQtdG8tSFRNTCBjb252ZXJzaW9uIHRvb2wgZm9yIHdlYiB3cml0ZXJzCiMKIyBQSFAgTWFya2Rvd24KIyBDb3B5cmlnaHQgKGMpIDIwMDQtMjAxNSBNaWNoZWwgRm9ydGluCiMgPGh0dHBzOi8vbWljaGVsZi5jYS9wcm9qZWN0cy9waHAtbWFya2Rvd24vPgojCiMgT3JpZ2luYWwgTWFya2Rvd24KIyBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBKb2huIEdydWJlcgojIDxodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duLz4KIwpuYW1lc3BhY2UgTWljaGVsZjsKCgojCiMgTWFya2Rvd24gUGFyc2VyIEludGVyZmFjZQojCgppbnRlcmZhY2UgTWFya2Rvd25JbnRlcmZhY2UgewoKICAjCiAgIyBJbml0aWFsaXplIHRoZSBwYXJzZXIgYW5kIHJldHVybiB0aGUgcmVzdWx0IG9mIGl0cyB0cmFuc2Zvcm0gbWV0aG9kLgogICMgVGhpcyB3aWxsIHdvcmsgZmluZSBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvby4KICAjCiAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZWZhdWx0VHJhbnNmb3JtKCR0ZXh0KTsKCiAgIwogICMgTWFpbiBmdW5jdGlvbi4gUGVyZm9ybXMgc29tZSBwcmVwcm9jZXNzaW5nIG9uIHRoZSBpbnB1dCB0ZXh0CiAgIyBhbmQgcGFzcyBpdCB0aHJvdWdoIHRoZSBkb2N1bWVudCBnYW11dC4KICAjCiAgcHVibGljIGZ1bmN0aW9uIHRyYW5zZm9ybSgkdGV4dCk7Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Engines/Parsedown/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Engines/Parsedown/LICENSE.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[VGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTMgRW1hbnVpbCBSdXNldiwgZXJ1c2V2LmNvbQoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgp0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgp0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCnRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgpDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4=]]></data>
	</file>
	<file>
	  <filename>/lib/Engines/Parsedown/Parsedown.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMKIwojIFBhcnNlZG93bgojIGh0dHA6Ly9wYXJzZWRvd24ub3JnCiMKIyAoYykgRW1hbnVpbCBSdXNldgojIGh0dHA6Ly9lcnVzZXYuY29tCiMKIyBGb3IgdGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiwgdmlldyB0aGUgTElDRU5TRSBmaWxlIHRoYXQgd2FzIGRpc3RyaWJ1dGVkCiMgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgojCiMKCmNsYXNzIFBhcnNlZG93bgp7CiAgICAjIH4KCiAgICBjb25zdCB2ZXJzaW9uID0gJzEuNS4xJzsKCiAgICAjIH4KCiAgICBmdW5jdGlvbiB0ZXh0KCR0ZXh0KQogICAgewogICAgICAgICMgbWFrZSBzdXJlIG5vIGRlZmluaXRpb25zIGFyZSBzZXQKICAgICAgICAkdGhpcy0+RGVmaW5pdGlvbkRhdGEgPSBhcnJheSgpOwoKICAgICAgICAjIHN0YW5kYXJkaXplIGxpbmUgYnJlYWtzCiAgICAgICAgJHRleHQgPSBzdHJfcmVwbGFjZShhcnJheSgiXHJcbiIsICJcciIpLCAiXG4iLCAkdGV4dCk7CgogICAgICAgICMgcmVtb3ZlIHN1cnJvdW5kaW5nIGxpbmUgYnJlYWtzCiAgICAgICAgJHRleHQgPSB0cmltKCR0ZXh0LCAiXG4iKTsKCiAgICAgICAgIyBzcGxpdCB0ZXh0IGludG8gbGluZXMKICAgICAgICAkbGluZXMgPSBleHBsb2RlKCJcbiIsICR0ZXh0KTsKCiAgICAgICAgIyBpdGVyYXRlIHRocm91Z2ggbGluZXMgdG8gaWRlbnRpZnkgYmxvY2tzCiAgICAgICAgJG1hcmt1cCA9ICR0aGlzLT5saW5lcygkbGluZXMpOwoKICAgICAgICAjIHRyaW0gbGluZSBicmVha3MKICAgICAgICAkbWFya3VwID0gdHJpbSgkbWFya3VwLCAiXG4iKTsKCiAgICAgICAgcmV0dXJuICRtYXJrdXA7CiAgICB9CgogICAgIwogICAgIyBTZXR0ZXJzCiAgICAjCgogICAgZnVuY3Rpb24gc2V0QnJlYWtzRW5hYmxlZCgkYnJlYWtzRW5hYmxlZCkKICAgIHsKICAgICAgICAkdGhpcy0+YnJlYWtzRW5hYmxlZCA9ICRicmVha3NFbmFibGVkOwoKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgcHJvdGVjdGVkICRicmVha3NFbmFibGVkOwoKICAgIGZ1bmN0aW9uIHNldE1hcmt1cEVzY2FwZWQoJG1hcmt1cEVzY2FwZWQpCiAgICB7CiAgICAgICAgJHRoaXMtPm1hcmt1cEVzY2FwZWQgPSAkbWFya3VwRXNjYXBlZDsKCiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIHByb3RlY3RlZCAkbWFya3VwRXNjYXBlZDsKCiAgICBmdW5jdGlvbiBzZXRVcmxzTGlua2VkKCR1cmxzTGlua2VkKQogICAgewogICAgICAgICR0aGlzLT51cmxzTGlua2VkID0gJHVybHNMaW5rZWQ7CgogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICBwcm90ZWN0ZWQgJHVybHNMaW5rZWQgPSB0cnVlOwoKICAgICMKICAgICMgTGluZXMKICAgICMKCiAgICBwcm90ZWN0ZWQgJEJsb2NrVHlwZXMgPSBhcnJheSgKICAgICAgICAnIycgPT4gYXJyYXkoJ0hlYWRlcicpLAogICAgICAgICcqJyA9PiBhcnJheSgnUnVsZScsICdMaXN0JyksCiAgICAgICAgJysnID0+IGFycmF5KCdMaXN0JyksCiAgICAgICAgJy0nID0+IGFycmF5KCdTZXRleHRIZWFkZXInLCAnVGFibGUnLCAnUnVsZScsICdMaXN0JyksCiAgICAgICAgJzAnID0+IGFycmF5KCdMaXN0JyksCiAgICAgICAgJzEnID0+IGFycmF5KCdMaXN0JyksCiAgICAgICAgJzInID0+IGFycmF5KCdMaXN0JyksCiAgICAgICAgJzMnID0+IGFycmF5KCdMaXN0JyksCiAgICAgICAgJzQnID0+IGFycmF5KCdMaXN0JyksCiAgICAgICAgJzUnID0+IGFycmF5KCdMaXN0JyksCiAgICAgICAgJzYnID0+IGFycmF5KCdMaXN0JyksCiAgICAgICAgJzcnID0+IGFycmF5KCdMaXN0JyksCiAgICAgICAgJzgnID0+IGFycmF5KCdMaXN0JyksCiAgICAgICAgJzknID0+IGFycmF5KCdMaXN0JyksCiAgICAgICAgJzonID0+IGFycmF5KCdUYWJsZScpLAogICAgICAgICc8JyA9PiBhcnJheSgnQ29tbWVudCcsICdNYXJrdXAnKSwKICAgICAgICAnPScgPT4gYXJyYXkoJ1NldGV4dEhlYWRlcicpLAogICAgICAgICc+JyA9PiBhcnJheSgnUXVvdGUnKSwKICAgICAgICAnWycgPT4gYXJyYXkoJ1JlZmVyZW5jZScpLAogICAgICAgICdfJyA9PiBhcnJheSgnUnVsZScpLAogICAgICAgICdgJyA9PiBhcnJheSgnRmVuY2VkQ29kZScpLAogICAgICAgICd8JyA9PiBhcnJheSgnVGFibGUnKSwKICAgICAgICAnficgPT4gYXJyYXkoJ0ZlbmNlZENvZGUnKSwKICAgICk7CgogICAgIyB+CgogICAgcHJvdGVjdGVkICREZWZpbml0aW9uVHlwZXMgPSBhcnJheSgKICAgICAgICAnWycgPT4gYXJyYXkoJ1JlZmVyZW5jZScpLAogICAgKTsKCiAgICAjIH4KCiAgICBwcm90ZWN0ZWQgJHVubWFya2VkQmxvY2tUeXBlcyA9IGFycmF5KAogICAgICAgICdDb2RlJywKICAgICk7CgogICAgIwogICAgIyBCbG9ja3MKICAgICMKCiAgICBwcml2YXRlIGZ1bmN0aW9uIGxpbmVzKGFycmF5ICRsaW5lcykKICAgIHsKICAgICAgICAkQ3VycmVudEJsb2NrID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNob3AoJGxpbmUpID09PSAnJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRDdXJyZW50QmxvY2spKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRDdXJyZW50QmxvY2tbJ2ludGVycnVwdGVkJ10gPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc3RycG9zKCRsaW5lLCAiXHQiKSAhPT0gZmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRwYXJ0cyA9IGV4cGxvZGUoIlx0IiwgJGxpbmUpOwoKICAgICAgICAgICAgICAgICRsaW5lID0gJHBhcnRzWzBdOwoKICAgICAgICAgICAgICAgIHVuc2V0KCRwYXJ0c1swXSk7CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHBhcnRzIGFzICRwYXJ0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRzaG9ydGFnZSA9IDQgLSBtYl9zdHJsZW4oJGxpbmUsICd1dGYtOCcpICUgNDsKCiAgICAgICAgICAgICAgICAgICAgJGxpbmUgLj0gc3RyX3JlcGVhdCgnICcsICRzaG9ydGFnZSk7CiAgICAgICAgICAgICAgICAgICAgJGxpbmUgLj0gJHBhcnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRpbmRlbnQgPSAwOwoKICAgICAgICAgICAgd2hpbGUgKGlzc2V0KCRsaW5lWyRpbmRlbnRdKSBhbmQgJGxpbmVbJGluZGVudF0gPT09ICcgJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGluZGVudCArKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRleHQgPSAkaW5kZW50ID4gMCA/IHN1YnN0cigkbGluZSwgJGluZGVudCkgOiAkbGluZTsKCiAgICAgICAgICAgICMgfgoKICAgICAgICAgICAgJExpbmUgPSBhcnJheSgnYm9keScgPT4gJGxpbmUsICdpbmRlbnQnID0+ICRpbmRlbnQsICd0ZXh0JyA9PiAkdGV4dCk7CgogICAgICAgICAgICAjIH4KCiAgICAgICAgICAgIGlmIChpc3NldCgkQ3VycmVudEJsb2NrWydpbmNvbXBsZXRlJ10pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQmxvY2sgPSAkdGhpcy0+eydibG9jaycuJEN1cnJlbnRCbG9ja1sndHlwZSddLidDb250aW51ZSd9KCRMaW5lLCAkQ3VycmVudEJsb2NrKTsKCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJEJsb2NrKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEJsb2NrID0gJEJsb2NrOwoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kX2V4aXN0cygkdGhpcywgJ2Jsb2NrJy4kQ3VycmVudEJsb2NrWyd0eXBlJ10uJ0NvbXBsZXRlJykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEJsb2NrID0gJHRoaXMtPnsnYmxvY2snLiRDdXJyZW50QmxvY2tbJ3R5cGUnXS4nQ29tcGxldGUnfSgkQ3VycmVudEJsb2NrKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRDdXJyZW50QmxvY2tbJ2luY29tcGxldGUnXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgfgoKICAgICAgICAgICAgJG1hcmtlciA9ICR0ZXh0WzBdOwoKICAgICAgICAgICAgIyB+CgogICAgICAgICAgICAkYmxvY2tUeXBlcyA9ICR0aGlzLT51bm1hcmtlZEJsb2NrVHlwZXM7CgogICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPkJsb2NrVHlwZXNbJG1hcmtlcl0pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+QmxvY2tUeXBlc1skbWFya2VyXSBhcyAkYmxvY2tUeXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRibG9ja1R5cGVzIFtdPSAkYmxvY2tUeXBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgfgoKICAgICAgICAgICAgZm9yZWFjaCAoJGJsb2NrVHlwZXMgYXMgJGJsb2NrVHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEJsb2NrID0gJHRoaXMtPnsnYmxvY2snLiRibG9ja1R5cGV9KCRMaW5lLCAkQ3VycmVudEJsb2NrKTsKCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJEJsb2NrKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkQmxvY2tbJ3R5cGUnXSA9ICRibG9ja1R5cGU7CgogICAgICAgICAgICAgICAgICAgIGlmICggISBpc3NldCgkQmxvY2tbJ2lkZW50aWZpZWQnXSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkQmxvY2tzIFtdPSAkQ3VycmVudEJsb2NrOwoKICAgICAgICAgICAgICAgICAgICAgICAgJEJsb2NrWydpZGVudGlmaWVkJ10gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICdibG9jaycuJGJsb2NrVHlwZS4nQ29udGludWUnKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRCbG9ja1snaW5jb21wbGV0ZSddID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRDdXJyZW50QmxvY2sgPSAkQmxvY2s7CgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgfgoKICAgICAgICAgICAgaWYgKGlzc2V0KCRDdXJyZW50QmxvY2spIGFuZCAhIGlzc2V0KCRDdXJyZW50QmxvY2tbJ3R5cGUnXSkgYW5kICEgaXNzZXQoJEN1cnJlbnRCbG9ja1snaW50ZXJydXB0ZWQnXSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRDdXJyZW50QmxvY2tbJ2VsZW1lbnQnXVsndGV4dCddIC49ICJcbiIuJHRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQmxvY2tzIFtdPSAkQ3VycmVudEJsb2NrOwoKICAgICAgICAgICAgICAgICRDdXJyZW50QmxvY2sgPSAkdGhpcy0+cGFyYWdyYXBoKCRMaW5lKTsKCiAgICAgICAgICAgICAgICAkQ3VycmVudEJsb2NrWydpZGVudGlmaWVkJ10gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIH4KCiAgICAgICAgaWYgKGlzc2V0KCRDdXJyZW50QmxvY2tbJ2luY29tcGxldGUnXSkgYW5kIG1ldGhvZF9leGlzdHMoJHRoaXMsICdibG9jaycuJEN1cnJlbnRCbG9ja1sndHlwZSddLidDb21wbGV0ZScpKQogICAgICAgIHsKICAgICAgICAgICAgJEN1cnJlbnRCbG9jayA9ICR0aGlzLT57J2Jsb2NrJy4kQ3VycmVudEJsb2NrWyd0eXBlJ10uJ0NvbXBsZXRlJ30oJEN1cnJlbnRCbG9jayk7CiAgICAgICAgfQoKICAgICAgICAjIH4KCiAgICAgICAgJEJsb2NrcyBbXT0gJEN1cnJlbnRCbG9jazsKCiAgICAgICAgdW5zZXQoJEJsb2Nrc1swXSk7CgogICAgICAgICMgfgoKICAgICAgICAkbWFya3VwID0gJyc7CgogICAgICAgIGZvcmVhY2ggKCRCbG9ja3MgYXMgJEJsb2NrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCRCbG9ja1snaGlkZGVuJ10pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG1hcmt1cCAuPSAiXG4iOwogICAgICAgICAgICAkbWFya3VwIC49IGlzc2V0KCRCbG9ja1snbWFya3VwJ10pID8gJEJsb2NrWydtYXJrdXAnXSA6ICR0aGlzLT5lbGVtZW50KCRCbG9ja1snZWxlbWVudCddKTsKICAgICAgICB9CgogICAgICAgICRtYXJrdXAgLj0gIlxuIjsKCiAgICAgICAgIyB+CgogICAgICAgIHJldHVybiAkbWFya3VwOwogICAgfQoKICAgICMKICAgICMgQ29kZQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBibG9ja0NvZGUoJExpbmUsICRCbG9jayA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCRCbG9jaykgYW5kICEgaXNzZXQoJEJsb2NrWyd0eXBlJ10pIGFuZCAhIGlzc2V0KCRCbG9ja1snaW50ZXJydXB0ZWQnXSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoJExpbmVbJ2luZGVudCddID49IDQpCiAgICAgICAgewogICAgICAgICAgICAkdGV4dCA9IHN1YnN0cigkTGluZVsnYm9keSddLCA0KTsKCiAgICAgICAgICAgICRCbG9jayA9IGFycmF5KAogICAgICAgICAgICAgICAgJ2VsZW1lbnQnID0+IGFycmF5KAogICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAncHJlJywKICAgICAgICAgICAgICAgICAgICAnaGFuZGxlcicgPT4gJ2VsZW1lbnQnLAogICAgICAgICAgICAgICAgICAgICd0ZXh0JyA9PiBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+ICdjb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQnID0+ICR0ZXh0LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRCbG9jazsKICAgICAgICB9CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJsb2NrQ29kZUNvbnRpbnVlKCRMaW5lLCAkQmxvY2spCiAgICB7CiAgICAgICAgaWYgKCRMaW5lWydpbmRlbnQnXSA+PSA0KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCRCbG9ja1snaW50ZXJydXB0ZWQnXSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRCbG9ja1snZWxlbWVudCddWyd0ZXh0J11bJ3RleHQnXSAuPSAiXG4iOwoKICAgICAgICAgICAgICAgIHVuc2V0KCRCbG9ja1snaW50ZXJydXB0ZWQnXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRCbG9ja1snZWxlbWVudCddWyd0ZXh0J11bJ3RleHQnXSAuPSAiXG4iOwoKICAgICAgICAgICAgJHRleHQgPSBzdWJzdHIoJExpbmVbJ2JvZHknXSwgNCk7CgogICAgICAgICAgICAkQmxvY2tbJ2VsZW1lbnQnXVsndGV4dCddWyd0ZXh0J10gLj0gJHRleHQ7CgogICAgICAgICAgICByZXR1cm4gJEJsb2NrOwogICAgICAgIH0KICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tDb2RlQ29tcGxldGUoJEJsb2NrKQogICAgewogICAgICAgICR0ZXh0ID0gJEJsb2NrWydlbGVtZW50J11bJ3RleHQnXVsndGV4dCddOwoKICAgICAgICAkdGV4dCA9IGh0bWxzcGVjaWFsY2hhcnMoJHRleHQsIEVOVF9OT1FVT1RFUywgJ1VURi04Jyk7CgogICAgICAgICRCbG9ja1snZWxlbWVudCddWyd0ZXh0J11bJ3RleHQnXSA9ICR0ZXh0OwoKICAgICAgICByZXR1cm4gJEJsb2NrOwogICAgfQoKICAgICMKICAgICMgQ29tbWVudAoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBibG9ja0NvbW1lbnQoJExpbmUpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5tYXJrdXBFc2NhcGVkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCRMaW5lWyd0ZXh0J11bM10pIGFuZCAkTGluZVsndGV4dCddWzNdID09PSAnLScgYW5kICRMaW5lWyd0ZXh0J11bMl0gPT09ICctJyBhbmQgJExpbmVbJ3RleHQnXVsxXSA9PT0gJyEnKQogICAgICAgIHsKICAgICAgICAgICAgJEJsb2NrID0gYXJyYXkoCiAgICAgICAgICAgICAgICAnbWFya3VwJyA9PiAkTGluZVsnYm9keSddLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy8tLT4kLycsICRMaW5lWyd0ZXh0J10pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQmxvY2tbJ2Nsb3NlZCddID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRCbG9jazsKICAgICAgICB9CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJsb2NrQ29tbWVudENvbnRpbnVlKCRMaW5lLCBhcnJheSAkQmxvY2spCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCRCbG9ja1snY2xvc2VkJ10pKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJEJsb2NrWydtYXJrdXAnXSAuPSAiXG4iIC4gJExpbmVbJ2JvZHknXTsKCiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy8tLT4kLycsICRMaW5lWyd0ZXh0J10pKQogICAgICAgIHsKICAgICAgICAgICAgJEJsb2NrWydjbG9zZWQnXSA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJEJsb2NrOwogICAgfQoKICAgICMKICAgICMgRmVuY2VkIENvZGUKCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tGZW5jZWRDb2RlKCRMaW5lKQogICAgewogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXihbJy4kTGluZVsndGV4dCddWzBdLiddezMsfSlbIF0qKFtcdy1dKyk/WyBdKiQvJywgJExpbmVbJ3RleHQnXSwgJG1hdGNoZXMpKQogICAgICAgIHsKICAgICAgICAgICAgJEVsZW1lbnQgPSBhcnJheSgKICAgICAgICAgICAgICAgICduYW1lJyA9PiAnY29kZScsCiAgICAgICAgICAgICAgICAndGV4dCcgPT4gJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoaXNzZXQoJG1hdGNoZXNbMl0pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkY2xhc3MgPSAnbGFuZ3VhZ2UtJy4kbWF0Y2hlc1syXTsKCiAgICAgICAgICAgICAgICAkRWxlbWVudFsnYXR0cmlidXRlcyddID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ2NsYXNzJyA9PiAkY2xhc3MsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQmxvY2sgPSBhcnJheSgKICAgICAgICAgICAgICAgICdjaGFyJyA9PiAkTGluZVsndGV4dCddWzBdLAogICAgICAgICAgICAgICAgJ2VsZW1lbnQnID0+IGFycmF5KAogICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAncHJlJywKICAgICAgICAgICAgICAgICAgICAnaGFuZGxlcicgPT4gJ2VsZW1lbnQnLAogICAgICAgICAgICAgICAgICAgICd0ZXh0JyA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJEJsb2NrOwogICAgICAgIH0KICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tGZW5jZWRDb2RlQ29udGludWUoJExpbmUsICRCbG9jaykKICAgIHsKICAgICAgICBpZiAoaXNzZXQoJEJsb2NrWydjb21wbGV0ZSddKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkQmxvY2tbJ2ludGVycnVwdGVkJ10pKQogICAgICAgIHsKICAgICAgICAgICAgJEJsb2NrWydlbGVtZW50J11bJ3RleHQnXVsndGV4dCddIC49ICJcbiI7CgogICAgICAgICAgICB1bnNldCgkQmxvY2tbJ2ludGVycnVwdGVkJ10pOwogICAgICAgIH0KCiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9eJy4kQmxvY2tbJ2NoYXInXS4nezMsfVsgXSokLycsICRMaW5lWyd0ZXh0J10pKQogICAgICAgIHsKICAgICAgICAgICAgJEJsb2NrWydlbGVtZW50J11bJ3RleHQnXVsndGV4dCddID0gc3Vic3RyKCRCbG9ja1snZWxlbWVudCddWyd0ZXh0J11bJ3RleHQnXSwgMSk7CgogICAgICAgICAgICAkQmxvY2tbJ2NvbXBsZXRlJ10gPSB0cnVlOwoKICAgICAgICAgICAgcmV0dXJuICRCbG9jazsKICAgICAgICB9CgogICAgICAgICRCbG9ja1snZWxlbWVudCddWyd0ZXh0J11bJ3RleHQnXSAuPSAiXG4iLiRMaW5lWydib2R5J107OwoKICAgICAgICByZXR1cm4gJEJsb2NrOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBibG9ja0ZlbmNlZENvZGVDb21wbGV0ZSgkQmxvY2spCiAgICB7CiAgICAgICAgJHRleHQgPSAkQmxvY2tbJ2VsZW1lbnQnXVsndGV4dCddWyd0ZXh0J107CgogICAgICAgICR0ZXh0ID0gaHRtbHNwZWNpYWxjaGFycygkdGV4dCwgRU5UX05PUVVPVEVTLCAnVVRGLTgnKTsKCiAgICAgICAgJEJsb2NrWydlbGVtZW50J11bJ3RleHQnXVsndGV4dCddID0gJHRleHQ7CgogICAgICAgIHJldHVybiAkQmxvY2s7CiAgICB9CgogICAgIwogICAgIyBIZWFkZXIKCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tIZWFkZXIoJExpbmUpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCRMaW5lWyd0ZXh0J11bMV0pKQogICAgICAgIHsKICAgICAgICAgICAgJGxldmVsID0gMTsKCiAgICAgICAgICAgIHdoaWxlIChpc3NldCgkTGluZVsndGV4dCddWyRsZXZlbF0pIGFuZCAkTGluZVsndGV4dCddWyRsZXZlbF0gPT09ICcjJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGxldmVsICsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGxldmVsID4gNikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGV4dCA9IHRyaW0oJExpbmVbJ3RleHQnXSwgJyMgJyk7CgogICAgICAgICAgICAkQmxvY2sgPSBhcnJheSgKICAgICAgICAgICAgICAgICdlbGVtZW50JyA9PiBhcnJheSgKICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJ2gnIC4gbWluKDYsICRsZXZlbCksCiAgICAgICAgICAgICAgICAgICAgJ3RleHQnID0+ICR0ZXh0LAogICAgICAgICAgICAgICAgICAgICdoYW5kbGVyJyA9PiAnbGluZScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRCbG9jazsKICAgICAgICB9CiAgICB9CgogICAgIwogICAgIyBMaXN0CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJsb2NrTGlzdCgkTGluZSkKICAgIHsKICAgICAgICBsaXN0KCRuYW1lLCAkcGF0dGVybikgPSAkTGluZVsndGV4dCddWzBdIDw9ICctJyA/IGFycmF5KCd1bCcsICdbKistXScpIDogYXJyYXkoJ29sJywgJ1swLTldK1suXScpOwoKICAgICAgICBpZiAocHJlZ19tYXRjaCgnL14oJy4kcGF0dGVybi4nWyBdKykoLiopLycsICRMaW5lWyd0ZXh0J10sICRtYXRjaGVzKSkKICAgICAgICB7CiAgICAgICAgICAgICRCbG9jayA9IGFycmF5KAogICAgICAgICAgICAgICAgJ2luZGVudCcgPT4gJExpbmVbJ2luZGVudCddLAogICAgICAgICAgICAgICAgJ3BhdHRlcm4nID0+ICRwYXR0ZXJuLAogICAgICAgICAgICAgICAgJ2VsZW1lbnQnID0+IGFycmF5KAogICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAkbmFtZSwKICAgICAgICAgICAgICAgICAgICAnaGFuZGxlcicgPT4gJ2VsZW1lbnRzJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQmxvY2tbJ2xpJ10gPSBhcnJheSgKICAgICAgICAgICAgICAgICduYW1lJyA9PiAnbGknLAogICAgICAgICAgICAgICAgJ2hhbmRsZXInID0+ICdsaScsCiAgICAgICAgICAgICAgICAndGV4dCcgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJG1hdGNoZXNbMl0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJEJsb2NrWydlbGVtZW50J11bJ3RleHQnXSBbXT0gJiAkQmxvY2tbJ2xpJ107CgogICAgICAgICAgICByZXR1cm4gJEJsb2NrOwogICAgICAgIH0KICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tMaXN0Q29udGludWUoJExpbmUsIGFycmF5ICRCbG9jaykKICAgIHsKICAgICAgICBpZiAoJEJsb2NrWydpbmRlbnQnXSA9PT0gJExpbmVbJ2luZGVudCddIGFuZCBwcmVnX21hdGNoKCcvXicuJEJsb2NrWydwYXR0ZXJuJ10uJyg/OlsgXSsoLiopfCQpLycsICRMaW5lWyd0ZXh0J10sICRtYXRjaGVzKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpc3NldCgkQmxvY2tbJ2ludGVycnVwdGVkJ10pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQmxvY2tbJ2xpJ11bJ3RleHQnXSBbXT0gJyc7CgogICAgICAgICAgICAgICAgdW5zZXQoJEJsb2NrWydpbnRlcnJ1cHRlZCddKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdW5zZXQoJEJsb2NrWydsaSddKTsKCiAgICAgICAgICAgICR0ZXh0ID0gaXNzZXQoJG1hdGNoZXNbMV0pID8gJG1hdGNoZXNbMV0gOiAnJzsKCiAgICAgICAgICAgICRCbG9ja1snbGknXSA9IGFycmF5KAogICAgICAgICAgICAgICAgJ25hbWUnID0+ICdsaScsCiAgICAgICAgICAgICAgICAnaGFuZGxlcicgPT4gJ2xpJywKICAgICAgICAgICAgICAgICd0ZXh0JyA9PiBhcnJheSgKICAgICAgICAgICAgICAgICAgICAkdGV4dCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQmxvY2tbJ2VsZW1lbnQnXVsndGV4dCddIFtdPSAmICRCbG9ja1snbGknXTsKCiAgICAgICAgICAgIHJldHVybiAkQmxvY2s7CiAgICAgICAgfQoKICAgICAgICBpZiAoJExpbmVbJ3RleHQnXVswXSA9PT0gJ1snIGFuZCAkdGhpcy0+YmxvY2tSZWZlcmVuY2UoJExpbmUpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRCbG9jazsKICAgICAgICB9CgogICAgICAgIGlmICggISBpc3NldCgkQmxvY2tbJ2ludGVycnVwdGVkJ10pKQogICAgICAgIHsKICAgICAgICAgICAgJHRleHQgPSBwcmVnX3JlcGxhY2UoJy9eWyBdezAsNH0vJywgJycsICRMaW5lWydib2R5J10pOwoKICAgICAgICAgICAgJEJsb2NrWydsaSddWyd0ZXh0J10gW109ICR0ZXh0OwoKICAgICAgICAgICAgcmV0dXJuICRCbG9jazsKICAgICAgICB9CgogICAgICAgIGlmICgkTGluZVsnaW5kZW50J10gPiAwKQogICAgICAgIHsKICAgICAgICAgICAgJEJsb2NrWydsaSddWyd0ZXh0J10gW109ICcnOwoKICAgICAgICAgICAgJHRleHQgPSBwcmVnX3JlcGxhY2UoJy9eWyBdezAsNH0vJywgJycsICRMaW5lWydib2R5J10pOwoKICAgICAgICAgICAgJEJsb2NrWydsaSddWyd0ZXh0J10gW109ICR0ZXh0OwoKICAgICAgICAgICAgdW5zZXQoJEJsb2NrWydpbnRlcnJ1cHRlZCddKTsKCiAgICAgICAgICAgIHJldHVybiAkQmxvY2s7CiAgICAgICAgfQogICAgfQoKICAgICMKICAgICMgUXVvdGUKCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tRdW90ZSgkTGluZSkKICAgIHsKICAgICAgICBpZiAocHJlZ19tYXRjaCgnL14+WyBdPyguKikvJywgJExpbmVbJ3RleHQnXSwgJG1hdGNoZXMpKQogICAgICAgIHsKICAgICAgICAgICAgJEJsb2NrID0gYXJyYXkoCiAgICAgICAgICAgICAgICAnZWxlbWVudCcgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+ICdibG9ja3F1b3RlJywKICAgICAgICAgICAgICAgICAgICAnaGFuZGxlcicgPT4gJ2xpbmVzJywKICAgICAgICAgICAgICAgICAgICAndGV4dCcgPT4gKGFycmF5KSAkbWF0Y2hlc1sxXSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJEJsb2NrOwogICAgICAgIH0KICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tRdW90ZUNvbnRpbnVlKCRMaW5lLCBhcnJheSAkQmxvY2spCiAgICB7CiAgICAgICAgaWYgKCRMaW5lWyd0ZXh0J11bMF0gPT09ICc+JyBhbmQgcHJlZ19tYXRjaCgnL14+WyBdPyguKikvJywgJExpbmVbJ3RleHQnXSwgJG1hdGNoZXMpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCRCbG9ja1snaW50ZXJydXB0ZWQnXSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRCbG9ja1snZWxlbWVudCddWyd0ZXh0J10gW109ICcnOwoKICAgICAgICAgICAgICAgIHVuc2V0KCRCbG9ja1snaW50ZXJydXB0ZWQnXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRCbG9ja1snZWxlbWVudCddWyd0ZXh0J10gW109ICRtYXRjaGVzWzFdOwoKICAgICAgICAgICAgcmV0dXJuICRCbG9jazsKICAgICAgICB9CgogICAgICAgIGlmICggISBpc3NldCgkQmxvY2tbJ2ludGVycnVwdGVkJ10pKQogICAgICAgIHsKICAgICAgICAgICAgJEJsb2NrWydlbGVtZW50J11bJ3RleHQnXSBbXT0gJExpbmVbJ3RleHQnXTsKCiAgICAgICAgICAgIHJldHVybiAkQmxvY2s7CiAgICAgICAgfQogICAgfQoKICAgICMKICAgICMgUnVsZQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBibG9ja1J1bGUoJExpbmUpCiAgICB7CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9eKFsnLiRMaW5lWyd0ZXh0J11bMF0uJ10pKFsgXSpcMSl7Mix9WyBdKiQvJywgJExpbmVbJ3RleHQnXSkpCiAgICAgICAgewogICAgICAgICAgICAkQmxvY2sgPSBhcnJheSgKICAgICAgICAgICAgICAgICdlbGVtZW50JyA9PiBhcnJheSgKICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJ2hyJwogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkQmxvY2s7CiAgICAgICAgfQogICAgfQoKICAgICMKICAgICMgU2V0ZXh0CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJsb2NrU2V0ZXh0SGVhZGVyKCRMaW5lLCBhcnJheSAkQmxvY2sgPSBudWxsKQogICAgewogICAgICAgIGlmICggISBpc3NldCgkQmxvY2spIG9yIGlzc2V0KCRCbG9ja1sndHlwZSddKSBvciBpc3NldCgkQmxvY2tbJ2ludGVycnVwdGVkJ10pKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNob3AoJExpbmVbJ3RleHQnXSwgJExpbmVbJ3RleHQnXVswXSkgPT09ICcnKQogICAgICAgIHsKICAgICAgICAgICAgJEJsb2NrWydlbGVtZW50J11bJ25hbWUnXSA9ICRMaW5lWyd0ZXh0J11bMF0gPT09ICc9JyA/ICdoMScgOiAnaDInOwoKICAgICAgICAgICAgcmV0dXJuICRCbG9jazsKICAgICAgICB9CiAgICB9CgogICAgIwogICAgIyBNYXJrdXAKCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tNYXJrdXAoJExpbmUpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5tYXJrdXBFc2NhcGVkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9ePChcdyopKD86WyBdKicuJHRoaXMtPnJlZ2V4SHRtbEF0dHJpYnV0ZS4nKSpbIF0qKFwvKT8+LycsICRMaW5lWyd0ZXh0J10sICRtYXRjaGVzKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpbl9hcnJheSgkbWF0Y2hlc1sxXSwgJHRoaXMtPnRleHRMZXZlbEVsZW1lbnRzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQmxvY2sgPSBhcnJheSgKICAgICAgICAgICAgICAgICduYW1lJyA9PiAkbWF0Y2hlc1sxXSwKICAgICAgICAgICAgICAgICdkZXB0aCcgPT4gMCwKICAgICAgICAgICAgICAgICdtYXJrdXAnID0+ICRMaW5lWyd0ZXh0J10sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkbGVuZ3RoID0gc3RybGVuKCRtYXRjaGVzWzBdKTsKCiAgICAgICAgICAgICRyZW1haW5kZXIgPSBzdWJzdHIoJExpbmVbJ3RleHQnXSwgJGxlbmd0aCk7CgogICAgICAgICAgICBpZiAodHJpbSgkcmVtYWluZGVyKSA9PT0gJycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkbWF0Y2hlc1syXSkgb3IgaW5fYXJyYXkoJG1hdGNoZXNbMV0sICR0aGlzLT52b2lkRWxlbWVudHMpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRCbG9ja1snY2xvc2VkJ10gPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAkQmxvY2tbJ3ZvaWQnXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJG1hdGNoZXNbMl0pIG9yIGluX2FycmF5KCRtYXRjaGVzWzFdLCAkdGhpcy0+dm9pZEVsZW1lbnRzKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy88XC8nLiRtYXRjaGVzWzFdLic+WyBdKiQvaScsICRyZW1haW5kZXIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRCbG9ja1snY2xvc2VkJ10gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJEJsb2NrOwogICAgICAgIH0KICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tNYXJrdXBDb250aW51ZSgkTGluZSwgYXJyYXkgJEJsb2NrKQogICAgewogICAgICAgIGlmIChpc3NldCgkQmxvY2tbJ2Nsb3NlZCddKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXjwnLiRCbG9ja1snbmFtZSddLicoPzpbIF0qJy4kdGhpcy0+cmVnZXhIdG1sQXR0cmlidXRlLicpKlsgXSo+L2knLCAkTGluZVsndGV4dCddKSkgIyBvcGVuCiAgICAgICAgewogICAgICAgICAgICAkQmxvY2tbJ2RlcHRoJ10gKys7CiAgICAgICAgfQoKICAgICAgICBpZiAocHJlZ19tYXRjaCgnLyguKj8pPFwvJy4kQmxvY2tbJ25hbWUnXS4nPlsgXSokL2knLCAkTGluZVsndGV4dCddLCAkbWF0Y2hlcykpICMgY2xvc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkQmxvY2tbJ2RlcHRoJ10gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQmxvY2tbJ2RlcHRoJ10gLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQmxvY2tbJ2Nsb3NlZCddID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCRCbG9ja1snaW50ZXJydXB0ZWQnXSkpCiAgICAgICAgewogICAgICAgICAgICAkQmxvY2tbJ21hcmt1cCddIC49ICJcbiI7CgogICAgICAgICAgICB1bnNldCgkQmxvY2tbJ2ludGVycnVwdGVkJ10pOwogICAgICAgIH0KCiAgICAgICAgJEJsb2NrWydtYXJrdXAnXSAuPSAiXG4iLiRMaW5lWydib2R5J107CgogICAgICAgIHJldHVybiAkQmxvY2s7CiAgICB9CgogICAgIwogICAgIyBSZWZlcmVuY2UKCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tSZWZlcmVuY2UoJExpbmUpCiAgICB7CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9eXFsoLis/KVxdOlsgXSo8PyhcUys/KT4/KD86WyBdK1siXCcoXSguKylbIlwnKV0pP1sgXSokLycsICRMaW5lWyd0ZXh0J10sICRtYXRjaGVzKSkKICAgICAgICB7CiAgICAgICAgICAgICRpZCA9IHN0cnRvbG93ZXIoJG1hdGNoZXNbMV0pOwoKICAgICAgICAgICAgJERhdGEgPSBhcnJheSgKICAgICAgICAgICAgICAgICd1cmwnID0+ICRtYXRjaGVzWzJdLAogICAgICAgICAgICAgICAgJ3RpdGxlJyA9PiBudWxsLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKGlzc2V0KCRtYXRjaGVzWzNdKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJERhdGFbJ3RpdGxlJ10gPSAkbWF0Y2hlc1szXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPkRlZmluaXRpb25EYXRhWydSZWZlcmVuY2UnXVskaWRdID0gJERhdGE7CgogICAgICAgICAgICAkQmxvY2sgPSBhcnJheSgKICAgICAgICAgICAgICAgICdoaWRkZW4nID0+IHRydWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJEJsb2NrOwogICAgICAgIH0KICAgIH0KCiAgICAjCiAgICAjIFRhYmxlCgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJsb2NrVGFibGUoJExpbmUsIGFycmF5ICRCbG9jayA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCAhIGlzc2V0KCRCbG9jaykgb3IgaXNzZXQoJEJsb2NrWyd0eXBlJ10pIG9yIGlzc2V0KCRCbG9ja1snaW50ZXJydXB0ZWQnXSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RycG9zKCRCbG9ja1snZWxlbWVudCddWyd0ZXh0J10sICd8JykgIT09IGZhbHNlIGFuZCBjaG9wKCRMaW5lWyd0ZXh0J10sICcgLTp8JykgPT09ICcnKQogICAgICAgIHsKICAgICAgICAgICAgJGFsaWdubWVudHMgPSBhcnJheSgpOwoKICAgICAgICAgICAgJGRpdmlkZXIgPSAkTGluZVsndGV4dCddOwoKICAgICAgICAgICAgJGRpdmlkZXIgPSB0cmltKCRkaXZpZGVyKTsKICAgICAgICAgICAgJGRpdmlkZXIgPSB0cmltKCRkaXZpZGVyLCAnfCcpOwoKICAgICAgICAgICAgJGRpdmlkZXJDZWxscyA9IGV4cGxvZGUoJ3wnLCAkZGl2aWRlcik7CgogICAgICAgICAgICBmb3JlYWNoICgkZGl2aWRlckNlbGxzIGFzICRkaXZpZGVyQ2VsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGRpdmlkZXJDZWxsID0gdHJpbSgkZGl2aWRlckNlbGwpOwoKICAgICAgICAgICAgICAgIGlmICgkZGl2aWRlckNlbGwgPT09ICcnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRhbGlnbm1lbnQgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICgkZGl2aWRlckNlbGxbMF0gPT09ICc6JykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkYWxpZ25tZW50ID0gJ2xlZnQnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzdWJzdHIoJGRpdmlkZXJDZWxsLCAtIDEpID09PSAnOicpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJGFsaWdubWVudCA9ICRhbGlnbm1lbnQgPT09ICdsZWZ0JyA/ICdjZW50ZXInIDogJ3JpZ2h0JzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkYWxpZ25tZW50cyBbXT0gJGFsaWdubWVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB+CgogICAgICAgICAgICAkSGVhZGVyRWxlbWVudHMgPSBhcnJheSgpOwoKICAgICAgICAgICAgJGhlYWRlciA9ICRCbG9ja1snZWxlbWVudCddWyd0ZXh0J107CgogICAgICAgICAgICAkaGVhZGVyID0gdHJpbSgkaGVhZGVyKTsKICAgICAgICAgICAgJGhlYWRlciA9IHRyaW0oJGhlYWRlciwgJ3wnKTsKCiAgICAgICAgICAgICRoZWFkZXJDZWxscyA9IGV4cGxvZGUoJ3wnLCAkaGVhZGVyKTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRoZWFkZXJDZWxscyBhcyAkaW5kZXggPT4gJGhlYWRlckNlbGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRoZWFkZXJDZWxsID0gdHJpbSgkaGVhZGVyQ2VsbCk7CgogICAgICAgICAgICAgICAgJEhlYWRlckVsZW1lbnQgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJ3RoJywKICAgICAgICAgICAgICAgICAgICAndGV4dCcgPT4gJGhlYWRlckNlbGwsCiAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZXInID0+ICdsaW5lJywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRhbGlnbm1lbnRzWyRpbmRleF0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRhbGlnbm1lbnQgPSAkYWxpZ25tZW50c1skaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAkSGVhZGVyRWxlbWVudFsnYXR0cmlidXRlcyddID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICdzdHlsZScgPT4gJ3RleHQtYWxpZ246ICcuJGFsaWdubWVudC4nOycsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkSGVhZGVyRWxlbWVudHMgW109ICRIZWFkZXJFbGVtZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIH4KCiAgICAgICAgICAgICRCbG9jayA9IGFycmF5KAogICAgICAgICAgICAgICAgJ2FsaWdubWVudHMnID0+ICRhbGlnbm1lbnRzLAogICAgICAgICAgICAgICAgJ2lkZW50aWZpZWQnID0+IHRydWUsCiAgICAgICAgICAgICAgICAnZWxlbWVudCcgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+ICd0YWJsZScsCiAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZXInID0+ICdlbGVtZW50cycsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJEJsb2NrWydlbGVtZW50J11bJ3RleHQnXSBbXT0gYXJyYXkoCiAgICAgICAgICAgICAgICAnbmFtZScgPT4gJ3RoZWFkJywKICAgICAgICAgICAgICAgICdoYW5kbGVyJyA9PiAnZWxlbWVudHMnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJEJsb2NrWydlbGVtZW50J11bJ3RleHQnXSBbXT0gYXJyYXkoCiAgICAgICAgICAgICAgICAnbmFtZScgPT4gJ3Rib2R5JywKICAgICAgICAgICAgICAgICdoYW5kbGVyJyA9PiAnZWxlbWVudHMnLAogICAgICAgICAgICAgICAgJ3RleHQnID0+IGFycmF5KCksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQmxvY2tbJ2VsZW1lbnQnXVsndGV4dCddWzBdWyd0ZXh0J10gW109IGFycmF5KAogICAgICAgICAgICAgICAgJ25hbWUnID0+ICd0cicsCiAgICAgICAgICAgICAgICAnaGFuZGxlcicgPT4gJ2VsZW1lbnRzJywKICAgICAgICAgICAgICAgICd0ZXh0JyA9PiAkSGVhZGVyRWxlbWVudHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJEJsb2NrOwogICAgICAgIH0KICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tUYWJsZUNvbnRpbnVlKCRMaW5lLCBhcnJheSAkQmxvY2spCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCRCbG9ja1snaW50ZXJydXB0ZWQnXSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoJExpbmVbJ3RleHQnXVswXSA9PT0gJ3wnIG9yIHN0cnBvcygkTGluZVsndGV4dCddLCAnfCcpKQogICAgICAgIHsKICAgICAgICAgICAgJEVsZW1lbnRzID0gYXJyYXkoKTsKCiAgICAgICAgICAgICRyb3cgPSAkTGluZVsndGV4dCddOwoKICAgICAgICAgICAgJHJvdyA9IHRyaW0oJHJvdyk7CiAgICAgICAgICAgICRyb3cgPSB0cmltKCRyb3csICd8Jyk7CgogICAgICAgICAgICBwcmVnX21hdGNoX2FsbCgnLyg/OihcXFxcW3xdKXxbXnxgXXxgW15gXStgfGApKy8nLCAkcm93LCAkbWF0Y2hlcyk7CgogICAgICAgICAgICBmb3JlYWNoICgkbWF0Y2hlc1swXSBhcyAkaW5kZXggPT4gJGNlbGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRjZWxsID0gdHJpbSgkY2VsbCk7CgogICAgICAgICAgICAgICAgJEVsZW1lbnQgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJ3RkJywKICAgICAgICAgICAgICAgICAgICAnaGFuZGxlcicgPT4gJ2xpbmUnLAogICAgICAgICAgICAgICAgICAgICd0ZXh0JyA9PiAkY2VsbCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRCbG9ja1snYWxpZ25tZW50cyddWyRpbmRleF0pKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRFbGVtZW50WydhdHRyaWJ1dGVzJ10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0eWxlJyA9PiAndGV4dC1hbGlnbjogJy4kQmxvY2tbJ2FsaWdubWVudHMnXVskaW5kZXhdLic7JywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRFbGVtZW50cyBbXT0gJEVsZW1lbnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRFbGVtZW50ID0gYXJyYXkoCiAgICAgICAgICAgICAgICAnbmFtZScgPT4gJ3RyJywKICAgICAgICAgICAgICAgICdoYW5kbGVyJyA9PiAnZWxlbWVudHMnLAogICAgICAgICAgICAgICAgJ3RleHQnID0+ICRFbGVtZW50cywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRCbG9ja1snZWxlbWVudCddWyd0ZXh0J11bMV1bJ3RleHQnXSBbXT0gJEVsZW1lbnQ7CgogICAgICAgICAgICByZXR1cm4gJEJsb2NrOwogICAgICAgIH0KICAgIH0KCiAgICAjCiAgICAjIH4KICAgICMKCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyYWdyYXBoKCRMaW5lKQogICAgewogICAgICAgICRCbG9jayA9IGFycmF5KAogICAgICAgICAgICAnZWxlbWVudCcgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAnbmFtZScgPT4gJ3AnLAogICAgICAgICAgICAgICAgJ3RleHQnID0+ICRMaW5lWyd0ZXh0J10sCiAgICAgICAgICAgICAgICAnaGFuZGxlcicgPT4gJ2xpbmUnLAogICAgICAgICAgICApLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkQmxvY2s7CiAgICB9CgogICAgIwogICAgIyBJbmxpbmUgRWxlbWVudHMKICAgICMKCiAgICBwcm90ZWN0ZWQgJElubGluZVR5cGVzID0gYXJyYXkoCiAgICAgICAgJyInID0+IGFycmF5KCdTcGVjaWFsQ2hhcmFjdGVyJyksCiAgICAgICAgJyEnID0+IGFycmF5KCdJbWFnZScpLAogICAgICAgICcmJyA9PiBhcnJheSgnU3BlY2lhbENoYXJhY3RlcicpLAogICAgICAgICcqJyA9PiBhcnJheSgnRW1waGFzaXMnKSwKICAgICAgICAnOicgPT4gYXJyYXkoJ1VybCcpLAogICAgICAgICc8JyA9PiBhcnJheSgnVXJsVGFnJywgJ0VtYWlsVGFnJywgJ01hcmt1cCcsICdTcGVjaWFsQ2hhcmFjdGVyJyksCiAgICAgICAgJz4nID0+IGFycmF5KCdTcGVjaWFsQ2hhcmFjdGVyJyksCiAgICAgICAgJ1snID0+IGFycmF5KCdMaW5rJyksCiAgICAgICAgJ18nID0+IGFycmF5KCdFbXBoYXNpcycpLAogICAgICAgICdgJyA9PiBhcnJheSgnQ29kZScpLAogICAgICAgICd+JyA9PiBhcnJheSgnU3RyaWtldGhyb3VnaCcpLAogICAgICAgICdcXCcgPT4gYXJyYXkoJ0VzY2FwZVNlcXVlbmNlJyksCiAgICApOwoKICAgICMgfgoKICAgIHByb3RlY3RlZCAkaW5saW5lTWFya2VyTGlzdCA9ICchIipfJls6PD5gflxcJzsKCiAgICAjCiAgICAjIH4KICAgICMKCiAgICBwdWJsaWMgZnVuY3Rpb24gbGluZSgkdGV4dCkKICAgIHsKICAgICAgICAkbWFya3VwID0gJyc7CgogICAgICAgICR1bmV4YW1pbmVkVGV4dCA9ICR0ZXh0OwoKICAgICAgICAkbWFya2VyUG9zaXRpb24gPSAwOwoKICAgICAgICB3aGlsZSAoJGV4Y2VycHQgPSBzdHJwYnJrKCR1bmV4YW1pbmVkVGV4dCwgJHRoaXMtPmlubGluZU1hcmtlckxpc3QpKQogICAgICAgIHsKICAgICAgICAgICAgJG1hcmtlciA9ICRleGNlcnB0WzBdOwoKICAgICAgICAgICAgJG1hcmtlclBvc2l0aW9uICs9IHN0cnBvcygkdW5leGFtaW5lZFRleHQsICRtYXJrZXIpOwoKICAgICAgICAgICAgJEV4Y2VycHQgPSBhcnJheSgndGV4dCcgPT4gJGV4Y2VycHQsICdjb250ZXh0JyA9PiAkdGV4dCk7CgogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+SW5saW5lVHlwZXNbJG1hcmtlcl0gYXMgJGlubGluZVR5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRJbmxpbmUgPSAkdGhpcy0+eydpbmxpbmUnLiRpbmxpbmVUeXBlfSgkRXhjZXJwdCk7CgogICAgICAgICAgICAgICAgaWYgKCAhIGlzc2V0KCRJbmxpbmUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkSW5saW5lWydwb3NpdGlvbiddKSBhbmQgJElubGluZVsncG9zaXRpb24nXSA+ICRtYXJrZXJQb3NpdGlvbikgIyBwb3NpdGlvbiBpcyBhaGVhZCBvZiBtYXJrZXIKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICEgaXNzZXQoJElubGluZVsncG9zaXRpb24nXSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJElubGluZVsncG9zaXRpb24nXSA9ICRtYXJrZXJQb3NpdGlvbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdW5tYXJrZWRUZXh0ID0gc3Vic3RyKCR0ZXh0LCAwLCAkSW5saW5lWydwb3NpdGlvbiddKTsKCiAgICAgICAgICAgICAgICAkbWFya3VwIC49ICR0aGlzLT51bm1hcmtlZFRleHQoJHVubWFya2VkVGV4dCk7CgogICAgICAgICAgICAgICAgJG1hcmt1cCAuPSBpc3NldCgkSW5saW5lWydtYXJrdXAnXSkgPyAkSW5saW5lWydtYXJrdXAnXSA6ICR0aGlzLT5lbGVtZW50KCRJbmxpbmVbJ2VsZW1lbnQnXSk7CgogICAgICAgICAgICAgICAgJHRleHQgPSBzdWJzdHIoJHRleHQsICRJbmxpbmVbJ3Bvc2l0aW9uJ10gKyAkSW5saW5lWydleHRlbnQnXSk7CgogICAgICAgICAgICAgICAgJHVuZXhhbWluZWRUZXh0ID0gJHRleHQ7CgogICAgICAgICAgICAgICAgJG1hcmtlclBvc2l0aW9uID0gMDsKCiAgICAgICAgICAgICAgICBjb250aW51ZSAyOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdW5leGFtaW5lZFRleHQgPSBzdWJzdHIoJGV4Y2VycHQsIDEpOwoKICAgICAgICAgICAgJG1hcmtlclBvc2l0aW9uICsrOwogICAgICAgIH0KCiAgICAgICAgJG1hcmt1cCAuPSAkdGhpcy0+dW5tYXJrZWRUZXh0KCR0ZXh0KTsKCiAgICAgICAgcmV0dXJuICRtYXJrdXA7CiAgICB9CgogICAgIwogICAgIyB+CiAgICAjCgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGlubGluZUNvZGUoJEV4Y2VycHQpCiAgICB7CiAgICAgICAgJG1hcmtlciA9ICRFeGNlcnB0Wyd0ZXh0J11bMF07CgogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXignLiRtYXJrZXIuJyspWyBdKiguKz8pWyBdKig/PCEnLiRtYXJrZXIuJylcMSg/IScuJG1hcmtlci4nKS9zJywgJEV4Y2VycHRbJ3RleHQnXSwgJG1hdGNoZXMpKQogICAgICAgIHsKICAgICAgICAgICAgJHRleHQgPSAkbWF0Y2hlc1syXTsKICAgICAgICAgICAgJHRleHQgPSBodG1sc3BlY2lhbGNoYXJzKCR0ZXh0LCBFTlRfTk9RVU9URVMsICdVVEYtOCcpOwogICAgICAgICAgICAkdGV4dCA9IHByZWdfcmVwbGFjZSgiL1sgXSpcbi8iLCAnICcsICR0ZXh0KTsKCiAgICAgICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgICAgICdleHRlbnQnID0+IHN0cmxlbigkbWF0Y2hlc1swXSksCiAgICAgICAgICAgICAgICAnZWxlbWVudCcgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+ICdjb2RlJywKICAgICAgICAgICAgICAgICAgICAndGV4dCcgPT4gJHRleHQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaW5saW5lRW1haWxUYWcoJEV4Y2VycHQpCiAgICB7CiAgICAgICAgaWYgKHN0cnBvcygkRXhjZXJwdFsndGV4dCddLCAnPicpICE9PSBmYWxzZSBhbmQgcHJlZ19tYXRjaCgnL148KChtYWlsdG86KT9cUys/QFxTKz8pPi9pJywgJEV4Y2VycHRbJ3RleHQnXSwgJG1hdGNoZXMpKQogICAgICAgIHsKICAgICAgICAgICAgJHVybCA9ICRtYXRjaGVzWzFdOwoKICAgICAgICAgICAgaWYgKCAhIGlzc2V0KCRtYXRjaGVzWzJdKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHVybCA9ICdtYWlsdG86JyAuICR1cmw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgICAgICdleHRlbnQnID0+IHN0cmxlbigkbWF0Y2hlc1swXSksCiAgICAgICAgICAgICAgICAnZWxlbWVudCcgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+ICdhJywKICAgICAgICAgICAgICAgICAgICAndGV4dCcgPT4gJG1hdGNoZXNbMV0sCiAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMnID0+IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAnaHJlZicgPT4gJHVybCwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGlubGluZUVtcGhhc2lzKCRFeGNlcnB0KQogICAgewogICAgICAgIGlmICggISBpc3NldCgkRXhjZXJwdFsndGV4dCddWzFdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRtYXJrZXIgPSAkRXhjZXJwdFsndGV4dCddWzBdOwoKICAgICAgICBpZiAoJEV4Y2VycHRbJ3RleHQnXVsxXSA9PT0gJG1hcmtlciBhbmQgcHJlZ19tYXRjaCgkdGhpcy0+U3Ryb25nUmVnZXhbJG1hcmtlcl0sICRFeGNlcnB0Wyd0ZXh0J10sICRtYXRjaGVzKSkKICAgICAgICB7CiAgICAgICAgICAgICRlbXBoYXNpcyA9ICdzdHJvbmcnOwogICAgICAgIH0KICAgICAgICBlbHNlaWYgKHByZWdfbWF0Y2goJHRoaXMtPkVtUmVnZXhbJG1hcmtlcl0sICRFeGNlcnB0Wyd0ZXh0J10sICRtYXRjaGVzKSkKICAgICAgICB7CiAgICAgICAgICAgICRlbXBoYXNpcyA9ICdlbSc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgJ2V4dGVudCcgPT4gc3RybGVuKCRtYXRjaGVzWzBdKSwKICAgICAgICAgICAgJ2VsZW1lbnQnID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ25hbWUnID0+ICRlbXBoYXNpcywKICAgICAgICAgICAgICAgICdoYW5kbGVyJyA9PiAnbGluZScsCiAgICAgICAgICAgICAgICAndGV4dCcgPT4gJG1hdGNoZXNbMV0sCiAgICAgICAgICAgICksCiAgICAgICAgKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaW5saW5lRXNjYXBlU2VxdWVuY2UoJEV4Y2VycHQpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCRFeGNlcnB0Wyd0ZXh0J11bMV0pIGFuZCBpbl9hcnJheSgkRXhjZXJwdFsndGV4dCddWzFdLCAkdGhpcy0+c3BlY2lhbENoYXJhY3RlcnMpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KAogICAgICAgICAgICAgICAgJ21hcmt1cCcgPT4gJEV4Y2VycHRbJ3RleHQnXVsxXSwKICAgICAgICAgICAgICAgICdleHRlbnQnID0+IDIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbmxpbmVJbWFnZSgkRXhjZXJwdCkKICAgIHsKICAgICAgICBpZiAoICEgaXNzZXQoJEV4Y2VycHRbJ3RleHQnXVsxXSkgb3IgJEV4Y2VycHRbJ3RleHQnXVsxXSAhPT0gJ1snKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJEV4Y2VycHRbJ3RleHQnXT0gc3Vic3RyKCRFeGNlcnB0Wyd0ZXh0J10sIDEpOwoKICAgICAgICAkTGluayA9ICR0aGlzLT5pbmxpbmVMaW5rKCRFeGNlcnB0KTsKCiAgICAgICAgaWYgKCRMaW5rID09PSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJElubGluZSA9IGFycmF5KAogICAgICAgICAgICAnZXh0ZW50JyA9PiAkTGlua1snZXh0ZW50J10gKyAxLAogICAgICAgICAgICAnZWxlbWVudCcgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAnbmFtZScgPT4gJ2ltZycsCiAgICAgICAgICAgICAgICAnYXR0cmlidXRlcycgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ3NyYycgPT4gJExpbmtbJ2VsZW1lbnQnXVsnYXR0cmlidXRlcyddWydocmVmJ10sCiAgICAgICAgICAgICAgICAgICAgJ2FsdCcgPT4gJExpbmtbJ2VsZW1lbnQnXVsndGV4dCddLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICAkSW5saW5lWydlbGVtZW50J11bJ2F0dHJpYnV0ZXMnXSArPSAkTGlua1snZWxlbWVudCddWydhdHRyaWJ1dGVzJ107CgogICAgICAgIHVuc2V0KCRJbmxpbmVbJ2VsZW1lbnQnXVsnYXR0cmlidXRlcyddWydocmVmJ10pOwoKICAgICAgICByZXR1cm4gJElubGluZTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaW5saW5lTGluaygkRXhjZXJwdCkKICAgIHsKICAgICAgICAkRWxlbWVudCA9IGFycmF5KAogICAgICAgICAgICAnbmFtZScgPT4gJ2EnLAogICAgICAgICAgICAnaGFuZGxlcicgPT4gJ2xpbmUnLAogICAgICAgICAgICAndGV4dCcgPT4gbnVsbCwKICAgICAgICAgICAgJ2F0dHJpYnV0ZXMnID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ2hyZWYnID0+IG51bGwsCiAgICAgICAgICAgICAgICAndGl0bGUnID0+IG51bGwsCiAgICAgICAgICAgICksCiAgICAgICAgKTsKCiAgICAgICAgJGV4dGVudCA9IDA7CgogICAgICAgICRyZW1haW5kZXIgPSAkRXhjZXJwdFsndGV4dCddOwoKICAgICAgICBpZiAocHJlZ19tYXRjaCgnL1xbKCg/OlteXVtdfCg/UikpKilcXS8nLCAkcmVtYWluZGVyLCAkbWF0Y2hlcykpCiAgICAgICAgewogICAgICAgICAgICAkRWxlbWVudFsndGV4dCddID0gJG1hdGNoZXNbMV07CgogICAgICAgICAgICAkZXh0ZW50ICs9IHN0cmxlbigkbWF0Y2hlc1swXSk7CgogICAgICAgICAgICAkcmVtYWluZGVyID0gc3Vic3RyKCRyZW1haW5kZXIsICRleHRlbnQpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAocHJlZ19tYXRjaCgnL15bKF0oKD86W14gKCldfFsoXVteICldK1spXSkrKSg/OlsgXSsoIlteIl0qInxcJ1teXCddKlwnKSk/WyldLycsICRyZW1haW5kZXIsICRtYXRjaGVzKSkKICAgICAgICB7CiAgICAgICAgICAgICRFbGVtZW50WydhdHRyaWJ1dGVzJ11bJ2hyZWYnXSA9ICRtYXRjaGVzWzFdOwoKICAgICAgICAgICAgaWYgKGlzc2V0KCRtYXRjaGVzWzJdKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVsZW1lbnRbJ2F0dHJpYnV0ZXMnXVsndGl0bGUnXSA9IHN1YnN0cigkbWF0Y2hlc1syXSwgMSwgLSAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGV4dGVudCArPSBzdHJsZW4oJG1hdGNoZXNbMF0pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL15ccypcWyguKj8pXF0vJywgJHJlbWFpbmRlciwgJG1hdGNoZXMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkZGVmaW5pdGlvbiA9ICRtYXRjaGVzWzFdID8gJG1hdGNoZXNbMV0gOiAkRWxlbWVudFsndGV4dCddOwogICAgICAgICAgICAgICAgJGRlZmluaXRpb24gPSBzdHJ0b2xvd2VyKCRkZWZpbml0aW9uKTsKCiAgICAgICAgICAgICAgICAkZXh0ZW50ICs9IHN0cmxlbigkbWF0Y2hlc1swXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkZGVmaW5pdGlvbiA9IHN0cnRvbG93ZXIoJEVsZW1lbnRbJ3RleHQnXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISBpc3NldCgkdGhpcy0+RGVmaW5pdGlvbkRhdGFbJ1JlZmVyZW5jZSddWyRkZWZpbml0aW9uXSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJERlZmluaXRpb24gPSAkdGhpcy0+RGVmaW5pdGlvbkRhdGFbJ1JlZmVyZW5jZSddWyRkZWZpbml0aW9uXTsKCiAgICAgICAgICAgICRFbGVtZW50WydhdHRyaWJ1dGVzJ11bJ2hyZWYnXSA9ICREZWZpbml0aW9uWyd1cmwnXTsKICAgICAgICAgICAgJEVsZW1lbnRbJ2F0dHJpYnV0ZXMnXVsndGl0bGUnXSA9ICREZWZpbml0aW9uWyd0aXRsZSddOwogICAgICAgIH0KCiAgICAgICAgJEVsZW1lbnRbJ2F0dHJpYnV0ZXMnXVsnaHJlZiddID0gc3RyX3JlcGxhY2UoYXJyYXkoJyYnLCAnPCcpLCBhcnJheSgnJmFtcDsnLCAnJmx0OycpLCAkRWxlbWVudFsnYXR0cmlidXRlcyddWydocmVmJ10pOwoKICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICdleHRlbnQnID0+ICRleHRlbnQsCiAgICAgICAgICAgICdlbGVtZW50JyA9PiAkRWxlbWVudCwKICAgICAgICApOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbmxpbmVNYXJrdXAoJEV4Y2VycHQpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5tYXJrdXBFc2NhcGVkIG9yIHN0cnBvcygkRXhjZXJwdFsndGV4dCddLCAnPicpID09PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkRXhjZXJwdFsndGV4dCddWzFdID09PSAnLycgYW5kIHByZWdfbWF0Y2goJy9ePFwvXHcqWyBdKj4vcycsICRFeGNlcnB0Wyd0ZXh0J10sICRtYXRjaGVzKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgICAgICdtYXJrdXAnID0+ICRtYXRjaGVzWzBdLAogICAgICAgICAgICAgICAgJ2V4dGVudCcgPT4gc3RybGVuKCRtYXRjaGVzWzBdKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgkRXhjZXJwdFsndGV4dCddWzFdID09PSAnIScgYW5kIHByZWdfbWF0Y2goJy9ePCEtLS0/W14+LV0oPzotP1teLV0pKi0tPi9zJywgJEV4Y2VycHRbJ3RleHQnXSwgJG1hdGNoZXMpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KAogICAgICAgICAgICAgICAgJ21hcmt1cCcgPT4gJG1hdGNoZXNbMF0sCiAgICAgICAgICAgICAgICAnZXh0ZW50JyA9PiBzdHJsZW4oJG1hdGNoZXNbMF0pLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRFeGNlcnB0Wyd0ZXh0J11bMV0gIT09ICcgJyBhbmQgcHJlZ19tYXRjaCgnL148XHcqKD86WyBdKicuJHRoaXMtPnJlZ2V4SHRtbEF0dHJpYnV0ZS4nKSpbIF0qXC8/Pi9zJywgJEV4Y2VycHRbJ3RleHQnXSwgJG1hdGNoZXMpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KAogICAgICAgICAgICAgICAgJ21hcmt1cCcgPT4gJG1hdGNoZXNbMF0sCiAgICAgICAgICAgICAgICAnZXh0ZW50JyA9PiBzdHJsZW4oJG1hdGNoZXNbMF0pLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaW5saW5lU3BlY2lhbENoYXJhY3RlcigkRXhjZXJwdCkKICAgIHsKICAgICAgICBpZiAoJEV4Y2VycHRbJ3RleHQnXVswXSA9PT0gJyYnIGFuZCAhIHByZWdfbWF0Y2goJy9eJiM/XHcrOy8nLCAkRXhjZXJwdFsndGV4dCddKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgICAgICdtYXJrdXAnID0+ICcmYW1wOycsCiAgICAgICAgICAgICAgICAnZXh0ZW50JyA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFNwZWNpYWxDaGFyYWN0ZXIgPSBhcnJheSgnPicgPT4gJ2d0JywgJzwnID0+ICdsdCcsICciJyA9PiAncXVvdCcpOwoKICAgICAgICBpZiAoaXNzZXQoJFNwZWNpYWxDaGFyYWN0ZXJbJEV4Y2VycHRbJ3RleHQnXVswXV0pKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KAogICAgICAgICAgICAgICAgJ21hcmt1cCcgPT4gJyYnLiRTcGVjaWFsQ2hhcmFjdGVyWyRFeGNlcnB0Wyd0ZXh0J11bMF1dLic7JywKICAgICAgICAgICAgICAgICdleHRlbnQnID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbmxpbmVTdHJpa2V0aHJvdWdoKCRFeGNlcnB0KQogICAgewogICAgICAgIGlmICggISBpc3NldCgkRXhjZXJwdFsndGV4dCddWzFdKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkRXhjZXJwdFsndGV4dCddWzFdID09PSAnficgYW5kIHByZWdfbWF0Y2goJy9efn4oPz1cUykoLis/KSg/PD1cUyl+fi8nLCAkRXhjZXJwdFsndGV4dCddLCAkbWF0Y2hlcykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICAgICAnZXh0ZW50JyA9PiBzdHJsZW4oJG1hdGNoZXNbMF0pLAogICAgICAgICAgICAgICAgJ2VsZW1lbnQnID0+IGFycmF5KAogICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAnZGVsJywKICAgICAgICAgICAgICAgICAgICAndGV4dCcgPT4gJG1hdGNoZXNbMV0sCiAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZXInID0+ICdsaW5lJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbmxpbmVVcmwoJEV4Y2VycHQpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT51cmxzTGlua2VkICE9PSB0cnVlIG9yICEgaXNzZXQoJEV4Y2VycHRbJ3RleHQnXVsyXSkgb3IgJEV4Y2VycHRbJ3RleHQnXVsyXSAhPT0gJy8nKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9cYmh0dHBzPzpbXC9dezJ9W15cczxdK1xiXC8qL3VpJywgJEV4Y2VycHRbJ2NvbnRleHQnXSwgJG1hdGNoZXMsIFBSRUdfT0ZGU0VUX0NBUFRVUkUpKQogICAgICAgIHsKICAgICAgICAgICAgJElubGluZSA9IGFycmF5KAogICAgICAgICAgICAgICAgJ2V4dGVudCcgPT4gc3RybGVuKCRtYXRjaGVzWzBdWzBdKSwKICAgICAgICAgICAgICAgICdwb3NpdGlvbicgPT4gJG1hdGNoZXNbMF1bMV0sCiAgICAgICAgICAgICAgICAnZWxlbWVudCcgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+ICdhJywKICAgICAgICAgICAgICAgICAgICAndGV4dCcgPT4gJG1hdGNoZXNbMF1bMF0sCiAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMnID0+IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAnaHJlZicgPT4gJG1hdGNoZXNbMF1bMF0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJElubGluZTsKICAgICAgICB9CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGlubGluZVVybFRhZygkRXhjZXJwdCkKICAgIHsKICAgICAgICBpZiAoc3RycG9zKCRFeGNlcnB0Wyd0ZXh0J10sICc+JykgIT09IGZhbHNlIGFuZCBwcmVnX21hdGNoKCcvXjwoXHcrOlwvezJ9W14gPl0rKT4vaScsICRFeGNlcnB0Wyd0ZXh0J10sICRtYXRjaGVzKSkKICAgICAgICB7CiAgICAgICAgICAgICR1cmwgPSBzdHJfcmVwbGFjZShhcnJheSgnJicsICc8JyksIGFycmF5KCcmYW1wOycsICcmbHQ7JyksICRtYXRjaGVzWzFdKTsKCiAgICAgICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgICAgICdleHRlbnQnID0+IHN0cmxlbigkbWF0Y2hlc1swXSksCiAgICAgICAgICAgICAgICAnZWxlbWVudCcgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+ICdhJywKICAgICAgICAgICAgICAgICAgICAndGV4dCcgPT4gJHVybCwKICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlcycgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICdocmVmJyA9PiAkdXJsLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIH4KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gdW5tYXJrZWRUZXh0KCR0ZXh0KQogICAgewogICAgICAgIGlmICgkdGhpcy0+YnJlYWtzRW5hYmxlZCkKICAgICAgICB7CiAgICAgICAgICAgICR0ZXh0ID0gcHJlZ19yZXBsYWNlKCcvWyBdKlxuLycsICI8YnIgLz5cbiIsICR0ZXh0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgJHRleHQgPSBwcmVnX3JlcGxhY2UoJy8oPzpbIF1bIF0rfFsgXSpcXFxcKVxuLycsICI8YnIgLz5cbiIsICR0ZXh0KTsKICAgICAgICAgICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiIFxuIiwgIlxuIiwgJHRleHQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0ZXh0OwogICAgfQoKICAgICMKICAgICMgSGFuZGxlcnMKICAgICMKCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZWxlbWVudChhcnJheSAkRWxlbWVudCkKICAgIHsKICAgICAgICAkbWFya3VwID0gJzwnLiRFbGVtZW50WyduYW1lJ107CgogICAgICAgIGlmIChpc3NldCgkRWxlbWVudFsnYXR0cmlidXRlcyddKSkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRFbGVtZW50WydhdHRyaWJ1dGVzJ10gYXMgJG5hbWUgPT4gJHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoJHZhbHVlID09PSBudWxsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRtYXJrdXAgLj0gJyAnLiRuYW1lLic9IicuJHZhbHVlLiciJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCRFbGVtZW50Wyd0ZXh0J10pKQogICAgICAgIHsKICAgICAgICAgICAgJG1hcmt1cCAuPSAnPic7CgogICAgICAgICAgICBpZiAoaXNzZXQoJEVsZW1lbnRbJ2hhbmRsZXInXSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRtYXJrdXAgLj0gJHRoaXMtPnskRWxlbWVudFsnaGFuZGxlciddfSgkRWxlbWVudFsndGV4dCddKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRtYXJrdXAgLj0gJEVsZW1lbnRbJ3RleHQnXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG1hcmt1cCAuPSAnPC8nLiRFbGVtZW50WyduYW1lJ10uJz4nOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAkbWFya3VwIC49ICcgLz4nOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtYXJrdXA7CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVsZW1lbnRzKGFycmF5ICRFbGVtZW50cykKICAgIHsKICAgICAgICAkbWFya3VwID0gJyc7CgogICAgICAgIGZvcmVhY2ggKCRFbGVtZW50cyBhcyAkRWxlbWVudCkKICAgICAgICB7CiAgICAgICAgICAgICRtYXJrdXAgLj0gIlxuIiAuICR0aGlzLT5lbGVtZW50KCRFbGVtZW50KTsKICAgICAgICB9CgogICAgICAgICRtYXJrdXAgLj0gIlxuIjsKCiAgICAgICAgcmV0dXJuICRtYXJrdXA7CiAgICB9CgogICAgIyB+CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpKCRsaW5lcykKICAgIHsKICAgICAgICAkbWFya3VwID0gJHRoaXMtPmxpbmVzKCRsaW5lcyk7CgogICAgICAgICR0cmltbWVkTWFya3VwID0gdHJpbSgkbWFya3VwKTsKCiAgICAgICAgaWYgKCAhIGluX2FycmF5KCcnLCAkbGluZXMpIGFuZCBzdWJzdHIoJHRyaW1tZWRNYXJrdXAsIDAsIDMpID09PSAnPHA+JykKICAgICAgICB7CiAgICAgICAgICAgICRtYXJrdXAgPSAkdHJpbW1lZE1hcmt1cDsKICAgICAgICAgICAgJG1hcmt1cCA9IHN1YnN0cigkbWFya3VwLCAzKTsKCiAgICAgICAgICAgICRwb3NpdGlvbiA9IHN0cnBvcygkbWFya3VwLCAiPC9wPiIpOwoKICAgICAgICAgICAgJG1hcmt1cCA9IHN1YnN0cl9yZXBsYWNlKCRtYXJrdXAsICcnLCAkcG9zaXRpb24sIDQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtYXJrdXA7CiAgICB9CgogICAgIwogICAgIyBEZXByZWNhdGVkIE1ldGhvZHMKICAgICMKCiAgICBmdW5jdGlvbiBwYXJzZSgkdGV4dCkKICAgIHsKICAgICAgICAkbWFya3VwID0gJHRoaXMtPnRleHQoJHRleHQpOwoKICAgICAgICByZXR1cm4gJG1hcmt1cDsKICAgIH0KCiAgICAjCiAgICAjIFN0YXRpYyBNZXRob2RzCiAgICAjCgogICAgc3RhdGljIGZ1bmN0aW9uIGluc3RhbmNlKCRuYW1lID0gJ2RlZmF1bHQnKQogICAgewogICAgICAgIGlmIChpc3NldChzZWxmOjokaW5zdGFuY2VzWyRuYW1lXSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6JGluc3RhbmNlc1skbmFtZV07CiAgICAgICAgfQoKICAgICAgICAkaW5zdGFuY2UgPSBuZXcgc2VsZigpOwoKICAgICAgICBzZWxmOjokaW5zdGFuY2VzWyRuYW1lXSA9ICRpbnN0YW5jZTsKCiAgICAgICAgcmV0dXJuICRpbnN0YW5jZTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyAkaW5zdGFuY2VzID0gYXJyYXkoKTsKCiAgICAjCiAgICAjIEZpZWxkcwogICAgIwoKICAgIHByb3RlY3RlZCAkRGVmaW5pdGlvbkRhdGE7CgogICAgIwogICAgIyBSZWFkLU9ubHkKCiAgICBwcm90ZWN0ZWQgJHNwZWNpYWxDaGFyYWN0ZXJzID0gYXJyYXkoCiAgICAgICAgJ1xcJywgJ2AnLCAnKicsICdfJywgJ3snLCAnfScsICdbJywgJ10nLCAnKCcsICcpJywgJz4nLCAnIycsICcrJywgJy0nLCAnLicsICchJywgJ3wnLAogICAgKTsKCiAgICBwcm90ZWN0ZWQgJFN0cm9uZ1JlZ2V4ID0gYXJyYXkoCiAgICAgICAgJyonID0+ICcvXlsqXXsyfSgoPzpcXFxcXCp8W14qXXxbKl1bXipdKlsqXSkrPylbKl17Mn0oPyFbKl0pL3MnLAogICAgICAgICdfJyA9PiAnL15fXygoPzpcXFxcX3xbXl9dfF9bXl9dKl8pKz8pX18oPyFfKS91cycsCiAgICApOwoKICAgIHByb3RlY3RlZCAkRW1SZWdleCA9IGFycmF5KAogICAgICAgICcqJyA9PiAnL15bKl0oKD86XFxcXFwqfFteKl18WypdWypdW14qXSs/WypdWypdKSs/KVsqXSg/IVsqXSkvcycsCiAgICAgICAgJ18nID0+ICcvXl8oKD86XFxcXF98W15fXXxfX1teX10qX18pKz8pXyg/IV8pXGIvdXMnLAogICAgKTsKCiAgICBwcm90ZWN0ZWQgJHJlZ2V4SHRtbEF0dHJpYnV0ZSA9ICdbYS16QS1aXzpdW1x3Oi4tXSooPzpccyo9XHMqKD86W14iXCc9PD5gXHNdK3wiW14iXSoifFwnW15cJ10qXCcpKT8nOwoKICAgIHByb3RlY3RlZCAkdm9pZEVsZW1lbnRzID0gYXJyYXkoCiAgICAgICAgJ2FyZWEnLCAnYmFzZScsICdicicsICdjb2wnLCAnY29tbWFuZCcsICdlbWJlZCcsICdocicsICdpbWcnLCAnaW5wdXQnLCAnbGluaycsICdtZXRhJywgJ3BhcmFtJywgJ3NvdXJjZScsCiAgICApOwoKICAgIHByb3RlY3RlZCAkdGV4dExldmVsRWxlbWVudHMgPSBhcnJheSgKICAgICAgICAnYScsICdicicsICdiZG8nLCAnYWJicicsICdibGluaycsICduZXh0aWQnLCAnYWNyb255bScsICdiYXNlZm9udCcsCiAgICAgICAgJ2InLCAnZW0nLCAnYmlnJywgJ2NpdGUnLCAnc21hbGwnLCAnc3BhY2VyJywgJ2xpc3RpbmcnLAogICAgICAgICdpJywgJ3JwJywgJ2RlbCcsICdjb2RlJywgICAgICAgICAgJ3N0cmlrZScsICdtYXJxdWVlJywKICAgICAgICAncScsICdydCcsICdpbnMnLCAnZm9udCcsICAgICAgICAgICdzdHJvbmcnLAogICAgICAgICdzJywgJ3R0JywgJ3N1YicsICdtYXJrJywKICAgICAgICAndScsICd4bScsICdzdXAnLCAnbm9icicsCiAgICAgICAgICAgICAgICAgICAndmFyJywgJ3J1YnknLAogICAgICAgICAgICAgICAgICAgJ3dicicsICdzcGFuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAndGltZScsCiAgICApOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/Engines/Parsedown/README.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyMgUGFyc2Vkb3duCgpbIVtCdWlsZCBTdGF0dXNdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vdHJhdmlzL2VydXNldi9wYXJzZWRvd24vbWFzdGVyLnN2Zz9zdHlsZT1mbGF0LXNxdWFyZSldKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9lcnVzZXYvcGFyc2Vkb3duKQo8IS0tWyFbVG90YWwgRG93bmxvYWRzXShodHRwOi8vaW1nLnNoaWVsZHMuaW8vcGFja2FnaXN0L2R0L2VydXNldi9wYXJzZWRvd24uc3ZnP3N0eWxlPWZsYXQtc3F1YXJlKV0oaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL3BhY2thZ2VzL2VydXNldi9wYXJzZWRvd24pLS0+CgpCZXR0ZXIgTWFya2Rvd24gUGFyc2VyIGluIFBIUAoKW1NlZSBEZW1vXShodHRwOi8vcGFyc2Vkb3duLm9yZy9kZW1vKQoKIyMjIEZlYXR1cmVzCgoqIFtGYXN0XShodHRwOi8vcGFyc2Vkb3duLm9yZy9zcGVlZCkKKiBbQ29uc2lzdGVudF0oaHR0cDovL3BhcnNlZG93bi5vcmcvY29uc2lzdGVuY3kpCiogW0dpdEh1YiBmbGF2b3JlZF0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvZ2l0aHViLWZsYXZvcmVkLW1hcmtkb3duKQoqIFtUZXN0ZWRdKGh0dHA6Ly9wYXJzZWRvd24ub3JnL3Rlc3RzLykgaW4gUEhQIDUuMywgNS40LCA1LjUsIDUuNiBhbmQgW0hIVk1dKGh0dHA6Ly93d3cuaGh2bS5jb20vKQoqIFtFeHRlbnNpYmxlXShodHRwczovL2dpdGh1Yi5jb20vZXJ1c2V2L3BhcnNlZG93bi93aWtpL1dyaXRpbmctRXh0ZW5zaW9ucykKKiBbTWFya2Rvd24gRXh0cmEgZXh0ZW5zaW9uXShodHRwczovL2dpdGh1Yi5jb20vZXJ1c2V2L3BhcnNlZG93bi1leHRyYSkKCiMjIyBJbnN0YWxsYXRpb24KCkluY2x1ZGUgYFBhcnNlZG93bi5waHBgIG9yIGluc3RhbGwgW3RoZSBjb21wb3NlciBwYWNrYWdlXShodHRwczovL3BhY2thZ2lzdC5vcmcvcGFja2FnZXMvZXJ1c2V2L3BhcnNlZG93bikuCgojIyMgRXhhbXBsZQoKYGBgIHBocAokUGFyc2Vkb3duID0gbmV3IFBhcnNlZG93bigpOwoKZWNobyAkUGFyc2Vkb3duLT50ZXh0KCdIZWxsbyBfUGFyc2Vkb3duXyEnKTsgIyBwcmludHM6IDxwPkhlbGxvIDxlbT5QYXJzZWRvd248L2VtPiE8L3A+CmBgYAoKTW9yZSBleGFtcGxlcyBpbiBbdGhlIHdpa2ldKGh0dHBzOi8vZ2l0aHViLmNvbS9lcnVzZXYvcGFyc2Vkb3duL3dpa2kvVXNhZ2UpIGFuZCBpbiBbdGhpcyB2aWRlbyB0dXRvcmlhbF0oaHR0cDovL3lvdXR1LmJlL3dZWkJZOERFaWtJKS4KCiMjIyBRdWVzdGlvbnMKCioqSG93IGRvZXMgUGFyc2Vkb3duIHdvcms/KioKCkl0IHRyaWVzIHRvIHJlYWQgTWFya2Rvd24gbGlrZSBhIGh1bWFuLiBGaXJzdCwgaXQgbG9va3MgYXQgdGhlIGxpbmVzLiBJdOKAmXMgaW50ZXJlc3RlZCBpbiBob3cgdGhlIGxpbmVzIHN0YXJ0LiBUaGlzIGhlbHBzIGl0IHJlY29nbmlzZSBibG9ja3MuIEl0IGtub3dzLCBmb3IgZXhhbXBsZSwgdGhhdCBpZiBhIGxpbmUgc3RhcnQgd2l0aCBhIGAtYCB0aGVuIGl0IHBlcmhhcHMgYmVsb25nIHRvIGEgbGlzdC4gT25jZSBpdCByZWNvZ25pc2VzIHRoZSBibG9ja3MsIGl0IGNvbnRpbnVlcyB0byB0aGUgY29udGVudC4gQXMgaXQgcmVhZHMsIGl0IHdhdGNoZXMgb3V0IGZvciBzcGVjaWFsIGNoYXJhY3RlcnMuIFRoaXMgaGVscHMgaXQgcmVjb2duaXNlIGlubGluZSBlbGVtZW50cyAob3IgaW5saW5lcykuCgpXZSBjYWxsIHRoaXMgYXBwcm9hY2ggImxpbmUgYmFzZWQiLiBXZSBiZWxpZXZlIHRoYXQgUGFyc2Vkb3duIGlzIHRoZSBmaXJzdCBNYXJrZG93biBwYXJzZXIgdG8gdXNlIGl0LiBTaW5jZSB0aGUgcmVsZWFzZSBvZiBQYXJzZWRvd24sIG90aGVyIGRldmVsb3BlcnMgaGF2ZSB1c2VkIHRoZSBzYW1lIGFwcHJvYWNoIHRvIGRldmVsb3Agb3RoZXIgTWFya2Rvd24gcGFyc2VycyBpbiBQSFAgYW5kIGluIG90aGVyIGxhbmd1YWdlcy4KCioqSXMgaXQgY29tcGxpYW50IHdpdGggQ29tbW9uTWFyaz8qKgoKSXQgcGFzc2VzIG1vc3Qgb2YgdGhlIENvbW1vbk1hcmsgdGVzdHMuIE1vc3Qgb2YgdGhlIHRlc3RzIHRoYXQgZG9uJ3QgcGFzcyBkZWFsIHdpdGggY2FzZXMgdGhhdCBhcmUgcXVpdGUgdW5jb21tb24uIFN0aWxsLCBhcyBDb21tb25NYXJrIG1hdHVyZXMsIGNvbXBsaWFuY2Ugc2hvdWxkIGltcHJvdmUuCgoqKldobyB1c2VzIGl0PyoqCgpbcGhwRG9jdW1lbnRvcl0oaHR0cDovL3d3dy5waHBkb2Mub3JnLyksIFtPY3RvYmVyIENNU10oaHR0cDovL29jdG9iZXJjbXMuY29tLyksIFtCb2x0IENNU10oaHR0cDovL2JvbHQuY20vKSwgW0tpcmJ5IENNU10oaHR0cDovL2dldGtpcmJ5LmNvbS8pLCBbR3JhdiBDTVNdKGh0dHA6Ly9nZXRncmF2Lm9yZy8pLCBbU3RhdGFtaWMgQ01TXShodHRwOi8vd3d3LnN0YXRhbWljLmNvbS8pLCAgW1Jhc3BiZXJyeVBpLm9yZ10oaHR0cDovL3d3dy5yYXNwYmVycnlwaS5vcmcvKSBhbmQgW21vcmVdKGh0dHBzOi8vd3d3LnZlcnNpb25leWUuY29tL3BocC9lcnVzZXY6cGFyc2Vkb3duL3JlZmVyZW5jZXMpLgoKKipIb3cgY2FuIEkgaGVscD8qKgoKVXNlIGl0LCBzdGFyIGl0LCBzaGFyZSBpdCBhbmQgaWYgeW91IGZlZWwgZ2VuZXJvdXMsIFtkb25hdGUgc29tZSBtb25leV0oaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9jZ2ktYmluL3dlYnNjcj9jbWQ9X3MteGNsaWNrJmhvc3RlZF9idXR0b25faWQ9NTI4UDNOWlFNUDhOMikuCg==]]></data>
	</file>
	<file>
	  <filename>/lib/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKCiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdkZWZhdWx0X2VuZ2luZScsRW5naW5lOjokUEFSU0RPV04pOwovLyR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwcm9jZXNzX3NtYXJ0eV9zZWN1cml0eScsdHJ1ZSk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwcm9jZXNzX3F1b3RlJyx0cnVlKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ3Byb2Nlc3NfaW1nJyx0cnVlKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ3Byb2Nlc3Nfc2VjdXJpdHknLHRydWUpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgncHJvY2Vzc19jb2RlcHJlJyx0cnVlKTsKCgovL1JlZ2lzdGVyIFNtYXJ0eSBQbHVnaW4KLy8kdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oVFJVRSk7CiR0aGlzLT5SZWdpc3RlclNtYXJ0eVBsdWdpbignbWFya2Rvd24nLCdtb2RpZmllcicsJ2V4ZWNfcGFyc2VyJywgdHJ1ZSwgMCk7CgoKLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nCiR0aGlzLT5BdWRpdCggMCwgCgkgICAgICAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksIAoJICAgICAgJHRoaXMtPkxhbmcoJ2luc3RhbGxlZCcsICR0aGlzLT5HZXRWZXJzaW9uKCkpICk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKCiR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCk7CiR0aGlzLT5SZW1vdmVTbWFydHlQbHVnaW4oKTsKCiR0aGlzLT5SZW1vdmVTbWFydHlQbHVnaSgnbWFya2Rvd24nKTsKCi8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwokdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ3VuaW5zdGFsbGVkJykpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKCi8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwokdGhpcy0+QXVkaXQoIDAsICAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICAkdGhpcy0+TGFuZygndXBncmFkZWQnLCAkdGhpcy0+R2V0VmVyc2lvbigpKSk7CgoKPz4=]]></data>
	</file>
	<file>
	  <filename>/Parser.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCgpjbGFzcyBQYXJzZXIgZXh0ZW5kcyBDTVNNb2R1bGUKeyAgIAoJZnVuY3Rpb24gR2V0TmFtZSgpIHtyZXR1cm4gJ1BhcnNlcic7fQoJZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkge3JldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7fQoJZnVuY3Rpb24gR2V0VmVyc2lvbigpIHtyZXR1cm4gJzEuMC4wJzt9CglmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKSB7cmV0dXJuIGFycmF5KCk7fQoJZnVuY3Rpb24gR2V0SGVscCgpIHtyZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTt9CglmdW5jdGlvbiBHZXRBdXRob3IoKSB7cmV0dXJuICdLZXZpbiBEYW5lemlzIChha2EgQmVzcyknO30KCWZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkge3JldHVybiAnY29udGFjdCBhdCBmdXJpZSBwb2ludCBiZSc7fQoJZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkge3JldHVybiAkdGhpcy0+TGFuZygnY2hhbmdlbG9nJyk7fQoJZnVuY3Rpb24gR2V0QWRtaW5EZXNjcmlwdGlvbigpIHtyZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7fQoJZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7cmV0dXJuICIxLjExLjEzIjt9CglmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHtyZXR1cm4gZmFsc2U7fQoJZnVuY3Rpb24gSGFzQWRtaW4oKSB7cmV0dXJuIHRydWU7fQoJZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uKCkge3JldHVybiAnZXh0ZW5zaW9ucyc7fQoJZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkge3JldHVybiB0cnVlO30KCWZ1bmN0aW9uIEluaXRpYWxpemVGcm9udGVuZCgpIHt9CglmdW5jdGlvbiBJbml0aWFsaXplQWRtaW4oKSB7fQoJZnVuY3Rpb24gQWxsb3dTbWFydHlDYWNoaW5nKCkge3JldHVybiB0cnVlO30KCWZ1bmN0aW9uIExhenlMb2FkRnJvbnRlbmQoKSB7cmV0dXJuIHRydWU7fQoJZnVuY3Rpb24gTGF6eUxvYWRBZG1pbigpIHtyZXR1cm4gdHJ1ZTt9CglmdW5jdGlvbiBJbnN0YWxsUG9zdE1lc3NhZ2UoKSB7cmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpO30KCWZ1bmN0aW9uIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkge3JldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpO30KCWZ1bmN0aW9uIFVuaW5zdGFsbFByZU1lc3NhZ2UoKSB7cmV0dXJuICR0aGlzLT5MYW5nKCdyZWFsbHlfdW5pbnN0YWxsJyk7fQoJZnVuY3Rpb24gRGlzcGxheUVycm9yUGFnZSgkbXNnKSB7ZWNobyAiPGgzPiIuJG1zZy4iPC9oMz4iO30gIAoJZnVuY3Rpb24gQ3JlYXRlU3RhdGljUm91dGVzKCkge30KCWZ1bmN0aW9uIEdldFBhcnNlckluc3RhbmNlKCRlbmdpbmVUeXBlID0gbnVsbCl7CgkJaWYoZW1wdHkoJGVuZ2luZVR5cGUpKXsKCQkJJGVuZ2luZVR5cGUgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9lbmdpbmUnLEVuZ2luZTo6JFBBUlNET1dOKTsKCQl9CgkJcmV0dXJuIEVuZ2luZTo6aW5pdEluc3RhbmNlKCRlbmdpbmVUeXBlKTsKCX0KCXN0YXRpYyBmdW5jdGlvbiBleGVjX3BhcnNlcigkdGV4dCl7CgkJJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOwoJCWluY2x1ZGVfb25jZSgkY29uZmlnWydyb290X3BhdGgnXS4nL21vZHVsZXMvUGFyc2VyL2xpYi9jbGFzcy5FbmdpbmUucGhwJyk7CgkJcmV0dXJuIEVuZ2luZTo6aW5pdEluc3RhbmNlKCktPnByb2Nlc3MoJHRleHQpOwoJfQp9IAo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/README.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[TWFya2Rvd24gUGFyc2VyCj09PT09PT09PT09PT09PQoKQSB3cmFwcGVyIGZvciBNQVJLRE9XTidzIGVuZ2luZXMgZm9yIENtc01hZGVTaW1wbGUgd2l0aCBkaWZmZXJlbnRzIHJlbmRlcmluZyBlbmdpbmVzCgpJZiBpdCdzIHRoZSBmaXJzdCB0aW1lIHlvdSBwbGF5IHdpdGggTWFya2Rvd24sIHBsZWFzZSB0YWtlIGEgZmV3IG1vbWVudCBbdG8gcmVhZCB0aGlzXShodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCkKCllvdSBjYW4gY2FsbCB0aGUgcGFyc2VyIGluIGRpZmZlcmVudHMgd2F5CgpgYGBwaHAgCjw/cGhwIAogICRwYXJzZXIgPSBNb2R1bGVPcGVyYXRpb25zOjpnZXRfaW5zdGFuY2UoKS0+Z2V0X21vZHVsZV9pbnN0YW5jZSgnUGFyc2VyJyk7CiAgZWNobyAkcGFyc2VyLT5HZXRQYXJzZXJJbnN0YW5jZSgpLT5wcm9jZXNzKCR0ZXh0KTsKPz4gCmBgYApvcgoKYGBgcGhwIAo8P3BocCAKICAkY29uZmlnID0gY21zbXMoKS0+R2V0Q29uZmlnKCk7CiAgaW5jbHVkZV9vbmNlKCRjb25maWdbJ3Jvb3RfcGF0aCddLicvbW9kdWxlcy9QYXJzZXIvbGliL2NsYXNzLkVuZ2luZS5waHAnKTsKICBlY2hvIEVuZ2luZTo6aW5pdEluc3RhbmNlKCktPnByb2Nlc3MoJHRleHQpOwo/PiAKYGBgCm9yIGluIHlvdXIgU21hcnR5IHRlbXBsYXRlcyA6IAoKYGBgc21hcnR5CnskdW50cnVzdGVkVGV4dHxtYXJrZG93bn0KYGBgCgpUaGVyZSBpcyBhbHNvIG1vcmUgb3B0aW9ucyBhdmFpbGFibGUgOiAKYGBgcGhwIAo8P3BocCAKICAkY29uZmlnID0gY21zbXMoKS0+R2V0Q29uZmlnKCk7CiAgaW5jbHVkZV9vbmNlKCRjb25maWdbJ3Jvb3RfcGF0aCddLicvbW9kdWxlcy9QYXJzZXIvbGliL2NsYXNzLkVuZ2luZS5waHAnKTsKICBlY2hvIEVuZ2luZTo6aW5pdEluc3RhbmNlKEVuZ2luZTo6JFBBUlNET1dOKS0+cHJvY2VzcygkdGV4dCwgdHJ1ZSk7IAogIC8vIHdpbGwgdXNlIFBBUlNET1dOIGFuZCB3aWxsIHByb2R1Y2Ugc29tZSBkZWJ1ZyB0cmFjZS4KPz4gCmBgYApXZSBwcm9wb3NlIDMgZGlmZmVyZW50cyBlbmdpbmUgZm9yIE1hcmtEb3duIDogCgoqICBbRW5naW5lOjokTUlDSEVMRiAodjEuNS4wKV0oaHR0cHM6Ly9naXRodWIuY29tL21pY2hlbGYvcGhwLW1hcmtkb3duKQoqICBbRW5naW5lOjokTUlDSEVMRl9FWFRSQSAodjEuNS4wKV0oaHR0cHM6Ly9naXRodWIuY29tL21pY2hlbGYvcGhwLW1hcmtkb3duKQoqICBbRW5naW5lOjokUEFSU0RPV04gKHYxLjQpXShodHRwczovL2dpdGh1Yi5jb20vZXJ1c2V2L3BhcnNlZG93bi1leHRyYSkKClRoYW5rIHlvdSBlcnVzZXYgYW5kIG1pY2hlbGYgZm9yIHlvdXIgd29yay4=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/admin.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0eWxlPgoKLmJveHsKCWJvcmRlcjoxcHggc29saWQgIzAwMDsKCWJhY2tncm91bmQtY29sb3I6ICNDQ0M7CglwYWRkaW5nOiAxMHB4OwoJYm9yZGVyLXJhZGl1czogNXB4OwoJbWFyZ2luLWJvdHRvbTogNXB4OyAKfQoKLmJveFd7CglwYWRkaW5nOiAxMHB4OwoJbWFyZ2luLWJvdHRvbTogNXB4OyAKfQoKLmJveCBoMnsKCW1hcmdpbi10b3A6IDA7Cn0KCi5ib3ggcHsKCW1hcmdpbjogMTBweCAwOwp9CgouY2hvaWNlewoJY29sb3I6ICM2NjY7CgltYXJnaW4tbGVmdDogMjBweDsKfQouY2hvaWNlOmJlZm9yZXsKCn0KCjwvc3R5bGU+Cgp7JGZvcm1fc2F2ZX0KCjxkaXYgY2xhc3M9J2JveCc+Cgk8aDI+U2VsZWN0IHRoZSBkZWZhdWx0IEVuZ2luZTwvaDI+Cgk8bGFiZWwgZm9yPSd7JGFjdGlvbmlkfWRlZmF1bHRfZW5naW5lJz5EZWZhdWx0IEVuZ2luZTwvbGFiZWw+Cgl7JGl0ZW1zRW5naW5lfQoJPHA+U2VsZWN0IHRoZSBkZWZhdWx0IEVuZ2luZS4gSXQgd2lsbCBoYXZlIHR3byBtYWpvciBjb25zZXF1ZW5jZSA6IHNvbWUgb2YgdGhlbSBhcmUgbW9yZSBjb21wbGV0ZSBhbmQgc29tZSBvZiB0aGVtIGFyZSBtb3JlIGZhc3QgdG8gcHJvY2VzcyB5b3VyIHRleHQuIEhlcmUgbXkgYWR2aWNlPC9wPgoJPHVsPgoJPGxpPjxiPk1JQ0hFTEYgOjwvYj4gQSBub3Qtc28tZmFzdCBlbmdpbmUgKDMuNTE8ZXhwPlsqXTwvZXhwPikgd2hpY2ggaGFzIGxlc3MgcG9zc2liaWxpdGllcyB0aGFuIHRoZSBvdGhlcnM8L2xpPgoJPGxpPjxiPk1JQ0hFTEYgRVhUUkE6PC9iPiBBIHNsb3cgZW5naW5lICg0LjgxPGV4cD5bKl08L2V4cD4pIHdoaWNoIHN1cHBvcnQgYWxsIHRoZSBNYXJrZG93biBsYW5ndWFnZSArIHRoZSBHaXRodWIgZXh0ZW5zaW9uPC9saT4KCTxsaT48Yj5QQVJTRE9XTiA6PC9iPiBBIGZhc3QgZW5naW5lICgwLjkzPGV4cD5bKl08L2V4cD4pIHdoaWNoIHN1cHBvcnQgYWxsIHRoZSBNYXJrZG93biBsYW5ndWFnZSArIHRoZSBHaXRodWIgZXh0ZW5zaW9uPC9saT4KCTwvdWw+Cgk8cD48ZXhwPlsqXTwvZXhwPiA6IHNlY29uZGUocykgZm9yIHByb2Nlc3NpbmcgYSAySyBjYXJhY3RlcnMgc3RyaW5nIDEwMDAgdGltZXMuPC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9J2JveCc+Cgk8aDI+U2VsZWN0IGEgU2VjdXJpdHkgUG9saWN5IGFnYWluc3QgTWFya2Rvd24ncyB2dWxuZXJhYmlsaXRpZXM8L2gyPgoJPHA+PGI+Rm9yIFNlY3VyaXR5IHJlYXNvbjwvYj4sIHlvdSBjYW4ndCB0cnVzdCB5b3VyIHZpc2l0b3JzIHNvIHlvdSBzaG91bGRuJ3QgcHJvY2VzcyBkYXRhIGJsaW5kbHkgd2l0aCB0aGlzIG1vZHVsZS4gSWYgeW91IGRvbid0IHRydXN0IHRoZSBlZGl0b3JzLCB5b3UgY2FuIGFjdGl2YXRlIHRoaXMgb3B0aW9uIHdoaWNoIHdpbGwgdHJ5IHRvIGltcHJvdmUgdGhlIHNlY3VyaXR5IG9mIHRoZSBwYXJzZXJzLiBJdCB3aWxsIGRlc2FjdGl2YXRlIEphdmFzY3JpcHQsIElmcmFtZSBhbmQgb3RoZXIgaW4gdGhlIE1hcmtkb3duIHRleHQuIElmIHlvdSBhY3RpdmF0ZSB0aGlzIG9wdGlvbiwgeW91IHNob3VsZCB0YWtlIGEgbG9vayBhdCB0aGUgbmV4dCBvcHRpb25zPC9wPgoJCgk8ZGl2IGNsYXNzPSdjaG9pY2UnPgoJPGxhYmVsIGZvcj0neyRhY3Rpb25pZH1wcm9jZXNzX3NlY3VyaXR5MSc+QWN0aXZlIHRoZSBzZWN1cml0eTwvbGFiZWw+Cgk8aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J3skYWN0aW9uaWR9cHJvY2Vzc19zZWN1cml0eScgaWQ9J3skYWN0aW9uaWR9cHJvY2Vzc19zZWN1cml0eTEnIHZhbHVlPScxJyB7aWYgJHByb2Nlc3Nfc2VjdXJpdHl9Y2hlY2tlZHsvaWZ9PgoJPGxhYmVsIGZvcj0neyRhY3Rpb25pZH1wcm9jZXNzX3NlY3VyaXR5MCc+Tm9wZTwvbGFiZWw+Cgk8aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J3skYWN0aW9uaWR9cHJvY2Vzc19zZWN1cml0eScgaWQ9J3skYWN0aW9uaWR9cHJvY2Vzc19zZWN1cml0eTAnIHZhbHVlPScwJyB7aWYgISRwcm9jZXNzX3NlY3VyaXR5fWNoZWNrZWR7L2lmfT4KCTwvZGl2PgoJPHA+SWYgeW91J3ZlIGFjdGl2YXRlZCB0aGUgU2VjdXJpdHkgT3B0aW9uLCBpdCB3aWxsIGJyZWFrIHNvbWUgc3R1ZmYsIGJ1dCBkb24ndCBwYW5pYywgaWYgeW91IGNoZWNrZWQgdGhlc2Ugb3B0aW9ucywgZXZlcnl0aGluZyB3aWxsIGJlIGFscmlnaHQuIDwvcD4KCgk8YmxvY2txdW90ZT4KCTxwPjxiPiMxPC9iPiA6IGl0IHdpbGwgZml4IHRoZSAmbHQ7cXVvdGUvJmd0OyB0YWcgaW4gTWFya2Rvd248L3A+CgkKCTxkaXYgY2xhc3M9J2Nob2ljZSc+Cgk8bGFiZWwgZm9yPSd7JGFjdGlvbmlkfXByb2Nlc3NfcXVvdGUxJz5QYXRjaCBtZSAhPC9sYWJlbD4KCTxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0neyRhY3Rpb25pZH1wcm9jZXNzX3F1b3RlJyBpZD0neyRhY3Rpb25pZH1wcm9jZXNzX3F1b3RlMScgdmFsdWU9JzEnIHtpZiAkcHJvY2Vzc19xdW90ZX1jaGVja2Vkey9pZn0+Cgk8bGFiZWwgZm9yPSd7JGFjdGlvbmlkfXByb2Nlc3NfcXVvdGUwJz5Ob3BlPC9sYWJlbD4KCTxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0neyRhY3Rpb25pZH1wcm9jZXNzX3F1b3RlJyBpZD0neyRhY3Rpb25pZH1wcm9jZXNzX3F1b3RlMCcgdmFsdWU9JzAnIHtpZiAhJHByb2Nlc3NfcXVvdGV9Y2hlY2tlZHsvaWZ9PgoJPC9kaXY+CgoKCTxwPjxiPiMyPC9iPiA6IGl0IHdpbGwgZml4IHRoZSAmbHQ7aW1nIC8mZ3Q7ICsgJmx0O2EgLyZndDsgdGFnIGluIE1hcmtkb3duPC9wPgoKCTxkaXYgY2xhc3M9J2Nob2ljZSc+Cgk8bGFiZWwgZm9yPSd7JGFjdGlvbmlkfXByb2Nlc3NfaW1nMSc+UGF0Y2ggbWUgITwvbGFiZWw+Cgk8aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J3skYWN0aW9uaWR9cHJvY2Vzc19pbWcnIGlkPSd7JGFjdGlvbmlkfXByb2Nlc3NfaW1nMScgdmFsdWU9JzEnIHtpZiAkcHJvY2Vzc19pbWd9Y2hlY2tlZHsvaWZ9PgoJPGxhYmVsIGZvcj0neyRhY3Rpb25pZH1wcm9jZXNzX2ltZzAnPk5vcGU8L2xhYmVsPgoJPGlucHV0IHR5cGU9J3JhZGlvJyBuYW1lPSd7JGFjdGlvbmlkfXByb2Nlc3NfaW1nJyBpZD0neyRhY3Rpb25pZH1wcm9jZXNzX2ltZzAnIHZhbHVlPScwJyB7aWYgISRwcm9jZXNzX2ltZ31jaGVja2Vkey9pZn0+Cgk8L2Rpdj4KCgoJPHA+PGI+IzM8L2I+IDogaXQgd2lsbCBmaXggdGhlICZsdDtjb2RlIC8mZ3Q7ICsgJmx0O3ByZSAvJmd0OyB0YWcgYW5kIHRoZWlyIGNvbnRlbnQgaW4gTWFya2Rvd248L3A+CgoJPGRpdiBjbGFzcz0nY2hvaWNlJz4KCTxsYWJlbCBmb3I9J3skYWN0aW9uaWR9cHJvY2Vzc19jb2RlcHJlMSc+UGF0Y2ggbWUgITwvbGFiZWw+Cgk8aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J3skYWN0aW9uaWR9cHJvY2Vzc19jb2RlcHJlJyBpZD0neyRhY3Rpb25pZH1wcm9jZXNzX2NvZGVwcmUxJyB2YWx1ZT0nMScge2lmICRwcm9jZXNzX2NvZGVwcmV9Y2hlY2tlZHsvaWZ9PgoJPGxhYmVsIGZvcj0neyRhY3Rpb25pZH1wcm9jZXNzX2NvZGVwcmUwJz5Ob3BlPC9sYWJlbD4KCTxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0neyRhY3Rpb25pZH1wcm9jZXNzX2NvZGVwcmUnIGlkPSd7JGFjdGlvbmlkfXByb2Nlc3NfY29kZXByZTAnIHZhbHVlPScwJyB7aWYgISRwcm9jZXNzX2NvZGVwcmV9Y2hlY2tlZHsvaWZ9PgoJPC9kaXY+CjwvYmxvY2txdW90ZT4KPC9kaXY+CnsqCjxkaXYgY2xhc3M9J2JveCc+Cgk8aDI+U2VsZWN0IGEgU2VjdXJpdHkgUG9saWN5IGFnYWluc3QgU21hcnR5J3MgdnVsbmVyYWJpbGl0aWVzPC9oMj4KCTxwPkFub3RoZXIgb3B0aW9uIDxiPmZvciBTZWN1cml0eSA6IDwvYj50cnVzdCBtZSB5b3Ugd291bGRuJ3Qgd2FudCBsZXQgdW50cnVzdGVkIHBlb3BsZSB1c2luZyBTbWFydHkgdGFncyBpbiB5b3VyIHdlYnNpdGUuLi4gQnV0IGp1c3QgaW4gY2FzZSwgaWYgeW91IHRydXN0IHRoZSBlZGl0b3JzIChpIHdvbid0IGlmIGkgd2VyZSB5b3UpIHlvdSBjYW4gZGlzYWJsZSB0aGlzIG9wdGlvbjwvcD4KCQoJPGRpdiBjbGFzcz0nY2hvaWNlJz4KCTxsYWJlbCBmb3I9J3skYWN0aW9uaWR9cHJvY2Vzc19zbWFydHkxJz5BY3RpdmUgdGhlIHNlY3VyaXR5PC9sYWJlbD4KCTxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0neyRhY3Rpb25pZH1wcm9jZXNzX3NtYXJ0eV9zZWN1cml0eScgaWQ9J3skYWN0aW9uaWR9cHJvY2Vzc19zbWFydHlfc2VjdXJpdHkxJyB2YWx1ZT0nMScge2lmICRwcm9jZXNzX3NtYXJ0eV9zZWN1cml0eX1jaGVja2Vkey9pZn0+Cgk8bGFiZWwgZm9yPSd7JGFjdGlvbmlkfXByb2Nlc3Nfc21hcnR5MCc+Tm9wZSwgbGV0IG1lIHVzZSBTbWFydHkgVGFncyBpbnNpZGUgdGhlIE1hcmtkb3duIHN0dWZmPC9sYWJlbD4KCTxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0neyRhY3Rpb25pZH1wcm9jZXNzX3NtYXJ0eV9zZWN1cml0eScgaWQ9J3skYWN0aW9uaWR9cHJvY2Vzc19zbWFydHlfc2VjdXJpdHkwJyB2YWx1ZT0nMCcge2lmICEkcHJvY2Vzc19zbWFydHlfc2VjdXJpdHl9Y2hlY2tlZHsvaWZ9PgoJPC9kaXY+CjwvZGl2PgoqfQoKCjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdTYXZlJy8+Cgo8L2Zvcm0+Cgo8ZGl2IGNsYXNzPSdib3hXJz4KeyR0ZXh0fQo8L2Rpdj4=]]></data>
	</file>
</module>
