<?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>RSSSimplePie</name>
	<version>1.0</version>
  <mincmsversion>1.10</mincmsversion>
	<help><![CDATA[CjxoMz5XaGF0IERvZXMgVGhpcyBEbz88L2gzPgo8cD5UaGlzIGlzIFJTUyBQYXJzZXIgdXNpbmcgdGhlIFNpbXBsZVBpZSBMaWIgaHR0cDovL3NpbXBsZXBpZS5vcmc8L3A+CjxoMz5Ib3cgRG8gSSBVc2UgSXQ8L2gzPgo8cD5TaW1wbGUsIGp1c3QgYWRkIGl0IHRvIHlvdXIgeW91ciBwYWdlIG9yIHRlbXBsYXRlIGxpa2UgdGhpczoKPGJyIC8+CjxiciAvPgp7UlNTU2ltcGxlUGllIGZlZWQ9Imh0dHA6Ly93d3cubnl0aW1lcy5jb20vc2VydmljZXMveG1sL3Jzcy9ueXQvSG9tZVBhZ2UueG1sIn0KPGJyIC8+CjxiciAvPgpvciBmb3IgbXVsdGlwbGUgcnNzIHZpZXcKPGJyIC8+CjxiciAvPgp7UlNTU2ltcGxlUGllIGZlZWRzPSJodHRwOi8vd3d3Lm55dGltZXMuY29tL3NlcnZpY2VzL3htbC9yc3Mvbnl0L0hvbWVQYWdlLnhtbCwgaHR0cDovL2ZlZWRzLm1hc2hhYmxlLmNvbS9tYXNoYWJsZSJ9CjwvcD4gICAgCjxwPk1vcmUgaW5mbyBhYm91dCBhZHZhbmNlZCBvcHRpb25zIGZpbmQgaW4gPGEgaHJlZj0iaHR0cDovL3d3dy5zaW1wbGVwaWUub3JnL3dpa2kvIj5TaW1wbGVQaWUgd2lraTwvYT4uPC9wPgoKPGgzPlN1cHBvcnQ8L2gzPgo8dWw+CjxsaT5Gb3IgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLCBGQVFzLCBvciB0byBmaWxlIGEgQnVnIFJlcG9ydCwgcGxlYXNlIHZpc2l0IHRoZSBNb2R1bGUgRm9yZ2UKPGEgaHJlZj0iaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9zaW1wbGVwaWUvIj5SU1MgU2ltcGxlIFBpZTwvYT4uPC9saT4KPGxpPkFkZGl0aW9uYWwgZGlzY3Vzc2lvbiBvZiB0aGlzIG1vZHVsZSBtYXkgYWxzbyBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLmNtc21hZGVzaW1wbGUub3JnIj5DTVMgTWFkZSBTaW1wbGUgRm9ydW1zPC9hPi48L2xpPgo8L3VsPgo8cD5TcGVjaWFsIHRoYW5rcyB0byBvcmlnaW5hbCBDTVMgU2ltcGxlIFBpZSBtb2R1bGUgYXV0aG9yIE51bm8gQ29zdGEgPGEgaHJlZj0ibWFpbHRvOm51bm8ubWZjb3N0YUBzYXBvLnB0Ij4mbHQ7bnVuby5tZmNvc3RhQHNhcG8ucHQmZ3Q7PC9hPi48L3A+CjxoMz5BYm91dCBBdXRob3I8L2gzPgo8cD5aZGVubyBLdXptYW55PGJyIC8+IDxiciAvPgogICAgPHN0cm9uZz5QZXJzb25hbDo8L3N0cm9uZz48YnI+CiAgICA8YSBocmVmPSJodHRwOi8va3V6bWFueS5iaXovP3V0bV9zb3VyY2U9Y21zbXMlMkJtb2R1bGUmdXRtX21lZGl1bT1saW5rJnV0bV9jYW1wYWlnbj1yc3NzaW1wbGVwaWUiPmt1em1hbnkuYml6PC9hPjxicj4KICAgIDxhIGhyZWY9Imh0dHA6Ly9tYWRlc2ltcGxlLnNrLz91dG1fc291cmNlPWNtc21zJTJCbW9kdWxlJnV0bV9tZWRpdW09bGluayZ1dG1fY2FtcGFpZ249cnNzc2ltcGxlcGllIj5tYWRlc2ltcGxlLnNrPC9hPjxicj4KICAgIDxhIGhyZWY9Imh0dHA6Ly90d2l0dGVyLmNvbS9rdXptYW55Ij50d2l0dGVyPC9hPjxicj4KICAgIDxhIGhyZWY9Imh0dHA6Ly9hYm91dC5tZS9rdXptYW55Ij5hYm91dC5tZTwvYT48YnI+PGJyIC8+CiAgICA8c3Ryb25nPkRvIG5pY2UgdGhpbmcgd2l0aCBtZTwvc3Ryb25nPjxiciAvPgogICAgPGEgaHJlZj0iaHR0cDovL2Ntc21hZGVzaW1wbGUuc2svb3V0c291cmNpbmcvP3V0bV9zb3VyY2U9Y21zbXMlMkJtb2R1bGUmdXRtX21lZGl1bT1saW5rJnV0bV9jYW1wYWlnbj1yc3NzaW1wbGVwaWUiPkNNUyBNYWRlIFNpbXBsZSBvdXRzb3VyY2luZzwvYT48YnI+PGJyPgo8L3A+PGgzPkRlcGVuZGVuY2llczwvaDM+PHVsPjxsaT5DR0V4dGVuc2lvbnMgPSZndDsgMS4yOTwvbGk+PGxpPkV4dGVuZGVkVG9vbHMgPSZndDsgMS4zLjM8L2xpPjwvdWw+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gZmVlZHM9IiIgLSAtLSBNaXNzaW5nIExhbmd1YWdlc3RyaW5nIC0gbW9kdWxlOlJTU1NpbXBsZVBpZSBzdHJpbmc6aGVscF9mZWVkcy0tPC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBmZWVkPSIiIC0gVGhpcyBpcyB5b3VyIGZlZWRzIHVybHMtIHtSU1NTaW1wbGVQaWUgZmVlZHM9Imh0dHA6Ly9mZWVkcy5mZWVkYnVybmVyLmNvbS9rdXptYW55L3NvY2lhbCwgaHR0cDovL2ZlZWRzLm1hc2hhYmxlLmNvbS9tYXNoYWJsZSJ9PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsaW1pdD0iMCIgLSBEZWZhdWx0IGlzICIwIiB0aGlzIG1lYW5zIGRpc3BsYXkgYWxsLiBPciBsaW1pdD0iMTAiIGluY2x1ZGUganVzdCAxMCBpdGVtcyBmZWVkcy48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGNhY2hlX3RpbWVvdXQ9IjAiIC0gLS0gTWlzc2luZyBMYW5ndWFnZXN0cmluZyAtIG1vZHVsZTpSU1NTaW1wbGVQaWUgc3RyaW5nOmhlbHBfY2FjaGVfdGltZW91dC0tPC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiB0ZW1wbGF0ZT0iIiAtIFNldCB5b3VyIHRlbXBsYXRlICB0ZW1wbGF0ZT0ieW91dHViZSIgPC9saT48L3VsPg==]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBAa3V6bWFueSAmbHQ7emRlbm9Aa3V6bWFueS5iaXomZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMS4wPGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+PHVsPgo8bGk+ClZlcnNpb24gMS4wICBhdWd1c3QgMjAxMi4gSW5pdGlhbCBSZWxlYXNlLgo8L2xpPiAKPC91bD4KPGJyIC8+]]></about>
	<description><![CDATA[CSMSimplePie is an RSS to HTML parser. Powerfull Module.]]></description>
	<requires>
	  <requiredname>CGExtensions</requiredname>
	  <requiredversion>1.29</requiredversion>
	</requires>
	<requires>
	  <requiredname>ExtendedTools</requiredname>
	  <requiredversion>1.3.3</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTW9kdWxlOiBSU1NTaW1wbGVQaWUgLSBzdXBlci1mYXN0LCBlYXN5LXRvLXVzZSwgUlNTIGFuZCBBdG9tIGZlZWQgcGFyc2luZyBpbiBQSFAuCiMgWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIGt1em1hbnkuYml6CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NpbXBsZXBpZS8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiAoIWlzc2V0KCRnQ21zKSkKICAgIGV4aXQ7CgokY29uZmlnID0gY21zbXMoKS0+R2V0Q29uZmlnKCk7CiRkYiA9IGNtc21zKCktPkdldERiKCk7CgokZmVlZCA9ICcnOwokZmVlZHMgPSAnJzsKJHN0YXJ0ID0gMDsKJHBhZ2UgPSAxOwokaW5saW5lID0gMDsKJGlzX2NhY2hlID0gZmFsc2U7CgppZiAoaXNzZXQoJHBhcmFtc1snZmVlZCddKSkgewogICAgJGZlZWQgPSAkcGFyYW1zWydmZWVkJ107CiAgICAkdXJsID0gJGZlZWQ7Cn0gZWxzZWlmIChpc3NldCgkcGFyYW1zWydmZWVkcyddKSkgewogICAgJGZlZWRzID0gJHBhcmFtc1snZmVlZHMnXTsKICAgICR1cmwgPSBleHBsb2RlKCcsJywgKCRmZWVkcykpOwp9IGVsc2UgewogICAgZWNobyAkdGhpcy0+TGFuZygnZnJvbnRfcGFyYW1fbmFtZScpOwogICAgcmV0dXJuOwp9CgovL1ByZWZlcmVuY2VzCgokbGltaXQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGltaXQnLCAnMTAnKTsKaWYgKGlzc2V0KCRwYXJhbXNbImxpbWl0Il0pKQogICAgJGxpbWl0ID0gJHBhcmFtc1sibGltaXQiXTsKCiRjYWNoZV9saWZldGltZSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdjYWNoZV9saWZldGltZScsIDE4MDApOwppZiAoaXNzZXQoJHBhcmFtc1siY2FjaGVfbGlmZXRpbWUiXSkpCiAgICAkY2FjaGVfbGlmZXRpbWUgPSAkcGFyYW1zWyJjYWNoZV9saWZldGltZSJdOwoKaWYgKGlzc2V0KCRwYXJhbXNbJ2lubGluZSddKSkgewogICAgJGlubGluZSA9ICRwYXJhbXNbJ2lubGluZSddOwp9CgppZiAoJGNhY2hlX2xpZmV0aW1lKQogICAgJGlzX2NhY2hlID0gdHJ1ZTsKCgovL2dyYWIgdGhlIGZlZWQKJGZlZWQgPSBuZXcgU2ltcGxlUGllKCk7CgppZiAoJHVybCA9PSBudWxsKSB7CiAgICBlY2hvICR0aGlzLT5MYW5nKCdmcm9udF9ub19mZWVkJyk7CiAgICByZXR1cm47Cn0KCiRmZWVkLT5zZXRfZmVlZF91cmwoJHVybCk7CiRmZWVkLT5zZXRfY2FjaGVfbG9jYXRpb24oVE1QX0NBQ0hFX0xPQ0FUSU9OKTsKJGZlZWQtPmVuYWJsZV9jYWNoZSgkaXNfY2FjaGUpOwokZmVlZC0+c2V0X2NhY2hlX2R1cmF0aW9uKCRjYWNoZV9saWZldGltZSk7Ci8vaW5pdCB0aGUgcHJvY2VzcwokZmVlZC0+aW5pdCgpOwokZmVlZC0+aGFuZGxlX2NvbnRlbnRfdHlwZSgpOwoKJGNvdW50ID0gJGZlZWQtPmdldF9pdGVtX3F1YW50aXR5KCk7CgppZiAoaXNzZXQoJHBhcmFtc1sncGFnZSddKSkgewogICAgJHBhZ2UgPSAoaW50KSAkcGFyYW1zWydwYWdlJ107CiAgICBpZiAoJHBhZ2UgPCAxKQogICAgICAgICRwYWdlID0gMTsKfQoKJHN0YXJ0ZWxlbWVudCA9ICgkcGFnZSAtIDEpICogJGxpbWl0OwoKLy8gRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcGFnZXMKJG5wYWdlcyA9IGludHZhbCgkY291bnQgLyAkbGltaXQpOwppZiAoJGNvdW50ICUgJGxpbWl0ICE9IDApCiAgICAkbnBhZ2VzKys7Cgokc21hcnR5LT5hc3NpZ24oJ3BhZ2V0ZXh0JywgJHRoaXMtPkxhbmcoJ3BhZ2UnKSk7CiRzbWFydHktPmFzc2lnbignb2Z0ZXh0JywgJHRoaXMtPkxhbmcoJ29mJykpOwokc21hcnR5LT5hc3NpZ24oJ3BhZ2Vjb3VudCcsICRucGFnZXMpOwokc21hcnR5LT5hc3NpZ24oJ2N1cnBhZ2UnLCAkcGFnZSk7CiRzbWFydHktPmFzc2lnbigncGFnZW51bWJlcicsICRwYWdlKTsKaWYgKCRwYWdlID09IDEpIHsKICAgICRzbWFydHktPmFzc2lnbignZmlyc3RsaW5rJywgJHRoaXMtPkxhbmcoJ2ZpcnN0cGFnZScpKTsKICAgICRzbWFydHktPmFzc2lnbigncHJldmxpbmsnLCAkdGhpcy0+TGFuZygncHJldnBhZ2UnKSk7Cn0gZWxzZSB7CiAgICAkcGFybXMgPSAkcGFyYW1zOwogICAgJHBhcm1zWydwYWdlJ10gPSAxOwogICAgJHNtYXJ0eS0+YXNzaWduKCdmaXJzdGxpbmsnLCAkdGhpcy0+Q3JlYXRlTGluaygkaWQsICdkZWZhdWx0JywgJHJldHVybmlkLCAkdGhpcy0+TGFuZygnZmlyc3RwYWdlJyksICRwYXJtcywgJycsIGZhbHNlLCAkaW5saW5lKSk7CiAgICAkc21hcnR5LT5hc3NpZ24oJ2ZpcnN0dXJsJywgJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCwgJHRoaXMtPkxhbmcoJ2ZpcnN0cGFnZScpLCAkcGFybXMsICcnLCB0cnVlLCAkaW5saW5lKSk7CiAgICAkcGFybXNbJ3BhZ2UnXSA9ICRwYWdlIC0gMTsKICAgICRzbWFydHktPmFzc2lnbigncHJldmxpbmsnLCAkdGhpcy0+Q3JlYXRlTGluaygkaWQsICdkZWZhdWx0JywgJHJldHVybmlkLCAkdGhpcy0+TGFuZygncHJldnBhZ2UnKSwgJHBhcm1zLCAnJywgZmFsc2UsICRpbmxpbmUpKTsKICAgICRzbWFydHktPmFzc2lnbigncHJldnVybCcsICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwgJ2RlZmF1bHQnLCAkcmV0dXJuaWQsICR0aGlzLT5MYW5nKCdwcmV2cGFnZScpLCAkcGFybXMsICcnLCB0cnVlLCAkaW5saW5lKSk7Cn0KaWYgKCRwYWdlID09ICRucGFnZXMpIHsKICAgICRzbWFydHktPmFzc2lnbignbGFzdGxpbmsnLCAkdGhpcy0+TGFuZygnbGFzdHBhZ2UnKSk7CiAgICAkc21hcnR5LT5hc3NpZ24oJ25leHRsaW5rJywgJHRoaXMtPkxhbmcoJ25leHRwYWdlJykpOwp9IGVsc2UgewogICAgJHBhcm1zID0gJHBhcmFtczsKICAgICRwYXJtc1sncGFnZSddID0gJG5wYWdlczsKICAgICRzbWFydHktPmFzc2lnbignbGFzdGxpbmsnLCAkdGhpcy0+Q3JlYXRlTGluaygkaWQsICdkZWZhdWx0JywgJHJldHVybmlkLCAkdGhpcy0+TGFuZygnbGFzdHBhZ2UnKSwgJHBhcm1zLCAnJywgZmFsc2UsICRpbmxpbmUpKTsKICAgICRzbWFydHktPmFzc2lnbignbGFzdHVybCcsICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwgJ2RlZmF1bHQnLCAkcmV0dXJuaWQsICR0aGlzLT5MYW5nKCdsYXN0cGFnZScpLCAkcGFybXMsICcnLCB0cnVlLCAkaW5saW5lKSk7CiAgICAkcGFybXNbJ3BhZ2UnXSA9ICRwYWdlICsgMTsKICAgICRzbWFydHktPmFzc2lnbignbmV4dGxpbmsnLCAkdGhpcy0+Q3JlYXRlTGluaygkaWQsICdkZWZhdWx0JywgJHJldHVybmlkLCAkdGhpcy0+TGFuZygnbmV4dHBhZ2UnKSwgJHBhcm1zLCAnJywgZmFsc2UsICRpbmxpbmUpKTsKICAgICRzbWFydHktPmFzc2lnbignbmV4dHVybCcsICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwgJ2RlZmF1bHQnLCAkcmV0dXJuaWQsICR0aGlzLT5MYW5nKCduZXh0cGFnZScpLCAkcGFybXMsICcnLCB0cnVlLCAkaW5saW5lKSk7Cn0KCiRmZWVkcyA9ICRmZWVkLT5nZXRfaXRlbXMoJHN0YXJ0ZWxlbWVudCwgJGxpbWl0KTsKJHNtYXJ0eS0+YXNzaWduX2J5X3JlZignZmVlZHMnLCAkZmVlZHMpOwoKLy8gdGVtcGxhdGUKJHRoZXRlbXBsYXRlID0gJ3Jzc190ZW1wbGF0ZScgLiAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnY3VycmVudF9yc3NfdGVtcGxhdGUnKTsKaWYgKGlzc2V0KCRwYXJhbXNbJ3RlbXBsYXRlJ10pKSB7CiAgICAkdGhldGVtcGxhdGUgPSAncnNzX3RlbXBsYXRlJyAuICRwYXJhbXNbJ3RlbXBsYXRlJ107Cn0KCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgkdGhldGVtcGxhdGUpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTW9kdWxlOiBSU1NTaW1wbGVQaWUgLSBzdXBlci1mYXN0LCBlYXN5LXRvLXVzZSwgUlNTIGFuZCBBdG9tIGZlZWQgcGFyc2luZyBpbiBQSFAuCiMgWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIGt1em1hbnkuYml6CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NpbXBsZXBpZS8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiAoIWlzc2V0KCRnQ21zKSkKICAgIGV4aXQ7CgppZiAoISR0aGlzLT5DaGVja0FjY2VzcygpKSB7CiAgICBlY2hvICR0aGlzLT5TaG93RXJyb3JzKCR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CiAgICByZXR1cm47Cn0KZWNobyAkdGhpcy0+U3RhcnRUYWJIZWFkZXJzKCk7CgplY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ2dlbmVyYWwnLCAkdGhpcy0+TGFuZygncnNzJykpOwppZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpKQogICAgZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCdyc3NfdGVtcGxhdGVzJywgJ0ZlZWRzIFRlbXBsYXRlcycpOwppZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigncHJlZnMnLCAkdGhpcy0+TGFuZygndGl0bGVfbW9kX3ByZWZzJykpOwoKZWNobyAkdGhpcy0+RW5kVGFiSGVhZGVycygpOwoKCgplY2hvICR0aGlzLT5TdGFydFRhYkNvbnRlbnQoKTsKCmVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdnZW5lcmFsJyk7CmVjaG8gJHRoaXMtPkxhbmcoJ2Jhc2ljX2hlbHAnKTsKZWNobyAkdGhpcy0+RW5kVGFiKCk7CgoKaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBUZW1wbGF0ZXMnKSkgewogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ3Jzc190ZW1wbGF0ZXMnLCAkcGFyYW1zKTsKICAgIGVjaG8gJHRoaXMtPlNob3dUZW1wbGF0ZUxpc3QoJGlkLCAkcmV0dXJuaWQsICdyc3NfdGVtcGxhdGUnLCAnZGVmYXVsdF9yc3NfdGVtcGxhdGUnLCAncnNzX3RlbXBsYXRlcycsICdjdXJyZW50X3Jzc190ZW1wbGF0ZScsICR0aGlzLT5MYW5nKCdhZGRlZGl0X3Jzc190ZW1wbGF0ZScpKTsKICAgIGVjaG8gJHRoaXMtPkVuZFRhYigpOwp9CgoKaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpIHsKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdwcmVmcycsICRwYXJhbXMpOwogICAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKSAuICcvZnVuY3Rpb24uYWRtaW5fcHJlZnNfdGFiLnBocCcpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7Cn0KCmVjaG8gJHRoaXMtPkVuZFRhYkNvbnRlbnQoKTsKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.save_admin_prefs.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTW9kdWxlOiBSU1NTaW1wbGVQaWUgLSBzdXBlci1mYXN0LCBlYXN5LXRvLXVzZSwgUlNTIGFuZCBBdG9tIGZlZWQgcGFyc2luZyBpbiBQSFAuCiMgWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIGt1em1hbnkuYml6CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NpbXBsZXBpZS8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiAoIWlzc2V0KCRnQ21zKSkKICAgIGV4aXQ7CgoKaWYgKCEkdGhpcy0+Q2hlY2tBY2Nlc3MoKSkgewogICAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwogICAgcmV0dXJuOwp9CgoKaWYgKGlzc2V0KCRwYXJhbXNbJ3N1Ym1pdF9wcmVmJ10pICYmIHRyaW0oJHBhcmFtc1snbGltaXQnXSkgIT0gJycgJiYgdHJpbSgkcGFyYW1zWydjYWNoZV9saWZldGltZSddKSAhPSAnJykgewogICAgLy8gc2V0IG91ciBwcmVmZXJlbmNlCiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbGltaXQnLCBpc3NldCgkcGFyYW1zWydsaW1pdCddKSA/IHRyaW0oJHBhcmFtc1snbGltaXQnXSkgOiAnMCcpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2NhY2hlX2xpZmV0aW1lJywgaXNzZXQoJHBhcmFtc1snY2FjaGVfbGlmZXRpbWUnXSkgPyB0cmltKCRwYXJhbXNbJ2NhY2hlX2xpZmV0aW1lJ10pIDogMTgwMCk7CgogICAgLy8gd3JpdGUgdG8gdGhlIGFkbWluIGxvZwogICAgJHRoaXMtPkF1ZGl0KDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ3ByZWZzdXBkYXRlZCcpKTsKICAgICR0aGlzLT5TZXRNZXNzYWdlKCR0aGlzLT5MYW5nKCdwcmVmc3VwZGF0ZWQnKSk7Cn0gZWxzZSB7CiAgICAkdGhpcy0+U2V0RXJyb3IoJHRoaXMtPkxhbmcoJ2Vycm9yX2ZlZWQnKSk7Cn0KCiR0aGlzLT5TZXRDdXJyZW50VGFiKCdwcmVmcycpOwokdGhpcy0+UmVkaXJlY3RUb1RhYigkaWQpOwo/PgoK]]></data>
	</file>
	<file>
	  <filename>/author.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPkFib3V0IEF1dGhvcjwvaDM+CjxwPlpkZW5vIEt1em1hbnk8YnIgLz4gPGJyIC8+CiAgICA8c3Ryb25nPlBlcnNvbmFsOjwvc3Ryb25nPjxicj4KICAgIDxhIGhyZWY9Imh0dHA6Ly9rdXptYW55LmJpei8/dXRtX3NvdXJjZT1jbXNtcyUyQm1vZHVsZSZ1dG1fbWVkaXVtPWxpbmsmdXRtX2NhbXBhaWduPXJzc3NpbXBsZXBpZSI+a3V6bWFueS5iaXo8L2E+PGJyPgogICAgPGEgaHJlZj0iaHR0cDovL21hZGVzaW1wbGUuc2svP3V0bV9zb3VyY2U9Y21zbXMlMkJtb2R1bGUmdXRtX21lZGl1bT1saW5rJnV0bV9jYW1wYWlnbj1yc3NzaW1wbGVwaWUiPm1hZGVzaW1wbGUuc2s8L2E+PGJyPgogICAgPGEgaHJlZj0iaHR0cDovL3R3aXR0ZXIuY29tL2t1em1hbnkiPnR3aXR0ZXI8L2E+PGJyPgogICAgPGEgaHJlZj0iaHR0cDovL2Fib3V0Lm1lL2t1em1hbnkiPmFib3V0Lm1lPC9hPjxicj48YnIgLz4KICAgIDxzdHJvbmc+RG8gbmljZSB0aGluZyB3aXRoIG1lPC9zdHJvbmc+PGJyIC8+CiAgICA8YSBocmVmPSJodHRwOi8vY21zbWFkZXNpbXBsZS5zay9vdXRzb3VyY2luZy8/dXRtX3NvdXJjZT1jbXNtcyUyQm1vZHVsZSZ1dG1fbWVkaXVtPWxpbmsmdXRtX2NhbXBhaWduPXJzc3NpbXBsZXBpZSI+Q01TIE1hZGUgU2ltcGxlIG91dHNvdXJjaW5nPC9hPjxicj48YnI+CjwvcD4=]]></data>
	</file>
	<file>
	  <filename>/changelog.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgo8bGk+ClZlcnNpb24gMS4wICBhdWd1c3QgMjAxMi4gSW5pdGlhbCBSZWxlYXNlLgo8L2xpPiAKPC91bD4K]]></data>
	</file>
	<file>
	  <filename>/function.admin_prefs_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgTW9kdWxlOiBSU1NTaW1wbGVQaWUgLSBzdXBlci1mYXN0LCBlYXN5LXRvLXVzZSwgUlNTIGFuZCBBdG9tIGZlZWQgcGFyc2luZyBpbiBQSFAuDQojIFpkZW5vIEt1em1hbnkgKHpkZW5vQGt1em1hbnkuYml6KSBrdXptYW55LmJpeg0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NpbXBsZXBpZS8NCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQppZiAoIWlzc2V0KCRnQ21zKSkNCiAgICBleGl0Ow0KDQppZiAoISR0aGlzLT5DaGVja0FjY2VzcygpKSB7DQogICAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOw0KICAgIHJldHVybjsNCn0NCg0KJHNtYXJ0eS0+YXNzaWduKCdzdGFydF9mb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsICdzYXZlX2FkbWluX3ByZWZzJywgJHJldHVybmlkKSk7DQokc21hcnR5LT5hc3NpZ24oJ2lucHV0X2xpbWl0JywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICdsaW1pdCcsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsaW1pdCcsICcxMCcpKSk7DQoNCiRzbWFydHktPmFzc2lnbignaW5wdXRfY2FjaGVfbGlmZXRpbWUnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2NhY2hlX2xpZmV0aW1lJywgJHRoaXMtPg0KICAgICAgICAgICAgICAgICAgICAgICAgR2V0UHJlZmVyZW5jZSgnY2FjaGVfbGlmZXRpbWUnLCAxODAwKSkpOw0KDQokc21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdzdWJtaXRfcHJlZicsIGxhbmcoJ3N1Ym1pdCcpKSk7DQokc21hcnR5LT5hc3NpZ24oJ2VuZF9mb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7DQoNCg0KZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZG1pbl9wcmVmcy50cGwnKTsNCj8+]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</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[PD9waHAKCiNUZW1wbGF0ZXMKJGxhbmdbJ2FkZGVkaXRfcnNzX3RlbXBsYXRlJ10gPSAnQWRkL0VkaXQgYSByc3MgdmlldyBUZW1wbGF0ZSc7CgojTWVzc2FnZXMKJGxhbmdbJ3VwZGF0ZWRfZmVlZCddID0gJ0ZlZWQgdXBkYXRlZC4nOwokbGFuZ1snZXJyb3JfZmVlZCddID0gJ1NvbWUgZmllbGRzIGFyZSBlbXB0eSEnOwokbGFuZ1snYWRkZWRfZmVlZCddID0gJ0ZlZWQgaXMgQWRkZWQuJzsKJGxhbmdbJ2FyZV95b3Vfc3VyZSddID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBGZWVkPyc7CiRsYW5nWydmZWVkX2RlbGV0ZWQnXSA9ICdGZWVkIHdhcyByZW1vdmVkIHN1Y2Nlc3NmdWxseS4nOwokbGFuZ1snZXJyb3JfZGVsZXRlJ10gPSAnU29tZXRoaW5nIHdyb25nIGhhcHBlbmVkLCB0cnkgYWdhaW4uJzsKJGxhbmdbJ2Zyb250X25vX2ZlZWQnXSA9ICdOTyBGZWVkcyBBdmFsaWFibGUhJzsKJGxhbmdbJ2Zyb250X3BhcmFtX25hbWUnXSA9ICdQYXJhbSBOYW1lIGlzIE1pc3NpbmchJzsKJGxhbmdbJ2ZlZWRfbmFtZV9leGlzdHMnXSA9ICdPbmUgRmVlZCB3aXRoIHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cyEnOwoKI1ByZWYgdGFiCiRsYW5nWydwcmVmc3VwZGF0ZWQnXSA9ICdNb2R1bGUgcHJlZmVyZW5jZXMgdXBkYXRlZC4nOwokbGFuZ1sndGl0bGVfbGltaXQnXSA9ICdMaW1pdCBJdGVtcyBGZWVkcyc7CiRsYW5nWyd0aXRsZV9jYWNoZV9saWZldGltZSddID0gJ0NhY2hlIExpZmV0aW1lJzsKJGxhbmdbJ25vdGVzX2NhY2hlX2xpZmV0aW1lJ10gPSAnQ2FjaGUgTGlmZXRpbWUgaW4gc2Vjb25kcy4gRS5HOiBIYWxmIGhvdXIgICIxODAwIiwgT25lIEhvdXIgIjM2MDAiLiBTZXQgdG8gMCBkaXNhYmxlIGNhY2hpbmcuJzsKCiNHZW5lcmFsIE1vZHVsZQokbGFuZ1sncnNzJ10gPSAnUlNTJzsKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1JTUyBTaW1wbGUgUGllJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnUlNTIFNpbXBsZSBQaWUgaXMgaW5zdGFsbGVkLCBiZSBzdXJlIHRvIHNldCAiJyAuIFVTRV9SU1NTaW1wbGVQaWUgLiAnIiBwZXJtaXNzaW9ucyB0byB1c2UgdGhpcyBtb2R1bGUhJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdSU1MgU2ltcGxlIFBpZSBpcyBVbmluc3RhbGxlZCEnOwokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB1bmluc3RhbGwgdGhpcyBtb2R1bGU/JzsKJGxhbmdbJ3VuaW5zdGFsbGVkJ10gPSAnTW9kdWxlIFVuaW5zdGFsbGVkLic7CiRsYW5nWydpbnN0YWxsZWQnXSA9ICdNb2R1bGUgdmVyc2lvbiAlcyBpbnN0YWxsZWQuJzsKJGxhbmdbJ3VwZ3JhZGVkJ10gPSAnTW9kdWxlIHVwZ3JhZGVkIHRvIHZlcnNpb24gJXMuJzsKCiRsYW5nWydwYWdlJ10gPSAnUGFnZSc7CiRsYW5nWydwYWdlX29mJ10gPSAnUGFnZSAlcyBvZiAlcyc7CiRsYW5nWydwYWdlX2xpbWl0J10gPSAnUGFnZSBMaW1pdCc7CiRsYW5nWydmaXJzdHBhZ2UnXSA9ICcmbHQ7Jmx0Oyc7CiRsYW5nWyduZXh0cGFnZSddID0gJyZndDsnOwokbGFuZ1sncHJldnBhZ2UnXSA9ICcmbHQ7JzsKCiRsYW5nWydhY2Nlc3NkZW5pZWQnXSA9ICdBY2Nlc3MgRGVuaWVkLiBQbGVhc2UgY2hlY2sgeW91ciBwZXJtaXNzaW9ucy4nOwoKI0hlbHAgUGFyYW1zCiRsYW5nWydoZWxwX2xpbWl0J10gPSAnRGVmYXVsdCBpcyAiMCIgdGhpcyBtZWFucyBkaXNwbGF5IGFsbC4gT3IgbGltaXQ9IjEwIiBpbmNsdWRlIGp1c3QgMTAgaXRlbXMgZmVlZHMuJzsKJGxhbmdbJ2hlbHBfZmVlZCddID0gJ1RoaXMgaXMgeW91ciBmZWVkIHVybCAge1JTU1NpbXBsZVBpZSBmZWVkPSJodHRwOi8vZmVlZHMuZmVlZGJ1cm5lci5jb20va3V6bWFueS9zb2NpYWwifSc7CiRsYW5nWydoZWxwX2ZlZWQnXSA9ICdUaGlzIGlzIHlvdXIgZmVlZHMgdXJscy0ge1JTU1NpbXBsZVBpZSBmZWVkcz0iaHR0cDovL2ZlZWRzLmZlZWRidXJuZXIuY29tL2t1em1hbnkvc29jaWFsLCBodHRwOi8vZmVlZHMubWFzaGFibGUuY29tL21hc2hhYmxlIn0nOwokbGFuZ1snaGVscF90ZW1wbGF0ZSddID0gJ1NldCB5b3VyIHRlbXBsYXRlICB0ZW1wbGF0ZT0ieW91dHViZSIgJzsKCiRsYW5nWyd0aXRsZV9tb2RfcHJlZnMnXSA9ICdNb2R1bGUgUHJlZmVyZW5jZXMnOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdDU01TaW1wbGVQaWUgaXMgYW4gUlNTIHRvIEhUTUwgcGFyc2VyLiBQb3dlcmZ1bGwgTW9kdWxlLic7CgokbGFuZ1snYmFzaWNfaGVscCddID0gJwo8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4KPHA+VGhpcyBpcyBSU1MgUGFyc2VyIHVzaW5nIHRoZSBTaW1wbGVQaWUgTGliIGh0dHA6Ly9zaW1wbGVwaWUub3JnPC9wPgo8aDM+SG93IERvIEkgVXNlIEl0PC9oMz4KPHA+U2ltcGxlLCBqdXN0IGFkZCBpdCB0byB5b3VyIHlvdXIgcGFnZSBvciB0ZW1wbGF0ZSBsaWtlIHRoaXM6CjxiciAvPgo8YnIgLz4Ke1JTU1NpbXBsZVBpZSBmZWVkPSJodHRwOi8vd3d3Lm55dGltZXMuY29tL3NlcnZpY2VzL3htbC9yc3Mvbnl0L0hvbWVQYWdlLnhtbCJ9CjxiciAvPgo8YnIgLz4Kb3IgZm9yIG11bHRpcGxlIHJzcyB2aWV3CjxiciAvPgo8YnIgLz4Ke1JTU1NpbXBsZVBpZSBmZWVkcz0iaHR0cDovL3d3dy5ueXRpbWVzLmNvbS9zZXJ2aWNlcy94bWwvcnNzL255dC9Ib21lUGFnZS54bWwsIGh0dHA6Ly9mZWVkcy5tYXNoYWJsZS5jb20vbWFzaGFibGUifQo8L3A+ICAgIAo8cD5Nb3JlIGluZm8gYWJvdXQgYWR2YW5jZWQgb3B0aW9ucyBmaW5kIGluIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2ltcGxlcGllLm9yZy93aWtpLyI+U2ltcGxlUGllIHdpa2k8L2E+LjwvcD4KJzsKCiRsYW5nWydoZWxwJ10gPSAkbGFuZ1snYmFzaWNfaGVscCddIC4gJwo8aDM+U3VwcG9ydDwvaDM+Cjx1bD4KPGxpPkZvciB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBtb2R1bGUsIEZBUXMsIG9yIHRvIGZpbGUgYSBCdWcgUmVwb3J0LCBwbGVhc2UgdmlzaXQgdGhlIE1vZHVsZSBGb3JnZQo8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NpbXBsZXBpZS8iPlJTUyBTaW1wbGUgUGllPC9hPi48L2xpPgo8bGk+QWRkaXRpb25hbCBkaXNjdXNzaW9uIG9mIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmciPkNNUyBNYWRlIFNpbXBsZSBGb3J1bXM8L2E+LjwvbGk+CjwvdWw+CjxwPlNwZWNpYWwgdGhhbmtzIHRvIG9yaWdpbmFsIENNUyBTaW1wbGUgUGllIG1vZHVsZSBhdXRob3IgTnVubyBDb3N0YSA8YSBocmVmPSJtYWlsdG86bnVuby5tZmNvc3RhQHNhcG8ucHQiPiZsdDtudW5vLm1mY29zdGFAc2Fwby5wdCZndDs8L2E+LjwvcD4KJyAuCiAgICAgICAgZmlsZV9nZXRfY29udGVudHMoZGlybmFtZShfX2ZpbGVfXykgLiAnLy4uL2F1dGhvci5pbmMnKTsKOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.SimplePie.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNpbXBsZVBpZQogKgogKiBBIFBIUC1CYXNlZCBSU1MgYW5kIEF0b20gRmVlZCBGcmFtZXdvcmsuCiAqIFRha2VzIHRoZSBoYXJkIHdvcmsgb3V0IG9mIG1hbmFnaW5nIGEgY29tcGxldGUgUlNTL0F0b20gc29sdXRpb24uCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNC0yMDEyLCBSeWFuIFBhcm1hbiwgR2VvZmZyZXkgU25lZGRvbiwgUnlhbiBNY0N1ZSwgYW5kIGNvbnRyaWJ1dG9ycwogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKICogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIAkqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mCiAqIAkgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogCSogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3QKICogCSAgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKICogCSAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAJKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTaW1wbGVQaWUgVGVhbSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQKICogCSAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKICogCSAgd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTCiAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCiAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTCiAqIEFORCBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCiAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAdmVyc2lvbiAxLjMKICogQGNvcHlyaWdodCAyMDA0LTIwMTIgUnlhbiBQYXJtYW4sIEdlb2ZmcmV5IFNuZWRkb24sIFJ5YW4gTWNDdWUKICogQGF1dGhvciBSeWFuIFBhcm1hbgogKiBAYXV0aG9yIEdlb2ZmcmV5IFNuZWRkb24KICogQGF1dGhvciBSeWFuIE1jQ3VlCiAqIEBsaW5rIGh0dHA6Ly9zaW1wbGVwaWUub3JnLyBTaW1wbGVQaWUKICogQGxpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAgQlNEIExpY2Vuc2UKICovCgovKioKICogU2ltcGxlUGllIE5hbWUKICovCmRlZmluZSgnU0lNUExFUElFX05BTUUnLCAnU2ltcGxlUGllJyk7CgovKioKICogU2ltcGxlUGllIFZlcnNpb24KICovCmRlZmluZSgnU0lNUExFUElFX1ZFUlNJT04nLCAnMS4zJyk7CgovKioKICogU2ltcGxlUGllIEJ1aWxkCiAqIEB0b2RvIEhhcmRjb2RlIGZvciByZWxlYXNlICh0aGVyZSdzIG5vIG5lZWQgdG8gaGF2ZSB0byBjYWxsIFNpbXBsZVBpZV9NaXNjOjpnZXRfYnVpbGQoKSBvbmx5IGV2ZXJ5IGxvYWQgb2Ygc2ltcGxlcGllLmluYykKICovCmRlZmluZSgnU0lNUExFUElFX0JVSUxEJywgJzIwMTIwNzA3MTEzMDEzJyk7CgovKioKICogU2ltcGxlUGllIFdlYnNpdGUgVVJMCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9VUkwnLCAnaHR0cDovL3NpbXBsZXBpZS5vcmcnKTsKCi8qKgogKiBTaW1wbGVQaWUgVXNlcmFnZW50CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfdXNlcmFnZW50KCkKICovCmRlZmluZSgnU0lNUExFUElFX1VTRVJBR0VOVCcsIFNJTVBMRVBJRV9OQU1FIC4gJy8nIC4gU0lNUExFUElFX1ZFUlNJT04gLiAnIChGZWVkIFBhcnNlcjsgJyAuIFNJTVBMRVBJRV9VUkwgLiAnOyBBbGxvdyBsaWtlIEdlY2tvKSBCdWlsZC8nIC4gU0lNUExFUElFX0JVSUxEKTsKCi8qKgogKiBTaW1wbGVQaWUgTGlua2JhY2sKICovCmRlZmluZSgnU0lNUExFUElFX0xJTktCQUNLJywgJzxhIGhyZWY9IicgLiBTSU1QTEVQSUVfVVJMIC4gJyIgdGl0bGU9IicgLiBTSU1QTEVQSUVfTkFNRSAuICcgJyAuIFNJTVBMRVBJRV9WRVJTSU9OIC4gJyI+JyAuIFNJTVBMRVBJRV9OQU1FIC4gJzwvYT4nKTsKCi8qKgogKiBObyBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX05PTkUnLCAwKTsKCi8qKgogKiBGZWVkIExpbmsgRWxlbWVudCBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX0FVVE9ESVNDT1ZFUlknLCAxKTsKCi8qKgogKiBMb2NhbCBGZWVkIEV4dGVuc2lvbiBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0VYVEVOU0lPTicsIDIpOwoKLyoqCiAqIExvY2FsIEZlZWQgQm9keSBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0JPRFknLCA0KTsKCi8qKgogKiBSZW1vdGUgRmVlZCBFeHRlbnNpb24gQXV0b2Rpc2NvdmVyeQogKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2F1dG9kaXNjb3ZlcnlfbGV2ZWwoKQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTE9DQVRPUl9SRU1PVEVfRVhURU5TSU9OJywgOCk7CgovKioKICogUmVtb3RlIEZlZWQgQm9keSBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX1JFTU9URV9CT0RZJywgMTYpOwoKLyoqCiAqIEFsbCBGZWVkIEF1dG9kaXNjb3ZlcnkKICogQHNlZSBTaW1wbGVQaWU6OnNldF9hdXRvZGlzY292ZXJ5X2xldmVsKCkKICovCmRlZmluZSgnU0lNUExFUElFX0xPQ0FUT1JfQUxMJywgMzEpOwoKLyoqCiAqIE5vIGtub3duIGZlZWQgdHlwZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9OT05FJywgMCk7CgovKioKICogUlNTIDAuOTAKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTXzA5MCcsIDEpOwoKLyoqCiAqIFJTUyAwLjkxIChOZXRzY2FwZSkKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTXzA5MV9ORVRTQ0FQRScsIDIpOwoKLyoqCiAqIFJTUyAwLjkxIChVc2VybGFuZCkKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTXzA5MV9VU0VSTEFORCcsIDQpOwoKLyoqCiAqIFJTUyAwLjkxIChib3RoIE5ldHNjYXBlIGFuZCBVc2VybGFuZCkKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTXzA5MScsIDYpOwoKLyoqCiAqIFJTUyAwLjkyCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9UWVBFX1JTU18wOTInLCA4KTsKCi8qKgogKiBSU1MgMC45MwogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9SU1NfMDkzJywgMTYpOwoKLyoqCiAqIFJTUyAwLjk0CiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9UWVBFX1JTU18wOTQnLCAzMik7CgovKioKICogUlNTIDEuMAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9SU1NfMTAnLCA2NCk7CgovKioKICogUlNTIDIuMAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9SU1NfMjAnLCAxMjgpOwoKLyoqCiAqIFJERi1iYXNlZCBSU1MKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTX1JERicsIDY1KTsKCi8qKgogKiBOb24tUkRGLWJhc2VkIFJTUyAodHJ1bHkgaW50ZW5kZWQgYXMgc3luZGljYXRpb24gZm9ybWF0KQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9SU1NfU1lORElDQVRJT04nLCAxOTApOwoKLyoqCiAqIEFsbCBSU1MKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTX0FMTCcsIDI1NSk7CgovKioKICogQXRvbSAwLjMKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfQVRPTV8wMycsIDI1Nik7CgovKioKICogQXRvbSAxLjAKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfQVRPTV8xMCcsIDUxMik7CgovKioKICogQWxsIEF0b20KICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfQVRPTV9BTEwnLCA3NjgpOwoKLyoqCiAqIEFsbCBmZWVkIHR5cGVzCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9UWVBFX0FMTCcsIDEwMjMpOwoKLyoqCiAqIE5vIGNvbnN0cnVjdAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX05PTkUnLCAwKTsKCi8qKgogKiBUZXh0IGNvbnN0cnVjdAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQnLCAxKTsKCi8qKgogKiBIVE1MIGNvbnN0cnVjdAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX0hUTUwnLCAyKTsKCi8qKgogKiBYSFRNTCBjb25zdHJ1Y3QKICovCmRlZmluZSgnU0lNUExFUElFX0NPTlNUUlVDVF9YSFRNTCcsIDQpOwoKLyoqCiAqIGJhc2U2NC1lbmNvZGVkIGNvbnN0cnVjdAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX0JBU0U2NCcsIDgpOwoKLyoqCiAqIElSSSBjb25zdHJ1Y3QKICovCmRlZmluZSgnU0lNUExFUElFX0NPTlNUUlVDVF9JUkknLCAxNik7CgovKioKICogQSBjb25zdHJ1Y3QgdGhhdCBtaWdodCBiZSBIVE1MCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCcsIDMyKTsKCi8qKgogKiBBbGwgY29uc3RydWN0cwogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX0FMTCcsIDYzKTsKCi8qKgogKiBEb24ndCBjaGFuZ2UgY2FzZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfU0FNRV9DQVNFJywgMSk7CgovKioKICogQ2hhbmdlIHRvIGxvd2VyY2FzZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTE9XRVJDQVNFJywgMik7CgovKioKICogQ2hhbmdlIHRvIHVwcGVyY2FzZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVVBQRVJDQVNFJywgNCk7CgovKioKICogUENSRSBmb3IgSFRNTCBhdHRyaWJ1dGVzCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9QQ1JFX0hUTUxfQVRUUklCVVRFJywgJygoPzpbXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXStbXlx4MDlceDBBXHgwQlx4MENceDBEXHgyMFx4MkZceDNFXVteXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXHgyRlx4M0RceDNFXSooPzpbXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXSo9W1x4MDlceDBBXHgwQlx4MENceDBEXHgyMF0qKD86Iig/OlteIl0qKSJ8XCcoPzpbXlwnXSopXCd8KD86W15ceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceDIyXHgyN1x4M0VdW15ceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceDNFXSopPykpPykqKVtceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBdKicpOwoKLyoqCiAqIFBDUkUgZm9yIFhNTCBhdHRyaWJ1dGVzCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9QQ1JFX1hNTF9BVFRSSUJVVEUnLCAnKCg/OlxzKyg/Oig/OlteXHM6XSs6KT9bXlxzOl0rKVxzKj1ccyooPzoiKD86W14iXSopInxcJyg/OlteXCddKilcJykpKilccyonKTsKCi8qKgogKiBYTUwgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfWE1MJywgJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScpOwoKLyoqCiAqIEF0b20gMS4wIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAnLCAnaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tJyk7CgovKioKICogQXRvbSAwLjMgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMycsICdodHRwOi8vcHVybC5vcmcvYXRvbS9ucyMnKTsKCi8qKgogKiBSREYgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfUkRGJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnKTsKCi8qKgogKiBSU1MgMC45MCBOYW1lc3BhY2UKICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwJywgJ2h0dHA6Ly9teS5uZXRzY2FwZS5jb20vcmRmL3NpbXBsZS8wLjkvJyk7CgovKioKICogUlNTIDEuMCBOYW1lc3BhY2UKICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAnLCAnaHR0cDovL3B1cmwub3JnL3Jzcy8xLjAvJyk7CgovKioKICogUlNTIDEuMCBDb250ZW50IE1vZHVsZSBOYW1lc3BhY2UKICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTBfTU9EVUxFU19DT05URU5UJywgJ2h0dHA6Ly9wdXJsLm9yZy9yc3MvMS4wL21vZHVsZXMvY29udGVudC8nKTsKCi8qKgogKiBSU1MgMi4wIE5hbWVzcGFjZQogKiAoU3R1cGlkLCBJIGtub3csIGJ1dCBJJ20gY2VydGFpbiBpdCB3aWxsIGNvbmZ1c2UgcGVvcGxlIGxlc3Mgd2l0aCBzdXBwb3J0LikKICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjAnLCAnJyk7CgovKioKICogREMgMS4wIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwJywgJ2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjAvJyk7CgovKioKICogREMgMS4xIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExJywgJ2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJyk7CgovKioKICogVzNDIEJhc2ljIEdlbyAoV0dTODQgbGF0L2xvbmcpIFZvY2FidWxhcnkgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfVzNDX0JBU0lDX0dFTycsICdodHRwOi8vd3d3LnczLm9yZy8yMDAzLzAxL2dlby93Z3M4NF9wb3MjJyk7CgovKioKICogR2VvUlNTIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX0dFT1JTUycsICdodHRwOi8vd3d3Lmdlb3Jzcy5vcmcvZ2VvcnNzJyk7CgovKioKICogTWVkaWEgUlNTIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTJywgJ2h0dHA6Ly9zZWFyY2gueWFob28uY29tL21yc3MvJyk7CgovKioKICogV3JvbmcgTWVkaWEgUlNTIE5hbWVzcGFjZS4gQ2F1c2VkIGJ5IGEgbG9uZy1zdGFuZGluZyB0eXBvIGluIHRoZSBzcGVjLgogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTX1dST05HJywgJ2h0dHA6Ly9zZWFyY2gueWFob28uY29tL21yc3MnKTsKCi8qKgogKiBXcm9uZyBNZWRpYSBSU1MgTmFtZXNwYWNlICMyLiBOZXcgbmFtZXNwYWNlIGludHJvZHVjZWQgaW4gTWVkaWEgUlNTIDEuNS4KICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU19XUk9ORzInLCAnaHR0cDovL3ZpZGVvLnNlYXJjaC55YWhvby5jb20vbXJzcycpOwoKLyoqCiAqIFdyb25nIE1lZGlhIFJTUyBOYW1lc3BhY2UgIzMuIEEgcG9zc2libGUgdHlwbyBvZiB0aGUgTWVkaWEgUlNTIDEuNSBuYW1lc3BhY2UuCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NfV1JPTkczJywgJ2h0dHA6Ly92aWRlby5zZWFyY2gueWFob28uY29tL21yc3MvJyk7CgovKioKICogV3JvbmcgTWVkaWEgUlNTIE5hbWVzcGFjZSAjNC4gTmV3IHNwZWMgbG9jYXRpb24gYWZ0ZXIgdGhlIFJTUyBBZHZpc29yeSBCb2FyZCB0YWtlcyBpdCBvdmVyLCBidXQgbm90IGEgdmFsaWQgbmFtZXNwYWNlLgogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTX1dST05HNCcsICdodHRwOi8vd3d3LnJzc2JvYXJkLm9yZy9tZWRpYS1yc3MnKTsKCi8qKgogKiBXcm9uZyBNZWRpYSBSU1MgTmFtZXNwYWNlICM1LiBBIHBvc3NpYmxlIHR5cG8gb2YgdGhlIFJTUyBBZHZpc29yeSBCb2FyZCBVUkwuCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NfV1JPTkc1JywgJ2h0dHA6Ly93d3cucnNzYm9hcmQub3JnL21lZGlhLXJzcy8nKTsKCi8qKgogKiBpVHVuZXMgUlNTIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUycsICdodHRwOi8vd3d3Lml0dW5lcy5jb20vZHRkcy9wb2RjYXN0LTEuMC5kdGQnKTsKCi8qKgogKiBYSFRNTCBOYW1lc3BhY2UKICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9YSFRNTCcsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJyk7CgovKioKICogSUFOQSBMaW5rIFJlbGF0aW9ucyBSZWdpc3RyeQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWScsICdodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3JlbGF0aW9uLycpOwoKLyoqCiAqIE5vIGZpbGUgc291cmNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9GSUxFX1NPVVJDRV9OT05FJywgMCk7CgovKioKICogUmVtb3RlIGZpbGUgc291cmNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9GSUxFX1NPVVJDRV9SRU1PVEUnLCAxKTsKCi8qKgogKiBMb2NhbCBmaWxlIHNvdXJjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfRklMRV9TT1VSQ0VfTE9DQUwnLCAyKTsKCi8qKgogKiBmc29ja29wZW4oKSBmaWxlIHNvdXJjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfRklMRV9TT1VSQ0VfRlNPQ0tPUEVOJywgNCk7CgovKioKICogY1VSTCBmaWxlIHNvdXJjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfRklMRV9TT1VSQ0VfQ1VSTCcsIDgpOwoKLyoqCiAqIGZpbGVfZ2V0X2NvbnRlbnRzKCkgZmlsZSBzb3VyY2UKICovCmRlZmluZSgnU0lNUExFUElFX0ZJTEVfU09VUkNFX0ZJTEVfR0VUX0NPTlRFTlRTJywgMTYpOwoKLyoqCiAqIFNpbXBsZVBpZQogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICogQHN1YnBhY2thZ2UgQVBJCiAqLwpjbGFzcyBTaW1wbGVQaWUKewoJLyoqCgkgKiBAdmFyIGFycmF5IFJhdyBkYXRhCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHVibGljICRkYXRhID0gYXJyYXkoKTsKCgkvKioKCSAqIEB2YXIgbWl4ZWQgRXJyb3Igc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHVibGljICRlcnJvcjsKCgkvKioKCSAqIEB2YXIgb2JqZWN0IEluc3RhbmNlIG9mIFNpbXBsZVBpZV9TYW5pdGl6ZSAob3Igb3RoZXIgY2xhc3MpCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X3Nhbml0aXplX2NsYXNzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwdWJsaWMgJHNhbml0aXplOwoKCS8qKgoJICogQHZhciBzdHJpbmcgU2ltcGxlUGllIFVzZXJhZ2VudAoJICogQHNlZSBTaW1wbGVQaWU6OnNldF91c2VyYWdlbnQoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXB1YmxpYyAkdXNlcmFnZW50ID0gU0lNUExFUElFX1VTRVJBR0VOVDsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIEZlZWQgVVJMCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2ZlZWRfdXJsKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwdWJsaWMgJGZlZWRfdXJsOwoKCS8qKgoJICogQHZhciBvYmplY3QgSW5zdGFuY2Ugb2YgU2ltcGxlUGllX0ZpbGUgdG8gdXNlIGFzIGEgZmVlZAoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9maWxlKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwdWJsaWMgJGZpbGU7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBSYXcgZmVlZCBkYXRhCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X3Jhd19kYXRhKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwdWJsaWMgJHJhd19kYXRhOwoKCS8qKgoJICogQHZhciBpbnQgVGltZW91dCBmb3IgZmV0Y2hpbmcgcmVtb3RlIGZpbGVzCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X3RpbWVvdXQoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXB1YmxpYyAkdGltZW91dCA9IDEwOwoKCS8qKgoJICogQHZhciBib29sIEZvcmNlcyBmc29ja29wZW4oKSB0byBiZSB1c2VkIGZvciByZW1vdGUgZmlsZXMgaW5zdGVhZAoJICogb2YgY1VSTCwgZXZlbiBpZiBhIG5ldyBlbm91Z2ggdmVyc2lvbiBpcyBpbnN0YWxsZWQKCSAqIEBzZWUgU2ltcGxlUGllOjpmb3JjZV9mc29ja29wZW4oKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXB1YmxpYyAkZm9yY2VfZnNvY2tvcGVuID0gZmFsc2U7CgoJLyoqCgkgKiBAdmFyIGJvb2wgRm9yY2UgdGhlIGdpdmVuIGRhdGEvVVJMIHRvIGJlIHRyZWF0ZWQgYXMgYSBmZWVkIG5vIG1hdHRlciB3aGF0CgkgKiBpdCBhcHBlYXJzIGxpa2UKCSAqIEBzZWUgU2ltcGxlUGllOjpmb3JjZV9mZWVkKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwdWJsaWMgJGZvcmNlX2ZlZWQgPSBmYWxzZTsKCgkvKioKCSAqIEB2YXIgYm9vbCBFbmFibGUvRGlzYWJsZSBDYWNoaW5nCgkgKiBAc2VlIFNpbXBsZVBpZTo6ZW5hYmxlX2NhY2hlKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwdWJsaWMgJGNhY2hlID0gdHJ1ZTsKCgkvKioKCSAqIEB2YXIgaW50IENhY2hlIGR1cmF0aW9uIChpbiBzZWNvbmRzKQoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9jYWNoZV9kdXJhdGlvbigpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHVibGljICRjYWNoZV9kdXJhdGlvbiA9IDM2MDA7CgoJLyoqCgkgKiBAdmFyIGludCBBdXRvLWRpc2NvdmVyeSBjYWNoZSBkdXJhdGlvbiAoaW4gc2Vjb25kcykKCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9jYWNoZV9kdXJhdGlvbigpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHVibGljICRhdXRvZGlzY292ZXJ5X2NhY2hlX2R1cmF0aW9uID0gNjA0ODAwOyAvLyA3IERheXMuCgoJLyoqCgkgKiBAdmFyIHN0cmluZyBDYWNoZSBsb2NhdGlvbiAocmVsYXRpdmUgdG8gZXhlY3V0aW5nIHNjcmlwdCkKCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfY2FjaGVfbG9jYXRpb24oKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXB1YmxpYyAkY2FjaGVfbG9jYXRpb24gPSAnLi9jYWNoZSc7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBGdW5jdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIGNhY2hlIGZpbGVuYW1lCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2NhY2hlX25hbWVfZnVuY3Rpb24oKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXB1YmxpYyAkY2FjaGVfbmFtZV9mdW5jdGlvbiA9ICdtZDUnOwoKCS8qKgoJICogQHZhciBib29sIFJlb3JkZXIgZmVlZCBieSBkYXRlIGRlc2NlbmRpbmcKCSAqIEBzZWUgU2ltcGxlUGllOjplbmFibGVfb3JkZXJfYnlfZGF0ZSgpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHVibGljICRvcmRlcl9ieV9kYXRlID0gdHJ1ZTsKCgkvKioKCSAqIEB2YXIgbWl4ZWQgRm9yY2UgaW5wdXQgZW5jb2RpbmcgdG8gYmUgc2V0IHRvIHRoZSBmb2xsb3cgdmFsdWUKCSAqIChmYWxzZSwgb3IgYW55dGhpbmcgdHlwZS1jYXN0IHRvIGZhbHNlLCBkaXNhYmxlcyB0aGlzIGZlYXR1cmUpCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2lucHV0X2VuY29kaW5nKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwdWJsaWMgJGlucHV0X2VuY29kaW5nID0gZmFsc2U7CgoJLyoqCgkgKiBAdmFyIGludCBGZWVkIEF1dG9kaXNjb3ZlcnkgTGV2ZWwKCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHVibGljICRhdXRvZGlzY292ZXJ5ID0gU0lNUExFUElFX0xPQ0FUT1JfQUxMOwoKCS8qKgoJICogQ2xhc3MgcmVnaXN0cnkgb2JqZWN0CgkgKgoJICogQHZhciBTaW1wbGVQaWVfUmVnaXN0cnkKCSAqLwoJcHVibGljICRyZWdpc3RyeTsKCgkvKioKCSAqIEB2YXIgaW50IE1heGltdW0gbnVtYmVyIG9mIGZlZWRzIHRvIGNoZWNrIHdpdGggYXV0b2Rpc2NvdmVyeQoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9tYXhfY2hlY2tlZF9mZWVkcygpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHVibGljICRtYXhfY2hlY2tlZF9mZWVkcyA9IDEwOwoKCS8qKgoJICogQHZhciBhcnJheSBBbGwgdGhlIGZlZWRzIGZvdW5kIGR1cmluZyB0aGUgYXV0b2Rpc2NvdmVyeSBwcm9jZXNzCgkgKiBAc2VlIFNpbXBsZVBpZTo6Z2V0X2FsbF9kaXNjb3ZlcmVkX2ZlZWRzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwdWJsaWMgJGFsbF9kaXNjb3ZlcmVkX2ZlZWRzID0gYXJyYXkoKTsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIFdlYi1hY2Nlc3NpYmxlIHBhdGggdG8gdGhlIGhhbmRsZXJfaW1hZ2UucGhwIGZpbGUuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2ltYWdlX2hhbmRsZXIoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXB1YmxpYyAkaW1hZ2VfaGFuZGxlciA9ICcnOwoKCS8qKgoJICogQHZhciBhcnJheSBTdG9yZXMgdGhlIFVSTHMgd2hlbiBtdWx0aXBsZSBmZWVkcyBhcmUgYmVpbmcgaW5pdGlhbGl6ZWQuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2ZlZWRfdXJsKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwdWJsaWMgJG11bHRpZmVlZF91cmwgPSBhcnJheSgpOwoKCS8qKgoJICogQHZhciBhcnJheSBTdG9yZXMgU2ltcGxlUGllIG9iamVjdHMgd2hlbiBtdWx0aXBsZSBmZWVkcyBpbml0aWFsaXplZC4KCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwdWJsaWMgJG11bHRpZmVlZF9vYmplY3RzID0gYXJyYXkoKTsKCgkvKioKCSAqIEB2YXIgYXJyYXkgU3RvcmVzIHRoZSBnZXRfb2JqZWN0X3ZhcnMoKSBhcnJheSBmb3IgdXNlIHdpdGggbXVsdGlmZWVkcy4KCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfZmVlZF91cmwoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXB1YmxpYyAkY29uZmlnX3NldHRpbmdzID0gbnVsbDsKCgkvKioKCSAqIEB2YXIgaW50ZWdlciBTdG9yZXMgdGhlIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4gcGVyLWZlZWQgd2l0aCBtdWx0aWZlZWRzLgoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9pdGVtX2xpbWl0KCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwdWJsaWMgJGl0ZW1fbGltaXQgPSAwOwoKCS8qKgoJICogQHZhciBhcnJheSBTdG9yZXMgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyB0byBiZSBzdHJpcHBlZCBieSBzdHJpcF9hdHRyaWJ1dGVzKCkuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c3RyaXBfYXR0cmlidXRlcygpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHVibGljICRzdHJpcF9hdHRyaWJ1dGVzID0gYXJyYXkoJ2Jnc291bmQnLCAnY2xhc3MnLCAnZXhwcicsICdpZCcsICdzdHlsZScsICdvbmNsaWNrJywgJ29uZXJyb3InLCAnb25maW5pc2gnLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbmZvY3VzJywgJ29uYmx1cicsICdsb3dzcmMnLCAnZHluc3JjJyk7CgoJLyoqCgkgKiBAdmFyIGFycmF5IFN0b3JlcyB0aGUgZGVmYXVsdCB0YWdzIHRvIGJlIHN0cmlwcGVkIGJ5IHN0cmlwX2h0bWx0YWdzKCkuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c3RyaXBfaHRtbHRhZ3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXB1YmxpYyAkc3RyaXBfaHRtbHRhZ3MgPSBhcnJheSgnYmFzZScsICdibGluaycsICdib2R5JywgJ2RvY3R5cGUnLCAnZW1iZWQnLCAnZm9udCcsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2h0bWwnLCAnaWZyYW1lJywgJ2lucHV0JywgJ21hcnF1ZWUnLCAnbWV0YScsICdub3NjcmlwdCcsICdvYmplY3QnLCAncGFyYW0nLCAnc2NyaXB0JywgJ3N0eWxlJyk7CgoJLyoqCgkgKiBUaGUgU2ltcGxlUGllIGNsYXNzIGNvbnRhaW5zIGZlZWQgbGV2ZWwgZGF0YSBhbmQgb3B0aW9ucwoJICoKCSAqIFRvIHVzZSBTaW1wbGVQaWUsIGNyZWF0ZSB0aGUgU2ltcGxlUGllIG9iamVjdCB3aXRoIG5vIHBhcmFtZXRlcnMuIFlvdSBjYW4KCSAqIHRoZW4gc2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2luZyB0aGUgcHJvdmlkZWQgbWV0aG9kcy4gQWZ0ZXIgc2V0dGluZwoJICogdGhlbSwgeW91IG11c3QgaW5pdGlhbGlzZSB0aGUgZmVlZCB1c2luZyAkZmVlZC0+aW5pdCgpLiBBdCB0aGF0IHBvaW50IHRoZQoJICogb2JqZWN0J3MgbWV0aG9kcyBhbmQgcHJvcGVydGllcyB3aWxsIGJlIGF2YWlsYWJsZSB0byB5b3UuCgkgKgoJICogUHJldmlvdXNseSwgaXQgd2FzIHBvc3NpYmxlIHRvIHBhc3MgaW4gdGhlIGZlZWQgVVJMIGFsb25nIHdpdGggY2FjaGUKCSAqIG9wdGlvbnMgZGlyZWN0bHkgaW50byB0aGUgY29uc3RydWN0b3IuIFRoaXMgaGFzIGJlZW4gcmVtb3ZlZCBhcyBvZiAxLjMgYXMKCSAqIGl0IGNhdXNlZCBhIGxvdCBvZiBjb25mdXNpb24uCgkgKgoJICogQHNpbmNlIDEuMCBQcmV2aWV3IFJlbGVhc2UKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKCXsKCQlpZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNS4yJywgJzwnKSkKCQl7CgkJCXRyaWdnZXJfZXJyb3IoJ1BIUCA0LngsIDUuMCBhbmQgNS4xIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLiBQbGVhc2UgdXBncmFkZSB0byBQSFAgNS4yIG9yIG5ld2VyLicpOwoJCQlkaWUoKTsKCQl9CgoJCS8vIE90aGVyIG9iamVjdHMsIGluc3RhbmNlcyBjcmVhdGVkIGhlcmUgc28gd2UgY2FuIHNldCBvcHRpb25zIG9uIHRoZW0KCQkkdGhpcy0+c2FuaXRpemUgPSBuZXcgU2ltcGxlUGllX1Nhbml0aXplKCk7CgkJJHRoaXMtPnJlZ2lzdHJ5ID0gbmV3IFNpbXBsZVBpZV9SZWdpc3RyeSgpOwoKCQlpZiAoZnVuY19udW1fYXJncygpID4gMCkKCQl7CgkJCXRyaWdnZXJfZXJyb3IoJ1Bhc3NpbmcgcGFyYW1ldGVycyB0byB0aGUgY29uc3RydWN0b3IgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBzZXRfZmVlZF91cmwoKSwgc2V0X2NhY2hlX2xvY2F0aW9uKCksIGFuZCBzZXRfY2FjaGVfbG9jYXRpb24oKSBkaXJlY3RseS4nKTsKCQl9Cgl9CgoJLyoqCgkgKiBVc2VkIGZvciBjb252ZXJ0aW5nIG9iamVjdCB0byBhIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCgl7CgkJcmV0dXJuIG1kNShzZXJpYWxpemUoJHRoaXMtPmRhdGEpKTsKCX0KCgkvKioKCSAqIFJlbW92ZSBpdGVtcyB0aGF0IGxpbmsgYmFjayB0byB0aGlzIGJlZm9yZSBkZXN0cm95aW5nIHRoaXMgb2JqZWN0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkKCXsKCQlpZiAoKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMycsICc8JykgfHwgIWdjX2VuYWJsZWQoKSkgJiYgIWluaV9nZXQoJ3plbmQuemUxX2NvbXBhdGliaWxpdHlfbW9kZScpKQoJCXsKCQkJaWYgKCFlbXB0eSgkdGhpcy0+ZGF0YVsnaXRlbXMnXSkpCgkJCXsKCQkJCWZvcmVhY2ggKCR0aGlzLT5kYXRhWydpdGVtcyddIGFzICRpdGVtKQoJCQkJewoJCQkJCSRpdGVtLT5fX2Rlc3RydWN0KCk7CgkJCQl9CgkJCQl1bnNldCgkaXRlbSwgJHRoaXMtPmRhdGFbJ2l0ZW1zJ10pOwoJCQl9CgkJCWlmICghZW1wdHkoJHRoaXMtPmRhdGFbJ29yZGVyZWRfaXRlbXMnXSkpCgkJCXsKCQkJCWZvcmVhY2ggKCR0aGlzLT5kYXRhWydvcmRlcmVkX2l0ZW1zJ10gYXMgJGl0ZW0pCgkJCQl7CgkJCQkJJGl0ZW0tPl9fZGVzdHJ1Y3QoKTsKCQkJCX0KCQkJCXVuc2V0KCRpdGVtLCAkdGhpcy0+ZGF0YVsnb3JkZXJlZF9pdGVtcyddKTsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIEZvcmNlIHRoZSBnaXZlbiBkYXRhL1VSTCB0byBiZSB0cmVhdGVkIGFzIGEgZmVlZAoJICoKCSAqIFRoaXMgdGVsbHMgU2ltcGxlUGllIHRvIGlnbm9yZSB0aGUgY29udGVudC10eXBlIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2ZXIuCgkgKiBCZSBjYXJlZnVsIHdoZW4gdXNpbmcgdGhpcyBvcHRpb24sIGFzIGl0IHdpbGwgYWxzbyBkaXNhYmxlIGF1dG9kaXNjb3ZlcnkuCgkgKgoJICogQHNpbmNlIDEuMQoJICogQHBhcmFtIGJvb2wgJGVuYWJsZSBGb3JjZSB0aGUgZ2l2ZW4gZGF0YS9VUkwgdG8gYmUgdHJlYXRlZCBhcyBhIGZlZWQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGZvcmNlX2ZlZWQoJGVuYWJsZSA9IGZhbHNlKQoJewoJCSR0aGlzLT5mb3JjZV9mZWVkID0gKGJvb2wpICRlbmFibGU7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIFVSTCBvZiB0aGUgZmVlZCB5b3Ugd2FudCB0byBwYXJzZQoJICoKCSAqIFRoaXMgYWxsb3dzIHlvdSB0byBlbnRlciB0aGUgVVJMIG9mIHRoZSBmZWVkIHlvdSB3YW50IHRvIHBhcnNlLCBvciB0aGUKCSAqIHdlYnNpdGUgeW91IHdhbnQgdG8gdHJ5IHRvIHVzZSBhdXRvLWRpc2NvdmVyeSBvbi4gVGhpcyB0YWtlcyBwcmlvcml0eQoJICogb3ZlciBhbnkgc2V0IHJhdyBkYXRhLgoJICoKCSAqIFlvdSBjYW4gc2V0IG11bHRpcGxlIGZlZWRzIHRvIG1hc2ggdG9nZXRoZXIgYnkgcGFzc2luZyBhbiBhcnJheSBpbnN0ZWFkCgkgKiBvZiBhIHN0cmluZyBmb3IgdGhlICR1cmwuIFJlbWVtYmVyIHRoYXQgd2l0aCBlYWNoIGFkZGl0aW9uYWwgZmVlZCBjb21lcwoJICogYWRkaXRpb25hbCBwcm9jZXNzaW5nIGFuZCByZXNvdXJjZXMuCgkgKgoJICogQHNpbmNlIDEuMCBQcmV2aWV3IFJlbGVhc2UKCSAqIEBzZWUgc2V0X3Jhd19kYXRhKCkKCSAqIEBwYXJhbSBzdHJpbmd8YXJyYXkgJHVybCBUaGlzIGlzIHRoZSBVUkwgKG9yIGFycmF5IG9mIFVSTHMpIHRoYXQgeW91IHdhbnQgdG8gcGFyc2UuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfZmVlZF91cmwoJHVybCkKCXsKCQkkdGhpcy0+bXVsdGlmZWVkX3VybCA9IGFycmF5KCk7CgkJaWYgKGlzX2FycmF5KCR1cmwpKQoJCXsKCQkJZm9yZWFjaCAoJHVybCBhcyAkdmFsdWUpCgkJCXsKCQkJCSR0aGlzLT5tdWx0aWZlZWRfdXJsW10gPSAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnZml4X3Byb3RvY29sJywgYXJyYXkoJHZhbHVlLCAxKSk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmZlZWRfdXJsID0gJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2ZpeF9wcm90b2NvbCcsIGFycmF5KCR1cmwsIDEpKTsKCQl9Cgl9CgoJLyoqCgkgKiBTZXQgYW4gaW5zdGFuY2Ugb2Yge0BzZWUgU2ltcGxlUGllX0ZpbGV9IHRvIHVzZSBhcyBhIGZlZWQKCSAqCgkgKiBAcGFyYW0gU2ltcGxlUGllX0ZpbGUgJiRmaWxlCgkgKiBAcmV0dXJuIGJvb2wgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfZmlsZSgmJGZpbGUpCgl7CgkJaWYgKCRmaWxlIGluc3RhbmNlb2YgU2ltcGxlUGllX0ZpbGUpCgkJewoJCQkkdGhpcy0+ZmVlZF91cmwgPSAkZmlsZS0+dXJsOwoJCQkkdGhpcy0+ZmlsZSA9JiAkZmlsZTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFNldCB0aGUgcmF3IFhNTCBkYXRhIHRvIHBhcnNlCgkgKgoJICogQWxsb3dzIHlvdSB0byB1c2UgYSBzdHJpbmcgb2YgUlNTL0F0b20gZGF0YSBpbnN0ZWFkIG9mIGEgcmVtb3RlIGZlZWQuCgkgKgoJICogSWYgeW91IGhhdmUgYSBmZWVkIGF2YWlsYWJsZSBhcyBhIHN0cmluZyBpbiBQSFAsIHlvdSBjYW4gdGVsbCBTaW1wbGVQaWUKCSAqIHRvIHBhcnNlIHRoYXQgZGF0YSBzdHJpbmcgaW5zdGVhZCBvZiBhIHJlbW90ZSBmZWVkLiBBbnkgc2V0IGZlZWQgVVJMCgkgKiB0YWtlcyBwcmVjZWRlbmNlLgoJICoKCSAqIEBzaW5jZSAxLjAgQmV0YSAzCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIFJTUyBvciBBdG9tIGRhdGEgYXMgYSBzdHJpbmcuCgkgKiBAc2VlIHNldF9mZWVkX3VybCgpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfcmF3X2RhdGEoJGRhdGEpCgl7CgkJJHRoaXMtPnJhd19kYXRhID0gJGRhdGE7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIHRoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIGZldGNoaW5nIHJlbW90ZSBmZWVkcwoJICoKCSAqIFRoaXMgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIG1heGltdW0gdGltZSB0aGUgZmVlZCdzIHNlcnZlciB0byByZXNwb25kCgkgKiBhbmQgc2VuZCB0aGUgZmVlZCBiYWNrLgoJICoKCSAqIEBzaW5jZSAxLjAgQmV0YSAzCgkgKiBAcGFyYW0gaW50ICR0aW1lb3V0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIHRvIHNwZW5kIHdhaXRpbmcgdG8gcmV0cmlldmUgYSBmZWVkLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3RpbWVvdXQoJHRpbWVvdXQgPSAxMCkKCXsKCQkkdGhpcy0+dGltZW91dCA9IChpbnQpICR0aW1lb3V0OwoJfQoKCS8qKgoJICogRm9yY2UgU2ltcGxlUGllIHRvIHVzZSBmc29ja29wZW4oKSBpbnN0ZWFkIG9mIGNVUkwKCSAqCgkgKiBAc2luY2UgMS4wIEJldGEgMwoJICogQHBhcmFtIGJvb2wgJGVuYWJsZSBGb3JjZSBmc29ja29wZW4oKSB0byBiZSB1c2VkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBmb3JjZV9mc29ja29wZW4oJGVuYWJsZSA9IGZhbHNlKQoJewoJCSR0aGlzLT5mb3JjZV9mc29ja29wZW4gPSAoYm9vbCkgJGVuYWJsZTsKCX0KCgkvKioKCSAqIEVuYWJsZS9kaXNhYmxlIGNhY2hpbmcgaW4gU2ltcGxlUGllLgoJICoKCSAqIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZGlzYWJsZSBjYWNoaW5nIGFsbC10b2dldGhlciBpbiBTaW1wbGVQaWUuCgkgKiBIb3dldmVyLCBkaXNhYmxpbmcgdGhlIGNhY2hlIGNhbiBsZWFkIHRvIGxvbmdlciBsb2FkIHRpbWVzLgoJICoKCSAqIEBzaW5jZSAxLjAgUHJldmlldyBSZWxlYXNlCgkgKiBAcGFyYW0gYm9vbCAkZW5hYmxlIEVuYWJsZSBjYWNoaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBlbmFibGVfY2FjaGUoJGVuYWJsZSA9IHRydWUpCgl7CgkJJHRoaXMtPmNhY2hlID0gKGJvb2wpICRlbmFibGU7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGxlbmd0aCBvZiB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IHRoZSBjb250ZW50cyBvZiBhIGZlZWQgd2lsbCBiZQoJICogY2FjaGVkCgkgKgoJICogQHBhcmFtIGludCAkc2Vjb25kcyBUaGUgZmVlZCBjb250ZW50IGNhY2hlIGR1cmF0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfY2FjaGVfZHVyYXRpb24oJHNlY29uZHMgPSAzNjAwKQoJewoJCSR0aGlzLT5jYWNoZV9kdXJhdGlvbiA9IChpbnQpICRzZWNvbmRzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBsZW5ndGggb2YgdGltZSAoaW4gc2Vjb25kcykgdGhhdCB0aGUgYXV0b2Rpc2NvdmVyZWQgZmVlZCBVUkwgd2lsbAoJICogYmUgY2FjaGVkCgkgKgoJICogQHBhcmFtIGludCAkc2Vjb25kcyBUaGUgYXV0b2Rpc2NvdmVyZWQgZmVlZCBVUkwgY2FjaGUgZHVyYXRpb24uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfYXV0b2Rpc2NvdmVyeV9jYWNoZV9kdXJhdGlvbigkc2Vjb25kcyA9IDYwNDgwMCkKCXsKCQkkdGhpcy0+YXV0b2Rpc2NvdmVyeV9jYWNoZV9kdXJhdGlvbiA9IChpbnQpICRzZWNvbmRzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiB3aGVyZSB0aGUgY2FjaGVkIGZpbGVzIHNob3VsZCBiZSBzdG9yZWQKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRsb2NhdGlvbiBUaGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfY2FjaGVfbG9jYXRpb24oJGxvY2F0aW9uID0gJy4vY2FjaGUnKQoJewoJCSR0aGlzLT5jYWNoZV9sb2NhdGlvbiA9IChzdHJpbmcpICRsb2NhdGlvbjsKCX0KCgkvKioKCSAqIFNldCB3aGV0aGVyIGZlZWQgaXRlbXMgc2hvdWxkIGJlIHNvcnRlZCBpbnRvIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcgoJICoKCSAqIEBwYXJhbSBib29sICRlbmFibGUgU29ydCBhcyByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBlbmFibGVfb3JkZXJfYnlfZGF0ZSgkZW5hYmxlID0gdHJ1ZSkKCXsKCQkkdGhpcy0+b3JkZXJfYnlfZGF0ZSA9IChib29sKSAkZW5hYmxlOwoJfQoKCS8qKgoJICogU2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCB0byBwYXJzZSB0aGUgZmVlZAoJICoKCSAqIFRoaXMgb3ZlcnJpZGVzIHRoZSBlbmNvZGluZyByZXBvcnRlZCBieSB0aGUgZmVlZCwgaG93ZXZlciBpdCB3aWxsIGZhbGwKCSAqIGJhY2sgdG8gdGhlIG5vcm1hbCBlbmNvZGluZyBkZXRlY3Rpb24gaWYgdGhlIG92ZXJyaWRlIGZhaWxzCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgQ2hhcmFjdGVyIGVuY29kaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfaW5wdXRfZW5jb2RpbmcoJGVuY29kaW5nID0gZmFsc2UpCgl7CgkJaWYgKCRlbmNvZGluZykKCQl7CgkJCSR0aGlzLT5pbnB1dF9lbmNvZGluZyA9IChzdHJpbmcpICRlbmNvZGluZzsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmlucHV0X2VuY29kaW5nID0gZmFsc2U7CgkJfQoJfQoKCS8qKgoJICogU2V0IGhvdyBtdWNoIGZlZWQgYXV0b2Rpc2NvdmVyeSB0byBkbwoJICoKCSAqIEBzZWUgU0lNUExFUElFX0xPQ0FUT1JfTk9ORQoJICogQHNlZSBTSU1QTEVQSUVfTE9DQVRPUl9BVVRPRElTQ09WRVJZCgkgKiBAc2VlIFNJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0VYVEVOU0lPTgoJICogQHNlZSBTSU1QTEVQSUVfTE9DQVRPUl9MT0NBTF9CT0RZCgkgKiBAc2VlIFNJTVBMRVBJRV9MT0NBVE9SX1JFTU9URV9FWFRFTlNJT04KCSAqIEBzZWUgU0lNUExFUElFX0xPQ0FUT1JfUkVNT1RFX0JPRFkKCSAqIEBzZWUgU0lNUExFUElFX0xPQ0FUT1JfQUxMCgkgKiBAcGFyYW0gaW50ICRsZXZlbCBGZWVkIEF1dG9kaXNjb3ZlcnkgTGV2ZWwgKGxldmVsIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSBjb25zdGFudHMsIHNlZSBiaXR3aXNlIE9SIG9wZXJhdG9yKQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X2F1dG9kaXNjb3ZlcnlfbGV2ZWwoJGxldmVsID0gU0lNUExFUElFX0xPQ0FUT1JfQUxMKQoJewoJCSR0aGlzLT5hdXRvZGlzY292ZXJ5ID0gKGludCkgJGxldmVsOwoJfQoKCS8qKgoJICogR2V0IHRoZSBjbGFzcyByZWdpc3RyeQoJICoKCSAqIFVzZSB0aGlzIHRvIG92ZXJyaWRlIFNpbXBsZVBpZSdzIGRlZmF1bHQgY2xhc3NlcwoJICogQHNlZSBTaW1wbGVQaWVfUmVnaXN0cnkKCSAqIEByZXR1cm4gU2ltcGxlUGllX1JlZ2lzdHJ5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiAmZ2V0X3JlZ2lzdHJ5KCkKCXsKCQlyZXR1cm4gJHRoaXMtPnJlZ2lzdHJ5OwoJfQoKCS8qKiNAKwoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBkZXByZWNhdGVkIFVzZSB7QHNlZSBnZXRfcmVnaXN0cnkoKX0gaW5zdGVhZAoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLm9vcDUuYmFzaWMucGhwI2xhbmd1YWdlLm9vcDUuYmFzaWMuZXh0ZW5kcyBQSFA1IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICogQHBhcmFtIHN0cmluZyAkY2xhc3MgTmFtZSBvZiBjdXN0b20gY2xhc3MKCSAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJICovCgkvKioKCSAqIFNldCB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgY2FjaGluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X2NhY2hlX2NsYXNzKCRjbGFzcyA9ICdTaW1wbGVQaWVfQ2FjaGUnKQoJewoJCXJldHVybiAkdGhpcy0+cmVnaXN0cnktPnJlZ2lzdGVyKCdDYWNoZScsICRjbGFzcywgdHJ1ZSk7Cgl9CgoJLyoqCgkgKiBTZXQgd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIGF1dG8tZGlzY292ZXJ5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfbG9jYXRvcl9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0xvY2F0b3InKQoJewoJCXJldHVybiAkdGhpcy0+cmVnaXN0cnktPnJlZ2lzdGVyKCdMb2NhdG9yJywgJGNsYXNzLCB0cnVlKTsKCX0KCgkvKioKCSAqIFNldCB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgWE1MIHBhcnNpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9wYXJzZXJfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9QYXJzZXInKQoJewoJCXJldHVybiAkdGhpcy0+cmVnaXN0cnktPnJlZ2lzdGVyKCdQYXJzZXInLCAkY2xhc3MsIHRydWUpOwoJfQoKCS8qKgoJICogU2V0IHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciByZW1vdGUgZmlsZSBmZXRjaGluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X2ZpbGVfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9GaWxlJykKCXsKCQlyZXR1cm4gJHRoaXMtPnJlZ2lzdHJ5LT5yZWdpc3RlcignRmlsZScsICRjbGFzcywgdHJ1ZSk7Cgl9CgoJLyoqCgkgKiBTZXQgd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIGRhdGEgc2FuaXRpemF0aW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfc2FuaXRpemVfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9TYW5pdGl6ZScpCgl7CgkJcmV0dXJuICR0aGlzLT5yZWdpc3RyeS0+cmVnaXN0ZXIoJ1Nhbml0aXplJywgJGNsYXNzLCB0cnVlKTsKCX0KCgkvKioKCSAqIFNldCB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgaGFuZGxpbmcgZmVlZCBpdGVtcwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X2l0ZW1fY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9JdGVtJykKCXsKCQlyZXR1cm4gJHRoaXMtPnJlZ2lzdHJ5LT5yZWdpc3RlcignSXRlbScsICRjbGFzcywgdHJ1ZSk7Cgl9CgoJLyoqCgkgKiBTZXQgd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIGhhbmRsaW5nIGF1dGhvciBkYXRhCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfYXV0aG9yX2NsYXNzKCRjbGFzcyA9ICdTaW1wbGVQaWVfQXV0aG9yJykKCXsKCQlyZXR1cm4gJHRoaXMtPnJlZ2lzdHJ5LT5yZWdpc3RlcignQXV0aG9yJywgJGNsYXNzLCB0cnVlKTsKCX0KCgkvKioKCSAqIFNldCB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgaGFuZGxpbmcgY2F0ZWdvcnkgZGF0YQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X2NhdGVnb3J5X2NsYXNzKCRjbGFzcyA9ICdTaW1wbGVQaWVfQ2F0ZWdvcnknKQoJewoJCXJldHVybiAkdGhpcy0+cmVnaXN0cnktPnJlZ2lzdGVyKCdDYXRlZ29yeScsICRjbGFzcywgdHJ1ZSk7Cgl9CgoJLyoqCgkgKiBTZXQgd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIGZlZWQgZW5jbG9zdXJlcwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X2VuY2xvc3VyZV9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0VuY2xvc3VyZScpCgl7CgkJcmV0dXJuICR0aGlzLT5yZWdpc3RyeS0+cmVnaXN0ZXIoJ0VuY2xvc3VyZScsICRjbGFzcywgdHJ1ZSk7Cgl9CgoJLyoqCgkgKiBTZXQgd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIGA8bWVkaWE6dGV4dD5gIGNhcHRpb25zCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfY2FwdGlvbl9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0NhcHRpb24nKQoJewoJCXJldHVybiAkdGhpcy0+cmVnaXN0cnktPnJlZ2lzdGVyKCdDYXB0aW9uJywgJGNsYXNzLCB0cnVlKTsKCX0KCgkvKioKCSAqIFNldCB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgYDxtZWRpYTpjb3B5cmlnaHQ+YAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X2NvcHlyaWdodF9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0NvcHlyaWdodCcpCgl7CgkJcmV0dXJuICR0aGlzLT5yZWdpc3RyeS0+cmVnaXN0ZXIoJ0NvcHlyaWdodCcsICRjbGFzcywgdHJ1ZSk7Cgl9CgoJLyoqCgkgKiBTZXQgd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIGA8bWVkaWE6Y3JlZGl0PmAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9jcmVkaXRfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9DcmVkaXQnKQoJewoJCXJldHVybiAkdGhpcy0+cmVnaXN0cnktPnJlZ2lzdGVyKCdDcmVkaXQnLCAkY2xhc3MsIHRydWUpOwoJfQoKCS8qKgoJICogU2V0IHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciBgPG1lZGlhOnJhdGluZz5gCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfcmF0aW5nX2NsYXNzKCRjbGFzcyA9ICdTaW1wbGVQaWVfUmF0aW5nJykKCXsKCQlyZXR1cm4gJHRoaXMtPnJlZ2lzdHJ5LT5yZWdpc3RlcignUmF0aW5nJywgJGNsYXNzLCB0cnVlKTsKCX0KCgkvKioKCSAqIFNldCB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgYDxtZWRpYTpyZXN0cmljdGlvbj5gCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfcmVzdHJpY3Rpb25fY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9SZXN0cmljdGlvbicpCgl7CgkJcmV0dXJuICR0aGlzLT5yZWdpc3RyeS0+cmVnaXN0ZXIoJ1Jlc3RyaWN0aW9uJywgJGNsYXNzLCB0cnVlKTsKCX0KCgkvKioKCSAqIFNldCB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgY29udGVudC10eXBlIHNuaWZmaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfY29udGVudF90eXBlX3NuaWZmZXJfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9Db250ZW50X1R5cGVfU25pZmZlcicpCgl7CgkJcmV0dXJuICR0aGlzLT5yZWdpc3RyeS0+cmVnaXN0ZXIoJ0NvbnRlbnRfVHlwZV9TbmlmZmVyJywgJGNsYXNzLCB0cnVlKTsKCX0KCgkvKioKCSAqIFNldCB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBpdGVtIHNvdXJjZXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9zb3VyY2VfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9Tb3VyY2UnKQoJewoJCXJldHVybiAkdGhpcy0+cmVnaXN0cnktPnJlZ2lzdGVyKCdTb3VyY2UnLCAkY2xhc3MsIHRydWUpOwoJfQoJLyoqI0AtKi8KCgkvKioKCSAqIFNldCB0aGUgdXNlciBhZ2VudCBzdHJpbmcKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR1YSBOZXcgdXNlciBhZ2VudCBzdHJpbmcuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfdXNlcmFnZW50KCR1YSA9IFNJTVBMRVBJRV9VU0VSQUdFTlQpCgl7CgkJJHRoaXMtPnVzZXJhZ2VudCA9IChzdHJpbmcpICR1YTsKCX0KCgkvKioKCSAqIFNldCBjYWxsYmFjayBmdW5jdGlvbiB0byBjcmVhdGUgY2FjaGUgZmlsZW5hbWUgd2l0aAoJICoKCSAqIEBwYXJhbSBtaXhlZCAkZnVuY3Rpb24gQ2FsbGJhY2sgZnVuY3Rpb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9jYWNoZV9uYW1lX2Z1bmN0aW9uKCRmdW5jdGlvbiA9ICdtZDUnKQoJewoJCWlmIChpc19jYWxsYWJsZSgkZnVuY3Rpb24pKQoJCXsKCQkJJHRoaXMtPmNhY2hlX25hbWVfZnVuY3Rpb24gPSAkZnVuY3Rpb247CgkJfQoJfQoKCS8qKgoJICogU2V0IG9wdGlvbnMgdG8gbWFrZSBTUCBhcyBmYXN0IGFzIHBvc3NpYmxlCgkgKgoJICogRm9yZ29lcyBhIHN1YnN0YW50aWFsIGFtb3VudCBvZiBkYXRhIHNhbml0aXphdGlvbiBpbiBmYXZvciBvZiBzcGVlZC4gVGhpcwoJICogdHVybnMgU2ltcGxlUGllIGludG8gYSBkdW1iIHBhcnNlciBvZiBmZWVkcy4KCSAqCgkgKiBAcGFyYW0gYm9vbCAkc2V0IFdoZXRoZXIgdG8gc2V0IHRoZW0gb3Igbm90CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfc3R1cGlkbHlfZmFzdCgkc2V0ID0gZmFsc2UpCgl7CgkJaWYgKCRzZXQpCgkJewoJCQkkdGhpcy0+ZW5hYmxlX29yZGVyX2J5X2RhdGUoZmFsc2UpOwoJCQkkdGhpcy0+cmVtb3ZlX2RpdihmYWxzZSk7CgkJCSR0aGlzLT5zdHJpcF9jb21tZW50cyhmYWxzZSk7CgkJCSR0aGlzLT5zdHJpcF9odG1sdGFncyhmYWxzZSk7CgkJCSR0aGlzLT5zdHJpcF9hdHRyaWJ1dGVzKGZhbHNlKTsKCQkJJHRoaXMtPnNldF9pbWFnZV9oYW5kbGVyKGZhbHNlKTsKCQl9Cgl9CgoJLyoqCgkgKiBTZXQgbWF4aW11bSBudW1iZXIgb2YgZmVlZHMgdG8gY2hlY2sgd2l0aCBhdXRvZGlzY292ZXJ5CgkgKgoJICogQHBhcmFtIGludCAkbWF4IE1heGltdW0gbnVtYmVyIG9mIGZlZWRzIHRvIGNoZWNrCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfbWF4X2NoZWNrZWRfZmVlZHMoJG1heCA9IDEwKQoJewoJCSR0aGlzLT5tYXhfY2hlY2tlZF9mZWVkcyA9IChpbnQpICRtYXg7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHJlbW92ZV9kaXYoJGVuYWJsZSA9IHRydWUpCgl7CgkJJHRoaXMtPnNhbml0aXplLT5yZW1vdmVfZGl2KCRlbmFibGUpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBzdHJpcF9odG1sdGFncygkdGFncyA9ICcnLCAkZW5jb2RlID0gbnVsbCkKCXsKCQlpZiAoJHRhZ3MgPT09ICcnKQoJCXsKCQkJJHRhZ3MgPSAkdGhpcy0+c3RyaXBfaHRtbHRhZ3M7CgkJfQoJCSR0aGlzLT5zYW5pdGl6ZS0+c3RyaXBfaHRtbHRhZ3MoJHRhZ3MpOwoJCWlmICgkZW5jb2RlICE9PSBudWxsKQoJCXsKCQkJJHRoaXMtPnNhbml0aXplLT5lbmNvZGVfaW5zdGVhZF9vZl9zdHJpcCgkdGFncyk7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBlbmNvZGVfaW5zdGVhZF9vZl9zdHJpcCgkZW5hYmxlID0gdHJ1ZSkKCXsKCQkkdGhpcy0+c2FuaXRpemUtPmVuY29kZV9pbnN0ZWFkX29mX3N0cmlwKCRlbmFibGUpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBzdHJpcF9hdHRyaWJ1dGVzKCRhdHRyaWJzID0gJycpCgl7CgkJaWYgKCRhdHRyaWJzID09PSAnJykKCQl7CgkJCSRhdHRyaWJzID0gJHRoaXMtPnN0cmlwX2F0dHJpYnV0ZXM7CgkJfQoJCSR0aGlzLT5zYW5pdGl6ZS0+c3RyaXBfYXR0cmlidXRlcygkYXR0cmlicyk7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIG91dHB1dCBlbmNvZGluZwoJICoKCSAqIEFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgU2ltcGxlUGllJ3Mgb3V0cHV0IHRvIG1hdGNoIHRoYXQgb2YgeW91ciB3ZWJwYWdlLgoJICogVGhpcyBpcyB1c2VmdWwgZm9yIHRpbWVzIHdoZW4geW91ciB3ZWJwYWdlcyBhcmUgbm90IGJlaW5nIHNlcnZlZCBhcwoJICogVVRGLTguICBUaGlzIHNldHRpbmcgd2lsbCBiZSBvYmV5ZWQgYnkge0BzZWUgaGFuZGxlX2NvbnRlbnRfdHlwZSgpfSwgYW5kCgkgKiBpcyBzaW1pbGFyIHRvIHtAc2VlIHNldF9pbnB1dF9lbmNvZGluZygpfS4KCSAqCgkgKiBJdCBzaG91bGQgYmUgbm90ZWQsIGhvd2V2ZXIsIHRoYXQgbm90IGFsbCBjaGFyYWN0ZXIgZW5jb2RpbmdzIGNhbiBzdXBwb3J0CgkgKiBhbGwgY2hhcmFjdGVycy4gIElmIHlvdXIgcGFnZSBpcyBiZWluZyBzZXJ2ZWQgYXMgSVNPLTg4NTktMSBhbmQgeW91IHRyeQoJICogdG8gZGlzcGxheSBhIEphcGFuZXNlIGZlZWQsIHlvdSdsbCBsaWtlbHkgc2VlIGdhcmJsZWQgY2hhcmFjdGVycy4KCSAqIEJlY2F1c2Ugb2YgdGhpcywgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIGVuc3VyZSB0aGF0IHlvdXIgd2VicGFnZXMKCSAqIGFyZSBzZXJ2ZWQgYXMgVVRGLTguCgkgKgoJICogVGhlIG51bWJlciBvZiBzdXBwb3J0ZWQgY2hhcmFjdGVyIGVuY29kaW5ncyBkZXBlbmRzIG9uIHdoZXRoZXIgeW91ciB3ZWIKCSAqIGhvc3Qgc3VwcG9ydHMge0BsaW5rIGh0dHA6Ly9waHAubmV0L21ic3RyaW5nIG1ic3RyaW5nfSwKCSAqIHtAbGluayBodHRwOi8vcGhwLm5ldC9pY29udiBpY29udn0sIG9yIGJvdGguIFNlZQoJICoge0BsaW5rIGh0dHA6Ly9zaW1wbGVwaWUub3JnL3dpa2kvZmFxL1N1cHBvcnRlZF9DaGFyYWN0ZXJfRW5jb2RpbmdzfSBmb3IKCSAqIG1vcmUgaW5mb3JtYXRpb24uCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9vdXRwdXRfZW5jb2RpbmcoJGVuY29kaW5nID0gJ1VURi04JykKCXsKCQkkdGhpcy0+c2FuaXRpemUtPnNldF9vdXRwdXRfZW5jb2RpbmcoJGVuY29kaW5nKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gc3RyaXBfY29tbWVudHMoJHN0cmlwID0gZmFsc2UpCgl7CgkJJHRoaXMtPnNhbml0aXplLT5zdHJpcF9jb21tZW50cygkc3RyaXApOwoJfQoKCS8qKgoJICogU2V0IGVsZW1lbnQvYXR0cmlidXRlIGtleS92YWx1ZSBwYWlycyBvZiBIVE1MIGF0dHJpYnV0ZXMKCSAqIGNvbnRhaW5pbmcgVVJMcyB0aGF0IG5lZWQgdG8gYmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIGZlZWQKCSAqCgkgKiBEZWZhdWx0cyB0byB8YXxAaHJlZiwgfGFyZWF8QGhyZWYsIHxibG9ja3F1b3RlfEBjaXRlLCB8ZGVsfEBjaXRlLAoJICogfGZvcm18QGFjdGlvbiwgfGltZ3xAbG9uZ2Rlc2MsIHxpbWd8QHNyYywgfGlucHV0fEBzcmMsIHxpbnN8QGNpdGUsCgkgKiB8cXxAY2l0ZQoJICoKCSAqIEBzaW5jZSAxLjAKCSAqIEBwYXJhbSBhcnJheXxudWxsICRlbGVtZW50X2F0dHJpYnV0ZSBFbGVtZW50L2F0dHJpYnV0ZSBrZXkvdmFsdWUgcGFpcnMsIG51bGwgZm9yIGRlZmF1bHQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF91cmxfcmVwbGFjZW1lbnRzKCRlbGVtZW50X2F0dHJpYnV0ZSA9IG51bGwpCgl7CgkJJHRoaXMtPnNhbml0aXplLT5zZXRfdXJsX3JlcGxhY2VtZW50cygkZWxlbWVudF9hdHRyaWJ1dGUpOwoJfQoKCS8qKgoJICogU2V0IHRoZSBoYW5kbGVyIHRvIGVuYWJsZSB0aGUgZGlzcGxheSBvZiBjYWNoZWQgaW1hZ2VzLgoJICoKCSAqIEBwYXJhbSBzdHIgJHBhZ2UgV2ViLWFjY2Vzc2libGUgcGF0aCB0byB0aGUgaGFuZGxlcl9pbWFnZS5waHAgZmlsZS4KCSAqIEBwYXJhbSBzdHIgJHFzIFRoZSBxdWVyeSBzdHJpbmcgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIGJlIHBhc3NlZCB0by4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9pbWFnZV9oYW5kbGVyKCRwYWdlID0gZmFsc2UsICRxcyA9ICdpJykKCXsKCQlpZiAoJHBhZ2UgIT09IGZhbHNlKQoJCXsKCQkJJHRoaXMtPnNhbml0aXplLT5zZXRfaW1hZ2VfaGFuZGxlcigkcGFnZSAuICc/JyAuICRxcyAuICc9Jyk7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5pbWFnZV9oYW5kbGVyID0gJyc7CgkJfQoJfQoKCS8qKgoJICogU2V0IHRoZSBsaW1pdCBmb3IgaXRlbXMgcmV0dXJuZWQgcGVyLWZlZWQgd2l0aCBtdWx0aWZlZWRzCgkgKgoJICogQHBhcmFtIGludGVnZXIgJGxpbWl0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfaXRlbV9saW1pdCgkbGltaXQgPSAwKQoJewoJCSR0aGlzLT5pdGVtX2xpbWl0ID0gKGludCkgJGxpbWl0OwoJfQoKCS8qKgoJICogSW5pdGlhbGl6ZSB0aGUgZmVlZCBvYmplY3QKCSAqCgkgKiBUaGlzIGlzIHdoYXQgbWFrZXMgZXZlcnl0aGluZyBoYXBwZW4uICBQZXJpb2QuICBUaGlzIGlzIHdoZXJlIGFsbCBvZiB0aGUKCSAqIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBnZXQgcHJvY2Vzc2VkLCBmZWVkcyBhcmUgZmV0Y2hlZCwgY2FjaGVkLCBhbmQKCSAqIHBhcnNlZCwgYW5kIGFsbCBvZiB0aGF0IG90aGVyIGdvb2Qgc3R1ZmYuCgkgKgoJICogQHJldHVybiBib29sZWFuIFRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpbml0KCkKCXsKCQkvLyBDaGVjayBhYnNvbHV0ZSBiYXJlIG1pbmltdW0gcmVxdWlyZW1lbnRzLgoJCWlmICghZXh0ZW5zaW9uX2xvYWRlZCgneG1sJykgfHwgIWV4dGVuc2lvbl9sb2FkZWQoJ3BjcmUnKSkKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJLy8gVGhlbiBjaGVjayB0aGUgeG1sIGV4dGVuc2lvbiBpcyBzYW5lIChpLmUuLCBsaWJ4bWwgMi43LnggaXNzdWUgb24gUEhQIDwgNS4yLjkgYW5kIGxpYnhtbCAyLjcuMCB0byAyLjcuMiBvbiBhbnkgdmVyc2lvbikgaWYgd2UgZG9uJ3QgaGF2ZSB4bWxyZWFkZXIuCgkJZWxzZWlmICghZXh0ZW5zaW9uX2xvYWRlZCgneG1scmVhZGVyJykpCgkJewoJCQlzdGF0aWMgJHhtbF9pc19zYW5lID0gbnVsbDsKCQkJaWYgKCR4bWxfaXNfc2FuZSA9PT0gbnVsbCkKCQkJewoJCQkJJHBhcnNlcl9jaGVjayA9IHhtbF9wYXJzZXJfY3JlYXRlKCk7CgkJCQl4bWxfcGFyc2VfaW50b19zdHJ1Y3QoJHBhcnNlcl9jaGVjaywgJzxmb28+JmFtcDs8L2Zvbz4nLCAkdmFsdWVzKTsKCQkJCXhtbF9wYXJzZXJfZnJlZSgkcGFyc2VyX2NoZWNrKTsKCQkJCSR4bWxfaXNfc2FuZSA9IGlzc2V0KCR2YWx1ZXNbMF1bJ3ZhbHVlJ10pOwoJCQl9CgkJCWlmICghJHhtbF9pc19zYW5lKQoJCQl7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgoJCWlmIChtZXRob2RfZXhpc3RzKCR0aGlzLT5zYW5pdGl6ZSwgJ3NldF9yZWdpc3RyeScpKQoJCXsKCQkJJHRoaXMtPnNhbml0aXplLT5zZXRfcmVnaXN0cnkoJHRoaXMtPnJlZ2lzdHJ5KTsKCQl9CgoJCS8vIFBhc3Mgd2hhdGV2ZXIgd2FzIHNldCB3aXRoIGNvbmZpZyBvcHRpb25zIG92ZXIgdG8gdGhlIHNhbml0aXplci4KCQkvLyBQYXNzIHRoZSBjbGFzc2VzIGluIGZvciBsZWdhY3kgc3VwcG9ydDsgbmV3IGNsYXNzZXMgc2hvdWxkIHVzZSB0aGUgcmVnaXN0cnkgaW5zdGVhZAoJCSR0aGlzLT5zYW5pdGl6ZS0+cGFzc19jYWNoZV9kYXRhKCR0aGlzLT5jYWNoZSwgJHRoaXMtPmNhY2hlX2xvY2F0aW9uLCAkdGhpcy0+Y2FjaGVfbmFtZV9mdW5jdGlvbiwgJHRoaXMtPnJlZ2lzdHJ5LT5nZXRfY2xhc3MoJ0NhY2hlJykpOwoJCSR0aGlzLT5zYW5pdGl6ZS0+cGFzc19maWxlX2RhdGEoJHRoaXMtPnJlZ2lzdHJ5LT5nZXRfY2xhc3MoJ0ZpbGUnKSwgJHRoaXMtPnRpbWVvdXQsICR0aGlzLT51c2VyYWdlbnQsICR0aGlzLT5mb3JjZV9mc29ja29wZW4pOwoKCQlpZiAoIWVtcHR5KCR0aGlzLT5tdWx0aWZlZWRfdXJsKSkKCQl7CgkJCSRpID0gMDsKCQkJJHN1Y2Nlc3MgPSAwOwoJCQkkdGhpcy0+bXVsdGlmZWVkX29iamVjdHMgPSBhcnJheSgpOwoJCQkkdGhpcy0+ZXJyb3IgPSBhcnJheSgpOwoJCQlmb3JlYWNoICgkdGhpcy0+bXVsdGlmZWVkX3VybCBhcyAkdXJsKQoJCQl7CgkJCQkkdGhpcy0+bXVsdGlmZWVkX29iamVjdHNbJGldID0gY2xvbmUgJHRoaXM7CgkJCQkkdGhpcy0+bXVsdGlmZWVkX29iamVjdHNbJGldLT5zZXRfZmVlZF91cmwoJHVybCk7CgkJCQkkc2luZ2xlX3N1Y2Nlc3MgPSAkdGhpcy0+bXVsdGlmZWVkX29iamVjdHNbJGldLT5pbml0KCk7CgkJCQkkc3VjY2VzcyB8PSAkc2luZ2xlX3N1Y2Nlc3M7CgkJCQlpZiAoISRzaW5nbGVfc3VjY2VzcykKCQkJCXsKCQkJCQkkdGhpcy0+ZXJyb3JbJGldID0gJHRoaXMtPm11bHRpZmVlZF9vYmplY3RzWyRpXS0+ZXJyb3IoKTsKCQkJCX0KCQkJCSRpKys7CgkJCX0KCQkJcmV0dXJuIChib29sKSAkc3VjY2VzczsKCQl9CgkJZWxzZWlmICgkdGhpcy0+ZmVlZF91cmwgPT09IG51bGwgJiYgJHRoaXMtPnJhd19kYXRhID09PSBudWxsKQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJHRoaXMtPmVycm9yID0gbnVsbDsKCQkkdGhpcy0+ZGF0YSA9IGFycmF5KCk7CgkJJHRoaXMtPm11bHRpZmVlZF9vYmplY3RzID0gYXJyYXkoKTsKCQkkY2FjaGUgPSBmYWxzZTsKCgkJaWYgKCR0aGlzLT5mZWVkX3VybCAhPT0gbnVsbCkKCQl7CgkJCSRwYXJzZWRfZmVlZF91cmwgPSAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAncGFyc2VfdXJsJywgYXJyYXkoJHRoaXMtPmZlZWRfdXJsKSk7CgoJCQkvLyBEZWNpZGUgd2hldGhlciB0byBlbmFibGUgY2FjaGluZwoJCQlpZiAoJHRoaXMtPmNhY2hlICYmICRwYXJzZWRfZmVlZF91cmxbJ3NjaGVtZSddICE9PSAnJykKCQkJewoJCQkJJGNhY2hlID0gJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdDYWNoZScsICdjcmVhdGUnLCBhcnJheSgkdGhpcy0+Y2FjaGVfbG9jYXRpb24sIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5jYWNoZV9uYW1lX2Z1bmN0aW9uLCAkdGhpcy0+ZmVlZF91cmwpLCAnc3BjJykpOwoJCQl9CgoJCQkvLyBGZXRjaCB0aGUgZGF0YSB2aWEgU2ltcGxlUGllX0ZpbGUgaW50byAkdGhpcy0+cmF3X2RhdGEKCQkJaWYgKCgkZmV0Y2hlZCA9ICR0aGlzLT5mZXRjaF9kYXRhKCRjYWNoZSkpID09PSB0cnVlKQoJCQl7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQllbHNlaWYgKCRmZXRjaGVkID09PSBmYWxzZSkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQlsaXN0KCRoZWFkZXJzLCAkc25pZmZlZCkgPSAkZmV0Y2hlZDsKCQl9CgoJCS8vIFNldCB1cCBhcnJheSBvZiBwb3NzaWJsZSBlbmNvZGluZ3MKCQkkZW5jb2RpbmdzID0gYXJyYXkoKTsKCgkJLy8gRmlyc3QgY2hlY2sgdG8gc2VlIGlmIGlucHV0IGhhcyBiZWVuIG92ZXJyaWRkZW4uCgkJaWYgKCR0aGlzLT5pbnB1dF9lbmNvZGluZyAhPT0gZmFsc2UpCgkJewoJCQkkZW5jb2RpbmdzW10gPSAkdGhpcy0+aW5wdXRfZW5jb2Rpbmc7CgkJfQoKCQkkYXBwbGljYXRpb25fdHlwZXMgPSBhcnJheSgnYXBwbGljYXRpb24veG1sJywgJ2FwcGxpY2F0aW9uL3htbC1kdGQnLCAnYXBwbGljYXRpb24veG1sLWV4dGVybmFsLXBhcnNlZC1lbnRpdHknKTsKCQkkdGV4dF90eXBlcyA9IGFycmF5KCd0ZXh0L3htbCcsICd0ZXh0L3htbC1leHRlcm5hbC1wYXJzZWQtZW50aXR5Jyk7CgoJCS8vIFJGQyAzMDIzIChvbmx5IGFwcGxpZXMgdG8gc25pZmZlZCBjb250ZW50KQoJCWlmIChpc3NldCgkc25pZmZlZCkpCgkJewoJCQlpZiAoaW5fYXJyYXkoJHNuaWZmZWQsICRhcHBsaWNhdGlvbl90eXBlcykgfHwgc3Vic3RyKCRzbmlmZmVkLCAwLCAxMikgPT09ICdhcHBsaWNhdGlvbi8nICYmIHN1YnN0cigkc25pZmZlZCwgLTQpID09PSAnK3htbCcpCgkJCXsKCQkJCWlmIChpc3NldCgkaGVhZGVyc1snY29udGVudC10eXBlJ10pICYmIHByZWdfbWF0Y2goJy87XHgyMD9jaGFyc2V0PShbXjtdKikvaScsICRoZWFkZXJzWydjb250ZW50LXR5cGUnXSwgJGNoYXJzZXQpKQoJCQkJewoJCQkJCSRlbmNvZGluZ3NbXSA9IHN0cnRvdXBwZXIoJGNoYXJzZXRbMV0pOwoJCQkJfQoJCQkJJGVuY29kaW5ncyA9IGFycmF5X21lcmdlKCRlbmNvZGluZ3MsICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnTWlzYycsICd4bWxfZW5jb2RpbmcnLCBhcnJheSgkdGhpcy0+cmF3X2RhdGEsICYkdGhpcy0+cmVnaXN0cnkpKSk7CgkJCQkkZW5jb2RpbmdzW10gPSAnVVRGLTgnOwoJCQl9CgkJCWVsc2VpZiAoaW5fYXJyYXkoJHNuaWZmZWQsICR0ZXh0X3R5cGVzKSB8fCBzdWJzdHIoJHNuaWZmZWQsIDAsIDUpID09PSAndGV4dC8nICYmIHN1YnN0cigkc25pZmZlZCwgLTQpID09PSAnK3htbCcpCgkJCXsKCQkJCWlmIChpc3NldCgkaGVhZGVyc1snY29udGVudC10eXBlJ10pICYmIHByZWdfbWF0Y2goJy87XHgyMD9jaGFyc2V0PShbXjtdKikvaScsICRoZWFkZXJzWydjb250ZW50LXR5cGUnXSwgJGNoYXJzZXQpKQoJCQkJewoJCQkJCSRlbmNvZGluZ3NbXSA9ICRjaGFyc2V0WzFdOwoJCQkJfQoJCQkJJGVuY29kaW5nc1tdID0gJ1VTLUFTQ0lJJzsKCQkJfQoJCQkvLyBUZXh0IE1JTUUtdHlwZSBkZWZhdWx0CgkJCWVsc2VpZiAoc3Vic3RyKCRzbmlmZmVkLCAwLCA1KSA9PT0gJ3RleHQvJykKCQkJewoJCQkJJGVuY29kaW5nc1tdID0gJ1VTLUFTQ0lJJzsKCQkJfQoJCX0KCgkJLy8gRmFsbGJhY2sgdG8gWE1MIDEuMCBBcHBlbmRpeCBGLjEvVVRGLTgvSVNPLTg4NTktMQoJCSRlbmNvZGluZ3MgPSBhcnJheV9tZXJnZSgkZW5jb2RpbmdzLCAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAneG1sX2VuY29kaW5nJywgYXJyYXkoJHRoaXMtPnJhd19kYXRhLCAmJHRoaXMtPnJlZ2lzdHJ5KSkpOwoJCSRlbmNvZGluZ3NbXSA9ICdVVEYtOCc7CgkJJGVuY29kaW5nc1tdID0gJ0lTTy04ODU5LTEnOwoKCQkvLyBUaGVyZSdzIG5vIHBvaW50IGluIHRyeWluZyBhbiBlbmNvZGluZyB0d2ljZQoJCSRlbmNvZGluZ3MgPSBhcnJheV91bmlxdWUoJGVuY29kaW5ncyk7CgoJCS8vIExvb3AgdGhyb3VnaCBlYWNoIHBvc3NpYmxlIGVuY29kaW5nLCB0aWxsIHdlIHJldHVybiBzb21ldGhpbmcsIG9yIHJ1biBvdXQgb2YgcG9zc2liaWxpdGllcwoJCWZvcmVhY2ggKCRlbmNvZGluZ3MgYXMgJGVuY29kaW5nKQoJCXsKCQkJLy8gQ2hhbmdlIHRoZSBlbmNvZGluZyB0byBVVEYtOCAoYXMgd2UgYWx3YXlzIHVzZSBVVEYtOCBpbnRlcm5hbGx5KQoJCQlpZiAoJHV0ZjhfZGF0YSA9ICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnTWlzYycsICdjaGFuZ2VfZW5jb2RpbmcnLCBhcnJheSgkdGhpcy0+cmF3X2RhdGEsICRlbmNvZGluZywgJ1VURi04JykpKQoJCQl7CgkJCQkvLyBDcmVhdGUgbmV3IHBhcnNlcgoJCQkJJHBhcnNlciA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdQYXJzZXInKTsKCgkJCQkvLyBJZiBpdCdzIHBhcnNlZCBmaW5lCgkJCQlpZiAoJHBhcnNlci0+cGFyc2UoJHV0ZjhfZGF0YSwgJ1VURi04JykpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGEgPSAkcGFyc2VyLT5nZXRfZGF0YSgpOwoJCQkJCWlmICghKCR0aGlzLT5nZXRfdHlwZSgpICYgflNJTVBMRVBJRV9UWVBFX05PTkUpKQoJCQkJCXsKCQkJCQkJJHRoaXMtPmVycm9yID0gIkEgZmVlZCBjb3VsZCBub3QgYmUgZm91bmQgYXQgJHRoaXMtPmZlZWRfdXJsLiBUaGlzIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIFJTUyBvciBBdG9tIGZlZWQuIjsKCQkJCQkJJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2Vycm9yJywgYXJyYXkoJHRoaXMtPmVycm9yLCBFX1VTRVJfTk9USUNFLCBfX0ZJTEVfXywgX19MSU5FX18pKTsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCgkJCQkJaWYgKGlzc2V0KCRoZWFkZXJzKSkKCQkJCQl7CgkJCQkJCSR0aGlzLT5kYXRhWydoZWFkZXJzJ10gPSAkaGVhZGVyczsKCQkJCQl9CgkJCQkJJHRoaXMtPmRhdGFbJ2J1aWxkJ10gPSBTSU1QTEVQSUVfQlVJTEQ7CgoJCQkJCS8vIENhY2hlIHRoZSBmaWxlIGlmIGNhY2hpbmcgaXMgZW5hYmxlZAoJCQkJCWlmICgkY2FjaGUgJiYgISRjYWNoZS0+c2F2ZSgkdGhpcykpCgkJCQkJewoJCQkJCQl0cmlnZ2VyX2Vycm9yKCIkdGhpcy0+Y2FjaGVfbG9jYXRpb24gaXMgbm90IHdyaXRlYWJsZS4gTWFrZSBzdXJlIHlvdSd2ZSBzZXQgdGhlIGNvcnJlY3QgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCwgYW5kIHRoYXQgdGhlIGxvY2F0aW9uIGlzIHNlcnZlci13cml0YWJsZS4iLCBFX1VTRVJfV0FSTklORyk7CgkJCQkJfQoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfQoKCQlpZiAoaXNzZXQoJHBhcnNlcikpCgkJewoJCQkvLyBXZSBoYXZlIGFuIGVycm9yLCBqdXN0IHNldCBTaW1wbGVQaWVfTWlzYzo6ZXJyb3IgdG8gaXQgYW5kIHF1aXQKCQkJJHRoaXMtPmVycm9yID0gc3ByaW50ZignVGhpcyBYTUwgZG9jdW1lbnQgaXMgaW52YWxpZCwgbGlrZWx5IGR1ZSB0byBpbnZhbGlkIGNoYXJhY3RlcnMuIFhNTCBlcnJvcjogJXMgYXQgbGluZSAlZCwgY29sdW1uICVkJywgJHBhcnNlci0+Z2V0X2Vycm9yX3N0cmluZygpLCAkcGFyc2VyLT5nZXRfY3VycmVudF9saW5lKCksICRwYXJzZXItPmdldF9jdXJyZW50X2NvbHVtbigpKTsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmVycm9yID0gJ1RoZSBkYXRhIGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgdG8gVVRGLTguIFlvdSBNVVNUIGhhdmUgZWl0aGVyIHRoZSBpY29udiBvciBtYnN0cmluZyBleHRlbnNpb24gaW5zdGFsbGVkLiBVcGdyYWRpbmcgdG8gUEhQIDUueCAod2hpY2ggaW5jbHVkZXMgaWNvbnYpIGlzIGhpZ2hseSByZWNvbW1lbmRlZC4nOwoJCX0KCgkJJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2Vycm9yJywgYXJyYXkoJHRoaXMtPmVycm9yLCBFX1VTRVJfTk9USUNFLCBfX0ZJTEVfXywgX19MSU5FX18pKTsKCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogRmV0Y2ggdGhlIGRhdGEgdmlhIFNpbXBsZVBpZV9GaWxlCgkgKgoJICogSWYgdGhlIGRhdGEgaXMgYWxyZWFkeSBjYWNoZWQsIGF0dGVtcHQgdG8gZmV0Y2ggaXQgZnJvbSB0aGVyZSBpbnN0ZWFkCgkgKiBAcGFyYW0gU2ltcGxlUGllX0NhY2hlfGZhbHNlICRjYWNoZSBDYWNoZSBoYW5kbGVyLCBvciBmYWxzZSB0byBub3QgbG9hZCBmcm9tIHRoZSBjYWNoZQoJICogQHJldHVybiBhcnJheXx0cnVlIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGF0YSB3YXMgbG9hZGVkIGZyb20gdGhlIGNhY2hlLCBvciBhbiBhcnJheSBvZiBIVFRQIGhlYWRlcnMgYW5kIHNuaWZmZWQgdHlwZQoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gZmV0Y2hfZGF0YSgmJGNhY2hlKQoJewoJCS8vIElmIGl0J3MgZW5hYmxlZCwgdXNlIHRoZSBjYWNoZQoJCWlmICgkY2FjaGUpCgkJewoJCQkvLyBMb2FkIHRoZSBDYWNoZQoJCQkkdGhpcy0+ZGF0YSA9ICRjYWNoZS0+bG9hZCgpOwoJCQlpZiAoIWVtcHR5KCR0aGlzLT5kYXRhKSkKCQkJewoJCQkJLy8gSWYgdGhlIGNhY2hlIGlzIGZvciBhbiBvdXRkYXRlZCBidWlsZCBvZiBTaW1wbGVQaWUKCQkJCWlmICghaXNzZXQoJHRoaXMtPmRhdGFbJ2J1aWxkJ10pIHx8ICR0aGlzLT5kYXRhWydidWlsZCddICE9PSBTSU1QTEVQSUVfQlVJTEQpCgkJCQl7CgkJCQkJJGNhY2hlLT51bmxpbmsoKTsKCQkJCQkkdGhpcy0+ZGF0YSA9IGFycmF5KCk7CgkJCQl9CgkJCQkvLyBJZiB3ZSd2ZSBoaXQgYSBjb2xsaXNpb24ganVzdCByZXJ1biBpdCB3aXRoIGNhY2hpbmcgZGlzYWJsZWQKCQkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ3VybCddKSAmJiAkdGhpcy0+ZGF0YVsndXJsJ10gIT09ICR0aGlzLT5mZWVkX3VybCkKCQkJCXsKCQkJCQkkY2FjaGUgPSBmYWxzZTsKCQkJCQkkdGhpcy0+ZGF0YSA9IGFycmF5KCk7CgkJCQl9CgkJCQkvLyBJZiB3ZSd2ZSBnb3QgYSBub24gZmVlZF91cmwgc3RvcmVkIChpZiB0aGUgcGFnZSBpc24ndCBhY3R1YWxseSBhIGZlZWQsIG9yIGlzIGEgcmVkaXJlY3QpIHVzZSB0aGF0IFVSTC4KCQkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2ZlZWRfdXJsJ10pKQoJCQkJewoJCQkJCS8vIElmIHRoZSBhdXRvZGlzY292ZXJ5IGNhY2hlIGlzIHN0aWxsIHZhbGlkIHVzZSBpdC4KCQkJCQlpZiAoJGNhY2hlLT5tdGltZSgpICsgJHRoaXMtPmF1dG9kaXNjb3ZlcnlfY2FjaGVfZHVyYXRpb24gPiB0aW1lKCkpCgkJCQkJewoJCQkJCQkvLyBEbyBub3QgbmVlZCB0byBkbyBmZWVkIGF1dG9kaXNjb3ZlcnkgeWV0LgoJCQkJCQlpZiAoJHRoaXMtPmRhdGFbJ2ZlZWRfdXJsJ10gIT09ICR0aGlzLT5kYXRhWyd1cmwnXSkKCQkJCQkJewoJCQkJCQkJJHRoaXMtPnNldF9mZWVkX3VybCgkdGhpcy0+ZGF0YVsnZmVlZF91cmwnXSk7CgkJCQkJCQlyZXR1cm4gJHRoaXMtPmluaXQoKTsKCQkJCQkJfQoKCQkJCQkJJGNhY2hlLT51bmxpbmsoKTsKCQkJCQkJJHRoaXMtPmRhdGEgPSBhcnJheSgpOwoJCQkJCX0KCQkJCX0KCQkJCS8vIENoZWNrIGlmIHRoZSBjYWNoZSBoYXMgYmVlbiB1cGRhdGVkCgkJCQllbHNlaWYgKCRjYWNoZS0+bXRpbWUoKSArICR0aGlzLT5jYWNoZV9kdXJhdGlvbiA8IHRpbWUoKSkKCQkJCXsKCQkJCQkvLyBJZiB3ZSBoYXZlIGxhc3QtbW9kaWZpZWQgYW5kL29yIGV0YWcgc2V0CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydoZWFkZXJzJ11bJ2xhc3QtbW9kaWZpZWQnXSkgfHwgaXNzZXQoJHRoaXMtPmRhdGFbJ2hlYWRlcnMnXVsnZXRhZyddKSkKCQkJCQl7CgkJCQkJCSRoZWFkZXJzID0gYXJyYXkoCgkJCQkJCQknQWNjZXB0JyA9PiAnYXBwbGljYXRpb24vYXRvbSt4bWwsIGFwcGxpY2F0aW9uL3Jzcyt4bWwsIGFwcGxpY2F0aW9uL3JkZit4bWw7cT0wLjksIGFwcGxpY2F0aW9uL3htbDtxPTAuOCwgdGV4dC94bWw7cT0wLjgsIHRleHQvaHRtbDtxPTAuNywgdW5rbm93bi91bmtub3duO3E9MC4xLCBhcHBsaWNhdGlvbi91bmtub3duO3E9MC4xLCAqLyo7cT0wLjEnLAoJCQkJCQkpOwoJCQkJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2hlYWRlcnMnXVsnbGFzdC1tb2RpZmllZCddKSkKCQkJCQkJewoJCQkJCQkJJGhlYWRlcnNbJ2lmLW1vZGlmaWVkLXNpbmNlJ10gPSAkdGhpcy0+ZGF0YVsnaGVhZGVycyddWydsYXN0LW1vZGlmaWVkJ107CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydoZWFkZXJzJ11bJ2V0YWcnXSkpCgkJCQkJCXsKCQkJCQkJCSRoZWFkZXJzWydpZi1ub25lLW1hdGNoJ10gPSAkdGhpcy0+ZGF0YVsnaGVhZGVycyddWydldGFnJ107CgkJCQkJCX0KCgkJCQkJCSRmaWxlID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0ZpbGUnLCBhcnJheSgkdGhpcy0+ZmVlZF91cmwsICR0aGlzLT50aW1lb3V0LzEwLCA1LCAkaGVhZGVycywgJHRoaXMtPnVzZXJhZ2VudCwgJHRoaXMtPmZvcmNlX2Zzb2Nrb3BlbikpOwoKCQkJCQkJaWYgKCRmaWxlLT5zdWNjZXNzKQoJCQkJCQl7CgkJCQkJCQlpZiAoJGZpbGUtPnN0YXR1c19jb2RlID09PSAzMDQpCgkJCQkJCQl7CgkJCQkJCQkJJGNhY2hlLT50b3VjaCgpOwoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJdW5zZXQoJGZpbGUpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJLy8gSWYgdGhlIGNhY2hlIGlzIHN0aWxsIHZhbGlkLCBqdXN0IHJldHVybiB0cnVlCgkJCQllbHNlCgkJCQl7CgkJCQkJJHRoaXMtPnJhd19kYXRhID0gZmFsc2U7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQkJLy8gSWYgdGhlIGNhY2hlIGlzIGVtcHR5LCBkZWxldGUgaXQKCQkJZWxzZQoJCQl7CgkJCQkkY2FjaGUtPnVubGluaygpOwoJCQkJJHRoaXMtPmRhdGEgPSBhcnJheSgpOwoJCQl9CgkJfQoJCS8vIElmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSB0aGUgZmlsZSAoaXQnbGwgb25seSBleGlzdCBpZiB3ZSd2ZSBvcGVuZWQgaXQgdG8gY2hlY2sgaWYgdGhlIGNhY2hlIGhhcyBiZWVuIG1vZGlmaWVkKSwgb3BlbiBpdC4KCQlpZiAoIWlzc2V0KCRmaWxlKSkKCQl7CgkJCWlmICgkdGhpcy0+ZmlsZSBpbnN0YW5jZW9mIFNpbXBsZVBpZV9GaWxlICYmICR0aGlzLT5maWxlLT51cmwgPT09ICR0aGlzLT5mZWVkX3VybCkKCQkJewoJCQkJJGZpbGUgPSYgJHRoaXMtPmZpbGU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkaGVhZGVycyA9IGFycmF5KAoJCQkJCSdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi9hdG9tK3htbCwgYXBwbGljYXRpb24vcnNzK3htbCwgYXBwbGljYXRpb24vcmRmK3htbDtxPTAuOSwgYXBwbGljYXRpb24veG1sO3E9MC44LCB0ZXh0L3htbDtxPTAuOCwgdGV4dC9odG1sO3E9MC43LCB1bmtub3duL3Vua25vd247cT0wLjEsIGFwcGxpY2F0aW9uL3Vua25vd247cT0wLjEsICovKjtxPTAuMScsCgkJCQkpOwoJCQkJJGZpbGUgPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnRmlsZScsIGFycmF5KCR0aGlzLT5mZWVkX3VybCwgJHRoaXMtPnRpbWVvdXQsIDUsICRoZWFkZXJzLCAkdGhpcy0+dXNlcmFnZW50LCAkdGhpcy0+Zm9yY2VfZnNvY2tvcGVuKSk7CgkJCX0KCQl9CgkJLy8gSWYgdGhlIGZpbGUgY29ubmVjdGlvbiBoYXMgYW4gZXJyb3IsIHNldCBTaW1wbGVQaWU6OmVycm9yIHRvIHRoYXQgYW5kIHF1aXQKCQlpZiAoISRmaWxlLT5zdWNjZXNzICYmICEoJGZpbGUtPm1ldGhvZCAmIFNJTVBMRVBJRV9GSUxFX1NPVVJDRV9SRU1PVEUgPT09IDAgfHwgKCRmaWxlLT5zdGF0dXNfY29kZSA9PT0gMjAwIHx8ICRmaWxlLT5zdGF0dXNfY29kZSA+IDIwNiAmJiAkZmlsZS0+c3RhdHVzX2NvZGUgPCAzMDApKSkKCQl7CgkJCSR0aGlzLT5lcnJvciA9ICRmaWxlLT5lcnJvcjsKCQkJcmV0dXJuICFlbXB0eSgkdGhpcy0+ZGF0YSk7CgkJfQoKCQlpZiAoISR0aGlzLT5mb3JjZV9mZWVkKQoJCXsKCQkJLy8gQ2hlY2sgaWYgdGhlIHN1cHBsaWVkIFVSTCBpcyBhIGZlZWQsIGlmIGl0IGlzbid0LCBsb29rIGZvciBpdC4KCQkJJGxvY2F0ZSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdMb2NhdG9yJywgYXJyYXkoJiRmaWxlLCAkdGhpcy0+dGltZW91dCwgJHRoaXMtPnVzZXJhZ2VudCwgJHRoaXMtPm1heF9jaGVja2VkX2ZlZWRzKSk7CgoJCQlpZiAoISRsb2NhdGUtPmlzX2ZlZWQoJGZpbGUpKQoJCQl7CgkJCQkvLyBXZSBuZWVkIHRvIHVuc2V0IHRoaXMgc28gdGhhdCBpZiBTaW1wbGVQaWU6OnNldF9maWxlKCkgaGFzIGJlZW4gY2FsbGVkIHRoYXQgb2JqZWN0IGlzIHVudG91Y2hlZAoJCQkJdW5zZXQoJGZpbGUpOwoJCQkJaWYgKCEoJGZpbGUgPSAkbG9jYXRlLT5maW5kKCR0aGlzLT5hdXRvZGlzY292ZXJ5LCAkdGhpcy0+YWxsX2Rpc2NvdmVyZWRfZmVlZHMpKSkKCQkJCXsKCQkJCQkkdGhpcy0+ZXJyb3IgPSAiQSBmZWVkIGNvdWxkIG5vdCBiZSBmb3VuZCBhdCAkdGhpcy0+ZmVlZF91cmwuIEEgZmVlZCB3aXRoIGFuIGludmFsaWQgbWltZSB0eXBlIG1heSBmYWxsIHZpY3RpbSB0byB0aGlzIGVycm9yLCBvciAiIC4gU0lNUExFUElFX05BTUUgLiAiIHdhcyB1bmFibGUgdG8gYXV0by1kaXNjb3ZlciBpdC4uIFVzZSBmb3JjZV9mZWVkKCkgaWYgeW91IGFyZSBjZXJ0YWluIHRoaXMgVVJMIGlzIGEgcmVhbCBmZWVkLiI7CgkJCQkJJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2Vycm9yJywgYXJyYXkoJHRoaXMtPmVycm9yLCBFX1VTRVJfTk9USUNFLCBfX0ZJTEVfXywgX19MSU5FX18pKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQlpZiAoJGNhY2hlKQoJCQkJewoJCQkJCSR0aGlzLT5kYXRhID0gYXJyYXkoJ3VybCcgPT4gJHRoaXMtPmZlZWRfdXJsLCAnZmVlZF91cmwnID0+ICRmaWxlLT51cmwsICdidWlsZCcgPT4gU0lNUExFUElFX0JVSUxEKTsKCQkJCQlpZiAoISRjYWNoZS0+c2F2ZSgkdGhpcykpCgkJCQkJewoJCQkJCQl0cmlnZ2VyX2Vycm9yKCIkdGhpcy0+Y2FjaGVfbG9jYXRpb24gaXMgbm90IHdyaXRlYWJsZS4gTWFrZSBzdXJlIHlvdSd2ZSBzZXQgdGhlIGNvcnJlY3QgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCwgYW5kIHRoYXQgdGhlIGxvY2F0aW9uIGlzIHNlcnZlci13cml0YWJsZS4iLCBFX1VTRVJfV0FSTklORyk7CgkJCQkJfQoJCQkJCSRjYWNoZSA9ICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnQ2FjaGUnLCAnY3JlYXRlJywgYXJyYXkoJHRoaXMtPmNhY2hlX2xvY2F0aW9uLCBjYWxsX3VzZXJfZnVuYygkdGhpcy0+Y2FjaGVfbmFtZV9mdW5jdGlvbiwgJGZpbGUtPnVybCksICdzcGMnKSk7CgkJCQl9CgkJCQkkdGhpcy0+ZmVlZF91cmwgPSAkZmlsZS0+dXJsOwoJCQl9CgkJCSRsb2NhdGUgPSBudWxsOwoJCX0KCgkJJHRoaXMtPnJhd19kYXRhID0gJGZpbGUtPmJvZHk7CgoJCSRoZWFkZXJzID0gJGZpbGUtPmhlYWRlcnM7CgkJJHNuaWZmZXIgPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQ29udGVudF9UeXBlX1NuaWZmZXInLCBhcnJheSgmJGZpbGUpKTsKCQkkc25pZmZlZCA9ICRzbmlmZmVyLT5nZXRfdHlwZSgpOwoKCQlyZXR1cm4gYXJyYXkoJGhlYWRlcnMsICRzbmlmZmVkKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIG9jY3VyZWQgZXJyb3IKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xhcnJheSBFcnJvciBtZXNzYWdlLCBvciBhcnJheSBvZiBtZXNzYWdlcyBmb3IgbXVsdGlmZWVkcwoJICovCglwdWJsaWMgZnVuY3Rpb24gZXJyb3IoKQoJewoJCXJldHVybiAkdGhpcy0+ZXJyb3I7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHJhdyBYTUwKCSAqCgkgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBvbGQgYCRmZWVkLT5lbmFibGVfeG1sX2R1bXAodHJ1ZSlgLCBidXQgcmV0dXJucwoJICogdGhlIGRhdGEgaW5zdGVhZCBvZiBwcmludGluZyBpdC4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xib29sZWFuIFJhdyBYTUwgZGF0YSwgZmFsc2UgaWYgdGhlIGNhY2hlIGlzIHVzZWQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9yYXdfZGF0YSgpCgl7CgkJcmV0dXJuICR0aGlzLT5yYXdfZGF0YTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgZm9yIG91dHB1dAoJICoKCSAqIEBzaW5jZSBQcmV2aWV3IFJlbGVhc2UKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfZW5jb2RpbmcoKQoJewoJCXJldHVybiAkdGhpcy0+c2FuaXRpemUtPm91dHB1dF9lbmNvZGluZzsKCX0KCgkvKioKCSAqIFNlbmQgdGhlIGNvbnRlbnQtdHlwZSBoZWFkZXIgd2l0aCBjb3JyZWN0IGVuY29kaW5nCgkgKgoJICogVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0IHRoZSBTaW1wbGVQaWUtZW5hYmxlZCBwYWdlIGlzIGJlaW5nIHNlcnZlZCB3aXRoCgkgKiB0aGUgY29ycmVjdCB7QGxpbmsgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy8gbWltZS10eXBlfQoJICogYW5kIGNoYXJhY3RlciBlbmNvZGluZyBIVFRQIGhlYWRlcnMgKGNoYXJhY3RlciBlbmNvZGluZyBkZXRlcm1pbmVkIGJ5IHRoZQoJICoge0BzZWUgc2V0X291dHB1dF9lbmNvZGluZ30gY29uZmlnIG9wdGlvbikuCgkgKgoJICogVGhpcyB3b24ndCB3b3JrIHByb3Blcmx5IGlmIGFueSBjb250ZW50IG9yIHdoaXRlc3BhY2UgaGFzIGFscmVhZHkgYmVlbgoJICogc2VudCB0byB0aGUgYnJvd3NlciwgYmVjYXVzZSBpdCByZWxpZXMgb24gUEhQJ3MKCSAqIHtAbGluayBodHRwOi8vcGhwLm5ldC9oZWFkZXIgaGVhZGVyKCl9IGZ1bmN0aW9uLCBhbmQgdGhlc2UgYXJlIHRoZQoJICogY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCB0aGUgZnVuY3Rpb24gd29ya3MuCgkgKgoJICogQmVjYXVzZSBpdCdzIHNldHRpbmcgdGhlc2Ugc2V0dGluZ3MgZm9yIHRoZSBlbnRpcmUgcGFnZSAoYXMgaXMgdGhlIG5hdHVyZQoJICogb2YgSFRUUCBoZWFkZXJzKSwgdGhpcyBzaG91bGQgb25seSBiZSB1c2VkIG9uY2UgcGVyIHBhZ2UgKGFnYWluLCBhdCB0aGUKCSAqIHRvcCkuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbWltZSBNSU1FIHR5cGUgdG8gc2VydmUgdGhlIHBhZ2UgYXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGhhbmRsZV9jb250ZW50X3R5cGUoJG1pbWUgPSAndGV4dC9odG1sJykKCXsKCQlpZiAoIWhlYWRlcnNfc2VudCgpKQoJCXsKCQkJJGhlYWRlciA9ICJDb250ZW50LXR5cGU6ICRtaW1lOyI7CgkJCWlmICgkdGhpcy0+Z2V0X2VuY29kaW5nKCkpCgkJCXsKCQkJCSRoZWFkZXIgLj0gJyBjaGFyc2V0PScgLiAkdGhpcy0+Z2V0X2VuY29kaW5nKCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkaGVhZGVyIC49ICcgY2hhcnNldD1VVEYtOCc7CgkJCX0KCQkJaGVhZGVyKCRoZWFkZXIpOwoJCX0KCX0KCgkvKioKCSAqIEdldCB0aGUgdHlwZSBvZiB0aGUgZmVlZAoJICoKCSAqIFRoaXMgcmV0dXJucyBhIFNJTVBMRVBJRV9UWVBFXyogY29uc3RhbnQsIHdoaWNoIGNhbiBiZSB0ZXN0ZWQgYWdhaW5zdAoJICogdXNpbmcge0BsaW5rIGh0dHA6Ly9waHAubmV0L2xhbmd1YWdlLm9wZXJhdG9ycy5iaXR3aXNlIGJpdHdpc2Ugb3BlcmF0b3JzfQoJICoKCSAqIEBzaW5jZSAwLjggKHVzYWdlIGNoYW5nZWQgdG8gdXNpbmcgY29uc3RhbnRzIGluIDEuMCkKCSAqIEBzZWUgU0lNUExFUElFX1RZUEVfTk9ORSBVbmtub3duLgoJICogQHNlZSBTSU1QTEVQSUVfVFlQRV9SU1NfMDkwIFJTUyAwLjkwLgoJICogQHNlZSBTSU1QTEVQSUVfVFlQRV9SU1NfMDkxX05FVFNDQVBFIFJTUyAwLjkxIChOZXRzY2FwZSkuCgkgKiBAc2VlIFNJTVBMRVBJRV9UWVBFX1JTU18wOTFfVVNFUkxBTkQgUlNTIDAuOTEgKFVzZXJsYW5kKS4KCSAqIEBzZWUgU0lNUExFUElFX1RZUEVfUlNTXzA5MSBSU1MgMC45MS4KCSAqIEBzZWUgU0lNUExFUElFX1RZUEVfUlNTXzA5MiBSU1MgMC45Mi4KCSAqIEBzZWUgU0lNUExFUElFX1RZUEVfUlNTXzA5MyBSU1MgMC45My4KCSAqIEBzZWUgU0lNUExFUElFX1RZUEVfUlNTXzA5NCBSU1MgMC45NC4KCSAqIEBzZWUgU0lNUExFUElFX1RZUEVfUlNTXzEwIFJTUyAxLjAuCgkgKiBAc2VlIFNJTVBMRVBJRV9UWVBFX1JTU18yMCBSU1MgMi4wLnguCgkgKiBAc2VlIFNJTVBMRVBJRV9UWVBFX1JTU19SREYgUkRGLWJhc2VkIFJTUy4KCSAqIEBzZWUgU0lNUExFUElFX1RZUEVfUlNTX1NZTkRJQ0FUSU9OIE5vbi1SREYtYmFzZWQgUlNTICh0cnVseSBpbnRlbmRlZCBhcyBzeW5kaWNhdGlvbiBmb3JtYXQpLgoJICogQHNlZSBTSU1QTEVQSUVfVFlQRV9SU1NfQUxMIEFueSB2ZXJzaW9uIG9mIFJTUy4KCSAqIEBzZWUgU0lNUExFUElFX1RZUEVfQVRPTV8wMyBBdG9tIDAuMy4KCSAqIEBzZWUgU0lNUExFUElFX1RZUEVfQVRPTV8xMCBBdG9tIDEuMC4KCSAqIEBzZWUgU0lNUExFUElFX1RZUEVfQVRPTV9BTEwgQW55IHZlcnNpb24gb2YgQXRvbS4KCSAqIEBzZWUgU0lNUExFUElFX1RZUEVfQUxMIEFueSBrbm93bi9zdXBwb3J0ZWQgZmVlZCB0eXBlLgoJICogQHJldHVybiBpbnQgU0lNUExFUElFX1RZUEVfKiBjb25zdGFudAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3R5cGUoKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPmRhdGFbJ3R5cGUnXSkpCgkJewoJCQkkdGhpcy0+ZGF0YVsndHlwZSddID0gU0lNUExFUElFX1RZUEVfQUxMOwoJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZmVlZCddKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSAmPSBTSU1QTEVQSUVfVFlQRV9BVE9NXzEwOwoJCQl9CgkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZmVlZCddKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSAmPSBTSU1QTEVQSUVfVFlQRV9BVE9NXzAzOwoJCQl9CgkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXSkpCgkJCXsKCQkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwXVsnY2hhbm5lbCddKQoJCQkJfHwgaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXVswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMF1bJ2ltYWdlJ10pCgkJCQl8fCBpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwXVsnaXRlbSddKQoJCQkJfHwgaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXVswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMF1bJ3RleHRpbnB1dCddKSkKCQkJCXsKCQkJCQkkdGhpcy0+ZGF0YVsndHlwZSddICY9IFNJTVBMRVBJRV9UWVBFX1JTU18xMDsKCQkJCX0KCQkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MF1bJ2NoYW5uZWwnXSkKCQkJCXx8IGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUkRGXVsnUkRGJ11bMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwXVsnaW1hZ2UnXSkKCQkJCXx8IGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUkRGXVsnUkRGJ11bMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwXVsnaXRlbSddKQoJCQkJfHwgaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXVswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTBdWyd0ZXh0aW5wdXQnXSkpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSAmPSBTSU1QTEVQSUVfVFlQRV9SU1NfMDkwOwoJCQkJfQoJCQl9CgkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjBdWydyc3MnXSkpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0eXBlJ10gJj0gU0lNUExFUElFX1RZUEVfUlNTX0FMTDsKCQkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMF1bJ3JzcyddWzBdWydhdHRyaWJzJ11bJyddWyd2ZXJzaW9uJ10pKQoJCQkJewoJCQkJCXN3aXRjaCAodHJpbSgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMF1bJ3JzcyddWzBdWydhdHRyaWJzJ11bJyddWyd2ZXJzaW9uJ10pKQoJCQkJCXsKCQkJCQkJY2FzZSAnMC45MSc6CgkJCQkJCQkkdGhpcy0+ZGF0YVsndHlwZSddICY9IFNJTVBMRVBJRV9UWVBFX1JTU18wOTE7CgkJCQkJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjBdWydyc3MnXVswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMF1bJ3NraXBob3VycyddWydob3VyJ11bMF1bJ2RhdGEnXSkpCgkJCQkJCQl7CgkJCQkJCQkJc3dpdGNoICh0cmltKCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwXVsncnNzJ11bMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjBdWydza2lwaG91cnMnXVsnaG91ciddWzBdWydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJY2FzZSAnMCc6CgkJCQkJCQkJCQkkdGhpcy0+ZGF0YVsndHlwZSddICY9IFNJTVBMRVBJRV9UWVBFX1JTU18wOTFfTkVUU0NBUEU7CgkJCQkJCQkJCQlicmVhazsKCgkJCQkJCQkJCWNhc2UgJzI0JzoKCQkJCQkJCQkJCSR0aGlzLT5kYXRhWyd0eXBlJ10gJj0gU0lNUExFUElFX1RZUEVfUlNTXzA5MV9VU0VSTEFORDsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnMC45Mic6CgkJCQkJCQkkdGhpcy0+ZGF0YVsndHlwZSddICY9IFNJTVBMRVBJRV9UWVBFX1JTU18wOTI7CgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgJzAuOTMnOgoJCQkJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSAmPSBTSU1QTEVQSUVfVFlQRV9SU1NfMDkzOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICcwLjk0JzoKCQkJCQkJCSR0aGlzLT5kYXRhWyd0eXBlJ10gJj0gU0lNUExFUElFX1RZUEVfUlNTXzA5NDsKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnMi4wJzoKCQkJCQkJCSR0aGlzLT5kYXRhWyd0eXBlJ10gJj0gU0lNUExFUElFX1RZUEVfUlNTXzIwOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSA9IFNJTVBMRVBJRV9UWVBFX05PTkU7CgkJCX0KCQl9CgkJcmV0dXJuICR0aGlzLT5kYXRhWyd0eXBlJ107Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIFVSTCBmb3IgdGhlIGZlZWQKCSAqCgkgKiBNYXkgb3IgbWF5IG5vdCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgVVJMIHBhc3NlZCB0byB7QHNlZSBzZXRfZmVlZF91cmwoKX0sCgkgKiBkZXBlbmRpbmcgb24gd2hldGhlciBhdXRvLWRpc2NvdmVyeSB3YXMgdXNlZC4KCSAqCgkgKiBAc2luY2UgUHJldmlldyBSZWxlYXNlIChwcmV2aW91c2x5IGNhbGxlZCBgZ2V0X2ZlZWRfdXJsKClgIHNpbmNlIFNpbXBsZVBpZSAwLjguKQoJICogQHRvZG8gSWYgd2UgaGF2ZSBhIHBlcm0gcmVkaXJlY3Qgd2Ugc2hvdWxkIHJldHVybiB0aGUgbmV3IFVSTAoJICogQHRvZG8gV2hlbiB3ZSBtYWtlIHRoZSBhYm92ZSBjaGFuZ2UsIGxldCdzIHN1cHBvcnQgPGl0dW5lczpuZXctZmVlZC11cmw+IGFzIHdlbGwKCSAqIEB0b2RvIEFsc28sIHxhdG9tOmxpbmt8QHJlbD1zZWxmCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdWJzY3JpYmVfdXJsKCkKCXsKCQlpZiAoJHRoaXMtPmZlZWRfdXJsICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkdGhpcy0+ZmVlZF91cmwsIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IGRhdGEgZm9yIGFuIGZlZWQtbGV2ZWwgZWxlbWVudAoJICoKCSAqIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gZ2V0IGFjY2VzcyB0byBBTlkgZWxlbWVudC9hdHRyaWJ1dGUgdGhhdCBpcyBhCgkgKiBzdWItZWxlbWVudCBvZiB0aGUgb3BlbmluZyBmZWVkIHRhZy4KCSAqCgkgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGluZGV4ZWQgYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuCgkgKiBuYW1lc3BhY2UgYW5kIHRhZyBuYW1lLiBFYWNoIGVsZW1lbnQgaGFzIGBhdHRyaWJzYCwgYGRhdGFgIGFuZCBgY2hpbGRgCgkgKiBzdWJrZXlzLiBGb3IgYGF0dHJpYnNgIGFuZCBgY2hpbGRgLCB0aGVzZSBjb250YWluIG5hbWVzcGFjZSBzdWJrZXlzLgoJICogYGF0dHJpYnNgIHRoZW4gaGFzIG9uZSBsZXZlbCBvZiBhc3NvY2lhdGl2ZSBuYW1lID0+IHZhbHVlIGRhdGEgKHdoZXJlCgkgKiBgdmFsdWVgIGlzIGEgc3RyaW5nKSBhZnRlciB0aGUgbmFtZXNwYWNlLiBgY2hpbGRgIGhhcyB0YWctaW5kZXhlZCBrZXlzCgkgKiBhZnRlciB0aGUgbmFtZXNwYWNlLCBlYWNoIG1lbWJlciBvZiB3aGljaCBpcyBhbiBpbmRleGVkIGFycmF5IG1hdGNoaW5nCgkgKiB0aGlzIHNhbWUgZm9ybWF0LgoJICoKCSAqIEZvciBleGFtcGxlOgoJICogPHByZT4KCSAqIC8vIFRoaXMgaXMgcHJvYmFibHkgYSBiYWQgZXhhbXBsZSBiZWNhdXNlIHdlIGFscmVhZHkgc3VwcG9ydAoJICogLy8gPG1lZGlhOmNvbnRlbnQ+IG5hdGl2ZWx5LCBidXQgaXQgc2hvd3MgeW91IGhvdyB0byBwYXJzZSB0aHJvdWdoCgkgKiAvLyB0aGUgbm9kZXMuCgkgKiAkZ3JvdXAgPSAkaXRlbS0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAnZ3JvdXAnKTsKCSAqICRjb250ZW50ID0gJGdyb3VwWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb250ZW50J107CgkgKiAkZmlsZSA9ICRjb250ZW50WzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXTsKCSAqIGVjaG8gJGZpbGU7CgkgKiA8L3ByZT4KCSAqCgkgKiBAc2luY2UgMS4wCgkgKiBAc2VlIGh0dHA6Ly9zaW1wbGVwaWUub3JnL3dpa2kvZmFxL3N1cHBvcnRlZF94bWxfbmFtZXNwYWNlcwoJICogQHBhcmFtIHN0cmluZyAkbmFtZXNwYWNlIFRoZSBVUkwgb2YgdGhlIFhNTCBuYW1lc3BhY2Ugb2YgdGhlIGVsZW1lbnRzIHlvdSdyZSB0cnlpbmcgdG8gYWNjZXNzCgkgKiBAcGFyYW0gc3RyaW5nICR0YWcgVGFnIG5hbWUKCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9mZWVkX3RhZ3MoJG5hbWVzcGFjZSwgJHRhZykKCXsKCQkkdHlwZSA9ICR0aGlzLT5nZXRfdHlwZSgpOwoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9UWVBFX0FUT01fMTApCgkJewoJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZmVlZCddWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddKSkKCQkJewoJCQkJcmV0dXJuICR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ2ZlZWQnXVswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXTsKCQkJfQoJCX0KCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfVFlQRV9BVE9NXzAzKQoJCXsKCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ2ZlZWQnXVswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXSkpCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydmZWVkJ11bMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJCX0KCQl9CgkJaWYgKCR0eXBlICYgU0lNUExFUElFX1RZUEVfUlNTX1JERikKCQl7CgkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddKSkKCQkJewoJCQkJcmV0dXJuICR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUkRGXVsnUkRGJ11bMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJCX0KCQl9CgkJaWYgKCR0eXBlICYgU0lNUExFUElFX1RZUEVfUlNTX1NZTkRJQ0FUSU9OKQoJCXsKCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwXVsncnNzJ11bMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ10pKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjBdWydyc3MnXVswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXTsKCQkJfQoJCX0KCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIEdldCBkYXRhIGZvciBhbiBjaGFubmVsLWxldmVsIGVsZW1lbnQKCSAqCgkgKiBUaGlzIG1ldGhvZCBhbGxvd3MgeW91IHRvIGdldCBhY2Nlc3MgdG8gQU5ZIGVsZW1lbnQvYXR0cmlidXRlIGluIHRoZQoJICogY2hhbm5lbC9oZWFkZXIgc2VjdGlvbiBvZiB0aGUgZmVlZC4KCSAqCgkgKiBTZWUge0BzZWUgU2ltcGxlUGllOjpnZXRfZmVlZF90YWdzKCl9IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSByZXR1cm4gdmFsdWUKCSAqCgkgKiBAc2luY2UgMS4wCgkgKiBAc2VlIGh0dHA6Ly9zaW1wbGVwaWUub3JnL3dpa2kvZmFxL3N1cHBvcnRlZF94bWxfbmFtZXNwYWNlcwoJICogQHBhcmFtIHN0cmluZyAkbmFtZXNwYWNlIFRoZSBVUkwgb2YgdGhlIFhNTCBuYW1lc3BhY2Ugb2YgdGhlIGVsZW1lbnRzIHlvdSdyZSB0cnlpbmcgdG8gYWNjZXNzCgkgKiBAcGFyYW0gc3RyaW5nICR0YWcgVGFnIG5hbWUKCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9jaGFubmVsX3RhZ3MoJG5hbWVzcGFjZSwgJHRhZykKCXsKCQkkdHlwZSA9ICR0aGlzLT5nZXRfdHlwZSgpOwoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9UWVBFX0FUT01fQUxMKQoJCXsKCQkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ZlZWRfdGFncygkbmFtZXNwYWNlLCAkdGFnKSkKCQkJewoJCQkJcmV0dXJuICRyZXR1cm47CgkJCX0KCQl9CgkJaWYgKCR0eXBlICYgU0lNUExFUElFX1RZUEVfUlNTXzEwKQoJCXsKCQkJaWYgKCRjaGFubmVsID0gJHRoaXMtPmdldF9mZWVkX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICdjaGFubmVsJykpCgkJCXsKCQkJCWlmIChpc3NldCgkY2hhbm5lbFswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXSkpCgkJCQl7CgkJCQkJcmV0dXJuICRjaGFubmVsWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCQkJfQoJCQl9CgkJfQoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9UWVBFX1JTU18wOTApCgkJewoJCQlpZiAoJGNoYW5uZWwgPSAkdGhpcy0+Z2V0X2ZlZWRfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAsICdjaGFubmVsJykpCgkJCXsKCQkJCWlmIChpc3NldCgkY2hhbm5lbFswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXSkpCgkJCQl7CgkJCQkJcmV0dXJuICRjaGFubmVsWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCQkJfQoJCQl9CgkJfQoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9UWVBFX1JTU19TWU5ESUNBVElPTikKCQl7CgkJCWlmICgkY2hhbm5lbCA9ICR0aGlzLT5nZXRfZmVlZF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwLCAnY2hhbm5lbCcpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGNoYW5uZWxbMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ10pKQoJCQkJewoJCQkJCXJldHVybiAkY2hhbm5lbFswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIEdldCBkYXRhIGZvciBhbiBjaGFubmVsLWxldmVsIGVsZW1lbnQKCSAqCgkgKiBUaGlzIG1ldGhvZCBhbGxvd3MgeW91IHRvIGdldCBhY2Nlc3MgdG8gQU5ZIGVsZW1lbnQvYXR0cmlidXRlIGluIHRoZQoJICogaW1hZ2UvbG9nbyBzZWN0aW9uIG9mIHRoZSBmZWVkLgoJICoKCSAqIFNlZSB7QHNlZSBTaW1wbGVQaWU6OmdldF9mZWVkX3RhZ3MoKX0gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHJldHVybiB2YWx1ZQoJICoKCSAqIEBzaW5jZSAxLjAKCSAqIEBzZWUgaHR0cDovL3NpbXBsZXBpZS5vcmcvd2lraS9mYXEvc3VwcG9ydGVkX3htbF9uYW1lc3BhY2VzCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgVGhlIFVSTCBvZiB0aGUgWE1MIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudHMgeW91J3JlIHRyeWluZyB0byBhY2Nlc3MKCSAqIEBwYXJhbSBzdHJpbmcgJHRhZyBUYWcgbmFtZQoJICogQHJldHVybiBhcnJheQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2ltYWdlX3RhZ3MoJG5hbWVzcGFjZSwgJHRhZykKCXsKCQkkdHlwZSA9ICR0aGlzLT5nZXRfdHlwZSgpOwoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9UWVBFX1JTU18xMCkKCQl7CgkJCWlmICgkaW1hZ2UgPSAkdGhpcy0+Z2V0X2ZlZWRfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ2ltYWdlJykpCgkJCXsKCQkJCWlmIChpc3NldCgkaW1hZ2VbMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ10pKQoJCQkJewoJCQkJCXJldHVybiAkaW1hZ2VbMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJCQl9CgkJCX0KCQl9CgkJaWYgKCR0eXBlICYgU0lNUExFUElFX1RZUEVfUlNTXzA5MCkKCQl7CgkJCWlmICgkaW1hZ2UgPSAkdGhpcy0+Z2V0X2ZlZWRfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAsICdpbWFnZScpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGltYWdlWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddKSkKCQkJCXsKCQkJCQlyZXR1cm4gJGltYWdlWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCQkJfQoJCQl9CgkJfQoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9UWVBFX1JTU19TWU5ESUNBVElPTikKCQl7CgkJCWlmICgkaW1hZ2UgPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMCwgJ2ltYWdlJykpCgkJCXsKCQkJCWlmIChpc3NldCgkaW1hZ2VbMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ10pKQoJCQkJewoJCQkJCXJldHVybiAkaW1hZ2VbMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGJhc2UgVVJMIHZhbHVlIGZyb20gdGhlIGZlZWQKCSAqCgkgKiBVc2VzIGA8eG1sOmJhc2U+YCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2VzIHRoZSBmaXJzdCBsaW5rIGluIHRoZQoJICogZmVlZCwgb3IgZmFpbGluZyB0aGF0LCB0aGUgVVJMIG9mIHRoZSBmZWVkIGl0c2VsZi4KCSAqCgkgKiBAc2VlIGdldF9saW5rCgkgKiBAc2VlIHN1YnNjcmliZV91cmwKCSAqCgkgKiBAcGFyYW0gYXJyYXkgJGVsZW1lbnQKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfYmFzZSgkZWxlbWVudCA9IGFycmF5KCkpCgl7CgkJaWYgKCEoJHRoaXMtPmdldF90eXBlKCkgJiBTSU1QTEVQSUVfVFlQRV9SU1NfU1lORElDQVRJT04pICYmICFlbXB0eSgkZWxlbWVudFsneG1sX2Jhc2VfZXhwbGljaXQnXSkgJiYgaXNzZXQoJGVsZW1lbnRbJ3htbF9iYXNlJ10pKQoJCXsKCQkJcmV0dXJuICRlbGVtZW50Wyd4bWxfYmFzZSddOwoJCX0KCQllbHNlaWYgKCR0aGlzLT5nZXRfbGluaygpICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5nZXRfbGluaygpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gJHRoaXMtPnN1YnNjcmliZV91cmwoKTsKCQl9Cgl9CgoJLyoqCgkgKiBTYW5pdGl6ZSBmZWVkIGRhdGEKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBzZWUgU2ltcGxlUGllX1Nhbml0aXplOjpzYW5pdGl6ZSgpCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIERhdGEgdG8gc2FuaXRpemUKCSAqIEBwYXJhbSBpbnQgJHR5cGUgT25lIG9mIHRoZSBTSU1QTEVQSUVfQ09OU1RSVUNUXyogY29uc3RhbnRzCgkgKiBAcGFyYW0gc3RyaW5nICRiYXNlIEJhc2UgVVJMIHRvIHJlc29sdmUgVVJMcyBhZ2FpbnN0CgkgKiBAcmV0dXJuIHN0cmluZyBTYW5pdGl6ZWQgZGF0YQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2FuaXRpemUoJGRhdGEsICR0eXBlLCAkYmFzZSA9ICcnKQoJewoJCXJldHVybiAkdGhpcy0+c2FuaXRpemUtPnNhbml0aXplKCRkYXRhLCAkdHlwZSwgJGJhc2UpOwoJfQoKCS8qKgoJICogR2V0IHRoZSB0aXRsZSBvZiB0aGUgZmVlZAoJICoKCSAqIFVzZXMgYDxhdG9tOnRpdGxlPmAsIGA8dGl0bGU+YCBvciBgPGRjOnRpdGxlPmAKCSAqCgkgKiBAc2luY2UgMS4wIChwcmV2aW91c2x5IGNhbGxlZCBgZ2V0X2ZlZWRfdGl0bGVgIHNpbmNlIDAuOCkKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF90aXRsZSgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnTWlzYycsICdhdG9tXzEwX2NvbnN0cnVjdF90eXBlJywgYXJyYXkoJHJldHVyblswXVsnYXR0cmlicyddKSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2F0b21fMDNfY29uc3RydWN0X3R5cGUnLCBhcnJheSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX01BWUJFX0hUTUwsICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX01BWUJFX0hUTUwsICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCBhIGNhdGVnb3J5IGZvciB0aGUgZmVlZAoJICoKCSAqIEBzaW5jZSBVbmtub3duCgkgKiBAcGFyYW0gaW50ICRrZXkgVGhlIGNhdGVnb3J5IHRoYXQgeW91IHdhbnQgdG8gcmV0dXJuLiAgUmVtZW1iZXIgdGhhdCBhcnJheXMgYmVnaW4gd2l0aCAwLCBub3QgMQoJICogQHJldHVybiBTaW1wbGVQaWVfQ2F0ZWdvcnl8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2NhdGVnb3J5KCRrZXkgPSAwKQoJewoJCSRjYXRlZ29yaWVzID0gJHRoaXMtPmdldF9jYXRlZ29yaWVzKCk7CgkJaWYgKGlzc2V0KCRjYXRlZ29yaWVzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkY2F0ZWdvcmllc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IGFsbCBjYXRlZ29yaWVzIGZvciB0aGUgZmVlZAoJICoKCSAqIFVzZXMgYDxhdG9tOmNhdGVnb3J5PmAsIGA8Y2F0ZWdvcnk+YCBvciBgPGRjOnN1YmplY3Q+YAoJICoKCSAqIEBzaW5jZSBVbmtub3duCgkgKiBAcmV0dXJuIGFycmF5fG51bGwgTGlzdCBvZiB7QHNlZSBTaW1wbGVQaWVfQ2F0ZWdvcnl9IG9iamVjdHMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9jYXRlZ29yaWVzKCkKCXsKCQkkY2F0ZWdvcmllcyA9IGFycmF5KCk7CgoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnY2F0ZWdvcnknKSBhcyAkY2F0ZWdvcnkpCgkJewoJCQkkdGVybSA9IG51bGw7CgkJCSRzY2hlbWUgPSBudWxsOwoJCQkkbGFiZWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWyd0ZXJtJ10pKQoJCQl7CgkJCQkkdGVybSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3Rlcm0nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCXsKCQkJCSRzY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddKSkKCQkJewoJCQkJJGxhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQkkY2F0ZWdvcmllc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NhdGVnb3J5JywgYXJyYXkoJHRlcm0sICRzY2hlbWUsICRsYWJlbCkpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwLCAnY2F0ZWdvcnknKSBhcyAkY2F0ZWdvcnkpCgkJewoJCQkvLyBUaGlzIGlzIHJlYWxseSB0aGUgbGFiZWwsIGJ1dCBrZWVwIHRoaXMgYXMgdGhlIHRlcm0gYWxzbyBmb3IgQkMuCgkJCS8vIExhYmVsIHdpbGwgYWxzbyB3b3JrIG9uIHJldHJpZXZpbmcgYmVjYXVzZSB0aGF0IGZhbGxzIGJhY2sgdG8gdGVybS4KCQkJJHRlcm0gPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2RvbWFpbiddKSkKCQkJewoJCQkJJHNjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2RvbWFpbiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHNjaGVtZSA9IG51bGw7CgkJCX0KCQkJJGNhdGVnb3JpZXNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdDYXRlZ29yeScsIGFycmF5KCR0ZXJtLCAkc2NoZW1lLCBudWxsKSk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ3N1YmplY3QnKSBhcyAkY2F0ZWdvcnkpCgkJewoJCQkkY2F0ZWdvcmllc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NhdGVnb3J5JywgYXJyYXkoJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKSk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ3N1YmplY3QnKSBhcyAkY2F0ZWdvcnkpCgkJewoJCQkkY2F0ZWdvcmllc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NhdGVnb3J5JywgYXJyYXkoJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKSk7CgkJfQoKCQlpZiAoIWVtcHR5KCRjYXRlZ29yaWVzKSkKCQl7CgkJCXJldHVybiBhcnJheV91bmlxdWUoJGNhdGVnb3JpZXMpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYW4gYXV0aG9yIGZvciB0aGUgZmVlZAoJICoKCSAqIEBzaW5jZSAxLjEKCSAqIEBwYXJhbSBpbnQgJGtleSBUaGUgYXV0aG9yIHRoYXQgeW91IHdhbnQgdG8gcmV0dXJuLiAgUmVtZW1iZXIgdGhhdCBhcnJheXMgYmVnaW4gd2l0aCAwLCBub3QgMQoJICogQHJldHVybiBTaW1wbGVQaWVfQXV0aG9yfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9hdXRob3IoJGtleSA9IDApCgl7CgkJJGF1dGhvcnMgPSAkdGhpcy0+Z2V0X2F1dGhvcnMoKTsKCQlpZiAoaXNzZXQoJGF1dGhvcnNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRhdXRob3JzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYWxsIGF1dGhvcnMgZm9yIHRoZSBmZWVkCgkgKgoJICogVXNlcyBgPGF0b206YXV0aG9yPmAsIGA8YXV0aG9yPmAsIGA8ZGM6Y3JlYXRvcj5gIG9yIGA8aXR1bmVzOmF1dGhvcj5gCgkgKgoJICogQHNpbmNlIDEuMQoJICogQHJldHVybiBhcnJheXxudWxsIExpc3Qgb2Yge0BzZWUgU2ltcGxlUGllX0F1dGhvcn0gb2JqZWN0cwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2F1dGhvcnMoKQoJewoJCSRhdXRob3JzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2F1dGhvcicpIGFzICRhdXRob3IpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmkgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnbmFtZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmkgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF0pKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJpICE9PSBudWxsKQoJCQl7CgkJCQkkYXV0aG9yc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0F1dGhvcicsIGFycmF5KCRuYW1lLCAkdXJpLCAkZW1haWwpKTsKCQkJfQoJCX0KCQlpZiAoJGF1dGhvciA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2F1dGhvcicpKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJsID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnbmFtZSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJsID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsndXJsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdKSk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZW1haWwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmICgkbmFtZSAhPT0gbnVsbCB8fCAkZW1haWwgIT09IG51bGwgfHwgJHVybCAhPT0gbnVsbCkKCQkJewoJCQkJJGF1dGhvcnNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdBdXRob3InLCBhcnJheSgkbmFtZSwgJHVybCwgJGVtYWlsKSk7CgkJCX0KCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExLCAnY3JlYXRvcicpIGFzICRhdXRob3IpCgkJewoJCQkkYXV0aG9yc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0F1dGhvcicsIGFycmF5KCR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAnY3JlYXRvcicpIGFzICRhdXRob3IpCgkJewoJCQkkYXV0aG9yc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0F1dGhvcicsIGFycmF5KCR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2F1dGhvcicpIGFzICRhdXRob3IpCgkJewoJCQkkYXV0aG9yc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0F1dGhvcicsIGFycmF5KCR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpKTsKCQl9CgoJCWlmICghZW1wdHkoJGF1dGhvcnMpKQoJCXsKCQkJcmV0dXJuIGFycmF5X3VuaXF1ZSgkYXV0aG9ycyk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCBhIGNvbnRyaWJ1dG9yIGZvciB0aGUgZmVlZAoJICoKCSAqIEBzaW5jZSAxLjEKCSAqIEBwYXJhbSBpbnQgJGtleSBUaGUgY29udHJidXRvciB0aGF0IHlvdSB3YW50IHRvIHJldHVybi4gIFJlbWVtYmVyIHRoYXQgYXJyYXlzIGJlZ2luIHdpdGggMCwgbm90IDEKCSAqIEByZXR1cm4gU2ltcGxlUGllX0F1dGhvcnxudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29udHJpYnV0b3IoJGtleSA9IDApCgl7CgkJJGNvbnRyaWJ1dG9ycyA9ICR0aGlzLT5nZXRfY29udHJpYnV0b3JzKCk7CgkJaWYgKGlzc2V0KCRjb250cmlidXRvcnNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRjb250cmlidXRvcnNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCBhbGwgY29udHJpYnV0b3JzIGZvciB0aGUgZmVlZAoJICoKCSAqIFVzZXMgYDxhdG9tOmNvbnRyaWJ1dG9yPmAKCSAqCgkgKiBAc2luY2UgMS4xCgkgKiBAcmV0dXJuIGFycmF5fG51bGwgTGlzdCBvZiB7QHNlZSBTaW1wbGVQaWVfQXV0aG9yfSBvYmplY3RzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29udHJpYnV0b3JzKCkKCXsKCQkkY29udHJpYnV0b3JzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2NvbnRyaWJ1dG9yJykgYXMgJGNvbnRyaWJ1dG9yKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJpID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJpID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXSkpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJpICE9PSBudWxsKQoJCQl7CgkJCQkkY29udHJpYnV0b3JzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQXV0aG9yJywgYXJyYXkoJG5hbWUsICR1cmksICRlbWFpbCkpOwoJCQl9CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnY29udHJpYnV0b3InKSBhcyAkY29udHJpYnV0b3IpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmwgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJG5hbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsndXJsJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdKSk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ2VtYWlsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoJG5hbWUgIT09IG51bGwgfHwgJGVtYWlsICE9PSBudWxsIHx8ICR1cmwgIT09IG51bGwpCgkJCXsKCQkJCSRjb250cmlidXRvcnNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdBdXRob3InLCBhcnJheSgkbmFtZSwgJHVybCwgJGVtYWlsKSk7CgkJCX0KCQl9CgoJCWlmICghZW1wdHkoJGNvbnRyaWJ1dG9ycykpCgkJewoJCQlyZXR1cm4gYXJyYXlfdW5pcXVlKCRjb250cmlidXRvcnMpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYSBzaW5nbGUgbGluayBmb3IgdGhlIGZlZWQKCSAqCgkgKiBAc2luY2UgMS4wIChwcmV2aW91c2x5IGNhbGxlZCBgZ2V0X2ZlZWRfbGlua2Agc2luY2UgUHJldmlldyBSZWxlYXNlLCBgZ2V0X2ZlZWRfcGVybWFsaW5rKClgIHNpbmNlIDAuOCkKCSAqIEBwYXJhbSBpbnQgJGtleSBUaGUgbGluayB0aGF0IHlvdSB3YW50IHRvIHJldHVybi4gIFJlbWVtYmVyIHRoYXQgYXJyYXlzIGJlZ2luIHdpdGggMCwgbm90IDEKCSAqIEBwYXJhbSBzdHJpbmcgJHJlbCBUaGUgcmVsYXRpb25zaGlwIG9mIHRoZSBsaW5rIHRvIHJldHVybgoJICogQHJldHVybiBzdHJpbmd8bnVsbCBMaW5rIFVSTAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2xpbmsoJGtleSA9IDAsICRyZWwgPSAnYWx0ZXJuYXRlJykKCXsKCQkkbGlua3MgPSAkdGhpcy0+Z2V0X2xpbmtzKCRyZWwpOwoJCWlmIChpc3NldCgkbGlua3NbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRsaW5rc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBwZXJtYWxpbmsgZm9yIHRoZSBpdGVtCgkgKgoJICogUmV0dXJucyB0aGUgZmlyc3QgbGluayBhdmFpbGFibGUgd2l0aCBhIHJlbGF0aW9uc2hpcCBvZiAiYWx0ZXJuYXRlIi4KCSAqIElkZW50aWNhbCB0byB7QHNlZSBnZXRfbGluaygpfSB3aXRoIGtleSAwCgkgKgoJICogQHNlZSBnZXRfbGluawoJICogQHNpbmNlIDEuMCAocHJldmlvdXNseSBjYWxsZWQgYGdldF9mZWVkX2xpbmtgIHNpbmNlIFByZXZpZXcgUmVsZWFzZSwgYGdldF9mZWVkX3Blcm1hbGluaygpYCBzaW5jZSAwLjgpCgkgKiBAaW50ZXJuYWwgQWRkZWQgZm9yIHBhcml0eSBiZXR3ZWVuIHRoZSBwYXJlbnQtbGV2ZWwgYW5kIHRoZSBpdGVtL2VudHJ5LWxldmVsLgoJICogQHJldHVybiBzdHJpbmd8bnVsbCBMaW5rIFVSTAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3Blcm1hbGluaygpCgl7CgkJcmV0dXJuICR0aGlzLT5nZXRfbGluaygwKTsKCX0KCgkvKioKCSAqIEdldCBhbGwgbGlua3MgZm9yIHRoZSBmZWVkCgkgKgoJICogVXNlcyBgPGF0b206bGluaz5gIG9yIGA8bGluaz5gCgkgKgoJICogQHNpbmNlIEJldGEgMgoJICogQHBhcmFtIHN0cmluZyAkcmVsIFRoZSByZWxhdGlvbnNoaXAgb2YgbGlua3MgdG8gcmV0dXJuCgkgKiBAcmV0dXJuIGFycmF5fG51bGwgTGlua3MgZm91bmQgZm9yIHRoZSBmZWVkIChzdHJpbmdzKQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2xpbmtzKCRyZWwgPSAnYWx0ZXJuYXRlJykKCXsKCQlpZiAoIWlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddKSkKCQl7CgkJCSR0aGlzLT5kYXRhWydsaW5rcyddID0gYXJyYXkoKTsKCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2xpbmsnKSkKCQkJewoJCQkJZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKQoJCQkJewoJCQkJCWlmIChpc3NldCgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddKSkKCQkJCQl7CgkJCQkJCSRsaW5rX3JlbCA9IChpc3NldCgkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10pKSA/ICRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSA6ICdhbHRlcm5hdGUnOwoJCQkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVskbGlua19yZWxdW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ2hyZWYnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGluaykpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnbGluaycpKQoJCQl7CgkJCQlmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10pKQoJCQkJCXsKCQkJCQkJJGxpbmtfcmVsID0gKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSkpID8gJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddIDogJ2FsdGVybmF0ZSc7CgkJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWyRsaW5rX3JlbF1bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICdsaW5rJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWydhbHRlcm5hdGUnXVtdID0gJHRoaXMtPnNhbml0aXplKCRsaW5rc1swXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rc1swXSkpOwoJCQl9CgkJCWlmICgkbGlua3MgPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAsICdsaW5rJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWydhbHRlcm5hdGUnXVtdID0gJHRoaXMtPnNhbml0aXplKCRsaW5rc1swXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rc1swXSkpOwoJCQl9CgkJCWlmICgkbGlua3MgPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMCwgJ2xpbmsnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJ2FsdGVybmF0ZSddW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmtzWzBdKSk7CgkJCX0KCgkJCSRrZXlzID0gYXJyYXlfa2V5cygkdGhpcy0+ZGF0YVsnbGlua3MnXSk7CgkJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpCgkJCXsKCQkJCWlmICgkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnaXNfaXNlZ21lbnRfbnpfbmMnLCBhcnJheSgka2V5KSkpCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddW1NJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZIC4gJGtleV0pKQoJCQkJCXsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSA9IGFycmF5X21lcmdlKCR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldLCAkdGhpcy0+ZGF0YVsnbGlua3MnXVtTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSAuICRrZXldKTsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV0gPSYgJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSA9JiAkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlaWYgKHN1YnN0cigka2V5LCAwLCA0MSkgPT09IFNJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZKQoJCQkJewoJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddW3N1YnN0cigka2V5LCA0MSldID0mICR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldOwoJCQkJfQoJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV0gPSBhcnJheV91bmlxdWUoJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV0pOwoJCQl9CgkJfQoKCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJHJlbF0pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5kYXRhWydsaW5rcyddWyRyZWxdOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF9hbGxfZGlzY292ZXJlZF9mZWVkcygpCgl7CgkJcmV0dXJuICR0aGlzLT5hbGxfZGlzY292ZXJlZF9mZWVkczsKCX0KCgkvKioKCSAqIEdldCB0aGUgY29udGVudCBmb3IgdGhlIGl0ZW0KCSAqCgkgKiBVc2VzIGA8YXRvbTpzdWJ0aXRsZT5gLCBgPGF0b206dGFnbGluZT5gLCBgPGRlc2NyaXB0aW9uPmAsCgkgKiBgPGRjOmRlc2NyaXB0aW9uPmAsIGA8aXR1bmVzOnN1bW1hcnk+YCBvciBgPGl0dW5lczpzdWJ0aXRsZT5gCgkgKgoJICogQHNpbmNlIDEuMCAocHJldmlvdXNseSBjYWxsZWQgYGdldF9mZWVkX2Rlc2NyaXB0aW9uKClgIHNpbmNlIDAuOCkKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9kZXNjcmlwdGlvbigpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdzdWJ0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnTWlzYycsICdhdG9tXzEwX2NvbnN0cnVjdF90eXBlJywgYXJyYXkoJHJldHVyblswXVsnYXR0cmlicyddKSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ3RhZ2xpbmUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnYXRvbV8wM19jb25zdHJ1Y3RfdHlwZScsIGFycmF5KCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSkpLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjAsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdzdW1tYXJ5JykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ3N1YnRpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGNvcHlyaWdodCBpbmZvIGZvciB0aGUgZmVlZAoJICoKCSAqIFVzZXMgYDxhdG9tOnJpZ2h0cz5gLCBgPGF0b206Y29weXJpZ2h0PmAgb3IgYDxkYzpyaWdodHM+YAoJICoKCSAqIEBzaW5jZSAxLjAgKHByZXZpb3VzbHkgY2FsbGVkIGBnZXRfZmVlZF9jb3B5cmlnaHQoKWAgc2luY2UgMC44KQoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvcHlyaWdodCgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnYXRvbV8xMF9jb25zdHJ1Y3RfdHlwZScsIGFycmF5KCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSkpLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdjb3B5cmlnaHQnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnYXRvbV8wM19jb25zdHJ1Y3RfdHlwZScsIGFycmF5KCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSkpLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMCwgJ2NvcHlyaWdodCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAncmlnaHRzJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBsYW5ndWFnZSBmb3IgdGhlIGZlZWQKCSAqCgkgKiBVc2VzIGA8bGFuZ3VhZ2U+YCwgYDxkYzpsYW5ndWFnZT5gLCBvciBAeG1sX2xhbmcKCSAqCgkgKiBAc2luY2UgMS4wIChwcmV2aW91c2x5IGNhbGxlZCBgZ2V0X2ZlZWRfbGFuZ3VhZ2UoKWAgc2luY2UgMC44KQoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2xhbmd1YWdlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwLCAnbGFuZ3VhZ2UnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExLCAnbGFuZ3VhZ2UnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAnbGFuZ3VhZ2UnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ2ZlZWQnXVswXVsneG1sX2xhbmcnXSkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ2ZlZWQnXVswXVsneG1sX2xhbmcnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydmZWVkJ11bMF1bJ3htbF9sYW5nJ10pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydmZWVkJ11bMF1bJ3htbF9sYW5nJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXVswXVsneG1sX2xhbmcnXSkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUkRGXVsnUkRGJ11bMF1bJ3htbF9sYW5nJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2hlYWRlcnMnXVsnY29udGVudC1sYW5ndWFnZSddKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHRoaXMtPmRhdGFbJ2hlYWRlcnMnXVsnY29udGVudC1sYW5ndWFnZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGxhdGl0dWRlIGNvb3JkaW5hdGVzIGZvciB0aGUgaXRlbQoJICoKCSAqIENvbXBhdGlibGUgd2l0aCB0aGUgVzNDIFdHUzg0IEJhc2ljIEdlbyBhbmQgR2VvUlNTIHNwZWNpZmljYXRpb25zCgkgKgoJICogVXNlcyBgPGdlbzpsYXQ+YCBvciBgPGdlb3Jzczpwb2ludD5gCgkgKgoJICogQHNpbmNlIDEuMAoJICogQGxpbmsgaHR0cDovL3d3dy53My5vcmcvMjAwMy8wMS9nZW8vIFczQyBXR1M4NCBCYXNpYyBHZW8KCSAqIEBsaW5rIGh0dHA6Ly93d3cuZ2VvcnNzLm9yZy8gR2VvUlNTCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbGF0aXR1ZGUoKQoJewoKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfVzNDX0JBU0lDX0dFTywgJ2xhdCcpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9HRU9SU1MsICdwb2ludCcpKSAmJiBwcmVnX21hdGNoKCcvXigoPzotKT9bMC05XSsoPzpcLlswLTldKykpICgoPzotKT9bMC05XSsoPzpcLlswLTldKykpJC8nLCB0cmltKCRyZXR1cm5bMF1bJ2RhdGEnXSksICRtYXRjaCkpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkbWF0Y2hbMV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCB0aGUgbG9uZ2l0dWRlIGNvb3JkaW5hdGVzIGZvciB0aGUgZmVlZAoJICoKCSAqIENvbXBhdGlibGUgd2l0aCB0aGUgVzNDIFdHUzg0IEJhc2ljIEdlbyBhbmQgR2VvUlNTIHNwZWNpZmljYXRpb25zCgkgKgoJICogVXNlcyBgPGdlbzpsb25nPmAsIGA8Z2VvOmxvbj5gIG9yIGA8Z2VvcnNzOnBvaW50PmAKCSAqCgkgKiBAc2luY2UgMS4wCgkgKiBAbGluayBodHRwOi8vd3d3LnczLm9yZy8yMDAzLzAxL2dlby8gVzNDIFdHUzg0IEJhc2ljIEdlbwoJICogQGxpbmsgaHR0cDovL3d3dy5nZW9yc3Mub3JnLyBHZW9SU1MKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9sb25naXR1ZGUoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9XM0NfQkFTSUNfR0VPLCAnbG9uZycpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1czQ19CQVNJQ19HRU8sICdsb24nKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRyZXR1cm5bMF1bJ2RhdGEnXTsKCQl9CgkJZWxzZWlmICgoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfR0VPUlNTLCAncG9pbnQnKSkgJiYgcHJlZ19tYXRjaCgnL14oKD86LSk/WzAtOV0rKD86XC5bMC05XSspKSAoKD86LSk/WzAtOV0rKD86XC5bMC05XSspKSQvJywgdHJpbSgkcmV0dXJuWzBdWydkYXRhJ10pLCAkbWF0Y2gpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJG1hdGNoWzJdOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGZlZWQgbG9nbydzIHRpdGxlCgkgKgoJICogUlNTIDAuOS4wLCAxLjAgYW5kIDIuMCBmZWVkcyBhcmUgYWxsb3dlZCB0byBoYXZlIGEgImZlZWQgbG9nbyIgdGl0bGUuCgkgKgoJICogVXNlcyBgPGltYWdlPjx0aXRsZT5gIG9yIGA8aW1hZ2U+PGRjOnRpdGxlPmAKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfaW1hZ2VfdGl0bGUoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pbWFnZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjAsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaW1hZ2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBmZWVkIGxvZ28ncyBVUkwKCSAqCgkgKiBSU1MgMC45LjAsIDIuMCwgQXRvbSAxLjAsIGFuZCBmZWVkcyB3aXRoIGlUdW5lcyBSU1MgdGFncyBhcmUgYWxsb3dlZCB0bwoJICogaGF2ZSBhICJmZWVkIGxvZ28iIFVSTC4gVGhpcyBwb2ludHMgZGlyZWN0bHkgdG8gdGhlIGltYWdlIGl0c2VsZi4KCSAqCgkgKiBVc2VzIGA8aXR1bmVzOmltYWdlPmAsIGA8YXRvbTpsb2dvPmAsIGA8YXRvbTppY29uPmAsCgkgKiBgPGltYWdlPjx0aXRsZT5gIG9yIGA8aW1hZ2U+PGRjOnRpdGxlPmAKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfaW1hZ2VfdXJsKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfSVRVTkVTLCAnaW1hZ2UnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2xvZ28nKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnaWNvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICd1cmwnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pbWFnZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MCwgJ3VybCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjAsICd1cmwnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBmZWVkIGxvZ28ncyBsaW5rCgkgKgoJICogUlNTIDAuOS4wLCAxLjAgYW5kIDIuMCBmZWVkcyBhcmUgYWxsb3dlZCB0byBoYXZlIGEgImZlZWQgbG9nbyIgbGluay4gVGhpcwoJICogcG9pbnRzIHRvIGEgaHVtYW4tcmVhZGFibGUgcGFnZSB0aGF0IHRoZSBpbWFnZSBzaG91bGQgbGluayB0by4KCSAqCgkgKiBVc2VzIGA8aXR1bmVzOmltYWdlPmAsIGA8YXRvbTpsb2dvPmAsIGA8YXRvbTppY29uPmAsCgkgKiBgPGltYWdlPjx0aXRsZT5gIG9yIGA8aW1hZ2U+PGRjOnRpdGxlPmAKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfaW1hZ2VfbGluaygpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICdsaW5rJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaW1hZ2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAsICdsaW5rJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaW1hZ2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMCwgJ2xpbmsnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBmZWVkIGxvZ28ncyBsaW5rCgkgKgoJICogUlNTIDIuMCBmZWVkcyBhcmUgYWxsb3dlZCB0byBoYXZlIGEgImZlZWQgbG9nbyIgd2lkdGguCgkgKgoJICogVXNlcyBgPGltYWdlPjx3aWR0aD5gIG9yIGRlZmF1bHRzIHRvIDg4LjAgaWYgbm8gd2lkdGggaXMgc3BlY2lmaWVkIGFuZAoJICogdGhlIGZlZWQgaXMgYW4gUlNTIDIuMCBmZWVkLgoJICoKCSAqIEByZXR1cm4gaW50fGZsb2F0fG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9pbWFnZV93aWR0aCgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjAsICd3aWR0aCcpKQoJCXsKCQkJcmV0dXJuIHJvdW5kKCRyZXR1cm5bMF1bJ2RhdGEnXSk7CgkJfQoJCWVsc2VpZiAoJHRoaXMtPmdldF90eXBlKCkgJiBTSU1QTEVQSUVfVFlQRV9SU1NfU1lORElDQVRJT04gJiYgJHRoaXMtPmdldF9pbWFnZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwLCAndXJsJykpCgkJewoJCQlyZXR1cm4gODguMDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBmZWVkIGxvZ28ncyBoZWlnaHQKCSAqCgkgKiBSU1MgMi4wIGZlZWRzIGFyZSBhbGxvd2VkIHRvIGhhdmUgYSAiZmVlZCBsb2dvIiBoZWlnaHQuCgkgKgoJICogVXNlcyBgPGltYWdlPjxoZWlnaHQ+YCBvciBkZWZhdWx0cyB0byAzMS4wIGlmIG5vIGhlaWdodCBpcyBzcGVjaWZpZWQgYW5kCgkgKiB0aGUgZmVlZCBpcyBhbiBSU1MgMi4wIGZlZWQuCgkgKgoJICogQHJldHVybiBpbnR8ZmxvYXR8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2ltYWdlX2hlaWdodCgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjAsICdoZWlnaHQnKSkKCQl7CgkJCXJldHVybiByb3VuZCgkcmV0dXJuWzBdWydkYXRhJ10pOwoJCX0KCQllbHNlaWYgKCR0aGlzLT5nZXRfdHlwZSgpICYgU0lNUExFUElFX1RZUEVfUlNTX1NZTkRJQ0FUSU9OICYmICR0aGlzLT5nZXRfaW1hZ2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMCwgJ3VybCcpKQoJCXsKCQkJcmV0dXJuIDMxLjA7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBmZWVkCgkgKgoJICogVGhpcyBpcyB3ZWxsLXN1aXRlZCBmb3Ige0BsaW5rIGh0dHA6Ly9waHAubmV0L2ZvciBmb3IoKX0gbG9vcHMgd2l0aAoJICoge0BzZWUgZ2V0X2l0ZW0oKX0KCSAqCgkgKiBAcGFyYW0gaW50ICRtYXggTWF4aW11bSB2YWx1ZSB0byByZXR1cm4uIDAgZm9yIG5vIGxpbWl0CgkgKiBAcmV0dXJuIGludCBOdW1iZXIgb2YgaXRlbXMgaW4gdGhlIGZlZWQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9pdGVtX3F1YW50aXR5KCRtYXggPSAwKQoJewoJCSRtYXggPSAoaW50KSAkbWF4OwoJCSRxdHkgPSBjb3VudCgkdGhpcy0+Z2V0X2l0ZW1zKCkpOwoJCWlmICgkbWF4ID09PSAwKQoJCXsKCQkJcmV0dXJuICRxdHk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAoJHF0eSA+ICRtYXgpID8gJG1heCA6ICRxdHk7CgkJfQoJfQoKCS8qKgoJICogR2V0IGEgc2luZ2xlIGl0ZW0gZnJvbSB0aGUgZmVlZAoJICoKCSAqIFRoaXMgaXMgYmV0dGVyIHN1aXRlZCBmb3Ige0BsaW5rIGh0dHA6Ly9waHAubmV0L2ZvciBmb3IoKX0gbG9vcHMsIHdoZXJlYXMKCSAqIHtAc2VlIGdldF9pdGVtcygpfSBpcyBiZXR0ZXIgc3VpdGVkIGZvcgoJICoge0BsaW5rIGh0dHA6Ly9waHAubmV0L2ZvcmVhY2ggZm9yZWFjaCgpfSBsb29wcy4KCSAqCgkgKiBAc2VlIGdldF9pdGVtX3F1YW50aXR5KCkKCSAqIEBzaW5jZSBCZXRhIDIKCSAqIEBwYXJhbSBpbnQgJGtleSBUaGUgaXRlbSB0aGF0IHlvdSB3YW50IHRvIHJldHVybi4gIFJlbWVtYmVyIHRoYXQgYXJyYXlzIGJlZ2luIHdpdGggMCwgbm90IDEKCSAqIEByZXR1cm4gU2ltcGxlUGllX0l0ZW18bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2l0ZW0oJGtleSA9IDApCgl7CgkJJGl0ZW1zID0gJHRoaXMtPmdldF9pdGVtcygpOwoJCWlmIChpc3NldCgkaXRlbXNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRpdGVtc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IGFsbCBpdGVtcyBmcm9tIHRoZSBmZWVkCgkgKgoJICogVGhpcyBpcyBiZXR0ZXIgc3VpdGVkIGZvciB7QGxpbmsgaHR0cDovL3BocC5uZXQvZm9yIGZvcigpfSBsb29wcywgd2hlcmVhcwoJICoge0BzZWUgZ2V0X2l0ZW1zKCl9IGlzIGJldHRlciBzdWl0ZWQgZm9yCgkgKiB7QGxpbmsgaHR0cDovL3BocC5uZXQvZm9yZWFjaCBmb3JlYWNoKCl9IGxvb3BzLgoJICoKCSAqIEBzZWUgZ2V0X2l0ZW1fcXVhbnRpdHkKCSAqIEBzaW5jZSBCZXRhIDIKCSAqIEBwYXJhbSBpbnQgJHN0YXJ0IEluZGV4IHRvIHN0YXJ0IGF0CgkgKiBAcGFyYW0gaW50ICRlbmQgTnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybi4gMCBmb3IgYWxsIGl0ZW1zIGFmdGVyIGAkc3RhcnRgCgkgKiBAcmV0dXJuIGFycmF5fG51bGwgTGlzdCBvZiB7QHNlZSBTaW1wbGVQaWVfSXRlbX0gb2JqZWN0cwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2l0ZW1zKCRzdGFydCA9IDAsICRlbmQgPSAwKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPmRhdGFbJ2l0ZW1zJ10pKQoJCXsKCQkJaWYgKCFlbXB0eSgkdGhpcy0+bXVsdGlmZWVkX29iamVjdHMpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnaXRlbXMnXSA9IFNpbXBsZVBpZTo6bWVyZ2VfaXRlbXMoJHRoaXMtPm11bHRpZmVlZF9vYmplY3RzLCAkc3RhcnQsICRlbmQsICR0aGlzLT5pdGVtX2xpbWl0KTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5kYXRhWydpdGVtcyddID0gYXJyYXkoKTsKCQkJCWlmICgkaXRlbXMgPSAkdGhpcy0+Z2V0X2ZlZWRfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdlbnRyeScpKQoJCQkJewoJCQkJCSRrZXlzID0gYXJyYXlfa2V5cygkaXRlbXMpOwoJCQkJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpCgkJCQkJewoJCQkJCQkkdGhpcy0+ZGF0YVsnaXRlbXMnXVtdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0l0ZW0nLCBhcnJheSgkdGhpcywgJGl0ZW1zWyRrZXldKSk7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKCRpdGVtcyA9ICR0aGlzLT5nZXRfZmVlZF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2VudHJ5JykpCgkJCQl7CgkJCQkJJGtleXMgPSBhcnJheV9rZXlzKCRpdGVtcyk7CgkJCQkJZm9yZWFjaCAoJGtleXMgYXMgJGtleSkKCQkJCQl7CgkJCQkJCSR0aGlzLT5kYXRhWydpdGVtcyddW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnSXRlbScsIGFycmF5KCR0aGlzLCAkaXRlbXNbJGtleV0pKTsKCQkJCQl9CgkJCQl9CgkJCQlpZiAoJGl0ZW1zID0gJHRoaXMtPmdldF9mZWVkX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICdpdGVtJykpCgkJCQl7CgkJCQkJJGtleXMgPSBhcnJheV9rZXlzKCRpdGVtcyk7CgkJCQkJZm9yZWFjaCAoJGtleXMgYXMgJGtleSkKCQkJCQl7CgkJCQkJCSR0aGlzLT5kYXRhWydpdGVtcyddW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnSXRlbScsIGFycmF5KCR0aGlzLCAkaXRlbXNbJGtleV0pKTsKCQkJCQl9CgkJCQl9CgkJCQlpZiAoJGl0ZW1zID0gJHRoaXMtPmdldF9mZWVkX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAnaXRlbScpKQoJCQkJewoJCQkJCSRrZXlzID0gYXJyYXlfa2V5cygkaXRlbXMpOwoJCQkJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpCgkJCQkJewoJCQkJCQkkdGhpcy0+ZGF0YVsnaXRlbXMnXVtdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0l0ZW0nLCBhcnJheSgkdGhpcywgJGl0ZW1zWyRrZXldKSk7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKCRpdGVtcyA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwLCAnaXRlbScpKQoJCQkJewoJCQkJCSRrZXlzID0gYXJyYXlfa2V5cygkaXRlbXMpOwoJCQkJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpCgkJCQkJewoJCQkJCQkkdGhpcy0+ZGF0YVsnaXRlbXMnXVtdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0l0ZW0nLCBhcnJheSgkdGhpcywgJGl0ZW1zWyRrZXldKSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlpZiAoIWVtcHR5KCR0aGlzLT5kYXRhWydpdGVtcyddKSkKCQl7CgkJCS8vIElmIHdlIHdhbnQgdG8gb3JkZXIgaXQgYnkgZGF0ZSwgY2hlY2sgaWYgYWxsIGl0ZW1zIGhhdmUgYSBkYXRlLCBhbmQgdGhlbiBzb3J0IGl0CgkJCWlmICgkdGhpcy0+b3JkZXJfYnlfZGF0ZSAmJiBlbXB0eSgkdGhpcy0+bXVsdGlmZWVkX29iamVjdHMpKQoJCQl7CgkJCQlpZiAoIWlzc2V0KCR0aGlzLT5kYXRhWydvcmRlcmVkX2l0ZW1zJ10pKQoJCQkJewoJCQkJCSRkb19zb3J0ID0gdHJ1ZTsKCQkJCQlmb3JlYWNoICgkdGhpcy0+ZGF0YVsnaXRlbXMnXSBhcyAkaXRlbSkKCQkJCQl7CgkJCQkJCWlmICghJGl0ZW0tPmdldF9kYXRlKCdVJykpCgkJCQkJCXsKCQkJCQkJCSRkb19zb3J0ID0gZmFsc2U7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQkkaXRlbSA9IG51bGw7CgkJCQkJJHRoaXMtPmRhdGFbJ29yZGVyZWRfaXRlbXMnXSA9ICR0aGlzLT5kYXRhWydpdGVtcyddOwoJCQkJCWlmICgkZG9fc29ydCkKCQkJCQl7CgkJCQkJCXVzb3J0KCR0aGlzLT5kYXRhWydvcmRlcmVkX2l0ZW1zJ10sIGFycmF5KGdldF9jbGFzcygkdGhpcyksICdzb3J0X2l0ZW1zJykpOwoJCQkJCX0KCQkJCX0KCQkJCSRpdGVtcyA9ICR0aGlzLT5kYXRhWydvcmRlcmVkX2l0ZW1zJ107CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkaXRlbXMgPSAkdGhpcy0+ZGF0YVsnaXRlbXMnXTsKCQkJfQoKCQkJLy8gU2xpY2UgdGhlIGRhdGEgYXMgZGVzaXJlZAoJCQlpZiAoJGVuZCA9PT0gMCkKCQkJewoJCQkJcmV0dXJuIGFycmF5X3NsaWNlKCRpdGVtcywgJHN0YXJ0KTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBhcnJheV9zbGljZSgkaXRlbXMsICRzdGFydCwgJGVuZCk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGFycmF5KCk7CgkJfQoJfQoKCS8qKgoJICogU29ydGluZyBjYWxsYmFjayBmb3IgaXRlbXMKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBwYXJhbSBTaW1wbGVQaWUgJGEKCSAqIEBwYXJhbSBTaW1wbGVQaWUgJGIKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNvcnRfaXRlbXMoJGEsICRiKQoJewoJCXJldHVybiAkYS0+Z2V0X2RhdGUoJ1UnKSA8PSAkYi0+Z2V0X2RhdGUoJ1UnKTsKCX0KCgkvKioKCSAqIE1lcmdlIGl0ZW1zIGZyb20gc2V2ZXJhbCBmZWVkcyBpbnRvIG9uZQoJICoKCSAqIElmIHlvdSdyZSBtZXJnaW5nIG11bHRpcGxlIGZlZWRzIHRvZ2V0aGVyLCB0aGV5IG5lZWQgdG8gYWxsIGhhdmUgZGF0ZXMKCSAqIGZvciB0aGUgaXRlbXMgb3IgZWxzZSBTaW1wbGVQaWUgd2lsbCByZWZ1c2UgdG8gc29ydCB0aGVtLgoJICoKCSAqIEBsaW5rIGh0dHA6Ly9zaW1wbGVwaWUub3JnL3dpa2kvdHV0b3JpYWwvc29ydF9tdWx0aXBsZV9mZWVkc19ieV90aW1lX2FuZF9kYXRlI2lmX2ZlZWRzX3JlcXVpcmVfc2VwYXJhdGVfcGVyLWZlZWRfc2V0dGluZ3MKCSAqIEBwYXJhbSBhcnJheSAkdXJscyBMaXN0IG9mIFNpbXBsZVBpZSBmZWVkIG9iamVjdHMgdG8gbWVyZ2UKCSAqIEBwYXJhbSBpbnQgJHN0YXJ0IFN0YXJ0aW5nIGl0ZW0KCSAqIEBwYXJhbSBpbnQgJGVuZCBOdW1iZXIgb2YgaXRlbXMgdG8gcmV0dXJuCgkgKiBAcGFyYW0gaW50ICRsaW1pdCBNYXhpbXVtIG51bWJlciBvZiBpdGVtcyBwZXIgZmVlZAoJICogQHJldHVybiBhcnJheQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1lcmdlX2l0ZW1zKCR1cmxzLCAkc3RhcnQgPSAwLCAkZW5kID0gMCwgJGxpbWl0ID0gMCkKCXsKCQlpZiAoaXNfYXJyYXkoJHVybHMpICYmIHNpemVvZigkdXJscykgPiAwKQoJCXsKCQkJJGl0ZW1zID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoJHVybHMgYXMgJGFyZykKCQkJewoJCQkJaWYgKCRhcmcgaW5zdGFuY2VvZiBTaW1wbGVQaWUpCgkJCQl7CgkJCQkJJGl0ZW1zID0gYXJyYXlfbWVyZ2UoJGl0ZW1zLCAkYXJnLT5nZXRfaXRlbXMoMCwgJGxpbWl0KSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJdHJpZ2dlcl9lcnJvcignQXJndW1lbnRzIG11c3QgYmUgU2ltcGxlUGllIG9iamVjdHMnLCBFX1VTRVJfV0FSTklORyk7CgkJCQl9CgkJCX0KCgkJCSRkb19zb3J0ID0gdHJ1ZTsKCQkJZm9yZWFjaCAoJGl0ZW1zIGFzICRpdGVtKQoJCQl7CgkJCQlpZiAoISRpdGVtLT5nZXRfZGF0ZSgnVScpKQoJCQkJewoJCQkJCSRkb19zb3J0ID0gZmFsc2U7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJJGl0ZW0gPSBudWxsOwoJCQlpZiAoJGRvX3NvcnQpCgkJCXsKCQkJCXVzb3J0KCRpdGVtcywgYXJyYXkoZ2V0X2NsYXNzKCR1cmxzWzBdKSwgJ3NvcnRfaXRlbXMnKSk7CgkJCX0KCgkJCWlmICgkZW5kID09PSAwKQoJCQl7CgkJCQlyZXR1cm4gYXJyYXlfc2xpY2UoJGl0ZW1zLCAkc3RhcnQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIGFycmF5X3NsaWNlKCRpdGVtcywgJHN0YXJ0LCAkZW5kKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQl0cmlnZ2VyX2Vycm9yKCdDYW5ub3QgbWVyZ2UgemVybyBTaW1wbGVQaWUgb2JqZWN0cycsIEVfVVNFUl9XQVJOSU5HKTsKCQkJcmV0dXJuIGFycmF5KCk7CgkJfQoJfQp9CgovKioKICogTWFuYWdlcyBhbGwgYXV0aG9yLXJlbGF0ZWQgZGF0YQogKgogKiBVc2VkIGJ5IHtAc2VlIFNpbXBsZVBpZV9JdGVtOjpnZXRfYXV0aG9yKCl9IGFuZCB7QHNlZSBTaW1wbGVQaWU6OmdldF9hdXRob3JzKCl9CiAqCiAqIFRoaXMgY2xhc3MgY2FuIGJlIG92ZXJsb2FkZWQgd2l0aCB7QHNlZSBTaW1wbGVQaWU6OnNldF9hdXRob3JfY2xhc3MoKX0KICoKICogQHBhY2thZ2UgU2ltcGxlUGllCiAqIEBzdWJwYWNrYWdlIEFQSQogKi8KY2xhc3MgU2ltcGxlUGllX0F1dGhvcgp7CgkvKioKCSAqIEF1dGhvcidzIG5hbWUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfbmFtZSgpCgkgKi8KCXZhciAkbmFtZTsKCgkvKioKCSAqIEF1dGhvcidzIGxpbmsKCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfbGluaygpCgkgKi8KCXZhciAkbGluazsKCgkvKioKCSAqIEF1dGhvcidzIGVtYWlsIGFkZHJlc3MKCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfZW1haWwoKQoJICovCgl2YXIgJGVtYWlsOwoKCS8qKgoJICogQ29uc3RydWN0b3IsIHVzZWQgdG8gaW5wdXQgdGhlIGRhdGEKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lCgkgKiBAcGFyYW0gc3RyaW5nICRsaW5rCgkgKiBAcGFyYW0gc3RyaW5nICRlbWFpbAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG5hbWUgPSBudWxsLCAkbGluayA9IG51bGwsICRlbWFpbCA9IG51bGwpCgl7CgkJJHRoaXMtPm5hbWUgPSAkbmFtZTsKCQkkdGhpcy0+bGluayA9ICRsaW5rOwoJCSR0aGlzLT5lbWFpbCA9ICRlbWFpbDsKCX0KCgkvKioKCSAqIFN0cmluZy1pZmllZCB2ZXJzaW9uCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRoZXJlIGlzIG5vICR0aGlzLT5kYXRhIGhlcmUKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcykpOwoJfQoKCS8qKgoJICogQXV0aG9yJ3MgbmFtZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9uYW1lKCkKCXsKCQlpZiAoJHRoaXMtPm5hbWUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPm5hbWU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEF1dGhvcidzIGxpbmsKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbGluaygpCgl7CgkJaWYgKCR0aGlzLT5saW5rICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5saW5rOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBBdXRob3IncyBlbWFpbCBhZGRyZXNzCgkgKgoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2VtYWlsKCkKCXsKCQlpZiAoJHRoaXMtPmVtYWlsICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5lbWFpbDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQp9CgovKioKICogQmFzZSBmb3IgY2FjaGUgb2JqZWN0cwogKgogKiBDbGFzc2VzIHRvIGJlIHVzZWQgd2l0aCB7QHNlZSBTaW1wbGVQaWVfQ2FjaGU6OnJlZ2lzdGVyKCl9IGFyZSBleHBlY3RlZAogKiB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAc3VicGFja2FnZSBDYWNoaW5nCiAqLwppbnRlcmZhY2UgU2ltcGxlUGllX0NhY2hlX0Jhc2UKewoJLyoqCgkgKiBGZWVkIGNhY2hlIHR5cGUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCgljb25zdCBUWVBFX0ZFRUQgPSAnc3BjJzsKCgkvKioKCSAqIEltYWdlIGNhY2hlIHR5cGUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCgljb25zdCBUWVBFX0lNQUdFID0gJ3NwaSc7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgY2FjaGUgb2JqZWN0CgkgKgoJICogQHBhcmFtIHN0cmluZyAkbG9jYXRpb24gTG9jYXRpb24gc3RyaW5nIChmcm9tIFNpbXBsZVBpZTo6JGNhY2hlX2xvY2F0aW9uKQoJICogQHBhcmFtIHN0cmluZyAkbmFtZSBVbmlxdWUgSUQgZm9yIHRoZSBjYWNoZQoJICogQHBhcmFtIHN0cmluZyAkdHlwZSBFaXRoZXIgVFlQRV9GRUVEIGZvciBTaW1wbGVQaWUgZGF0YSwgb3IgVFlQRV9JTUFHRSBmb3IgaW1hZ2UgZGF0YQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGxvY2F0aW9uLCAkbmFtZSwgJHR5cGUpOwoKCS8qKgoJICogU2F2ZSBkYXRhIHRvIHRoZSBjYWNoZQoJICoKCSAqIEBwYXJhbSBhcnJheXxTaW1wbGVQaWUgJGRhdGEgRGF0YSB0byBzdG9yZSBpbiB0aGUgY2FjaGUuIElmIHBhc3NlZCBhIFNpbXBsZVBpZSBvYmplY3QsIG9ubHkgY2FjaGUgdGhlICRkYXRhIHByb3BlcnR5CgkgKiBAcmV0dXJuIGJvb2wgU3VjY2Vzc2Z1bG5lc3MKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNhdmUoJGRhdGEpOwoKCS8qKgoJICogUmV0cmlldmUgdGhlIGRhdGEgc2F2ZWQgdG8gdGhlIGNhY2hlCgkgKgoJICogQHJldHVybiBhcnJheSBEYXRhIGZvciBTaW1wbGVQaWU6OiRkYXRhCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBsb2FkKCk7CgoJLyoqCgkgKiBSZXRyaWV2ZSB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIGZvciB0aGUgY2FjaGUKCSAqCgkgKiBAcmV0dXJuIGludCBUaW1lc3RhbXAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIG10aW1lKCk7CgoJLyoqCgkgKiBTZXQgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSB0byB0aGUgY3VycmVudCB0aW1lCgkgKgoJICogQHJldHVybiBib29sIFN1Y2Nlc3Mgc3RhdHVzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB0b3VjaCgpOwoKCS8qKgoJICogUmVtb3ZlIHRoZSBjYWNoZQoJICoKCSAqIEByZXR1cm4gYm9vbCBTdWNjZXNzIHN0YXR1cwoJICovCglwdWJsaWMgZnVuY3Rpb24gdW5saW5rKCk7Cn0KCi8qKgogKiBCYXNlIGNsYXNzIGZvciBkYXRhYmFzZS1iYXNlZCBjYWNoZXMKICoKICogQHBhY2thZ2UgU2ltcGxlUGllCiAqIEBzdWJwYWNrYWdlIENhY2hpbmcKICovCmFic3RyYWN0IGNsYXNzIFNpbXBsZVBpZV9DYWNoZV9EQiBpbXBsZW1lbnRzIFNpbXBsZVBpZV9DYWNoZV9CYXNlCnsKCS8qKgoJICogSGVscGVyIGZvciBkYXRhYmFzZSBjb252ZXJzaW9uCgkgKgoJICogQ29udmVydHMgYSBnaXZlbiB7QHNlZSBTaW1wbGVQaWV9IG9iamVjdCBpbnRvIGRhdGEgdG8gYmUgc3RvcmVkCgkgKgoJICogQHBhcmFtIFNpbXBsZVBpZSAkZGF0YQoJICogQHJldHVybiBhcnJheSBGaXJzdCBpdGVtIGlzIHRoZSBzZXJpYWxpemVkIGRhdGEgZm9yIHN0b3JhZ2UsIHNlY29uZCBpdGVtIGlzIHRoZSB1bmlxdWUgSUQgZm9yIHRoaXMgaXRlbQoJICovCglwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIHByZXBhcmVfc2ltcGxlcGllX29iamVjdF9mb3JfY2FjaGUoJGRhdGEpCgl7CgkJJGl0ZW1zID0gJGRhdGEtPmdldF9pdGVtcygpOwoJCSRpdGVtc19ieV9pZCA9IGFycmF5KCk7CgoJCWlmICghZW1wdHkoJGl0ZW1zKSkKCQl7CgkJCWZvcmVhY2ggKCRpdGVtcyBhcyAkaXRlbSkKCQkJewoJCQkJJGl0ZW1zX2J5X2lkWyRpdGVtLT5nZXRfaWQoKV0gPSAkaXRlbTsKCQkJfQoKCQkJaWYgKGNvdW50KCRpdGVtc19ieV9pZCkgIT09IGNvdW50KCRpdGVtcykpCgkJCXsKCQkJCSRpdGVtc19ieV9pZCA9IGFycmF5KCk7CgkJCQlmb3JlYWNoICgkaXRlbXMgYXMgJGl0ZW0pCgkJCQl7CgkJCQkJJGl0ZW1zX2J5X2lkWyRpdGVtLT5nZXRfaWQodHJ1ZSldID0gJGl0ZW07CgkJCQl9CgkJCX0KCgkJCWlmIChpc3NldCgkZGF0YS0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydmZWVkJ11bMF0pKQoJCQl7CgkJCQkkY2hhbm5lbCA9JiAkZGF0YS0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydmZWVkJ11bMF07CgkJCX0KCQkJZWxzZWlmIChpc3NldCgkZGF0YS0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydmZWVkJ11bMF0pKQoJCQl7CgkJCQkkY2hhbm5lbCA9JiAkZGF0YS0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydmZWVkJ11bMF07CgkJCX0KCQkJZWxzZWlmIChpc3NldCgkZGF0YS0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdKSkKCQkJewoJCQkJJGNoYW5uZWwgPSYgJGRhdGEtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXVswXTsKCQkJfQoJCQllbHNlaWYgKGlzc2V0KCRkYXRhLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwXVsncnNzJ11bMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjBdWydjaGFubmVsJ11bMF0pKQoJCQl7CgkJCQkkY2hhbm5lbCA9JiAkZGF0YS0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMF1bJ3JzcyddWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwXVsnY2hhbm5lbCddWzBdOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJGNoYW5uZWwgPSBudWxsOwoJCQl9CgoJCQlpZiAoJGNoYW5uZWwgIT09IG51bGwpCgkJCXsKCQkJCWlmIChpc3NldCgkY2hhbm5lbFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbnRyeSddKSkKCQkJCXsKCQkJCQl1bnNldCgkY2hhbm5lbFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbnRyeSddKTsKCQkJCX0KCQkJCWlmIChpc3NldCgkY2hhbm5lbFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbnRyeSddKSkKCQkJCXsKCQkJCQl1bnNldCgkY2hhbm5lbFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbnRyeSddKTsKCQkJCX0KCQkJCWlmIChpc3NldCgkY2hhbm5lbFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMF1bJ2l0ZW0nXSkpCgkJCQl7CgkJCQkJdW5zZXQoJGNoYW5uZWxbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTBdWydpdGVtJ10pOwoJCQkJfQoJCQkJaWYgKGlzc2V0KCRjaGFubmVsWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MF1bJ2l0ZW0nXSkpCgkJCQl7CgkJCQkJdW5zZXQoJGNoYW5uZWxbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwXVsnaXRlbSddKTsKCQkJCX0KCQkJCWlmIChpc3NldCgkY2hhbm5lbFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMF1bJ2l0ZW0nXSkpCgkJCQl7CgkJCQkJdW5zZXQoJGNoYW5uZWxbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjBdWydpdGVtJ10pOwoJCQkJfQoJCQl9CgkJCWlmIChpc3NldCgkZGF0YS0+ZGF0YVsnaXRlbXMnXSkpCgkJCXsKCQkJCXVuc2V0KCRkYXRhLT5kYXRhWydpdGVtcyddKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGRhdGEtPmRhdGFbJ29yZGVyZWRfaXRlbXMnXSkpCgkJCXsKCQkJCXVuc2V0KCRkYXRhLT5kYXRhWydvcmRlcmVkX2l0ZW1zJ10pOwoJCQl9CgkJfQoJCXJldHVybiBhcnJheShzZXJpYWxpemUoJGRhdGEtPmRhdGEpLCAkaXRlbXNfYnlfaWQpOwoJfQp9CgovKioKICogQ2FjaGVzIGRhdGEgdG8gdGhlIGZpbGVzeXN0ZW0KICoKICogQHBhY2thZ2UgU2ltcGxlUGllCiAqIEBzdWJwYWNrYWdlIENhY2hpbmcKICovCmNsYXNzIFNpbXBsZVBpZV9DYWNoZV9GaWxlIGltcGxlbWVudHMgU2ltcGxlUGllX0NhY2hlX0Jhc2UKewoJLyoqCgkgKiBMb2NhdGlvbiBzdHJpbmcKCSAqCgkgKiBAc2VlIFNpbXBsZVBpZTo6JGNhY2hlX2xvY2F0aW9uCgkgKiBAdmFyIHN0cmluZwoJICovCglwcm90ZWN0ZWQgJGxvY2F0aW9uOwoKCS8qKgoJICogRmlsZW5hbWUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcm90ZWN0ZWQgJGZpbGVuYW1lOwoKCS8qKgoJICogRmlsZSBleHRlbnNpb24KCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcm90ZWN0ZWQgJGV4dGVuc2lvbjsKCgkvKioKCSAqIEZpbGUgcGF0aAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByb3RlY3RlZCAkbmFtZTsKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBjYWNoZSBvYmplY3QKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRsb2NhdGlvbiBMb2NhdGlvbiBzdHJpbmcgKGZyb20gU2ltcGxlUGllOjokY2FjaGVfbG9jYXRpb24pCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFVuaXF1ZSBJRCBmb3IgdGhlIGNhY2hlCgkgKiBAcGFyYW0gc3RyaW5nICR0eXBlIEVpdGhlciBUWVBFX0ZFRUQgZm9yIFNpbXBsZVBpZSBkYXRhLCBvciBUWVBFX0lNQUdFIGZvciBpbWFnZSBkYXRhCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbG9jYXRpb24sICRuYW1lLCAkdHlwZSkKCXsKCQkkdGhpcy0+bG9jYXRpb24gPSAkbG9jYXRpb247CgkJJHRoaXMtPmZpbGVuYW1lID0gJG5hbWU7CgkJJHRoaXMtPmV4dGVuc2lvbiA9ICR0eXBlOwoJCSR0aGlzLT5uYW1lID0gIiR0aGlzLT5sb2NhdGlvbi8kdGhpcy0+ZmlsZW5hbWUuJHRoaXMtPmV4dGVuc2lvbiI7Cgl9CgoJLyoqCgkgKiBTYXZlIGRhdGEgdG8gdGhlIGNhY2hlCgkgKgoJICogQHBhcmFtIGFycmF5fFNpbXBsZVBpZSAkZGF0YSBEYXRhIHRvIHN0b3JlIGluIHRoZSBjYWNoZS4gSWYgcGFzc2VkIGEgU2ltcGxlUGllIG9iamVjdCwgb25seSBjYWNoZSB0aGUgJGRhdGEgcHJvcGVydHkKCSAqIEByZXR1cm4gYm9vbCBTdWNjZXNzZnVsbmVzcwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2F2ZSgkZGF0YSkKCXsKCQlpZiAoZmlsZV9leGlzdHMoJHRoaXMtPm5hbWUpICYmIGlzX3dyaXRlYWJsZSgkdGhpcy0+bmFtZSkgfHwgZmlsZV9leGlzdHMoJHRoaXMtPmxvY2F0aW9uKSAmJiBpc193cml0ZWFibGUoJHRoaXMtPmxvY2F0aW9uKSkKCQl7CgkJCWlmICgkZGF0YSBpbnN0YW5jZW9mIFNpbXBsZVBpZSkKCQkJewoJCQkJJGRhdGEgPSAkZGF0YS0+ZGF0YTsKCQkJfQoKCQkJJGRhdGEgPSBzZXJpYWxpemUoJGRhdGEpOwoJCQlyZXR1cm4gKGJvb2wpIGZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5uYW1lLCAkZGF0YSk7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJldHJpZXZlIHRoZSBkYXRhIHNhdmVkIHRvIHRoZSBjYWNoZQoJICoKCSAqIEByZXR1cm4gYXJyYXkgRGF0YSBmb3IgU2ltcGxlUGllOjokZGF0YQoJICovCglwdWJsaWMgZnVuY3Rpb24gbG9hZCgpCgl7CgkJaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5uYW1lKSAmJiBpc19yZWFkYWJsZSgkdGhpcy0+bmFtZSkpCgkJewoJCQlyZXR1cm4gdW5zZXJpYWxpemUoZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPm5hbWUpKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogUmV0cmlldmUgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBmb3IgdGhlIGNhY2hlCgkgKgoJICogQHJldHVybiBpbnQgVGltZXN0YW1wCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBtdGltZSgpCgl7CgkJaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5uYW1lKSkKCQl7CgkJCXJldHVybiBmaWxlbXRpbWUoJHRoaXMtPm5hbWUpOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSB0byB0aGUgY3VycmVudCB0aW1lCgkgKgoJICogQHJldHVybiBib29sIFN1Y2Nlc3Mgc3RhdHVzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB0b3VjaCgpCgl7CgkJaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5uYW1lKSkKCQl7CgkJCXJldHVybiB0b3VjaCgkdGhpcy0+bmFtZSk7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJlbW92ZSB0aGUgY2FjaGUKCSAqCgkgKiBAcmV0dXJuIGJvb2wgU3VjY2VzcyBzdGF0dXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVubGluaygpCgl7CgkJaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5uYW1lKSkKCQl7CgkJCXJldHVybiB1bmxpbmsoJHRoaXMtPm5hbWUpOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9Cn0KCi8qKgogKiBDYWNoZXMgZGF0YSB0byBtZW1jYWNoZQogKgogKiBSZWdpc3RlcmVkIGZvciBVUkxzIHdpdGggdGhlICJtZW1jYWNoZSIgcHJvdG9jb2wKICoKICogRm9yIGV4YW1wbGUsIGBtZW1jYWNoZTovL2xvY2FsaG9zdDoxMTIxMS8/dGltZW91dD0zNjAwJnByZWZpeD1zcF9gIHdpbGwKICogY29ubmVjdCB0byBtZW1jYWNoZSBvbiBgbG9jYWxob3N0YCBvbiBwb3J0IDExMjExLiBBbGwgdGFibGVzIHdpbGwgYmUKICogcHJlZml4ZWQgd2l0aCBgc3BfYCBhbmQgZGF0YSB3aWxsIGV4cGlyZSBhZnRlciAzNjAwIHNlY29uZHMKICoKICogQHBhY2thZ2UgU2ltcGxlUGllCiAqIEBzdWJwYWNrYWdlIENhY2hpbmcKICogQHVzZXMgTWVtY2FjaGUKICovCmNsYXNzIFNpbXBsZVBpZV9DYWNoZV9NZW1jYWNoZSBpbXBsZW1lbnRzIFNpbXBsZVBpZV9DYWNoZV9CYXNlCnsKCS8qKgoJICogTWVtY2FjaGUgaW5zdGFuY2UKCSAqCgkgKiBAdmFyIE1lbWNhY2hlCgkgKi8KCXByb3RlY3RlZCAkY2FjaGU7CgoJLyoqCgkgKiBPcHRpb25zCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcm90ZWN0ZWQgJG9wdGlvbnM7CgoJLyoqCgkgKiBDYWNoZSBuYW1lCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRuYW1lOwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IGNhY2hlIG9iamVjdAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGxvY2F0aW9uIExvY2F0aW9uIHN0cmluZyAoZnJvbSBTaW1wbGVQaWU6OiRjYWNoZV9sb2NhdGlvbikKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgVW5pcXVlIElEIGZvciB0aGUgY2FjaGUKCSAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRWl0aGVyIFRZUEVfRkVFRCBmb3IgU2ltcGxlUGllIGRhdGEsIG9yIFRZUEVfSU1BR0UgZm9yIGltYWdlIGRhdGEKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRsb2NhdGlvbiwgJG5hbWUsICR0eXBlKQoJewoJCSR0aGlzLT5vcHRpb25zID0gYXJyYXkoCgkJCSdob3N0JyA9PiAnMTI3LjAuMC4xJywKCQkJJ3BvcnQnID0+IDExMjExLAoJCQknZXh0cmFzJyA9PiBhcnJheSgKCQkJCSd0aW1lb3V0JyA9PiAzNjAwLCAvLyBvbmUgaG91cgoJCQkJJ3ByZWZpeCcgPT4gJ3NpbXBsZXBpZV8nLAoJCQkpLAoJCSk7CgkJJHBhcnNlZCA9IFNpbXBsZVBpZV9DYWNoZTo6cGFyc2VfVVJMKCRsb2NhdGlvbik7CgkJJHRoaXMtPm9wdGlvbnNbJ2hvc3QnXSA9IGVtcHR5KCRwYXJzZWRbJ2hvc3QnXSkgPyAkdGhpcy0+b3B0aW9uc1snaG9zdCddIDogJHBhcnNlZFsnaG9zdCddOwoJCSR0aGlzLT5vcHRpb25zWydwb3J0J10gPSBlbXB0eSgkcGFyc2VkWydwb3J0J10pID8gJHRoaXMtPm9wdGlvbnNbJ3BvcnQnXSA6ICRwYXJzZWRbJ3BvcnQnXTsKCQkkdGhpcy0+b3B0aW9uc1snZXh0cmFzJ10gPSBhcnJheV9tZXJnZSgkdGhpcy0+b3B0aW9uc1snZXh0cmFzJ10sICRwYXJzZWRbJ2V4dHJhcyddKTsKCQkkdGhpcy0+bmFtZSA9ICR0aGlzLT5vcHRpb25zWydleHRyYXMnXVsncHJlZml4J10gLiBtZDUoIiRuYW1lOiR0eXBlIik7CgoJCSR0aGlzLT5jYWNoZSA9IG5ldyBNZW1jYWNoZSgpOwoJCSR0aGlzLT5jYWNoZS0+YWRkU2VydmVyKCR0aGlzLT5vcHRpb25zWydob3N0J10sIChpbnQpICR0aGlzLT5vcHRpb25zWydwb3J0J10pOwoJfQoKCS8qKgoJICogU2F2ZSBkYXRhIHRvIHRoZSBjYWNoZQoJICoKCSAqIEBwYXJhbSBhcnJheXxTaW1wbGVQaWUgJGRhdGEgRGF0YSB0byBzdG9yZSBpbiB0aGUgY2FjaGUuIElmIHBhc3NlZCBhIFNpbXBsZVBpZSBvYmplY3QsIG9ubHkgY2FjaGUgdGhlICRkYXRhIHByb3BlcnR5CgkgKiBAcmV0dXJuIGJvb2wgU3VjY2Vzc2Z1bG5lc3MKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNhdmUoJGRhdGEpCgl7CgkJaWYgKCRkYXRhIGluc3RhbmNlb2YgU2ltcGxlUGllKQoJCXsKCQkJJGRhdGEgPSAkZGF0YS0+ZGF0YTsKCQl9CgkJcmV0dXJuICR0aGlzLT5jYWNoZS0+c2V0KCR0aGlzLT5uYW1lLCBzZXJpYWxpemUoJGRhdGEpLCBNRU1DQUNIRV9DT01QUkVTU0VELCAoaW50KSAkdGhpcy0+b3B0aW9uc1snZXh0cmFzJ11bJ3RpbWVvdXQnXSk7Cgl9CgoJLyoqCgkgKiBSZXRyaWV2ZSB0aGUgZGF0YSBzYXZlZCB0byB0aGUgY2FjaGUKCSAqCgkgKiBAcmV0dXJuIGFycmF5IERhdGEgZm9yIFNpbXBsZVBpZTo6JGRhdGEKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGxvYWQoKQoJewoJCSRkYXRhID0gJHRoaXMtPmNhY2hlLT5nZXQoJHRoaXMtPm5hbWUpOwoKCQlpZiAoJGRhdGEgIT09IGZhbHNlKQoJCXsKCQkJcmV0dXJuIHVuc2VyaWFsaXplKCRkYXRhKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogUmV0cmlldmUgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBmb3IgdGhlIGNhY2hlCgkgKgoJICogQHJldHVybiBpbnQgVGltZXN0YW1wCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBtdGltZSgpCgl7CgkJJGRhdGEgPSAkdGhpcy0+Y2FjaGUtPmdldCgkdGhpcy0+bmFtZSk7CgoJCWlmICgkZGF0YSAhPT0gZmFsc2UpCgkJewoJCQkvLyBlc3NlbnRpYWxseSBpZ25vcmUgdGhlIG10aW1lIGJlY2F1c2UgTWVtY2FjaGUgZXhwaXJlcyBvbiBpdCdzIG93bgoJCQlyZXR1cm4gdGltZSgpOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogU2V0IHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgdG8gdGhlIGN1cnJlbnQgdGltZQoJICoKCSAqIEByZXR1cm4gYm9vbCBTdWNjZXNzIHN0YXR1cwoJICovCglwdWJsaWMgZnVuY3Rpb24gdG91Y2goKQoJewoJCSRkYXRhID0gJHRoaXMtPmNhY2hlLT5nZXQoJHRoaXMtPm5hbWUpOwoKCQlpZiAoJGRhdGEgIT09IGZhbHNlKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5jYWNoZS0+c2V0KCR0aGlzLT5uYW1lLCAkZGF0YSwgTUVNQ0FDSEVfQ09NUFJFU1NFRCwgKGludCkgJHRoaXMtPmR1cmF0aW9uKTsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJlbW92ZSB0aGUgY2FjaGUKCSAqCgkgKiBAcmV0dXJuIGJvb2wgU3VjY2VzcyBzdGF0dXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVubGluaygpCgl7CgkJcmV0dXJuICR0aGlzLT5jYWNoZS0+ZGVsZXRlKCR0aGlzLT5uYW1lLCAwKTsKCX0KfQoKLyoqCiAqIENhY2hlcyBkYXRhIHRvIGEgTXlTUUwgZGF0YWJhc2UKICoKICogUmVnaXN0ZXJlZCBmb3IgVVJMcyB3aXRoIHRoZSAibXlzcWwiIHByb3RvY29sCiAqCiAqIEZvciBleGFtcGxlLCBgbXlzcWw6Ly9yb290OnBhc3N3b3JkQGxvY2FsaG9zdDozMzA2L215ZGI/cHJlZml4PXNwX2Agd2lsbAogKiBjb25uZWN0IHRvIHRoZSBgbXlkYmAgZGF0YWJhc2Ugb24gYGxvY2FsaG9zdGAgb24gcG9ydCAzMzA2LCB3aXRoIHRoZSB1c2VyCiAqIGByb290YCBhbmQgdGhlIHBhc3N3b3JkIGBwYXNzd29yZGAuIEFsbCB0YWJsZXMgd2lsbCBiZSBwcmVmaXhlZCB3aXRoIGBzcF9gCiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAc3VicGFja2FnZSBDYWNoaW5nCiAqLwpjbGFzcyBTaW1wbGVQaWVfQ2FjaGVfTXlTUUwgZXh0ZW5kcyBTaW1wbGVQaWVfQ2FjaGVfREIKewoJLyoqCgkgKiBQRE8gaW5zdGFuY2UKCSAqCgkgKiBAdmFyIFBETwoJICovCglwcm90ZWN0ZWQgJG15c3FsOwoKCS8qKgoJICogT3B0aW9ucwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJvdGVjdGVkICRvcHRpb25zOwoKCS8qKgoJICogQ2FjaGUgSUQKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcm90ZWN0ZWQgJGlkOwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IGNhY2hlIG9iamVjdAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGxvY2F0aW9uIExvY2F0aW9uIHN0cmluZyAoZnJvbSBTaW1wbGVQaWU6OiRjYWNoZV9sb2NhdGlvbikKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgVW5pcXVlIElEIGZvciB0aGUgY2FjaGUKCSAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRWl0aGVyIFRZUEVfRkVFRCBmb3IgU2ltcGxlUGllIGRhdGEsIG9yIFRZUEVfSU1BR0UgZm9yIGltYWdlIGRhdGEKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRsb2NhdGlvbiwgJG5hbWUsICR0eXBlKQoJewoJCSR0aGlzLT5vcHRpb25zID0gYXJyYXkoCgkJCSd1c2VyJyA9PiBudWxsLAoJCQkncGFzcycgPT4gbnVsbCwKCQkJJ2hvc3QnID0+ICcxMjcuMC4wLjEnLAoJCQkncG9ydCcgPT4gJzMzMDYnLAoJCQkncGF0aCcgPT4gJycsCgkJCSdleHRyYXMnID0+IGFycmF5KAoJCQkJJ3ByZWZpeCcgPT4gJycsCgkJCSksCgkJKTsKCQkkdGhpcy0+b3B0aW9ucyA9IGFycmF5X21lcmdlX3JlY3Vyc2l2ZSgkdGhpcy0+b3B0aW9ucywgU2ltcGxlUGllX0NhY2hlOjpwYXJzZV9VUkwoJGxvY2F0aW9uKSk7CgoJCS8vIFBhdGggaXMgcHJlZml4ZWQgd2l0aCBhICIvIgoJCSR0aGlzLT5vcHRpb25zWydkYm5hbWUnXSA9IHN1YnN0cigkdGhpcy0+b3B0aW9uc1sncGF0aCddLCAxKTsKCgkJdHJ5CgkJewoJCQkkdGhpcy0+bXlzcWwgPSBuZXcgUERPKCJteXNxbDpkYm5hbWU9eyR0aGlzLT5vcHRpb25zWydkYm5hbWUnXX07aG9zdD17JHRoaXMtPm9wdGlvbnNbJ2hvc3QnXX07cG9ydD17JHRoaXMtPm9wdGlvbnNbJ3BvcnQnXX0iLCAkdGhpcy0+b3B0aW9uc1sndXNlciddLCAkdGhpcy0+b3B0aW9uc1sncGFzcyddLCBhcnJheShQRE86Ok1ZU1FMX0FUVFJfSU5JVF9DT01NQU5EID0+ICdTRVQgTkFNRVMgdXRmOCcpKTsKCQl9CgkJY2F0Y2ggKFBET0V4Y2VwdGlvbiAkZSkKCQl7CgkJCSR0aGlzLT5teXNxbCA9IG51bGw7CgkJCXJldHVybjsKCQl9CgoJCSR0aGlzLT5pZCA9ICRuYW1lIC4gJHR5cGU7CgoJCWlmICghJHF1ZXJ5ID0gJHRoaXMtPm15c3FsLT5xdWVyeSgnU0hPVyBUQUJMRVMnKSkKCQl7CgkJCSR0aGlzLT5teXNxbCA9IG51bGw7CgkJCXJldHVybjsKCQl9CgoJCSRkYiA9IGFycmF5KCk7CgkJd2hpbGUgKCRyb3cgPSAkcXVlcnktPmZldGNoQ29sdW1uKCkpCgkJewoJCQkkZGJbXSA9ICRyb3c7CgkJfQoKCQlpZiAoIWluX2FycmF5KCR0aGlzLT5vcHRpb25zWydleHRyYXMnXVsncHJlZml4J10gLiAnY2FjaGVfZGF0YScsICRkYikpCgkJewoJCQkkcXVlcnkgPSAkdGhpcy0+bXlzcWwtPmV4ZWMoJ0NSRUFURSBUQUJMRSBgJyAuICR0aGlzLT5vcHRpb25zWydleHRyYXMnXVsncHJlZml4J10gLiAnY2FjaGVfZGF0YWAgKGBpZGAgVEVYVCBDSEFSQUNURVIgU0VUIHV0ZjggTk9UIE5VTEwsIGBpdGVtc2AgU01BTExJTlQgTk9UIE5VTEwgREVGQVVMVCAwLCBgZGF0YWAgQkxPQiBOT1QgTlVMTCwgYG10aW1lYCBJTlQgVU5TSUdORUQgTk9UIE5VTEwsIFVOSVFVRSAoYGlkYCgxMjUpKSknKTsKCQkJaWYgKCRxdWVyeSA9PT0gZmFsc2UpCgkJCXsKCQkJCSR0aGlzLT5teXNxbCA9IG51bGw7CgkJCX0KCQl9CgoJCWlmICghaW5fYXJyYXkoJHRoaXMtPm9wdGlvbnNbJ2V4dHJhcyddWydwcmVmaXgnXSAuICdpdGVtcycsICRkYikpCgkJewoJCQkkcXVlcnkgPSAkdGhpcy0+bXlzcWwtPmV4ZWMoJ0NSRUFURSBUQUJMRSBgJyAuICR0aGlzLT5vcHRpb25zWydleHRyYXMnXVsncHJlZml4J10gLiAnaXRlbXNgIChgZmVlZF9pZGAgVEVYVCBDSEFSQUNURVIgU0VUIHV0ZjggTk9UIE5VTEwsIGBpZGAgVEVYVCBDSEFSQUNURVIgU0VUIHV0ZjggTk9UIE5VTEwsIGBkYXRhYCBURVhUIENIQVJBQ1RFUiBTRVQgdXRmOCBOT1QgTlVMTCwgYHBvc3RlZGAgSU5UIFVOU0lHTkVEIE5PVCBOVUxMLCBJTkRFWCBgZmVlZF9pZGAgKGBmZWVkX2lkYCgxMjUpKSknKTsKCQkJaWYgKCRxdWVyeSA9PT0gZmFsc2UpCgkJCXsKCQkJCSR0aGlzLT5teXNxbCA9IG51bGw7CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBTYXZlIGRhdGEgdG8gdGhlIGNhY2hlCgkgKgoJICogQHBhcmFtIGFycmF5fFNpbXBsZVBpZSAkZGF0YSBEYXRhIHRvIHN0b3JlIGluIHRoZSBjYWNoZS4gSWYgcGFzc2VkIGEgU2ltcGxlUGllIG9iamVjdCwgb25seSBjYWNoZSB0aGUgJGRhdGEgcHJvcGVydHkKCSAqIEByZXR1cm4gYm9vbCBTdWNjZXNzZnVsbmVzcwoJICovCglwdWJsaWMgZnVuY3Rpb24gc2F2ZSgkZGF0YSkKCXsKCQlpZiAoJHRoaXMtPm15c3FsID09PSBudWxsKQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKCRkYXRhIGluc3RhbmNlb2YgU2ltcGxlUGllKQoJCXsKCQkJJGRhdGEgPSBjbG9uZSAkZGF0YTsKCgkJCSRwcmVwYXJlZCA9IHNlbGY6OnByZXBhcmVfc2ltcGxlcGllX29iamVjdF9mb3JfY2FjaGUoJGRhdGEpOwoKCQkJJHF1ZXJ5ID0gJHRoaXMtPm15c3FsLT5wcmVwYXJlKCdTRUxFQ1QgQ09VTlQoKikgRlJPTSBgJyAuICR0aGlzLT5vcHRpb25zWydleHRyYXMnXVsncHJlZml4J10gLiAnY2FjaGVfZGF0YWAgV0hFUkUgYGlkYCA9IDpmZWVkJyk7CgkJCSRxdWVyeS0+YmluZFZhbHVlKCc6ZmVlZCcsICR0aGlzLT5pZCk7CgkJCWlmICgkcXVlcnktPmV4ZWN1dGUoKSkKCQkJewoJCQkJaWYgKCRxdWVyeS0+ZmV0Y2hDb2x1bW4oKSA+IDApCgkJCQl7CgkJCQkJJGl0ZW1zID0gY291bnQoJHByZXBhcmVkWzFdKTsKCQkJCQlpZiAoJGl0ZW1zKQoJCQkJCXsKCQkJCQkJJHNxbCA9ICdVUERBVEUgYCcgLiAkdGhpcy0+b3B0aW9uc1snZXh0cmFzJ11bJ3ByZWZpeCddIC4gJ2NhY2hlX2RhdGFgIFNFVCBgaXRlbXNgID0gOml0ZW1zLCBgZGF0YWAgPSA6ZGF0YSwgYG10aW1lYCA9IDp0aW1lIFdIRVJFIGBpZGAgPSA6ZmVlZCc7CgkJCQkJCSRxdWVyeSA9ICR0aGlzLT5teXNxbC0+cHJlcGFyZSgkc3FsKTsKCQkJCQkJJHF1ZXJ5LT5iaW5kVmFsdWUoJzppdGVtcycsICRpdGVtcyk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSRzcWwgPSAnVVBEQVRFIGAnIC4gJHRoaXMtPm9wdGlvbnNbJ2V4dHJhcyddWydwcmVmaXgnXSAuICdjYWNoZV9kYXRhYCBTRVQgYGRhdGFgID0gOmRhdGEsIGBtdGltZWAgPSA6dGltZSBXSEVSRSBgaWRgID0gOmZlZWQnOwoJCQkJCQkkcXVlcnkgPSAkdGhpcy0+bXlzcWwtPnByZXBhcmUoJHNxbCk7CgkJCQkJfQoKCQkJCQkkcXVlcnktPmJpbmRWYWx1ZSgnOmRhdGEnLCAkcHJlcGFyZWRbMF0pOwoJCQkJCSRxdWVyeS0+YmluZFZhbHVlKCc6dGltZScsIHRpbWUoKSk7CgkJCQkJJHF1ZXJ5LT5iaW5kVmFsdWUoJzpmZWVkJywgJHRoaXMtPmlkKTsKCQkJCQlpZiAoISRxdWVyeS0+ZXhlY3V0ZSgpKQoJCQkJCXsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkcXVlcnkgPSAkdGhpcy0+bXlzcWwtPnByZXBhcmUoJ0lOU0VSVCBJTlRPIGAnIC4gJHRoaXMtPm9wdGlvbnNbJ2V4dHJhcyddWydwcmVmaXgnXSAuICdjYWNoZV9kYXRhYCAoYGlkYCwgYGl0ZW1zYCwgYGRhdGFgLCBgbXRpbWVgKSBWQUxVRVMoOmZlZWQsIDpjb3VudCwgOmRhdGEsIDp0aW1lKScpOwoJCQkJCSRxdWVyeS0+YmluZFZhbHVlKCc6ZmVlZCcsICR0aGlzLT5pZCk7CgkJCQkJJHF1ZXJ5LT5iaW5kVmFsdWUoJzpjb3VudCcsIGNvdW50KCRwcmVwYXJlZFsxXSkpOwoJCQkJCSRxdWVyeS0+YmluZFZhbHVlKCc6ZGF0YScsICRwcmVwYXJlZFswXSk7CgkJCQkJJHF1ZXJ5LT5iaW5kVmFsdWUoJzp0aW1lJywgdGltZSgpKTsKCQkJCQlpZiAoISRxdWVyeS0+ZXhlY3V0ZSgpKQoJCQkJCXsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX0KCgkJCQkkaWRzID0gYXJyYXlfa2V5cygkcHJlcGFyZWRbMV0pOwoJCQkJaWYgKCFlbXB0eSgkaWRzKSkKCQkJCXsKCQkJCQlmb3JlYWNoICgkaWRzIGFzICRpZCkKCQkJCQl7CgkJCQkJCSRkYXRhYmFzZV9pZHNbXSA9ICR0aGlzLT5teXNxbC0+cXVvdGUoJGlkKTsKCQkJCQl9CgoJCQkJCSRxdWVyeSA9ICR0aGlzLT5teXNxbC0+cHJlcGFyZSgnU0VMRUNUIGBpZGAgRlJPTSBgJyAuICR0aGlzLT5vcHRpb25zWydleHRyYXMnXVsncHJlZml4J10gLiAnaXRlbXNgIFdIRVJFIGBpZGAgPSAnIC4gaW1wbG9kZSgnIE9SIGBpZGAgPSAnLCAkZGF0YWJhc2VfaWRzKSAuICcgQU5EIGBmZWVkX2lkYCA9IDpmZWVkJyk7CgkJCQkJJHF1ZXJ5LT5iaW5kVmFsdWUoJzpmZWVkJywgJHRoaXMtPmlkKTsKCgkJCQkJaWYgKCRxdWVyeS0+ZXhlY3V0ZSgpKQoJCQkJCXsKCQkJCQkJJGV4aXN0aW5nX2lkcyA9IGFycmF5KCk7CgkJCQkJCXdoaWxlICgkcm93ID0gJHF1ZXJ5LT5mZXRjaENvbHVtbigpKQoJCQkJCQl7CgkJCQkJCQkkZXhpc3RpbmdfaWRzW10gPSAkcm93OwoJCQkJCQl9CgoJCQkJCQkkbmV3X2lkcyA9IGFycmF5X2RpZmYoJGlkcywgJGV4aXN0aW5nX2lkcyk7CgoJCQkJCQlmb3JlYWNoICgkbmV3X2lkcyBhcyAkbmV3X2lkKQoJCQkJCQl7CgkJCQkJCQlpZiAoISgkZGF0ZSA9ICRwcmVwYXJlZFsxXVskbmV3X2lkXS0+Z2V0X2RhdGUoJ1UnKSkpCgkJCQkJCQl7CgkJCQkJCQkJJGRhdGUgPSB0aW1lKCk7CgkJCQkJCQl9CgoJCQkJCQkJJHF1ZXJ5ID0gJHRoaXMtPm15c3FsLT5wcmVwYXJlKCdJTlNFUlQgSU5UTyBgJyAuICR0aGlzLT5vcHRpb25zWydleHRyYXMnXVsncHJlZml4J10gLiAnaXRlbXNgIChgZmVlZF9pZGAsIGBpZGAsIGBkYXRhYCwgYHBvc3RlZGApIFZBTFVFUyg6ZmVlZCwgOmlkLCA6ZGF0YSwgOmRhdGUpJyk7CgkJCQkJCQkkcXVlcnktPmJpbmRWYWx1ZSgnOmZlZWQnLCAkdGhpcy0+aWQpOwoJCQkJCQkJJHF1ZXJ5LT5iaW5kVmFsdWUoJzppZCcsICRuZXdfaWQpOwoJCQkJCQkJJHF1ZXJ5LT5iaW5kVmFsdWUoJzpkYXRhJywgc2VyaWFsaXplKCRwcmVwYXJlZFsxXVskbmV3X2lkXS0+ZGF0YSkpOwoJCQkJCQkJJHF1ZXJ5LT5iaW5kVmFsdWUoJzpkYXRlJywgJGRhdGUpOwoJCQkJCQkJaWYgKCEkcXVlcnktPmV4ZWN1dGUoKSkKCQkJCQkJCXsKCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCSRxdWVyeSA9ICR0aGlzLT5teXNxbC0+cHJlcGFyZSgnU0VMRUNUIGBpZGAgRlJPTSBgJyAuICR0aGlzLT5vcHRpb25zWydleHRyYXMnXVsncHJlZml4J10gLiAnY2FjaGVfZGF0YWAgV0hFUkUgYGlkYCA9IDpmZWVkJyk7CgkJCSRxdWVyeS0+YmluZFZhbHVlKCc6ZmVlZCcsICR0aGlzLT5pZCk7CgkJCWlmICgkcXVlcnktPmV4ZWN1dGUoKSkKCQkJewoJCQkJaWYgKCRxdWVyeS0+cm93Q291bnQoKSA+IDApCgkJCQl7CgkJCQkJJHF1ZXJ5ID0gJHRoaXMtPm15c3FsLT5wcmVwYXJlKCdVUERBVEUgYCcgLiAkdGhpcy0+b3B0aW9uc1snZXh0cmFzJ11bJ3ByZWZpeCddIC4gJ2NhY2hlX2RhdGFgIFNFVCBgaXRlbXNgID0gMCwgYGRhdGFgID0gOmRhdGEsIGBtdGltZWAgPSA6dGltZSBXSEVSRSBgaWRgID0gOmZlZWQnKTsKCQkJCQkkcXVlcnktPmJpbmRWYWx1ZSgnOmRhdGEnLCBzZXJpYWxpemUoJGRhdGEpKTsKCQkJCQkkcXVlcnktPmJpbmRWYWx1ZSgnOnRpbWUnLCB0aW1lKCkpOwoJCQkJCSRxdWVyeS0+YmluZFZhbHVlKCc6ZmVlZCcsICR0aGlzLT5pZCk7CgkJCQkJaWYgKCR0aGlzLT5leGVjdXRlKCkpCgkJCQkJewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJHF1ZXJ5ID0gJHRoaXMtPm15c3FsLT5wcmVwYXJlKCdJTlNFUlQgSU5UTyBgJyAuICR0aGlzLT5vcHRpb25zWydleHRyYXMnXVsncHJlZml4J10gLiAnY2FjaGVfZGF0YWAgKGBpZGAsIGBpdGVtc2AsIGBkYXRhYCwgYG10aW1lYCkgVkFMVUVTKDppZCwgMCwgOmRhdGEsIDp0aW1lKScpOwoJCQkJCSRxdWVyeS0+YmluZFZhbHVlKCc6aWQnLCAkdGhpcy0+aWQpOwoJCQkJCSRxdWVyeS0+YmluZFZhbHVlKCc6ZGF0YScsIHNlcmlhbGl6ZSgkZGF0YSkpOwoJCQkJCSRxdWVyeS0+YmluZFZhbHVlKCc6dGltZScsIHRpbWUoKSk7CgkJCQkJaWYgKCRxdWVyeS0+ZXhlY3V0ZSgpKQoJCQkJCXsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJldHJpZXZlIHRoZSBkYXRhIHNhdmVkIHRvIHRoZSBjYWNoZQoJICoKCSAqIEByZXR1cm4gYXJyYXkgRGF0YSBmb3IgU2ltcGxlUGllOjokZGF0YQoJICovCglwdWJsaWMgZnVuY3Rpb24gbG9hZCgpCgl7CgkJaWYgKCR0aGlzLT5teXNxbCA9PT0gbnVsbCkKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRxdWVyeSA9ICR0aGlzLT5teXNxbC0+cHJlcGFyZSgnU0VMRUNUIGBpdGVtc2AsIGBkYXRhYCBGUk9NIGAnIC4gJHRoaXMtPm9wdGlvbnNbJ2V4dHJhcyddWydwcmVmaXgnXSAuICdjYWNoZV9kYXRhYCBXSEVSRSBgaWRgID0gOmlkJyk7CgkJJHF1ZXJ5LT5iaW5kVmFsdWUoJzppZCcsICR0aGlzLT5pZCk7CgkJaWYgKCRxdWVyeS0+ZXhlY3V0ZSgpICYmICgkcm93ID0gJHF1ZXJ5LT5mZXRjaCgpKSkKCQl7CgkJCSRkYXRhID0gdW5zZXJpYWxpemUoJHJvd1sxXSk7CgoJCQlpZiAoaXNzZXQoJHRoaXMtPm9wdGlvbnNbJ2l0ZW1zJ11bMF0pKQoJCQl7CgkJCQkkaXRlbXMgPSAoaW50KSAkdGhpcy0+b3B0aW9uc1snaXRlbXMnXVswXTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRpdGVtcyA9IChpbnQpICRyb3dbMF07CgkJCX0KCgkJCWlmICgkaXRlbXMgIT09IDApCgkJCXsKCQkJCWlmIChpc3NldCgkZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydmZWVkJ11bMF0pKQoJCQkJewoJCQkJCSRmZWVkID0mICRkYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ2ZlZWQnXVswXTsKCQkJCX0KCQkJCWVsc2VpZiAoaXNzZXQoJGRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZmVlZCddWzBdKSkKCQkJCXsKCQkJCQkkZmVlZCA9JiAkZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydmZWVkJ11bMF07CgkJCQl9CgkJCQllbHNlaWYgKGlzc2V0KCRkYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUkRGXVsnUkRGJ11bMF0pKQoJCQkJewoJCQkJCSRmZWVkID0mICRkYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUkRGXVsnUkRGJ11bMF07CgkJCQl9CgkJCQllbHNlaWYgKGlzc2V0KCRkYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwXVsncnNzJ11bMF0pKQoJCQkJewoJCQkJCSRmZWVkID0mICRkYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwXVsncnNzJ11bMF07CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJGZlZWQgPSBudWxsOwoJCQkJfQoKCQkJCWlmICgkZmVlZCAhPT0gbnVsbCkKCQkJCXsKCQkJCQkkc3FsID0gJ1NFTEVDVCBgZGF0YWAgRlJPTSBgJyAuICR0aGlzLT5vcHRpb25zWydleHRyYXMnXVsncHJlZml4J10gLiAnaXRlbXNgIFdIRVJFIGBmZWVkX2lkYCA9IDpmZWVkIE9SREVSIEJZIGBwb3N0ZWRgIERFU0MnOwoJCQkJCWlmICgkaXRlbXMgPiAwKQoJCQkJCXsKCQkJCQkJJHNxbCAuPSAnIExJTUlUICcgLiAkaXRlbXM7CgkJCQkJfQoKCQkJCQkkcXVlcnkgPSAkdGhpcy0+bXlzcWwtPnByZXBhcmUoJHNxbCk7CgkJCQkJJHF1ZXJ5LT5iaW5kVmFsdWUoJzpmZWVkJywgJHRoaXMtPmlkKTsKCQkJCQlpZiAoJHF1ZXJ5LT5leGVjdXRlKCkpCgkJCQkJewoJCQkJCQl3aGlsZSAoJHJvdyA9ICRxdWVyeS0+ZmV0Y2hDb2x1bW4oKSkKCQkJCQkJewoJCQkJCQkJJGZlZWRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZW50cnknXVtdID0gdW5zZXJpYWxpemUoJHJvdyk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gJGRhdGE7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJldHJpZXZlIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgZm9yIHRoZSBjYWNoZQoJICoKCSAqIEByZXR1cm4gaW50IFRpbWVzdGFtcAoJICovCglwdWJsaWMgZnVuY3Rpb24gbXRpbWUoKQoJewoJCWlmICgkdGhpcy0+bXlzcWwgPT09IG51bGwpCgkJewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkkcXVlcnkgPSAkdGhpcy0+bXlzcWwtPnByZXBhcmUoJ1NFTEVDVCBgbXRpbWVgIEZST00gYCcgLiAkdGhpcy0+b3B0aW9uc1snZXh0cmFzJ11bJ3ByZWZpeCddIC4gJ2NhY2hlX2RhdGFgIFdIRVJFIGBpZGAgPSA6aWQnKTsKCQkkcXVlcnktPmJpbmRWYWx1ZSgnOmlkJywgJHRoaXMtPmlkKTsKCQlpZiAoJHF1ZXJ5LT5leGVjdXRlKCkgJiYgKCR0aW1lID0gJHF1ZXJ5LT5mZXRjaENvbHVtbigpKSkKCQl7CgkJCXJldHVybiAkdGltZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFNldCB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIHRvIHRoZSBjdXJyZW50IHRpbWUKCSAqCgkgKiBAcmV0dXJuIGJvb2wgU3VjY2VzcyBzdGF0dXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRvdWNoKCkKCXsKCQlpZiAoJHRoaXMtPm15c3FsID09PSBudWxsKQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJHF1ZXJ5ID0gJHRoaXMtPm15c3FsLT5wcmVwYXJlKCdVUERBVEUgYCcgLiAkdGhpcy0+b3B0aW9uc1snZXh0cmFzJ11bJ3ByZWZpeCddIC4gJ2NhY2hlX2RhdGFgIFNFVCBgbXRpbWVgID0gOnRpbWUgV0hFUkUgYGlkYCA9IDppZCcpOwoJCSRxdWVyeS0+YmluZFZhbHVlKCc6dGltZScsIHRpbWUoKSk7CgkJJHF1ZXJ5LT5iaW5kVmFsdWUoJzppZCcsICR0aGlzLT5pZCk7CgkJaWYgKCRxdWVyeS0+ZXhlY3V0ZSgpICYmICRxdWVyeS0+cm93Q291bnQoKSA+IDApCgkJewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFJlbW92ZSB0aGUgY2FjaGUKCSAqCgkgKiBAcmV0dXJuIGJvb2wgU3VjY2VzcyBzdGF0dXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVubGluaygpCgl7CgkJaWYgKCR0aGlzLT5teXNxbCA9PT0gbnVsbCkKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRxdWVyeSA9ICR0aGlzLT5teXNxbC0+cHJlcGFyZSgnREVMRVRFIEZST00gYCcgLiAkdGhpcy0+b3B0aW9uc1snZXh0cmFzJ11bJ3ByZWZpeCddIC4gJ2NhY2hlX2RhdGFgIFdIRVJFIGBpZGAgPSA6aWQnKTsKCQkkcXVlcnktPmJpbmRWYWx1ZSgnOmlkJywgJHRoaXMtPmlkKTsKCQkkcXVlcnkyID0gJHRoaXMtPm15c3FsLT5wcmVwYXJlKCdERUxFVEUgRlJPTSBgJyAuICR0aGlzLT5vcHRpb25zWydleHRyYXMnXVsncHJlZml4J10gLiAnaXRlbXNgIFdIRVJFIGBmZWVkX2lkYCA9IDppZCcpOwoJCSRxdWVyeTItPmJpbmRWYWx1ZSgnOmlkJywgJHRoaXMtPmlkKTsKCQlpZiAoJHF1ZXJ5LT5leGVjdXRlKCkgJiYgJHF1ZXJ5Mi0+ZXhlY3V0ZSgpKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9Cn0KCi8qKgogKiBVc2VkIHRvIGNyZWF0ZSBjYWNoZSBvYmplY3RzCiAqCiAqIFRoaXMgY2xhc3MgY2FuIGJlIG92ZXJsb2FkZWQgd2l0aCB7QHNlZSBTaW1wbGVQaWU6OnNldF9jYWNoZV9jbGFzcygpfSwKICogYWx0aG91Z2ggdGhlIHByZWZlcnJlZCB3YXkgaXMgdG8gY3JlYXRlIHlvdXIgb3duIGhhbmRsZXIKICogdmlhIHtAc2VlIHJlZ2lzdGVyKCl9CiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAc3VicGFja2FnZSBDYWNoaW5nCiAqLwpjbGFzcyBTaW1wbGVQaWVfQ2FjaGUKewoJLyoqCgkgKiBDYWNoZSBoYW5kbGVyIGNsYXNzZXMKCSAqCgkgKiBUaGVzZSByZWNlaXZlIDMgcGFyYW1ldGVycyB0byB0aGVpciBjb25zdHJ1Y3RvciwgYXMgZG9jdW1lbnRlZCBpbgoJICoge0BzZWUgcmVnaXN0ZXIoKX0KCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJvdGVjdGVkIHN0YXRpYyAkaGFuZGxlcnMgPSBhcnJheSgKCQknbXlzcWwnID0+ICdTaW1wbGVQaWVfQ2FjaGVfTXlTUUwnLAoJCSdtZW1jYWNoZScgPT4gJ1NpbXBsZVBpZV9DYWNoZV9NZW1jYWNoZScsCgkpOwoKCS8qKgoJICogRG9uJ3QgY2FsbCB0aGUgY29uc3RydWN0b3IuIFBsZWFzZS4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsgfQoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IFNpbXBsZVBpZV9DYWNoZSBvYmplY3QKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRsb2NhdGlvbiBVUkwgbG9jYXRpb24gKHNjaGVtZSBpcyB1c2VkIHRvIGRldGVybWluZSBoYW5kbGVyKQoJICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGNhY2hlIG9iamVjdAoJICogQHBhcmFtIHN0cmluZyAkZXh0ZW5zaW9uICdzcGknIG9yICdzcGMnCgkgKiBAcmV0dXJuIFNpbXBsZVBpZV9DYWNoZV9CYXNlIFR5cGUgb2Ygb2JqZWN0IGRlcGVuZHMgb24gc2NoZW1lIG9mIGAkbG9jYXRpb25gCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKCRsb2NhdGlvbiwgJGZpbGVuYW1lLCAkZXh0ZW5zaW9uKQoJewoJCSR0eXBlID0gZXhwbG9kZSgnOicsICRsb2NhdGlvbiwgMik7CgkJJHR5cGUgPSAkdHlwZVswXTsKCQlpZiAoIWVtcHR5KHNlbGY6OiRoYW5kbGVyc1skdHlwZV0pKQoJCXsKCQkJJGNsYXNzID0gc2VsZjo6JGhhbmRsZXJzWyR0eXBlXTsKCQkJcmV0dXJuIG5ldyAkY2xhc3MoJGxvY2F0aW9uLCAkZmlsZW5hbWUsICRleHRlbnNpb24pOwoJCX0KCgkJcmV0dXJuIG5ldyBTaW1wbGVQaWVfQ2FjaGVfRmlsZSgkbG9jYXRpb24sICRmaWxlbmFtZSwgJGV4dGVuc2lvbik7Cgl9CgoJLyoqCgkgKiBSZWdpc3RlciBhIGhhbmRsZXIKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0eXBlIERTTiB0eXBlIHRvIHJlZ2lzdGVyIGZvcgoJICogQHBhcmFtIHN0cmluZyAkY2xhc3MgTmFtZSBvZiBoYW5kbGVyIGNsYXNzLiBNdXN0IGltcGxlbWVudCBTaW1wbGVQaWVfQ2FjaGVfQmFzZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlZ2lzdGVyKCR0eXBlLCAkY2xhc3MpCgl7CgkJc2VsZjo6JGhhbmRsZXJzWyR0eXBlXSA9ICRjbGFzczsKCX0KCgkvKioKCSAqIFBhcnNlIGEgVVJMIGludG8gYW4gYXJyYXkKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR1cmwKCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZV9VUkwoJHVybCkKCXsKCQkkcGFyYW1zID0gcGFyc2VfdXJsKCR1cmwpOwoJCSRwYXJhbXNbJ2V4dHJhcyddID0gYXJyYXkoKTsKCQlpZiAoaXNzZXQoJHBhcmFtc1sncXVlcnknXSkpCgkJewoJCQlwYXJzZV9zdHIoJHBhcmFtc1sncXVlcnknXSwgJHBhcmFtc1snZXh0cmFzJ10pOwoJCX0KCQlyZXR1cm4gJHBhcmFtczsKCX0KfQoKLyoqCiAqIEhhbmRsZXMgYDxtZWRpYTp0ZXh0PmAgY2FwdGlvbnMgYXMgZGVmaW5lZCBpbiBNZWRpYSBSU1MuCiAqCiAqIFVzZWQgYnkge0BzZWUgU2ltcGxlUGllX0VuY2xvc3VyZTo6Z2V0X2NhcHRpb24oKX0gYW5kIHtAc2VlIFNpbXBsZVBpZV9FbmNsb3N1cmU6OmdldF9jYXB0aW9ucygpfQogKgogKiBUaGlzIGNsYXNzIGNhbiBiZSBvdmVybG9hZGVkIHdpdGgge0BzZWUgU2ltcGxlUGllOjpzZXRfY2FwdGlvbl9jbGFzcygpfQogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICogQHN1YnBhY2thZ2UgQVBJCiAqLwpjbGFzcyBTaW1wbGVQaWVfQ2FwdGlvbgp7CgkvKioKCSAqIENvbnRlbnQgdHlwZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAc2VlIGdldF90eXBlKCkKCSAqLwoJdmFyICR0eXBlOwoKCS8qKgoJICogTGFuZ3VhZ2UKCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfbGFuZ3VhZ2UoKQoJICovCgl2YXIgJGxhbmc7CgoJLyoqCgkgKiBTdGFydCB0aW1lCgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBzZWUgZ2V0X3N0YXJ0dGltZSgpCgkgKi8KCXZhciAkc3RhcnRUaW1lOwoKCS8qKgoJICogRW5kIHRpbWUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfZW5kdGltZSgpCgkgKi8KCXZhciAkZW5kVGltZTsKCgkvKioKCSAqIENhcHRpb24gdGV4dAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAc2VlIGdldF90ZXh0KCkKCSAqLwoJdmFyICR0ZXh0OwoKCS8qKgoJICogQ29uc3RydWN0b3IsIHVzZWQgdG8gaW5wdXQgdGhlIGRhdGEKCSAqCgkgKiBGb3IgZG9jdW1lbnRhdGlvbiBvbiBhbGwgdGhlIHBhcmFtZXRlcnMsIHNlZSB0aGUgY29ycmVzcG9uZGluZwoJICogcHJvcGVydGllcyBhbmQgdGhlaXIgYWNjZXNzb3JzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHlwZSA9IG51bGwsICRsYW5nID0gbnVsbCwgJHN0YXJ0VGltZSA9IG51bGwsICRlbmRUaW1lID0gbnVsbCwgJHRleHQgPSBudWxsKQoJewoJCSR0aGlzLT50eXBlID0gJHR5cGU7CgkJJHRoaXMtPmxhbmcgPSAkbGFuZzsKCQkkdGhpcy0+c3RhcnRUaW1lID0gJHN0YXJ0VGltZTsKCQkkdGhpcy0+ZW5kVGltZSA9ICRlbmRUaW1lOwoJCSR0aGlzLT50ZXh0ID0gJHRleHQ7Cgl9CgoJLyoqCgkgKiBTdHJpbmctaWZpZWQgdmVyc2lvbgoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKCXsKCQkvLyBUaGVyZSBpcyBubyAkdGhpcy0+ZGF0YSBoZXJlCgkJcmV0dXJuIG1kNShzZXJpYWxpemUoJHRoaXMpKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgZW5kIHRpbWUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsIFRpbWUgaW4gdGhlIGZvcm1hdCAnaGg6bW06c3MuU1NTJwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2VuZHRpbWUoKQoJewoJCWlmICgkdGhpcy0+ZW5kVGltZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+ZW5kVGltZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBsYW5ndWFnZQoJICoKCSAqIEBsaW5rIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzMwNjYKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwgTGFuZ3VhZ2UgY29kZSBhcyBwZXIgUkZDIDMwNjYKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9sYW5ndWFnZSgpCgl7CgkJaWYgKCR0aGlzLT5sYW5nICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5sYW5nOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHN0YXJ0IHRpbWUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsIFRpbWUgaW4gdGhlIGZvcm1hdCAnaGg6bW06c3MuU1NTJwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3N0YXJ0dGltZSgpCgl7CgkJaWYgKCR0aGlzLT5zdGFydFRpbWUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnN0YXJ0VGltZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSB0ZXh0IG9mIHRoZSBjYXB0aW9uCgkgKgoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3RleHQoKQoJewoJCWlmICgkdGhpcy0+dGV4dCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+dGV4dDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBjb250ZW50IHR5cGUgKG5vdCBNSU1FIHR5cGUpCgkgKgoJICogQHJldHVybiBzdHJpbmd8bnVsbCBFaXRoZXIgJ3RleHQnIG9yICdodG1sJwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3R5cGUoKQoJewoJCWlmICgkdGhpcy0+dHlwZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+dHlwZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQp9CgovKioKICogTWFuYWdlcyBhbGwgY2F0ZWdvcnktcmVsYXRlZCBkYXRhCiAqCiAqIFVzZWQgYnkge0BzZWUgU2ltcGxlUGllX0l0ZW06OmdldF9jYXRlZ29yeSgpfSBhbmQge0BzZWUgU2ltcGxlUGllX0l0ZW06OmdldF9jYXRlZ29yaWVzKCl9CiAqCiAqIFRoaXMgY2xhc3MgY2FuIGJlIG92ZXJsb2FkZWQgd2l0aCB7QHNlZSBTaW1wbGVQaWU6OnNldF9jYXRlZ29yeV9jbGFzcygpfQogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICogQHN1YnBhY2thZ2UgQVBJCiAqLwpjbGFzcyBTaW1wbGVQaWVfQ2F0ZWdvcnkKewoJLyoqCgkgKiBDYXRlZ29yeSBpZGVudGlmaWVyCgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBzZWUgZ2V0X3Rlcm0KCSAqLwoJdmFyICR0ZXJtOwoKCS8qKgoJICogQ2F0ZWdvcml6YXRpb24gc2NoZW1lIGlkZW50aWZpZXIKCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfc2NoZW1lKCkKCSAqLwoJdmFyICRzY2hlbWU7CgoJLyoqCgkgKiBIdW1hbiByZWFkYWJsZSBsYWJlbAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAc2VlIGdldF9sYWJlbCgpCgkgKi8KCXZhciAkbGFiZWw7CgoJLyoqCgkgKiBDb25zdHJ1Y3RvciwgdXNlZCB0byBpbnB1dCB0aGUgZGF0YQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRlcm0KCSAqIEBwYXJhbSBzdHJpbmcgJHNjaGVtZQoJICogQHBhcmFtIHN0cmluZyAkbGFiZWwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0ZXJtID0gbnVsbCwgJHNjaGVtZSA9IG51bGwsICRsYWJlbCA9IG51bGwpCgl7CgkJJHRoaXMtPnRlcm0gPSAkdGVybTsKCQkkdGhpcy0+c2NoZW1lID0gJHNjaGVtZTsKCQkkdGhpcy0+bGFiZWwgPSAkbGFiZWw7Cgl9CgoJLyoqCgkgKiBTdHJpbmctaWZpZWQgdmVyc2lvbgoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKCXsKCQkvLyBUaGVyZSBpcyBubyAkdGhpcy0+ZGF0YSBoZXJlCgkJcmV0dXJuIG1kNShzZXJpYWxpemUoJHRoaXMpKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY2F0ZWdvcnkgaWRlbnRpZmllcgoJICoKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF90ZXJtKCkKCXsKCQlpZiAoJHRoaXMtPnRlcm0gIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnRlcm07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCB0aGUgY2F0ZWdvcml6YXRpb24gc2NoZW1lIGlkZW50aWZpZXIKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfc2NoZW1lKCkKCXsKCQlpZiAoJHRoaXMtPnNjaGVtZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2NoZW1lOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIGxhYmVsCgkgKgoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2xhYmVsKCkKCXsKCQlpZiAoJHRoaXMtPmxhYmVsICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5sYWJlbDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICR0aGlzLT5nZXRfdGVybSgpOwoJCX0KCX0KfQoKLyoqCiAqIENvbnRlbnQtdHlwZSBzbmlmZmluZwogKgogKiBCYXNlZCBvbiB0aGUgcnVsZXMgaW4gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtYWJhcnRoLW1pbWUtc25pZmYtMDYKICoKICogVGhpcyBpcyB1c2VkIHNpbmNlIHdlIGNhbid0IGFsd2F5cyB0cnVzdCBDb250ZW50LVR5cGUgaGVhZGVycywgYW5kIGlzIGJhc2VkCiAqIHVwb24gdGhlIEhUTUw1IHBhcnNpbmcgcnVsZXMuCiAqCiAqCiAqIFRoaXMgY2xhc3MgY2FuIGJlIG92ZXJsb2FkZWQgd2l0aCB7QHNlZSBTaW1wbGVQaWU6OnNldF9jb250ZW50X3R5cGVfc25pZmZlcl9jbGFzcygpfQogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICogQHN1YnBhY2thZ2UgSFRUUAogKi8KY2xhc3MgU2ltcGxlUGllX0NvbnRlbnRfVHlwZV9TbmlmZmVyCnsKCS8qKgoJICogRmlsZSBvYmplY3QKCSAqCgkgKiBAdmFyIFNpbXBsZVBpZV9GaWxlCgkgKi8KCXZhciAkZmlsZTsKCgkvKioKCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgaW5wdXQgZmlsZQoJICoKCSAqIEBwYXJhbSBTaW1wbGVQaWVfQ29udGVudF9UeXBlX1NuaWZmZXIgJGZpbGUgSW5wdXQgZmlsZQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGZpbGUpCgl7CgkJJHRoaXMtPmZpbGUgPSAkZmlsZTsKCX0KCgkvKioKCSAqIEdldCB0aGUgQ29udGVudC1UeXBlIG9mIHRoZSBzcGVjaWZpZWQgZmlsZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nIEFjdHVhbCBDb250ZW50LVR5cGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF90eXBlKCkKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPmZpbGUtPmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSkKCQl7CgkJCWlmICghaXNzZXQoJHRoaXMtPmZpbGUtPmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSkKCQkJCSYmICgkdGhpcy0+ZmlsZS0+aGVhZGVyc1snY29udGVudC10eXBlJ10gPT09ICd0ZXh0L3BsYWluJwoJCQkJCXx8ICR0aGlzLT5maWxlLT5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9PT0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMScKCQkJCQl8fCAkdGhpcy0+ZmlsZS0+aGVhZGVyc1snY29udGVudC10eXBlJ10gPT09ICd0ZXh0L3BsYWluOyBjaGFyc2V0PWlzby04ODU5LTEnCgkJCQkJfHwgJHRoaXMtPmZpbGUtPmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID09PSAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOCcpKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPnRleHRfb3JfYmluYXJ5KCk7CgkJCX0KCgkJCWlmICgoJHBvcyA9IHN0cnBvcygkdGhpcy0+ZmlsZS0+aGVhZGVyc1snY29udGVudC10eXBlJ10sICc7JykpICE9PSBmYWxzZSkKCQkJewoJCQkJJG9mZmljaWFsID0gc3Vic3RyKCR0aGlzLT5maWxlLT5oZWFkZXJzWydjb250ZW50LXR5cGUnXSwgMCwgJHBvcyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkb2ZmaWNpYWwgPSAkdGhpcy0+ZmlsZS0+aGVhZGVyc1snY29udGVudC10eXBlJ107CgkJCX0KCQkJJG9mZmljaWFsID0gdHJpbShzdHJ0b2xvd2VyKCRvZmZpY2lhbCkpOwoKCQkJaWYgKCRvZmZpY2lhbCA9PT0gJ3Vua25vd24vdW5rbm93bicKCQkJCXx8ICRvZmZpY2lhbCA9PT0gJ2FwcGxpY2F0aW9uL3Vua25vd24nKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPnVua25vd24oKTsKCQkJfQoJCQllbHNlaWYgKHN1YnN0cigkb2ZmaWNpYWwsIC00KSA9PT0gJyt4bWwnCgkJCQl8fCAkb2ZmaWNpYWwgPT09ICd0ZXh0L3htbCcKCQkJCXx8ICRvZmZpY2lhbCA9PT0gJ2FwcGxpY2F0aW9uL3htbCcpCgkJCXsKCQkJCXJldHVybiAkb2ZmaWNpYWw7CgkJCX0KCQkJZWxzZWlmIChzdWJzdHIoJG9mZmljaWFsLCAwLCA2KSA9PT0gJ2ltYWdlLycpCgkJCXsKCQkJCWlmICgkcmV0dXJuID0gJHRoaXMtPmltYWdlKCkpCgkJCQl7CgkJCQkJcmV0dXJuICRyZXR1cm47CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcmV0dXJuICRvZmZpY2lhbDsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRvZmZpY2lhbCA9PT0gJ3RleHQvaHRtbCcpCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+ZmVlZF9vcl9odG1sKCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gJG9mZmljaWFsOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAkdGhpcy0+dW5rbm93bigpOwoJCX0KCX0KCgkvKioKCSAqIFNuaWZmIHRleHQgb3IgYmluYXJ5CgkgKgoJICogQHJldHVybiBzdHJpbmcgQWN0dWFsIENvbnRlbnQtVHlwZQoJICovCglwdWJsaWMgZnVuY3Rpb24gdGV4dF9vcl9iaW5hcnkoKQoJewoJCWlmIChzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksIDAsIDIpID09PSAiXHhGRVx4RkYiCgkJCXx8IHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgMikgPT09ICJceEZGXHhGRSIKCQkJfHwgc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCA0KSA9PT0gIlx4MDBceDAwXHhGRVx4RkYiCgkJCXx8IHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgMykgPT09ICJceEVGXHhCQlx4QkYiKQoJCXsKCQkJcmV0dXJuICd0ZXh0L3BsYWluJzsKCQl9CgkJZWxzZWlmIChwcmVnX21hdGNoKCcvW1x4MDAtXHgwOFx4MEUtXHgxQVx4MUMtXHgxRl0vJywgJHRoaXMtPmZpbGUtPmJvZHkpKQoJCXsKCQkJcmV0dXJuICdhcHBsaWNhdGlvbi9vY3RlY3Qtc3RyZWFtJzsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICd0ZXh0L3BsYWluJzsKCQl9Cgl9CgoJLyoqCgkgKiBTbmlmZiB1bmtub3duCgkgKgoJICogQHJldHVybiBzdHJpbmcgQWN0dWFsIENvbnRlbnQtVHlwZQoJICovCglwdWJsaWMgZnVuY3Rpb24gdW5rbm93bigpCgl7CgkJJHdzID0gc3Ryc3BuKCR0aGlzLT5maWxlLT5ib2R5LCAiXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwIik7CgkJaWYgKHN0cnRvbG93ZXIoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAkd3MsIDE0KSkgPT09ICc8IWRvY3R5cGUgaHRtbCcKCQkJfHwgc3RydG9sb3dlcihzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksICR3cywgNSkpID09PSAnPGh0bWwnCgkJCXx8IHN0cnRvbG93ZXIoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAkd3MsIDcpKSA9PT0gJzxzY3JpcHQnKQoJCXsKCQkJcmV0dXJuICd0ZXh0L2h0bWwnOwoJCX0KCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgNSkgPT09ICclUERGLScpCgkJewoJCQlyZXR1cm4gJ2FwcGxpY2F0aW9uL3BkZic7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCAxMSkgPT09ICclIVBTLUFkb2JlLScpCgkJewoJCQlyZXR1cm4gJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnOwoJCX0KCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgNikgPT09ICdHSUY4N2EnCgkJCXx8IHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgNikgPT09ICdHSUY4OWEnKQoJCXsKCQkJcmV0dXJuICdpbWFnZS9naWYnOwoJCX0KCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgOCkgPT09ICJceDg5XHg1MFx4NEVceDQ3XHgwRFx4MEFceDFBXHgwQSIpCgkJewoJCQlyZXR1cm4gJ2ltYWdlL3BuZyc7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCAzKSA9PT0gIlx4RkZceEQ4XHhGRiIpCgkJewoJCQlyZXR1cm4gJ2ltYWdlL2pwZWcnOwoJCX0KCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgMikgPT09ICJceDQyXHg0RCIpCgkJewoJCQlyZXR1cm4gJ2ltYWdlL2JtcCc7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCA0KSA9PT0gIlx4MDBceDAwXHgwMVx4MDAiKQoJCXsKCQkJcmV0dXJuICdpbWFnZS92bmQubWljcm9zb2Z0Lmljb24nOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gJHRoaXMtPnRleHRfb3JfYmluYXJ5KCk7CgkJfQoJfQoKCS8qKgoJICogU25pZmYgaW1hZ2VzCgkgKgoJICogQHJldHVybiBzdHJpbmcgQWN0dWFsIENvbnRlbnQtVHlwZQoJICovCglwdWJsaWMgZnVuY3Rpb24gaW1hZ2UoKQoJewoJCWlmIChzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksIDAsIDYpID09PSAnR0lGODdhJwoJCQl8fCBzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksIDAsIDYpID09PSAnR0lGODlhJykKCQl7CgkJCXJldHVybiAnaW1hZ2UvZ2lmJzsKCQl9CgkJZWxzZWlmIChzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksIDAsIDgpID09PSAiXHg4OVx4NTBceDRFXHg0N1x4MERceDBBXHgxQVx4MEEiKQoJCXsKCQkJcmV0dXJuICdpbWFnZS9wbmcnOwoJCX0KCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgMykgPT09ICJceEZGXHhEOFx4RkYiKQoJCXsKCQkJcmV0dXJuICdpbWFnZS9qcGVnJzsKCQl9CgkJZWxzZWlmIChzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksIDAsIDIpID09PSAiXHg0Mlx4NEQiKQoJCXsKCQkJcmV0dXJuICdpbWFnZS9ibXAnOwoJCX0KCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgNCkgPT09ICJceDAwXHgwMFx4MDFceDAwIikKCQl7CgkJCXJldHVybiAnaW1hZ2Uvdm5kLm1pY3Jvc29mdC5pY29uJzsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFNuaWZmIEhUTUwKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBBY3R1YWwgQ29udGVudC1UeXBlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBmZWVkX29yX2h0bWwoKQoJewoJCSRsZW4gPSBzdHJsZW4oJHRoaXMtPmZpbGUtPmJvZHkpOwoJCSRwb3MgPSBzdHJzcG4oJHRoaXMtPmZpbGUtPmJvZHksICJceDA5XHgwQVx4MERceDIwIik7CgoJCXdoaWxlICgkcG9zIDwgJGxlbikKCQl7CgkJCXN3aXRjaCAoJHRoaXMtPmZpbGUtPmJvZHlbJHBvc10pCgkJCXsKCQkJCWNhc2UgIlx4MDkiOgoJCQkJY2FzZSAiXHgwQSI6CgkJCQljYXNlICJceDBEIjoKCQkJCWNhc2UgIlx4MjAiOgoJCQkJCSRwb3MgKz0gc3Ryc3BuKCR0aGlzLT5maWxlLT5ib2R5LCAiXHgwOVx4MEFceDBEXHgyMCIsICRwb3MpOwoJCQkJCWNvbnRpbnVlIDI7CgoJCQkJY2FzZSAnPCc6CgkJCQkJJHBvcysrOwoJCQkJCWJyZWFrOwoKCQkJCWRlZmF1bHQ6CgkJCQkJcmV0dXJuICd0ZXh0L2h0bWwnOwoJCQl9CgoJCQlpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAkcG9zLCAzKSA9PT0gJyEtLScpCgkJCXsKCQkJCSRwb3MgKz0gMzsKCQkJCWlmICgkcG9zIDwgJGxlbiAmJiAoJHBvcyA9IHN0cnBvcygkdGhpcy0+ZmlsZS0+Ym9keSwgJy0tPicsICRwb3MpKSAhPT0gZmFsc2UpCgkJCQl7CgkJCQkJJHBvcyArPSAzOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXJldHVybiAndGV4dC9odG1sJzsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgJHBvcywgMSkgPT09ICchJykKCQkJewoJCQkJaWYgKCRwb3MgPCAkbGVuICYmICgkcG9zID0gc3RycG9zKCR0aGlzLT5maWxlLT5ib2R5LCAnPicsICRwb3MpKSAhPT0gZmFsc2UpCgkJCQl7CgkJCQkJJHBvcysrOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXJldHVybiAndGV4dC9odG1sJzsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgJHBvcywgMSkgPT09ICc/JykKCQkJewoJCQkJaWYgKCRwb3MgPCAkbGVuICYmICgkcG9zID0gc3RycG9zKCR0aGlzLT5maWxlLT5ib2R5LCAnPz4nLCAkcG9zKSkgIT09IGZhbHNlKQoJCQkJewoJCQkJCSRwb3MgKz0gMjsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlyZXR1cm4gJ3RleHQvaHRtbCc7CgkJCQl9CgkJCX0KCQkJZWxzZWlmIChzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksICRwb3MsIDMpID09PSAncnNzJwoJCQkJfHwgc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAkcG9zLCA3KSA9PT0gJ3JkZjpSREYnKQoJCQl7CgkJCQlyZXR1cm4gJ2FwcGxpY2F0aW9uL3Jzcyt4bWwnOwoJCQl9CgkJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAkcG9zLCA0KSA9PT0gJ2ZlZWQnKQoJCQl7CgkJCQlyZXR1cm4gJ2FwcGxpY2F0aW9uL2F0b20reG1sJzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiAndGV4dC9odG1sJzsKCQkJfQoJCX0KCgkJcmV0dXJuICd0ZXh0L2h0bWwnOwoJfQp9CgovKioKICogTWFuYWdlcyBgPG1lZGlhOmNvcHlyaWdodD5gIGNvcHlyaWdodCB0YWdzIGFzIGRlZmluZWQgaW4gTWVkaWEgUlNTCiAqCiAqIFVzZWQgYnkge0BzZWUgU2ltcGxlUGllX0VuY2xvc3VyZTo6Z2V0X2NvcHlyaWdodCgpfQogKgogKiBUaGlzIGNsYXNzIGNhbiBiZSBvdmVybG9hZGVkIHdpdGgge0BzZWUgU2ltcGxlUGllOjpzZXRfY29weXJpZ2h0X2NsYXNzKCl9CiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAc3VicGFja2FnZSBBUEkKICovCmNsYXNzIFNpbXBsZVBpZV9Db3B5cmlnaHQKewoJLyoqCgkgKiBDb3B5cmlnaHQgVVJMCgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBzZWUgZ2V0X3VybCgpCgkgKi8KCXZhciAkdXJsOwoKCS8qKgoJICogQXR0cmlidXRpb24KCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfYXR0cmlidXRpb24oKQoJICovCgl2YXIgJGxhYmVsOwoKCS8qKgoJICogQ29uc3RydWN0b3IsIHVzZWQgdG8gaW5wdXQgdGhlIGRhdGEKCSAqCgkgKiBGb3IgZG9jdW1lbnRhdGlvbiBvbiBhbGwgdGhlIHBhcmFtZXRlcnMsIHNlZSB0aGUgY29ycmVzcG9uZGluZwoJICogcHJvcGVydGllcyBhbmQgdGhlaXIgYWNjZXNzb3JzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdXJsID0gbnVsbCwgJGxhYmVsID0gbnVsbCkKCXsKCQkkdGhpcy0+dXJsID0gJHVybDsKCQkkdGhpcy0+bGFiZWwgPSAkbGFiZWw7Cgl9CgoJLyoqCgkgKiBTdHJpbmctaWZpZWQgdmVyc2lvbgoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKCXsKCQkvLyBUaGVyZSBpcyBubyAkdGhpcy0+ZGF0YSBoZXJlCgkJcmV0dXJuIG1kNShzZXJpYWxpemUoJHRoaXMpKTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY29weXJpZ2h0IFVSTAoJICoKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwgVVJMIHRvIGNvcHlyaWdodCBpbmZvcm1hdGlvbgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3VybCgpCgl7CgkJaWYgKCR0aGlzLT51cmwgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnVybDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBhdHRyaWJ1dGlvbiB0ZXh0CgkgKgoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2F0dHJpYnV0aW9uKCkKCXsKCQlpZiAoJHRoaXMtPmxhYmVsICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5sYWJlbDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQp9CgovKioKICogU2ltcGxlUGllIGNsYXNzLgogKgogKiBDbGFzcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICoKICogQGRlcHJlY2F0ZWQgVXNlIHtAc2VlIFNpbXBsZVBpZX0gZGlyZWN0bHkKICogQHBhY2thZ2UgU2ltcGxlUGllCiAqIEBzdWJwYWNrYWdlIEFQSQogKi8KY2xhc3MgU2ltcGxlUGllX0NvcmUgZXh0ZW5kcyBTaW1wbGVQaWUKewoKfQoKLyoqCiAqIEhhbmRsZXMgYDxtZWRpYTpjcmVkaXQ+YCBhcyBkZWZpbmVkIGluIE1lZGlhIFJTUwogKgogKiBVc2VkIGJ5IHtAc2VlIFNpbXBsZVBpZV9FbmNsb3N1cmU6OmdldF9jcmVkaXQoKX0gYW5kIHtAc2VlIFNpbXBsZVBpZV9FbmNsb3N1cmU6OmdldF9jcmVkaXRzKCl9CiAqCiAqIFRoaXMgY2xhc3MgY2FuIGJlIG92ZXJsb2FkZWQgd2l0aCB7QHNlZSBTaW1wbGVQaWU6OnNldF9jcmVkaXRfY2xhc3MoKX0KICoKICogQHBhY2thZ2UgU2ltcGxlUGllCiAqIEBzdWJwYWNrYWdlIEFQSQogKi8KY2xhc3MgU2ltcGxlUGllX0NyZWRpdAp7CgkvKioKCSAqIENyZWRpdGVkIHJvbGUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfcm9sZSgpCgkgKi8KCXZhciAkcm9sZTsKCgkvKioKCSAqIE9yZ2FuaXphdGlvbmFsIHNjaGVtZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAc2VlIGdldF9zY2hlbWUoKQoJICovCgl2YXIgJHNjaGVtZTsKCgkvKioKCSAqIENyZWRpdGVkIG5hbWUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfbmFtZSgpCgkgKi8KCXZhciAkbmFtZTsKCgkvKioKCSAqIENvbnN0cnVjdG9yLCB1c2VkIHRvIGlucHV0IHRoZSBkYXRhCgkgKgoJICogRm9yIGRvY3VtZW50YXRpb24gb24gYWxsIHRoZSBwYXJhbWV0ZXJzLCBzZWUgdGhlIGNvcnJlc3BvbmRpbmcKCSAqIHByb3BlcnRpZXMgYW5kIHRoZWlyIGFjY2Vzc29ycwoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHJvbGUgPSBudWxsLCAkc2NoZW1lID0gbnVsbCwgJG5hbWUgPSBudWxsKQoJewoJCSR0aGlzLT5yb2xlID0gJHJvbGU7CgkJJHRoaXMtPnNjaGVtZSA9ICRzY2hlbWU7CgkJJHRoaXMtPm5hbWUgPSAkbmFtZTsKCX0KCgkvKioKCSAqIFN0cmluZy1pZmllZCB2ZXJzaW9uCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRoZXJlIGlzIG5vICR0aGlzLT5kYXRhIGhlcmUKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcykpOwoJfQoKCS8qKgoJICogR2V0IHRoZSByb2xlIG9mIHRoZSBwZXJzb24gcmVjZWl2aW5nIGNyZWRpdAoJICoKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9yb2xlKCkKCXsKCQlpZiAoJHRoaXMtPnJvbGUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnJvbGU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCB0aGUgb3JnYW5pemF0aW9uYWwgc2NoZW1lCgkgKgoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3NjaGVtZSgpCgl7CgkJaWYgKCR0aGlzLT5zY2hlbWUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNjaGVtZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBjcmVkaXRlZCBwZXJzb24vZW50aXR5J3MgbmFtZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9uYW1lKCkKCXsKCQlpZiAoJHRoaXMtPm5hbWUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPm5hbWU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KfQoKLyoqCiAqIERlY29kZSBIVE1MIEVudGl0aWVzCiAqCiAqIFRoaXMgaW1wbGVtZW50cyBIVE1MNSBhcyBvZiByZXZpc2lvbiA5NjcgKDIwMDctMDYtMjgpCiAqCiAqIEBkZXByZWNhdGVkIFVzZSBET01Eb2N1bWVudCBpbnN0ZWFkIQogKiBAcGFja2FnZSBTaW1wbGVQaWUKICovCmNsYXNzIFNpbXBsZVBpZV9EZWNvZGVfSFRNTF9FbnRpdGllcwp7CgkvKioKCSAqIERhdGEgdG8gYmUgcGFyc2VkCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGRhdGEgPSAnJzsKCgkvKioKCSAqIEN1cnJlbnRseSBjb25zdW1lZCBieXRlcwoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRjb25zdW1lZCA9ICcnOwoKCS8qKgoJICogUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYnl0ZSBiZWluZyBwYXJzZWQKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgaW50CgkgKi8KCXZhciAkcG9zaXRpb24gPSAwOwoKCS8qKgoJICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB3aXRoIHRoZSBpbnB1dCBkYXRhCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgSW5wdXQgZGF0YQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGRhdGEpCgl7CgkJJHRoaXMtPmRhdGEgPSAkZGF0YTsKCX0KCgkvKioKCSAqIFBhcnNlIHRoZSBpbnB1dCBkYXRhCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEByZXR1cm4gc3RyaW5nIE91dHB1dCBkYXRhCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwYXJzZSgpCgl7CgkJd2hpbGUgKCgkdGhpcy0+cG9zaXRpb24gPSBzdHJwb3MoJHRoaXMtPmRhdGEsICcmJywgJHRoaXMtPnBvc2l0aW9uKSkgIT09IGZhbHNlKQoJCXsKCQkJJHRoaXMtPmNvbnN1bWUoKTsKCQkJJHRoaXMtPmVudGl0eSgpOwoJCQkkdGhpcy0+Y29uc3VtZWQgPSAnJzsKCQl9CgkJcmV0dXJuICR0aGlzLT5kYXRhOwoJfQoKCS8qKgoJICogQ29uc3VtZSB0aGUgbmV4dCBieXRlCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcmV0dXJuIG1peGVkIFRoZSBuZXh0IGJ5dGUsIG9yIGZhbHNlLCBpZiB0aGVyZSBpcyBubyBtb3JlIGRhdGEKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNvbnN1bWUoKQoJewoJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dKSkKCQl7CgkJCSR0aGlzLT5jb25zdW1lZCAuPSAkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dOwoJCQlyZXR1cm4gJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uKytdOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoKCS8qKgoJICogQ29uc3VtZSBhIHJhbmdlIG9mIGNoYXJhY3RlcnMKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBwYXJhbSBzdHJpbmcgJGNoYXJzIENoYXJhY3RlcnMgdG8gY29uc3VtZQoJICogQHJldHVybiBtaXhlZCBBIHNlcmllcyBvZiBjaGFyYWN0ZXJzIHRoYXQgbWF0Y2ggdGhlIHJhbmdlLCBvciBmYWxzZQoJICovCglwdWJsaWMgZnVuY3Rpb24gY29uc3VtZV9yYW5nZSgkY2hhcnMpCgl7CgkJaWYgKCRsZW4gPSBzdHJzcG4oJHRoaXMtPmRhdGEsICRjaGFycywgJHRoaXMtPnBvc2l0aW9uKSkKCQl7CgkJCSRkYXRhID0gc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sICRsZW4pOwoJCQkkdGhpcy0+Y29uc3VtZWQgLj0gJGRhdGE7CgkJCSR0aGlzLT5wb3NpdGlvbiArPSAkbGVuOwoJCQlyZXR1cm4gJGRhdGE7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBVbmNvbnN1bWUgb25lIGJ5dGUKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHVuY29uc3VtZSgpCgl7CgkJJHRoaXMtPmNvbnN1bWVkID0gc3Vic3RyKCR0aGlzLT5jb25zdW1lZCwgMCwgLTEpOwoJCSR0aGlzLT5wb3NpdGlvbi0tOwoJfQoKCS8qKgoJICogRGVjb2RlIGFuIGVudGl0eQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZW50aXR5KCkKCXsKCQlzd2l0Y2ggKCR0aGlzLT5jb25zdW1lKCkpCgkJewoJCQljYXNlICJceDA5IjoKCQkJY2FzZSAiXHgwQSI6CgkJCWNhc2UgIlx4MEIiOgoJCQljYXNlICJceDBCIjoKCQkJY2FzZSAiXHgwQyI6CgkJCWNhc2UgIlx4MjAiOgoJCQljYXNlICJceDNDIjoKCQkJY2FzZSAiXHgyNiI6CgkJCWNhc2UgZmFsc2U6CgkJCQlicmVhazsKCgkJCWNhc2UgIlx4MjMiOgoJCQkJc3dpdGNoICgkdGhpcy0+Y29uc3VtZSgpKQoJCQkJewoJCQkJCWNhc2UgIlx4NzgiOgoJCQkJCWNhc2UgIlx4NTgiOgoJCQkJCQkkcmFuZ2UgPSAnMDEyMzQ1Njc4OUFCQ0RFRmFiY2RlZic7CgkJCQkJCSRoZXggPSB0cnVlOwoJCQkJCQlicmVhazsKCgkJCQkJZGVmYXVsdDoKCQkJCQkJJHJhbmdlID0gJzAxMjM0NTY3ODknOwoJCQkJCQkkaGV4ID0gZmFsc2U7CgkJCQkJCSR0aGlzLT51bmNvbnN1bWUoKTsKCQkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKCRjb2RlcG9pbnQgPSAkdGhpcy0+Y29uc3VtZV9yYW5nZSgkcmFuZ2UpKQoJCQkJewoJCQkJCXN0YXRpYyAkd2luZG93c18xMjUyX3NwZWNpYWxzID0gYXJyYXkoMHgwRCA9PiAiXHgwQSIsIDB4ODAgPT4gIlx4RTJceDgyXHhBQyIsIDB4ODEgPT4gIlx4RUZceEJGXHhCRCIsIDB4ODIgPT4gIlx4RTJceDgwXHg5QSIsIDB4ODMgPT4gIlx4QzZceDkyIiwgMHg4NCA9PiAiXHhFMlx4ODBceDlFIiwgMHg4NSA9PiAiXHhFMlx4ODBceEE2IiwgMHg4NiA9PiAiXHhFMlx4ODBceEEwIiwgMHg4NyA9PiAiXHhFMlx4ODBceEExIiwgMHg4OCA9PiAiXHhDQlx4ODYiLCAweDg5ID0+ICJceEUyXHg4MFx4QjAiLCAweDhBID0+ICJceEM1XHhBMCIsIDB4OEIgPT4gIlx4RTJceDgwXHhCOSIsIDB4OEMgPT4gIlx4QzVceDkyIiwgMHg4RCA9PiAiXHhFRlx4QkZceEJEIiwgMHg4RSA9PiAiXHhDNVx4QkQiLCAweDhGID0+ICJceEVGXHhCRlx4QkQiLCAweDkwID0+ICJceEVGXHhCRlx4QkQiLCAweDkxID0+ICJceEUyXHg4MFx4OTgiLCAweDkyID0+ICJceEUyXHg4MFx4OTkiLCAweDkzID0+ICJceEUyXHg4MFx4OUMiLCAweDk0ID0+ICJceEUyXHg4MFx4OUQiLCAweDk1ID0+ICJceEUyXHg4MFx4QTIiLCAweDk2ID0+ICJceEUyXHg4MFx4OTMiLCAweDk3ID0+ICJceEUyXHg4MFx4OTQiLCAweDk4ID0+ICJceENCXHg5QyIsIDB4OTkgPT4gIlx4RTJceDg0XHhBMiIsIDB4OUEgPT4gIlx4QzVceEExIiwgMHg5QiA9PiAiXHhFMlx4ODBceEJBIiwgMHg5QyA9PiAiXHhDNVx4OTMiLCAweDlEID0+ICJceEVGXHhCRlx4QkQiLCAweDlFID0+ICJceEM1XHhCRSIsIDB4OUYgPT4gIlx4QzVceEI4Iik7CgoJCQkJCWlmICgkaGV4KQoJCQkJCXsKCQkJCQkJJGNvZGVwb2ludCA9IGhleGRlYygkY29kZXBvaW50KTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJGNvZGVwb2ludCA9IGludHZhbCgkY29kZXBvaW50KTsKCQkJCQl9CgoJCQkJCWlmIChpc3NldCgkd2luZG93c18xMjUyX3NwZWNpYWxzWyRjb2RlcG9pbnRdKSkKCQkJCQl7CgkJCQkJCSRyZXBsYWNlbWVudCA9ICR3aW5kb3dzXzEyNTJfc3BlY2lhbHNbJGNvZGVwb2ludF07CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSRyZXBsYWNlbWVudCA9IFNpbXBsZVBpZV9NaXNjOjpjb2RlcG9pbnRfdG9fdXRmOCgkY29kZXBvaW50KTsKCQkJCQl9CgoJCQkJCWlmICghaW5fYXJyYXkoJHRoaXMtPmNvbnN1bWUoKSwgYXJyYXkoJzsnLCBmYWxzZSksIHRydWUpKQoJCQkJCXsKCQkJCQkJJHRoaXMtPnVuY29uc3VtZSgpOwoJCQkJCX0KCgkJCQkJJGNvbnN1bWVkX2xlbmd0aCA9IHN0cmxlbigkdGhpcy0+Y29uc3VtZWQpOwoJCQkJCSR0aGlzLT5kYXRhID0gc3Vic3RyX3JlcGxhY2UoJHRoaXMtPmRhdGEsICRyZXBsYWNlbWVudCwgJHRoaXMtPnBvc2l0aW9uIC0gJGNvbnN1bWVkX2xlbmd0aCwgJGNvbnN1bWVkX2xlbmd0aCk7CgkJCQkJJHRoaXMtPnBvc2l0aW9uICs9IHN0cmxlbigkcmVwbGFjZW1lbnQpIC0gJGNvbnN1bWVkX2xlbmd0aDsKCQkJCX0KCQkJCWJyZWFrOwoKCQkJZGVmYXVsdDoKCQkJCXN0YXRpYyAkZW50aXRpZXMgPSBhcnJheSgKCQkJCQknQWFjdXRlJyA9PiAiXHhDM1x4ODEiLAoJCQkJCSdhYWN1dGUnID0+ICJceEMzXHhBMSIsCgkJCQkJJ0FhY3V0ZTsnID0+ICJceEMzXHg4MSIsCgkJCQkJJ2FhY3V0ZTsnID0+ICJceEMzXHhBMSIsCgkJCQkJJ0FjaXJjJyA9PiAiXHhDM1x4ODIiLAoJCQkJCSdhY2lyYycgPT4gIlx4QzNceEEyIiwKCQkJCQknQWNpcmM7JyA9PiAiXHhDM1x4ODIiLAoJCQkJCSdhY2lyYzsnID0+ICJceEMzXHhBMiIsCgkJCQkJJ2FjdXRlJyA9PiAiXHhDMlx4QjQiLAoJCQkJCSdhY3V0ZTsnID0+ICJceEMyXHhCNCIsCgkJCQkJJ0FFbGlnJyA9PiAiXHhDM1x4ODYiLAoJCQkJCSdhZWxpZycgPT4gIlx4QzNceEE2IiwKCQkJCQknQUVsaWc7JyA9PiAiXHhDM1x4ODYiLAoJCQkJCSdhZWxpZzsnID0+ICJceEMzXHhBNiIsCgkJCQkJJ0FncmF2ZScgPT4gIlx4QzNceDgwIiwKCQkJCQknYWdyYXZlJyA9PiAiXHhDM1x4QTAiLAoJCQkJCSdBZ3JhdmU7JyA9PiAiXHhDM1x4ODAiLAoJCQkJCSdhZ3JhdmU7JyA9PiAiXHhDM1x4QTAiLAoJCQkJCSdhbGVmc3ltOycgPT4gIlx4RTJceDg0XHhCNSIsCgkJCQkJJ0FscGhhOycgPT4gIlx4Q0VceDkxIiwKCQkJCQknYWxwaGE7JyA9PiAiXHhDRVx4QjEiLAoJCQkJCSdBTVAnID0+ICJceDI2IiwKCQkJCQknYW1wJyA9PiAiXHgyNiIsCgkJCQkJJ0FNUDsnID0+ICJceDI2IiwKCQkJCQknYW1wOycgPT4gIlx4MjYiLAoJCQkJCSdhbmQ7JyA9PiAiXHhFMlx4ODhceEE3IiwKCQkJCQknYW5nOycgPT4gIlx4RTJceDg4XHhBMCIsCgkJCQkJJ2Fwb3M7JyA9PiAiXHgyNyIsCgkJCQkJJ0FyaW5nJyA9PiAiXHhDM1x4ODUiLAoJCQkJCSdhcmluZycgPT4gIlx4QzNceEE1IiwKCQkJCQknQXJpbmc7JyA9PiAiXHhDM1x4ODUiLAoJCQkJCSdhcmluZzsnID0+ICJceEMzXHhBNSIsCgkJCQkJJ2FzeW1wOycgPT4gIlx4RTJceDg5XHg4OCIsCgkJCQkJJ0F0aWxkZScgPT4gIlx4QzNceDgzIiwKCQkJCQknYXRpbGRlJyA9PiAiXHhDM1x4QTMiLAoJCQkJCSdBdGlsZGU7JyA9PiAiXHhDM1x4ODMiLAoJCQkJCSdhdGlsZGU7JyA9PiAiXHhDM1x4QTMiLAoJCQkJCSdBdW1sJyA9PiAiXHhDM1x4ODQiLAoJCQkJCSdhdW1sJyA9PiAiXHhDM1x4QTQiLAoJCQkJCSdBdW1sOycgPT4gIlx4QzNceDg0IiwKCQkJCQknYXVtbDsnID0+ICJceEMzXHhBNCIsCgkJCQkJJ2JkcXVvOycgPT4gIlx4RTJceDgwXHg5RSIsCgkJCQkJJ0JldGE7JyA9PiAiXHhDRVx4OTIiLAoJCQkJCSdiZXRhOycgPT4gIlx4Q0VceEIyIiwKCQkJCQknYnJ2YmFyJyA9PiAiXHhDMlx4QTYiLAoJCQkJCSdicnZiYXI7JyA9PiAiXHhDMlx4QTYiLAoJCQkJCSdidWxsOycgPT4gIlx4RTJceDgwXHhBMiIsCgkJCQkJJ2NhcDsnID0+ICJceEUyXHg4OFx4QTkiLAoJCQkJCSdDY2VkaWwnID0+ICJceEMzXHg4NyIsCgkJCQkJJ2NjZWRpbCcgPT4gIlx4QzNceEE3IiwKCQkJCQknQ2NlZGlsOycgPT4gIlx4QzNceDg3IiwKCQkJCQknY2NlZGlsOycgPT4gIlx4QzNceEE3IiwKCQkJCQknY2VkaWwnID0+ICJceEMyXHhCOCIsCgkJCQkJJ2NlZGlsOycgPT4gIlx4QzJceEI4IiwKCQkJCQknY2VudCcgPT4gIlx4QzJceEEyIiwKCQkJCQknY2VudDsnID0+ICJceEMyXHhBMiIsCgkJCQkJJ0NoaTsnID0+ICJceENFXHhBNyIsCgkJCQkJJ2NoaTsnID0+ICJceENGXHg4NyIsCgkJCQkJJ2NpcmM7JyA9PiAiXHhDQlx4ODYiLAoJCQkJCSdjbHViczsnID0+ICJceEUyXHg5OVx4QTMiLAoJCQkJCSdjb25nOycgPT4gIlx4RTJceDg5XHg4NSIsCgkJCQkJJ0NPUFknID0+ICJceEMyXHhBOSIsCgkJCQkJJ2NvcHknID0+ICJceEMyXHhBOSIsCgkJCQkJJ0NPUFk7JyA9PiAiXHhDMlx4QTkiLAoJCQkJCSdjb3B5OycgPT4gIlx4QzJceEE5IiwKCQkJCQknY3JhcnI7JyA9PiAiXHhFMlx4ODZceEI1IiwKCQkJCQknY3VwOycgPT4gIlx4RTJceDg4XHhBQSIsCgkJCQkJJ2N1cnJlbicgPT4gIlx4QzJceEE0IiwKCQkJCQknY3VycmVuOycgPT4gIlx4QzJceEE0IiwKCQkJCQknRGFnZ2VyOycgPT4gIlx4RTJceDgwXHhBMSIsCgkJCQkJJ2RhZ2dlcjsnID0+ICJceEUyXHg4MFx4QTAiLAoJCQkJCSdkQXJyOycgPT4gIlx4RTJceDg3XHg5MyIsCgkJCQkJJ2RhcnI7JyA9PiAiXHhFMlx4ODZceDkzIiwKCQkJCQknZGVnJyA9PiAiXHhDMlx4QjAiLAoJCQkJCSdkZWc7JyA9PiAiXHhDMlx4QjAiLAoJCQkJCSdEZWx0YTsnID0+ICJceENFXHg5NCIsCgkJCQkJJ2RlbHRhOycgPT4gIlx4Q0VceEI0IiwKCQkJCQknZGlhbXM7JyA9PiAiXHhFMlx4OTlceEE2IiwKCQkJCQknZGl2aWRlJyA9PiAiXHhDM1x4QjciLAoJCQkJCSdkaXZpZGU7JyA9PiAiXHhDM1x4QjciLAoJCQkJCSdFYWN1dGUnID0+ICJceEMzXHg4OSIsCgkJCQkJJ2VhY3V0ZScgPT4gIlx4QzNceEE5IiwKCQkJCQknRWFjdXRlOycgPT4gIlx4QzNceDg5IiwKCQkJCQknZWFjdXRlOycgPT4gIlx4QzNceEE5IiwKCQkJCQknRWNpcmMnID0+ICJceEMzXHg4QSIsCgkJCQkJJ2VjaXJjJyA9PiAiXHhDM1x4QUEiLAoJCQkJCSdFY2lyYzsnID0+ICJceEMzXHg4QSIsCgkJCQkJJ2VjaXJjOycgPT4gIlx4QzNceEFBIiwKCQkJCQknRWdyYXZlJyA9PiAiXHhDM1x4ODgiLAoJCQkJCSdlZ3JhdmUnID0+ICJceEMzXHhBOCIsCgkJCQkJJ0VncmF2ZTsnID0+ICJceEMzXHg4OCIsCgkJCQkJJ2VncmF2ZTsnID0+ICJceEMzXHhBOCIsCgkJCQkJJ2VtcHR5OycgPT4gIlx4RTJceDg4XHg4NSIsCgkJCQkJJ2Vtc3A7JyA9PiAiXHhFMlx4ODBceDgzIiwKCQkJCQknZW5zcDsnID0+ICJceEUyXHg4MFx4ODIiLAoJCQkJCSdFcHNpbG9uOycgPT4gIlx4Q0VceDk1IiwKCQkJCQknZXBzaWxvbjsnID0+ICJceENFXHhCNSIsCgkJCQkJJ2VxdWl2OycgPT4gIlx4RTJceDg5XHhBMSIsCgkJCQkJJ0V0YTsnID0+ICJceENFXHg5NyIsCgkJCQkJJ2V0YTsnID0+ICJceENFXHhCNyIsCgkJCQkJJ0VUSCcgPT4gIlx4QzNceDkwIiwKCQkJCQknZXRoJyA9PiAiXHhDM1x4QjAiLAoJCQkJCSdFVEg7JyA9PiAiXHhDM1x4OTAiLAoJCQkJCSdldGg7JyA9PiAiXHhDM1x4QjAiLAoJCQkJCSdFdW1sJyA9PiAiXHhDM1x4OEIiLAoJCQkJCSdldW1sJyA9PiAiXHhDM1x4QUIiLAoJCQkJCSdFdW1sOycgPT4gIlx4QzNceDhCIiwKCQkJCQknZXVtbDsnID0+ICJceEMzXHhBQiIsCgkJCQkJJ2V1cm87JyA9PiAiXHhFMlx4ODJceEFDIiwKCQkJCQknZXhpc3Q7JyA9PiAiXHhFMlx4ODhceDgzIiwKCQkJCQknZm5vZjsnID0+ICJceEM2XHg5MiIsCgkJCQkJJ2ZvcmFsbDsnID0+ICJceEUyXHg4OFx4ODAiLAoJCQkJCSdmcmFjMTInID0+ICJceEMyXHhCRCIsCgkJCQkJJ2ZyYWMxMjsnID0+ICJceEMyXHhCRCIsCgkJCQkJJ2ZyYWMxNCcgPT4gIlx4QzJceEJDIiwKCQkJCQknZnJhYzE0OycgPT4gIlx4QzJceEJDIiwKCQkJCQknZnJhYzM0JyA9PiAiXHhDMlx4QkUiLAoJCQkJCSdmcmFjMzQ7JyA9PiAiXHhDMlx4QkUiLAoJCQkJCSdmcmFzbDsnID0+ICJceEUyXHg4MVx4ODQiLAoJCQkJCSdHYW1tYTsnID0+ICJceENFXHg5MyIsCgkJCQkJJ2dhbW1hOycgPT4gIlx4Q0VceEIzIiwKCQkJCQknZ2U7JyA9PiAiXHhFMlx4ODlceEE1IiwKCQkJCQknR1QnID0+ICJceDNFIiwKCQkJCQknZ3QnID0+ICJceDNFIiwKCQkJCQknR1Q7JyA9PiAiXHgzRSIsCgkJCQkJJ2d0OycgPT4gIlx4M0UiLAoJCQkJCSdoQXJyOycgPT4gIlx4RTJceDg3XHg5NCIsCgkJCQkJJ2hhcnI7JyA9PiAiXHhFMlx4ODZceDk0IiwKCQkJCQknaGVhcnRzOycgPT4gIlx4RTJceDk5XHhBNSIsCgkJCQkJJ2hlbGxpcDsnID0+ICJceEUyXHg4MFx4QTYiLAoJCQkJCSdJYWN1dGUnID0+ICJceEMzXHg4RCIsCgkJCQkJJ2lhY3V0ZScgPT4gIlx4QzNceEFEIiwKCQkJCQknSWFjdXRlOycgPT4gIlx4QzNceDhEIiwKCQkJCQknaWFjdXRlOycgPT4gIlx4QzNceEFEIiwKCQkJCQknSWNpcmMnID0+ICJceEMzXHg4RSIsCgkJCQkJJ2ljaXJjJyA9PiAiXHhDM1x4QUUiLAoJCQkJCSdJY2lyYzsnID0+ICJceEMzXHg4RSIsCgkJCQkJJ2ljaXJjOycgPT4gIlx4QzNceEFFIiwKCQkJCQknaWV4Y2wnID0+ICJceEMyXHhBMSIsCgkJCQkJJ2lleGNsOycgPT4gIlx4QzJceEExIiwKCQkJCQknSWdyYXZlJyA9PiAiXHhDM1x4OEMiLAoJCQkJCSdpZ3JhdmUnID0+ICJceEMzXHhBQyIsCgkJCQkJJ0lncmF2ZTsnID0+ICJceEMzXHg4QyIsCgkJCQkJJ2lncmF2ZTsnID0+ICJceEMzXHhBQyIsCgkJCQkJJ2ltYWdlOycgPT4gIlx4RTJceDg0XHg5MSIsCgkJCQkJJ2luZmluOycgPT4gIlx4RTJceDg4XHg5RSIsCgkJCQkJJ2ludDsnID0+ICJceEUyXHg4OFx4QUIiLAoJCQkJCSdJb3RhOycgPT4gIlx4Q0VceDk5IiwKCQkJCQknaW90YTsnID0+ICJceENFXHhCOSIsCgkJCQkJJ2lxdWVzdCcgPT4gIlx4QzJceEJGIiwKCQkJCQknaXF1ZXN0OycgPT4gIlx4QzJceEJGIiwKCQkJCQknaXNpbjsnID0+ICJceEUyXHg4OFx4ODgiLAoJCQkJCSdJdW1sJyA9PiAiXHhDM1x4OEYiLAoJCQkJCSdpdW1sJyA9PiAiXHhDM1x4QUYiLAoJCQkJCSdJdW1sOycgPT4gIlx4QzNceDhGIiwKCQkJCQknaXVtbDsnID0+ICJceEMzXHhBRiIsCgkJCQkJJ0thcHBhOycgPT4gIlx4Q0VceDlBIiwKCQkJCQkna2FwcGE7JyA9PiAiXHhDRVx4QkEiLAoJCQkJCSdMYW1iZGE7JyA9PiAiXHhDRVx4OUIiLAoJCQkJCSdsYW1iZGE7JyA9PiAiXHhDRVx4QkIiLAoJCQkJCSdsYW5nOycgPT4gIlx4RTNceDgwXHg4OCIsCgkJCQkJJ2xhcXVvJyA9PiAiXHhDMlx4QUIiLAoJCQkJCSdsYXF1bzsnID0+ICJceEMyXHhBQiIsCgkJCQkJJ2xBcnI7JyA9PiAiXHhFMlx4ODdceDkwIiwKCQkJCQknbGFycjsnID0+ICJceEUyXHg4Nlx4OTAiLAoJCQkJCSdsY2VpbDsnID0+ICJceEUyXHg4Q1x4ODgiLAoJCQkJCSdsZHF1bzsnID0+ICJceEUyXHg4MFx4OUMiLAoJCQkJCSdsZTsnID0+ICJceEUyXHg4OVx4QTQiLAoJCQkJCSdsZmxvb3I7JyA9PiAiXHhFMlx4OENceDhBIiwKCQkJCQknbG93YXN0OycgPT4gIlx4RTJceDg4XHg5NyIsCgkJCQkJJ2xvejsnID0+ICJceEUyXHg5N1x4OEEiLAoJCQkJCSdscm07JyA9PiAiXHhFMlx4ODBceDhFIiwKCQkJCQknbHNhcXVvOycgPT4gIlx4RTJceDgwXHhCOSIsCgkJCQkJJ2xzcXVvOycgPT4gIlx4RTJceDgwXHg5OCIsCgkJCQkJJ0xUJyA9PiAiXHgzQyIsCgkJCQkJJ2x0JyA9PiAiXHgzQyIsCgkJCQkJJ0xUOycgPT4gIlx4M0MiLAoJCQkJCSdsdDsnID0+ICJceDNDIiwKCQkJCQknbWFjcicgPT4gIlx4QzJceEFGIiwKCQkJCQknbWFjcjsnID0+ICJceEMyXHhBRiIsCgkJCQkJJ21kYXNoOycgPT4gIlx4RTJceDgwXHg5NCIsCgkJCQkJJ21pY3JvJyA9PiAiXHhDMlx4QjUiLAoJCQkJCSdtaWNybzsnID0+ICJceEMyXHhCNSIsCgkJCQkJJ21pZGRvdCcgPT4gIlx4QzJceEI3IiwKCQkJCQknbWlkZG90OycgPT4gIlx4QzJceEI3IiwKCQkJCQknbWludXM7JyA9PiAiXHhFMlx4ODhceDkyIiwKCQkJCQknTXU7JyA9PiAiXHhDRVx4OUMiLAoJCQkJCSdtdTsnID0+ICJceENFXHhCQyIsCgkJCQkJJ25hYmxhOycgPT4gIlx4RTJceDg4XHg4NyIsCgkJCQkJJ25ic3AnID0+ICJceEMyXHhBMCIsCgkJCQkJJ25ic3A7JyA9PiAiXHhDMlx4QTAiLAoJCQkJCSduZGFzaDsnID0+ICJceEUyXHg4MFx4OTMiLAoJCQkJCSduZTsnID0+ICJceEUyXHg4OVx4QTAiLAoJCQkJCSduaTsnID0+ICJceEUyXHg4OFx4OEIiLAoJCQkJCSdub3QnID0+ICJceEMyXHhBQyIsCgkJCQkJJ25vdDsnID0+ICJceEMyXHhBQyIsCgkJCQkJJ25vdGluOycgPT4gIlx4RTJceDg4XHg4OSIsCgkJCQkJJ25zdWI7JyA9PiAiXHhFMlx4OEFceDg0IiwKCQkJCQknTnRpbGRlJyA9PiAiXHhDM1x4OTEiLAoJCQkJCSdudGlsZGUnID0+ICJceEMzXHhCMSIsCgkJCQkJJ050aWxkZTsnID0+ICJceEMzXHg5MSIsCgkJCQkJJ250aWxkZTsnID0+ICJceEMzXHhCMSIsCgkJCQkJJ051OycgPT4gIlx4Q0VceDlEIiwKCQkJCQknbnU7JyA9PiAiXHhDRVx4QkQiLAoJCQkJCSdPYWN1dGUnID0+ICJceEMzXHg5MyIsCgkJCQkJJ29hY3V0ZScgPT4gIlx4QzNceEIzIiwKCQkJCQknT2FjdXRlOycgPT4gIlx4QzNceDkzIiwKCQkJCQknb2FjdXRlOycgPT4gIlx4QzNceEIzIiwKCQkJCQknT2NpcmMnID0+ICJceEMzXHg5NCIsCgkJCQkJJ29jaXJjJyA9PiAiXHhDM1x4QjQiLAoJCQkJCSdPY2lyYzsnID0+ICJceEMzXHg5NCIsCgkJCQkJJ29jaXJjOycgPT4gIlx4QzNceEI0IiwKCQkJCQknT0VsaWc7JyA9PiAiXHhDNVx4OTIiLAoJCQkJCSdvZWxpZzsnID0+ICJceEM1XHg5MyIsCgkJCQkJJ09ncmF2ZScgPT4gIlx4QzNceDkyIiwKCQkJCQknb2dyYXZlJyA9PiAiXHhDM1x4QjIiLAoJCQkJCSdPZ3JhdmU7JyA9PiAiXHhDM1x4OTIiLAoJCQkJCSdvZ3JhdmU7JyA9PiAiXHhDM1x4QjIiLAoJCQkJCSdvbGluZTsnID0+ICJceEUyXHg4MFx4QkUiLAoJCQkJCSdPbWVnYTsnID0+ICJceENFXHhBOSIsCgkJCQkJJ29tZWdhOycgPT4gIlx4Q0ZceDg5IiwKCQkJCQknT21pY3JvbjsnID0+ICJceENFXHg5RiIsCgkJCQkJJ29taWNyb247JyA9PiAiXHhDRVx4QkYiLAoJCQkJCSdvcGx1czsnID0+ICJceEUyXHg4QVx4OTUiLAoJCQkJCSdvcjsnID0+ICJceEUyXHg4OFx4QTgiLAoJCQkJCSdvcmRmJyA9PiAiXHhDMlx4QUEiLAoJCQkJCSdvcmRmOycgPT4gIlx4QzJceEFBIiwKCQkJCQknb3JkbScgPT4gIlx4QzJceEJBIiwKCQkJCQknb3JkbTsnID0+ICJceEMyXHhCQSIsCgkJCQkJJ09zbGFzaCcgPT4gIlx4QzNceDk4IiwKCQkJCQknb3NsYXNoJyA9PiAiXHhDM1x4QjgiLAoJCQkJCSdPc2xhc2g7JyA9PiAiXHhDM1x4OTgiLAoJCQkJCSdvc2xhc2g7JyA9PiAiXHhDM1x4QjgiLAoJCQkJCSdPdGlsZGUnID0+ICJceEMzXHg5NSIsCgkJCQkJJ290aWxkZScgPT4gIlx4QzNceEI1IiwKCQkJCQknT3RpbGRlOycgPT4gIlx4QzNceDk1IiwKCQkJCQknb3RpbGRlOycgPT4gIlx4QzNceEI1IiwKCQkJCQknb3RpbWVzOycgPT4gIlx4RTJceDhBXHg5NyIsCgkJCQkJJ091bWwnID0+ICJceEMzXHg5NiIsCgkJCQkJJ291bWwnID0+ICJceEMzXHhCNiIsCgkJCQkJJ091bWw7JyA9PiAiXHhDM1x4OTYiLAoJCQkJCSdvdW1sOycgPT4gIlx4QzNceEI2IiwKCQkJCQkncGFyYScgPT4gIlx4QzJceEI2IiwKCQkJCQkncGFyYTsnID0+ICJceEMyXHhCNiIsCgkJCQkJJ3BhcnQ7JyA9PiAiXHhFMlx4ODhceDgyIiwKCQkJCQkncGVybWlsOycgPT4gIlx4RTJceDgwXHhCMCIsCgkJCQkJJ3BlcnA7JyA9PiAiXHhFMlx4OEFceEE1IiwKCQkJCQknUGhpOycgPT4gIlx4Q0VceEE2IiwKCQkJCQkncGhpOycgPT4gIlx4Q0ZceDg2IiwKCQkJCQknUGk7JyA9PiAiXHhDRVx4QTAiLAoJCQkJCSdwaTsnID0+ICJceENGXHg4MCIsCgkJCQkJJ3BpdjsnID0+ICJceENGXHg5NiIsCgkJCQkJJ3BsdXNtbicgPT4gIlx4QzJceEIxIiwKCQkJCQkncGx1c21uOycgPT4gIlx4QzJceEIxIiwKCQkJCQkncG91bmQnID0+ICJceEMyXHhBMyIsCgkJCQkJJ3BvdW5kOycgPT4gIlx4QzJceEEzIiwKCQkJCQknUHJpbWU7JyA9PiAiXHhFMlx4ODBceEIzIiwKCQkJCQkncHJpbWU7JyA9PiAiXHhFMlx4ODBceEIyIiwKCQkJCQkncHJvZDsnID0+ICJceEUyXHg4OFx4OEYiLAoJCQkJCSdwcm9wOycgPT4gIlx4RTJceDg4XHg5RCIsCgkJCQkJJ1BzaTsnID0+ICJceENFXHhBOCIsCgkJCQkJJ3BzaTsnID0+ICJceENGXHg4OCIsCgkJCQkJJ1FVT1QnID0+ICJceDIyIiwKCQkJCQkncXVvdCcgPT4gIlx4MjIiLAoJCQkJCSdRVU9UOycgPT4gIlx4MjIiLAoJCQkJCSdxdW90OycgPT4gIlx4MjIiLAoJCQkJCSdyYWRpYzsnID0+ICJceEUyXHg4OFx4OUEiLAoJCQkJCSdyYW5nOycgPT4gIlx4RTNceDgwXHg4OSIsCgkJCQkJJ3JhcXVvJyA9PiAiXHhDMlx4QkIiLAoJCQkJCSdyYXF1bzsnID0+ICJceEMyXHhCQiIsCgkJCQkJJ3JBcnI7JyA9PiAiXHhFMlx4ODdceDkyIiwKCQkJCQkncmFycjsnID0+ICJceEUyXHg4Nlx4OTIiLAoJCQkJCSdyY2VpbDsnID0+ICJceEUyXHg4Q1x4ODkiLAoJCQkJCSdyZHF1bzsnID0+ICJceEUyXHg4MFx4OUQiLAoJCQkJCSdyZWFsOycgPT4gIlx4RTJceDg0XHg5QyIsCgkJCQkJJ1JFRycgPT4gIlx4QzJceEFFIiwKCQkJCQkncmVnJyA9PiAiXHhDMlx4QUUiLAoJCQkJCSdSRUc7JyA9PiAiXHhDMlx4QUUiLAoJCQkJCSdyZWc7JyA9PiAiXHhDMlx4QUUiLAoJCQkJCSdyZmxvb3I7JyA9PiAiXHhFMlx4OENceDhCIiwKCQkJCQknUmhvOycgPT4gIlx4Q0VceEExIiwKCQkJCQkncmhvOycgPT4gIlx4Q0ZceDgxIiwKCQkJCQkncmxtOycgPT4gIlx4RTJceDgwXHg4RiIsCgkJCQkJJ3JzYXF1bzsnID0+ICJceEUyXHg4MFx4QkEiLAoJCQkJCSdyc3F1bzsnID0+ICJceEUyXHg4MFx4OTkiLAoJCQkJCSdzYnF1bzsnID0+ICJceEUyXHg4MFx4OUEiLAoJCQkJCSdTY2Fyb247JyA9PiAiXHhDNVx4QTAiLAoJCQkJCSdzY2Fyb247JyA9PiAiXHhDNVx4QTEiLAoJCQkJCSdzZG90OycgPT4gIlx4RTJceDhCXHg4NSIsCgkJCQkJJ3NlY3QnID0+ICJceEMyXHhBNyIsCgkJCQkJJ3NlY3Q7JyA9PiAiXHhDMlx4QTciLAoJCQkJCSdzaHknID0+ICJceEMyXHhBRCIsCgkJCQkJJ3NoeTsnID0+ICJceEMyXHhBRCIsCgkJCQkJJ1NpZ21hOycgPT4gIlx4Q0VceEEzIiwKCQkJCQknc2lnbWE7JyA9PiAiXHhDRlx4ODMiLAoJCQkJCSdzaWdtYWY7JyA9PiAiXHhDRlx4ODIiLAoJCQkJCSdzaW07JyA9PiAiXHhFMlx4ODhceEJDIiwKCQkJCQknc3BhZGVzOycgPT4gIlx4RTJceDk5XHhBMCIsCgkJCQkJJ3N1YjsnID0+ICJceEUyXHg4QVx4ODIiLAoJCQkJCSdzdWJlOycgPT4gIlx4RTJceDhBXHg4NiIsCgkJCQkJJ3N1bTsnID0+ICJceEUyXHg4OFx4OTEiLAoJCQkJCSdzdXA7JyA9PiAiXHhFMlx4OEFceDgzIiwKCQkJCQknc3VwMScgPT4gIlx4QzJceEI5IiwKCQkJCQknc3VwMTsnID0+ICJceEMyXHhCOSIsCgkJCQkJJ3N1cDInID0+ICJceEMyXHhCMiIsCgkJCQkJJ3N1cDI7JyA9PiAiXHhDMlx4QjIiLAoJCQkJCSdzdXAzJyA9PiAiXHhDMlx4QjMiLAoJCQkJCSdzdXAzOycgPT4gIlx4QzJceEIzIiwKCQkJCQknc3VwZTsnID0+ICJceEUyXHg4QVx4ODciLAoJCQkJCSdzemxpZycgPT4gIlx4QzNceDlGIiwKCQkJCQknc3psaWc7JyA9PiAiXHhDM1x4OUYiLAoJCQkJCSdUYXU7JyA9PiAiXHhDRVx4QTQiLAoJCQkJCSd0YXU7JyA9PiAiXHhDRlx4ODQiLAoJCQkJCSd0aGVyZTQ7JyA9PiAiXHhFMlx4ODhceEI0IiwKCQkJCQknVGhldGE7JyA9PiAiXHhDRVx4OTgiLAoJCQkJCSd0aGV0YTsnID0+ICJceENFXHhCOCIsCgkJCQkJJ3RoZXRhc3ltOycgPT4gIlx4Q0ZceDkxIiwKCQkJCQkndGhpbnNwOycgPT4gIlx4RTJceDgwXHg4OSIsCgkJCQkJJ1RIT1JOJyA9PiAiXHhDM1x4OUUiLAoJCQkJCSd0aG9ybicgPT4gIlx4QzNceEJFIiwKCQkJCQknVEhPUk47JyA9PiAiXHhDM1x4OUUiLAoJCQkJCSd0aG9ybjsnID0+ICJceEMzXHhCRSIsCgkJCQkJJ3RpbGRlOycgPT4gIlx4Q0JceDlDIiwKCQkJCQkndGltZXMnID0+ICJceEMzXHg5NyIsCgkJCQkJJ3RpbWVzOycgPT4gIlx4QzNceDk3IiwKCQkJCQknVFJBREU7JyA9PiAiXHhFMlx4ODRceEEyIiwKCQkJCQkndHJhZGU7JyA9PiAiXHhFMlx4ODRceEEyIiwKCQkJCQknVWFjdXRlJyA9PiAiXHhDM1x4OUEiLAoJCQkJCSd1YWN1dGUnID0+ICJceEMzXHhCQSIsCgkJCQkJJ1VhY3V0ZTsnID0+ICJceEMzXHg5QSIsCgkJCQkJJ3VhY3V0ZTsnID0+ICJceEMzXHhCQSIsCgkJCQkJJ3VBcnI7JyA9PiAiXHhFMlx4ODdceDkxIiwKCQkJCQkndWFycjsnID0+ICJceEUyXHg4Nlx4OTEiLAoJCQkJCSdVY2lyYycgPT4gIlx4QzNceDlCIiwKCQkJCQkndWNpcmMnID0+ICJceEMzXHhCQiIsCgkJCQkJJ1VjaXJjOycgPT4gIlx4QzNceDlCIiwKCQkJCQkndWNpcmM7JyA9PiAiXHhDM1x4QkIiLAoJCQkJCSdVZ3JhdmUnID0+ICJceEMzXHg5OSIsCgkJCQkJJ3VncmF2ZScgPT4gIlx4QzNceEI5IiwKCQkJCQknVWdyYXZlOycgPT4gIlx4QzNceDk5IiwKCQkJCQkndWdyYXZlOycgPT4gIlx4QzNceEI5IiwKCQkJCQkndW1sJyA9PiAiXHhDMlx4QTgiLAoJCQkJCSd1bWw7JyA9PiAiXHhDMlx4QTgiLAoJCQkJCSd1cHNpaDsnID0+ICJceENGXHg5MiIsCgkJCQkJJ1Vwc2lsb247JyA9PiAiXHhDRVx4QTUiLAoJCQkJCSd1cHNpbG9uOycgPT4gIlx4Q0ZceDg1IiwKCQkJCQknVXVtbCcgPT4gIlx4QzNceDlDIiwKCQkJCQkndXVtbCcgPT4gIlx4QzNceEJDIiwKCQkJCQknVXVtbDsnID0+ICJceEMzXHg5QyIsCgkJCQkJJ3V1bWw7JyA9PiAiXHhDM1x4QkMiLAoJCQkJCSd3ZWllcnA7JyA9PiAiXHhFMlx4ODRceDk4IiwKCQkJCQknWGk7JyA9PiAiXHhDRVx4OUUiLAoJCQkJCSd4aTsnID0+ICJceENFXHhCRSIsCgkJCQkJJ1lhY3V0ZScgPT4gIlx4QzNceDlEIiwKCQkJCQkneWFjdXRlJyA9PiAiXHhDM1x4QkQiLAoJCQkJCSdZYWN1dGU7JyA9PiAiXHhDM1x4OUQiLAoJCQkJCSd5YWN1dGU7JyA9PiAiXHhDM1x4QkQiLAoJCQkJCSd5ZW4nID0+ICJceEMyXHhBNSIsCgkJCQkJJ3llbjsnID0+ICJceEMyXHhBNSIsCgkJCQkJJ3l1bWwnID0+ICJceEMzXHhCRiIsCgkJCQkJJ1l1bWw7JyA9PiAiXHhDNVx4QjgiLAoJCQkJCSd5dW1sOycgPT4gIlx4QzNceEJGIiwKCQkJCQknWmV0YTsnID0+ICJceENFXHg5NiIsCgkJCQkJJ3pldGE7JyA9PiAiXHhDRVx4QjYiLAoJCQkJCSd6d2o7JyA9PiAiXHhFMlx4ODBceDhEIiwKCQkJCQknenduajsnID0+ICJceEUyXHg4MFx4OEMiCgkJCQkpOwoKCQkJCWZvciAoJGkgPSAwLCAkbWF0Y2ggPSBudWxsOyAkaSA8IDkgJiYgJHRoaXMtPmNvbnN1bWUoKSAhPT0gZmFsc2U7ICRpKyspCgkJCQl7CgkJCQkJJGNvbnN1bWVkID0gc3Vic3RyKCR0aGlzLT5jb25zdW1lZCwgMSk7CgkJCQkJaWYgKGlzc2V0KCRlbnRpdGllc1skY29uc3VtZWRdKSkKCQkJCQl7CgkJCQkJCSRtYXRjaCA9ICRjb25zdW1lZDsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCRtYXRjaCAhPT0gbnVsbCkKCQkJCXsKIAkJCQkJJHRoaXMtPmRhdGEgPSBzdWJzdHJfcmVwbGFjZSgkdGhpcy0+ZGF0YSwgJGVudGl0aWVzWyRtYXRjaF0sICR0aGlzLT5wb3NpdGlvbiAtIHN0cmxlbigkY29uc3VtZWQpIC0gMSwgc3RybGVuKCRtYXRjaCkgKyAxKTsKCQkJCQkkdGhpcy0+cG9zaXRpb24gKz0gc3RybGVuKCRlbnRpdGllc1skbWF0Y2hdKSAtIHN0cmxlbigkY29uc3VtZWQpIC0gMTsKCQkJCX0KCQkJCWJyZWFrOwoJCX0KCX0KfQoKLyoqCiAqIEhhbmRsZXMgZXZlcnl0aGluZyByZWxhdGVkIHRvIGVuY2xvc3VyZXMgKGluY2x1ZGluZyBNZWRpYSBSU1MgYW5kIGlUdW5lcyBSU1MpCiAqCiAqIFVzZWQgYnkge0BzZWUgU2ltcGxlUGllX0l0ZW06OmdldF9lbmNsb3N1cmUoKX0gYW5kIHtAc2VlIFNpbXBsZVBpZV9JdGVtOjpnZXRfZW5jbG9zdXJlcygpfQogKgogKiBUaGlzIGNsYXNzIGNhbiBiZSBvdmVybG9hZGVkIHdpdGgge0BzZWUgU2ltcGxlUGllOjpzZXRfZW5jbG9zdXJlX2NsYXNzKCl9CiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAc3VicGFja2FnZSBBUEkKICovCmNsYXNzIFNpbXBsZVBpZV9FbmNsb3N1cmUKewoJLyoqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfYml0cmF0ZSgpCgkgKi8KCXZhciAkYml0cmF0ZTsKCgkvKioKCSAqIEB2YXIgYXJyYXkKCSAqIEBzZWUgZ2V0X2NhcHRpb25zKCkKCSAqLwoJdmFyICRjYXB0aW9uczsKCgkvKioKCSAqIEB2YXIgYXJyYXkKCSAqIEBzZWUgZ2V0X2NhdGVnb3JpZXMoKQoJICovCgl2YXIgJGNhdGVnb3JpZXM7CgoJLyoqCgkgKiBAdmFyIGludAoJICogQHNlZSBnZXRfY2hhbm5lbHMoKQoJICovCgl2YXIgJGNoYW5uZWxzOwoKCS8qKgoJICogQHZhciBTaW1wbGVQaWVfQ29weXJpZ2h0CgkgKiBAc2VlIGdldF9jb3B5cmlnaHQoKQoJICovCgl2YXIgJGNvcHlyaWdodDsKCgkvKioKCSAqIEB2YXIgYXJyYXkKCSAqIEBzZWUgZ2V0X2NyZWRpdHMoKQoJICovCgl2YXIgJGNyZWRpdHM7CgoJLyoqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfZGVzY3JpcHRpb24oKQoJICovCgl2YXIgJGRlc2NyaXB0aW9uOwoKCS8qKgoJICogQHZhciBpbnQKCSAqIEBzZWUgZ2V0X2R1cmF0aW9uKCkKCSAqLwoJdmFyICRkdXJhdGlvbjsKCgkvKioKCSAqIEB2YXIgc3RyaW5nCgkgKiBAc2VlIGdldF9leHByZXNzaW9uKCkKCSAqLwoJdmFyICRleHByZXNzaW9uOwoKCS8qKgoJICogQHZhciBzdHJpbmcKCSAqIEBzZWUgZ2V0X2ZyYW1lcmF0ZSgpCgkgKi8KCXZhciAkZnJhbWVyYXRlOwoKCS8qKgoJICogQHZhciBzdHJpbmcKCSAqIEBzZWUgZ2V0X2hhbmRsZXIoKQoJICovCgl2YXIgJGhhbmRsZXI7CgoJLyoqCgkgKiBAdmFyIGFycmF5CgkgKiBAc2VlIGdldF9oYXNoZXMoKQoJICovCgl2YXIgJGhhc2hlczsKCgkvKioKCSAqIEB2YXIgc3RyaW5nCgkgKiBAc2VlIGdldF9oZWlnaHQoKQoJICovCgl2YXIgJGhlaWdodDsKCgkvKioKCSAqIEBkZXByZWNhdGVkCgkgKiBAdmFyIG51bGwKCSAqLwoJdmFyICRqYXZhc2NyaXB0OwoKCS8qKgoJICogQHZhciBhcnJheQoJICogQHNlZSBnZXRfa2V5d29yZHMoKQoJICovCgl2YXIgJGtleXdvcmRzOwoKCS8qKgoJICogQHZhciBzdHJpbmcKCSAqIEBzZWUgZ2V0X2xhbmd1YWdlKCkKCSAqLwoJdmFyICRsYW5nOwoKCS8qKgoJICogQHZhciBzdHJpbmcKCSAqIEBzZWUgZ2V0X2xlbmd0aCgpCgkgKi8KCXZhciAkbGVuZ3RoOwoKCS8qKgoJICogQHZhciBzdHJpbmcKCSAqIEBzZWUgZ2V0X2xpbmsoKQoJICovCgl2YXIgJGxpbms7CgoJLyoqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfbWVkaXVtKCkKCSAqLwoJdmFyICRtZWRpdW07CgoJLyoqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfcGxheWVyKCkKCSAqLwoJdmFyICRwbGF5ZXI7CgoJLyoqCgkgKiBAdmFyIGFycmF5CgkgKiBAc2VlIGdldF9yYXRpbmdzKCkKCSAqLwoJdmFyICRyYXRpbmdzOwoKCS8qKgoJICogQHZhciBhcnJheQoJICogQHNlZSBnZXRfcmVzdHJpY3Rpb25zKCkKCSAqLwoJdmFyICRyZXN0cmljdGlvbnM7CgoJLyoqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfc2FtcGxpbmdfcmF0ZSgpCgkgKi8KCXZhciAkc2FtcGxpbmdyYXRlOwoKCS8qKgoJICogQHZhciBhcnJheQoJICogQHNlZSBnZXRfdGh1bWJuYWlscygpCgkgKi8KCXZhciAkdGh1bWJuYWlsczsKCgkvKioKCSAqIEB2YXIgc3RyaW5nCgkgKiBAc2VlIGdldF90aXRsZSgpCgkgKi8KCXZhciAkdGl0bGU7CgoJLyoqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfdHlwZSgpCgkgKi8KCXZhciAkdHlwZTsKCgkvKioKCSAqIEB2YXIgc3RyaW5nCgkgKiBAc2VlIGdldF93aWR0aCgpCgkgKi8KCXZhciAkd2lkdGg7CgoJLyoqCgkgKiBDb25zdHJ1Y3RvciwgdXNlZCB0byBpbnB1dCB0aGUgZGF0YQoJICoKCSAqIEZvciBkb2N1bWVudGF0aW9uIG9uIGFsbCB0aGUgcGFyYW1ldGVycywgc2VlIHRoZSBjb3JyZXNwb25kaW5nCgkgKiBwcm9wZXJ0aWVzIGFuZCB0aGVpciBhY2Nlc3NvcnMKCSAqCgkgKiBAdXNlcyBpZG5hX2NvbnZlcnQgSWYgYXZhaWxhYmxlLCB0aGlzIHdpbGwgY29udmVydCBhbiBJRE4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRsaW5rID0gbnVsbCwgJHR5cGUgPSBudWxsLCAkbGVuZ3RoID0gbnVsbCwgJGphdmFzY3JpcHQgPSBudWxsLCAkYml0cmF0ZSA9IG51bGwsICRjYXB0aW9ucyA9IG51bGwsICRjYXRlZ29yaWVzID0gbnVsbCwgJGNoYW5uZWxzID0gbnVsbCwgJGNvcHlyaWdodCA9IG51bGwsICRjcmVkaXRzID0gbnVsbCwgJGRlc2NyaXB0aW9uID0gbnVsbCwgJGR1cmF0aW9uID0gbnVsbCwgJGV4cHJlc3Npb24gPSBudWxsLCAkZnJhbWVyYXRlID0gbnVsbCwgJGhhc2hlcyA9IG51bGwsICRoZWlnaHQgPSBudWxsLCAka2V5d29yZHMgPSBudWxsLCAkbGFuZyA9IG51bGwsICRtZWRpdW0gPSBudWxsLCAkcGxheWVyID0gbnVsbCwgJHJhdGluZ3MgPSBudWxsLCAkcmVzdHJpY3Rpb25zID0gbnVsbCwgJHNhbXBsaW5ncmF0ZSA9IG51bGwsICR0aHVtYm5haWxzID0gbnVsbCwgJHRpdGxlID0gbnVsbCwgJHdpZHRoID0gbnVsbCkKCXsKCQkkdGhpcy0+Yml0cmF0ZSA9ICRiaXRyYXRlOwoJCSR0aGlzLT5jYXB0aW9ucyA9ICRjYXB0aW9uczsKCQkkdGhpcy0+Y2F0ZWdvcmllcyA9ICRjYXRlZ29yaWVzOwoJCSR0aGlzLT5jaGFubmVscyA9ICRjaGFubmVsczsKCQkkdGhpcy0+Y29weXJpZ2h0ID0gJGNvcHlyaWdodDsKCQkkdGhpcy0+Y3JlZGl0cyA9ICRjcmVkaXRzOwoJCSR0aGlzLT5kZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbjsKCQkkdGhpcy0+ZHVyYXRpb24gPSAkZHVyYXRpb247CgkJJHRoaXMtPmV4cHJlc3Npb24gPSAkZXhwcmVzc2lvbjsKCQkkdGhpcy0+ZnJhbWVyYXRlID0gJGZyYW1lcmF0ZTsKCQkkdGhpcy0+aGFzaGVzID0gJGhhc2hlczsKCQkkdGhpcy0+aGVpZ2h0ID0gJGhlaWdodDsKCQkkdGhpcy0+a2V5d29yZHMgPSAka2V5d29yZHM7CgkJJHRoaXMtPmxhbmcgPSAkbGFuZzsKCQkkdGhpcy0+bGVuZ3RoID0gJGxlbmd0aDsKCQkkdGhpcy0+bGluayA9ICRsaW5rOwoJCSR0aGlzLT5tZWRpdW0gPSAkbWVkaXVtOwoJCSR0aGlzLT5wbGF5ZXIgPSAkcGxheWVyOwoJCSR0aGlzLT5yYXRpbmdzID0gJHJhdGluZ3M7CgkJJHRoaXMtPnJlc3RyaWN0aW9ucyA9ICRyZXN0cmljdGlvbnM7CgkJJHRoaXMtPnNhbXBsaW5ncmF0ZSA9ICRzYW1wbGluZ3JhdGU7CgkJJHRoaXMtPnRodW1ibmFpbHMgPSAkdGh1bWJuYWlsczsKCQkkdGhpcy0+dGl0bGUgPSAkdGl0bGU7CgkJJHRoaXMtPnR5cGUgPSAkdHlwZTsKCQkkdGhpcy0+d2lkdGggPSAkd2lkdGg7CgoJCWlmIChjbGFzc19leGlzdHMoJ2lkbmFfY29udmVydCcpKQoJCXsKCQkJJGlkbiA9IG5ldyBpZG5hX2NvbnZlcnQoKTsKCQkJJHBhcnNlZCA9IFNpbXBsZVBpZV9NaXNjOjpwYXJzZV91cmwoJGxpbmspOwoJCQkkdGhpcy0+bGluayA9IFNpbXBsZVBpZV9NaXNjOjpjb21wcmVzc19wYXJzZV91cmwoJHBhcnNlZFsnc2NoZW1lJ10sICRpZG4tPmVuY29kZSgkcGFyc2VkWydhdXRob3JpdHknXSksICRwYXJzZWRbJ3BhdGgnXSwgJHBhcnNlZFsncXVlcnknXSwgJHBhcnNlZFsnZnJhZ21lbnQnXSk7CgkJfQoJCSR0aGlzLT5oYW5kbGVyID0gJHRoaXMtPmdldF9oYW5kbGVyKCk7IC8vIE5lZWRzIHRvIGxvYWQgbGFzdAoJfQoKCS8qKgoJICogU3RyaW5nLWlmaWVkIHZlcnNpb24KCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCgl7CgkJLy8gVGhlcmUgaXMgbm8gJHRoaXMtPmRhdGEgaGVyZQoJCXJldHVybiBtZDUoc2VyaWFsaXplKCR0aGlzKSk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGJpdHJhdGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfYml0cmF0ZSgpCgl7CgkJaWYgKCR0aGlzLT5iaXRyYXRlICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5iaXRyYXRlOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYSBzaW5nbGUgY2FwdGlvbgoJICoKCSAqIEBwYXJhbSBpbnQgJGtleQoJICogQHJldHVybiBTaW1wbGVQaWVfQ2FwdGlvbnxudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfY2FwdGlvbigka2V5ID0gMCkKCXsKCQkkY2FwdGlvbnMgPSAkdGhpcy0+Z2V0X2NhcHRpb25zKCk7CgkJaWYgKGlzc2V0KCRjYXB0aW9uc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGNhcHRpb25zWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYWxsIGNhcHRpb25zCgkgKgoJICogQHJldHVybiBhcnJheXxudWxsIEFycmF5IG9mIHtAc2VlIFNpbXBsZVBpZV9DYXB0aW9ufSBvYmplY3RzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfY2FwdGlvbnMoKQoJewoJCWlmICgkdGhpcy0+Y2FwdGlvbnMgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmNhcHRpb25zOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYSBzaW5nbGUgY2F0ZWdvcnkKCSAqCgkgKiBAcGFyYW0gaW50ICRrZXkKCSAqIEByZXR1cm4gU2ltcGxlUGllX0NhdGVnb3J5fG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9jYXRlZ29yeSgka2V5ID0gMCkKCXsKCQkkY2F0ZWdvcmllcyA9ICR0aGlzLT5nZXRfY2F0ZWdvcmllcygpOwoJCWlmIChpc3NldCgkY2F0ZWdvcmllc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGNhdGVnb3JpZXNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCBhbGwgY2F0ZWdvcmllcwoJICoKCSAqIEByZXR1cm4gYXJyYXl8bnVsbCBBcnJheSBvZiB7QHNlZSBTaW1wbGVQaWVfQ2F0ZWdvcnl9IG9iamVjdHMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9jYXRlZ29yaWVzKCkKCXsKCQlpZiAoJHRoaXMtPmNhdGVnb3JpZXMgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmNhdGVnb3JpZXM7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCB0aGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzCgkgKgoJICogQHJldHVybiBpbnR8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2NoYW5uZWxzKCkKCXsKCQlpZiAoJHRoaXMtPmNoYW5uZWxzICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5jaGFubmVsczsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBjb3B5cmlnaHQgaW5mb3JtYXRpb24KCSAqCgkgKiBAcmV0dXJuIFNpbXBsZVBpZV9Db3B5cmlnaHR8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvcHlyaWdodCgpCgl7CgkJaWYgKCR0aGlzLT5jb3B5cmlnaHQgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmNvcHlyaWdodDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IGEgc2luZ2xlIGNyZWRpdAoJICoKCSAqIEBwYXJhbSBpbnQgJGtleQoJICogQHJldHVybiBTaW1wbGVQaWVfQ3JlZGl0fG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9jcmVkaXQoJGtleSA9IDApCgl7CgkJJGNyZWRpdHMgPSAkdGhpcy0+Z2V0X2NyZWRpdHMoKTsKCQlpZiAoaXNzZXQoJGNyZWRpdHNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRjcmVkaXRzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYWxsIGNyZWRpdHMKCSAqCgkgKiBAcmV0dXJuIGFycmF5fG51bGwgQXJyYXkgb2Yge0BzZWUgU2ltcGxlUGllX0NyZWRpdH0gb2JqZWN0cwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2NyZWRpdHMoKQoJewoJCWlmICgkdGhpcy0+Y3JlZGl0cyAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+Y3JlZGl0czsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZW5jbG9zdXJlCgkgKgoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2Rlc2NyaXB0aW9uKCkKCXsKCQlpZiAoJHRoaXMtPmRlc2NyaXB0aW9uICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5kZXNjcmlwdGlvbjsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgZW5jbG9zdXJlCgkgKgoJICogQHBhcmFtIHN0cmluZyAkY29udmVydCBDb252ZXJ0IHNlY29uZHMgaW50byBoaDptbTpzcwoJICogQHJldHVybiBzdHJpbmd8aW50fG51bGwgJ2hoOm1tOnNzJyBzdHJpbmcgaWYgYCRjb252ZXJ0YCB3YXMgc3BlY2lmaWVkLCBvdGhlcndpc2UgaW50ZWdlciAob3IgbnVsbCBpZiBub25lIGZvdW5kKQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2R1cmF0aW9uKCRjb252ZXJ0ID0gZmFsc2UpCgl7CgkJaWYgKCR0aGlzLT5kdXJhdGlvbiAhPT0gbnVsbCkKCQl7CgkJCWlmICgkY29udmVydCkKCQkJewoJCQkJJHRpbWUgPSBTaW1wbGVQaWVfTWlzYzo6dGltZV9obXMoJHRoaXMtPmR1cmF0aW9uKTsKCQkJCXJldHVybiAkdGltZTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+ZHVyYXRpb247CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBleHByZXNzaW9uCgkgKgoJICogQHJldHVybiBzdHJpbmcgUHJvYmFibHkgb25lIG9mICdzYW1wbGUnLCAnZnVsbCcsICdub25zdG9wJywgJ2NsaXAnLiBEZWZhdWx0cyB0byAnZnVsbCcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9leHByZXNzaW9uKCkKCXsKCQlpZiAoJHRoaXMtPmV4cHJlc3Npb24gIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmV4cHJlc3Npb247CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAnZnVsbCc7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBmaWxlIGV4dGVuc2lvbgoJICoKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9leHRlbnNpb24oKQoJewoJCWlmICgkdGhpcy0+bGluayAhPT0gbnVsbCkKCQl7CgkJCSR1cmwgPSBTaW1wbGVQaWVfTWlzYzo6cGFyc2VfdXJsKCR0aGlzLT5saW5rKTsKCQkJaWYgKCR1cmxbJ3BhdGgnXSAhPT0gJycpCgkJCXsKCQkJCXJldHVybiBwYXRoaW5mbygkdXJsWydwYXRoJ10sIFBBVEhJTkZPX0VYVEVOU0lPTik7CgkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGZyYW1lcmF0ZSAoaW4gZnJhbWVzLXBlci1zZWNvbmQpCgkgKgoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZyYW1lcmF0ZSgpCgl7CgkJaWYgKCR0aGlzLT5mcmFtZXJhdGUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmZyYW1lcmF0ZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBwcmVmZXJyZWQgaGFuZGxlcgoJICoKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwgT25lIG9mICdmbGFzaCcsICdmbWVkaWEnLCAncXVpY2t0aW1lJywgJ3dtZWRpYScsICdtcDMnCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfaGFuZGxlcigpCgl7CgkJcmV0dXJuICR0aGlzLT5nZXRfcmVhbF90eXBlKHRydWUpOwoJfQoKCS8qKgoJICogR2V0IGEgc2luZ2xlIGhhc2gKCSAqCgkgKiBAbGluayBodHRwOi8vd3d3LnJzc2JvYXJkLm9yZy9tZWRpYS1yc3MjbWVkaWEtaGFzaAoJICogQHBhcmFtIGludCAka2V5CgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsIEhhc2ggYXMgcGVyIGBtZWRpYTpoYXNoYCwgcHJlZml4ZWQgd2l0aCAiJGFsZ286IgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2hhc2goJGtleSA9IDApCgl7CgkJJGhhc2hlcyA9ICR0aGlzLT5nZXRfaGFzaGVzKCk7CgkJaWYgKGlzc2V0KCRoYXNoZXNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRoYXNoZXNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCBhbGwgY3JlZGl0cwoJICoKCSAqIEByZXR1cm4gYXJyYXl8bnVsbCBBcnJheSBvZiBzdHJpbmdzLCBzZWUge0BzZWUgZ2V0X2hhc2goKX0KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9oYXNoZXMoKQoJewoJCWlmICgkdGhpcy0+aGFzaGVzICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5oYXNoZXM7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCB0aGUgaGVpZ2h0CgkgKgoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2hlaWdodCgpCgl7CgkJaWYgKCR0aGlzLT5oZWlnaHQgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmhlaWdodDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBsYW5ndWFnZQoJICoKCSAqIEBsaW5rIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzMwNjYKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwgTGFuZ3VhZ2UgY29kZSBhcyBwZXIgUkZDIDMwNjYKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9sYW5ndWFnZSgpCgl7CgkJaWYgKCR0aGlzLT5sYW5nICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5sYW5nOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYSBzaW5nbGUga2V5d29yZAoJICoKCSAqIEBwYXJhbSBpbnQgJGtleQoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2tleXdvcmQoJGtleSA9IDApCgl7CgkJJGtleXdvcmRzID0gJHRoaXMtPmdldF9rZXl3b3JkcygpOwoJCWlmIChpc3NldCgka2V5d29yZHNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRrZXl3b3Jkc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IGFsbCBrZXl3b3JkcwoJICoKCSAqIEByZXR1cm4gYXJyYXl8bnVsbCBBcnJheSBvZiBzdHJpbmdzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfa2V5d29yZHMoKQoJewoJCWlmICgkdGhpcy0+a2V5d29yZHMgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmtleXdvcmRzOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgbGVuZ3RoCgkgKgoJICogQHJldHVybiBmbG9hdCBMZW5ndGggaW4gYnl0ZXMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9sZW5ndGgoKQoJewoJCWlmICgkdGhpcy0+bGVuZ3RoICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5sZW5ndGg7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCB0aGUgVVJMCgkgKgoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2xpbmsoKQoJewoJCWlmICgkdGhpcy0+bGluayAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiB1cmxkZWNvZGUoJHRoaXMtPmxpbmspOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIG1lZGl1bQoJICoKCSAqIEBsaW5rIGh0dHA6Ly93d3cucnNzYm9hcmQub3JnL21lZGlhLXJzcyNtZWRpYS1jb250ZW50CgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsIFNob3VsZCBiZSBvbmUgb2YgJ2ltYWdlJywgJ2F1ZGlvJywgJ3ZpZGVvJywgJ2RvY3VtZW50JywgJ2V4ZWN1dGFibGUnCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbWVkaXVtKCkKCXsKCQlpZiAoJHRoaXMtPm1lZGl1bSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+bWVkaXVtOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHBsYXllciBVUkwKCSAqCgkgKiBUeXBpY2FsbHkgdGhlIHNhbWUgYXMge0BzZWUgZ2V0X3Blcm1hbGluaygpfQoJICogQHJldHVybiBzdHJpbmd8bnVsbCBQbGF5ZXIgVVJMCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfcGxheWVyKCkKCXsKCQlpZiAoJHRoaXMtPnBsYXllciAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+cGxheWVyOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYSBzaW5nbGUgcmF0aW5nCgkgKgoJICogQHBhcmFtIGludCAka2V5CgkgKiBAcmV0dXJuIFNpbXBsZVBpZV9SYXRpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3JhdGluZygka2V5ID0gMCkKCXsKCQkkcmF0aW5ncyA9ICR0aGlzLT5nZXRfcmF0aW5ncygpOwoJCWlmIChpc3NldCgkcmF0aW5nc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJHJhdGluZ3NbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCBhbGwgcmF0aW5ncwoJICoKCSAqIEByZXR1cm4gYXJyYXl8bnVsbCBBcnJheSBvZiB7QHNlZSBTaW1wbGVQaWVfUmF0aW5nfSBvYmplY3RzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfcmF0aW5ncygpCgl7CgkJaWYgKCR0aGlzLT5yYXRpbmdzICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5yYXRpbmdzOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYSBzaW5nbGUgcmVzdHJpY3Rpb24KCSAqCgkgKiBAcGFyYW0gaW50ICRrZXkKCSAqIEByZXR1cm4gU2ltcGxlUGllX1Jlc3RyaWN0aW9ufG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9yZXN0cmljdGlvbigka2V5ID0gMCkKCXsKCQkkcmVzdHJpY3Rpb25zID0gJHRoaXMtPmdldF9yZXN0cmljdGlvbnMoKTsKCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJHJlc3RyaWN0aW9uc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IGFsbCByZXN0cmljdGlvbnMKCSAqCgkgKiBAcmV0dXJuIGFycmF5fG51bGwgQXJyYXkgb2Yge0BzZWUgU2ltcGxlUGllX1Jlc3RyaWN0aW9ufSBvYmplY3RzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfcmVzdHJpY3Rpb25zKCkKCXsKCQlpZiAoJHRoaXMtPnJlc3RyaWN0aW9ucyAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+cmVzdHJpY3Rpb25zOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHNhbXBsaW5nIHJhdGUgKGluIGtIeikKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfc2FtcGxpbmdfcmF0ZSgpCgl7CgkJaWYgKCR0aGlzLT5zYW1wbGluZ3JhdGUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbXBsaW5ncmF0ZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBmaWxlIHNpemUgKGluIE1pQikKCSAqCgkgKiBAcmV0dXJuIGZsb2F0fG51bGwgRmlsZSBzaXplIGluIG1lYmlieXRlcyAoMTA0OCBieXRlcykKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9zaXplKCkKCXsKCQkkbGVuZ3RoID0gJHRoaXMtPmdldF9sZW5ndGgoKTsKCQlpZiAoJGxlbmd0aCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiByb3VuZCgkbGVuZ3RoLzEwNDg1NzYsIDIpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYSBzaW5nbGUgdGh1bWJuYWlsCgkgKgoJICogQHBhcmFtIGludCAka2V5CgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsIFRodW1ibmFpbCBVUkwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF90aHVtYm5haWwoJGtleSA9IDApCgl7CgkJJHRodW1ibmFpbHMgPSAkdGhpcy0+Z2V0X3RodW1ibmFpbHMoKTsKCQlpZiAoaXNzZXQoJHRodW1ibmFpbHNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICR0aHVtYm5haWxzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYWxsIHRodW1ibmFpbHMKCSAqCgkgKiBAcmV0dXJuIGFycmF5fG51bGwgQXJyYXkgb2YgdGh1bWJuYWlsIFVSTHMKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF90aHVtYm5haWxzKCkKCXsKCQlpZiAoJHRoaXMtPnRodW1ibmFpbHMgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnRodW1ibmFpbHM7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCB0aGUgdGl0bGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfdGl0bGUoKQoJewoJCWlmICgkdGhpcy0+dGl0bGUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnRpdGxlOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgbWltZXR5cGUgb2YgdGhlIGVuY2xvc3VyZQoJICoKCSAqIEBzZWUgZ2V0X3JlYWxfdHlwZSgpCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsIE1JTUUgdHlwZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3R5cGUoKQoJewoJCWlmICgkdGhpcy0+dHlwZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+dHlwZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSB3aWR0aAoJICoKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF93aWR0aCgpCgl7CgkJaWYgKCR0aGlzLT53aWR0aCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+d2lkdGg7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEVtYmVkIHRoZSBlbmNsb3N1cmUgdXNpbmcgYDxlbWJlZD5gCgkgKgoJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHtAc2VlIGVtYmVkfSBpbnN0ZWFkCgkgKgoJICogQHBhcmFtIGFycmF5fHN0cmluZyAkb3B0aW9ucyBTZWUgZmlyc3QgcGFyYW10ZXIgdG8ge0BzZWUgZW1iZWR9CgkgKiBAcmV0dXJuIHN0cmluZyBIVE1MIHN0cmluZyB0byBvdXRwdXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIG5hdGl2ZV9lbWJlZCgkb3B0aW9ucz0nJykKCXsKCQlyZXR1cm4gJHRoaXMtPmVtYmVkKCRvcHRpb25zLCB0cnVlKTsKCX0KCgkvKioKCSAqIEVtYmVkIHRoZSBlbmNsb3N1cmUgdXNpbmcgSmF2YXNjcmlwdAoJICoKCSAqIGAkb3B0aW9uc2AgaXMgYW4gYXJyYXkgb3IgY29tbWEtc2VwYXJhdGVkIGtleTp2YWx1ZSBzdHJpbmcsIHdpdGggdGhlCgkgKiBmb2xsb3dpbmcgcHJvcGVydGllczoKCSAqCgkgKiAtIGBhbHRgIChzdHJpbmcpOiBBbHRlcm5hdGUgY29udGVudCBmb3Igd2hlbiBhbiBlbmQtdXNlciBkb2VzIG5vdCBoYXZlCgkgKiAgICB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlciBpbnN0YWxsZWQgb3Igd2hlbiBhIGZpbGUgdHlwZSBpcwoJICogICAgdW5zdXBwb3J0ZWQuIENhbiBiZSBhbnkgdGV4dCBvciBIVE1MLiBEZWZhdWx0cyB0byBibGFuay4KCSAqIC0gYGFsdGNsYXNzYCAoc3RyaW5nKTogSWYgYSBmaWxlIHR5cGUgaXMgdW5zdXBwb3J0ZWQsIHRoZSBlbmQtdXNlciB3aWxsCgkgKiAgICBzZWUgdGhlIGFsdCB0ZXh0IChhYm92ZSkgbGlua2VkIGRpcmVjdGx5IHRvIHRoZSBjb250ZW50LiBUaGF0IGxpbmsKCSAqICAgIHdpbGwgaGF2ZSB0aGlzIHZhbHVlIGFzIGl0cyBjbGFzcyBuYW1lLiBEZWZhdWx0cyB0byBibGFuay4KCSAqIC0gYGF1ZGlvYCAoc3RyaW5nKTogVGhpcyBpcyBhbiBpbWFnZSB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGEKCSAqICAgIHBsYWNlaG9sZGVyIGZvciBhdWRpbyBmaWxlcyBiZWZvcmUgdGhleSdyZSBsb2FkZWQgKFF1aWNrVGltZS1vbmx5KS4KCSAqICAgIENhbiBiZSBhbnkgcmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMLiBEZWZhdWx0cyB0byBibGFuay4KCSAqIC0gYGJnY29sb3JgIChzdHJpbmcpOiBUaGUgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIG1lZGlhLCBpZiBub3QKCSAqICAgIGFscmVhZHkgdHJhbnNwYXJlbnQuIERlZmF1bHRzIHRvIGAjZmZmZmZmYC4KCSAqIC0gYGhlaWdodGAgKGludGVnZXIpOiBUaGUgaGVpZ2h0IG9mIHRoZSBlbWJlZGRlZCBtZWRpYS4gQWNjZXB0cyBhbnkKCSAqICAgIG51bWVyaWMgcGl4ZWwgdmFsdWUgKHN1Y2ggYXMgYDM2MGApIG9yIGBhdXRvYC4gRGVmYXVsdHMgdG8gYGF1dG9gLAoJICogICAgYW5kIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZSB0aGlzIGRlZmF1bHQuCgkgKiAtIGBsb29wYCAoYm9vbGVhbik6IERvIHlvdSB3YW50IHRoZSBtZWRpYSB0byBsb29wIHdoZW4gaXRzIGRvbmU/CgkgKiAgICBEZWZhdWx0cyB0byBgZmFsc2VgLgoJICogLSBgbWVkaWFwbGF5ZXJgIChzdHJpbmcpOiBUaGUgbG9jYXRpb24gb2YgdGhlIGluY2x1ZGVkCgkgKiAgICBgbWVkaWFwbGF5ZXIuc3dmYCBmaWxlLiBUaGlzIGFsbG93cyBmb3IgdGhlIHBsYXliYWNrIG9mIEZsYXNoIFZpZGVvCgkgKiAgICAoYC5mbHZgKSBmaWxlcywgYW5kIGlzIHRoZSBkZWZhdWx0IGhhbmRsZXIgZm9yIG5vbi1PZGVvIE1QMydzLgoJICogICAgRGVmYXVsdHMgdG8gYmxhbmsuCgkgKiAtIGB2aWRlb2AgKHN0cmluZyk6IFRoaXMgaXMgYW4gaW1hZ2UgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBhCgkgKiAgICBwbGFjZWhvbGRlciBmb3IgdmlkZW8gZmlsZXMgYmVmb3JlIHRoZXkncmUgbG9hZGVkIChRdWlja1RpbWUtb25seSkuCgkgKiAgICBDYW4gYmUgYW55IHJlbGF0aXZlIG9yIGFic29sdXRlIFVSTC4gRGVmYXVsdHMgdG8gYmxhbmsuCgkgKiAtIGB3aWR0aGAgKGludGVnZXIpOiBUaGUgd2lkdGggb2YgdGhlIGVtYmVkZGVkIG1lZGlhLiBBY2NlcHRzIGFueQoJICogICAgbnVtZXJpYyBwaXhlbCB2YWx1ZSAoc3VjaCBhcyBgNDgwYCkgb3IgYGF1dG9gLiBEZWZhdWx0cyB0byBgYXV0b2AsCgkgKiAgICBhbmQgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIHRoaXMgZGVmYXVsdC4KCSAqIC0gYHdpZGVzY3JlZW5gIChib29sZWFuKTogSXMgdGhlIGVuY2xvc3VyZSB3aWRlc2NyZWVuIG9yIHN0YW5kYXJkPwoJICogICAgVGhpcyBhcHBsaWVzIG9ubHkgdG8gdmlkZW8gZW5jbG9zdXJlcywgYW5kIHdpbGwgYXV0b21hdGljYWxseSByZXNpemUKCSAqICAgIHRoZSBjb250ZW50IGFwcHJvcHJpYXRlbHkuICBEZWZhdWx0cyB0byBgZmFsc2VgLCBpbXBseWluZyA0OjMgbW9kZS4KCSAqCgkgKiBOb3RlOiBOb24td2lkZXNjcmVlbiAoNDozKSBtb2RlIHdpdGggYHdpZHRoYCBhbmQgYGhlaWdodGAgc2V0IHRvIGBhdXRvYAoJICogd2lsbCBkZWZhdWx0IHRvIDQ4MHgzNjAgdmlkZW8gcmVzb2x1dGlvbi4gIFdpZGVzY3JlZW4gKDE2OjkpIG1vZGUgd2l0aAoJICogYHdpZHRoYCBhbmQgYGhlaWdodGAgc2V0IHRvIGBhdXRvYCB3aWxsIGRlZmF1bHQgdG8gNDgweDI3MCB2aWRlbyByZXNvbHV0aW9uLgoJICoKCSAqIEB0b2RvIElmIHRoZSBkaW1lbnNpb25zIGZvciBtZWRpYTpjb250ZW50IGFyZSBkZWZpbmVkLCB1c2UgdGhlbSB3aGVuIHdpZHRoL2hlaWdodCBhcmUgc2V0IHRvICdhdXRvJy4KCSAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJG9wdGlvbnMgQ29tbWEtc2VwYXJhdGVkIGtleTp2YWx1ZSBsaXN0LCBvciBhcnJheQoJICogQHBhcmFtIGJvb2wgJG5hdGl2ZSBVc2UgYDxlbWJlZD5gCgkgKiBAcmV0dXJuIHN0cmluZyBIVE1MIHN0cmluZyB0byBvdXRwdXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGVtYmVkKCRvcHRpb25zID0gJycsICRuYXRpdmUgPSBmYWxzZSkKCXsKCQkvLyBTZXQgdXAgZGVmYXVsdHMKCQkkYXVkaW8gPSAnJzsKCQkkdmlkZW8gPSAnJzsKCQkkYWx0ID0gJyc7CgkJJGFsdGNsYXNzID0gJyc7CgkJJGxvb3AgPSAnZmFsc2UnOwoJCSR3aWR0aCA9ICdhdXRvJzsKCQkkaGVpZ2h0ID0gJ2F1dG8nOwoJCSRiZ2NvbG9yID0gJyNmZmZmZmYnOwoJCSRtZWRpYXBsYXllciA9ICcnOwoJCSR3aWRlc2NyZWVuID0gZmFsc2U7CgkJJGhhbmRsZXIgPSAkdGhpcy0+Z2V0X2hhbmRsZXIoKTsKCQkkdHlwZSA9ICR0aGlzLT5nZXRfcmVhbF90eXBlKCk7CgoJCS8vIFByb2Nlc3Mgb3B0aW9ucyBhbmQgcmVhc3NpZ24gdmFsdWVzIGFzIG5lY2Vzc2FyeQoJCWlmIChpc19hcnJheSgkb3B0aW9ucykpCgkJewoJCQlleHRyYWN0KCRvcHRpb25zKTsKCQl9CgkJZWxzZQoJCXsKCQkJJG9wdGlvbnMgPSBleHBsb2RlKCcsJywgJG9wdGlvbnMpOwoJCQlmb3JlYWNoKCRvcHRpb25zIGFzICRvcHRpb24pCgkJCXsKCQkJCSRvcHQgPSBleHBsb2RlKCc6JywgJG9wdGlvbiwgMik7CgkJCQlpZiAoaXNzZXQoJG9wdFswXSwgJG9wdFsxXSkpCgkJCQl7CgkJCQkJJG9wdFswXSA9IHRyaW0oJG9wdFswXSk7CgkJCQkJJG9wdFsxXSA9IHRyaW0oJG9wdFsxXSk7CgkJCQkJc3dpdGNoICgkb3B0WzBdKQoJCQkJCXsKCQkJCQkJY2FzZSAnYXVkaW8nOgoJCQkJCQkJJGF1ZGlvID0gJG9wdFsxXTsKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAndmlkZW8nOgoJCQkJCQkJJHZpZGVvID0gJG9wdFsxXTsKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnYWx0JzoKCQkJCQkJCSRhbHQgPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdhbHRjbGFzcyc6CgkJCQkJCQkkYWx0Y2xhc3MgPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdsb29wJzoKCQkJCQkJCSRsb29wID0gJG9wdFsxXTsKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnd2lkdGgnOgoJCQkJCQkJJHdpZHRoID0gJG9wdFsxXTsKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnaGVpZ2h0JzoKCQkJCQkJCSRoZWlnaHQgPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdiZ2NvbG9yJzoKCQkJCQkJCSRiZ2NvbG9yID0gJG9wdFsxXTsKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnbWVkaWFwbGF5ZXInOgoJCQkJCQkJJG1lZGlhcGxheWVyID0gJG9wdFsxXTsKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnd2lkZXNjcmVlbic6CgkJCQkJCQkkd2lkZXNjcmVlbiA9ICRvcHRbMV07CgkJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCSRtaW1lID0gZXhwbG9kZSgnLycsICR0eXBlLCAyKTsKCQkkbWltZSA9ICRtaW1lWzBdOwoKCQkvLyBQcm9jZXNzIHZhbHVlcyBmb3IgJ2F1dG8nCgkJaWYgKCR3aWR0aCA9PT0gJ2F1dG8nKQoJCXsKCQkJaWYgKCRtaW1lID09PSAndmlkZW8nKQoJCQl7CgkJCQlpZiAoJGhlaWdodCA9PT0gJ2F1dG8nKQoJCQkJewoJCQkJCSR3aWR0aCA9IDQ4MDsKCQkJCX0KCQkJCWVsc2VpZiAoJHdpZGVzY3JlZW4pCgkJCQl7CgkJCQkJJHdpZHRoID0gcm91bmQoKGludHZhbCgkaGVpZ2h0KS85KSoxNik7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJHdpZHRoID0gcm91bmQoKGludHZhbCgkaGVpZ2h0KS8zKSo0KTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR3aWR0aCA9ICcxMDAlJzsKCQkJfQoJCX0KCgkJaWYgKCRoZWlnaHQgPT09ICdhdXRvJykKCQl7CgkJCWlmICgkbWltZSA9PT0gJ2F1ZGlvJykKCQkJewoJCQkJJGhlaWdodCA9IDA7CgkJCX0KCQkJZWxzZWlmICgkbWltZSA9PT0gJ3ZpZGVvJykKCQkJewoJCQkJaWYgKCR3aWR0aCA9PT0gJ2F1dG8nKQoJCQkJewoJCQkJCWlmICgkd2lkZXNjcmVlbikKCQkJCQl7CgkJCQkJCSRoZWlnaHQgPSAyNzA7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSRoZWlnaHQgPSAzNjA7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZWlmICgkd2lkZXNjcmVlbikKCQkJCXsKCQkJCQkkaGVpZ2h0ID0gcm91bmQoKGludHZhbCgkd2lkdGgpLzE2KSo5KTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkaGVpZ2h0ID0gcm91bmQoKGludHZhbCgkd2lkdGgpLzQpKjMpOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJGhlaWdodCA9IDM3NjsKCQkJfQoJCX0KCQllbHNlaWYgKCRtaW1lID09PSAnYXVkaW8nKQoJCXsKCQkJJGhlaWdodCA9IDA7CgkJfQoKCQkvLyBTZXQgcHJvcGVyIHBsYWNlaG9sZGVyIHZhbHVlCgkJaWYgKCRtaW1lID09PSAnYXVkaW8nKQoJCXsKCQkJJHBsYWNlaG9sZGVyID0gJGF1ZGlvOwoJCX0KCQllbHNlaWYgKCRtaW1lID09PSAndmlkZW8nKQoJCXsKCQkJJHBsYWNlaG9sZGVyID0gJHZpZGVvOwoJCX0KCgkJJGVtYmVkID0gJyc7CgoJCS8vIEZsYXNoCgkJaWYgKCRoYW5kbGVyID09PSAnZmxhc2gnKQoJCXsKCQkJaWYgKCRuYXRpdmUpCgkJCXsKCQkJCSRlbWJlZCAuPSAiPGVtYmVkIHNyYz1cIiIgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICJcIiBwbHVnaW5zcGFnZT1cImh0dHA6Ly9hZG9iZS5jb20vZ28vZ2V0Zmxhc2hwbGF5ZXJcIiB0eXBlPVwiJHR5cGVcIiBxdWFsaXR5PVwiaGlnaFwiIHdpZHRoPVwiJHdpZHRoXCIgaGVpZ2h0PVwiJGhlaWdodFwiIGJnY29sb3I9XCIkYmdjb2xvclwiIGxvb3A9XCIkbG9vcFwiPjwvZW1iZWQ+IjsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRlbWJlZCAuPSAiPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPmVtYmVkX2ZsYXNoKCckYmdjb2xvcicsICckd2lkdGgnLCAnJGhlaWdodCcsICciIC4gJHRoaXMtPmdldF9saW5rKCkgLiAiJywgJyRsb29wJywgJyR0eXBlJyk7PC9zY3JpcHQ+IjsKCQkJfQoJCX0KCgkJLy8gRmxhc2ggTWVkaWEgUGxheWVyIGZpbGUgdHlwZXMuCgkJLy8gUHJlZmVycmVkIGhhbmRsZXIgZm9yIE1QMyBmaWxlIHR5cGVzLgoJCWVsc2VpZiAoJGhhbmRsZXIgPT09ICdmbWVkaWEnIHx8ICgkaGFuZGxlciA9PT0gJ21wMycgJiYgJG1lZGlhcGxheWVyICE9PSAnJykpCgkJewoJCQkkaGVpZ2h0ICs9IDIwOwoJCQlpZiAoJG5hdGl2ZSkKCQkJewoJCQkJJGVtYmVkIC49ICI8ZW1iZWQgc3JjPVwiJG1lZGlhcGxheWVyXCIgcGx1Z2luc3BhZ2U9XCJodHRwOi8vYWRvYmUuY29tL2dvL2dldGZsYXNocGxheWVyXCIgdHlwZT1cImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoXCIgcXVhbGl0eT1cImhpZ2hcIiB3aWR0aD1cIiR3aWR0aFwiIGhlaWdodD1cIiRoZWlnaHRcIiB3bW9kZT1cInRyYW5zcGFyZW50XCIgZmxhc2h2YXJzPVwiZmlsZT0iIC4gcmF3dXJsZW5jb2RlKCR0aGlzLT5nZXRfbGluaygpLic/ZmlsZV9leHRlbnNpb249LicuJHRoaXMtPmdldF9leHRlbnNpb24oKSkgLiAiJmF1dG9zdGFydD1mYWxzZSZyZXBlYXQ9JGxvb3Amc2hvd2RpZ2l0cz10cnVlJnNob3dmc2J1dHRvbj1mYWxzZVwiPjwvZW1iZWQ+IjsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRlbWJlZCAuPSAiPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPmVtYmVkX2ZsdignJHdpZHRoJywgJyRoZWlnaHQnLCAnIiAuIHJhd3VybGVuY29kZSgkdGhpcy0+Z2V0X2xpbmsoKS4nP2ZpbGVfZXh0ZW5zaW9uPS4nLiR0aGlzLT5nZXRfZXh0ZW5zaW9uKCkpIC4gIicsICckcGxhY2Vob2xkZXInLCAnJGxvb3AnLCAnJG1lZGlhcGxheWVyJyk7PC9zY3JpcHQ+IjsKCQkJfQoJCX0KCgkJLy8gUXVpY2tUaW1lIDcgZmlsZSB0eXBlcy4gIE5lZWQgdG8gdGVzdCB3aXRoIFF1aWNrVGltZSA2LgoJCS8vIE9ubHkgaGFuZGxlIE1QMydzIGlmIHRoZSBGbGFzaCBNZWRpYSBQbGF5ZXIgaXMgbm90IHByZXNlbnQuCgkJZWxzZWlmICgkaGFuZGxlciA9PT0gJ3F1aWNrdGltZScgfHwgKCRoYW5kbGVyID09PSAnbXAzJyAmJiAkbWVkaWFwbGF5ZXIgPT09ICcnKSkKCQl7CgkJCSRoZWlnaHQgKz0gMTY7CgkJCWlmICgkbmF0aXZlKQoJCQl7CgkJCQlpZiAoJHBsYWNlaG9sZGVyICE9PSAnJykKCQkJCXsKCQkJCQkkZW1iZWQgLj0gIjxlbWJlZCB0eXBlPVwiJHR5cGVcIiBzdHlsZT1cImN1cnNvcjpoYW5kOyBjdXJzb3I6cG9pbnRlcjtcIiBocmVmPVwiIiAuICR0aGlzLT5nZXRfbGluaygpIC4gIlwiIHNyYz1cIiRwbGFjZWhvbGRlclwiIHdpZHRoPVwiJHdpZHRoXCIgaGVpZ2h0PVwiJGhlaWdodFwiIGF1dG9wbGF5PVwiZmFsc2VcIiB0YXJnZXQ9XCJteXNlbGZcIiBjb250cm9sbGVyPVwiZmFsc2VcIiBsb29wPVwiJGxvb3BcIiBzY2FsZT1cImFzcGVjdFwiIGJnY29sb3I9XCIkYmdjb2xvclwiIHBsdWdpbnNwYWdlPVwiaHR0cDovL2FwcGxlLmNvbS9xdWlja3RpbWUvZG93bmxvYWQvXCI+PC9lbWJlZD4iOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRlbWJlZCAuPSAiPGVtYmVkIHR5cGU9XCIkdHlwZVwiIHN0eWxlPVwiY3Vyc29yOmhhbmQ7IGN1cnNvcjpwb2ludGVyO1wiIHNyYz1cIiIgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICJcIiB3aWR0aD1cIiR3aWR0aFwiIGhlaWdodD1cIiRoZWlnaHRcIiBhdXRvcGxheT1cImZhbHNlXCIgdGFyZ2V0PVwibXlzZWxmXCIgY29udHJvbGxlcj1cInRydWVcIiBsb29wPVwiJGxvb3BcIiBzY2FsZT1cImFzcGVjdFwiIGJnY29sb3I9XCIkYmdjb2xvclwiIHBsdWdpbnNwYWdlPVwiaHR0cDovL2FwcGxlLmNvbS9xdWlja3RpbWUvZG93bmxvYWQvXCI+PC9lbWJlZD4iOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJGVtYmVkIC49ICI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCc+ZW1iZWRfcXVpY2t0aW1lKCckdHlwZScsICckYmdjb2xvcicsICckd2lkdGgnLCAnJGhlaWdodCcsICciIC4gJHRoaXMtPmdldF9saW5rKCkgLiAiJywgJyRwbGFjZWhvbGRlcicsICckbG9vcCcpOzwvc2NyaXB0PiI7CgkJCX0KCQl9CgoJCS8vIFdpbmRvd3MgTWVkaWEKCQllbHNlaWYgKCRoYW5kbGVyID09PSAnd21lZGlhJykKCQl7CgkJCSRoZWlnaHQgKz0gNDU7CgkJCWlmICgkbmF0aXZlKQoJCQl7CgkJCQkkZW1iZWQgLj0gIjxlbWJlZCB0eXBlPVwiYXBwbGljYXRpb24veC1tcGxheWVyMlwiIHNyYz1cIiIgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICJcIiBhdXRvc2l6ZT1cIjFcIiB3aWR0aD1cIiR3aWR0aFwiIGhlaWdodD1cIiRoZWlnaHRcIiBzaG93Y29udHJvbHM9XCIxXCIgc2hvd3N0YXR1c2Jhcj1cIjBcIiBzaG93ZGlzcGxheT1cIjBcIiBhdXRvc3RhcnQ9XCIwXCI+PC9lbWJlZD4iOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJGVtYmVkIC49ICI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCc+ZW1iZWRfd21lZGlhKCckd2lkdGgnLCAnJGhlaWdodCcsICciIC4gJHRoaXMtPmdldF9saW5rKCkgLiAiJyk7PC9zY3JpcHQ+IjsKCQkJfQoJCX0KCgkJLy8gRXZlcnl0aGluZyBlbHNlCgkJZWxzZSAkZW1iZWQgLj0gJzxhIGhyZWY9IicgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICciIGNsYXNzPSInIC4gJGFsdGNsYXNzIC4gJyI+JyAuICRhbHQgLiAnPC9hPic7CgoJCXJldHVybiAkZW1iZWQ7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHJlYWwgbWVkaWEgdHlwZQoJICoKCSAqIE9mdGVuLCBmZWVkcyBsaWUgdG8gdXMsIG5lY2Vzc2l0YXRpbmcgYSBiaXQgb2YgZGVlcGVyIGluc3BlY3Rpb24uIFRoaXMKCSAqIGNvbnZlcnRzIHR5cGVzIHRvIHRoZWlyIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbnMgYmFzZWQgb24gdGhlIGZpbGUKCSAqIGV4dGVuc2lvbgoJICoKCSAqIEBzZWUgZ2V0X3R5cGUoKQoJICogQHBhcmFtIGJvb2wgJGZpbmRfaGFuZGxlciBJbnRlcm5hbCB1c2Ugb25seSwgdXNlIHtAc2VlIGdldF9oYW5kbGVyKCl9IGluc3RlYWQKCSAqIEByZXR1cm4gc3RyaW5nIE1JTUUgdHlwZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3JlYWxfdHlwZSgkZmluZF9oYW5kbGVyID0gZmFsc2UpCgl7CgkJLy8gTWltZS10eXBlcyBieSBoYW5kbGVyLgoJCSR0eXBlc19mbGFzaCA9IGFycmF5KCdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsICdhcHBsaWNhdGlvbi9mdXR1cmVzcGxhc2gnKTsgLy8gRmxhc2gKCQkkdHlwZXNfZm1lZGlhID0gYXJyYXkoJ3ZpZGVvL2ZsdicsICd2aWRlby94LWZsdicsJ2Zsdi1hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTsgLy8gRmxhc2ggTWVkaWEgUGxheWVyCgkJJHR5cGVzX3F1aWNrdGltZSA9IGFycmF5KCdhdWRpby8zZ3BwJywgJ2F1ZGlvLzNncHAyJywgJ2F1ZGlvL2FhYycsICdhdWRpby94LWFhYycsICdhdWRpby9haWZmJywgJ2F1ZGlvL3gtYWlmZicsICdhdWRpby9taWQnLCAnYXVkaW8vbWlkaScsICdhdWRpby94LW1pZGknLCAnYXVkaW8vbXA0JywgJ2F1ZGlvL200YScsICdhdWRpby94LW00YScsICdhdWRpby93YXYnLCAnYXVkaW8veC13YXYnLCAndmlkZW8vM2dwcCcsICd2aWRlby8zZ3BwMicsICd2aWRlby9tNHYnLCAndmlkZW8veC1tNHYnLCAndmlkZW8vbXA0JywgJ3ZpZGVvL21wZWcnLCAndmlkZW8veC1tcGVnJywgJ3ZpZGVvL3F1aWNrdGltZScsICd2aWRlby9zZC12aWRlbycpOyAvLyBRdWlja1RpbWUKCQkkdHlwZXNfd21lZGlhID0gYXJyYXkoJ2FwcGxpY2F0aW9uL2FzeCcsICdhcHBsaWNhdGlvbi94LW1wbGF5ZXIyJywgJ2F1ZGlvL3gtbXMtd21hJywgJ2F1ZGlvL3gtbXMtd2F4JywgJ3ZpZGVvL3gtbXMtYXNmLXBsdWdpbicsICd2aWRlby94LW1zLWFzZicsICd2aWRlby94LW1zLXdtJywgJ3ZpZGVvL3gtbXMtd212JywgJ3ZpZGVvL3gtbXMtd3Z4Jyk7IC8vIFdpbmRvd3MgTWVkaWEKCQkkdHlwZXNfbXAzID0gYXJyYXkoJ2F1ZGlvL21wMycsICdhdWRpby94LW1wMycsICdhdWRpby9tcGVnJywgJ2F1ZGlvL3gtbXBlZycpOyAvLyBNUDMKCgkJaWYgKCR0aGlzLT5nZXRfdHlwZSgpICE9PSBudWxsKQoJCXsKCQkJJHR5cGUgPSBzdHJ0b2xvd2VyKCR0aGlzLT50eXBlKTsKCQl9CgkJZWxzZQoJCXsKCQkJJHR5cGUgPSBudWxsOwoJCX0KCgkJLy8gSWYgd2UgZW5jb3VudGVyIGFuIHVuc3VwcG9ydGVkIG1pbWUtdHlwZSwgY2hlY2sgdGhlIGZpbGUgZXh0ZW5zaW9uIGFuZCBndWVzcyBpbnRlbGxpZ2VudGx5LgoJCWlmICghaW5fYXJyYXkoJHR5cGUsIGFycmF5X21lcmdlKCR0eXBlc19mbGFzaCwgJHR5cGVzX2ZtZWRpYSwgJHR5cGVzX3F1aWNrdGltZSwgJHR5cGVzX3dtZWRpYSwgJHR5cGVzX21wMykpKQoJCXsKCQkJc3dpdGNoIChzdHJ0b2xvd2VyKCR0aGlzLT5nZXRfZXh0ZW5zaW9uKCkpKQoJCQl7CgkJCQkvLyBBdWRpbyBtaW1lLXR5cGVzCgkJCQljYXNlICdhYWMnOgoJCQkJY2FzZSAnYWR0cyc6CgkJCQkJJHR5cGUgPSAnYXVkaW8vYWNjJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdhaWYnOgoJCQkJY2FzZSAnYWlmYyc6CgkJCQljYXNlICdhaWZmJzoKCQkJCWNhc2UgJ2NkZGEnOgoJCQkJCSR0eXBlID0gJ2F1ZGlvL2FpZmYnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ2J3Zic6CgkJCQkJJHR5cGUgPSAnYXVkaW8vd2F2JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdrYXInOgoJCQkJY2FzZSAnbWlkJzoKCQkJCWNhc2UgJ21pZGknOgoJCQkJY2FzZSAnc21mJzoKCQkJCQkkdHlwZSA9ICdhdWRpby9taWRpJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdtNGEnOgoJCQkJCSR0eXBlID0gJ2F1ZGlvL3gtbTRhJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdtcDMnOgoJCQkJY2FzZSAnc3dhJzoKCQkJCQkkdHlwZSA9ICdhdWRpby9tcDMnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ3dhdic6CgkJCQkJJHR5cGUgPSAnYXVkaW8vd2F2JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICd3YXgnOgoJCQkJCSR0eXBlID0gJ2F1ZGlvL3gtbXMtd2F4JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICd3bWEnOgoJCQkJCSR0eXBlID0gJ2F1ZGlvL3gtbXMtd21hJzsKCQkJCQlicmVhazsKCgkJCQkvLyBWaWRlbyBtaW1lLXR5cGVzCgkJCQljYXNlICczZ3AnOgoJCQkJY2FzZSAnM2dwcCc6CgkJCQkJJHR5cGUgPSAndmlkZW8vM2dwcCc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnM2cyJzoKCQkJCWNhc2UgJzNncDInOgoJCQkJCSR0eXBlID0gJ3ZpZGVvLzNncHAyJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdhc2YnOgoJCQkJCSR0eXBlID0gJ3ZpZGVvL3gtbXMtYXNmJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdmbHYnOgoJCQkJCSR0eXBlID0gJ3ZpZGVvL3gtZmx2JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdtMWEnOgoJCQkJY2FzZSAnbTFzJzoKCQkJCWNhc2UgJ20xdic6CgkJCQljYXNlICdtMTUnOgoJCQkJY2FzZSAnbTc1JzoKCQkJCWNhc2UgJ21wMic6CgkJCQljYXNlICdtcGEnOgoJCQkJY2FzZSAnbXBlZyc6CgkJCQljYXNlICdtcGcnOgoJCQkJY2FzZSAnbXBtJzoKCQkJCWNhc2UgJ21wdic6CgkJCQkJJHR5cGUgPSAndmlkZW8vbXBlZyc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnbTR2JzoKCQkJCQkkdHlwZSA9ICd2aWRlby94LW00dic7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnbW92JzoKCQkJCWNhc2UgJ3F0JzoKCQkJCQkkdHlwZSA9ICd2aWRlby9xdWlja3RpbWUnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ21wNCc6CgkJCQljYXNlICdtcGc0JzoKCQkJCQkkdHlwZSA9ICd2aWRlby9tcDQnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ3Nkdic6CgkJCQkJJHR5cGUgPSAndmlkZW8vc2QtdmlkZW8nOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ3dtJzoKCQkJCQkkdHlwZSA9ICd2aWRlby94LW1zLXdtJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICd3bXYnOgoJCQkJCSR0eXBlID0gJ3ZpZGVvL3gtbXMtd212JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICd3dngnOgoJCQkJCSR0eXBlID0gJ3ZpZGVvL3gtbXMtd3Z4JzsKCQkJCQlicmVhazsKCgkJCQkvLyBGbGFzaCBtaW1lLXR5cGVzCgkJCQljYXNlICdzcGwnOgoJCQkJCSR0eXBlID0gJ2FwcGxpY2F0aW9uL2Z1dHVyZXNwbGFzaCc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnc3dmJzoKCQkJCQkkdHlwZSA9ICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCc7CgkJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCWlmICgkZmluZF9oYW5kbGVyKQoJCXsKCQkJaWYgKGluX2FycmF5KCR0eXBlLCAkdHlwZXNfZmxhc2gpKQoJCQl7CgkJCQlyZXR1cm4gJ2ZsYXNoJzsKCQkJfQoJCQllbHNlaWYgKGluX2FycmF5KCR0eXBlLCAkdHlwZXNfZm1lZGlhKSkKCQkJewoJCQkJcmV0dXJuICdmbWVkaWEnOwoJCQl9CgkJCWVsc2VpZiAoaW5fYXJyYXkoJHR5cGUsICR0eXBlc19xdWlja3RpbWUpKQoJCQl7CgkJCQlyZXR1cm4gJ3F1aWNrdGltZSc7CgkJCX0KCQkJZWxzZWlmIChpbl9hcnJheSgkdHlwZSwgJHR5cGVzX3dtZWRpYSkpCgkJCXsKCQkJCXJldHVybiAnd21lZGlhJzsKCQkJfQoJCQllbHNlaWYgKGluX2FycmF5KCR0eXBlLCAkdHlwZXNfbXAzKSkKCQkJewoJCQkJcmV0dXJuICdtcDMnOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIG51bGw7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICR0eXBlOwoJCX0KCX0KfQoKLyoqCiAqIFVzZWQgZm9yIGZldGNoaW5nIHJlbW90ZSBmaWxlcyBhbmQgcmVhZGluZyBsb2NhbCBmaWxlcwogKgogKiBTdXBwb3J0cyBIVFRQIDEuMCB2aWEgY1VSTCBvciBmc29ja29wZW4sIHdpdGggc3BvdHR5IEhUVFAgMS4xIHN1cHBvcnQKICoKICogVGhpcyBjbGFzcyBjYW4gYmUgb3ZlcmxvYWRlZCB3aXRoIHtAc2VlIFNpbXBsZVBpZTo6c2V0X2ZpbGVfY2xhc3MoKX0KICoKICogQHBhY2thZ2UgU2ltcGxlUGllCiAqIEBzdWJwYWNrYWdlIEhUVFAKICogQHRvZG8gTW92ZSB0byBwcm9wZXJseSBzdXBwb3J0aW5nIFJGQzI2MTYgKEhUVFAvMS4xKQogKi8KY2xhc3MgU2ltcGxlUGllX0ZpbGUKewoJdmFyICR1cmw7Cgl2YXIgJHVzZXJhZ2VudDsKCXZhciAkc3VjY2VzcyA9IHRydWU7Cgl2YXIgJGhlYWRlcnMgPSBhcnJheSgpOwoJdmFyICRib2R5OwoJdmFyICRzdGF0dXNfY29kZTsKCXZhciAkcmVkaXJlY3RzID0gMDsKCXZhciAkZXJyb3I7Cgl2YXIgJG1ldGhvZCA9IFNJTVBMRVBJRV9GSUxFX1NPVVJDRV9OT05FOwoKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdXJsLCAkdGltZW91dCA9IDEwLCAkcmVkaXJlY3RzID0gNSwgJGhlYWRlcnMgPSBudWxsLCAkdXNlcmFnZW50ID0gbnVsbCwgJGZvcmNlX2Zzb2Nrb3BlbiA9IGZhbHNlKQoJewoJCWlmIChjbGFzc19leGlzdHMoJ2lkbmFfY29udmVydCcpKQoJCXsKCQkJJGlkbiA9IG5ldyBpZG5hX2NvbnZlcnQoKTsKCQkJJHBhcnNlZCA9IFNpbXBsZVBpZV9NaXNjOjpwYXJzZV91cmwoJHVybCk7CgkJCSR1cmwgPSBTaW1wbGVQaWVfTWlzYzo6Y29tcHJlc3NfcGFyc2VfdXJsKCRwYXJzZWRbJ3NjaGVtZSddLCAkaWRuLT5lbmNvZGUoJHBhcnNlZFsnYXV0aG9yaXR5J10pLCAkcGFyc2VkWydwYXRoJ10sICRwYXJzZWRbJ3F1ZXJ5J10sICRwYXJzZWRbJ2ZyYWdtZW50J10pOwoJCX0KCQkkdGhpcy0+dXJsID0gJHVybDsKCQkkdGhpcy0+dXNlcmFnZW50ID0gJHVzZXJhZ2VudDsKCQlpZiAocHJlZ19tYXRjaCgnL15odHRwKHMpPzpcL1wvL2knLCAkdXJsKSkKCQl7CgkJCWlmICgkdXNlcmFnZW50ID09PSBudWxsKQoJCQl7CgkJCQkkdXNlcmFnZW50ID0gaW5pX2dldCgndXNlcl9hZ2VudCcpOwoJCQkJJHRoaXMtPnVzZXJhZ2VudCA9ICR1c2VyYWdlbnQ7CgkJCX0KCQkJaWYgKCFpc19hcnJheSgkaGVhZGVycykpCgkJCXsKCQkJCSRoZWFkZXJzID0gYXJyYXkoKTsKCQkJfQoJCQlpZiAoISRmb3JjZV9mc29ja29wZW4gJiYgZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2V4ZWMnKSkKCQkJewoJCQkJJHRoaXMtPm1ldGhvZCA9IFNJTVBMRVBJRV9GSUxFX1NPVVJDRV9SRU1PVEUgfCBTSU1QTEVQSUVfRklMRV9TT1VSQ0VfQ1VSTDsKCQkJCSRmcCA9IGN1cmxfaW5pdCgpOwoJCQkJJGhlYWRlcnMyID0gYXJyYXkoKTsKCQkJCWZvcmVhY2ggKCRoZWFkZXJzIGFzICRrZXkgPT4gJHZhbHVlKQoJCQkJewoJCQkJCSRoZWFkZXJzMltdID0gIiRrZXk6ICR2YWx1ZSI7CgkJCQl9CgkJCQlpZiAodmVyc2lvbl9jb21wYXJlKFNpbXBsZVBpZV9NaXNjOjpnZXRfY3VybF92ZXJzaW9uKCksICc3LjEwLjUnLCAnPj0nKSkKCQkJCXsKCQkJCQljdXJsX3NldG9wdCgkZnAsIENVUkxPUFRfRU5DT0RJTkcsICcnKTsKCQkJCX0KCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9VUkwsICR1cmwpOwoJCQkJY3VybF9zZXRvcHQoJGZwLCBDVVJMT1BUX0hFQURFUiwgMSk7CgkJCQljdXJsX3NldG9wdCgkZnAsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOwoJCQkJY3VybF9zZXRvcHQoJGZwLCBDVVJMT1BUX1RJTUVPVVQsICR0aW1lb3V0KTsKCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCwgJHRpbWVvdXQpOwoJCQkJY3VybF9zZXRvcHQoJGZwLCBDVVJMT1BUX1JFRkVSRVIsICR1cmwpOwoJCQkJY3VybF9zZXRvcHQoJGZwLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHVzZXJhZ2VudCk7CgkJCQljdXJsX3NldG9wdCgkZnAsIENVUkxPUFRfSFRUUEhFQURFUiwgJGhlYWRlcnMyKTsKCQkJCWlmICghaW5pX2dldCgnb3Blbl9iYXNlZGlyJykgJiYgIWluaV9nZXQoJ3NhZmVfbW9kZScpICYmIHZlcnNpb25fY29tcGFyZShTaW1wbGVQaWVfTWlzYzo6Z2V0X2N1cmxfdmVyc2lvbigpLCAnNy4xNS4yJywgJz49JykpCgkJCQl7CgkJCQkJY3VybF9zZXRvcHQoJGZwLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCAxKTsKCQkJCQljdXJsX3NldG9wdCgkZnAsIENVUkxPUFRfTUFYUkVESVJTLCAkcmVkaXJlY3RzKTsKCQkJCX0KCgkJCQkkdGhpcy0+aGVhZGVycyA9IGN1cmxfZXhlYygkZnApOwoJCQkJaWYgKGN1cmxfZXJybm8oJGZwKSA9PT0gMjMgfHwgY3VybF9lcnJubygkZnApID09PSA2MSkKCQkJCXsKCQkJCQljdXJsX3NldG9wdCgkZnAsIENVUkxPUFRfRU5DT0RJTkcsICdub25lJyk7CgkJCQkJJHRoaXMtPmhlYWRlcnMgPSBjdXJsX2V4ZWMoJGZwKTsKCQkJCX0KCQkJCWlmIChjdXJsX2Vycm5vKCRmcCkpCgkJCQl7CgkJCQkJJHRoaXMtPmVycm9yID0gJ2NVUkwgZXJyb3IgJyAuIGN1cmxfZXJybm8oJGZwKSAuICc6ICcgLiBjdXJsX2Vycm9yKCRmcCk7CgkJCQkJJHRoaXMtPnN1Y2Nlc3MgPSBmYWxzZTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkaW5mbyA9IGN1cmxfZ2V0aW5mbygkZnApOwoJCQkJCWN1cmxfY2xvc2UoJGZwKTsKCQkJCQkkdGhpcy0+aGVhZGVycyA9IGV4cGxvZGUoIlxyXG5cclxuIiwgJHRoaXMtPmhlYWRlcnMsICRpbmZvWydyZWRpcmVjdF9jb3VudCddICsgMSk7CgkJCQkJJHRoaXMtPmhlYWRlcnMgPSBhcnJheV9wb3AoJHRoaXMtPmhlYWRlcnMpOwoJCQkJCSRwYXJzZXIgPSBuZXcgU2ltcGxlUGllX0hUVFBfUGFyc2VyKCR0aGlzLT5oZWFkZXJzKTsKCQkJCQlpZiAoJHBhcnNlci0+cGFyc2UoKSkKCQkJCQl7CgkJCQkJCSR0aGlzLT5oZWFkZXJzID0gJHBhcnNlci0+aGVhZGVyczsKCQkJCQkJJHRoaXMtPmJvZHkgPSAkcGFyc2VyLT5ib2R5OwoJCQkJCQkkdGhpcy0+c3RhdHVzX2NvZGUgPSAkcGFyc2VyLT5zdGF0dXNfY29kZTsKCQkJCQkJaWYgKChpbl9hcnJheSgkdGhpcy0+c3RhdHVzX2NvZGUsIGFycmF5KDMwMCwgMzAxLCAzMDIsIDMwMywgMzA3KSkgfHwgJHRoaXMtPnN0YXR1c19jb2RlID4gMzA3ICYmICR0aGlzLT5zdGF0dXNfY29kZSA8IDQwMCkgJiYgaXNzZXQoJHRoaXMtPmhlYWRlcnNbJ2xvY2F0aW9uJ10pICYmICR0aGlzLT5yZWRpcmVjdHMgPCAkcmVkaXJlY3RzKQoJCQkJCQl7CgkJCQkJCQkkdGhpcy0+cmVkaXJlY3RzKys7CgkJCQkJCQkkbG9jYXRpb24gPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwoJHRoaXMtPmhlYWRlcnNbJ2xvY2F0aW9uJ10sICR1cmwpOwoJCQkJCQkJcmV0dXJuICR0aGlzLT5fX2NvbnN0cnVjdCgkbG9jYXRpb24sICR0aW1lb3V0LCAkcmVkaXJlY3RzLCAkaGVhZGVycywgJHVzZXJhZ2VudCwgJGZvcmNlX2Zzb2Nrb3Blbik7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGhpcy0+bWV0aG9kID0gU0lNUExFUElFX0ZJTEVfU09VUkNFX1JFTU9URSB8IFNJTVBMRVBJRV9GSUxFX1NPVVJDRV9GU09DS09QRU47CgkJCQkkdXJsX3BhcnRzID0gcGFyc2VfdXJsKCR1cmwpOwoJCQkJJHNvY2tldF9ob3N0ID0gJHVybF9wYXJ0c1snaG9zdCddOwoJCQkJaWYgKGlzc2V0KCR1cmxfcGFydHNbJ3NjaGVtZSddKSAmJiBzdHJ0b2xvd2VyKCR1cmxfcGFydHNbJ3NjaGVtZSddKSA9PT0gJ2h0dHBzJykKCQkJCXsKCQkJCQkkc29ja2V0X2hvc3QgPSAic3NsOi8vJHVybF9wYXJ0c1tob3N0XSI7CgkJCQkJJHVybF9wYXJ0c1sncG9ydCddID0gNDQzOwoJCQkJfQoJCQkJaWYgKCFpc3NldCgkdXJsX3BhcnRzWydwb3J0J10pKQoJCQkJewoJCQkJCSR1cmxfcGFydHNbJ3BvcnQnXSA9IDgwOwoJCQkJfQoJCQkJJGZwID0gQGZzb2Nrb3Blbigkc29ja2V0X2hvc3QsICR1cmxfcGFydHNbJ3BvcnQnXSwgJGVycm5vLCAkZXJyc3RyLCAkdGltZW91dCk7CgkJCQlpZiAoISRmcCkKCQkJCXsKCQkJCQkkdGhpcy0+ZXJyb3IgPSAnZnNvY2tvcGVuIGVycm9yOiAnIC4gJGVycnN0cjsKCQkJCQkkdGhpcy0+c3VjY2VzcyA9IGZhbHNlOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXN0cmVhbV9zZXRfdGltZW91dCgkZnAsICR0aW1lb3V0KTsKCQkJCQlpZiAoaXNzZXQoJHVybF9wYXJ0c1sncGF0aCddKSkKCQkJCQl7CgkJCQkJCWlmIChpc3NldCgkdXJsX3BhcnRzWydxdWVyeSddKSkKCQkJCQkJewoJCQkJCQkJJGdldCA9ICIkdXJsX3BhcnRzW3BhdGhdPyR1cmxfcGFydHNbcXVlcnldIjsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSRnZXQgPSAkdXJsX3BhcnRzWydwYXRoJ107CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJGdldCA9ICcvJzsKCQkJCQl9CgkJCQkJJG91dCA9ICJHRVQgJGdldCBIVFRQLzEuMVxyXG4iOwoJCQkJCSRvdXQgLj0gIkhvc3Q6ICR1cmxfcGFydHNbaG9zdF1cclxuIjsKCQkJCQkkb3V0IC49ICJVc2VyLUFnZW50OiAkdXNlcmFnZW50XHJcbiI7CgkJCQkJaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ3psaWInKSkKCQkJCQl7CgkJCQkJCSRvdXQgLj0gIkFjY2VwdC1FbmNvZGluZzogeC1nemlwLGd6aXAsZGVmbGF0ZVxyXG4iOwoJCQkJCX0KCgkJCQkJaWYgKGlzc2V0KCR1cmxfcGFydHNbJ3VzZXInXSkgJiYgaXNzZXQoJHVybF9wYXJ0c1sncGFzcyddKSkKCQkJCQl7CgkJCQkJCSRvdXQgLj0gIkF1dGhvcml6YXRpb246IEJhc2ljICIgLiBiYXNlNjRfZW5jb2RlKCIkdXJsX3BhcnRzW3VzZXJdOiR1cmxfcGFydHNbcGFzc10iKSAuICJcclxuIjsKCQkJCQl9CgkJCQkJZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGtleSA9PiAkdmFsdWUpCgkJCQkJewoJCQkJCQkkb3V0IC49ICIka2V5OiAkdmFsdWVcclxuIjsKCQkJCQl9CgkJCQkJJG91dCAuPSAiQ29ubmVjdGlvbjogQ2xvc2VcclxuXHJcbiI7CgkJCQkJZndyaXRlKCRmcCwgJG91dCk7CgoJCQkJCSRpbmZvID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJGZwKTsKCgkJCQkJJHRoaXMtPmhlYWRlcnMgPSAnJzsKCQkJCQl3aGlsZSAoISRpbmZvWydlb2YnXSAmJiAhJGluZm9bJ3RpbWVkX291dCddKQoJCQkJCXsKCQkJCQkJJHRoaXMtPmhlYWRlcnMgLj0gZnJlYWQoJGZwLCAxMTYwKTsKCQkJCQkJJGluZm8gPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkZnApOwoJCQkJCX0KCQkJCQlpZiAoISRpbmZvWyd0aW1lZF9vdXQnXSkKCQkJCQl7CgkJCQkJCSRwYXJzZXIgPSBuZXcgU2ltcGxlUGllX0hUVFBfUGFyc2VyKCR0aGlzLT5oZWFkZXJzKTsKCQkJCQkJaWYgKCRwYXJzZXItPnBhcnNlKCkpCgkJCQkJCXsKCQkJCQkJCSR0aGlzLT5oZWFkZXJzID0gJHBhcnNlci0+aGVhZGVyczsKCQkJCQkJCSR0aGlzLT5ib2R5ID0gJHBhcnNlci0+Ym9keTsKCQkJCQkJCSR0aGlzLT5zdGF0dXNfY29kZSA9ICRwYXJzZXItPnN0YXR1c19jb2RlOwoJCQkJCQkJaWYgKChpbl9hcnJheSgkdGhpcy0+c3RhdHVzX2NvZGUsIGFycmF5KDMwMCwgMzAxLCAzMDIsIDMwMywgMzA3KSkgfHwgJHRoaXMtPnN0YXR1c19jb2RlID4gMzA3ICYmICR0aGlzLT5zdGF0dXNfY29kZSA8IDQwMCkgJiYgaXNzZXQoJHRoaXMtPmhlYWRlcnNbJ2xvY2F0aW9uJ10pICYmICR0aGlzLT5yZWRpcmVjdHMgPCAkcmVkaXJlY3RzKQoJCQkJCQkJewoJCQkJCQkJCSR0aGlzLT5yZWRpcmVjdHMrKzsKCQkJCQkJCQkkbG9jYXRpb24gPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwoJHRoaXMtPmhlYWRlcnNbJ2xvY2F0aW9uJ10sICR1cmwpOwoJCQkJCQkJCXJldHVybiAkdGhpcy0+X19jb25zdHJ1Y3QoJGxvY2F0aW9uLCAkdGltZW91dCwgJHJlZGlyZWN0cywgJGhlYWRlcnMsICR1c2VyYWdlbnQsICRmb3JjZV9mc29ja29wZW4pOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCR0aGlzLT5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10pKQoJCQkJCQkJewoJCQkJCQkJCS8vIEhleSwgd2UgYWN0IGR1bWIgZWxzZXdoZXJlLCBzbyBsZXQncyBkbyB0aGF0IGhlcmUgdG9vCgkJCQkJCQkJc3dpdGNoIChzdHJ0b2xvd2VyKHRyaW0oJHRoaXMtPmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSwgIlx4MDlceDBBXHgwRFx4MjAiKSkpCgkJCQkJCQkJewoJCQkJCQkJCQljYXNlICdnemlwJzoKCQkJCQkJCQkJY2FzZSAneC1nemlwJzoKCQkJCQkJCQkJCSRkZWNvZGVyID0gbmV3IFNpbXBsZVBpZV9nemRlY29kZSgkdGhpcy0+Ym9keSk7CgkJCQkJCQkJCQlpZiAoISRkZWNvZGVyLT5wYXJzZSgpKQoJCQkJCQkJCQkJewoJCQkJCQkJCQkJCSR0aGlzLT5lcnJvciA9ICdVbmFibGUgdG8gZGVjb2RlIEhUVFAgImd6aXAiIHN0cmVhbSc7CgkJCQkJCQkJCQkJJHRoaXMtPnN1Y2Nlc3MgPSBmYWxzZTsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWVsc2UKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQkkdGhpcy0+Ym9keSA9ICRkZWNvZGVyLT5kYXRhOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJCQljYXNlICdkZWZsYXRlJzoKCQkJCQkJCQkJCWlmICgoJGRlY29tcHJlc3NlZCA9IGd6aW5mbGF0ZSgkdGhpcy0+Ym9keSkpICE9PSBmYWxzZSkKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQkkdGhpcy0+Ym9keSA9ICRkZWNvbXByZXNzZWQ7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQllbHNlIGlmICgoJGRlY29tcHJlc3NlZCA9IGd6dW5jb21wcmVzcygkdGhpcy0+Ym9keSkpICE9PSBmYWxzZSkKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQkkdGhpcy0+Ym9keSA9ICRkZWNvbXByZXNzZWQ7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQllbHNlIGlmIChmdW5jdGlvbl9leGlzdHMoJ2d6ZGVjb2RlJykgJiYgKCRkZWNvbXByZXNzZWQgPSBnemRlY29kZSgkdGhpcy0+Ym9keSkpICE9PSBmYWxzZSkKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQkkdGhpcy0+Ym9keSA9ICRkZWNvbXByZXNzZWQ7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQllbHNlCgkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJJHRoaXMtPmVycm9yID0gJ1VuYWJsZSB0byBkZWNvZGUgSFRUUCAiZGVmbGF0ZSIgc3RyZWFtJzsKCQkJCQkJCQkJCQkkdGhpcy0+c3VjY2VzcyA9IGZhbHNlOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCQkJJHRoaXMtPmVycm9yID0gJ1Vua25vd24gY29udGVudCBjb2RpbmcnOwoJCQkJCQkJCQkJJHRoaXMtPnN1Y2Nlc3MgPSBmYWxzZTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHRoaXMtPmVycm9yID0gJ2Zzb2NrZXQgdGltZWQgb3V0JzsKCQkJCQkJJHRoaXMtPnN1Y2Nlc3MgPSBmYWxzZTsKCQkJCQl9CgkJCQkJZmNsb3NlKCRmcCk7CgkJCQl9CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPm1ldGhvZCA9IFNJTVBMRVBJRV9GSUxFX1NPVVJDRV9MT0NBTCB8IFNJTVBMRVBJRV9GSUxFX1NPVVJDRV9GSUxFX0dFVF9DT05URU5UUzsKCQkJaWYgKCEkdGhpcy0+Ym9keSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCR1cmwpKQoJCQl7CgkJCQkkdGhpcy0+ZXJyb3IgPSAnZmlsZV9nZXRfY29udGVudHMgY291bGQgbm90IHJlYWQgdGhlIGZpbGUnOwoJCQkJJHRoaXMtPnN1Y2Nlc3MgPSBmYWxzZTsKCQkJfQoJCX0KCX0KfQoKLyoqCiAqIERlY29kZSAnZ3ppcCcgZW5jb2RlZCBIVFRQIGRhdGEKICoKICogQHBhY2thZ2UgU2ltcGxlUGllCiAqIEBzdWJwYWNrYWdlIEhUVFAKICogQGxpbmsgaHR0cDovL3d3dy5nemlwLm9yZy9mb3JtYXQudHh0CiAqLwpjbGFzcyBTaW1wbGVQaWVfZ3pkZWNvZGUKewoJLyoqCgkgKiBDb21wcmVzc2VkIGRhdGEKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgc3RyaW5nCgkgKiBAc2VlIGd6ZGVjb2RlOjokZGF0YQoJICovCgl2YXIgJGNvbXByZXNzZWRfZGF0YTsKCgkvKioKCSAqIFNpemUgb2YgY29tcHJlc3NlZCBkYXRhCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGludAoJICovCgl2YXIgJGNvbXByZXNzZWRfc2l6ZTsKCgkvKioKCSAqIE1pbmltdW0gc2l6ZSBvZiBhIHZhbGlkIGd6aXAgc3RyaW5nCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGludAoJICovCgl2YXIgJG1pbl9jb21wcmVzc2VkX3NpemUgPSAxODsKCgkvKioKCSAqIEN1cnJlbnQgcG9zaXRpb24gb2YgcG9pbnRlcgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBpbnQKCSAqLwoJdmFyICRwb3NpdGlvbiA9IDA7CgoJLyoqCgkgKiBGbGFncyAoRkxHKQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBpbnQKCSAqLwoJdmFyICRmbGFnczsKCgkvKioKCSAqIFVuY29tcHJlc3NlZCBkYXRhCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzZWUgZ3pkZWNvZGU6OiRjb21wcmVzc2VkX2RhdGEKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkZGF0YTsKCgkvKioKCSAqIE1vZGlmaWVkIHRpbWUKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBpbnQKCSAqLwoJdmFyICRNVElNRTsKCgkvKioKCSAqIEV4dHJhIEZsYWdzCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgaW50CgkgKi8KCXZhciAkWEZMOwoKCS8qKgoJICogT3BlcmF0aW5nIFN5c3RlbQoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIGludAoJICovCgl2YXIgJE9TOwoKCS8qKgoJICogU3ViZmllbGQgSUQgMQoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2VlIGd6ZGVjb2RlOjokZXh0cmFfZmllbGQKCSAqIEBzZWUgZ3pkZWNvZGU6OiRTSTIKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkU0kxOwoKCS8qKgoJICogU3ViZmllbGQgSUQgMgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2VlIGd6ZGVjb2RlOjokZXh0cmFfZmllbGQKCSAqIEBzZWUgZ3pkZWNvZGU6OiRTSTEKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkU0kyOwoKCS8qKgoJICogRXh0cmEgZmllbGQgY29udGVudAoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2VlIGd6ZGVjb2RlOjokU0kxCgkgKiBAc2VlIGd6ZGVjb2RlOjokU0kyCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGV4dHJhX2ZpZWxkOwoKCS8qKgoJICogT3JpZ2luYWwgZmlsZW5hbWUKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRmaWxlbmFtZTsKCgkvKioKCSAqIEh1bWFuIHJlYWRhYmxlIGNvbW1lbnQKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRjb21tZW50OwoKCS8qKgoJICogRG9uJ3QgYWxsb3cgYW55dGhpbmcgdG8gYmUgc2V0CgkgKgoJICogQHBhcmFtIHN0cmluZyAkbmFtZQoJICogQHBhcmFtIG1peGVkICR2YWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19zZXQoJG5hbWUsICR2YWx1ZSkKCXsKCQl0cmlnZ2VyX2Vycm9yKCJDYW5ub3Qgd3JpdGUgcHJvcGVydHkgJG5hbWUiLCBFX1VTRVJfRVJST1IpOwoJfQoKCS8qKgoJICogU2V0IHRoZSBjb21wcmVzc2VkIHN0cmluZyBhbmQgcmVsYXRlZCBwcm9wZXJ0aWVzCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZGF0YQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGRhdGEpCgl7CgkJJHRoaXMtPmNvbXByZXNzZWRfZGF0YSA9ICRkYXRhOwoJCSR0aGlzLT5jb21wcmVzc2VkX3NpemUgPSBzdHJsZW4oJGRhdGEpOwoJfQoKCS8qKgoJICogRGVjb2RlIHRoZSBHWklQIHN0cmVhbQoJICoKCSAqIEByZXR1cm4gYm9vbCBTdWNjZXNzZnVsbmVzcwoJICovCglwdWJsaWMgZnVuY3Rpb24gcGFyc2UoKQoJewoJCWlmICgkdGhpcy0+Y29tcHJlc3NlZF9zaXplID49ICR0aGlzLT5taW5fY29tcHJlc3NlZF9zaXplKQoJCXsKCQkJLy8gQ2hlY2sgSUQxLCBJRDIsIGFuZCBDTQoJCQlpZiAoc3Vic3RyKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsIDAsIDMpICE9PSAiXHgxRlx4OEJceDA4IikKCQkJewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQkvLyBHZXQgdGhlIEZMRyAoRkxhR3MpCgkJCSR0aGlzLT5mbGFncyA9IG9yZCgkdGhpcy0+Y29tcHJlc3NlZF9kYXRhWzNdKTsKCgkJCS8vIEZMRyBiaXRzIGFib3ZlICgxIDw8IDQpIGFyZSByZXNlcnZlZAoJCQlpZiAoJHRoaXMtPmZsYWdzID4gMHgxRikKCQkJewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQkvLyBBZHZhbmNlIHRoZSBwb2ludGVyIGFmdGVyIHRoZSBhYm92ZQoJCQkkdGhpcy0+cG9zaXRpb24gKz0gNDsKCgkJCS8vIE1USU1FCgkJCSRtdGltZSA9IHN1YnN0cigkdGhpcy0+Y29tcHJlc3NlZF9kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDQpOwoJCQkvLyBSZXZlcnNlIHRoZSBzdHJpbmcgaWYgd2UncmUgb24gYSBiaWctZW5kaWFuIGFyY2ggYmVjYXVzZSBsIGlzIHRoZSBvbmx5IHNpZ25lZCBsb25nIGFuZCBpcyBtYWNoaW5lIGVuZGlhbm5lc3MKCQkJaWYgKGN1cnJlbnQodW5wYWNrKCdTJywgIlx4MDBceDAxIikpID09PSAxKQoJCQl7CgkJCQkkbXRpbWUgPSBzdHJyZXYoJG10aW1lKTsKCQkJfQoJCQkkdGhpcy0+TVRJTUUgPSBjdXJyZW50KHVucGFjaygnbCcsICRtdGltZSkpOwoJCQkkdGhpcy0+cG9zaXRpb24gKz0gNDsKCgkJCS8vIEdldCB0aGUgWEZMIChlWHRyYSBGTGFncykKCQkJJHRoaXMtPlhGTCA9IG9yZCgkdGhpcy0+Y29tcHJlc3NlZF9kYXRhWyR0aGlzLT5wb3NpdGlvbisrXSk7CgoJCQkvLyBHZXQgdGhlIE9TIChPcGVyYXRpbmcgU3lzdGVtKQoJCQkkdGhpcy0+T1MgPSBvcmQoJHRoaXMtPmNvbXByZXNzZWRfZGF0YVskdGhpcy0+cG9zaXRpb24rK10pOwoKCQkJLy8gUGFyc2UgdGhlIEZFWFRSQQoJCQlpZiAoJHRoaXMtPmZsYWdzICYgNCkKCQkJewoJCQkJLy8gUmVhZCBzdWJmaWVsZCBJRHMKCQkJCSR0aGlzLT5TSTEgPSAkdGhpcy0+Y29tcHJlc3NlZF9kYXRhWyR0aGlzLT5wb3NpdGlvbisrXTsKCQkJCSR0aGlzLT5TSTIgPSAkdGhpcy0+Y29tcHJlc3NlZF9kYXRhWyR0aGlzLT5wb3NpdGlvbisrXTsKCgkJCQkvLyBTSTIgc2V0IHRvIHplcm8gaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKCQkJCWlmICgkdGhpcy0+U0kyID09PSAiXHgwMCIpCgkJCQl7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoKCQkJCS8vIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBleHRyYSBmaWVsZAoJCQkJJGxlbiA9IGN1cnJlbnQodW5wYWNrKCd2Jywgc3Vic3RyKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICR0aGlzLT5wb3NpdGlvbiwgMikpKTsKCQkJCSR0aGlzLT5wb3NpdGlvbiArPSAyOwoKCQkJCS8vIENoZWNrIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyBzdGlsbCB2YWxpZAoJCQkJJHRoaXMtPm1pbl9jb21wcmVzc2VkX3NpemUgKz0gJGxlbiArIDQ7CgkJCQlpZiAoJHRoaXMtPmNvbXByZXNzZWRfc2l6ZSA+PSAkdGhpcy0+bWluX2NvbXByZXNzZWRfc2l6ZSkKCQkJCXsKCQkJCQkvLyBTZXQgdGhlIGV4dHJhIGZpZWxkIHRvIHRoZSBnaXZlbiBkYXRhCgkJCQkJJHRoaXMtPmV4dHJhX2ZpZWxkID0gc3Vic3RyKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbik7CgkJCQkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW47CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgoJCQkvLyBQYXJzZSB0aGUgRk5BTUUKCQkJaWYgKCR0aGlzLT5mbGFncyAmIDgpCgkJCXsKCQkJCS8vIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlbmFtZQoJCQkJJGxlbiA9IHN0cmNzcG4oJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgIlx4MDAiLCAkdGhpcy0+cG9zaXRpb24pOwoKCQkJCS8vIENoZWNrIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyBzdGlsbCB2YWxpZAoJCQkJJHRoaXMtPm1pbl9jb21wcmVzc2VkX3NpemUgKz0gJGxlbiArIDE7CgkJCQlpZiAoJHRoaXMtPmNvbXByZXNzZWRfc2l6ZSA+PSAkdGhpcy0+bWluX2NvbXByZXNzZWRfc2l6ZSkKCQkJCXsKCQkJCQkvLyBTZXQgdGhlIG9yaWdpbmFsIGZpbGVuYW1lIHRvIHRoZSBnaXZlbiBzdHJpbmcKCQkJCQkkdGhpcy0+ZmlsZW5hbWUgPSBzdWJzdHIoJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAkbGVuKTsKCQkJCQkkdGhpcy0+cG9zaXRpb24gKz0gJGxlbiArIDE7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgoJCQkvLyBQYXJzZSB0aGUgRkNPTU1FTlQKCQkJaWYgKCR0aGlzLT5mbGFncyAmIDE2KQoJCQl7CgkJCQkvLyBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgY29tbWVudAoJCQkJJGxlbiA9IHN0cmNzcG4oJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgIlx4MDAiLCAkdGhpcy0+cG9zaXRpb24pOwoKCQkJCS8vIENoZWNrIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyBzdGlsbCB2YWxpZAoJCQkJJHRoaXMtPm1pbl9jb21wcmVzc2VkX3NpemUgKz0gJGxlbiArIDE7CgkJCQlpZiAoJHRoaXMtPmNvbXByZXNzZWRfc2l6ZSA+PSAkdGhpcy0+bWluX2NvbXByZXNzZWRfc2l6ZSkKCQkJCXsKCQkJCQkvLyBTZXQgdGhlIG9yaWdpbmFsIGNvbW1lbnQgdG8gdGhlIGdpdmVuIHN0cmluZwoJCQkJCSR0aGlzLT5jb21tZW50ID0gc3Vic3RyKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbik7CgkJCQkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW4gKyAxOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoKCQkJLy8gUGFyc2UgdGhlIEZIQ1JDCgkJCWlmICgkdGhpcy0+ZmxhZ3MgJiAyKQoJCQl7CgkJCQkvLyBDaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaXMgc3RpbGwgdmFsaWQKCQkJCSR0aGlzLT5taW5fY29tcHJlc3NlZF9zaXplICs9ICRsZW4gKyAyOwoJCQkJaWYgKCR0aGlzLT5jb21wcmVzc2VkX3NpemUgPj0gJHRoaXMtPm1pbl9jb21wcmVzc2VkX3NpemUpCgkJCQl7CgkJCQkJLy8gUmVhZCB0aGUgQ1JDCgkJCQkJJGNyYyA9IGN1cnJlbnQodW5wYWNrKCd2Jywgc3Vic3RyKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICR0aGlzLT5wb3NpdGlvbiwgMikpKTsKCgkJCQkJLy8gQ2hlY2sgdGhlIENSQyBtYXRjaGVzCgkJCQkJaWYgKChjcmMzMihzdWJzdHIoJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgMCwgJHRoaXMtPnBvc2l0aW9uKSkgJiAweEZGRkYpID09PSAkY3JjKQoJCQkJCXsKCQkJCQkJJHRoaXMtPnBvc2l0aW9uICs9IDI7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgoJCQkvLyBEZWNvbXByZXNzIHRoZSBhY3R1YWwgZGF0YQoJCQlpZiAoKCR0aGlzLT5kYXRhID0gZ3ppbmZsYXRlKHN1YnN0cigkdGhpcy0+Y29tcHJlc3NlZF9kYXRhLCAkdGhpcy0+cG9zaXRpb24sIC04KSkpID09PSBmYWxzZSkKCQkJewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPnBvc2l0aW9uID0gJHRoaXMtPmNvbXByZXNzZWRfc2l6ZSAtIDg7CgkJCX0KCgkJCS8vIENoZWNrIENSQyBvZiBkYXRhCgkJCSRjcmMgPSBjdXJyZW50KHVucGFjaygnVicsIHN1YnN0cigkdGhpcy0+Y29tcHJlc3NlZF9kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDQpKSk7CgkJCSR0aGlzLT5wb3NpdGlvbiArPSA0OwoJCQkvKmlmIChleHRlbnNpb25fbG9hZGVkKCdoYXNoJykgJiYgc3ByaW50ZignJXUnLCBjdXJyZW50KHVucGFjaygnVicsIGhhc2goJ2NyYzMyYicsICR0aGlzLT5kYXRhKSkpKSAhPT0gc3ByaW50ZignJXUnLCAkY3JjKSkKCQkJewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9Ki8KCgkJCS8vIENoZWNrIElTSVpFIG9mIGRhdGEKCQkJJGlzaXplID0gY3VycmVudCh1bnBhY2soJ1YnLCBzdWJzdHIoJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCA0KSkpOwoJCQkkdGhpcy0+cG9zaXRpb24gKz0gNDsKCQkJaWYgKHNwcmludGYoJyV1Jywgc3RybGVuKCR0aGlzLT5kYXRhKSAmIDB4RkZGRkZGRkYpICE9PSBzcHJpbnRmKCcldScsICRpc2l6ZSkpCgkJCXsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJLy8gV293LCBhZ2FpbnN0IGFsbCBvZGRzLCB3ZSd2ZSBhY3R1YWxseSBnb3QgYSB2YWxpZCBnemlwIHN0cmluZwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KfQoKLyoqCiAqIEhUVFAgUmVzcG9uc2UgUGFyc2VyCiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAc3VicGFja2FnZSBIVFRQCiAqLwpjbGFzcyBTaW1wbGVQaWVfSFRUUF9QYXJzZXIKewoJLyoqCgkgKiBIVFRQIFZlcnNpb24KCSAqCgkgKiBAdmFyIGZsb2F0CgkgKi8KCXB1YmxpYyAkaHR0cF92ZXJzaW9uID0gMC4wOwoKCS8qKgoJICogU3RhdHVzIGNvZGUKCSAqCgkgKiBAdmFyIGludAoJICovCglwdWJsaWMgJHN0YXR1c19jb2RlID0gMDsKCgkvKioKCSAqIFJlYXNvbiBwaHJhc2UKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwdWJsaWMgJHJlYXNvbiA9ICcnOwoKCS8qKgoJICogS2V5L3ZhbHVlIHBhaXJzIG9mIHRoZSBoZWFkZXJzCgkgKgoJICogQHZhciBhcnJheQoJICovCglwdWJsaWMgJGhlYWRlcnMgPSBhcnJheSgpOwoKCS8qKgoJICogQm9keSBvZiB0aGUgcmVzcG9uc2UKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwdWJsaWMgJGJvZHkgPSAnJzsKCgkvKioKCSAqIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHN0YXRlIG1hY2hpbmUKCSAqCgkgKiBAdmFyIHN0cmluZwoJICovCglwcm90ZWN0ZWQgJHN0YXRlID0gJ2h0dHBfdmVyc2lvbic7CgoJLyoqCgkgKiBJbnB1dCBkYXRhCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRkYXRhID0gJyc7CgoJLyoqCgkgKiBJbnB1dCBkYXRhIGxlbmd0aCAodG8gYXZvaWQgY2FsbGluZyBzdHJsZW4oKSBldmVyeXRpbWUgdGhpcyBpcyBuZWVkZWQpCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJvdGVjdGVkICRkYXRhX2xlbmd0aCA9IDA7CgoJLyoqCgkgKiBDdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyCgkgKgoJICogQHZhciBpbnQKCSAqLwoJcHJvdGVjdGVkICRwb3NpdGlvbiA9IDA7CgoJLyoqCgkgKiBOYW1lIG9mIHRoZSBoZWRhZXIgY3VycmVudGx5IGJlaW5nIHBhcnNlZAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByb3RlY3RlZCAkbmFtZSA9ICcnOwoKCS8qKgoJICogVmFsdWUgb2YgdGhlIGhlZGFlciBjdXJyZW50bHkgYmVpbmcgcGFyc2VkCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICR2YWx1ZSA9ICcnOwoKCS8qKgoJICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB3aXRoIHRoZSBpbnB1dCBkYXRhCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZGF0YSBJbnB1dCBkYXRhCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZGF0YSkKCXsKCQkkdGhpcy0+ZGF0YSA9ICRkYXRhOwoJCSR0aGlzLT5kYXRhX2xlbmd0aCA9IHN0cmxlbigkdGhpcy0+ZGF0YSk7Cgl9CgoJLyoqCgkgKiBQYXJzZSB0aGUgaW5wdXQgZGF0YQoJICoKCSAqIEByZXR1cm4gYm9vbCB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHBhcnNlKCkKCXsKCQl3aGlsZSAoJHRoaXMtPnN0YXRlICYmICR0aGlzLT5zdGF0ZSAhPT0gJ2VtaXQnICYmICR0aGlzLT5oYXNfZGF0YSgpKQoJCXsKCQkJJHN0YXRlID0gJHRoaXMtPnN0YXRlOwoJCQkkdGhpcy0+JHN0YXRlKCk7CgkJfQoJCSR0aGlzLT5kYXRhID0gJyc7CgkJaWYgKCR0aGlzLT5zdGF0ZSA9PT0gJ2VtaXQnIHx8ICR0aGlzLT5zdGF0ZSA9PT0gJ2JvZHknKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5odHRwX3ZlcnNpb24gPSAnJzsKCQkJJHRoaXMtPnN0YXR1c19jb2RlID0gJyc7CgkJCSR0aGlzLT5yZWFzb24gPSAnJzsKCQkJJHRoaXMtPmhlYWRlcnMgPSBhcnJheSgpOwoJCQkkdGhpcy0+Ym9keSA9ICcnOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoKCS8qKgoJICogQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBkYXRhIGJleW9uZCB0aGUgcG9pbnRlcgoJICoKCSAqIEByZXR1cm4gYm9vbCB0cnVlIGlmIHRoZXJlIGlzIGZ1cnRoZXIgZGF0YSwgZmFsc2UgaWYgbm90CgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBoYXNfZGF0YSgpCgl7CgkJcmV0dXJuIChib29sKSAoJHRoaXMtPnBvc2l0aW9uIDwgJHRoaXMtPmRhdGFfbGVuZ3RoKTsKCX0KCgkvKioKCSAqIFNlZSBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgTFdTCgkgKgoJICogQHJldHVybiBib29sIHRydWUgaWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIExXUywgZmFsc2UgaWYgbm90CgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBpc19saW5lYXJfd2hpdGVzcGFjZSgpCgl7CgkJcmV0dXJuIChib29sKSAoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uXSA9PT0gIlx4MDkiCgkJCXx8ICR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbl0gPT09ICJceDIwIgoJCQl8fCAoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uXSA9PT0gIlx4MEEiCgkJCQkmJiBpc3NldCgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb24gKyAxXSkKCQkJCSYmICgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb24gKyAxXSA9PT0gIlx4MDkiIHx8ICR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbiArIDFdID09PSAiXHgyMCIpKSk7Cgl9CgoJLyoqCgkgKiBQYXJzZSB0aGUgSFRUUCB2ZXJzaW9uCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBodHRwX3ZlcnNpb24oKQoJewoJCWlmIChzdHJwb3MoJHRoaXMtPmRhdGEsICJceDBBIikgIT09IGZhbHNlICYmIHN0cnRvdXBwZXIoc3Vic3RyKCR0aGlzLT5kYXRhLCAwLCA1KSkgPT09ICdIVFRQLycpCgkJewoJCQkkbGVuID0gc3Ryc3BuKCR0aGlzLT5kYXRhLCAnMDEyMzQ1Njc4OS4nLCA1KTsKCQkJJHRoaXMtPmh0dHBfdmVyc2lvbiA9IHN1YnN0cigkdGhpcy0+ZGF0YSwgNSwgJGxlbik7CgkJCSR0aGlzLT5wb3NpdGlvbiArPSA1ICsgJGxlbjsKCQkJaWYgKHN1YnN0cl9jb3VudCgkdGhpcy0+aHR0cF92ZXJzaW9uLCAnLicpIDw9IDEpCgkJCXsKCQkJCSR0aGlzLT5odHRwX3ZlcnNpb24gPSAoZmxvYXQpICR0aGlzLT5odHRwX3ZlcnNpb247CgkJCQkkdGhpcy0+cG9zaXRpb24gKz0gc3Ryc3BuKCR0aGlzLT5kYXRhLCAiXHgwOVx4MjAiLCAkdGhpcy0+cG9zaXRpb24pOwoJCQkJJHRoaXMtPnN0YXRlID0gJ3N0YXR1cyc7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSB0aGUgc3RhdHVzIGNvZGUKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIHN0YXR1cygpCgl7CgkJaWYgKCRsZW4gPSBzdHJzcG4oJHRoaXMtPmRhdGEsICcwMTIzNDU2Nzg5JywgJHRoaXMtPnBvc2l0aW9uKSkKCQl7CgkJCSR0aGlzLT5zdGF0dXNfY29kZSA9IChpbnQpIHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAkbGVuKTsKCQkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW47CgkJCSR0aGlzLT5zdGF0ZSA9ICdyZWFzb24nOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSB0aGUgcmVhc29uIHBocmFzZQoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gcmVhc29uKCkKCXsKCQkkbGVuID0gc3RyY3NwbigkdGhpcy0+ZGF0YSwgIlx4MEEiLCAkdGhpcy0+cG9zaXRpb24pOwoJCSR0aGlzLT5yZWFzb24gPSB0cmltKHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAkbGVuKSwgIlx4MDlceDBEXHgyMCIpOwoJCSR0aGlzLT5wb3NpdGlvbiArPSAkbGVuICsgMTsKCQkkdGhpcy0+c3RhdGUgPSAnbmV3X2xpbmUnOwoJfQoKCS8qKgoJICogRGVhbCB3aXRoIGEgbmV3IGxpbmUsIHNoaWZ0aW5nIGRhdGEgYXJvdW5kIGFzIG5lZWRlZAoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gbmV3X2xpbmUoKQoJewoJCSR0aGlzLT52YWx1ZSA9IHRyaW0oJHRoaXMtPnZhbHVlLCAiXHgwRFx4MjAiKTsKCQlpZiAoJHRoaXMtPm5hbWUgIT09ICcnICYmICR0aGlzLT52YWx1ZSAhPT0gJycpCgkJewoJCQkkdGhpcy0+bmFtZSA9IHN0cnRvbG93ZXIoJHRoaXMtPm5hbWUpOwoJCQkvLyBXZSBzaG91bGQgb25seSB1c2UgdGhlIGxhc3QgQ29udGVudC1UeXBlIGhlYWRlci4gYy5mLiBpc3N1ZSAjMQoJCQlpZiAoaXNzZXQoJHRoaXMtPmhlYWRlcnNbJHRoaXMtPm5hbWVdKSAmJiAkdGhpcy0+bmFtZSAhPT0gJ2NvbnRlbnQtdHlwZScpCgkJCXsKCQkJCSR0aGlzLT5oZWFkZXJzWyR0aGlzLT5uYW1lXSAuPSAnLCAnIC4gJHRoaXMtPnZhbHVlOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPmhlYWRlcnNbJHRoaXMtPm5hbWVdID0gJHRoaXMtPnZhbHVlOwoJCQl9CgkJfQoJCSR0aGlzLT5uYW1lID0gJyc7CgkJJHRoaXMtPnZhbHVlID0gJyc7CgkJaWYgKHN1YnN0cigkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dLCAwLCAyKSA9PT0gIlx4MERceDBBIikKCQl7CgkJCSR0aGlzLT5wb3NpdGlvbiArPSAyOwoJCQkkdGhpcy0+c3RhdGUgPSAnYm9keSc7CgkJfQoJCWVsc2VpZiAoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uXSA9PT0gIlx4MEEiKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uKys7CgkJCSR0aGlzLT5zdGF0ZSA9ICdib2R5JzsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnN0YXRlID0gJ25hbWUnOwoJCX0KCX0KCgkvKioKCSAqIFBhcnNlIGEgaGVhZGVyIG5hbWUKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIG5hbWUoKQoJewoJCSRsZW4gPSBzdHJjc3BuKCR0aGlzLT5kYXRhLCAiXHgwQToiLCAkdGhpcy0+cG9zaXRpb24pOwoJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb24gKyAkbGVuXSkpCgkJewoJCQlpZiAoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uICsgJGxlbl0gPT09ICJceDBBIikKCQkJewoJCQkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW47CgkJCQkkdGhpcy0+c3RhdGUgPSAnbmV3X2xpbmUnOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPm5hbWUgPSBzdWJzdHIoJHRoaXMtPmRhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbik7CgkJCQkkdGhpcy0+cG9zaXRpb24gKz0gJGxlbiArIDE7CgkJCQkkdGhpcy0+c3RhdGUgPSAndmFsdWUnOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFBhcnNlIExXUywgcmVwbGFjaW5nIGNvbnNlY3V0aXZlIExXUyBjaGFyYWN0ZXJzIHdpdGggYSBzaW5nbGUgc3BhY2UKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIGxpbmVhcl93aGl0ZXNwYWNlKCkKCXsKCQlkbwoJCXsKCQkJaWYgKHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAyKSA9PT0gIlx4MERceDBBIikKCQkJewoJCQkJJHRoaXMtPnBvc2l0aW9uICs9IDI7CgkJCX0KCQkJZWxzZWlmICgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dID09PSAiXHgwQSIpCgkJCXsKCQkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQl9CgkJCSR0aGlzLT5wb3NpdGlvbiArPSBzdHJzcG4oJHRoaXMtPmRhdGEsICJceDA5XHgyMCIsICR0aGlzLT5wb3NpdGlvbik7CgkJfSB3aGlsZSAoJHRoaXMtPmhhc19kYXRhKCkgJiYgJHRoaXMtPmlzX2xpbmVhcl93aGl0ZXNwYWNlKCkpOwoJCSR0aGlzLT52YWx1ZSAuPSAiXHgyMCI7Cgl9CgoJLyoqCgkgKiBTZWUgd2hhdCBzdGF0ZSB0byBtb3ZlIHRvIHdoaWxlIHdpdGhpbiBub24tcXVvdGVkIGhlYWRlciB2YWx1ZXMKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbHVlKCkKCXsKCQlpZiAoJHRoaXMtPmlzX2xpbmVhcl93aGl0ZXNwYWNlKCkpCgkJewoJCQkkdGhpcy0+bGluZWFyX3doaXRlc3BhY2UoKTsKCQl9CgkJZWxzZQoJCXsKCQkJc3dpdGNoICgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dKQoJCQl7CgkJCQljYXNlICciJzoKCQkJCQkvLyBXb3JrYXJvdW5kIGZvciBFVGFnczogd2UgaGF2ZSB0byBpbmNsdWRlIHRoZSBxdW90ZXMgYXMKCQkJCQkvLyBwYXJ0IG9mIHRoZSB0YWcuCgkJCQkJaWYgKHN0cnRvbG93ZXIoJHRoaXMtPm5hbWUpID09PSAnZXRhZycpCgkJCQkJewoJCQkJCQkkdGhpcy0+dmFsdWUgLj0gJyInOwoJCQkJCQkkdGhpcy0+cG9zaXRpb24rKzsKCQkJCQkJJHRoaXMtPnN0YXRlID0gJ3ZhbHVlX2NoYXInOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQkJJHRoaXMtPnBvc2l0aW9uKys7CgkJCQkJJHRoaXMtPnN0YXRlID0gJ3F1b3RlJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICJceDBBIjoKCQkJCQkkdGhpcy0+cG9zaXRpb24rKzsKCQkJCQkkdGhpcy0+c3RhdGUgPSAnbmV3X2xpbmUnOwoJCQkJCWJyZWFrOwoKCQkJCWRlZmF1bHQ6CgkJCQkJJHRoaXMtPnN0YXRlID0gJ3ZhbHVlX2NoYXInOwoJCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogUGFyc2UgYSBoZWFkZXIgdmFsdWUgd2hpbGUgb3V0c2lkZSBxdW90ZXMKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbHVlX2NoYXIoKQoJewoJCSRsZW4gPSBzdHJjc3BuKCR0aGlzLT5kYXRhLCAiXHgwOVx4MjBceDBBXCIiLCAkdGhpcy0+cG9zaXRpb24pOwoJCSR0aGlzLT52YWx1ZSAuPSBzdWJzdHIoJHRoaXMtPmRhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbik7CgkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW47CgkJJHRoaXMtPnN0YXRlID0gJ3ZhbHVlJzsKCX0KCgkvKioKCSAqIFNlZSB3aGF0IHN0YXRlIHRvIG1vdmUgdG8gd2hpbGUgd2l0aGluIHF1b3RlZCBoZWFkZXIgdmFsdWVzCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBxdW90ZSgpCgl7CgkJaWYgKCR0aGlzLT5pc19saW5lYXJfd2hpdGVzcGFjZSgpKQoJCXsKCQkJJHRoaXMtPmxpbmVhcl93aGl0ZXNwYWNlKCk7CgkJfQoJCWVsc2UKCQl7CgkJCXN3aXRjaCAoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uXSkKCQkJewoJCQkJY2FzZSAnIic6CgkJCQkJJHRoaXMtPnBvc2l0aW9uKys7CgkJCQkJJHRoaXMtPnN0YXRlID0gJ3ZhbHVlJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICJceDBBIjoKCQkJCQkkdGhpcy0+cG9zaXRpb24rKzsKCQkJCQkkdGhpcy0+c3RhdGUgPSAnbmV3X2xpbmUnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ1xcJzoKCQkJCQkkdGhpcy0+cG9zaXRpb24rKzsKCQkJCQkkdGhpcy0+c3RhdGUgPSAncXVvdGVfZXNjYXBlZCc7CgkJCQkJYnJlYWs7CgoJCQkJZGVmYXVsdDoKCQkJCQkkdGhpcy0+c3RhdGUgPSAncXVvdGVfY2hhcic7CgkJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSBhIGhlYWRlciB2YWx1ZSB3aGlsZSB3aXRoaW4gcXVvdGVzCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBxdW90ZV9jaGFyKCkKCXsKCQkkbGVuID0gc3RyY3NwbigkdGhpcy0+ZGF0YSwgIlx4MDlceDIwXHgwQVwiXFwiLCAkdGhpcy0+cG9zaXRpb24pOwoJCSR0aGlzLT52YWx1ZSAuPSBzdWJzdHIoJHRoaXMtPmRhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbik7CgkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW47CgkJJHRoaXMtPnN0YXRlID0gJ3ZhbHVlJzsKCX0KCgkvKioKCSAqIFBhcnNlIGFuIGVzY2FwZWQgY2hhcmFjdGVyIHdpdGhpbiBxdW90ZXMKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIHF1b3RlX2VzY2FwZWQoKQoJewoJCSR0aGlzLT52YWx1ZSAuPSAkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dOwoJCSR0aGlzLT5wb3NpdGlvbisrOwoJCSR0aGlzLT5zdGF0ZSA9ICdxdW90ZSc7Cgl9CgoJLyoqCgkgKiBQYXJzZSB0aGUgYm9keQoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gYm9keSgpCgl7CgkJJHRoaXMtPmJvZHkgPSBzdWJzdHIoJHRoaXMtPmRhdGEsICR0aGlzLT5wb3NpdGlvbik7CgkJaWYgKCFlbXB0eSgkdGhpcy0+aGVhZGVyc1sndHJhbnNmZXItZW5jb2RpbmcnXSkpCgkJewoJCQl1bnNldCgkdGhpcy0+aGVhZGVyc1sndHJhbnNmZXItZW5jb2RpbmcnXSk7CgkJCSR0aGlzLT5zdGF0ZSA9ICdjaHVua2VkJzsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnN0YXRlID0gJ2VtaXQnOwoJCX0KCX0KCgkvKioKCSAqIFBhcnNlZCBhICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCIgYm9keQoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gY2h1bmtlZCgpCgl7CgkJaWYgKCFwcmVnX21hdGNoKCcvXihbMC05YS1mXSspW15cclxuXSpcclxuL2knLCB0cmltKCR0aGlzLT5ib2R5KSkpCgkJewoJCQkkdGhpcy0+c3RhdGUgPSAnZW1pdCc7CgkJCXJldHVybjsKCQl9CgoJCSRkZWNvZGVkID0gJyc7CgkJJGVuY29kZWQgPSAkdGhpcy0+Ym9keTsKCgkJd2hpbGUgKHRydWUpCgkJewoJCQkkaXNfY2h1bmtlZCA9IChib29sKSBwcmVnX21hdGNoKCAnL14oWzAtOWEtZl0rKVteXHJcbl0qXHJcbi9pJywgJGVuY29kZWQsICRtYXRjaGVzICk7CgkJCWlmICghJGlzX2NodW5rZWQpCgkJCXsKCQkJCS8vIExvb2tzIGxpa2UgaXQncyBub3QgY2h1bmtlZCBhZnRlciBhbGwKCQkJCSR0aGlzLT5zdGF0ZSA9ICdlbWl0JzsKCQkJCXJldHVybjsKCQkJfQoKCQkJJGxlbmd0aCA9IGhleGRlYyh0cmltKCRtYXRjaGVzWzFdKSk7CgkJCWlmICgkbGVuZ3RoID09PSAwKQoJCQl7CgkJCQkvLyBJZ25vcmUgdHJhaWxlciBoZWFkZXJzCgkJCQkkdGhpcy0+c3RhdGUgPSAnZW1pdCc7CgkJCQkkdGhpcy0+Ym9keSA9ICRkZWNvZGVkOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkkY2h1bmtfbGVuZ3RoID0gc3RybGVuKCRtYXRjaGVzWzBdKTsKCQkJJGRlY29kZWQgLj0gJHBhcnQgPSBzdWJzdHIoJGVuY29kZWQsICRjaHVua19sZW5ndGgsICRsZW5ndGgpOwoJCQkkZW5jb2RlZCA9IHN1YnN0cigkZW5jb2RlZCwgJGNodW5rX2xlbmd0aCArICRsZW5ndGggKyAyKTsKCgkJCWlmICh0cmltKCRlbmNvZGVkKSA9PT0gJzAnIHx8IGVtcHR5KCRlbmNvZGVkKSkKCQkJewoJCQkJJHRoaXMtPnN0YXRlID0gJ2VtaXQnOwoJCQkJJHRoaXMtPmJvZHkgPSAkZGVjb2RlZDsKCQkJCXJldHVybjsKCQkJfQoJCX0KCX0KfQoKLyoqCiAqIElSSSBwYXJzZXIvc2VyaWFsaXNlci9ub3JtYWxpc2VyCiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAc3VicGFja2FnZSBIVFRQCiAqIEBhdXRob3IgR2VvZmZyZXkgU25lZGRvbgogKiBAYXV0aG9yIFN0ZXZlIE1pbnV0aWxsbwogKiBAYXV0aG9yIFJ5YW4gTWNDdWUKICogQGNvcHlyaWdodCAyMDA3LTIwMTIgR2VvZmZyZXkgU25lZGRvbiwgU3RldmUgTWludXRpbGxvLCBSeWFuIE1jQ3VlCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCiAqLwpjbGFzcyBTaW1wbGVQaWVfSVJJCnsKCS8qKgoJICogU2NoZW1lCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRzY2hlbWUgPSBudWxsOwoKCS8qKgoJICogVXNlciBJbmZvcm1hdGlvbgoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByb3RlY3RlZCAkaXVzZXJpbmZvID0gbnVsbDsKCgkvKioKCSAqIGlob3N0CgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRpaG9zdCA9IG51bGw7CgoJLyoqCgkgKiBQb3J0CgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRwb3J0ID0gbnVsbDsKCgkvKioKCSAqIGlwYXRoCgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRpcGF0aCA9ICcnOwoKCS8qKgoJICogaXF1ZXJ5CgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRpcXVlcnkgPSBudWxsOwoKCS8qKgoJICogaWZyYWdtZW50CgkgKgoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRpZnJhZ21lbnQgPSBudWxsOwoKCS8qKgoJICogTm9ybWFsaXphdGlvbiBkYXRhYmFzZQoJICoKCSAqIEVhY2gga2V5IGlzIHRoZSBzY2hlbWUsIGVhY2ggdmFsdWUgaXMgYW4gYXJyYXkgd2l0aCBlYWNoIGtleSBhcyB0aGUgSVJJCgkgKiBwYXJ0IGFuZCB2YWx1ZSBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhhdCBwYXJ0LgoJICovCglwcm90ZWN0ZWQgJG5vcm1hbGl6YXRpb24gPSBhcnJheSgKCQknYWNhcCcgPT4gYXJyYXkoCgkJCSdwb3J0JyA9PiA2NzQKCQkpLAoJCSdkaWN0JyA9PiBhcnJheSgKCQkJJ3BvcnQnID0+IDI2MjgKCQkpLAoJCSdmaWxlJyA9PiBhcnJheSgKCQkJJ2lob3N0JyA9PiAnbG9jYWxob3N0JwoJCSksCgkJJ2h0dHAnID0+IGFycmF5KAoJCQkncG9ydCcgPT4gODAsCgkJCSdpcGF0aCcgPT4gJy8nCgkJKSwKCQknaHR0cHMnID0+IGFycmF5KAoJCQkncG9ydCcgPT4gNDQzLAoJCQknaXBhdGgnID0+ICcvJwoJCSksCgkpOwoKCS8qKgoJICogUmV0dXJuIHRoZSBlbnRpcmUgSVJJIHdoZW4geW91IHRyeSBhbmQgcmVhZCB0aGUgb2JqZWN0IGFzIGEgc3RyaW5nCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCXJldHVybiAkdGhpcy0+Z2V0X2lyaSgpOwoJfQoKCS8qKgoJICogT3ZlcmxvYWQgX19zZXQoKSB0byBwcm92aWRlIGFjY2VzcyB2aWEgcHJvcGVydGllcwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgUHJvcGVydHkgbmFtZQoJICogQHBhcmFtIG1peGVkICR2YWx1ZSBQcm9wZXJ0eSB2YWx1ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19zZXQoJG5hbWUsICR2YWx1ZSkKCXsKCQlpZiAobWV0aG9kX2V4aXN0cygkdGhpcywgJ3NldF8nIC4gJG5hbWUpKQoJCXsKCQkJY2FsbF91c2VyX2Z1bmMoYXJyYXkoJHRoaXMsICdzZXRfJyAuICRuYW1lKSwgJHZhbHVlKTsKCQl9CgkJZWxzZWlmICgKCQkJICAgJG5hbWUgPT09ICdpYXV0aG9yaXR5JwoJCQl8fCAkbmFtZSA9PT0gJ2l1c2VyaW5mbycKCQkJfHwgJG5hbWUgPT09ICdpaG9zdCcKCQkJfHwgJG5hbWUgPT09ICdpcGF0aCcKCQkJfHwgJG5hbWUgPT09ICdpcXVlcnknCgkJCXx8ICRuYW1lID09PSAnaWZyYWdtZW50JwoJCSkKCQl7CgkJCWNhbGxfdXNlcl9mdW5jKGFycmF5KCR0aGlzLCAnc2V0XycgLiBzdWJzdHIoJG5hbWUsIDEpKSwgJHZhbHVlKTsKCQl9Cgl9CgoJLyoqCgkgKiBPdmVybG9hZCBfX2dldCgpIHRvIHByb3ZpZGUgYWNjZXNzIHZpYSBwcm9wZXJ0aWVzCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbmFtZSBQcm9wZXJ0eSBuYW1lCgkgKiBAcmV0dXJuIG1peGVkCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2dldCgkbmFtZSkKCXsKCQkvLyBpc3NldCgpIHJldHVybnMgZmFsc2UgZm9yIG51bGwsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhhdAoJCS8vIEFsc28gd2h5IHdlIHVzZSBhcnJheV9rZXlfZXhpc3RzIGJlbG93IGluc3RlYWQgb2YgaXNzZXQoKQoJCSRwcm9wcyA9IGdldF9vYmplY3RfdmFycygkdGhpcyk7CgoJCWlmICgKCQkJJG5hbWUgPT09ICdpcmknIHx8CgkJCSRuYW1lID09PSAndXJpJyB8fAoJCQkkbmFtZSA9PT0gJ2lhdXRob3JpdHknIHx8CgkJCSRuYW1lID09PSAnYXV0aG9yaXR5JwoJCSkKCQl7CgkJCSRyZXR1cm4gPSAkdGhpcy0+eyJnZXRfJG5hbWUifSgpOwoJCX0KCQllbHNlaWYgKGFycmF5X2tleV9leGlzdHMoJG5hbWUsICRwcm9wcykpCgkJewoJCQkkcmV0dXJuID0gJHRoaXMtPiRuYW1lOwoJCX0KCQkvLyBob3N0IC0+IGlob3N0CgkJZWxzZWlmICgoJHByb3AgPSAnaScgLiAkbmFtZSkgJiYgYXJyYXlfa2V5X2V4aXN0cygkcHJvcCwgJHByb3BzKSkKCQl7CgkJCSRuYW1lID0gJHByb3A7CgkJCSRyZXR1cm4gPSAkdGhpcy0+JHByb3A7CgkJfQoJCS8vIGlzY2hlbWUgLT4gc2NoZW1lCgkJZWxzZWlmICgoJHByb3AgPSBzdWJzdHIoJG5hbWUsIDEpKSAmJiBhcnJheV9rZXlfZXhpc3RzKCRwcm9wLCAkcHJvcHMpKQoJCXsKCQkJJG5hbWUgPSAkcHJvcDsKCQkJJHJldHVybiA9ICR0aGlzLT4kcHJvcDsKCQl9CgkJZWxzZQoJCXsKCQkJdHJpZ2dlcl9lcnJvcignVW5kZWZpbmVkIHByb3BlcnR5OiAnIC4gZ2V0X2NsYXNzKCR0aGlzKSAuICc6OicgLiAkbmFtZSwgRV9VU0VSX05PVElDRSk7CgkJCSRyZXR1cm4gPSBudWxsOwoJCX0KCgkJaWYgKCRyZXR1cm4gPT09IG51bGwgJiYgaXNzZXQoJHRoaXMtPm5vcm1hbGl6YXRpb25bJHRoaXMtPnNjaGVtZV1bJG5hbWVdKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+bm9ybWFsaXphdGlvblskdGhpcy0+c2NoZW1lXVskbmFtZV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCX0KCgkvKioKCSAqIE92ZXJsb2FkIF9faXNzZXQoKSB0byBwcm92aWRlIGFjY2VzcyB2aWEgcHJvcGVydGllcwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgUHJvcGVydHkgbmFtZQoJICogQHJldHVybiBib29sCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2lzc2V0KCRuYW1lKQoJewoJCWlmIChtZXRob2RfZXhpc3RzKCR0aGlzLCAnZ2V0XycgLiAkbmFtZSkgfHwgaXNzZXQoJHRoaXMtPiRuYW1lKSkKCQl7CgkJCXJldHVybiB0cnVlOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoKCS8qKgoJICogT3ZlcmxvYWQgX191bnNldCgpIHRvIHByb3ZpZGUgYWNjZXNzIHZpYSBwcm9wZXJ0aWVzCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbmFtZSBQcm9wZXJ0eSBuYW1lCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX3Vuc2V0KCRuYW1lKQoJewoJCWlmIChtZXRob2RfZXhpc3RzKCR0aGlzLCAnc2V0XycgLiAkbmFtZSkpCgkJewoJCQljYWxsX3VzZXJfZnVuYyhhcnJheSgkdGhpcywgJ3NldF8nIC4gJG5hbWUpLCAnJyk7CgkJfQoJfQoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IElSSSBvYmplY3QsIGZyb20gYSBzcGVjaWZpZWQgc3RyaW5nCgkgKgoJICogQHBhcmFtIHN0cmluZyAkaXJpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaXJpID0gbnVsbCkKCXsKCQkkdGhpcy0+c2V0X2lyaSgkaXJpKTsKCX0KCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBJUkkgb2JqZWN0IGJ5IHJlc29sdmluZyBhIHJlbGF0aXZlIElSSQoJICoKCSAqIFJldHVybnMgZmFsc2UgaWYgJGJhc2UgaXMgbm90IGFic29sdXRlLCBvdGhlcndpc2UgYW4gSVJJLgoJICoKCSAqIEBwYXJhbSBJUkl8c3RyaW5nICRiYXNlIChBYnNvbHV0ZSkgQmFzZSBJUkkKCSAqIEBwYXJhbSBJUkl8c3RyaW5nICRyZWxhdGl2ZSBSZWxhdGl2ZSBJUkkKCSAqIEByZXR1cm4gSVJJfGZhbHNlCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWJzb2x1dGl6ZSgkYmFzZSwgJHJlbGF0aXZlKQoJewoJCWlmICghKCRyZWxhdGl2ZSBpbnN0YW5jZW9mIFNpbXBsZVBpZV9JUkkpKQoJCXsKCQkJJHJlbGF0aXZlID0gbmV3IFNpbXBsZVBpZV9JUkkoJHJlbGF0aXZlKTsKCQl9CgkJaWYgKCEkcmVsYXRpdmUtPmlzX3ZhbGlkKCkpCgkJewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWVsc2VpZiAoJHJlbGF0aXZlLT5zY2hlbWUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gY2xvbmUgJHJlbGF0aXZlOwoJCX0KCQllbHNlCgkJewoJCQlpZiAoISgkYmFzZSBpbnN0YW5jZW9mIFNpbXBsZVBpZV9JUkkpKQoJCQl7CgkJCQkkYmFzZSA9IG5ldyBTaW1wbGVQaWVfSVJJKCRiYXNlKTsKCQkJfQoJCQlpZiAoJGJhc2UtPnNjaGVtZSAhPT0gbnVsbCAmJiAkYmFzZS0+aXNfdmFsaWQoKSkKCQkJewoJCQkJaWYgKCRyZWxhdGl2ZS0+Z2V0X2lyaSgpICE9PSAnJykKCQkJCXsKCQkJCQlpZiAoJHJlbGF0aXZlLT5pdXNlcmluZm8gIT09IG51bGwgfHwgJHJlbGF0aXZlLT5paG9zdCAhPT0gbnVsbCB8fCAkcmVsYXRpdmUtPnBvcnQgIT09IG51bGwpCgkJCQkJewoJCQkJCQkkdGFyZ2V0ID0gY2xvbmUgJHJlbGF0aXZlOwoJCQkJCQkkdGFyZ2V0LT5zY2hlbWUgPSAkYmFzZS0+c2NoZW1lOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkdGFyZ2V0ID0gbmV3IFNpbXBsZVBpZV9JUkk7CgkJCQkJCSR0YXJnZXQtPnNjaGVtZSA9ICRiYXNlLT5zY2hlbWU7CgkJCQkJCSR0YXJnZXQtPml1c2VyaW5mbyA9ICRiYXNlLT5pdXNlcmluZm87CgkJCQkJCSR0YXJnZXQtPmlob3N0ID0gJGJhc2UtPmlob3N0OwoJCQkJCQkkdGFyZ2V0LT5wb3J0ID0gJGJhc2UtPnBvcnQ7CgkJCQkJCWlmICgkcmVsYXRpdmUtPmlwYXRoICE9PSAnJykKCQkJCQkJewoJCQkJCQkJaWYgKCRyZWxhdGl2ZS0+aXBhdGhbMF0gPT09ICcvJykKCQkJCQkJCXsKCQkJCQkJCQkkdGFyZ2V0LT5pcGF0aCA9ICRyZWxhdGl2ZS0+aXBhdGg7CgkJCQkJCQl9CgkJCQkJCQllbHNlaWYgKCgkYmFzZS0+aXVzZXJpbmZvICE9PSBudWxsIHx8ICRiYXNlLT5paG9zdCAhPT0gbnVsbCB8fCAkYmFzZS0+cG9ydCAhPT0gbnVsbCkgJiYgJGJhc2UtPmlwYXRoID09PSAnJykKCQkJCQkJCXsKCQkJCQkJCQkkdGFyZ2V0LT5pcGF0aCA9ICcvJyAuICRyZWxhdGl2ZS0+aXBhdGg7CgkJCQkJCQl9CgkJCQkJCQllbHNlaWYgKCgkbGFzdF9zZWdtZW50ID0gc3RycnBvcygkYmFzZS0+aXBhdGgsICcvJykpICE9PSBmYWxzZSkKCQkJCQkJCXsKCQkJCQkJCQkkdGFyZ2V0LT5pcGF0aCA9IHN1YnN0cigkYmFzZS0+aXBhdGgsIDAsICRsYXN0X3NlZ21lbnQgKyAxKSAuICRyZWxhdGl2ZS0+aXBhdGg7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJJHRhcmdldC0+aXBhdGggPSAkcmVsYXRpdmUtPmlwYXRoOwoJCQkJCQkJfQoJCQkJCQkJJHRhcmdldC0+aXBhdGggPSAkdGFyZ2V0LT5yZW1vdmVfZG90X3NlZ21lbnRzKCR0YXJnZXQtPmlwYXRoKTsKCQkJCQkJCSR0YXJnZXQtPmlxdWVyeSA9ICRyZWxhdGl2ZS0+aXF1ZXJ5OwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHRhcmdldC0+aXBhdGggPSAkYmFzZS0+aXBhdGg7CgkJCQkJCQlpZiAoJHJlbGF0aXZlLT5pcXVlcnkgIT09IG51bGwpCgkJCQkJCQl7CgkJCQkJCQkJJHRhcmdldC0+aXF1ZXJ5ID0gJHJlbGF0aXZlLT5pcXVlcnk7CgkJCQkJCQl9CgkJCQkJCQllbHNlaWYgKCRiYXNlLT5pcXVlcnkgIT09IG51bGwpCgkJCQkJCQl7CgkJCQkJCQkJJHRhcmdldC0+aXF1ZXJ5ID0gJGJhc2UtPmlxdWVyeTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQkkdGFyZ2V0LT5pZnJhZ21lbnQgPSAkcmVsYXRpdmUtPmlmcmFnbWVudDsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJHRhcmdldCA9IGNsb25lICRiYXNlOwoJCQkJCSR0YXJnZXQtPmlmcmFnbWVudCA9IG51bGw7CgkJCQl9CgkJCQkkdGFyZ2V0LT5zY2hlbWVfbm9ybWFsaXphdGlvbigpOwoJCQkJcmV0dXJuICR0YXJnZXQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSBhbiBJUkkgaW50byBzY2hlbWUvYXV0aG9yaXR5L3BhdGgvcXVlcnkvZnJhZ21lbnQgc2VnbWVudHMKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRpcmkKCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlX2lyaSgkaXJpKQoJewoJCSRpcmkgPSB0cmltKCRpcmksICJceDIwXHgwOVx4MEFceDBDXHgwRCIpOwoJCWlmIChwcmVnX21hdGNoKCcvXigoP1A8c2NoZW1lPlteOlwvPyNdKyk6KT8oXC9cLyg/UDxhdXRob3JpdHk+W15cLz8jXSopKT8oP1A8cGF0aD5bXj8jXSopKFw/KD9QPHF1ZXJ5PlteI10qKSk/KCMoP1A8ZnJhZ21lbnQ+LiopKT8kLycsICRpcmksICRtYXRjaCkpCgkJewoJCQlpZiAoJG1hdGNoWzFdID09PSAnJykKCQkJewoJCQkJJG1hdGNoWydzY2hlbWUnXSA9IG51bGw7CgkJCX0KCQkJaWYgKCFpc3NldCgkbWF0Y2hbM10pIHx8ICRtYXRjaFszXSA9PT0gJycpCgkJCXsKCQkJCSRtYXRjaFsnYXV0aG9yaXR5J10gPSBudWxsOwoJCQl9CgkJCWlmICghaXNzZXQoJG1hdGNoWzVdKSkKCQkJewoJCQkJJG1hdGNoWydwYXRoJ10gPSAnJzsKCQkJfQoJCQlpZiAoIWlzc2V0KCRtYXRjaFs2XSkgfHwgJG1hdGNoWzZdID09PSAnJykKCQkJewoJCQkJJG1hdGNoWydxdWVyeSddID0gbnVsbDsKCQkJfQoJCQlpZiAoIWlzc2V0KCRtYXRjaFs4XSkgfHwgJG1hdGNoWzhdID09PSAnJykKCQkJewoJCQkJJG1hdGNoWydmcmFnbWVudCddID0gbnVsbDsKCQkJfQoJCQlyZXR1cm4gJG1hdGNoOwoJCX0KCQllbHNlCgkJewoJCQl0cmlnZ2VyX2Vycm9yKCdUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4nLCBFX1VTRVJfRVJST1IpOwoJCQlkaWU7CgkJfQoJfQoKCS8qKgoJICogUmVtb3ZlIGRvdCBzZWdtZW50cyBmcm9tIGEgcGF0aAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGlucHV0CgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gcmVtb3ZlX2RvdF9zZWdtZW50cygkaW5wdXQpCgl7CgkJJG91dHB1dCA9ICcnOwoJCXdoaWxlIChzdHJwb3MoJGlucHV0LCAnLi8nKSAhPT0gZmFsc2UgfHwgc3RycG9zKCRpbnB1dCwgJy8uJykgIT09IGZhbHNlIHx8ICRpbnB1dCA9PT0gJy4nIHx8ICRpbnB1dCA9PT0gJy4uJykKCQl7CgkJCS8vIEE6IElmIHRoZSBpbnB1dCBidWZmZXIgYmVnaW5zIHdpdGggYSBwcmVmaXggb2YgIi4uLyIgb3IgIi4vIiwgdGhlbiByZW1vdmUgdGhhdCBwcmVmaXggZnJvbSB0aGUgaW5wdXQgYnVmZmVyOyBvdGhlcndpc2UsCgkJCWlmIChzdHJwb3MoJGlucHV0LCAnLi4vJykgPT09IDApCgkJCXsKCQkJCSRpbnB1dCA9IHN1YnN0cigkaW5wdXQsIDMpOwoJCQl9CgkJCWVsc2VpZiAoc3RycG9zKCRpbnB1dCwgJy4vJykgPT09IDApCgkJCXsKCQkJCSRpbnB1dCA9IHN1YnN0cigkaW5wdXQsIDIpOwoJCQl9CgkJCS8vIEI6IGlmIHRoZSBpbnB1dCBidWZmZXIgYmVnaW5zIHdpdGggYSBwcmVmaXggb2YgIi8uLyIgb3IgIi8uIiwgd2hlcmUgIi4iIGlzIGEgY29tcGxldGUgcGF0aCBzZWdtZW50LCB0aGVuIHJlcGxhY2UgdGhhdCBwcmVmaXggd2l0aCAiLyIgaW4gdGhlIGlucHV0IGJ1ZmZlcjsgb3RoZXJ3aXNlLAoJCQllbHNlaWYgKHN0cnBvcygkaW5wdXQsICcvLi8nKSA9PT0gMCkKCQkJewoJCQkJJGlucHV0ID0gc3Vic3RyKCRpbnB1dCwgMik7CgkJCX0KCQkJZWxzZWlmICgkaW5wdXQgPT09ICcvLicpCgkJCXsKCQkJCSRpbnB1dCA9ICcvJzsKCQkJfQoJCQkvLyBDOiBpZiB0aGUgaW5wdXQgYnVmZmVyIGJlZ2lucyB3aXRoIGEgcHJlZml4IG9mICIvLi4vIiBvciAiLy4uIiwgd2hlcmUgIi4uIiBpcyBhIGNvbXBsZXRlIHBhdGggc2VnbWVudCwgdGhlbiByZXBsYWNlIHRoYXQgcHJlZml4IHdpdGggIi8iIGluIHRoZSBpbnB1dCBidWZmZXIgYW5kIHJlbW92ZSB0aGUgbGFzdCBzZWdtZW50IGFuZCBpdHMgcHJlY2VkaW5nICIvIiAoaWYgYW55KSBmcm9tIHRoZSBvdXRwdXQgYnVmZmVyOyBvdGhlcndpc2UsCgkJCWVsc2VpZiAoc3RycG9zKCRpbnB1dCwgJy8uLi8nKSA9PT0gMCkKCQkJewoJCQkJJGlucHV0ID0gc3Vic3RyKCRpbnB1dCwgMyk7CgkJCQkkb3V0cHV0ID0gc3Vic3RyX3JlcGxhY2UoJG91dHB1dCwgJycsIHN0cnJwb3MoJG91dHB1dCwgJy8nKSk7CgkJCX0KCQkJZWxzZWlmICgkaW5wdXQgPT09ICcvLi4nKQoJCQl7CgkJCQkkaW5wdXQgPSAnLyc7CgkJCQkkb3V0cHV0ID0gc3Vic3RyX3JlcGxhY2UoJG91dHB1dCwgJycsIHN0cnJwb3MoJG91dHB1dCwgJy8nKSk7CgkJCX0KCQkJLy8gRDogaWYgdGhlIGlucHV0IGJ1ZmZlciBjb25zaXN0cyBvbmx5IG9mICIuIiBvciAiLi4iLCB0aGVuIHJlbW92ZSB0aGF0IGZyb20gdGhlIGlucHV0IGJ1ZmZlcjsgb3RoZXJ3aXNlLAoJCQllbHNlaWYgKCRpbnB1dCA9PT0gJy4nIHx8ICRpbnB1dCA9PT0gJy4uJykKCQkJewoJCQkJJGlucHV0ID0gJyc7CgkJCX0KCQkJLy8gRTogbW92ZSB0aGUgZmlyc3QgcGF0aCBzZWdtZW50IGluIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIGVuZCBvZiB0aGUgb3V0cHV0IGJ1ZmZlciwgaW5jbHVkaW5nIHRoZSBpbml0aWFsICIvIiBjaGFyYWN0ZXIgKGlmIGFueSkgYW5kIGFueSBzdWJzZXF1ZW50IGNoYXJhY3RlcnMgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgbmV4dCAiLyIgY2hhcmFjdGVyIG9yIHRoZSBlbmQgb2YgdGhlIGlucHV0IGJ1ZmZlcgoJCQllbHNlaWYgKCgkcG9zID0gc3RycG9zKCRpbnB1dCwgJy8nLCAxKSkgIT09IGZhbHNlKQoJCQl7CgkJCQkkb3V0cHV0IC49IHN1YnN0cigkaW5wdXQsIDAsICRwb3MpOwoJCQkJJGlucHV0ID0gc3Vic3RyX3JlcGxhY2UoJGlucHV0LCAnJywgMCwgJHBvcyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkb3V0cHV0IC49ICRpbnB1dDsKCQkJCSRpbnB1dCA9ICcnOwoJCQl9CgkJfQoJCXJldHVybiAkb3V0cHV0IC4gJGlucHV0OwoJfQoKCS8qKgoJICogUmVwbGFjZSBpbnZhbGlkIGNoYXJhY3RlciB3aXRoIHBlcmNlbnQgZW5jb2RpbmcKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgSW5wdXQgc3RyaW5nCgkgKiBAcGFyYW0gc3RyaW5nICRleHRyYV9jaGFycyBWYWxpZCBjaGFyYWN0ZXJzIG5vdCBpbiBpdW5yZXNlcnZlZCBvcgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXByaXZhdGUgKHRoaXMgaXMgQVNDSUktb25seSkKCSAqIEBwYXJhbSBib29sICRpcHJpdmF0ZSBBbGxvdyBpcHJpdmF0ZQoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIHJlcGxhY2VfaW52YWxpZF93aXRoX3BjdF9lbmNvZGluZygkc3RyaW5nLCAkZXh0cmFfY2hhcnMsICRpcHJpdmF0ZSA9IGZhbHNlKQoJewoJCS8vIE5vcm1hbGl6ZSBhcyBtYW55IHBjdC1lbmNvZGVkIHNlY3Rpb25zIGFzIHBvc3NpYmxlCgkJJHN0cmluZyA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnLyg/OiVbQS1GYS1mMC05XXsyfSkrLycsIGFycmF5KCR0aGlzLCAncmVtb3ZlX2l1bnJlc2VydmVkX3BlcmNlbnRfZW5jb2RlZCcpLCAkc3RyaW5nKTsKCgkJLy8gUmVwbGFjZSBpbnZhbGlkIHBlcmNlbnQgY2hhcmFjdGVycwoJCSRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoJy8lKD8hW0EtRmEtZjAtOV17Mn0pLycsICclMjUnLCAkc3RyaW5nKTsKCgkJLy8gQWRkIHVucmVzZXJ2ZWQgYW5kICUgdG8gJGV4dHJhX2NoYXJzICh0aGUgbGF0dGVyIGlzIHNhZmUgYmVjYXVzZSBhbGwKCQkvLyBwY3QtZW5jb2RlZCBzZWN0aW9ucyBhcmUgbm93IHZhbGlkKS4KCQkkZXh0cmFfY2hhcnMgLj0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LS5ffiUnOwoKCQkvLyBOb3cgcmVwbGFjZSBhbnkgYnl0ZXMgdGhhdCBhcmVuJ3QgYWxsb3dlZCB3aXRoIHRoZWlyIHBjdC1lbmNvZGVkIHZlcnNpb25zCgkJJHBvc2l0aW9uID0gMDsKCQkkc3RybGVuID0gc3RybGVuKCRzdHJpbmcpOwoJCXdoaWxlICgoJHBvc2l0aW9uICs9IHN0cnNwbigkc3RyaW5nLCAkZXh0cmFfY2hhcnMsICRwb3NpdGlvbikpIDwgJHN0cmxlbikKCQl7CgkJCSR2YWx1ZSA9IG9yZCgkc3RyaW5nWyRwb3NpdGlvbl0pOwoKCQkJLy8gU3RhcnQgcG9zaXRpb24KCQkJJHN0YXJ0ID0gJHBvc2l0aW9uOwoKCQkJLy8gQnkgZGVmYXVsdCB3ZSBhcmUgdmFsaWQKCQkJJHZhbGlkID0gdHJ1ZTsKCgkJCS8vIE5vIG9uZSBieXRlIHNlcXVlbmNlcyBhcmUgdmFsaWQgZHVlIHRvIHRoZSB3aGlsZS4KCQkJLy8gVHdvIGJ5dGUgc2VxdWVuY2U6CgkJCWlmICgoJHZhbHVlICYgMHhFMCkgPT09IDB4QzApCgkJCXsKCQkJCSRjaGFyYWN0ZXIgPSAoJHZhbHVlICYgMHgxRikgPDwgNjsKCQkJCSRsZW5ndGggPSAyOwoJCQkJJHJlbWFpbmluZyA9IDE7CgkJCX0KCQkJLy8gVGhyZWUgYnl0ZSBzZXF1ZW5jZToKCQkJZWxzZWlmICgoJHZhbHVlICYgMHhGMCkgPT09IDB4RTApCgkJCXsKCQkJCSRjaGFyYWN0ZXIgPSAoJHZhbHVlICYgMHgwRikgPDwgMTI7CgkJCQkkbGVuZ3RoID0gMzsKCQkJCSRyZW1haW5pbmcgPSAyOwoJCQl9CgkJCS8vIEZvdXIgYnl0ZSBzZXF1ZW5jZToKCQkJZWxzZWlmICgoJHZhbHVlICYgMHhGOCkgPT09IDB4RjApCgkJCXsKCQkJCSRjaGFyYWN0ZXIgPSAoJHZhbHVlICYgMHgwNykgPDwgMTg7CgkJCQkkbGVuZ3RoID0gNDsKCQkJCSRyZW1haW5pbmcgPSAzOwoJCQl9CgkJCS8vIEludmFsaWQgYnl0ZToKCQkJZWxzZQoJCQl7CgkJCQkkdmFsaWQgPSBmYWxzZTsKCQkJCSRsZW5ndGggPSAxOwoJCQkJJHJlbWFpbmluZyA9IDA7CgkJCX0KCgkJCWlmICgkcmVtYWluaW5nKQoJCQl7CgkJCQlpZiAoJHBvc2l0aW9uICsgJGxlbmd0aCA8PSAkc3RybGVuKQoJCQkJewoJCQkJCWZvciAoJHBvc2l0aW9uKys7ICRyZW1haW5pbmc7ICRwb3NpdGlvbisrKQoJCQkJCXsKCQkJCQkJJHZhbHVlID0gb3JkKCRzdHJpbmdbJHBvc2l0aW9uXSk7CgoJCQkJCQkvLyBDaGVjayB0aGF0IHRoZSBieXRlIGlzIHZhbGlkLCB0aGVuIGFkZCBpdCB0byB0aGUgY2hhcmFjdGVyOgoJCQkJCQlpZiAoKCR2YWx1ZSAmIDB4QzApID09PSAweDgwKQoJCQkJCQl7CgkJCQkJCQkkY2hhcmFjdGVyIHw9ICgkdmFsdWUgJiAweDNGKSA8PCAoLS0kcmVtYWluaW5nICogNik7CgkJCQkJCX0KCQkJCQkJLy8gSWYgaXQgaXMgaW52YWxpZCwgY291bnQgdGhlIHNlcXVlbmNlIGFzIGludmFsaWQgYW5kIHJlcHJvY2VzcyB0aGUgY3VycmVudCBieXRlOgoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSR2YWxpZCA9IGZhbHNlOwoJCQkJCQkJJHBvc2l0aW9uLS07CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkcG9zaXRpb24gPSAkc3RybGVuIC0gMTsKCQkJCQkkdmFsaWQgPSBmYWxzZTsKCQkJCX0KCQkJfQoKCQkJLy8gUGVyY2VudCBlbmNvZGUgYW55dGhpbmcgaW52YWxpZCBvciBub3QgaW4gdWNzY2hhcgoJCQlpZiAoCgkJCQkvLyBJbnZhbGlkIHNlcXVlbmNlcwoJCQkJISR2YWxpZAoJCQkJLy8gTm9uLXNob3J0ZXN0IGZvcm0gc2VxdWVuY2VzIGFyZSBpbnZhbGlkCgkJCQl8fCAkbGVuZ3RoID4gMSAmJiAkY2hhcmFjdGVyIDw9IDB4N0YKCQkJCXx8ICRsZW5ndGggPiAyICYmICRjaGFyYWN0ZXIgPD0gMHg3RkYKCQkJCXx8ICRsZW5ndGggPiAzICYmICRjaGFyYWN0ZXIgPD0gMHhGRkZGCgkJCQkvLyBPdXRzaWRlIG9mIHJhbmdlIG9mIHVjc2NoYXIgY29kZXBvaW50cwoJCQkJLy8gTm9uY2hhcmFjdGVycwoJCQkJfHwgKCRjaGFyYWN0ZXIgJiAweEZGRkUpID09PSAweEZGRkUKCQkJCXx8ICRjaGFyYWN0ZXIgPj0gMHhGREQwICYmICRjaGFyYWN0ZXIgPD0gMHhGREVGCgkJCQl8fCAoCgkJCQkJLy8gRXZlcnl0aGluZyBlbHNlIG5vdCBpbiB1Y3NjaGFyCgkJCQkJICAgJGNoYXJhY3RlciA+IDB4RDdGRiAmJiAkY2hhcmFjdGVyIDwgMHhGOTAwCgkJCQkJfHwgJGNoYXJhY3RlciA8IDB4QTAKCQkJCQl8fCAkY2hhcmFjdGVyID4gMHhFRkZGRAoJCQkJKQoJCQkJJiYgKAoJCQkJCS8vIEV2ZXJ5dGhpbmcgbm90IGluIGlwcml2YXRlLCBpZiBpdCBhcHBsaWVzCgkJCQkJICAgISRpcHJpdmF0ZQoJCQkJCXx8ICRjaGFyYWN0ZXIgPCAweEUwMDAKCQkJCQl8fCAkY2hhcmFjdGVyID4gMHgxMEZGRkQKCQkJCSkKCQkJKQoJCQl7CgkJCQkvLyBJZiB3ZSB3ZXJlIGEgY2hhcmFjdGVyLCBwcmV0ZW5kIHdlIHdlcmVuJ3QsIGJ1dCByYXRoZXIgYW4gZXJyb3IuCgkJCQlpZiAoJHZhbGlkKQoJCQkJCSRwb3NpdGlvbi0tOwoKCQkJCWZvciAoJGogPSAkc3RhcnQ7ICRqIDw9ICRwb3NpdGlvbjsgJGorKykKCQkJCXsKCQkJCQkkc3RyaW5nID0gc3Vic3RyX3JlcGxhY2UoJHN0cmluZywgc3ByaW50ZignJSUlMDJYJywgb3JkKCRzdHJpbmdbJGpdKSksICRqLCAxKTsKCQkJCQkkaiArPSAyOwoJCQkJCSRwb3NpdGlvbiArPSAyOwoJCQkJCSRzdHJsZW4gKz0gMjsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuICRzdHJpbmc7Cgl9CgoJLyoqCgkgKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgcHJlZ19yZXBsYWNlX2NhbGxiYWNrLgoJICoKCSAqIFJlbW92ZXMgc2VxdWVuY2VzIG9mIHBlcmNlbnQgZW5jb2RlZCBieXRlcyB0aGF0IHJlcHJlc2VudCBVVEYtOAoJICogZW5jb2RlZCBjaGFyYWN0ZXJzIGluIGl1bnJlc2VydmVkCgkgKgoJICogQHBhcmFtIGFycmF5ICRtYXRjaCBQQ1JFIG1hdGNoCgkgKiBAcmV0dXJuIHN0cmluZyBSZXBsYWNlbWVudAoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gcmVtb3ZlX2l1bnJlc2VydmVkX3BlcmNlbnRfZW5jb2RlZCgkbWF0Y2gpCgl7CgkJLy8gQXMgd2UganVzdCBoYXZlIHZhbGlkIHBlcmNlbnQgZW5jb2RlZCBzZXF1ZW5jZXMgd2UgY2FuIGp1c3QgZXhwbG9kZQoJCS8vIGFuZCBpZ25vcmUgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgKGFuIGVtcHR5IHN0cmluZykuCgkJJGJ5dGVzID0gZXhwbG9kZSgnJScsICRtYXRjaFswXSk7CgoJCS8vIEluaXRpYWxpemUgdGhlIG5ldyBzdHJpbmcgKHRoaXMgaXMgd2hhdCB3aWxsIGJlIHJldHVybmVkKSBhbmQgdGhhdAoJCS8vIHRoZXJlIGFyZSBubyBieXRlcyByZW1haW5pbmcgaW4gdGhlIGN1cnJlbnQgc2VxdWVuY2UgKHVuc3VycHJpc2luZwoJCS8vIGF0IHRoZSBmaXJzdCBieXRlISkuCgkJJHN0cmluZyA9ICcnOwoJCSRyZW1haW5pbmcgPSAwOwoKCQkvLyBMb29wIG92ZXIgZWFjaCBhbmQgZXZlcnkgYnl0ZSwgYW5kIHNldCAkdmFsdWUgdG8gaXRzIHZhbHVlCgkJZm9yICgkaSA9IDEsICRsZW4gPSBjb3VudCgkYnl0ZXMpOyAkaSA8ICRsZW47ICRpKyspCgkJewoJCQkkdmFsdWUgPSBoZXhkZWMoJGJ5dGVzWyRpXSk7CgoJCQkvLyBJZiB3ZSdyZSB0aGUgZmlyc3QgYnl0ZSBvZiBzZXF1ZW5jZToKCQkJaWYgKCEkcmVtYWluaW5nKQoJCQl7CgkJCQkvLyBTdGFydCBwb3NpdGlvbgoJCQkJJHN0YXJ0ID0gJGk7CgoJCQkJLy8gQnkgZGVmYXVsdCB3ZSBhcmUgdmFsaWQKCQkJCSR2YWxpZCA9IHRydWU7CgoJCQkJLy8gT25lIGJ5dGUgc2VxdWVuY2U6CgkJCQlpZiAoJHZhbHVlIDw9IDB4N0YpCgkJCQl7CgkJCQkJJGNoYXJhY3RlciA9ICR2YWx1ZTsKCQkJCQkkbGVuZ3RoID0gMTsKCQkJCX0KCQkJCS8vIFR3byBieXRlIHNlcXVlbmNlOgoJCQkJZWxzZWlmICgoJHZhbHVlICYgMHhFMCkgPT09IDB4QzApCgkJCQl7CgkJCQkJJGNoYXJhY3RlciA9ICgkdmFsdWUgJiAweDFGKSA8PCA2OwoJCQkJCSRsZW5ndGggPSAyOwoJCQkJCSRyZW1haW5pbmcgPSAxOwoJCQkJfQoJCQkJLy8gVGhyZWUgYnl0ZSBzZXF1ZW5jZToKCQkJCWVsc2VpZiAoKCR2YWx1ZSAmIDB4RjApID09PSAweEUwKQoJCQkJewoJCQkJCSRjaGFyYWN0ZXIgPSAoJHZhbHVlICYgMHgwRikgPDwgMTI7CgkJCQkJJGxlbmd0aCA9IDM7CgkJCQkJJHJlbWFpbmluZyA9IDI7CgkJCQl9CgkJCQkvLyBGb3VyIGJ5dGUgc2VxdWVuY2U6CgkJCQllbHNlaWYgKCgkdmFsdWUgJiAweEY4KSA9PT0gMHhGMCkKCQkJCXsKCQkJCQkkY2hhcmFjdGVyID0gKCR2YWx1ZSAmIDB4MDcpIDw8IDE4OwoJCQkJCSRsZW5ndGggPSA0OwoJCQkJCSRyZW1haW5pbmcgPSAzOwoJCQkJfQoJCQkJLy8gSW52YWxpZCBieXRlOgoJCQkJZWxzZQoJCQkJewoJCQkJCSR2YWxpZCA9IGZhbHNlOwoJCQkJCSRyZW1haW5pbmcgPSAwOwoJCQkJfQoJCQl9CgkJCS8vIENvbnRpbnVhdGlvbiBieXRlOgoJCQllbHNlCgkJCXsKCQkJCS8vIENoZWNrIHRoYXQgdGhlIGJ5dGUgaXMgdmFsaWQsIHRoZW4gYWRkIGl0IHRvIHRoZSBjaGFyYWN0ZXI6CgkJCQlpZiAoKCR2YWx1ZSAmIDB4QzApID09PSAweDgwKQoJCQkJewoJCQkJCSRyZW1haW5pbmctLTsKCQkJCQkkY2hhcmFjdGVyIHw9ICgkdmFsdWUgJiAweDNGKSA8PCAoJHJlbWFpbmluZyAqIDYpOwoJCQkJfQoJCQkJLy8gSWYgaXQgaXMgaW52YWxpZCwgY291bnQgdGhlIHNlcXVlbmNlIGFzIGludmFsaWQgYW5kIHJlcHJvY2VzcyB0aGUgY3VycmVudCBieXRlIGFzIHRoZSBzdGFydCBvZiBhIHNlcXVlbmNlOgoJCQkJZWxzZQoJCQkJewoJCQkJCSR2YWxpZCA9IGZhbHNlOwoJCQkJCSRyZW1haW5pbmcgPSAwOwoJCQkJCSRpLS07CgkJCQl9CgkJCX0KCgkJCS8vIElmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBieXRlIHNlcXVlbmNlLCBhcHBlbmQgaXQgdG8gVW5pY29kZTo6JGRhdGEKCQkJaWYgKCEkcmVtYWluaW5nKQoJCQl7CgkJCQkvLyBQZXJjZW50IGVuY29kZSBhbnl0aGluZyBpbnZhbGlkIG9yIG5vdCBpbiBpdW5yZXNlcnZlZAoJCQkJaWYgKAoJCQkJCS8vIEludmFsaWQgc2VxdWVuY2VzCgkJCQkJISR2YWxpZAoJCQkJCS8vIE5vbi1zaG9ydGVzdCBmb3JtIHNlcXVlbmNlcyBhcmUgaW52YWxpZAoJCQkJCXx8ICRsZW5ndGggPiAxICYmICRjaGFyYWN0ZXIgPD0gMHg3RgoJCQkJCXx8ICRsZW5ndGggPiAyICYmICRjaGFyYWN0ZXIgPD0gMHg3RkYKCQkJCQl8fCAkbGVuZ3RoID4gMyAmJiAkY2hhcmFjdGVyIDw9IDB4RkZGRgoJCQkJCS8vIE91dHNpZGUgb2YgcmFuZ2Ugb2YgaXVucmVzZXJ2ZWQgY29kZXBvaW50cwoJCQkJCXx8ICRjaGFyYWN0ZXIgPCAweDJECgkJCQkJfHwgJGNoYXJhY3RlciA+IDB4RUZGRkQKCQkJCQkvLyBOb25jaGFyYWN0ZXJzCgkJCQkJfHwgKCRjaGFyYWN0ZXIgJiAweEZGRkUpID09PSAweEZGRkUKCQkJCQl8fCAkY2hhcmFjdGVyID49IDB4RkREMCAmJiAkY2hhcmFjdGVyIDw9IDB4RkRFRgoJCQkJCS8vIEV2ZXJ5dGhpbmcgZWxzZSBub3QgaW4gaXVucmVzZXJ2ZWQgKHRoaXMgaXMgYWxsIEJNUCkKCQkJCQl8fCAkY2hhcmFjdGVyID09PSAweDJGCgkJCQkJfHwgJGNoYXJhY3RlciA+IDB4MzkgJiYgJGNoYXJhY3RlciA8IDB4NDEKCQkJCQl8fCAkY2hhcmFjdGVyID4gMHg1QSAmJiAkY2hhcmFjdGVyIDwgMHg2MQoJCQkJCXx8ICRjaGFyYWN0ZXIgPiAweDdBICYmICRjaGFyYWN0ZXIgPCAweDdFCgkJCQkJfHwgJGNoYXJhY3RlciA+IDB4N0UgJiYgJGNoYXJhY3RlciA8IDB4QTAKCQkJCQl8fCAkY2hhcmFjdGVyID4gMHhEN0ZGICYmICRjaGFyYWN0ZXIgPCAweEY5MDAKCQkJCSkKCQkJCXsKCQkJCQlmb3IgKCRqID0gJHN0YXJ0OyAkaiA8PSAkaTsgJGorKykKCQkJCQl7CgkJCQkJCSRzdHJpbmcgLj0gJyUnIC4gc3RydG91cHBlcigkYnl0ZXNbJGpdKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJZm9yICgkaiA9ICRzdGFydDsgJGogPD0gJGk7ICRqKyspCgkJCQkJewoJCQkJCQkkc3RyaW5nIC49IGNocihoZXhkZWMoJGJ5dGVzWyRqXSkpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gSWYgd2UgaGF2ZSBhbnkgYnl0ZXMgbGVmdCBvdmVyIHRoZXkgYXJlIGludmFsaWQgKGkuZS4sIHdlIGFyZQoJCS8vIG1pZC13YXkgdGhyb3VnaCBhIG11bHRpLWJ5dGUgc2VxdWVuY2UpCgkJaWYgKCRyZW1haW5pbmcpCgkJewoJCQlmb3IgKCRqID0gJHN0YXJ0OyAkaiA8ICRsZW47ICRqKyspCgkJCXsKCQkJCSRzdHJpbmcgLj0gJyUnIC4gc3RydG91cHBlcigkYnl0ZXNbJGpdKTsKCQkJfQoJCX0KCgkJcmV0dXJuICRzdHJpbmc7Cgl9CgoJcHJvdGVjdGVkIGZ1bmN0aW9uIHNjaGVtZV9ub3JtYWxpemF0aW9uKCkKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPm5vcm1hbGl6YXRpb25bJHRoaXMtPnNjaGVtZV1bJ2l1c2VyaW5mbyddKSAmJiAkdGhpcy0+aXVzZXJpbmZvID09PSAkdGhpcy0+bm9ybWFsaXphdGlvblskdGhpcy0+c2NoZW1lXVsnaXVzZXJpbmZvJ10pCgkJewoJCQkkdGhpcy0+aXVzZXJpbmZvID0gbnVsbDsKCQl9CgkJaWYgKGlzc2V0KCR0aGlzLT5ub3JtYWxpemF0aW9uWyR0aGlzLT5zY2hlbWVdWydpaG9zdCddKSAmJiAkdGhpcy0+aWhvc3QgPT09ICR0aGlzLT5ub3JtYWxpemF0aW9uWyR0aGlzLT5zY2hlbWVdWydpaG9zdCddKQoJCXsKCQkJJHRoaXMtPmlob3N0ID0gbnVsbDsKCQl9CgkJaWYgKGlzc2V0KCR0aGlzLT5ub3JtYWxpemF0aW9uWyR0aGlzLT5zY2hlbWVdWydwb3J0J10pICYmICR0aGlzLT5wb3J0ID09PSAkdGhpcy0+bm9ybWFsaXphdGlvblskdGhpcy0+c2NoZW1lXVsncG9ydCddKQoJCXsKCQkJJHRoaXMtPnBvcnQgPSBudWxsOwoJCX0KCQlpZiAoaXNzZXQoJHRoaXMtPm5vcm1hbGl6YXRpb25bJHRoaXMtPnNjaGVtZV1bJ2lwYXRoJ10pICYmICR0aGlzLT5pcGF0aCA9PT0gJHRoaXMtPm5vcm1hbGl6YXRpb25bJHRoaXMtPnNjaGVtZV1bJ2lwYXRoJ10pCgkJewoJCQkkdGhpcy0+aXBhdGggPSAnJzsKCQl9CgkJaWYgKGlzc2V0KCR0aGlzLT5ub3JtYWxpemF0aW9uWyR0aGlzLT5zY2hlbWVdWydpcXVlcnknXSkgJiYgJHRoaXMtPmlxdWVyeSA9PT0gJHRoaXMtPm5vcm1hbGl6YXRpb25bJHRoaXMtPnNjaGVtZV1bJ2lxdWVyeSddKQoJCXsKCQkJJHRoaXMtPmlxdWVyeSA9IG51bGw7CgkJfQoJCWlmIChpc3NldCgkdGhpcy0+bm9ybWFsaXphdGlvblskdGhpcy0+c2NoZW1lXVsnaWZyYWdtZW50J10pICYmICR0aGlzLT5pZnJhZ21lbnQgPT09ICR0aGlzLT5ub3JtYWxpemF0aW9uWyR0aGlzLT5zY2hlbWVdWydpZnJhZ21lbnQnXSkKCQl7CgkJCSR0aGlzLT5pZnJhZ21lbnQgPSBudWxsOwoJCX0KCX0KCgkvKioKCSAqIENoZWNrIGlmIHRoZSBvYmplY3QgcmVwcmVzZW50cyBhIHZhbGlkIElSSS4gVGhpcyBuZWVkcyB0byBiZSBkb25lIG9uIGVhY2gKCSAqIGNhbGwgYXMgc29tZSB0aGluZ3MgY2hhbmdlIGRlcGVuZGluZyBvbiBhbm90aGVyIHBhcnQgb2YgdGhlIElSSS4KCSAqCgkgKiBAcmV0dXJuIGJvb2wKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGlzX3ZhbGlkKCkKCXsKCQkkaXNhdXRob3JpdHkgPSAkdGhpcy0+aXVzZXJpbmZvICE9PSBudWxsIHx8ICR0aGlzLT5paG9zdCAhPT0gbnVsbCB8fCAkdGhpcy0+cG9ydCAhPT0gbnVsbDsKCQlpZiAoJHRoaXMtPmlwYXRoICE9PSAnJyAmJgoJCQkoCgkJCQkkaXNhdXRob3JpdHkgJiYgKAoJCQkJCSR0aGlzLT5pcGF0aFswXSAhPT0gJy8nIHx8CgkJCQkJc3Vic3RyKCR0aGlzLT5pcGF0aCwgMCwgMikgPT09ICcvLycKCQkJCSkgfHwKCQkJCSgKCQkJCQkkdGhpcy0+c2NoZW1lID09PSBudWxsICYmCgkJCQkJISRpc2F1dGhvcml0eSAmJgoJCQkJCXN0cnBvcygkdGhpcy0+aXBhdGgsICc6JykgIT09IGZhbHNlICYmCgkJCQkJKHN0cnBvcygkdGhpcy0+aXBhdGgsICcvJykgPT09IGZhbHNlID8gdHJ1ZSA6IHN0cnBvcygkdGhpcy0+aXBhdGgsICc6JykgPCBzdHJwb3MoJHRoaXMtPmlwYXRoLCAnLycpKQoJCQkJKQoJCQkpCgkJKQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGVudGlyZSBJUkkuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlIChpZiB0aGVyZQoJICogYXJlIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMpLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGlyaQoJICogQHJldHVybiBib29sCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfaXJpKCRpcmkpCgl7CgkJc3RhdGljICRjYWNoZTsKCQlpZiAoISRjYWNoZSkKCQl7CgkJCSRjYWNoZSA9IGFycmF5KCk7CgkJfQoKCQlpZiAoJGlyaSA9PT0gbnVsbCkKCQl7CgkJCXJldHVybiB0cnVlOwoJCX0KCQllbHNlaWYgKGlzc2V0KCRjYWNoZVskaXJpXSkpCgkJewoJCQlsaXN0KCR0aGlzLT5zY2hlbWUsCgkJCQkgJHRoaXMtPml1c2VyaW5mbywKCQkJCSAkdGhpcy0+aWhvc3QsCgkJCQkgJHRoaXMtPnBvcnQsCgkJCQkgJHRoaXMtPmlwYXRoLAoJCQkJICR0aGlzLT5pcXVlcnksCgkJCQkgJHRoaXMtPmlmcmFnbWVudCwKCQkJCSAkcmV0dXJuKSA9ICRjYWNoZVskaXJpXTsKCQkJcmV0dXJuICRyZXR1cm47CgkJfQoJCWVsc2UKCQl7CgkJCSRwYXJzZWQgPSAkdGhpcy0+cGFyc2VfaXJpKChzdHJpbmcpICRpcmkpOwoKCQkJJHJldHVybiA9ICR0aGlzLT5zZXRfc2NoZW1lKCRwYXJzZWRbJ3NjaGVtZSddKQoJCQkJJiYgJHRoaXMtPnNldF9hdXRob3JpdHkoJHBhcnNlZFsnYXV0aG9yaXR5J10pCgkJCQkmJiAkdGhpcy0+c2V0X3BhdGgoJHBhcnNlZFsncGF0aCddKQoJCQkJJiYgJHRoaXMtPnNldF9xdWVyeSgkcGFyc2VkWydxdWVyeSddKQoJCQkJJiYgJHRoaXMtPnNldF9mcmFnbWVudCgkcGFyc2VkWydmcmFnbWVudCddKTsKCgkJCSRjYWNoZVskaXJpXSA9IGFycmF5KCR0aGlzLT5zY2hlbWUsCgkJCQkJCQkJICR0aGlzLT5pdXNlcmluZm8sCgkJCQkJCQkJICR0aGlzLT5paG9zdCwKCQkJCQkJCQkgJHRoaXMtPnBvcnQsCgkJCQkJCQkJICR0aGlzLT5pcGF0aCwKCQkJCQkJCQkgJHRoaXMtPmlxdWVyeSwKCQkJCQkJCQkgJHRoaXMtPmlmcmFnbWVudCwKCQkJCQkJCQkgJHJldHVybik7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCX0KCgkvKioKCSAqIFNldCB0aGUgc2NoZW1lLiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZSAoaWYgdGhlcmUgYXJlCgkgKiBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzKS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzY2hlbWUKCSAqIEByZXR1cm4gYm9vbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3NjaGVtZSgkc2NoZW1lKQoJewoJCWlmICgkc2NoZW1lID09PSBudWxsKQoJCXsKCQkJJHRoaXMtPnNjaGVtZSA9IG51bGw7CgkJfQoJCWVsc2VpZiAoIXByZWdfbWF0Y2goJy9eW0EtWmEtel1bMC05QS1aYS16K1wtLl0qJC8nLCAkc2NoZW1lKSkKCQl7CgkJCSR0aGlzLT5zY2hlbWUgPSBudWxsOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zY2hlbWUgPSBzdHJ0b2xvd2VyKCRzY2hlbWUpOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIFNldCB0aGUgYXV0aG9yaXR5LiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZSAoaWYgdGhlcmUgYXJlCgkgKiBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzKS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRhdXRob3JpdHkKCSAqIEByZXR1cm4gYm9vbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X2F1dGhvcml0eSgkYXV0aG9yaXR5KQoJewoJCXN0YXRpYyAkY2FjaGU7CgkJaWYgKCEkY2FjaGUpCgkJCSRjYWNoZSA9IGFycmF5KCk7CgoJCWlmICgkYXV0aG9yaXR5ID09PSBudWxsKQoJCXsKCQkJJHRoaXMtPml1c2VyaW5mbyA9IG51bGw7CgkJCSR0aGlzLT5paG9zdCA9IG51bGw7CgkJCSR0aGlzLT5wb3J0ID0gbnVsbDsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2VpZiAoaXNzZXQoJGNhY2hlWyRhdXRob3JpdHldKSkKCQl7CgkJCWxpc3QoJHRoaXMtPml1c2VyaW5mbywKCQkJCSAkdGhpcy0+aWhvc3QsCgkJCQkgJHRoaXMtPnBvcnQsCgkJCQkgJHJldHVybikgPSAkY2FjaGVbJGF1dGhvcml0eV07CgoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJZWxzZQoJCXsKCQkJJHJlbWFpbmluZyA9ICRhdXRob3JpdHk7CgkJCWlmICgoJGl1c2VyaW5mb19lbmQgPSBzdHJycG9zKCRyZW1haW5pbmcsICdAJykpICE9PSBmYWxzZSkKCQkJewoJCQkJJGl1c2VyaW5mbyA9IHN1YnN0cigkcmVtYWluaW5nLCAwLCAkaXVzZXJpbmZvX2VuZCk7CgkJCQkkcmVtYWluaW5nID0gc3Vic3RyKCRyZW1haW5pbmcsICRpdXNlcmluZm9fZW5kICsgMSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkaXVzZXJpbmZvID0gbnVsbDsKCQkJfQoJCQlpZiAoKCRwb3J0X3N0YXJ0ID0gc3RycG9zKCRyZW1haW5pbmcsICc6Jywgc3RycG9zKCRyZW1haW5pbmcsICddJykpKSAhPT0gZmFsc2UpCgkJCXsKCQkJCWlmICgoJHBvcnQgPSBzdWJzdHIoJHJlbWFpbmluZywgJHBvcnRfc3RhcnQgKyAxKSkgPT09IGZhbHNlKQoJCQkJewoJCQkJCSRwb3J0ID0gbnVsbDsKCQkJCX0KCQkJCSRyZW1haW5pbmcgPSBzdWJzdHIoJHJlbWFpbmluZywgMCwgJHBvcnRfc3RhcnQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHBvcnQgPSBudWxsOwoJCQl9CgoJCQkkcmV0dXJuID0gJHRoaXMtPnNldF91c2VyaW5mbygkaXVzZXJpbmZvKSAmJgoJCQkJCSAgJHRoaXMtPnNldF9ob3N0KCRyZW1haW5pbmcpICYmCgkJCQkJICAkdGhpcy0+c2V0X3BvcnQoJHBvcnQpOwoKCQkJJGNhY2hlWyRhdXRob3JpdHldID0gYXJyYXkoJHRoaXMtPml1c2VyaW5mbywKCQkJCQkJCQkJICAgJHRoaXMtPmlob3N0LAoJCQkJCQkJCQkgICAkdGhpcy0+cG9ydCwKCQkJCQkJCQkJICAgJHJldHVybik7CgoJCQlyZXR1cm4gJHJldHVybjsKCQl9Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGl1c2VyaW5mby4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRpdXNlcmluZm8KCSAqIEByZXR1cm4gYm9vbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3VzZXJpbmZvKCRpdXNlcmluZm8pCgl7CgkJaWYgKCRpdXNlcmluZm8gPT09IG51bGwpCgkJewoJCQkkdGhpcy0+aXVzZXJpbmZvID0gbnVsbDsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPml1c2VyaW5mbyA9ICR0aGlzLT5yZXBsYWNlX2ludmFsaWRfd2l0aF9wY3RfZW5jb2RpbmcoJGl1c2VyaW5mbywgJyEkJlwnKCkqKyw7PTonKTsKCQkJJHRoaXMtPnNjaGVtZV9ub3JtYWxpemF0aW9uKCk7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIFNldCB0aGUgaWhvc3QuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlIChpZiB0aGVyZSBhcmUKCSAqIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMpLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGlob3N0CgkgKiBAcmV0dXJuIGJvb2wKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9ob3N0KCRpaG9zdCkKCXsKCQlpZiAoJGlob3N0ID09PSBudWxsKQoJCXsKCQkJJHRoaXMtPmlob3N0ID0gbnVsbDsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCRpaG9zdCwgMCwgMSkgPT09ICdbJyAmJiBzdWJzdHIoJGlob3N0LCAtMSkgPT09ICddJykKCQl7CgkJCWlmIChTaW1wbGVQaWVfTmV0X0lQdjY6OmNoZWNrX2lwdjYoc3Vic3RyKCRpaG9zdCwgMSwgLTEpKSkKCQkJewoJCQkJJHRoaXMtPmlob3N0ID0gJ1snIC4gU2ltcGxlUGllX05ldF9JUHY2Ojpjb21wcmVzcyhzdWJzdHIoJGlob3N0LCAxLCAtMSkpIC4gJ10nOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPmlob3N0ID0gbnVsbDsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkaWhvc3QgPSAkdGhpcy0+cmVwbGFjZV9pbnZhbGlkX3dpdGhfcGN0X2VuY29kaW5nKCRpaG9zdCwgJyEkJlwnKCkqKyw7PScpOwoKCQkJLy8gTG93ZXJjYXNlLCBidXQgaWdub3JlIHBjdC1lbmNvZGVkIHNlY3Rpb25zIChhcyB0aGV5IHNob3VsZAoJCQkvLyByZW1haW4gdXBwZXJjYXNlKS4gVGhpcyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIHByZXZpb3VzIHN0ZXAKCQkJLy8gYXMgdGhhdCBjYW4gYWRkIHVuZXNjYXBlZCBjaGFyYWN0ZXJzLgoJCQkkcG9zaXRpb24gPSAwOwoJCQkkc3RybGVuID0gc3RybGVuKCRpaG9zdCk7CgkJCXdoaWxlICgoJHBvc2l0aW9uICs9IHN0cmNzcG4oJGlob3N0LCAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVolJywgJHBvc2l0aW9uKSkgPCAkc3RybGVuKQoJCQl7CgkJCQlpZiAoJGlob3N0WyRwb3NpdGlvbl0gPT09ICclJykKCQkJCXsKCQkJCQkkcG9zaXRpb24gKz0gMzsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkaWhvc3RbJHBvc2l0aW9uXSA9IHN0cnRvbG93ZXIoJGlob3N0WyRwb3NpdGlvbl0pOwoJCQkJCSRwb3NpdGlvbisrOwoJCQkJfQoJCQl9CgoJCQkkdGhpcy0+aWhvc3QgPSAkaWhvc3Q7CgkJfQoKCQkkdGhpcy0+c2NoZW1lX25vcm1hbGl6YXRpb24oKTsKCgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIHBvcnQuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlIChpZiB0aGVyZSBhcmUKCSAqIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMpLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHBvcnQKCSAqIEByZXR1cm4gYm9vbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3BvcnQoJHBvcnQpCgl7CgkJaWYgKCRwb3J0ID09PSBudWxsKQoJCXsKCQkJJHRoaXMtPnBvcnQgPSBudWxsOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJZWxzZWlmIChzdHJzcG4oJHBvcnQsICcwMTIzNDU2Nzg5JykgPT09IHN0cmxlbigkcG9ydCkpCgkJewoJCQkkdGhpcy0+cG9ydCA9IChpbnQpICRwb3J0OwoJCQkkdGhpcy0+c2NoZW1lX25vcm1hbGl6YXRpb24oKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5wb3J0ID0gbnVsbDsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFNldCB0aGUgaXBhdGguCgkgKgoJICogQHBhcmFtIHN0cmluZyAkaXBhdGgKCSAqIEByZXR1cm4gYm9vbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3BhdGgoJGlwYXRoKQoJewoJCXN0YXRpYyAkY2FjaGU7CgkJaWYgKCEkY2FjaGUpCgkJewoJCQkkY2FjaGUgPSBhcnJheSgpOwoJCX0KCgkJJGlwYXRoID0gKHN0cmluZykgJGlwYXRoOwoKCQlpZiAoaXNzZXQoJGNhY2hlWyRpcGF0aF0pKQoJCXsKCQkJJHRoaXMtPmlwYXRoID0gJGNhY2hlWyRpcGF0aF1bKGludCkgKCR0aGlzLT5zY2hlbWUgIT09IG51bGwpXTsKCQl9CgkJZWxzZQoJCXsKCQkJJHZhbGlkID0gJHRoaXMtPnJlcGxhY2VfaW52YWxpZF93aXRoX3BjdF9lbmNvZGluZygkaXBhdGgsICchJCZcJygpKissOz1AOi8nKTsKCQkJJHJlbW92ZWQgPSAkdGhpcy0+cmVtb3ZlX2RvdF9zZWdtZW50cygkdmFsaWQpOwoKCQkJJGNhY2hlWyRpcGF0aF0gPSBhcnJheSgkdmFsaWQsICRyZW1vdmVkKTsKCQkJJHRoaXMtPmlwYXRoID0gICgkdGhpcy0+c2NoZW1lICE9PSBudWxsKSA/ICRyZW1vdmVkIDogJHZhbGlkOwoJCX0KCgkJJHRoaXMtPnNjaGVtZV9ub3JtYWxpemF0aW9uKCk7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGlxdWVyeS4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRpcXVlcnkKCSAqIEByZXR1cm4gYm9vbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3F1ZXJ5KCRpcXVlcnkpCgl7CgkJaWYgKCRpcXVlcnkgPT09IG51bGwpCgkJewoJCQkkdGhpcy0+aXF1ZXJ5ID0gbnVsbDsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmlxdWVyeSA9ICR0aGlzLT5yZXBsYWNlX2ludmFsaWRfd2l0aF9wY3RfZW5jb2RpbmcoJGlxdWVyeSwgJyEkJlwnKCkqKyw7PTpALz8nLCB0cnVlKTsKCQkJJHRoaXMtPnNjaGVtZV9ub3JtYWxpemF0aW9uKCk7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKCS8qKgoJICogU2V0IHRoZSBpZnJhZ21lbnQuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkaWZyYWdtZW50CgkgKiBAcmV0dXJuIGJvb2wKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9mcmFnbWVudCgkaWZyYWdtZW50KQoJewoJCWlmICgkaWZyYWdtZW50ID09PSBudWxsKQoJCXsKCQkJJHRoaXMtPmlmcmFnbWVudCA9IG51bGw7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5pZnJhZ21lbnQgPSAkdGhpcy0+cmVwbGFjZV9pbnZhbGlkX3dpdGhfcGN0X2VuY29kaW5nKCRpZnJhZ21lbnQsICchJCZcJygpKissOz06QC8/Jyk7CgkJCSR0aGlzLT5zY2hlbWVfbm9ybWFsaXphdGlvbigpOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIENvbnZlcnQgYW4gSVJJIHRvIGEgVVJJIChvciBwYXJ0cyB0aGVyZW9mKQoJICoKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB0b191cmkoJHN0cmluZykKCXsKCQlzdGF0aWMgJG5vbl9hc2NpaTsKCQlpZiAoISRub25fYXNjaWkpCgkJewoJCQkkbm9uX2FzY2lpID0gaW1wbG9kZSgnJywgcmFuZ2UoIlx4ODAiLCAiXHhGRiIpKTsKCQl9CgoJCSRwb3NpdGlvbiA9IDA7CgkJJHN0cmxlbiA9IHN0cmxlbigkc3RyaW5nKTsKCQl3aGlsZSAoKCRwb3NpdGlvbiArPSBzdHJjc3BuKCRzdHJpbmcsICRub25fYXNjaWksICRwb3NpdGlvbikpIDwgJHN0cmxlbikKCQl7CgkJCSRzdHJpbmcgPSBzdWJzdHJfcmVwbGFjZSgkc3RyaW5nLCBzcHJpbnRmKCclJSUwMlgnLCBvcmQoJHN0cmluZ1skcG9zaXRpb25dKSksICRwb3NpdGlvbiwgMSk7CgkJCSRwb3NpdGlvbiArPSAzOwoJCQkkc3RybGVuICs9IDI7CgkJfQoKCQlyZXR1cm4gJHN0cmluZzsKCX0KCgkvKioKCSAqIEdldCB0aGUgY29tcGxldGUgSVJJCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9pcmkoKQoJewoJCWlmICghJHRoaXMtPmlzX3ZhbGlkKCkpCgkJewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkkaXJpID0gJyc7CgkJaWYgKCR0aGlzLT5zY2hlbWUgIT09IG51bGwpCgkJewoJCQkkaXJpIC49ICR0aGlzLT5zY2hlbWUgLiAnOic7CgkJfQoJCWlmICgoJGlhdXRob3JpdHkgPSAkdGhpcy0+Z2V0X2lhdXRob3JpdHkoKSkgIT09IG51bGwpCgkJewoJCQkkaXJpIC49ICcvLycgLiAkaWF1dGhvcml0eTsKCQl9CgkJaWYgKCR0aGlzLT5pcGF0aCAhPT0gJycpCgkJewoJCQkkaXJpIC49ICR0aGlzLT5pcGF0aDsKCQl9CgkJZWxzZWlmICghZW1wdHkoJHRoaXMtPm5vcm1hbGl6YXRpb25bJHRoaXMtPnNjaGVtZV1bJ2lwYXRoJ10pICYmICRpYXV0aG9yaXR5ICE9PSBudWxsICYmICRpYXV0aG9yaXR5ICE9PSAnJykKCQl7CgkJCSRpcmkgLj0gJHRoaXMtPm5vcm1hbGl6YXRpb25bJHRoaXMtPnNjaGVtZV1bJ2lwYXRoJ107CgkJfQoJCWlmICgkdGhpcy0+aXF1ZXJ5ICE9PSBudWxsKQoJCXsKCQkJJGlyaSAuPSAnPycgLiAkdGhpcy0+aXF1ZXJ5OwoJCX0KCQlpZiAoJHRoaXMtPmlmcmFnbWVudCAhPT0gbnVsbCkKCQl7CgkJCSRpcmkgLj0gJyMnIC4gJHRoaXMtPmlmcmFnbWVudDsKCQl9CgoJCXJldHVybiAkaXJpOwoJfQoKCS8qKgoJICogR2V0IHRoZSBjb21wbGV0ZSBVUkkKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3VyaSgpCgl7CgkJcmV0dXJuICR0aGlzLT50b191cmkoJHRoaXMtPmdldF9pcmkoKSk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGNvbXBsZXRlIGlhdXRob3JpdHkKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0X2lhdXRob3JpdHkoKQoJewoJCWlmICgkdGhpcy0+aXVzZXJpbmZvICE9PSBudWxsIHx8ICR0aGlzLT5paG9zdCAhPT0gbnVsbCB8fCAkdGhpcy0+cG9ydCAhPT0gbnVsbCkKCQl7CgkJCSRpYXV0aG9yaXR5ID0gJyc7CgkJCWlmICgkdGhpcy0+aXVzZXJpbmZvICE9PSBudWxsKQoJCQl7CgkJCQkkaWF1dGhvcml0eSAuPSAkdGhpcy0+aXVzZXJpbmZvIC4gJ0AnOwoJCQl9CgkJCWlmICgkdGhpcy0+aWhvc3QgIT09IG51bGwpCgkJCXsKCQkJCSRpYXV0aG9yaXR5IC49ICR0aGlzLT5paG9zdDsKCQkJfQoJCQlpZiAoJHRoaXMtPnBvcnQgIT09IG51bGwpCgkJCXsKCQkJCSRpYXV0aG9yaXR5IC49ICc6JyAuICR0aGlzLT5wb3J0OwoJCQl9CgkJCXJldHVybiAkaWF1dGhvcml0eTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBjb21wbGV0ZSBhdXRob3JpdHkKCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0X2F1dGhvcml0eSgpCgl7CgkJJGlhdXRob3JpdHkgPSAkdGhpcy0+Z2V0X2lhdXRob3JpdHkoKTsKCQlpZiAoaXNfc3RyaW5nKCRpYXV0aG9yaXR5KSkKCQkJcmV0dXJuICR0aGlzLT50b191cmkoJGlhdXRob3JpdHkpOwoJCWVsc2UKCQkJcmV0dXJuICRpYXV0aG9yaXR5OwoJfQp9CgovKioKICogTWFuYWdlcyBhbGwgaXRlbS1yZWxhdGVkIGRhdGEKICoKICogVXNlZCBieSB7QHNlZSBTaW1wbGVQaWU6OmdldF9pdGVtKCl9IGFuZCB7QHNlZSBTaW1wbGVQaWU6OmdldF9pdGVtcygpfQogKgogKiBUaGlzIGNsYXNzIGNhbiBiZSBvdmVybG9hZGVkIHdpdGgge0BzZWUgU2ltcGxlUGllOjpzZXRfaXRlbV9jbGFzcygpfQogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICogQHN1YnBhY2thZ2UgQVBJCiAqLwpjbGFzcyBTaW1wbGVQaWVfSXRlbQp7CgkvKioKCSAqIFBhcmVudCBmZWVkCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIFNpbXBsZVBpZQoJICovCgl2YXIgJGZlZWQ7CgoJLyoqCgkgKiBSYXcgZGF0YQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBhcnJheQoJICovCgl2YXIgJGRhdGEgPSBhcnJheSgpOwoKCS8qKgoJICogUmVnaXN0cnkgb2JqZWN0CgkgKgoJICogQHNlZSBzZXRfcmVnaXN0cnkKCSAqIEB2YXIgU2ltcGxlUGllX1JlZ2lzdHJ5CgkgKi8KCXByb3RlY3RlZCAkcmVnaXN0cnk7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgaXRlbSBvYmplY3QKCSAqCgkgKiBUaGlzIGlzIHVzdWFsbHkgdXNlZCBieSB7QHNlZSBTaW1wbGVQaWU6OmdldF9pdGVtc30gYW5kCgkgKiB7QHNlZSBTaW1wbGVQaWU6OmdldF9pdGVtfS4gQXZvaWQgY3JlYXRpbmcgdGhpcyBtYW51YWxseS4KCSAqCgkgKiBAcGFyYW0gU2ltcGxlUGllICRmZWVkIFBhcmVudCBmZWVkCgkgKiBAcGFyYW0gYXJyYXkgJGRhdGEgUmF3IGRhdGEKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRmZWVkLCAkZGF0YSkKCXsKCQkkdGhpcy0+ZmVlZCA9ICRmZWVkOwoJCSR0aGlzLT5kYXRhID0gJGRhdGE7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIHJlZ2lzdHJ5IGhhbmRsZXIKCSAqCgkgKiBUaGlzIGlzIHVzdWFsbHkgdXNlZCBieSB7QHNlZSBTaW1wbGVQaWVfUmVnaXN0cnk6OmNyZWF0ZX0KCSAqCgkgKiBAc2luY2UgMS4zCgkgKiBAcGFyYW0gU2ltcGxlUGllX1JlZ2lzdHJ5ICRyZWdpc3RyeQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3JlZ2lzdHJ5KFNpbXBsZVBpZV9SZWdpc3RyeSAkcmVnaXN0cnkpCgl7CgkJJHRoaXMtPnJlZ2lzdHJ5ID0gJHJlZ2lzdHJ5OwoJfQoKCS8qKgoJICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpdGVtCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCXJldHVybiBtZDUoc2VyaWFsaXplKCR0aGlzLT5kYXRhKSk7Cgl9CgoJLyoqCgkgKiBSZW1vdmUgaXRlbXMgdGhhdCBsaW5rIGJhY2sgdG8gdGhpcyBiZWZvcmUgZGVzdHJveWluZyB0aGlzIG9iamVjdAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpCgl7CgkJaWYgKCh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjMnLCAnPCcpIHx8ICFnY19lbmFibGVkKCkpICYmICFpbmlfZ2V0KCd6ZW5kLnplMV9jb21wYXRpYmlsaXR5X21vZGUnKSkKCQl7CgkJCXVuc2V0KCR0aGlzLT5mZWVkKTsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgZGF0YSBmb3IgYW4gaXRlbS1sZXZlbCBlbGVtZW50CgkgKgoJICogVGhpcyBtZXRob2QgYWxsb3dzIHlvdSB0byBnZXQgYWNjZXNzIHRvIEFOWSBlbGVtZW50L2F0dHJpYnV0ZSB0aGF0IGlzIGEKCSAqIHN1Yi1lbGVtZW50IG9mIHRoZSBpdGVtL2VudHJ5IHRhZy4KCSAqCgkgKiBTZWUge0BzZWUgU2ltcGxlUGllOjpnZXRfZmVlZF90YWdzKCl9IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSByZXR1cm4gdmFsdWUKCSAqCgkgKiBAc2luY2UgMS4wCgkgKiBAc2VlIGh0dHA6Ly9zaW1wbGVwaWUub3JnL3dpa2kvZmFxL3N1cHBvcnRlZF94bWxfbmFtZXNwYWNlcwoJICogQHBhcmFtIHN0cmluZyAkbmFtZXNwYWNlIFRoZSBVUkwgb2YgdGhlIFhNTCBuYW1lc3BhY2Ugb2YgdGhlIGVsZW1lbnRzIHlvdSdyZSB0cnlpbmcgdG8gYWNjZXNzCgkgKiBAcGFyYW0gc3RyaW5nICR0YWcgVGFnIG5hbWUKCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9pdGVtX3RhZ3MoJG5hbWVzcGFjZSwgJHRhZykKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ10pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5kYXRhWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGJhc2UgVVJMIHZhbHVlIGZyb20gdGhlIHBhcmVudCBmZWVkCgkgKgoJICogVXNlcyBgPHhtbDpiYXNlPmAKCSAqCgkgKiBAcGFyYW0gYXJyYXkgJGVsZW1lbnQKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfYmFzZSgkZWxlbWVudCA9IGFycmF5KCkpCgl7CgkJcmV0dXJuICR0aGlzLT5mZWVkLT5nZXRfYmFzZSgkZWxlbWVudCk7Cgl9CgoJLyoqCgkgKiBTYW5pdGl6ZSBmZWVkIGRhdGEKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBzZWUgU2ltcGxlUGllOjpzYW5pdGl6ZSgpCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIERhdGEgdG8gc2FuaXRpemUKCSAqIEBwYXJhbSBpbnQgJHR5cGUgT25lIG9mIHRoZSBTSU1QTEVQSUVfQ09OU1RSVUNUXyogY29uc3RhbnRzCgkgKiBAcGFyYW0gc3RyaW5nICRiYXNlIEJhc2UgVVJMIHRvIHJlc29sdmUgVVJMcyBhZ2FpbnN0CgkgKiBAcmV0dXJuIHN0cmluZyBTYW5pdGl6ZWQgZGF0YQoJICovCglwdWJsaWMgZnVuY3Rpb24gc2FuaXRpemUoJGRhdGEsICR0eXBlLCAkYmFzZSA9ICcnKQoJewoJCXJldHVybiAkdGhpcy0+ZmVlZC0+c2FuaXRpemUoJGRhdGEsICR0eXBlLCAkYmFzZSk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHBhcmVudCBmZWVkCgkgKgoJICogTm90ZTogdGhpcyBtYXkgbm90IHdvcmsgYXMgeW91IHRoaW5rIGZvciBtdWx0aWZlZWRzIQoJICoKCSAqIEBsaW5rIGh0dHA6Ly9zaW1wbGVwaWUub3JnL2ZhcS90eXBpY2FsX211bHRpZmVlZF9nb3RjaGFzI21pc3NpbmdfZGF0YV9mcm9tX2ZlZWQKCSAqIEBzaW5jZSAxLjAKCSAqIEByZXR1cm4gU2ltcGxlUGllCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfZmVlZCgpCgl7CgkJcmV0dXJuICR0aGlzLT5mZWVkOwoJfQoKCS8qKgoJICogR2V0IHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGl0ZW0KCSAqCgkgKiBUaGlzIGlzIHVzdWFsbHkgdXNlZCB3aGVuIHdyaXRpbmcgY29kZSB0byBjaGVjayBmb3IgbmV3IGl0ZW1zIGluIGEgZmVlZC4KCSAqCgkgKiBVc2VzIGA8YXRvbTppZD5gLCBgPGd1aWQ+YCwgYDxkYzppZGVudGlmaWVyPmAgb3IgdGhlIGBhYm91dGAgYXR0cmlidXRlCgkgKiBmb3IgUkRGLiBJZiBub25lIG9mIHRoZXNlIGFyZSBzdXBwbGllZCAob3IgYCRoYXNoYCBpcyB0cnVlKSwgY3JlYXRlcyBhbgoJICogTUQ1IGhhc2ggYmFzZWQgb24gdGhlIHBlcm1hbGluayBhbmQgdGl0bGUuIElmIGVpdGhlciBvZiB0aG9zZSBhcmUgbm90CgkgKiBzdXBwbGllZCwgY3JlYXRlcyBhIGhhc2ggYmFzZWQgb24gdGhlIGZ1bGwgZmVlZCBkYXRhLgoJICoKCSAqIEBzaW5jZSBCZXRhIDIKCSAqIEBwYXJhbSBib29sZWFuICRoYXNoIFNob3VsZCB3ZSBmb3JjZSB1c2luZyBhIGhhc2ggaW5zdGVhZCBvZiB0aGUgc3VwcGxpZWQgSUQ/CgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2lkKCRoYXNoID0gZmFsc2UpCgl7CgkJaWYgKCEkaGFzaCkKCQl7CgkJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnaWQnKSkKCQkJewoJCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnaWQnKSkKCQkJewoJCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjAsICdndWlkJykpCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdpZGVudGlmaWVyJykpCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAsICdpZGVudGlmaWVyJykpCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2F0dHJpYnMnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ2Fib3V0J10pKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCR0aGlzLT5kYXRhWydhdHRyaWJzJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydhYm91dCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWVsc2VpZiAoKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3Blcm1hbGluaygpKSAhPT0gbnVsbCkKCQkJewoJCQkJcmV0dXJuICRyZXR1cm47CgkJCX0KCQkJZWxzZWlmICgoJHJldHVybiA9ICR0aGlzLT5nZXRfdGl0bGUoKSkgIT09IG51bGwpCgkJCXsKCQkJCXJldHVybiAkcmV0dXJuOwoJCQl9CgkJfQoJCWlmICgkdGhpcy0+Z2V0X3Blcm1hbGluaygpICE9PSBudWxsIHx8ICR0aGlzLT5nZXRfdGl0bGUoKSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiBtZDUoJHRoaXMtPmdldF9wZXJtYWxpbmsoKSAuICR0aGlzLT5nZXRfdGl0bGUoKSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBtZDUoc2VyaWFsaXplKCR0aGlzLT5kYXRhKSk7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSB0aXRsZSBvZiB0aGUgaXRlbQoJICoKCSAqIFVzZXMgYDxhdG9tOnRpdGxlPmAsIGA8dGl0bGU+YCBvciBgPGRjOnRpdGxlPmAKCSAqCgkgKiBAc2luY2UgQmV0YSAyIChwcmV2aW91c2x5IGNhbGxlZCBgZ2V0X2l0ZW1fdGl0bGVgIHNpbmNlIDAuOCkKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF90aXRsZSgpCgl7CgkJaWYgKCFpc3NldCgkdGhpcy0+ZGF0YVsndGl0bGUnXSkpCgkJewoJCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ3RpdGxlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0aXRsZSddID0gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2F0b21fMTBfY29uc3RydWN0X3R5cGUnLCBhcnJheSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICd0aXRsZScpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsndGl0bGUnXSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnTWlzYycsICdhdG9tXzAzX2NvbnN0cnVjdF90eXBlJywgYXJyYXkoJHJldHVyblswXVsnYXR0cmlicyddKSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICd0aXRsZScpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsndGl0bGUnXSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAsICd0aXRsZScpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsndGl0bGUnXSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMCwgJ3RpdGxlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0aXRsZSddID0gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCQl9CgkJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICd0aXRsZScpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsndGl0bGUnXSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ3RpdGxlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0aXRsZSddID0gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0aXRsZSddID0gbnVsbDsKCQkJfQoJCX0KCQlyZXR1cm4gJHRoaXMtPmRhdGFbJ3RpdGxlJ107Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGNvbnRlbnQgZm9yIHRoZSBpdGVtCgkgKgoJICogUHJlZmVycyBzdW1tYXJpZXMgb3ZlciBmdWxsIGNvbnRlbnQgLCBidXQgd2lsbCByZXR1cm4gZnVsbCBjb250ZW50IGlmIGEKCSAqIHN1bW1hcnkgZG9lcyBub3QgZXhpc3QuCgkgKgoJICogVG8gcHJlZmVyIGZ1bGwgY29udGVudCBpbnN0ZWFkLCB1c2Uge0BzZWUgZ2V0X2NvbnRlbnR9CgkgKgoJICogVXNlcyBgPGF0b206c3VtbWFyeT5gLCBgPGRlc2NyaXB0aW9uPmAsIGA8ZGM6ZGVzY3JpcHRpb24+YCBvcgoJICogYDxpdHVuZXM6c3VidGl0bGU+YAoJICoKCSAqIEBzaW5jZSAwLjgKCSAqIEBwYXJhbSBib29sZWFuICRkZXNjcmlwdGlvbl9vbmx5IFNob3VsZCB3ZSBhdm9pZCBmYWxsaW5nIGJhY2sgdG8gdGhlIGNvbnRlbnQ/CgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfZGVzY3JpcHRpb24oJGRlc2NyaXB0aW9uX29ubHkgPSBmYWxzZSkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ3N1bW1hcnknKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnYXRvbV8xMF9jb25zdHJ1Y3RfdHlwZScsIGFycmF5KCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSkpLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdzdW1tYXJ5JykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2F0b21fMDNfY29uc3RydWN0X3R5cGUnLCBhcnJheSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjAsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdzdW1tYXJ5JykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ3N1YnRpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAnZGVzY3JpcHRpb24nKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0hUTUwpOwoJCX0KCgkJZWxzZWlmICghJGRlc2NyaXB0aW9uX29ubHkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmdldF9jb250ZW50KHRydWUpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGNvbnRlbnQgZm9yIHRoZSBpdGVtCgkgKgoJICogUHJlZmVycyBmdWxsIGNvbnRlbnQgb3ZlciBzdW1tYXJpZXMsIGJ1dCB3aWxsIHJldHVybiBhIHN1bW1hcnkgaWYgZnVsbAoJICogY29udGVudCBkb2VzIG5vdCBleGlzdC4KCSAqCgkgKiBUbyBwcmVmZXIgc3VtbWFyaWVzIGluc3RlYWQsIHVzZSB7QHNlZSBnZXRfZGVzY3JpcHRpb259CgkgKgoJICogVXNlcyBgPGF0b206Y29udGVudD5gIG9yIGA8Y29udGVudDplbmNvZGVkPmAgKFJTUyAxLjAgQ29udGVudCBNb2R1bGUpCgkgKgoJICogQHNpbmNlIDEuMAoJICogQHBhcmFtIGJvb2xlYW4gJGNvbnRlbnRfb25seSBTaG91bGQgd2UgYXZvaWQgZmFsbGluZyBiYWNrIHRvIHRoZSBkZXNjcmlwdGlvbj8KCSAqIEByZXR1cm4gc3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9jb250ZW50KCRjb250ZW50X29ubHkgPSBmYWxzZSkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2NvbnRlbnQnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnYXRvbV8xMF9jb250ZW50X2NvbnN0cnVjdF90eXBlJywgYXJyYXkoJHJldHVyblswXVsnYXR0cmlicyddKSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2NvbnRlbnQnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnYXRvbV8wM19jb25zdHJ1Y3RfdHlwZScsIGFycmF5KCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSkpLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMF9NT0RVTEVTX0NPTlRFTlQsICdlbmNvZGVkJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCEkY29udGVudF9vbmx5KQoJCXsKCQkJcmV0dXJuICR0aGlzLT5nZXRfZGVzY3JpcHRpb24odHJ1ZSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCBhIGNhdGVnb3J5IGZvciB0aGUgaXRlbQoJICoKCSAqIEBzaW5jZSBCZXRhIDMgKHByZXZpb3VzbHkgY2FsbGVkIGBnZXRfY2F0ZWdvcmllcygpYCBzaW5jZSBCZXRhIDIpCgkgKiBAcGFyYW0gaW50ICRrZXkgVGhlIGNhdGVnb3J5IHRoYXQgeW91IHdhbnQgdG8gcmV0dXJuLiAgUmVtZW1iZXIgdGhhdCBhcnJheXMgYmVnaW4gd2l0aCAwLCBub3QgMQoJICogQHJldHVybiBTaW1wbGVQaWVfQ2F0ZWdvcnl8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2NhdGVnb3J5KCRrZXkgPSAwKQoJewoJCSRjYXRlZ29yaWVzID0gJHRoaXMtPmdldF9jYXRlZ29yaWVzKCk7CgkJaWYgKGlzc2V0KCRjYXRlZ29yaWVzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkY2F0ZWdvcmllc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IGFsbCBjYXRlZ29yaWVzIGZvciB0aGUgaXRlbQoJICoKCSAqIFVzZXMgYDxhdG9tOmNhdGVnb3J5PmAsIGA8Y2F0ZWdvcnk+YCBvciBgPGRjOnN1YmplY3Q+YAoJICoKCSAqIEBzaW5jZSBCZXRhIDMKCSAqIEByZXR1cm4gYXJyYXl8bnVsbCBMaXN0IG9mIHtAc2VlIFNpbXBsZVBpZV9DYXRlZ29yeX0gb2JqZWN0cwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2NhdGVnb3JpZXMoKQoJewoJCSRjYXRlZ29yaWVzID0gYXJyYXkoKTsKCgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdjYXRlZ29yeScpIGFzICRjYXRlZ29yeSkKCQl7CgkJCSR0ZXJtID0gbnVsbDsKCQkJJHNjaGVtZSA9IG51bGw7CgkJCSRsYWJlbCA9IG51bGw7CgkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3Rlcm0nXSkpCgkJCXsKCQkJCSR0ZXJtID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsndGVybSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJewoJCQkJJHNjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2xhYmVsJ10pKQoJCQl7CgkJCQkkbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCSRjYXRlZ29yaWVzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQ2F0ZWdvcnknLCBhcnJheSgkdGVybSwgJHNjaGVtZSwgJGxhYmVsKSk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjAsICdjYXRlZ29yeScpIGFzICRjYXRlZ29yeSkKCQl7CgkJCS8vIFRoaXMgaXMgcmVhbGx5IHRoZSBsYWJlbCwgYnV0IGtlZXAgdGhpcyBhcyB0aGUgdGVybSBhbHNvIGZvciBCQy4KCQkJLy8gTGFiZWwgd2lsbCBhbHNvIHdvcmsgb24gcmV0cmlldmluZyBiZWNhdXNlIHRoYXQgZmFsbHMgYmFjayB0byB0ZXJtLgoJCQkkdGVybSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnZG9tYWluJ10pKQoJCQl7CgkJCQkkc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnZG9tYWluJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkc2NoZW1lID0gbnVsbDsKCQkJfQoJCQkkY2F0ZWdvcmllc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NhdGVnb3J5JywgYXJyYXkoJHRlcm0sICRzY2hlbWUsIG51bGwpKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExLCAnc3ViamVjdCcpIGFzICRjYXRlZ29yeSkKCQl7CgkJCSRjYXRlZ29yaWVzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQ2F0ZWdvcnknLCBhcnJheSgkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAnc3ViamVjdCcpIGFzICRjYXRlZ29yeSkKCQl7CgkJCSRjYXRlZ29yaWVzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQ2F0ZWdvcnknLCBhcnJheSgkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpKTsKCQl9CgoJCWlmICghZW1wdHkoJGNhdGVnb3JpZXMpKQoJCXsKCQkJcmV0dXJuIGFycmF5X3VuaXF1ZSgkY2F0ZWdvcmllcyk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCBhbiBhdXRob3IgZm9yIHRoZSBpdGVtCgkgKgoJICogQHNpbmNlIEJldGEgMgoJICogQHBhcmFtIGludCAka2V5IFRoZSBhdXRob3IgdGhhdCB5b3Ugd2FudCB0byByZXR1cm4uICBSZW1lbWJlciB0aGF0IGFycmF5cyBiZWdpbiB3aXRoIDAsIG5vdCAxCgkgKiBAcmV0dXJuIFNpbXBsZVBpZV9BdXRob3J8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2F1dGhvcigka2V5ID0gMCkKCXsKCQkkYXV0aG9ycyA9ICR0aGlzLT5nZXRfYXV0aG9ycygpOwoJCWlmIChpc3NldCgkYXV0aG9yc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGF1dGhvcnNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCBhIGNvbnRyaWJ1dG9yIGZvciB0aGUgaXRlbQoJICoKCSAqIEBzaW5jZSAxLjEKCSAqIEBwYXJhbSBpbnQgJGtleSBUaGUgY29udHJidXRvciB0aGF0IHlvdSB3YW50IHRvIHJldHVybi4gIFJlbWVtYmVyIHRoYXQgYXJyYXlzIGJlZ2luIHdpdGggMCwgbm90IDEKCSAqIEByZXR1cm4gU2ltcGxlUGllX0F1dGhvcnxudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29udHJpYnV0b3IoJGtleSA9IDApCgl7CgkJJGNvbnRyaWJ1dG9ycyA9ICR0aGlzLT5nZXRfY29udHJpYnV0b3JzKCk7CgkJaWYgKGlzc2V0KCRjb250cmlidXRvcnNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRjb250cmlidXRvcnNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCBhbGwgY29udHJpYnV0b3JzIGZvciB0aGUgaXRlbQoJICoKCSAqIFVzZXMgYDxhdG9tOmNvbnRyaWJ1dG9yPmAKCSAqCgkgKiBAc2luY2UgMS4xCgkgKiBAcmV0dXJuIGFycmF5fG51bGwgTGlzdCBvZiB7QHNlZSBTaW1wbGVQaWVfQXV0aG9yfSBvYmplY3RzCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29udHJpYnV0b3JzKCkKCXsKCQkkY29udHJpYnV0b3JzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2NvbnRyaWJ1dG9yJykgYXMgJGNvbnRyaWJ1dG9yKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJpID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJpID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXSkpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJpICE9PSBudWxsKQoJCQl7CgkJCQkkY29udHJpYnV0b3JzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQXV0aG9yJywgYXJyYXkoJG5hbWUsICR1cmksICRlbWFpbCkpOwoJCQl9CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnY29udHJpYnV0b3InKSBhcyAkY29udHJpYnV0b3IpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmwgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJG5hbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsndXJsJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdKSk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ2VtYWlsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoJG5hbWUgIT09IG51bGwgfHwgJGVtYWlsICE9PSBudWxsIHx8ICR1cmwgIT09IG51bGwpCgkJCXsKCQkJCSRjb250cmlidXRvcnNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdBdXRob3InLCBhcnJheSgkbmFtZSwgJHVybCwgJGVtYWlsKSk7CgkJCX0KCQl9CgoJCWlmICghZW1wdHkoJGNvbnRyaWJ1dG9ycykpCgkJewoJCQlyZXR1cm4gYXJyYXlfdW5pcXVlKCRjb250cmlidXRvcnMpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYWxsIGF1dGhvcnMgZm9yIHRoZSBpdGVtCgkgKgoJICogVXNlcyBgPGF0b206YXV0aG9yPmAsIGA8YXV0aG9yPmAsIGA8ZGM6Y3JlYXRvcj5gIG9yIGA8aXR1bmVzOmF1dGhvcj5gCgkgKgoJICogQHNpbmNlIEJldGEgMgoJICogQHJldHVybiBhcnJheXxudWxsIExpc3Qgb2Yge0BzZWUgU2ltcGxlUGllX0F1dGhvcn0gb2JqZWN0cwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2F1dGhvcnMoKQoJewoJCSRhdXRob3JzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2F1dGhvcicpIGFzICRhdXRob3IpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmkgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnbmFtZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmkgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF0pKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJpICE9PSBudWxsKQoJCQl7CgkJCQkkYXV0aG9yc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0F1dGhvcicsIGFycmF5KCRuYW1lLCAkdXJpLCAkZW1haWwpKTsKCQkJfQoJCX0KCQlpZiAoJGF1dGhvciA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2F1dGhvcicpKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJsID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnbmFtZSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJsID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsndXJsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdKSk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZW1haWwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmICgkbmFtZSAhPT0gbnVsbCB8fCAkZW1haWwgIT09IG51bGwgfHwgJHVybCAhPT0gbnVsbCkKCQkJewoJCQkJJGF1dGhvcnNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdBdXRob3InLCBhcnJheSgkbmFtZSwgJHVybCwgJGVtYWlsKSk7CgkJCX0KCQl9CgkJaWYgKCRhdXRob3IgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMCwgJ2F1dGhvcicpKQoJCXsKCQkJJGF1dGhvcnNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdBdXRob3InLCBhcnJheShudWxsLCBudWxsLCAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpKSk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2NyZWF0b3InKSBhcyAkYXV0aG9yKQoJCXsKCQkJJGF1dGhvcnNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdBdXRob3InLCBhcnJheSgkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKSk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2NyZWF0b3InKSBhcyAkYXV0aG9yKQoJCXsKCQkJJGF1dGhvcnNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdBdXRob3InLCBhcnJheSgkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKSk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdhdXRob3InKSBhcyAkYXV0aG9yKQoJCXsKCQkJJGF1dGhvcnNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdBdXRob3InLCBhcnJheSgkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKSk7CgkJfQoKCQlpZiAoIWVtcHR5KCRhdXRob3JzKSkKCQl7CgkJCXJldHVybiBhcnJheV91bmlxdWUoJGF1dGhvcnMpOwoJCX0KCQllbHNlaWYgKCgkc291cmNlID0gJHRoaXMtPmdldF9zb3VyY2UoKSkgJiYgKCRhdXRob3JzID0gJHNvdXJjZS0+Z2V0X2F1dGhvcnMoKSkpCgkJewoJCQlyZXR1cm4gJGF1dGhvcnM7CgkJfQoJCWVsc2VpZiAoJGF1dGhvcnMgPSAkdGhpcy0+ZmVlZC0+Z2V0X2F1dGhvcnMoKSkKCQl7CgkJCXJldHVybiAkYXV0aG9yczsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBjb3B5cmlnaHQgaW5mbyBmb3IgdGhlIGl0ZW0KCSAqCgkgKiBVc2VzIGA8YXRvbTpyaWdodHM+YCBvciBgPGRjOnJpZ2h0cz5gCgkgKgoJICogQHNpbmNlIDEuMQoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9jb3B5cmlnaHQoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAncmlnaHRzJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2F0b21fMTBfY29uc3RydWN0X3R5cGUnLCBhcnJheSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ3JpZ2h0cycpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHBvc3RpbmcgZGF0ZS90aW1lIGZvciB0aGUgaXRlbQoJICoKCSAqIFVzZXMgYDxhdG9tOnB1Ymxpc2hlZD5gLCBgPGF0b206dXBkYXRlZD5gLCBgPGF0b206aXNzdWVkPmAsCgkgKiBgPGF0b206bW9kaWZpZWQ+YCwgYDxwdWJEYXRlPmAgb3IgYDxkYzpkYXRlPmAKCSAqCgkgKiBOb3RlOiBvYmV5cyBQSFAncyB0aW1lem9uZSBzZXR0aW5nLiBUbyBnZXQgYSBVVEMgZGF0ZS90aW1lLCB1c2UKCSAqIHtAc2VlIGdldF9nbWRhdGV9CgkgKgoJICogQHNpbmNlIEJldGEgMiAocHJldmlvdXNseSBjYWxsZWQgYGdldF9pdGVtX2RhdGVgIHNpbmNlIDAuOCkKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRlX2Zvcm1hdCBTdXBwb3J0cyBhbnkgUEhQIGRhdGUgZm9ybWF0IGZyb20ge0BzZWUgaHR0cDovL3BocC5uZXQvZGF0ZX0gKGVtcHR5IGZvciB0aGUgcmF3IGRhdGEpCgkgKiBAcmV0dXJuIGludHxzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2RhdGUoJGRhdGVfZm9ybWF0ID0gJ2ogRiBZLCBnOmkgYScpCgl7CgkJaWYgKCFpc3NldCgkdGhpcy0+ZGF0YVsnZGF0ZSddKSkKCQl7CgkJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAncHVibGlzaGVkJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWydkYXRlJ11bJ3JhdyddID0gJHJldHVyblswXVsnZGF0YSddOwoJCQl9CgkJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ3VwZGF0ZWQnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10gPSAkcmV0dXJuWzBdWydkYXRhJ107CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnaXNzdWVkJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWydkYXRlJ11bJ3JhdyddID0gJHJldHVyblswXVsnZGF0YSddOwoJCQl9CgkJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2NyZWF0ZWQnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10gPSAkcmV0dXJuWzBdWydkYXRhJ107CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnbW9kaWZpZWQnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10gPSAkcmV0dXJuWzBdWydkYXRhJ107CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjAsICdwdWJEYXRlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWydkYXRlJ11bJ3JhdyddID0gJHJldHVyblswXVsnZGF0YSddOwoJCQl9CgkJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdkYXRlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWydkYXRlJ11bJ3JhdyddID0gJHJldHVyblswXVsnZGF0YSddOwoJCQl9CgkJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAsICdkYXRlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWydkYXRlJ11bJ3JhdyddID0gJHJldHVyblswXVsnZGF0YSddOwoJCQl9CgoJCQlpZiAoIWVtcHR5KCR0aGlzLT5kYXRhWydkYXRlJ11bJ3JhdyddKSkKCQkJewoJCQkJJHBhcnNlciA9ICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnUGFyc2VfRGF0ZScsICdnZXQnKTsKCQkJCSR0aGlzLT5kYXRhWydkYXRlJ11bJ3BhcnNlZCddID0gJHBhcnNlci0+cGFyc2UoJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10pOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXSA9IG51bGw7CgkJCX0KCQl9CgkJaWYgKCR0aGlzLT5kYXRhWydkYXRlJ10pCgkJewoJCQkkZGF0ZV9mb3JtYXQgPSAoc3RyaW5nKSAkZGF0ZV9mb3JtYXQ7CgkJCXN3aXRjaCAoJGRhdGVfZm9ybWF0KQoJCQl7CgkJCQljYXNlICcnOgoJCQkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgoJCQkJY2FzZSAnVSc6CgkJCQkJcmV0dXJuICR0aGlzLT5kYXRhWydkYXRlJ11bJ3BhcnNlZCddOwoKCQkJCWRlZmF1bHQ6CgkJCQkJcmV0dXJuIGRhdGUoJGRhdGVfZm9ybWF0LCAkdGhpcy0+ZGF0YVsnZGF0ZSddWydwYXJzZWQnXSk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSB1cGRhdGUgZGF0ZS90aW1lIGZvciB0aGUgaXRlbQoJICoKCSAqIFVzZXMgYDxhdG9tOnVwZGF0ZWQ+YAoJICoKCSAqIE5vdGU6IG9iZXlzIFBIUCdzIHRpbWV6b25lIHNldHRpbmcuIFRvIGdldCBhIFVUQyBkYXRlL3RpbWUsIHVzZQoJICoge0BzZWUgZ2V0X2dtZGF0ZX0KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRlX2Zvcm1hdCBTdXBwb3J0cyBhbnkgUEhQIGRhdGUgZm9ybWF0IGZyb20ge0BzZWUgaHR0cDovL3BocC5uZXQvZGF0ZX0gKGVtcHR5IGZvciB0aGUgcmF3IGRhdGEpCgkgKiBAcmV0dXJuIGludHxzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3VwZGF0ZWRfZGF0ZSgkZGF0ZV9mb3JtYXQgPSAnaiBGIFksIGc6aSBhJykKCXsKCQlpZiAoIWlzc2V0KCR0aGlzLT5kYXRhWyd1cGRhdGVkJ10pKQoJCXsKCQkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICd1cGRhdGVkJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd1cGRhdGVkJ11bJ3JhdyddID0gJHJldHVyblswXVsnZGF0YSddOwoJCQl9CgoJCQlpZiAoIWVtcHR5KCR0aGlzLT5kYXRhWyd1cGRhdGVkJ11bJ3JhdyddKSkKCQkJewoJCQkJJHBhcnNlciA9ICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnUGFyc2VfRGF0ZScsICdnZXQnKTsKCQkJCSR0aGlzLT5kYXRhWyd1cGRhdGVkJ11bJ3BhcnNlZCddID0gJHBhcnNlci0+cGFyc2UoJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10pOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3VwZGF0ZWQnXSA9IG51bGw7CgkJCX0KCQl9CgkJaWYgKCR0aGlzLT5kYXRhWyd1cGRhdGVkJ10pCgkJewoJCQkkZGF0ZV9mb3JtYXQgPSAoc3RyaW5nKSAkZGF0ZV9mb3JtYXQ7CgkJCXN3aXRjaCAoJGRhdGVfZm9ybWF0KQoJCQl7CgkJCQljYXNlICcnOgoJCQkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHRoaXMtPmRhdGFbJ3VwZGF0ZWQnXVsncmF3J10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgoJCQkJY2FzZSAnVSc6CgkJCQkJcmV0dXJuICR0aGlzLT5kYXRhWyd1cGRhdGVkJ11bJ3BhcnNlZCddOwoKCQkJCWRlZmF1bHQ6CgkJCQkJcmV0dXJuIGRhdGUoJGRhdGVfZm9ybWF0LCAkdGhpcy0+ZGF0YVsndXBkYXRlZCddWydwYXJzZWQnXSk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBsb2NhbGl6ZWQgcG9zdGluZyBkYXRlL3RpbWUgZm9yIHRoZSBpdGVtCgkgKgoJICogUmV0dXJucyB0aGUgZGF0ZSBmb3JtYXR0ZWQgaW4gdGhlIGxvY2FsaXplZCBsYW5ndWFnZS4gVG8gZGlzcGxheSBpbgoJICogbGFuZ3VhZ2VzIG90aGVyIHRoYW4gdGhlIHNlcnZlcidzIGRlZmF1bHQsIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgbG9jYWxlCgkgKiB3aXRoIHtAbGluayBodHRwOi8vcGhwLm5ldC9zZXRsb2NhbGUgc2V0bG9jYWxlKCl9LiBUaGUgYXZhaWxhYmxlCgkgKiBsb2NhbGl6YXRpb25zIGRlcGVuZCBvbiB3aGljaCBvbmVzIGFyZSBpbnN0YWxsZWQgb24geW91ciB3ZWIgc2VydmVyLgoJICoKCSAqIEBzaW5jZSAxLjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRlX2Zvcm1hdCBTdXBwb3J0cyBhbnkgUEhQIGRhdGUgZm9ybWF0IGZyb20ge0BzZWUgaHR0cDovL3BocC5uZXQvc3RyZnRpbWV9IChlbXB0eSBmb3IgdGhlIHJhdyBkYXRhKQoJICogQHJldHVybiBpbnR8c3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9sb2NhbF9kYXRlKCRkYXRlX2Zvcm1hdCA9ICclYycpCgl7CgkJaWYgKCEkZGF0ZV9mb3JtYXQpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCR0aGlzLT5nZXRfZGF0ZSgnJyksIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoKCRkYXRlID0gJHRoaXMtPmdldF9kYXRlKCdVJykpICE9PSBudWxsICYmICRkYXRlICE9PSBmYWxzZSkKCQl7CgkJCXJldHVybiBzdHJmdGltZSgkZGF0ZV9mb3JtYXQsICRkYXRlKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBwb3N0aW5nIGRhdGUvdGltZSBmb3IgdGhlIGl0ZW0gKFVUQyB0aW1lKQoJICoKCSAqIEBzZWUgZ2V0X2RhdGUKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGVfZm9ybWF0IFN1cHBvcnRzIGFueSBQSFAgZGF0ZSBmb3JtYXQgZnJvbSB7QHNlZSBodHRwOi8vcGhwLm5ldC9kYXRlfQoJICogQHJldHVybiBpbnR8c3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9nbWRhdGUoJGRhdGVfZm9ybWF0ID0gJ2ogRiBZLCBnOmkgYScpCgl7CgkJJGRhdGUgPSAkdGhpcy0+Z2V0X2RhdGUoJ1UnKTsKCQlpZiAoJGRhdGUgPT09IG51bGwpCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJCXJldHVybiBnbWRhdGUoJGRhdGVfZm9ybWF0LCAkZGF0ZSk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIHVwZGF0ZSBkYXRlL3RpbWUgZm9yIHRoZSBpdGVtIChVVEMgdGltZSkKCSAqCgkgKiBAc2VlIGdldF91cGRhdGVkX2RhdGUKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGVfZm9ybWF0IFN1cHBvcnRzIGFueSBQSFAgZGF0ZSBmb3JtYXQgZnJvbSB7QHNlZSBodHRwOi8vcGhwLm5ldC9kYXRlfQoJICogQHJldHVybiBpbnR8c3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF91cGRhdGVkX2dtZGF0ZSgkZGF0ZV9mb3JtYXQgPSAnaiBGIFksIGc6aSBhJykKCXsKCQkkZGF0ZSA9ICR0aGlzLT5nZXRfdXBkYXRlZF9kYXRlKCdVJyk7CgkJaWYgKCRkYXRlID09PSBudWxsKQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQlyZXR1cm4gZ21kYXRlKCRkYXRlX2Zvcm1hdCwgJGRhdGUpOwoJfQoKCS8qKgoJICogR2V0IHRoZSBwZXJtYWxpbmsgZm9yIHRoZSBpdGVtCgkgKgoJICogUmV0dXJucyB0aGUgZmlyc3QgbGluayBhdmFpbGFibGUgd2l0aCBhIHJlbGF0aW9uc2hpcCBvZiAiYWx0ZXJuYXRlIi4KCSAqIElkZW50aWNhbCB0byB7QHNlZSBnZXRfbGluaygpfSB3aXRoIGtleSAwCgkgKgoJICogQHNlZSBnZXRfbGluawoJICogQHNpbmNlIDAuOAoJICogQHJldHVybiBzdHJpbmd8bnVsbCBQZXJtYWxpbmsgVVJMCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfcGVybWFsaW5rKCkKCXsKCQkkbGluayA9ICR0aGlzLT5nZXRfbGluaygpOwoJCSRlbmNsb3N1cmUgPSAkdGhpcy0+Z2V0X2VuY2xvc3VyZSgwKTsKCQlpZiAoJGxpbmsgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJGxpbms7CgkJfQoJCWVsc2VpZiAoJGVuY2xvc3VyZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkZW5jbG9zdXJlLT5nZXRfbGluaygpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYSBzaW5nbGUgbGluayBmb3IgdGhlIGl0ZW0KCSAqCgkgKiBAc2luY2UgQmV0YSAzCgkgKiBAcGFyYW0gaW50ICRrZXkgVGhlIGxpbmsgdGhhdCB5b3Ugd2FudCB0byByZXR1cm4uICBSZW1lbWJlciB0aGF0IGFycmF5cyBiZWdpbiB3aXRoIDAsIG5vdCAxCgkgKiBAcGFyYW0gc3RyaW5nICRyZWwgVGhlIHJlbGF0aW9uc2hpcCBvZiB0aGUgbGluayB0byByZXR1cm4KCSAqIEByZXR1cm4gc3RyaW5nfG51bGwgTGluayBVUkwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9saW5rKCRrZXkgPSAwLCAkcmVsID0gJ2FsdGVybmF0ZScpCgl7CgkJJGxpbmtzID0gJHRoaXMtPmdldF9saW5rcygkcmVsKTsKCQlpZiAoJGxpbmtzWyRrZXldICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICRsaW5rc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IGFsbCBsaW5rcyBmb3IgdGhlIGl0ZW0KCSAqCgkgKiBVc2VzIGA8YXRvbTpsaW5rPmAsIGA8bGluaz5gIG9yIGA8Z3VpZD5gCgkgKgoJICogQHNpbmNlIEJldGEgMgoJICogQHBhcmFtIHN0cmluZyAkcmVsIFRoZSByZWxhdGlvbnNoaXAgb2YgbGlua3MgdG8gcmV0dXJuCgkgKiBAcmV0dXJuIGFycmF5fG51bGwgTGlua3MgZm91bmQgZm9yIHRoZSBpdGVtIChzdHJpbmdzKQoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2xpbmtzKCRyZWwgPSAnYWx0ZXJuYXRlJykKCXsKCQlpZiAoIWlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddKSkKCQl7CgkJCSR0aGlzLT5kYXRhWydsaW5rcyddID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdsaW5rJykgYXMgJGxpbmspCgkJCXsKCQkJCWlmIChpc3NldCgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddKSkKCQkJCXsKCQkJCQkkbGlua19yZWwgPSAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddKSkgPyAkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10gOiAnYWx0ZXJuYXRlJzsKCQkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVskbGlua19yZWxdW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ2hyZWYnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGluaykpOwoKCQkJCX0KCQkJfQoJCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2xpbmsnKSBhcyAkbGluaykKCQkJewoJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10pKQoJCQkJewoJCQkJCSRsaW5rX3JlbCA9IChpc3NldCgkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10pKSA/ICRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSA6ICdhbHRlcm5hdGUnOwoJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWyRsaW5rX3JlbF1bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgkJCQl9CgkJCX0KCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwLCAnbGluaycpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVsnYWx0ZXJuYXRlJ11bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua3NbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGlua3NbMF0pKTsKCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAnbGluaycpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVsnYWx0ZXJuYXRlJ11bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua3NbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGlua3NbMF0pKTsKCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjAsICdsaW5rJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWydhbHRlcm5hdGUnXVtdID0gJHRoaXMtPnNhbml0aXplKCRsaW5rc1swXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rc1swXSkpOwoJCQl9CgkJCWlmICgkbGlua3MgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMCwgJ2d1aWQnKSkKCQkJewoJCQkJaWYgKCFpc3NldCgkbGlua3NbMF1bJ2F0dHJpYnMnXVsnJ11bJ2lzUGVybWFMaW5rJ10pIHx8IHN0cnRvbG93ZXIodHJpbSgkbGlua3NbMF1bJ2F0dHJpYnMnXVsnJ11bJ2lzUGVybWFMaW5rJ10pKSA9PT0gJ3RydWUnKQoJCQkJewoJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWydhbHRlcm5hdGUnXVtdID0gJHRoaXMtPnNhbml0aXplKCRsaW5rc1swXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rc1swXSkpOwoJCQkJfQoJCQl9CgoJCQkka2V5cyA9IGFycmF5X2tleXMoJHRoaXMtPmRhdGFbJ2xpbmtzJ10pOwoJCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KQoJCQl7CgkJCQlpZiAoJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2lzX2lzZWdtZW50X256X25jJywgYXJyYXkoJGtleSkpKQoJCQkJewoJCQkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnbGlua3MnXVtTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSAuICRrZXldKSkKCQkJCQl7CgkJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddW1NJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZIC4gJGtleV0gPSBhcnJheV9tZXJnZSgkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XSwgJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSk7CgkJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldID0mICR0aGlzLT5kYXRhWydsaW5rcyddW1NJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZIC4gJGtleV07CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddW1NJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZIC4gJGtleV0gPSYgJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV07CgkJCQkJfQoJCQkJfQoJCQkJZWxzZWlmIChzdWJzdHIoJGtleSwgMCwgNDEpID09PSBTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSkKCQkJCXsKCQkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVtzdWJzdHIoJGtleSwgNDEpXSA9JiAkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XTsKCQkJCX0KCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldID0gYXJyYXlfdW5pcXVlKCR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldKTsKCQkJfQoJCX0KCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJHJlbF0pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5kYXRhWydsaW5rcyddWyRyZWxdOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgYW4gZW5jbG9zdXJlIGZyb20gdGhlIGl0ZW0KCSAqCgkgKiBTdXBwb3J0cyB0aGUgPGVuY2xvc3VyZT4gUlNTIHRhZywgYXMgd2VsbCBhcyBNZWRpYSBSU1MgYW5kIGlUdW5lcyBSU1MuCgkgKgoJICogQHNpbmNlIEJldGEgMgoJICogQHRvZG8gQWRkIGFiaWxpdHkgdG8gcHJlZmVyIG9uZSB0eXBlIG9mIGNvbnRlbnQgb3ZlciBhbm90aGVyIChpbiBhIG1lZGlhIGdyb3VwKS4KCSAqIEBwYXJhbSBpbnQgJGtleSBUaGUgZW5jbG9zdXJlIHRoYXQgeW91IHdhbnQgdG8gcmV0dXJuLiAgUmVtZW1iZXIgdGhhdCBhcnJheXMgYmVnaW4gd2l0aCAwLCBub3QgMQoJICogQHJldHVybiBTaW1wbGVQaWVfRW5jbG9zdXJlfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9lbmNsb3N1cmUoJGtleSA9IDAsICRwcmVmZXIgPSBudWxsKQoJewoJCSRlbmNsb3N1cmVzID0gJHRoaXMtPmdldF9lbmNsb3N1cmVzKCk7CgkJaWYgKGlzc2V0KCRlbmNsb3N1cmVzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkZW5jbG9zdXJlc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IGFsbCBhdmFpbGFibGUgZW5jbG9zdXJlcyAocG9kY2FzdHMsIGV0Yy4pCgkgKgoJICogU3VwcG9ydHMgdGhlIDxlbmNsb3N1cmU+IFJTUyB0YWcsIGFzIHdlbGwgYXMgTWVkaWEgUlNTIGFuZCBpVHVuZXMgUlNTLgoJICoKCSAqIEF0IHRoaXMgcG9pbnQsIHdlJ3JlIHByZXR0eSBtdWNoIGFzc3VtaW5nIHRoYXQgYWxsIGVuY2xvc3VyZXMgZm9yIGFuIGl0ZW0KCSAqIGFyZSB0aGUgc2FtZSBjb250ZW50LiAgQW55dGhpbmcgZWxzZSBpcyB0b28gY29tcGxpY2F0ZWQgdG8KCSAqIHByb3Blcmx5IHN1cHBvcnQuCgkgKgoJICogQHNpbmNlIEJldGEgMgoJICogQHRvZG8gQWRkIHN1cHBvcnQgZm9yIGVuZC11c2VyIGRlZmluZWQgc29ydGluZyBvZiBlbmNsb3N1cmVzIGJ5IHR5cGUvaGFuZGxlciAoc28gd2UgY2FuIHByZWZlciB0aGUgZmFzdGVyLWxvYWRpbmcgRkxWIG92ZXIgTVA0KS4KCSAqIEB0b2RvIElmIGFuIGVsZW1lbnQgZXhpc3RzIGF0IGEgbGV2ZWwsIGJ1dCBpdCdzIHZhbHVlIGlzIGVtcHR5LCB3ZSBzaG91bGQgZmFsbCBiYWNrIHRvIHRoZSB2YWx1ZSBmcm9tIHRoZSBwYXJlbnQgKGlmIGl0IGV4aXN0cykuCgkgKiBAcmV0dXJuIGFycmF5fG51bGwgTGlzdCBvZiBTaW1wbGVQaWVfRW5jbG9zdXJlIGl0ZW1zCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfZW5jbG9zdXJlcygpCgl7CgkJaWYgKCFpc3NldCgkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddKSkKCQl7CgkJCSR0aGlzLT5kYXRhWydlbmNsb3N1cmVzJ10gPSBhcnJheSgpOwoKCQkJLy8gRWxlbWVudHMKCQkJJGNhcHRpb25zX3BhcmVudCA9IG51bGw7CgkJCSRjYXRlZ29yaWVzX3BhcmVudCA9IG51bGw7CgkJCSRjb3B5cmlnaHRzX3BhcmVudCA9IG51bGw7CgkJCSRjcmVkaXRzX3BhcmVudCA9IG51bGw7CgkJCSRkZXNjcmlwdGlvbl9wYXJlbnQgPSBudWxsOwoJCQkkZHVyYXRpb25fcGFyZW50ID0gbnVsbDsKCQkJJGhhc2hlc19wYXJlbnQgPSBudWxsOwoJCQkka2V5d29yZHNfcGFyZW50ID0gbnVsbDsKCQkJJHBsYXllcl9wYXJlbnQgPSBudWxsOwoJCQkkcmF0aW5nc19wYXJlbnQgPSBudWxsOwoJCQkkcmVzdHJpY3Rpb25zX3BhcmVudCA9IG51bGw7CgkJCSR0aHVtYm5haWxzX3BhcmVudCA9IG51bGw7CgkJCSR0aXRsZV9wYXJlbnQgPSBudWxsOwoKCQkJLy8gTGV0J3MgZG8gdGhlIGNoYW5uZWwgYW5kIGl0ZW0tbGV2ZWwgb25lcyBmaXJzdCwgYW5kIGp1c3QgcmUtdXNlIHRoZW0gaWYgd2UgbmVlZCB0by4KCQkJJHBhcmVudCA9ICR0aGlzLT5nZXRfZmVlZCgpOwoKCQkJLy8gQ0FQVElPTlMKCQkJaWYgKCRjYXB0aW9ucyA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICd0ZXh0JykpCgkJCXsKCQkJCWZvcmVhY2ggKCRjYXB0aW9ucyBhcyAkY2FwdGlvbikKCQkJCXsKCQkJCQkkY2FwdGlvbl90eXBlID0gbnVsbDsKCQkJCQkkY2FwdGlvbl9sYW5nID0gbnVsbDsKCQkJCQkkY2FwdGlvbl9zdGFydFRpbWUgPSBudWxsOwoJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSBudWxsOwoJCQkJCSRjYXB0aW9uX3RleHQgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddKSkKCQkJCQl7CgkJCQkJCSRjYXB0aW9uX3R5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydsYW5nJ10pKQoJCQkJCXsKCQkJCQkJJGNhcHRpb25fbGFuZyA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnbGFuZyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3N0YXJ0J10pKQoJCQkJCXsKCQkJCQkJJGNhcHRpb25fc3RhcnRUaW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydzdGFydCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddKSkKCQkJCQl7CgkJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2RhdGEnXSkpCgkJCQkJewoJCQkJCQkkY2FwdGlvbl90ZXh0ID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRjYXB0aW9uc19wYXJlbnRbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdDYXB0aW9uJywgYXJyYXkoJGNhcHRpb25fdHlwZSwgJGNhcHRpb25fbGFuZywgJGNhcHRpb25fc3RhcnRUaW1lLCAkY2FwdGlvbl9lbmRUaW1lLCAkY2FwdGlvbl90ZXh0KSk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkY2FwdGlvbnMgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICd0ZXh0JykpCgkJCXsKCQkJCWZvcmVhY2ggKCRjYXB0aW9ucyBhcyAkY2FwdGlvbikKCQkJCXsKCQkJCQkkY2FwdGlvbl90eXBlID0gbnVsbDsKCQkJCQkkY2FwdGlvbl9sYW5nID0gbnVsbDsKCQkJCQkkY2FwdGlvbl9zdGFydFRpbWUgPSBudWxsOwoJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSBudWxsOwoJCQkJCSRjYXB0aW9uX3RleHQgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddKSkKCQkJCQl7CgkJCQkJCSRjYXB0aW9uX3R5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydsYW5nJ10pKQoJCQkJCXsKCQkJCQkJJGNhcHRpb25fbGFuZyA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnbGFuZyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3N0YXJ0J10pKQoJCQkJCXsKCQkJCQkJJGNhcHRpb25fc3RhcnRUaW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydzdGFydCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddKSkKCQkJCQl7CgkJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2RhdGEnXSkpCgkJCQkJewoJCQkJCQkkY2FwdGlvbl90ZXh0ID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRjYXB0aW9uc19wYXJlbnRbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdDYXB0aW9uJywgYXJyYXkoJGNhcHRpb25fdHlwZSwgJGNhcHRpb25fbGFuZywgJGNhcHRpb25fc3RhcnRUaW1lLCAkY2FwdGlvbl9lbmRUaW1lLCAkY2FwdGlvbl90ZXh0KSk7CgkJCQl9CgkJCX0KCQkJaWYgKGlzX2FycmF5KCRjYXB0aW9uc19wYXJlbnQpKQoJCQl7CgkJCQkkY2FwdGlvbnNfcGFyZW50ID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZSgkY2FwdGlvbnNfcGFyZW50KSk7CgkJCX0KCgkJCS8vIENBVEVHT1JJRVMKCQkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAnY2F0ZWdvcnknKSBhcyAkY2F0ZWdvcnkpCgkJCXsKCQkJCSR0ZXJtID0gbnVsbDsKCQkJCSRzY2hlbWUgPSBudWxsOwoJCQkJJGxhYmVsID0gbnVsbDsKCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJHRlcm0gPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQl7CgkJCQkJJHNjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRzY2hlbWUgPSAnaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcy9jYXRlZ29yeV9zY2hlbWEnOwoJCQkJfQoJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSkpCgkJCQl7CgkJCQkJJGxhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJCSRjYXRlZ29yaWVzX3BhcmVudFtdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NhdGVnb3J5JywgYXJyYXkoJHRlcm0sICRzY2hlbWUsICRsYWJlbCkpOwoJCQl9CgkJCWZvcmVhY2ggKChhcnJheSkgJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAnY2F0ZWdvcnknKSBhcyAkY2F0ZWdvcnkpCgkJCXsKCQkJCSR0ZXJtID0gbnVsbDsKCQkJCSRzY2hlbWUgPSBudWxsOwoJCQkJJGxhYmVsID0gbnVsbDsKCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJHRlcm0gPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQl7CgkJCQkJJHNjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRzY2hlbWUgPSAnaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcy9jYXRlZ29yeV9zY2hlbWEnOwoJCQkJfQoJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSkpCgkJCQl7CgkJCQkJJGxhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJCSRjYXRlZ29yaWVzX3BhcmVudFtdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NhdGVnb3J5JywgYXJyYXkoJHRlcm0sICRzY2hlbWUsICRsYWJlbCkpOwoJCQl9CgkJCWZvcmVhY2ggKChhcnJheSkgJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2NhdGVnb3J5JykgYXMgJGNhdGVnb3J5KQoJCQl7CgkJCQkkdGVybSA9IG51bGw7CgkJCQkkc2NoZW1lID0gJ2h0dHA6Ly93d3cuaXR1bmVzLmNvbS9kdGRzL3BvZGNhc3QtMS4wLmR0ZCc7CgkJCQkkbGFiZWwgPSBudWxsOwoJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsndGV4dCddKSkKCQkJCXsKCQkJCQkkbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWyd0ZXh0J10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCQkkY2F0ZWdvcmllc19wYXJlbnRbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdDYXRlZ29yeScsIGFycmF5KCR0ZXJtLCAkc2NoZW1lLCAkbGFiZWwpKTsKCgkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfSVRVTkVTXVsnY2F0ZWdvcnknXSkpCgkJCQl7CgkJCQkJZm9yZWFjaCAoKGFycmF5KSAkY2F0ZWdvcnlbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVNdWydjYXRlZ29yeSddIGFzICRzdWJjYXRlZ29yeSkKCQkJCQl7CgkJCQkJCWlmIChpc3NldCgkc3ViY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3RleHQnXSkpCgkJCQkJCXsKCQkJCQkJCSRsYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkc3ViY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3RleHQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQkkY2F0ZWdvcmllc19wYXJlbnRbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdDYXRlZ29yeScsIGFycmF5KCR0ZXJtLCAkc2NoZW1lLCAkbGFiZWwpKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYgKGlzX2FycmF5KCRjYXRlZ29yaWVzX3BhcmVudCkpCgkJCXsKCQkJCSRjYXRlZ29yaWVzX3BhcmVudCA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJGNhdGVnb3JpZXNfcGFyZW50KSk7CgkJCX0KCgkJCS8vIENPUFlSSUdIVAoJCQlpZiAoJGNvcHlyaWdodCA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdjb3B5cmlnaHQnKSkKCQkJewoJCQkJJGNvcHlyaWdodF91cmwgPSBudWxsOwoJCQkJJGNvcHlyaWdodF9sYWJlbCA9IG51bGw7CgkJCQlpZiAoaXNzZXQoJGNvcHlyaWdodFswXVsnYXR0cmlicyddWycnXVsndXJsJ10pKQoJCQkJewoJCQkJCSRjb3B5cmlnaHRfdXJsID0gJHRoaXMtPnNhbml0aXplKCRjb3B5cmlnaHRbMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJfQoJCQkJaWYgKGlzc2V0KCRjb3B5cmlnaHRbMF1bJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJGNvcHlyaWdodF9sYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29weXJpZ2h0WzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCQkkY29weXJpZ2h0c19wYXJlbnQgPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQ29weXJpZ2h0JywgYXJyYXkoJGNvcHlyaWdodF91cmwsICRjb3B5cmlnaHRfbGFiZWwpKTsKCQkJfQoJCQllbHNlaWYgKCRjb3B5cmlnaHQgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdjb3B5cmlnaHQnKSkKCQkJewoJCQkJJGNvcHlyaWdodF91cmwgPSBudWxsOwoJCQkJJGNvcHlyaWdodF9sYWJlbCA9IG51bGw7CgkJCQlpZiAoaXNzZXQoJGNvcHlyaWdodFswXVsnYXR0cmlicyddWycnXVsndXJsJ10pKQoJCQkJewoJCQkJCSRjb3B5cmlnaHRfdXJsID0gJHRoaXMtPnNhbml0aXplKCRjb3B5cmlnaHRbMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJfQoJCQkJaWYgKGlzc2V0KCRjb3B5cmlnaHRbMF1bJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJGNvcHlyaWdodF9sYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29weXJpZ2h0WzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCQkkY29weXJpZ2h0c19wYXJlbnQgPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQ29weXJpZ2h0JywgYXJyYXkoJGNvcHlyaWdodF91cmwsICRjb3B5cmlnaHRfbGFiZWwpKTsKCQkJfQoKCQkJLy8gQ1JFRElUUwoJCQlpZiAoJGNyZWRpdHMgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAnY3JlZGl0JykpCgkJCXsKCQkJCWZvcmVhY2ggKCRjcmVkaXRzIGFzICRjcmVkaXQpCgkJCQl7CgkJCQkJJGNyZWRpdF9yb2xlID0gbnVsbDsKCQkJCQkkY3JlZGl0X3NjaGVtZSA9IG51bGw7CgkJCQkJJGNyZWRpdF9uYW1lID0gbnVsbDsKCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddKSkKCQkJCQl7CgkJCQkJCSRjcmVkaXRfcm9sZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydhdHRyaWJzJ11bJyddWydyb2xlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkY3JlZGl0WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJewoJCQkJCQkkY3JlZGl0X3NjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSAndXJuOmVidSc7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkY3JlZGl0WydkYXRhJ10pKQoJCQkJCXsKCQkJCQkJJGNyZWRpdF9uYW1lID0gJHRoaXMtPnNhbml0aXplKCRjcmVkaXRbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJJGNyZWRpdHNfcGFyZW50W10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQ3JlZGl0JywgYXJyYXkoJGNyZWRpdF9yb2xlLCAkY3JlZGl0X3NjaGVtZSwgJGNyZWRpdF9uYW1lKSk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkY3JlZGl0cyA9ICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ2NyZWRpdCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkY3JlZGl0cyBhcyAkY3JlZGl0KQoJCQkJewoJCQkJCSRjcmVkaXRfcm9sZSA9IG51bGw7CgkJCQkJJGNyZWRpdF9zY2hlbWUgPSBudWxsOwoJCQkJCSRjcmVkaXRfbmFtZSA9IG51bGw7CgkJCQkJaWYgKGlzc2V0KCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3JvbGUnXSkpCgkJCQkJewoJCQkJCQkkY3JlZGl0X3JvbGUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCXsKCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSRjcmVkaXRfc2NoZW1lID0gJ3VybjplYnUnOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnZGF0YSddKSkKCQkJCQl7CgkJCQkJCSRjcmVkaXRfbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRjcmVkaXRzX3BhcmVudFtdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NyZWRpdCcsIGFycmF5KCRjcmVkaXRfcm9sZSwgJGNyZWRpdF9zY2hlbWUsICRjcmVkaXRfbmFtZSkpOwoJCQkJfQoJCQl9CgkJCWlmIChpc19hcnJheSgkY3JlZGl0c19wYXJlbnQpKQoJCQl7CgkJCQkkY3JlZGl0c19wYXJlbnQgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCRjcmVkaXRzX3BhcmVudCkpOwoJCQl9CgoJCQkvLyBERVNDUklQVElPTgoJCQlpZiAoJGRlc2NyaXB0aW9uX3BhcmVudCA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdkZXNjcmlwdGlvbicpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGRlc2NyaXB0aW9uX3BhcmVudFswXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkZGVzY3JpcHRpb25fcGFyZW50ID0gJHRoaXMtPnNhbml0aXplKCRkZXNjcmlwdGlvbl9wYXJlbnRbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRkZXNjcmlwdGlvbl9wYXJlbnQgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdkZXNjcmlwdGlvbicpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGRlc2NyaXB0aW9uX3BhcmVudFswXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkZGVzY3JpcHRpb25fcGFyZW50ID0gJHRoaXMtPnNhbml0aXplKCRkZXNjcmlwdGlvbl9wYXJlbnRbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJfQoKCQkJLy8gRFVSQVRJT04KCQkJaWYgKCRkdXJhdGlvbl9wYXJlbnQgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2R1cmF0aW9uJykpCgkJCXsKCQkJCSRzZWNvbmRzID0gbnVsbDsKCQkJCSRtaW51dGVzID0gbnVsbDsKCQkJCSRob3VycyA9IG51bGw7CgkJCQlpZiAoaXNzZXQoJGR1cmF0aW9uX3BhcmVudFswXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkdGVtcCA9IGV4cGxvZGUoJzonLCAkdGhpcy0+c2FuaXRpemUoJGR1cmF0aW9uX3BhcmVudFswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpKTsKCQkJCQlpZiAoc2l6ZW9mKCR0ZW1wKSA+IDApCgkJCQkJewoJCQkJCQkkc2Vjb25kcyA9IChpbnQpIGFycmF5X3BvcCgkdGVtcCk7CgkJCQkJfQoJCQkJCWlmIChzaXplb2YoJHRlbXApID4gMCkKCQkJCQl7CgkJCQkJCSRtaW51dGVzID0gKGludCkgYXJyYXlfcG9wKCR0ZW1wKTsKCQkJCQkJJHNlY29uZHMgKz0gJG1pbnV0ZXMgKiA2MDsKCQkJCQl9CgkJCQkJaWYgKHNpemVvZigkdGVtcCkgPiAwKQoJCQkJCXsKCQkJCQkJJGhvdXJzID0gKGludCkgYXJyYXlfcG9wKCR0ZW1wKTsKCQkJCQkJJHNlY29uZHMgKz0gJGhvdXJzICogMzYwMDsKCQkJCQl9CgkJCQkJdW5zZXQoJHRlbXApOwoJCQkJCSRkdXJhdGlvbl9wYXJlbnQgPSAkc2Vjb25kczsKCQkJCX0KCQkJfQoKCQkJLy8gSEFTSEVTCgkJCWlmICgkaGFzaGVzX2l0ZXJhdG9yID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ2hhc2gnKSkKCQkJewoJCQkJZm9yZWFjaCAoJGhhc2hlc19pdGVyYXRvciBhcyAkaGFzaCkKCQkJCXsKCQkJCQkkdmFsdWUgPSBudWxsOwoJCQkJCSRhbGdvID0gbnVsbDsKCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2RhdGEnXSkpCgkJCQkJewoJCQkJCQkkdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRoYXNoWydhdHRyaWJzJ11bJyddWydhbGdvJ10pKQoJCQkJCXsKCQkJCQkJJGFsZ28gPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJGFsZ28gPSAnbWQ1JzsKCQkJCQl9CgkJCQkJJGhhc2hlc19wYXJlbnRbXSA9ICRhbGdvLic6Jy4kdmFsdWU7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkaGFzaGVzX2l0ZXJhdG9yID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAnaGFzaCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkaGFzaGVzX2l0ZXJhdG9yIGFzICRoYXNoKQoJCQkJewoJCQkJCSR2YWx1ZSA9IG51bGw7CgkJCQkJJGFsZ28gPSBudWxsOwoJCQkJCWlmIChpc3NldCgkaGFzaFsnZGF0YSddKSkKCQkJCQl7CgkJCQkJCSR2YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkaGFzaFsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSkpCgkJCQkJewoJCQkJCQkkYWxnbyA9ICR0aGlzLT5zYW5pdGl6ZSgkaGFzaFsnYXR0cmlicyddWycnXVsnYWxnbyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkYWxnbyA9ICdtZDUnOwoJCQkJCX0KCQkJCQkkaGFzaGVzX3BhcmVudFtdID0gJGFsZ28uJzonLiR2YWx1ZTsKCQkJCX0KCQkJfQoJCQlpZiAoaXNfYXJyYXkoJGhhc2hlc19wYXJlbnQpKQoJCQl7CgkJCQkkaGFzaGVzX3BhcmVudCA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJGhhc2hlc19wYXJlbnQpKTsKCQkJfQoKCQkJLy8gS0VZV09SRFMKCQkJaWYgKCRrZXl3b3JkcyA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdrZXl3b3JkcycpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGtleXdvcmRzWzBdWydkYXRhJ10pKQoJCQkJewoJCQkJCSR0ZW1wID0gZXhwbG9kZSgnLCcsICR0aGlzLT5zYW5pdGl6ZSgka2V5d29yZHNbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSk7CgkJCQkJZm9yZWFjaCAoJHRlbXAgYXMgJHdvcmQpCgkJCQkJewoJCQkJCQkka2V5d29yZHNfcGFyZW50W10gPSB0cmltKCR3b3JkKTsKCQkJCQl9CgkJCQl9CgkJCQl1bnNldCgkdGVtcCk7CgkJCX0KCQkJZWxzZWlmICgka2V5d29yZHMgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2tleXdvcmRzJykpCgkJCXsKCQkJCWlmIChpc3NldCgka2V5d29yZHNbMF1bJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJHRlbXAgPSBleHBsb2RlKCcsJywgJHRoaXMtPnNhbml0aXplKCRrZXl3b3Jkc1swXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpKTsKCQkJCQlmb3JlYWNoICgkdGVtcCBhcyAkd29yZCkKCQkJCQl7CgkJCQkJCSRrZXl3b3Jkc19wYXJlbnRbXSA9IHRyaW0oJHdvcmQpOwoJCQkJCX0KCQkJCX0KCQkJCXVuc2V0KCR0ZW1wKTsKCQkJfQoJCQllbHNlaWYgKCRrZXl3b3JkcyA9ICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ2tleXdvcmRzJykpCgkJCXsKCQkJCWlmIChpc3NldCgka2V5d29yZHNbMF1bJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJHRlbXAgPSBleHBsb2RlKCcsJywgJHRoaXMtPnNhbml0aXplKCRrZXl3b3Jkc1swXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpKTsKCQkJCQlmb3JlYWNoICgkdGVtcCBhcyAkd29yZCkKCQkJCQl7CgkJCQkJCSRrZXl3b3Jkc19wYXJlbnRbXSA9IHRyaW0oJHdvcmQpOwoJCQkJCX0KCQkJCX0KCQkJCXVuc2V0KCR0ZW1wKTsKCQkJfQoJCQllbHNlaWYgKCRrZXl3b3JkcyA9ICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdrZXl3b3JkcycpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGtleXdvcmRzWzBdWydkYXRhJ10pKQoJCQkJewoJCQkJCSR0ZW1wID0gZXhwbG9kZSgnLCcsICR0aGlzLT5zYW5pdGl6ZSgka2V5d29yZHNbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSk7CgkJCQkJZm9yZWFjaCAoJHRlbXAgYXMgJHdvcmQpCgkJCQkJewoJCQkJCQkka2V5d29yZHNfcGFyZW50W10gPSB0cmltKCR3b3JkKTsKCQkJCQl9CgkJCQl9CgkJCQl1bnNldCgkdGVtcCk7CgkJCX0KCQkJaWYgKGlzX2FycmF5KCRrZXl3b3Jkc19wYXJlbnQpKQoJCQl7CgkJCQkka2V5d29yZHNfcGFyZW50ID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZSgka2V5d29yZHNfcGFyZW50KSk7CgkJCX0KCgkJCS8vIFBMQVlFUgoJCQlpZiAoJHBsYXllcl9wYXJlbnQgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAncGxheWVyJykpCgkJCXsKCQkJCWlmIChpc3NldCgkcGxheWVyX3BhcmVudFswXVsnYXR0cmlicyddWycnXVsndXJsJ10pKQoJCQkJewoJCQkJCSRwbGF5ZXJfcGFyZW50ID0gJHRoaXMtPnNhbml0aXplKCRwbGF5ZXJfcGFyZW50WzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJfQoJCQl9CgkJCWVsc2VpZiAoJHBsYXllcl9wYXJlbnQgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdwbGF5ZXInKSkKCQkJewoJCQkJaWYgKGlzc2V0KCRwbGF5ZXJfcGFyZW50WzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSkpCgkJCQl7CgkJCQkJJHBsYXllcl9wYXJlbnQgPSAkdGhpcy0+c2FuaXRpemUoJHBsYXllcl9wYXJlbnRbMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQl9CgkJCX0KCgkJCS8vIFJBVElOR1MKCQkJaWYgKCRyYXRpbmdzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ3JhdGluZycpKQoJCQl7CgkJCQlmb3JlYWNoICgkcmF0aW5ncyBhcyAkcmF0aW5nKQoJCQkJewoJCQkJCSRyYXRpbmdfc2NoZW1lID0gbnVsbDsKCQkJCQkkcmF0aW5nX3ZhbHVlID0gbnVsbDsKCQkJCQlpZiAoaXNzZXQoJHJhdGluZ1snYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCXsKCQkJCQkJJHJhdGluZ19zY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJHJhdGluZ1snYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSRyYXRpbmdfc2NoZW1lID0gJ3VybjpzaW1wbGUnOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJHJhdGluZ1snZGF0YSddKSkKCQkJCQl7CgkJCQkJCSRyYXRpbmdfdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJHJhdGluZ1snZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQkkcmF0aW5nc19wYXJlbnRbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdSYXRpbmcnLCBhcnJheSgkcmF0aW5nX3NjaGVtZSwgJHJhdGluZ192YWx1ZSkpOwoJCQkJfQoJCQl9CgkJCWVsc2VpZiAoJHJhdGluZ3MgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2V4cGxpY2l0JykpCgkJCXsKCQkJCWZvcmVhY2ggKCRyYXRpbmdzIGFzICRyYXRpbmcpCgkJCQl7CgkJCQkJJHJhdGluZ19zY2hlbWUgPSAndXJuOml0dW5lcyc7CgkJCQkJJHJhdGluZ192YWx1ZSA9IG51bGw7CgkJCQkJaWYgKGlzc2V0KCRyYXRpbmdbJ2RhdGEnXSkpCgkJCQkJewoJCQkJCQkkcmF0aW5nX3ZhbHVlID0gJHRoaXMtPnNhbml0aXplKCRyYXRpbmdbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJJHJhdGluZ3NfcGFyZW50W10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnUmF0aW5nJywgYXJyYXkoJHJhdGluZ19zY2hlbWUsICRyYXRpbmdfdmFsdWUpKTsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRyYXRpbmdzID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAncmF0aW5nJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRyYXRpbmdzIGFzICRyYXRpbmcpCgkJCQl7CgkJCQkJJHJhdGluZ19zY2hlbWUgPSBudWxsOwoJCQkJCSRyYXRpbmdfdmFsdWUgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJewoJCQkJCQkkcmF0aW5nX3NjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHJhdGluZ19zY2hlbWUgPSAndXJuOnNpbXBsZSc7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkcmF0aW5nWydkYXRhJ10pKQoJCQkJCXsKCQkJCQkJJHJhdGluZ192YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRyYXRpbmdzX3BhcmVudFtdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ1JhdGluZycsIGFycmF5KCRyYXRpbmdfc2NoZW1lLCAkcmF0aW5nX3ZhbHVlKSk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkcmF0aW5ncyA9ICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdleHBsaWNpdCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkcmF0aW5ncyBhcyAkcmF0aW5nKQoJCQkJewoJCQkJCSRyYXRpbmdfc2NoZW1lID0gJ3VybjppdHVuZXMnOwoJCQkJCSRyYXRpbmdfdmFsdWUgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkcmF0aW5nWydkYXRhJ10pKQoJCQkJCXsKCQkJCQkJJHJhdGluZ192YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRyYXRpbmdzX3BhcmVudFtdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ1JhdGluZycsIGFycmF5KCRyYXRpbmdfc2NoZW1lLCAkcmF0aW5nX3ZhbHVlKSk7CgkJCQl9CgkJCX0KCQkJaWYgKGlzX2FycmF5KCRyYXRpbmdzX3BhcmVudCkpCgkJCXsKCQkJCSRyYXRpbmdzX3BhcmVudCA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJHJhdGluZ3NfcGFyZW50KSk7CgkJCX0KCgkJCS8vIFJFU1RSSUNUSU9OUwoJCQlpZiAoJHJlc3RyaWN0aW9ucyA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdyZXN0cmljdGlvbicpKQoJCQl7CgkJCQlmb3JlYWNoICgkcmVzdHJpY3Rpb25zIGFzICRyZXN0cmljdGlvbikKCQkJCXsKCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gbnVsbDsKCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9IG51bGw7CgkJCQkJJHJlc3RyaWN0aW9uX3ZhbHVlID0gbnVsbDsKCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWydyZWxhdGlvbnNoaXAnXSkpCgkJCQkJewoJCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsncmVsYXRpb25zaGlwJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJewoJCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnZGF0YSddKSkKCQkJCQl7CgkJCQkJCSRyZXN0cmljdGlvbl92YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJJHJlc3RyaWN0aW9uc19wYXJlbnRbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdSZXN0cmljdGlvbicsIGFycmF5KCRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAsICRyZXN0cmljdGlvbl90eXBlLCAkcmVzdHJpY3Rpb25fdmFsdWUpKTsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRyZXN0cmljdGlvbnMgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2Jsb2NrJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRyZXN0cmljdGlvbnMgYXMgJHJlc3RyaWN0aW9uKQoJCQkJewoJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSAnYWxsb3cnOwoJCQkJCSRyZXN0cmljdGlvbl90eXBlID0gbnVsbDsKCQkJCQkkcmVzdHJpY3Rpb25fdmFsdWUgPSAnaXR1bmVzJzsKCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydkYXRhJ10pICYmIHN0cnRvbG93ZXIoJHJlc3RyaWN0aW9uWydkYXRhJ10pID09PSAneWVzJykKCQkJCQl7CgkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSAnZGVueSc7CgkJCQkJfQoJCQkJCSRyZXN0cmljdGlvbnNfcGFyZW50W10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnUmVzdHJpY3Rpb24nLCBhcnJheSgkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwLCAkcmVzdHJpY3Rpb25fdHlwZSwgJHJlc3RyaWN0aW9uX3ZhbHVlKSk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkcmVzdHJpY3Rpb25zID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAncmVzdHJpY3Rpb24nKSkKCQkJewoJCQkJZm9yZWFjaCAoJHJlc3RyaWN0aW9ucyBhcyAkcmVzdHJpY3Rpb24pCgkJCQl7CgkJCQkJJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCA9IG51bGw7CgkJCQkJJHJlc3RyaWN0aW9uX3R5cGUgPSBudWxsOwoJCQkJCSRyZXN0cmljdGlvbl92YWx1ZSA9IG51bGw7CgkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsncmVsYXRpb25zaGlwJ10pKQoJCQkJCXsKCQkJCQkJJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3JlbGF0aW9uc2hpcCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCXsKCQkJCQkJJHJlc3RyaWN0aW9uX3R5cGUgPSAkdGhpcy0+c2FuaXRpemUoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2RhdGEnXSkpCgkJCQkJewoJCQkJCQkkcmVzdHJpY3Rpb25fdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJHJlc3RyaWN0aW9uWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRyZXN0cmljdGlvbnNfcGFyZW50W10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnUmVzdHJpY3Rpb24nLCBhcnJheSgkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwLCAkcmVzdHJpY3Rpb25fdHlwZSwgJHJlc3RyaWN0aW9uX3ZhbHVlKSk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkcmVzdHJpY3Rpb25zID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2Jsb2NrJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRyZXN0cmljdGlvbnMgYXMgJHJlc3RyaWN0aW9uKQoJCQkJewoJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSAnYWxsb3cnOwoJCQkJCSRyZXN0cmljdGlvbl90eXBlID0gbnVsbDsKCQkJCQkkcmVzdHJpY3Rpb25fdmFsdWUgPSAnaXR1bmVzJzsKCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydkYXRhJ10pICYmIHN0cnRvbG93ZXIoJHJlc3RyaWN0aW9uWydkYXRhJ10pID09PSAneWVzJykKCQkJCQl7CgkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSAnZGVueSc7CgkJCQkJfQoJCQkJCSRyZXN0cmljdGlvbnNfcGFyZW50W10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnUmVzdHJpY3Rpb24nLCBhcnJheSgkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwLCAkcmVzdHJpY3Rpb25fdHlwZSwgJHJlc3RyaWN0aW9uX3ZhbHVlKSk7CgkJCQl9CgkJCX0KCQkJaWYgKGlzX2FycmF5KCRyZXN0cmljdGlvbnNfcGFyZW50KSkKCQkJewoJCQkJJHJlc3RyaWN0aW9uc19wYXJlbnQgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCRyZXN0cmljdGlvbnNfcGFyZW50KSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkcmVzdHJpY3Rpb25zX3BhcmVudCA9IGFycmF5KG5ldyBTaW1wbGVQaWVfUmVzdHJpY3Rpb24oJ2FsbG93JywgbnVsbCwgJ2RlZmF1bHQnKSk7CgkJCX0KCgkJCS8vIFRIVU1CTkFJTFMKCQkJaWYgKCR0aHVtYm5haWxzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ3RodW1ibmFpbCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkdGh1bWJuYWlscyBhcyAkdGh1bWJuYWlsKQoJCQkJewoJCQkJCWlmIChpc3NldCgkdGh1bWJuYWlsWydhdHRyaWJzJ11bJyddWyd1cmwnXSkpCgkJCQkJewoJCQkJCQkkdGh1bWJuYWlsc19wYXJlbnRbXSA9ICR0aGlzLT5zYW5pdGl6ZSgkdGh1bWJuYWlsWydhdHRyaWJzJ11bJyddWyd1cmwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlaWYgKCR0aHVtYm5haWxzID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAndGh1bWJuYWlsJykpCgkJCXsKCQkJCWZvcmVhY2ggKCR0aHVtYm5haWxzIGFzICR0aHVtYm5haWwpCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCR0aHVtYm5haWxbJ2F0dHJpYnMnXVsnJ11bJ3VybCddKSkKCQkJCQl7CgkJCQkJCSR0aHVtYm5haWxzX3BhcmVudFtdID0gJHRoaXMtPnNhbml0aXplKCR0aHVtYm5haWxbJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBUSVRMRVMKCQkJaWYgKCR0aXRsZV9wYXJlbnQgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAndGl0bGUnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCR0aXRsZV9wYXJlbnRbMF1bJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJHRpdGxlX3BhcmVudCA9ICR0aGlzLT5zYW5pdGl6ZSgkdGl0bGVfcGFyZW50WzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkdGl0bGVfcGFyZW50ID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAndGl0bGUnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCR0aXRsZV9wYXJlbnRbMF1bJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJHRpdGxlX3BhcmVudCA9ICR0aGlzLT5zYW5pdGl6ZSgkdGl0bGVfcGFyZW50WzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCX0KCgkJCS8vIENsZWFyIHRoZSBtZW1vcnkKCQkJdW5zZXQoJHBhcmVudCk7CgoJCQkvLyBBdHRyaWJ1dGVzCgkJCSRiaXRyYXRlID0gbnVsbDsKCQkJJGNoYW5uZWxzID0gbnVsbDsKCQkJJGR1cmF0aW9uID0gbnVsbDsKCQkJJGV4cHJlc3Npb24gPSBudWxsOwoJCQkkZnJhbWVyYXRlID0gbnVsbDsKCQkJJGhlaWdodCA9IG51bGw7CgkJCSRqYXZhc2NyaXB0ID0gbnVsbDsKCQkJJGxhbmcgPSBudWxsOwoJCQkkbGVuZ3RoID0gbnVsbDsKCQkJJG1lZGl1bSA9IG51bGw7CgkJCSRzYW1wbGluZ3JhdGUgPSBudWxsOwoJCQkkdHlwZSA9IG51bGw7CgkJCSR1cmwgPSBudWxsOwoJCQkkd2lkdGggPSBudWxsOwoKCQkJLy8gRWxlbWVudHMKCQkJJGNhcHRpb25zID0gbnVsbDsKCQkJJGNhdGVnb3JpZXMgPSBudWxsOwoJCQkkY29weXJpZ2h0cyA9IG51bGw7CgkJCSRjcmVkaXRzID0gbnVsbDsKCQkJJGRlc2NyaXB0aW9uID0gbnVsbDsKCQkJJGhhc2hlcyA9IG51bGw7CgkJCSRrZXl3b3JkcyA9IG51bGw7CgkJCSRwbGF5ZXIgPSBudWxsOwoJCQkkcmF0aW5ncyA9IG51bGw7CgkJCSRyZXN0cmljdGlvbnMgPSBudWxsOwoJCQkkdGh1bWJuYWlscyA9IG51bGw7CgkJCSR0aXRsZSA9IG51bGw7CgoJCQkvLyBJZiB3ZSBoYXZlIG1lZGlhOmdyb3VwIHRhZ3MsIGxvb3AgdGhyb3VnaCB0aGVtLgoJCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdncm91cCcpIGFzICRncm91cCkKCQkJewoJCQkJaWYoaXNzZXQoJGdyb3VwWydjaGlsZCddKSAmJiBpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvbnRlbnQnXSkpCgkJCQl7CgkJCQkJLy8gSWYgd2UgaGF2ZSBtZWRpYTpjb250ZW50IHRhZ3MsIGxvb3AgdGhyb3VnaCB0aGVtLgoJCQkJCWZvcmVhY2ggKChhcnJheSkgJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb250ZW50J10gYXMgJGNvbnRlbnQpCgkJCQkJewoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ3VybCddKSkKCQkJCQkJewoJCQkJCQkJLy8gQXR0cmlidXRlcwoJCQkJCQkJJGJpdHJhdGUgPSBudWxsOwoJCQkJCQkJJGNoYW5uZWxzID0gbnVsbDsKCQkJCQkJCSRkdXJhdGlvbiA9IG51bGw7CgkJCQkJCQkkZXhwcmVzc2lvbiA9IG51bGw7CgkJCQkJCQkkZnJhbWVyYXRlID0gbnVsbDsKCQkJCQkJCSRoZWlnaHQgPSBudWxsOwoJCQkJCQkJJGphdmFzY3JpcHQgPSBudWxsOwoJCQkJCQkJJGxhbmcgPSBudWxsOwoJCQkJCQkJJGxlbmd0aCA9IG51bGw7CgkJCQkJCQkkbWVkaXVtID0gbnVsbDsKCQkJCQkJCSRzYW1wbGluZ3JhdGUgPSBudWxsOwoJCQkJCQkJJHR5cGUgPSBudWxsOwoJCQkJCQkJJHVybCA9IG51bGw7CgkJCQkJCQkkd2lkdGggPSBudWxsOwoKCQkJCQkJCS8vIEVsZW1lbnRzCgkJCQkJCQkkY2FwdGlvbnMgPSBudWxsOwoJCQkJCQkJJGNhdGVnb3JpZXMgPSBudWxsOwoJCQkJCQkJJGNvcHlyaWdodHMgPSBudWxsOwoJCQkJCQkJJGNyZWRpdHMgPSBudWxsOwoJCQkJCQkJJGRlc2NyaXB0aW9uID0gbnVsbDsKCQkJCQkJCSRoYXNoZXMgPSBudWxsOwoJCQkJCQkJJGtleXdvcmRzID0gbnVsbDsKCQkJCQkJCSRwbGF5ZXIgPSBudWxsOwoJCQkJCQkJJHJhdGluZ3MgPSBudWxsOwoJCQkJCQkJJHJlc3RyaWN0aW9ucyA9IG51bGw7CgkJCQkJCQkkdGh1bWJuYWlscyA9IG51bGw7CgkJCQkJCQkkdGl0bGUgPSBudWxsOwoKCQkJCQkJCS8vIFN0YXJ0IGNoZWNraW5nIHRoZSBhdHRyaWJ1dGVzIG9mIG1lZGlhOmNvbnRlbnQKCQkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnYml0cmF0ZSddKSkKCQkJCQkJCXsKCQkJCQkJCQkkYml0cmF0ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnYml0cmF0ZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydjaGFubmVscyddKSkKCQkJCQkJCXsKCQkJCQkJCQkkY2hhbm5lbHMgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2NoYW5uZWxzJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2R1cmF0aW9uJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRkdXJhdGlvbiA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnZHVyYXRpb24nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQkkZHVyYXRpb24gPSAkZHVyYXRpb25fcGFyZW50OwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydleHByZXNzaW9uJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRleHByZXNzaW9uID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydleHByZXNzaW9uJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2ZyYW1lcmF0ZSddKSkKCQkJCQkJCXsKCQkJCQkJCQkkZnJhbWVyYXRlID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydmcmFtZXJhdGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnaGVpZ2h0J10pKQoJCQkJCQkJewoJCQkJCQkJCSRoZWlnaHQgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2hlaWdodCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydsYW5nJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRsYW5nID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydsYW5nJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2ZpbGVTaXplJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRsZW5ndGggPSBjZWlsKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydmaWxlU2l6ZSddKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnbWVkaXVtJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRtZWRpdW0gPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ21lZGl1bSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydzYW1wbGluZ3JhdGUnXSkpCgkJCQkJCQl7CgkJCQkJCQkJJHNhbXBsaW5ncmF0ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnc2FtcGxpbmdyYXRlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJCQl7CgkJCQkJCQkJJHR5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnd2lkdGgnXSkpCgkJCQkJCQl7CgkJCQkJCQkJJHdpZHRoID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd3aWR0aCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJJHVybCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCgkJCQkJCQkvLyBDaGVja2luZyB0aGUgb3RoZXIgb3B0aW9uYWwgbWVkaWE6IGVsZW1lbnRzLiBQcmlvcml0eTogbWVkaWE6Y29udGVudCwgbWVkaWE6Z3JvdXAsIGl0ZW0sIGNoYW5uZWwKCgkJCQkJCQkvLyBDQVBUSU9OUwoJCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0ZXh0J10pKQoJCQkJCQkJewoJCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0ZXh0J10gYXMgJGNhcHRpb24pCgkJCQkJCQkJewoJCQkJCQkJCQkkY2FwdGlvbl90eXBlID0gbnVsbDsKCQkJCQkJCQkJJGNhcHRpb25fbGFuZyA9IG51bGw7CgkJCQkJCQkJCSRjYXB0aW9uX3N0YXJ0VGltZSA9IG51bGw7CgkJCQkJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSBudWxsOwoJCQkJCQkJCQkkY2FwdGlvbl90ZXh0ID0gbnVsbDsKCQkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkY2FwdGlvbl90eXBlID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydsYW5nJ10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkY2FwdGlvbl9sYW5nID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydsYW5nJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydzdGFydCddKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJJGNhcHRpb25fc3RhcnRUaW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydzdGFydCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnZW5kJ10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkY2FwdGlvbl9lbmRUaW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydlbmQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2RhdGEnXSkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRjYXB0aW9uX3RleHQgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkkY2FwdGlvbnNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdDYXB0aW9uJywgYXJyYXkoJGNhcHRpb25fdHlwZSwgJGNhcHRpb25fbGFuZywgJGNhcHRpb25fc3RhcnRUaW1lLCAkY2FwdGlvbl9lbmRUaW1lLCAkY2FwdGlvbl90ZXh0KSk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc19hcnJheSgkY2FwdGlvbnMpKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhcHRpb25zID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZSgkY2FwdGlvbnMpKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQllbHNlaWYgKGlzc2V0KCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGV4dCddKSkKCQkJCQkJCXsKCQkJCQkJCQlmb3JlYWNoICgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RleHQnXSBhcyAkY2FwdGlvbikKCQkJCQkJCQl7CgkJCQkJCQkJCSRjYXB0aW9uX3R5cGUgPSBudWxsOwoJCQkJCQkJCQkkY2FwdGlvbl9sYW5nID0gbnVsbDsKCQkJCQkJCQkJJGNhcHRpb25fc3RhcnRUaW1lID0gbnVsbDsKCQkJCQkJCQkJJGNhcHRpb25fZW5kVGltZSA9IG51bGw7CgkJCQkJCQkJCSRjYXB0aW9uX3RleHQgPSBudWxsOwoJCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRjYXB0aW9uX3R5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2xhbmcnXSkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRjYXB0aW9uX2xhbmcgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2xhbmcnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3N0YXJ0J10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkY2FwdGlvbl9zdGFydFRpbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3N0YXJ0J10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydlbmQnXSkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnZGF0YSddKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJJGNhcHRpb25fdGV4dCA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCSRjYXB0aW9uc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NhcHRpb24nLCBhcnJheSgkY2FwdGlvbl90eXBlLCAkY2FwdGlvbl9sYW5nLCAkY2FwdGlvbl9zdGFydFRpbWUsICRjYXB0aW9uX2VuZFRpbWUsICRjYXB0aW9uX3RleHQpKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzX2FycmF5KCRjYXB0aW9ucykpCgkJCQkJCQkJewoJCQkJCQkJCQkkY2FwdGlvbnMgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCRjYXB0aW9ucykpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQkkY2FwdGlvbnMgPSAkY2FwdGlvbnNfcGFyZW50OwoJCQkJCQkJfQoKCQkJCQkJCS8vIENBVEVHT1JJRVMKCQkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY2F0ZWdvcnknXSkpCgkJCQkJCQl7CgkJCQkJCQkJZm9yZWFjaCAoKGFycmF5KSAkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY2F0ZWdvcnknXSBhcyAkY2F0ZWdvcnkpCgkJCQkJCQkJewoJCQkJCQkJCQkkdGVybSA9IG51bGw7CgkJCQkJCQkJCSRzY2hlbWUgPSBudWxsOwoJCQkJCQkJCQkkbGFiZWwgPSBudWxsOwoJCQkJCQkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydkYXRhJ10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkdGVybSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRzY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRzY2hlbWUgPSAnaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcy9jYXRlZ29yeV9zY2hlbWEnOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2xhYmVsJ10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCSRjYXRlZ29yaWVzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQ2F0ZWdvcnknLCBhcnJheSgkdGVybSwgJHNjaGVtZSwgJGxhYmVsKSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY2F0ZWdvcnknXSkpCgkJCQkJCQl7CgkJCQkJCQkJZm9yZWFjaCAoKGFycmF5KSAkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NhdGVnb3J5J10gYXMgJGNhdGVnb3J5KQoJCQkJCQkJCXsKCQkJCQkJCQkJJHRlcm0gPSBudWxsOwoJCQkJCQkJCQkkc2NoZW1lID0gbnVsbDsKCQkJCQkJCQkJJGxhYmVsID0gbnVsbDsKCQkJCQkJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnZGF0YSddKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJJHRlcm0gPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJZWxzZQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkc2NoZW1lID0gJ2h0dHA6Ly9zZWFyY2gueWFob28uY29tL21yc3MvY2F0ZWdvcnlfc2NoZW1hJzsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJJGxhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkkY2F0ZWdvcmllc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NhdGVnb3J5JywgYXJyYXkoJHRlcm0sICRzY2hlbWUsICRsYWJlbCkpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkY2F0ZWdvcmllcykgJiYgaXNfYXJyYXkoJGNhdGVnb3JpZXNfcGFyZW50KSkKCQkJCQkJCXsKCQkJCQkJCQkkY2F0ZWdvcmllcyA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoYXJyYXlfbWVyZ2UoJGNhdGVnb3JpZXMsICRjYXRlZ29yaWVzX3BhcmVudCkpKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2VpZiAoaXNfYXJyYXkoJGNhdGVnb3JpZXMpKQoJCQkJCQkJewoJCQkJCQkJCSRjYXRlZ29yaWVzID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZSgkY2F0ZWdvcmllcykpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZWlmIChpc19hcnJheSgkY2F0ZWdvcmllc19wYXJlbnQpKQoJCQkJCQkJewoJCQkJCQkJCSRjYXRlZ29yaWVzID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZSgkY2F0ZWdvcmllc19wYXJlbnQpKTsKCQkJCQkJCX0KCgkJCQkJCQkvLyBDT1BZUklHSFRTCgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvcHlyaWdodCddKSkKCQkJCQkJCXsKCQkJCQkJCQkkY29weXJpZ2h0X3VybCA9IG51bGw7CgkJCQkJCQkJJGNvcHlyaWdodF9sYWJlbCA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnYXR0cmlicyddWycnXVsndXJsJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNvcHlyaWdodF91cmwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvcHlyaWdodCddWzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnZGF0YSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjb3B5cmlnaHRfbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvcHlyaWdodCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRjb3B5cmlnaHRzID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NvcHlyaWdodCcsIGFycmF5KCRjb3B5cmlnaHRfdXJsLCAkY29weXJpZ2h0X2xhYmVsKSk7CgkJCQkJCQl9CgkJCQkJCQllbHNlaWYgKGlzc2V0KCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J10pKQoJCQkJCQkJewoJCQkJCQkJCSRjb3B5cmlnaHRfdXJsID0gbnVsbDsKCQkJCQkJCQkkY29weXJpZ2h0X2xhYmVsID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnYXR0cmlicyddWycnXVsndXJsJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNvcHlyaWdodF91cmwgPSAkdGhpcy0+c2FuaXRpemUoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvcHlyaWdodCddWzBdWydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNvcHlyaWdodF9sYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvcHlyaWdodCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRjb3B5cmlnaHRzID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NvcHlyaWdodCcsIGFycmF5KCRjb3B5cmlnaHRfdXJsLCAkY29weXJpZ2h0X2xhYmVsKSk7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJJGNvcHlyaWdodHMgPSAkY29weXJpZ2h0c19wYXJlbnQ7CgkJCQkJCQl9CgoJCQkJCQkJLy8gQ1JFRElUUwoJCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjcmVkaXQnXSkpCgkJCQkJCQl7CgkJCQkJCQkJZm9yZWFjaCAoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NyZWRpdCddIGFzICRjcmVkaXQpCgkJCQkJCQkJewoJCQkJCQkJCQkkY3JlZGl0X3JvbGUgPSBudWxsOwoJCQkJCQkJCQkkY3JlZGl0X3NjaGVtZSA9IG51bGw7CgkJCQkJCQkJCSRjcmVkaXRfbmFtZSA9IG51bGw7CgkJCQkJCQkJCWlmIChpc3NldCgkY3JlZGl0WydhdHRyaWJzJ11bJyddWydyb2xlJ10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkY3JlZGl0X3JvbGUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmIChpc3NldCgkY3JlZGl0WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRjcmVkaXRfc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWVsc2UKCQkJCQkJCQkJewoJCQkJCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSAndXJuOmVidSc7CgkJCQkJCQkJCX0KCQkJCQkJCQkJaWYgKGlzc2V0KCRjcmVkaXRbJ2RhdGEnXSkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRjcmVkaXRfbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJJGNyZWRpdHNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdDcmVkaXQnLCBhcnJheSgkY3JlZGl0X3JvbGUsICRjcmVkaXRfc2NoZW1lLCAkY3JlZGl0X25hbWUpKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzX2FycmF5KCRjcmVkaXRzKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjcmVkaXRzID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZSgkY3JlZGl0cykpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWVsc2VpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjcmVkaXQnXSkpCgkJCQkJCQl7CgkJCQkJCQkJZm9yZWFjaCAoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjcmVkaXQnXSBhcyAkY3JlZGl0KQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNyZWRpdF9yb2xlID0gbnVsbDsKCQkJCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSBudWxsOwoJCQkJCQkJCQkkY3JlZGl0X25hbWUgPSBudWxsOwoJCQkJCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJJGNyZWRpdF9yb2xlID0gJHRoaXMtPnNhbml0aXplKCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3JvbGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkY3JlZGl0X3NjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRjcmVkaXRfc2NoZW1lID0gJ3VybjplYnUnOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmIChpc3NldCgkY3JlZGl0WydkYXRhJ10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkY3JlZGl0X25hbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCSRjcmVkaXRzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQ3JlZGl0JywgYXJyYXkoJGNyZWRpdF9yb2xlLCAkY3JlZGl0X3NjaGVtZSwgJGNyZWRpdF9uYW1lKSk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc19hcnJheSgkY3JlZGl0cykpCgkJCQkJCQkJewoJCQkJCQkJCQkkY3JlZGl0cyA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJGNyZWRpdHMpKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJJGNyZWRpdHMgPSAkY3JlZGl0c19wYXJlbnQ7CgkJCQkJCQl9CgoJCQkJCQkJLy8gREVTQ1JJUFRJT04KCQkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnZGVzY3JpcHRpb24nXSkpCgkJCQkJCQl7CgkJCQkJCQkJJGRlc2NyaXB0aW9uID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydkZXNjcmlwdGlvbiddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQl9CgkJCQkJCQllbHNlaWYgKGlzc2V0KCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnZGVzY3JpcHRpb24nXSkpCgkJCQkJCQl7CgkJCQkJCQkJJGRlc2NyaXB0aW9uID0gJHRoaXMtPnNhbml0aXplKCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnZGVzY3JpcHRpb24nXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCSRkZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbl9wYXJlbnQ7CgkJCQkJCQl9CgoJCQkJCQkJLy8gSEFTSEVTCgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2hhc2gnXSkpCgkJCQkJCQl7CgkJCQkJCQkJZm9yZWFjaCAoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2hhc2gnXSBhcyAkaGFzaCkKCQkJCQkJCQl7CgkJCQkJCQkJCSR2YWx1ZSA9IG51bGw7CgkJCQkJCQkJCSRhbGdvID0gbnVsbDsKCQkJCQkJCQkJaWYgKGlzc2V0KCRoYXNoWydkYXRhJ10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRhbGdvID0gJHRoaXMtPnNhbml0aXplKCRoYXNoWydhdHRyaWJzJ11bJyddWydhbGdvJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJZWxzZQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkYWxnbyA9ICdtZDUnOwoJCQkJCQkJCQl9CgkJCQkJCQkJCSRoYXNoZXNbXSA9ICRhbGdvLic6Jy4kdmFsdWU7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc19hcnJheSgkaGFzaGVzKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRoYXNoZXMgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCRoYXNoZXMpKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQllbHNlaWYgKGlzc2V0KCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnaGFzaCddKSkKCQkJCQkJCXsKCQkJCQkJCQlmb3JlYWNoICgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2hhc2gnXSBhcyAkaGFzaCkKCQkJCQkJCQl7CgkJCQkJCQkJCSR2YWx1ZSA9IG51bGw7CgkJCQkJCQkJCSRhbGdvID0gbnVsbDsKCQkJCQkJCQkJaWYgKGlzc2V0KCRoYXNoWydkYXRhJ10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRhbGdvID0gJHRoaXMtPnNhbml0aXplKCRoYXNoWydhdHRyaWJzJ11bJyddWydhbGdvJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJZWxzZQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkYWxnbyA9ICdtZDUnOwoJCQkJCQkJCQl9CgkJCQkJCQkJCSRoYXNoZXNbXSA9ICRhbGdvLic6Jy4kdmFsdWU7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc19hcnJheSgkaGFzaGVzKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRoYXNoZXMgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCRoYXNoZXMpKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJJGhhc2hlcyA9ICRoYXNoZXNfcGFyZW50OwoJCQkJCQkJfQoKCQkJCQkJCS8vIEtFWVdPUkRTCgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ10pKQoJCQkJCQkJewoJCQkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsna2V5d29yZHMnXVswXVsnZGF0YSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSR0ZW1wID0gZXhwbG9kZSgnLCcsICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsna2V5d29yZHMnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpKTsKCQkJCQkJCQkJZm9yZWFjaCAoJHRlbXAgYXMgJHdvcmQpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRrZXl3b3Jkc1tdID0gdHJpbSgkd29yZCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJdW5zZXQoJHRlbXApOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNfYXJyYXkoJGtleXdvcmRzKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRrZXl3b3JkcyA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJGtleXdvcmRzKSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ10pKQoJCQkJCQkJewoJCQkJCQkJCWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ11bMF1bJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkdGVtcCA9IGV4cGxvZGUoJywnLCAkdGhpcy0+c2FuaXRpemUoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydrZXl3b3JkcyddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCkpOwoJCQkJCQkJCQlmb3JlYWNoICgkdGVtcCBhcyAkd29yZCkKCQkJCQkJCQkJewoJCQkJCQkJCQkJJGtleXdvcmRzW10gPSB0cmltKCR3b3JkKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQl1bnNldCgkdGVtcCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc19hcnJheSgka2V5d29yZHMpKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGtleXdvcmRzID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZSgka2V5d29yZHMpKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJJGtleXdvcmRzID0gJGtleXdvcmRzX3BhcmVudDsKCQkJCQkJCX0KCgkJCQkJCQkvLyBQTEFZRVIKCQkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncGxheWVyJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRwbGF5ZXIgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3BsYXllciddWzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3BsYXllciddKSkKCQkJCQkJCXsKCQkJCQkJCQkkcGxheWVyID0gJHRoaXMtPnNhbml0aXplKCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncGxheWVyJ11bMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJJHBsYXllciA9ICRwbGF5ZXJfcGFyZW50OwoJCQkJCQkJfQoKCQkJCQkJCS8vIFJBVElOR1MKCQkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmF0aW5nJ10pKQoJCQkJCQkJewoJCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydyYXRpbmcnXSBhcyAkcmF0aW5nKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJhdGluZ19zY2hlbWUgPSBudWxsOwoJCQkJCQkJCQkkcmF0aW5nX3ZhbHVlID0gbnVsbDsKCQkJCQkJCQkJaWYgKGlzc2V0KCRyYXRpbmdbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJJHJhdGluZ19zY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJHJhdGluZ1snYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJZWxzZQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkcmF0aW5nX3NjaGVtZSA9ICd1cm46c2ltcGxlJzsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZiAoaXNzZXQoJHJhdGluZ1snZGF0YSddKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJJHJhdGluZ192YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJJHJhdGluZ3NbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdSYXRpbmcnLCBhcnJheSgkcmF0aW5nX3NjaGVtZSwgJHJhdGluZ192YWx1ZSkpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNfYXJyYXkoJHJhdGluZ3MpKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJhdGluZ3MgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCRyYXRpbmdzKSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3JhdGluZyddKSkKCQkJCQkJCXsKCQkJCQkJCQlmb3JlYWNoICgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3JhdGluZyddIGFzICRyYXRpbmcpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmF0aW5nX3NjaGVtZSA9IG51bGw7CgkJCQkJCQkJCSRyYXRpbmdfdmFsdWUgPSBudWxsOwoJCQkJCQkJCQlpZiAoaXNzZXQoJHJhdGluZ1snYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkcmF0aW5nX3NjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRyYXRpbmdfc2NoZW1lID0gJ3VybjpzaW1wbGUnOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmIChpc3NldCgkcmF0aW5nWydkYXRhJ10pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkcmF0aW5nX3ZhbHVlID0gJHRoaXMtPnNhbml0aXplKCRyYXRpbmdbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkkcmF0aW5nc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ1JhdGluZycsIGFycmF5KCRyYXRpbmdfc2NoZW1lLCAkcmF0aW5nX3ZhbHVlKSk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc19hcnJheSgkcmF0aW5ncykpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmF0aW5ncyA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJHJhdGluZ3MpKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJJHJhdGluZ3MgPSAkcmF0aW5nc19wYXJlbnQ7CgkJCQkJCQl9CgoJCQkJCQkJLy8gUkVTVFJJQ1RJT05TCgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3Jlc3RyaWN0aW9uJ10pKQoJCQkJCQkJewoJCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydyZXN0cmljdGlvbiddIGFzICRyZXN0cmljdGlvbikKCQkJCQkJCQl7CgkJCQkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSBudWxsOwoJCQkJCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9IG51bGw7CgkJCQkJCQkJCSRyZXN0cmljdGlvbl92YWx1ZSA9IG51bGw7CgkJCQkJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3JlbGF0aW9uc2hpcCddKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3JlbGF0aW9uc2hpcCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRyZXN0cmljdGlvbl90eXBlID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2RhdGEnXSkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRyZXN0cmljdGlvbl92YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkkcmVzdHJpY3Rpb25zW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnUmVzdHJpY3Rpb24nLCBhcnJheSgkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwLCAkcmVzdHJpY3Rpb25fdHlwZSwgJHJlc3RyaWN0aW9uX3ZhbHVlKSk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc19hcnJheSgkcmVzdHJpY3Rpb25zKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRyZXN0cmljdGlvbnMgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCRyZXN0cmljdGlvbnMpKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQllbHNlaWYgKGlzc2V0KCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmVzdHJpY3Rpb24nXSkpCgkJCQkJCQl7CgkJCQkJCQkJZm9yZWFjaCAoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydyZXN0cmljdGlvbiddIGFzICRyZXN0cmljdGlvbikKCQkJCQkJCQl7CgkJCQkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSBudWxsOwoJCQkJCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9IG51bGw7CgkJCQkJCQkJCSRyZXN0cmljdGlvbl92YWx1ZSA9IG51bGw7CgkJCQkJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3JlbGF0aW9uc2hpcCddKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3JlbGF0aW9uc2hpcCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRyZXN0cmljdGlvbl90eXBlID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2RhdGEnXSkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRyZXN0cmljdGlvbl92YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkkcmVzdHJpY3Rpb25zW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnUmVzdHJpY3Rpb24nLCBhcnJheSgkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwLCAkcmVzdHJpY3Rpb25fdHlwZSwgJHJlc3RyaWN0aW9uX3ZhbHVlKSk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc19hcnJheSgkcmVzdHJpY3Rpb25zKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRyZXN0cmljdGlvbnMgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCRyZXN0cmljdGlvbnMpKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJJHJlc3RyaWN0aW9ucyA9ICRyZXN0cmljdGlvbnNfcGFyZW50OwoJCQkJCQkJfQoKCQkJCQkJCS8vIFRIVU1CTkFJTFMKCQkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGh1bWJuYWlsJ10pKQoJCQkJCQkJewoJCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aHVtYm5haWwnXSBhcyAkdGh1bWJuYWlsKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHRodW1ibmFpbHNbXSA9ICR0aGlzLT5zYW5pdGl6ZSgkdGh1bWJuYWlsWydhdHRyaWJzJ11bJyddWyd1cmwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNfYXJyYXkoJHRodW1ibmFpbHMpKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHRodW1ibmFpbHMgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCR0aHVtYm5haWxzKSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RodW1ibmFpbCddKSkKCQkJCQkJCXsKCQkJCQkJCQlmb3JlYWNoICgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RodW1ibmFpbCddIGFzICR0aHVtYm5haWwpCgkJCQkJCQkJewoJCQkJCQkJCQkkdGh1bWJuYWlsc1tdID0gJHRoaXMtPnNhbml0aXplKCR0aHVtYm5haWxbJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc19hcnJheSgkdGh1bWJuYWlscykpCgkJCQkJCQkJewoJCQkJCQkJCQkkdGh1bWJuYWlscyA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJHRodW1ibmFpbHMpKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJJHRodW1ibmFpbHMgPSAkdGh1bWJuYWlsc19wYXJlbnQ7CgkJCQkJCQl9CgoJCQkJCQkJLy8gVElUTEVTCgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RpdGxlJ10pKQoJCQkJCQkJewoJCQkJCQkJCSR0aXRsZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGl0bGUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RpdGxlJ10pKQoJCQkJCQkJewoJCQkJCQkJCSR0aXRsZSA9ICR0aGlzLT5zYW5pdGl6ZSgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RpdGxlJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQkkdGl0bGUgPSAkdGl0bGVfcGFyZW50OwoJCQkJCQkJfQoKCQkJCQkJCSR0aGlzLT5kYXRhWydlbmNsb3N1cmVzJ11bXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdFbmNsb3N1cmUnLCBhcnJheSgkdXJsLCAkdHlwZSwgJGxlbmd0aCwgbnVsbCwgJGJpdHJhdGUsICRjYXB0aW9ucywgJGNhdGVnb3JpZXMsICRjaGFubmVscywgJGNvcHlyaWdodHMsICRjcmVkaXRzLCAkZGVzY3JpcHRpb24sICRkdXJhdGlvbiwgJGV4cHJlc3Npb24sICRmcmFtZXJhdGUsICRoYXNoZXMsICRoZWlnaHQsICRrZXl3b3JkcywgJGxhbmcsICRtZWRpdW0sICRwbGF5ZXIsICRyYXRpbmdzLCAkcmVzdHJpY3Rpb25zLCAkc2FtcGxpbmdyYXRlLCAkdGh1bWJuYWlscywgJHRpdGxlLCAkd2lkdGgpKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gSWYgd2UgaGF2ZSBzdGFuZGFsb25lIG1lZGlhOmNvbnRlbnQgdGFncywgbG9vcCB0aHJvdWdoIHRoZW0uCgkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29udGVudCddKSkKCQkJewoJCQkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29udGVudCddIGFzICRjb250ZW50KQoJCQkJewoJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsndXJsJ10pIHx8IGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydwbGF5ZXInXSkpCgkJCQkJewoJCQkJCQkvLyBBdHRyaWJ1dGVzCgkJCQkJCSRiaXRyYXRlID0gbnVsbDsKCQkJCQkJJGNoYW5uZWxzID0gbnVsbDsKCQkJCQkJJGR1cmF0aW9uID0gbnVsbDsKCQkJCQkJJGV4cHJlc3Npb24gPSBudWxsOwoJCQkJCQkkZnJhbWVyYXRlID0gbnVsbDsKCQkJCQkJJGhlaWdodCA9IG51bGw7CgkJCQkJCSRqYXZhc2NyaXB0ID0gbnVsbDsKCQkJCQkJJGxhbmcgPSBudWxsOwoJCQkJCQkkbGVuZ3RoID0gbnVsbDsKCQkJCQkJJG1lZGl1bSA9IG51bGw7CgkJCQkJCSRzYW1wbGluZ3JhdGUgPSBudWxsOwoJCQkJCQkkdHlwZSA9IG51bGw7CgkJCQkJCSR1cmwgPSBudWxsOwoJCQkJCQkkd2lkdGggPSBudWxsOwoKCQkJCQkJLy8gRWxlbWVudHMKCQkJCQkJJGNhcHRpb25zID0gbnVsbDsKCQkJCQkJJGNhdGVnb3JpZXMgPSBudWxsOwoJCQkJCQkkY29weXJpZ2h0cyA9IG51bGw7CgkJCQkJCSRjcmVkaXRzID0gbnVsbDsKCQkJCQkJJGRlc2NyaXB0aW9uID0gbnVsbDsKCQkJCQkJJGhhc2hlcyA9IG51bGw7CgkJCQkJCSRrZXl3b3JkcyA9IG51bGw7CgkJCQkJCSRwbGF5ZXIgPSBudWxsOwoJCQkJCQkkcmF0aW5ncyA9IG51bGw7CgkJCQkJCSRyZXN0cmljdGlvbnMgPSBudWxsOwoJCQkJCQkkdGh1bWJuYWlscyA9IG51bGw7CgkJCQkJCSR0aXRsZSA9IG51bGw7CgoJCQkJCQkvLyBTdGFydCBjaGVja2luZyB0aGUgYXR0cmlidXRlcyBvZiBtZWRpYTpjb250ZW50CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnYml0cmF0ZSddKSkKCQkJCQkJewoJCQkJCQkJJGJpdHJhdGUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2JpdHJhdGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2NoYW5uZWxzJ10pKQoJCQkJCQl7CgkJCQkJCQkkY2hhbm5lbHMgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2NoYW5uZWxzJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydkdXJhdGlvbiddKSkKCQkJCQkJewoJCQkJCQkJJGR1cmF0aW9uID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydkdXJhdGlvbiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGR1cmF0aW9uID0gJGR1cmF0aW9uX3BhcmVudDsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2V4cHJlc3Npb24nXSkpCgkJCQkJCXsKCQkJCQkJCSRleHByZXNzaW9uID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydleHByZXNzaW9uJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydmcmFtZXJhdGUnXSkpCgkJCQkJCXsKCQkJCQkJCSRmcmFtZXJhdGUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2ZyYW1lcmF0ZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnaGVpZ2h0J10pKQoJCQkJCQl7CgkJCQkJCQkkaGVpZ2h0ID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydoZWlnaHQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2xhbmcnXSkpCgkJCQkJCXsKCQkJCQkJCSRsYW5nID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydsYW5nJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydmaWxlU2l6ZSddKSkKCQkJCQkJewoJCQkJCQkJJGxlbmd0aCA9IGNlaWwoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2ZpbGVTaXplJ10pOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnbWVkaXVtJ10pKQoJCQkJCQl7CgkJCQkJCQkkbWVkaXVtID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydtZWRpdW0nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ3NhbXBsaW5ncmF0ZSddKSkKCQkJCQkJewoJCQkJCQkJJHNhbXBsaW5ncmF0ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnc2FtcGxpbmdyYXRlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCQl7CgkJCQkJCQkkdHlwZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnd2lkdGgnXSkpCgkJCQkJCXsKCQkJCQkJCSR3aWR0aCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnd2lkdGgnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ3VybCddKSkKCQkJCQkJewoJCQkJCQkJJHVybCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQkJCQkJfQoJCQkJCQkvLyBDaGVja2luZyB0aGUgb3RoZXIgb3B0aW9uYWwgbWVkaWE6IGVsZW1lbnRzLiBQcmlvcml0eTogbWVkaWE6Y29udGVudCwgbWVkaWE6Z3JvdXAsIGl0ZW0sIGNoYW5uZWwKCgkJCQkJCS8vIENBUFRJT05TCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGV4dCddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RleHQnXSBhcyAkY2FwdGlvbikKCQkJCQkJCXsKCQkJCQkJCQkkY2FwdGlvbl90eXBlID0gbnVsbDsKCQkJCQkJCQkkY2FwdGlvbl9sYW5nID0gbnVsbDsKCQkJCQkJCQkkY2FwdGlvbl9zdGFydFRpbWUgPSBudWxsOwoJCQkJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSBudWxsOwoJCQkJCQkJCSRjYXB0aW9uX3RleHQgPSBudWxsOwoJCQkJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjYXB0aW9uX3R5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydsYW5nJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhcHRpb25fbGFuZyA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnbGFuZyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3N0YXJ0J10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhcHRpb25fc3RhcnRUaW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydzdGFydCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY2FwdGlvbl90ZXh0ID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRjYXB0aW9uc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NhcHRpb24nLCBhcnJheSgkY2FwdGlvbl90eXBlLCAkY2FwdGlvbl9sYW5nLCAkY2FwdGlvbl9zdGFydFRpbWUsICRjYXB0aW9uX2VuZFRpbWUsICRjYXB0aW9uX3RleHQpKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkY2FwdGlvbnMpKQoJCQkJCQkJewoJCQkJCQkJCSRjYXB0aW9ucyA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJGNhcHRpb25zKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkY2FwdGlvbnMgPSAkY2FwdGlvbnNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBDQVRFR09SSUVTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY2F0ZWdvcnknXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKChhcnJheSkgJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NhdGVnb3J5J10gYXMgJGNhdGVnb3J5KQoJCQkJCQkJewoJCQkJCQkJCSR0ZXJtID0gbnVsbDsKCQkJCQkJCQkkc2NoZW1lID0gbnVsbDsKCQkJCQkJCQkkbGFiZWwgPSBudWxsOwoJCQkJCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkdGVybSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHNjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQkkc2NoZW1lID0gJ2h0dHA6Ly9zZWFyY2gueWFob28uY29tL21yc3MvY2F0ZWdvcnlfc2NoZW1hJzsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQkkY2F0ZWdvcmllc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NhdGVnb3J5JywgYXJyYXkoJHRlcm0sICRzY2hlbWUsICRsYWJlbCkpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmIChpc19hcnJheSgkY2F0ZWdvcmllcykgJiYgaXNfYXJyYXkoJGNhdGVnb3JpZXNfcGFyZW50KSkKCQkJCQkJewoJCQkJCQkJJGNhdGVnb3JpZXMgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKGFycmF5X21lcmdlKCRjYXRlZ29yaWVzLCAkY2F0ZWdvcmllc19wYXJlbnQpKSk7CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc19hcnJheSgkY2F0ZWdvcmllcykpCgkJCQkJCXsKCQkJCQkJCSRjYXRlZ29yaWVzID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZSgkY2F0ZWdvcmllcykpOwoJCQkJCQl9CgkJCQkJCWVsc2VpZiAoaXNfYXJyYXkoJGNhdGVnb3JpZXNfcGFyZW50KSkKCQkJCQkJewoJCQkJCQkJJGNhdGVnb3JpZXMgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCRjYXRlZ29yaWVzX3BhcmVudCkpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGNhdGVnb3JpZXMgPSBudWxsOwoJCQkJCQl9CgoJCQkJCQkvLyBDT1BZUklHSFRTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J10pKQoJCQkJCQl7CgkJCQkJCQkkY29weXJpZ2h0X3VybCA9IG51bGw7CgkJCQkJCQkkY29weXJpZ2h0X2xhYmVsID0gbnVsbDsKCQkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J11bMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddKSkKCQkJCQkJCXsKCQkJCQkJCQkkY29weXJpZ2h0X3VybCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J11bMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnZGF0YSddKSkKCQkJCQkJCXsKCQkJCQkJCQkkY29weXJpZ2h0X2xhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJJGNvcHlyaWdodHMgPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQ29weXJpZ2h0JywgYXJyYXkoJGNvcHlyaWdodF91cmwsICRjb3B5cmlnaHRfbGFiZWwpKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSRjb3B5cmlnaHRzID0gJGNvcHlyaWdodHNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBDUkVESVRTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY3JlZGl0J10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY3JlZGl0J10gYXMgJGNyZWRpdCkKCQkJCQkJCXsKCQkJCQkJCQkkY3JlZGl0X3JvbGUgPSBudWxsOwoJCQkJCQkJCSRjcmVkaXRfc2NoZW1lID0gbnVsbDsKCQkJCQkJCQkkY3JlZGl0X25hbWUgPSBudWxsOwoJCQkJCQkJCWlmIChpc3NldCgkY3JlZGl0WydhdHRyaWJzJ11bJyddWydyb2xlJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNyZWRpdF9yb2xlID0gJHRoaXMtPnNhbml0aXplKCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3JvbGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjcmVkaXRfc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQkkY3JlZGl0X3NjaGVtZSA9ICd1cm46ZWJ1JzsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjcmVkaXRbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY3JlZGl0X25hbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQkkY3JlZGl0c1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NyZWRpdCcsIGFycmF5KCRjcmVkaXRfcm9sZSwgJGNyZWRpdF9zY2hlbWUsICRjcmVkaXRfbmFtZSkpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRjcmVkaXRzKSkKCQkJCQkJCXsKCQkJCQkJCQkkY3JlZGl0cyA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJGNyZWRpdHMpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSRjcmVkaXRzID0gJGNyZWRpdHNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBERVNDUklQVElPTgoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2Rlc2NyaXB0aW9uJ10pKQoJCQkJCQl7CgkJCQkJCQkkZGVzY3JpcHRpb24gPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2Rlc2NyaXB0aW9uJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSRkZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbl9wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIEhBU0hFUwoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2hhc2gnXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydoYXNoJ10gYXMgJGhhc2gpCgkJCQkJCQl7CgkJCQkJCQkJJHZhbHVlID0gbnVsbDsKCQkJCQkJCQkkYWxnbyA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRoYXNoWydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHZhbHVlID0gJHRoaXMtPnNhbml0aXplKCRoYXNoWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkaGFzaFsnYXR0cmlicyddWycnXVsnYWxnbyddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRhbGdvID0gJHRoaXMtPnNhbml0aXplKCRoYXNoWydhdHRyaWJzJ11bJyddWydhbGdvJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCSRhbGdvID0gJ21kNSc7CgkJCQkJCQkJfQoJCQkJCQkJCSRoYXNoZXNbXSA9ICRhbGdvLic6Jy4kdmFsdWU7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJGhhc2hlcykpCgkJCQkJCQl7CgkJCQkJCQkJJGhhc2hlcyA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJGhhc2hlcykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGhhc2hlcyA9ICRoYXNoZXNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBLRVlXT1JEUwoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ10pKQoJCQkJCQl7CgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ11bMF1bJ2RhdGEnXSkpCgkJCQkJCQl7CgkJCQkJCQkJJHRlbXAgPSBleHBsb2RlKCcsJywgJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydrZXl3b3JkcyddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCkpOwoJCQkJCQkJCWZvcmVhY2ggKCR0ZW1wIGFzICR3b3JkKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGtleXdvcmRzW10gPSB0cmltKCR3b3JkKTsKCQkJCQkJCQl9CgkJCQkJCQkJdW5zZXQoJHRlbXApOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRrZXl3b3JkcykpCgkJCQkJCQl7CgkJCQkJCQkJJGtleXdvcmRzID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZSgka2V5d29yZHMpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSRrZXl3b3JkcyA9ICRrZXl3b3Jkc19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIFBMQVlFUgoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3BsYXllciddKSkKCQkJCQkJewoJCQkJCQkJJHBsYXllciA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncGxheWVyJ11bMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkcGxheWVyID0gJHBsYXllcl9wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIFJBVElOR1MKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydyYXRpbmcnXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydyYXRpbmcnXSBhcyAkcmF0aW5nKQoJCQkJCQkJewoJCQkJCQkJCSRyYXRpbmdfc2NoZW1lID0gbnVsbDsKCQkJCQkJCQkkcmF0aW5nX3ZhbHVlID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJHJhdGluZ1snYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJhdGluZ19zY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJHJhdGluZ1snYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCSRyYXRpbmdfc2NoZW1lID0gJ3VybjpzaW1wbGUnOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJHJhdGluZ1snZGF0YSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRyYXRpbmdfdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJHJhdGluZ1snZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQkkcmF0aW5nc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ1JhdGluZycsIGFycmF5KCRyYXRpbmdfc2NoZW1lLCAkcmF0aW5nX3ZhbHVlKSk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJHJhdGluZ3MpKQoJCQkJCQkJewoJCQkJCQkJCSRyYXRpbmdzID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZSgkcmF0aW5ncykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHJhdGluZ3MgPSAkcmF0aW5nc19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIFJFU1RSSUNUSU9OUwoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3Jlc3RyaWN0aW9uJ10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmVzdHJpY3Rpb24nXSBhcyAkcmVzdHJpY3Rpb24pCgkJCQkJCQl7CgkJCQkJCQkJJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCA9IG51bGw7CgkJCQkJCQkJJHJlc3RyaWN0aW9uX3R5cGUgPSBudWxsOwoJCQkJCQkJCSRyZXN0cmljdGlvbl92YWx1ZSA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsncmVsYXRpb25zaGlwJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3JlbGF0aW9uc2hpcCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJlc3RyaWN0aW9uX3R5cGUgPSAkdGhpcy0+c2FuaXRpemUoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmVzdHJpY3Rpb25fdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJHJlc3RyaWN0aW9uWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRyZXN0cmljdGlvbnNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdSZXN0cmljdGlvbicsIGFycmF5KCRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAsICRyZXN0cmljdGlvbl90eXBlLCAkcmVzdHJpY3Rpb25fdmFsdWUpKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkcmVzdHJpY3Rpb25zKSkKCQkJCQkJCXsKCQkJCQkJCQkkcmVzdHJpY3Rpb25zID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZSgkcmVzdHJpY3Rpb25zKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkcmVzdHJpY3Rpb25zID0gJHJlc3RyaWN0aW9uc19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIFRIVU1CTkFJTFMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aHVtYm5haWwnXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aHVtYm5haWwnXSBhcyAkdGh1bWJuYWlsKQoJCQkJCQkJewoJCQkJCQkJCSR0aHVtYm5haWxzW10gPSAkdGhpcy0+c2FuaXRpemUoJHRodW1ibmFpbFsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkdGh1bWJuYWlscykpCgkJCQkJCQl7CgkJCQkJCQkJJHRodW1ibmFpbHMgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCR0aHVtYm5haWxzKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkdGh1bWJuYWlscyA9ICR0aHVtYm5haWxzX3BhcmVudDsKCQkJCQkJfQoKCQkJCQkJLy8gVElUTEVTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGl0bGUnXSkpCgkJCQkJCXsKCQkJCQkJCSR0aXRsZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGl0bGUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHRpdGxlID0gJHRpdGxlX3BhcmVudDsKCQkJCQkJfQoKCQkJCQkJJHRoaXMtPmRhdGFbJ2VuY2xvc3VyZXMnXVtdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0VuY2xvc3VyZScsIGFycmF5KCR1cmwsICR0eXBlLCAkbGVuZ3RoLCBudWxsLCAkYml0cmF0ZSwgJGNhcHRpb25zLCAkY2F0ZWdvcmllcywgJGNoYW5uZWxzLCAkY29weXJpZ2h0cywgJGNyZWRpdHMsICRkZXNjcmlwdGlvbiwgJGR1cmF0aW9uLCAkZXhwcmVzc2lvbiwgJGZyYW1lcmF0ZSwgJGhhc2hlcywgJGhlaWdodCwgJGtleXdvcmRzLCAkbGFuZywgJG1lZGl1bSwgJHBsYXllciwgJHJhdGluZ3MsICRyZXN0cmljdGlvbnMsICRzYW1wbGluZ3JhdGUsICR0aHVtYm5haWxzLCAkdGl0bGUsICR3aWR0aCkpOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdsaW5rJykgYXMgJGxpbmspCgkJCXsKCQkJCWlmIChpc3NldCgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddKSAmJiAhZW1wdHkoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddKSAmJiAkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10gPT09ICdlbmNsb3N1cmUnKQoJCQkJewoJCQkJCS8vIEF0dHJpYnV0ZXMKCQkJCQkkYml0cmF0ZSA9IG51bGw7CgkJCQkJJGNoYW5uZWxzID0gbnVsbDsKCQkJCQkkZHVyYXRpb24gPSBudWxsOwoJCQkJCSRleHByZXNzaW9uID0gbnVsbDsKCQkJCQkkZnJhbWVyYXRlID0gbnVsbDsKCQkJCQkkaGVpZ2h0ID0gbnVsbDsKCQkJCQkkamF2YXNjcmlwdCA9IG51bGw7CgkJCQkJJGxhbmcgPSBudWxsOwoJCQkJCSRsZW5ndGggPSBudWxsOwoJCQkJCSRtZWRpdW0gPSBudWxsOwoJCQkJCSRzYW1wbGluZ3JhdGUgPSBudWxsOwoJCQkJCSR0eXBlID0gbnVsbDsKCQkJCQkkdXJsID0gbnVsbDsKCQkJCQkkd2lkdGggPSBudWxsOwoKCQkJCQkkdXJsID0gJHRoaXMtPnNhbml0aXplKCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmspKTsKCQkJCQlpZiAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJewoJCQkJCQkkdHlwZSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ2xlbmd0aCddKSkKCQkJCQl7CgkJCQkJCSRsZW5ndGggPSBjZWlsKCRsaW5rWydhdHRyaWJzJ11bJyddWydsZW5ndGgnXSk7CgkJCQkJfQoKCQkJCQkvLyBTaW5jZSB3ZSBkb24ndCBoYXZlIGdyb3VwIG9yIGNvbnRlbnQgZm9yIHRoZXNlLCB3ZSdsbCBqdXN0IHBhc3MgdGhlICcqX3BhcmVudCcgdmFyaWFibGVzIGRpcmVjdGx5IHRvIHRoZSBjb25zdHJ1Y3RvcgoJCQkJCSR0aGlzLT5kYXRhWydlbmNsb3N1cmVzJ11bXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdFbmNsb3N1cmUnLCBhcnJheSgkdXJsLCAkdHlwZSwgJGxlbmd0aCwgbnVsbCwgJGJpdHJhdGUsICRjYXB0aW9uc19wYXJlbnQsICRjYXRlZ29yaWVzX3BhcmVudCwgJGNoYW5uZWxzLCAkY29weXJpZ2h0c19wYXJlbnQsICRjcmVkaXRzX3BhcmVudCwgJGRlc2NyaXB0aW9uX3BhcmVudCwgJGR1cmF0aW9uX3BhcmVudCwgJGV4cHJlc3Npb24sICRmcmFtZXJhdGUsICRoYXNoZXNfcGFyZW50LCAkaGVpZ2h0LCAka2V5d29yZHNfcGFyZW50LCAkbGFuZywgJG1lZGl1bSwgJHBsYXllcl9wYXJlbnQsICRyYXRpbmdzX3BhcmVudCwgJHJlc3RyaWN0aW9uc19wYXJlbnQsICRzYW1wbGluZ3JhdGUsICR0aHVtYm5haWxzX3BhcmVudCwgJHRpdGxlX3BhcmVudCwgJHdpZHRoKSk7CgkJCQl9CgkJCX0KCgkJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnbGluaycpIGFzICRsaW5rKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ2hyZWYnXSkgJiYgIWVtcHR5KCRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSkgJiYgJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddID09PSAnZW5jbG9zdXJlJykKCQkJCXsKCQkJCQkvLyBBdHRyaWJ1dGVzCgkJCQkJJGJpdHJhdGUgPSBudWxsOwoJCQkJCSRjaGFubmVscyA9IG51bGw7CgkJCQkJJGR1cmF0aW9uID0gbnVsbDsKCQkJCQkkZXhwcmVzc2lvbiA9IG51bGw7CgkJCQkJJGZyYW1lcmF0ZSA9IG51bGw7CgkJCQkJJGhlaWdodCA9IG51bGw7CgkJCQkJJGphdmFzY3JpcHQgPSBudWxsOwoJCQkJCSRsYW5nID0gbnVsbDsKCQkJCQkkbGVuZ3RoID0gbnVsbDsKCQkJCQkkbWVkaXVtID0gbnVsbDsKCQkJCQkkc2FtcGxpbmdyYXRlID0gbnVsbDsKCQkJCQkkdHlwZSA9IG51bGw7CgkJCQkJJHVybCA9IG51bGw7CgkJCQkJJHdpZHRoID0gbnVsbDsKCgkJCQkJJHVybCA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCXsKCQkJCQkJJHR5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydsZW5ndGgnXSkpCgkJCQkJewoJCQkJCQkkbGVuZ3RoID0gY2VpbCgkbGlua1snYXR0cmlicyddWycnXVsnbGVuZ3RoJ10pOwoJCQkJCX0KCgkJCQkJLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBncm91cCBvciBjb250ZW50IGZvciB0aGVzZSwgd2UnbGwganVzdCBwYXNzIHRoZSAnKl9wYXJlbnQnIHZhcmlhYmxlcyBkaXJlY3RseSB0byB0aGUgY29uc3RydWN0b3IKCQkJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnRW5jbG9zdXJlJywgYXJyYXkoJHVybCwgJHR5cGUsICRsZW5ndGgsIG51bGwsICRiaXRyYXRlLCAkY2FwdGlvbnNfcGFyZW50LCAkY2F0ZWdvcmllc19wYXJlbnQsICRjaGFubmVscywgJGNvcHlyaWdodHNfcGFyZW50LCAkY3JlZGl0c19wYXJlbnQsICRkZXNjcmlwdGlvbl9wYXJlbnQsICRkdXJhdGlvbl9wYXJlbnQsICRleHByZXNzaW9uLCAkZnJhbWVyYXRlLCAkaGFzaGVzX3BhcmVudCwgJGhlaWdodCwgJGtleXdvcmRzX3BhcmVudCwgJGxhbmcsICRtZWRpdW0sICRwbGF5ZXJfcGFyZW50LCAkcmF0aW5nc19wYXJlbnQsICRyZXN0cmljdGlvbnNfcGFyZW50LCAkc2FtcGxpbmdyYXRlLCAkdGh1bWJuYWlsc19wYXJlbnQsICR0aXRsZV9wYXJlbnQsICR3aWR0aCkpOwoJCQkJfQoJCQl9CgoJCQlpZiAoJGVuY2xvc3VyZSA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwLCAnZW5jbG9zdXJlJykpCgkJCXsKCQkJCWlmIChpc3NldCgkZW5jbG9zdXJlWzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSkpCgkJCQl7CgkJCQkJLy8gQXR0cmlidXRlcwoJCQkJCSRiaXRyYXRlID0gbnVsbDsKCQkJCQkkY2hhbm5lbHMgPSBudWxsOwoJCQkJCSRkdXJhdGlvbiA9IG51bGw7CgkJCQkJJGV4cHJlc3Npb24gPSBudWxsOwoJCQkJCSRmcmFtZXJhdGUgPSBudWxsOwoJCQkJCSRoZWlnaHQgPSBudWxsOwoJCQkJCSRqYXZhc2NyaXB0ID0gbnVsbDsKCQkJCQkkbGFuZyA9IG51bGw7CgkJCQkJJGxlbmd0aCA9IG51bGw7CgkJCQkJJG1lZGl1bSA9IG51bGw7CgkJCQkJJHNhbXBsaW5ncmF0ZSA9IG51bGw7CgkJCQkJJHR5cGUgPSBudWxsOwoJCQkJCSR1cmwgPSBudWxsOwoJCQkJCSR3aWR0aCA9IG51bGw7CgoJCQkJCSR1cmwgPSAkdGhpcy0+c2FuaXRpemUoJGVuY2xvc3VyZVswXVsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGVuY2xvc3VyZVswXSkpOwoJCQkJCWlmIChpc3NldCgkZW5jbG9zdXJlWzBdWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCXsKCQkJCQkJJHR5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGVuY2xvc3VyZVswXVsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGVuY2xvc3VyZVswXVsnYXR0cmlicyddWycnXVsnbGVuZ3RoJ10pKQoJCQkJCXsKCQkJCQkJJGxlbmd0aCA9IGNlaWwoJGVuY2xvc3VyZVswXVsnYXR0cmlicyddWycnXVsnbGVuZ3RoJ10pOwoJCQkJCX0KCgkJCQkJLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBncm91cCBvciBjb250ZW50IGZvciB0aGVzZSwgd2UnbGwganVzdCBwYXNzIHRoZSAnKl9wYXJlbnQnIHZhcmlhYmxlcyBkaXJlY3RseSB0byB0aGUgY29uc3RydWN0b3IKCQkJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnRW5jbG9zdXJlJywgYXJyYXkoJHVybCwgJHR5cGUsICRsZW5ndGgsIG51bGwsICRiaXRyYXRlLCAkY2FwdGlvbnNfcGFyZW50LCAkY2F0ZWdvcmllc19wYXJlbnQsICRjaGFubmVscywgJGNvcHlyaWdodHNfcGFyZW50LCAkY3JlZGl0c19wYXJlbnQsICRkZXNjcmlwdGlvbl9wYXJlbnQsICRkdXJhdGlvbl9wYXJlbnQsICRleHByZXNzaW9uLCAkZnJhbWVyYXRlLCAkaGFzaGVzX3BhcmVudCwgJGhlaWdodCwgJGtleXdvcmRzX3BhcmVudCwgJGxhbmcsICRtZWRpdW0sICRwbGF5ZXJfcGFyZW50LCAkcmF0aW5nc19wYXJlbnQsICRyZXN0cmljdGlvbnNfcGFyZW50LCAkc2FtcGxpbmdyYXRlLCAkdGh1bWJuYWlsc19wYXJlbnQsICR0aXRsZV9wYXJlbnQsICR3aWR0aCkpOwoJCQkJfQoJCQl9CgoJCQlpZiAoc2l6ZW9mKCR0aGlzLT5kYXRhWydlbmNsb3N1cmVzJ10pID09PSAwICYmICgkdXJsIHx8ICR0eXBlIHx8ICRsZW5ndGggfHwgJGJpdHJhdGUgfHwgJGNhcHRpb25zX3BhcmVudCB8fCAkY2F0ZWdvcmllc19wYXJlbnQgfHwgJGNoYW5uZWxzIHx8ICRjb3B5cmlnaHRzX3BhcmVudCB8fCAkY3JlZGl0c19wYXJlbnQgfHwgJGRlc2NyaXB0aW9uX3BhcmVudCB8fCAkZHVyYXRpb25fcGFyZW50IHx8ICRleHByZXNzaW9uIHx8ICRmcmFtZXJhdGUgfHwgJGhhc2hlc19wYXJlbnQgfHwgJGhlaWdodCB8fCAka2V5d29yZHNfcGFyZW50IHx8ICRsYW5nIHx8ICRtZWRpdW0gfHwgJHBsYXllcl9wYXJlbnQgfHwgJHJhdGluZ3NfcGFyZW50IHx8ICRyZXN0cmljdGlvbnNfcGFyZW50IHx8ICRzYW1wbGluZ3JhdGUgfHwgJHRodW1ibmFpbHNfcGFyZW50IHx8ICR0aXRsZV9wYXJlbnQgfHwgJHdpZHRoKSkKCQkJewoJCQkJLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBncm91cCBvciBjb250ZW50IGZvciB0aGVzZSwgd2UnbGwganVzdCBwYXNzIHRoZSAnKl9wYXJlbnQnIHZhcmlhYmxlcyBkaXJlY3RseSB0byB0aGUgY29uc3RydWN0b3IKCQkJCSR0aGlzLT5kYXRhWydlbmNsb3N1cmVzJ11bXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdFbmNsb3N1cmUnLCBhcnJheSgkdXJsLCAkdHlwZSwgJGxlbmd0aCwgbnVsbCwgJGJpdHJhdGUsICRjYXB0aW9uc19wYXJlbnQsICRjYXRlZ29yaWVzX3BhcmVudCwgJGNoYW5uZWxzLCAkY29weXJpZ2h0c19wYXJlbnQsICRjcmVkaXRzX3BhcmVudCwgJGRlc2NyaXB0aW9uX3BhcmVudCwgJGR1cmF0aW9uX3BhcmVudCwgJGV4cHJlc3Npb24sICRmcmFtZXJhdGUsICRoYXNoZXNfcGFyZW50LCAkaGVpZ2h0LCAka2V5d29yZHNfcGFyZW50LCAkbGFuZywgJG1lZGl1bSwgJHBsYXllcl9wYXJlbnQsICRyYXRpbmdzX3BhcmVudCwgJHJlc3RyaWN0aW9uc19wYXJlbnQsICRzYW1wbGluZ3JhdGUsICR0aHVtYm5haWxzX3BhcmVudCwgJHRpdGxlX3BhcmVudCwgJHdpZHRoKSk7CgkJCX0KCgkJCSR0aGlzLT5kYXRhWydlbmNsb3N1cmVzJ10gPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCR0aGlzLT5kYXRhWydlbmNsb3N1cmVzJ10pKTsKCQl9CgkJaWYgKCFlbXB0eSgkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIGxhdGl0dWRlIGNvb3JkaW5hdGVzIGZvciB0aGUgaXRlbQoJICoKCSAqIENvbXBhdGlibGUgd2l0aCB0aGUgVzNDIFdHUzg0IEJhc2ljIEdlbyBhbmQgR2VvUlNTIHNwZWNpZmljYXRpb25zCgkgKgoJICogVXNlcyBgPGdlbzpsYXQ+YCBvciBgPGdlb3Jzczpwb2ludD5gCgkgKgoJICogQHNpbmNlIDEuMAoJICogQGxpbmsgaHR0cDovL3d3dy53My5vcmcvMjAwMy8wMS9nZW8vIFczQyBXR1M4NCBCYXNpYyBHZW8KCSAqIEBsaW5rIGh0dHA6Ly93d3cuZ2VvcnNzLm9yZy8gR2VvUlNTCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbGF0aXR1ZGUoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9XM0NfQkFTSUNfR0VPLCAnbGF0JykpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkcmV0dXJuWzBdWydkYXRhJ107CgkJfQoJCWVsc2VpZiAoKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0dFT1JTUywgJ3BvaW50JykpICYmIHByZWdfbWF0Y2goJy9eKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkgKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkkLycsIHRyaW0oJHJldHVyblswXVsnZGF0YSddKSwgJG1hdGNoKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRtYXRjaFsxXTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBsb25naXR1ZGUgY29vcmRpbmF0ZXMgZm9yIHRoZSBpdGVtCgkgKgoJICogQ29tcGF0aWJsZSB3aXRoIHRoZSBXM0MgV0dTODQgQmFzaWMgR2VvIGFuZCBHZW9SU1Mgc3BlY2lmaWNhdGlvbnMKCSAqCgkgKiBVc2VzIGA8Z2VvOmxvbmc+YCwgYDxnZW86bG9uPmAgb3IgYDxnZW9yc3M6cG9pbnQ+YAoJICoKCSAqIEBzaW5jZSAxLjAKCSAqIEBsaW5rIGh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDEvZ2VvLyBXM0MgV0dTODQgQmFzaWMgR2VvCgkgKiBAbGluayBodHRwOi8vd3d3Lmdlb3Jzcy5vcmcvIEdlb1JTUwoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2xvbmdpdHVkZSgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1czQ19CQVNJQ19HRU8sICdsb25nJykpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkcmV0dXJuWzBdWydkYXRhJ107CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfVzNDX0JBU0lDX0dFTywgJ2xvbicpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9HRU9SU1MsICdwb2ludCcpKSAmJiBwcmVnX21hdGNoKCcvXigoPzotKT9bMC05XSsoPzpcLlswLTldKykpICgoPzotKT9bMC05XSsoPzpcLlswLTldKykpJC8nLCB0cmltKCRyZXR1cm5bMF1bJ2RhdGEnXSksICRtYXRjaCkpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkbWF0Y2hbMl07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCB0aGUgYDxhdG9tOnNvdXJjZT5gIGZvciB0aGUgaXRlbQoJICoKCSAqIEBzaW5jZSAxLjEKCSAqIEByZXR1cm4gU2ltcGxlUGllX1NvdXJjZXxudWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfc291cmNlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ3NvdXJjZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdTb3VyY2UnLCBhcnJheSgkdGhpcywgJHJldHVyblswXSkpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9Cn0KCi8qKgogKiBVc2VkIGZvciBmZWVkIGF1dG8tZGlzY292ZXJ5CiAqCiAqCiAqIFRoaXMgY2xhc3MgY2FuIGJlIG92ZXJsb2FkZWQgd2l0aCB7QHNlZSBTaW1wbGVQaWU6OnNldF9sb2NhdG9yX2NsYXNzKCl9CiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKi8KY2xhc3MgU2ltcGxlUGllX0xvY2F0b3IKewoJdmFyICR1c2VyYWdlbnQ7Cgl2YXIgJHRpbWVvdXQ7Cgl2YXIgJGZpbGU7Cgl2YXIgJGxvY2FsID0gYXJyYXkoKTsKCXZhciAkZWxzZXdoZXJlID0gYXJyYXkoKTsKCXZhciAkY2FjaGVkX2VudGl0aWVzID0gYXJyYXkoKTsKCXZhciAkaHR0cF9iYXNlOwoJdmFyICRiYXNlOwoJdmFyICRiYXNlX2xvY2F0aW9uID0gMDsKCXZhciAkY2hlY2tlZF9mZWVkcyA9IDA7Cgl2YXIgJG1heF9jaGVja2VkX2ZlZWRzID0gMTA7Cglwcm90ZWN0ZWQgJHJlZ2lzdHJ5OwoKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChTaW1wbGVQaWVfRmlsZSAkZmlsZSwgJHRpbWVvdXQgPSAxMCwgJHVzZXJhZ2VudCA9IG51bGwsICRtYXhfY2hlY2tlZF9mZWVkcyA9IDEwKQoJewoJCSR0aGlzLT5maWxlID0gJGZpbGU7CgkJJHRoaXMtPnVzZXJhZ2VudCA9ICR1c2VyYWdlbnQ7CgkJJHRoaXMtPnRpbWVvdXQgPSAkdGltZW91dDsKCQkkdGhpcy0+bWF4X2NoZWNrZWRfZmVlZHMgPSAkbWF4X2NoZWNrZWRfZmVlZHM7CgoJCSR0aGlzLT5kb20gPSBuZXcgRE9NRG9jdW1lbnQoKTsKCgkJc2V0X2Vycm9yX2hhbmRsZXIoYXJyYXkoJ1NpbXBsZVBpZV9NaXNjJywgJ3NpbGVuY2VfZXJyb3JzJykpOwoJCSR0aGlzLT5kb20tPmxvYWRIVE1MKCR0aGlzLT5maWxlLT5ib2R5KTsKCQlyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gc2V0X3JlZ2lzdHJ5KFNpbXBsZVBpZV9SZWdpc3RyeSAkcmVnaXN0cnkpCgl7CgkJJHRoaXMtPnJlZ2lzdHJ5ID0gJHJlZ2lzdHJ5OwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBmaW5kKCR0eXBlID0gU0lNUExFUElFX0xPQ0FUT1JfQUxMLCAmJHdvcmtpbmcpCgl7CgkJaWYgKCR0aGlzLT5pc19mZWVkKCR0aGlzLT5maWxlKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+ZmlsZTsKCQl9CgoJCWlmICgkdGhpcy0+ZmlsZS0+bWV0aG9kICYgU0lNUExFUElFX0ZJTEVfU09VUkNFX1JFTU9URSkKCQl7CgkJCSRzbmlmZmVyID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NvbnRlbnRfVHlwZV9TbmlmZmVyJywgYXJyYXkoJHRoaXMtPmZpbGUpKTsKCQkJaWYgKCRzbmlmZmVyLT5nZXRfdHlwZSgpICE9PSAndGV4dC9odG1sJykKCQkJewoJCQkJcmV0dXJuIG51bGw7CgkJCX0KCQl9CgoJCWlmICgkdHlwZSAmIH5TSU1QTEVQSUVfTE9DQVRPUl9OT05FKQoJCXsKCQkJJHRoaXMtPmdldF9iYXNlKCk7CgkJfQoKCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfTE9DQVRPUl9BVVRPRElTQ09WRVJZICYmICR3b3JraW5nID0gJHRoaXMtPmF1dG9kaXNjb3ZlcnkoKSkKCQl7CgkJCXJldHVybiAkd29ya2luZ1swXTsKCQl9CgoJCWlmICgkdHlwZSAmIChTSU1QTEVQSUVfTE9DQVRPUl9MT0NBTF9FWFRFTlNJT04gfCBTSU1QTEVQSUVfTE9DQVRPUl9MT0NBTF9CT0RZIHwgU0lNUExFUElFX0xPQ0FUT1JfUkVNT1RFX0VYVEVOU0lPTiB8IFNJTVBMRVBJRV9MT0NBVE9SX1JFTU9URV9CT0RZKSAmJiAkdGhpcy0+Z2V0X2xpbmtzKCkpCgkJewoJCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfTE9DQVRPUl9MT0NBTF9FWFRFTlNJT04gJiYgJHdvcmtpbmcgPSAkdGhpcy0+ZXh0ZW5zaW9uKCR0aGlzLT5sb2NhbCkpCgkJCXsKCQkJCXJldHVybiAkd29ya2luZzsKCQkJfQoKCQkJaWYgKCR0eXBlICYgU0lNUExFUElFX0xPQ0FUT1JfTE9DQUxfQk9EWSAmJiAkd29ya2luZyA9ICR0aGlzLT5ib2R5KCR0aGlzLT5sb2NhbCkpCgkJCXsKCQkJCXJldHVybiAkd29ya2luZzsKCQkJfQoKCQkJaWYgKCR0eXBlICYgU0lNUExFUElFX0xPQ0FUT1JfUkVNT1RFX0VYVEVOU0lPTiAmJiAkd29ya2luZyA9ICR0aGlzLT5leHRlbnNpb24oJHRoaXMtPmVsc2V3aGVyZSkpCgkJCXsKCQkJCXJldHVybiAkd29ya2luZzsKCQkJfQoKCQkJaWYgKCR0eXBlICYgU0lNUExFUElFX0xPQ0FUT1JfUkVNT1RFX0JPRFkgJiYgJHdvcmtpbmcgPSAkdGhpcy0+Ym9keSgkdGhpcy0+ZWxzZXdoZXJlKSkKCQkJewoJCQkJcmV0dXJuICR3b3JraW5nOwoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBpc19mZWVkKCRmaWxlKQoJewoJCWlmICgkZmlsZS0+bWV0aG9kICYgU0lNUExFUElFX0ZJTEVfU09VUkNFX1JFTU9URSkKCQl7CgkJCSRzbmlmZmVyID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NvbnRlbnRfVHlwZV9TbmlmZmVyJywgYXJyYXkoJGZpbGUpKTsKCQkJJHNuaWZmZWQgPSAkc25pZmZlci0+Z2V0X3R5cGUoKTsKCQkJaWYgKGluX2FycmF5KCRzbmlmZmVkLCBhcnJheSgnYXBwbGljYXRpb24vcnNzK3htbCcsICdhcHBsaWNhdGlvbi9yZGYreG1sJywgJ3RleHQvcmRmJywgJ2FwcGxpY2F0aW9uL2F0b20reG1sJywgJ3RleHQveG1sJywgJ2FwcGxpY2F0aW9uL3htbCcpKSkKCQkJewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgkJZWxzZWlmICgkZmlsZS0+bWV0aG9kICYgU0lNUExFUElFX0ZJTEVfU09VUkNFX0xPQ0FMKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF9iYXNlKCkKCXsKCQkkdGhpcy0+aHR0cF9iYXNlID0gJHRoaXMtPmZpbGUtPnVybDsKCQkkdGhpcy0+YmFzZSA9ICR0aGlzLT5odHRwX2Jhc2U7CgkJJGVsZW1lbnRzID0gJHRoaXMtPmRvbS0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoJ2Jhc2UnKTsKCQlmb3JlYWNoICgkZWxlbWVudHMgYXMgJGVsZW1lbnQpCgkJewoJCQlpZiAoJGVsZW1lbnQtPmhhc0F0dHJpYnV0ZSgnaHJlZicpKQoJCQl7CgkJCQkkdGhpcy0+YmFzZSA9ICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnTWlzYycsICdhYnNvbHV0aXplX3VybCcsIGFycmF5KHRyaW0oJGVsZW1lbnQtPmdldEF0dHJpYnV0ZSgnaHJlZicpKSwgJHRoaXMtPmh0dHBfYmFzZSkpOwoJCQkJJHRoaXMtPmJhc2VfbG9jYXRpb24gPSBtZXRob2RfZXhpc3RzKCRlbGVtZW50LCAnZ2V0TGluZU5vJykgPyAkZWxlbWVudC0+Z2V0TGluZU5vKCkgOiAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGF1dG9kaXNjb3ZlcnkoKQoJewoJCSRkb25lID0gYXJyYXkoKTsKCQkkZmVlZHMgPSBhcnJheSgpOwoJCSRmZWVkcyA9IGFycmF5X21lcmdlKCRmZWVkcywgJHRoaXMtPnNlYXJjaF9lbGVtZW50c19ieV90YWcoJ2xpbmsnLCAkZG9uZSwgJGZlZWRzKSk7CgkJJGZlZWRzID0gYXJyYXlfbWVyZ2UoJGZlZWRzLCAkdGhpcy0+c2VhcmNoX2VsZW1lbnRzX2J5X3RhZygnYScsICRkb25lLCAkZmVlZHMpKTsKCQkkZmVlZHMgPSBhcnJheV9tZXJnZSgkZmVlZHMsICR0aGlzLT5zZWFyY2hfZWxlbWVudHNfYnlfdGFnKCdhcmVhJywgJGRvbmUsICRmZWVkcykpOwoKCQlpZiAoIWVtcHR5KCRmZWVkcykpCgkJewoJCQlyZXR1cm4gYXJyYXlfdmFsdWVzKCRmZWVkcyk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglwcm90ZWN0ZWQgZnVuY3Rpb24gc2VhcmNoX2VsZW1lbnRzX2J5X3RhZygkbmFtZSwgJiRkb25lLCAkZmVlZHMpCgl7CgkJJGxpbmtzID0gJHRoaXMtPmRvbS0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoJG5hbWUpOwoJCWZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykKCQl7CgkJCWlmICgkdGhpcy0+Y2hlY2tlZF9mZWVkcyA9PT0gJHRoaXMtPm1heF9jaGVja2VkX2ZlZWRzKQoJCQl7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoJGxpbmstPmhhc0F0dHJpYnV0ZSgnaHJlZicpICYmICRsaW5rLT5oYXNBdHRyaWJ1dGUoJ3JlbCcpKQoJCQl7CgkJCQkkcmVsID0gYXJyYXlfdW5pcXVlKCR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnTWlzYycsICdzcGFjZV9zZXBlcmF0ZWRfdG9rZW5zJywgYXJyYXkoc3RydG9sb3dlcigkbGluay0+Z2V0QXR0cmlidXRlKCdyZWwnKSkpKSk7CgkJCQkkbGluZSA9IG1ldGhvZF9leGlzdHMoJGxpbmssICdnZXRMaW5lTm8nKSA/ICRsaW5rLT5nZXRMaW5lTm8oKSA6IDE7CgoJCQkJaWYgKCR0aGlzLT5iYXNlX2xvY2F0aW9uIDwgJGxpbmUpCgkJCQl7CgkJCQkJJGhyZWYgPSAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnYWJzb2x1dGl6ZV91cmwnLCBhcnJheSh0cmltKCRsaW5rLT5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSksICR0aGlzLT5iYXNlKSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJGhyZWYgPSAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnYWJzb2x1dGl6ZV91cmwnLCBhcnJheSh0cmltKCRsaW5rLT5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSksICR0aGlzLT5odHRwX2Jhc2UpKTsKCQkJCX0KCgkJCQlpZiAoIWluX2FycmF5KCRocmVmLCAkZG9uZSkgJiYgaW5fYXJyYXkoJ2ZlZWQnLCAkcmVsKSB8fCAoaW5fYXJyYXkoJ2FsdGVybmF0ZScsICRyZWwpICYmICFpbl9hcnJheSgnc3R5bGVzaGVldCcsICRyZWwpICYmICRsaW5rLT5oYXNBdHRyaWJ1dGUoJ3R5cGUnKSAmJiBpbl9hcnJheShzdHJ0b2xvd2VyKCR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnTWlzYycsICdwYXJzZV9taW1lJywgYXJyYXkoJGxpbmstPmdldEF0dHJpYnV0ZSgndHlwZScpKSkpLCBhcnJheSgnYXBwbGljYXRpb24vcnNzK3htbCcsICdhcHBsaWNhdGlvbi9hdG9tK3htbCcpKSkgJiYgIWlzc2V0KCRmZWVkc1skaHJlZl0pKQoJCQkJewoJCQkJCSR0aGlzLT5jaGVja2VkX2ZlZWRzKys7CgkJCQkJJGhlYWRlcnMgPSBhcnJheSgKCQkJCQkJJ0FjY2VwdCcgPT4gJ2FwcGxpY2F0aW9uL2F0b20reG1sLCBhcHBsaWNhdGlvbi9yc3MreG1sLCBhcHBsaWNhdGlvbi9yZGYreG1sO3E9MC45LCBhcHBsaWNhdGlvbi94bWw7cT0wLjgsIHRleHQveG1sO3E9MC44LCB0ZXh0L2h0bWw7cT0wLjcsIHVua25vd24vdW5rbm93bjtxPTAuMSwgYXBwbGljYXRpb24vdW5rbm93bjtxPTAuMSwgKi8qO3E9MC4xJywKCQkJCQkpOwoJCQkJCSRmZWVkID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0ZpbGUnLCBhcnJheSgkaHJlZiwgJHRoaXMtPnRpbWVvdXQsIDUsICRoZWFkZXJzLCAkdGhpcy0+dXNlcmFnZW50KSk7CgkJCQkJaWYgKCRmZWVkLT5zdWNjZXNzICYmICgkZmVlZC0+bWV0aG9kICYgU0lNUExFUElFX0ZJTEVfU09VUkNFX1JFTU9URSA9PT0gMCB8fCAoJGZlZWQtPnN0YXR1c19jb2RlID09PSAyMDAgfHwgJGZlZWQtPnN0YXR1c19jb2RlID4gMjA2ICYmICRmZWVkLT5zdGF0dXNfY29kZSA8IDMwMCkpICYmICR0aGlzLT5pc19mZWVkKCRmZWVkKSkKCQkJCQl7CgkJCQkJCSRmZWVkc1skaHJlZl0gPSAkZmVlZDsKCQkJCQl9CgkJCQl9CgkJCQkkZG9uZVtdID0gJGhyZWY7CgkJCX0KCQl9CgoJCXJldHVybiAkZmVlZHM7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF9saW5rcygpCgl7CgkJJGxpbmtzID0gJHRoaXMtPmRvbS0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKTsKCQlmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspCgkJewoJCQlpZiAoJGxpbmstPmhhc0F0dHJpYnV0ZSgnaHJlZicpKQoJCQl7CgkJCQkkaHJlZiA9IHRyaW0oJGxpbmstPmdldEF0dHJpYnV0ZSgnaHJlZicpKTsKCQkJCSRwYXJzZWQgPSAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAncGFyc2VfdXJsJywgYXJyYXkoJGhyZWYpKTsKCQkJCWlmICgkcGFyc2VkWydzY2hlbWUnXSA9PT0gJycgfHwgcHJlZ19tYXRjaCgnL14oaHR0cChzKXxmZWVkKT8kL2knLCAkcGFyc2VkWydzY2hlbWUnXSkpCgkJCQl7CgkJCQkJaWYgKCR0aGlzLT5iYXNlX2xvY2F0aW9uIDwgJGxpbmstPmdldExpbmVObygpKQoJCQkJCXsKCQkJCQkJJGhyZWYgPSAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnYWJzb2x1dGl6ZV91cmwnLCBhcnJheSh0cmltKCRsaW5rLT5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSksICR0aGlzLT5iYXNlKSk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSRocmVmID0gJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2Fic29sdXRpemVfdXJsJywgYXJyYXkodHJpbSgkbGluay0+Z2V0QXR0cmlidXRlKCdocmVmJykpLCAkdGhpcy0+aHR0cF9iYXNlKSk7CgkJCQkJfQoKCQkJCQkkY3VycmVudCA9ICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnTWlzYycsICdwYXJzZV91cmwnLCBhcnJheSgkdGhpcy0+ZmlsZS0+dXJsKSk7CgoJCQkJCWlmICgkcGFyc2VkWydhdXRob3JpdHknXSA9PT0gJycgfHwgJHBhcnNlZFsnYXV0aG9yaXR5J10gPT09ICRjdXJyZW50WydhdXRob3JpdHknXSkKCQkJCQl7CgkJCQkJCSR0aGlzLT5sb2NhbFtdID0gJGhyZWY7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSR0aGlzLT5lbHNld2hlcmVbXSA9ICRocmVmOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQkkdGhpcy0+bG9jYWwgPSBhcnJheV91bmlxdWUoJHRoaXMtPmxvY2FsKTsKCQkkdGhpcy0+ZWxzZXdoZXJlID0gYXJyYXlfdW5pcXVlKCR0aGlzLT5lbHNld2hlcmUpOwoJCWlmICghZW1wdHkoJHRoaXMtPmxvY2FsKSB8fCAhZW1wdHkoJHRoaXMtPmVsc2V3aGVyZSkpCgkJewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGV4dGVuc2lvbigmJGFycmF5KQoJewoJCWZvcmVhY2ggKCRhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkKCQl7CgkJCWlmICgkdGhpcy0+Y2hlY2tlZF9mZWVkcyA9PT0gJHRoaXMtPm1heF9jaGVja2VkX2ZlZWRzKQoJCQl7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoaW5fYXJyYXkoc3RydG9sb3dlcihzdHJyY2hyKCR2YWx1ZSwgJy4nKSksIGFycmF5KCcucnNzJywgJy5yZGYnLCAnLmF0b20nLCAnLnhtbCcpKSkKCQkJewoJCQkJJHRoaXMtPmNoZWNrZWRfZmVlZHMrKzsKCgkJCQkkaGVhZGVycyA9IGFycmF5KAoJCQkJCSdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi9hdG9tK3htbCwgYXBwbGljYXRpb24vcnNzK3htbCwgYXBwbGljYXRpb24vcmRmK3htbDtxPTAuOSwgYXBwbGljYXRpb24veG1sO3E9MC44LCB0ZXh0L3htbDtxPTAuOCwgdGV4dC9odG1sO3E9MC43LCB1bmtub3duL3Vua25vd247cT0wLjEsIGFwcGxpY2F0aW9uL3Vua25vd247cT0wLjEsICovKjtxPTAuMScsCgkJCQkpOwoJCQkJJGZlZWQgPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnRmlsZScsIGFycmF5KCR2YWx1ZSwgJHRoaXMtPnRpbWVvdXQsIDUsICRoZWFkZXJzLCAkdGhpcy0+dXNlcmFnZW50KSk7CgkJCQlpZiAoJGZlZWQtPnN1Y2Nlc3MgJiYgKCRmZWVkLT5tZXRob2QgJiBTSU1QTEVQSUVfRklMRV9TT1VSQ0VfUkVNT1RFID09PSAwIHx8ICgkZmVlZC0+c3RhdHVzX2NvZGUgPT09IDIwMCB8fCAkZmVlZC0+c3RhdHVzX2NvZGUgPiAyMDYgJiYgJGZlZWQtPnN0YXR1c19jb2RlIDwgMzAwKSkgJiYgJHRoaXMtPmlzX2ZlZWQoJGZlZWQpKQoJCQkJewoJCQkJCXJldHVybiAkZmVlZDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQl1bnNldCgkYXJyYXlbJGtleV0pOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBib2R5KCYkYXJyYXkpCgl7CgkJZm9yZWFjaCAoJGFycmF5IGFzICRrZXkgPT4gJHZhbHVlKQoJCXsKCQkJaWYgKCR0aGlzLT5jaGVja2VkX2ZlZWRzID09PSAkdGhpcy0+bWF4X2NoZWNrZWRfZmVlZHMpCgkJCXsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmIChwcmVnX21hdGNoKCcvKHJzc3xyZGZ8YXRvbXx4bWwpL2knLCAkdmFsdWUpKQoJCQl7CgkJCQkkdGhpcy0+Y2hlY2tlZF9mZWVkcysrOwoJCQkJJGhlYWRlcnMgPSBhcnJheSgKCQkJCQknQWNjZXB0JyA9PiAnYXBwbGljYXRpb24vYXRvbSt4bWwsIGFwcGxpY2F0aW9uL3Jzcyt4bWwsIGFwcGxpY2F0aW9uL3JkZit4bWw7cT0wLjksIGFwcGxpY2F0aW9uL3htbDtxPTAuOCwgdGV4dC94bWw7cT0wLjgsIHRleHQvaHRtbDtxPTAuNywgdW5rbm93bi91bmtub3duO3E9MC4xLCBhcHBsaWNhdGlvbi91bmtub3duO3E9MC4xLCAqLyo7cT0wLjEnLAoJCQkJKTsKCQkJCSRmZWVkID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0ZpbGUnLCBhcnJheSgkdmFsdWUsICR0aGlzLT50aW1lb3V0LCA1LCBudWxsLCAkdGhpcy0+dXNlcmFnZW50KSk7CgkJCQlpZiAoJGZlZWQtPnN1Y2Nlc3MgJiYgKCRmZWVkLT5tZXRob2QgJiBTSU1QTEVQSUVfRklMRV9TT1VSQ0VfUkVNT1RFID09PSAwIHx8ICgkZmVlZC0+c3RhdHVzX2NvZGUgPT09IDIwMCB8fCAkZmVlZC0+c3RhdHVzX2NvZGUgPiAyMDYgJiYgJGZlZWQtPnN0YXR1c19jb2RlIDwgMzAwKSkgJiYgJHRoaXMtPmlzX2ZlZWQoJGZlZWQpKQoJCQkJewoJCQkJCXJldHVybiAkZmVlZDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQl1bnNldCgkYXJyYXlbJGtleV0pOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQp9CgovKioKICogTWlzY2VsbGFub3VzIHV0aWxpdGllcwogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICovCmNsYXNzIFNpbXBsZVBpZV9NaXNjCnsKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdGltZV9obXMoJHNlY29uZHMpCgl7CgkJJHRpbWUgPSAnJzsKCgkJJGhvdXJzID0gZmxvb3IoJHNlY29uZHMgLyAzNjAwKTsKCQkkcmVtYWluZGVyID0gJHNlY29uZHMgJSAzNjAwOwoJCWlmICgkaG91cnMgPiAwKQoJCXsKCQkJJHRpbWUgLj0gJGhvdXJzLic6JzsKCQl9CgoJCSRtaW51dGVzID0gZmxvb3IoJHJlbWFpbmRlciAvIDYwKTsKCQkkc2Vjb25kcyA9ICRyZW1haW5kZXIgJSA2MDsKCQlpZiAoJG1pbnV0ZXMgPCAxMCAmJiAkaG91cnMgPiAwKQoJCXsKCQkJJG1pbnV0ZXMgPSAnMCcgLiAkbWludXRlczsKCQl9CgkJaWYgKCRzZWNvbmRzIDwgMTApCgkJewoJCQkkc2Vjb25kcyA9ICcwJyAuICRzZWNvbmRzOwoJCX0KCgkJJHRpbWUgLj0gJG1pbnV0ZXMuJzonOwoJCSR0aW1lIC49ICRzZWNvbmRzOwoKCQlyZXR1cm4gJHRpbWU7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhYnNvbHV0aXplX3VybCgkcmVsYXRpdmUsICRiYXNlKQoJewoJCSRpcmkgPSBTaW1wbGVQaWVfSVJJOjphYnNvbHV0aXplKG5ldyBTaW1wbGVQaWVfSVJJKCRiYXNlKSwgJHJlbGF0aXZlKTsKCQlyZXR1cm4gJGlyaS0+Z2V0X3VyaSgpOwoJfQoKCS8qKgoJICogR2V0IGEgSFRNTC9YTUwgZWxlbWVudCBmcm9tIGEgSFRNTCBzdHJpbmcKCSAqCgkgKiBAZGVwcmVjYXRlZCBVc2UgRE9NRG9jdW1lbnQgaW5zdGVhZCAocGFyc2luZyBIVE1MIHdpdGggcmVnZXggaXMgYmFkISkKCSAqIEBwYXJhbSBzdHJpbmcgJHJlYWxuYW1lIEVsZW1lbnQgbmFtZSAoaW5jbHVkaW5nIG5hbWVzcGFjZSBwcmVmaXggaWYgYXBwbGljYWJsZSkKCSAqIEBwYXJhbSBzdHJpbmcgJHN0cmluZyBIVE1MIGRvY3VtZW50CgkgKiBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2VsZW1lbnQoJHJlYWxuYW1lLCAkc3RyaW5nKQoJewoJCSRyZXR1cm4gPSBhcnJheSgpOwoJCSRuYW1lID0gcHJlZ19xdW90ZSgkcmVhbG5hbWUsICcvJyk7CgkJaWYgKHByZWdfbWF0Y2hfYWxsKCIvPCgkbmFtZSkiIC4gU0lNUExFUElFX1BDUkVfSFRNTF9BVFRSSUJVVEUgLiAiKD4oLiopPFwvJG5hbWU+fChcLyk/Pikvc2lVIiwgJHN0cmluZywgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSIHwgUFJFR19PRkZTRVRfQ0FQVFVSRSkpCgkJewoJCQlmb3IgKCRpID0gMCwgJHRvdGFsX21hdGNoZXMgPSBjb3VudCgkbWF0Y2hlcyk7ICRpIDwgJHRvdGFsX21hdGNoZXM7ICRpKyspCgkJCXsKCQkJCSRyZXR1cm5bJGldWyd0YWcnXSA9ICRyZWFsbmFtZTsKCQkJCSRyZXR1cm5bJGldWydmdWxsJ10gPSAkbWF0Y2hlc1skaV1bMF1bMF07CgkJCQkkcmV0dXJuWyRpXVsnb2Zmc2V0J10gPSAkbWF0Y2hlc1skaV1bMF1bMV07CgkJCQlpZiAoc3RybGVuKCRtYXRjaGVzWyRpXVszXVswXSkgPD0gMikKCQkJCXsKCQkJCQkkcmV0dXJuWyRpXVsnc2VsZl9jbG9zaW5nJ10gPSB0cnVlOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRyZXR1cm5bJGldWydzZWxmX2Nsb3NpbmcnXSA9IGZhbHNlOwoJCQkJCSRyZXR1cm5bJGldWydjb250ZW50J10gPSAkbWF0Y2hlc1skaV1bNF1bMF07CgkJCQl9CgkJCQkkcmV0dXJuWyRpXVsnYXR0cmlicyddID0gYXJyYXkoKTsKCQkJCWlmIChpc3NldCgkbWF0Y2hlc1skaV1bMl1bMF0pICYmIHByZWdfbWF0Y2hfYWxsKCcvW1x4MDlceDBBXHgwQlx4MENceDBEXHgyMF0rKFteXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXHgyRlx4M0VdW15ceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceDJGXHgzRFx4M0VdKikoPzpbXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXSo9W1x4MDlceDBBXHgwQlx4MENceDBEXHgyMF0qKD86IihbXiJdKikifFwnKFteXCddKilcJ3woW15ceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceDIyXHgyN1x4M0VdW15ceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceDNFXSopPykpPy8nLCAnICcgLiAkbWF0Y2hlc1skaV1bMl1bMF0gLiAnICcsICRhdHRyaWJzLCBQUkVHX1NFVF9PUkRFUikpCgkJCQl7CgkJCQkJZm9yICgkaiA9IDAsICR0b3RhbF9hdHRyaWJzID0gY291bnQoJGF0dHJpYnMpOyAkaiA8ICR0b3RhbF9hdHRyaWJzOyAkaisrKQoJCQkJCXsKCQkJCQkJaWYgKGNvdW50KCRhdHRyaWJzWyRqXSkgPT09IDIpCgkJCQkJCXsKCQkJCQkJCSRhdHRyaWJzWyRqXVsyXSA9ICRhdHRyaWJzWyRqXVsxXTsKCQkJCQkJfQoJCQkJCQkkcmV0dXJuWyRpXVsnYXR0cmlicyddW3N0cnRvbG93ZXIoJGF0dHJpYnNbJGpdWzFdKV1bJ2RhdGEnXSA9IFNpbXBsZVBpZV9NaXNjOjplbnRpdGllc19kZWNvZGUoZW5kKCRhdHRyaWJzWyRqXSksICdVVEYtOCcpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gJHJldHVybjsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVsZW1lbnRfaW1wbG9kZSgkZWxlbWVudCkKCXsKCQkkZnVsbCA9ICI8JGVsZW1lbnRbdGFnXSI7CgkJZm9yZWFjaCAoJGVsZW1lbnRbJ2F0dHJpYnMnXSBhcyAka2V5ID0+ICR2YWx1ZSkKCQl7CgkJCSRrZXkgPSBzdHJ0b2xvd2VyKCRrZXkpOwoJCQkkZnVsbCAuPSAiICRrZXk9XCIiIC4gaHRtbHNwZWNpYWxjaGFycygkdmFsdWVbJ2RhdGEnXSkgLiAnIic7CgkJfQoJCWlmICgkZWxlbWVudFsnc2VsZl9jbG9zaW5nJ10pCgkJewoJCQkkZnVsbCAuPSAnIC8+JzsKCQl9CgkJZWxzZQoJCXsKCQkJJGZ1bGwgLj0gIj4kZWxlbWVudFtjb250ZW50XTwvJGVsZW1lbnRbdGFnXT4iOwoJCX0KCQlyZXR1cm4gJGZ1bGw7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlcnJvcigkbWVzc2FnZSwgJGxldmVsLCAkZmlsZSwgJGxpbmUpCgl7CgkJaWYgKChpbmlfZ2V0KCdlcnJvcl9yZXBvcnRpbmcnKSAmICRsZXZlbCkgPiAwKQoJCXsKCQkJc3dpdGNoICgkbGV2ZWwpCgkJCXsKCQkJCWNhc2UgRV9VU0VSX0VSUk9SOgoJCQkJCSRub3RlID0gJ1BIUCBFcnJvcic7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEVfVVNFUl9XQVJOSU5HOgoJCQkJCSRub3RlID0gJ1BIUCBXYXJuaW5nJzsKCQkJCQlicmVhazsKCQkJCWNhc2UgRV9VU0VSX05PVElDRToKCQkJCQkkbm90ZSA9ICdQSFAgTm90aWNlJzsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJG5vdGUgPSAnVW5rbm93biBFcnJvcic7CgkJCQkJYnJlYWs7CgkJCX0KCgkJCSRsb2dfZXJyb3IgPSB0cnVlOwoJCQlpZiAoIWZ1bmN0aW9uX2V4aXN0cygnZXJyb3JfbG9nJykpCgkJCXsKCQkJCSRsb2dfZXJyb3IgPSBmYWxzZTsKCQkJfQoKCQkJJGxvZ19maWxlID0gQGluaV9nZXQoJ2Vycm9yX2xvZycpOwoJCQlpZiAoIWVtcHR5KCRsb2dfZmlsZSkgJiYgKCdzeXNsb2cnICE9PSAkbG9nX2ZpbGUpICYmICFAaXNfd3JpdGFibGUoJGxvZ19maWxlKSkKCQkJewoJCQkJJGxvZ19lcnJvciA9IGZhbHNlOwoJCQl9CgoJCQlpZiAoJGxvZ19lcnJvcikKCQkJewoJCQkJQGVycm9yX2xvZygiJG5vdGU6ICRtZXNzYWdlIGluICRmaWxlIG9uIGxpbmUgJGxpbmUiLCAwKTsKCQkJfQoJCX0KCgkJcmV0dXJuICRtZXNzYWdlOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZml4X3Byb3RvY29sKCR1cmwsICRodHRwID0gMSkKCXsKCQkkdXJsID0gU2ltcGxlUGllX01pc2M6Om5vcm1hbGl6ZV91cmwoJHVybCk7CgkJJHBhcnNlZCA9IFNpbXBsZVBpZV9NaXNjOjpwYXJzZV91cmwoJHVybCk7CgkJaWYgKCRwYXJzZWRbJ3NjaGVtZSddICE9PSAnJyAmJiAkcGFyc2VkWydzY2hlbWUnXSAhPT0gJ2h0dHAnICYmICRwYXJzZWRbJ3NjaGVtZSddICE9PSAnaHR0cHMnKQoJCXsKCQkJcmV0dXJuIFNpbXBsZVBpZV9NaXNjOjpmaXhfcHJvdG9jb2woU2ltcGxlUGllX01pc2M6OmNvbXByZXNzX3BhcnNlX3VybCgnaHR0cCcsICRwYXJzZWRbJ2F1dGhvcml0eSddLCAkcGFyc2VkWydwYXRoJ10sICRwYXJzZWRbJ3F1ZXJ5J10sICRwYXJzZWRbJ2ZyYWdtZW50J10pLCAkaHR0cCk7CgkJfQoKCQlpZiAoJHBhcnNlZFsnc2NoZW1lJ10gPT09ICcnICYmICRwYXJzZWRbJ2F1dGhvcml0eSddID09PSAnJyAmJiAhZmlsZV9leGlzdHMoJHVybCkpCgkJewoJCQlyZXR1cm4gU2ltcGxlUGllX01pc2M6OmZpeF9wcm90b2NvbChTaW1wbGVQaWVfTWlzYzo6Y29tcHJlc3NfcGFyc2VfdXJsKCdodHRwJywgJHBhcnNlZFsncGF0aCddLCAnJywgJHBhcnNlZFsncXVlcnknXSwgJHBhcnNlZFsnZnJhZ21lbnQnXSksICRodHRwKTsKCQl9CgoJCWlmICgkaHR0cCA9PT0gMiAmJiAkcGFyc2VkWydzY2hlbWUnXSAhPT0gJycpCgkJewoJCQlyZXR1cm4gImZlZWQ6JHVybCI7CgkJfQoJCWVsc2VpZiAoJGh0dHAgPT09IDMgJiYgc3RydG9sb3dlcigkcGFyc2VkWydzY2hlbWUnXSkgPT09ICdodHRwJykKCQl7CgkJCXJldHVybiBzdWJzdHJfcmVwbGFjZSgkdXJsLCAncG9kY2FzdCcsIDAsIDQpOwoJCX0KCQllbHNlaWYgKCRodHRwID09PSA0ICYmIHN0cnRvbG93ZXIoJHBhcnNlZFsnc2NoZW1lJ10pID09PSAnaHR0cCcpCgkJewoJCQlyZXR1cm4gc3Vic3RyX3JlcGxhY2UoJHVybCwgJ2l0cGMnLCAwLCA0KTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICR1cmw7CgkJfQoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFyc2VfdXJsKCR1cmwpCgl7CgkJJGlyaSA9IG5ldyBTaW1wbGVQaWVfSVJJKCR1cmwpOwoJCXJldHVybiBhcnJheSgKCQkJJ3NjaGVtZScgPT4gKHN0cmluZykgJGlyaS0+c2NoZW1lLAoJCQknYXV0aG9yaXR5JyA9PiAoc3RyaW5nKSAkaXJpLT5hdXRob3JpdHksCgkJCSdwYXRoJyA9PiAoc3RyaW5nKSAkaXJpLT5wYXRoLAoJCQkncXVlcnknID0+IChzdHJpbmcpICRpcmktPnF1ZXJ5LAoJCQknZnJhZ21lbnQnID0+IChzdHJpbmcpICRpcmktPmZyYWdtZW50CgkJKTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbXByZXNzX3BhcnNlX3VybCgkc2NoZW1lID0gJycsICRhdXRob3JpdHkgPSAnJywgJHBhdGggPSAnJywgJHF1ZXJ5ID0gJycsICRmcmFnbWVudCA9ICcnKQoJewoJCSRpcmkgPSBuZXcgU2ltcGxlUGllX0lSSSgnJyk7CgkJJGlyaS0+c2NoZW1lID0gJHNjaGVtZTsKCQkkaXJpLT5hdXRob3JpdHkgPSAkYXV0aG9yaXR5OwoJCSRpcmktPnBhdGggPSAkcGF0aDsKCQkkaXJpLT5xdWVyeSA9ICRxdWVyeTsKCQkkaXJpLT5mcmFnbWVudCA9ICRmcmFnbWVudDsKCQlyZXR1cm4gJGlyaS0+Z2V0X3VyaSgpOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbm9ybWFsaXplX3VybCgkdXJsKQoJewoJCSRpcmkgPSBuZXcgU2ltcGxlUGllX0lSSSgkdXJsKTsKCQlyZXR1cm4gJGlyaS0+Z2V0X3VyaSgpOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGVyY2VudF9lbmNvZGluZ19ub3JtYWxpemF0aW9uKCRtYXRjaCkKCXsKCQkkaW50ZWdlciA9IGhleGRlYygkbWF0Y2hbMV0pOwoJCWlmICgkaW50ZWdlciA+PSAweDQxICYmICRpbnRlZ2VyIDw9IDB4NUEgfHwgJGludGVnZXIgPj0gMHg2MSAmJiAkaW50ZWdlciA8PSAweDdBIHx8ICRpbnRlZ2VyID49IDB4MzAgJiYgJGludGVnZXIgPD0gMHgzOSB8fCAkaW50ZWdlciA9PT0gMHgyRCB8fCAkaW50ZWdlciA9PT0gMHgyRSB8fCAkaW50ZWdlciA9PT0gMHg1RiB8fCAkaW50ZWdlciA9PT0gMHg3RSkKCQl7CgkJCXJldHVybiBjaHIoJGludGVnZXIpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gc3RydG91cHBlcigkbWF0Y2hbMF0pOwoJCX0KCX0KCgkvKioKCSAqIENvbnZlcnRzIGEgV2luZG93cy0xMjUyIGVuY29kZWQgc3RyaW5nIHRvIGEgVVRGLTggZW5jb2RlZCBzdHJpbmcKCSAqCgkgKiBAc3RhdGljCgkgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgV2luZG93cy0xMjUyIGVuY29kZWQgc3RyaW5nCgkgKiBAcmV0dXJuIHN0cmluZyBVVEYtOCBlbmNvZGVkIHN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdpbmRvd3NfMTI1Ml90b191dGY4KCRzdHJpbmcpCgl7CgkJc3RhdGljICRjb252ZXJ0X3RhYmxlID0gYXJyYXkoIlx4ODAiID0+ICJceEUyXHg4Mlx4QUMiLCAiXHg4MSIgPT4gIlx4RUZceEJGXHhCRCIsICJceDgyIiA9PiAiXHhFMlx4ODBceDlBIiwgIlx4ODMiID0+ICJceEM2XHg5MiIsICJceDg0IiA9PiAiXHhFMlx4ODBceDlFIiwgIlx4ODUiID0+ICJceEUyXHg4MFx4QTYiLCAiXHg4NiIgPT4gIlx4RTJceDgwXHhBMCIsICJceDg3IiA9PiAiXHhFMlx4ODBceEExIiwgIlx4ODgiID0+ICJceENCXHg4NiIsICJceDg5IiA9PiAiXHhFMlx4ODBceEIwIiwgIlx4OEEiID0+ICJceEM1XHhBMCIsICJceDhCIiA9PiAiXHhFMlx4ODBceEI5IiwgIlx4OEMiID0+ICJceEM1XHg5MiIsICJceDhEIiA9PiAiXHhFRlx4QkZceEJEIiwgIlx4OEUiID0+ICJceEM1XHhCRCIsICJceDhGIiA9PiAiXHhFRlx4QkZceEJEIiwgIlx4OTAiID0+ICJceEVGXHhCRlx4QkQiLCAiXHg5MSIgPT4gIlx4RTJceDgwXHg5OCIsICJceDkyIiA9PiAiXHhFMlx4ODBceDk5IiwgIlx4OTMiID0+ICJceEUyXHg4MFx4OUMiLCAiXHg5NCIgPT4gIlx4RTJceDgwXHg5RCIsICJceDk1IiA9PiAiXHhFMlx4ODBceEEyIiwgIlx4OTYiID0+ICJceEUyXHg4MFx4OTMiLCAiXHg5NyIgPT4gIlx4RTJceDgwXHg5NCIsICJceDk4IiA9PiAiXHhDQlx4OUMiLCAiXHg5OSIgPT4gIlx4RTJceDg0XHhBMiIsICJceDlBIiA9PiAiXHhDNVx4QTEiLCAiXHg5QiIgPT4gIlx4RTJceDgwXHhCQSIsICJceDlDIiA9PiAiXHhDNVx4OTMiLCAiXHg5RCIgPT4gIlx4RUZceEJGXHhCRCIsICJceDlFIiA9PiAiXHhDNVx4QkUiLCAiXHg5RiIgPT4gIlx4QzVceEI4IiwgIlx4QTAiID0+ICJceEMyXHhBMCIsICJceEExIiA9PiAiXHhDMlx4QTEiLCAiXHhBMiIgPT4gIlx4QzJceEEyIiwgIlx4QTMiID0+ICJceEMyXHhBMyIsICJceEE0IiA9PiAiXHhDMlx4QTQiLCAiXHhBNSIgPT4gIlx4QzJceEE1IiwgIlx4QTYiID0+ICJceEMyXHhBNiIsICJceEE3IiA9PiAiXHhDMlx4QTciLCAiXHhBOCIgPT4gIlx4QzJceEE4IiwgIlx4QTkiID0+ICJceEMyXHhBOSIsICJceEFBIiA9PiAiXHhDMlx4QUEiLCAiXHhBQiIgPT4gIlx4QzJceEFCIiwgIlx4QUMiID0+ICJceEMyXHhBQyIsICJceEFEIiA9PiAiXHhDMlx4QUQiLCAiXHhBRSIgPT4gIlx4QzJceEFFIiwgIlx4QUYiID0+ICJceEMyXHhBRiIsICJceEIwIiA9PiAiXHhDMlx4QjAiLCAiXHhCMSIgPT4gIlx4QzJceEIxIiwgIlx4QjIiID0+ICJceEMyXHhCMiIsICJceEIzIiA9PiAiXHhDMlx4QjMiLCAiXHhCNCIgPT4gIlx4QzJceEI0IiwgIlx4QjUiID0+ICJceEMyXHhCNSIsICJceEI2IiA9PiAiXHhDMlx4QjYiLCAiXHhCNyIgPT4gIlx4QzJceEI3IiwgIlx4QjgiID0+ICJceEMyXHhCOCIsICJceEI5IiA9PiAiXHhDMlx4QjkiLCAiXHhCQSIgPT4gIlx4QzJceEJBIiwgIlx4QkIiID0+ICJceEMyXHhCQiIsICJceEJDIiA9PiAiXHhDMlx4QkMiLCAiXHhCRCIgPT4gIlx4QzJceEJEIiwgIlx4QkUiID0+ICJceEMyXHhCRSIsICJceEJGIiA9PiAiXHhDMlx4QkYiLCAiXHhDMCIgPT4gIlx4QzNceDgwIiwgIlx4QzEiID0+ICJceEMzXHg4MSIsICJceEMyIiA9PiAiXHhDM1x4ODIiLCAiXHhDMyIgPT4gIlx4QzNceDgzIiwgIlx4QzQiID0+ICJceEMzXHg4NCIsICJceEM1IiA9PiAiXHhDM1x4ODUiLCAiXHhDNiIgPT4gIlx4QzNceDg2IiwgIlx4QzciID0+ICJceEMzXHg4NyIsICJceEM4IiA9PiAiXHhDM1x4ODgiLCAiXHhDOSIgPT4gIlx4QzNceDg5IiwgIlx4Q0EiID0+ICJceEMzXHg4QSIsICJceENCIiA9PiAiXHhDM1x4OEIiLCAiXHhDQyIgPT4gIlx4QzNceDhDIiwgIlx4Q0QiID0+ICJceEMzXHg4RCIsICJceENFIiA9PiAiXHhDM1x4OEUiLCAiXHhDRiIgPT4gIlx4QzNceDhGIiwgIlx4RDAiID0+ICJceEMzXHg5MCIsICJceEQxIiA9PiAiXHhDM1x4OTEiLCAiXHhEMiIgPT4gIlx4QzNceDkyIiwgIlx4RDMiID0+ICJceEMzXHg5MyIsICJceEQ0IiA9PiAiXHhDM1x4OTQiLCAiXHhENSIgPT4gIlx4QzNceDk1IiwgIlx4RDYiID0+ICJceEMzXHg5NiIsICJceEQ3IiA9PiAiXHhDM1x4OTciLCAiXHhEOCIgPT4gIlx4QzNceDk4IiwgIlx4RDkiID0+ICJceEMzXHg5OSIsICJceERBIiA9PiAiXHhDM1x4OUEiLCAiXHhEQiIgPT4gIlx4QzNceDlCIiwgIlx4REMiID0+ICJceEMzXHg5QyIsICJceEREIiA9PiAiXHhDM1x4OUQiLCAiXHhERSIgPT4gIlx4QzNceDlFIiwgIlx4REYiID0+ICJceEMzXHg5RiIsICJceEUwIiA9PiAiXHhDM1x4QTAiLCAiXHhFMSIgPT4gIlx4QzNceEExIiwgIlx4RTIiID0+ICJceEMzXHhBMiIsICJceEUzIiA9PiAiXHhDM1x4QTMiLCAiXHhFNCIgPT4gIlx4QzNceEE0IiwgIlx4RTUiID0+ICJceEMzXHhBNSIsICJceEU2IiA9PiAiXHhDM1x4QTYiLCAiXHhFNyIgPT4gIlx4QzNceEE3IiwgIlx4RTgiID0+ICJceEMzXHhBOCIsICJceEU5IiA9PiAiXHhDM1x4QTkiLCAiXHhFQSIgPT4gIlx4QzNceEFBIiwgIlx4RUIiID0+ICJceEMzXHhBQiIsICJceEVDIiA9PiAiXHhDM1x4QUMiLCAiXHhFRCIgPT4gIlx4QzNceEFEIiwgIlx4RUUiID0+ICJceEMzXHhBRSIsICJceEVGIiA9PiAiXHhDM1x4QUYiLCAiXHhGMCIgPT4gIlx4QzNceEIwIiwgIlx4RjEiID0+ICJceEMzXHhCMSIsICJceEYyIiA9PiAiXHhDM1x4QjIiLCAiXHhGMyIgPT4gIlx4QzNceEIzIiwgIlx4RjQiID0+ICJceEMzXHhCNCIsICJceEY1IiA9PiAiXHhDM1x4QjUiLCAiXHhGNiIgPT4gIlx4QzNceEI2IiwgIlx4RjciID0+ICJceEMzXHhCNyIsICJceEY4IiA9PiAiXHhDM1x4QjgiLCAiXHhGOSIgPT4gIlx4QzNceEI5IiwgIlx4RkEiID0+ICJceEMzXHhCQSIsICJceEZCIiA9PiAiXHhDM1x4QkIiLCAiXHhGQyIgPT4gIlx4QzNceEJDIiwgIlx4RkQiID0+ICJceEMzXHhCRCIsICJceEZFIiA9PiAiXHhDM1x4QkUiLCAiXHhGRiIgPT4gIlx4QzNceEJGIik7CgoJCXJldHVybiBzdHJ0cigkc3RyaW5nLCAkY29udmVydF90YWJsZSk7Cgl9CgoJLyoqCgkgKiBDaGFuZ2UgYSBzdHJpbmcgZnJvbSBvbmUgZW5jb2RpbmcgdG8gYW5vdGhlcgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgUmF3IGRhdGEgaW4gJGlucHV0IGVuY29kaW5nCgkgKiBAcGFyYW0gc3RyaW5nICRpbnB1dCBFbmNvZGluZyBvZiAkZGF0YQoJICogQHBhcmFtIHN0cmluZyAkb3V0cHV0IEVuY29kaW5nIHlvdSB3YW50CgkgKiBAcmV0dXJuIHN0cmluZ3xib29sZWFuIEZhbHNlIGlmIHdlIGNhbid0IGNvbnZlcnQgaXQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGFuZ2VfZW5jb2RpbmcoJGRhdGEsICRpbnB1dCwgJG91dHB1dCkKCXsKCQkkaW5wdXQgPSBTaW1wbGVQaWVfTWlzYzo6ZW5jb2RpbmcoJGlucHV0KTsKCQkkb3V0cHV0ID0gU2ltcGxlUGllX01pc2M6OmVuY29kaW5nKCRvdXRwdXQpOwoKCQkvLyBXZSBmYWlsIHRvIGZhaWwgb24gbm9uIFVTLUFTQ0lJIGJ5dGVzCgkJaWYgKCRpbnB1dCA9PT0gJ1VTLUFTQ0lJJykKCQl7CgkJCXN0YXRpYyAkbm9uX2FzY2lpX29jdGVjdHMgPSAnJzsKCQkJaWYgKCEkbm9uX2FzY2lpX29jdGVjdHMpCgkJCXsKCQkJCWZvciAoJGkgPSAweDgwOyAkaSA8PSAweEZGOyAkaSsrKQoJCQkJewoJCQkJCSRub25fYXNjaWlfb2N0ZWN0cyAuPSBjaHIoJGkpOwoJCQkJfQoJCQl9CgkJCSRkYXRhID0gc3Vic3RyKCRkYXRhLCAwLCBzdHJjc3BuKCRkYXRhLCAkbm9uX2FzY2lpX29jdGVjdHMpKTsKCQl9CgoJCS8vIFRoaXMgaXMgZmlyc3QsIGFzIGJlaGF2aW91ciBvZiB0aGlzIGlzIGNvbXBsZXRlbHkgcHJlZGljdGFibGUKCQlpZiAoJGlucHV0ID09PSAnd2luZG93cy0xMjUyJyAmJiAkb3V0cHV0ID09PSAnVVRGLTgnKQoJCXsKCQkJcmV0dXJuIFNpbXBsZVBpZV9NaXNjOjp3aW5kb3dzXzEyNTJfdG9fdXRmOCgkZGF0YSk7CgkJfQoJCS8vIFRoaXMgaXMgc2Vjb25kLCBhcyBiZWhhdmlvdXIgb2YgdGhpcyB2YXJpZXMgb25seSB3aXRoIFBIUCB2ZXJzaW9uICh0aGUgbWlkZGxlIHBhcnQgb2YgdGhpcyBleHByZXNzaW9uIGNoZWNrcyB0aGUgZW5jb2RpbmcgaXMgc3VwcG9ydGVkKS4KCQllbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpICYmICgkcmV0dXJuID0gU2ltcGxlUGllX01pc2M6OmNoYW5nZV9lbmNvZGluZ19tYnN0cmluZygkZGF0YSwgJGlucHV0LCAkb3V0cHV0KSkpCgkJewoJCQlyZXR1cm4gJHJldHVybjsKIAkJfQoJCS8vIFRoaXMgaXMgbGFzdCwgYXMgYmVoYXZpb3VyIG9mIHRoaXMgdmFyaWVzIHdpdGggT1MgdXNlcmxhbmQgYW5kIFBIUCB2ZXJzaW9uCgkJZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ2ljb252JykgJiYgKCRyZXR1cm4gPSBTaW1wbGVQaWVfTWlzYzo6Y2hhbmdlX2VuY29kaW5nX2ljb252KCRkYXRhLCAkaW5wdXQsICRvdXRwdXQpKSkKCQl7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCQkvLyBJZiB3ZSBjYW4ndCBkbyBhbnl0aGluZywganVzdCBmYWlsCgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCglwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGNoYW5nZV9lbmNvZGluZ19tYnN0cmluZygkZGF0YSwgJGlucHV0LCAkb3V0cHV0KQoJewoJCWlmICgkaW5wdXQgPT09ICd3aW5kb3dzLTk0OScpCgkJewoJCQkkaW5wdXQgPSAnRVVDLUtSJzsKCQl9CgkJaWYgKCRvdXRwdXQgPT09ICd3aW5kb3dzLTk0OScpCgkJewoJCQkkb3V0cHV0ID0gJ0VVQy1LUic7CgkJfQoJCWlmICgkaW5wdXQgPT09ICdXaW5kb3dzLTMxSicpCgkJewoJCQkkaW5wdXQgPSAnU0pJUyc7CgkJfQoJCWlmICgkb3V0cHV0ID09PSAnV2luZG93cy0zMUonKQoJCXsKCQkJJG91dHB1dCA9ICdTSklTJzsKCQl9CgoJCS8vIENoZWNrIHRoYXQgdGhlIGVuY29kaW5nIGlzIHN1cHBvcnRlZAoJCWlmIChAbWJfY29udmVydF9lbmNvZGluZygiXHg4MCIsICdVVEYtMTZCRScsICRpbnB1dCkgPT09ICJceDAwXHg4MCIpCgkJewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWlmICghaW5fYXJyYXkoJGlucHV0LCBtYl9saXN0X2VuY29kaW5ncygpKSkKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIExldCdzIGRvIHNvbWUgY29udmVyc2lvbgoJCWlmICgkcmV0dXJuID0gQG1iX2NvbnZlcnRfZW5jb2RpbmcoJGRhdGEsICRvdXRwdXQsICRpbnB1dCkpCgkJewoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCglwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGNoYW5nZV9lbmNvZGluZ19pY29udigkZGF0YSwgJGlucHV0LCAkb3V0cHV0KQoJewoJCXJldHVybiBAaWNvbnYoJGlucHV0LCAkb3V0cHV0LCAkZGF0YSk7Cgl9CgoJLyoqCgkgKiBOb3JtYWxpemUgYW4gZW5jb2RpbmcgbmFtZQoJICoKCSAqIFRoaXMgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgY3JlYXRlLnBocAoJICoKCSAqIFRvIGdlbmVyYXRlIGl0LCBydW4gYHBocCBjcmVhdGUucGhwYCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgY29weSB0aGUKCSAqIG91dHB1dCB0byByZXBsYWNlIHRoaXMgZnVuY3Rpb24uCgkgKgoJICogQHBhcmFtIHN0cmluZyAkY2hhcnNldCBDaGFyYWN0ZXIgc2V0IHRvIHN0YW5kYXJkaXNlCgkgKiBAcmV0dXJuIHN0cmluZyBTdGFuZGFyZGlzZWQgbmFtZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVuY29kaW5nKCRjaGFyc2V0KQoJewoJCS8vIE5vcm1hbGl6YXRpb24gZnJvbSBVVFMgIzIyCgkJc3dpdGNoIChzdHJ0b2xvd2VyKHByZWdfcmVwbGFjZSgnLyg/OlteYS16QS1aMC05XSt8KFteMC05XSkwKykvJywgJ1wxJywgJGNoYXJzZXQpKSkKCQl7CgkJCWNhc2UgJ2Fkb2Jlc3RhbmRhcmRlbmNvZGluZyc6CgkJCWNhc2UgJ2NzYWRvYmVzdGFuZGFyZGVuY29kaW5nJzoKCQkJCXJldHVybiAnQWRvYmUtU3RhbmRhcmQtRW5jb2RpbmcnOwoKCQkJY2FzZSAnYWRvYmVzeW1ib2xlbmNvZGluZyc6CgkJCWNhc2UgJ2NzaHBwc21hdGgnOgoJCQkJcmV0dXJuICdBZG9iZS1TeW1ib2wtRW5jb2RpbmcnOwoKCQkJY2FzZSAnYW1pMTI1MSc6CgkJCWNhc2UgJ2FtaWdhMTI1MSc6CgkJCQlyZXR1cm4gJ0FtaWdhLTEyNTEnOwoKCQkJY2FzZSAnYW5zaXgzMTEwMTk4Myc6CgkJCWNhc2UgJ2NzYXQ1MDAxOTgzJzoKCQkJY2FzZSAnY3Npc285OW5hcGxwcyc6CgkJCWNhc2UgJ2lzb2lyOTknOgoJCQljYXNlICduYXBscHMnOgoJCQkJcmV0dXJuICdBTlNJX1gzLjExMC0xOTgzJzsKCgkJCWNhc2UgJ2FyYWJpYzcnOgoJCQljYXNlICdhc21vNDQ5JzoKCQkJY2FzZSAnY3Npc284OWFzbW80NDknOgoJCQljYXNlICdpc285MDM2JzoKCQkJY2FzZSAnaXNvaXI4OSc6CgkJCQlyZXR1cm4gJ0FTTU9fNDQ5JzsKCgkJCWNhc2UgJ2JpZzUnOgoJCQljYXNlICdjc2JpZzUnOgoJCQkJcmV0dXJuICdCaWc1JzsKCgkJCWNhc2UgJ2JpZzVoa3Njcyc6CgkJCQlyZXR1cm4gJ0JpZzUtSEtTQ1MnOwoKCQkJY2FzZSAnYm9jdTEnOgoJCQljYXNlICdjc2JvY3UxJzoKCQkJCXJldHVybiAnQk9DVS0xJzsKCgkJCWNhc2UgJ2JyZic6CgkJCWNhc2UgJ2NzYnJmJzoKCQkJCXJldHVybiAnQlJGJzsKCgkJCWNhc2UgJ2JzNDczMCc6CgkJCWNhc2UgJ2NzaXNvNHVuaXRlZGtpbmdkb20nOgoJCQljYXNlICdnYic6CgkJCWNhc2UgJ2lzbzY0NmdiJzoKCQkJY2FzZSAnaXNvaXI0JzoKCQkJY2FzZSAndWsnOgoJCQkJcmV0dXJuICdCU180NzMwJzsKCgkJCWNhc2UgJ2Jzdmlld2RhdGEnOgoJCQljYXNlICdjc2lzbzQ3YnN2aWV3ZGF0YSc6CgkJCWNhc2UgJ2lzb2lyNDcnOgoJCQkJcmV0dXJuICdCU192aWV3ZGF0YSc7CgoJCQljYXNlICdjZXN1OCc6CgkJCWNhc2UgJ2NzY2VzdTgnOgoJCQkJcmV0dXJuICdDRVNVLTgnOwoKCQkJY2FzZSAnY2EnOgoJCQljYXNlICdjc2E3MSc6CgkJCWNhc2UgJ2NzYXoyNDM0MTk4NTEnOgoJCQljYXNlICdjc2lzbzEyMWNhbmFkaWFuMSc6CgkJCWNhc2UgJ2lzbzY0NmNhJzoKCQkJY2FzZSAnaXNvaXIxMjEnOgoJCQkJcmV0dXJuICdDU0FfWjI0My40LTE5ODUtMSc7CgoJCQljYXNlICdjc2E3Mic6CgkJCWNhc2UgJ2NzYXoyNDM0MTk4NTInOgoJCQljYXNlICdjc2lzbzEyMmNhbmFkaWFuMic6CgkJCWNhc2UgJ2lzbzY0NmNhMic6CgkJCWNhc2UgJ2lzb2lyMTIyJzoKCQkJCXJldHVybiAnQ1NBX1oyNDMuNC0xOTg1LTInOwoKCQkJY2FzZSAnY3NhejI0MzQxOTg1Z3InOgoJCQljYXNlICdjc2lzbzEyM2NzYXoyNDM0MTk4NWdyJzoKCQkJY2FzZSAnaXNvaXIxMjMnOgoJCQkJcmV0dXJuICdDU0FfWjI0My40LTE5ODUtZ3InOwoKCQkJY2FzZSAnY3Npc28xMzljc24zNjkxMDMnOgoJCQljYXNlICdjc24zNjkxMDMnOgoJCQljYXNlICdpc29pcjEzOSc6CgkJCQlyZXR1cm4gJ0NTTl8zNjkxMDMnOwoKCQkJY2FzZSAnY3NkZWNtY3MnOgoJCQljYXNlICdkZWMnOgoJCQljYXNlICdkZWNtY3MnOgoJCQkJcmV0dXJuICdERUMtTUNTJzsKCgkJCWNhc2UgJ2NzaXNvMjFnZXJtYW4nOgoJCQljYXNlICdkZSc6CgkJCWNhc2UgJ2RpbjY2MDAzJzoKCQkJY2FzZSAnaXNvNjQ2ZGUnOgoJCQljYXNlICdpc29pcjIxJzoKCQkJCXJldHVybiAnRElOXzY2MDAzJzsKCgkJCWNhc2UgJ2NzZGt1cyc6CgkJCWNhc2UgJ2RrdXMnOgoJCQkJcmV0dXJuICdkay11cyc7CgoJCQljYXNlICdjc2lzbzY0NmRhbmlzaCc6CgkJCWNhc2UgJ2RrJzoKCQkJY2FzZSAnZHMyMDg5JzoKCQkJY2FzZSAnaXNvNjQ2ZGsnOgoJCQkJcmV0dXJuICdEU18yMDg5JzsKCgkJCWNhc2UgJ2NzaWJtZWJjZGljYXRkZSc6CgkJCWNhc2UgJ2ViY2RpY2F0ZGUnOgoJCQkJcmV0dXJuICdFQkNESUMtQVQtREUnOwoKCQkJY2FzZSAnY3NlYmNkaWNhdGRlYSc6CgkJCWNhc2UgJ2ViY2RpY2F0ZGVhJzoKCQkJCXJldHVybiAnRUJDRElDLUFULURFLUEnOwoKCQkJY2FzZSAnY3NlYmNkaWNjYWZyJzoKCQkJY2FzZSAnZWJjZGljY2Fmcic6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1DQS1GUic7CgoJCQljYXNlICdjc2ViY2RpY2Rrbm8nOgoJCQljYXNlICdlYmNkaWNka25vJzoKCQkJCXJldHVybiAnRUJDRElDLURLLU5PJzsKCgkJCWNhc2UgJ2NzZWJjZGljZGtub2EnOgoJCQljYXNlICdlYmNkaWNka25vYSc6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1ESy1OTy1BJzsKCgkJCWNhc2UgJ2NzZWJjZGljZXMnOgoJCQljYXNlICdlYmNkaWNlcyc6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1FUyc7CgoJCQljYXNlICdjc2ViY2RpY2VzYSc6CgkJCWNhc2UgJ2ViY2RpY2VzYSc6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1FUy1BJzsKCgkJCWNhc2UgJ2NzZWJjZGljZXNzJzoKCQkJY2FzZSAnZWJjZGljZXNzJzoKCQkJCXJldHVybiAnRUJDRElDLUVTLVMnOwoKCQkJY2FzZSAnY3NlYmNkaWNmaXNlJzoKCQkJY2FzZSAnZWJjZGljZmlzZSc6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1GSS1TRSc7CgoJCQljYXNlICdjc2ViY2RpY2Zpc2VhJzoKCQkJY2FzZSAnZWJjZGljZmlzZWEnOgoJCQkJcmV0dXJuICdFQkNESUMtRkktU0UtQSc7CgoJCQljYXNlICdjc2ViY2RpY2ZyJzoKCQkJY2FzZSAnZWJjZGljZnInOgoJCQkJcmV0dXJuICdFQkNESUMtRlInOwoKCQkJY2FzZSAnY3NlYmNkaWNpdCc6CgkJCWNhc2UgJ2ViY2RpY2l0JzoKCQkJCXJldHVybiAnRUJDRElDLUlUJzsKCgkJCWNhc2UgJ2NzZWJjZGljcHQnOgoJCQljYXNlICdlYmNkaWNwdCc6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1QVCc7CgoJCQljYXNlICdjc2ViY2RpY3VrJzoKCQkJY2FzZSAnZWJjZGljdWsnOgoJCQkJcmV0dXJuICdFQkNESUMtVUsnOwoKCQkJY2FzZSAnY3NlYmNkaWN1cyc6CgkJCWNhc2UgJ2ViY2RpY3VzJzoKCQkJCXJldHVybiAnRUJDRElDLVVTJzsKCgkJCWNhc2UgJ2NzaXNvMTExZWNtYWN5cmlsbGljJzoKCQkJY2FzZSAnZWNtYWN5cmlsbGljJzoKCQkJY2FzZSAnaXNvaXIxMTEnOgoJCQljYXNlICdrb2k4ZSc6CgkJCQlyZXR1cm4gJ0VDTUEtY3lyaWxsaWMnOwoKCQkJY2FzZSAnY3Npc28xN3NwYW5pc2gnOgoJCQljYXNlICdlcyc6CgkJCWNhc2UgJ2lzbzY0NmVzJzoKCQkJY2FzZSAnaXNvaXIxNyc6CgkJCQlyZXR1cm4gJ0VTJzsKCgkJCWNhc2UgJ2NzaXNvODVzcGFuaXNoMic6CgkJCWNhc2UgJ2VzMic6CgkJCWNhc2UgJ2lzbzY0NmVzMic6CgkJCWNhc2UgJ2lzb2lyODUnOgoJCQkJcmV0dXJuICdFUzInOwoKCQkJY2FzZSAnY3NldWNwa2RmbXRqYXBhbmVzZSc6CgkJCWNhc2UgJ2V1Y2pwJzoKCQkJY2FzZSAnZXh0ZW5kZWR1bml4Y29kZXBhY2tlZGZvcm1hdGZvcmphcGFuZXNlJzoKCQkJCXJldHVybiAnRVVDLUpQJzsKCgkJCWNhc2UgJ2NzZXVjZml4d2lkamFwYW5lc2UnOgoJCQljYXNlICdleHRlbmRlZHVuaXhjb2RlZml4ZWR3aWR0aGZvcmphcGFuZXNlJzoKCQkJCXJldHVybiAnRXh0ZW5kZWRfVU5JWF9Db2RlX0ZpeGVkX1dpZHRoX2Zvcl9KYXBhbmVzZSc7CgoJCQljYXNlICdnYjE4MDMwJzoKCQkJCXJldHVybiAnR0IxODAzMCc7CgoJCQljYXNlICdjaGluZXNlJzoKCQkJY2FzZSAnY3A5MzYnOgoJCQljYXNlICdjc2diMjMxMic6CgkJCWNhc2UgJ2NzaXNvNThnYjIzMTI4MCc6CgkJCWNhc2UgJ2diMjMxMic6CgkJCWNhc2UgJ2diMjMxMjgwJzoKCQkJY2FzZSAnZ2JrJzoKCQkJY2FzZSAnaXNvaXI1OCc6CgkJCWNhc2UgJ21zOTM2JzoKCQkJY2FzZSAnd2luZG93czkzNic6CgkJCQlyZXR1cm4gJ0dCSyc7CgoJCQljYXNlICdjbic6CgkJCWNhc2UgJ2NzaXNvNTdnYjE5ODgnOgoJCQljYXNlICdnYjE5ODg4MCc6CgkJCWNhc2UgJ2lzbzY0NmNuJzoKCQkJY2FzZSAnaXNvaXI1Nyc6CgkJCQlyZXR1cm4gJ0dCXzE5ODgtODAnOwoKCQkJY2FzZSAnY3Npc28xNTNnb3N0MTk3Njg3NCc6CgkJCWNhc2UgJ2dvc3QxOTc2ODc0JzoKCQkJY2FzZSAnaXNvaXIxNTMnOgoJCQljYXNlICdzdHNldjM1ODg4JzoKCQkJCXJldHVybiAnR09TVF8xOTc2OC03NCc7CgoJCQljYXNlICdjc2lzbzE1MCc6CgkJCWNhc2UgJ2NzaXNvMTUwZ3JlZWtjY2l0dCc6CgkJCWNhc2UgJ2dyZWVrY2NpdHQnOgoJCQljYXNlICdpc29pcjE1MCc6CgkJCQlyZXR1cm4gJ2dyZWVrLWNjaXR0JzsKCgkJCWNhc2UgJ2NzaXNvODhncmVlazcnOgoJCQljYXNlICdncmVlazcnOgoJCQljYXNlICdpc29pcjg4JzoKCQkJCXJldHVybiAnZ3JlZWs3JzsKCgkJCWNhc2UgJ2NzaXNvMThncmVlazdvbGQnOgoJCQljYXNlICdncmVlazdvbGQnOgoJCQljYXNlICdpc29pcjE4JzoKCQkJCXJldHVybiAnZ3JlZWs3LW9sZCc7CgoJCQljYXNlICdjc2hwZGVza3RvcCc6CgkJCWNhc2UgJ2hwZGVza3RvcCc6CgkJCQlyZXR1cm4gJ0hQLURlc2tUb3AnOwoKCQkJY2FzZSAnY3NocGxlZ2FsJzoKCQkJY2FzZSAnaHBsZWdhbCc6CgkJCQlyZXR1cm4gJ0hQLUxlZ2FsJzsKCgkJCWNhc2UgJ2NzaHBtYXRoOCc6CgkJCWNhc2UgJ2hwbWF0aDgnOgoJCQkJcmV0dXJuICdIUC1NYXRoOCc7CgoJCQljYXNlICdjc2hwcGlmb250JzoKCQkJY2FzZSAnaHBwaWZvbnQnOgoJCQkJcmV0dXJuICdIUC1QaS1mb250JzsKCgkJCWNhc2UgJ2NzaHByb21hbjgnOgoJCQljYXNlICdocHJvbWFuOCc6CgkJCWNhc2UgJ3I4JzoKCQkJY2FzZSAncm9tYW44JzoKCQkJCXJldHVybiAnaHAtcm9tYW44JzsKCgkJCWNhc2UgJ2h6Z2IyMzEyJzoKCQkJCXJldHVybiAnSFotR0ItMjMxMic7CgoJCQljYXNlICdjc2libXN5bWJvbHMnOgoJCQljYXNlICdpYm1zeW1ib2xzJzoKCQkJCXJldHVybiAnSUJNLVN5bWJvbHMnOwoKCQkJY2FzZSAnY3NpYm10aGFpJzoKCQkJY2FzZSAnaWJtdGhhaSc6CgkJCQlyZXR1cm4gJ0lCTS1UaGFpJzsKCgkJCWNhc2UgJ2NwMzcnOgoJCQljYXNlICdjc2libTM3JzoKCQkJY2FzZSAnZWJjZGljY3BjYSc6CgkJCWNhc2UgJ2ViY2RpY2NwbmwnOgoJCQljYXNlICdlYmNkaWNjcHVzJzoKCQkJY2FzZSAnZWJjZGljY3B3dCc6CgkJCWNhc2UgJ2libTM3JzoKCQkJCXJldHVybiAnSUJNMDM3JzsKCgkJCWNhc2UgJ2NwMzgnOgoJCQljYXNlICdjc2libTM4JzoKCQkJY2FzZSAnZWJjZGljaW50JzoKCQkJY2FzZSAnaWJtMzgnOgoJCQkJcmV0dXJuICdJQk0wMzgnOwoKCQkJY2FzZSAnY3AyNzMnOgoJCQljYXNlICdjc2libTI3Myc6CgkJCWNhc2UgJ2libTI3Myc6CgkJCQlyZXR1cm4gJ0lCTTI3Myc7CgoJCQljYXNlICdjcDI3NCc6CgkJCWNhc2UgJ2NzaWJtMjc0JzoKCQkJY2FzZSAnZWJjZGljYmUnOgoJCQljYXNlICdpYm0yNzQnOgoJCQkJcmV0dXJuICdJQk0yNzQnOwoKCQkJY2FzZSAnY3AyNzUnOgoJCQljYXNlICdjc2libTI3NSc6CgkJCWNhc2UgJ2ViY2RpY2JyJzoKCQkJY2FzZSAnaWJtMjc1JzoKCQkJCXJldHVybiAnSUJNMjc1JzsKCgkJCWNhc2UgJ2NzaWJtMjc3JzoKCQkJY2FzZSAnZWJjZGljY3Bkayc6CgkJCWNhc2UgJ2ViY2RpY2Nwbm8nOgoJCQljYXNlICdpYm0yNzcnOgoJCQkJcmV0dXJuICdJQk0yNzcnOwoKCQkJY2FzZSAnY3AyNzgnOgoJCQljYXNlICdjc2libTI3OCc6CgkJCWNhc2UgJ2ViY2RpY2NwZmknOgoJCQljYXNlICdlYmNkaWNjcHNlJzoKCQkJY2FzZSAnaWJtMjc4JzoKCQkJCXJldHVybiAnSUJNMjc4JzsKCgkJCWNhc2UgJ2NwMjgwJzoKCQkJY2FzZSAnY3NpYm0yODAnOgoJCQljYXNlICdlYmNkaWNjcGl0JzoKCQkJY2FzZSAnaWJtMjgwJzoKCQkJCXJldHVybiAnSUJNMjgwJzsKCgkJCWNhc2UgJ2NwMjgxJzoKCQkJY2FzZSAnY3NpYm0yODEnOgoJCQljYXNlICdlYmNkaWNqcGUnOgoJCQljYXNlICdpYm0yODEnOgoJCQkJcmV0dXJuICdJQk0yODEnOwoKCQkJY2FzZSAnY3AyODQnOgoJCQljYXNlICdjc2libTI4NCc6CgkJCWNhc2UgJ2ViY2RpY2NwZXMnOgoJCQljYXNlICdpYm0yODQnOgoJCQkJcmV0dXJuICdJQk0yODQnOwoKCQkJY2FzZSAnY3AyODUnOgoJCQljYXNlICdjc2libTI4NSc6CgkJCWNhc2UgJ2ViY2RpY2NwZ2InOgoJCQljYXNlICdpYm0yODUnOgoJCQkJcmV0dXJuICdJQk0yODUnOwoKCQkJY2FzZSAnY3AyOTAnOgoJCQljYXNlICdjc2libTI5MCc6CgkJCWNhc2UgJ2ViY2RpY2pwa2FuYSc6CgkJCWNhc2UgJ2libTI5MCc6CgkJCQlyZXR1cm4gJ0lCTTI5MCc7CgoJCQljYXNlICdjcDI5Nyc6CgkJCWNhc2UgJ2NzaWJtMjk3JzoKCQkJY2FzZSAnZWJjZGljY3Bmcic6CgkJCWNhc2UgJ2libTI5Nyc6CgkJCQlyZXR1cm4gJ0lCTTI5Nyc7CgoJCQljYXNlICdjcDQyMCc6CgkJCWNhc2UgJ2NzaWJtNDIwJzoKCQkJY2FzZSAnZWJjZGljY3BhcjEnOgoJCQljYXNlICdpYm00MjAnOgoJCQkJcmV0dXJuICdJQk00MjAnOwoKCQkJY2FzZSAnY3A0MjMnOgoJCQljYXNlICdjc2libTQyMyc6CgkJCWNhc2UgJ2ViY2RpY2NwZ3InOgoJCQljYXNlICdpYm00MjMnOgoJCQkJcmV0dXJuICdJQk00MjMnOwoKCQkJY2FzZSAnY3A0MjQnOgoJCQljYXNlICdjc2libTQyNCc6CgkJCWNhc2UgJ2ViY2RpY2NwaGUnOgoJCQljYXNlICdpYm00MjQnOgoJCQkJcmV0dXJuICdJQk00MjQnOwoKCQkJY2FzZSAnNDM3JzoKCQkJY2FzZSAnY3A0MzcnOgoJCQljYXNlICdjc3BjOGNvZGVwYWdlNDM3JzoKCQkJY2FzZSAnaWJtNDM3JzoKCQkJCXJldHVybiAnSUJNNDM3JzsKCgkJCWNhc2UgJ2NwNTAwJzoKCQkJY2FzZSAnY3NpYm01MDAnOgoJCQljYXNlICdlYmNkaWNjcGJlJzoKCQkJY2FzZSAnZWJjZGljY3BjaCc6CgkJCWNhc2UgJ2libTUwMCc6CgkJCQlyZXR1cm4gJ0lCTTUwMCc7CgoJCQljYXNlICdjcDc3NSc6CgkJCWNhc2UgJ2NzcGM3NzViYWx0aWMnOgoJCQljYXNlICdpYm03NzUnOgoJCQkJcmV0dXJuICdJQk03NzUnOwoKCQkJY2FzZSAnODUwJzoKCQkJY2FzZSAnY3A4NTAnOgoJCQljYXNlICdjc3BjODUwbXVsdGlsaW5ndWFsJzoKCQkJY2FzZSAnaWJtODUwJzoKCQkJCXJldHVybiAnSUJNODUwJzsKCgkJCWNhc2UgJzg1MSc6CgkJCWNhc2UgJ2NwODUxJzoKCQkJY2FzZSAnY3NpYm04NTEnOgoJCQljYXNlICdpYm04NTEnOgoJCQkJcmV0dXJuICdJQk04NTEnOwoKCQkJY2FzZSAnODUyJzoKCQkJY2FzZSAnY3A4NTInOgoJCQljYXNlICdjc3BjcDg1Mic6CgkJCWNhc2UgJ2libTg1Mic6CgkJCQlyZXR1cm4gJ0lCTTg1Mic7CgoJCQljYXNlICc4NTUnOgoJCQljYXNlICdjcDg1NSc6CgkJCWNhc2UgJ2NzaWJtODU1JzoKCQkJY2FzZSAnaWJtODU1JzoKCQkJCXJldHVybiAnSUJNODU1JzsKCgkJCWNhc2UgJzg1Nyc6CgkJCWNhc2UgJ2NwODU3JzoKCQkJY2FzZSAnY3NpYm04NTcnOgoJCQljYXNlICdpYm04NTcnOgoJCQkJcmV0dXJuICdJQk04NTcnOwoKCQkJY2FzZSAnY2NzaWQ4NTgnOgoJCQljYXNlICdjcDg1OCc6CgkJCWNhc2UgJ2libTg1OCc6CgkJCWNhc2UgJ3BjbXVsdGlsaW5ndWFsODUwZXVybyc6CgkJCQlyZXR1cm4gJ0lCTTAwODU4JzsKCgkJCWNhc2UgJzg2MCc6CgkJCWNhc2UgJ2NwODYwJzoKCQkJY2FzZSAnY3NpYm04NjAnOgoJCQljYXNlICdpYm04NjAnOgoJCQkJcmV0dXJuICdJQk04NjAnOwoKCQkJY2FzZSAnODYxJzoKCQkJY2FzZSAnY3A4NjEnOgoJCQljYXNlICdjcGlzJzoKCQkJY2FzZSAnY3NpYm04NjEnOgoJCQljYXNlICdpYm04NjEnOgoJCQkJcmV0dXJuICdJQk04NjEnOwoKCQkJY2FzZSAnODYyJzoKCQkJY2FzZSAnY3A4NjInOgoJCQljYXNlICdjc3BjODYybGF0aW5oZWJyZXcnOgoJCQljYXNlICdpYm04NjInOgoJCQkJcmV0dXJuICdJQk04NjInOwoKCQkJY2FzZSAnODYzJzoKCQkJY2FzZSAnY3A4NjMnOgoJCQljYXNlICdjc2libTg2Myc6CgkJCWNhc2UgJ2libTg2Myc6CgkJCQlyZXR1cm4gJ0lCTTg2Myc7CgoJCQljYXNlICdjcDg2NCc6CgkJCWNhc2UgJ2NzaWJtODY0JzoKCQkJY2FzZSAnaWJtODY0JzoKCQkJCXJldHVybiAnSUJNODY0JzsKCgkJCWNhc2UgJzg2NSc6CgkJCWNhc2UgJ2NwODY1JzoKCQkJY2FzZSAnY3NpYm04NjUnOgoJCQljYXNlICdpYm04NjUnOgoJCQkJcmV0dXJuICdJQk04NjUnOwoKCQkJY2FzZSAnODY2JzoKCQkJY2FzZSAnY3A4NjYnOgoJCQljYXNlICdjc2libTg2Nic6CgkJCWNhc2UgJ2libTg2Nic6CgkJCQlyZXR1cm4gJ0lCTTg2Nic7CgoJCQljYXNlICdjcDg2OCc6CgkJCWNhc2UgJ2NwYXInOgoJCQljYXNlICdjc2libTg2OCc6CgkJCWNhc2UgJ2libTg2OCc6CgkJCQlyZXR1cm4gJ0lCTTg2OCc7CgoJCQljYXNlICc4NjknOgoJCQljYXNlICdjcDg2OSc6CgkJCWNhc2UgJ2NwZ3InOgoJCQljYXNlICdjc2libTg2OSc6CgkJCWNhc2UgJ2libTg2OSc6CgkJCQlyZXR1cm4gJ0lCTTg2OSc7CgoJCQljYXNlICdjcDg3MCc6CgkJCWNhc2UgJ2NzaWJtODcwJzoKCQkJY2FzZSAnZWJjZGljY3Byb2VjZSc6CgkJCWNhc2UgJ2ViY2RpY2NweXUnOgoJCQljYXNlICdpYm04NzAnOgoJCQkJcmV0dXJuICdJQk04NzAnOwoKCQkJY2FzZSAnY3A4NzEnOgoJCQljYXNlICdjc2libTg3MSc6CgkJCWNhc2UgJ2ViY2RpY2NwaXMnOgoJCQljYXNlICdpYm04NzEnOgoJCQkJcmV0dXJuICdJQk04NzEnOwoKCQkJY2FzZSAnY3A4ODAnOgoJCQljYXNlICdjc2libTg4MCc6CgkJCWNhc2UgJ2ViY2RpY2N5cmlsbGljJzoKCQkJY2FzZSAnaWJtODgwJzoKCQkJCXJldHVybiAnSUJNODgwJzsKCgkJCWNhc2UgJ2NwODkxJzoKCQkJY2FzZSAnY3NpYm04OTEnOgoJCQljYXNlICdpYm04OTEnOgoJCQkJcmV0dXJuICdJQk04OTEnOwoKCQkJY2FzZSAnY3A5MDMnOgoJCQljYXNlICdjc2libTkwMyc6CgkJCWNhc2UgJ2libTkwMyc6CgkJCQlyZXR1cm4gJ0lCTTkwMyc7CgoJCQljYXNlICc5MDQnOgoJCQljYXNlICdjcDkwNCc6CgkJCWNhc2UgJ2NzaWJibTkwNCc6CgkJCWNhc2UgJ2libTkwNCc6CgkJCQlyZXR1cm4gJ0lCTTkwNCc7CgoJCQljYXNlICdjcDkwNSc6CgkJCWNhc2UgJ2NzaWJtOTA1JzoKCQkJY2FzZSAnZWJjZGljY3B0cic6CgkJCWNhc2UgJ2libTkwNSc6CgkJCQlyZXR1cm4gJ0lCTTkwNSc7CgoJCQljYXNlICdjcDkxOCc6CgkJCWNhc2UgJ2NzaWJtOTE4JzoKCQkJY2FzZSAnZWJjZGljY3BhcjInOgoJCQljYXNlICdpYm05MTgnOgoJCQkJcmV0dXJuICdJQk05MTgnOwoKCQkJY2FzZSAnY2NzaWQ5MjQnOgoJCQljYXNlICdjcDkyNCc6CgkJCWNhc2UgJ2ViY2RpY2xhdGluOWV1cm8nOgoJCQljYXNlICdpYm05MjQnOgoJCQkJcmV0dXJuICdJQk0wMDkyNCc7CgoJCQljYXNlICdjcDEwMjYnOgoJCQljYXNlICdjc2libTEwMjYnOgoJCQljYXNlICdpYm0xMDI2JzoKCQkJCXJldHVybiAnSUJNMTAyNic7CgoJCQljYXNlICdpYm0xMDQ3JzoKCQkJCXJldHVybiAnSUJNMTA0Nyc7CgoJCQljYXNlICdjY3NpZDExNDAnOgoJCQljYXNlICdjcDExNDAnOgoJCQljYXNlICdlYmNkaWN1czM3ZXVybyc6CgkJCWNhc2UgJ2libTExNDAnOgoJCQkJcmV0dXJuICdJQk0wMTE0MCc7CgoJCQljYXNlICdjY3NpZDExNDEnOgoJCQljYXNlICdjcDExNDEnOgoJCQljYXNlICdlYmNkaWNkZTI3M2V1cm8nOgoJCQljYXNlICdpYm0xMTQxJzoKCQkJCXJldHVybiAnSUJNMDExNDEnOwoKCQkJY2FzZSAnY2NzaWQxMTQyJzoKCQkJY2FzZSAnY3AxMTQyJzoKCQkJY2FzZSAnZWJjZGljZGsyNzdldXJvJzoKCQkJY2FzZSAnZWJjZGljbm8yNzdldXJvJzoKCQkJY2FzZSAnaWJtMTE0Mic6CgkJCQlyZXR1cm4gJ0lCTTAxMTQyJzsKCgkJCWNhc2UgJ2Njc2lkMTE0Myc6CgkJCWNhc2UgJ2NwMTE0Myc6CgkJCWNhc2UgJ2ViY2RpY2ZpMjc4ZXVybyc6CgkJCWNhc2UgJ2ViY2RpY3NlMjc4ZXVybyc6CgkJCWNhc2UgJ2libTExNDMnOgoJCQkJcmV0dXJuICdJQk0wMTE0Myc7CgoJCQljYXNlICdjY3NpZDExNDQnOgoJCQljYXNlICdjcDExNDQnOgoJCQljYXNlICdlYmNkaWNpdDI4MGV1cm8nOgoJCQljYXNlICdpYm0xMTQ0JzoKCQkJCXJldHVybiAnSUJNMDExNDQnOwoKCQkJY2FzZSAnY2NzaWQxMTQ1JzoKCQkJY2FzZSAnY3AxMTQ1JzoKCQkJY2FzZSAnZWJjZGljZXMyODRldXJvJzoKCQkJY2FzZSAnaWJtMTE0NSc6CgkJCQlyZXR1cm4gJ0lCTTAxMTQ1JzsKCgkJCWNhc2UgJ2Njc2lkMTE0Nic6CgkJCWNhc2UgJ2NwMTE0Nic6CgkJCWNhc2UgJ2ViY2RpY2diMjg1ZXVybyc6CgkJCWNhc2UgJ2libTExNDYnOgoJCQkJcmV0dXJuICdJQk0wMTE0Nic7CgoJCQljYXNlICdjY3NpZDExNDcnOgoJCQljYXNlICdjcDExNDcnOgoJCQljYXNlICdlYmNkaWNmcjI5N2V1cm8nOgoJCQljYXNlICdpYm0xMTQ3JzoKCQkJCXJldHVybiAnSUJNMDExNDcnOwoKCQkJY2FzZSAnY2NzaWQxMTQ4JzoKCQkJY2FzZSAnY3AxMTQ4JzoKCQkJY2FzZSAnZWJjZGljaW50ZXJuYXRpb25hbDUwMGV1cm8nOgoJCQljYXNlICdpYm0xMTQ4JzoKCQkJCXJldHVybiAnSUJNMDExNDgnOwoKCQkJY2FzZSAnY2NzaWQxMTQ5JzoKCQkJY2FzZSAnY3AxMTQ5JzoKCQkJY2FzZSAnZWJjZGljaXM4NzFldXJvJzoKCQkJY2FzZSAnaWJtMTE0OSc6CgkJCQlyZXR1cm4gJ0lCTTAxMTQ5JzsKCgkJCWNhc2UgJ2NzaXNvMTQzaWVjcDI3MSc6CgkJCWNhc2UgJ2llY3AyNzEnOgoJCQljYXNlICdpc29pcjE0Myc6CgkJCQlyZXR1cm4gJ0lFQ19QMjctMSc7CgoJCQljYXNlICdjc2lzbzQ5aW5pcyc6CgkJCWNhc2UgJ2luaXMnOgoJCQljYXNlICdpc29pcjQ5JzoKCQkJCXJldHVybiAnSU5JUyc7CgoJCQljYXNlICdjc2lzbzUwaW5pczgnOgoJCQljYXNlICdpbmlzOCc6CgkJCWNhc2UgJ2lzb2lyNTAnOgoJCQkJcmV0dXJuICdJTklTLTgnOwoKCQkJY2FzZSAnY3Npc281MWluaXNjeXJpbGxpYyc6CgkJCWNhc2UgJ2luaXNjeXJpbGxpYyc6CgkJCWNhc2UgJ2lzb2lyNTEnOgoJCQkJcmV0dXJuICdJTklTLWN5cmlsbGljJzsKCgkJCWNhc2UgJ2NzaW52YXJpYW50JzoKCQkJY2FzZSAnaW52YXJpYW50JzoKCQkJCXJldHVybiAnSU5WQVJJQU5UJzsKCgkJCWNhc2UgJ2lzbzIwMjJjbic6CgkJCQlyZXR1cm4gJ0lTTy0yMDIyLUNOJzsKCgkJCWNhc2UgJ2lzbzIwMjJjbmV4dCc6CgkJCQlyZXR1cm4gJ0lTTy0yMDIyLUNOLUVYVCc7CgoJCQljYXNlICdjc2lzbzIwMjJqcCc6CgkJCWNhc2UgJ2lzbzIwMjJqcCc6CgkJCQlyZXR1cm4gJ0lTTy0yMDIyLUpQJzsKCgkJCWNhc2UgJ2NzaXNvMjAyMmpwMic6CgkJCWNhc2UgJ2lzbzIwMjJqcDInOgoJCQkJcmV0dXJuICdJU08tMjAyMi1KUC0yJzsKCgkJCWNhc2UgJ2NzaXNvMjAyMmtyJzoKCQkJY2FzZSAnaXNvMjAyMmtyJzoKCQkJCXJldHVybiAnSVNPLTIwMjItS1InOwoKCQkJY2FzZSAnY3N3aW5kb3dzMzBsYXRpbjEnOgoJCQljYXNlICdpc284ODU5MXdpbmRvd3MzMGxhdGluMSc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTEtV2luZG93cy0zLjAtTGF0aW4tMSc7CgoJCQljYXNlICdjc3dpbmRvd3MzMWxhdGluMSc6CgkJCWNhc2UgJ2lzbzg4NTkxd2luZG93czMxbGF0aW4xJzoKCQkJCXJldHVybiAnSVNPLTg4NTktMS1XaW5kb3dzLTMuMS1MYXRpbi0xJzsKCgkJCWNhc2UgJ2NzaXNvbGF0aW4yJzoKCQkJY2FzZSAnaXNvODg1OTInOgoJCQljYXNlICdpc284ODU5MjE5ODcnOgoJCQljYXNlICdpc29pcjEwMSc6CgkJCWNhc2UgJ2wyJzoKCQkJY2FzZSAnbGF0aW4yJzoKCQkJCXJldHVybiAnSVNPLTg4NTktMic7CgoJCQljYXNlICdjc3dpbmRvd3MzMWxhdGluMic6CgkJCWNhc2UgJ2lzbzg4NTkyd2luZG93c2xhdGluMic6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTItV2luZG93cy1MYXRpbi0yJzsKCgkJCWNhc2UgJ2NzaXNvbGF0aW4zJzoKCQkJY2FzZSAnaXNvODg1OTMnOgoJCQljYXNlICdpc284ODU5MzE5ODgnOgoJCQljYXNlICdpc29pcjEwOSc6CgkJCWNhc2UgJ2wzJzoKCQkJY2FzZSAnbGF0aW4zJzoKCQkJCXJldHVybiAnSVNPLTg4NTktMyc7CgoJCQljYXNlICdjc2lzb2xhdGluNCc6CgkJCWNhc2UgJ2lzbzg4NTk0JzoKCQkJY2FzZSAnaXNvODg1OTQxOTg4JzoKCQkJY2FzZSAnaXNvaXIxMTAnOgoJCQljYXNlICdsNCc6CgkJCWNhc2UgJ2xhdGluNCc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTQnOwoKCQkJY2FzZSAnY3Npc29sYXRpbmN5cmlsbGljJzoKCQkJY2FzZSAnY3lyaWxsaWMnOgoJCQljYXNlICdpc284ODU5NSc6CgkJCWNhc2UgJ2lzbzg4NTk1MTk4OCc6CgkJCWNhc2UgJ2lzb2lyMTQ0JzoKCQkJCXJldHVybiAnSVNPLTg4NTktNSc7CgoJCQljYXNlICdhcmFiaWMnOgoJCQljYXNlICdhc21vNzA4JzoKCQkJY2FzZSAnY3Npc29sYXRpbmFyYWJpYyc6CgkJCWNhc2UgJ2VjbWExMTQnOgoJCQljYXNlICdpc284ODU5Nic6CgkJCWNhc2UgJ2lzbzg4NTk2MTk4Nyc6CgkJCWNhc2UgJ2lzb2lyMTI3JzoKCQkJCXJldHVybiAnSVNPLTg4NTktNic7CgoJCQljYXNlICdjc2lzbzg4NTk2ZSc6CgkJCWNhc2UgJ2lzbzg4NTk2ZSc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTYtRSc7CgoJCQljYXNlICdjc2lzbzg4NTk2aSc6CgkJCWNhc2UgJ2lzbzg4NTk2aSc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTYtSSc7CgoJCQljYXNlICdjc2lzb2xhdGluZ3JlZWsnOgoJCQljYXNlICdlY21hMTE4JzoKCQkJY2FzZSAnZWxvdDkyOCc6CgkJCWNhc2UgJ2dyZWVrJzoKCQkJY2FzZSAnZ3JlZWs4JzoKCQkJY2FzZSAnaXNvODg1OTcnOgoJCQljYXNlICdpc284ODU5NzE5ODcnOgoJCQljYXNlICdpc29pcjEyNic6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTcnOwoKCQkJY2FzZSAnY3Npc29sYXRpbmhlYnJldyc6CgkJCWNhc2UgJ2hlYnJldyc6CgkJCWNhc2UgJ2lzbzg4NTk4JzoKCQkJY2FzZSAnaXNvODg1OTgxOTg4JzoKCQkJY2FzZSAnaXNvaXIxMzgnOgoJCQkJcmV0dXJuICdJU08tODg1OS04JzsKCgkJCWNhc2UgJ2NzaXNvODg1OThlJzoKCQkJY2FzZSAnaXNvODg1OThlJzoKCQkJCXJldHVybiAnSVNPLTg4NTktOC1FJzsKCgkJCWNhc2UgJ2NzaXNvODg1OThpJzoKCQkJY2FzZSAnaXNvODg1OThpJzoKCQkJCXJldHVybiAnSVNPLTg4NTktOC1JJzsKCgkJCWNhc2UgJ2Nzd2luZG93czMxbGF0aW41JzoKCQkJY2FzZSAnaXNvODg1OTl3aW5kb3dzbGF0aW41JzoKCQkJCXJldHVybiAnSVNPLTg4NTktOS1XaW5kb3dzLUxhdGluLTUnOwoKCQkJY2FzZSAnY3Npc29sYXRpbjYnOgoJCQljYXNlICdpc284ODU5MTAnOgoJCQljYXNlICdpc284ODU5MTAxOTkyJzoKCQkJY2FzZSAnaXNvaXIxNTcnOgoJCQljYXNlICdsNic6CgkJCWNhc2UgJ2xhdGluNic6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTEwJzsKCgkJCWNhc2UgJ2lzbzg4NTkxMyc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTEzJzsKCgkJCWNhc2UgJ2lzbzg4NTkxNCc6CgkJCWNhc2UgJ2lzbzg4NTkxNDE5OTgnOgoJCQljYXNlICdpc29jZWx0aWMnOgoJCQljYXNlICdpc29pcjE5OSc6CgkJCWNhc2UgJ2w4JzoKCQkJY2FzZSAnbGF0aW44JzoKCQkJCXJldHVybiAnSVNPLTg4NTktMTQnOwoKCQkJY2FzZSAnaXNvODg1OTE1JzoKCQkJY2FzZSAnbGF0aW45JzoKCQkJCXJldHVybiAnSVNPLTg4NTktMTUnOwoKCQkJY2FzZSAnaXNvODg1OTE2JzoKCQkJY2FzZSAnaXNvODg1OTE2MjAwMSc6CgkJCWNhc2UgJ2lzb2lyMjI2JzoKCQkJY2FzZSAnbDEwJzoKCQkJY2FzZSAnbGF0aW4xMCc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTE2JzsKCgkJCWNhc2UgJ2lzbzEwNjQ2ajEnOgoJCQkJcmV0dXJuICdJU08tMTA2NDYtSi0xJzsKCgkJCWNhc2UgJ2NzdW5pY29kZSc6CgkJCWNhc2UgJ2lzbzEwNjQ2dWNzMic6CgkJCQlyZXR1cm4gJ0lTTy0xMDY0Ni1VQ1MtMic7CgoJCQljYXNlICdjc3VjczQnOgoJCQljYXNlICdpc28xMDY0NnVjczQnOgoJCQkJcmV0dXJuICdJU08tMTA2NDYtVUNTLTQnOwoKCQkJY2FzZSAnY3N1bmljb2RlYXNjaWknOgoJCQljYXNlICdpc28xMDY0NnVjc2Jhc2ljJzoKCQkJCXJldHVybiAnSVNPLTEwNjQ2LVVDUy1CYXNpYyc7CgoJCQljYXNlICdjc3VuaWNvZGVsYXRpbjEnOgoJCQljYXNlICdpc28xMDY0Nic6CgkJCWNhc2UgJ2lzbzEwNjQ2dW5pY29kZWxhdGluMSc6CgkJCQlyZXR1cm4gJ0lTTy0xMDY0Ni1Vbmljb2RlLUxhdGluMSc7CgoJCQljYXNlICdjc2lzbzEwNjQ2dXRmMSc6CgkJCWNhc2UgJ2lzbzEwNjQ2dXRmMSc6CgkJCQlyZXR1cm4gJ0lTTy0xMDY0Ni1VVEYtMSc7CgoJCQljYXNlICdjc2lzbzExNTQ4MSc6CgkJCWNhc2UgJ2lzbzExNTQ4MSc6CgkJCWNhc2UgJ2lzb3RyMTE1NDgxJzoKCQkJCXJldHVybiAnSVNPLTExNTQ4LTEnOwoKCQkJY2FzZSAnY3Npc285MCc6CgkJCWNhc2UgJ2lzb2lyOTAnOgoJCQkJcmV0dXJuICdpc28taXItOTAnOwoKCQkJY2FzZSAnY3N1bmljb2RlaWJtMTI2MSc6CgkJCWNhc2UgJ2lzb3VuaWNvZGVpYm0xMjYxJzoKCQkJCXJldHVybiAnSVNPLVVuaWNvZGUtSUJNLTEyNjEnOwoKCQkJY2FzZSAnY3N1bmljb2RlaWJtMTI2NCc6CgkJCWNhc2UgJ2lzb3VuaWNvZGVpYm0xMjY0JzoKCQkJCXJldHVybiAnSVNPLVVuaWNvZGUtSUJNLTEyNjQnOwoKCQkJY2FzZSAnY3N1bmljb2RlaWJtMTI2NSc6CgkJCWNhc2UgJ2lzb3VuaWNvZGVpYm0xMjY1JzoKCQkJCXJldHVybiAnSVNPLVVuaWNvZGUtSUJNLTEyNjUnOwoKCQkJY2FzZSAnY3N1bmljb2RlaWJtMTI2OCc6CgkJCWNhc2UgJ2lzb3VuaWNvZGVpYm0xMjY4JzoKCQkJCXJldHVybiAnSVNPLVVuaWNvZGUtSUJNLTEyNjgnOwoKCQkJY2FzZSAnY3N1bmljb2RlaWJtMTI3Nic6CgkJCWNhc2UgJ2lzb3VuaWNvZGVpYm0xMjc2JzoKCQkJCXJldHVybiAnSVNPLVVuaWNvZGUtSUJNLTEyNzYnOwoKCQkJY2FzZSAnY3Npc282NDZiYXNpYzE5ODMnOgoJCQljYXNlICdpc282NDZiYXNpYzE5ODMnOgoJCQljYXNlICdyZWYnOgoJCQkJcmV0dXJuICdJU09fNjQ2LmJhc2ljOjE5ODMnOwoKCQkJY2FzZSAnY3Npc28yaW50bHJlZnZlcnNpb24nOgoJCQljYXNlICdpcnYnOgoJCQljYXNlICdpc282NDZpcnYxOTgzJzoKCQkJY2FzZSAnaXNvaXIyJzoKCQkJCXJldHVybiAnSVNPXzY0Ni5pcnY6MTk4Myc7CgoJCQljYXNlICdjc2lzbzIwMzMnOgoJCQljYXNlICdlMTNiJzoKCQkJY2FzZSAnaXNvMjAzMzE5ODMnOgoJCQljYXNlICdpc29pcjk4JzoKCQkJCXJldHVybiAnSVNPXzIwMzMtMTk4Myc7CgoJCQljYXNlICdjc2lzbzU0MjdjeXJpbGxpYyc6CgkJCWNhc2UgJ2lzbzU0MjcnOgoJCQljYXNlICdpc29pcjM3JzoKCQkJCXJldHVybiAnSVNPXzU0MjcnOwoKCQkJY2FzZSAnaXNvNTQyN2N5cmlsbGljMTk4MSc6CgkJCWNhc2UgJ2lzbzU0MjcxOTgxJzoKCQkJY2FzZSAnaXNvaXI1NCc6CgkJCQlyZXR1cm4gJ0lTT181NDI3OjE5ODEnOwoKCQkJY2FzZSAnY3Npc281NDI4Z3JlZWsnOgoJCQljYXNlICdpc281NDI4MTk4MCc6CgkJCWNhc2UgJ2lzb2lyNTUnOgoJCQkJcmV0dXJuICdJU09fNTQyODoxOTgwJzsKCgkJCWNhc2UgJ2NzaXNvNjkzN2FkZCc6CgkJCWNhc2UgJ2lzbzY5MzcyMjUnOgoJCQljYXNlICdpc29pcjE1Mic6CgkJCQlyZXR1cm4gJ0lTT182OTM3LTItMjUnOwoKCQkJY2FzZSAnY3Npc290ZXh0Y29tbSc6CgkJCWNhc2UgJ2lzbzY5MzcyYWRkJzoKCQkJY2FzZSAnaXNvaXIxNDInOgoJCQkJcmV0dXJuICdJU09fNjkzNy0yLWFkZCc7CgoJCQljYXNlICdjc2lzbzg4NTlzdXBwJzoKCQkJY2FzZSAnaXNvODg1OXN1cHAnOgoJCQljYXNlICdpc29pcjE1NCc6CgkJCWNhc2UgJ2xhdGluMTI1JzoKCQkJCXJldHVybiAnSVNPXzg4NTktc3VwcCc7CgoJCQljYXNlICdjc2lzbzEwMzY3Ym94JzoKCQkJY2FzZSAnaXNvMTAzNjdib3gnOgoJCQljYXNlICdpc29pcjE1NSc6CgkJCQlyZXR1cm4gJ0lTT18xMDM2Ny1ib3gnOwoKCQkJY2FzZSAnY3Npc28xNWl0YWxpYW4nOgoJCQljYXNlICdpc282NDZpdCc6CgkJCWNhc2UgJ2lzb2lyMTUnOgoJCQljYXNlICdpdCc6CgkJCQlyZXR1cm4gJ0lUJzsKCgkJCWNhc2UgJ2NzaXNvMTNqaXNjNjIyMGpwJzoKCQkJY2FzZSAnaXNvaXIxMyc6CgkJCWNhc2UgJ2ppc2M2MjIwMTk2OSc6CgkJCWNhc2UgJ2ppc2M2MjIwMTk2OWpwJzoKCQkJY2FzZSAna2F0YWthbmEnOgoJCQljYXNlICd4MjAxNyc6CgkJCQlyZXR1cm4gJ0pJU19DNjIyMC0xOTY5LWpwJzsKCgkJCWNhc2UgJ2NzaXNvMTRqaXNjNjIyMHJvJzoKCQkJY2FzZSAnaXNvNjQ2anAnOgoJCQljYXNlICdpc29pcjE0JzoKCQkJY2FzZSAnamlzYzYyMjAxOTY5cm8nOgoJCQljYXNlICdqcCc6CgkJCQlyZXR1cm4gJ0pJU19DNjIyMC0xOTY5LXJvJzsKCgkJCWNhc2UgJ2NzaXNvNDJqaXNjNjIyNjE5NzgnOgoJCQljYXNlICdpc29pcjQyJzoKCQkJY2FzZSAnamlzYzYyMjYxOTc4JzoKCQkJCXJldHVybiAnSklTX0M2MjI2LTE5NzgnOwoKCQkJY2FzZSAnY3Npc284N2ppc3gyMDgnOgoJCQljYXNlICdpc29pcjg3JzoKCQkJY2FzZSAnamlzYzYyMjYxOTgzJzoKCQkJY2FzZSAnamlzeDIwODE5ODMnOgoJCQljYXNlICd4MjA4JzoKCQkJCXJldHVybiAnSklTX0M2MjI2LTE5ODMnOwoKCQkJY2FzZSAnY3Npc285MWppc2M2MjI5MTk4NGEnOgoJCQljYXNlICdpc29pcjkxJzoKCQkJY2FzZSAnamlzYzYyMjkxOTg0YSc6CgkJCWNhc2UgJ2pwb2NyYSc6CgkJCQlyZXR1cm4gJ0pJU19DNjIyOS0xOTg0LWEnOwoKCQkJY2FzZSAnY3Npc285Mmppc2M2Mjk5MTk4NGInOgoJCQljYXNlICdpc282NDZqcG9jcmInOgoJCQljYXNlICdpc29pcjkyJzoKCQkJY2FzZSAnamlzYzYyMjkxOTg0Yic6CgkJCWNhc2UgJ2pwb2NyYic6CgkJCQlyZXR1cm4gJ0pJU19DNjIyOS0xOTg0LWInOwoKCQkJY2FzZSAnY3Npc285M2ppczYyMjkxOTg0YmFkZCc6CgkJCWNhc2UgJ2lzb2lyOTMnOgoJCQljYXNlICdqaXNjNjIyOTE5ODRiYWRkJzoKCQkJY2FzZSAnanBvY3JiYWRkJzoKCQkJCXJldHVybiAnSklTX0M2MjI5LTE5ODQtYi1hZGQnOwoKCQkJY2FzZSAnY3Npc285NGppczYyMjkxOTg0aGFuZCc6CgkJCWNhc2UgJ2lzb2lyOTQnOgoJCQljYXNlICdqaXNjNjIyOTE5ODRoYW5kJzoKCQkJY2FzZSAnanBvY3JoYW5kJzoKCQkJCXJldHVybiAnSklTX0M2MjI5LTE5ODQtaGFuZCc7CgoJCQljYXNlICdjc2lzbzk1amlzNjIyOTE5ODRoYW5kYWRkJzoKCQkJY2FzZSAnaXNvaXI5NSc6CgkJCWNhc2UgJ2ppc2M2MjI5MTk4NGhhbmRhZGQnOgoJCQljYXNlICdqcG9jcmhhbmRhZGQnOgoJCQkJcmV0dXJuICdKSVNfQzYyMjktMTk4NC1oYW5kLWFkZCc7CgoJCQljYXNlICdjc2lzbzk2amlzYzYyMjkxOTg0a2FuYSc6CgkJCWNhc2UgJ2lzb2lyOTYnOgoJCQljYXNlICdqaXNjNjIyOTE5ODRrYW5hJzoKCQkJCXJldHVybiAnSklTX0M2MjI5LTE5ODQta2FuYSc7CgoJCQljYXNlICdjc2ppc2VuY29kaW5nJzoKCQkJY2FzZSAnamlzZW5jb2RpbmcnOgoJCQkJcmV0dXJuICdKSVNfRW5jb2RpbmcnOwoKCQkJY2FzZSAnY3NoYWxmd2lkdGhrYXRha2FuYSc6CgkJCWNhc2UgJ2ppc3gyMDEnOgoJCQljYXNlICd4MjAxJzoKCQkJCXJldHVybiAnSklTX1gwMjAxJzsKCgkJCWNhc2UgJ2NzaXNvMTU5amlzeDIxMjE5OTAnOgoJCQljYXNlICdpc29pcjE1OSc6CgkJCWNhc2UgJ2ppc3gyMTIxOTkwJzoKCQkJY2FzZSAneDIxMic6CgkJCQlyZXR1cm4gJ0pJU19YMDIxMi0xOTkwJzsKCgkJCWNhc2UgJ2NzaXNvMTQxanVzaWIxMDAyJzoKCQkJY2FzZSAnaXNvNjQ2eXUnOgoJCQljYXNlICdpc29pcjE0MSc6CgkJCWNhc2UgJ2pzJzoKCQkJY2FzZSAnanVzaWIxMDAyJzoKCQkJY2FzZSAneXUnOgoJCQkJcmV0dXJuICdKVVNfSS5CMS4wMDInOwoKCQkJY2FzZSAnY3Npc28xNDdtYWNlZG9uaWFuJzoKCQkJY2FzZSAnaXNvaXIxNDcnOgoJCQljYXNlICdqdXNpYjEwMDNtYWMnOgoJCQljYXNlICdtYWNlZG9uaWFuJzoKCQkJCXJldHVybiAnSlVTX0kuQjEuMDAzLW1hYyc7CgoJCQljYXNlICdjc2lzbzE0NnNlcmJpYW4nOgoJCQljYXNlICdpc29pcjE0Nic6CgkJCWNhc2UgJ2p1c2liMTAwM3NlcmInOgoJCQljYXNlICdzZXJiaWFuJzoKCQkJCXJldHVybiAnSlVTX0kuQjEuMDAzLXNlcmInOwoKCQkJY2FzZSAna29pN3N3aXRjaGVkJzoKCQkJCXJldHVybiAnS09JNy1zd2l0Y2hlZCc7CgoJCQljYXNlICdjc2tvaThyJzoKCQkJY2FzZSAna29pOHInOgoJCQkJcmV0dXJuICdLT0k4LVInOwoKCQkJY2FzZSAna29pOHUnOgoJCQkJcmV0dXJuICdLT0k4LVUnOwoKCQkJY2FzZSAnY3Nrc2M1NjM2JzoKCQkJY2FzZSAnaXNvNjQ2a3InOgoJCQljYXNlICdrc2M1NjM2JzoKCQkJCXJldHVybiAnS1NDNTYzNic7CgoJCQljYXNlICdjc2t6MTA0OCc6CgkJCWNhc2UgJ2t6MTA0OCc6CgkJCWNhc2UgJ3JrMTA0OCc6CgkJCWNhc2UgJ3N0cmsxMDQ4MjAwMic6CgkJCQlyZXR1cm4gJ0taLTEwNDgnOwoKCQkJY2FzZSAnY3Npc28xOWxhdGluZ3JlZWsnOgoJCQljYXNlICdpc29pcjE5JzoKCQkJY2FzZSAnbGF0aW5ncmVlayc6CgkJCQlyZXR1cm4gJ2xhdGluLWdyZWVrJzsKCgkJCWNhc2UgJ2NzaXNvMjdsYXRpbmdyZWVrMSc6CgkJCWNhc2UgJ2lzb2lyMjcnOgoJCQljYXNlICdsYXRpbmdyZWVrMSc6CgkJCQlyZXR1cm4gJ0xhdGluLWdyZWVrLTEnOwoKCQkJY2FzZSAnY3Npc28xNThsYXAnOgoJCQljYXNlICdpc29pcjE1OCc6CgkJCWNhc2UgJ2xhcCc6CgkJCWNhc2UgJ2xhdGlubGFwJzoKCQkJCXJldHVybiAnbGF0aW4tbGFwJzsKCgkJCWNhc2UgJ2NzbWFjaW50b3NoJzoKCQkJY2FzZSAnbWFjJzoKCQkJY2FzZSAnbWFjaW50b3NoJzoKCQkJCXJldHVybiAnbWFjaW50b3NoJzsKCgkJCWNhc2UgJ2NzbWljcm9zb2Z0cHVibGlzaGluZyc6CgkJCWNhc2UgJ21pY3Jvc29mdHB1Ymxpc2hpbmcnOgoJCQkJcmV0dXJuICdNaWNyb3NvZnQtUHVibGlzaGluZyc7CgoJCQljYXNlICdjc21uZW0nOgoJCQljYXNlICdtbmVtJzoKCQkJCXJldHVybiAnTU5FTSc7CgoJCQljYXNlICdjc21uZW1vbmljJzoKCQkJY2FzZSAnbW5lbW9uaWMnOgoJCQkJcmV0dXJuICdNTkVNT05JQyc7CgoJCQljYXNlICdjc2lzbzg2aHVuZ2FyaWFuJzoKCQkJY2FzZSAnaHUnOgoJCQljYXNlICdpc282NDZodSc6CgkJCWNhc2UgJ2lzb2lyODYnOgoJCQljYXNlICdtc3o3Nzk1Myc6CgkJCQlyZXR1cm4gJ01TWl83Nzk1LjMnOwoKCQkJY2FzZSAnY3NuYXRzZGFubyc6CgkJCWNhc2UgJ2lzb2lyOTEnOgoJCQljYXNlICduYXRzZGFubyc6CgkJCQlyZXR1cm4gJ05BVFMtREFOTyc7CgoJCQljYXNlICdjc25hdHNkYW5vYWRkJzoKCQkJY2FzZSAnaXNvaXI5Mic6CgkJCWNhc2UgJ25hdHNkYW5vYWRkJzoKCQkJCXJldHVybiAnTkFUUy1EQU5PLUFERCc7CgoJCQljYXNlICdjc25hdHNzZWZpJzoKCQkJY2FzZSAnaXNvaXI4MSc6CgkJCWNhc2UgJ25hdHNzZWZpJzoKCQkJCXJldHVybiAnTkFUUy1TRUZJJzsKCgkJCWNhc2UgJ2NzbmF0c3NlZmlhZGQnOgoJCQljYXNlICdpc29pcjgyJzoKCQkJY2FzZSAnbmF0c3NlZmlhZGQnOgoJCQkJcmV0dXJuICdOQVRTLVNFRkktQUREJzsKCgkJCWNhc2UgJ2NzaXNvMTUxY3ViYSc6CgkJCWNhc2UgJ2N1YmEnOgoJCQljYXNlICdpc282NDZjdSc6CgkJCWNhc2UgJ2lzb2lyMTUxJzoKCQkJY2FzZSAnbmNuYzEwODEnOgoJCQkJcmV0dXJuICdOQ19OQzAwLTEwOjgxJzsKCgkJCWNhc2UgJ2NzaXNvNjlmcmVuY2gnOgoJCQljYXNlICdmcic6CgkJCWNhc2UgJ2lzbzY0NmZyJzoKCQkJY2FzZSAnaXNvaXI2OSc6CgkJCWNhc2UgJ25mejYyMDEwJzoKCQkJCXJldHVybiAnTkZfWl82Mi0wMTAnOwoKCQkJY2FzZSAnY3Npc28yNWZyZW5jaCc6CgkJCWNhc2UgJ2lzbzY0NmZyMSc6CgkJCWNhc2UgJ2lzb2lyMjUnOgoJCQljYXNlICduZno2MjAxMDE5NzMnOgoJCQkJcmV0dXJuICdORl9aXzYyLTAxMF8oMTk3MyknOwoKCQkJY2FzZSAnY3Npc282MGRhbmlzaG5vcndlZ2lhbic6CgkJCWNhc2UgJ2NzaXNvNjBub3J3ZWdpYW4xJzoKCQkJY2FzZSAnaXNvNjQ2bm8nOgoJCQljYXNlICdpc29pcjYwJzoKCQkJY2FzZSAnbm8nOgoJCQljYXNlICduczQ1NTExJzoKCQkJCXJldHVybiAnTlNfNDU1MS0xJzsKCgkJCWNhc2UgJ2NzaXNvNjFub3J3ZWdpYW4yJzoKCQkJY2FzZSAnaXNvNjQ2bm8yJzoKCQkJY2FzZSAnaXNvaXI2MSc6CgkJCWNhc2UgJ25vMic6CgkJCWNhc2UgJ25zNDU1MTInOgoJCQkJcmV0dXJuICdOU180NTUxLTInOwoKCQkJY2FzZSAnb3NkZWJjZGljZGYzaXJ2JzoKCQkJCXJldHVybiAnT1NEX0VCQ0RJQ19ERjAzX0lSVic7CgoJCQljYXNlICdvc2RlYmNkaWNkZjQxJzoKCQkJCXJldHVybiAnT1NEX0VCQ0RJQ19ERjA0XzEnOwoKCQkJY2FzZSAnb3NkZWJjZGljZGY0MTUnOgoJCQkJcmV0dXJuICdPU0RfRUJDRElDX0RGMDRfMTUnOwoKCQkJY2FzZSAnY3NwYzhkYW5pc2hub3J3ZWdpYW4nOgoJCQljYXNlICdwYzhkYW5pc2hub3J3ZWdpYW4nOgoJCQkJcmV0dXJuICdQQzgtRGFuaXNoLU5vcndlZ2lhbic7CgoJCQljYXNlICdjc3BjOHR1cmtpc2gnOgoJCQljYXNlICdwYzh0dXJraXNoJzoKCQkJCXJldHVybiAnUEM4LVR1cmtpc2gnOwoKCQkJY2FzZSAnY3Npc28xNnBvcnR1Z3Vlc2UnOgoJCQljYXNlICdpc282NDZwdCc6CgkJCWNhc2UgJ2lzb2lyMTYnOgoJCQljYXNlICdwdCc6CgkJCQlyZXR1cm4gJ1BUJzsKCgkJCWNhc2UgJ2NzaXNvODRwb3J0dWd1ZXNlMic6CgkJCWNhc2UgJ2lzbzY0NnB0Mic6CgkJCWNhc2UgJ2lzb2lyODQnOgoJCQljYXNlICdwdDInOgoJCQkJcmV0dXJuICdQVDInOwoKCQkJY2FzZSAnY3AxNTQnOgoJCQljYXNlICdjc3B0Y3AxNTQnOgoJCQljYXNlICdjeXJpbGxpY2FzaWFuJzoKCQkJY2FzZSAncHQxNTQnOgoJCQljYXNlICdwdGNwMTU0JzoKCQkJCXJldHVybiAnUFRDUDE1NCc7CgoJCQljYXNlICdzY3N1JzoKCQkJCXJldHVybiAnU0NTVSc7CgoJCQljYXNlICdjc2lzbzEwc3dlZGlzaCc6CgkJCWNhc2UgJ2ZpJzoKCQkJY2FzZSAnaXNvNjQ2ZmknOgoJCQljYXNlICdpc282NDZzZSc6CgkJCWNhc2UgJ2lzb2lyMTAnOgoJCQljYXNlICdzZSc6CgkJCWNhc2UgJ3Nlbjg1MDIwMGInOgoJCQkJcmV0dXJuICdTRU5fODUwMjAwX0InOwoKCQkJY2FzZSAnY3Npc28xMXN3ZWRpc2hmb3JuYW1lcyc6CgkJCWNhc2UgJ2lzbzY0NnNlMic6CgkJCWNhc2UgJ2lzb2lyMTEnOgoJCQljYXNlICdzZTInOgoJCQljYXNlICdzZW44NTAyMDBjJzoKCQkJCXJldHVybiAnU0VOXzg1MDIwMF9DJzsKCgkJCWNhc2UgJ2NzaXNvMTAydDYxN2JpdCc6CgkJCWNhc2UgJ2lzb2lyMTAyJzoKCQkJY2FzZSAndDYxN2JpdCc6CgkJCQlyZXR1cm4gJ1QuNjEtN2JpdCc7CgoJCQljYXNlICdjc2lzbzEwM3Q2MThiaXQnOgoJCQljYXNlICdpc29pcjEwMyc6CgkJCWNhc2UgJ3Q2MSc6CgkJCWNhc2UgJ3Q2MThiaXQnOgoJCQkJcmV0dXJuICdULjYxLThiaXQnOwoKCQkJY2FzZSAnY3Npc28xMjh0MTAxZzInOgoJCQljYXNlICdpc29pcjEyOCc6CgkJCWNhc2UgJ3QxMDFnMic6CgkJCQlyZXR1cm4gJ1QuMTAxLUcyJzsKCgkJCWNhc2UgJ2NzdHNjaWknOgoJCQljYXNlICd0c2NpaSc6CgkJCQlyZXR1cm4gJ1RTQ0lJJzsKCgkJCWNhc2UgJ2NzdW5pY29kZTExJzoKCQkJY2FzZSAndW5pY29kZTExJzoKCQkJCXJldHVybiAnVU5JQ09ERS0xLTEnOwoKCQkJY2FzZSAnY3N1bmljb2RlMTF1dGY3JzoKCQkJY2FzZSAndW5pY29kZTExdXRmNyc6CgkJCQlyZXR1cm4gJ1VOSUNPREUtMS0xLVVURi03JzsKCgkJCWNhc2UgJ2NzdW5rbm93bjhiaXQnOgoJCQljYXNlICd1bmtub3duOGJpdCc6CgkJCQlyZXR1cm4gJ1VOS05PV04tOEJJVCc7CgoJCQljYXNlICdhbnNpeDM0MTk2OCc6CgkJCWNhc2UgJ2Fuc2l4MzQxOTg2JzoKCQkJY2FzZSAnYXNjaWknOgoJCQljYXNlICdjcDM2Nyc6CgkJCWNhc2UgJ2NzYXNjaWknOgoJCQljYXNlICdpYm0zNjcnOgoJCQljYXNlICdpc282NDZpcnYxOTkxJzoKCQkJY2FzZSAnaXNvNjQ2dXMnOgoJCQljYXNlICdpc29pcjYnOgoJCQljYXNlICd1cyc6CgkJCWNhc2UgJ3VzYXNjaWknOgoJCQkJcmV0dXJuICdVUy1BU0NJSSc7CgoJCQljYXNlICdjc3VzZGsnOgoJCQljYXNlICd1c2RrJzoKCQkJCXJldHVybiAndXMtZGsnOwoKCQkJY2FzZSAndXRmNyc6CgkJCQlyZXR1cm4gJ1VURi03JzsKCgkJCWNhc2UgJ3V0ZjgnOgoJCQkJcmV0dXJuICdVVEYtOCc7CgoJCQljYXNlICd1dGYxNic6CgkJCQlyZXR1cm4gJ1VURi0xNic7CgoJCQljYXNlICd1dGYxNmJlJzoKCQkJCXJldHVybiAnVVRGLTE2QkUnOwoKCQkJY2FzZSAndXRmMTZsZSc6CgkJCQlyZXR1cm4gJ1VURi0xNkxFJzsKCgkJCWNhc2UgJ3V0ZjMyJzoKCQkJCXJldHVybiAnVVRGLTMyJzsKCgkJCWNhc2UgJ3V0ZjMyYmUnOgoJCQkJcmV0dXJuICdVVEYtMzJCRSc7CgoJCQljYXNlICd1dGYzMmxlJzoKCQkJCXJldHVybiAnVVRGLTMyTEUnOwoKCQkJY2FzZSAnY3N2ZW50dXJhaW50ZXJuYXRpb25hbCc6CgkJCWNhc2UgJ3ZlbnR1cmFpbnRlcm5hdGlvbmFsJzoKCQkJCXJldHVybiAnVmVudHVyYS1JbnRlcm5hdGlvbmFsJzsKCgkJCWNhc2UgJ2NzdmVudHVyYW1hdGgnOgoJCQljYXNlICd2ZW50dXJhbWF0aCc6CgkJCQlyZXR1cm4gJ1ZlbnR1cmEtTWF0aCc7CgoJCQljYXNlICdjc3ZlbnR1cmF1cyc6CgkJCWNhc2UgJ3ZlbnR1cmF1cyc6CgkJCQlyZXR1cm4gJ1ZlbnR1cmEtVVMnOwoKCQkJY2FzZSAnY3Npc283MHZpZGVvdGV4c3VwcDEnOgoJCQljYXNlICdpc29pcjcwJzoKCQkJY2FzZSAndmlkZW90ZXhzdXBwbCc6CgkJCQlyZXR1cm4gJ3ZpZGVvdGV4LXN1cHBsJzsKCgkJCWNhc2UgJ2Nzdmlxcic6CgkJCWNhc2UgJ3ZpcXInOgoJCQkJcmV0dXJuICdWSVFSJzsKCgkJCWNhc2UgJ2NzdmlzY2lpJzoKCQkJY2FzZSAndmlzY2lpJzoKCQkJCXJldHVybiAnVklTQ0lJJzsKCgkJCWNhc2UgJ2Nzc2hpZnRqaXMnOgoJCQljYXNlICdjc3dpbmRvd3MzMWonOgoJCQljYXNlICdtc2thbmppJzoKCQkJY2FzZSAnc2hpZnRqaXMnOgoJCQljYXNlICd3aW5kb3dzMzFqJzoKCQkJCXJldHVybiAnV2luZG93cy0zMUonOwoKCQkJY2FzZSAnaXNvODg1OTExJzoKCQkJY2FzZSAndGlzNjIwJzoKCQkJCXJldHVybiAnd2luZG93cy04NzQnOwoKCQkJY2FzZSAnY3NldWNrcic6CgkJCWNhc2UgJ2Nza3NjNTYwMTE5ODcnOgoJCQljYXNlICdldWNrcic6CgkJCWNhc2UgJ2lzb2lyMTQ5JzoKCQkJY2FzZSAna29yZWFuJzoKCQkJY2FzZSAna3NjNTYwMSc6CgkJCWNhc2UgJ2tzYzU2MDExOTg3JzoKCQkJY2FzZSAna3NjNTYwMTE5ODknOgoJCQljYXNlICd3aW5kb3dzOTQ5JzoKCQkJCXJldHVybiAnd2luZG93cy05NDknOwoKCQkJY2FzZSAnd2luZG93czEyNTAnOgoJCQkJcmV0dXJuICd3aW5kb3dzLTEyNTAnOwoKCQkJY2FzZSAnd2luZG93czEyNTEnOgoJCQkJcmV0dXJuICd3aW5kb3dzLTEyNTEnOwoKCQkJY2FzZSAnY3A4MTknOgoJCQljYXNlICdjc2lzb2xhdGluMSc6CgkJCWNhc2UgJ2libTgxOSc6CgkJCWNhc2UgJ2lzbzg4NTkxJzoKCQkJY2FzZSAnaXNvODg1OTExOTg3JzoKCQkJY2FzZSAnaXNvaXIxMDAnOgoJCQljYXNlICdsMSc6CgkJCWNhc2UgJ2xhdGluMSc6CgkJCWNhc2UgJ3dpbmRvd3MxMjUyJzoKCQkJCXJldHVybiAnd2luZG93cy0xMjUyJzsKCgkJCWNhc2UgJ3dpbmRvd3MxMjUzJzoKCQkJCXJldHVybiAnd2luZG93cy0xMjUzJzsKCgkJCWNhc2UgJ2NzaXNvbGF0aW41JzoKCQkJY2FzZSAnaXNvODg1OTknOgoJCQljYXNlICdpc284ODU5OTE5ODknOgoJCQljYXNlICdpc29pcjE0OCc6CgkJCWNhc2UgJ2w1JzoKCQkJY2FzZSAnbGF0aW41JzoKCQkJY2FzZSAnd2luZG93czEyNTQnOgoJCQkJcmV0dXJuICd3aW5kb3dzLTEyNTQnOwoKCQkJY2FzZSAnd2luZG93czEyNTUnOgoJCQkJcmV0dXJuICd3aW5kb3dzLTEyNTUnOwoKCQkJY2FzZSAnd2luZG93czEyNTYnOgoJCQkJcmV0dXJuICd3aW5kb3dzLTEyNTYnOwoKCQkJY2FzZSAnd2luZG93czEyNTcnOgoJCQkJcmV0dXJuICd3aW5kb3dzLTEyNTcnOwoKCQkJY2FzZSAnd2luZG93czEyNTgnOgoJCQkJcmV0dXJuICd3aW5kb3dzLTEyNTgnOwoKCQkJZGVmYXVsdDoKCQkJCXJldHVybiAkY2hhcnNldDsKCQl9Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfY3VybF92ZXJzaW9uKCkKCXsKCQlpZiAoaXNfYXJyYXkoJGN1cmwgPSBjdXJsX3ZlcnNpb24oKSkpCgkJewoJCQkkY3VybCA9ICRjdXJsWyd2ZXJzaW9uJ107CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCRjdXJsLCAwLCA1KSA9PT0gJ2N1cmwvJykKCQl7CgkJCSRjdXJsID0gc3Vic3RyKCRjdXJsLCA1LCBzdHJjc3BuKCRjdXJsLCAiXHgwOVx4MEFceDBCXHgwQ1x4MEQiLCA1KSk7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCRjdXJsLCAwLCA4KSA9PT0gJ2xpYmN1cmwvJykKCQl7CgkJCSRjdXJsID0gc3Vic3RyKCRjdXJsLCA4LCBzdHJjc3BuKCRjdXJsLCAiXHgwOVx4MEFceDBCXHgwQ1x4MEQiLCA4KSk7CgkJfQoJCWVsc2UKCQl7CgkJCSRjdXJsID0gMDsKCQl9CgkJcmV0dXJuICRjdXJsOwoJfQoKCS8qKgoJICogU3RyaXAgSFRNTCBjb21tZW50cwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgRGF0YSB0byBzdHJpcCBjb21tZW50cyBmcm9tCgkgKiBAcmV0dXJuIHN0cmluZyBDb21tZW50IHN0cmlwcGVkIHN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cmlwX2NvbW1lbnRzKCRkYXRhKQoJewoJCSRvdXRwdXQgPSAnJzsKCQl3aGlsZSAoKCRzdGFydCA9IHN0cnBvcygkZGF0YSwgJzwhLS0nKSkgIT09IGZhbHNlKQoJCXsKCQkJJG91dHB1dCAuPSBzdWJzdHIoJGRhdGEsIDAsICRzdGFydCk7CgkJCWlmICgoJGVuZCA9IHN0cnBvcygkZGF0YSwgJy0tPicsICRzdGFydCkpICE9PSBmYWxzZSkKCQkJewoJCQkJJGRhdGEgPSBzdWJzdHJfcmVwbGFjZSgkZGF0YSwgJycsIDAsICRlbmQgKyAzKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRkYXRhID0gJyc7CgkJCX0KCQl9CgkJcmV0dXJuICRvdXRwdXQgLiAkZGF0YTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlX2RhdGUoJGR0KQoJewoJCSRwYXJzZXIgPSBTaW1wbGVQaWVfUGFyc2VfRGF0ZTo6Z2V0KCk7CgkJcmV0dXJuICRwYXJzZXItPnBhcnNlKCRkdCk7Cgl9CgoJLyoqCgkgKiBEZWNvZGUgSFRNTCBlbnRpdGllcwoJICoKCSAqIEBkZXByZWNhdGVkIFVzZSBET01Eb2N1bWVudCBpbnN0ZWFkCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIElucHV0IGRhdGEKCSAqIEByZXR1cm4gc3RyaW5nIE91dHB1dCBkYXRhCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZW50aXRpZXNfZGVjb2RlKCRkYXRhKQoJewoJCSRkZWNvZGVyID0gbmV3IFNpbXBsZVBpZV9EZWNvZGVfSFRNTF9FbnRpdGllcygkZGF0YSk7CgkJcmV0dXJuICRkZWNvZGVyLT5wYXJzZSgpOwoJfQoKCS8qKgoJICogUmVtb3ZlIFJGQzgyMiBjb21tZW50cwoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgRGF0YSB0byBzdHJpcCBjb21tZW50cyBmcm9tCgkgKiBAcmV0dXJuIHN0cmluZyBDb21tZW50IHN0cmlwcGVkIHN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVuY29tbWVudF9yZmM4MjIoJHN0cmluZykKCXsKCQkkc3RyaW5nID0gKHN0cmluZykgJHN0cmluZzsKCQkkcG9zaXRpb24gPSAwOwoJCSRsZW5ndGggPSBzdHJsZW4oJHN0cmluZyk7CgkJJGRlcHRoID0gMDsKCgkJJG91dHB1dCA9ICcnOwoKCQl3aGlsZSAoJHBvc2l0aW9uIDwgJGxlbmd0aCAmJiAoJHBvcyA9IHN0cnBvcygkc3RyaW5nLCAnKCcsICRwb3NpdGlvbikpICE9PSBmYWxzZSkKCQl7CgkJCSRvdXRwdXQgLj0gc3Vic3RyKCRzdHJpbmcsICRwb3NpdGlvbiwgJHBvcyAtICRwb3NpdGlvbik7CgkJCSRwb3NpdGlvbiA9ICRwb3MgKyAxOwoJCQlpZiAoJHN0cmluZ1skcG9zIC0gMV0gIT09ICdcXCcpCgkJCXsKCQkJCSRkZXB0aCsrOwoJCQkJd2hpbGUgKCRkZXB0aCAmJiAkcG9zaXRpb24gPCAkbGVuZ3RoKQoJCQkJewoJCQkJCSRwb3NpdGlvbiArPSBzdHJjc3BuKCRzdHJpbmcsICcoKScsICRwb3NpdGlvbik7CgkJCQkJaWYgKCRzdHJpbmdbJHBvc2l0aW9uIC0gMV0gPT09ICdcXCcpCgkJCQkJewoJCQkJCQkkcG9zaXRpb24rKzsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJCWVsc2VpZiAoaXNzZXQoJHN0cmluZ1skcG9zaXRpb25dKSkKCQkJCQl7CgkJCQkJCXN3aXRjaCAoJHN0cmluZ1skcG9zaXRpb25dKQoJCQkJCQl7CgkJCQkJCQljYXNlICcoJzoKCQkJCQkJCQkkZGVwdGgrKzsKCQkJCQkJCQlicmVhazsKCgkJCQkJCQljYXNlICcpJzoKCQkJCQkJCQkkZGVwdGgtLTsKCQkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQkkcG9zaXRpb24rKzsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJG91dHB1dCAuPSAnKCc7CgkJCX0KCQl9CgkJJG91dHB1dCAuPSBzdWJzdHIoJHN0cmluZywgJHBvc2l0aW9uKTsKCgkJcmV0dXJuICRvdXRwdXQ7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZV9taW1lKCRtaW1lKQoJewoJCWlmICgoJHBvcyA9IHN0cnBvcygkbWltZSwgJzsnKSkgPT09IGZhbHNlKQoJCXsKCQkJcmV0dXJuIHRyaW0oJG1pbWUpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gdHJpbShzdWJzdHIoJG1pbWUsIDAsICRwb3MpKTsKCQl9Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhdG9tXzAzX2NvbnN0cnVjdF90eXBlKCRhdHRyaWJzKQoJewoJCWlmIChpc3NldCgkYXR0cmlic1snJ11bJ21vZGUnXSkgJiYgc3RydG9sb3dlcih0cmltKCRhdHRyaWJzWycnXVsnbW9kZSddKSA9PT0gJ2Jhc2U2NCcpKQoJCXsKCQkJJG1vZGUgPSBTSU1QTEVQSUVfQ09OU1RSVUNUX0JBU0U2NDsKCQl9CgkJZWxzZQoJCXsKCQkJJG1vZGUgPSBTSU1QTEVQSUVfQ09OU1RSVUNUX05PTkU7CgkJfQoJCWlmIChpc3NldCgkYXR0cmlic1snJ11bJ3R5cGUnXSkpCgkJewoJCQlzd2l0Y2ggKHN0cnRvbG93ZXIodHJpbSgkYXR0cmlic1snJ11bJ3R5cGUnXSkpKQoJCQl7CgkJCQljYXNlICd0ZXh0JzoKCQkJCWNhc2UgJ3RleHQvcGxhaW4nOgoJCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQgfCAkbW9kZTsKCgkJCQljYXNlICdodG1sJzoKCQkJCWNhc2UgJ3RleHQvaHRtbCc6CgkJCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTCB8ICRtb2RlOwoKCQkJCWNhc2UgJ3hodG1sJzoKCQkJCWNhc2UgJ2FwcGxpY2F0aW9uL3hodG1sK3htbCc6CgkJCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfWEhUTUwgfCAkbW9kZTsKCgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX05PTkUgfCAkbW9kZTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9URVhUIHwgJG1vZGU7CgkJfQoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXRvbV8xMF9jb25zdHJ1Y3RfdHlwZSgkYXR0cmlicykKCXsKCQlpZiAoaXNzZXQoJGF0dHJpYnNbJyddWyd0eXBlJ10pKQoJCXsKCQkJc3dpdGNoIChzdHJ0b2xvd2VyKHRyaW0oJGF0dHJpYnNbJyddWyd0eXBlJ10pKSkKCQkJewoJCQkJY2FzZSAndGV4dCc6CgkJCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVDsKCgkJCQljYXNlICdodG1sJzoKCQkJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MOwoKCQkJCWNhc2UgJ3hodG1sJzoKCQkJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9YSFRNTDsKCgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX05PTkU7CgkJCX0KCQl9CgkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVDsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGF0b21fMTBfY29udGVudF9jb25zdHJ1Y3RfdHlwZSgkYXR0cmlicykKCXsKCQlpZiAoaXNzZXQoJGF0dHJpYnNbJyddWyd0eXBlJ10pKQoJCXsKCQkJJHR5cGUgPSBzdHJ0b2xvd2VyKHRyaW0oJGF0dHJpYnNbJyddWyd0eXBlJ10pKTsKCQkJc3dpdGNoICgkdHlwZSkKCQkJewoJCQkJY2FzZSAndGV4dCc6CgkJCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVDsKCgkJCQljYXNlICdodG1sJzoKCQkJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MOwoKCQkJCWNhc2UgJ3hodG1sJzoKCQkJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9YSFRNTDsKCQkJfQoJCQlpZiAoaW5fYXJyYXkoc3Vic3RyKCR0eXBlLCAtNCksIGFycmF5KCcreG1sJywgJy94bWwnKSkgfHwgc3Vic3RyKCR0eXBlLCAwLCA1KSA9PT0gJ3RleHQvJykKCQkJewoJCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfTk9ORTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX0JBU0U2NDsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9URVhUOwoJCX0KCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzX2lzZWdtZW50X256X25jKCRzdHJpbmcpCgl7CgkJcmV0dXJuIChib29sKSBwcmVnX21hdGNoKCcvXihbQS1aYS16MC05XC0uX35ceHtBMH0tXHh7RDdGRn1ceHtGOTAwfS1ceHtGRENGfVx4e0ZERjB9LVx4e0ZGRUZ9XHh7MTAwMDB9LVx4ezFGRkZEfVx4ezIwMDAwfS1ceHsyRkZGRH1ceHszMDAwMH0tXHh7M0ZGRkR9XHh7NDAwMDB9LVx4ezRGRkZEfVx4ezUwMDAwfS1ceHs1RkZGRH1ceHs2MDAwMH0tXHh7NkZGRkR9XHh7NzAwMDB9LVx4ezdGRkZEfVx4ezgwMDAwfS1ceHs4RkZGRH1ceHs5MDAwMH0tXHh7OUZGRkR9XHh7QTAwMDB9LVx4e0FGRkZEfVx4e0IwMDAwfS1ceHtCRkZGRH1ceHtDMDAwMH0tXHh7Q0ZGRkR9XHh7RDAwMDB9LVx4e0RGRkZEfVx4e0UxMDAwfS1ceHtFRkZGRH0hJCZcJygpKissOz1AXXwoJVswLTlBQkNERUZdezJ9KSkrJC91JywgJHN0cmluZyk7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzcGFjZV9zZXBlcmF0ZWRfdG9rZW5zKCRzdHJpbmcpCgl7CgkJJHNwYWNlX2NoYXJhY3RlcnMgPSAiXHgyMFx4MDlceDBBXHgwQlx4MENceDBEIjsKCQkkc3RyaW5nX2xlbmd0aCA9IHN0cmxlbigkc3RyaW5nKTsKCgkJJHBvc2l0aW9uID0gc3Ryc3BuKCRzdHJpbmcsICRzcGFjZV9jaGFyYWN0ZXJzKTsKCQkkdG9rZW5zID0gYXJyYXkoKTsKCgkJd2hpbGUgKCRwb3NpdGlvbiA8ICRzdHJpbmdfbGVuZ3RoKQoJCXsKCQkJJGxlbiA9IHN0cmNzcG4oJHN0cmluZywgJHNwYWNlX2NoYXJhY3RlcnMsICRwb3NpdGlvbik7CgkJCSR0b2tlbnNbXSA9IHN1YnN0cigkc3RyaW5nLCAkcG9zaXRpb24sICRsZW4pOwoJCQkkcG9zaXRpb24gKz0gJGxlbjsKCQkJJHBvc2l0aW9uICs9IHN0cnNwbigkc3RyaW5nLCAkc3BhY2VfY2hhcmFjdGVycywgJHBvc2l0aW9uKTsKCQl9CgoJCXJldHVybiAkdG9rZW5zOwoJfQoKCS8qKgoJICogQ29udmVydHMgYSB1bmljb2RlIGNvZGVwb2ludCB0byBhIFVURi04IGNoYXJhY3RlcgoJICoKCSAqIEBzdGF0aWMKCSAqIEBwYXJhbSBpbnQgJGNvZGVwb2ludCBVbmljb2RlIGNvZGVwb2ludAoJICogQHJldHVybiBzdHJpbmcgVVRGLTggY2hhcmFjdGVyCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29kZXBvaW50X3RvX3V0ZjgoJGNvZGVwb2ludCkKCXsKCQkkY29kZXBvaW50ID0gKGludCkgJGNvZGVwb2ludDsKCQlpZiAoJGNvZGVwb2ludCA8IDApCgkJewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWVsc2UgaWYgKCRjb2RlcG9pbnQgPD0gMHg3ZikKCQl7CgkJCXJldHVybiBjaHIoJGNvZGVwb2ludCk7CgkJfQoJCWVsc2UgaWYgKCRjb2RlcG9pbnQgPD0gMHg3ZmYpCgkJewoJCQlyZXR1cm4gY2hyKDB4YzAgfCAoJGNvZGVwb2ludCA+PiA2KSkgLiBjaHIoMHg4MCB8ICgkY29kZXBvaW50ICYgMHgzZikpOwoJCX0KCQllbHNlIGlmICgkY29kZXBvaW50IDw9IDB4ZmZmZikKCQl7CgkJCXJldHVybiBjaHIoMHhlMCB8ICgkY29kZXBvaW50ID4+IDEyKSkgLiBjaHIoMHg4MCB8ICgoJGNvZGVwb2ludCA+PiA2KSAmIDB4M2YpKSAuIGNocigweDgwIHwgKCRjb2RlcG9pbnQgJiAweDNmKSk7CgkJfQoJCWVsc2UgaWYgKCRjb2RlcG9pbnQgPD0gMHgxMGZmZmYpCgkJewoJCQlyZXR1cm4gY2hyKDB4ZjAgfCAoJGNvZGVwb2ludCA+PiAxOCkpIC4gY2hyKDB4ODAgfCAoKCRjb2RlcG9pbnQgPj4gMTIpICYgMHgzZikpIC4gY2hyKDB4ODAgfCAoKCRjb2RlcG9pbnQgPj4gNikgJiAweDNmKSkgLiBjaHIoMHg4MCB8ICgkY29kZXBvaW50ICYgMHgzZikpOwoJCX0KCQllbHNlCgkJewoJCQkvLyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSCgkJCXJldHVybiAiXHhFRlx4QkZceEJEIjsKCQl9Cgl9CgoJLyoqCgkgKiBTaW1pbGFyIHRvIHBhcnNlX3N0cigpCgkgKgoJICogUmV0dXJucyBhbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiBuYW1lL3ZhbHVlIHBhaXJzLCB3aGVyZSB0aGUgdmFsdWUgaXMgYW4KCSAqIGFycmF5IG9mIHZhbHVlcyB0aGF0IGhhdmUgdXNlZCB0aGUgc2FtZSBuYW1lCgkgKgoJICogQHN0YXRpYwoJICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSBpbnB1dCBzdHJpbmcuCgkgKiBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFyc2Vfc3RyKCRzdHIpCgl7CgkJJHJldHVybiA9IGFycmF5KCk7CgkJJHN0ciA9IGV4cGxvZGUoJyYnLCAkc3RyKTsKCgkJZm9yZWFjaCAoJHN0ciBhcyAkc2VjdGlvbikKCQl7CgkJCWlmIChzdHJwb3MoJHNlY3Rpb24sICc9JykgIT09IGZhbHNlKQoJCQl7CgkJCQlsaXN0KCRuYW1lLCAkdmFsdWUpID0gZXhwbG9kZSgnPScsICRzZWN0aW9uLCAyKTsKCQkJCSRyZXR1cm5bdXJsZGVjb2RlKCRuYW1lKV1bXSA9IHVybGRlY29kZSgkdmFsdWUpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHJldHVyblt1cmxkZWNvZGUoJHNlY3Rpb24pXVtdID0gbnVsbDsKCQkJfQoJCX0KCgkJcmV0dXJuICRyZXR1cm47Cgl9CgoJLyoqCgkgKiBEZXRlY3QgWE1MIGVuY29kaW5nLCBhcyBwZXIgWE1MIDEuMCBBcHBlbmRpeCBGLjEKCSAqCgkgKiBAdG9kbyBBZGQgc3VwcG9ydCBmb3IgRUJDRElDCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIFhNTCBkYXRhCgkgKiBAcGFyYW0gU2ltcGxlUGllX1JlZ2lzdHJ5ICRyZWdpc3RyeSBDbGFzcyByZWdpc3RyeQoJICogQHJldHVybiBhcnJheSBQb3NzaWJsZSBlbmNvZGluZ3MKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB4bWxfZW5jb2RpbmcoJGRhdGEsICRyZWdpc3RyeSkKCXsKCQkvLyBVVEYtMzIgQmlnIEVuZGlhbiBCT00KCQlpZiAoc3Vic3RyKCRkYXRhLCAwLCA0KSA9PT0gIlx4MDBceDAwXHhGRVx4RkYiKQoJCXsKCQkJJGVuY29kaW5nW10gPSAnVVRGLTMyQkUnOwoJCX0KCQkvLyBVVEYtMzIgTGl0dGxlIEVuZGlhbiBCT00KCQllbHNlaWYgKHN1YnN0cigkZGF0YSwgMCwgNCkgPT09ICJceEZGXHhGRVx4MDBceDAwIikKCQl7CgkJCSRlbmNvZGluZ1tdID0gJ1VURi0zMkxFJzsKCQl9CgkJLy8gVVRGLTE2IEJpZyBFbmRpYW4gQk9NCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDIpID09PSAiXHhGRVx4RkYiKQoJCXsKCQkJJGVuY29kaW5nW10gPSAnVVRGLTE2QkUnOwoJCX0KCQkvLyBVVEYtMTYgTGl0dGxlIEVuZGlhbiBCT00KCQllbHNlaWYgKHN1YnN0cigkZGF0YSwgMCwgMikgPT09ICJceEZGXHhGRSIpCgkJewoJCQkkZW5jb2RpbmdbXSA9ICdVVEYtMTZMRSc7CgkJfQoJCS8vIFVURi04IEJPTQoJCWVsc2VpZiAoc3Vic3RyKCRkYXRhLCAwLCAzKSA9PT0gIlx4RUZceEJCXHhCRiIpCgkJewoJCQkkZW5jb2RpbmdbXSA9ICdVVEYtOCc7CgkJfQoJCS8vIFVURi0zMiBCaWcgRW5kaWFuIFdpdGhvdXQgQk9NCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDIwKSA9PT0gIlx4MDBceDAwXHgwMFx4M0NceDAwXHgwMFx4MDBceDNGXHgwMFx4MDBceDAwXHg3OFx4MDBceDAwXHgwMFx4NkRceDAwXHgwMFx4MDBceDZDIikKCQl7CgkJCWlmICgkcG9zID0gc3RycG9zKCRkYXRhLCAiXHgwMFx4MDBceDAwXHgzRlx4MDBceDAwXHgwMFx4M0UiKSkKCQkJewoJCQkJJHBhcnNlciA9ICRyZWdpc3RyeS0+Y3JlYXRlKCdYTUxfRGVjbGFyYXRpb25fUGFyc2VyJywgYXJyYXkoU2ltcGxlUGllX01pc2M6OmNoYW5nZV9lbmNvZGluZyhzdWJzdHIoJGRhdGEsIDIwLCAkcG9zIC0gMjApLCAnVVRGLTMyQkUnLCAnVVRGLTgnKSkpOwoJCQkJaWYgKCRwYXJzZXItPnBhcnNlKCkpCgkJCQl7CgkJCQkJJGVuY29kaW5nW10gPSAkcGFyc2VyLT5lbmNvZGluZzsKCQkJCX0KCQkJfQoJCQkkZW5jb2RpbmdbXSA9ICdVVEYtMzJCRSc7CgkJfQoJCS8vIFVURi0zMiBMaXR0bGUgRW5kaWFuIFdpdGhvdXQgQk9NCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDIwKSA9PT0gIlx4M0NceDAwXHgwMFx4MDBceDNGXHgwMFx4MDBceDAwXHg3OFx4MDBceDAwXHgwMFx4NkRceDAwXHgwMFx4MDBceDZDXHgwMFx4MDBceDAwIikKCQl7CgkJCWlmICgkcG9zID0gc3RycG9zKCRkYXRhLCAiXHgzRlx4MDBceDAwXHgwMFx4M0VceDAwXHgwMFx4MDAiKSkKCQkJewoJCQkJJHBhcnNlciA9ICRyZWdpc3RyeS0+Y3JlYXRlKCdYTUxfRGVjbGFyYXRpb25fUGFyc2VyJywgYXJyYXkoU2ltcGxlUGllX01pc2M6OmNoYW5nZV9lbmNvZGluZyhzdWJzdHIoJGRhdGEsIDIwLCAkcG9zIC0gMjApLCAnVVRGLTMyTEUnLCAnVVRGLTgnKSkpOwoJCQkJaWYgKCRwYXJzZXItPnBhcnNlKCkpCgkJCQl7CgkJCQkJJGVuY29kaW5nW10gPSAkcGFyc2VyLT5lbmNvZGluZzsKCQkJCX0KCQkJfQoJCQkkZW5jb2RpbmdbXSA9ICdVVEYtMzJMRSc7CgkJfQoJCS8vIFVURi0xNiBCaWcgRW5kaWFuIFdpdGhvdXQgQk9NCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDEwKSA9PT0gIlx4MDBceDNDXHgwMFx4M0ZceDAwXHg3OFx4MDBceDZEXHgwMFx4NkMiKQoJCXsKCQkJaWYgKCRwb3MgPSBzdHJwb3MoJGRhdGEsICJceDAwXHgzRlx4MDBceDNFIikpCgkJCXsKCQkJCSRwYXJzZXIgPSAkcmVnaXN0cnktPmNyZWF0ZSgnWE1MX0RlY2xhcmF0aW9uX1BhcnNlcicsIGFycmF5KFNpbXBsZVBpZV9NaXNjOjpjaGFuZ2VfZW5jb2Rpbmcoc3Vic3RyKCRkYXRhLCAyMCwgJHBvcyAtIDEwKSwgJ1VURi0xNkJFJywgJ1VURi04JykpKTsKCQkJCWlmICgkcGFyc2VyLT5wYXJzZSgpKQoJCQkJewoJCQkJCSRlbmNvZGluZ1tdID0gJHBhcnNlci0+ZW5jb2Rpbmc7CgkJCQl9CgkJCX0KCQkJJGVuY29kaW5nW10gPSAnVVRGLTE2QkUnOwoJCX0KCQkvLyBVVEYtMTYgTGl0dGxlIEVuZGlhbiBXaXRob3V0IEJPTQoJCWVsc2VpZiAoc3Vic3RyKCRkYXRhLCAwLCAxMCkgPT09ICJceDNDXHgwMFx4M0ZceDAwXHg3OFx4MDBceDZEXHgwMFx4NkNceDAwIikKCQl7CgkJCWlmICgkcG9zID0gc3RycG9zKCRkYXRhLCAiXHgzRlx4MDBceDNFXHgwMCIpKQoJCQl7CgkJCQkkcGFyc2VyID0gJHJlZ2lzdHJ5LT5jcmVhdGUoJ1hNTF9EZWNsYXJhdGlvbl9QYXJzZXInLCBhcnJheShTaW1wbGVQaWVfTWlzYzo6Y2hhbmdlX2VuY29kaW5nKHN1YnN0cigkZGF0YSwgMjAsICRwb3MgLSAxMCksICdVVEYtMTZMRScsICdVVEYtOCcpKSk7CgkJCQlpZiAoJHBhcnNlci0+cGFyc2UoKSkKCQkJCXsKCQkJCQkkZW5jb2RpbmdbXSA9ICRwYXJzZXItPmVuY29kaW5nOwoJCQkJfQoJCQl9CgkJCSRlbmNvZGluZ1tdID0gJ1VURi0xNkxFJzsKCQl9CgkJLy8gVVMtQVNDSUkgKG9yIHN1cGVyc2V0KQoJCWVsc2VpZiAoc3Vic3RyKCRkYXRhLCAwLCA1KSA9PT0gIlx4M0NceDNGXHg3OFx4NkRceDZDIikKCQl7CgkJCWlmICgkcG9zID0gc3RycG9zKCRkYXRhLCAiXHgzRlx4M0UiKSkKCQkJewoJCQkJJHBhcnNlciA9ICRyZWdpc3RyeS0+Y3JlYXRlKCdYTUxfRGVjbGFyYXRpb25fUGFyc2VyJywgYXJyYXkoc3Vic3RyKCRkYXRhLCA1LCAkcG9zIC0gNSkpKTsKCQkJCWlmICgkcGFyc2VyLT5wYXJzZSgpKQoJCQkJewoJCQkJCSRlbmNvZGluZ1tdID0gJHBhcnNlci0+ZW5jb2Rpbmc7CgkJCQl9CgkJCX0KCQkJJGVuY29kaW5nW10gPSAnVVRGLTgnOwoJCX0KCQkvLyBGYWxsYmFjayB0byBVVEYtOAoJCWVsc2UKCQl7CgkJCSRlbmNvZGluZ1tdID0gJ1VURi04JzsKCQl9CgkJcmV0dXJuICRlbmNvZGluZzsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG91dHB1dF9qYXZhc2NyaXB0KCkKCXsKCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdvYl9nemhhbmRsZXInKSkKCQl7CgkJCW9iX3N0YXJ0KCdvYl9nemhhbmRsZXInKTsKCQl9CgkJaGVhZGVyKCdDb250ZW50LXR5cGU6IHRleHQvamF2YXNjcmlwdDsgY2hhcnNldDogVVRGLTgnKTsKCQloZWFkZXIoJ0NhY2hlLUNvbnRyb2w6IG11c3QtcmV2YWxpZGF0ZScpOwoJCWhlYWRlcignRXhwaXJlczogJyAuIGdtZGF0ZSgnRCwgZCBNIFkgSDppOnMnLCB0aW1lKCkgKyA2MDQ4MDApIC4gJyBHTVQnKTsgLy8gNyBkYXlzCgkJPz4KZnVuY3Rpb24gZW1iZWRfcXVpY2t0aW1lKHR5cGUsIGJnY29sb3IsIHdpZHRoLCBoZWlnaHQsIGxpbmssIHBsYWNlaG9sZGVyLCBsb29wKSB7CglpZiAocGxhY2Vob2xkZXIgIT0gJycpIHsKCQlkb2N1bWVudC53cml0ZWxuKCc8ZW1iZWQgdHlwZT0iJyt0eXBlKyciIHN0eWxlPSJjdXJzb3I6aGFuZDsgY3Vyc29yOnBvaW50ZXI7IiBocmVmPSInK2xpbmsrJyIgc3JjPSInK3BsYWNlaG9sZGVyKyciIHdpZHRoPSInK3dpZHRoKyciIGhlaWdodD0iJytoZWlnaHQrJyIgYXV0b3BsYXk9ImZhbHNlIiB0YXJnZXQ9Im15c2VsZiIgY29udHJvbGxlcj0iZmFsc2UiIGxvb3A9IicrbG9vcCsnIiBzY2FsZT0iYXNwZWN0IiBiZ2NvbG9yPSInK2JnY29sb3IrJyIgcGx1Z2luc3BhZ2U9Imh0dHA6Ly93d3cuYXBwbGUuY29tL3F1aWNrdGltZS9kb3dubG9hZC8iPjwvZW1iZWQ+Jyk7Cgl9CgllbHNlIHsKCQlkb2N1bWVudC53cml0ZWxuKCc8ZW1iZWQgdHlwZT0iJyt0eXBlKyciIHN0eWxlPSJjdXJzb3I6aGFuZDsgY3Vyc29yOnBvaW50ZXI7IiBzcmM9IicrbGluaysnIiB3aWR0aD0iJyt3aWR0aCsnIiBoZWlnaHQ9IicraGVpZ2h0KyciIGF1dG9wbGF5PSJmYWxzZSIgdGFyZ2V0PSJteXNlbGYiIGNvbnRyb2xsZXI9InRydWUiIGxvb3A9IicrbG9vcCsnIiBzY2FsZT0iYXNwZWN0IiBiZ2NvbG9yPSInK2JnY29sb3IrJyIgcGx1Z2luc3BhZ2U9Imh0dHA6Ly93d3cuYXBwbGUuY29tL3F1aWNrdGltZS9kb3dubG9hZC8iPjwvZW1iZWQ+Jyk7Cgl9Cn0KCmZ1bmN0aW9uIGVtYmVkX2ZsYXNoKGJnY29sb3IsIHdpZHRoLCBoZWlnaHQsIGxpbmssIGxvb3AsIHR5cGUpIHsKCWRvY3VtZW50LndyaXRlbG4oJzxlbWJlZCBzcmM9IicrbGluaysnIiBwbHVnaW5zcGFnZT0iaHR0cDovL3d3dy5tYWNyb21lZGlhLmNvbS9nby9nZXRmbGFzaHBsYXllciIgdHlwZT0iJyt0eXBlKyciIHF1YWxpdHk9ImhpZ2giIHdpZHRoPSInK3dpZHRoKyciIGhlaWdodD0iJytoZWlnaHQrJyIgYmdjb2xvcj0iJytiZ2NvbG9yKyciIGxvb3A9IicrbG9vcCsnIj48L2VtYmVkPicpOwp9CgpmdW5jdGlvbiBlbWJlZF9mbHYod2lkdGgsIGhlaWdodCwgbGluaywgcGxhY2Vob2xkZXIsIGxvb3AsIHBsYXllcikgewoJZG9jdW1lbnQud3JpdGVsbignPGVtYmVkIHNyYz0iJytwbGF5ZXIrJyIgcGx1Z2luc3BhZ2U9Imh0dHA6Ly93d3cubWFjcm9tZWRpYS5jb20vZ28vZ2V0Zmxhc2hwbGF5ZXIiIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiBxdWFsaXR5PSJoaWdoIiB3aWR0aD0iJyt3aWR0aCsnIiBoZWlnaHQ9IicraGVpZ2h0KyciIHdtb2RlPSJ0cmFuc3BhcmVudCIgZmxhc2h2YXJzPSJmaWxlPScrbGluaysnJmF1dG9zdGFydD1mYWxzZSZyZXBlYXQ9Jytsb29wKycmc2hvd2RpZ2l0cz10cnVlJnNob3dmc2J1dHRvbj1mYWxzZSI+PC9lbWJlZD4nKTsKfQoKZnVuY3Rpb24gZW1iZWRfd21lZGlhKHdpZHRoLCBoZWlnaHQsIGxpbmspIHsKCWRvY3VtZW50LndyaXRlbG4oJzxlbWJlZCB0eXBlPSJhcHBsaWNhdGlvbi94LW1wbGF5ZXIyIiBzcmM9IicrbGluaysnIiBhdXRvc2l6ZT0iMSIgd2lkdGg9Iicrd2lkdGgrJyIgaGVpZ2h0PSInK2hlaWdodCsnIiBzaG93Y29udHJvbHM9IjEiIHNob3dzdGF0dXNiYXI9IjAiIHNob3dkaXNwbGF5PSIwIiBhdXRvc3RhcnQ9IjAiPjwvZW1iZWQ+Jyk7Cn0KCQk8P3BocAoJfQoKCS8qKgoJICogR2V0IHRoZSBTaW1wbGVQaWUgYnVpbGQgdGltZXN0YW1wCgkgKgoJICogVXNlcyB0aGUgZ2l0IGluZGV4IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHVzZXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lCgkgKiBvZiB0aGUgbmV3ZXN0IGZpbGUuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2J1aWxkKCkKCXsKCQkkcm9vdCA9IGRpcm5hbWUoZGlybmFtZShfX0ZJTEVfXykpOwoJCWlmIChmaWxlX2V4aXN0cygkcm9vdCAuICcvLmdpdC9pbmRleCcpKQoJCXsKCQkJcmV0dXJuIGZpbGVtdGltZSgkcm9vdCAuICcvLmdpdC9pbmRleCcpOwoJCX0KCQllbHNlaWYgKGZpbGVfZXhpc3RzKCRyb290IC4gJy9TaW1wbGVQaWUnKSkKCQl7CgkJCSR0aW1lID0gMDsKCQkJZm9yZWFjaCAoZ2xvYigkcm9vdCAuICcvU2ltcGxlUGllLyoucGhwJykgYXMgJGZpbGUpCgkJCXsKCQkJCWlmICgoJG10aW1lID0gZmlsZW10aW1lKCRmaWxlKSkgPiAkdGltZSkKCQkJCXsKCQkJCQkkdGltZSA9ICRtdGltZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gJHRpbWU7CgkJfQoJCWVsc2VpZiAoZmlsZV9leGlzdHMoZGlybmFtZShfX0ZJTEVfXykgLiAnL0NvcmUucGhwJykpCgkJewoJCQlyZXR1cm4gZmlsZW10aW1lKGRpcm5hbWUoX19GSUxFX18pIC4gJy9Db3JlLnBocCcpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gZmlsZW10aW1lKF9fRklMRV9fKTsKCQl9Cgl9CgoJLyoqCgkgKiBGb3JtYXQgZGVidWdnaW5nIGluZm9ybWF0aW9uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVidWcoJiRzcCkKCXsKCQkkaW5mbyA9ICdTaW1wbGVQaWUgJyAuIFNJTVBMRVBJRV9WRVJTSU9OIC4gJyBCdWlsZCAnIC4gU0lNUExFUElFX0JVSUxEIC4gIlxuIjsKCQkkaW5mbyAuPSAnUEhQICcgLiBQSFBfVkVSU0lPTiAuICJcbiI7CgkJaWYgKCRzcC0+ZXJyb3IoKSAhPT0gbnVsbCkKCQl7CgkJCSRpbmZvIC49ICdFcnJvciBvY2N1cnJlZDogJyAuICRzcC0+ZXJyb3IoKSAuICJcbiI7CgkJfQoJCWVsc2UKCQl7CgkJCSRpbmZvIC49ICJObyBlcnJvciBmb3VuZC5cbiI7CgkJfQoJCSRpbmZvIC49ICJFeHRlbnNpb25zOlxuIjsKCQkkZXh0ZW5zaW9ucyA9IGFycmF5KCdwY3JlJywgJ2N1cmwnLCAnemxpYicsICdtYnN0cmluZycsICdpY29udicsICd4bWxyZWFkZXInLCAneG1sJyk7CgkJZm9yZWFjaCAoJGV4dGVuc2lvbnMgYXMgJGV4dCkKCQl7CgkJCWlmIChleHRlbnNpb25fbG9hZGVkKCRleHQpKQoJCQl7CgkJCQkkaW5mbyAuPSAiICAgICRleHQgbG9hZGVkXG4iOwoJCQkJc3dpdGNoICgkZXh0KQoJCQkJewoJCQkJCWNhc2UgJ3BjcmUnOgoJCQkJCQkkaW5mbyAuPSAnICAgICAgVmVyc2lvbiAnIC4gUENSRV9WRVJTSU9OIC4gIlxuIjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnY3VybCc6CgkJCQkJCSR2ZXJzaW9uID0gY3VybF92ZXJzaW9uKCk7CgkJCQkJCSRpbmZvIC49ICcgICAgICBWZXJzaW9uICcgLiAkdmVyc2lvblsndmVyc2lvbiddIC4gIlxuIjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnbWJzdHJpbmcnOgoJCQkJCQkkaW5mbyAuPSAnICAgICAgT3ZlcmxvYWRpbmc6ICcgLiBtYl9nZXRfaW5mbygnZnVuY19vdmVybG9hZCcpIC4gIlxuIjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnaWNvbnYnOgoJCQkJCQkkaW5mbyAuPSAnICAgICAgVmVyc2lvbiAnIC4gSUNPTlZfVkVSU0lPTiAuICJcbiI7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ3htbCc6CgkJCQkJCSRpbmZvIC49ICcgICAgICBWZXJzaW9uICcgLiBMSUJYTUxfRE9UVEVEX1ZFUlNJT04gLiAiXG4iOwoJCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRpbmZvIC49ICIgICAgJGV4dCBub3QgbG9hZGVkXG4iOwoJCQl9CgkJfQoJCXJldHVybiAkaW5mbzsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNpbGVuY2VfZXJyb3JzKCRudW0sICRzdHIpCgl7CgkJLy8gTm8tb3AKCX0KfQoKLyoqCiAqIENsYXNzIHRvIHZhbGlkYXRlIGFuZCB0byB3b3JrIHdpdGggSVB2NiBhZGRyZXNzZXMuCiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAc3VicGFja2FnZSBIVFRQCiAqIEBjb3B5cmlnaHQgMjAwMy0yMDA1IFRoZSBQSFAgR3JvdXAKICogQGxpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKICogQGxpbmsgaHR0cDovL3BlYXIucGhwLm5ldC9wYWNrYWdlL05ldF9JUHY2CiAqIEBhdXRob3IgQWxleGFuZGVyIE1lcnogPGFsZXhhbmRlci5tZXJ6QHdlYi5kZT4KICogQGF1dGhvciBlbGZyaW5rIGF0IGludHJvd2ViIGRvdCBubAogKiBAYXV0aG9yIEpvc2ggUGVjayA8am1wIGF0IGpvc2hwZWNrIGRvdCBvcmc+CiAqIEBhdXRob3IgR2VvZmZyZXkgU25lZGRvbiA8Z2VvZmZlcnNAZ21haWwuY29tPgogKi8KY2xhc3MgU2ltcGxlUGllX05ldF9JUHY2CnsKCS8qKgoJICogVW5jb21wcmVzc2VzIGFuIElQdjYgYWRkcmVzcwoJICoKCSAqIFJGQyA0MjkxIGFsbG93cyB5b3UgdG8gY29tcHJlc3MgY29uY2VjdXRpdmUgemVybyBwaWVjZXMgaW4gYW4gYWRkcmVzcyB0bwoJICogJzo6Jy4gVGhpcyBtZXRob2QgZXhwZWN0cyBhIHZhbGlkIElQdjYgYWRkcmVzcyBhbmQgZXhwYW5kcyB0aGUgJzo6JyB0bwoJICogdGhlIHJlcXVpcmVkIG51bWJlciBvZiB6ZXJvIHBpZWNlcy4KCSAqCgkgKiBFeGFtcGxlOiAgRkYwMTo6MTAxICAgLT4gIEZGMDE6MDowOjA6MDowOjA6MTAxCgkgKiAgICAgICAgICAgOjoxICAgICAgICAgLT4gIDA6MDowOjA6MDowOjA6MQoJICoKCSAqIEBhdXRob3IgQWxleGFuZGVyIE1lcnogPGFsZXhhbmRlci5tZXJ6QHdlYi5kZT4KCSAqIEBhdXRob3IgZWxmcmluayBhdCBpbnRyb3dlYiBkb3QgbmwKCSAqIEBhdXRob3IgSm9zaCBQZWNrIDxqbXAgYXQgam9zaHBlY2sgZG90IG9yZz4KCSAqIEBjb3B5cmlnaHQgMjAwMy0yMDA1IFRoZSBQSFAgR3JvdXAKCSAqIEBsaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwCgkgKiBAcGFyYW0gc3RyaW5nICRpcCBBbiBJUHY2IGFkZHJlc3MKCSAqIEByZXR1cm4gc3RyaW5nIFRoZSB1bmNvbXByZXNzZWQgSVB2NiBhZGRyZXNzCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdW5jb21wcmVzcygkaXApCgl7CgkJJGMxID0gLTE7CgkJJGMyID0gLTE7CgkJaWYgKHN1YnN0cl9jb3VudCgkaXAsICc6OicpID09PSAxKQoJCXsKCQkJbGlzdCgkaXAxLCAkaXAyKSA9IGV4cGxvZGUoJzo6JywgJGlwKTsKCQkJaWYgKCRpcDEgPT09ICcnKQoJCQl7CgkJCQkkYzEgPSAtMTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRjMSA9IHN1YnN0cl9jb3VudCgkaXAxLCAnOicpOwoJCQl9CgkJCWlmICgkaXAyID09PSAnJykKCQkJewoJCQkJJGMyID0gLTE7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkYzIgPSBzdWJzdHJfY291bnQoJGlwMiwgJzonKTsKCQkJfQoJCQlpZiAoc3RycG9zKCRpcDIsICcuJykgIT09IGZhbHNlKQoJCQl7CgkJCQkkYzIrKzsKCQkJfQoJCQkvLyA6OgoJCQlpZiAoJGMxID09PSAtMSAmJiAkYzIgPT09IC0xKQoJCQl7CgkJCQkkaXAgPSAnMDowOjA6MDowOjA6MDowJzsKCQkJfQoJCQkvLyA6Onh4eAoJCQllbHNlIGlmICgkYzEgPT09IC0xKQoJCQl7CgkJCQkkZmlsbCA9IHN0cl9yZXBlYXQoJzA6JywgNyAtICRjMik7CgkJCQkkaXAgPSBzdHJfcmVwbGFjZSgnOjonLCAkZmlsbCwgJGlwKTsKCQkJfQoJCQkvLyB4eHg6OgoJCQllbHNlIGlmICgkYzIgPT09IC0xKQoJCQl7CgkJCQkkZmlsbCA9IHN0cl9yZXBlYXQoJzowJywgNyAtICRjMSk7CgkJCQkkaXAgPSBzdHJfcmVwbGFjZSgnOjonLCAkZmlsbCwgJGlwKTsKCQkJfQoJCQkvLyB4eHg6Onh4eAoJCQllbHNlCgkJCXsKCQkJCSRmaWxsID0gJzonIC4gc3RyX3JlcGVhdCgnMDonLCA2IC0gJGMyIC0gJGMxKTsKCQkJCSRpcCA9IHN0cl9yZXBsYWNlKCc6OicsICRmaWxsLCAkaXApOwoJCQl9CgkJfQoJCXJldHVybiAkaXA7Cgl9CgoJLyoqCgkgKiBDb21wcmVzc2VzIGFuIElQdjYgYWRkcmVzcwoJICoKCSAqIFJGQyA0MjkxIGFsbG93cyB5b3UgdG8gY29tcHJlc3MgY29uY2VjdXRpdmUgemVybyBwaWVjZXMgaW4gYW4gYWRkcmVzcyB0bwoJICogJzo6Jy4gVGhpcyBtZXRob2QgZXhwZWN0cyBhIHZhbGlkIElQdjYgYWRkcmVzcyBhbmQgY29tcHJlc3NlcyBjb25zZWN1dGl2ZQoJICogemVybyBwaWVjZXMgdG8gJzo6Jy4KCSAqCgkgKiBFeGFtcGxlOiAgRkYwMTowOjA6MDowOjA6MDoxMDEgICAtPiAgRkYwMTo6MTAxCgkgKiAgICAgICAgICAgMDowOjA6MDowOjA6MDoxICAgICAgICAtPiAgOjoxCgkgKgoJICogQHNlZSB1bmNvbXByZXNzKCkKCSAqIEBwYXJhbSBzdHJpbmcgJGlwIEFuIElQdjYgYWRkcmVzcwoJICogQHJldHVybiBzdHJpbmcgVGhlIGNvbXByZXNzZWQgSVB2NiBhZGRyZXNzCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29tcHJlc3MoJGlwKQoJewoJCS8vIFByZXBhcmUgdGhlIElQIHRvIGJlIGNvbXByZXNzZWQKCQkkaXAgPSBzZWxmOjp1bmNvbXByZXNzKCRpcCk7CgkJJGlwX3BhcnRzID0gc2VsZjo6c3BsaXRfdjZfdjQoJGlwKTsKCgkJLy8gUmVwbGFjZSBhbGwgbGVhZGluZyB6ZXJvcwoJCSRpcF9wYXJ0c1swXSA9IHByZWdfcmVwbGFjZSgnLyhefDopMCsoWzAtOV0pLycsICdcMVwyJywgJGlwX3BhcnRzWzBdKTsKCgkJLy8gRmluZCBidW5jaGVzIG9mIHplcm9zCgkJaWYgKHByZWdfbWF0Y2hfYWxsKCcvKD86Xnw6KSg/OjAoPzo6fCQpKSsvJywgJGlwX3BhcnRzWzBdLCAkbWF0Y2hlcywgUFJFR19PRkZTRVRfQ0FQVFVSRSkpCgkJewoJCQkkbWF4ID0gMDsKCQkJJHBvcyA9IG51bGw7CgkJCWZvcmVhY2ggKCRtYXRjaGVzWzBdIGFzICRtYXRjaCkKCQkJewoJCQkJaWYgKHN0cmxlbigkbWF0Y2hbMF0pID4gJG1heCkKCQkJCXsKCQkJCQkkbWF4ID0gc3RybGVuKCRtYXRjaFswXSk7CgkJCQkJJHBvcyA9ICRtYXRjaFsxXTsKCQkJCX0KCQkJfQoKCQkJJGlwX3BhcnRzWzBdID0gc3Vic3RyX3JlcGxhY2UoJGlwX3BhcnRzWzBdLCAnOjonLCAkcG9zLCAkbWF4KTsKCQl9CgoJCWlmICgkaXBfcGFydHNbMV0gIT09ICcnKQoJCXsKCQkJcmV0dXJuIGltcGxvZGUoJzonLCAkaXBfcGFydHMpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gJGlwX3BhcnRzWzBdOwoJCX0KCX0KCgkvKioKCSAqIFNwbGl0cyBhbiBJUHY2IGFkZHJlc3MgaW50byB0aGUgSVB2NiBhbmQgSVB2NCByZXByZXNlbnRhdGlvbiBwYXJ0cwoJICoKCSAqIFJGQyA0MjkxIGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IHRoZSBsYXN0IHR3byBwYXJ0cyBvZiBhbiBJUHY2IGFkZHJlc3MKCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBJUHY0IHJlcHJlc2VudGF0aW9uCgkgKgoJICogRXhhbXBsZTogIDA6MDowOjA6MDowOjEzLjEuNjguMwoJICogICAgICAgICAgIDA6MDowOjA6MDpGRkZGOjEyOS4xNDQuNTIuMzgKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRpcCBBbiBJUHY2IGFkZHJlc3MKCSAqIEByZXR1cm4gYXJyYXkgWzBdIGNvbnRhaW5zIHRoZSBJUHY2IHJlcHJlc2VudGVkIHBhcnQsIGFuZCBbMV0gdGhlIElQdjQgcmVwcmVzZW50ZWQgcGFydAoJICovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBzcGxpdF92Nl92NCgkaXApCgl7CgkJaWYgKHN0cnBvcygkaXAsICcuJykgIT09IGZhbHNlKQoJCXsKCQkJJHBvcyA9IHN0cnJwb3MoJGlwLCAnOicpOwoJCQkkaXB2Nl9wYXJ0ID0gc3Vic3RyKCRpcCwgMCwgJHBvcyk7CgkJCSRpcHY0X3BhcnQgPSBzdWJzdHIoJGlwLCAkcG9zICsgMSk7CgkJCXJldHVybiBhcnJheSgkaXB2Nl9wYXJ0LCAkaXB2NF9wYXJ0KTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGFycmF5KCRpcCwgJycpOwoJCX0KCX0KCgkvKioKCSAqIENoZWNrcyBhbiBJUHY2IGFkZHJlc3MKCSAqCgkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIElQIGlzIGEgdmFsaWQgSVB2NiBhZGRyZXNzCgkgKgoJICogQHBhcmFtIHN0cmluZyAkaXAgQW4gSVB2NiBhZGRyZXNzCgkgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiAkaXAgaXMgYSB2YWxpZCBJUHY2IGFkZHJlc3MKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja19pcHY2KCRpcCkKCXsKCQkkaXAgPSBzZWxmOjp1bmNvbXByZXNzKCRpcCk7CgkJbGlzdCgkaXB2NiwgJGlwdjQpID0gc2VsZjo6c3BsaXRfdjZfdjQoJGlwKTsKCQkkaXB2NiA9IGV4cGxvZGUoJzonLCAkaXB2Nik7CgkJJGlwdjQgPSBleHBsb2RlKCcuJywgJGlwdjQpOwoJCWlmIChjb3VudCgkaXB2NikgPT09IDggJiYgY291bnQoJGlwdjQpID09PSAxIHx8IGNvdW50KCRpcHY2KSA9PT0gNiAmJiBjb3VudCgkaXB2NCkgPT09IDQpCgkJewoJCQlmb3JlYWNoICgkaXB2NiBhcyAkaXB2Nl9wYXJ0KQoJCQl7CgkJCQkvLyBUaGUgc2VjdGlvbiBjYW4ndCBiZSBlbXB0eQoJCQkJaWYgKCRpcHY2X3BhcnQgPT09ICcnKQoJCQkJCXJldHVybiBmYWxzZTsKCgkJCQkvLyBOb3IgY2FuIGl0IGJlIG92ZXIgZm91ciBjaGFyYWN0ZXJzCgkJCQlpZiAoc3RybGVuKCRpcHY2X3BhcnQpID4gNCkKCQkJCQlyZXR1cm4gZmFsc2U7CgoJCQkJLy8gUmVtb3ZlIGxlYWRpbmcgemVyb3MgKHRoaXMgaXMgc2FmZSBiZWNhdXNlIG9mIHRoZSBhYm92ZSkKCQkJCSRpcHY2X3BhcnQgPSBsdHJpbSgkaXB2Nl9wYXJ0LCAnMCcpOwoJCQkJaWYgKCRpcHY2X3BhcnQgPT09ICcnKQoJCQkJCSRpcHY2X3BhcnQgPSAnMCc7CgoJCQkJLy8gQ2hlY2sgdGhlIHZhbHVlIGlzIHZhbGlkCgkJCQkkdmFsdWUgPSBoZXhkZWMoJGlwdjZfcGFydCk7CgkJCQlpZiAoZGVjaGV4KCR2YWx1ZSkgIT09IHN0cnRvbG93ZXIoJGlwdjZfcGFydCkgfHwgJHZhbHVlIDwgMCB8fCAkdmFsdWUgPiAweEZGRkYpCgkJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCWlmIChjb3VudCgkaXB2NCkgPT09IDQpCgkJCXsKCQkJCWZvcmVhY2ggKCRpcHY0IGFzICRpcHY0X3BhcnQpCgkJCQl7CgkJCQkJJHZhbHVlID0gKGludCkgJGlwdjRfcGFydDsKCQkJCQlpZiAoKHN0cmluZykgJHZhbHVlICE9PSAkaXB2NF9wYXJ0IHx8ICR2YWx1ZSA8IDAgfHwgJHZhbHVlID4gMHhGRikKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0cnVlOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoKCS8qKgoJICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBJUCBpcyBhIHZhbGlkIElQdjYgYWRkcmVzcwoJICoKCSAqIEBjb2RlQ292ZXJhZ2VJZ25vcmUKCSAqIEBkZXByZWNhdGVkIFVzZSB7QHNlZSBTaW1wbGVQaWVfTmV0X0lQdjY6OmNoZWNrX2lwdjYoKX0gaW5zdGVhZAoJICogQHNlZSBjaGVja19pcHY2CgkgKiBAcGFyYW0gc3RyaW5nICRpcCBBbiBJUHY2IGFkZHJlc3MKCSAqIEByZXR1cm4gYm9vbCB0cnVlIGlmICRpcCBpcyBhIHZhbGlkIElQdjYgYWRkcmVzcwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrSVB2NigkaXApCgl7CgkJcmV0dXJuIHNlbGY6OmNoZWNrX2lwdjYoJGlwKTsKCX0KfQoKLyoqCiAqIERhdGUgUGFyc2VyCiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAc3VicGFja2FnZSBQYXJzaW5nCiAqLwpjbGFzcyBTaW1wbGVQaWVfUGFyc2VfRGF0ZQp7CgkvKioKCSAqIElucHV0IGRhdGEKCSAqCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRkYXRlOwoKCS8qKgoJICogTGlzdCBvZiBkYXlzLCBjYWxlbmRhciBkYXkgbmFtZSA9PiBvcmRpbmFsIGRheSBudW1iZXIgaW4gdGhlIHdlZWsKCSAqCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHZhciBhcnJheQoJICovCgl2YXIgJGRheSA9IGFycmF5KAoJCS8vIEVuZ2xpc2gKCQknbW9uJyA9PiAxLAoJCSdtb25kYXknID0+IDEsCgkJJ3R1ZScgPT4gMiwKCQkndHVlc2RheScgPT4gMiwKCQknd2VkJyA9PiAzLAoJCSd3ZWRuZXNkYXknID0+IDMsCgkJJ3RodScgPT4gNCwKCQkndGh1cnNkYXknID0+IDQsCgkJJ2ZyaScgPT4gNSwKCQknZnJpZGF5JyA9PiA1LAoJCSdzYXQnID0+IDYsCgkJJ3NhdHVyZGF5JyA9PiA2LAoJCSdzdW4nID0+IDcsCgkJJ3N1bmRheScgPT4gNywKCQkvLyBEdXRjaAoJCSdtYWFuZGFnJyA9PiAxLAoJCSdkaW5zZGFnJyA9PiAyLAoJCSd3b2Vuc2RhZycgPT4gMywKCQknZG9uZGVyZGFnJyA9PiA0LAoJCSd2cmlqZGFnJyA9PiA1LAoJCSd6YXRlcmRhZycgPT4gNiwKCQknem9uZGFnJyA9PiA3LAoJCS8vIEZyZW5jaAoJCSdsdW5kaScgPT4gMSwKCQknbWFyZGknID0+IDIsCgkJJ21lcmNyZWRpJyA9PiAzLAoJCSdqZXVkaScgPT4gNCwKCQkndmVuZHJlZGknID0+IDUsCgkJJ3NhbWVkaScgPT4gNiwKCQknZGltYW5jaGUnID0+IDcsCgkJLy8gR2VybWFuCgkJJ21vbnRhZycgPT4gMSwKCQknZGllbnN0YWcnID0+IDIsCgkJJ21pdHR3b2NoJyA9PiAzLAoJCSdkb25uZXJzdGFnJyA9PiA0LAoJCSdmcmVpdGFnJyA9PiA1LAoJCSdzYW1zdGFnJyA9PiA2LAoJCSdzb25uYWJlbmQnID0+IDYsCgkJJ3Nvbm50YWcnID0+IDcsCgkJLy8gSXRhbGlhbgoJCSdsdW5lZMOsJyA9PiAxLAoJCSdtYXJ0ZWTDrCcgPT4gMiwKCQknbWVyY29sZWTDrCcgPT4gMywKCQknZ2lvdmVkw6wnID0+IDQsCgkJJ3ZlbmVyZMOsJyA9PiA1LAoJCSdzYWJhdG8nID0+IDYsCgkJJ2RvbWVuaWNhJyA9PiA3LAoJCS8vIFNwYW5pc2gKCQknbHVuZXMnID0+IDEsCgkJJ21hcnRlcycgPT4gMiwKCQknbWnDqXJjb2xlcycgPT4gMywKCQknanVldmVzJyA9PiA0LAoJCSd2aWVybmVzJyA9PiA1LAoJCSdzw6FiYWRvJyA9PiA2LAoJCSdkb21pbmdvJyA9PiA3LAoJCS8vIEZpbm5pc2gKCQknbWFhbmFudGFpJyA9PiAxLAoJCSd0aWlzdGFpJyA9PiAyLAoJCSdrZXNraXZpaWtrbycgPT4gMywKCQkndG9yc3RhaScgPT4gNCwKCQkncGVyamFudGFpJyA9PiA1LAoJCSdsYXVhbnRhaScgPT4gNiwKCQknc3VubnVudGFpJyA9PiA3LAoJCS8vIEh1bmdhcmlhbgoJCSdow6l0ZsWRJyA9PiAxLAoJCSdrZWRkJyA9PiAyLAoJCSdzemVyZGEnID0+IDMsCgkJJ2Nzw7x0w7ZydG9rJyA9PiA0LAoJCSdww6ludGVrJyA9PiA1LAoJCSdzem9tYmF0JyA9PiA2LAoJCSd2YXPDoXJuYXAnID0+IDcsCgkJLy8gR3JlZWsKCQknzpTOtc+FJyA9PiAxLAoJCSfOpM+BzrknID0+IDIsCgkJJ86kzrXPhCcgPT4gMywKCQknzqDOtc68JyA9PiA0LAoJCSfOoM6xz4EnID0+IDUsCgkJJ86jzrHOsicgPT4gNiwKCQknzprPhc+BJyA9PiA3LAoJKTsKCgkvKioKCSAqIExpc3Qgb2YgbW9udGhzLCBjYWxlbmRhciBtb250aCBuYW1lID0+IGNhbGVuZGFyIG1vbnRoIG51bWJlcgoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkbW9udGggPSBhcnJheSgKCQkvLyBFbmdsaXNoCgkJJ2phbicgPT4gMSwKCQknamFudWFyeScgPT4gMSwKCQknZmViJyA9PiAyLAoJCSdmZWJydWFyeScgPT4gMiwKCQknbWFyJyA9PiAzLAoJCSdtYXJjaCcgPT4gMywKCQknYXByJyA9PiA0LAoJCSdhcHJpbCcgPT4gNCwKCQknbWF5JyA9PiA1LAoJCS8vIE5vIGxvbmcgZm9ybSBvZiBNYXkKCQknanVuJyA9PiA2LAoJCSdqdW5lJyA9PiA2LAoJCSdqdWwnID0+IDcsCgkJJ2p1bHknID0+IDcsCgkJJ2F1ZycgPT4gOCwKCQknYXVndXN0JyA9PiA4LAoJCSdzZXAnID0+IDksCgkJJ3NlcHRlbWJlcicgPT4gOCwKCQknb2N0JyA9PiAxMCwKCQknb2N0b2JlcicgPT4gMTAsCgkJJ25vdicgPT4gMTEsCgkJJ25vdmVtYmVyJyA9PiAxMSwKCQknZGVjJyA9PiAxMiwKCQknZGVjZW1iZXInID0+IDEyLAoJCS8vIER1dGNoCgkJJ2phbnVhcmknID0+IDEsCgkJJ2ZlYnJ1YXJpJyA9PiAyLAoJCSdtYWFydCcgPT4gMywKCQknYXByaWwnID0+IDQsCgkJJ21laScgPT4gNSwKCQknanVuaScgPT4gNiwKCQknanVsaScgPT4gNywKCQknYXVndXN0dXMnID0+IDgsCgkJJ3NlcHRlbWJlcicgPT4gOSwKCQknb2t0b2JlcicgPT4gMTAsCgkJJ25vdmVtYmVyJyA9PiAxMSwKCQknZGVjZW1iZXInID0+IDEyLAoJCS8vIEZyZW5jaAoJCSdqYW52aWVyJyA9PiAxLAoJCSdmw6l2cmllcicgPT4gMiwKCQknbWFycycgPT4gMywKCQknYXZyaWwnID0+IDQsCgkJJ21haScgPT4gNSwKCQknanVpbicgPT4gNiwKCQknanVpbGxldCcgPT4gNywKCQknYW/Du3QnID0+IDgsCgkJJ3NlcHRlbWJyZScgPT4gOSwKCQknb2N0b2JyZScgPT4gMTAsCgkJJ25vdmVtYnJlJyA9PiAxMSwKCQknZMOpY2VtYnJlJyA9PiAxMiwKCQkvLyBHZXJtYW4KCQknamFudWFyJyA9PiAxLAoJCSdmZWJydWFyJyA9PiAyLAoJCSdtw6RyeicgPT4gMywKCQknYXByaWwnID0+IDQsCgkJJ21haScgPT4gNSwKCQknanVuaScgPT4gNiwKCQknanVsaScgPT4gNywKCQknYXVndXN0JyA9PiA4LAoJCSdzZXB0ZW1iZXInID0+IDksCgkJJ29rdG9iZXInID0+IDEwLAoJCSdub3ZlbWJlcicgPT4gMTEsCgkJJ2RlemVtYmVyJyA9PiAxMiwKCQkvLyBJdGFsaWFuCgkJJ2dlbm5haW8nID0+IDEsCgkJJ2ZlYmJyYWlvJyA9PiAyLAoJCSdtYXJ6bycgPT4gMywKCQknYXByaWxlJyA9PiA0LAoJCSdtYWdnaW8nID0+IDUsCgkJJ2dpdWdubycgPT4gNiwKCQknbHVnbGlvJyA9PiA3LAoJCSdhZ29zdG8nID0+IDgsCgkJJ3NldHRlbWJyZScgPT4gOSwKCQknb3R0b2JyZScgPT4gMTAsCgkJJ25vdmVtYnJlJyA9PiAxMSwKCQknZGljZW1icmUnID0+IDEyLAoJCS8vIFNwYW5pc2gKCQknZW5lcm8nID0+IDEsCgkJJ2ZlYnJlcm8nID0+IDIsCgkJJ21hcnpvJyA9PiAzLAoJCSdhYnJpbCcgPT4gNCwKCQknbWF5bycgPT4gNSwKCQknanVuaW8nID0+IDYsCgkJJ2p1bGlvJyA9PiA3LAoJCSdhZ29zdG8nID0+IDgsCgkJJ3NlcHRpZW1icmUnID0+IDksCgkJJ3NldGllbWJyZScgPT4gOSwKCQknb2N0dWJyZScgPT4gMTAsCgkJJ25vdmllbWJyZScgPT4gMTEsCgkJJ2RpY2llbWJyZScgPT4gMTIsCgkJLy8gRmlubmlzaAoJCSd0YW1taWt1dScgPT4gMSwKCQknaGVsbWlrdXUnID0+IDIsCgkJJ21hYWxpc2t1dScgPT4gMywKCQknaHVodGlrdXUnID0+IDQsCgkJJ3RvdWtva3V1JyA9PiA1LAoJCSdrZXPDpGt1dScgPT4gNiwKCQknaGVpbsOka3V1JyA9PiA3LAoJCSdlbG9rdXUnID0+IDgsCgkJJ3N1dXNrdXUnID0+IDksCgkJJ2xva2FrdXUnID0+IDEwLAoJCSdtYXJyYXMnID0+IDExLAoJCSdqb3VsdWt1dScgPT4gMTIsCgkJLy8gSHVuZ2FyaWFuCgkJJ2phbnXDoXInID0+IDEsCgkJJ2ZlYnJ1w6FyJyA9PiAyLAoJCSdtw6FyY2l1cycgPT4gMywKCQknw6FwcmlsaXMnID0+IDQsCgkJJ23DoWp1cycgPT4gNSwKCQknasO6bml1cycgPT4gNiwKCQknasO6bGl1cycgPT4gNywKCQknYXVndXN6dHVzJyA9PiA4LAoJCSdzemVwdGVtYmVyJyA9PiA5LAoJCSdva3TDs2JlcicgPT4gMTAsCgkJJ25vdmVtYmVyJyA9PiAxMSwKCQknZGVjZW1iZXInID0+IDEyLAoJCS8vIEdyZWVrCgkJJ86ZzrHOvScgPT4gMSwKCQknzqbOtc6yJyA9PiAyLAoJCSfOnM6sz44nID0+IDMsCgkJJ86czrHPjicgPT4gMywKCQknzpHPgM+BJyA9PiA0LAoJCSfOnM6szrknID0+IDUsCgkJJ86czrHPiicgPT4gNSwKCQknzpzOsc65JyA9PiA1LAoJCSfOmc6/z43OvScgPT4gNiwKCQknzpnOv869JyA9PiA2LAoJCSfOmc6/z43OuycgPT4gNywKCQknzpnOv867JyA9PiA3LAoJCSfOkc+NzrMnID0+IDgsCgkJJ86Rz4XOsycgPT4gOCwKCQknzqPOtc+AJyA9PiA5LAoJCSfOn866z4QnID0+IDEwLAoJCSfOnc6/zq0nID0+IDExLAoJCSfOlM61zronID0+IDEyLAoJKTsKCgkvKioKCSAqIExpc3Qgb2YgdGltZXpvbmVzLCBhYmJyZXZpYXRpb24gPT4gb2Zmc2V0IGZyb20gVVRDCgkgKgoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICR0aW1lem9uZSA9IGFycmF5KAoJCSdBQ0RUJyA9PiAzNzgwMCwKCQknQUNJVCcgPT4gMjg4MDAsCgkJJ0FDU1QnID0+IDM0MjAwLAoJCSdBQ1QnID0+IC0xODAwMCwKCQknQUNXRFQnID0+IDM1MTAwLAoJCSdBQ1dTVCcgPT4gMzE1MDAsCgkJJ0FFRFQnID0+IDM5NjAwLAoJCSdBRVNUJyA9PiAzNjAwMCwKCQknQUZUJyA9PiAxNjIwMCwKCQknQUtEVCcgPT4gLTI4ODAwLAoJCSdBS1NUJyA9PiAtMzI0MDAsCgkJJ0FNRFQnID0+IDE4MDAwLAoJCSdBTVQnID0+IC0xNDQwMCwKCQknQU5BU1QnID0+IDQ2ODAwLAoJCSdBTkFUJyA9PiA0MzIwMCwKCQknQVJUJyA9PiAtMTA4MDAsCgkJJ0FaT1NUJyA9PiAtMzYwMCwKCQknQVpTVCcgPT4gMTgwMDAsCgkJJ0FaVCcgPT4gMTQ0MDAsCgkJJ0JJT1QnID0+IDIxNjAwLAoJCSdCSVQnID0+IC00MzIwMCwKCQknQk9UJyA9PiAtMTQ0MDAsCgkJJ0JSU1QnID0+IC03MjAwLAoJCSdCUlQnID0+IC0xMDgwMCwKCQknQlNUJyA9PiAzNjAwLAoJCSdCVFQnID0+IDIxNjAwLAoJCSdDQVNUJyA9PiAxODAwMCwKCQknQ0FUJyA9PiA3MjAwLAoJCSdDQ1QnID0+IDIzNDAwLAoJCSdDRFQnID0+IC0xODAwMCwKCQknQ0VEVCcgPT4gNzIwMCwKCQknQ0VUJyA9PiAzNjAwLAoJCSdDR1NUJyA9PiAtNzIwMCwKCQknQ0dUJyA9PiAtMTA4MDAsCgkJJ0NIQURUJyA9PiA0OTUwMCwKCQknQ0hBU1QnID0+IDQ1OTAwLAoJCSdDSVNUJyA9PiAtMjg4MDAsCgkJJ0NLVCcgPT4gLTM2MDAwLAoJCSdDTERUJyA9PiAtMTA4MDAsCgkJJ0NMU1QnID0+IC0xNDQwMCwKCQknQ09UJyA9PiAtMTgwMDAsCgkJJ0NTVCcgPT4gLTIxNjAwLAoJCSdDVlQnID0+IC0zNjAwLAoJCSdDWFQnID0+IDI1MjAwLAoJCSdEQVZUJyA9PiAyNTIwMCwKCQknRFRBVCcgPT4gMzYwMDAsCgkJJ0VBRFQnID0+IC0xODAwMCwKCQknRUFTVCcgPT4gLTIxNjAwLAoJCSdFQVQnID0+IDEwODAwLAoJCSdFQ1QnID0+IC0xODAwMCwKCQknRURUJyA9PiAtMTQ0MDAsCgkJJ0VFU1QnID0+IDEwODAwLAoJCSdFRVQnID0+IDcyMDAsCgkJJ0VHVCcgPT4gLTM2MDAsCgkJJ0VLU1QnID0+IDIxNjAwLAoJCSdFU1QnID0+IC0xODAwMCwKCQknRkpUJyA9PiA0MzIwMCwKCQknRktEVCcgPT4gLTEwODAwLAoJCSdGS1NUJyA9PiAtMTQ0MDAsCgkJJ0ZOVCcgPT4gLTcyMDAsCgkJJ0dBTFQnID0+IC0yMTYwMCwKCQknR0VEVCcgPT4gMTQ0MDAsCgkJJ0dFU1QnID0+IDEwODAwLAoJCSdHRlQnID0+IC0xMDgwMCwKCQknR0lMVCcgPT4gNDMyMDAsCgkJJ0dJVCcgPT4gLTMyNDAwLAoJCSdHU1QnID0+IDE0NDAwLAoJCSdHU1QnID0+IC03MjAwLAoJCSdHWVQnID0+IC0xNDQwMCwKCQknSEFBJyA9PiAtMTA4MDAsCgkJJ0hBQycgPT4gLTE4MDAwLAoJCSdIQURUJyA9PiAtMzI0MDAsCgkJJ0hBRScgPT4gLTE0NDAwLAoJCSdIQVAnID0+IC0yNTIwMCwKCQknSEFSJyA9PiAtMjE2MDAsCgkJJ0hBU1QnID0+IC0zNjAwMCwKCQknSEFUJyA9PiAtOTAwMCwKCQknSEFZJyA9PiAtMjg4MDAsCgkJJ0hLU1QnID0+IDI4ODAwLAoJCSdITVQnID0+IDE4MDAwLAoJCSdITkEnID0+IC0xNDQwMCwKCQknSE5DJyA9PiAtMjE2MDAsCgkJJ0hORScgPT4gLTE4MDAwLAoJCSdITlAnID0+IC0yODgwMCwKCQknSE5SJyA9PiAtMjUyMDAsCgkJJ0hOVCcgPT4gLTEyNjAwLAoJCSdITlknID0+IC0zMjQwMCwKCQknSVJEVCcgPT4gMTYyMDAsCgkJJ0lSS1NUJyA9PiAzMjQwMCwKCQknSVJLVCcgPT4gMjg4MDAsCgkJJ0lSU1QnID0+IDEyNjAwLAoJCSdKRkRUJyA9PiAtMTA4MDAsCgkJJ0pGU1QnID0+IC0xNDQwMCwKCQknSlNUJyA9PiAzMjQwMCwKCQknS0dTVCcgPT4gMjE2MDAsCgkJJ0tHVCcgPT4gMTgwMDAsCgkJJ0tPU1QnID0+IDM5NjAwLAoJCSdLT1ZTVCcgPT4gMjg4MDAsCgkJJ0tPVlQnID0+IDI1MjAwLAoJCSdLUkFTVCcgPT4gMjg4MDAsCgkJJ0tSQVQnID0+IDI1MjAwLAoJCSdLU1QnID0+IDMyNDAwLAoJCSdMSERUJyA9PiAzOTYwMCwKCQknTEhTVCcgPT4gMzc4MDAsCgkJJ0xJTlQnID0+IDUwNDAwLAoJCSdMS1QnID0+IDIxNjAwLAoJCSdNQUdTVCcgPT4gNDMyMDAsCgkJJ01BR1QnID0+IDM5NjAwLAoJCSdNQVdUJyA9PiAyMTYwMCwKCQknTURUJyA9PiAtMjE2MDAsCgkJJ01FU1onID0+IDcyMDAsCgkJJ01FWicgPT4gMzYwMCwKCQknTUhUJyA9PiA0MzIwMCwKCQknTUlUJyA9PiAtMzQyMDAsCgkJJ01OU1QnID0+IDMyNDAwLAoJCSdNU0RUJyA9PiAxNDQwMCwKCQknTVNTVCcgPT4gMTA4MDAsCgkJJ01TVCcgPT4gLTI1MjAwLAoJCSdNVVQnID0+IDE0NDAwLAoJCSdNVlQnID0+IDE4MDAwLAoJCSdNWVQnID0+IDI4ODAwLAoJCSdOQ1QnID0+IDM5NjAwLAoJCSdORFQnID0+IC05MDAwLAoJCSdORlQnID0+IDQxNDAwLAoJCSdOTUlUJyA9PiAzNjAwMCwKCQknTk9WU1QnID0+IDI1MjAwLAoJCSdOT1ZUJyA9PiAyMTYwMCwKCQknTlBUJyA9PiAyMDcwMCwKCQknTlJUJyA9PiA0MzIwMCwKCQknTlNUJyA9PiAtMTI2MDAsCgkJJ05VVCcgPT4gLTM5NjAwLAoJCSdOWkRUJyA9PiA0NjgwMCwKCQknTlpTVCcgPT4gNDMyMDAsCgkJJ09NU1NUJyA9PiAyNTIwMCwKCQknT01TVCcgPT4gMjE2MDAsCgkJJ1BEVCcgPT4gLTI1MjAwLAoJCSdQRVQnID0+IC0xODAwMCwKCQknUEVUU1QnID0+IDQ2ODAwLAoJCSdQRVRUJyA9PiA0MzIwMCwKCQknUEdUJyA9PiAzNjAwMCwKCQknUEhPVCcgPT4gNDY4MDAsCgkJJ1BIVCcgPT4gMjg4MDAsCgkJJ1BLVCcgPT4gMTgwMDAsCgkJJ1BNRFQnID0+IC03MjAwLAoJCSdQTVNUJyA9PiAtMTA4MDAsCgkJJ1BPTlQnID0+IDM5NjAwLAoJCSdQU1QnID0+IC0yODgwMCwKCQknUFdUJyA9PiAzMjQwMCwKCQknUFlTVCcgPT4gLTEwODAwLAoJCSdQWVQnID0+IC0xNDQwMCwKCQknUkVUJyA9PiAxNDQwMCwKCQknUk9UVCcgPT4gLTEwODAwLAoJCSdTQU1TVCcgPT4gMTgwMDAsCgkJJ1NBTVQnID0+IDE0NDAwLAoJCSdTQVNUJyA9PiA3MjAwLAoJCSdTQlQnID0+IDM5NjAwLAoJCSdTQ0RUJyA9PiA0NjgwMCwKCQknU0NTVCcgPT4gNDMyMDAsCgkJJ1NDVCcgPT4gMTQ0MDAsCgkJJ1NFU1QnID0+IDM2MDAsCgkJJ1NHVCcgPT4gMjg4MDAsCgkJJ1NJVCcgPT4gMjg4MDAsCgkJJ1NSVCcgPT4gLTEwODAwLAoJCSdTU1QnID0+IC0zOTYwMCwKCQknU1lTVCcgPT4gMTA4MDAsCgkJJ1NZVCcgPT4gNzIwMCwKCQknVEZUJyA9PiAxODAwMCwKCQknVEhBVCcgPT4gLTM2MDAwLAoJCSdUSlQnID0+IDE4MDAwLAoJCSdUS1QnID0+IC0zNjAwMCwKCQknVE1UJyA9PiAxODAwMCwKCQknVE9UJyA9PiA0NjgwMCwKCQknVFBUJyA9PiAzMjQwMCwKCQknVFJVVCcgPT4gMzYwMDAsCgkJJ1RWVCcgPT4gNDMyMDAsCgkJJ1RXVCcgPT4gMjg4MDAsCgkJJ1VZU1QnID0+IC03MjAwLAoJCSdVWVQnID0+IC0xMDgwMCwKCQknVVpUJyA9PiAxODAwMCwKCQknVkVUJyA9PiAtMTQ0MDAsCgkJJ1ZMQVNUJyA9PiAzOTYwMCwKCQknVkxBVCcgPT4gMzYwMDAsCgkJJ1ZPU1QnID0+IDIxNjAwLAoJCSdWVVQnID0+IDM5NjAwLAoJCSdXQVNUJyA9PiA3MjAwLAoJCSdXQVQnID0+IDM2MDAsCgkJJ1dEVCcgPT4gMzI0MDAsCgkJJ1dFU1QnID0+IDM2MDAsCgkJJ1dGVCcgPT4gNDMyMDAsCgkJJ1dJQicgPT4gMjUyMDAsCgkJJ1dJVCcgPT4gMzI0MDAsCgkJJ1dJVEEnID0+IDI4ODAwLAoJCSdXS1NUJyA9PiAxODAwMCwKCQknV1NUJyA9PiAyODgwMCwKCQknWUFLU1QnID0+IDM2MDAwLAoJCSdZQUtUJyA9PiAzMjQwMCwKCQknWUFQVCcgPT4gMzYwMDAsCgkJJ1lFS1NUJyA9PiAyMTYwMCwKCQknWUVLVCcgPT4gMTgwMDAsCgkpOwoKCS8qKgoJICogQ2FjaGVkIFBDUkUgZm9yIFNpbXBsZVBpZV9QYXJzZV9EYXRlOjokZGF5CgkgKgoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkZGF5X3BjcmU7CgoJLyoqCgkgKiBDYWNoZWQgUENSRSBmb3IgU2ltcGxlUGllX1BhcnNlX0RhdGU6OiRtb250aAoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJG1vbnRoX3BjcmU7CgoJLyoqCgkgKiBBcnJheSBvZiB1c2VyLWFkZGVkIGNhbGxiYWNrIG1ldGhvZHMKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICRidWlsdF9pbiA9IGFycmF5KCk7CgoJLyoqCgkgKiBBcnJheSBvZiB1c2VyLWFkZGVkIGNhbGxiYWNrIG1ldGhvZHMKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICR1c2VyID0gYXJyYXkoKTsKCgkvKioKCSAqIENyZWF0ZSBuZXcgU2ltcGxlUGllX1BhcnNlX0RhdGUgb2JqZWN0LCBhbmQgc2V0IHNlbGY6OmRheV9wY3JlLAoJICogc2VsZjo6bW9udGhfcGNyZSwgYW5kIHNlbGY6OmJ1aWx0X2luCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCgl7CgkJJHRoaXMtPmRheV9wY3JlID0gJygnIC4gaW1wbG9kZShhcnJheV9rZXlzKCR0aGlzLT5kYXkpLCAnfCcpIC4gJyknOwoJCSR0aGlzLT5tb250aF9wY3JlID0gJygnIC4gaW1wbG9kZShhcnJheV9rZXlzKCR0aGlzLT5tb250aCksICd8JykgLiAnKSc7CgoJCXN0YXRpYyAkY2FjaGU7CgkJaWYgKCFpc3NldCgkY2FjaGVbZ2V0X2NsYXNzKCR0aGlzKV0pKQoJCXsKCQkJJGFsbF9tZXRob2RzID0gZ2V0X2NsYXNzX21ldGhvZHMoJHRoaXMpOwoKCQkJZm9yZWFjaCAoJGFsbF9tZXRob2RzIGFzICRtZXRob2QpCgkJCXsKCQkJCWlmIChzdHJ0b2xvd2VyKHN1YnN0cigkbWV0aG9kLCAwLCA1KSkgPT09ICdkYXRlXycpCgkJCQl7CgkJCQkJJGNhY2hlW2dldF9jbGFzcygkdGhpcyldW10gPSAkbWV0aG9kOwoJCQkJfQoJCQl9CgkJfQoKCQlmb3JlYWNoICgkY2FjaGVbZ2V0X2NsYXNzKCR0aGlzKV0gYXMgJG1ldGhvZCkKCQl7CgkJCSR0aGlzLT5idWlsdF9pbltdID0gJG1ldGhvZDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIG9iamVjdAoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KCkKCXsKCQlzdGF0aWMgJG9iamVjdDsKCQlpZiAoISRvYmplY3QpCgkJewoJCQkkb2JqZWN0ID0gbmV3IFNpbXBsZVBpZV9QYXJzZV9EYXRlOwoJCX0KCQlyZXR1cm4gJG9iamVjdDsKCX0KCgkvKioKCSAqIFBhcnNlIGEgZGF0ZQoJICoKCSAqIEBmaW5hbAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGUgRGF0ZSB0byBwYXJzZQoJICogQHJldHVybiBpbnQgVGltZXN0YW1wIGNvcnJlc3BvbmRpbmcgdG8gZGF0ZSBzdHJpbmcsIG9yIGZhbHNlIG9uIGZhaWx1cmUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHBhcnNlKCRkYXRlKQoJewoJCWZvcmVhY2ggKCR0aGlzLT51c2VyIGFzICRtZXRob2QpCgkJewoJCQlpZiAoKCRyZXR1cm5lZCA9IGNhbGxfdXNlcl9mdW5jKCRtZXRob2QsICRkYXRlKSkgIT09IGZhbHNlKQoJCQl7CgkJCQlyZXR1cm4gJHJldHVybmVkOwoJCQl9CgkJfQoKCQlmb3JlYWNoICgkdGhpcy0+YnVpbHRfaW4gYXMgJG1ldGhvZCkKCQl7CgkJCWlmICgoJHJldHVybmVkID0gY2FsbF91c2VyX2Z1bmMoYXJyYXkoJHRoaXMsICRtZXRob2QpLCAkZGF0ZSkpICE9PSBmYWxzZSkKCQkJewoJCQkJcmV0dXJuICRyZXR1cm5lZDsKCQkJfQoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQWRkIGEgY2FsbGJhY2sgbWV0aG9kIHRvIHBhcnNlIGEgZGF0ZQoJICoKCSAqIEBmaW5hbAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBjYWxsYmFjayAkY2FsbGJhY2sKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFkZF9jYWxsYmFjaygkY2FsbGJhY2spCgl7CgkJaWYgKGlzX2NhbGxhYmxlKCRjYWxsYmFjaykpCgkJewoJCQkkdGhpcy0+dXNlcltdID0gJGNhbGxiYWNrOwoJCX0KCQllbHNlCgkJewoJCQl0cmlnZ2VyX2Vycm9yKCdVc2VyLXN1cHBsaWVkIGZ1bmN0aW9uIG11c3QgYmUgYSB2YWxpZCBjYWxsYmFjaycsIEVfVVNFUl9XQVJOSU5HKTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSBhIHN1cGVyc2V0IG9mIFczQy1EVEYgKGFsbG93cyBoeXBoZW5zIGFuZCBjb2xvbnMgdG8gYmUgb21pdHRlZCwgYXMKCSAqIHdlbGwgYXMgYWxsb3dpbmcgYW55IG9mIHVwcGVyIG9yIGxvd2VyIGNhc2UgIlQiLCBob3Jpem9udGFsIHRhYnMsIG9yCgkgKiBzcGFjZXMgdG8gYmUgdXNlZCBhcyB0aGUgdGltZSBzZXBlcmF0b3IgKGluY2x1ZGluZyBtb3JlIHRoYW4gb25lKSkKCSAqCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHJldHVybiBpbnQgVGltZXN0YW1wCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBkYXRlX3czY2R0ZigkZGF0ZSkKCXsKCQlzdGF0aWMgJHBjcmU7CgkJaWYgKCEkcGNyZSkKCQl7CgkJCSR5ZWFyID0gJyhbMC05XXs0fSknOwoJCQkkbW9udGggPSAkZGF5ID0gJGhvdXIgPSAkbWludXRlID0gJHNlY29uZCA9ICcoWzAtOV17Mn0pJzsKCQkJJGRlY2ltYWwgPSAnKFswLTldKiknOwoJCQkkem9uZSA9ICcoPzooWil8KFsrXC1dKShbMC05XXsxLDJ9KTo/KFswLTldezEsMn0pKSc7CgkJCSRwY3JlID0gJy9eJyAuICR5ZWFyIC4gJyg/Oi0/JyAuICRtb250aCAuICcoPzotPycgLiAkZGF5IC4gJyg/OltUdFx4MDlceDIwXSsnIC4gJGhvdXIgLiAnKD86Oj8nIC4gJG1pbnV0ZSAuICcoPzo6PycgLiAkc2Vjb25kIC4gJyg/Oi4nIC4gJGRlY2ltYWwgLiAnKT8pPyk/JyAuICR6b25lIC4gJyk/KT8pPyQvJzsKCQl9CgkJaWYgKHByZWdfbWF0Y2goJHBjcmUsICRkYXRlLCAkbWF0Y2gpKQoJCXsKCQkJLyoKCQkJQ2FwdHVyaW5nIHN1YnBhdHRlcm5zOgoJCQkxOiBZZWFyCgkJCTI6IE1vbnRoCgkJCTM6IERheQoJCQk0OiBIb3VyCgkJCTU6IE1pbnV0ZQoJCQk2OiBTZWNvbmQKCQkJNzogRGVjaW1hbCBmcmFjdGlvbiBvZiBhIHNlY29uZAoJCQk4OiBadWx1CgkJCTk6IFRpbWV6b25lIMKxCgkJCTEwOiBUaW1lem9uZSBob3VycwoJCQkxMTogVGltZXpvbmUgbWludXRlcwoJCQkqLwoKCQkJLy8gRmlsbCBpbiBlbXB0eSBtYXRjaGVzCgkJCWZvciAoJGkgPSBjb3VudCgkbWF0Y2gpOyAkaSA8PSAzOyAkaSsrKQoJCQl7CgkJCQkkbWF0Y2hbJGldID0gJzEnOwoJCQl9CgoJCQlmb3IgKCRpID0gY291bnQoJG1hdGNoKTsgJGkgPD0gNzsgJGkrKykKCQkJewoJCQkJJG1hdGNoWyRpXSA9ICcwJzsKCQkJfQoKCQkJLy8gTnVtZXJpYyB0aW1lem9uZQoJCQlpZiAoaXNzZXQoJG1hdGNoWzldKSAmJiAkbWF0Y2hbOV0gIT09ICcnKQoJCQl7CgkJCQkkdGltZXpvbmUgPSAkbWF0Y2hbMTBdICogMzYwMDsKCQkJCSR0aW1lem9uZSArPSAkbWF0Y2hbMTFdICogNjA7CgkJCQlpZiAoJG1hdGNoWzldID09PSAnLScpCgkJCQl7CgkJCQkJJHRpbWV6b25lID0gMCAtICR0aW1lem9uZTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aW1lem9uZSA9IDA7CgkJCX0KCgkJCS8vIENvbnZlcnQgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIGFuIGludGVnZXIsIHRha2luZyBkZWNpbWFscyBpbnRvIGFjY291bnQKCQkJJHNlY29uZCA9IHJvdW5kKCRtYXRjaFs2XSArICRtYXRjaFs3XSAvIHBvdygxMCwgc3RybGVuKCRtYXRjaFs3XSkpKTsKCgkJCXJldHVybiBnbW1rdGltZSgkbWF0Y2hbNF0sICRtYXRjaFs1XSwgJHNlY29uZCwgJG1hdGNoWzJdLCAkbWF0Y2hbM10sICRtYXRjaFsxXSkgLSAkdGltZXpvbmU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBSZW1vdmUgUkZDODIyIGNvbW1lbnRzCgkgKgoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgRGF0YSB0byBzdHJpcCBjb21tZW50cyBmcm9tCgkgKiBAcmV0dXJuIHN0cmluZyBDb21tZW50IHN0cmlwcGVkIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlX3JmYzI4MjJfY29tbWVudHMoJHN0cmluZykKCXsKCQkkc3RyaW5nID0gKHN0cmluZykgJHN0cmluZzsKCQkkcG9zaXRpb24gPSAwOwoJCSRsZW5ndGggPSBzdHJsZW4oJHN0cmluZyk7CgkJJGRlcHRoID0gMDsKCgkJJG91dHB1dCA9ICcnOwoKCQl3aGlsZSAoJHBvc2l0aW9uIDwgJGxlbmd0aCAmJiAoJHBvcyA9IHN0cnBvcygkc3RyaW5nLCAnKCcsICRwb3NpdGlvbikpICE9PSBmYWxzZSkKCQl7CgkJCSRvdXRwdXQgLj0gc3Vic3RyKCRzdHJpbmcsICRwb3NpdGlvbiwgJHBvcyAtICRwb3NpdGlvbik7CgkJCSRwb3NpdGlvbiA9ICRwb3MgKyAxOwoJCQlpZiAoJHN0cmluZ1skcG9zIC0gMV0gIT09ICdcXCcpCgkJCXsKCQkJCSRkZXB0aCsrOwoJCQkJd2hpbGUgKCRkZXB0aCAmJiAkcG9zaXRpb24gPCAkbGVuZ3RoKQoJCQkJewoJCQkJCSRwb3NpdGlvbiArPSBzdHJjc3BuKCRzdHJpbmcsICcoKScsICRwb3NpdGlvbik7CgkJCQkJaWYgKCRzdHJpbmdbJHBvc2l0aW9uIC0gMV0gPT09ICdcXCcpCgkJCQkJewoJCQkJCQkkcG9zaXRpb24rKzsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJCWVsc2VpZiAoaXNzZXQoJHN0cmluZ1skcG9zaXRpb25dKSkKCQkJCQl7CgkJCQkJCXN3aXRjaCAoJHN0cmluZ1skcG9zaXRpb25dKQoJCQkJCQl7CgkJCQkJCQljYXNlICcoJzoKCQkJCQkJCQkkZGVwdGgrKzsKCQkJCQkJCQlicmVhazsKCgkJCQkJCQljYXNlICcpJzoKCQkJCQkJCQkkZGVwdGgtLTsKCQkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQkkcG9zaXRpb24rKzsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJG91dHB1dCAuPSAnKCc7CgkJCX0KCQl9CgkJJG91dHB1dCAuPSBzdWJzdHIoJHN0cmluZywgJHBvc2l0aW9uKTsKCgkJcmV0dXJuICRvdXRwdXQ7Cgl9CgoJLyoqCgkgKiBQYXJzZSBSRkMyODIyJ3MgZGF0ZSBmb3JtYXQKCSAqCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHJldHVybiBpbnQgVGltZXN0YW1wCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBkYXRlX3JmYzI4MjIoJGRhdGUpCgl7CgkJc3RhdGljICRwY3JlOwoJCWlmICghJHBjcmUpCgkJewoJCQkkd3NwID0gJ1tceDA5XHgyMF0nOwoJCQkkZndzID0gJyg/OicgLiAkd3NwIC4gJyt8JyAuICR3c3AgLiAnKig/Olx4MERceDBBJyAuICR3c3AgLiAnKykrKSc7CgkJCSRvcHRpb25hbF9md3MgPSAkZndzIC4gJz8nOwoJCQkkZGF5X25hbWUgPSAkdGhpcy0+ZGF5X3BjcmU7CgkJCSRtb250aCA9ICR0aGlzLT5tb250aF9wY3JlOwoJCQkkZGF5ID0gJyhbMC05XXsxLDJ9KSc7CgkJCSRob3VyID0gJG1pbnV0ZSA9ICRzZWNvbmQgPSAnKFswLTldezJ9KSc7CgkJCSR5ZWFyID0gJyhbMC05XXsyLDR9KSc7CgkJCSRudW1fem9uZSA9ICcoWytcLV0pKFswLTldezJ9KShbMC05XXsyfSknOwoJCQkkY2hhcmFjdGVyX3pvbmUgPSAnKFtBLVpdezEsNX0pJzsKCQkJJHpvbmUgPSAnKD86JyAuICRudW1fem9uZSAuICd8JyAuICRjaGFyYWN0ZXJfem9uZSAuICcpJzsKCQkJJHBjcmUgPSAnLyg/OicgLiAkb3B0aW9uYWxfZndzIC4gJGRheV9uYW1lIC4gJG9wdGlvbmFsX2Z3cyAuICcsKT8nIC4gJG9wdGlvbmFsX2Z3cyAuICRkYXkgLiAkZndzIC4gJG1vbnRoIC4gJGZ3cyAuICR5ZWFyIC4gJGZ3cyAuICRob3VyIC4gJG9wdGlvbmFsX2Z3cyAuICc6JyAuICRvcHRpb25hbF9md3MgLiAkbWludXRlIC4gJyg/OicgLiAkb3B0aW9uYWxfZndzIC4gJzonIC4gJG9wdGlvbmFsX2Z3cyAuICRzZWNvbmQgLiAnKT8nIC4gJGZ3cyAuICR6b25lIC4gJy9pJzsKCQl9CgkJaWYgKHByZWdfbWF0Y2goJHBjcmUsICR0aGlzLT5yZW1vdmVfcmZjMjgyMl9jb21tZW50cygkZGF0ZSksICRtYXRjaCkpCgkJewoJCQkvKgoJCQlDYXB0dXJpbmcgc3VicGF0dGVybnM6CgkJCTE6IERheSBuYW1lCgkJCTI6IERheQoJCQkzOiBNb250aAoJCQk0OiBZZWFyCgkJCTU6IEhvdXIKCQkJNjogTWludXRlCgkJCTc6IFNlY29uZAoJCQk4OiBUaW1lem9uZSDCsQoJCQk5OiBUaW1lem9uZSBob3VycwoJCQkxMDogVGltZXpvbmUgbWludXRlcwoJCQkxMTogQWxwaGFiZXRpYyB0aW1lem9uZQoJCQkqLwoKCQkJLy8gRmluZCB0aGUgbW9udGggbnVtYmVyCgkJCSRtb250aCA9ICR0aGlzLT5tb250aFtzdHJ0b2xvd2VyKCRtYXRjaFszXSldOwoKCQkJLy8gTnVtZXJpYyB0aW1lem9uZQoJCQlpZiAoJG1hdGNoWzhdICE9PSAnJykKCQkJewoJCQkJJHRpbWV6b25lID0gJG1hdGNoWzldICogMzYwMDsKCQkJCSR0aW1lem9uZSArPSAkbWF0Y2hbMTBdICogNjA7CgkJCQlpZiAoJG1hdGNoWzhdID09PSAnLScpCgkJCQl7CgkJCQkJJHRpbWV6b25lID0gMCAtICR0aW1lem9uZTsKCQkJCX0KCQkJfQoJCQkvLyBDaGFyYWN0ZXIgdGltZXpvbmUKCQkJZWxzZWlmIChpc3NldCgkdGhpcy0+dGltZXpvbmVbc3RydG91cHBlcigkbWF0Y2hbMTFdKV0pKQoJCQl7CgkJCQkkdGltZXpvbmUgPSAkdGhpcy0+dGltZXpvbmVbc3RydG91cHBlcigkbWF0Y2hbMTFdKV07CgkJCX0KCQkJLy8gQXNzdW1lIGV2ZXJ5dGhpbmcgZWxzZSB0byBiZSAtMDAwMAoJCQllbHNlCgkJCXsKCQkJCSR0aW1lem9uZSA9IDA7CgkJCX0KCgkJCS8vIERlYWwgd2l0aCAyLzMgZGlnaXQgeWVhcnMKCQkJaWYgKCRtYXRjaFs0XSA8IDUwKQoJCQl7CgkJCQkkbWF0Y2hbNF0gKz0gMjAwMDsKCQkJfQoJCQllbHNlaWYgKCRtYXRjaFs0XSA8IDEwMDApCgkJCXsKCQkJCSRtYXRjaFs0XSArPSAxOTAwOwoJCQl9CgoJCQkvLyBTZWNvbmQgaXMgb3B0aW9uYWwsIGlmIGl0IGlzIGVtcHR5IHNldCBpdCB0byB6ZXJvCgkJCWlmICgkbWF0Y2hbN10gIT09ICcnKQoJCQl7CgkJCQkkc2Vjb25kID0gJG1hdGNoWzddOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHNlY29uZCA9IDA7CgkJCX0KCgkJCXJldHVybiBnbW1rdGltZSgkbWF0Y2hbNV0sICRtYXRjaFs2XSwgJHNlY29uZCwgJG1vbnRoLCAkbWF0Y2hbMl0sICRtYXRjaFs0XSkgLSAkdGltZXpvbmU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSBSRkM4NTAncyBkYXRlIGZvcm1hdAoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAcmV0dXJuIGludCBUaW1lc3RhbXAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGRhdGVfcmZjODUwKCRkYXRlKQoJewoJCXN0YXRpYyAkcGNyZTsKCQlpZiAoISRwY3JlKQoJCXsKCQkJJHNwYWNlID0gJ1tceDA5XHgyMF0rJzsKCQkJJGRheV9uYW1lID0gJHRoaXMtPmRheV9wY3JlOwoJCQkkbW9udGggPSAkdGhpcy0+bW9udGhfcGNyZTsKCQkJJGRheSA9ICcoWzAtOV17MSwyfSknOwoJCQkkeWVhciA9ICRob3VyID0gJG1pbnV0ZSA9ICRzZWNvbmQgPSAnKFswLTldezJ9KSc7CgkJCSR6b25lID0gJyhbQS1aXXsxLDV9KSc7CgkJCSRwY3JlID0gJy9eJyAuICRkYXlfbmFtZSAuICcsJyAuICRzcGFjZSAuICRkYXkgLiAnLScgLiAkbW9udGggLiAnLScgLiAkeWVhciAuICRzcGFjZSAuICRob3VyIC4gJzonIC4gJG1pbnV0ZSAuICc6JyAuICRzZWNvbmQgLiAkc3BhY2UgLiAkem9uZSAuICckL2knOwoJCX0KCQlpZiAocHJlZ19tYXRjaCgkcGNyZSwgJGRhdGUsICRtYXRjaCkpCgkJewoJCQkvKgoJCQlDYXB0dXJpbmcgc3VicGF0dGVybnM6CgkJCTE6IERheSBuYW1lCgkJCTI6IERheQoJCQkzOiBNb250aAoJCQk0OiBZZWFyCgkJCTU6IEhvdXIKCQkJNjogTWludXRlCgkJCTc6IFNlY29uZAoJCQk4OiBUaW1lem9uZQoJCQkqLwoKCQkJLy8gTW9udGgKCQkJJG1vbnRoID0gJHRoaXMtPm1vbnRoW3N0cnRvbG93ZXIoJG1hdGNoWzNdKV07CgoJCQkvLyBDaGFyYWN0ZXIgdGltZXpvbmUKCQkJaWYgKGlzc2V0KCR0aGlzLT50aW1lem9uZVtzdHJ0b3VwcGVyKCRtYXRjaFs4XSldKSkKCQkJewoJCQkJJHRpbWV6b25lID0gJHRoaXMtPnRpbWV6b25lW3N0cnRvdXBwZXIoJG1hdGNoWzhdKV07CgkJCX0KCQkJLy8gQXNzdW1lIGV2ZXJ5dGhpbmcgZWxzZSB0byBiZSAtMDAwMAoJCQllbHNlCgkJCXsKCQkJCSR0aW1lem9uZSA9IDA7CgkJCX0KCgkJCS8vIERlYWwgd2l0aCAyIGRpZ2l0IHllYXIKCQkJaWYgKCRtYXRjaFs0XSA8IDUwKQoJCQl7CgkJCQkkbWF0Y2hbNF0gKz0gMjAwMDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRtYXRjaFs0XSArPSAxOTAwOwoJCQl9CgoJCQlyZXR1cm4gZ21ta3RpbWUoJG1hdGNoWzVdLCAkbWF0Y2hbNl0sICRtYXRjaFs3XSwgJG1vbnRoLCAkbWF0Y2hbMl0sICRtYXRjaFs0XSkgLSAkdGltZXpvbmU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSBDOTkncyBhc2N0aW1lKCkncyBkYXRlIGZvcm1hdAoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAcmV0dXJuIGludCBUaW1lc3RhbXAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGRhdGVfYXNjdGltZSgkZGF0ZSkKCXsKCQlzdGF0aWMgJHBjcmU7CgkJaWYgKCEkcGNyZSkKCQl7CgkJCSRzcGFjZSA9ICdbXHgwOVx4MjBdKyc7CgkJCSR3ZGF5X25hbWUgPSAkdGhpcy0+ZGF5X3BjcmU7CgkJCSRtb25fbmFtZSA9ICR0aGlzLT5tb250aF9wY3JlOwoJCQkkZGF5ID0gJyhbMC05XXsxLDJ9KSc7CgkJCSRob3VyID0gJHNlYyA9ICRtaW4gPSAnKFswLTldezJ9KSc7CgkJCSR5ZWFyID0gJyhbMC05XXs0fSknOwoJCQkkdGVybWluYXRvciA9ICdceDBBP1x4MDA/JzsKCQkJJHBjcmUgPSAnL14nIC4gJHdkYXlfbmFtZSAuICRzcGFjZSAuICRtb25fbmFtZSAuICRzcGFjZSAuICRkYXkgLiAkc3BhY2UgLiAkaG91ciAuICc6JyAuICRtaW4gLiAnOicgLiAkc2VjIC4gJHNwYWNlIC4gJHllYXIgLiAkdGVybWluYXRvciAuICckL2knOwoJCX0KCQlpZiAocHJlZ19tYXRjaCgkcGNyZSwgJGRhdGUsICRtYXRjaCkpCgkJewoJCQkvKgoJCQlDYXB0dXJpbmcgc3VicGF0dGVybnM6CgkJCTE6IERheSBuYW1lCgkJCTI6IE1vbnRoCgkJCTM6IERheQoJCQk0OiBIb3VyCgkJCTU6IE1pbnV0ZQoJCQk2OiBTZWNvbmQKCQkJNzogWWVhcgoJCQkqLwoKCQkJJG1vbnRoID0gJHRoaXMtPm1vbnRoW3N0cnRvbG93ZXIoJG1hdGNoWzJdKV07CgkJCXJldHVybiBnbW1rdGltZSgkbWF0Y2hbNF0sICRtYXRjaFs1XSwgJG1hdGNoWzZdLCAkbW9udGgsICRtYXRjaFszXSwgJG1hdGNoWzddKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFBhcnNlIGRhdGVzIHVzaW5nIHN0cnRvdGltZSgpCgkgKgoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEByZXR1cm4gaW50IFRpbWVzdGFtcAoJICovCglwdWJsaWMgZnVuY3Rpb24gZGF0ZV9zdHJ0b3RpbWUoJGRhdGUpCgl7CgkJJHN0cnRvdGltZSA9IHN0cnRvdGltZSgkZGF0ZSk7CgkJaWYgKCRzdHJ0b3RpbWUgPT09IC0xIHx8ICRzdHJ0b3RpbWUgPT09IGZhbHNlKQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gJHN0cnRvdGltZTsKCQl9Cgl9Cn0KCi8qKgogKiBQYXJzZXMgWE1MIGludG8gc29tZXRoaW5nIHNhbmUKICoKICoKICogVGhpcyBjbGFzcyBjYW4gYmUgb3ZlcmxvYWRlZCB3aXRoIHtAc2VlIFNpbXBsZVBpZTo6c2V0X3BhcnNlcl9jbGFzcygpfQogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICogQHN1YnBhY2thZ2UgUGFyc2luZwogKi8KY2xhc3MgU2ltcGxlUGllX1BhcnNlcgp7Cgl2YXIgJGVycm9yX2NvZGU7Cgl2YXIgJGVycm9yX3N0cmluZzsKCXZhciAkY3VycmVudF9saW5lOwoJdmFyICRjdXJyZW50X2NvbHVtbjsKCXZhciAkY3VycmVudF9ieXRlOwoJdmFyICRzZXBhcmF0b3IgPSAnICc7Cgl2YXIgJG5hbWVzcGFjZSA9IGFycmF5KCcnKTsKCXZhciAkZWxlbWVudCA9IGFycmF5KCcnKTsKCXZhciAkeG1sX2Jhc2UgPSBhcnJheSgnJyk7Cgl2YXIgJHhtbF9iYXNlX2V4cGxpY2l0ID0gYXJyYXkoZmFsc2UpOwoJdmFyICR4bWxfbGFuZyA9IGFycmF5KCcnKTsKCXZhciAkZGF0YSA9IGFycmF5KCk7Cgl2YXIgJGRhdGFzID0gYXJyYXkoYXJyYXkoKSk7Cgl2YXIgJGN1cnJlbnRfeGh0bWxfY29uc3RydWN0ID0gLTE7Cgl2YXIgJGVuY29kaW5nOwoJcHJvdGVjdGVkICRyZWdpc3RyeTsKCglwdWJsaWMgZnVuY3Rpb24gc2V0X3JlZ2lzdHJ5KFNpbXBsZVBpZV9SZWdpc3RyeSAkcmVnaXN0cnkpCgl7CgkJJHRoaXMtPnJlZ2lzdHJ5ID0gJHJlZ2lzdHJ5OwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBwYXJzZSgmJGRhdGEsICRlbmNvZGluZykKCXsKCQkvLyBVc2UgVVRGLTggaWYgd2UgZ2V0IHBhc3NlZCBVUy1BU0NJSSwgYXMgZXZlcnkgVVMtQVNDSUkgY2hhcmFjdGVyIGlzIGEgVVRGLTggY2hhcmFjdGVyCgkJaWYgKHN0cnRvdXBwZXIoJGVuY29kaW5nKSA9PT0gJ1VTLUFTQ0lJJykKCQl7CgkJCSR0aGlzLT5lbmNvZGluZyA9ICdVVEYtOCc7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5lbmNvZGluZyA9ICRlbmNvZGluZzsKCQl9CgoJCS8vIFN0cmlwIEJPTToKCQkvLyBVVEYtMzIgQmlnIEVuZGlhbiBCT00KCQlpZiAoc3Vic3RyKCRkYXRhLCAwLCA0KSA9PT0gIlx4MDBceDAwXHhGRVx4RkYiKQoJCXsKCQkJJGRhdGEgPSBzdWJzdHIoJGRhdGEsIDQpOwoJCX0KCQkvLyBVVEYtMzIgTGl0dGxlIEVuZGlhbiBCT00KCQllbHNlaWYgKHN1YnN0cigkZGF0YSwgMCwgNCkgPT09ICJceEZGXHhGRVx4MDBceDAwIikKCQl7CgkJCSRkYXRhID0gc3Vic3RyKCRkYXRhLCA0KTsKCQl9CgkJLy8gVVRGLTE2IEJpZyBFbmRpYW4gQk9NCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDIpID09PSAiXHhGRVx4RkYiKQoJCXsKCQkJJGRhdGEgPSBzdWJzdHIoJGRhdGEsIDIpOwoJCX0KCQkvLyBVVEYtMTYgTGl0dGxlIEVuZGlhbiBCT00KCQllbHNlaWYgKHN1YnN0cigkZGF0YSwgMCwgMikgPT09ICJceEZGXHhGRSIpCgkJewoJCQkkZGF0YSA9IHN1YnN0cigkZGF0YSwgMik7CgkJfQoJCS8vIFVURi04IEJPTQoJCWVsc2VpZiAoc3Vic3RyKCRkYXRhLCAwLCAzKSA9PT0gIlx4RUZceEJCXHhCRiIpCgkJewoJCQkkZGF0YSA9IHN1YnN0cigkZGF0YSwgMyk7CgkJfQoKCQlpZiAoc3Vic3RyKCRkYXRhLCAwLCA1KSA9PT0gJzw/eG1sJyAmJiBzdHJzcG4oc3Vic3RyKCRkYXRhLCA1LCAxKSwgIlx4MDlceDBBXHgwRFx4MjAiKSAmJiAoJHBvcyA9IHN0cnBvcygkZGF0YSwgJz8+JykpICE9PSBmYWxzZSkKCQl7CgkJCSRkZWNsYXJhdGlvbiA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdYTUxfRGVjbGFyYXRpb25fUGFyc2VyJywgYXJyYXkoc3Vic3RyKCRkYXRhLCA1LCAkcG9zIC0gNSkpKTsKCQkJaWYgKCRkZWNsYXJhdGlvbi0+cGFyc2UoKSkKCQkJewoJCQkJJGRhdGEgPSBzdWJzdHIoJGRhdGEsICRwb3MgKyAyKTsKCQkJCSRkYXRhID0gJzw/eG1sIHZlcnNpb249IicgLiAkZGVjbGFyYXRpb24tPnZlcnNpb24gLiAnIiBlbmNvZGluZz0iJyAuICRlbmNvZGluZyAuICciIHN0YW5kYWxvbmU9IicgLiAoKCRkZWNsYXJhdGlvbi0+c3RhbmRhbG9uZSkgPyAneWVzJyA6ICdubycpIC4gJyI/PicgLiAkZGF0YTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5lcnJvcl9zdHJpbmcgPSAnU2ltcGxlUGllIGJ1ZyEgUGxlYXNlIHJlcG9ydCB0aGlzISc7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgoJCSRyZXR1cm4gPSB0cnVlOwoKCQlzdGF0aWMgJHhtbF9pc19zYW5lID0gbnVsbDsKCQlpZiAoJHhtbF9pc19zYW5lID09PSBudWxsKQoJCXsKCQkJJHBhcnNlcl9jaGVjayA9IHhtbF9wYXJzZXJfY3JlYXRlKCk7CgkJCXhtbF9wYXJzZV9pbnRvX3N0cnVjdCgkcGFyc2VyX2NoZWNrLCAnPGZvbz4mYW1wOzwvZm9vPicsICR2YWx1ZXMpOwoJCQl4bWxfcGFyc2VyX2ZyZWUoJHBhcnNlcl9jaGVjayk7CgkJCSR4bWxfaXNfc2FuZSA9IGlzc2V0KCR2YWx1ZXNbMF1bJ3ZhbHVlJ10pOwoJCX0KCgkJLy8gQ3JlYXRlIHRoZSBwYXJzZXIKCQlpZiAoJHhtbF9pc19zYW5lKQoJCXsKCQkJJHhtbCA9IHhtbF9wYXJzZXJfY3JlYXRlX25zKCR0aGlzLT5lbmNvZGluZywgJHRoaXMtPnNlcGFyYXRvcik7CgkJCXhtbF9wYXJzZXJfc2V0X29wdGlvbigkeG1sLCBYTUxfT1BUSU9OX1NLSVBfV0hJVEUsIDEpOwoJCQl4bWxfcGFyc2VyX3NldF9vcHRpb24oJHhtbCwgWE1MX09QVElPTl9DQVNFX0ZPTERJTkcsIDApOwoJCQl4bWxfc2V0X29iamVjdCgkeG1sLCAkdGhpcyk7CgkJCXhtbF9zZXRfY2hhcmFjdGVyX2RhdGFfaGFuZGxlcigkeG1sLCAnY2RhdGEnKTsKCQkJeG1sX3NldF9lbGVtZW50X2hhbmRsZXIoJHhtbCwgJ3RhZ19vcGVuJywgJ3RhZ19jbG9zZScpOwoKCQkJLy8gUGFyc2UhCgkJCWlmICgheG1sX3BhcnNlKCR4bWwsICRkYXRhLCB0cnVlKSkKCQkJewoJCQkJJHRoaXMtPmVycm9yX2NvZGUgPSB4bWxfZ2V0X2Vycm9yX2NvZGUoJHhtbCk7CgkJCQkkdGhpcy0+ZXJyb3Jfc3RyaW5nID0geG1sX2Vycm9yX3N0cmluZygkdGhpcy0+ZXJyb3JfY29kZSk7CgkJCQkkcmV0dXJuID0gZmFsc2U7CgkJCX0KCQkJJHRoaXMtPmN1cnJlbnRfbGluZSA9IHhtbF9nZXRfY3VycmVudF9saW5lX251bWJlcigkeG1sKTsKCQkJJHRoaXMtPmN1cnJlbnRfY29sdW1uID0geG1sX2dldF9jdXJyZW50X2NvbHVtbl9udW1iZXIoJHhtbCk7CgkJCSR0aGlzLT5jdXJyZW50X2J5dGUgPSB4bWxfZ2V0X2N1cnJlbnRfYnl0ZV9pbmRleCgkeG1sKTsKCQkJeG1sX3BhcnNlcl9mcmVlKCR4bWwpOwoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJZWxzZQoJCXsKCQkJbGlieG1sX2NsZWFyX2Vycm9ycygpOwoJCQkkeG1sID0gbmV3IFhNTFJlYWRlcigpOwoJCQkkeG1sLT54bWwoJGRhdGEpOwoJCQl3aGlsZSAoQCR4bWwtPnJlYWQoKSkKCQkJewoJCQkJc3dpdGNoICgkeG1sLT5ub2RlVHlwZSkKCQkJCXsKCgkJCQkJY2FzZSBjb25zdGFudCgnWE1MUmVhZGVyOjpFTkRfRUxFTUVOVCcpOgoJCQkJCQlpZiAoJHhtbC0+bmFtZXNwYWNlVVJJICE9PSAnJykKCQkJCQkJewoJCQkJCQkJJHRhZ05hbWUgPSAkeG1sLT5uYW1lc3BhY2VVUkkgLiAkdGhpcy0+c2VwYXJhdG9yIC4gJHhtbC0+bG9jYWxOYW1lOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHRhZ05hbWUgPSAkeG1sLT5sb2NhbE5hbWU7CgkJCQkJCX0KCQkJCQkJJHRoaXMtPnRhZ19jbG9zZShudWxsLCAkdGFnTmFtZSk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgY29uc3RhbnQoJ1hNTFJlYWRlcjo6RUxFTUVOVCcpOgoJCQkJCQkkZW1wdHkgPSAkeG1sLT5pc0VtcHR5RWxlbWVudDsKCQkJCQkJaWYgKCR4bWwtPm5hbWVzcGFjZVVSSSAhPT0gJycpCgkJCQkJCXsKCQkJCQkJCSR0YWdOYW1lID0gJHhtbC0+bmFtZXNwYWNlVVJJIC4gJHRoaXMtPnNlcGFyYXRvciAuICR4bWwtPmxvY2FsTmFtZTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSR0YWdOYW1lID0gJHhtbC0+bG9jYWxOYW1lOwoJCQkJCQl9CgkJCQkJCSRhdHRyaWJ1dGVzID0gYXJyYXkoKTsKCQkJCQkJd2hpbGUgKCR4bWwtPm1vdmVUb05leHRBdHRyaWJ1dGUoKSkKCQkJCQkJewoJCQkJCQkJaWYgKCR4bWwtPm5hbWVzcGFjZVVSSSAhPT0gJycpCgkJCQkJCQl7CgkJCQkJCQkJJGF0dHJOYW1lID0gJHhtbC0+bmFtZXNwYWNlVVJJIC4gJHRoaXMtPnNlcGFyYXRvciAuICR4bWwtPmxvY2FsTmFtZTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQkkYXR0ck5hbWUgPSAkeG1sLT5sb2NhbE5hbWU7CgkJCQkJCQl9CgkJCQkJCQkkYXR0cmlidXRlc1skYXR0ck5hbWVdID0gJHhtbC0+dmFsdWU7CgkJCQkJCX0KCQkJCQkJJHRoaXMtPnRhZ19vcGVuKG51bGwsICR0YWdOYW1lLCAkYXR0cmlidXRlcyk7CgkJCQkJCWlmICgkZW1wdHkpCgkJCQkJCXsKCQkJCQkJCSR0aGlzLT50YWdfY2xvc2UobnVsbCwgJHRhZ05hbWUpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgY29uc3RhbnQoJ1hNTFJlYWRlcjo6VEVYVCcpOgoKCQkJCQljYXNlIGNvbnN0YW50KCdYTUxSZWFkZXI6OkNEQVRBJyk6CgkJCQkJCSR0aGlzLT5jZGF0YShudWxsLCAkeG1sLT52YWx1ZSk7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCWlmICgkZXJyb3IgPSBsaWJ4bWxfZ2V0X2xhc3RfZXJyb3IoKSkKCQkJewoJCQkJJHRoaXMtPmVycm9yX2NvZGUgPSAkZXJyb3ItPmNvZGU7CgkJCQkkdGhpcy0+ZXJyb3Jfc3RyaW5nID0gJGVycm9yLT5tZXNzYWdlOwoJCQkJJHRoaXMtPmN1cnJlbnRfbGluZSA9ICRlcnJvci0+bGluZTsKCQkJCSR0aGlzLT5jdXJyZW50X2NvbHVtbiA9ICRlcnJvci0+Y29sdW1uOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF9lcnJvcl9jb2RlKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmVycm9yX2NvZGU7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF9lcnJvcl9zdHJpbmcoKQoJewoJCXJldHVybiAkdGhpcy0+ZXJyb3Jfc3RyaW5nOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRfY3VycmVudF9saW5lKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmN1cnJlbnRfbGluZTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2N1cnJlbnRfY29sdW1uKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmN1cnJlbnRfY29sdW1uOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRfY3VycmVudF9ieXRlKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmN1cnJlbnRfYnl0ZTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2RhdGEoKQoJewoJCXJldHVybiAkdGhpcy0+ZGF0YTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gdGFnX29wZW4oJHBhcnNlciwgJHRhZywgJGF0dHJpYnV0ZXMpCgl7CgkJbGlzdCgkdGhpcy0+bmFtZXNwYWNlW10sICR0aGlzLT5lbGVtZW50W10pID0gJHRoaXMtPnNwbGl0X25zKCR0YWcpOwoKCQkkYXR0cmlicyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoJGF0dHJpYnV0ZXMgYXMgJG5hbWUgPT4gJHZhbHVlKQoJCXsKCQkJbGlzdCgkYXR0cmliX25hbWVzcGFjZSwgJGF0dHJpYnV0ZSkgPSAkdGhpcy0+c3BsaXRfbnMoJG5hbWUpOwoJCQkkYXR0cmlic1skYXR0cmliX25hbWVzcGFjZV1bJGF0dHJpYnV0ZV0gPSAkdmFsdWU7CgkJfQoKCQlpZiAoaXNzZXQoJGF0dHJpYnNbU0lNUExFUElFX05BTUVTUEFDRV9YTUxdWydiYXNlJ10pKQoJCXsKCQkJJHRoaXMtPnhtbF9iYXNlW10gPSAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnYWJzb2x1dGl6ZV91cmwnLCBhcnJheSgkYXR0cmlic1tTSU1QTEVQSUVfTkFNRVNQQUNFX1hNTF1bJ2Jhc2UnXSwgZW5kKCR0aGlzLT54bWxfYmFzZSkpKTsKCQkJJHRoaXMtPnhtbF9iYXNlX2V4cGxpY2l0W10gPSB0cnVlOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+eG1sX2Jhc2VbXSA9IGVuZCgkdGhpcy0+eG1sX2Jhc2UpOwoJCQkkdGhpcy0+eG1sX2Jhc2VfZXhwbGljaXRbXSA9IGVuZCgkdGhpcy0+eG1sX2Jhc2VfZXhwbGljaXQpOwoJCX0KCgkJaWYgKGlzc2V0KCRhdHRyaWJzW1NJTVBMRVBJRV9OQU1FU1BBQ0VfWE1MXVsnbGFuZyddKSkKCQl7CgkJCSR0aGlzLT54bWxfbGFuZ1tdID0gJGF0dHJpYnNbU0lNUExFUElFX05BTUVTUEFDRV9YTUxdWydsYW5nJ107CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT54bWxfbGFuZ1tdID0gZW5kKCR0aGlzLT54bWxfbGFuZyk7CgkJfQoKCQlpZiAoJHRoaXMtPmN1cnJlbnRfeGh0bWxfY29uc3RydWN0ID49IDApCgkJewoJCQkkdGhpcy0+Y3VycmVudF94aHRtbF9jb25zdHJ1Y3QrKzsKCQkJaWYgKGVuZCgkdGhpcy0+bmFtZXNwYWNlKSA9PT0gU0lNUExFUElFX05BTUVTUEFDRV9YSFRNTCkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGEnXSAuPSAnPCcgLiBlbmQoJHRoaXMtPmVsZW1lbnQpOwoJCQkJaWYgKGlzc2V0KCRhdHRyaWJzWycnXSkpCgkJCQl7CgkJCQkJZm9yZWFjaCAoJGF0dHJpYnNbJyddIGFzICRuYW1lID0+ICR2YWx1ZSkKCQkJCQl7CgkJCQkJCSR0aGlzLT5kYXRhWydkYXRhJ10gLj0gJyAnIC4gJG5hbWUgLiAnPSInIC4gaHRtbHNwZWNpYWxjaGFycygkdmFsdWUsIEVOVF9DT01QQVQsICR0aGlzLT5lbmNvZGluZykgLiAnIic7CgkJCQkJfQoJCQkJfQoJCQkJJHRoaXMtPmRhdGFbJ2RhdGEnXSAuPSAnPic7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmRhdGFzW10gPSYgJHRoaXMtPmRhdGE7CgkJCSR0aGlzLT5kYXRhID0mICR0aGlzLT5kYXRhWydjaGlsZCddW2VuZCgkdGhpcy0+bmFtZXNwYWNlKV1bZW5kKCR0aGlzLT5lbGVtZW50KV1bXTsKCQkJJHRoaXMtPmRhdGEgPSBhcnJheSgnZGF0YScgPT4gJycsICdhdHRyaWJzJyA9PiAkYXR0cmlicywgJ3htbF9iYXNlJyA9PiBlbmQoJHRoaXMtPnhtbF9iYXNlKSwgJ3htbF9iYXNlX2V4cGxpY2l0JyA9PiBlbmQoJHRoaXMtPnhtbF9iYXNlX2V4cGxpY2l0KSwgJ3htbF9sYW5nJyA9PiBlbmQoJHRoaXMtPnhtbF9sYW5nKSk7CgkJCWlmICgoZW5kKCR0aGlzLT5uYW1lc3BhY2UpID09PSBTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMgJiYgaW5fYXJyYXkoZW5kKCR0aGlzLT5lbGVtZW50KSwgYXJyYXkoJ3RpdGxlJywgJ3RhZ2xpbmUnLCAnY29weXJpZ2h0JywgJ2luZm8nLCAnc3VtbWFyeScsICdjb250ZW50JykpICYmIGlzc2V0KCRhdHRyaWJzWycnXVsnbW9kZSddKSAmJiAkYXR0cmlic1snJ11bJ21vZGUnXSA9PT0gJ3htbCcpCgkJCXx8IChlbmQoJHRoaXMtPm5hbWVzcGFjZSkgPT09IFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCAmJiBpbl9hcnJheShlbmQoJHRoaXMtPmVsZW1lbnQpLCBhcnJheSgncmlnaHRzJywgJ3N1YnRpdGxlJywgJ3N1bW1hcnknLCAnaW5mbycsICd0aXRsZScsICdjb250ZW50JykpICYmIGlzc2V0KCRhdHRyaWJzWycnXVsndHlwZSddKSAmJiAkYXR0cmlic1snJ11bJ3R5cGUnXSA9PT0gJ3hodG1sJykKCQkJfHwgKGVuZCgkdGhpcy0+bmFtZXNwYWNlKSA9PT0gU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjAgJiYgaW5fYXJyYXkoZW5kKCR0aGlzLT5lbGVtZW50KSwgYXJyYXkoJ3RpdGxlJykpKQoJCQl8fCAoZW5kKCR0aGlzLT5uYW1lc3BhY2UpID09PSBTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAgJiYgaW5fYXJyYXkoZW5kKCR0aGlzLT5lbGVtZW50KSwgYXJyYXkoJ3RpdGxlJykpKQoJCQl8fCAoZW5kKCR0aGlzLT5uYW1lc3BhY2UpID09PSBTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCAmJiBpbl9hcnJheShlbmQoJHRoaXMtPmVsZW1lbnQpLCBhcnJheSgndGl0bGUnKSkpKQoJCQl7CgkJCQkkdGhpcy0+Y3VycmVudF94aHRtbF9jb25zdHJ1Y3QgPSAwOwoJCQl9CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBjZGF0YSgkcGFyc2VyLCAkY2RhdGEpCgl7CgkJaWYgKCR0aGlzLT5jdXJyZW50X3hodG1sX2NvbnN0cnVjdCA+PSAwKQoJCXsKCQkJJHRoaXMtPmRhdGFbJ2RhdGEnXSAuPSBodG1sc3BlY2lhbGNoYXJzKCRjZGF0YSwgRU5UX1FVT1RFUywgJHRoaXMtPmVuY29kaW5nKTsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmRhdGFbJ2RhdGEnXSAuPSAkY2RhdGE7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiB0YWdfY2xvc2UoJHBhcnNlciwgJHRhZykKCXsKCQlpZiAoJHRoaXMtPmN1cnJlbnRfeGh0bWxfY29uc3RydWN0ID49IDApCgkJewoJCQkkdGhpcy0+Y3VycmVudF94aHRtbF9jb25zdHJ1Y3QtLTsKCQkJaWYgKGVuZCgkdGhpcy0+bmFtZXNwYWNlKSA9PT0gU0lNUExFUElFX05BTUVTUEFDRV9YSFRNTCAmJiAhaW5fYXJyYXkoZW5kKCR0aGlzLT5lbGVtZW50KSwgYXJyYXkoJ2FyZWEnLCAnYmFzZScsICdiYXNlZm9udCcsICdicicsICdjb2wnLCAnZnJhbWUnLCAnaHInLCAnaW1nJywgJ2lucHV0JywgJ2lzaW5kZXgnLCAnbGluaycsICdtZXRhJywgJ3BhcmFtJykpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnZGF0YSddIC49ICc8LycgLiBlbmQoJHRoaXMtPmVsZW1lbnQpIC4gJz4nOwoJCQl9CgkJfQoJCWlmICgkdGhpcy0+Y3VycmVudF94aHRtbF9jb25zdHJ1Y3QgPT09IC0xKQoJCXsKCQkJJHRoaXMtPmRhdGEgPSYgJHRoaXMtPmRhdGFzW2NvdW50KCR0aGlzLT5kYXRhcykgLSAxXTsKCQkJYXJyYXlfcG9wKCR0aGlzLT5kYXRhcyk7CgkJfQoKCQlhcnJheV9wb3AoJHRoaXMtPmVsZW1lbnQpOwoJCWFycmF5X3BvcCgkdGhpcy0+bmFtZXNwYWNlKTsKCQlhcnJheV9wb3AoJHRoaXMtPnhtbF9iYXNlKTsKCQlhcnJheV9wb3AoJHRoaXMtPnhtbF9iYXNlX2V4cGxpY2l0KTsKCQlhcnJheV9wb3AoJHRoaXMtPnhtbF9sYW5nKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gc3BsaXRfbnMoJHN0cmluZykKCXsKCQlzdGF0aWMgJGNhY2hlID0gYXJyYXkoKTsKCQlpZiAoIWlzc2V0KCRjYWNoZVskc3RyaW5nXSkpCgkJewoJCQlpZiAoJHBvcyA9IHN0cnBvcygkc3RyaW5nLCAkdGhpcy0+c2VwYXJhdG9yKSkKCQkJewoJCQkJc3RhdGljICRzZXBhcmF0b3JfbGVuZ3RoOwoJCQkJaWYgKCEkc2VwYXJhdG9yX2xlbmd0aCkKCQkJCXsKCQkJCQkkc2VwYXJhdG9yX2xlbmd0aCA9IHN0cmxlbigkdGhpcy0+c2VwYXJhdG9yKTsKCQkJCX0KCQkJCSRuYW1lc3BhY2UgPSBzdWJzdHIoJHN0cmluZywgMCwgJHBvcyk7CgkJCQkkbG9jYWxfbmFtZSA9IHN1YnN0cigkc3RyaW5nLCAkcG9zICsgJHNlcGFyYXRvcl9sZW5ndGgpOwoJCQkJaWYgKHN0cnRvbG93ZXIoJG5hbWVzcGFjZSkgPT09IFNJTVBMRVBJRV9OQU1FU1BBQ0VfSVRVTkVTKQoJCQkJewoJCQkJCSRuYW1lc3BhY2UgPSBTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUzsKCQkJCX0KCgkJCQkvLyBOb3JtYWxpemUgdGhlIE1lZGlhIFJTUyBuYW1lc3BhY2VzCgkJCQlpZiAoJG5hbWVzcGFjZSA9PT0gU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU19XUk9ORyB8fAoJCQkJCSRuYW1lc3BhY2UgPT09IFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NfV1JPTkcyIHx8CgkJCQkJJG5hbWVzcGFjZSA9PT0gU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU19XUk9ORzMgfHwKCQkJCQkkbmFtZXNwYWNlID09PSBTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTX1dST05HNCB8fAoJCQkJCSRuYW1lc3BhY2UgPT09IFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NfV1JPTkc1ICkKCQkJCXsKCQkJCQkkbmFtZXNwYWNlID0gU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUzsKCQkJCX0KCQkJCSRjYWNoZVskc3RyaW5nXSA9IGFycmF5KCRuYW1lc3BhY2UsICRsb2NhbF9uYW1lKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRjYWNoZVskc3RyaW5nXSA9IGFycmF5KCcnLCAkc3RyaW5nKTsKCQkJfQoJCX0KCQlyZXR1cm4gJGNhY2hlWyRzdHJpbmddOwoJfQp9CgovKioKICogSGFuZGxlcyBgPG1lZGlhOnJhdGluZz5gIG9yIGA8aXR1bmVzOmV4cGxpY2l0PmAgdGFncyBhcyBkZWZpbmVkIGluIE1lZGlhIFJTUyBhbmQgaVR1bmVzIFJTUyByZXNwZWN0aXZlbHkKICoKICogVXNlZCBieSB7QHNlZSBTaW1wbGVQaWVfRW5jbG9zdXJlOjpnZXRfcmF0aW5nKCl9IGFuZCB7QHNlZSBTaW1wbGVQaWVfRW5jbG9zdXJlOjpnZXRfcmF0aW5ncygpfQogKgogKiBUaGlzIGNsYXNzIGNhbiBiZSBvdmVybG9hZGVkIHdpdGgge0BzZWUgU2ltcGxlUGllOjpzZXRfcmF0aW5nX2NsYXNzKCl9CiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAc3VicGFja2FnZSBBUEkKICovCmNsYXNzIFNpbXBsZVBpZV9SYXRpbmcKewoJLyoqCgkgKiBSYXRpbmcgc2NoZW1lCgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBzZWUgZ2V0X3NjaGVtZSgpCgkgKi8KCXZhciAkc2NoZW1lOwoKCS8qKgoJICogUmF0aW5nIHZhbHVlCgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBzZWUgZ2V0X3ZhbHVlKCkKCSAqLwoJdmFyICR2YWx1ZTsKCgkvKioKCSAqIENvbnN0cnVjdG9yLCB1c2VkIHRvIGlucHV0IHRoZSBkYXRhCgkgKgoJICogRm9yIGRvY3VtZW50YXRpb24gb24gYWxsIHRoZSBwYXJhbWV0ZXJzLCBzZWUgdGhlIGNvcnJlc3BvbmRpbmcKCSAqIHByb3BlcnRpZXMgYW5kIHRoZWlyIGFjY2Vzc29ycwoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHNjaGVtZSA9IG51bGwsICR2YWx1ZSA9IG51bGwpCgl7CgkJJHRoaXMtPnNjaGVtZSA9ICRzY2hlbWU7CgkJJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoJfQoKCS8qKgoJICogU3RyaW5nLWlmaWVkIHZlcnNpb24KCSAqCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCgl7CgkJLy8gVGhlcmUgaXMgbm8gJHRoaXMtPmRhdGEgaGVyZQoJCXJldHVybiBtZDUoc2VyaWFsaXplKCR0aGlzKSk7Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIG9yZ2FuaXphdGlvbmFsIHNjaGVtZSBmb3IgdGhlIHJhdGluZwoJICoKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9zY2hlbWUoKQoJewoJCWlmICgkdGhpcy0+c2NoZW1lICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zY2hlbWU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIHJhdGluZwoJICoKCSAqIEByZXR1cm4gc3RyaW5nfG51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF92YWx1ZSgpCgl7CgkJaWYgKCR0aGlzLT52YWx1ZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+dmFsdWU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KfQoKLyoqCiAqIEhhbmRsZXMgY3JlYXRpbmcgb2JqZWN0cyBhbmQgY2FsbGluZyBtZXRob2RzCiAqCiAqIEFjY2VzcyB0aGlzIHZpYSB7QHNlZSBTaW1wbGVQaWU6OmdldF9yZWdpc3RyeSgpfQogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICovCmNsYXNzIFNpbXBsZVBpZV9SZWdpc3RyeQp7CgkvKioKCSAqIERlZmF1bHQgY2xhc3MgbWFwcGluZwoJICoKCSAqIE92ZXJyaWRpbmcgY2xhc3NlcyAqbXVzdCogc3ViY2xhc3MgdGhlc2UuCgkgKgoJICogQHZhciBhcnJheQoJICovCglwcm90ZWN0ZWQgJGRlZmF1bHQgPSBhcnJheSgKCQknQ2FjaGUnID0+ICdTaW1wbGVQaWVfQ2FjaGUnLAoJCSdMb2NhdG9yJyA9PiAnU2ltcGxlUGllX0xvY2F0b3InLAoJCSdQYXJzZXInID0+ICdTaW1wbGVQaWVfUGFyc2VyJywKCQknRmlsZScgPT4gJ1NpbXBsZVBpZV9GaWxlJywKCQknU2FuaXRpemUnID0+ICdTaW1wbGVQaWVfU2FuaXRpemUnLAoJCSdJdGVtJyA9PiAnU2ltcGxlUGllX0l0ZW0nLAoJCSdBdXRob3InID0+ICdTaW1wbGVQaWVfQXV0aG9yJywKCQknQ2F0ZWdvcnknID0+ICdTaW1wbGVQaWVfQ2F0ZWdvcnknLAoJCSdFbmNsb3N1cmUnID0+ICdTaW1wbGVQaWVfRW5jbG9zdXJlJywKCQknQ2FwdGlvbicgPT4gJ1NpbXBsZVBpZV9DYXB0aW9uJywKCQknQ29weXJpZ2h0JyA9PiAnU2ltcGxlUGllX0NvcHlyaWdodCcsCgkJJ0NyZWRpdCcgPT4gJ1NpbXBsZVBpZV9DcmVkaXQnLAoJCSdSYXRpbmcnID0+ICdTaW1wbGVQaWVfUmF0aW5nJywKCQknUmVzdHJpY3Rpb24nID0+ICdTaW1wbGVQaWVfUmVzdHJpY3Rpb24nLAoJCSdDb250ZW50X1R5cGVfU25pZmZlcicgPT4gJ1NpbXBsZVBpZV9Db250ZW50X1R5cGVfU25pZmZlcicsCgkJJ1NvdXJjZScgPT4gJ1NpbXBsZVBpZV9Tb3VyY2UnLAoJCSdNaXNjJyA9PiAnU2ltcGxlUGllX01pc2MnLAoJCSdYTUxfRGVjbGFyYXRpb25fUGFyc2VyJyA9PiAnU2ltcGxlUGllX1hNTF9EZWNsYXJhdGlvbl9QYXJzZXInLAoJCSdQYXJzZV9EYXRlJyA9PiAnU2ltcGxlUGllX1BhcnNlX0RhdGUnLAoJKTsKCgkvKioKCSAqIENsYXNzIG1hcHBpbmcKCSAqCgkgKiBAc2VlIHJlZ2lzdGVyKCkKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJvdGVjdGVkICRjbGFzc2VzID0gYXJyYXkoKTsKCgkvKioKCSAqIExlZ2FjeSBjbGFzc2VzCgkgKgoJICogQHNlZSByZWdpc3RlcigpCgkgKiBAdmFyIGFycmF5CgkgKi8KCXByb3RlY3RlZCAkbGVnYWN5ID0gYXJyYXkoKTsKCgkvKioKCSAqIENvbnN0cnVjdG9yCgkgKgoJICogTm8tb3AKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgeyB9CgoJLyoqCgkgKiBSZWdpc3RlciBhIGNsYXNzCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdHlwZSBTZWUge0BzZWUgJGRlZmF1bHR9IGZvciBuYW1lcwoJICogQHBhcmFtIHN0cmluZyAkY2xhc3MgQ2xhc3MgbmFtZSwgbXVzdCBzdWJjbGFzcyB0aGUgY29ycmVzcG9uZGluZyBkZWZhdWx0CgkgKiBAcGFyYW0gYm9vbCAkbGVnYWN5IFdoZXRoZXIgdG8gZW5hYmxlIGxlZ2FjeSBzdXBwb3J0IGZvciB0aGlzIGNsYXNzCgkgKiBAcmV0dXJuIGJvb2wgU3VjY2Vzc2Z1bG5lc3MKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyKCR0eXBlLCAkY2xhc3MsICRsZWdhY3kgPSBmYWxzZSkKCXsKCQlpZiAoIWlzX3N1YmNsYXNzX29mKCRjbGFzcywgJHRoaXMtPmRlZmF1bHRbJHR5cGVdKSkKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSR0aGlzLT5jbGFzc2VzWyR0eXBlXSA9ICRjbGFzczsKCgkJaWYgKCRsZWdhY3kpCgkJewoJCQkkdGhpcy0+bGVnYWN5W10gPSAkY2xhc3M7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIEdldCB0aGUgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgYSB0eXBlCgkgKgoJICogV2hlcmUgcG9zc2libGUsIHVzZSB7QHNlZSBjcmVhdGUoKX0gb3Ige0BzZWUgY2FsbCgpfSBpbnN0ZWFkCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdHlwZQoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2NsYXNzKCR0eXBlKQoJewoJCWlmICghZW1wdHkoJHRoaXMtPmNsYXNzZXNbJHR5cGVdKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+Y2xhc3Nlc1skdHlwZV07CgkJfQoJCWlmICghZW1wdHkoJHRoaXMtPmRlZmF1bHRbJHR5cGVdKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+ZGVmYXVsdFskdHlwZV07CgkJfQoKCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIGdpdmVuIHR5cGUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0eXBlCgkgKiBAcGFyYW0gYXJyYXkgJHBhcmFtZXRlcnMgUGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3RvcgoJICogQHJldHVybiBvYmplY3QgSW5zdGFuY2Ugb2YgY2xhc3MKCSAqLwoJcHVibGljIGZ1bmN0aW9uICZjcmVhdGUoJHR5cGUsICRwYXJhbWV0ZXJzID0gYXJyYXkoKSkKCXsKCQkkY2xhc3MgPSAkdGhpcy0+Z2V0X2NsYXNzKCR0eXBlKTsKCgkJaWYgKGluX2FycmF5KCRjbGFzcywgJHRoaXMtPmxlZ2FjeSkpCgkJewoJCQlzd2l0Y2ggKCR0eXBlKQoJCQl7CgkJCQljYXNlICdsb2NhdG9yJzoKCQkJCQkvLyBMZWdhY3k6IGZpbGUsIHRpbWVvdXQsIHVzZXJhZ2VudCwgZmlsZV9jbGFzcywgbWF4X2NoZWNrZWRfZmVlZHMsIGNvbnRlbnRfdHlwZV9zbmlmZmVyX2NsYXNzCgkJCQkJLy8gU3BlY2lmaWVkOiBmaWxlLCB0aW1lb3V0LCB1c2VyYWdlbnQsIG1heF9jaGVja2VkX2ZlZWRzCgkJCQkJJHJlcGxhY2VtZW50ID0gYXJyYXkoJHRoaXMtPmdldF9jbGFzcygnZmlsZScpLCAkcGFyYW1ldGVyc1szXSwgJHRoaXMtPmdldF9jbGFzcygnY29udGVudF90eXBlX3NuaWZmZXInKSk7CgkJCQkJYXJyYXlfc3BsaWNlKCRwYXJhbWV0ZXJzLCAzLCAxLCAkcmVwbGFjZW1lbnQpOwoJCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQlpZiAoIW1ldGhvZF9leGlzdHMoJGNsYXNzLCAnX19jb25zdHJ1Y3QnKSkKCQl7CgkJCSRpbnN0YW5jZSA9IG5ldyAkY2xhc3M7CgkJfQoJCWVsc2UKCQl7CgkJCSRyZWZsZWN0b3IgPSBuZXcgUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7CgkJCSRpbnN0YW5jZSA9ICRyZWZsZWN0b3ItPm5ld0luc3RhbmNlQXJncygkcGFyYW1ldGVycyk7CgkJfQoKCQlpZiAobWV0aG9kX2V4aXN0cygkaW5zdGFuY2UsICdzZXRfcmVnaXN0cnknKSkKCQl7CgkJCSRpbnN0YW5jZS0+c2V0X3JlZ2lzdHJ5KCR0aGlzKTsKCQl9CgkJcmV0dXJuICRpbnN0YW5jZTsKCX0KCgkvKioKCSAqIENhbGwgYSBzdGF0aWMgbWV0aG9kIGZvciBhIHR5cGUKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0eXBlCgkgKiBAcGFyYW0gc3RyaW5nICRtZXRob2QKCSAqIEBwYXJhbSBhcnJheSAkcGFyYW1ldGVycwoJICogQHJldHVybiBtaXhlZAoJICovCglwdWJsaWMgZnVuY3Rpb24gJmNhbGwoJHR5cGUsICRtZXRob2QsICRwYXJhbWV0ZXJzID0gYXJyYXkoKSkKCXsKCQkkY2xhc3MgPSAkdGhpcy0+Z2V0X2NsYXNzKCR0eXBlKTsKCgkJJHJlc3VsdCA9IGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCRjbGFzcywgJG1ldGhvZCksICRwYXJhbWV0ZXJzKTsKCQlyZXR1cm4gJHJlc3VsdDsKCX0KfQoKLyoqCiAqIEhhbmRsZXMgYDxtZWRpYTpyZXN0cmljdGlvbj5gIGFzIGRlZmluZWQgaW4gTWVkaWEgUlNTCiAqCiAqIFVzZWQgYnkge0BzZWUgU2ltcGxlUGllX0VuY2xvc3VyZTo6Z2V0X3Jlc3RyaWN0aW9uKCl9IGFuZCB7QHNlZSBTaW1wbGVQaWVfRW5jbG9zdXJlOjpnZXRfcmVzdHJpY3Rpb25zKCl9CiAqCiAqIFRoaXMgY2xhc3MgY2FuIGJlIG92ZXJsb2FkZWQgd2l0aCB7QHNlZSBTaW1wbGVQaWU6OnNldF9yZXN0cmljdGlvbl9jbGFzcygpfQogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICogQHN1YnBhY2thZ2UgQVBJCiAqLwpjbGFzcyBTaW1wbGVQaWVfUmVzdHJpY3Rpb24KewoJLyoqCgkgKiBSZWxhdGlvbnNoaXAgKCdhbGxvdycvJ2RlbnknKQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAc2VlIGdldF9yZWxhdGlvbnNoaXAoKQoJICovCgl2YXIgJHJlbGF0aW9uc2hpcDsKCgkvKioKCSAqIFR5cGUgb2YgcmVzdHJpY3Rpb24KCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQHNlZSBnZXRfdHlwZSgpCgkgKi8KCXZhciAkdHlwZTsKCgkvKioKCSAqIFJlc3RyaWN0ZWQgdmFsdWVzCgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBzZWUgZ2V0X3ZhbHVlKCkKCSAqLwoJdmFyICR2YWx1ZTsKCgkvKioKCSAqIENvbnN0cnVjdG9yLCB1c2VkIHRvIGlucHV0IHRoZSBkYXRhCgkgKgoJICogRm9yIGRvY3VtZW50YXRpb24gb24gYWxsIHRoZSBwYXJhbWV0ZXJzLCBzZWUgdGhlIGNvcnJlc3BvbmRpbmcKCSAqIHByb3BlcnRpZXMgYW5kIHRoZWlyIGFjY2Vzc29ycwoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHJlbGF0aW9uc2hpcCA9IG51bGwsICR0eXBlID0gbnVsbCwgJHZhbHVlID0gbnVsbCkKCXsKCQkkdGhpcy0+cmVsYXRpb25zaGlwID0gJHJlbGF0aW9uc2hpcDsKCQkkdGhpcy0+dHlwZSA9ICR0eXBlOwoJCSR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKCX0KCgkvKioKCSAqIFN0cmluZy1pZmllZCB2ZXJzaW9uCgkgKgoJICogQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRoZXJlIGlzIG5vICR0aGlzLT5kYXRhIGhlcmUKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcykpOwoJfQoKCS8qKgoJICogR2V0IHRoZSByZWxhdGlvbnNoaXAKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ3xudWxsIEVpdGhlciAnYWxsb3cnIG9yICdkZW55JwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3JlbGF0aW9uc2hpcCgpCgl7CgkJaWYgKCR0aGlzLT5yZWxhdGlvbnNoaXAgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnJlbGF0aW9uc2hpcDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSB0eXBlCgkgKgoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3R5cGUoKQoJewoJCWlmICgkdGhpcy0+dHlwZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+dHlwZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogR2V0IHRoZSBsaXN0IG9mIHJlc3RyaWN0ZWQgdGhpbmdzCgkgKgoJICogQHJldHVybiBzdHJpbmd8bnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3ZhbHVlKCkKCXsKCQlpZiAoJHRoaXMtPnZhbHVlICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT52YWx1ZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQp9CgovKioKICogVXNlZCBmb3IgZGF0YSBjbGVhbnVwIGFuZCBwb3N0LXByb2Nlc3NpbmcKICoKICoKICogVGhpcyBjbGFzcyBjYW4gYmUgb3ZlcmxvYWRlZCB3aXRoIHtAc2VlIFNpbXBsZVBpZTo6c2V0X3Nhbml0aXplX2NsYXNzKCl9CiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAdG9kbyBNb3ZlIHRvIHVzaW5nIGFuIGFjdHVhbCBIVE1MIHBhcnNlciAodGhpcyB3aWxsIGFsbG93IHRhZ3MgdG8gYmUgcHJvcGVybHkgc3RyaXBwZWQsIGFuZCB0byBzd2l0Y2ggYmV0d2VlbiBIVE1MIGFuZCBYSFRNTCksIHRoaXMgd2lsbCBhbHNvIG1ha2UgaXQgZWFzaWVyIHRvIHNob3J0ZW4gYSBzdHJpbmcgd2hpbGUgcHJlc2VydmluZyBIVE1MIHRhZ3MKICovCmNsYXNzIFNpbXBsZVBpZV9TYW5pdGl6ZQp7CgkvLyBQcml2YXRlIHZhcnMKCXZhciAkYmFzZTsKCgkvLyBPcHRpb25zCgl2YXIgJHJlbW92ZV9kaXYgPSB0cnVlOwoJdmFyICRpbWFnZV9oYW5kbGVyID0gJyc7Cgl2YXIgJHN0cmlwX2h0bWx0YWdzID0gYXJyYXkoJ2Jhc2UnLCAnYmxpbmsnLCAnYm9keScsICdkb2N0eXBlJywgJ2VtYmVkJywgJ2ZvbnQnLCAnZm9ybScsICdmcmFtZScsICdmcmFtZXNldCcsICdodG1sJywgJ2lmcmFtZScsICdpbnB1dCcsICdtYXJxdWVlJywgJ21ldGEnLCAnbm9zY3JpcHQnLCAnb2JqZWN0JywgJ3BhcmFtJywgJ3NjcmlwdCcsICdzdHlsZScpOwoJdmFyICRlbmNvZGVfaW5zdGVhZF9vZl9zdHJpcCA9IGZhbHNlOwoJdmFyICRzdHJpcF9hdHRyaWJ1dGVzID0gYXJyYXkoJ2Jnc291bmQnLCAnY2xhc3MnLCAnZXhwcicsICdpZCcsICdzdHlsZScsICdvbmNsaWNrJywgJ29uZXJyb3InLCAnb25maW5pc2gnLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbmZvY3VzJywgJ29uYmx1cicsICdsb3dzcmMnLCAnZHluc3JjJyk7Cgl2YXIgJHN0cmlwX2NvbW1lbnRzID0gZmFsc2U7Cgl2YXIgJG91dHB1dF9lbmNvZGluZyA9ICdVVEYtOCc7Cgl2YXIgJGVuYWJsZV9jYWNoZSA9IHRydWU7Cgl2YXIgJGNhY2hlX2xvY2F0aW9uID0gJy4vY2FjaGUnOwoJdmFyICRjYWNoZV9uYW1lX2Z1bmN0aW9uID0gJ21kNSc7Cgl2YXIgJHRpbWVvdXQgPSAxMDsKCXZhciAkdXNlcmFnZW50ID0gJyc7Cgl2YXIgJGZvcmNlX2Zzb2Nrb3BlbiA9IGZhbHNlOwoJdmFyICRyZXBsYWNlX3VybF9hdHRyaWJ1dGVzID0gbnVsbDsKCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQoJewoJCS8vIFNldCBkZWZhdWx0cwoJCSR0aGlzLT5zZXRfdXJsX3JlcGxhY2VtZW50cyhudWxsKTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlX2RpdigkZW5hYmxlID0gdHJ1ZSkKCXsKCQkkdGhpcy0+cmVtb3ZlX2RpdiA9IChib29sKSAkZW5hYmxlOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBzZXRfaW1hZ2VfaGFuZGxlcigkcGFnZSA9IGZhbHNlKQoJewoJCWlmICgkcGFnZSkKCQl7CgkJCSR0aGlzLT5pbWFnZV9oYW5kbGVyID0gKHN0cmluZykgJHBhZ2U7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5pbWFnZV9oYW5kbGVyID0gZmFsc2U7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBzZXRfcmVnaXN0cnkoU2ltcGxlUGllX1JlZ2lzdHJ5ICRyZWdpc3RyeSkKCXsKCQkkdGhpcy0+cmVnaXN0cnkgPSAkcmVnaXN0cnk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHBhc3NfY2FjaGVfZGF0YSgkZW5hYmxlX2NhY2hlID0gdHJ1ZSwgJGNhY2hlX2xvY2F0aW9uID0gJy4vY2FjaGUnLCAkY2FjaGVfbmFtZV9mdW5jdGlvbiA9ICdtZDUnLCAkY2FjaGVfY2xhc3MgPSAnU2ltcGxlUGllX0NhY2hlJykKCXsKCQlpZiAoaXNzZXQoJGVuYWJsZV9jYWNoZSkpCgkJewoJCQkkdGhpcy0+ZW5hYmxlX2NhY2hlID0gKGJvb2wpICRlbmFibGVfY2FjaGU7CgkJfQoKCQlpZiAoJGNhY2hlX2xvY2F0aW9uKQoJCXsKCQkJJHRoaXMtPmNhY2hlX2xvY2F0aW9uID0gKHN0cmluZykgJGNhY2hlX2xvY2F0aW9uOwoJCX0KCgkJaWYgKCRjYWNoZV9uYW1lX2Z1bmN0aW9uKQoJCXsKCQkJJHRoaXMtPmNhY2hlX25hbWVfZnVuY3Rpb24gPSAoc3RyaW5nKSAkY2FjaGVfbmFtZV9mdW5jdGlvbjsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHBhc3NfZmlsZV9kYXRhKCRmaWxlX2NsYXNzID0gJ1NpbXBsZVBpZV9GaWxlJywgJHRpbWVvdXQgPSAxMCwgJHVzZXJhZ2VudCA9ICcnLCAkZm9yY2VfZnNvY2tvcGVuID0gZmFsc2UpCgl7CgkJaWYgKCR0aW1lb3V0KQoJCXsKCQkJJHRoaXMtPnRpbWVvdXQgPSAoc3RyaW5nKSAkdGltZW91dDsKCQl9CgoJCWlmICgkdXNlcmFnZW50KQoJCXsKCQkJJHRoaXMtPnVzZXJhZ2VudCA9IChzdHJpbmcpICR1c2VyYWdlbnQ7CgkJfQoKCQlpZiAoJGZvcmNlX2Zzb2Nrb3BlbikKCQl7CgkJCSR0aGlzLT5mb3JjZV9mc29ja29wZW4gPSAoc3RyaW5nKSAkZm9yY2VfZnNvY2tvcGVuOwoJCX0KCX0KCglwdWJsaWMgZnVuY3Rpb24gc3RyaXBfaHRtbHRhZ3MoJHRhZ3MgPSBhcnJheSgnYmFzZScsICdibGluaycsICdib2R5JywgJ2RvY3R5cGUnLCAnZW1iZWQnLCAnZm9udCcsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2h0bWwnLCAnaWZyYW1lJywgJ2lucHV0JywgJ21hcnF1ZWUnLCAnbWV0YScsICdub3NjcmlwdCcsICdvYmplY3QnLCAncGFyYW0nLCAnc2NyaXB0JywgJ3N0eWxlJykpCgl7CgkJaWYgKCR0YWdzKQoJCXsKCQkJaWYgKGlzX2FycmF5KCR0YWdzKSkKCQkJewoJCQkJJHRoaXMtPnN0cmlwX2h0bWx0YWdzID0gJHRhZ3M7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGhpcy0+c3RyaXBfaHRtbHRhZ3MgPSBleHBsb2RlKCcsJywgJHRhZ3MpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdHJpcF9odG1sdGFncyA9IGZhbHNlOwoJCX0KCX0KCglwdWJsaWMgZnVuY3Rpb24gZW5jb2RlX2luc3RlYWRfb2Zfc3RyaXAoJGVuY29kZSA9IGZhbHNlKQoJewoJCSR0aGlzLT5lbmNvZGVfaW5zdGVhZF9vZl9zdHJpcCA9IChib29sKSAkZW5jb2RlOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBzdHJpcF9hdHRyaWJ1dGVzKCRhdHRyaWJzID0gYXJyYXkoJ2Jnc291bmQnLCAnY2xhc3MnLCAnZXhwcicsICdpZCcsICdzdHlsZScsICdvbmNsaWNrJywgJ29uZXJyb3InLCAnb25maW5pc2gnLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbmZvY3VzJywgJ29uYmx1cicsICdsb3dzcmMnLCAnZHluc3JjJykpCgl7CgkJaWYgKCRhdHRyaWJzKQoJCXsKCQkJaWYgKGlzX2FycmF5KCRhdHRyaWJzKSkKCQkJewoJCQkJJHRoaXMtPnN0cmlwX2F0dHJpYnV0ZXMgPSAkYXR0cmliczsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5zdHJpcF9hdHRyaWJ1dGVzID0gZXhwbG9kZSgnLCcsICRhdHRyaWJzKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RyaXBfYXR0cmlidXRlcyA9IGZhbHNlOwoJCX0KCX0KCglwdWJsaWMgZnVuY3Rpb24gc3RyaXBfY29tbWVudHMoJHN0cmlwID0gZmFsc2UpCgl7CgkJJHRoaXMtPnN0cmlwX2NvbW1lbnRzID0gKGJvb2wpICRzdHJpcDsKCX0KCglwdWJsaWMgZnVuY3Rpb24gc2V0X291dHB1dF9lbmNvZGluZygkZW5jb2RpbmcgPSAnVVRGLTgnKQoJewoJCSR0aGlzLT5vdXRwdXRfZW5jb2RpbmcgPSAoc3RyaW5nKSAkZW5jb2Rpbmc7Cgl9CgoJLyoqCgkgKiBTZXQgZWxlbWVudC9hdHRyaWJ1dGUga2V5L3ZhbHVlIHBhaXJzIG9mIEhUTUwgYXR0cmlidXRlcwoJICogY29udGFpbmluZyBVUkxzIHRoYXQgbmVlZCB0byBiZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUgZmVlZAoJICoKCSAqIERlZmF1bHRzIHRvIHxhfEBocmVmLCB8YXJlYXxAaHJlZiwgfGJsb2NrcXVvdGV8QGNpdGUsIHxkZWx8QGNpdGUsCgkgKiB8Zm9ybXxAYWN0aW9uLCB8aW1nfEBsb25nZGVzYywgfGltZ3xAc3JjLCB8aW5wdXR8QHNyYywgfGluc3xAY2l0ZSwKCSAqIHxxfEBjaXRlCgkgKgoJICogQHNpbmNlIDEuMAoJICogQHBhcmFtIGFycmF5fG51bGwgJGVsZW1lbnRfYXR0cmlidXRlIEVsZW1lbnQvYXR0cmlidXRlIGtleS92YWx1ZSBwYWlycywgbnVsbCBmb3IgZGVmYXVsdAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3VybF9yZXBsYWNlbWVudHMoJGVsZW1lbnRfYXR0cmlidXRlID0gbnVsbCkKCXsKCQlpZiAoJGVsZW1lbnRfYXR0cmlidXRlID09PSBudWxsKQoJCXsKCQkJJGVsZW1lbnRfYXR0cmlidXRlID0gYXJyYXkoCgkJCQknYScgPT4gJ2hyZWYnLAoJCQkJJ2FyZWEnID0+ICdocmVmJywKCQkJCSdibG9ja3F1b3RlJyA9PiAnY2l0ZScsCgkJCQknZGVsJyA9PiAnY2l0ZScsCgkJCQknZm9ybScgPT4gJ2FjdGlvbicsCgkJCQknaW1nJyA9PiBhcnJheSgKCQkJCQknbG9uZ2Rlc2MnLAoJCQkJCSdzcmMnCgkJCQkpLAoJCQkJJ2lucHV0JyA9PiAnc3JjJywKCQkJCSdpbnMnID0+ICdjaXRlJywKCQkJCSdxJyA9PiAnY2l0ZScKCQkJKTsKCQl9CgkJJHRoaXMtPnJlcGxhY2VfdXJsX2F0dHJpYnV0ZXMgPSAoYXJyYXkpICRlbGVtZW50X2F0dHJpYnV0ZTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gc2FuaXRpemUoJGRhdGEsICR0eXBlLCAkYmFzZSA9ICcnKQoJewoJCSRkYXRhID0gdHJpbSgkZGF0YSk7CgkJaWYgKCRkYXRhICE9PSAnJyB8fCAkdHlwZSAmIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKQoJCXsKCQkJaWYgKCR0eXBlICYgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MKQoJCQl7CgkJCQlpZiAocHJlZ19tYXRjaCgnLygmKCMoeFswLTlhLWZBLUZdK3xbMC05XSspfFthLXpBLVowLTldKyl8PFwvW0EtWmEtel1bXlx4MDlceDBBXHgwQlx4MENceDBEXHgyMFx4MkZceDNFXSonIC4gU0lNUExFUElFX1BDUkVfSFRNTF9BVFRSSUJVVEUgLiAnPikvJywgJGRhdGEpKQoJCQkJewoJCQkJCSR0eXBlIHw9IFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkdHlwZSB8PSBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQ7CgkJCQl9CgkJCX0KCgkJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9DT05TVFJVQ1RfQkFTRTY0KQoJCQl7CgkJCQkkZGF0YSA9IGJhc2U2NF9kZWNvZGUoJGRhdGEpOwoJCQl9CgoJCQlpZiAoJHR5cGUgJiAoU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MIHwgU0lNUExFUElFX0NPTlNUUlVDVF9YSFRNTCkpCgkJCXsKCgkJCQkkZG9jdW1lbnQgPSBuZXcgRE9NRG9jdW1lbnQoKTsKCQkJCSRkb2N1bWVudC0+ZW5jb2RpbmcgPSAnVVRGLTgnOwoJCQkJJGRhdGEgPSAkdGhpcy0+cHJlcHJvY2VzcygkZGF0YSwgJHR5cGUpOwoKCQkJCXNldF9lcnJvcl9oYW5kbGVyKGFycmF5KCdTaW1wbGVQaWVfTWlzYycsICdzaWxlbmNlX2Vycm9ycycpKTsKCQkJCSRkb2N1bWVudC0+bG9hZEhUTUwoJGRhdGEpOwoJCQkJcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7CgoJCQkJLy8gU3RyaXAgY29tbWVudHMKCQkJCWlmICgkdGhpcy0+c3RyaXBfY29tbWVudHMpCgkJCQl7CgkJCQkJJHhwYXRoID0gbmV3IERPTVhQYXRoKCRkb2N1bWVudCk7CgkJCQkJJGNvbW1lbnRzID0gJHhwYXRoLT5xdWVyeSgnLy9jb21tZW50KCknKTsKCgkJCQkJZm9yZWFjaCAoJGNvbW1lbnRzIGFzICRjb21tZW50KQoJCQkJCXsKCQkJCQkJJGNvbW1lbnQtPnBhcmVudE5vZGUtPnJlbW92ZUNoaWxkKCRjb21tZW50KTsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gU3RyaXAgb3V0IEhUTUwgdGFncyBhbmQgYXR0cmlidXRlcyB0aGF0IG1pZ2h0IGNhdXNlIHZhcmlvdXMgc2VjdXJpdHkgcHJvYmxlbXMuCgkJCQkvLyBCYXNlZCBvbiByZWNvbW1lbmRhdGlvbnMgYnkgTWFyayBQaWxncmltIGF0OgoJCQkJLy8gaHR0cDovL2RpdmVpbnRvbWFyay5vcmcvYXJjaGl2ZXMvMjAwMy8wNi8xMi9ob3dfdG9fY29uc3VtZV9yc3Nfc2FmZWx5CgkJCQlpZiAoJHRoaXMtPnN0cmlwX2h0bWx0YWdzKQoJCQkJewoJCQkJCWZvcmVhY2ggKCR0aGlzLT5zdHJpcF9odG1sdGFncyBhcyAkdGFnKQoJCQkJCXsKCQkJCQkJJHRoaXMtPnN0cmlwX3RhZygkdGFnLCAkZG9jdW1lbnQsICR0eXBlKTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCR0aGlzLT5zdHJpcF9hdHRyaWJ1dGVzKQoJCQkJewoJCQkJCWZvcmVhY2ggKCR0aGlzLT5zdHJpcF9hdHRyaWJ1dGVzIGFzICRhdHRyaWIpCgkJCQkJewoJCQkJCQkkdGhpcy0+c3RyaXBfYXR0cigkYXR0cmliLCAkZG9jdW1lbnQpOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBSZXBsYWNlIHJlbGF0aXZlIFVSTHMKCQkJCSR0aGlzLT5iYXNlID0gJGJhc2U7CgkJCQlmb3JlYWNoICgkdGhpcy0+cmVwbGFjZV91cmxfYXR0cmlidXRlcyBhcyAkZWxlbWVudCA9PiAkYXR0cmlidXRlcykKCQkJCXsKCQkJCQkkdGhpcy0+cmVwbGFjZV91cmxzKCRkb2N1bWVudCwgJGVsZW1lbnQsICRhdHRyaWJ1dGVzKTsKCQkJCX0KCgkJCQkvLyBJZiBpbWFnZSBoYW5kbGluZyAoY2FjaGluZywgZXRjLikgaXMgZW5hYmxlZCwgY2FjaGUgYW5kIHJld3JpdGUgYWxsIHRoZSBpbWFnZSB0YWdzLgoJCQkJaWYgKGlzc2V0KCR0aGlzLT5pbWFnZV9oYW5kbGVyKSAmJiAoKHN0cmluZykgJHRoaXMtPmltYWdlX2hhbmRsZXIpICE9PSAnJyAmJiAkdGhpcy0+ZW5hYmxlX2NhY2hlKQoJCQkJewoJCQkJCSRpbWFnZXMgPSAkZG9jdW1lbnQtPmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTsKCQkJCQlmb3JlYWNoICgkaW1hZ2VzIGFzICRpbWcpCgkJCQkJewoJCQkJCQlpZiAoJGltZy0+aGFzQXR0cmlidXRlKCdzcmMnKSkKCQkJCQkJewoJCQkJCQkJJGltYWdlX3VybCA9IGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5jYWNoZV9uYW1lX2Z1bmN0aW9uLCAkaW1nLT5nZXRBdHRyaWJ1dGUoJ3NyYycpKTsKCQkJCQkJCSRjYWNoZSA9ICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnQ2FjaGUnLCAnY3JlYXRlJywgYXJyYXkoJHRoaXMtPmNhY2hlX2xvY2F0aW9uLCAkaW1hZ2VfdXJsLCAnc3BpJykpOwoKCQkJCQkJCWlmICgkY2FjaGUtPmxvYWQoKSkKCQkJCQkJCXsKCQkJCQkJCQkkaW1nLT5zZXRBdHRyaWJ1dGUoJ3NyYycsICR0aGlzLT5pbWFnZV9oYW5kbGVyIC4gJGltYWdlX3VybCk7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJJGZpbGUgPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnRmlsZScsIGFycmF5KCRpbWdbJ2F0dHJpYnMnXVsnc3JjJ11bJ2RhdGEnXSwgJHRoaXMtPnRpbWVvdXQsIDUsIGFycmF5KCdYLUZPUldBUkRFRC1GT1InID0+ICRfU0VSVkVSWydSRU1PVEVfQUREUiddKSwgJHRoaXMtPnVzZXJhZ2VudCwgJHRoaXMtPmZvcmNlX2Zzb2Nrb3BlbikpOwoJCQkJCQkJCSRoZWFkZXJzID0gJGZpbGUtPmhlYWRlcnM7CgoJCQkJCQkJCWlmICgkZmlsZS0+c3VjY2VzcyAmJiAoJGZpbGUtPm1ldGhvZCAmIFNJTVBMRVBJRV9GSUxFX1NPVVJDRV9SRU1PVEUgPT09IDAgfHwgKCRmaWxlLT5zdGF0dXNfY29kZSA9PT0gMjAwIHx8ICRmaWxlLT5zdGF0dXNfY29kZSA+IDIwNiAmJiAkZmlsZS0+c3RhdHVzX2NvZGUgPCAzMDApKSkKCQkJCQkJCQl7CgkJCQkJCQkJCWlmICgkY2FjaGUtPnNhdmUoYXJyYXkoJ2hlYWRlcnMnID0+ICRmaWxlLT5oZWFkZXJzLCAnYm9keScgPT4gJGZpbGUtPmJvZHkpKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJJGltZy0+c2V0QXR0cmlidXRlKCdzcmMnLCAkdGhpcy0+aW1hZ2VfaGFuZGxlciAuICRpbWFnZV91cmwpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWVsc2UKCQkJCQkJCQkJewoJCQkJCQkJCQkJdHJpZ2dlcl9lcnJvcigiJHRoaXMtPmNhY2hlX2xvY2F0aW9uIGlzIG5vdCB3cml0ZWFibGUuIE1ha2Ugc3VyZSB5b3UndmUgc2V0IHRoZSBjb3JyZWN0IHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGgsIGFuZCB0aGF0IHRoZSBsb2NhdGlvbiBpcyBzZXJ2ZXItd3JpdGFibGUuIiwgRV9VU0VSX1dBUk5JTkcpOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFJlbW92ZSB0aGUgRE9DVFlQRQoJCQkJLy8gU2VlbXMgdG8gY2F1c2Ugc2VnZmF1bHRpbmcgaWYgd2UgZG9uJ3QgZG8gdGhpcwoJCQkJaWYgKCRkb2N1bWVudC0+Zmlyc3RDaGlsZCBpbnN0YW5jZW9mIERPTURvY3VtZW50VHlwZSkKCQkJCXsKCQkJCQkkZG9jdW1lbnQtPnJlbW92ZUNoaWxkKCRkb2N1bWVudC0+Zmlyc3RDaGlsZCk7CgkJCQl9CgoJCQkJLy8gTW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIGJvZHkgdG8gdGhlIHJvb3QKCQkJCSRyZWFsX2JvZHkgPSAkZG9jdW1lbnQtPmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JyktPml0ZW0oMCktPmNoaWxkTm9kZXMtPml0ZW0oMCk7CgkJCQkkZG9jdW1lbnQtPnJlcGxhY2VDaGlsZCgkcmVhbF9ib2R5LCAkZG9jdW1lbnQtPmZpcnN0Q2hpbGQpOwoKCQkJCS8vIEZpbmFsbHksIGNvbnZlcnQgdG8gYSBIVE1MIHN0cmluZwoJCQkJJGRhdGEgPSB0cmltKCRkb2N1bWVudC0+c2F2ZUhUTUwoKSk7CgoJCQkJaWYgKCR0aGlzLT5yZW1vdmVfZGl2KQoJCQkJewoJCQkJCSRkYXRhID0gcHJlZ19yZXBsYWNlKCcvXjxkaXYnIC4gU0lNUExFUElFX1BDUkVfWE1MX0FUVFJJQlVURSAuICc+LycsICcnLCAkZGF0YSk7CgkJCQkJJGRhdGEgPSBwcmVnX3JlcGxhY2UoJy88XC9kaXY+JC8nLCAnJywgJGRhdGEpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRkYXRhID0gcHJlZ19yZXBsYWNlKCcvXjxkaXYnIC4gU0lNUExFUElFX1BDUkVfWE1MX0FUVFJJQlVURSAuICc+LycsICc8ZGl2PicsICRkYXRhKTsKCQkJCX0KCQkJfQoKCQkJaWYgKCR0eXBlICYgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpCgkJCXsKCQkJCSRkYXRhID0gJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2Fic29sdXRpemVfdXJsJywgYXJyYXkoJGRhdGEsICRiYXNlKSk7CgkJCX0KCgkJCWlmICgkdHlwZSAmIChTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQgfCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSkpCgkJCXsKCQkJCSRkYXRhID0gaHRtbHNwZWNpYWxjaGFycygkZGF0YSwgRU5UX0NPTVBBVCwgJ1VURi04Jyk7CgkJCX0KCgkJCWlmICgkdGhpcy0+b3V0cHV0X2VuY29kaW5nICE9PSAnVVRGLTgnKQoJCQl7CgkJCQkkZGF0YSA9ICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnTWlzYycsICdjaGFuZ2VfZW5jb2RpbmcnLCBhcnJheSgkZGF0YSwgJ1VURi04JywgJHRoaXMtPm91dHB1dF9lbmNvZGluZykpOwoJCQl9CgkJfQoJCXJldHVybiAkZGF0YTsKCX0KCglwcm90ZWN0ZWQgZnVuY3Rpb24gcHJlcHJvY2VzcygkaHRtbCwgJHR5cGUpCgl7CgkJJHJldCA9ICcnOwoJCWlmICgkdHlwZSAmIH5TSU1QTEVQSUVfQ09OU1RSVUNUX1hIVE1MKQoJCXsKCQkJLy8gQXRvbSBYSFRNTCBjb25zdHJ1Y3RzIGFyZSB3cmFwcGVkIHdpdGggYSBkaXYgYnkgZGVmYXVsdAoJCQkvLyBOb3RlOiBObyBwcm90ZWN0aW9uIGlmICRodG1sIGNvbnRhaW5zIGEgc3RyYXkgPC9kaXY+IQoJCQkkaHRtbCA9ICc8ZGl2PicgLiAkaHRtbCAuICc8L2Rpdj4nOwoJCQkkcmV0IC49ICc8IURPQ1RZUEUgaHRtbD4nOwoJCQkkY29udGVudF90eXBlID0gJ3RleHQvaHRtbCc7CgkJfQoJCWVsc2UKCQl7CgkJCSRyZXQgLj0gJzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4nOwoJCQkkY29udGVudF90eXBlID0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCc7CgkJfQoKCQkkcmV0IC49ICc8aHRtbD48aGVhZD4nOwoJCSRyZXQgLj0gJzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0iJyAuICRjb250ZW50X3R5cGUgLiAnOyBjaGFyc2V0PXV0Zi04IiAvPic7CgkJJHJldCAuPSAnPC9oZWFkPjxib2R5PicgLiAkaHRtbCAuICc8L2JvZHk+PC9odG1sPic7CgkJcmV0dXJuICRyZXQ7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHJlcGxhY2VfdXJscygkZG9jdW1lbnQsICR0YWcsICRhdHRyaWJ1dGVzKQoJewoJCWlmICghaXNfYXJyYXkoJGF0dHJpYnV0ZXMpKQoJCXsKCQkJJGF0dHJpYnV0ZXMgPSBhcnJheSgkYXR0cmlidXRlcyk7CgkJfQoKCQlpZiAoIWlzX2FycmF5KCR0aGlzLT5zdHJpcF9odG1sdGFncykgfHwgIWluX2FycmF5KCR0YWcsICR0aGlzLT5zdHJpcF9odG1sdGFncykpCgkJewoJCQkkZWxlbWVudHMgPSAkZG9jdW1lbnQtPmdldEVsZW1lbnRzQnlUYWdOYW1lKCR0YWcpOwoJCQlmb3JlYWNoICgkZWxlbWVudHMgYXMgJGVsZW1lbnQpCgkJCXsKCQkJCWZvcmVhY2ggKCRhdHRyaWJ1dGVzIGFzICRhdHRyaWJ1dGUpCgkJCQl7CgkJCQkJaWYgKCRlbGVtZW50LT5oYXNBdHRyaWJ1dGUoJGF0dHJpYnV0ZSkpCgkJCQkJewoJCQkJCQkkdmFsdWUgPSAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnYWJzb2x1dGl6ZV91cmwnLCBhcnJheSgkZWxlbWVudC0+Z2V0QXR0cmlidXRlKCRhdHRyaWJ1dGUpLCAkdGhpcy0+YmFzZSkpOwoJCQkJCQkkZWxlbWVudC0+c2V0QXR0cmlidXRlKCRhdHRyaWJ1dGUsICR2YWx1ZSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBkb19zdHJpcF9odG1sdGFncygkbWF0Y2gpCgl7CgkJaWYgKCR0aGlzLT5lbmNvZGVfaW5zdGVhZF9vZl9zdHJpcCkKCQl7CgkJCWlmIChpc3NldCgkbWF0Y2hbNF0pICYmICFpbl9hcnJheShzdHJ0b2xvd2VyKCRtYXRjaFsxXSksIGFycmF5KCdzY3JpcHQnLCAnc3R5bGUnKSkpCgkJCXsKCQkJCSRtYXRjaFsxXSA9IGh0bWxzcGVjaWFsY2hhcnMoJG1hdGNoWzFdLCBFTlRfQ09NUEFULCAnVVRGLTgnKTsKCQkJCSRtYXRjaFsyXSA9IGh0bWxzcGVjaWFsY2hhcnMoJG1hdGNoWzJdLCBFTlRfQ09NUEFULCAnVVRGLTgnKTsKCQkJCXJldHVybiAiJmx0OyRtYXRjaFsxXSRtYXRjaFsyXSZndDskbWF0Y2hbM10mbHQ7LyRtYXRjaFsxXSZndDsiOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIGh0bWxzcGVjaWFsY2hhcnMoJG1hdGNoWzBdLCBFTlRfQ09NUEFULCAnVVRGLTgnKTsKCQkJfQoJCX0KCQllbHNlaWYgKGlzc2V0KCRtYXRjaFs0XSkgJiYgIWluX2FycmF5KHN0cnRvbG93ZXIoJG1hdGNoWzFdKSwgYXJyYXkoJ3NjcmlwdCcsICdzdHlsZScpKSkKCQl7CgkJCXJldHVybiAkbWF0Y2hbNF07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAnJzsKCQl9Cgl9CgoJcHJvdGVjdGVkIGZ1bmN0aW9uIHN0cmlwX3RhZygkdGFnLCAkZG9jdW1lbnQsICR0eXBlKQoJewoJCSR4cGF0aCA9IG5ldyBET01YUGF0aCgkZG9jdW1lbnQpOwoJCSRlbGVtZW50cyA9ICR4cGF0aC0+cXVlcnkoJ2JvZHkvLycgLiAkdGFnKTsKCQlpZiAoJHRoaXMtPmVuY29kZV9pbnN0ZWFkX29mX3N0cmlwKQoJCXsKCQkJZm9yZWFjaCAoJGVsZW1lbnRzIGFzICRlbGVtZW50KQoJCQl7CgkJCQkkZnJhZ21lbnQgPSAkZG9jdW1lbnQtPmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKCgkJCQkvLyBGb3IgZWxlbWVudHMgd2hpY2ggYXJlbid0IHNjcmlwdCBvciBzdHlsZSwgaW5jbHVkZSB0aGUgdGFnIGl0c2VsZgoJCQkJaWYgKCFpbl9hcnJheSgkdGFnLCBhcnJheSgnc2NyaXB0JywgJ3N0eWxlJykpKQoJCQkJewoJCQkJCSR0ZXh0ID0gJzwnIC4gJHRhZzsKCQkJCQlpZiAoJGVsZW1lbnQtPmhhc0F0dHJpYnV0ZXMoKSkKCQkJCQl7CgkJCQkJCSRhdHRycyA9IGFycmF5KCk7CgkJCQkJCWZvcmVhY2ggKCRlbGVtZW50LT5hdHRyaWJ1dGVzIGFzICRuYW1lID0+ICRhdHRyKQoJCQkJCQl7CgkJCQkJCQkkdmFsdWUgPSAkYXR0ci0+dmFsdWU7CgoJCQkJCQkJLy8gSW4gWEhUTUwsIGVtcHR5IHZhbHVlcyBzaG91bGQgbmV2ZXIgZXhpc3QsIHNvIHdlIHJlcGVhdCB0aGUgdmFsdWUKCQkJCQkJCWlmIChlbXB0eSgkdmFsdWUpICYmICgkdHlwZSAmIFNJTVBMRVBJRV9DT05TVFJVQ1RfWEhUTUwpKQoJCQkJCQkJewoJCQkJCQkJCSR2YWx1ZSA9ICRuYW1lOwoJCQkJCQkJfQoJCQkJCQkJLy8gRm9yIEhUTUwsIGVtcHR5IGlzIGZpbmUKCQkJCQkJCWVsc2VpZiAoZW1wdHkoJHZhbHVlKSAmJiAoJHR5cGUgJiBTSU1QTEVQSUVfQ09OU1RSVUNUX0hUTUwpKQoJCQkJCQkJewoJCQkJCQkJCSRhdHRyc1tdID0gJG5hbWU7CgkJCQkJCQkJY29udGludWU7CgkJCQkJCQl9CgoJCQkJCQkJLy8gU3RhbmRhcmQgYXR0cmlidXRlIHRleHQKCQkJCQkJCSRhdHRyc1tdID0gJG5hbWUgLiAnPSInIC4gJGF0dHItPnZhbHVlIC4gJyInOwoJCQkJCQl9CgkJCQkJCSR0ZXh0IC49ICcgJyAuIGltcGxvZGUoJyAnLCAkYXR0cnMpOwoJCQkJCX0KCQkJCQkkdGV4dCAuPSAnPic7CgkJCQkJJGZyYWdtZW50LT5hcHBlbmRDaGlsZChuZXcgRE9NVGV4dCgkdGV4dCkpOwoJCQkJfQoKCQkJCSRudW1iZXIgPSAkZWxlbWVudC0+Y2hpbGROb2Rlcy0+bGVuZ3RoOwoJCQkJZm9yICgkaSA9ICRudW1iZXI7ICRpID4gMDsgJGktLSkKCQkJCXsKCQkJCQkkY2hpbGQgPSAkZWxlbWVudC0+Y2hpbGROb2Rlcy0+aXRlbSgwKTsKCQkJCQkkZnJhZ21lbnQtPmFwcGVuZENoaWxkKCRjaGlsZCk7CgkJCQl9CgoJCQkJaWYgKCFpbl9hcnJheSgkdGFnLCBhcnJheSgnc2NyaXB0JywgJ3N0eWxlJykpKQoJCQkJewoJCQkJCSRmcmFnbWVudC0+YXBwZW5kQ2hpbGQobmV3IERPTVRleHQoJzwvJyAuICR0YWcgLiAnPicpKTsKCQkJCX0KCgkJCQkkZWxlbWVudC0+cGFyZW50Tm9kZS0+cmVwbGFjZUNoaWxkKCRmcmFnbWVudCwgJGVsZW1lbnQpOwoJCQl9CgoJCQlyZXR1cm47CgkJfQoJCWVsc2VpZiAoaW5fYXJyYXkoJHRhZywgYXJyYXkoJ3NjcmlwdCcsICdzdHlsZScpKSkKCQl7CgkJCWZvcmVhY2ggKCRlbGVtZW50cyBhcyAkZWxlbWVudCkKCQkJewoJCQkJJGVsZW1lbnQtPnBhcmVudE5vZGUtPnJlbW92ZUNoaWxkKCRlbGVtZW50KTsKCQkJfQoKCQkJcmV0dXJuOwoJCX0KCQllbHNlCgkJewoJCQlmb3JlYWNoICgkZWxlbWVudHMgYXMgJGVsZW1lbnQpCgkJCXsKCQkJCSRmcmFnbWVudCA9ICRkb2N1bWVudC0+Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwoJCQkJJG51bWJlciA9ICRlbGVtZW50LT5jaGlsZE5vZGVzLT5sZW5ndGg7CgkJCQlmb3IgKCRpID0gJG51bWJlcjsgJGkgPiAwOyAkaS0tKQoJCQkJewoJCQkJCSRjaGlsZCA9ICRlbGVtZW50LT5jaGlsZE5vZGVzLT5pdGVtKDApOwoJCQkJCSRmcmFnbWVudC0+YXBwZW5kQ2hpbGQoJGNoaWxkKTsKCQkJCX0KCgkJCQkkZWxlbWVudC0+cGFyZW50Tm9kZS0+cmVwbGFjZUNoaWxkKCRmcmFnbWVudCwgJGVsZW1lbnQpOwoJCQl9CgkJfQoJfQoKCXByb3RlY3RlZCBmdW5jdGlvbiBzdHJpcF9hdHRyKCRhdHRyaWIsICRkb2N1bWVudCkKCXsKCQkkeHBhdGggPSBuZXcgRE9NWFBhdGgoJGRvY3VtZW50KTsKCQkkZWxlbWVudHMgPSAkeHBhdGgtPnF1ZXJ5KCcvLypbQCcgLiAkYXR0cmliIC4gJ10nKTsKCgkJZm9yZWFjaCAoJGVsZW1lbnRzIGFzICRlbGVtZW50KQoJCXsKCQkJJGVsZW1lbnQtPnJlbW92ZUF0dHJpYnV0ZSgkYXR0cmliKTsKCQl9Cgl9Cn0KCi8qKgogKiBIYW5kbGVzIGA8YXRvbTpzb3VyY2U+YAogKgogKiBVc2VkIGJ5IHtAc2VlIFNpbXBsZVBpZV9JdGVtOjpnZXRfc291cmNlKCl9CiAqCiAqIFRoaXMgY2xhc3MgY2FuIGJlIG92ZXJsb2FkZWQgd2l0aCB7QHNlZSBTaW1wbGVQaWU6OnNldF9zb3VyY2VfY2xhc3MoKX0KICoKICogQHBhY2thZ2UgU2ltcGxlUGllCiAqIEBzdWJwYWNrYWdlIEFQSQogKi8KY2xhc3MgU2ltcGxlUGllX1NvdXJjZQp7Cgl2YXIgJGl0ZW07Cgl2YXIgJGRhdGEgPSBhcnJheSgpOwoJcHJvdGVjdGVkICRyZWdpc3RyeTsKCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGl0ZW0sICRkYXRhKQoJewoJCSR0aGlzLT5pdGVtID0gJGl0ZW07CgkJJHRoaXMtPmRhdGEgPSAkZGF0YTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gc2V0X3JlZ2lzdHJ5KFNpbXBsZVBpZV9SZWdpc3RyeSAkcmVnaXN0cnkpCgl7CgkJJHRoaXMtPnJlZ2lzdHJ5ID0gJHJlZ2lzdHJ5OwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKCXsKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcy0+ZGF0YSkpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRfc291cmNlX3RhZ3MoJG5hbWVzcGFjZSwgJHRhZykKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ10pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5kYXRhWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF9iYXNlKCRlbGVtZW50ID0gYXJyYXkoKSkKCXsKCQlyZXR1cm4gJHRoaXMtPml0ZW0tPmdldF9iYXNlKCRlbGVtZW50KTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gc2FuaXRpemUoJGRhdGEsICR0eXBlLCAkYmFzZSA9ICcnKQoJewoJCXJldHVybiAkdGhpcy0+aXRlbS0+c2FuaXRpemUoJGRhdGEsICR0eXBlLCAkYmFzZSk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF9pdGVtKCkKCXsKCQlyZXR1cm4gJHRoaXMtPml0ZW07Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF90aXRsZSgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2F0b21fMTBfY29uc3RydWN0X3R5cGUnLCBhcnJheSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnTWlzYycsICdhdG9tXzAzX2NvbnN0cnVjdF90eXBlJywgYXJyYXkoJHJldHVyblswXVsnYXR0cmlicyddKSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRfY2F0ZWdvcnkoJGtleSA9IDApCgl7CgkJJGNhdGVnb3JpZXMgPSAkdGhpcy0+Z2V0X2NhdGVnb3JpZXMoKTsKCQlpZiAoaXNzZXQoJGNhdGVnb3JpZXNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRjYXRlZ29yaWVzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF9jYXRlZ29yaWVzKCkKCXsKCQkkY2F0ZWdvcmllcyA9IGFycmF5KCk7CgoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdjYXRlZ29yeScpIGFzICRjYXRlZ29yeSkKCQl7CgkJCSR0ZXJtID0gbnVsbDsKCQkJJHNjaGVtZSA9IG51bGw7CgkJCSRsYWJlbCA9IG51bGw7CgkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3Rlcm0nXSkpCgkJCXsKCQkJCSR0ZXJtID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsndGVybSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJewoJCQkJJHNjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2xhYmVsJ10pKQoJCQl7CgkJCQkkbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCSRjYXRlZ29yaWVzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQ2F0ZWdvcnknLCBhcnJheSgkdGVybSwgJHNjaGVtZSwgJGxhYmVsKSk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMCwgJ2NhdGVnb3J5JykgYXMgJGNhdGVnb3J5KQoJCXsKCQkJLy8gVGhpcyBpcyByZWFsbHkgdGhlIGxhYmVsLCBidXQga2VlcCB0aGlzIGFzIHRoZSB0ZXJtIGFsc28gZm9yIEJDLgoJCQkvLyBMYWJlbCB3aWxsIGFsc28gd29yayBvbiByZXRyaWV2aW5nIGJlY2F1c2UgdGhhdCBmYWxscyBiYWNrIHRvIHRlcm0uCgkJCSR0ZXJtID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydkb21haW4nXSkpCgkJCXsKCQkJCSRzY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydkb21haW4nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRzY2hlbWUgPSBudWxsOwoJCQl9CgkJCSRjYXRlZ29yaWVzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQ2F0ZWdvcnknLCBhcnJheSgkdGVybSwgJHNjaGVtZSwgbnVsbCkpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ3N1YmplY3QnKSBhcyAkY2F0ZWdvcnkpCgkJewoJCQkkY2F0ZWdvcmllc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0NhdGVnb3J5JywgYXJyYXkoJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKSk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAnc3ViamVjdCcpIGFzICRjYXRlZ29yeSkKCQl7CgkJCSRjYXRlZ29yaWVzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQ2F0ZWdvcnknLCBhcnJheSgkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpKTsKCQl9CgoJCWlmICghZW1wdHkoJGNhdGVnb3JpZXMpKQoJCXsKCQkJcmV0dXJuIGFycmF5X3VuaXF1ZSgkY2F0ZWdvcmllcyk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2F1dGhvcigka2V5ID0gMCkKCXsKCQkkYXV0aG9ycyA9ICR0aGlzLT5nZXRfYXV0aG9ycygpOwoJCWlmIChpc3NldCgkYXV0aG9yc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGF1dGhvcnNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2F1dGhvcnMoKQoJewoJCSRhdXRob3JzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnYXV0aG9yJykgYXMgJGF1dGhvcikKCQl7CgkJCSRuYW1lID0gbnVsbDsKCQkJJHVyaSA9IG51bGw7CgkJCSRlbWFpbCA9IG51bGw7CgkJCWlmIChpc3NldCgkYXV0aG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ25hbWUnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJG5hbWUgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJHVyaSA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXSkpOwoJCQl9CgkJCWlmIChpc3NldCgkYXV0aG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ2VtYWlsJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRlbWFpbCA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ2VtYWlsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoJG5hbWUgIT09IG51bGwgfHwgJGVtYWlsICE9PSBudWxsIHx8ICR1cmkgIT09IG51bGwpCgkJCXsKCQkJCSRhdXRob3JzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQXV0aG9yJywgYXJyYXkoJG5hbWUsICR1cmksICRlbWFpbCkpOwoJCQl9CgkJfQoJCWlmICgkYXV0aG9yID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdhdXRob3InKSkKCQl7CgkJCSRuYW1lID0gbnVsbDsKCQkJJHVybCA9IG51bGw7CgkJCSRlbWFpbCA9IG51bGw7CgkJCWlmIChpc3NldCgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJG5hbWUgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJHVybCA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXSkpOwoJCQl9CgkJCWlmIChpc3NldCgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ2VtYWlsJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRlbWFpbCA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ2VtYWlsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoJG5hbWUgIT09IG51bGwgfHwgJGVtYWlsICE9PSBudWxsIHx8ICR1cmwgIT09IG51bGwpCgkJCXsKCQkJCSRhdXRob3JzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQXV0aG9yJywgYXJyYXkoJG5hbWUsICR1cmwsICRlbWFpbCkpOwoJCQl9CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExLCAnY3JlYXRvcicpIGFzICRhdXRob3IpCgkJewoJCQkkYXV0aG9yc1tdID0gJHRoaXMtPnJlZ2lzdHJ5LT5jcmVhdGUoJ0F1dGhvcicsIGFycmF5KCR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAsICdjcmVhdG9yJykgYXMgJGF1dGhvcikKCQl7CgkJCSRhdXRob3JzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQXV0aG9yJywgYXJyYXkoJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSwgbnVsbCwgbnVsbCkpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdhdXRob3InKSBhcyAkYXV0aG9yKQoJCXsKCQkJJGF1dGhvcnNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdBdXRob3InLCBhcnJheSgkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKSk7CgkJfQoKCQlpZiAoIWVtcHR5KCRhdXRob3JzKSkKCQl7CgkJCXJldHVybiBhcnJheV91bmlxdWUoJGF1dGhvcnMpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF9jb250cmlidXRvcigka2V5ID0gMCkKCXsKCQkkY29udHJpYnV0b3JzID0gJHRoaXMtPmdldF9jb250cmlidXRvcnMoKTsKCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGNvbnRyaWJ1dG9yc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29udHJpYnV0b3JzKCkKCXsKCQkkY29udHJpYnV0b3JzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnY29udHJpYnV0b3InKSBhcyAkY29udHJpYnV0b3IpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmkgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ25hbWUnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJG5hbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ25hbWUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmkgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdKSk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ2VtYWlsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoJG5hbWUgIT09IG51bGwgfHwgJGVtYWlsICE9PSBudWxsIHx8ICR1cmkgIT09IG51bGwpCgkJCXsKCQkJCSRjb250cmlidXRvcnNbXSA9ICR0aGlzLT5yZWdpc3RyeS0+Y3JlYXRlKCdBdXRob3InLCBhcnJheSgkbmFtZSwgJHVyaSwgJGVtYWlsKSk7CgkJCX0KCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2NvbnRyaWJ1dG9yJykgYXMgJGNvbnRyaWJ1dG9yKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJsID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXSkpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJsICE9PSBudWxsKQoJCQl7CgkJCQkkY29udHJpYnV0b3JzW10gPSAkdGhpcy0+cmVnaXN0cnktPmNyZWF0ZSgnQXV0aG9yJywgYXJyYXkoJG5hbWUsICR1cmwsICRlbWFpbCkpOwoJCQl9CgkJfQoKCQlpZiAoIWVtcHR5KCRjb250cmlidXRvcnMpKQoJCXsKCQkJcmV0dXJuIGFycmF5X3VuaXF1ZSgkY29udHJpYnV0b3JzKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRfbGluaygka2V5ID0gMCwgJHJlbCA9ICdhbHRlcm5hdGUnKQoJewoJCSRsaW5rcyA9ICR0aGlzLT5nZXRfbGlua3MoJHJlbCk7CgkJaWYgKGlzc2V0KCRsaW5rc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGxpbmtzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBBZGRlZCBmb3IgcGFyaXR5IGJldHdlZW4gdGhlIHBhcmVudC1sZXZlbCBhbmQgdGhlIGl0ZW0vZW50cnktbGV2ZWwuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfcGVybWFsaW5rKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdldF9saW5rKDApOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRfbGlua3MoJHJlbCA9ICdhbHRlcm5hdGUnKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPmRhdGFbJ2xpbmtzJ10pKQoJCXsKCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ10gPSBhcnJheSgpOwoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdsaW5rJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykKCQkJCXsKCQkJCQlpZiAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ2hyZWYnXSkpCgkJCQkJewoJCQkJCQkkbGlua19yZWwgPSAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddKSkgPyAkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10gOiAnYWx0ZXJuYXRlJzsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGxpbmtfcmVsXVtdID0gJHRoaXMtPnNhbml0aXplKCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmspKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnbGluaycpKQoJCQl7CgkJCQlmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10pKQoJCQkJCXsKCQkJCQkJJGxpbmtfcmVsID0gKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSkpID8gJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddIDogJ2FsdGVybmF0ZSc7CgkJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWyRsaW5rX3JlbF1bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ2xpbmsnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJ2FsdGVybmF0ZSddW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmtzWzBdKSk7CgkJCX0KCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAnbGluaycpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVsnYWx0ZXJuYXRlJ11bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua3NbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGlua3NbMF0pKTsKCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMCwgJ2xpbmsnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJ2FsdGVybmF0ZSddW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmtzWzBdKSk7CgkJCX0KCgkJCSRrZXlzID0gYXJyYXlfa2V5cygkdGhpcy0+ZGF0YVsnbGlua3MnXSk7CgkJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpCgkJCXsKCQkJCWlmICgkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnaXNfaXNlZ21lbnRfbnpfbmMnLCBhcnJheSgka2V5KSkpCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddW1NJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZIC4gJGtleV0pKQoJCQkJCXsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSA9IGFycmF5X21lcmdlKCR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldLCAkdGhpcy0+ZGF0YVsnbGlua3MnXVtTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSAuICRrZXldKTsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV0gPSYgJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSA9JiAkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlaWYgKHN1YnN0cigka2V5LCAwLCA0MSkgPT09IFNJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZKQoJCQkJewoJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddW3N1YnN0cigka2V5LCA0MSldID0mICR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldOwoJCQkJfQoJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV0gPSBhcnJheV91bmlxdWUoJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV0pOwoJCQl9CgkJfQoKCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJHJlbF0pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5kYXRhWydsaW5rcyddWyRyZWxdOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF9kZXNjcmlwdGlvbigpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ3N1YnRpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2F0b21fMTBfY29uc3RydWN0X3R5cGUnLCBhcnJheSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICd0YWdsaW5lJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgJHRoaXMtPnJlZ2lzdHJ5LT5jYWxsKCdNaXNjJywgJ2F0b21fMDNfY29uc3RydWN0X3R5cGUnLCBhcnJheSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MCwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwLCAnZGVzY3JpcHRpb24nKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX01BWUJFX0hUTUwsICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAnZGVzY3JpcHRpb24nKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfSVRVTkVTLCAnc3VtbWFyeScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ3N1YnRpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF9jb3B5cmlnaHQoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCAkdGhpcy0+cmVnaXN0cnktPmNhbGwoJ01pc2MnLCAnYXRvbV8xMF9jb25zdHJ1Y3RfdHlwZScsIGFycmF5KCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSkpLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2NvcHlyaWdodCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sICR0aGlzLT5yZWdpc3RyeS0+Y2FsbCgnTWlzYycsICdhdG9tXzAzX2NvbnN0cnVjdF90eXBlJywgYXJyYXkoJHJldHVyblswXVsnYXR0cmlicyddKSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMjAsICdjb3B5cmlnaHQnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF9sYW5ndWFnZSgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzIwLCAnbGFuZ3VhZ2UnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdsYW5ndWFnZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2xhbmd1YWdlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmIChpc3NldCgkdGhpcy0+ZGF0YVsneG1sX2xhbmcnXSkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCR0aGlzLT5kYXRhWyd4bWxfbGFuZyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldF9sYXRpdHVkZSgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfVzNDX0JBU0lDX0dFTywgJ2xhdCcpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0dFT1JTUywgJ3BvaW50JykpICYmIHByZWdfbWF0Y2goJy9eKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkgKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkkLycsIHRyaW0oJHJldHVyblswXVsnZGF0YSddKSwgJG1hdGNoKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRtYXRjaFsxXTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRfbG9uZ2l0dWRlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9XM0NfQkFTSUNfR0VPLCAnbG9uZycpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfVzNDX0JBU0lDX0dFTywgJ2xvbicpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0dFT1JTUywgJ3BvaW50JykpICYmIHByZWdfbWF0Y2goJy9eKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkgKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkkLycsIHRyaW0oJHJldHVyblswXVsnZGF0YSddKSwgJG1hdGNoKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRtYXRjaFsyXTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRfaW1hZ2VfdXJsKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdpbWFnZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydhdHRyaWJzJ11bJyddWydocmVmJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdsb2dvJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnaWNvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9Cn0KCi8qKgogKiBQYXJzZXMgdGhlIFhNTCBEZWNsYXJhdGlvbgogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICogQHN1YnBhY2thZ2UgUGFyc2luZwogKi8KY2xhc3MgU2ltcGxlUGllX1hNTF9EZWNsYXJhdGlvbl9QYXJzZXIKewoJLyoqCgkgKiBYTUwgVmVyc2lvbgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJHZlcnNpb24gPSAnMS4wJzsKCgkvKioKCSAqIEVuY29kaW5nCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkZW5jb2RpbmcgPSAnVVRGLTgnOwoKCS8qKgoJICogU3RhbmRhbG9uZQoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIGJvb2wKCSAqLwoJdmFyICRzdGFuZGFsb25lID0gZmFsc2U7CgoJLyoqCgkgKiBDdXJyZW50IHN0YXRlIG9mIHRoZSBzdGF0ZSBtYWNoaW5lCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJHN0YXRlID0gJ2JlZm9yZV92ZXJzaW9uX25hbWUnOwoKCS8qKgoJICogSW5wdXQgZGF0YQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRkYXRhID0gJyc7CgoJLyoqCgkgKiBJbnB1dCBkYXRhIGxlbmd0aCAodG8gYXZvaWQgY2FsbGluZyBzdHJsZW4oKSBldmVyeXRpbWUgdGhpcyBpcyBuZWVkZWQpCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGludAoJICovCgl2YXIgJGRhdGFfbGVuZ3RoID0gMDsKCgkvKioKCSAqIEN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHBvaW50ZXIKCSAqCgkgKiBAdmFyIGludAoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcG9zaXRpb24gPSAwOwoKCS8qKgoJICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB3aXRoIHRoZSBpbnB1dCBkYXRhCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgSW5wdXQgZGF0YQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGRhdGEpCgl7CgkJJHRoaXMtPmRhdGEgPSAkZGF0YTsKCQkkdGhpcy0+ZGF0YV9sZW5ndGggPSBzdHJsZW4oJHRoaXMtPmRhdGEpOwoJfQoKCS8qKgoJICogUGFyc2UgdGhlIGlucHV0IGRhdGEKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHJldHVybiBib29sIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQoJICovCglwdWJsaWMgZnVuY3Rpb24gcGFyc2UoKQoJewoJCXdoaWxlICgkdGhpcy0+c3RhdGUgJiYgJHRoaXMtPnN0YXRlICE9PSAnZW1pdCcgJiYgJHRoaXMtPmhhc19kYXRhKCkpCgkJewoJCQkkc3RhdGUgPSAkdGhpcy0+c3RhdGU7CgkJCSR0aGlzLT4kc3RhdGUoKTsKCQl9CgkJJHRoaXMtPmRhdGEgPSAnJzsKCQlpZiAoJHRoaXMtPnN0YXRlID09PSAnZW1pdCcpCgkJewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnZlcnNpb24gPSAnJzsKCQkJJHRoaXMtPmVuY29kaW5nID0gJyc7CgkJCSR0aGlzLT5zdGFuZGFsb25lID0gJyc7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGRhdGEgYmV5b25kIHRoZSBwb2ludGVyCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGVyZSBpcyBmdXJ0aGVyIGRhdGEsIGZhbHNlIGlmIG5vdAoJICovCglwdWJsaWMgZnVuY3Rpb24gaGFzX2RhdGEoKQoJewoJCXJldHVybiAoYm9vbCkgKCR0aGlzLT5wb3NpdGlvbiA8ICR0aGlzLT5kYXRhX2xlbmd0aCk7Cgl9CgoJLyoqCgkgKiBBZHZhbmNlIHBhc3QgYW55IHdoaXRlc3BhY2UKCSAqCgkgKiBAcmV0dXJuIGludCBOdW1iZXIgb2Ygd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHBhc3NlZAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2tpcF93aGl0ZXNwYWNlKCkKCXsKCQkkd2hpdGVzcGFjZSA9IHN0cnNwbigkdGhpcy0+ZGF0YSwgIlx4MDlceDBBXHgwRFx4MjAiLCAkdGhpcy0+cG9zaXRpb24pOwoJCSR0aGlzLT5wb3NpdGlvbiArPSAkd2hpdGVzcGFjZTsKCQlyZXR1cm4gJHdoaXRlc3BhY2U7Cgl9CgoJLyoqCgkgKiBSZWFkIHZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfdmFsdWUoKQoJewoJCSRxdW90ZSA9IHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAxKTsKCQlpZiAoJHF1b3RlID09PSAnIicgfHwgJHF1b3RlID09PSAiJyIpCgkJewoJCQkkdGhpcy0+cG9zaXRpb24rKzsKCQkJJGxlbiA9IHN0cmNzcG4oJHRoaXMtPmRhdGEsICRxdW90ZSwgJHRoaXMtPnBvc2l0aW9uKTsKCQkJaWYgKCR0aGlzLT5oYXNfZGF0YSgpKQoJCQl7CgkJCQkkdmFsdWUgPSBzdWJzdHIoJHRoaXMtPmRhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbik7CgkJCQkkdGhpcy0+cG9zaXRpb24gKz0gJGxlbiArIDE7CgkJCQlyZXR1cm4gJHZhbHVlOwoJCQl9CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gYmVmb3JlX3ZlcnNpb25fbmFtZSgpCgl7CgkJaWYgKCR0aGlzLT5za2lwX3doaXRlc3BhY2UoKSkKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9ICd2ZXJzaW9uX25hbWUnOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHZlcnNpb25fbmFtZSgpCgl7CgkJaWYgKHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCA3KSA9PT0gJ3ZlcnNpb24nKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uICs9IDc7CgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJJHRoaXMtPnN0YXRlID0gJ3ZlcnNpb25fZXF1YWxzJzsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnN0YXRlID0gZmFsc2U7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiB2ZXJzaW9uX2VxdWFscygpCgl7CgkJaWYgKHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAxKSA9PT0gJz0nKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uKys7CgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJJHRoaXMtPnN0YXRlID0gJ3ZlcnNpb25fdmFsdWUnOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHZlcnNpb25fdmFsdWUoKQoJewoJCWlmICgkdGhpcy0+dmVyc2lvbiA9ICR0aGlzLT5nZXRfdmFsdWUoKSkKCQl7CgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJaWYgKCR0aGlzLT5oYXNfZGF0YSgpKQoJCQl7CgkJCQkkdGhpcy0+c3RhdGUgPSAnZW5jb2RpbmdfbmFtZSc7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGhpcy0+c3RhdGUgPSAnZW1pdCc7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnN0YXRlID0gZmFsc2U7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBlbmNvZGluZ19uYW1lKCkKCXsKCQlpZiAoc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDgpID09PSAnZW5jb2RpbmcnKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uICs9IDg7CgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJJHRoaXMtPnN0YXRlID0gJ2VuY29kaW5nX2VxdWFscyc7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9ICdzdGFuZGFsb25lX25hbWUnOwoJCX0KCX0KCglwdWJsaWMgZnVuY3Rpb24gZW5jb2RpbmdfZXF1YWxzKCkKCXsKCQlpZiAoc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDEpID09PSAnPScpCgkJewoJCQkkdGhpcy0+cG9zaXRpb24rKzsKCQkJJHRoaXMtPnNraXBfd2hpdGVzcGFjZSgpOwoJCQkkdGhpcy0+c3RhdGUgPSAnZW5jb2RpbmdfdmFsdWUnOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGVuY29kaW5nX3ZhbHVlKCkKCXsKCQlpZiAoJHRoaXMtPmVuY29kaW5nID0gJHRoaXMtPmdldF92YWx1ZSgpKQoJCXsKCQkJJHRoaXMtPnNraXBfd2hpdGVzcGFjZSgpOwoJCQlpZiAoJHRoaXMtPmhhc19kYXRhKCkpCgkJCXsKCQkJCSR0aGlzLT5zdGF0ZSA9ICdzdGFuZGFsb25lX25hbWUnOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPnN0YXRlID0gJ2VtaXQnOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KCglwdWJsaWMgZnVuY3Rpb24gc3RhbmRhbG9uZV9uYW1lKCkKCXsKCQlpZiAoc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDEwKSA9PT0gJ3N0YW5kYWxvbmUnKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uICs9IDEwOwoJCQkkdGhpcy0+c2tpcF93aGl0ZXNwYWNlKCk7CgkJCSR0aGlzLT5zdGF0ZSA9ICdzdGFuZGFsb25lX2VxdWFscyc7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KCglwdWJsaWMgZnVuY3Rpb24gc3RhbmRhbG9uZV9lcXVhbHMoKQoJewoJCWlmIChzdWJzdHIoJHRoaXMtPmRhdGEsICR0aGlzLT5wb3NpdGlvbiwgMSkgPT09ICc9JykKCQl7CgkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQkkdGhpcy0+c2tpcF93aGl0ZXNwYWNlKCk7CgkJCSR0aGlzLT5zdGF0ZSA9ICdzdGFuZGFsb25lX3ZhbHVlJzsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnN0YXRlID0gZmFsc2U7CgkJfQoJfQoKCXB1YmxpYyBmdW5jdGlvbiBzdGFuZGFsb25lX3ZhbHVlKCkKCXsKCQlpZiAoJHN0YW5kYWxvbmUgPSAkdGhpcy0+Z2V0X3ZhbHVlKCkpCgkJewoJCQlzd2l0Y2ggKCRzdGFuZGFsb25lKQoJCQl7CgkJCQljYXNlICd5ZXMnOgoJCQkJCSR0aGlzLT5zdGFuZGFsb25lID0gdHJ1ZTsKCQkJCQlicmVhazsKCgkJCQljYXNlICdubyc6CgkJCQkJJHRoaXMtPnN0YW5kYWxvbmUgPSBmYWxzZTsKCQkJCQlicmVhazsKCgkJCQlkZWZhdWx0OgoJCQkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCQkJCXJldHVybjsKCQkJfQoKCQkJJHRoaXMtPnNraXBfd2hpdGVzcGFjZSgpOwoJCQlpZiAoJHRoaXMtPmhhc19kYXRhKCkpCgkJCXsKCQkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPnN0YXRlID0gJ2VtaXQnOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KfQoK]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTW9kdWxlOiBSU1NTaW1wbGVQaWUgLSBzdXBlci1mYXN0LCBlYXN5LXRvLXVzZSwgUlNTIGFuZCBBdG9tIGZlZWQgcGFyc2luZyBpbiBQSFAuCiMgWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIGt1em1hbnkuYml6CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NpbXBsZXBpZS8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiAoIWlzc2V0KCRnQ21zKSkKICAgIGV4aXQ7CgovLyBjcmVhdGUgYSBwZXJtaXNzaW9uCiR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKFVTRV9SU1NTaW1wbGVQaWUsIFVTRV9SU1NTaW1wbGVQaWUpOwoKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xpbWl0JywgJzEwJyk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdjYWNoZV9saWZldGltZScsICcxODAwJyk7CgokZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCAndGVtcGxhdGVzJywgJ29yaWdfcnNzX3RlbXBsYXRlLnRwbCcpOwppZiAoZmlsZV9leGlzdHMoJGZuKSkgewogICAgJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoJGZuKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdkZWZhdWx0X3Jzc190ZW1wbGF0ZScsICR0ZW1wbGF0ZSk7CiAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ3Jzc190ZW1wbGF0ZVNhbXBsZScsICR0ZW1wbGF0ZSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnY3VycmVudF9yc3NfdGVtcGxhdGUnLCAnU2FtcGxlJyk7Cn0KCiR0aGlzLT5BdWRpdCgwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCdpbnN0YWxsZWQnLCAkdGhpcy0+R2V0VmVyc2lvbigpKSk7Cj8+]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTW9kdWxlOiBSU1NTaW1wbGVQaWUgLSBzdXBlci1mYXN0LCBlYXN5LXRvLXVzZSwgUlNTIGFuZCBBdG9tIGZlZWQgcGFyc2luZyBpbiBQSFAuCiMgWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIGt1em1hbnkuYml6CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NpbXBsZXBpZS8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKCiR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKFVTRV9SU1NTaW1wbGVQaWUpOwokdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgpOwokdGhpcy0+RGVsZXRlVGVtcGxhdGUoKTsKCi8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwokdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ3VuaW5zdGFsbGVkJykpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTW9kdWxlOiBSU1NTaW1wbGVQaWUgLSBzdXBlci1mYXN0LCBlYXN5LXRvLXVzZSwgUlNTIGFuZCBBdG9tIGZlZWQgcGFyc2luZyBpbiBQSFAuCiMgWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIGt1em1hbnkuYml6CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NpbXBsZXBpZS8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKCgokY3VycmVudF92ZXJzaW9uID0gJG9sZHZlcnNpb247CnN3aXRjaCgkY3VycmVudF92ZXJzaW9uKQp7CiBjYXNlICIxLjAiOgp9CgokdGhpcy0+QXVkaXQoIDAsIAoJICAgICAgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAKCSAgICAgICR0aGlzLT5MYW5nKCd1cGdyYWRlZCcsICR0aGlzLT5HZXRWZXJzaW9uKCkpKTsKCj8+]]></data>
	</file>
	<file>
	  <filename>/RSSSimplePie.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTW9kdWxlOiBSU1NTaW1wbGVQaWUgLSBzdXBlci1mYXN0LCBlYXN5LXRvLXVzZSwgUlNTIGFuZCBBdG9tIGZlZWQgcGFyc2luZyBpbiBQSFAuCiMgWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIGt1em1hbnkuYml6CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NpbXBsZXBpZS8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpkZWZpbmUoJ1VTRV9SU1NTaW1wbGVQaWUnLCAnVXNlIFJTU1NpbXBsZVBpZScpOwoKY2xhc3MgUlNTU2ltcGxlUGllIGV4dGVuZHMgQ0dFeHRlbnNpb25zIHsKCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0TmFtZSgpIHsKICAgICAgICByZXR1cm4gZ2V0X2NsYXNzKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7CiAgICAgICAgcmV0dXJuICcxLjAnOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRIZWxwKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnaGVscCcpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3IoKSB7CiAgICAgICAgcmV0dXJuICdAa3V6bWFueSc7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgewogICAgICAgIHJldHVybiAnemRlbm9Aa3V6bWFueS5iaXonOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRDaGFuZ2VMb2coKSB7CiAgICAgICAgcmV0dXJuIGZpbGVfZ2V0X2NvbnRlbnRzKGRpcm5hbWUoX19maWxlX18pIC4gJy9jaGFuZ2Vsb2cuaW5jJyk7CiAgICB9CiAgICBwdWJsaWMgZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIEFsbG93QXV0b1VwZ3JhZGUoKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIEhhc0FkbWluKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICdleHRlbnNpb25zJzsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0QWRtaW5EZXNjcmlwdGlvbigpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkNoZWNrQWNjZXNzKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIENoZWNrQWNjZXNzKCRwZXJtID0gVVNFX1JTU1NpbXBsZVBpZSkgewogICAgICAgIHJldHVybiAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCRwZXJtKTsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKSB7CiAgICAgICAgcmV0dXJuIGFycmF5KCdDR0V4dGVuc2lvbnMnID0+ICcxLjI5JywgJ0V4dGVuZGVkVG9vbHMnID0+ICcxLjMuMycpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpIHsKICAgICAgICByZXR1cm4gIjEuMTAiOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBJbml0aWFsaXplRnJvbnRlbmQoKSB7CiAgICAgICAgJHRoaXMtPlJlZ2lzdGVyTW9kdWxlUGx1Z2luKCk7IC8vYWxvdyB5b3UgcHV0IHtTa2VsZXRvbn0gb24geW9yIHRlbXBsYXRlIG91IHBhZ2UKICAgICAgICAkdGhpcy0+UmVzdHJpY3RVbmtub3duUGFyYW1zKCk7CgogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdmZWVkcycsIENMRUFOX1NUUklORyk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2ZlZWQnLCBDTEVBTl9TVFJJTkcpOwogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdsaW1pdCcsIENMRUFOX0lOVCk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ3BhZ2UnLCBDTEVBTl9JTlQpOwogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdpbmxpbmUnLCBDTEVBTl9JTlQpOwogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdjYWNoZV90aW1lb3V0JywgQ0xFQU5fSU5UKTsKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgndGVtcGxhdGUnLCBDTEVBTl9TVFJJTkcpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBJbml0aWFsaXplQWRtaW4oKSB7CiAgICAgICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignZmVlZHMnLCAnJywgJHRoaXMtPkxhbmcoJ2hlbHBfZmVlZHMnKSk7CiAgICAgICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignZmVlZCcsICcnLCAkdGhpcy0+TGFuZygnaGVscF9mZWVkJykpOwogICAgICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ2xpbWl0JywgJzAnLCAkdGhpcy0+TGFuZygnaGVscF9saW1pdCcpKTsKICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdjYWNoZV90aW1lb3V0JywgJzAnLCAkdGhpcy0+TGFuZygnaGVscF9jYWNoZV90aW1lb3V0JykpOwogICAgICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ3RlbXBsYXRlJywgJycsICR0aGlzLT5MYW5nKCdoZWxwX3RlbXBsYXRlJykpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRFdmVudERlc2NyaXB0aW9uKCRldmVudG5hbWUpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2V2ZW50X2luZm9fJyAuICRldmVudG5hbWUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRFdmVudEhlbHAoJGV2ZW50bmFtZSkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnZXZlbnRfaGVscF8nIC4gJGV2ZW50bmFtZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygncmVhbGx5X3VuaW5zdGFsbCcpOwogICAgfQoKfQoKLy9lbmQgY2xhc3MKPz4K]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/admin_prefs.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[DQp7JHN0YXJ0X2Zvcm19DQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRtb2QtPkxhbmcoJ3RpdGxlX2xpbWl0Jyl9OjwvcD4NCiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2xpbWl0fTwvcD4NCjwvZGl2Pg0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskbW9kLT5MYW5nKCd0aXRsZV9jYWNoZV9saWZldGltZScpfTo8L3A+DQogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9jYWNoZV9saWZldGltZX0NCiAgICAgICAgPGJyIC8+eyRtb2QtPkxhbmcoJ25vdGVzX2NhY2hlX2xpZmV0aW1lJyl9PC9wPg0KPC9kaXY+DQoNCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+DQogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9PC9wPg0KPC9kaXY+DQp7JGVuZF9mb3JtfQ0K]]></data>
	</file>
	<file>
	  <filename>/templates/orig_rss_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0iZmVlZHMiPntmb3JlYWNoIGZyb209JGZlZWRzIGl0ZW09b25lZmVlZH0NCiAgICA8aDQ+DQogICAgICAgIDxhIGhyZWY9Inskb25lZmVlZC0+Z2V0X3Blcm1hbGluaygpfSIgdGl0bGU9Inskb25lZmVlZC0+Z2V0X3RpdGxlKCl9Ij57JG9uZWZlZWQtPmdldF90aXRsZSgpfTwvYT4NCiAgICA8L2g0Pg0KICAgIDxkaXYgY2xhc3M9ImZlZWQtY29udGVudCI+DQogICAgICAgIHskb25lZmVlZC0+Z2V0X2NvbnRlbnQoKX0NCiAgICA8L2Rpdj4NCiAgICA8YnIvPg0KICAgIDxzbWFsbD4NCiAgICAgICAgPGEgaHJlZj0ieyRvbmVmZWVkLT5nZXRfcGVybWFsaW5rKCl9IiB0aXRsZT0ieyRvbmVmZWVkLT5nZXRfdGl0bGUoKX0iPnskb25lZmVlZC0+Z2V0X3RpdGxlKCl9PC9hPg0KICAgICAgICB7JG9uZWZlZWQtPmdldF9kYXRlKCl8ZGF0ZV9mb3JtYXQ6IiVZLyVtLyVkICVIOiVNIn0gICAgICAgICAgICAgICAgDQogICAgPC9zbWFsbD4NCiAgICB7L2ZvcmVhY2h9PC9kaXY+DQoNCiAgICB7aWYgaXNzZXQoJHBhZ2Vjb3VudCkgJiYgJHBhZ2Vjb3VudCBndCAxfQ0KICAgICAgICA8cD4NCiAgICAgICAge2lmIGlzc2V0KCRmaXJzdHVybCkgJiYgJGZpcnN0dXJsfTxhIGhyZWY9InskZmlyc3R1cmx9IiBjbGFzcz0icHJldiI+PDw8L2E+Jm5ic3A7ey9pZn0NCiAgICB7aWYgaXNzZXQoJHByZXZ1cmwpICYmICRwcmV2dXJsfTxhIGhyZWY9InskcHJldnVybH0iIGNsYXNzPSJwcmV2Ij7CqzwvYT4mbmJzcDt7L2lmfQ0KICAgIDxlbT57JHBhZ2VudW1iZXJ9IC8geyRwYWdlY291bnR9PC9lbT4mbmJzcDsgIA0Ke2lmIGlzc2V0KCRuZXh0dXJsKSAmJiAkbmV4dHVybH08YSBocmVmPSJ7JG5leHR1cmx9IiBjbGFzcz0ibmV4dCI+wrs8L2E+Jm5ic3A7ey9pZn0NCntpZiBpc3NldCgkbGFzdHVybCkgJiYgJGxhc3R1cmx9PGEgaHJlZj0ieyRsYXN0dXJsfSIgY2xhc3M9Im5leHQiPj4+PC9hPiZuYnNwO3svaWZ9DQo8L3A+DQp7L2lmfQ==]]></data>
	</file>
</module>
